media: rc: some events are dropped by userspace
authorSean Young <sean@mess.org>
Tue, 18 Sep 2018 08:50:20 +0000 (04:50 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 5 Oct 2018 10:54:26 +0000 (06:54 -0400)
libevdev (which is used by libinput) gets a list of keycodes from the
input device on creation. Any events with keycodes which are not in this
list are silently dropped. So, set all keycodes on device creation since
we do not know which will be used if the keymap changes.

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

index ca68e1d2b2f989cf366bdecc999db5e388d50e11..7e5a9bc9b81dc121f366feee145f67a4bd410366 100644 (file)
@@ -274,7 +274,6 @@ static unsigned int ir_update_mapping(struct rc_dev *dev,
                                      unsigned int new_keycode)
 {
        int old_keycode = rc_map->scan[index].keycode;
-       int i;
 
        /* Did the user wish to remove the mapping? */
        if (new_keycode == KEY_RESERVED || new_keycode == KEY_UNKNOWN) {
@@ -289,20 +288,9 @@ static unsigned int ir_update_mapping(struct rc_dev *dev,
                        old_keycode == KEY_RESERVED ? "New" : "Replacing",
                        rc_map->scan[index].scancode, new_keycode);
                rc_map->scan[index].keycode = new_keycode;
-               __set_bit(new_keycode, dev->input_dev->keybit);
        }
 
        if (old_keycode != KEY_RESERVED) {
-               /* A previous mapping was updated... */
-               __clear_bit(old_keycode, dev->input_dev->keybit);
-               /* ... but another scancode might use the same keycode */
-               for (i = 0; i < rc_map->len; i++) {
-                       if (rc_map->scan[i].keycode == old_keycode) {
-                               __set_bit(old_keycode, dev->input_dev->keybit);
-                               break;
-                       }
-               }
-
                /* Possibly shrink the keytable, failure is not a problem */
                ir_resize_table(dev, rc_map, GFP_ATOMIC);
        }
@@ -1759,6 +1747,8 @@ static int rc_prepare_rx_device(struct rc_dev *dev)
        set_bit(EV_REP, dev->input_dev->evbit);
        set_bit(EV_MSC, dev->input_dev->evbit);
        set_bit(MSC_SCAN, dev->input_dev->mscbit);
+       bitmap_fill(dev->input_dev->keybit, KEY_CNT);
+
        if (dev->open)
                dev->input_dev->open = ir_open;
        if (dev->close)