[kernel] r19001 - in dists/sid/linux-2.6/debian: . patches/features/all/wacom patches/series

Ben Hutchings benh at alioth.debian.org
Wed May 16 02:01:44 UTC 2012


Author: benh
Date: Wed May 16 02:01:40 2012
New Revision: 19001

Log:
wacom: Add support for various tablet models (Closes: #671801)

Mostly cherry-picked by Jonathan Nieder from input-next.
I've added one extra fix on the end.

Added:
   dists/sid/linux-2.6/debian/patches/features/all/wacom/
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0001-Input-wacom-cleanup-feature-report-for-bamboos.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0002-Input-wacom-remove-unused-bamboo-HID-parsing.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0003-Input-wacom-add-some-comments-to-wacom_parse_hid.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0004-Input-wacom-relax-Bamboo-stylus-ID-check.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0005-Input-wacom-read-3rd-gen-Bamboo-Touch-HID-data.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0006-Input-wacom-3rd-gen-Bamboo-P-Touch-packet-support.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0007-Input-wacom-ignore-unwanted-bamboo-packets.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0008-Input-wacom-add-support-for-Cintiq-24HD.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0009-Input-wacom-add-LED-support-for-Cintiq-24HD.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0010-Input-wacom-use-BTN_TOOL_FINGER-to-indicate-touch-de.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0011-Input-wacom-use-switch-statement-for-wacom_tpc_irq.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0012-Input-wacom-add-missing-LEDS_CLASS-to-Kconfig.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0013-Input-wacom-fix-3rd-gen-Bamboo-MT-when-4-fingers-are.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0014-Input-wacom-fix-physical-size-calculation-for-3rd-ge.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0015-Input-wacom-isolate-input-registration.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0016-Input-wacom-check-for-allocation-failure-in-probe.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0017-Input-wacom-wireless-monitor-framework.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0018-Input-wacom-create-inputs-when-wireless-connect.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0019-Input-wacom-wireless-battery-status.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0020-Input-wacom-add-basic-Intuos5-support.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0021-Input-wacom-add-Intuos5-Touch-Ring-ExpressKey-suppor.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0022-Input-wacom-add-Intuos5-Touch-Ring-LED-support.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0023-Input-wacom-add-Intuos5-multitouch-sensor-support.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0024-Input-wacom-retrieve-maximum-number-of-touch-points.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0025-Input-wacom-add-0xE5-MT-device-support.patch
   dists/sid/linux-2.6/debian/patches/features/all/wacom/0026-Input-wacom-return-proper-error-if-usb_get_extra_des.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/base

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Sat May 12 17:01:23 2012	(r19000)
+++ dists/sid/linux-2.6/debian/changelog	Wed May 16 02:01:40 2012	(r19001)
@@ -1,3 +1,10 @@
+linux-2.6 (3.2.17-2) UNRELEASED; urgency=low
+
+  [ Jonathan Nieder ]
+  * wacom: Add support for various tablet models (Closes: #671801)
+
+ -- Ben Hutchings <ben at decadent.org.uk>  Wed, 16 May 2012 02:19:30 +0100
+
 linux-2.6 (3.2.17-1) unstable; urgency=low
 
   * New upstream stable update:

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0001-Input-wacom-cleanup-feature-report-for-bamboos.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0001-Input-wacom-cleanup-feature-report-for-bamboos.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,49 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 26 Oct 2011 22:24:22 -0700
+Subject: Input: wacom - cleanup feature report for bamboos
+
+commit 6e8ec5379c7ab9a57190e23af173aee74f88e54a upstream.
+
+Only the stylus interface on Bamboo's has a feature report that can
+be used to set to wacom mode.  The touch interface only has 1 report mode
+and will return errors for those get/sets requests.
+
+The get request was always erroring out because it was not marked as
+an input request. Only down side of error was needlessly resending the
+set request 5 times.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 1c1b7b43cf92..8669096a8ea1 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -66,7 +66,8 @@ static int wacom_get_report(struct usb_interface *intf, u8 type, u8 id,
+ 	do {
+ 		retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
+ 				USB_REQ_GET_REPORT,
+-				USB_TYPE_CLASS | USB_RECIP_INTERFACE,
++				USB_DIR_IN | USB_TYPE_CLASS |
++				USB_RECIP_INTERFACE,
+ 				(type << 8) + id,
+ 				intf->altsetting[0].desc.bInterfaceNumber,
+ 				buf, size, 100);
+@@ -348,7 +349,8 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
+ 						WAC_HID_FEATURE_REPORT,
+ 						report_id, rep_data, 4, 1);
+ 		} while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES);
+-	} else if (features->type != TABLETPC) {
++	} else if (features->type != TABLETPC &&
++		   features->device_type == BTN_TOOL_PEN) {
+ 		do {
+ 			rep_data[0] = 2;
+ 			rep_data[1] = 2;
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0002-Input-wacom-remove-unused-bamboo-HID-parsing.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0002-Input-wacom-remove-unused-bamboo-HID-parsing.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,43 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 26 Oct 2011 22:26:16 -0700
+Subject: Input: wacom - remove unused bamboo HID parsing
+
+commit fc72bf758f943fbc5c0d9dd14575b91996513c77 upstream.
+
+Bamboo's do not declared a Digitizer-Stylus so the if() was
+never executed.  wacom_features already contains correct stylus
+packet length.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |    4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 8669096a8ea1..f3dfb827437a 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -245,8 +245,6 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
+ 						/* penabled only accepts exact bytes of data */
+ 						if (features->type == TABLETPC2FG)
+ 							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
+-						if (features->type == BAMBOO_PT)
+-							features->pktlen = WACOM_PKGLEN_BBFUN;
+ 						features->device_type = BTN_TOOL_PEN;
+ 						features->x_max =
+ 							get_unaligned_le16(&report[i + 3]);
+@@ -288,8 +286,6 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
+ 						/* penabled only accepts exact bytes of data */
+ 						if (features->type == TABLETPC2FG)
+ 							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
+-						if (features->type == BAMBOO_PT)
+-							features->pktlen = WACOM_PKGLEN_BBFUN;
+ 						features->device_type = BTN_TOOL_PEN;
+ 						features->y_max =
+ 							get_unaligned_le16(&report[i + 3]);
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0003-Input-wacom-add-some-comments-to-wacom_parse_hid.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0003-Input-wacom-add-some-comments-to-wacom_parse_hid.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,72 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 26 Oct 2011 22:26:59 -0700
+Subject: Input: wacom - add some comments to wacom_parse_hid
+
+commit 428f85884bb4a88737e5fa76535ede06a33fe162 upstream.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |   37 ++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 36 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index f3dfb827437a..e648f9ac4d82 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -165,7 +165,37 @@ static void wacom_close(struct input_dev *dev)
+ 		usb_autopm_put_interface(wacom->intf);
+ }
+ 
+-static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc,
++/*
++ * Interface Descriptor of wacom devices can be incomplete and
++ * inconsistent so wacom_features table is used to store stylus
++ * device's packet lengths, various maximum values, and tablet
++ * resolution based on product ID's.
++ *
++ * For devices that contain 2 interfaces, wacom_features table is
++ * inaccurate for the touch interface.  Since the Interface Descriptor
++ * for touch interfaces has pretty complete data, this function exists
++ * to query tablet for this missing information instead of hard coding in
++ * an additional table.
++ *
++ * A typical Interface Descriptor for a stylus will contain a
++ * boot mouse application collection that is not of interest and this
++ * function will ignore it.
++ *
++ * It also contains a digitizer application collection that also is not
++ * of interest since any information it contains would be duplicate
++ * of what is in wacom_features. Usually it defines a report of an array
++ * of bytes that could be used as max length of the stylus packet returned.
++ * If it happens to define a Digitizer-Stylus Physical Collection then
++ * the X and Y logical values contain valid data but it is ignored.
++ *
++ * A typical Interface Descriptor for a touch interface will contain a
++ * Digitizer-Finger Physical Collection which will define both logical
++ * X/Y maximum as well as the physical size of tablet. Since touch
++ * interfaces haven't supported pressure or distance, this is enough
++ * information to override invalid values in the wacom_features table.
++ */
++static int wacom_parse_hid(struct usb_interface *intf,
++			   struct hid_descriptor *hid_desc,
+ 			   struct wacom_features *features)
+ {
+ 	struct usb_device *dev = interface_to_usbdev(intf);
+@@ -299,6 +329,11 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
+ 				i++;
+ 				break;
+ 
++			/*
++			 * Requiring Stylus Usage will ignore boot mouse
++			 * X/Y values and some cases of invalid Digitizer X/Y
++			 * values commonly reported.
++			 */
+ 			case HID_USAGE_STYLUS:
+ 				pen = 1;
+ 				i++;
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0004-Input-wacom-relax-Bamboo-stylus-ID-check.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0004-Input-wacom-relax-Bamboo-stylus-ID-check.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,41 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 26 Oct 2011 22:28:34 -0700
+Subject: Input: wacom - relax Bamboo stylus ID check
+
+commit c5981411f60c31f0dff6f0f98d2d3711384badaf upstream.
+
+Bit 0x02 always means tip versus eraser. Bit 0x01 is something related
+to version of stylus and different values are starting to be used.
+
+Relaxing proximity check is required to be used with 3rd generation
+Bamboo Pen and Touch tablets.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |    7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 2ee47d01a3b4..f00c70e1adb0 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -843,12 +843,7 @@ static int wacom_bpt_pen(struct wacom_wac *wacom)
+ 	unsigned char *data = wacom->data;
+ 	int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
+ 
+-	/*
+-	 * Similar to Graphire protocol, data[1] & 0x20 is proximity and
+-	 * data[1] & 0x18 is tool ID.  0x30 is safety check to ignore
+-	 * 2 unused tool ID's.
+-	 */
+-	prox = (data[1] & 0x30) == 0x30;
++	prox = (data[1] & 0x20) == 0x20;
+ 
+ 	/*
+ 	 * All reports shared between PEN and RUBBER tool must be
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0005-Input-wacom-read-3rd-gen-Bamboo-Touch-HID-data.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0005-Input-wacom-read-3rd-gen-Bamboo-Touch-HID-data.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,121 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 26 Oct 2011 22:32:52 -0700
+Subject: Input: wacom - read 3rd gen Bamboo Touch HID data
+
+commit 4134361af6e099e5f477663fed1d49f0cf29eb4f upstream.
+
+Override invalid pen based pktlen and x/y_max with touch
+values from HID report.
+
+Since active area of pen and touch are same on these
+devices, set physical x/y size while pen x/y_max and
+resolution are still valid.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |   49 ++++++++++++++++++++++++++++++++++++--
+ drivers/input/tablet/wacom_wac.h |    1 +
+ 2 files changed, 48 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index e648f9ac4d82..2fe21d1a18b7 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -28,7 +28,9 @@
+ #define HID_USAGE_Y_TILT		0x3e
+ #define HID_USAGE_FINGER		0x22
+ #define HID_USAGE_STYLUS		0x20
+-#define HID_COLLECTION			0xc0
++#define HID_COLLECTION			0xa1
++#define HID_COLLECTION_LOGICAL		0x02
++#define HID_COLLECTION_END		0xc0
+ 
+ enum {
+ 	WCM_UNDEFINED = 0,
+@@ -165,6 +167,35 @@ static void wacom_close(struct input_dev *dev)
+ 		usb_autopm_put_interface(wacom->intf);
+ }
+ 
++static int wacom_parse_logical_collection(unsigned char *report,
++					  struct wacom_features *features)
++{
++	int length = 0;
++
++	if (features->type == BAMBOO_PT) {
++
++		/* Logical collection is only used by 3rd gen Bamboo Touch */
++		features->pktlen = WACOM_PKGLEN_BBTOUCH3;
++		features->device_type = BTN_TOOL_DOUBLETAP;
++
++		/*
++		 * Stylus and Touch have same active area
++		 * so compute physical size based on stylus
++		 * data before its overwritten.
++		 */
++		features->x_phy =
++			(features->x_max * features->x_resolution) / 100;
++		features->y_phy =
++			(features->y_max * features->y_resolution) / 100;
++
++		features->x_max = features->y_max =
++			get_unaligned_le16(&report[10]);
++
++		length = 11;
++	}
++	return length;
++}
++
+ /*
+  * Interface Descriptor of wacom devices can be incomplete and
+  * inconsistent so wacom_features table is used to store stylus
+@@ -193,6 +224,10 @@ static void wacom_close(struct input_dev *dev)
+  * X/Y maximum as well as the physical size of tablet. Since touch
+  * interfaces haven't supported pressure or distance, this is enough
+  * information to override invalid values in the wacom_features table.
++ *
++ * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical
++ * Collection. Instead they define a Logical Collection with a single
++ * Logical Maximum for both X and Y.
+  */
+ static int wacom_parse_hid(struct usb_interface *intf,
+ 			   struct hid_descriptor *hid_desc,
+@@ -341,10 +376,20 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 			}
+ 			break;
+ 
+-		case HID_COLLECTION:
++		case HID_COLLECTION_END:
+ 			/* reset UsagePage and Finger */
+ 			finger = usage = 0;
+ 			break;
++
++		case HID_COLLECTION:
++			i++;
++			switch (report[i]) {
++			case HID_COLLECTION_LOGICAL:
++				i += wacom_parse_logical_collection(&report[i],
++								    features);
++				break;
++			}
++			break;
+ 		}
+ 	}
+ 
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 53eb71b68330..af94e6d9d6a9 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -22,6 +22,7 @@
+ #define WACOM_PKGLEN_TPC1FG	 5
+ #define WACOM_PKGLEN_TPC2FG	14
+ #define WACOM_PKGLEN_BBTOUCH	20
++#define WACOM_PKGLEN_BBTOUCH3	64
+ 
+ /* device IDs */
+ #define STYLUS_DEVICE_ID	0x02
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0006-Input-wacom-3rd-gen-Bamboo-P-Touch-packet-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0006-Input-wacom-3rd-gen-Bamboo-P-Touch-packet-support.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,188 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 26 Oct 2011 22:34:21 -0700
+Subject: Input: wacom - 3rd gen Bamboo P&Touch packet support
+
+commit 73149ab8433c0ade5a4f79b137af2a081e8a5d13 upstream.
+
+3rd generation Bamboo Pen and Touch tablets reuse the older
+stylus packet but add an extra fixed zero pad byte to end.
+
+The touch packets are quite different since it supports tracking
+of up to 16 touches. The packet is 64-byte fixed size but contains
+up to 15 smaller messages indicating data for a single touch or
+for tablet button presses.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |   94 ++++++++++++++++++++++++++++++++++++--
+ drivers/input/tablet/wacom_wac.h |    3 +-
+ 2 files changed, 92 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index f00c70e1adb0..c456ab04efcf 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -837,6 +837,64 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
+ 	return 0;
+ }
+ 
++static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
++{
++	struct input_dev *input = wacom->input;
++	int slot_id = data[0] - 2;  /* data[0] is between 2 and 17 */
++	bool touch = data[1] & 0x80;
++
++	touch = touch && !wacom->shared->stylus_in_proximity;
++
++	input_mt_slot(input, slot_id);
++	input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
++
++	if (touch) {
++		int x = (data[2] << 4) | (data[4] >> 4);
++		int y = (data[3] << 4) | (data[4] & 0x0f);
++		int w = data[6];
++
++		input_report_abs(input, ABS_MT_POSITION_X, x);
++		input_report_abs(input, ABS_MT_POSITION_Y, y);
++		input_report_abs(input, ABS_MT_TOUCH_MAJOR, w);
++	}
++}
++
++static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
++{
++	struct input_dev *input = wacom->input;
++
++	input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
++	input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
++	input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
++	input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
++}
++
++static int wacom_bpt3_touch(struct wacom_wac *wacom)
++{
++	struct input_dev *input = wacom->input;
++	unsigned char *data = wacom->data;
++	int count = data[1] & 0x03;
++	int i;
++
++	/* data has up to 7 fixed sized 8-byte messages starting at data[2] */
++	for (i = 0; i < count; i++) {
++		int offset = (8 * i) + 2;
++		int msg_id = data[offset];
++
++		if (msg_id >= 2 && msg_id <= 17)
++			wacom_bpt3_touch_msg(wacom, data + offset);
++		else if (msg_id == 128)
++			wacom_bpt3_button_msg(wacom, data + offset);
++
++	}
++
++	input_mt_report_pointer_emulation(input, true);
++
++	input_sync(input);
++
++	return 0;
++}
++
+ static int wacom_bpt_pen(struct wacom_wac *wacom)
+ {
+ 	struct input_dev *input = wacom->input;
+@@ -907,7 +965,9 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ {
+ 	if (len == WACOM_PKGLEN_BBTOUCH)
+ 		return wacom_bpt_touch(wacom);
+-	else if (len == WACOM_PKGLEN_BBFUN)
++	else if (len == WACOM_PKGLEN_BBTOUCH3)
++		return wacom_bpt3_touch(wacom);
++	else if (len == WACOM_PKGLEN_BBFUN || len == WACOM_PKGLEN_BBPEN)
+ 		return wacom_bpt_pen(wacom);
+ 
+ 	return 0;
+@@ -1026,9 +1086,9 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ 	    features->type == BAMBOO_PT)
+ 		features->quirks |= WACOM_QUIRK_MULTI_INPUT;
+ 
+-	/* quirks for bamboo touch */
++	/* quirk for bamboo touch with 2 low res touches */
+ 	if (features->type == BAMBOO_PT &&
+-	    features->device_type == BTN_TOOL_DOUBLETAP) {
++	    features->pktlen == WACOM_PKGLEN_BBTOUCH) {
+ 		features->x_max <<= 5;
+ 		features->y_max <<= 5;
+ 		features->x_fuzz <<= 5;
+@@ -1235,7 +1295,21 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 			__set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+ 			__set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+ 
+-			input_mt_init_slots(input_dev, 2);
++			if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
++				__set_bit(BTN_TOOL_TRIPLETAP,
++					  input_dev->keybit);
++				__set_bit(BTN_TOOL_QUADTAP,
++					  input_dev->keybit);
++
++				input_mt_init_slots(input_dev, 16);
++
++				input_set_abs_params(input_dev,
++						     ABS_MT_TOUCH_MAJOR,
++						     0, 255, 0, 0);
++			} else {
++				input_mt_init_slots(input_dev, 2);
++			}
++
+ 			input_set_abs_params(input_dev, ABS_MT_POSITION_X,
+ 					     0, features->x_max,
+ 					     features->x_fuzz, 0);
+@@ -1504,6 +1578,15 @@ static const struct wacom_features wacom_features_0xDA =
+ static struct wacom_features wacom_features_0xDB =
+ 	{ "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN,  21648, 13700, 1023,
+ 	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++static const struct wacom_features wacom_features_0xDD =
++        { "Wacom Bamboo Connect", WACOM_PKGLEN_BBPEN,     14720,  9200, 1023,
++          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++static const struct wacom_features wacom_features_0xDE =
++        { "Wacom Bamboo 16FG 4x5", WACOM_PKGLEN_BBPEN,    14720,  9200, 1023,
++          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++static const struct wacom_features wacom_features_0xDF =
++        { "Wacom Bamboo 16FG 6x8", WACOM_PKGLEN_BBPEN,    21648, 13700, 1023,
++          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0x6004 =
+ 	{ "ISD-V4",               WACOM_PKGLEN_GRAPHIRE,  12800,  8000,  255,
+ 	  0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+@@ -1599,6 +1682,9 @@ const struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE_WACOM(0xD8) },
+ 	{ USB_DEVICE_WACOM(0xDA) },
+ 	{ USB_DEVICE_WACOM(0xDB) },
++	{ USB_DEVICE_WACOM(0xDD) },
++	{ USB_DEVICE_WACOM(0xDE) },
++	{ USB_DEVICE_WACOM(0xDF) },
+ 	{ USB_DEVICE_WACOM(0xF0) },
+ 	{ USB_DEVICE_WACOM(0xCC) },
+ 	{ USB_DEVICE_WACOM(0x90) },
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index af94e6d9d6a9..27f1d1c203a1 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -12,7 +12,7 @@
+ #include <linux/types.h>
+ 
+ /* maximum packet length for USB devices */
+-#define WACOM_PKGLEN_MAX	32
++#define WACOM_PKGLEN_MAX	64
+ 
+ /* packet length for individual models */
+ #define WACOM_PKGLEN_PENPRTN	 7
+@@ -23,6 +23,7 @@
+ #define WACOM_PKGLEN_TPC2FG	14
+ #define WACOM_PKGLEN_BBTOUCH	20
+ #define WACOM_PKGLEN_BBTOUCH3	64
++#define WACOM_PKGLEN_BBPEN	10
+ 
+ /* device IDs */
+ #define STYLUS_DEVICE_ID	0x02
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0007-Input-wacom-ignore-unwanted-bamboo-packets.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0007-Input-wacom-ignore-unwanted-bamboo-packets.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,63 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Mon, 7 Nov 2011 19:52:42 -0800
+Subject: Input: wacom - ignore unwanted bamboo packets
+
+commit 5a6c865d9861efdd066db1b5da491ebc2ff5926d upstream.
+
+Bamboo's Pen and Touch packets always start with a value
+of 0x02 in first byte.  In 3rd gen Bamboo's, the hw is now
+periodically sending some additional packets with unrelated data
+and uses a value other than 0x02 to inform driver this.
+
+Ignore those packets now.
+
+This was reported by users as bad behavior in Gimp. The
+invalid packets being processed made the stylus report
+out of proximity for the 1 packet and this triggered some
+secondary bug which caused Gimp to stop drawing until
+user really took pen out of proximity of tablet.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index c456ab04efcf..551f3a3156dc 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -799,6 +799,9 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
+ 	unsigned char *data = wacom->data;
+ 	int i;
+ 
++	if (data[0] != 0x02)
++	    return 0;
++
+ 	for (i = 0; i < 2; i++) {
+ 		int offset = (data[1] & 0x80) ? (8 * i) : (9 * i);
+ 		bool touch = data[offset + 3] & 0x80;
+@@ -876,6 +879,9 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
+ 	int count = data[1] & 0x03;
+ 	int i;
+ 
++	if (data[0] != 0x02)
++	    return 0;
++
+ 	/* data has up to 7 fixed sized 8-byte messages starting at data[2] */
+ 	for (i = 0; i < count; i++) {
+ 		int offset = (8 * i) + 2;
+@@ -901,6 +907,9 @@ static int wacom_bpt_pen(struct wacom_wac *wacom)
+ 	unsigned char *data = wacom->data;
+ 	int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
+ 
++	if (data[0] != 0x02)
++	    return 0;
++
+ 	prox = (data[1] & 0x20) == 0x20;
+ 
+ 	/*
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0008-Input-wacom-add-support-for-Cintiq-24HD.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0008-Input-wacom-add-support-for-Cintiq-24HD.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,160 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Mon, 12 Dec 2011 00:11:45 -0800
+Subject: Input: wacom - add support for Cintiq 24HD
+
+commit 803296b678a43005e3bc0aaa1951d211bd76a054 upstream.
+
+Adds support for the Cintiq 24HD. There are two quirks about this
+model that haven't been seen in prior tablets. First, a second
+touch ring is present on this display; it is being exposed via the
+ABS_THROTTLE axis. Second, three capacitive buttons at the top of
+the unit are available; though physically a touch strip, we report
+the use of these buttons with generic KEY_ events.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |   77 +++++++++++++++++++++++++++++++++++++-
+ drivers/input/tablet/wacom_wac.h |    1 +
+ 2 files changed, 77 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 551f3a3156dc..88672ec296c1 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -452,7 +452,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
+ 	if ((data[1] & 0xb8) == 0xa0) {
+ 		t = (data[6] << 2) | ((data[7] >> 6) & 3);
+ 		if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
+-		    features->type == WACOM_21UX2) {
++		    features->type == WACOM_21UX2 || features->type == WACOM_24HD) {
+ 			t = (t << 1) | (data[1] & 1);
+ 		}
+ 		input_report_abs(input, ABS_PRESSURE, t);
+@@ -519,6 +519,56 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 				input_report_key(input, wacom->tool[1], 0);
+ 				input_report_abs(input, ABS_MISC, 0);
+ 			}
++		} else if (features->type == WACOM_24HD) {
++			input_report_key(input, BTN_0, (data[6] & 0x01));
++			input_report_key(input, BTN_1, (data[6] & 0x02));
++			input_report_key(input, BTN_2, (data[6] & 0x04));
++			input_report_key(input, BTN_3, (data[6] & 0x08));
++			input_report_key(input, BTN_4, (data[6] & 0x10));
++			input_report_key(input, BTN_5, (data[6] & 0x20));
++			input_report_key(input, BTN_6, (data[6] & 0x40));
++			input_report_key(input, BTN_7, (data[6] & 0x80));
++			input_report_key(input, BTN_8, (data[8] & 0x01));
++			input_report_key(input, BTN_9, (data[8] & 0x02));
++			input_report_key(input, BTN_A, (data[8] & 0x04));
++			input_report_key(input, BTN_B, (data[8] & 0x08));
++			input_report_key(input, BTN_C, (data[8] & 0x10));
++			input_report_key(input, BTN_X, (data[8] & 0x20));
++			input_report_key(input, BTN_Y, (data[8] & 0x40));
++			input_report_key(input, BTN_Z, (data[8] & 0x80));
++
++			/*
++			 * Three "buttons" are available on the 24HD which are
++			 * physically implemented as a touchstrip. Each button
++			 * is approximately 3 bits wide with a 2 bit spacing.
++			 * The raw touchstrip bits are stored at:
++			 *    ((data[3] & 0x1f) << 8) | data[4])
++			 */
++			input_report_key(input, KEY_PROG1, data[4] & 0x07);
++			input_report_key(input, KEY_PROG2, data[4] & 0xE0);
++			input_report_key(input, KEY_PROG3, data[3] & 0x1C);
++
++			if (data[1] & 0x80) {
++				input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
++			} else {
++				/* Out of proximity, clear wheel value. */
++				input_report_abs(input, ABS_WHEEL, 0);
++			}
++
++			if (data[2] & 0x80) {
++				input_report_abs(input, ABS_THROTTLE, (data[2] & 0x7f));
++			} else {
++				/* Out of proximity, clear second wheel value. */
++				input_report_abs(input, ABS_THROTTLE, 0);
++			}
++
++			if (data[1] | data[2] | (data[3] & 0x1f) | data[4] | data[6] | data[8]) {
++				input_report_key(input, wacom->tool[1], 1);
++				input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
++			} else {
++				input_report_key(input, wacom->tool[1], 0);
++				input_report_abs(input, ABS_MISC, 0);
++			}
+ 		} else {
+ 			if (features->type == WACOM_21UX2) {
+ 				input_report_key(input, BTN_0, (data[5] & 0x01));
+@@ -1019,6 +1069,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ 	case CINTIQ:
+ 	case WACOM_BEE:
+ 	case WACOM_21UX2:
++	case WACOM_24HD:
+ 		sync = wacom_intuos_irq(wacom_wac);
+ 		break;
+ 
+@@ -1174,6 +1225,26 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+ 		break;
+ 
++	case WACOM_24HD:
++		__set_bit(BTN_A, input_dev->keybit);
++		__set_bit(BTN_B, input_dev->keybit);
++		__set_bit(BTN_C, input_dev->keybit);
++		__set_bit(BTN_X, input_dev->keybit);
++		__set_bit(BTN_Y, input_dev->keybit);
++		__set_bit(BTN_Z, input_dev->keybit);
++
++		for (i = 0; i < 10; i++)
++			__set_bit(BTN_0 + i, input_dev->keybit);
++
++		__set_bit(KEY_PROG1, input_dev->keybit);
++		__set_bit(KEY_PROG2, input_dev->keybit);
++		__set_bit(KEY_PROG3, input_dev->keybit);
++
++		input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
++		input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
++		wacom_setup_cintiq(wacom_wac);
++		break;
++
+ 	case WACOM_21UX2:
+ 		__set_bit(BTN_A, input_dev->keybit);
+ 		__set_bit(BTN_B, input_dev->keybit);
+@@ -1503,6 +1574,9 @@ static const struct wacom_features wacom_features_0xBB =
+ static const struct wacom_features wacom_features_0xBC =
+ 	{ "Wacom Intuos4 WL",     WACOM_PKGLEN_INTUOS,    40840, 25400, 2047,
+ 	  63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++static const struct wacom_features wacom_features_0xF4 =
++	{ "Wacom Cintiq 24HD",    WACOM_PKGLEN_INTUOS,   104480, 65600, 2047,
++	  63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+ static const struct wacom_features wacom_features_0x3F =
+ 	{ "Wacom Cintiq 21UX",    WACOM_PKGLEN_INTUOS,    87200, 65600, 1023,
+ 	  63, CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+@@ -1706,6 +1780,7 @@ const struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE_WACOM(0xE6) },
+ 	{ USB_DEVICE_WACOM(0xEC) },
+ 	{ USB_DEVICE_WACOM(0x47) },
++	{ USB_DEVICE_WACOM(0xF4) },
+ 	{ USB_DEVICE_LENOVO(0x6004) },
+ 	{ }
+ };
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 27f1d1c203a1..050acaefee7d 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -59,6 +59,7 @@ enum {
+ 	INTUOS4S,
+ 	INTUOS4,
+ 	INTUOS4L,
++	WACOM_24HD,
+ 	WACOM_21UX2,
+ 	CINTIQ,
+ 	WACOM_BEE,
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0009-Input-wacom-add-LED-support-for-Cintiq-24HD.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0009-Input-wacom-add-LED-support-for-Cintiq-24HD.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,93 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Mon, 12 Dec 2011 00:12:04 -0800
+Subject: Input: wacom - add LED support for Cintiq 24HD
+
+commit 246835fccdc0dadeda20cd51f7ec868031fa8142 upstream.
+
+The Cintiq 24HD has three LEDs on the left side of the tablet and
+three LEDs on the right side of the tablet. Switching to LED 0,
+1, or 2 will enable the top, middle, or bottom LED for the respective
+side. Switching to LED 3 turns off the LEDs on the respective side.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ Documentation/ABI/testing/sysfs-driver-wacom |   17 +++++++++--------
+ drivers/input/tablet/wacom_sys.c             |    5 ++++-
+ 2 files changed, 13 insertions(+), 9 deletions(-)
+
+diff --git a/Documentation/ABI/testing/sysfs-driver-wacom b/Documentation/ABI/testing/sysfs-driver-wacom
+index 82d4df136444..0130d6683c14 100644
+--- a/Documentation/ABI/testing/sysfs-driver-wacom
++++ b/Documentation/ABI/testing/sysfs-driver-wacom
+@@ -15,9 +15,9 @@ Contact:	linux-input at vger.kernel.org
+ Description:
+ 		Attribute group for control of the status LEDs and the OLEDs.
+ 		This attribute group is only available for Intuos 4 M, L,
+-		and XL (with LEDs and OLEDs) and Cintiq 21UX2 (LEDs only).
+-		Therefore its presence implicitly signifies the presence of
+-		said LEDs and OLEDs on the tablet device.
++		and XL (with LEDs and OLEDs) and Cintiq 21UX2 and Cintiq 24HD
++		(LEDs only). Therefore its presence implicitly signifies the
++		presence of said LEDs and OLEDs on the tablet device.
+ 
+ What:		/sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status0_luminance
+ Date:		August 2011
+@@ -41,16 +41,17 @@ Date:		August 2011
+ Contact:	linux-input at vger.kernel.org
+ Description:
+ 		Writing to this file sets which one of the four (for Intuos 4)
+-		or of the right four (for Cintiq 21UX2) status LEDs is active (0..3).
+-		The other three LEDs on the same side are always inactive.
++		or of the right four (for Cintiq 21UX2 and Cintiq 24HD) status
++		LEDs is active (0..3). The other three LEDs on the same side are
++		always inactive.
+ 
+ What:		/sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led1_select
+ Date:		September 2011
+ Contact:	linux-input at vger.kernel.org
+ Description:
+-		Writing to this file sets which one of the left four (for Cintiq 21UX2)
+-		status LEDs is active (0..3). The other three LEDs on the left are always
+-		inactive.
++		Writing to this file sets which one of the left four (for Cintiq 21UX2
++		and Cintiq 24HD) status LEDs is active (0..3). The other three LEDs on
++		the left are always inactive.
+ 
+ What:		/sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/buttons_luminance
+ Date:		August 2011
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 2fe21d1a18b7..7e63183a6c68 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -563,7 +563,8 @@ static int wacom_led_control(struct wacom *wacom)
+ 	if (!buf)
+ 		return -ENOMEM;
+ 
+-	if (wacom->wacom_wac.features.type == WACOM_21UX2)
++	if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
++	    wacom->wacom_wac.features.type == WACOM_24HD)
+ 		led = (wacom->led.select[1] << 4) | 0x40;
+ 
+ 	led |=  wacom->led.select[0] | 0x4;
+@@ -782,6 +783,7 @@ static int wacom_initialize_leds(struct wacom *wacom)
+ 					   &intuos4_led_attr_group);
+ 		break;
+ 
++	case WACOM_24HD:
+ 	case WACOM_21UX2:
+ 		wacom->led.select[0] = 0;
+ 		wacom->led.select[1] = 0;
+@@ -816,6 +818,7 @@ static void wacom_destroy_leds(struct wacom *wacom)
+ 				   &intuos4_led_attr_group);
+ 		break;
+ 
++	case WACOM_24HD:
+ 	case WACOM_21UX2:
+ 		sysfs_remove_group(&wacom->intf->dev.kobj,
+ 				   &cintiq_led_attr_group);
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0010-Input-wacom-use-BTN_TOOL_FINGER-to-indicate-touch-de.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0010-Input-wacom-use-BTN_TOOL_FINGER-to-indicate-touch-de.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,83 @@
+From: Ping Cheng <pinglinux at gmail.com>
+Date: Tue, 31 Jan 2012 00:07:33 -0800
+Subject: Input: wacom - use BTN_TOOL_FINGER to indicate touch device type
+
+commit 8b4a0c1fe3b03c0cfe829413481d69c2e6fd844c upstream.
+
+Tested-by: Chris Bagwell <chris at cnpbagwell.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |    6 +-----
+ drivers/input/tablet/wacom_wac.c |    4 ++--
+ 2 files changed, 3 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 7e63183a6c68..c9588eececfb 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -176,7 +176,7 @@ static int wacom_parse_logical_collection(unsigned char *report,
+ 
+ 		/* Logical collection is only used by 3rd gen Bamboo Touch */
+ 		features->pktlen = WACOM_PKGLEN_BBTOUCH3;
+-		features->device_type = BTN_TOOL_DOUBLETAP;
++		features->device_type = BTN_TOOL_FINGER;
+ 
+ 		/*
+ 		 * Stylus and Touch have same active area
+@@ -286,12 +286,10 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 						if (features->type == TABLETPC2FG) {
+ 							/* need to reset back */
+ 							features->pktlen = WACOM_PKGLEN_TPC2FG;
+-							features->device_type = BTN_TOOL_DOUBLETAP;
+ 						}
+ 						if (features->type == BAMBOO_PT) {
+ 							/* need to reset back */
+ 							features->pktlen = WACOM_PKGLEN_BBTOUCH;
+-							features->device_type = BTN_TOOL_DOUBLETAP;
+ 							features->x_phy =
+ 								get_unaligned_le16(&report[i + 5]);
+ 							features->x_max =
+@@ -325,7 +323,6 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 						if (features->type == TABLETPC2FG) {
+ 							/* need to reset back */
+ 							features->pktlen = WACOM_PKGLEN_TPC2FG;
+-							features->device_type = BTN_TOOL_DOUBLETAP;
+ 							features->y_max =
+ 								get_unaligned_le16(&report[i + 3]);
+ 							features->y_phy =
+@@ -334,7 +331,6 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 						} else if (features->type == BAMBOO_PT) {
+ 							/* need to reset back */
+ 							features->pktlen = WACOM_PKGLEN_BBTOUCH;
+-							features->device_type = BTN_TOOL_DOUBLETAP;
+ 							features->y_phy =
+ 								get_unaligned_le16(&report[i + 3]);
+ 							features->y_max =
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 88672ec296c1..3c9f4b8cfe8f 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -1317,7 +1317,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 		break;
+ 
+ 	case TABLETPC2FG:
+-		if (features->device_type == BTN_TOOL_DOUBLETAP) {
++		if (features->device_type == BTN_TOOL_FINGER) {
+ 
+ 			input_mt_init_slots(input_dev, 2);
+ 			input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE,
+@@ -1366,7 +1366,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 
+ 		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+ 
+-		if (features->device_type == BTN_TOOL_DOUBLETAP) {
++		if (features->device_type == BTN_TOOL_FINGER) {
+ 			__set_bit(BTN_LEFT, input_dev->keybit);
+ 			__set_bit(BTN_FORWARD, input_dev->keybit);
+ 			__set_bit(BTN_BACK, input_dev->keybit);
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0011-Input-wacom-use-switch-statement-for-wacom_tpc_irq.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0011-Input-wacom-use-switch-statement-for-wacom_tpc_irq.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,69 @@
+From: Ping Cheng <pinglinux at gmail.com>
+Date: Tue, 31 Jan 2012 00:07:33 -0800
+Subject: Input: wacom - use switch statement for wacom_tpc_irq()
+
+commit 31175a8348af76aea2f557857c90467d13632dc3 upstream.
+
+And add two new data formats.
+
+Tested-by: Chris Bagwell <chris at cnpbagwell.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |   24 ++++++++++++++++++------
+ drivers/input/tablet/wacom_wac.h |    2 ++
+ 2 files changed, 20 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 3c9f4b8cfe8f..07a1f218b5c1 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -832,12 +832,24 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
+ 
+ 	dbg("wacom_tpc_irq: received report #%d", data[0]);
+ 
+-	if (len == WACOM_PKGLEN_TPC1FG || data[0] == WACOM_REPORT_TPC1FG)
+-		return wacom_tpc_single_touch(wacom, len);
+-	else if (data[0] == WACOM_REPORT_TPC2FG)
+-		return wacom_tpc_mt_touch(wacom);
+-	else if (data[0] == WACOM_REPORT_PENABLED)
+-		return wacom_tpc_pen(wacom);
++	switch (len) {
++	case WACOM_PKGLEN_TPC1FG:
++		 return wacom_tpc_single_touch(wacom, len);
++
++	case WACOM_PKGLEN_TPC2FG:
++ 		return wacom_tpc_mt_touch(wacom);
++
++	default:
++		switch (data[0]) {
++		case WACOM_REPORT_TPC1FG:
++		case WACOM_REPORT_TPCHID:
++		case WACOM_REPORT_TPCST:
++			return wacom_tpc_single_touch(wacom, len);
++
++		case WACOM_REPORT_PENABLED:
++			return wacom_tpc_pen(wacom);
++		}
++	}
+ 
+ 	return 0;
+ }
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 050acaefee7d..4f0ba21b0196 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -39,6 +39,8 @@
+ #define WACOM_REPORT_INTUOSPAD		12
+ #define WACOM_REPORT_TPC1FG		6
+ #define WACOM_REPORT_TPC2FG		13
++#define WACOM_REPORT_TPCHID		15
++#define WACOM_REPORT_TPCST		16
+ 
+ /* device quirks */
+ #define WACOM_QUIRK_MULTI_INPUT		0x0001
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0012-Input-wacom-add-missing-LEDS_CLASS-to-Kconfig.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0012-Input-wacom-add-missing-LEDS_CLASS-to-Kconfig.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,29 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Wed, 8 Feb 2012 23:08:48 -0800
+Subject: Input: wacom - add missing LEDS_CLASS to Kconfig
+
+commit 68513a4c5fe68938350cf2c56d97946e49f014e1 upstream.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/Kconfig |    2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/input/tablet/Kconfig b/drivers/input/tablet/Kconfig
+index 58a87755b936..e53f4081a586 100644
+--- a/drivers/input/tablet/Kconfig
++++ b/drivers/input/tablet/Kconfig
+@@ -77,6 +77,8 @@ config TABLET_USB_WACOM
+ 	tristate "Wacom Intuos/Graphire tablet support (USB)"
+ 	depends on USB_ARCH_HAS_HCD
+ 	select USB
++	select NEW_LEDS
++	select LEDS_CLASS
+ 	help
+ 	  Say Y here if you want to use the USB version of the Wacom Intuos
+ 	  or Graphire tablet.  Make sure to say Y to "Mouse support"
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0013-Input-wacom-fix-3rd-gen-Bamboo-MT-when-4-fingers-are.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0013-Input-wacom-fix-3rd-gen-Bamboo-MT-when-4-fingers-are.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,32 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Tue, 6 Mar 2012 10:19:19 -0800
+Subject: Input: wacom - fix 3rd-gen Bamboo MT when 4+ fingers are in use
+
+commit 19d57d3a145e94349abf805eed2316ef720d86c2 upstream.
+
+The message count field uses three bits of storage, not two.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Acked-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 07a1f218b5c1..89a96427faa0 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -938,7 +938,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
+ {
+ 	struct input_dev *input = wacom->input;
+ 	unsigned char *data = wacom->data;
+-	int count = data[1] & 0x03;
++	int count = data[1] & 0x07;
+ 	int i;
+ 
+ 	if (data[0] != 0x02)
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0014-Input-wacom-fix-physical-size-calculation-for-3rd-ge.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0014-Input-wacom-fix-physical-size-calculation-for-3rd-ge.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,42 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Mon, 12 Mar 2012 22:15:43 -0700
+Subject: Input: wacom - fix physical size calculation for 3rd-gen Bamboo
+
+commit 24e3e5ae1e4c2a3a32f5b1f96b4e3fd721806acd upstream.
+
+This calculation determines the physical dimensions of the tablet,
+used later on in calculate_touch_res to obtain the touch sensor
+resolution.
+
+Instead of dividing the logical size by the resolution, the current
+code performs a multiplication. This doesn't pose a problem for the
+3rd-gen Bamboo since the resolution and scale factor happen to be
+identical, but will produce an incorrect result for other cases.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index c9588eececfb..dc07821fdae3 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -184,9 +184,9 @@ static int wacom_parse_logical_collection(unsigned char *report,
+ 		 * data before its overwritten.
+ 		 */
+ 		features->x_phy =
+-			(features->x_max * features->x_resolution) / 100;
++			(features->x_max * 100) / features->x_resolution;
+ 		features->y_phy =
+-			(features->y_max * features->y_resolution) / 100;
++			(features->y_max * 100) / features->y_resolution;
+ 
+ 		features->x_max = features->y_max =
+ 			get_unaligned_le16(&report[10]);
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0015-Input-wacom-isolate-input-registration.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0015-Input-wacom-isolate-input-registration.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,127 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Sun, 25 Mar 2012 23:25:45 -0700
+Subject: Input: wacom - isolate input registration
+
+commit 3aac0ef10bf5c76ba4262cfd9b044a6c067d5aae upstream.
+
+Although this better co-locates input registration logic,
+the main goal is to make it easier to optionally create
+input devices or delay creation to later time periods.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Tested-by: Jason Gerecke <killertofu at gmail.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |   53 ++++++++++++++++++++++++--------------
+ 1 file changed, 33 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index dc07821fdae3..59a42e23ddfa 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -822,6 +822,37 @@ static void wacom_destroy_leds(struct wacom *wacom)
+ 	}
+ }
+ 
++static int wacom_register_input(struct wacom *wacom)
++{
++	struct input_dev *input_dev;
++	struct usb_interface *intf = wacom->intf;
++	struct usb_device *dev = interface_to_usbdev(intf);
++	struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
++	int error;
++
++	input_dev = input_allocate_device();
++	if (!input_dev)
++		return -ENOMEM;
++
++	input_dev->name = wacom_wac->name;
++	input_dev->dev.parent = &intf->dev;
++	input_dev->open = wacom_open;
++	input_dev->close = wacom_close;
++	usb_to_input_id(dev, &input_dev->id);
++	input_set_drvdata(input_dev, wacom);
++
++	wacom_wac->input = input_dev;
++	wacom_setup_input_capabilities(input_dev, wacom_wac);
++
++	error = input_register_device(input_dev);
++	if (error) {
++		input_free_device(input_dev);
++		wacom_wac->input = NULL;
++	}
++
++	return error;
++}
++
+ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
+ {
+ 	struct usb_device *dev = interface_to_usbdev(intf);
+@@ -829,18 +860,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	struct wacom *wacom;
+ 	struct wacom_wac *wacom_wac;
+ 	struct wacom_features *features;
+-	struct input_dev *input_dev;
+ 	int error;
+ 
+ 	if (!id->driver_info)
+ 		return -EINVAL;
+ 
+ 	wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
+-	input_dev = input_allocate_device();
+-	if (!wacom || !input_dev) {
+-		error = -ENOMEM;
+-		goto fail1;
+-	}
+ 
+ 	wacom_wac = &wacom->wacom_wac;
+ 	wacom_wac->features = *((struct wacom_features *)id->driver_info);
+@@ -869,8 +894,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
+ 	strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
+ 
+-	wacom_wac->input = input_dev;
+-
+ 	endpoint = &intf->cur_altsetting->endpoint[0].desc;
+ 
+ 	/* Retrieve the physical and logical size for OEM devices */
+@@ -894,15 +917,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 			goto fail3;
+ 	}
+ 
+-	input_dev->name = wacom_wac->name;
+-	input_dev->dev.parent = &intf->dev;
+-	input_dev->open = wacom_open;
+-	input_dev->close = wacom_close;
+-	usb_to_input_id(dev, &input_dev->id);
+-	input_set_drvdata(input_dev, wacom);
+-
+-	wacom_setup_input_capabilities(input_dev, wacom_wac);
+-
+ 	usb_fill_int_urb(wacom->irq, dev,
+ 			 usb_rcvintpipe(dev, endpoint->bEndpointAddress),
+ 			 wacom_wac->data, features->pktlen,
+@@ -914,7 +928,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	if (error)
+ 		goto fail4;
+ 
+-	error = input_register_device(input_dev);
++	error = wacom_register_input(wacom);
+ 	if (error)
+ 		goto fail5;
+ 
+@@ -928,8 +942,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+  fail4:	wacom_remove_shared_data(wacom_wac);
+  fail3:	usb_free_urb(wacom->irq);
+  fail2:	usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma);
+- fail1:	input_free_device(input_dev);
+-	kfree(wacom);
++ fail1:	kfree(wacom);
+ 	return error;
+ }
+ 
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0016-Input-wacom-check-for-allocation-failure-in-probe.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0016-Input-wacom-check-for-allocation-failure-in-probe.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,33 @@
+From: Dan Carpenter <dan.carpenter at oracle.com>
+Date: Thu, 29 Mar 2012 22:38:11 -0700
+Subject: Input: wacom - check for allocation failure in probe()
+
+commit f182394033d639679264d61e6dca62761e659ff7 upstream.
+
+We accidentally removed the check for NULL in 3aac0ef10b "Input: wacom -
+isolate input registration".
+
+Signed-off-by: Dan Carpenter <dan.carpenter at oracle.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 59a42e23ddfa..bf2462132c5c 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -866,6 +866,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 		return -EINVAL;
+ 
+ 	wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
++	if (!wacom)
++		return -ENOMEM;
+ 
+ 	wacom_wac = &wacom->wacom_wac;
+ 	wacom_wac->features = *((struct wacom_features *)id->driver_info);
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0017-Input-wacom-wireless-monitor-framework.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0017-Input-wacom-wireless-monitor-framework.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,219 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Sun, 25 Mar 2012 23:26:11 -0700
+Subject: Input: wacom - wireless monitor framework
+
+commit d3825d51c3eddb8a3c7d1281f27181aff6db19b8 upstream.
+
+The 3rd gen Bamboo Pen & Touch and Intuos5 tablets support an
+optional wireless module. When its receiver is plugged into USB,
+it presents 3 interfaces: 0) Monitor 1) Pen and 2) Touch.
+
+The exact capabilities of the Pen and Touch interfaces can
+not be determined until a tablet connection is established
+and reported over the Monitor interface.
+
+This patch detects this wireless receiver and enables interrupt
+packets to be processed for the Monitor interface. Processing
+the data in packets will be left to another patch.
+
+Since it doesn't make sense to create an input device for the
+Monitor interface, it is not created. Creation of Pen and Touch
+input device is also delayed until monitor packets can be processed.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Tested-by: Jason Gerecke <killertofu at gmail.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |   36 +++++++++++++++++++++++++++++++-----
+ drivers/input/tablet/wacom_wac.c |   28 +++++++++++++++++++++++++++-
+ drivers/input/tablet/wacom_wac.h |    4 ++++
+ 3 files changed, 62 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index bf2462132c5c..223246575860 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -422,6 +422,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
+ 						report_id, rep_data, 4, 1);
+ 		} while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES);
+ 	} else if (features->type != TABLETPC &&
++		   features->type != WIRELESS &&
+ 		   features->device_type == BTN_TOOL_PEN) {
+ 		do {
+ 			rep_data[0] = 2;
+@@ -454,6 +455,21 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ 	features->pressure_fuzz = 0;
+ 	features->distance_fuzz = 0;
+ 
++	/*
++	 * The wireless device HID is basic and layout conflicts with
++	 * other tablets (monitor and touch interface can look like pen).
++	 * Skip the query for this type and modify defaults based on
++	 * interface number.
++	 */
++	if (features->type == WIRELESS) {
++		if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
++			features->device_type = 0;
++		} else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) {
++			features->device_type = BTN_TOOL_DOUBLETAP;
++			features->pktlen = WACOM_PKGLEN_BBTOUCH3;
++		}
++	}
++
+ 	/* only Tablet PCs and Bamboo P&T need to retrieve the info */
+ 	if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
+ 	    (features->type != BAMBOO_PT))
+@@ -930,14 +946,22 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	if (error)
+ 		goto fail4;
+ 
+-	error = wacom_register_input(wacom);
+-	if (error)
+-		goto fail5;
++	if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
++		error = wacom_register_input(wacom);
++		if (error)
++			goto fail5;
++	}
+ 
+ 	/* Note that if query fails it is not a hard failure */
+ 	wacom_query_tablet_data(intf, features);
+ 
+ 	usb_set_intfdata(intf, wacom);
++
++	if (features->quirks & WACOM_QUIRK_MONITOR) {
++		if (usb_submit_urb(wacom->irq, GFP_KERNEL))
++			goto fail5;
++	}
++
+ 	return 0;
+ 
+  fail5: wacom_destroy_leds(wacom);
+@@ -955,7 +979,8 @@ static void wacom_disconnect(struct usb_interface *intf)
+ 	usb_set_intfdata(intf, NULL);
+ 
+ 	usb_kill_urb(wacom->irq);
+-	input_unregister_device(wacom->wacom_wac.input);
++	if (wacom->wacom_wac.input)
++		input_unregister_device(wacom->wacom_wac.input);
+ 	wacom_destroy_leds(wacom);
+ 	usb_free_urb(wacom->irq);
+ 	usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX,
+@@ -987,7 +1012,8 @@ static int wacom_resume(struct usb_interface *intf)
+ 	wacom_query_tablet_data(intf, features);
+ 	wacom_led_control(wacom);
+ 
+-	if (wacom->open && usb_submit_urb(wacom->irq, GFP_NOIO) < 0)
++	if ((wacom->open || features->quirks & WACOM_QUIRK_MONITOR)
++	     && usb_submit_urb(wacom->irq, GFP_NOIO) < 0)
+ 		rv = -EIO;
+ 
+ 	mutex_unlock(&wacom->lock);
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 89a96427faa0..8b73b05f5aef 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -1044,6 +1044,14 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ 	return 0;
+ }
+ 
++static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
++{
++	if (len != WACOM_PKGLEN_WIRELESS)
++		return 0;
++
++	return 0;
++}
++
+ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ {
+ 	bool sync;
+@@ -1094,6 +1102,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ 		sync = wacom_bpt_irq(wacom_wac, len);
+ 		break;
+ 
++	case WIRELESS:
++		sync = wacom_wireless_irq(wacom_wac, len);
++		break;
++
+ 	default:
+ 		sync = false;
+ 		break;
+@@ -1155,7 +1167,7 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ 
+ 	/* these device have multiple inputs */
+ 	if (features->type == TABLETPC || features->type == TABLETPC2FG ||
+-	    features->type == BAMBOO_PT)
++	    features->type == BAMBOO_PT || features->type == WIRELESS)
+ 		features->quirks |= WACOM_QUIRK_MULTI_INPUT;
+ 
+ 	/* quirk for bamboo touch with 2 low res touches */
+@@ -1167,6 +1179,16 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ 		features->y_fuzz <<= 5;
+ 		features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
+ 	}
++
++	if (features->type == WIRELESS) {
++
++		/* monitor never has input and pen/touch have delayed create */
++		features->quirks |= WACOM_QUIRK_NO_INPUT;
++
++		/* must be monitor interface if no device_type set */
++		if (!features->device_type)
++			features->quirks |= WACOM_QUIRK_MONITOR;
++	}
+ }
+ 
+ static unsigned int wacom_calculate_touch_res(unsigned int logical_max,
+@@ -1640,6 +1662,9 @@ static const struct wacom_features wacom_features_0xEC =
+ 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 };
++static const struct wacom_features wacom_features_0x84 =
++	{ "Wacom Wireless Receiver", WACOM_PKGLEN_WIRELESS, 0, 0, 0,
++	  0, WIRELESS, 0, 0 };
+ static const struct wacom_features wacom_features_0xD0 =
+ 	{ "Wacom Bamboo 2FG",     WACOM_PKGLEN_BBFUN,     14720,  9200, 1023,
+ 	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+@@ -1766,6 +1791,7 @@ const struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE_DETAILED(0xCE, USB_CLASS_HID,
+ 			      USB_INTERFACE_SUBCLASS_BOOT,
+ 			      USB_INTERFACE_PROTOCOL_MOUSE) },
++	{ USB_DEVICE_WACOM(0x84) },
+ 	{ USB_DEVICE_WACOM(0xD0) },
+ 	{ USB_DEVICE_WACOM(0xD1) },
+ 	{ USB_DEVICE_WACOM(0xD2) },
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 4f0ba21b0196..2c04b6248a56 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -24,6 +24,7 @@
+ #define WACOM_PKGLEN_BBTOUCH	20
+ #define WACOM_PKGLEN_BBTOUCH3	64
+ #define WACOM_PKGLEN_BBPEN	10
++#define WACOM_PKGLEN_WIRELESS	32
+ 
+ /* device IDs */
+ #define STYLUS_DEVICE_ID	0x02
+@@ -45,6 +46,8 @@
+ /* device quirks */
+ #define WACOM_QUIRK_MULTI_INPUT		0x0001
+ #define WACOM_QUIRK_BBTOUCH_LOWRES	0x0002
++#define WACOM_QUIRK_NO_INPUT		0x0004
++#define WACOM_QUIRK_MONITOR		0x0008
+ 
+ enum {
+ 	PENPARTNER = 0,
+@@ -54,6 +57,7 @@ enum {
+ 	PL,
+ 	DTU,
+ 	BAMBOO_PT,
++	WIRELESS,
+ 	INTUOS,
+ 	INTUOS3S,
+ 	INTUOS3,
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0018-Input-wacom-create-inputs-when-wireless-connect.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0018-Input-wacom-create-inputs-when-wireless-connect.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,234 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Sun, 25 Mar 2012 23:26:20 -0700
+Subject: Input: wacom - create inputs when wireless connect
+
+commit 16bf288c4be67b68c3fcb6561ff145702cb7bd22 upstream.
+
+When a tablet connect or disconnect is detected, schedule
+work queue to register or unregister related input devices.
+
+When a wireless tablet connects, it reports same USB PID
+used if tablet is connected with USB cable. Use this to
+update features values, set input capabilities, and then
+register device.  From there, the Pen and Touch interfaces
+will reuse the existing tablet's IRQ routines.
+
+Its possible that 1 receiver is shared with 2 tablets with
+different PID (small and medium Bamboo for example) so the
+input is unregister at disconnect to better support this case.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Tested-by: Jason Gerecke <killertofu at gmail.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom.h     |    7 +++
+ drivers/input/tablet/wacom_sys.c |   91 ++++++++++++++++++++++++++++++++++----
+ drivers/input/tablet/wacom_wac.c |   20 ++++++++-
+ drivers/input/tablet/wacom_wac.h |    1 +
+ 4 files changed, 109 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
+index 0783864a7dc2..febbfd9f3a84 100644
+--- a/drivers/input/tablet/wacom.h
++++ b/drivers/input/tablet/wacom.h
+@@ -112,6 +112,7 @@ struct wacom {
+ 	struct urb *irq;
+ 	struct wacom_wac wacom_wac;
+ 	struct mutex lock;
++	struct work_struct work;
+ 	bool open;
+ 	char phys[32];
+ 	struct wacom_led {
+@@ -122,6 +123,12 @@ struct wacom {
+ 	} led;
+ };
+ 
++static inline void wacom_schedule_work(struct wacom_wac *wacom_wac)
++{
++	struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
++	schedule_work(&wacom->work);
++}
++
+ extern const struct usb_device_id wacom_ids[];
+ 
+ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 223246575860..1bcf555ff340 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -167,6 +167,19 @@ static void wacom_close(struct input_dev *dev)
+ 		usb_autopm_put_interface(wacom->intf);
+ }
+ 
++/*
++ * Static values for max X/Y and resolution of Pen interface is stored in
++ * features. This mean physical size of active area can be computed.
++ * This is useful to do when Pen and Touch have same active area of tablet.
++ * This means for Touch device, we only need to find max X/Y value and we
++ * have enough information to compute resolution of touch.
++ */
++static void wacom_set_phy_from_res(struct wacom_features *features)
++{
++	features->x_phy = (features->x_max * 100) / features->x_resolution;
++	features->y_phy = (features->y_max * 100) / features->y_resolution;
++}
++
+ static int wacom_parse_logical_collection(unsigned char *report,
+ 					  struct wacom_features *features)
+ {
+@@ -178,15 +191,7 @@ static int wacom_parse_logical_collection(unsigned char *report,
+ 		features->pktlen = WACOM_PKGLEN_BBTOUCH3;
+ 		features->device_type = BTN_TOOL_FINGER;
+ 
+-		/*
+-		 * Stylus and Touch have same active area
+-		 * so compute physical size based on stylus
+-		 * data before its overwritten.
+-		 */
+-		features->x_phy =
+-			(features->x_max * 100) / features->x_resolution;
+-		features->y_phy =
+-			(features->y_max * 100) / features->y_resolution;
++		wacom_set_phy_from_res(features);
+ 
+ 		features->x_max = features->y_max =
+ 			get_unaligned_le16(&report[10]);
+@@ -869,6 +874,72 @@ static int wacom_register_input(struct wacom *wacom)
+ 	return error;
+ }
+ 
++static void wacom_wireless_work(struct work_struct *work)
++{
++	struct wacom *wacom = container_of(work, struct wacom, work);
++	struct usb_device *usbdev = wacom->usbdev;
++	struct wacom_wac *wacom_wac = &wacom->wacom_wac;
++
++	/*
++	 * Regardless if this is a disconnect or a new tablet,
++	 * remove any existing input devices.
++	 */
++
++	/* Stylus interface */
++	wacom = usb_get_intfdata(usbdev->config->interface[1]);
++	if (wacom->wacom_wac.input)
++		input_unregister_device(wacom->wacom_wac.input);
++	wacom->wacom_wac.input = 0;
++
++	/* Touch interface */
++	wacom = usb_get_intfdata(usbdev->config->interface[2]);
++	if (wacom->wacom_wac.input)
++		input_unregister_device(wacom->wacom_wac.input);
++	wacom->wacom_wac.input = 0;
++
++	if (wacom_wac->pid == 0) {
++		printk(KERN_INFO "wacom: wireless tablet disconnected\n");
++	} else {
++		const struct usb_device_id *id = wacom_ids;
++
++		printk(KERN_INFO
++		       "wacom: wireless tablet connected with PID %x\n",
++		       wacom_wac->pid);
++
++		while (id->match_flags) {
++			if (id->idVendor == USB_VENDOR_ID_WACOM &&
++			    id->idProduct == wacom_wac->pid)
++				break;
++			id++;
++		}
++
++		if (!id->match_flags) {
++			printk(KERN_INFO
++			       "wacom: ignorning unknown PID.\n");
++			return;
++		}
++
++		/* Stylus interface */
++		wacom = usb_get_intfdata(usbdev->config->interface[1]);
++		wacom_wac = &wacom->wacom_wac;
++		wacom_wac->features =
++			*((struct wacom_features *)id->driver_info);
++		wacom_wac->features.device_type = BTN_TOOL_PEN;
++		wacom_register_input(wacom);
++
++		/* Touch interface */
++		wacom = usb_get_intfdata(usbdev->config->interface[2]);
++		wacom_wac = &wacom->wacom_wac;
++		wacom_wac->features =
++			*((struct wacom_features *)id->driver_info);
++		wacom_wac->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
++		wacom_wac->features.device_type = BTN_TOOL_FINGER;
++		wacom_set_phy_from_res(&wacom_wac->features);
++		wacom_wac->features.x_max = wacom_wac->features.y_max = 4096;
++		wacom_register_input(wacom);
++	}
++}
++
+ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
+ {
+ 	struct usb_device *dev = interface_to_usbdev(intf);
+@@ -909,6 +980,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	wacom->usbdev = dev;
+ 	wacom->intf = intf;
+ 	mutex_init(&wacom->lock);
++	INIT_WORK(&wacom->work, wacom_wireless_work);
+ 	usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
+ 	strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
+ 
+@@ -979,6 +1051,7 @@ static void wacom_disconnect(struct usb_interface *intf)
+ 	usb_set_intfdata(intf, NULL);
+ 
+ 	usb_kill_urb(wacom->irq);
++	cancel_work_sync(&wacom->work);
+ 	if (wacom->wacom_wac.input)
+ 		input_unregister_device(wacom->wacom_wac.input);
+ 	wacom_destroy_leds(wacom);
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 8b73b05f5aef..1013ac345781 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -1046,9 +1046,27 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ 
+ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
+ {
+-	if (len != WACOM_PKGLEN_WIRELESS)
++	unsigned char *data = wacom->data;
++	int connected;
++
++	if (len != WACOM_PKGLEN_WIRELESS || data[0] != 0x80)
+ 		return 0;
+ 
++	connected = data[1] & 0x01;
++	if (connected) {
++		int pid;
++
++		pid = get_unaligned_be16(&data[6]);
++		if (wacom->pid != pid) {
++			wacom->pid = pid;
++			wacom_schedule_work(wacom);
++		}
++	} else if (wacom->pid != 0) {
++		/* disconnected while previously connected */
++		wacom->pid = 0;
++		wacom_schedule_work(wacom);
++	}
++
+ 	return 0;
+ }
+ 
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 2c04b6248a56..cffaf6b7e6e9 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -111,6 +111,7 @@ struct wacom_wac {
+ 	struct wacom_features features;
+ 	struct wacom_shared *shared;
+ 	struct input_dev *input;
++	int pid;
+ };
+ 
+ #endif
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0019-Input-wacom-wireless-battery-status.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0019-Input-wacom-wireless-battery-status.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,184 @@
+From: Chris Bagwell <chris at cnpbagwell.com>
+Date: Sun, 25 Mar 2012 23:26:30 -0700
+Subject: Input: wacom - wireless battery status
+
+commit a1d552cc15b0be9124ccba593f99f59c4ec1e153 upstream.
+
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Tested-by: Jason Gerecke <killertofu at gmail.com>
+Acked-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/Kconfig     |    1 +
+ drivers/input/tablet/wacom.h     |    2 ++
+ drivers/input/tablet/wacom_sys.c |   57 +++++++++++++++++++++++++++++++++++++-
+ drivers/input/tablet/wacom_wac.c |    5 +++-
+ drivers/input/tablet/wacom_wac.h |    1 +
+ 5 files changed, 64 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/input/tablet/Kconfig b/drivers/input/tablet/Kconfig
+index e53f4081a586..bed7cbf84cfd 100644
+--- a/drivers/input/tablet/Kconfig
++++ b/drivers/input/tablet/Kconfig
+@@ -76,6 +76,7 @@ config TABLET_USB_KBTAB
+ config TABLET_USB_WACOM
+ 	tristate "Wacom Intuos/Graphire tablet support (USB)"
+ 	depends on USB_ARCH_HAS_HCD
++	select POWER_SUPPLY
+ 	select USB
+ 	select NEW_LEDS
+ 	select LEDS_CLASS
+diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
+index febbfd9f3a84..b4842d0e61dd 100644
+--- a/drivers/input/tablet/wacom.h
++++ b/drivers/input/tablet/wacom.h
+@@ -88,6 +88,7 @@
+ #include <linux/mod_devicetable.h>
+ #include <linux/init.h>
+ #include <linux/usb/input.h>
++#include <linux/power_supply.h>
+ #include <asm/unaligned.h>
+ 
+ /*
+@@ -121,6 +122,7 @@ struct wacom {
+ 		u8 hlv;       /* status led brightness button pressed (1..127) */
+ 		u8 img_lum;   /* OLED matrix display brightness */
+ 	} led;
++	struct power_supply battery;
+ };
+ 
+ static inline void wacom_schedule_work(struct wacom_wac *wacom_wac)
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 1bcf555ff340..8a5fad186140 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -843,6 +843,55 @@ static void wacom_destroy_leds(struct wacom *wacom)
+ 	}
+ }
+ 
++static enum power_supply_property wacom_battery_props[] = {
++	POWER_SUPPLY_PROP_CAPACITY
++};
++
++static int wacom_battery_get_property(struct power_supply *psy,
++				      enum power_supply_property psp,
++				      union power_supply_propval *val)
++{
++	struct wacom *wacom = container_of(psy, struct wacom, battery);
++	int ret = 0;
++
++	switch (psp) {
++		case POWER_SUPPLY_PROP_CAPACITY:
++			val->intval =
++				wacom->wacom_wac.battery_capacity * 100 / 31;
++			break;
++		default:
++			ret = -EINVAL;
++			break;
++	}
++
++	return ret;
++}
++
++static int wacom_initialize_battery(struct wacom *wacom)
++{
++	int error = 0;
++
++	if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR) {
++		wacom->battery.properties = wacom_battery_props;
++		wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props);
++		wacom->battery.get_property = wacom_battery_get_property;
++		wacom->battery.name = "wacom_battery";
++		wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY;
++		wacom->battery.use_for_apm = 0;
++
++		error = power_supply_register(&wacom->usbdev->dev,
++					      &wacom->battery);
++	}
++
++	return error;
++}
++
++static void wacom_destroy_battery(struct wacom *wacom)
++{
++	if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR)
++		power_supply_unregister(&wacom->battery);
++}
++
+ static int wacom_register_input(struct wacom *wacom)
+ {
+ 	struct input_dev *input_dev;
+@@ -1018,10 +1067,14 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	if (error)
+ 		goto fail4;
+ 
++	error = wacom_initialize_battery(wacom);
++	if (error)
++		goto fail5;
++
+ 	if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
+ 		error = wacom_register_input(wacom);
+ 		if (error)
+-			goto fail5;
++			goto fail6;
+ 	}
+ 
+ 	/* Note that if query fails it is not a hard failure */
+@@ -1036,6 +1089,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 
+ 	return 0;
+ 
++ fail6: wacom_destroy_battery(wacom);
+  fail5: wacom_destroy_leds(wacom);
+  fail4:	wacom_remove_shared_data(wacom_wac);
+  fail3:	usb_free_urb(wacom->irq);
+@@ -1054,6 +1108,7 @@ static void wacom_disconnect(struct usb_interface *intf)
+ 	cancel_work_sync(&wacom->work);
+ 	if (wacom->wacom_wac.input)
+ 		input_unregister_device(wacom->wacom_wac.input);
++	wacom_destroy_battery(wacom);
+ 	wacom_destroy_leds(wacom);
+ 	usb_free_urb(wacom->irq);
+ 	usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX,
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 1013ac345781..cecd35c8f0b3 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -1054,17 +1054,20 @@ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
+ 
+ 	connected = data[1] & 0x01;
+ 	if (connected) {
+-		int pid;
++		int pid, battery;
+ 
+ 		pid = get_unaligned_be16(&data[6]);
++		battery = data[5] & 0x3f;
+ 		if (wacom->pid != pid) {
+ 			wacom->pid = pid;
+ 			wacom_schedule_work(wacom);
+ 		}
++		wacom->battery_capacity = battery;
+ 	} else if (wacom->pid != 0) {
+ 		/* disconnected while previously connected */
+ 		wacom->pid = 0;
+ 		wacom_schedule_work(wacom);
++		wacom->battery_capacity = 0;
+ 	}
+ 
+ 	return 0;
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index cffaf6b7e6e9..ba5a334e54d6 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -112,6 +112,7 @@ struct wacom_wac {
+ 	struct wacom_shared *shared;
+ 	struct input_dev *input;
+ 	int pid;
++	int battery_capacity;
+ };
+ 
+ #endif
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0020-Input-wacom-add-basic-Intuos5-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0020-Input-wacom-add-basic-Intuos5-support.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,139 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Tue, 3 Apr 2012 15:47:22 -0700
+Subject: Input: wacom - add basic Intuos5 support
+
+commit 9fee619505bdb202c9f54b58ec996884160cdbf2 upstream.
+
+This patch adds support for the basic pen functions of Intuos5
+tablets.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Reviewed-by: Ping Cheng <pingc at wacom.com>
+Tested-by: Timo Aaltonen <tjaalton at ubuntu.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |   36 +++++++++++++++++++++++++++++++++---
+ drivers/input/tablet/wacom_wac.h |    3 +++
+ 2 files changed, 36 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index cecd35c8f0b3..f159e9d90d4a 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -452,6 +452,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
+ 	if ((data[1] & 0xb8) == 0xa0) {
+ 		t = (data[6] << 2) | ((data[7] >> 6) & 3);
+ 		if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
++                    (features->type >= INTUOS5S && features->type <= INTUOS5L) ||
+ 		    features->type == WACOM_21UX2 || features->type == WACOM_24HD) {
+ 			t = (t << 1) | (data[1] & 1);
+ 		}
+@@ -632,7 +633,9 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 	    (features->type == INTUOS3 ||
+ 	     features->type == INTUOS3S ||
+ 	     features->type == INTUOS4 ||
+-	     features->type == INTUOS4S)) {
++	     features->type == INTUOS4S ||
++	     features->type == INTUOS5 ||
++	     features->type == INTUOS5S)) {
+ 
+ 		return 0;
+ 	}
+@@ -685,7 +688,8 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 
+ 		} else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
+ 			/* I4 mouse */
+-			if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
++			if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
++			    (features->type >= INTUOS5S && features->type <= INTUOS5L)) {
+ 				input_report_key(input, BTN_LEFT,   data[6] & 0x01);
+ 				input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
+ 				input_report_key(input, BTN_RIGHT,  data[6] & 0x04);
+@@ -712,7 +716,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 				}
+ 			}
+ 		} else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
+-				features->type == INTUOS4L) &&
++				features->type == INTUOS4L || features->type == INTUOS5L) &&
+ 			   wacom->tool[idx] == BTN_TOOL_LENS) {
+ 			/* Lens cursor packets */
+ 			input_report_key(input, BTN_LEFT,   data[8] & 0x01);
+@@ -1107,6 +1111,9 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ 	case INTUOS4S:
+ 	case INTUOS4:
+ 	case INTUOS4L:
++	case INTUOS5S:
++	case INTUOS5:
++	case INTUOS5L:
+ 	case CINTIQ:
+ 	case WACOM_BEE:
+ 	case WACOM_21UX2:
+@@ -1355,12 +1362,15 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 		wacom_setup_intuos(wacom_wac);
+ 		break;
+ 
++	case INTUOS5:
++	case INTUOS5L:
+ 	case INTUOS4:
+ 	case INTUOS4L:
+ 		__set_bit(BTN_7, input_dev->keybit);
+ 		__set_bit(BTN_8, input_dev->keybit);
+ 		/* fall through */
+ 
++	case INTUOS5S:
+ 	case INTUOS4S:
+ 		for (i = 0; i < 7; i++)
+ 			__set_bit(BTN_0 + i, input_dev->keybit);
+@@ -1629,6 +1639,21 @@ static const struct wacom_features wacom_features_0xBB =
+ static const struct wacom_features wacom_features_0xBC =
+ 	{ "Wacom Intuos4 WL",     WACOM_PKGLEN_INTUOS,    40840, 25400, 2047,
+ 	  63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++static const struct wacom_features wacom_features_0x26 =
++	{ "Wacom Intuos5 touch S", WACOM_PKGLEN_INTUOS,  31496, 19685, 2047,
++	  63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++static const struct wacom_features wacom_features_0x27 =
++	{ "Wacom Intuos5 touch M", WACOM_PKGLEN_INTUOS,  44704, 27940, 2047,
++	  63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++static const struct wacom_features wacom_features_0x28 =
++	{ "Wacom Intuos5 touch L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047,
++	  63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++static const struct wacom_features wacom_features_0x29 =
++	{ "Wacom Intuos5 S", WACOM_PKGLEN_INTUOS,  31496, 19685, 2047,
++	  63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++static const struct wacom_features wacom_features_0x2A =
++	{ "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS,  44704, 27940, 2047,
++	  63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+ static const struct wacom_features wacom_features_0xF4 =
+ 	{ "Wacom Cintiq 24HD",    WACOM_PKGLEN_INTUOS,   104480, 65600, 2047,
+ 	  63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+@@ -1801,6 +1826,11 @@ const struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE_WACOM(0xBA) },
+ 	{ USB_DEVICE_WACOM(0xBB) },
+ 	{ USB_DEVICE_WACOM(0xBC) },
++	{ USB_DEVICE_WACOM(0x26) },
++	{ USB_DEVICE_WACOM(0x27) },
++	{ USB_DEVICE_WACOM(0x28) },
++	{ USB_DEVICE_WACOM(0x29) },
++	{ USB_DEVICE_WACOM(0x2A) },
+ 	{ USB_DEVICE_WACOM(0x3F) },
+ 	{ USB_DEVICE_WACOM(0xC5) },
+ 	{ USB_DEVICE_WACOM(0xC6) },
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index ba5a334e54d6..0aa00ce5fd7d 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -65,6 +65,9 @@ enum {
+ 	INTUOS4S,
+ 	INTUOS4,
+ 	INTUOS4L,
++	INTUOS5S,
++	INTUOS5,
++	INTUOS5L,
+ 	WACOM_24HD,
+ 	WACOM_21UX2,
+ 	CINTIQ,
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0021-Input-wacom-add-Intuos5-Touch-Ring-ExpressKey-suppor.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0021-Input-wacom-add-Intuos5-Touch-Ring-ExpressKey-suppor.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,93 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Tue, 3 Apr 2012 15:48:35 -0700
+Subject: Input: wacom - add Intuos5 Touch Ring/ExpressKey support
+
+commit f860e581fd473250c6dcbd3e13d576b6197e4694 upstream.
+
+Intuos5 uses a new report type for Touch Ring and ExpressKey data.
+Note that data from the capacitive sensors present on the ExpressKeys
+will be ignored until a proper way is found to expose it.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Reviewed-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_wac.c |   33 +++++++++++++++++++++++++++++++--
+ drivers/input/tablet/wacom_wac.h |    1 +
+ 2 files changed, 32 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index f159e9d90d4a..b5176a073c83 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -484,7 +484,8 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 	int idx = 0, result;
+ 
+ 	if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_INTUOSREAD
+-		&& data[0] != WACOM_REPORT_INTUOSWRITE && data[0] != WACOM_REPORT_INTUOSPAD) {
++		&& data[0] != WACOM_REPORT_INTUOSWRITE && data[0] != WACOM_REPORT_INTUOSPAD
++		&& data[0] != WACOM_REPORT_INTUOS5PAD) {
+ 		dbg("wacom_intuos_irq: received unknown report #%d", data[0]);
+                 return 0;
+ 	}
+@@ -494,7 +495,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 		idx = data[1] & 0x01;
+ 
+ 	/* pad packets. Works as a second tool and is always in prox */
+-	if (data[0] == WACOM_REPORT_INTUOSPAD) {
++	if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD) {
+ 		if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
+ 			input_report_key(input, BTN_0, (data[2] & 0x01));
+ 			input_report_key(input, BTN_1, (data[3] & 0x01));
+@@ -570,6 +571,34 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 				input_report_key(input, wacom->tool[1], 0);
+ 				input_report_abs(input, ABS_MISC, 0);
+ 			}
++		} else if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
++			int i;
++
++			/* Touch ring mode switch has no capacitive sensor */
++			input_report_key(input, BTN_0, (data[3] & 0x01));
++
++			/*
++			 * ExpressKeys on Intuos5 have a capacitive sensor in
++			 * addition to the mechanical switch. Switch data is
++			 * stored in data[4], capacitive data in data[5].
++			 */
++			for (i = 0; i < 8; i++)
++				input_report_key(input, BTN_1 + i, data[4] & (1 << i));
++
++			if (data[2] & 0x80) {
++				input_report_abs(input, ABS_WHEEL, (data[2] & 0x7f));
++			} else {
++				/* Out of proximity, clear wheel value. */
++				input_report_abs(input, ABS_WHEEL, 0);
++			}
++
++			if (data[2] | (data[3] & 0x01) | data[4]) {
++				input_report_key(input, wacom->tool[1], 1);
++				input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
++			} else {
++				input_report_key(input, wacom->tool[1], 0);
++				input_report_abs(input, ABS_MISC, 0);
++			}
+ 		} else {
+ 			if (features->type == WACOM_21UX2) {
+ 				input_report_key(input, BTN_0, (data[5] & 0x01));
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 0aa00ce5fd7d..17ba1868f0cd 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -38,6 +38,7 @@
+ #define WACOM_REPORT_INTUOSREAD		5
+ #define WACOM_REPORT_INTUOSWRITE	6
+ #define WACOM_REPORT_INTUOSPAD		12
++#define WACOM_REPORT_INTUOS5PAD		3
+ #define WACOM_REPORT_TPC1FG		6
+ #define WACOM_REPORT_TPC2FG		13
+ #define WACOM_REPORT_TPCHID		15
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0022-Input-wacom-add-Intuos5-Touch-Ring-LED-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0022-Input-wacom-add-Intuos5-Touch-Ring-LED-support.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,163 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Tue, 3 Apr 2012 15:50:37 -0700
+Subject: Input: wacom - add Intuos5 Touch Ring LED support
+
+commit 9b5b95dd516a13d53ecf9217672d2116f05097bc upstream.
+
+The Touch Ring LEDs on Intuos5 tablets use a different report
+format which supports only 4 levels of brightness. We remap
+the 7-bit value obtained from sysfs to an appropriate value
+for the tablet. Control of the crop mark LEDs (new to the I5)
+is left for a later patch.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ Documentation/ABI/testing/sysfs-driver-wacom |   15 +++---
+ drivers/input/tablet/wacom_sys.c             |   67 ++++++++++++++++++++++----
+ 2 files changed, 65 insertions(+), 17 deletions(-)
+
+diff --git a/Documentation/ABI/testing/sysfs-driver-wacom b/Documentation/ABI/testing/sysfs-driver-wacom
+index 0130d6683c14..5e9cbdc7486e 100644
+--- a/Documentation/ABI/testing/sysfs-driver-wacom
++++ b/Documentation/ABI/testing/sysfs-driver-wacom
+@@ -15,9 +15,10 @@ Contact:	linux-input at vger.kernel.org
+ Description:
+ 		Attribute group for control of the status LEDs and the OLEDs.
+ 		This attribute group is only available for Intuos 4 M, L,
+-		and XL (with LEDs and OLEDs) and Cintiq 21UX2 and Cintiq 24HD
+-		(LEDs only). Therefore its presence implicitly signifies the
+-		presence of said LEDs and OLEDs on the tablet device.
++		and XL (with LEDs and OLEDs), Intuos 5 (LEDs only), and Cintiq
++		21UX2 and Cintiq 24HD (LEDs only). Therefore its presence
++		implicitly signifies the presence of said LEDs and OLEDs on the
++		tablet device.
+ 
+ What:		/sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status0_luminance
+ Date:		August 2011
+@@ -40,10 +41,10 @@ What:		/sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led0
+ Date:		August 2011
+ Contact:	linux-input at vger.kernel.org
+ Description:
+-		Writing to this file sets which one of the four (for Intuos 4)
+-		or of the right four (for Cintiq 21UX2 and Cintiq 24HD) status
+-		LEDs is active (0..3). The other three LEDs on the same side are
+-		always inactive.
++		Writing to this file sets which one of the four (for Intuos 4
++		and Intuos 5) or of the right four (for Cintiq 21UX2 and Cintiq
++		24HD) status LEDs is active (0..3). The other three LEDs on the
++		same side are always inactive.
+ 
+ What:		/sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led1_select
+ Date:		September 2011
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 8a5fad186140..f470e41d23e7 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -574,23 +574,39 @@ static void wacom_remove_shared_data(struct wacom_wac *wacom)
+ static int wacom_led_control(struct wacom *wacom)
+ {
+ 	unsigned char *buf;
+-	int retval, led = 0;
++	int retval;
+ 
+ 	buf = kzalloc(9, GFP_KERNEL);
+ 	if (!buf)
+ 		return -ENOMEM;
+ 
+-	if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
+-	    wacom->wacom_wac.features.type == WACOM_24HD)
+-		led = (wacom->led.select[1] << 4) | 0x40;
++	if (wacom->wacom_wac.features.type >= INTUOS5S &&
++	    wacom->wacom_wac.features.type <= INTUOS5L)	{
++		/*
++		 * Touch Ring and crop mark LED luminance may take on
++		 * one of four values:
++		 *    0 = Low; 1 = Medium; 2 = High; 3 = Off
++		 */
++		int ring_led = wacom->led.select[0] & 0x03;
++		int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
++		int crop_lum = 0;
+ 
+-	led |=  wacom->led.select[0] | 0x4;
++		buf[0] = WAC_CMD_LED_CONTROL;
++		buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
++	}
++	else {
++		int led = wacom->led.select[0] | 0x4;
+ 
+-	buf[0] = WAC_CMD_LED_CONTROL;
+-	buf[1] = led;
+-	buf[2] = wacom->led.llv;
+-	buf[3] = wacom->led.hlv;
+-	buf[4] = wacom->led.img_lum;
++		if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
++		    wacom->wacom_wac.features.type == WACOM_24HD)
++			led |= (wacom->led.select[1] << 4) | 0x40;
++
++		buf[0] = WAC_CMD_LED_CONTROL;
++		buf[1] = led;
++		buf[2] = wacom->led.llv;
++		buf[3] = wacom->led.hlv;
++		buf[4] = wacom->led.img_lum;
++	}
+ 
+ 	retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL,
+ 				  buf, 9, WAC_CMD_RETRIES);
+@@ -783,6 +799,17 @@ static struct attribute_group intuos4_led_attr_group = {
+ 	.attrs = intuos4_led_attrs,
+ };
+ 
++static struct attribute *intuos5_led_attrs[] = {
++	&dev_attr_status0_luminance.attr,
++	&dev_attr_status_led0_select.attr,
++	NULL
++};
++
++static struct attribute_group intuos5_led_attr_group = {
++	.name = "wacom_led",
++	.attrs = intuos5_led_attrs,
++};
++
+ static int wacom_initialize_leds(struct wacom *wacom)
+ {
+ 	int error;
+@@ -812,6 +839,19 @@ static int wacom_initialize_leds(struct wacom *wacom)
+ 					   &cintiq_led_attr_group);
+ 		break;
+ 
++	case INTUOS5S:
++	case INTUOS5:
++	case INTUOS5L:
++		wacom->led.select[0] = 0;
++		wacom->led.select[1] = 0;
++		wacom->led.llv = 32;
++		wacom->led.hlv = 0;
++		wacom->led.img_lum = 0;
++
++		error = sysfs_create_group(&wacom->intf->dev.kobj,
++					   &intuos5_led_attr_group);
++		break;
++
+ 	default:
+ 		return 0;
+ 	}
+@@ -840,6 +880,13 @@ static void wacom_destroy_leds(struct wacom *wacom)
+ 		sysfs_remove_group(&wacom->intf->dev.kobj,
+ 				   &cintiq_led_attr_group);
+ 		break;
++
++	case INTUOS5S:
++	case INTUOS5:
++	case INTUOS5L:
++		sysfs_remove_group(&wacom->intf->dev.kobj,
++				   &intuos5_led_attr_group);
++		break;
+ 	}
+ }
+ 
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0023-Input-wacom-add-Intuos5-multitouch-sensor-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0023-Input-wacom-add-Intuos5-multitouch-sensor-support.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,183 @@
+From: Jason Gerecke <killertofu at gmail.com>
+Date: Tue, 3 Apr 2012 15:50:40 -0700
+Subject: Input: wacom - add Intuos5 multitouch sensor support
+
+commit ae584ca473289377dd7fd8c61439db4bfab5489a upstream.
+
+Intuos5 tablets with PTH-* model numbers include a multitouch sensor
+which use the same touch reports as the 3rd-generation Bamboo. No
+useful information is in the HID descriptor for the touch interface
+so hardcoded values are used during setup.
+
+Signed-off-by: Jason Gerecke <killertofu at gmail.com>
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Reviewed-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |   25 +++++++++++++++
+ drivers/input/tablet/wacom_wac.c |   64 +++++++++++++++++++++++++++++++++++---
+ 2 files changed, 84 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index f470e41d23e7..4d52e5924801 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -233,6 +233,9 @@ static int wacom_parse_logical_collection(unsigned char *report,
+  * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical
+  * Collection. Instead they define a Logical Collection with a single
+  * Logical Maximum for both X and Y.
++ *
++ * Intuos5 touch interface does not contain useful data. We deal with
++ * this after returning from this function.
+  */
+ static int wacom_parse_hid(struct usb_interface *intf,
+ 			   struct hid_descriptor *hid_desc,
+@@ -1087,6 +1090,28 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 	if (error)
+ 		goto fail3;
+ 
++	/*
++	 * Intuos5 has no useful data about its touch interface in its
++	 * HID descriptor. If this is the touch interface (wMaxPacketSize
++	 * of WACOM_PKGLEN_BBTOUCH3), override the table values.
++	 */
++	if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
++		if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
++			features->device_type = BTN_TOOL_FINGER;
++			features->pktlen = WACOM_PKGLEN_BBTOUCH3;
++
++			features->x_phy =
++				(features->x_max * 100) / features->x_resolution;
++			features->y_phy =
++				(features->y_max * 100) / features->y_resolution;
++
++			features->x_max = 4096;
++			features->y_max = 4096;
++		} else {
++			features->device_type = BTN_TOOL_PEN;
++		}
++	}
++
+ 	wacom_setup_device_quirks(features);
+ 
+ 	strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index b5176a073c83..d96e186f71dc 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -321,6 +321,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
+ 
+ 	/* Enter report */
+ 	if ((data[1] & 0xfc) == 0xc0) {
++		if (features->type >= INTUOS5S && features->type <= INTUOS5L)
++			wacom->shared->stylus_in_proximity = true;
++
+ 		/* serial number of the tool */
+ 		wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
+ 			(data[4] << 20) + (data[5] << 12) +
+@@ -406,6 +409,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
+ 
+ 	/* Exit report */
+ 	if ((data[1] & 0xfe) == 0x80) {
++		if (features->type >= INTUOS5S && features->type <= INTUOS5L)
++			wacom->shared->stylus_in_proximity = false;
++
+ 		/*
+ 		 * Reset all states otherwise we lose the initial states
+ 		 * when in-prox next time
+@@ -1140,9 +1146,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ 	case INTUOS4S:
+ 	case INTUOS4:
+ 	case INTUOS4L:
+-	case INTUOS5S:
+-	case INTUOS5:
+-	case INTUOS5L:
+ 	case CINTIQ:
+ 	case WACOM_BEE:
+ 	case WACOM_21UX2:
+@@ -1150,6 +1153,15 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ 		sync = wacom_intuos_irq(wacom_wac);
+ 		break;
+ 
++	case INTUOS5S:
++	case INTUOS5:
++	case INTUOS5L:
++		if (len == WACOM_PKGLEN_BBTOUCH3)
++			sync = wacom_bpt3_touch(wacom_wac);
++		else
++			sync = wacom_intuos_irq(wacom_wac);
++		break;
++
+ 	case TABLETPC:
+ 	case TABLETPC2FG:
+ 		sync = wacom_tpc_irq(wacom_wac, len);
+@@ -1224,7 +1236,8 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ 
+ 	/* these device have multiple inputs */
+ 	if (features->type == TABLETPC || features->type == TABLETPC2FG ||
+-	    features->type == BAMBOO_PT || features->type == WIRELESS)
++	    features->type == BAMBOO_PT || features->type == WIRELESS ||
++	    (features->type >= INTUOS5S && features->type <= INTUOS5L))
+ 		features->quirks |= WACOM_QUIRK_MULTI_INPUT;
+ 
+ 	/* quirk for bamboo touch with 2 low res touches */
+@@ -1393,13 +1406,54 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 
+ 	case INTUOS5:
+ 	case INTUOS5L:
++		if (features->device_type == BTN_TOOL_PEN) {
++			__set_bit(BTN_7, input_dev->keybit);
++			__set_bit(BTN_8, input_dev->keybit);
++		}
++		/* fall through */
++
++	case INTUOS5S:
++		__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
++
++		if (features->device_type == BTN_TOOL_PEN) {
++			for (i = 0; i < 7; i++)
++				__set_bit(BTN_0 + i, input_dev->keybit);
++
++			input_set_abs_params(input_dev, ABS_DISTANCE, 0,
++					      features->distance_max,
++					      0, 0);
++
++			input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
++
++			wacom_setup_intuos(wacom_wac);
++		} else if (features->device_type == BTN_TOOL_FINGER) {
++			__clear_bit(ABS_MISC, input_dev->absbit);
++
++			__set_bit(BTN_TOOL_FINGER, input_dev->keybit);
++			__set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
++			__set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
++			__set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
++
++			input_mt_init_slots(input_dev, 16);
++
++			input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
++			                     0, 255, 0, 0);
++
++			input_set_abs_params(input_dev, ABS_MT_POSITION_X,
++					     0, features->x_max,
++					     features->x_fuzz, 0);
++			input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
++					     0, features->y_max,
++					     features->y_fuzz, 0);
++		}
++		break;
++
+ 	case INTUOS4:
+ 	case INTUOS4L:
+ 		__set_bit(BTN_7, input_dev->keybit);
+ 		__set_bit(BTN_8, input_dev->keybit);
+ 		/* fall through */
+ 
+-	case INTUOS5S:
+ 	case INTUOS4S:
+ 		for (i = 0; i < 7; i++)
+ 			__set_bit(BTN_0 + i, input_dev->keybit);
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0024-Input-wacom-retrieve-maximum-number-of-touch-points.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0024-Input-wacom-retrieve-maximum-number-of-touch-points.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,249 @@
+From: Ping Cheng <pinglinux at gmail.com>
+Date: Sun, 29 Apr 2012 21:09:17 -0700
+Subject: Input: wacom - retrieve maximum number of touch points
+
+commit f393ee2b814e3291c12565000210b3cf10aa5c1d upstream.
+
+>From the HID usage table when it is supported.
+
+Tested-by: Jason Gerecke <killertofu at gmail.com>
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom_sys.c |   29 ++++++++++++++++++-
+ drivers/input/tablet/wacom_wac.c |   59 +++++++++++++++++++++++---------------
+ drivers/input/tablet/wacom_wac.h |    1 +
+ 3 files changed, 65 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 4d52e5924801..53598c2065cf 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -28,6 +28,7 @@
+ #define HID_USAGE_Y_TILT		0x3e
+ #define HID_USAGE_FINGER		0x22
+ #define HID_USAGE_STYLUS		0x20
++#define HID_USAGE_CONTACTMAX		0x55
+ #define HID_COLLECTION			0xa1
+ #define HID_COLLECTION_LOGICAL		0x02
+ #define HID_COLLECTION_END		0xc0
+@@ -201,6 +202,27 @@ static int wacom_parse_logical_collection(unsigned char *report,
+ 	return length;
+ }
+ 
++static void wacom_retrieve_report_data(struct usb_interface *intf,
++				       struct wacom_features *features)
++{
++	int result = 0;
++	unsigned char *rep_data;
++
++	rep_data = kmalloc(2, GFP_KERNEL);
++	if (rep_data) {
++
++		rep_data[0] = 12;
++		result = wacom_get_report(intf, WAC_HID_FEATURE_REPORT,
++					  rep_data[0], &rep_data, 2,
++					  WAC_MSG_RETRIES);
++
++		if (result >= 0 && rep_data[1] > 2)
++			features->touch_max = rep_data[1];
++
++		kfree(rep_data);
++	}
++}
++
+ /*
+  * Interface Descriptor of wacom devices can be incomplete and
+  * inconsistent so wacom_features table is used to store stylus
+@@ -377,6 +399,11 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 				pen = 1;
+ 				i++;
+ 				break;
++
++			case HID_USAGE_CONTACTMAX:
++				wacom_retrieve_report_data(intf, features);
++				i++;
++				break;
+ 			}
+ 			break;
+ 
+@@ -1085,7 +1112,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ 
+ 	endpoint = &intf->cur_altsetting->endpoint[0].desc;
+ 
+-	/* Retrieve the physical and logical size for OEM devices */
++	/* Retrieve the physical and logical size for touch devices */
+ 	error = wacom_retrieve_hid_descriptor(intf, features);
+ 	if (error)
+ 		goto fail3;
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index d96e186f71dc..e5cd0e57d178 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -1434,7 +1434,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 			__set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
+ 			__set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
+ 
+-			input_mt_init_slots(input_dev, 16);
++			input_mt_init_slots(input_dev, features->touch_max);
+ 
+ 			input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
+ 			                     0, 255, 0, 0);
+@@ -1467,7 +1467,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 	case TABLETPC2FG:
+ 		if (features->device_type == BTN_TOOL_FINGER) {
+ 
+-			input_mt_init_slots(input_dev, 2);
++			input_mt_init_slots(input_dev, features->touch_max);
+ 			input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE,
+ 					0, MT_TOOL_MAX, 0, 0);
+ 			input_set_abs_params(input_dev, ABS_MT_POSITION_X,
+@@ -1522,6 +1522,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 
+ 			__set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+ 			__set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
++			input_mt_init_slots(input_dev, features->touch_max);
+ 
+ 			if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
+ 				__set_bit(BTN_TOOL_TRIPLETAP,
+@@ -1529,13 +1530,9 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 				__set_bit(BTN_TOOL_QUADTAP,
+ 					  input_dev->keybit);
+ 
+-				input_mt_init_slots(input_dev, 16);
+-
+ 				input_set_abs_params(input_dev,
+ 						     ABS_MT_TOUCH_MAJOR,
+ 						     0, 255, 0, 0);
+-			} else {
+-				input_mt_init_slots(input_dev, 2);
+ 			}
+ 
+ 			input_set_abs_params(input_dev, ABS_MT_POSITION_X,
+@@ -1724,13 +1721,16 @@ static const struct wacom_features wacom_features_0xBC =
+ 	  63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+ static const struct wacom_features wacom_features_0x26 =
+ 	{ "Wacom Intuos5 touch S", WACOM_PKGLEN_INTUOS,  31496, 19685, 2047,
+-	  63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++	  63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
++	  .touch_max = 16 };
+ static const struct wacom_features wacom_features_0x27 =
+ 	{ "Wacom Intuos5 touch M", WACOM_PKGLEN_INTUOS,  44704, 27940, 2047,
+-	  63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++	  63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
++	  .touch_max = 16 };
+ static const struct wacom_features wacom_features_0x28 =
+ 	{ "Wacom Intuos5 touch L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047,
+-	  63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
++	  63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
++	  .touch_max = 16 };
+ static const struct wacom_features wacom_features_0x29 =
+ 	{ "Wacom Intuos5 S", WACOM_PKGLEN_INTUOS,  31496, 19685, 2047,
+ 	  63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+@@ -1778,13 +1778,16 @@ static const struct wacom_features wacom_features_0x9F =
+ 	  0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0xE2 =
+ 	{ "Wacom ISDv4 E2",       WACOM_PKGLEN_TPC2FG,    26202, 16325,  255,
+-	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xE3 =
+ 	{ "Wacom ISDv4 E3",       WACOM_PKGLEN_TPC2FG,    26202, 16325,  255,
+-	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xE6 =
+ 	{ "Wacom ISDv4 E6",       WACOM_PKGLEN_TPC2FG,    27760, 15694,  255,
+-	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	.touch_max = 2 };
+ static const struct wacom_features wacom_features_0xEC =
+ 	{ "Wacom ISDv4 EC",       WACOM_PKGLEN_GRAPHIRE,  25710, 14500,  255,
+ 	  0, TABLETPC,    WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+@@ -1793,19 +1796,22 @@ static const struct wacom_features wacom_features_0x47 =
+ 	  31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0x84 =
+ 	{ "Wacom Wireless Receiver", WACOM_PKGLEN_WIRELESS, 0, 0, 0,
+-	  0, WIRELESS, 0, 0 };
++	  0, WIRELESS, 0, 0, .touch_max = 16 };
+ static const struct wacom_features wacom_features_0xD0 =
+ 	{ "Wacom Bamboo 2FG",     WACOM_PKGLEN_BBFUN,     14720,  9200, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xD1 =
+ 	{ "Wacom Bamboo 2FG 4x5", WACOM_PKGLEN_BBFUN,     14720,  9200, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xD2 =
+ 	{ "Wacom Bamboo Craft",   WACOM_PKGLEN_BBFUN,     14720,  9200, 1023,
+ 	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0xD3 =
+ 	{ "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN,     21648, 13700, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xD4 =
+ 	{ "Wacom Bamboo Pen",     WACOM_PKGLEN_BBFUN,     14720,  9200, 1023,
+ 	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+@@ -1814,28 +1820,35 @@ static const struct wacom_features wacom_features_0xD5 =
+ 	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0xD6 =
+ 	{ "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN,   14720,  9200, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xD7 =
+ 	{ "Wacom BambooPT 2FG Small", WACOM_PKGLEN_BBFUN, 14720,  9200, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xD8 =
+ 	{ "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN,   21648, 13700, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xDA =
+ 	{ "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN,  14720,  9200, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static struct wacom_features wacom_features_0xDB =
+ 	{ "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN,  21648, 13700, 1023,
+-	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 2 };
+ static const struct wacom_features wacom_features_0xDD =
+         { "Wacom Bamboo Connect", WACOM_PKGLEN_BBPEN,     14720,  9200, 1023,
+           31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0xDE =
+         { "Wacom Bamboo 16FG 4x5", WACOM_PKGLEN_BBPEN,    14720,  9200, 1023,
+-          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 16 };
+ static const struct wacom_features wacom_features_0xDF =
+         { "Wacom Bamboo 16FG 6x8", WACOM_PKGLEN_BBPEN,    21648, 13700, 1023,
+-          31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
++	  31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
++	  .touch_max = 16 };
+ static const struct wacom_features wacom_features_0x6004 =
+ 	{ "ISD-V4",               WACOM_PKGLEN_GRAPHIRE,  12800,  8000,  255,
+ 	  0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 17ba1868f0cd..321269c1ac4c 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -99,6 +99,7 @@ struct wacom_features {
+ 	int pressure_fuzz;
+ 	int distance_fuzz;
+ 	unsigned quirks;
++	unsigned touch_max;
+ };
+ 
+ struct wacom_shared {
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0025-Input-wacom-add-0xE5-MT-device-support.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0025-Input-wacom-add-0xE5-MT-device-support.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,430 @@
+From: Ping Cheng <pinglinux at gmail.com>
+Date: Sun, 29 Apr 2012 21:09:18 -0700
+Subject: Input: wacom - add 0xE5 (MT device) support
+
+commit 1963518b9b1b8019d33b4b08deee6f873ffa2730 upstream.
+
+Main part of patch is adding support for a new Wacom MT touch
+packet and labels these devices using MTSCREEN type.
+
+Other items of interest:
+
+Delete some duplicate code in HID parsing for Y info since
+its already done in X path.
+
+In wacom_query_tablet_data(), only invoke the set report
+that requests tablets to send Wacom Touch packets for
+Finger interfaces.  Mostly, this is to make code intent clear.
+
+Tested-by: Jason Gerecke <killertofu at gmail.com>
+Signed-off-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Ping Cheng <pingc at wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+Signed-off-by: Jonathan Nieder <jrnieder at gmail.com>
+---
+ drivers/input/tablet/wacom.h     |    4 +-
+ drivers/input/tablet/wacom_sys.c |   91 ++++++++++++++++++++---------------
+ drivers/input/tablet/wacom_wac.c |   99 ++++++++++++++++++++++++++++++++++++--
+ drivers/input/tablet/wacom_wac.h |    8 +++
+ 4 files changed, 157 insertions(+), 45 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
+index b4842d0e61dd..b79d45198d82 100644
+--- a/drivers/input/tablet/wacom.h
++++ b/drivers/input/tablet/wacom.h
+@@ -135,6 +135,6 @@ extern const struct usb_device_id wacom_ids[];
+ 
+ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
+ void wacom_setup_device_quirks(struct wacom_features *features);
+-void wacom_setup_input_capabilities(struct input_dev *input_dev,
+-				    struct wacom_wac *wacom_wac);
++int wacom_setup_input_capabilities(struct input_dev *input_dev,
++				   struct wacom_wac *wacom_wac);
+ #endif
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 53598c2065cf..734671aeb572 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -317,6 +317,10 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 							/* need to reset back */
+ 							features->pktlen = WACOM_PKGLEN_TPC2FG;
+ 						}
++
++						if (features->type == MTSCREEN)
++							features->pktlen = WACOM_PKGLEN_MTOUCH;
++
+ 						if (features->type == BAMBOO_PT) {
+ 							/* need to reset back */
+ 							features->pktlen = WACOM_PKGLEN_BBTOUCH;
+@@ -349,18 +353,15 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 			case HID_USAGE_Y:
+ 				if (usage == WCM_DESKTOP) {
+ 					if (finger) {
+-						features->device_type = BTN_TOOL_FINGER;
+-						if (features->type == TABLETPC2FG) {
+-							/* need to reset back */
+-							features->pktlen = WACOM_PKGLEN_TPC2FG;
++						int type = features->type;
++
++						if (type == TABLETPC2FG || type == MTSCREEN) {
+ 							features->y_max =
+ 								get_unaligned_le16(&report[i + 3]);
+ 							features->y_phy =
+ 								get_unaligned_le16(&report[i + 6]);
+ 							i += 7;
+-						} else if (features->type == BAMBOO_PT) {
+-							/* need to reset back */
+-							features->pktlen = WACOM_PKGLEN_BBTOUCH;
++						} else if (type == BAMBOO_PT) {
+ 							features->y_phy =
+ 								get_unaligned_le16(&report[i + 3]);
+ 							features->y_max =
+@@ -374,10 +375,6 @@ static int wacom_parse_hid(struct usb_interface *intf,
+ 							i += 4;
+ 						}
+ 					} else if (pen) {
+-						/* penabled only accepts exact bytes of data */
+-						if (features->type == TABLETPC2FG)
+-							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
+-						features->device_type = BTN_TOOL_PEN;
+ 						features->y_max =
+ 							get_unaligned_le16(&report[i + 3]);
+ 						i += 4;
+@@ -440,22 +437,29 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
+ 	if (!rep_data)
+ 		return error;
+ 
+-	/* ask to report tablet data if it is MT Tablet PC or
+-	 * not a Tablet PC */
+-	if (features->type == TABLETPC2FG) {
+-		do {
+-			rep_data[0] = 3;
+-			rep_data[1] = 4;
+-			rep_data[2] = 0;
+-			rep_data[3] = 0;
+-			report_id = 3;
+-			error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
+-						 report_id, rep_data, 4, 1);
+-			if (error >= 0)
+-				error = wacom_get_report(intf,
+-						WAC_HID_FEATURE_REPORT,
+-						report_id, rep_data, 4, 1);
+-		} while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES);
++	/* ask to report Wacom data */
++	if (features->device_type == BTN_TOOL_FINGER) {
++		/* if it is an MT Tablet PC touch */
++		if (features->type == TABLETPC2FG ||
++		    features->type == MTSCREEN) {
++			do {
++				rep_data[0] = 3;
++				rep_data[1] = 4;
++				rep_data[2] = 0;
++				rep_data[3] = 0;
++				report_id = 3;
++				error = wacom_set_report(intf,
++							 WAC_HID_FEATURE_REPORT,
++							 report_id,
++							 rep_data, 4, 1);
++				if (error >= 0)
++					error = wacom_get_report(intf,
++							WAC_HID_FEATURE_REPORT,
++							report_id,
++							rep_data, 4, 1);
++			} while ((error < 0 || rep_data[1] != 4) &&
++				 limit++ < WAC_MSG_RETRIES);
++		}
+ 	} else if (features->type != TABLETPC &&
+ 		   features->type != WIRELESS &&
+ 		   features->device_type == BTN_TOOL_PEN) {
+@@ -477,7 +481,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
+ }
+ 
+ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+-		struct wacom_features *features)
++					 struct wacom_features *features)
+ {
+ 	int error = 0;
+ 	struct usb_host_interface *interface = intf->cur_altsetting;
+@@ -505,10 +509,13 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ 		}
+ 	}
+ 
+-	/* only Tablet PCs and Bamboo P&T need to retrieve the info */
+-	if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
+-	    (features->type != BAMBOO_PT))
++	/* only devices that support touch need to retrieve the info */
++	if (features->type != TABLETPC &&
++	    features->type != TABLETPC2FG &&
++	    features->type != BAMBOO_PT &&
++	    features->type != MTSCREEN) {
+ 		goto out;
++	}
+ 
+ 	if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
+ 		if (usb_get_extra_descriptor(&interface->endpoint[0],
+@@ -978,8 +985,10 @@ static int wacom_register_input(struct wacom *wacom)
+ 	int error;
+ 
+ 	input_dev = input_allocate_device();
+-	if (!input_dev)
+-		return -ENOMEM;
++	if (!input_dev) {
++		error = -ENOMEM;
++		goto fail1;
++	}
+ 
+ 	input_dev->name = wacom_wac->name;
+ 	input_dev->dev.parent = &intf->dev;
+@@ -989,14 +998,20 @@ static int wacom_register_input(struct wacom *wacom)
+ 	input_set_drvdata(input_dev, wacom);
+ 
+ 	wacom_wac->input = input_dev;
+-	wacom_setup_input_capabilities(input_dev, wacom_wac);
++	error = wacom_setup_input_capabilities(input_dev, wacom_wac);
++	if (error)
++		goto fail1;
+ 
+ 	error = input_register_device(input_dev);
+-	if (error) {
+-		input_free_device(input_dev);
+-		wacom_wac->input = NULL;
+-	}
++	if (error)
++		goto fail2;
+ 
++	return 0;
++
++fail2:
++	input_free_device(input_dev);
++	wacom_wac->input = NULL;
++fail1:
+ 	return error;
+ }
+ 
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index e5cd0e57d178..10e5cf870359 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -768,6 +768,72 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
+ 	return 1;
+ }
+ 
++static int find_slot_from_contactid(struct wacom_wac *wacom, int contactid)
++{
++	int touch_max = wacom->features.touch_max;
++	int i;
++
++	if (!wacom->slots)
++		return -1;
++
++	for (i = 0; i < touch_max; ++i) {
++		if (wacom->slots[i] == contactid)
++			return i;
++	}
++	for (i = 0; i < touch_max; ++i) {
++		if (wacom->slots[i] == -1)
++			return i;
++	}
++	return -1;
++}
++
++static int wacom_mt_touch(struct wacom_wac *wacom)
++{
++	struct input_dev *input = wacom->input;
++	char *data = wacom->data;
++	int i;
++	int current_num_contacts = data[2];
++	int contacts_to_send = 0;
++
++	/*
++	 * First packet resets the counter since only the first
++	 * packet in series will have non-zero current_num_contacts.
++	 */
++	if (current_num_contacts)
++		wacom->num_contacts_left = current_num_contacts;
++
++	/* There are at most 5 contacts per packet */
++	contacts_to_send = min(5, wacom->num_contacts_left);
++
++	for (i = 0; i < contacts_to_send; i++) {
++		int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3;
++		bool touch = data[offset] & 0x1;
++		int id = le16_to_cpup((__le16 *)&data[offset + 1]);
++		int slot = find_slot_from_contactid(wacom, id);
++
++		if (slot < 0)
++			continue;
++
++		input_mt_slot(input, slot);
++		input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
++		if (touch) {
++			int x = le16_to_cpup((__le16 *)&data[offset + 7]);
++			int y = le16_to_cpup((__le16 *)&data[offset + 9]);
++			input_report_abs(input, ABS_MT_POSITION_X, x);
++			input_report_abs(input, ABS_MT_POSITION_Y, y);
++		}
++		wacom->slots[slot] = touch ? id : -1;
++	}
++
++	input_mt_report_pointer_emulation(input, true);
++
++	wacom->num_contacts_left -= contacts_to_send;
++	if (wacom->num_contacts_left < 0)
++		wacom->num_contacts_left = 0;
++
++	return 1;
++}
++
+ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
+ {
+ 	struct input_dev *input = wacom->input;
+@@ -806,6 +872,9 @@ static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
+ 	bool prox;
+ 	int x = 0, y = 0;
+ 
++	if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG)
++		return 0;
++
+ 	if (!wacom->shared->stylus_in_proximity) {
+ 		if (len == WACOM_PKGLEN_TPC1FG) {
+ 			prox = data[0] & 0x01;
+@@ -873,10 +942,10 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
+ 
+ 	switch (len) {
+ 	case WACOM_PKGLEN_TPC1FG:
+-		 return wacom_tpc_single_touch(wacom, len);
++		return wacom_tpc_single_touch(wacom, len);
+ 
+ 	case WACOM_PKGLEN_TPC2FG:
+- 		return wacom_tpc_mt_touch(wacom);
++		return wacom_tpc_mt_touch(wacom);
+ 
+ 	default:
+ 		switch (data[0]) {
+@@ -885,6 +954,9 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
+ 		case WACOM_REPORT_TPCST:
+ 			return wacom_tpc_single_touch(wacom, len);
+ 
++		case WACOM_REPORT_TPCMT:
++			return wacom_mt_touch(wacom);
++
+ 		case WACOM_REPORT_PENABLED:
+ 			return wacom_tpc_pen(wacom);
+ 		}
+@@ -1164,6 +1236,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ 
+ 	case TABLETPC:
+ 	case TABLETPC2FG:
++	case MTSCREEN:
+ 		sync = wacom_tpc_irq(wacom_wac, len);
+ 		break;
+ 
+@@ -1237,7 +1310,8 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ 	/* these device have multiple inputs */
+ 	if (features->type == TABLETPC || features->type == TABLETPC2FG ||
+ 	    features->type == BAMBOO_PT || features->type == WIRELESS ||
+-	    (features->type >= INTUOS5S && features->type <= INTUOS5L))
++	    (features->type >= INTUOS5S && features->type <= INTUOS5L) ||
++	    features->type == MTSCREEN)
+ 		features->quirks |= WACOM_QUIRK_MULTI_INPUT;
+ 
+ 	/* quirk for bamboo touch with 2 low res touches */
+@@ -1268,8 +1342,8 @@ static unsigned int wacom_calculate_touch_res(unsigned int logical_max,
+        return (logical_max * 100) / physical_max;
+ }
+ 
+-void wacom_setup_input_capabilities(struct input_dev *input_dev,
+-				    struct wacom_wac *wacom_wac)
++int wacom_setup_input_capabilities(struct input_dev *input_dev,
++				   struct wacom_wac *wacom_wac)
+ {
+ 	struct wacom_features *features = &wacom_wac->features;
+ 	int i;
+@@ -1465,8 +1539,18 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 		break;
+ 
+ 	case TABLETPC2FG:
++	case MTSCREEN:
+ 		if (features->device_type == BTN_TOOL_FINGER) {
+ 
++			wacom_wac->slots = kmalloc(features->touch_max *
++							sizeof(int),
++						   GFP_KERNEL);
++			if (!wacom_wac->slots)
++				return -ENOMEM;
++
++			for (i = 0; i < features->touch_max; i++)
++				wacom_wac->slots[i] = -1;
++
+ 			input_mt_init_slots(input_dev, features->touch_max);
+ 			input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE,
+ 					0, MT_TOOL_MAX, 0, 0);
+@@ -1552,6 +1636,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ 		}
+ 		break;
+ 	}
++	return 0;
+ }
+ 
+ static const struct wacom_features wacom_features_0x00 =
+@@ -1784,6 +1869,9 @@ static const struct wacom_features wacom_features_0xE3 =
+ 	{ "Wacom ISDv4 E3",       WACOM_PKGLEN_TPC2FG,    26202, 16325,  255,
+ 	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+ 	  .touch_max = 2 };
++static const struct wacom_features wacom_features_0xE5 =
++	{ "Wacom ISDv4 E5",       WACOM_PKGLEN_MTOUCH,    26202, 16325,  255,
++	  0, MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
+ static const struct wacom_features wacom_features_0xE6 =
+ 	{ "Wacom ISDv4 E6",       WACOM_PKGLEN_TPC2FG,    27760, 15694,  255,
+ 	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
+@@ -1962,6 +2050,7 @@ const struct usb_device_id wacom_ids[] = {
+ 	{ USB_DEVICE_WACOM(0x9F) },
+ 	{ USB_DEVICE_WACOM(0xE2) },
+ 	{ USB_DEVICE_WACOM(0xE3) },
++	{ USB_DEVICE_WACOM(0xE5) },
+ 	{ USB_DEVICE_WACOM(0xE6) },
+ 	{ USB_DEVICE_WACOM(0xEC) },
+ 	{ USB_DEVICE_WACOM(0x47) },
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 321269c1ac4c..78fbd3f42009 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -25,6 +25,10 @@
+ #define WACOM_PKGLEN_BBTOUCH3	64
+ #define WACOM_PKGLEN_BBPEN	10
+ #define WACOM_PKGLEN_WIRELESS	32
++#define WACOM_PKGLEN_MTOUCH	62
++
++/* wacom data size per MT contact */
++#define WACOM_BYTES_PER_MT_PACKET	11
+ 
+ /* device IDs */
+ #define STYLUS_DEVICE_ID	0x02
+@@ -41,6 +45,7 @@
+ #define WACOM_REPORT_INTUOS5PAD		3
+ #define WACOM_REPORT_TPC1FG		6
+ #define WACOM_REPORT_TPC2FG		13
++#define WACOM_REPORT_TPCMT		13
+ #define WACOM_REPORT_TPCHID		15
+ #define WACOM_REPORT_TPCST		16
+ 
+@@ -76,6 +81,7 @@ enum {
+ 	WACOM_MO,
+ 	TABLETPC,
+ 	TABLETPC2FG,
++	MTSCREEN,
+ 	MAX_TYPE
+ };
+ 
+@@ -118,6 +124,8 @@ struct wacom_wac {
+ 	struct input_dev *input;
+ 	int pid;
+ 	int battery_capacity;
++	int num_contacts_left;
++	int *slots;
+ };
+ 
+ #endif
+-- 
+1.7.10.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/wacom/0026-Input-wacom-return-proper-error-if-usb_get_extra_des.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/wacom/0026-Input-wacom-return-proper-error-if-usb_get_extra_des.patch	Wed May 16 02:01:40 2012	(r19001)
@@ -0,0 +1,41 @@
+From: Dmitry Torokhov <dmitry.torokhov at gmail.com>
+Date: Wed, 2 May 2012 00:13:38 -0700
+Subject: [PATCH 26/26] Input: wacom - return proper error if
+ usb_get_extra_descriptor() fails
+
+commit a882c932a628cbab17752fc8b1c94692f95bbf9a upstream.
+
+Instead of returning 1 (which is not even negative) let's capture and return
+error codde returned by usb_get_extra_descriptor().
+
+Reviewed-by: Chris Bagwell <chris at cnpbagwell.com>
+Signed-off-by: Dmitry Torokhov <dtor at mail.ru>
+---
+ drivers/input/tablet/wacom_sys.c |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 364f2c343..8f3b30b 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -517,11 +517,12 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ 		goto out;
+ 	}
+ 
+-	if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
+-		if (usb_get_extra_descriptor(&interface->endpoint[0],
+-				HID_DEVICET_REPORT, &hid_desc)) {
+-			printk("wacom: can not retrieve extra class descriptor\n");
+-			error = 1;
++	error = usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc);
++	if (error) {
++		error = usb_get_extra_descriptor(&interface->endpoint[0],
++						 HID_DEVICET_REPORT, &hid_desc);
++		if (error) {
++			printk(KERN_ERR "wacom: can not retrieve extra class descriptor\n");
+ 			goto out;
+ 		}
+ 	}
+-- 
+1.7.10
+

Modified: dists/sid/linux-2.6/debian/patches/series/base
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/base	Sat May 12 17:01:23 2012	(r19000)
+++ dists/sid/linux-2.6/debian/patches/series/base	Wed May 16 02:01:40 2012	(r19001)
@@ -199,3 +199,31 @@
 + bugfix/all/sky2-fix-receive-length-error-in-mixed-non-vlan-vlan.patch
 + bugfix/all/kvm-ensure-all-vcpus-are-consistent-with-in-kernel-irqchip.patch
 + bugfix/all/kvm-lock-slots_lock-around-device-assignment.patch
+
+# Update wacom driver to 3.5ish
++ features/all/wacom/0001-Input-wacom-cleanup-feature-report-for-bamboos.patch
++ features/all/wacom/0002-Input-wacom-remove-unused-bamboo-HID-parsing.patch
++ features/all/wacom/0003-Input-wacom-add-some-comments-to-wacom_parse_hid.patch
++ features/all/wacom/0004-Input-wacom-relax-Bamboo-stylus-ID-check.patch
++ features/all/wacom/0005-Input-wacom-read-3rd-gen-Bamboo-Touch-HID-data.patch
++ features/all/wacom/0006-Input-wacom-3rd-gen-Bamboo-P-Touch-packet-support.patch
++ features/all/wacom/0007-Input-wacom-ignore-unwanted-bamboo-packets.patch
++ features/all/wacom/0008-Input-wacom-add-support-for-Cintiq-24HD.patch
++ features/all/wacom/0009-Input-wacom-add-LED-support-for-Cintiq-24HD.patch
++ features/all/wacom/0010-Input-wacom-use-BTN_TOOL_FINGER-to-indicate-touch-de.patch
++ features/all/wacom/0011-Input-wacom-use-switch-statement-for-wacom_tpc_irq.patch
++ features/all/wacom/0012-Input-wacom-add-missing-LEDS_CLASS-to-Kconfig.patch
++ features/all/wacom/0013-Input-wacom-fix-3rd-gen-Bamboo-MT-when-4-fingers-are.patch
++ features/all/wacom/0014-Input-wacom-fix-physical-size-calculation-for-3rd-ge.patch
++ features/all/wacom/0015-Input-wacom-isolate-input-registration.patch
++ features/all/wacom/0016-Input-wacom-check-for-allocation-failure-in-probe.patch
++ features/all/wacom/0017-Input-wacom-wireless-monitor-framework.patch
++ features/all/wacom/0018-Input-wacom-create-inputs-when-wireless-connect.patch
++ features/all/wacom/0019-Input-wacom-wireless-battery-status.patch
++ features/all/wacom/0020-Input-wacom-add-basic-Intuos5-support.patch
++ features/all/wacom/0021-Input-wacom-add-Intuos5-Touch-Ring-ExpressKey-suppor.patch
++ features/all/wacom/0022-Input-wacom-add-Intuos5-Touch-Ring-LED-support.patch
++ features/all/wacom/0023-Input-wacom-add-Intuos5-multitouch-sensor-support.patch
++ features/all/wacom/0024-Input-wacom-retrieve-maximum-number-of-touch-points.patch
++ features/all/wacom/0025-Input-wacom-add-0xE5-MT-device-support.patch
++ features/all/wacom/0026-Input-wacom-return-proper-error-if-usb_get_extra_des.patch



More information about the Kernel-svn-changes mailing list