Input: atkbd - correct MSC_SCAN events for force_release keys
authorStefan Brüns <stefan.bruens@rwth-aachen.de>
Mon, 17 Nov 2014 02:16:12 +0000 (18:16 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 17 Nov 2014 02:23:12 +0000 (18:23 -0800)
Without the change either no scancode would be reported on release of
force_release keys, or - if the key is marked as force_release erroneously
- the release event and the scancode would be reported in separate reports
to the input layer.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/keyboard/atkbd.c

index 6f5d79569136f3adf0bf9248988b107426b85e9c..e27a25892db46ccb94b13e7892e3b19c361d075a 100644 (file)
@@ -456,8 +456,9 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
 
        keycode = atkbd->keycode[code];
 
-       if (keycode != ATKBD_KEY_NULL)
-               input_event(dev, EV_MSC, MSC_SCAN, code);
+       if (!(atkbd->release && test_bit(code, atkbd->force_release_mask)))
+               if (keycode != ATKBD_KEY_NULL)
+                       input_event(dev, EV_MSC, MSC_SCAN, code);
 
        switch (keycode) {
        case ATKBD_KEY_NULL:
@@ -511,6 +512,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
                input_sync(dev);
 
                if (value && test_bit(code, atkbd->force_release_mask)) {
+                       input_event(dev, EV_MSC, MSC_SCAN, code);
                        input_report_key(dev, keycode, 0);
                        input_sync(dev);
                }