Chuck Ebbert 1d13b01
From: Ping Cheng <pinglinux@gmail.com>
Chuck Ebbert 1d13b01
Date: Sun, 5 Sep 2010 19:25:40 +0000 (-0700)
Chuck Ebbert 1d13b01
Subject: Input: wacom - parse the Bamboo device family
Chuck Ebbert 1d13b01
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=4a88081e739a41d6d70bace7e0a027f9054ab540
Chuck Ebbert 1d13b01
Chuck Ebbert 1d13b01
Input: wacom - parse the Bamboo device family
Chuck Ebbert 1d13b01
Chuck Ebbert 1d13b01
The Bamboo devices have multiple interfaces which need to be setup
Chuck Ebbert 1d13b01
separately. Use the HID parsing mechanism to achieve that.
Chuck Ebbert 1d13b01
Chuck Ebbert 1d13b01
Signed-off-by: Ping Cheng <pinglinux@gmail.com>
Chuck Ebbert 1d13b01
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Chuck Ebbert 1d13b01
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Chuck Ebbert 1d13b01
---
Chuck Ebbert 1d13b01
Chuck Ebbert 1d13b01
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
Chuck Ebbert 1d13b01
index e510e4f..98cba08 100644
Chuck Ebbert 1d13b01
--- a/drivers/input/tablet/wacom_sys.c
Chuck Ebbert 1d13b01
+++ b/drivers/input/tablet/wacom_sys.c
Chuck Ebbert 1d13b01
@@ -195,17 +195,30 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
Chuck Ebbert 1d13b01
 							features->pktlen = WACOM_PKGLEN_TPC2FG;
Chuck Ebbert 1d13b01
 							features->device_type = BTN_TOOL_TRIPLETAP;
Chuck Ebbert 1d13b01
 						}
Chuck Ebbert 1d13b01
-						features->x_max =
Chuck Ebbert 1d13b01
-							get_unaligned_le16(&report[i + 3]);
Chuck Ebbert 1d13b01
-						features->x_phy =
Chuck Ebbert 1d13b01
-							get_unaligned_le16(&report[i + 6]);
Chuck Ebbert 1d13b01
-						features->unit = report[i + 9];
Chuck Ebbert 1d13b01
-						features->unitExpo = report[i + 11];
Chuck Ebbert 1d13b01
-						i += 12;
Chuck Ebbert 1d13b01
+						if (features->type == BAMBOO_PT) {
Chuck Ebbert 1d13b01
+							/* need to reset back */
Chuck Ebbert 1d13b01
+							features->pktlen = WACOM_PKGLEN_BBTOUCH;
Chuck Ebbert 1d13b01
+							features->device_type = BTN_TOOL_TRIPLETAP;
Chuck Ebbert 1d13b01
+							features->x_phy =
Chuck Ebbert 1d13b01
+								get_unaligned_le16(&report[i + 5]);
Chuck Ebbert 1d13b01
+							features->x_max =
Chuck Ebbert 1d13b01
+								get_unaligned_le16(&report[i + 8]);
Chuck Ebbert 1d13b01
+							i += 15;
Chuck Ebbert 1d13b01
+						} else {
Chuck Ebbert 1d13b01
+							features->x_max =
Chuck Ebbert 1d13b01
+								get_unaligned_le16(&report[i + 3]);
Chuck Ebbert 1d13b01
+							features->x_phy =
Chuck Ebbert 1d13b01
+								get_unaligned_le16(&report[i + 6]);
Chuck Ebbert 1d13b01
+							features->unit = report[i + 9];
Chuck Ebbert 1d13b01
+							features->unitExpo = report[i + 11];
Chuck Ebbert 1d13b01
+							i += 12;
Chuck Ebbert 1d13b01
+						}
Chuck Ebbert 1d13b01
 					} else if (pen) {
Chuck Ebbert 1d13b01
 						/* penabled only accepts exact bytes of data */
Chuck Ebbert 1d13b01
 						if (features->type == TABLETPC2FG)
Chuck Ebbert 1d13b01
 							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
Chuck Ebbert 1d13b01
+						if (features->type == BAMBOO_PT)
Chuck Ebbert 1d13b01
+							features->pktlen = WACOM_PKGLEN_BBFUN;
Chuck Ebbert 1d13b01
 						features->device_type = BTN_TOOL_PEN;
Chuck Ebbert 1d13b01
 						features->x_max =
Chuck Ebbert 1d13b01
 							get_unaligned_le16(&report[i + 3]);
Chuck Ebbert 1d13b01
@@ -234,6 +247,15 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
Chuck Ebbert 1d13b01
 							features->y_phy =
Chuck Ebbert 1d13b01
 								get_unaligned_le16(&report[i + 6]);
Chuck Ebbert 1d13b01
 							i += 7;
Chuck Ebbert 1d13b01
+						} else if (features->type == BAMBOO_PT) {
Chuck Ebbert 1d13b01
+							/* need to reset back */
Chuck Ebbert 1d13b01
+							features->pktlen = WACOM_PKGLEN_BBTOUCH;
Chuck Ebbert 1d13b01
+							features->device_type = BTN_TOOL_TRIPLETAP;
Chuck Ebbert 1d13b01
+							features->y_phy =
Chuck Ebbert 1d13b01
+								get_unaligned_le16(&report[i + 3]);
Chuck Ebbert 1d13b01
+							features->y_max =
Chuck Ebbert 1d13b01
+								get_unaligned_le16(&report[i + 6]);
Chuck Ebbert 1d13b01
+							i += 12;
Chuck Ebbert 1d13b01
 						} else {
Chuck Ebbert 1d13b01
 							features->y_max =
Chuck Ebbert 1d13b01
 								features->x_max;
Chuck Ebbert 1d13b01
@@ -245,6 +267,8 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
Chuck Ebbert 1d13b01
 						/* penabled only accepts exact bytes of data */
Chuck Ebbert 1d13b01
 						if (features->type == TABLETPC2FG)
Chuck Ebbert 1d13b01
 							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
Chuck Ebbert 1d13b01
+						if (features->type == BAMBOO_PT)
Chuck Ebbert 1d13b01
+							features->pktlen = WACOM_PKGLEN_BBFUN;
Chuck Ebbert 1d13b01
 						features->device_type = BTN_TOOL_PEN;
Chuck Ebbert 1d13b01
 						features->y_max =
Chuck Ebbert 1d13b01
 							get_unaligned_le16(&report[i + 3]);
Chuck Ebbert 1d13b01
@@ -341,7 +365,8 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
Chuck Ebbert 1d13b01
 	features->distance_fuzz = 0;
Chuck Ebbert 1d13b01
 
Chuck Ebbert 1d13b01
 	/* only Tablet PCs need to retrieve the info */
Chuck Ebbert 1d13b01
-	if ((features->type != TABLETPC) && (features->type != TABLETPC2FG))
Chuck Ebbert 1d13b01
+	if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
Chuck Ebbert 1d13b01
+	    (features->type != BAMBOO_PT))
Chuck Ebbert 1d13b01
 		goto out;
Chuck Ebbert 1d13b01
 
Chuck Ebbert 1d13b01
 	if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
Chuck Ebbert 1d13b01
@@ -499,7 +524,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
Chuck Ebbert 1d13b01
 
Chuck Ebbert 1d13b01
 	strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
Chuck Ebbert 1d13b01
 
Chuck Ebbert 1d13b01
-	if (features->type == TABLETPC || features->type == TABLETPC2FG) {
Chuck Ebbert 1d13b01
+	if (features->type == TABLETPC || features->type == TABLETPC2FG ||
Chuck Ebbert 1d13b01
+	    features->type == BAMBOO_PT) {
Chuck Ebbert 1d13b01
 		/* Append the device type to the name */
Chuck Ebbert 1d13b01
 		strlcat(wacom_wac->name,
Chuck Ebbert 1d13b01
 			features->device_type == BTN_TOOL_PEN ?
Chuck Ebbert 1d13b01
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
Chuck Ebbert 1d13b01
index d769e9a..fb30895 100644
Chuck Ebbert 1d13b01
--- a/drivers/input/tablet/wacom_wac.h
Chuck Ebbert 1d13b01
+++ b/drivers/input/tablet/wacom_wac.h
Chuck Ebbert 1d13b01
@@ -21,6 +21,7 @@
Chuck Ebbert 1d13b01
 #define WACOM_PKGLEN_INTUOS	10
Chuck Ebbert 1d13b01
 #define WACOM_PKGLEN_TPC1FG	 5
Chuck Ebbert 1d13b01
 #define WACOM_PKGLEN_TPC2FG	14
Chuck Ebbert 1d13b01
+#define WACOM_PKGLEN_BBTOUCH	20
Chuck Ebbert 1d13b01
 
Chuck Ebbert 1d13b01
 /* device IDs */
Chuck Ebbert 1d13b01
 #define STYLUS_DEVICE_ID	0x02
Chuck Ebbert 1d13b01
@@ -44,6 +45,7 @@ enum {
Chuck Ebbert 1d13b01
 	PTU,
Chuck Ebbert 1d13b01
 	PL,
Chuck Ebbert 1d13b01
 	DTU,
Chuck Ebbert 1d13b01
+	BAMBOO_PT,
Chuck Ebbert 1d13b01
 	INTUOS,
Chuck Ebbert 1d13b01
 	INTUOS3S,
Chuck Ebbert 1d13b01
 	INTUOS3,