Input: implement proper timer rounding for polled devices
authorStephen Hemminger <shemminger@linux-foundation.org>
Wed, 21 Nov 2007 19:03:37 +0000 (14:03 -0500)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 21 Jan 2008 06:11:07 +0000 (01:11 -0500)
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: Stephen Hemminger <shemminger@linux-foundation.org>
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/input-polldev.c

index 92b3598..490918a 100644 (file)
@@ -60,17 +60,21 @@ static void input_polled_device_work(struct work_struct *work)
 {
        struct input_polled_dev *dev =
                container_of(work, struct input_polled_dev, work.work);
+       unsigned long delay;
 
        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)
 {
        struct input_polled_dev *dev = input->private;
        int error;
-       unsigned long ticks;
 
        error = input_polldev_start_workqueue();
        if (error)
@@ -79,10 +83,8 @@ static int input_open_polled_device(struct input_dev *input)
        if (dev->flush)
                dev->flush(dev);
 
-       ticks = msecs_to_jiffies(dev->poll_interval);
-       if (ticks >= HZ)
-               ticks = round_jiffies(ticks);
-       queue_delayed_work(polldev_wq, &dev->work, ticks);
+       queue_delayed_work(polldev_wq, &dev->work,
+                          msecs_to_jiffies(dev->poll_interval));
 
        return 0;
 }
@@ -91,7 +93,7 @@ static void input_close_polled_device(struct input_dev *input)
 {
        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();
 }