Input: wacom - add support for 2 new multi-touch tablets (0x100 and 0x101)
authorPing Cheng <pinglinux@gmail.com>
Sat, 3 Nov 2012 19:16:15 +0000 (12:16 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 8 Nov 2012 17:12:46 +0000 (09:12 -0800)
This adds support for the two new multi-touch tablets.

Signed-off-by: Ping Cheng <pinglinux@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/tablet/wacom_sys.c
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.h

index 67442f409174dfd2f2c711bdd6ea1bf92a73827a..f92d34f45a1cc6ad13af95f42440021f3bafe2bf 100644 (file)
@@ -397,6 +397,10 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        features->pktlen = WACOM_PKGLEN_MTOUCH;
                                                        break;
 
+                                               case MTTPC:
+                                                       features->pktlen = WACOM_PKGLEN_MTTPC;
+                                                       break;
+
                                                case BAMBOO_PT:
                                                        features->pktlen = WACOM_PKGLEN_BBTOUCH;
                                                        break;
@@ -453,6 +457,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                switch (features->type) {
                                                case TABLETPC2FG:
                                                case MTSCREEN:
+                                               case MTTPC:
                                                        features->y_max =
                                                                get_unaligned_le16(&report[i + 3]);
                                                        features->y_phy =
index 0a67031ffc131a2559d6573d5c3cf65173edd9c6..7554a043ee46e4fac768ce4cf451bdbcee9a2d0e 100644 (file)
@@ -877,6 +877,11 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        int i;
        int current_num_contacts = data[2];
        int contacts_to_send = 0;
+       int x_offset = 0;
+
+       /* MTTPC does not support Height and Width */
+       if (wacom->features.type == MTTPC)
+               x_offset = -4;
 
        /*
         * First packet resets the counter since only the first
@@ -889,7 +894,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        contacts_to_send = min(5, wacom->num_contacts_left);
 
        for (i = 0; i < contacts_to_send; i++) {
-               int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3;
+               int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
                bool touch = data[offset] & 0x1;
                int id = le16_to_cpup((__le16 *)&data[offset + 1]);
                int slot = find_slot_from_contactid(wacom, id);
@@ -900,8 +905,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
                input_mt_slot(input, slot);
                input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
                if (touch) {
-                       int x = le16_to_cpup((__le16 *)&data[offset + 7]);
-                       int y = le16_to_cpup((__le16 *)&data[offset + 9]);
+                       int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]);
+                       int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]);
                        input_report_abs(input, ABS_MT_POSITION_X, x);
                        input_report_abs(input, ABS_MT_POSITION_Y, y);
                }
@@ -1336,6 +1341,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
        case TABLETPCE:
        case TABLETPC2FG:
        case MTSCREEN:
+       case MTTPC:
                sync = wacom_tpc_irq(wacom_wac, len);
                break;
 
@@ -1657,6 +1663,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
                /* fall through */
 
        case MTSCREEN:
+       case MTTPC:
                if (features->device_type == BTN_TOOL_FINGER) {
                        wacom_wac->slots = kmalloc(features->touch_max *
                                                        sizeof(int),
@@ -2018,6 +2025,12 @@ static const struct wacom_features wacom_features_0xED =
 static const struct wacom_features wacom_features_0xEF =
        { "Wacom ISDv4 EF",       WACOM_PKGLEN_GRAPHIRE,  26202, 16325,  255,
          0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x100 =
+       { "Wacom ISDv4 100",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255,
+         0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x101 =
+       { "Wacom ISDv4 101",      WACOM_PKGLEN_MTTPC,     26202, 16325,  255,
+         0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x47 =
        { "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023,
          31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2194,6 +2207,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0xEC) },
        { USB_DEVICE_WACOM(0xED) },
        { USB_DEVICE_WACOM(0xEF) },
+       { USB_DEVICE_WACOM(0x100) },
+       { USB_DEVICE_WACOM(0x101) },
        { USB_DEVICE_WACOM(0x47) },
        { USB_DEVICE_WACOM(0xF4) },
        { USB_DEVICE_WACOM(0xF8) },
index 345f1e76975ef76ef6b251ae772a7c2b807c21ff..9396d7769f86a86930b56f3f2e1fbbae024b82cf 100644 (file)
@@ -26,6 +26,7 @@
 #define WACOM_PKGLEN_BBPEN     10
 #define WACOM_PKGLEN_WIRELESS  32
 #define WACOM_PKGLEN_MTOUCH    62
+#define WACOM_PKGLEN_MTTPC     40
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
@@ -88,6 +89,7 @@ enum {
        TABLETPCE,
        TABLETPC2FG,
        MTSCREEN,
+       MTTPC,
        MAX_TYPE
 };