]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
media: rc: mce_kbd protocol encodes two scancodes
authorSean Young <sean@mess.org>
Sat, 7 Apr 2018 21:41:17 +0000 (17:41 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 20 Apr 2018 13:18:33 +0000 (09:18 -0400)
If two keys are pressed, then both keys are encoded in the scancode. This
makes the mce keyboard more responsive.

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

index 9d609dca6e2b1dd25be349c139975fc46ecac408..f94e89ebc724a9c9a891065a4ebfd26e719d3a91 100644 (file)
@@ -147,13 +147,14 @@ static enum mce_kbd_mode mce_kbd_mode(struct mce_kbd_dec *data)
 static void ir_mce_kbd_process_keyboard_data(struct rc_dev *dev, u32 scancode)
 {
        struct mce_kbd_dec *data = &dev->raw->mce_kbd;
-       u8 keydata   = (scancode >> 8) & 0xff;
+       u8 keydata1  = (scancode >> 8) & 0xff;
+       u8 keydata2  = (scancode >> 16) & 0xff;
        u8 shiftmask = scancode & 0xff;
-       unsigned char keycode, maskcode;
+       unsigned char maskcode;
        int i, keystate;
 
-       dev_dbg(&dev->dev, "keyboard: keydata = 0x%02x, shiftmask = 0x%02x\n",
-               keydata, shiftmask);
+       dev_dbg(&dev->dev, "keyboard: keydata2 = 0x%02x, keydata1 = 0x%02x, shiftmask = 0x%02x\n",
+               keydata2, keydata1, shiftmask);
 
        for (i = 0; i < 7; i++) {
                maskcode = kbd_keycodes[MCIR2_MASK_KEYS_START + i];
@@ -164,10 +165,12 @@ static void ir_mce_kbd_process_keyboard_data(struct rc_dev *dev, u32 scancode)
                input_report_key(data->idev, maskcode, keystate);
        }
 
-       if (keydata) {
-               keycode = kbd_keycodes[keydata];
-               input_report_key(data->idev, keycode, 1);
-       } else {
+       if (keydata1)
+               input_report_key(data->idev, kbd_keycodes[keydata1], 1);
+       if (keydata2)
+               input_report_key(data->idev, kbd_keycodes[keydata2], 1);
+
+       if (!keydata1 && !keydata2) {
                for (i = 0; i < MCIR2_MASK_KEYS_START; i++)
                        input_report_key(data->idev, kbd_keycodes[i], 0);
        }
@@ -319,7 +322,7 @@ again:
 
                switch (data->wanted_bits) {
                case MCIR2_KEYBOARD_NBITS:
-                       scancode = data->body & 0xffff;
+                       scancode = data->body & 0xffffff;
                        dev_dbg(&dev->dev, "keyboard data 0x%08x\n",
                                data->body);
                        if (scancode) {
index 9f4df60f62e11b7b0d4019e2e7d73877fc8e423d..b7071bde670adbcd1dbc199e1822679ead52bc91 100644 (file)
@@ -51,7 +51,7 @@ static const struct {
        [RC_PROTO_SANYO] = { .name = "sanyo",
                .scancode_bits = 0x1fffff, .repeat_period = 125 },
        [RC_PROTO_MCIR2_KBD] = { .name = "mcir2-kbd",
-               .scancode_bits = 0xffff, .repeat_period = 100 },
+               .scancode_bits = 0xffffff, .repeat_period = 100 },
        [RC_PROTO_MCIR2_MSE] = { .name = "mcir2-mse",
                .scancode_bits = 0x1fffff, .repeat_period = 100 },
        [RC_PROTO_RC6_0] = { .name = "rc-6-0",