diff options
author | Hans de Goede <hdegoede@redhat.com> | 2017-07-02 10:34:15 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2017-07-20 10:02:35 -0400 |
commit | 5703e52cc711bc01e72cf12b86a126909c79d213 (patch) | |
tree | 69bdd1f30fe1e028e4033d500b260a61153c222b /drivers/hid/hid-asus.c | |
parent | b61d43e6b0637bb2ec456cc50be823343b8ad1f8 (diff) |
HID: asus: Add T100CHI bluetooth keyboard dock special keys mapping
The Asus Transformer T100CHI comes with a Bluetooth keyboard dock which
uses the same 0xff31 Asus vendor HUT page as other Asus keyboards.
This commit adds its device-id to hid-asus and fixes an issue in the
descriptor of the 0xff31 Usage, which together fixes the special keys
on this keyboard not working.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-asus.c')
-rw-r--r-- | drivers/hid/hid-asus.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index b2501b64ab9d..43fb4a331cf3 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c | |||
@@ -65,6 +65,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); | |||
65 | #define QUIRK_NO_CONSUMER_USAGES BIT(4) | 65 | #define QUIRK_NO_CONSUMER_USAGES BIT(4) |
66 | #define QUIRK_USE_KBD_BACKLIGHT BIT(5) | 66 | #define QUIRK_USE_KBD_BACKLIGHT BIT(5) |
67 | #define QUIRK_T100_KEYBOARD BIT(6) | 67 | #define QUIRK_T100_KEYBOARD BIT(6) |
68 | #define QUIRK_T100CHI BIT(7) | ||
68 | 69 | ||
69 | #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ | 70 | #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ |
70 | QUIRK_NO_INIT_REPORTS | \ | 71 | QUIRK_NO_INIT_REPORTS | \ |
@@ -619,11 +620,34 @@ static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
619 | hid_info(hdev, "Fixing up Asus notebook report descriptor\n"); | 620 | hid_info(hdev, "Fixing up Asus notebook report descriptor\n"); |
620 | rdesc[55] = 0xdd; | 621 | rdesc[55] = 0xdd; |
621 | } | 622 | } |
623 | /* For the T100TA keyboard dock */ | ||
622 | if (drvdata->quirks & QUIRK_T100_KEYBOARD && | 624 | if (drvdata->quirks & QUIRK_T100_KEYBOARD && |
623 | *rsize == 76 && rdesc[73] == 0x81 && rdesc[74] == 0x01) { | 625 | *rsize == 76 && rdesc[73] == 0x81 && rdesc[74] == 0x01) { |
624 | hid_info(hdev, "Fixing up Asus T100 keyb report descriptor\n"); | 626 | hid_info(hdev, "Fixing up Asus T100 keyb report descriptor\n"); |
625 | rdesc[74] &= ~HID_MAIN_ITEM_CONSTANT; | 627 | rdesc[74] &= ~HID_MAIN_ITEM_CONSTANT; |
626 | } | 628 | } |
629 | /* For the T100CHI keyboard dock */ | ||
630 | if (drvdata->quirks & QUIRK_T100CHI && | ||
631 | *rsize == 403 && rdesc[388] == 0x09 && rdesc[389] == 0x76) { | ||
632 | /* | ||
633 | * Change Usage (76h) to Usage Minimum (00h), Usage Maximum | ||
634 | * (FFh) and clear the flags in the Input() byte. | ||
635 | * Note the descriptor has a bogus 0 byte at the end so we | ||
636 | * only need 1 extra byte. | ||
637 | */ | ||
638 | *rsize = 404; | ||
639 | rdesc = kmemdup(rdesc, *rsize, GFP_KERNEL); | ||
640 | if (!rdesc) | ||
641 | return NULL; | ||
642 | |||
643 | hid_info(hdev, "Fixing up T100CHI keyb report descriptor\n"); | ||
644 | memmove(rdesc + 392, rdesc + 390, 12); | ||
645 | rdesc[388] = 0x19; | ||
646 | rdesc[389] = 0x00; | ||
647 | rdesc[390] = 0x29; | ||
648 | rdesc[391] = 0xff; | ||
649 | rdesc[402] = 0x00; | ||
650 | } | ||
627 | 651 | ||
628 | return rdesc; | 652 | return rdesc; |
629 | } | 653 | } |
@@ -643,6 +667,9 @@ static const struct hid_device_id asus_devices[] = { | |||
643 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) }, | 667 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) }, |
644 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) }, | 668 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) }, |
645 | { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) }, | 669 | { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) }, |
670 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ASUSTEK, | ||
671 | USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD), QUIRK_T100CHI }, | ||
672 | |||
646 | { } | 673 | { } |
647 | }; | 674 | }; |
648 | MODULE_DEVICE_TABLE(hid, asus_devices); | 675 | MODULE_DEVICE_TABLE(hid, asus_devices); |