| From 06b831588b639ad9d94e4789b0250562228722c2 Mon Sep 17 00:00:00 2001 |
| From: Matthias Reichl <hias@horus.com> |
| Date: Tue, 5 Jan 2021 10:30:23 +0100 |
| Subject: media: rc: fix timeout handling after switch to microsecond durations |
| |
| From: Matthias Reichl <hias@horus.com> |
| |
| commit 06b831588b639ad9d94e4789b0250562228722c2 upstream. |
| |
| Commit 528222d853f92 ("media: rc: harmonize infrared durations to |
| microseconds") missed to switch some timeout calculations from |
| nanoseconds to microseconds. This resulted in spurious key_up+key_down |
| events at the last scancode if the rc device uses a long timeout |
| (eg 100ms on nuvoton-cir) as the device timeout wasn't properly |
| accounted for in the keyup timeout calculation. |
| |
| Fix this by applying the proper conversion functions. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: 528222d853f92 ("media: rc: harmonize infrared durations to microseconds") |
| Signed-off-by: Matthias Reichl <hias@horus.com> |
| Signed-off-by: Sean Young <sean@mess.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/rc/ir-mce_kbd-decoder.c | 2 +- |
| drivers/media/rc/rc-main.c | 4 ++-- |
| drivers/media/rc/serial_ir.c | 2 +- |
| 3 files changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/media/rc/ir-mce_kbd-decoder.c |
| +++ b/drivers/media/rc/ir-mce_kbd-decoder.c |
| @@ -320,7 +320,7 @@ again: |
| data->body); |
| spin_lock(&data->keylock); |
| if (scancode) { |
| - delay = nsecs_to_jiffies(dev->timeout) + |
| + delay = usecs_to_jiffies(dev->timeout) + |
| msecs_to_jiffies(100); |
| mod_timer(&data->rx_timeout, jiffies + delay); |
| } else { |
| --- a/drivers/media/rc/rc-main.c |
| +++ b/drivers/media/rc/rc-main.c |
| @@ -737,7 +737,7 @@ static unsigned int repeat_period(int pr |
| void rc_repeat(struct rc_dev *dev) |
| { |
| unsigned long flags; |
| - unsigned int timeout = nsecs_to_jiffies(dev->timeout) + |
| + unsigned int timeout = usecs_to_jiffies(dev->timeout) + |
| msecs_to_jiffies(repeat_period(dev->last_protocol)); |
| struct lirc_scancode sc = { |
| .scancode = dev->last_scancode, .rc_proto = dev->last_protocol, |
| @@ -855,7 +855,7 @@ void rc_keydown(struct rc_dev *dev, enum |
| ir_do_keydown(dev, protocol, scancode, keycode, toggle); |
| |
| if (dev->keypressed) { |
| - dev->keyup_jiffies = jiffies + nsecs_to_jiffies(dev->timeout) + |
| + dev->keyup_jiffies = jiffies + usecs_to_jiffies(dev->timeout) + |
| msecs_to_jiffies(repeat_period(protocol)); |
| mod_timer(&dev->timer_keyup, dev->keyup_jiffies); |
| } |
| --- a/drivers/media/rc/serial_ir.c |
| +++ b/drivers/media/rc/serial_ir.c |
| @@ -385,7 +385,7 @@ static irqreturn_t serial_ir_irq_handler |
| } while (!(sinp(UART_IIR) & UART_IIR_NO_INT)); /* still pending ? */ |
| |
| mod_timer(&serial_ir.timeout_timer, |
| - jiffies + nsecs_to_jiffies(serial_ir.rcdev->timeout)); |
| + jiffies + usecs_to_jiffies(serial_ir.rcdev->timeout)); |
| |
| ir_raw_event_handle(serial_ir.rcdev); |
| |