|
@@ -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
|
|
|
};
|
|
|
|