diff options
Diffstat (limited to 'drivers/input/input-polldev.c')
| -rw-r--r-- | drivers/input/input-polldev.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/input/input-polldev.c b/drivers/input/input-polldev.c index 92b359894e81..490918a5d192 100644 --- a/drivers/input/input-polldev.c +++ b/drivers/input/input-polldev.c | |||
| @@ -60,17 +60,21 @@ static void input_polled_device_work(struct work_struct *work) | |||
| 60 | { | 60 | { |
| 61 | struct input_polled_dev *dev = | 61 | struct input_polled_dev *dev = |
| 62 | container_of(work, struct input_polled_dev, work.work); | 62 | container_of(work, struct input_polled_dev, work.work); |
| 63 | unsigned long delay; | ||
| 63 | 64 | ||
| 64 | dev->poll(dev); | 65 | dev->poll(dev); |
| 65 | queue_delayed_work(polldev_wq, &dev->work, | 66 | |
| 66 | msecs_to_jiffies(dev->poll_interval)); | 67 | delay = msecs_to_jiffies(dev->poll_interval); |
| 68 | if (delay >= HZ) | ||
| 69 | delay = round_jiffies_relative(delay); | ||
| 70 | |||
| 71 | queue_delayed_work(polldev_wq, &dev->work, delay); | ||
| 67 | } | 72 | } |
| 68 | 73 | ||
| 69 | static int input_open_polled_device(struct input_dev *input) | 74 | static int input_open_polled_device(struct input_dev *input) |
| 70 | { | 75 | { |
| 71 | struct input_polled_dev *dev = input->private; | 76 | struct input_polled_dev *dev = input->private; |
| 72 | int error; | 77 | int error; |
| 73 | unsigned long ticks; | ||
| 74 | 78 | ||
| 75 | error = input_polldev_start_workqueue(); | 79 | error = input_polldev_start_workqueue(); |
| 76 | if (error) | 80 | if (error) |
| @@ -79,10 +83,8 @@ static int input_open_polled_device(struct input_dev *input) | |||
| 79 | if (dev->flush) | 83 | if (dev->flush) |
| 80 | dev->flush(dev); | 84 | dev->flush(dev); |
| 81 | 85 | ||
| 82 | ticks = msecs_to_jiffies(dev->poll_interval); | 86 | queue_delayed_work(polldev_wq, &dev->work, |
| 83 | if (ticks >= HZ) | 87 | msecs_to_jiffies(dev->poll_interval)); |
| 84 | ticks = round_jiffies(ticks); | ||
| 85 | queue_delayed_work(polldev_wq, &dev->work, ticks); | ||
| 86 | 88 | ||
| 87 | return 0; | 89 | return 0; |
| 88 | } | 90 | } |
| @@ -91,7 +93,7 @@ static void input_close_polled_device(struct input_dev *input) | |||
| 91 | { | 93 | { |
| 92 | struct input_polled_dev *dev = input->private; | 94 | struct input_polled_dev *dev = input->private; |
| 93 | 95 | ||
| 94 | cancel_rearming_delayed_workqueue(polldev_wq, &dev->work); | 96 | cancel_delayed_work_sync(&dev->work); |
| 95 | input_polldev_stop_workqueue(); | 97 | input_polldev_stop_workqueue(); |
| 96 | } | 98 | } |
| 97 | 99 | ||
