Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
---
 2.6.30/wacom_sys.c | 22 +++++++++++++++++---
 2.6.30/wacom_wac.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2.6.30/wacom_wac.h |  4 ++++
 2.6.36/wacom_sys.c | 17 +++++++++++++++-
 2.6.36/wacom_wac.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2.6.36/wacom_wac.h |  4 ++++
 2.6.38/wacom_sys.c |  6 +++++-
 2.6.38/wacom_wac.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2.6.38/wacom_wac.h |  3 +++
 3.7/wacom_sys.c    |  6 +++++-
 3.7/wacom_wac.c    | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3.7/wacom_wac.h    |  3 +++
 12 files changed, 287 insertions(+), 6 deletions(-)

diff --git a/2.6.30/wacom_sys.c b/2.6.30/wacom_sys.c
index cd175765e809..ef07953b6de7 100644
--- a/2.6.30/wacom_sys.c
+++ b/2.6.30/wacom_sys.c
@@ -262,7 +262,8 @@ 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_MSPROT) {
+                                                        features->type == 
WACOM_MSPROT ||
+                                                        features->type == 
DTH1152T) {
                                                /* need to reset back */
                                                features->pktlen = 
WACOM_PKGLEN_TPC2FG;
                                                if (features->type == MTTPC ||
@@ -271,6 +272,8 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        features->pktlen = 
WACOM_PKGLEN_MTTPC;
                                                else if (features->type == 
WACOM_MSPROT)
                                                        features->pktlen = 
WACOM_PKGLEN_MSPROT;
+                                               else if (features->type == 
DTH1152T)
+                                                       features->pktlen = 
WACOM_PKGLEN_27QHDT;
                                                features->device_type = 
BTN_TOOL_TRIPLETAP;
                                        }
                                        if (features->type == BAMBOO_PT) {
@@ -296,6 +299,13 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        
get_unaligned_le16(&report[i + 8]);
                                                features->unit = report[i - 1];
                                                features->unitExpo = report[i - 
3];
+                                       } else if (features->type == DTH1152T) {
+                                               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 {
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -341,6 +351,11 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->y_max =
                                                        
get_unaligned_le16(&report[i + 6]);
+                                       } else if (features->type == DTH1152T) {
+                                               features->y_max =
+                                                       
get_unaligned_le16(&report[i + 3]);
+                                               features->y_phy =
+                                                       
get_unaligned_le16(&report[i - 2]);
                                        } else {
                                                features->y_max =
                                                        features->x_max;
@@ -432,8 +447,9 @@ 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_MSPROT) {
+
+               } else if (features->type == WACOM_MSPROT ||
+                          features->type == DTH1152T) {
                        do {
                                rep_data[0] = 14;
                                rep_data[1] = 2;
diff --git a/2.6.30/wacom_wac.c b/2.6.30/wacom_wac.c
index f9a19dccafe9..f12f810f8e8d 100644
--- a/2.6.30/wacom_wac.c
+++ b/2.6.30/wacom_wac.c
@@ -464,6 +464,37 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
        }
 }
 
+static int wacom_dth1152_irq(struct wacom_wac *wacom)
+{
+       unsigned char *data = wacom->data;
+       struct input_dev *input = wacom->input;
+       unsigned short prox, pressure = 0;
+
+       if (data[0] != WACOM_REPORT_DTUS) {
+               dev_dbg(input->dev.parent,
+                       "%s: received unknown report #%d", __func__, data[0]);
+               return 0;
+       } else {
+               prox = data[1] & 0x80;
+               if (prox) {
+                       wacom->tool[0] = BTN_TOOL_PEN;
+                       wacom->id[0] = STYLUS_DEVICE_ID;
+               }
+               input_report_key(input, BTN_STYLUS, data[1] & 0x20);
+               input_report_abs(input, ABS_X, get_unaligned_le16(&data[4]));
+               input_report_abs(input, ABS_Y, get_unaligned_le16(&data[6]));
+               pressure = data[2] | (data[3] << 8);
+               input_report_abs(input, ABS_PRESSURE, pressure);
+               input_report_key(input, BTN_TOUCH, data[1] & 0x10);
+
+               if (!prox)
+                       wacom->id[0] = 0;
+               input_report_key(input, wacom->tool[0], prox);
+               input_report_abs(input, ABS_MISC, wacom->id[0]);
+               return 1;
+       }
+}
+
 static int wacom_graphire_irq(struct wacom_wac *wacom)
 {
        struct wacom_features *features = &wacom->features;
@@ -1108,6 +1139,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 
        switch (features->type) {
        case WACOM_MSPROT:
+       case DTH1152T:
                current_num_contacts = data[2];
                break;
        case INTUOSP2:
@@ -1146,6 +1178,14 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                        y = get_unaligned_le16(&data[offset + 4]);
                        break;
 
+               case DTH1152T:
+                       offset = WACOM_BYTES_PER_MSPROT_PACKET * i + 3;
+                       prox = data[offset] & 0x1;
+                       contact_id = get_unaligned_le16(&data[offset + 1]);
+                       x = get_unaligned_le16(&data[offset + 3]);
+                       y = get_unaligned_le16(&data[offset + 5]);
+                       break;
+
                default:
                        continue;
                }
@@ -1710,6 +1750,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
+       case DTH1152:
+               sync = wacom_dth1152_irq(wacom_wac);
+               break;
+
        case INTUOS:
        case INTUOS3S:
        case INTUOS3:
@@ -1732,6 +1776,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_mspro_irq(wacom_wac);
                break;
 
+       case DTH1152T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -2154,6 +2199,7 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case MTTPC:
        case MTTPC_B:
        case MTTPC_C:
+       case DTH1152T:
        case WACOM_MSPROT:
                if (features->device_type == BTN_TOOL_TRIPLETAP) {
                        for (i = 0; i < 10; i++)
@@ -2186,6 +2232,7 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case PL:
        case PTU:
        case DTU:
+       case DTH1152:
                if (features->type == DTUS) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
@@ -2517,6 +2564,12 @@ static const struct wacom_features wacom_features_0x357 =
        { "Wacom Co,.Ltd. Wacom Intuos Pro M", WACOM_PKGLEN_INTUOSP2, 44800, 
29600, 8191, 63, INTUOSP2, 9 };
 static const struct wacom_features wacom_features_0x358 =
        { "Wacom Co,.Ltd. Wacom Intuos Pro L", WACOM_PKGLEN_INTUOSP2, 62200, 
43200, 8191, 63, INTUOSP2, 9 };
+static const struct wacom_features wacom_features_0x35A =
+       { "Wacom Co.,Ltd. DTH-1152", WACOM_PKGLEN_DTH1152, 22320, 12555, 1024,
+         0, DTH1152, .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x368 };
+static const struct wacom_features wacom_features_0x368 =
+       { "Wacom Co.,Ltd. DTH-1152 Touch", WACOM_PKGLEN_27QHDT, .type = 
DTH1152T,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x35a }; /* Touch */
 
 #define USB_DEVICE_WACOM(prod)                                 \
        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
@@ -2680,6 +2733,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x354) },
        { USB_DEVICE_DETAILED(0x357, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_DETAILED(0x358, USB_CLASS_HID, 0, 0) },
+       { USB_DEVICE_WACOM(0x35A) },
+       { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_LENOVO(0x6004) },
        { }
 };
diff --git a/2.6.30/wacom_wac.h b/2.6.30/wacom_wac.h
index 732aabb6d36b..cfbf37ab89bf 100755
--- a/2.6.30/wacom_wac.h
+++ b/2.6.30/wacom_wac.h
@@ -32,6 +32,8 @@
 #define WACOM_PKGLEN_INTUOSP2  64
 #define WACOM_PKGLEN_INTUOSP2T 44
 #define WACOM_PKGLEN_MSPROT    50
+#define WACOM_PKGLEN_27QHDT    64
+#define WACOM_PKGLEN_DTH1152   16
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
@@ -80,6 +82,7 @@ enum {
        DTU,
        DTUS,
        DTUSX,
+       DTH1152,
        INTUOS,
        INTUOS3S,
        INTUOS3,
@@ -108,6 +111,7 @@ enum {
        INTUOSHT2,
        BAMBOO_PT,
        WACOM_MSPROT,
+       DTH1152T,
        INTUOSP2,
        TABLETPC,
        TABLETPC2FG,
diff --git a/2.6.36/wacom_sys.c b/2.6.36/wacom_sys.c
index b010dcdfda2e..8a52c6298f01 100644
--- a/2.6.36/wacom_sys.c
+++ b/2.6.36/wacom_sys.c
@@ -275,6 +275,8 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                features->pktlen = 
WACOM_PKGLEN_MTOUCH;
                                        else if (features->type == WACOM_MSPROT)
                                                features->pktlen = 
WACOM_PKGLEN_MSPROT;
+                                       else if (features->type == DTH1152T)
+                                               features->pktlen = 
WACOM_PKGLEN_27QHDT;
 
                                        if (features->type == BAMBOO_PT) {
                                                features->pktlen = 
WACOM_PKGLEN_BBTOUCH;
@@ -291,6 +293,13 @@ 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) {
+                                               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 {
                                                features->touch_max = 1;
                                                features->x_max =
@@ -327,6 +336,11 @@ 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) {
+                                               features->y_max =
+                                                       
get_unaligned_le16(&report[i + 3]);
+                                               features->y_phy =
+                                                       
get_unaligned_le16(&report[i - 2]);
                                        } else {
                                                features->y_max =
                                                        features->x_max;
@@ -451,7 +465,8 @@ static int wacom_retrieve_hid_descriptor(struct 
usb_interface *intf,
        /* only devices support touch need to retrieve the info */
        if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
            (features->type != BAMBOO_PT) && (features->type != MTSCREEN) &&
-           (features->type != WACOM_MSPROT) && (features->type != INTUOSP2))
+           (features->type != WACOM_MSPROT) && (features->type != INTUOSP2) &&
+           (features->type != DTH1152T))
                goto out;
 
        if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
diff --git a/2.6.36/wacom_wac.c b/2.6.36/wacom_wac.c
index 7a3009228219..a38dc75eee13 100644
--- a/2.6.36/wacom_wac.c
+++ b/2.6.36/wacom_wac.c
@@ -259,6 +259,37 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
        }
 }
 
+static int wacom_dth1152_irq(struct wacom_wac *wacom)
+{
+       unsigned char *data = wacom->data;
+       struct input_dev *input = wacom->input;
+       unsigned short prox, pressure = 0;
+
+       if (data[0] != WACOM_REPORT_DTUS) {
+               dev_dbg(input->dev.parent,
+                       "%s: received unknown report #%d", __func__, data[0]);
+               return 0;
+       } else {
+               prox = data[1] & 0x80;
+               if (prox) {
+                       wacom->tool[0] = BTN_TOOL_PEN;
+                       wacom->id[0] = STYLUS_DEVICE_ID;
+               }
+               input_report_key(input, BTN_STYLUS, data[1] & 0x20);
+               input_report_abs(input, ABS_X, get_unaligned_le16(&data[4]));
+               input_report_abs(input, ABS_Y, get_unaligned_le16(&data[6]));
+               pressure = data[2] | (data[3] << 8);
+               input_report_abs(input, ABS_PRESSURE, pressure);
+               input_report_key(input, BTN_TOUCH, data[1] & 0x10);
+
+               if (!prox)
+                       wacom->id[0] = 0;
+               input_report_key(input, wacom->tool[0], prox);
+               input_report_abs(input, ABS_MISC, wacom->id[0]);
+               return 1;
+       }
+}
+
 static int wacom_graphire_irq(struct wacom_wac *wacom)
 {
        struct wacom_features *features = &wacom->features;
@@ -1261,6 +1292,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
        int i, current_num_contacts, contacts_to_send;
 
        switch (features->type) {
+       case DTH1152T:
        case WACOM_MSPROT:
                current_num_contacts = data[2];
                break;
@@ -1302,6 +1334,14 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                        y = get_unaligned_le16(&data[offset + 4]);
                        break;
 
+               case DTH1152T:
+                       offset = WACOM_BYTES_PER_MSPROT_PACKET * i + 3;
+                       prox = data[offset] & 0x1;
+                       contact_id = get_unaligned_le16(&data[offset + 1]);
+                       x = get_unaligned_le16(&data[offset + 3]);
+                       y = get_unaligned_le16(&data[offset + 5]);
+                       break;
+
                default:
                        continue;
                }
@@ -1549,6 +1589,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
+       case DTH1152:
+               sync = wacom_dth1152_irq(wacom_wac);
+               break;
+
        case INTUOS:
        case INTUOS3S:
        case INTUOS3:
@@ -1576,6 +1620,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_mspro_irq(wacom_wac);
                break;
 
+       case DTH1152T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -1889,6 +1934,7 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                wacom_setup_intuos(wacom_wac);
                break;
 
+       case DTH1152T:
        case WACOM_MSPROT:
        case TABLETPC2FG:
        case MTSCREEN:
@@ -1917,6 +1963,7 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case PL:
        case PTU:
        case DTU:
+       case DTH1152:
                if (features->type == DTUS) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
@@ -2352,6 +2399,12 @@ static const struct wacom_features wacom_features_0x357 =
 static const struct wacom_features wacom_features_0x358 =
        { "Wacom Co,.Ltd. Wacom Intuos Pro L", WACOM_PKGLEN_INTUOSP2, 62200, 
43200, 8191,
          63, INTUOSP2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9 };
+static const struct wacom_features wacom_features_0x35A =
+       { "Wacom Co.,Ltd. DTH-1152", WACOM_PKGLEN_DTH1152, 22320, 12555, 1024,
+         0, DTH1152, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x368 =
+       { "Wacom Co.,Ltd. DTH-1152 Touch", WACOM_PKGLEN_27QHDT,
+         .type = DTH1152T }; /* 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 };
@@ -2491,6 +2544,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x354) },
        { USB_DEVICE_DETAILED(0x357, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_DETAILED(0x358, USB_CLASS_HID, 0, 0) },
+       { USB_DEVICE_WACOM(0x35A) },
+       { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_LENOVO(0x6004) },
        { }
 };
diff --git a/2.6.36/wacom_wac.h b/2.6.36/wacom_wac.h
index ada1628e146e..d4207692f359 100644
--- a/2.6.36/wacom_wac.h
+++ b/2.6.36/wacom_wac.h
@@ -30,6 +30,8 @@
 #define WACOM_PKGLEN_MSPROT    50
 #define WACOM_PKGLEN_INTUOSP2   64
 #define WACOM_PKGLEN_INTUOSP2T  44
+#define WACOM_PKGLEN_27QHDT     64
+#define WACOM_PKGLEN_DTH1152    16
 
 /* device IDs */
 #define STYLUS_DEVICE_ID       0x02
@@ -77,6 +79,7 @@ enum {
        DTU,
        DTUS,
        DTUSX,
+       DTH1152,
        BAMBOO_PT,
        INTUOS,
        INTUOS3S,
@@ -101,6 +104,7 @@ enum {
        WACOM_13HD,
        WACOM_MO,
        WACOM_MSPROT,
+       DTH1152T,
        INTUOSP2,
        TABLETPC,
        TABLETPCE,
diff --git a/2.6.38/wacom_sys.c b/2.6.38/wacom_sys.c
index d4aa9cc355ec..807ae1f3ce7a 100644
--- a/2.6.38/wacom_sys.c
+++ b/2.6.38/wacom_sys.c
@@ -399,6 +399,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                features->pktlen = 
WACOM_PKGLEN_MTOUCH;
                                                break;
 
+                                       case DTH1152T:
                                        case WACOM_27QHDT:
                                                features->pktlen = 
WACOM_PKGLEN_27QHDT;
                                                break;
@@ -430,6 +431,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        
get_unaligned_le16(&report[i + 8]);
                                                break;
 
+                                       case DTH1152T:
                                        case WACOM_24HDT:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -500,6 +502,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        
get_unaligned_le16(&report[i + 6]);
                                                break;
 
+                                       case DTH1152T:
                                        case WACOM_24HDT:
                                        case MTTPC_C:
                                                features->y_max =
@@ -657,7 +660,8 @@ static int wacom_query_tablet_data(struct usb_interface 
*intf, struct wacom_feat
                else if (features->type == WACOM_27QHDT) {
                        return wacom_set_device_mode(intf, 131, 3, 2);
                }
-               else if (features->type == WACOM_MSPROT) {
+               else if (features->type == WACOM_MSPROT ||
+                        features->type == DTH1152T) {
                        return wacom_set_device_mode(intf, 14, 2, 2);
                }
        } else if (features->device_type == BTN_TOOL_PEN) {
diff --git a/2.6.38/wacom_wac.c b/2.6.38/wacom_wac.c
index eec09bd34637..79c50fbcbf61 100644
--- a/2.6.38/wacom_wac.c
+++ b/2.6.38/wacom_wac.c
@@ -309,6 +309,37 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
        }
 }
 
+static int wacom_dth1152_irq(struct wacom_wac *wacom)
+{
+       unsigned char *data = wacom->data;
+       struct input_dev *input = wacom->input;
+       unsigned short prox, pressure = 0;
+
+       if (data[0] != WACOM_REPORT_DTUS) {
+               dev_dbg(input->dev.parent,
+                       "%s: received unknown report #%d", __func__, data[0]);
+               return 0;
+       } else {
+               prox = data[1] & 0x80;
+               if (prox) {
+                       wacom->tool[0] = BTN_TOOL_PEN;
+                       wacom->id[0] = STYLUS_DEVICE_ID;
+               }
+               input_report_key(input, BTN_STYLUS, data[1] & 0x20);
+               input_report_abs(input, ABS_X, get_unaligned_le16(&data[4]));
+               input_report_abs(input, ABS_Y, get_unaligned_le16(&data[6]));
+               pressure = data[2] | (data[3] << 8);
+               input_report_abs(input, ABS_PRESSURE, pressure);
+               input_report_key(input, BTN_TOUCH, data[1] & 0x10);
+
+               if (!prox)
+                       wacom->id[0] = 0;
+               input_report_key(input, wacom->tool[0], prox);
+               input_report_abs(input, ABS_MISC, wacom->id[0]);
+               return 1;
+       }
+}
+
 static int wacom_graphire_irq(struct wacom_wac *wacom)
 {
        struct wacom_features *features = &wacom->features;
@@ -1144,6 +1175,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 
        switch (features->type) {
        case WACOM_MSPROT:
+       case DTH1152T:
                current_num_contacts = data[2];
                break;
        case INTUOSP2:
@@ -1188,6 +1220,16 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                        h = data[offset + 7];
                        break;
 
+               case DTH1152T:
+                       offset = WACOM_BYTES_PER_MSPROT_PACKET * i + 3;
+                       prox = data[offset] & 0x1;
+                       contact_id = get_unaligned_le16(&data[offset + 1]);
+                       x = get_unaligned_le16(&data[offset + 3]);
+                       y = get_unaligned_le16(&data[offset + 5]);
+                       w = data[offset + 7] * 133;
+                       h = data[offset + 8] * 133;
+                       break;
+
                default:
                        continue;
                }
@@ -2009,6 +2051,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
+       case DTH1152:
+               sync = wacom_dth1152_irq(wacom_wac);
+               break;
+
        case INTUOS:
        case INTUOS3S:
        case INTUOS3:
@@ -2033,6 +2079,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_mspro_irq(wacom_wac);
                break;
 
+       case DTH1152T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -2483,6 +2530,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                }
                /* fall through */
 
+       case DTH1152T:
        case WACOM_MSPROT:
                if (features->device_type == BTN_TOOL_FINGER) {
                        input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 
features->x_max, 0, 0);
@@ -2529,6 +2577,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case DTUSX:
        case PL:
        case DTU:
+       case DTH1152:
                if (features->type == DTUS) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
@@ -3200,6 +3249,14 @@ static const struct wacom_features wacom_features_0x357 =
 static const struct wacom_features wacom_features_0x358 =
        { "Wacom Co,.Ltd. Wacom Intuos Pro L", WACOM_PKGLEN_INTUOSP2, 62200, 
43200, 8191,
          63, INTUOSP2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 
10 };
+static const struct wacom_features wacom_features_0x35A =
+       { "Wacom Co.,Ltd. DTH-1152", WACOM_PKGLEN_DTH1152, 22320, 12555, 1024,
+         0, DTH1152, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x368 };
+static const struct wacom_features wacom_features_0x368 =
+       { "Wacom Co.,Ltd. DTH-1152 Touch", WACOM_PKGLEN_27QHDT,
+         .type = DTH1152T, .touch_max = 10, .oVid = USB_VENDOR_ID_WACOM,
+         .oPid = 0x35A }; /* Touch */
 
 #define USB_DEVICE_WACOM(prod)                                 \
        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
@@ -3381,6 +3438,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x354) },
        { USB_DEVICE_DETAILED(0x357, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_DETAILED(0x358, USB_CLASS_HID, 0, 0) },
+       { USB_DEVICE_WACOM(0x35A) },
+       { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_LENOVO(0x6004) },
        { }
 };
diff --git a/2.6.38/wacom_wac.h b/2.6.38/wacom_wac.h
index 09157e6b9fc0..ea1b4f91c7f4 100644
--- a/2.6.38/wacom_wac.h
+++ b/2.6.38/wacom_wac.h
@@ -39,6 +39,7 @@
 #define WACOM_PKGLEN_MSPROT    50
 #define WACOM_PKGLEN_INTUOSP2  64
 #define WACOM_PKGLEN_INTUOSP2T 44
+#define WACOM_PKGLEN_DTH1152   16
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
@@ -100,6 +101,7 @@ enum {
        DTU,
        DTUS,
        DTUSX,
+       DTH1152,
        INTUOS,
        INTUOS3S,
        INTUOS3,
@@ -131,6 +133,7 @@ enum {
        WACOM_24HDT,
        WACOM_27QHDT,
        WACOM_MSPROT,
+       DTH1152T,
        INTUOSP2,
        WIRELESS,
        REMOTE,
diff --git a/3.7/wacom_sys.c b/3.7/wacom_sys.c
index a4613c84b3a2..79d30ab6abe6 100644
--- a/3.7/wacom_sys.c
+++ b/3.7/wacom_sys.c
@@ -400,6 +400,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                features->pktlen = 
WACOM_PKGLEN_MTOUCH;
                                                break;
 
+                                       case DTH1152T:
                                        case WACOM_27QHDT:
                                                features->pktlen = 
WACOM_PKGLEN_27QHDT;
                                                break;
@@ -431,6 +432,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        
get_unaligned_le16(&report[i + 8]);
                                                break;
 
+                                       case DTH1152T:
                                        case WACOM_24HDT:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -501,6 +503,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                        
get_unaligned_le16(&report[i + 6]);
                                                break;
 
+                                       case DTH1152T:
                                        case WACOM_24HDT:
                                        case MTTPC_C:
                                                features->y_max =
@@ -658,7 +661,8 @@ static int wacom_query_tablet_data(struct usb_interface 
*intf, struct wacom_feat
                else if (features->type == WACOM_27QHDT) {
                        return wacom_set_device_mode(intf, 131, 3, 2);
                }
-               else if (features->type == WACOM_MSPROT) {
+               else if (features->type == WACOM_MSPROT ||
+                        features->type == DTH1152T) {
                        return wacom_set_device_mode(intf, 14, 2, 2);
                }
        } else if (features->device_type == BTN_TOOL_PEN) {
diff --git a/3.7/wacom_wac.c b/3.7/wacom_wac.c
index 1d76a12bc57e..34b236944f3c 100644
--- a/3.7/wacom_wac.c
+++ b/3.7/wacom_wac.c
@@ -309,6 +309,37 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
        }
 }
 
+static int wacom_dth1152_irq(struct wacom_wac *wacom)
+{
+       unsigned char *data = wacom->data;
+       struct input_dev *input = wacom->input;
+       unsigned short prox, pressure = 0;
+
+       if (data[0] != WACOM_REPORT_DTUS) {
+               dev_dbg(input->dev.parent,
+                       "%s: received unknown report #%d", __func__, data[0]);
+               return 0;
+       } else {
+               prox = data[1] & 0x80;
+               if (prox) {
+                       wacom->tool[0] = BTN_TOOL_PEN;
+                       wacom->id[0] = STYLUS_DEVICE_ID;
+               }
+               input_report_key(input, BTN_STYLUS, data[1] & 0x20);
+               input_report_abs(input, ABS_X, get_unaligned_le16(&data[4]));
+               input_report_abs(input, ABS_Y, get_unaligned_le16(&data[6]));
+               pressure = data[2] | (data[3] << 8);
+               input_report_abs(input, ABS_PRESSURE, pressure);
+               input_report_key(input, BTN_TOUCH, data[1] & 0x10);
+
+               if (!prox)
+                       wacom->id[0] = 0;
+               input_report_key(input, wacom->tool[0], prox);
+               input_report_abs(input, ABS_MISC, wacom->id[0]);
+               return 1;
+       }
+}
+
 static int wacom_graphire_irq(struct wacom_wac *wacom)
 {
        struct wacom_features *features = &wacom->features;
@@ -1124,6 +1155,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 
        switch (features->type) {
        case WACOM_MSPROT:
+       case DTH1152T:
                current_num_contacts = data[2];
                break;
        case INTUOSP2:
@@ -1168,6 +1200,16 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                        h = data[offset + 7];
                        break;
 
+               case DTH1152T:
+                       offset = WACOM_BYTES_PER_MSPROT_PACKET * i + 3;
+                       prox = data[offset] & 0x1;
+                       contact_id = get_unaligned_le16(&data[offset + 1]);
+                       x = get_unaligned_le16(&data[offset + 3]);
+                       y = get_unaligned_le16(&data[offset + 5]);
+                       w = data[offset + 7] * 133;
+                       h = data[offset + 8] * 133;
+                       break;
+
                default:
                        continue;
                }
@@ -1989,6 +2031,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
+       case DTH1152:
+               sync = wacom_dth1152_irq(wacom_wac);
+               break;
+
        case INTUOS:
        case INTUOS3S:
        case INTUOS3:
@@ -2013,6 +2059,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
                sync = wacom_mspro_irq(wacom_wac);
                break;
 
+       case DTH1152T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -2447,6 +2494,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                }
                /* fall through */
 
+       case DTH1152T:
        case WACOM_MSPROT:
                if (features->device_type == BTN_TOOL_FINGER) {
                        input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 
features->x_max, 0, 0);
@@ -2482,6 +2530,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case DTUSX:
        case PL:
        case DTU:
+       case DTH1152:
                if (features->type == DTUS) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
@@ -3139,6 +3188,14 @@ static const struct wacom_features wacom_features_0x357 =
 static const struct wacom_features wacom_features_0x358 =
        { "Wacom Co,.Ltd. Wacom Intuos Pro L", WACOM_PKGLEN_INTUOSP2, 62200, 
43200, 8191,
          63, INTUOSP2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 
10 };
+static const struct wacom_features wacom_features_0x35A =
+       { "Wacom Co.,Ltd. DTH-1152", WACOM_PKGLEN_DTH1152, 22320, 12555, 1024,
+         0, DTH1152, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x368 };
+static const struct wacom_features wacom_features_0x368 =
+       { "Wacom Co.,Ltd. DTH-1152 Touch", WACOM_PKGLEN_27QHDT,
+         .type = DTH1152T, .touch_max = 10, .oVid = USB_VENDOR_ID_WACOM,
+         .oPid = 0x35A }; /* Touch */
 
 #define USB_DEVICE_WACOM(prod)                                 \
        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
@@ -3320,6 +3377,8 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x354) },
        { USB_DEVICE_DETAILED(0x357, USB_CLASS_HID, 0, 0) },
        { USB_DEVICE_DETAILED(0x358, USB_CLASS_HID, 0, 0) },
+       { USB_DEVICE_WACOM(0x35A) },
+       { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_LENOVO(0x6004) },
        { }
 };
diff --git a/3.7/wacom_wac.h b/3.7/wacom_wac.h
index 81cfe2db8f64..09e34da245f5 100644
--- a/3.7/wacom_wac.h
+++ b/3.7/wacom_wac.h
@@ -39,6 +39,7 @@
 #define WACOM_PKGLEN_MSPROT    50
 #define WACOM_PKGLEN_INTUOSP2  64
 #define WACOM_PKGLEN_INTUOSP2T 44
+#define WACOM_PKGLEN_DTH1152   16
 
 /* wacom data size per MT contact */
 #define WACOM_BYTES_PER_MT_PACKET      11
@@ -100,6 +101,7 @@ enum {
        DTU,
        DTUS,
        DTUSX,
+       DTH1152,
        INTUOS,
        INTUOS3S,
        INTUOS3,
@@ -131,6 +133,7 @@ enum {
        WACOM_24HDT,
        WACOM_27QHDT,
        WACOM_MSPROT,
+       DTH1152T,
        INTUOSP2,
        WIRELESS,
        REMOTE,
-- 
2.7.4


------------------------------------------------------------------------------
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