* [PATCH] Input: ili210x - Improve polled sample spacing
@ 2021-11-08 0:52 Marek Vasut
2021-11-08 3:37 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: Marek Vasut @ 2021-11-08 0:52 UTC (permalink / raw)
To: linux-input; +Cc: Marek Vasut, Dmitry Torokhov, Joe Hung, Luca Hsu
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: Marek Vasut <marex@denx.de>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Joe Hung <joe_hung@ilitek.com>
Cc: Luca Hsu <luca_hsu@ilitek.com>
---
drivers/input/touchscreen/ili210x.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c
index a3b71a9511eb3..b2d9fe1e1c707 100644
--- a/drivers/input/touchscreen/ili210x.c
+++ b/drivers/input/touchscreen/ili210x.c
@@ -328,10 +328,13 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
const struct ili2xxx_chip *chip = priv->chip;
u8 touchdata[ILI210X_DATA_SIZE] = { 0 };
bool keep_polling;
+ ktime_t time_next;
+ s64 time_delta;
bool touch;
int error;
do {
+ time_next = ktime_add_ms(ktime_get(), ILI2XXX_POLL_PERIOD);
error = chip->get_touch_data(client, touchdata);
if (error) {
dev_err(&client->dev,
@@ -341,8 +344,11 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
touch = ili210x_report_events(priv, touchdata);
keep_polling = chip->continue_polling(touchdata, touch);
- if (keep_polling)
- msleep(ILI2XXX_POLL_PERIOD);
+ if (keep_polling) {
+ 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);
return IRQ_HANDLED;
--
2.33.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] Input: ili210x - Improve polled sample spacing
2021-11-08 0:52 [PATCH] Input: ili210x - Improve polled sample spacing Marek Vasut
@ 2021-11-08 3:37 ` Dmitry Torokhov
2021-11-08 11:04 ` Marek Vasut
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Torokhov @ 2021-11-08 3:37 UTC (permalink / raw)
To: Marek Vasut; +Cc: linux-input, Joe Hung, Luca Hsu
Hi Marek,
On Mon, Nov 08, 2021 at 01:52:16AM +0100, Marek Vasut wrote:
> 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: Marek Vasut <marex@denx.de>
> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> Cc: Joe Hung <joe_hung@ilitek.com>
> Cc: Luca Hsu <luca_hsu@ilitek.com>
> ---
> drivers/input/touchscreen/ili210x.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c
> index a3b71a9511eb3..b2d9fe1e1c707 100644
> --- a/drivers/input/touchscreen/ili210x.c
> +++ b/drivers/input/touchscreen/ili210x.c
> @@ -328,10 +328,13 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
> const struct ili2xxx_chip *chip = priv->chip;
> u8 touchdata[ILI210X_DATA_SIZE] = { 0 };
> bool keep_polling;
> + ktime_t time_next;
> + s64 time_delta;
> bool touch;
> int error;
>
> do {
> + time_next = ktime_add_ms(ktime_get(), ILI2XXX_POLL_PERIOD);
> error = chip->get_touch_data(client, touchdata);
> if (error) {
> dev_err(&client->dev,
> @@ -341,8 +344,11 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
>
> touch = ili210x_report_events(priv, touchdata);
> keep_polling = chip->continue_polling(touchdata, touch);
> - if (keep_polling)
> - msleep(ILI2XXX_POLL_PERIOD);
> + if (keep_polling) {
> + time_delta = ktime_us_delta(time_next, ktime_get());
Do we really need to use exact time, or ktime_get_coarse() is good
enough, as it is cheaper?
> + if (time_delta > 0)
> + usleep_range(time_delta, time_delta + 1000);
> + }
> } while (!priv->stop && keep_polling);
>
> return IRQ_HANDLED;
> --
> 2.33.0
>
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Input: ili210x - Improve polled sample spacing
2021-11-08 3:37 ` Dmitry Torokhov
@ 2021-11-08 11:04 ` Marek Vasut
2021-11-10 6:27 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: Marek Vasut @ 2021-11-08 11:04 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input, Joe Hung, Luca Hsu
On 11/8/21 4:37 AM, Dmitry Torokhov wrote:
> Hi Marek,
Hi,
[...]
>> diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c
>> index a3b71a9511eb3..b2d9fe1e1c707 100644
>> --- a/drivers/input/touchscreen/ili210x.c
>> +++ b/drivers/input/touchscreen/ili210x.c
>> @@ -328,10 +328,13 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
>> const struct ili2xxx_chip *chip = priv->chip;
>> u8 touchdata[ILI210X_DATA_SIZE] = { 0 };
>> bool keep_polling;
>> + ktime_t time_next;
>> + s64 time_delta;
>> bool touch;
>> int error;
>>
>> do {
>> + time_next = ktime_add_ms(ktime_get(), ILI2XXX_POLL_PERIOD);
>> error = chip->get_touch_data(client, touchdata);
>> if (error) {
>> dev_err(&client->dev,
>> @@ -341,8 +344,11 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
>>
>> touch = ili210x_report_events(priv, touchdata);
>> keep_polling = chip->continue_polling(touchdata, touch);
>> - if (keep_polling)
>> - msleep(ILI2XXX_POLL_PERIOD);
>> + if (keep_polling) {
>> + time_delta = ktime_us_delta(time_next, ktime_get());
>
> Do we really need to use exact time, or ktime_get_coarse() is good
> enough, as it is cheaper?
ktime_get_coarse() introduces multi-millisecond jitter into the samples
if you have low HZ setting, which isn't really nice. That's also why I
use ktime and not jiffies here, jiffies has the same problem.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Input: ili210x - Improve polled sample spacing
2021-11-08 11:04 ` Marek Vasut
@ 2021-11-10 6:27 ` Dmitry Torokhov
0 siblings, 0 replies; 4+ messages in thread
From: Dmitry Torokhov @ 2021-11-10 6:27 UTC (permalink / raw)
To: Marek Vasut; +Cc: linux-input, Joe Hung, Luca Hsu
On Mon, Nov 08, 2021 at 12:04:30PM +0100, Marek Vasut wrote:
> On 11/8/21 4:37 AM, Dmitry Torokhov wrote:
> > Hi Marek,
>
> Hi,
>
> [...]
>
> > > diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c
> > > index a3b71a9511eb3..b2d9fe1e1c707 100644
> > > --- a/drivers/input/touchscreen/ili210x.c
> > > +++ b/drivers/input/touchscreen/ili210x.c
> > > @@ -328,10 +328,13 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
> > > const struct ili2xxx_chip *chip = priv->chip;
> > > u8 touchdata[ILI210X_DATA_SIZE] = { 0 };
> > > bool keep_polling;
> > > + ktime_t time_next;
> > > + s64 time_delta;
> > > bool touch;
> > > int error;
> > > do {
> > > + time_next = ktime_add_ms(ktime_get(), ILI2XXX_POLL_PERIOD);
> > > error = chip->get_touch_data(client, touchdata);
> > > if (error) {
> > > dev_err(&client->dev,
> > > @@ -341,8 +344,11 @@ static irqreturn_t ili210x_irq(int irq, void *irq_data)
> > > touch = ili210x_report_events(priv, touchdata);
> > > keep_polling = chip->continue_polling(touchdata, touch);
> > > - if (keep_polling)
> > > - msleep(ILI2XXX_POLL_PERIOD);
> > > + if (keep_polling) {
> > > + time_delta = ktime_us_delta(time_next, ktime_get());
> >
> > Do we really need to use exact time, or ktime_get_coarse() is good
> > enough, as it is cheaper?
>
> ktime_get_coarse() introduces multi-millisecond jitter into the samples if
> you have low HZ setting, which isn't really nice. That's also why I use
> ktime and not jiffies here, jiffies has the same problem.
Applied, thank you.
--
Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-11-10 6:27 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-08 0:52 [PATCH] Input: ili210x - Improve polled sample spacing Marek Vasut
2021-11-08 3:37 ` Dmitry Torokhov
2021-11-08 11:04 ` Marek Vasut
2021-11-10 6:27 ` Dmitry Torokhov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).