Sophie

Sophie

distrib > CentOS > 5 > x86_64 > by-pkgid > ea32411352494358b8d75a78402a4713 > files > 4943

kernel-2.6.18-238.19.1.el5.centos.plus.src.rpm

From: Aristeu Rozanski <aris@redhat.com>
Date: Fri, 12 Nov 2010 18:01:28 -0500
Subject: [usb] wacom: add support for Cintiq 21UX2
Message-id: <20101112180128.GE3764@redhat.com>
Patchwork-id: 29220
O-Subject: [RHEL5 PATCH] wacom: add support for Cintiq 21UX2
Bugzilla: 652731
RH-Acked-by: Don Zickus <dzickus@redhat.com>

BZ#652731

This patch adds support for Cintiq 21UX2 tablet.
Also, to help future updates, I added comments on each entry of
wacom_ids[] array to identify each tablet.

Upstream: 3a4b4aaa546fa3d57b2ea7f41234f7d2e328da3f
	  493630b20389b66dc475eb05cfefd33ad98d3741
	  ca047fedd89bbb4b79b61e0656a7b799e4e45e6d

Tested by me and by the customer

Signed-off-by: Aristeu Rozanski <arozansk@redhat.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>

diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c
index 17cb529..efd03bb 100644
--- a/drivers/usb/input/wacom.c
+++ b/drivers/usb/input/wacom.c
@@ -107,6 +107,7 @@ enum {
 	INTUOS4L,
 	CINTIQ,
 	BEE,
+	WACOM_21UX2,
 	MAX_TYPE
 };
 
@@ -482,8 +483,10 @@ static int wacom_intuos_inout(struct urb *urb)
 			(data[4] << 20) + (data[5] << 12) +
 			(data[6] << 4) + (data[7] >> 4);
 
-		wacom->id[idx] = (data[2] << 4) | (data[3] >> 4);
-		switch (wacom->id[idx]) {
+		wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) |
+			((data[7] & 0x0f) << 20) | ((data[8] & 0xf0) << 12);
+
+		switch (wacom->id[idx] & 0xfffff) {
 			case 0x812: /* Inking pen */
 			case 0x801: /* Intuos3 Inking pen */
 			case 0x20802: /* Intuos4 Classic Pen */
@@ -555,6 +558,11 @@ static int wacom_intuos_inout(struct urb *urb)
 		return 1;
 	}
 
+	/* older I4 styli don't work with new Cintiqs */
+	if (!((wacom->id[idx] >> 20) & 0x01) &&
+	    (wacom->features->type == WACOM_21UX2))
+		return 1;
+
 	/* Exit report */
 	if ((data[1] & 0xfe) == 0x80) {
 		input_report_abs(dev, ABS_X, 0);
@@ -600,7 +608,8 @@ static void wacom_intuos_general(struct urb *urb)
 	/* general pen packet */
 	if ((data[1] & 0xb8) == 0xa0) {
 		t = (data[6] << 2) | ((data[7] >> 6) & 3);
-		if (wacom->features->type >= INTUOS4S && wacom->features->type <= INTUOS4L)
+		if (wacom->features->type >= INTUOS4S && wacom->features->type <= INTUOS4L ||
+		    wacom->features->type == WACOM_21UX2)
 			t = (t << 1) | (data[1] & 1);
 		input_report_abs(dev, ABS_PRESSURE, t);
 		input_report_abs(dev, ABS_TILT_X,
@@ -689,25 +698,49 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
 			        input_report_abs(dev, ABS_MISC, 0);
 			}
 		} else {
-			input_report_key(dev, BTN_0, (data[5] & 0x01));
-			input_report_key(dev, BTN_1, (data[5] & 0x02));
-			input_report_key(dev, BTN_2, (data[5] & 0x04));
-			input_report_key(dev, BTN_3, (data[5] & 0x08));
-			input_report_key(dev, BTN_4, (data[6] & 0x01));
-			input_report_key(dev, BTN_5, (data[6] & 0x02));
-			input_report_key(dev, BTN_6, (data[6] & 0x04));
-			input_report_key(dev, BTN_7, (data[6] & 0x08));
-			input_report_key(dev, BTN_8, (data[5] & 0x10));
-			input_report_key(dev, BTN_9, (data[6] & 0x10));
+			if (wacom->features->type == WACOM_21UX2) {
+				input_report_key(dev, BTN_0, (data[5] & 0x01));
+				input_report_key(dev, BTN_1, (data[6] & 0x01));
+				input_report_key(dev, BTN_2, (data[6] & 0x02));
+				input_report_key(dev, BTN_3, (data[6] & 0x04));
+				input_report_key(dev, BTN_4, (data[6] & 0x08));
+				input_report_key(dev, BTN_5, (data[6] & 0x10));
+				input_report_key(dev, BTN_6, (data[6] & 0x20));
+				input_report_key(dev, BTN_7, (data[6] & 0x40));
+				input_report_key(dev, BTN_8, (data[6] & 0x80));
+				input_report_key(dev, BTN_9, (data[7] & 0x01));
+				input_report_key(dev, BTN_A, (data[8] & 0x01));
+				input_report_key(dev, BTN_B, (data[8] & 0x02));
+				input_report_key(dev, BTN_C, (data[8] & 0x04));
+				input_report_key(dev, BTN_X, (data[8] & 0x08));
+				input_report_key(dev, BTN_Y, (data[8] & 0x10));
+				input_report_key(dev, BTN_Z, (data[8] & 0x20));
+				input_report_key(dev, BTN_BASE, (data[8] & 0x40));
+				input_report_key(dev, BTN_BASE2, (data[8] & 0x80));
+			} else {
+				input_report_key(dev, BTN_0, (data[5] & 0x01));
+				input_report_key(dev, BTN_1, (data[5] & 0x02));
+				input_report_key(dev, BTN_2, (data[5] & 0x04));
+				input_report_key(dev, BTN_3, (data[5] & 0x08));
+				input_report_key(dev, BTN_4, (data[6] & 0x01));
+				input_report_key(dev, BTN_5, (data[6] & 0x02));
+				input_report_key(dev, BTN_6, (data[6] & 0x04));
+				input_report_key(dev, BTN_7, (data[6] & 0x08));
+				input_report_key(dev, BTN_8, (data[5] & 0x10));
+				input_report_key(dev, BTN_9, (data[6] & 0x10));
+			}
 			input_report_abs(dev, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]);
 			input_report_abs(dev, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]);
 
-			if ((data[5] & 0x1f) | (data[6] & 0x1f) | (data[1] & 0x1f) |
-			    data[2] | (data[3] & 0x1f) | data[4])
+			if ((data[5] & 0x1f) | data[6] | (data[1] & 0x1f) |
+				data[2] | (data[3] & 0x1f) | data[4] | data[8] |
+				(data[7] & 0x01)) {
 				input_report_key(dev, wacom->tool[1], 1);
-			else
+				input_report_abs(dev, ABS_MISC, PAD_DEVICE_ID);
+			} else {
 				input_report_key(dev, wacom->tool[1], 0);
-			input_report_abs(dev, ABS_MISC, PAD_DEVICE_ID);
+                                input_report_abs(dev, ABS_MISC, 0);
+			}
 		}
 		input_event(dev, EV_MSC, MSC_SERIAL, 0xffffffff);
 		input_sync(dev);
@@ -869,59 +902,61 @@ static struct wacom_features wacom_features[] = {
 	{ "Wacom Intuos2 6x8",   10, 20320, 16240, 1023, 31, INTUOS,     wacom_intuos_irq },
 	{ "Wacom Intuos3 4x6",   10, 31496, 19685, 1023, 63, INTUOS3S,   wacom_intuos_irq },
 	{ "Wacom Cintiq 20WSX",  10, 86680, 54180, 1023, 63, BEE,	 wacom_intuos_irq },
+	{ "Wacom Cintiq 21UX2",  10, 87200, 65600, 2047, 63, WACOM_21UX2,wacom_intuos_irq },
 	{ }
 };
 
 static struct usb_device_id wacom_ids[] = {
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x00) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x10) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x11) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x13) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x15) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x64) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x23) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x24) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x30) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x31) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x32) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x37) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC3) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB3) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB4) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB8) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB9) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xBA) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xBB) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB7) },
-	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) },
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x00) },	/* Penpartner */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x10) },	/* Graphire */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x11) },	/* Graphire2 4x5 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12) },	/* Graphire2 5x7 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x13) },	/* Graphire3 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) },	/* Graphire3 6x8 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x15) },	/* Graphire4 4x5 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) },	/* Graphire4 6x8 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },	/* Volito */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },	/* PenStation2 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },	/* Volito2 4x5 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) },	/* Volito2 2x3 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x64) },	/* PenPartner2 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) },	/* Intuos 4x5 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) },	/* Intuos 6x8 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) },	/* Intuos 9x12 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x23) },	/* Intuos 12x12 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x24) },	/* Intuos 12x18 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x30) },	/* PL400 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x31) },	/* PL500 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x32) },	/* PL600 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) },	/* PL600SX */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) },	/* PL550 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) },	/* PL800 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x37) },	/* PL700 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) },	/* PL510 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) },	/* DTU710 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) },	/* DTF521 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC3) },	/* DTF720 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },	/* Cintiq Partner */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) },	/* Intuos2 4x5 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) },	/* Intuos2 6x8 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) },	/* Intuos2 9x12 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) },	/* Intuos2 12x12 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) },	/* Intuos2 12x18 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },	/* Intuos3 4x5 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },	/* Intuos3 6x8 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) },	/* Intuos3 9x12 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB3) },	/* Intuos3 12x12 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB4) },	/* Intuos3 12x19 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) },	/* Intuos3 6x11 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB8) },	/* Intuos4 4x6 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB9) },	/* Intuos4 6x9 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xBA) },	/* Intuos4 8x13 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xBB) },	/* Intuos4 12x19 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },	/* Cintiq 21UX */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },	/* Intuos2 6x8 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB7) },	/* Intuos3 4x6 */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC5) },	/* Cintiq 20WSX */
+	{ USB_DEVICE(USB_VENDOR_ID_WACOM, 0xCC) },	/* Cintiq 21UX2 */
 	{ }
 };
 
@@ -1006,6 +1041,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
 			input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0);
 			break;
 
+		case WACOM_21UX2:
+			input_dev->keybit[LONG(BTN_A)] |= BIT(BTN_A) |
+				BIT(BTN_B) | BIT(BTN_C) | BIT(BTN_X) |
+				BIT(BTN_Y) | BIT(BTN_Z) | BIT(BTN_BASE) |
+				BIT(BTN_BASE2);
+			/* fall through */
 		case BEE:
 			input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_8) | BIT(BTN_9);
 			/* fall through */