]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/hid/hid-input.c
Merge branches 'for-3.19/upstream-fixes', 'for-3.20/apple', 'for-3.20/betop', 'for...
[mirror_ubuntu-artful-kernel.git] / drivers / hid / hid-input.c
index e0a0f06ac5ef6168c8fcdd5c2462df3f3130c941..052869d0ab787da2a3d685c5c6bf905d05e047b8 100644 (file)
@@ -306,10 +306,16 @@ static enum power_supply_property hidinput_battery_props[] = {
 
 static const struct hid_device_id hid_battery_quirks[] = {
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
-                       USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
-       HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
+               USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
+         HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
+               USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
+         HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
+               USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI),
+         HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
-                              USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI),
+                              USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO),
          HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
                USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
@@ -1101,6 +1107,23 @@ 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)
                input_event(input, EV_MSC, MSC_SCAN, usage->hid);