]> git.hungrycats.org Git - linux/commitdiff
HID: chicony: Add support for Acer Aspire Switch 12
authorНиколай Кудрявцев <nkudriavtsev@gmail.com>
Tue, 21 Jul 2015 10:31:52 +0000 (13:31 +0300)
committerJiri Slaby <jslaby@suse.cz>
Wed, 15 Jun 2016 07:32:00 +0000 (09:32 +0200)
commit 9a1d78a3780e0e37eeff11b377fc5fbb01446a36 upstream.

Acer Aspire Switch 12 keyboard Chicony's controller reports too big usage
index on the 1st interface. The patch fixes the report. The work based on
solution from drivers/hid/hid-holtek-mouse.c

Bug report: https://bugzilla.kernel.org/show_bug.cgi?id=101721

Signed-off-by: Nicholas Kudriavtsev <nkudriavtsev@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
drivers/hid/hid-chicony.c
drivers/hid/hid-core.c
drivers/hid/hid-ids.h

index b613d5a7968457b5719acaf57d9c0bc98b47ed29..bc3cec199feefdf437d0c0141c5ff6f73aa10308 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/input.h>
 #include <linux/hid.h>
 #include <linux/module.h>
+#include <linux/usb.h>
 
 #include "hid-ids.h"
 
@@ -57,10 +58,34 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
        return 1;
 }
 
+static __u8 *ch_switch12_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+               unsigned int *rsize)
+{
+       struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
+       
+       if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
+               /* Change usage maximum and logical maximum from 0x7fff to
+                * 0x2fff, so they don't exceed HID_MAX_USAGES */
+               switch (hdev->product) {
+               case USB_DEVICE_ID_CHICONY_ACER_SWITCH12:
+                       if (*rsize >= 128 && rdesc[64] == 0xff && rdesc[65] == 0x7f
+                                       && rdesc[69] == 0xff && rdesc[70] == 0x7f) {
+                               hid_info(hdev, "Fixing up report descriptor\n");
+                               rdesc[65] = rdesc[70] = 0x2f;
+                       }
+                       break;
+               }
+
+       }
+       return rdesc;
+}
+
+
 static const struct hid_device_id ch_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
        { }
 };
 MODULE_DEVICE_TABLE(hid, ch_devices);
@@ -68,6 +93,7 @@ MODULE_DEVICE_TABLE(hid, ch_devices);
 static struct hid_driver ch_driver = {
        .name = "chicony",
        .id_table = ch_devices,
+       .report_fixup = ch_switch12_report_fixup,
        .input_mapping = ch_input_mapping,
 };
 module_hid_driver(ch_driver);
index 6ae4df439d0693995dbd3f37aa054bd8de8611bd..05867d1d8cdcf23d6e7455706258176075bb0e37 100644 (file)
@@ -1719,6 +1719,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
index 6a6b06ef31b1f5dd240b2dc740b197dc517e2938..555dc61d2eb32e49a2e50d180b40517ad063b31a 100644 (file)
 #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053
 #define USB_DEVICE_ID_CHICONY_WIRELESS2        0x1123
 #define USB_DEVICE_ID_CHICONY_AK1D     0x1125
+#define USB_DEVICE_ID_CHICONY_ACER_SWITCH12    0x1421
 
 #define USB_VENDOR_ID_CHUNGHWAT                0x2247
 #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH     0x0001