]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/hid/hid-multitouch.c
HID: hid-multitouch: add support for Ilitek dual-touch panel
[karo-tx-linux.git] / drivers / hid / hid-multitouch.c
index 6005e7888b14ebcfd7d30769ec3e04b57051745f..b21251b43a351ca256b4a36267936bf1783f92af 100644 (file)
@@ -50,6 +50,7 @@ MODULE_LICENSE("GPL");
 #define MT_QUIRK_VALID_IS_INRANGE      (1 << 4)
 #define MT_QUIRK_VALID_IS_CONFIDENCE   (1 << 5)
 #define MT_QUIRK_EGALAX_XYZ_FIXUP      (1 << 6)
+#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE   (1 << 7)
 
 struct mt_slot {
        __s32 x, y, p, w, h;
@@ -89,6 +90,8 @@ struct mt_class {
 #define MT_CLS_EGALAX                          5
 #define MT_CLS_STANTUM                         6
 #define MT_CLS_3M                              7
+#define MT_CLS_CONFIDENCE                      8
+#define MT_CLS_CONFIDENCE_MINUS_ONE            9
 
 #define MT_DEFAULT_MAXCONTACT  10
 
@@ -139,7 +142,9 @@ struct mt_class mt_classes[] = {
                .quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
                        MT_QUIRK_CYPRESS,
                .maxcontacts = 10 },
-
+       { .name = MT_CLS_CONFIDENCE_MINUS_ONE,
+               .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
+                       MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE },
        { .name = MT_CLS_EGALAX,
                .quirks =  MT_QUIRK_SLOT_IS_CONTACTID |
                        MT_QUIRK_VALID_IS_INRANGE |
@@ -156,6 +161,8 @@ struct mt_class mt_classes[] = {
                .sn_move = 2048,
                .sn_width = 128,
                .sn_height = 128 },
+       { .name = MT_CLS_CONFIDENCE,
+               .quirks = MT_QUIRK_VALID_IS_CONFIDENCE },
 
        { }
 };
@@ -322,6 +329,9 @@ static int mt_compute_slot(struct mt_device *td)
        if (quirks & MT_QUIRK_SLOT_IS_CONTACTNUMBER)
                return td->num_received;
 
+       if (quirks & MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE)
+               return td->curdata.contactid - 1;
+
        return find_slot_from_contactid(td);
 }
 
@@ -579,11 +589,32 @@ static const struct hid_device_id mt_devices[] = {
                HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
                        USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
 
+       /* Ilitek dual touch panel */
+       {  .driver_data = MT_CLS_DEFAULT,
+               HID_USB_DEVICE(USB_VENDOR_ID_ILITEK,
+                       USB_DEVICE_ID_ILITEK_MULTITOUCH) },
+
        /* IRTOUCH panels */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
                HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS,
                        USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
 
+       /* MosArt panels */
+       { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
+               HID_USB_DEVICE(USB_VENDOR_ID_ASUS,
+                       USB_DEVICE_ID_ASUS_T91MT)},
+       { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
+               HID_USB_DEVICE(USB_VENDOR_ID_ASUS,
+                       USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) },
+       { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
+               HID_USB_DEVICE(USB_VENDOR_ID_TURBOX,
+                       USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) },
+
+       /* PenMount panels */
+       { .driver_data = MT_CLS_CONFIDENCE,
+               HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
+                       USB_DEVICE_ID_PENMOUNT_PCI) },
+
        /* PixCir-based panels */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
                HID_USB_DEVICE(USB_VENDOR_ID_HANVON,