HID: uclogic: Set quirks from inside the driver
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Tue, 3 Mar 2015 17:44:00 +0000 (12:44 -0500)
committerJiri Kosina <jkosina@suse.cz>
Tue, 3 Mar 2015 20:31:54 +0000 (21:31 +0100)
Based on a patch from: Nikolai Kondrashov <Nikolai.Kondrashov@redhat.com>

Most of the tablets handled by hid-uclogic already use MULTI_INPUT.
For the ones which are not quirked in usbhid/hidquirks, they have a
custom report descriptor which contains only one report per HID
interface. For those tablets HID_QUIRK_MULTI_INPUT is transparent.

According to https://github.com/DIGImend/tablets, the only problematic
tablet currently handled by hid-uclogic is the TWHA60 v3. This tablet
presents different report descriptors from the ones currently quirked.
This is not a problem per se, given that this tablet is not supported
currently in this version (it needs the same command as a Huion to
start forwarding events).

Reviewed-by: Nikolai Kondrashov <spbnick@gmail.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-uclogic.c
drivers/hid/usbhid/hid-quirks.c

index fb8b516ff0ed5f7693912ece34c4ff372d3918fa..22dccce6a85c65a42f5d31a05fd3b18c546630a4 100644 (file)
@@ -626,6 +626,32 @@ static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
        return rdesc;
 }
 
+static int uclogic_probe(struct hid_device *hdev,
+               const struct hid_device_id *id)
+{
+       int rc;
+
+       /*
+        * libinput requires the pad interface to be on a different node
+        * than the pen, so use QUIRK_MULTI_INPUT for all tablets.
+        */
+       hdev->quirks |= HID_QUIRK_MULTI_INPUT;
+
+       rc = hid_parse(hdev);
+       if (rc) {
+               hid_err(hdev, "parse failed\n");
+               return rc;
+       }
+
+       rc = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+       if (rc) {
+               hid_err(hdev, "hw start failed\n");
+               return rc;
+       }
+
+       return 0;
+}
+
 static const struct hid_device_id uclogic_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
                                USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) },
@@ -648,6 +674,7 @@ MODULE_DEVICE_TABLE(hid, uclogic_devices);
 static struct hid_driver uclogic_driver = {
        .name = "uclogic",
        .id_table = uclogic_devices,
+       .probe = uclogic_probe,
        .report_fixup = uclogic_report_fixup,
 };
 module_hid_driver(uclogic_driver);
index 9be99a67bfe2ec9f042e765904913628f8c2b654..6c9eab4f58bc0325f72013f8f2664f545a09b80f 100644 (file)
@@ -106,12 +106,8 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
-       { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209, HID_QUIRK_MULTI_INPUT },
-       { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U, HID_QUIRK_MULTI_INPUT },
        { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5, HID_QUIRK_MULTI_INPUT },
        { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60, HID_QUIRK_MULTI_INPUT },
-       { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U, HID_QUIRK_MULTI_INPUT },
-       { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U, HID_QUIRK_MULTI_INPUT },
        { USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH, HID_QUIRK_MULTI_INPUT },
        { USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH, HID_QUIRK_MULTI_INPUT },
        { USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET, HID_QUIRK_MULTI_INPUT },