At least three separate PIDs have been used with the Lenovo Yoga 260.
The HID descriptors for each of these PIDs are identical, but slightly
different to the already-supported MTTPC and MTTPC_B types. Create a
new MTTPC_C type for parsing this descriptor, as well as the tablet
definitions.

https://sourceforge.net/p/linuxwacom/support-requests/52/

Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
---
 2.6.30/wacom_sys.c | 17 ++++++++++++++++-
 2.6.30/wacom_wac.c | 15 ++++++++++++++-
 2.6.30/wacom_wac.h |  1 +
 2.6.38/wacom_sys.c | 11 +++++++++++
 2.6.38/wacom_wac.c | 20 ++++++++++++++++++--
 2.6.38/wacom_wac.h |  1 +
 3.7/wacom_sys.c    | 11 +++++++++++
 3.7/wacom_wac.c    | 18 +++++++++++++++++-
 3.7/wacom_wac.h    |  1 +
 9 files changed, 90 insertions(+), 5 deletions(-)

diff --git a/2.6.30/wacom_sys.c b/2.6.30/wacom_sys.c
index 2e8d070..cd17576 100644
--- a/2.6.30/wacom_sys.c
+++ b/2.6.30/wacom_sys.c
@@ -261,10 +261,13 @@ static int wacom_parse_hid(struct usb_interface *intf, 
struct hid_descriptor *hi
                                        if (features->type == TABLETPC2FG ||
                                                         features->type == 
MTTPC ||
                                                         features->type == 
MTTPC_B ||
+                                                        features->type == 
MTTPC_C ||
                                                         features->type == 
WACOM_MSPROT) {
                                                /* need to reset back */
                                                features->pktlen = 
WACOM_PKGLEN_TPC2FG;
-                                               if (features->type == MTTPC || 
features->type == MTTPC_B)
+                                               if (features->type == MTTPC ||
+                                                   features->type == MTTPC_B ||
+                                                   features->type == MTTPC_C)
                                                        features->pktlen = 
WACOM_PKGLEN_MTTPC;
                                                else if (features->type == 
WACOM_MSPROT)
                                                        features->pktlen = 
WACOM_PKGLEN_MSPROT;
@@ -286,6 +289,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 == MTTPC_C) {
+                                               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]);
@@ -321,6 +331,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 == MTTPC_C) {
+                                               features->y_max =
+                                                       
get_unaligned_le16(&report[i + 3]);
+                                               features->y_phy =
+                                                       
get_unaligned_le16(&report[i - 2]);
                                        } else if (features->type == BAMBOO_PT) 
{
                                                features->y_phy =
                                                        
get_unaligned_le16(&report[i + 3]);
diff --git a/2.6.30/wacom_wac.c b/2.6.30/wacom_wac.c
index 6eb5fef..f9a19dc 100644
--- a/2.6.30/wacom_wac.c
+++ b/2.6.30/wacom_wac.c
@@ -1307,7 +1307,9 @@ static void wacom_tpc_mt(struct wacom_wac *wacom)
        wacom->tool[2] = BTN_TOOL_TRIPLETAP;
 
        /* MTTPC does not support Height and Width */
-       if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
+       if (wacom->features.type == MTTPC ||
+           wacom->features.type == MTTPC_B ||
+           wacom->features.type == MTTPC_C)
                x_offset = -4;
 
        /*
@@ -1758,6 +1760,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
        case TABLETPC2FG:
        case MTTPC:
        case MTTPC_B:
+       case MTTPC_C:
                sync = wacom_tpc_irq(wacom_wac, len);
                break;
 
@@ -2150,6 +2153,7 @@ void wacom_setup_input_capabilities(struct input_dev 
*input_dev,
 
        case MTTPC:
        case MTTPC_B:
+       case MTTPC_C:
        case WACOM_MSPROT:
                if (features->device_type == BTN_TOOL_TRIPLETAP) {
                        for (i = 0; i < 10; i++)
@@ -2471,6 +2475,12 @@ static const struct wacom_features wacom_features_0x5010 
=
        { "Wacom ISDv4 5010",       WACOM_PKGLEN_MTTPC,   13756, 7736,  1023,  
0, MTTPC_B };
 static const struct wacom_features wacom_features_0x5013 =
        { "Wacom ISDv4 5013",      WACOM_PKGLEN_MTTPC,    11752, 6612,  1023,  
0, MTTPC_B };
+static const struct wacom_features wacom_features_0x5044 =
+       { "Wacom ISDv4 5044",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047, 
0, MTTPC_C };
+static const struct wacom_features wacom_features_0x5048 =
+       { "Wacom ISDv4 5048",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047, 
0, MTTPC_C };
+static const struct wacom_features wacom_features_0x5090 =
+       { "Wacom ISDv4 5090",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047, 
0, MTTPC_C };
 static const struct wacom_features wacom_features_0x47 =
        { "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023, 
31, INTUOS };
 static const struct wacom_features wacom_features_0x6004 =
@@ -2632,6 +2642,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x5002) },
        { USB_DEVICE_WACOM(0x5010) },
        { USB_DEVICE_WACOM(0x5013) },
+       { USB_DEVICE_WACOM(0x5044) },
+       { USB_DEVICE_WACOM(0x5048) },
+       { USB_DEVICE_WACOM(0x5090) },
        { USB_DEVICE_WACOM(0x300) },
        { USB_DEVICE_WACOM(0x301) },
        { USB_DEVICE_DETAILED(0x302, USB_CLASS_HID, 0, 0) },
diff --git a/2.6.30/wacom_wac.h b/2.6.30/wacom_wac.h
index 69bc0da..732aabb 100755
--- a/2.6.30/wacom_wac.h
+++ b/2.6.30/wacom_wac.h
@@ -113,6 +113,7 @@ enum {
        TABLETPC2FG,
        MTTPC,
        MTTPC_B,
+       MTTPC_C,
        MAX_TYPE
 };
 
diff --git a/2.6.38/wacom_sys.c b/2.6.38/wacom_sys.c
index d8ea686..d4aa9cc 100644
--- a/2.6.38/wacom_sys.c
+++ b/2.6.38/wacom_sys.c
@@ -405,6 +405,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
 
                                        case MTTPC:
                                        case MTTPC_B:
+                                       case MTTPC_C:
                                                features->pktlen = 
WACOM_PKGLEN_MTTPC;
                                                break;
 
@@ -459,6 +460,15 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                features->unitExpo = report[i - 
3];
                                                break;
 
+                                       case MTTPC_C:
+                                               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];
+                                               break;
+
                                        default:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -491,6 +501,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                break;
 
                                        case WACOM_24HDT:
+                                       case MTTPC_C:
                                                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 991459e..eec09bd 100644
--- a/2.6.38/wacom_wac.c
+++ b/2.6.38/wacom_wac.c
@@ -1286,7 +1286,9 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        int x_offset = 0;
 
        /* MTTPC does not support Height and Width */
-       if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
+       if (wacom->features.type == MTTPC ||
+           wacom->features.type == MTTPC_B ||
+           wacom->features.type == MTTPC_C)
                x_offset = -4;
 
        /*
@@ -2068,6 +2070,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
        case MTSCREEN:
        case MTTPC:
        case MTTPC_B:
+       case MTTPC_C:
                sync = wacom_tpc_irq(wacom_wac, len);
                break;
 
@@ -2494,6 +2497,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case MTSCREEN:
        case MTTPC:
        case MTTPC_B:
+       case MTTPC_C:
                err = wacom_create_slots(wacom_wac);
                if (err)
                        return err;
@@ -3015,7 +3019,16 @@ static const struct wacom_features wacom_features_0x5010 
=
          0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x5013 =
        { "Wacom ISDv4 5013",      WACOM_PKGLEN_MTTPC,     11752, 6612,  1023,
-        0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+         0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x5044 =
+       { "Wacom ISDv4 5044",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047,
+         0, MTTPC_C, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x5048 =
+       { "Wacom ISDv4 5048",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047,
+         0, MTTPC_C, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x5090 =
+       { "Wacom ISDv4 5090",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047,
+         0, MTTPC_C, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x47 =
        { "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023,
          31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -3329,6 +3342,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x5002) },
        { USB_DEVICE_WACOM(0x5010) },
        { USB_DEVICE_WACOM(0x5013) },
+       { USB_DEVICE_WACOM(0x5044) },
+       { USB_DEVICE_WACOM(0x5048) },
+       { USB_DEVICE_WACOM(0x5090) },
        { USB_DEVICE_WACOM(0x47) },
        { USB_DEVICE_WACOM(0xF4) },
        { USB_DEVICE_WACOM(0xF8) },
diff --git a/2.6.38/wacom_wac.h b/2.6.38/wacom_wac.h
index 44001f1..09157e6 100644
--- a/2.6.38/wacom_wac.h
+++ b/2.6.38/wacom_wac.h
@@ -140,6 +140,7 @@ enum {
        MTSCREEN,
        MTTPC,
        MTTPC_B,
+       MTTPC_C,
        MAX_TYPE
 };
 
diff --git a/3.7/wacom_sys.c b/3.7/wacom_sys.c
index dec456c..a4613c8 100644
--- a/3.7/wacom_sys.c
+++ b/3.7/wacom_sys.c
@@ -406,6 +406,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
 
                                        case MTTPC:
                                        case MTTPC_B:
+                                       case MTTPC_C:
                                                features->pktlen = 
WACOM_PKGLEN_MTTPC;
                                                break;
 
@@ -460,6 +461,15 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                features->unitExpo = report[i - 
3];
                                                break;
 
+                                       case MTTPC_C:
+                                               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];
+                                               break;
+
                                        default:
                                                features->x_max =
                                                        
get_unaligned_le16(&report[i + 3]);
@@ -492,6 +502,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
                                                break;
 
                                        case WACOM_24HDT:
+                                       case MTTPC_C:
                                                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 1fdb1f3..1d76a12 100644
--- a/3.7/wacom_wac.c
+++ b/3.7/wacom_wac.c
@@ -1263,7 +1263,9 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        int x_offset = 0;
 
        /* MTTPC does not support Height and Width */
-       if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
+       if (wacom->features.type == MTTPC ||
+           wacom->features.type == MTTPC_B ||
+           wacom->features.type == MTTPC_C)
                x_offset = -4;
 
        /*
@@ -2048,6 +2050,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t 
len)
        case MTSCREEN:
        case MTTPC:
        case MTTPC_B:
+       case MTTPC_C:
                sync = wacom_tpc_irq(wacom_wac, len);
                break;
 
@@ -2458,6 +2461,7 @@ int wacom_setup_input_capabilities(struct input_dev 
*input_dev,
        case MTSCREEN:
        case MTTPC:
        case MTTPC_B:
+       case MTTPC_C:
        case TABLETPC2FG:
                if ((features->device_type == BTN_TOOL_FINGER) && 
features->touch_max > 1)
                        input_mt_init_slots(input_dev, features->touch_max, 
INPUT_MT_DIRECT);
@@ -2955,6 +2959,15 @@ static const struct wacom_features wacom_features_0x5010 
=
 static const struct wacom_features wacom_features_0x5013 =
        { "Wacom ISDv4 5013",      WACOM_PKGLEN_MTTPC,     11752, 6612,  1023,
          0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x5044 =
+       { "Wacom ISDv4 5044",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047,
+         0, MTTPC_C, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x5048 =
+       { "Wacom ISDv4 5048",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047,
+         0, MTTPC_C, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+static const struct wacom_features wacom_features_0x5090 =
+       { "Wacom ISDv4 5090",      WACOM_PKGLEN_MTTPC,     27648, 15552, 2047,
+         0, MTTPC_C, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
 static const struct wacom_features wacom_features_0x47 =
        { "Wacom Intuos2 6x8",    WACOM_PKGLEN_INTUOS,    20320, 16240, 1023,
          31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@@ -3268,6 +3281,9 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x5002) },
        { USB_DEVICE_WACOM(0x5010) },
        { USB_DEVICE_WACOM(0x5013) },
+       { USB_DEVICE_WACOM(0x5044) },
+       { USB_DEVICE_WACOM(0x5048) },
+       { USB_DEVICE_WACOM(0x5090) },
        { USB_DEVICE_WACOM(0x47) },
        { USB_DEVICE_WACOM(0xF4) },
        { USB_DEVICE_WACOM(0xF8) },
diff --git a/3.7/wacom_wac.h b/3.7/wacom_wac.h
index 06bd4ba..81cfe2d 100644
--- a/3.7/wacom_wac.h
+++ b/3.7/wacom_wac.h
@@ -140,6 +140,7 @@ enum {
        MTSCREEN,
        MTTPC,
        MTTPC_B,
+       MTTPC_C,
        MAX_TYPE
 };
 
-- 
2.13.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