Skip to content
Snippets Groups Projects
Commit 374766bc authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Dmitry Torokhov
Browse files

Input: implement proper timer rounding for polled devices


Rounding doesn't matter for the first tick, but we want
succeeding ticks to be aligned on second boundary if poll
interval is large enough.

Also: cancel_rearming_delayed_workqueue is marked as obsolete
in workqueue.h so use cancel_delayed_work_sync.

Signed-off-by: default avatarStephen Hemminger <shemminger@linux-foundation.org>
Acked-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent a512a8cc
No related branches found
No related tags found
No related merge requests found
...@@ -60,17 +60,21 @@ static void input_polled_device_work(struct work_struct *work) ...@@ -60,17 +60,21 @@ static void input_polled_device_work(struct work_struct *work)
{ {
struct input_polled_dev *dev = struct input_polled_dev *dev =
container_of(work, struct input_polled_dev, work.work); container_of(work, struct input_polled_dev, work.work);
unsigned long delay;
dev->poll(dev); dev->poll(dev);
queue_delayed_work(polldev_wq, &dev->work,
msecs_to_jiffies(dev->poll_interval)); delay = msecs_to_jiffies(dev->poll_interval);
if (delay >= HZ)
delay = round_jiffies_relative(delay);
queue_delayed_work(polldev_wq, &dev->work, delay);
} }
static int input_open_polled_device(struct input_dev *input) static int input_open_polled_device(struct input_dev *input)
{ {
struct input_polled_dev *dev = input->private; struct input_polled_dev *dev = input->private;
int error; int error;
unsigned long ticks;
error = input_polldev_start_workqueue(); error = input_polldev_start_workqueue();
if (error) if (error)
...@@ -79,10 +83,8 @@ static int input_open_polled_device(struct input_dev *input) ...@@ -79,10 +83,8 @@ static int input_open_polled_device(struct input_dev *input)
if (dev->flush) if (dev->flush)
dev->flush(dev); dev->flush(dev);
ticks = msecs_to_jiffies(dev->poll_interval); queue_delayed_work(polldev_wq, &dev->work,
if (ticks >= HZ) msecs_to_jiffies(dev->poll_interval));
ticks = round_jiffies(ticks);
queue_delayed_work(polldev_wq, &dev->work, ticks);
return 0; return 0;
} }
...@@ -91,7 +93,7 @@ static void input_close_polled_device(struct input_dev *input) ...@@ -91,7 +93,7 @@ static void input_close_polled_device(struct input_dev *input)
{ {
struct input_polled_dev *dev = input->private; struct input_polled_dev *dev = input->private;
cancel_rearming_delayed_workqueue(polldev_wq, &dev->work); cancel_delayed_work_sync(&dev->work);
input_polldev_stop_workqueue(); input_polldev_stop_workqueue();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment