diff options
| -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 |
