Commit 8639e042 authored by Marek Vasut's avatar Marek Vasut Committed by Dmitry Torokhov

Input: ili210x - improve polled sample spacing

Currently the ili210x driver implements a threaded interrupt handler which
starts upon edge on the interrupt line, and then polls the touch controller
for samples. Every time a sample is obtained from the controller, the thread
function checks whether further polling is required, and if so, waits fixed
amount of time before polling for next sample.

The delay between consecutive samples can thus vary greatly, because the
I2C transfer required to retrieve the sample from the controller takes
different amount of time on different platforms. Furthermore, different
models of the touch controllers supported by this driver require different
delays during retrieval of samples too.

Instead of waiting fixed amount of time before polling for next sample,
determine how much time passed since the beginning of sampling cycle and
then wait only the remaining amount of time within the sampling cycle.
This makes the driver deliver samples with equal spacing between them.
Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Link: https://lore.kernel.org/r/20211108005216.480525-1-marex@denx.deSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent de889108
...@@ -334,10 +334,13 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data) ...@@ -334,10 +334,13 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
const struct ili2xxx_chip *chip = priv->chip; const struct ili2xxx_chip *chip = priv->chip;
u8 touchdata[ILI210X_DATA_SIZE] = { 0 }; u8 touchdata[ILI210X_DATA_SIZE] = { 0 };
bool keep_polling; bool keep_polling;
ktime_t time_next;
s64 time_delta;
bool touch; bool touch;
int error; int error;
do { do {
time_next = ktime_add_ms(ktime_get(), ILI2XXX_POLL_PERIOD);
error = chip->get_touch_data(client, touchdata); error = chip->get_touch_data(client, touchdata);
if (error) { if (error) {
dev_err(&client->dev, dev_err(&client->dev,
...@@ -347,8 +350,11 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data) ...@@ -347,8 +350,11 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
touch = ili210x_report_events(priv, touchdata); touch = ili210x_report_events(priv, touchdata);
keep_polling = chip->continue_polling(touchdata, touch); keep_polling = chip->continue_polling(touchdata, touch);
if (keep_polling) if (keep_polling) {
msleep(ILI2XXX_POLL_PERIOD); time_delta = ktime_us_delta(time_next, ktime_get());
if (time_delta > 0)
usleep_range(time_delta, time_delta + 1000);
}
} while (!priv->stop && keep_polling); } while (!priv->stop && keep_polling);
return IRQ_HANDLED; return IRQ_HANDLED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment