]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: lirc: ensure lirc device receives nec repeats
authorSean Young <sean@mess.org>
Sat, 30 Sep 2017 11:13:37 +0000 (07:13 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Thu, 14 Dec 2017 15:35:21 +0000 (10:35 -0500)
The lirc device should get lirc repeats whether there is a keymap
match or not.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/rc/rc-main.c

index b22443fe8c345db02bc770b8416d1a353b33ddfd..058807bc80dccd029ca4bb825a8524128b2b5eca 100644 (file)
@@ -662,19 +662,25 @@ void rc_repeat(struct rc_dev *dev)
 {
        unsigned long flags;
        unsigned int timeout = protocols[dev->last_protocol].repeat_period;
+       struct lirc_scancode sc = {
+               .scancode = dev->last_scancode, .rc_proto = dev->last_protocol,
+               .keycode = dev->keypressed ? dev->last_keycode : KEY_RESERVED,
+               .flags = LIRC_SCANCODE_FLAG_REPEAT |
+                        (dev->last_toggle ? LIRC_SCANCODE_FLAG_TOGGLE : 0)
+       };
 
-       spin_lock_irqsave(&dev->keylock, flags);
+       ir_lirc_scancode_event(dev, &sc);
 
-       if (!dev->keypressed)
-               goto out;
+       spin_lock_irqsave(&dev->keylock, flags);
 
        input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode);
        input_sync(dev->input_dev);
 
-       dev->keyup_jiffies = jiffies + msecs_to_jiffies(timeout);
-       mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
+       if (dev->keypressed) {
+               dev->keyup_jiffies = jiffies + msecs_to_jiffies(timeout);
+               mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
+       }
 
-out:
        spin_unlock_irqrestore(&dev->keylock, flags);
 }
 EXPORT_SYMBOL_GPL(rc_repeat);
@@ -710,13 +716,14 @@ static void ir_do_keydown(struct rc_dev *dev, enum rc_proto protocol,
 
        input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
 
+       dev->last_protocol = protocol;
+       dev->last_scancode = scancode;
+       dev->last_toggle = toggle;
+       dev->last_keycode = keycode;
+
        if (new_event && keycode != KEY_RESERVED) {
                /* Register a keypress */
                dev->keypressed = true;
-               dev->last_protocol = protocol;
-               dev->last_scancode = scancode;
-               dev->last_toggle = toggle;
-               dev->last_keycode = keycode;
 
                IR_dprintk(1, "%s: key down event, key 0x%04x, protocol 0x%04x, scancode 0x%08x\n",
                           dev->device_name, keycode, protocol, scancode);