For key up, rather than iterating over 224 keys, just remember which key
was pressed.

Signed-off-by: Sean Young <[email protected]>
---
 drivers/media/rc/ir-mce_kbd-decoder.c | 23 ++++++++++++++---------
 drivers/media/rc/rc-core-priv.h       |  1 +
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/media/rc/ir-mce_kbd-decoder.c 
b/drivers/media/rc/ir-mce_kbd-decoder.c
index 8cf4cf358052..b851583d2d94 100644
--- a/drivers/media/rc/ir-mce_kbd-decoder.c
+++ b/drivers/media/rc/ir-mce_kbd-decoder.c
@@ -128,8 +128,10 @@ static void mce_kbd_rx_timeout(struct timer_list *t)
                input_report_key(mce_kbd->idev, maskcode, 0);
        }
 
-       for (i = 0; i < MCIR2_MASK_KEYS_START; i++)
-               input_report_key(mce_kbd->idev, kbd_keycodes[i], 0);
+       if (mce_kbd->last_key != KEY_RESERVED) {
+               input_report_key(mce_kbd->idev, mce_kbd->last_key, 0);
+               mce_kbd->last_key = KEY_RESERVED;
+       }
 }
 
 static enum mce_kbd_mode mce_kbd_mode(struct mce_kbd_dec *data)
@@ -144,7 +146,7 @@ static enum mce_kbd_mode mce_kbd_mode(struct mce_kbd_dec 
*data)
        }
 }
 
-static void ir_mce_kbd_process_keyboard_data(struct input_dev *idev,
+static void ir_mce_kbd_process_keyboard_data(struct mce_kbd_dec *data,
                                             u32 scancode)
 {
        u8 keydata   = (scancode >> 8) & 0xff;
@@ -161,15 +163,18 @@ static void ir_mce_kbd_process_keyboard_data(struct 
input_dev *idev,
                        keystate = 1;
                else
                        keystate = 0;
-               input_report_key(idev, maskcode, keystate);
+               input_report_key(data->idev, maskcode, keystate);
+       }
+
+       if (data->last_key != KEY_RESERVED) {
+               input_report_key(data->idev, data->last_key, 0);
+               data->last_key = KEY_RESERVED;
        }
 
        if (keydata) {
                keycode = kbd_keycodes[keydata];
-               input_report_key(idev, keycode, 1);
-       } else {
-               for (i = 0; i < MCIR2_MASK_KEYS_START; i++)
-                       input_report_key(idev, kbd_keycodes[i], 0);
+               input_report_key(data->idev, keycode, 1);
+               data->last_key = keycode;
        }
 }
 
@@ -326,7 +331,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct 
ir_raw_event ev)
                                delay = msecs_to_jiffies(100);
                        mod_timer(&data->rx_timeout, jiffies + delay);
                        /* Pass data to keyboard buffer parser */
-                       ir_mce_kbd_process_keyboard_data(data->idev, scancode);
+                       ir_mce_kbd_process_keyboard_data(data, scancode);
                        lsc.rc_proto = RC_PROTO_MCIR2_KBD;
                        break;
                case MCIR2_MOUSE_NBITS:
diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h
index 915434855a63..035f3ffc19f7 100644
--- a/drivers/media/rc/rc-core-priv.h
+++ b/drivers/media/rc/rc-core-priv.h
@@ -106,6 +106,7 @@ struct ir_raw_event_ctrl {
                char phys[64];
                int state;
                u8 header;
+               u8 last_key;
                u32 body;
                unsigned count;
                unsigned wanted_bits;
-- 
2.14.3

Reply via email to