]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'multitouch' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Mon, 1 Oct 2012 12:38:54 +0000 (14:38 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 1 Oct 2012 12:38:54 +0000 (14:38 +0200)
Conflicts:
drivers/hid/hid-multitouch.c

drivers/hid/hid-ids.h
drivers/hid/hid-multitouch.c

index c1da94a81a0dbb8403073741906802fc6b020685..ca4d83e6e3872b1f84bf86ec496fa81ad4f7a2a6 100644 (file)
 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA      0x72fa
 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302      0x7302
 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349      0x7349
+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_73F7      0x73f7
 #define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001      0xa001
+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224      0x7224
+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0      0x72d0
+#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4      0x72c4
 
 #define USB_VENDOR_ID_ELECOM           0x056e
 #define USB_DEVICE_ID_ELECOM_BM084     0x0061
 
 #define USB_VENDOR_ID_GENERAL_TOUCH    0x0dfc
 #define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003
+#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS 0x0100
 
 #define USB_VENDOR_ID_GLAB             0x06c2
 #define USB_DEVICE_ID_4_PHIDGETSERVO_30        0x0038
index ee0b76b398cb5a6a6fcda16dedbadff404d8f643..3eb02b94fc87c8a3bc903474db7c3b55efd5ead5 100644 (file)
@@ -117,6 +117,8 @@ struct mt_device {
 #define MT_CLS_TOPSEED                         0x0105
 #define MT_CLS_PANASONIC                       0x0106
 #define MT_CLS_FLATFROG                                0x0107
+#define MT_CLS_GENERALTOUCH_TWOFINGERS         0x0108
+#define MT_CLS_GENERALTOUCH_PWT_TENFINGERS     0x0109
 
 #define MT_DEFAULT_MAXCONTACT  10
 
@@ -200,6 +202,17 @@ static struct mt_class mt_classes[] = {
        { .name = MT_CLS_PANASONIC,
                .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP,
                .maxcontacts = 4 },
+       { .name = MT_CLS_GENERALTOUCH_TWOFINGERS,
+               .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
+                       MT_QUIRK_VALID_IS_INRANGE |
+                       MT_QUIRK_SLOT_IS_CONTACTNUMBER,
+               .maxcontacts = 2
+       },
+       { .name = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
+               .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
+                       MT_QUIRK_SLOT_IS_CONTACTNUMBER,
+               .maxcontacts = 10
+       },
 
        { .name = MT_CLS_FLATFROG,
                .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
@@ -682,12 +695,10 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
        struct mt_device *td;
        struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */
 
-       if (id) {
-               for (i = 0; mt_classes[i].name ; i++) {
-                       if (id->driver_data == mt_classes[i].name) {
-                               mtclass = &(mt_classes[i]);
-                               break;
-                       }
+       for (i = 0; mt_classes[i].name ; i++) {
+               if (id->driver_data == mt_classes[i].name) {
+                       mtclass = &(mt_classes[i]);
+                       break;
                }
        }
 
@@ -747,6 +758,32 @@ static int mt_reset_resume(struct hid_device *hdev)
        mt_set_input_mode(hdev);
        return 0;
 }
+
+static int mt_resume(struct hid_device *hdev)
+{
+       struct usb_interface *intf;
+       struct usb_host_interface *interface;
+       struct usb_device *dev;
+
+       if (hdev->bus != BUS_USB)
+               return 0;
+
+       intf = to_usb_interface(hdev->dev.parent);
+       interface = intf->cur_altsetting;
+       dev = hid_to_usb_dev(hdev);
+
+       /* Some Elan legacy devices require SET_IDLE to be set on resume.
+        * It should be safe to send it to other devices too.
+        * Tested on 3M, Stantum, Cypress, Zytronic, eGalax, and Elan panels. */
+
+       usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+                       HID_REQ_SET_IDLE,
+                       USB_TYPE_CLASS | USB_RECIP_INTERFACE,
+                       0, interface->desc.bInterfaceNumber,
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
+
+       return 0;
+}
 #endif
 
 static void mt_remove(struct hid_device *hdev)
@@ -862,9 +899,21 @@ static const struct hid_device_id mt_devices[] = {
        { .driver_data = MT_CLS_EGALAX_SERIAL,
                MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349) },
+       { .driver_data = MT_CLS_EGALAX_SERIAL,
+               MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
+                       USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_73F7) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
                MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
+       { .driver_data = MT_CLS_EGALAX,
+               HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
+                       USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
+       { .driver_data = MT_CLS_EGALAX,
+               HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
+                       USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0) },
+       { .driver_data = MT_CLS_EGALAX,
+               HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
+                       USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4) },
 
        /* Elo TouchSystems IntelliTouch Plus panel */
        { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID,
@@ -877,9 +926,12 @@ static const struct hid_device_id mt_devices[] = {
                        USB_DEVICE_ID_MULTITOUCH_3200) },
 
        /* GeneralTouch panel */
-       { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
+       { .driver_data = MT_CLS_GENERALTOUCH_TWOFINGERS,
                MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
                        USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
+       { .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
+               MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
+                       USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS) },
 
        /* Gametel game controller */
        { .driver_data = MT_CLS_DEFAULT,
@@ -1077,6 +1129,7 @@ static struct hid_driver mt_driver = {
        .event = mt_event,
 #ifdef CONFIG_PM
        .reset_resume = mt_reset_resume,
+       .resume = mt_resume,
 #endif
 };