Following up on the prior patch, we add the code necessary for the 2.6.30
and 2.6.36 trees to properly handle touch sensors from the WACOM_24HDT and
WACOM_27QHDT classes (e.g. Cintiq 24HDT, Cintiq 13HDT, DTH2242).

Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
---
 2.6.30/wacom_sys.c | 50 +++++++++++++++++++++++++++++++++++---
 2.6.30/wacom_wac.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 2.6.30/wacom_wac.h |  5 ++++
 2.6.36/wacom_sys.c | 46 +++++++++++++++++++++++++++++++----
 2.6.36/wacom_wac.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++----
 2.6.36/wacom_wac.h |  4 ++++
 6 files changed, 229 insertions(+), 14 deletions(-)

diff --git a/2.6.30/wacom_sys.c b/2.6.30/wacom_sys.c
index b8c048a..92da296 100644
--- a/2.6.30/wacom_sys.c
+++ b/2.6.30/wacom_sys.c
@@ -263,17 +263,22 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                         features->type == 
MTTPC ||
                                                         features->type == 
MTTPC_B ||
                                                         features->type == 
MTTPC_C ||
+                                                        features->type == 
WACOM_24HDT ||
                                                         features->type == 
WACOM_MSPROT ||
-                                                        features->type == 
DTH1152T) {
+                                                        features->type == 
DTH1152T ||
+                                                        features->type == 
WACOM_27QHDT) {
                                                /* need to reset back */
                                                features->pktlen = 
WACOM_PKGLEN_TPC2FG;
                                                if (features->type == MTTPC ||
                                                    features->type == MTTPC_B ||
                                                    features->type == MTTPC_C)
                                                        features->pktlen = 
WACOM_PKGLEN_MTTPC;
+                                               else if (features->type == 
WACOM_24HDT)
+                                                       features->pktlen = 
WACOM_PKGLEN_MTOUCH;
                                                else if (features->type == 
WACOM_MSPROT)
                                                        features->pktlen = 
WACOM_PKGLEN_MSPROT;
-                                               else if (features->type == 
DTH1152T)
+                                               else if (features->type == 
DTH1152T ||
+                                                        features->type == 
WACOM_27QHDT)
                                                        features->pktlen = 
WACOM_PKGLEN_27QHDT;
                                                features->device_type = 
BTN_TOOL_TRIPLETAP;
                                        }
@@ -290,6 +295,7 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                break;
 
                                        case DTH1152T:
+                                       case WACOM_24HDT:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->x_phy =
@@ -298,6 +304,17 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                features->unitExpo = report[i - 
3];
                                                break;
 
+                                       case WACOM_27QHDT:
+                                               if (!features->x_max) {
+                                                       features->x_max =
+                                                               
get_unaligned_le16(&report[i - 4]);
+                                                       features->x_phy =
+                                                               
get_unaligned_le16(&report[i - 7]);
+                                                       features->unit = 
report[i - 13];
+                                                       features->unitExpo = 
report[i - 11];
+                                               }
+                                               break;
+
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
                                                features->x_max =
@@ -351,6 +368,7 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                break;
 
                                        case DTH1152T:
+                                       case WACOM_24HDT:
                                        case MTTPC_C:
                                                features->y_max =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -358,6 +376,15 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        
get_unaligned_le16(&report[i - 2]);
                                                break;
 
+                                       case WACOM_27QHDT:
+                                               if (!features->y_max) {
+                                                       features->y_max =
+                                                               
get_unaligned_le16(&report[i - 2]);
+                                                       features->y_phy =
+                                                               
get_unaligned_le16(&report[i - 5]);
+                                               }
+                                               break;
+
                                        case BAMBOO_PT:
                                                features->y_phy =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -466,7 +493,24 @@ static int wacom_query_tablet_data(struct usb_interface 
*intf, struct wacom_feat
                                error = wacom_set_report(intf, 
WAC_HID_FEATURE_REPORT,
                                        report_id, rep_data, 4, 1);
                        } while ((error < 0 || rep_data[1] != 4) && limit++ < 
5);
-
+               }
+               else if (features->type == WACOM_24HDT) {
+                       do {
+                               rep_data[0] = 18;
+                               rep_data[1] = 2;
+                               report_id = 18;
+                               error = wacom_set_report(intf, 
WAC_HID_FEATURE_REPORT,
+                                       report_id, rep_data, 3, 1);
+                       } while ((error < 0 || rep_data[1] != 2) && limit++ < 
5);
+               }
+               else if (features->type == WACOM_27QHDT) {
+                       do {
+                               rep_data[0] = 131;
+                               rep_data[1] = 2;
+                               report_id = 131;
+                               error = wacom_set_report(intf, 
WAC_HID_FEATURE_REPORT,
+                                       report_id, rep_data, 3, 1);
+                       } while ((error < 0 || rep_data[1] != 2) && limit++ < 
5);
                } else if (features->type == WACOM_MSPROT ||
                           features->type == DTH1152T) {
                        do {
diff --git a/2.6.30/wacom_wac.c b/2.6.30/wacom_wac.c
index b110a7d..037c740 100644
--- a/2.6.30/wacom_wac.c
+++ b/2.6.30/wacom_wac.c
@@ -936,19 +936,39 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
        struct wacom_features *features = &wacom->features;
        struct input_dev *input = wacom->input;
        unsigned char *data = wacom->data;
-       int i, current_num_contacts, contacts_to_send;
+       int current_num_contacts, contacts_to_send, contacts_per_packet;
+       int bytes_per_packet, bytes_header;
+       int i;
 
        wacom->tool[1] = BTN_TOOL_DOUBLETAP;
        wacom->id[0] = TOUCH_DEVICE_ID;
        wacom->tool[2] = BTN_TOOL_TRIPLETAP;
 
        switch (features->type) {
+       case WACOM_24HDT:
+               current_num_contacts = data[61];
+               contacts_per_packet = 4;
+               bytes_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
+               bytes_header = 1;
+               break;
+       case WACOM_27QHDT:
+               current_num_contacts = data[63];
+               contacts_per_packet = 10;
+               bytes_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
+               bytes_header = 1;
+               break;
        case WACOM_MSPROT:
        case DTH1152T:
                current_num_contacts = data[2];
+               contacts_per_packet = 5;
+               bytes_per_packet = WACOM_BYTES_PER_MSPROT_PACKET;
+               bytes_header = 3;
                break;
        case INTUOSP2:
                current_num_contacts = data[1];
+               contacts_per_packet = 5;
+               bytes_per_packet = WACOM_BYTES_PER_INTUOSP2_PACKET;
+               bytes_header = 2;
                break;
        default:
                return 0;
@@ -957,7 +977,7 @@ static int wacom_multitouch_generic(struct wacom_wac *wacom)
        if (current_num_contacts)
                wacom->num_contacts_left = current_num_contacts;
 
-       contacts_to_send = min(5, wacom->num_contacts_left);
+       contacts_to_send = min(contacts_per_packet, wacom->num_contacts_left);
 
        for (i = 0; i < contacts_to_send; i++) {
                int contact_id = -1;
@@ -967,6 +987,20 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                int offset = bytes_per_packet * i + bytes_header;
 
                switch (features->type) {
+               case WACOM_24HDT:
+                       prox = data[offset] & 0x01;
+                       contact_id = data[offset + 1];
+                       x   = get_unaligned_le16(&data[offset + 2]);
+                       y   = get_unaligned_le16(&data[offset + 6]);
+                       break;
+
+               case WACOM_27QHDT:
+                       prox = data[offset] & 0x01;
+                       contact_id = data[offset + 1];
+                       x = get_unaligned_le16(&data[offset + 2]);
+                       y = get_unaligned_le16(&data[offset + 4]);
+                       break;
+
                case WACOM_MSPROT:
                        prox = data[offset] & 0x1;
                        contact_id = get_unaligned_le16(&data[offset + 1]);
@@ -1762,6 +1796,8 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                        sync = wacom_mspro_irq(wacom_wac);
                break;
 
+       case WACOM_24HDT:
+       case WACOM_27QHDT:
        case DTH1152T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
@@ -2141,11 +2177,19 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                wacom_setup_intuos(wacom_wac);
                break;
 
+       case WACOM_24HDT:
+               if (features->device_type == BTN_TOOL_FINGER) {
+                       input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 
features->x_max, 0, 0);
+                       input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, 
features->y_max, 0, 0);
+               }
+               /* fall through */
+
        case WACOM_MSPROT:
        case MTTPC:
        case MTTPC_B:
        case MTTPC_C:
        case DTH1152T:
+       case WACOM_27QHDT:
                if (features->device_type == BTN_TOOL_TRIPLETAP) {
                        for (i = 0; i < 10; i++)
                                wacom_wac->slots[i] = -1;
@@ -2439,6 +2483,9 @@ static const struct wacom_features wacom_features_0xF8 =
          WACOM_24HD, 16,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0xF6 =
+       { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 };
 static const struct wacom_features wacom_features_0x32A =
        { "Wacom Cintiq 27QHD", WACOM_PKGLEN_INTUOS, 119740, 67520, 2047, 63,
          WACOM_27QHD, 0,
@@ -2449,6 +2496,9 @@ static const struct wacom_features wacom_features_0x32B =
          WACOM_27QHD, 0,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x32C =
+       { "Wacom Cintiq 27QHD touch", .type = WACOM_27QHDT,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32B, .touch_max = 10 };
 static const struct wacom_features wacom_features_0x3F =
        { "Wacom Cintiq 21UX",    WACOM_PKGLEN_INTUOS,    87200, 65600, 1023, 
63,
          CINTIQ, 8 };
@@ -2468,6 +2518,9 @@ static const struct wacom_features wacom_features_0x333 =
          WACOM_13HD, 9,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x335 =
+       { "Wacom Cintiq 13HD touch", .type = WACOM_24HDT, /* Touch */
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x333, .touch_max = 10 };
 static const struct wacom_features wacom_features_0xC7 =
        { "Wacom DTU1931",        WACOM_PKGLEN_GRAPHIRE,  37832, 30305, 511, 0,
          PL };
@@ -2507,6 +2560,9 @@ static const struct wacom_features wacom_features_0x59 = 
/* Pen */
          DTK, 6,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x5D = /* Touch */
+       { "Wacom DTH2242",       .type = WACOM_24HDT,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10 };
 static const struct wacom_features wacom_features_0xCC =
        { "Wacom Cintiq 21UX2",   WACOM_PKGLEN_INTUOS,    86800, 65200, 2047, 
63,
          WACOM_21UX2, 18,
@@ -2522,6 +2578,9 @@ static const struct wacom_features wacom_features_0x5B =
          WACOM_22HD, 18,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x5E =
+       { "Wacom Cintiq 22HDT", .type = WACOM_24HDT,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 };
 static const struct wacom_features wacom_features_0x90 =
        { "Wacom ISDv4 90",       WACOM_PKGLEN_GRAPHIRE,  26202, 16325, 255, 0,
          TABLETPC };
@@ -2716,7 +2775,7 @@ static const struct wacom_features wacom_features_0x35A =
          DTH1152, .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x368 };
 static const struct wacom_features wacom_features_0x368 =
        { "Wacom DTH-1152 Touch", WACOM_PKGLEN_27QHDT,
-         .type = DTH1152T, .oVid = USB_VENDOR_ID_WACOM,
+         .type = DTH1152T, .touch_max = 10, .oVid = USB_VENDOR_ID_WACOM,
          .oPid = 0x35A }; /* Touch */
 
 #define USB_DEVICE_WACOM(prod)                                 \
@@ -2774,6 +2833,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x57) },
        { USB_DEVICE_WACOM(0x59) },
        { USB_DEVICE_WACOM(0x5B) },
+       { USB_DEVICE_DETAILED(0x5D, USB_CLASS_HID, 0, 0) },
+       { USB_DEVICE_DETAILED(0x5E, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_WACOM(0x60) },
        { USB_DEVICE_WACOM(0x61) },
        { USB_DEVICE_WACOM(0x62) },
@@ -2833,6 +2894,7 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0xE6) },
        { USB_DEVICE_WACOM(0xF0) },
        { USB_DEVICE_WACOM(0xF4) },
+       { USB_DEVICE_DETAILED(0xF6, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_WACOM(0xF8) },
        { USB_DEVICE_WACOM(0xFA) },
        { USB_DEVICE_WACOM(0xFB) },
@@ -2854,8 +2916,10 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_DETAILED(0x323, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_WACOM(0x32A) },
        { USB_DEVICE_WACOM(0x32B) },
+       { USB_DEVICE_WACOM(0x32C) },
        { USB_DEVICE_WACOM(0x32F) },
        { USB_DEVICE_WACOM(0x333) },
+       { USB_DEVICE_WACOM(0x335) },
        { USB_DEVICE_WACOM(0x336) },
        { USB_DEVICE_DETAILED(0x33B, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_DETAILED(0x33C, USB_CLASS_HID, 0, 0) },
diff --git a/2.6.30/wacom_wac.h b/2.6.30/wacom_wac.h
index c2cb837..d22048b 100755
--- a/2.6.30/wacom_wac.h
+++ b/2.6.30/wacom_wac.h
@@ -25,6 +25,7 @@
 #define WACOM_PKGLEN_TPC1FG_B  10
 #define WACOM_PKGLEN_TPC2FG    14
 #define WACOM_PKGLEN_BBTOUCH   20
+#define WACOM_PKGLEN_MTOUCH    62
 #define WACOM_PKGLEN_BBTOUCH3  64
 #define WACOM_PKGLEN_BBPEN     10
 #define WACOM_PKGLEN_MTTPC     40
@@ -39,6 +40,8 @@
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
+#define WACOM_BYTES_PER_24HDT_PACKET   14
+#define WACOM_BYTES_PER_QHDTHID_PACKET  6
 #define WACOM_BYTES_PER_MSPROT_PACKET   9
 #define WACOM_BYTES_PER_INTUOSP2_PACKET  8
 
@@ -112,6 +115,8 @@ enum {
        INTUOSHT,
        INTUOSHT2,
        BAMBOO_PT,
+       WACOM_24HDT,
+       WACOM_27QHDT,
        WACOM_MSPROT,
        DTH1152T,
        INTUOSP2,
diff --git a/2.6.36/wacom_sys.c b/2.6.36/wacom_sys.c
index 8a52c62..5c62615 100644
--- a/2.6.36/wacom_sys.c
+++ b/2.6.36/wacom_sys.c
@@ -271,11 +271,13 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                features->touch_max = 2;
                                        }
 
-                                       if (features->type == MTSCREEN)
+                                       if (features->type == MTSCREEN ||
+                                           features->type == WACOM_24HDT)
                                                features->pktlen = 
WACOM_PKGLEN_MTOUCH;
                                        else if (features->type == WACOM_MSPROT)
                                                features->pktlen = 
WACOM_PKGLEN_MSPROT;
-                                       else if (features->type == DTH1152T)
+                                       else if (features->type == DTH1152T ||
+                                                features->type == WACOM_27QHDT)
                                                features->pktlen = 
WACOM_PKGLEN_27QHDT;
 
                                        if (features->type == BAMBOO_PT) {
@@ -293,13 +295,23 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        
get_unaligned_le16(&report[i + 6]);
                                                features->unit = report[i - 5];
                                                features->unitExpo = report[i - 
3];
-                                       } else if (features->type == DTH1152T) {
+                                       } else if (features->type == DTH1152T ||
+                                                  features->type == 
WACOM_24HDT) {
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->x_phy =
                                                        
get_unaligned_le16(&report[i + 8]);
                                                features->unit = report[i - 1];
                                                features->unitExpo = report[i - 
3];
+                                       } else if (features->type == 
WACOM_27QHDT) {
+                                               if (!features->x_max) {
+                                                       features->x_max =
+                                                               
get_unaligned_le16(&report[i - 4]);
+                                                       features->x_phy =
+                                                               
get_unaligned_le16(&report[i - 7]);
+                                                       features->unit = 
report[i - 13];
+                                                       features->unitExpo = 
report[i - 11];
+                                               }
                                        } else {
                                                features->touch_max = 1;
                                                features->x_max =
@@ -336,11 +348,19 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->y_phy =
                                                        
get_unaligned_le16(&report[i + 6]);
-                                       } else if (features->type == DTH1152T) {
+                                       } else if (features->type == DTH1152T ||
+                                                  features->type == 
WACOM_24HDT) {
                                                features->y_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->y_phy =
                                                        
get_unaligned_le16(&report[i - 2]);
+                                       } else if (features->type == 
WACOM_27QHDT) {
+                                               if (!features->y_max) {
+                                                       features->y_max =
+                                                               
get_unaligned_le16(&report[i - 2]);
+                                                       features->y_phy =
+                                                               
get_unaligned_le16(&report[i - 5]);
+                                               }
                                        } else {
                                                features->y_max =
                                                        features->x_max;
@@ -441,6 +461,24 @@ static int wacom_query_tablet_data(struct usb_interface 
*intf, struct wacom_feat
                                report_id, rep_data, 2, 1);
                } while ((error < 0 || rep_data[1] != 2) && limit++ < 
WAC_MSG_RETRIES);
        }
+       else if (features->type == WACOM_24HDT) {
+               do {
+                       rep_data[0] = 18;
+                       rep_data[1] = 2;
+                       report_id = 18;
+                       error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
+                               report_id, rep_data, 3, 1);
+               } while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
+       }
+       else if (features->type == WACOM_27QHDT) {
+               do {
+                       rep_data[0] = 131;
+                       rep_data[1] = 2;
+                       report_id = 131;
+                       error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
+                               report_id, rep_data, 3, 1);
+               } while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
+       }
 
        kfree(rep_data);
 
diff --git a/2.6.36/wacom_wac.c b/2.6.36/wacom_wac.c
index cc76104..391f78c 100644
--- a/2.6.36/wacom_wac.c
+++ b/2.6.36/wacom_wac.c
@@ -1289,15 +1289,35 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 {
        struct wacom_features *features = &wacom->features;
        unsigned char *data = wacom->data;
-       int i, current_num_contacts, contacts_to_send;
+       int current_num_contacts, contacts_to_send, contacts_per_packet;
+       int bytes_per_packet, bytes_header;
+       int i;
 
        switch (features->type) {
-       case DTH1152T:
+       case WACOM_24HDT:
+               current_num_contacts = data[61];
+               contacts_per_packet = 4;
+               bytes_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
+               bytes_header = 1;
+               break;
+       case WACOM_27QHDT:
+               current_num_contacts = data[63];
+               contacts_per_packet = 10;
+               bytes_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
+               bytes_header = 1;
+               break;
        case WACOM_MSPROT:
+       case DTH1152T:
                current_num_contacts = data[2];
+               contacts_per_packet = 5;
+               bytes_per_packet = WACOM_BYTES_PER_MSPROT_PACKET;
+               bytes_header = 3;
                break;
        case INTUOSP2:
                current_num_contacts = data[1];
+               contacts_per_packet = 5;
+               bytes_per_packet = WACOM_BYTES_PER_INTUOSP2_PACKET;
+               bytes_header = 2;
                break;
        default:
                return 0;
@@ -1308,7 +1328,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                features->num_contacts_left = current_num_contacts;
        }
 
-       contacts_to_send = min(5, features->num_contacts_left);
+       contacts_to_send = min(contacts_per_packet, 
features->num_contacts_left);
 
        for (i = 0; i < contacts_to_send; i++) {
                int contact_id = -1;
@@ -1318,6 +1338,20 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                int offset = bytes_per_packet * i + bytes_header;
 
                switch (features->type) {
+               case WACOM_24HDT:
+                       prox = data[offset] & 0x01;
+                       contact_id = data[offset + 1];
+                       x   = get_unaligned_le16(&data[offset + 2]);
+                       y   = get_unaligned_le16(&data[offset + 6]);
+                       break;
+
+               case WACOM_27QHDT:
+                       prox = data[offset] & 0x01;
+                       contact_id = data[offset + 1];
+                       x = get_unaligned_le16(&data[offset + 2]);
+                       y = get_unaligned_le16(&data[offset + 4]);
+                       break;
+
                case WACOM_MSPROT:
                        prox = data[offset] & 0x1;
                        contact_id = get_unaligned_le16(&data[offset + 1]);
@@ -1604,6 +1638,8 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                        sync = wacom_mspro_irq(wacom_wac);
                break;
 
+       case WACOM_24HDT:
+       case WACOM_27QHDT:
        case DTH1152T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
@@ -1910,10 +1946,18 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                wacom_setup_intuos(wacom_wac);
                break;
 
+       case WACOM_24HDT:
+               if (features->device_type == BTN_TOOL_FINGER) {
+                       input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 
features->x_max, 0, 0);
+                       input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, 
features->y_max, 0, 0);
+               }
+               /* fall through */
+
        case DTH1152T:
        case WACOM_MSPROT:
        case TABLETPC2FG:
        case MTSCREEN:
+       case WACOM_27QHDT:
                if (features->device_type == BTN_TOOL_FINGER) {
                        input_mt_create_slots(input_dev, features->touch_max);
                        input_set_abs_params(input_dev, ABS_MT_POSITION_X,
@@ -2195,6 +2239,9 @@ static const struct wacom_features wacom_features_0xF8 =
          63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 16,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0xF6 =
+       { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */
+         .touch_max = 10 };
 static const struct wacom_features wacom_features_0x57 =
        { "Wacom DTK2241",        WACOM_PKGLEN_INTUOS,    95640, 54060, 2047,
          63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6,
@@ -2205,6 +2252,9 @@ static const struct wacom_features wacom_features_0x59 =
          63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x5D = /* Touch */
+       { "Wacom DTH2242",       .type = WACOM_24HDT,
+         .touch_max = 10 };
 static const struct wacom_features wacom_features_0x3F =
        { "Wacom Cintiq 21UX",    WACOM_PKGLEN_INTUOS,    87200, 65600, 1023,
          63, CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 };
@@ -2224,6 +2274,9 @@ static const struct wacom_features wacom_features_0x333 =
          63, WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x335 =
+       { "Wacom Cintiq 13HD touch", .type = WACOM_24HDT, /* Touch */
+         .touch_max = 10 };
 static const struct wacom_features wacom_features_0xC7 =
        { "Wacom DTU1931",        WACOM_PKGLEN_GRAPHIRE,  37832, 30305,  511,
          0, PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2263,6 +2316,9 @@ static const struct wacom_features wacom_features_0x5B =
          63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x5E =
+       { "Wacom Cintiq 22HDT", .type = WACOM_24HDT,
+         .touch_max = 10 };
 static const struct wacom_features wacom_features_0x90 =
        { "Wacom ISDv4 90",       WACOM_PKGLEN_GRAPHIRE,  26202, 16325,  255,
          0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2380,7 +2436,7 @@ static const struct wacom_features wacom_features_0x35A =
          0, DTH1152, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x368 =
        { "Wacom DTH-1152 Touch", WACOM_PKGLEN_27QHDT,
-         .type = DTH1152T }; /* Touch */
+         .type = DTH1152T, .touch_max = 10 }; /* Touch */
 static const struct wacom_features wacom_features_0x6004 =
        { "ISD-V4",               WACOM_PKGLEN_GRAPHIRE,  12800,  8000,  255,
          0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -2445,6 +2501,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x57) },
        { USB_DEVICE_WACOM(0x59) },
        { USB_DEVICE_WACOM(0x5B) },
+       { USB_DEVICE_DETAILED(0x5D, USB_CLASS_HID, 0, 0) },
+       { USB_DEVICE_DETAILED(0x5E, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_WACOM(0xB0) },
        { USB_DEVICE_WACOM(0xB1) },
        { USB_DEVICE_WACOM(0xB2) },
@@ -2500,9 +2558,11 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_DETAILED(0x315, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_DETAILED(0x317, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_WACOM(0x333) },
+       { USB_DEVICE_WACOM(0x335) },
        { USB_DEVICE_WACOM(0x336) },
        { USB_DEVICE_WACOM(0x47) },
        { USB_DEVICE_WACOM(0xF4) },
+       { USB_DEVICE_DETAILED(0xF6, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_WACOM(0xF8) },
        { USB_DEVICE_WACOM(0xFA) },
        { USB_DEVICE_WACOM(0xFB) },
diff --git a/2.6.36/wacom_wac.h b/2.6.36/wacom_wac.h
index d420769..caf89c1 100644
--- a/2.6.36/wacom_wac.h
+++ b/2.6.36/wacom_wac.h
@@ -60,6 +60,8 @@
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
+#define WACOM_BYTES_PER_24HDT_PACKET   14
+#define WACOM_BYTES_PER_QHDTHID_PACKET 6
 #define WACOM_BYTES_PER_MSPROT_PACKET  9
 #define WACOM_BYTES_PER_INTUOSP2_PACKET 8
 
@@ -103,6 +105,8 @@ enum {
        WACOM_BEE,
        WACOM_13HD,
        WACOM_MO,
+       WACOM_24HDT,
+       WACOM_27QHDT,
        WACOM_MSPROT,
        DTH1152T,
        INTUOSP2,
-- 
2.15.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to