summaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/rc-ir-raw.c
diff options
context:
space:
mode:
authorSean Young <sean@mess.org>2017-08-07 08:30:18 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2017-08-20 09:56:20 -0400
commit48b2de1971c766a8dc0aec668742e17cb0c75127 (patch)
tree698f0c43a9c948be7bf451a6071bbcbea21e7a16 /drivers/media/rc/rc-ir-raw.c
parente5e26439d1c46c8a201b0d05c719e33f0f091802 (diff)
downloadlinux-48b2de1971c766a8dc0aec668742e17cb0c75127.tar.bz2
media: rc: saa7134: add trailing space for timely decoding
The gpio-ir-recv driver adds timeouts which the saa7134 lacks; this causes keypress not to arrive, and to only arrive once more IR is received. This is what the commit below calls "ghost keypresses", and that commit does not solve the issue completely. This makes the IR on the HVR-1150 much more reliable and responsive. Fixes: 3f5c4c73322e ("[media] rc: fix ghost keypresses with certain hw") Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/rc/rc-ir-raw.c')
-rw-r--r--drivers/media/rc/rc-ir-raw.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
index 07a694298119..ef5efd994eef 100644
--- a/drivers/media/rc/rc-ir-raw.c
+++ b/drivers/media/rc/rc-ir-raw.c
@@ -134,9 +134,13 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type)
dev->raw->last_event = now;
dev->raw->last_type = type;
- if (!timer_pending(&dev->raw->edge_handle))
+ /* timer could be set to timeout (125ms by default) */
+ if (!timer_pending(&dev->raw->edge_handle) ||
+ time_after(dev->raw->edge_handle.expires,
+ jiffies + msecs_to_jiffies(15))) {
mod_timer(&dev->raw->edge_handle,
jiffies + msecs_to_jiffies(15));
+ }
return rc;
}
@@ -491,6 +495,19 @@ EXPORT_SYMBOL(ir_raw_encode_scancode);
static void edge_handle(unsigned long arg)
{
struct rc_dev *dev = (struct rc_dev *)arg;
+ ktime_t interval = ktime_get() - dev->raw->last_event;
+
+ if (interval >= dev->timeout) {
+ DEFINE_IR_RAW_EVENT(ev);
+
+ ev.timeout = true;
+ ev.duration = interval;
+
+ ir_raw_event_store(dev, &ev);
+ } else {
+ mod_timer(&dev->raw->edge_handle,
+ jiffies + nsecs_to_jiffies(dev->timeout - interval));
+ }
ir_raw_event_handle(dev);
}