aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-chicony.c26
-rw-r--r--drivers/hid/hid-core.c1
-rw-r--r--drivers/hid/hid-ids.h1
3 files changed, 28 insertions, 0 deletions
diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c
index b613d5a79684..bc3cec199fee 100644
--- a/drivers/hid/hid-chicony.c
+++ b/drivers/hid/hid-chicony.c
@@ -20,6 +20,7 @@
20#include <linux/input.h> 20#include <linux/input.h>
21#include <linux/hid.h> 21#include <linux/hid.h>
22#include <linux/module.h> 22#include <linux/module.h>
23#include <linux/usb.h>
23 24
24#include "hid-ids.h" 25#include "hid-ids.h"
25 26
@@ -57,10 +58,34 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
57 return 1; 58 return 1;
58} 59}
59 60
61static __u8 *ch_switch12_report_fixup(struct hid_device *hdev, __u8 *rdesc,
62 unsigned int *rsize)
63{
64 struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
65
66 if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
67 /* Change usage maximum and logical maximum from 0x7fff to
68 * 0x2fff, so they don't exceed HID_MAX_USAGES */
69 switch (hdev->product) {
70 case USB_DEVICE_ID_CHICONY_ACER_SWITCH12:
71 if (*rsize >= 128 && rdesc[64] == 0xff && rdesc[65] == 0x7f
72 && rdesc[69] == 0xff && rdesc[70] == 0x7f) {
73 hid_info(hdev, "Fixing up report descriptor\n");
74 rdesc[65] = rdesc[70] = 0x2f;
75 }
76 break;
77 }
78
79 }
80 return rdesc;
81}
82
83
60static const struct hid_device_id ch_devices[] = { 84static const struct hid_device_id ch_devices[] = {
61 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, 85 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
62 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, 86 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
63 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) }, 87 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
88 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
64 { } 89 { }
65}; 90};
66MODULE_DEVICE_TABLE(hid, ch_devices); 91MODULE_DEVICE_TABLE(hid, ch_devices);
@@ -68,6 +93,7 @@ MODULE_DEVICE_TABLE(hid, ch_devices);
68static struct hid_driver ch_driver = { 93static struct hid_driver ch_driver = {
69 .name = "chicony", 94 .name = "chicony",
70 .id_table = ch_devices, 95 .id_table = ch_devices,
96 .report_fixup = ch_switch12_report_fixup,
71 .input_mapping = ch_input_mapping, 97 .input_mapping = ch_input_mapping,
72}; 98};
73module_hid_driver(ch_driver); 99module_hid_driver(ch_driver);
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 157c62775053..a77d30388b4d 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1804,6 +1804,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
1804 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) }, 1804 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
1805 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, 1805 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
1806 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) }, 1806 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
1807 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
1807 { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) }, 1808 { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
1808 { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) }, 1809 { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
1809 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, 1810 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index b04b0820d816..7c712dff2ca1 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -230,6 +230,7 @@
230#define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053 230#define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053
231#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 231#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123
232#define USB_DEVICE_ID_CHICONY_AK1D 0x1125 232#define USB_DEVICE_ID_CHICONY_AK1D 0x1125
233#define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421
233 234
234#define USB_VENDOR_ID_CHUNGHWAT 0x2247 235#define USB_VENDOR_ID_CHUNGHWAT 0x2247
235#define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 236#define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001