diff options
author | Maxime Bellengé <maxime.bellenge@gmail.com> | 2017-09-07 15:17:28 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2017-09-15 20:54:51 -0400 |
commit | 832e1eeeba916b389c3ba090d8335aff3089428e (patch) | |
tree | 02b7e68f9639f5934e9e4e72cff02dd4835bf12e | |
parent | b42a362e6d10c342004b183defcb9940331b6737 (diff) |
HID: asus: Add support for Fn keys on Asus ROG G752
This patch adds support for Fn keys on Asus ROG G752 laptop.
The report descriptor is broken so I fixed it.
Tested on an Asus G752VT.
Resent fix white space fixes
Signed-off-by: Maxime Bellengé <maxime.bellenge@gmail.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hid-asus.c | 29 | ||||
-rw-r--r-- | drivers/hid/hid-core.c | 2 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 1 |
3 files changed, 31 insertions, 1 deletions
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 50c294be8324..27651f50738e 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c | |||
@@ -67,6 +67,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); | |||
67 | #define QUIRK_USE_KBD_BACKLIGHT BIT(5) | 67 | #define QUIRK_USE_KBD_BACKLIGHT BIT(5) |
68 | #define QUIRK_T100_KEYBOARD BIT(6) | 68 | #define QUIRK_T100_KEYBOARD BIT(6) |
69 | #define QUIRK_T100CHI BIT(7) | 69 | #define QUIRK_T100CHI BIT(7) |
70 | #define QUIRK_G752_KEYBOARD BIT(8) | ||
70 | 71 | ||
71 | #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ | 72 | #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ |
72 | QUIRK_NO_INIT_REPORTS | \ | 73 | QUIRK_NO_INIT_REPORTS | \ |
@@ -670,6 +671,11 @@ static void asus_remove(struct hid_device *hdev) | |||
670 | hid_hw_stop(hdev); | 671 | hid_hw_stop(hdev); |
671 | } | 672 | } |
672 | 673 | ||
674 | static const __u8 asus_g752_fixed_rdesc[] = { | ||
675 | 0x19, 0x00, /* Usage Minimum (0x00) */ | ||
676 | 0x2A, 0xFF, 0x00, /* Usage Maximum (0xFF) */ | ||
677 | }; | ||
678 | |||
673 | static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, | 679 | static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
674 | unsigned int *rsize) | 680 | unsigned int *rsize) |
675 | { | 681 | { |
@@ -708,6 +714,27 @@ static __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
708 | rdesc[391] = 0xff; | 714 | rdesc[391] = 0xff; |
709 | rdesc[402] = 0x00; | 715 | rdesc[402] = 0x00; |
710 | } | 716 | } |
717 | if (drvdata->quirks & QUIRK_G752_KEYBOARD && | ||
718 | *rsize == 75 && rdesc[61] == 0x15 && rdesc[62] == 0x00) { | ||
719 | /* report is missing usage mninum and maximum */ | ||
720 | __u8 *new_rdesc; | ||
721 | size_t new_size = *rsize + sizeof(asus_g752_fixed_rdesc); | ||
722 | |||
723 | new_rdesc = devm_kzalloc(&hdev->dev, new_size, GFP_KERNEL); | ||
724 | if (new_rdesc == NULL) | ||
725 | return rdesc; | ||
726 | |||
727 | hid_info(hdev, "Fixing up Asus G752 keyb report descriptor\n"); | ||
728 | /* copy the valid part */ | ||
729 | memcpy(new_rdesc, rdesc, 61); | ||
730 | /* insert missing part */ | ||
731 | memcpy(new_rdesc + 61, asus_g752_fixed_rdesc, sizeof(asus_g752_fixed_rdesc)); | ||
732 | /* copy remaining data */ | ||
733 | memcpy(new_rdesc + 61 + sizeof(asus_g752_fixed_rdesc), rdesc + 61, *rsize - 61); | ||
734 | |||
735 | *rsize = new_size; | ||
736 | rdesc = new_rdesc; | ||
737 | } | ||
711 | 738 | ||
712 | return rdesc; | 739 | return rdesc; |
713 | } | 740 | } |
@@ -722,6 +749,8 @@ static const struct hid_device_id asus_devices[] = { | |||
722 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, | 749 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, |
723 | USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2), QUIRK_USE_KBD_BACKLIGHT }, | 750 | USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2), QUIRK_USE_KBD_BACKLIGHT }, |
724 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, | 751 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, |
752 | USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3), QUIRK_G752_KEYBOARD }, | ||
753 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, | ||
725 | USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD), | 754 | USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD), |
726 | QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, | 755 | QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, |
727 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) }, | 756 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) }, |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 9bc91160819b..4c1a499c6a62 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1979,6 +1979,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1979 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD) }, | 1979 | { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD) }, |
1980 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1) }, | 1980 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1) }, |
1981 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2) }, | 1981 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2) }, |
1982 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3) }, | ||
1982 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD) }, | 1983 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD) }, |
1983 | { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) }, | 1984 | { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) }, |
1984 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) }, | 1985 | { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) }, |
@@ -3119,4 +3120,3 @@ MODULE_AUTHOR("Andreas Gal"); | |||
3119 | MODULE_AUTHOR("Vojtech Pavlik"); | 3120 | MODULE_AUTHOR("Vojtech Pavlik"); |
3120 | MODULE_AUTHOR("Jiri Kosina"); | 3121 | MODULE_AUTHOR("Jiri Kosina"); |
3121 | MODULE_LICENSE("GPL"); | 3122 | MODULE_LICENSE("GPL"); |
3122 | |||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index b397a14ab970..1b1fca0560f2 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -182,6 +182,7 @@ | |||
182 | #define USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD 0x0101 | 182 | #define USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD 0x0101 |
183 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854 | 183 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854 |
184 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2 0x1837 | 184 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2 0x1837 |
185 | #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822 | ||
185 | 186 | ||
186 | #define USB_VENDOR_ID_ATEN 0x0557 | 187 | #define USB_VENDOR_ID_ATEN 0x0557 |
187 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 | 188 | #define USB_DEVICE_ID_ATEN_UC100KM 0x2004 |