gpio: GPIOHANDLE_GET_LINE_VALUES_IOCTL: Fix information leak
[cascardo/linux.git] / drivers / hid / hid-uclogic.c
index 72778b3..1509d72 100644 (file)
@@ -632,6 +632,12 @@ static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
        __u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
        struct uclogic_drvdata *drvdata = hid_get_drvdata(hdev);
 
+       if (drvdata->rdesc != NULL) {
+               rdesc = drvdata->rdesc;
+               *rsize = drvdata->rsize;
+               return rdesc;
+       }
+
        switch (hdev->product) {
        case USB_DEVICE_ID_UCLOGIC_TABLET_PF1209:
                if (*rsize == PF1209_RDESC_ORIG_SIZE) {
@@ -701,11 +707,6 @@ static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
                        break;
                }
                break;
-       default:
-               if (drvdata->rdesc != NULL) {
-                       rdesc = drvdata->rdesc;
-                       *rsize = drvdata->rsize;
-               }
        }
 
        return rdesc;
@@ -937,6 +938,7 @@ static int uclogic_probe(struct hid_device *hdev,
 {
        int rc;
        struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
+       struct usb_device *udev = hid_to_usb_dev(hdev);
        struct uclogic_drvdata *drvdata;
 
        /*
@@ -987,6 +989,28 @@ static int uclogic_probe(struct hid_device *hdev,
                        drvdata->ignore_pen_usage = true;
                }
                break;
+       case USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60:
+               /*
+                * If it is the three-interface version, which is known to
+                * respond to initialization.
+                */
+               if (udev->config->desc.bNumInterfaces == 3) {
+                       /* If it is the pen interface */
+                       if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
+                               rc = uclogic_tablet_enable(hdev);
+                               if (rc) {
+                                       hid_err(hdev, "tablet enabling failed\n");
+                                       return rc;
+                               }
+                               drvdata->invert_pen_inrange = true;
+
+                               rc = uclogic_button_enable(hdev);
+                               drvdata->has_virtual_pad_interface = !rc;
+                       } else {
+                               drvdata->ignore_pen_usage = true;
+                       }
+               }
+               break;
        }
 
        rc = hid_parse(hdev);