Browse Source

Input: atkbd - correct MSC_SCAN events for force_release keys

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>
Stefan Brüns 10 năm trước cách đây
mục cha
commit
5447326ff7
1 tập tin đã thay đổi với 4 bổ sung2 xóa
  1. 4 2
      drivers/input/keyboard/atkbd.c

+ 4 - 2
drivers/input/keyboard/atkbd.c

@@ -456,8 +456,9 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
 
 
 	keycode = atkbd->keycode[code];
 	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) {
 	switch (keycode) {
 	case ATKBD_KEY_NULL:
 	case ATKBD_KEY_NULL:
@@ -511,6 +512,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
 		input_sync(dev);
 		input_sync(dev);
 
 
 		if (value && test_bit(code, atkbd->force_release_mask)) {
 		if (value && test_bit(code, atkbd->force_release_mask)) {
+			input_event(dev, EV_MSC, MSC_SCAN, code);
 			input_report_key(dev, keycode, 0);
 			input_report_key(dev, keycode, 0);
 			input_sync(dev);
 			input_sync(dev);
 		}
 		}