Merge tag 'v3.10.103' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / hid / hid-input.c
index 66763546df157d66fe89d24f443ec85e1379dd8c..8fae6e3cafe677bf17a686805d22d86ad0bac3af 100644 (file)
@@ -1083,8 +1083,25 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
                return;
        }
 
+       /*
+        * Ignore reports for absolute data if the data didn't change. This is
+        * not only an optimization but also fixes 'dead' key reports. Some
+        * RollOver implementations for localized keys (like BACKSLASH/PIPE; HID
+        * 0x31 and 0x32) report multiple keys, even though a localized keyboard
+        * can only have one of them physically available. The 'dead' keys
+        * report constant 0. As all map to the same keycode, they'd confuse
+        * the input layer. If we filter the 'dead' keys on the HID level, we
+        * skip the keycode translation and only forward real events.
+        */
+       if (!(field->flags & (HID_MAIN_ITEM_RELATIVE |
+                             HID_MAIN_ITEM_BUFFERED_BYTE)) &&
+                             (field->flags & HID_MAIN_ITEM_VARIABLE) &&
+           usage->usage_index < field->maxusage &&
+           value == field->value[usage->usage_index])
+               return;
+
        /* report the usage code as scancode if the key status has changed */
-       if (usage->type == EV_KEY && !!test_bit(usage->code, input->key) != value)
+       if (usage->type == EV_KEY && (!!test_bit(usage->code, input->key)) != value)
                input_event(input, EV_MSC, MSC_SCAN, usage->hid);
 
        input_event(input, usage->type, usage->code, value);