Signed-off-by: Ping Cheng <ping.ch...@wacom.com>
---
 2.6.30/wacom_sys.c |  8 ++++++--
 2.6.30/wacom_wac.c | 45 +++++++++++++++++++++++++++++++++++++++------
 2.6.30/wacom_wac.h |  3 +++
 2.6.38/wacom_sys.c |  3 +++
 2.6.38/wacom_wac.c | 45 +++++++++++++++++++++++++++++++++++++++------
 2.6.38/wacom_wac.h |  3 +++
 3.7/wacom_sys.c    |  3 +++
 3.7/wacom_wac.c    | 45 +++++++++++++++++++++++++++++++++++++++------
 3.7/wacom_wac.h    |  3 +++
 9 files changed, 138 insertions(+), 20 deletions(-)

diff --git a/2.6.30/wacom_sys.c b/2.6.30/wacom_sys.c
index ba17b1b..bdb1eb8 100644
--- a/2.6.30/wacom_sys.c
+++ b/2.6.30/wacom_sys.c
@@ -266,7 +266,8 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                         features->type == 
WACOM_24HDT ||
                                                         features->type == 
WACOM_MSPROT ||
                                                         features->type == 
DTH1152T ||
-                                                        features->type == 
WACOM_27QHDT) {
+                                                        features->type == 
WACOM_27QHDT ||
+                                                        features->type == 
DTH2452T) {
                                                /* need to reset back */
                                                features->pktlen = 
WACOM_PKGLEN_TPC2FG;
                                                if (features->type == MTTPC ||
@@ -275,7 +276,8 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                                        features->pktlen = 
WACOM_PKGLEN_MTTPC;
                                                else if (features->type == 
WACOM_24HDT)
                                                        features->pktlen = 
WACOM_PKGLEN_MTOUCH;
-                                               else if (features->type == 
WACOM_MSPROT)
+                                               else if (features->type == 
WACOM_MSPROT ||
+                                                        features->type == 
DTH2452T)
                                                        features->pktlen = 
WACOM_PKGLEN_MSPROT;
                                                else if (features->type == 
DTH1152T ||
                                                         features->type == 
WACOM_27QHDT)
@@ -317,6 +319,7 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
 
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
+                                       case DTH2452T:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->x_phy =
@@ -394,6 +397,7 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
 
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
+                                       case DTH2452T:
                                                features->y_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->y_phy =
diff --git a/2.6.30/wacom_wac.c b/2.6.30/wacom_wac.c
index 90c5c2b..4d4f924 100644
--- a/2.6.30/wacom_wac.c
+++ b/2.6.30/wacom_wac.c
@@ -227,13 +227,16 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
 {
        unsigned char *data = wacom->data;
        struct input_dev *input = wacom->input;
+       struct wacom_features *features = &wacom->features;
        unsigned short prox, pressure = 0;
 
-       if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
+       if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD
+                       && data[0] != WACOM_REPORT_DTK2451PAD) {
                dev_dbg(input->dev.parent,
                        "%s: received unknown report #%d", __func__, data[0]);
                return 0;
-       } else if (data[0] == WACOM_REPORT_DTUSPAD) {
+       } else if (data[0] == WACOM_REPORT_DTUSPAD
+                       || data[0] == WACOM_REPORT_DTK2451PAD) {
                input_report_key(input, BTN_0, (data[1] & 0x01));
                input_report_key(input, BTN_1, (data[1] & 0x02));
                input_report_key(input, BTN_2, (data[1] & 0x04));
@@ -264,9 +267,15 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
 
                input_report_key(input, BTN_STYLUS, data[1] & 0x20);
                input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
-               input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
-               input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
-               pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
+               if (features->type  == DTK2451) {
+                       pressure = get_unaligned_le16(&data[2]);
+                       input_report_abs(input, ABS_X, 
get_unaligned_le16(&data[4]));
+                       input_report_abs(input, ABS_Y, 
get_unaligned_le16(&data[6]));
+               } else {
+                       pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
+                       input_report_abs(input, ABS_X, 
get_unaligned_be16(&data[3]));
+                       input_report_abs(input, ABS_Y, 
get_unaligned_be16(&data[5]));
+               }
                input_report_abs(input, ABS_PRESSURE, pressure);
                input_report_key(input, BTN_TOUCH, pressure > 10);
 
@@ -988,6 +997,7 @@ static int wacom_multitouch_generic(struct wacom_wac *wacom)
                break;
        case WACOM_MSPROT:
        case DTH1152T:
+       case DTH2452T:
                current_num_contacts = data[2];
                contacts_per_packet = 5;
                bytes_per_packet = WACOM_BYTES_PER_MSPROT_PACKET;
@@ -1032,6 +1042,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 
                case WACOM_MSPROT:
                case DTH1152T:
+               case DTH2452T:
                        prox = data[offset] & 0x1;
                        contact_id = get_unaligned_le16(&data[offset + 1]);
                        x = get_unaligned_le16(&data[offset + 3]);
@@ -1853,6 +1864,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
 
        case DTUS:
        case DTUSX:
+       case DTK2451:
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
@@ -1890,6 +1902,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
        case WACOM_24HDT:
        case WACOM_27QHDT:
        case DTH1152T:
+       case DTH2452T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -2279,6 +2292,7 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case MTTPC_B:
        case MTTPC_C:
        case DTH1152T:
+       case DTH2452T:
        case WACOM_27QHDT:
                if (features->device_type == BTN_TOOL_TRIPLETAP) {
                        for (i = 0; i < 10; i++)
@@ -2315,11 +2329,12 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
 
        case DTUS:
        case DTUSX:
+       case DTK2451:
        case PL:
        case DTU:
                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
                __set_bit(BTN_STYLUS2, input_dev->keybit);
-               if (features->type == DTUS) {
+               if (features->type == DTUS || features->type == DTK2451) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
                /* fall through */
@@ -2907,6 +2922,21 @@ static const struct wacom_features wacom_features_0x368 =
 static const struct wacom_features wacom_features_0x37C =
        { "Wacom Cintiq Pro 24", WACOM_PKGLEN_MSPRO, 105286, 59574, 8191, 63, 
/* Pen-only */
          WACOM_MSPRO, 0, WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, 
WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x37D =
+       { "Wacom DTH-2452", WACOM_PKGLEN_DTH1152, 53104, 30046, 2047, 0,
+         DTK2451, 4,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x37E };
+static const struct wacom_features wacom_features_0x37E =
+       { "Wacom DTH-2452 Touch", WACOM_PKGLEN_MSPROT,
+         .type = DTH2452T, .touch_max = 10, .oVid = USB_VENDOR_ID_WACOM,
+         .oPid = 0x37D }; /* Touch */
+static const struct wacom_features wacom_features_0x382 =
+       { "Wacom DTK-2451", WACOM_PKGLEN_DTH1152, 53104, 30046, 2047, 0,
+         DTK2451, 4,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
 
 #define USB_DEVICE_WACOM(prod)                                 \
        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
@@ -3073,6 +3103,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x35A) },
        { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_WACOM(0x37C) },
+       { USB_DEVICE_WACOM(0x37D) },
+       { USB_DEVICE_WACOM(0x37E) },
+       { USB_DEVICE_WACOM(0x382) },
        { USB_DEVICE_WACOM(0x4001) },
        { USB_DEVICE_WACOM(0x4004) },
        { USB_DEVICE_WACOM(0x5000) },
diff --git a/2.6.30/wacom_wac.h b/2.6.30/wacom_wac.h
index 10ec2e6..0b128e3 100755
--- a/2.6.30/wacom_wac.h
+++ b/2.6.30/wacom_wac.h
@@ -69,6 +69,7 @@
 #define WACOM_REPORT_DTUS              17
 #define WACOM_REPORT_MSPROPAD          17
 #define WACOM_REPORT_MSPRODEVICE       19
+#define WACOM_REPORT_DTK2451PAD                21
 #define WACOM_REPORT_USB               192
 #define WACOM_REPORT_VENDOR_DEF_TOUCH  33
 #define WAC_CMD_LED_CONTROL_GENERIC    50
@@ -93,6 +94,7 @@ enum {
        DTUS,
        DTUSX,
        DTH1152,
+       DTK2451,
        INTUOS,
        INTUOS3S,
        INTUOS3,
@@ -127,6 +129,7 @@ enum {
        INTUOSP2,
        TABLETPC,
        TABLETPC2FG,
+       DTH2452T,
        MTTPC,
        MTTPC_B,
        MTTPC_C,
diff --git a/2.6.38/wacom_sys.c b/2.6.38/wacom_sys.c
index cbf36b5..c181907 100644
--- a/2.6.38/wacom_sys.c
+++ b/2.6.38/wacom_sys.c
@@ -416,6 +416,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                break;
 
                                        case WACOM_MSPROT:
+                                       case DTH2452T:
                                                features->pktlen = 
WACOM_PKGLEN_MSPROT;
                                                break;
 
@@ -455,6 +456,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
 
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
+                                       case DTH2452T:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->x_phy =
@@ -530,6 +532,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
 
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
+                                       case DTH2452T:
                                                features->y_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->y_phy =
diff --git a/2.6.38/wacom_wac.c b/2.6.38/wacom_wac.c
index 066c948..fa22356 100644
--- a/2.6.38/wacom_wac.c
+++ b/2.6.38/wacom_wac.c
@@ -271,13 +271,16 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
 {
        unsigned char *data = wacom->data;
        struct input_dev *input = wacom->input;
+       struct wacom_features *features = &wacom->features;
        unsigned short prox, pressure = 0;
 
-       if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
+       if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD
+                       && data[0] != WACOM_REPORT_DTK2451PAD) {
                dev_dbg(input->dev.parent,
                        "%s: received unknown report #%d", __func__, data[0]);
                return 0;
-       } else if (data[0] == WACOM_REPORT_DTUSPAD) {
+       } else if (data[0] == WACOM_REPORT_DTUSPAD
+                       || data[0] == WACOM_REPORT_DTK2451PAD) {
                input_report_key(input, BTN_0, (data[1] & 0x01));
                input_report_key(input, BTN_1, (data[1] & 0x02));
                input_report_key(input, BTN_2, (data[1] & 0x04));
@@ -308,9 +311,15 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
 
                input_report_key(input, BTN_STYLUS, data[1] & 0x20);
                input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
-               input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
-               input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
-               pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
+               if (features->type  == DTK2451) {
+                       pressure = get_unaligned_le16(&data[2]);
+                       input_report_abs(input, ABS_X, 
get_unaligned_le16(&data[4]));
+                       input_report_abs(input, ABS_Y, 
get_unaligned_le16(&data[6]));
+               } else {
+                       pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
+                       input_report_abs(input, ABS_X, 
get_unaligned_be16(&data[3]));
+                       input_report_abs(input, ABS_Y, 
get_unaligned_be16(&data[5]));
+               }
                input_report_abs(input, ABS_PRESSURE, pressure);
                input_report_key(input, BTN_TOUCH, pressure > 10);
 
@@ -1218,6 +1227,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                break;
        case WACOM_MSPROT:
        case DTH1152T:
+       case DTH2452T:
                current_num_contacts = data[2];
                contacts_per_packet = 5;
                bytes_per_packet = WACOM_BYTES_PER_MSPROT_PACKET;
@@ -1270,6 +1280,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 
                case WACOM_MSPROT:
                case DTH1152T:
+               case DTH2452T:
                        prox = data[offset] & 0x1;
                        contact_id = get_unaligned_le16(&data[offset + 1]);
                        x = get_unaligned_le16(&data[offset + 3]);
@@ -2060,6 +2071,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
 
        case DTUS:
        case DTUSX:
+       case DTK2451:
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
@@ -2099,6 +2111,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
        case WACOM_24HDT:
        case WACOM_27QHDT:
        case DTH1152T:
+       case DTH2452T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -2570,6 +2583,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                /* fall through */
 
        case DTH1152T:
+       case DTH2452T:
        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);
@@ -2622,11 +2636,12 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
 
        case DTUS:
        case DTUSX:
+       case DTK2451:
        case PL:
        case DTU:
                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
                __set_bit(BTN_STYLUS2, input_dev->keybit);
-               if (features->type == DTUS) {
+               if (features->type == DTUS || features->type == DTK2451) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
                /* fall through */
@@ -3308,6 +3323,21 @@ static const struct wacom_features wacom_features_0x37C =
          WACOM_MSPRO, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x37D =
+       { "Wacom DTH-2452", WACOM_PKGLEN_DTH1152, 53104, 30046, 2047,
+         0, DTK2451, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x37E };
+static const struct wacom_features wacom_features_0x37E =
+       { "Wacom DTH-2452 Touch", WACOM_PKGLEN_MSPROT,
+         .type = DTH2452T, .touch_max = 10, .oVid = USB_VENDOR_ID_WACOM,
+         .oPid = 0x37D }; /* Touch */
+static const struct wacom_features wacom_features_0x382 =
+       { "Wacom DTK-2451", WACOM_PKGLEN_DTH1152, 53104, 30046, 2047,
+         0, DTK2451, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
 
 #define USB_DEVICE_WACOM(prod)                                 \
        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
@@ -3487,6 +3517,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x35A) },
        { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_WACOM(0x37C) },
+       { USB_DEVICE_WACOM(0x37D) },
+       { USB_DEVICE_WACOM(0x37E) },
+       { USB_DEVICE_WACOM(0x382) },
        { USB_DEVICE_WACOM(0x4001) },
        { USB_DEVICE_WACOM(0x4004) },
        { USB_DEVICE_WACOM(0x5000) },
diff --git a/2.6.38/wacom_wac.h b/2.6.38/wacom_wac.h
index 0b7f1d5..cb9d37b 100644
--- a/2.6.38/wacom_wac.h
+++ b/2.6.38/wacom_wac.h
@@ -76,6 +76,7 @@
 #define WACOM_REPORT_MSPROPAD          17
 #define WACOM_REPORT_TPC1FGE           18
 #define WACOM_REPORT_MSPRODEVICE       19
+#define WACOM_REPORT_DTK2451PAD                21
 #define WACOM_REPORT_24HDT             1
 #define WACOM_REPORT_WL                        128
 #define WACOM_REPORT_USB               192
@@ -106,6 +107,7 @@ enum {
        DTUS,
        DTUSX,
        DTH1152,
+       DTK2451,
        INTUOS,
        INTUOS3S,
        INTUOS3,
@@ -144,6 +146,7 @@ enum {
        TABLETPC,   /* add new TPC below */
        TABLETPCE,
        TABLETPC2FG,
+       DTH2452T,
        MTSCREEN,
        MTTPC,
        MTTPC_B,
diff --git a/3.7/wacom_sys.c b/3.7/wacom_sys.c
index e07d131..ef880dc 100644
--- a/3.7/wacom_sys.c
+++ b/3.7/wacom_sys.c
@@ -416,6 +416,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                break;
 
                                        case WACOM_MSPROT:
+                                       case DTH2452T:
                                                features->pktlen = 
WACOM_PKGLEN_MSPROT;
                                                break;
 
@@ -455,6 +456,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
 
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
+                                       case DTH2452T:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->x_phy =
@@ -530,6 +532,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
 
                                        case WACOM_MSPROT:
                                        case MTTPC_B:
+                                       case DTH2452T:
                                                features->y_max =
                                                        
get_unaligned_le16(&report[i + 3]);
                                                features->y_phy =
diff --git a/3.7/wacom_wac.c b/3.7/wacom_wac.c
index 0a2e535..1f225db 100644
--- a/3.7/wacom_wac.c
+++ b/3.7/wacom_wac.c
@@ -271,13 +271,16 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
 {
        char *data = wacom->data;
        struct input_dev *input = wacom->input;
+       struct wacom_features *features = &wacom->features;
        unsigned short prox, pressure = 0;
 
-       if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
+       if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD
+                       && data[0] != WACOM_REPORT_DTK2451PAD) {
                dev_dbg(input->dev.parent,
                        "%s: received unknown report #%d", __func__, data[0]);
                return 0;
-       } else if (data[0] == WACOM_REPORT_DTUSPAD) {
+       } else if (data[0] == WACOM_REPORT_DTUSPAD
+                       || data[0] == WACOM_REPORT_DTK2451PAD) {
                input_report_key(input, BTN_0, (data[1] & 0x01));
                input_report_key(input, BTN_1, (data[1] & 0x02));
                input_report_key(input, BTN_2, (data[1] & 0x04));
@@ -308,9 +311,15 @@ static int wacom_dtus_irq(struct wacom_wac *wacom)
 
                input_report_key(input, BTN_STYLUS, data[1] & 0x20);
                input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
-               input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
-               input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
-               pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
+               if (features->type  == DTK2451) {
+                       pressure = get_unaligned_le16(&data[2]);
+                       input_report_abs(input, ABS_X, 
get_unaligned_le16(&data[4]));
+                       input_report_abs(input, ABS_Y, 
get_unaligned_le16(&data[6]));
+               } else {
+                       pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
+                       input_report_abs(input, ABS_X, 
get_unaligned_be16(&data[3]));
+                       input_report_abs(input, ABS_Y, 
get_unaligned_be16(&data[5]));
+               }
                input_report_abs(input, ABS_PRESSURE, pressure);
                input_report_key(input, BTN_TOUCH, pressure > 10);
 
@@ -1198,6 +1207,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
                break;
        case WACOM_MSPROT:
        case DTH1152T:
+       case DTH2452T:
                current_num_contacts = data[2];
                contacts_per_packet = 5;
                bytes_per_packet = WACOM_BYTES_PER_MSPROT_PACKET;
@@ -1250,6 +1260,7 @@ static int wacom_multitouch_generic(struct wacom_wac 
*wacom)
 
                case WACOM_MSPROT:
                case DTH1152T:
+               case DTH2452T:
                        prox = data[offset] & 0x1;
                        contact_id = get_unaligned_le16(&data[offset + 1]);
                        x = get_unaligned_le16(&data[offset + 3]);
@@ -2042,6 +2053,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
 
        case DTUS:
        case DTUSX:
+       case DTK2451:
                sync = wacom_dtus_irq(wacom_wac);
                break;
 
@@ -2081,6 +2093,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
        case WACOM_24HDT:
        case WACOM_27QHDT:
        case DTH1152T:
+       case DTH2452T:
        case WACOM_MSPROT:
                sync = wacom_multitouch_generic(wacom_wac);
                break;
@@ -2526,6 +2539,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
                /* fall through */
 
        case DTH1152T:
+       case DTH2452T:
        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);
@@ -2567,11 +2581,12 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
 
        case DTUS:
        case DTUSX:
+       case DTK2451:
        case PL:
        case DTU:
                __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
                __set_bit(BTN_STYLUS2, input_dev->keybit);
-               if (features->type == DTUS) {
+               if (features->type == DTUS || features->type == DTK2451) {
                        input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
                }
                /* fall through */
@@ -3238,6 +3253,21 @@ static const struct wacom_features wacom_features_0x37C =
          WACOM_MSPRO, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
          WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
+static const struct wacom_features wacom_features_0x37D =
+       { "Wacom DTH-2452", WACOM_PKGLEN_DTH1152, 53104, 30046, 2047,
+         0, DTK2451, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x37E };
+static const struct wacom_features wacom_features_0x37E =
+       { "Wacom DTH-2452 Touch", WACOM_PKGLEN_MSPROT,
+         .type = DTH2452T, .touch_max = 10, .oVid = USB_VENDOR_ID_WACOM,
+         .oPid = 0x37D }; /* Touch */
+static const struct wacom_features wacom_features_0x382 =
+       { "Wacom DTK-2451", WACOM_PKGLEN_DTH1152, 53104, 30046, 2047,
+         0, DTK2451, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET,
+         WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
 
 #define USB_DEVICE_WACOM(prod)                                 \
        USB_DEVICE(USB_VENDOR_ID_WACOM, prod),                  \
@@ -3417,6 +3447,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x35A) },
        { USB_DEVICE_WACOM(0x368) },
        { USB_DEVICE_WACOM(0x37C) },
+       { USB_DEVICE_WACOM(0x37D) },
+       { USB_DEVICE_WACOM(0x37E) },
+       { USB_DEVICE_WACOM(0x382) },
        { USB_DEVICE_WACOM(0x4001) },
        { USB_DEVICE_WACOM(0x4004) },
        { USB_DEVICE_WACOM(0x5000) },
diff --git a/3.7/wacom_wac.h b/3.7/wacom_wac.h
index ce9b5dd..3bfdf04 100644
--- a/3.7/wacom_wac.h
+++ b/3.7/wacom_wac.h
@@ -76,6 +76,7 @@
 #define WACOM_REPORT_MSPROPAD          17
 #define WACOM_REPORT_TPC1FGE           18
 #define WACOM_REPORT_MSPRODEVICE       19
+#define WACOM_REPORT_DTK2451PAD                21
 #define WACOM_REPORT_24HDT             1
 #define WACOM_REPORT_WL                        128
 #define WACOM_REPORT_USB               192
@@ -106,6 +107,7 @@ enum {
        DTUS,
        DTUSX,
        DTH1152,
+       DTK2451,
        INTUOS,
        INTUOS3S,
        INTUOS3,
@@ -144,6 +146,7 @@ enum {
        TABLETPC,   /* add new TPC below */
        TABLETPCE,
        TABLETPC2FG,
+       DTH2452T,
        MTSCREEN,
        MTTPC,
        MTTPC_B,
-- 
2.14.3


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