summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Ebbert <cebbert@redhat.com>2010-09-13 15:57:40 -0400
committerChuck Ebbert <cebbert@redhat.com>2010-09-13 15:57:40 -0400
commit1d13b01aba24af0a9dffa76d85abaa02e80ba687 (patch)
treec05557705dd6cd332da843344805e6377fd66c5f
parentdb42d7353c3452dc3f7b98d25778e7a7754c9685 (diff)
downloadkernel-1d13b01aba24af0a9dffa76d85abaa02e80ba687.tar.gz
kernel-1d13b01aba24af0a9dffa76d85abaa02e80ba687.tar.xz
kernel-1d13b01aba24af0a9dffa76d85abaa02e80ba687.zip
Add preliminary support for Wacom Bamboo pen and touch devices.
-rw-r--r--kernel.spec23
-rw-r--r--wacom-01-add-fuzz-parameters-to-features.patch69
-rw-r--r--wacom-02-parse-the-bamboo-device-family.patch122
-rw-r--r--wacom-03-collect-device-quirks-into-single-function.patch107
-rw-r--r--wacom-04-add-support-for-the-bamboo-touch-trackpad.patch172
-rw-r--r--wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch69
-rw-r--r--wacom-06-request-tablet-data-for-bamboo-pens.patch55
-rw-r--r--wacom-07-move-bamboo-touch-irq-to-its-own-function.patch52
-rw-r--r--wacom-08-add-support-for-bamboo-pen.patch130
-rw-r--r--wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch31
10 files changed, 830 insertions, 0 deletions
diff --git a/kernel.spec b/kernel.spec
index b932c4a9d..60d4fcc24 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -698,6 +698,17 @@ Patch12020: alsa-fix-substream-proc-status-read.patch
Patch12030: tpm-fix-stall-on-boot.patch
+# Wacom Bamboo
+Patch12100: wacom-01-add-fuzz-parameters-to-features.patch
+Patch12105: wacom-02-parse-the-bamboo-device-family.patch
+Patch12110: wacom-03-collect-device-quirks-into-single-function.patch
+Patch12115: wacom-04-add-support-for-the-bamboo-touch-trackpad.patch
+Patch12120: wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch
+Patch12125: wacom-06-request-tablet-data-for-bamboo-pens.patch
+Patch12130: wacom-07-move-bamboo-touch-irq-to-its-own-function.patch
+Patch12035: wacom-08-add-support-for-bamboo-pen.patch
+Patch12040: wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch
+
%endif
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
@@ -1275,6 +1286,17 @@ ApplyPatch neuter_intel_microcode_load.patch
# try to fix stalls during boot (#530393)
ApplyPatch tpm-fix-stall-on-boot.patch
+# Wacom Bamboo
+ApplyPatch wacom-01-add-fuzz-parameters-to-features.patch
+ApplyPatch wacom-02-parse-the-bamboo-device-family.patch
+ApplyPatch wacom-03-collect-device-quirks-into-single-function.patch
+ApplyPatch wacom-04-add-support-for-the-bamboo-touch-trackpad.patch
+ApplyPatch wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch
+ApplyPatch wacom-06-request-tablet-data-for-bamboo-pens.patch
+ApplyPatch wacom-07-move-bamboo-touch-irq-to-its-own-function.patch
+ApplyPatch wacom-08-add-support-for-bamboo-pen.patch
+ApplyPatch wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch
+
# END OF PATCH APPLICATIONS
%endif
@@ -1884,6 +1906,7 @@ fi
%changelog
* Sat Sep 11 2010 Chuck Ebbert <cebbert@redhat.com>
- Linux 2.6.36-rc4
+- Add preliminary support for Wacom Bamboo pen and touch devices.
* Sat Sep 11 2010 Chuck Ebbert <cebbert@redhat.com> - 2.6.36-0.20.rc3.git4
- Linux 2.6.36-rc3-git4
diff --git a/wacom-01-add-fuzz-parameters-to-features.patch b/wacom-01-add-fuzz-parameters-to-features.patch
new file mode 100644
index 000000000..4162726d3
--- /dev/null
+++ b/wacom-01-add-fuzz-parameters-to-features.patch
@@ -0,0 +1,69 @@
+From: Henrik Rydberg <rydberg@euromail.se>
+Date: Sun, 5 Sep 2010 19:25:11 +0000 (-0700)
+Subject: Input: wacom - add fuzz parameters to features
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=fed87e655a2c20468d628b37424af58287803afe
+
+Input: wacom - add fuzz parameters to features
+
+The signal-to-noise ratio varies between devices, but currently all
+devices are treated the same way. Add fuzz parameters to the feature
+struct, allowing for tailored treatment of devices.
+
+Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 42ba369..e510e4f 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -333,8 +333,12 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ struct usb_host_interface *interface = intf->cur_altsetting;
+ struct hid_descriptor *hid_desc;
+
+- /* default device to penabled */
++ /* default features */
+ features->device_type = BTN_TOOL_PEN;
++ features->x_fuzz = 4;
++ features->y_fuzz = 4;
++ features->pressure_fuzz = 0;
++ features->distance_fuzz = 0;
+
+ /* only Tablet PCs need to retrieve the info */
+ if ((features->type != TABLETPC) && (features->type != TABLETPC2FG))
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 6e29bad..6d7e164 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -951,9 +951,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+
+ __set_bit(BTN_TOUCH, input_dev->keybit);
+
+- input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0);
+- input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0);
+- input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0);
++ input_set_abs_params(input_dev, ABS_X, 0, features->x_max,
++ features->x_fuzz, 0);
++ input_set_abs_params(input_dev, ABS_Y, 0, features->y_max,
++ features->y_fuzz, 0);
++ input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max,
++ features->pressure_fuzz, 0);
+
+ __set_bit(ABS_MISC, input_dev->absbit);
+
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index 99e1a54..d769e9a 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -73,6 +73,10 @@ struct wacom_features {
+ int y_phy;
+ unsigned char unit;
+ unsigned char unitExpo;
++ int x_fuzz;
++ int y_fuzz;
++ int pressure_fuzz;
++ int distance_fuzz;
+ };
+
+ struct wacom_shared {
diff --git a/wacom-02-parse-the-bamboo-device-family.patch b/wacom-02-parse-the-bamboo-device-family.patch
new file mode 100644
index 000000000..f24d04d01
--- /dev/null
+++ b/wacom-02-parse-the-bamboo-device-family.patch
@@ -0,0 +1,122 @@
+From: Ping Cheng <pinglinux@gmail.com>
+Date: Sun, 5 Sep 2010 19:25:40 +0000 (-0700)
+Subject: Input: wacom - parse the Bamboo device family
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=4a88081e739a41d6d70bace7e0a027f9054ab540
+
+Input: wacom - parse the Bamboo device family
+
+The Bamboo devices have multiple interfaces which need to be setup
+separately. Use the HID parsing mechanism to achieve that.
+
+Signed-off-by: Ping Cheng <pinglinux@gmail.com>
+Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index e510e4f..98cba08 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -195,17 +195,30 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
+ features->pktlen = WACOM_PKGLEN_TPC2FG;
+ features->device_type = BTN_TOOL_TRIPLETAP;
+ }
+- features->x_max =
+- get_unaligned_le16(&report[i + 3]);
+- features->x_phy =
+- get_unaligned_le16(&report[i + 6]);
+- features->unit = report[i + 9];
+- features->unitExpo = report[i + 11];
+- i += 12;
++ if (features->type == BAMBOO_PT) {
++ /* need to reset back */
++ features->pktlen = WACOM_PKGLEN_BBTOUCH;
++ features->device_type = BTN_TOOL_TRIPLETAP;
++ features->x_phy =
++ get_unaligned_le16(&report[i + 5]);
++ features->x_max =
++ get_unaligned_le16(&report[i + 8]);
++ i += 15;
++ } else {
++ features->x_max =
++ get_unaligned_le16(&report[i + 3]);
++ features->x_phy =
++ get_unaligned_le16(&report[i + 6]);
++ features->unit = report[i + 9];
++ features->unitExpo = report[i + 11];
++ i += 12;
++ }
+ } else if (pen) {
+ /* 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]);
+@@ -234,6 +247,15 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
+ 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;
++ features->device_type = BTN_TOOL_TRIPLETAP;
++ features->y_phy =
++ get_unaligned_le16(&report[i + 3]);
++ features->y_max =
++ get_unaligned_le16(&report[i + 6]);
++ i += 12;
+ } else {
+ features->y_max =
+ features->x_max;
+@@ -245,6 +267,8 @@ 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]);
+@@ -341,7 +365,8 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ features->distance_fuzz = 0;
+
+ /* only Tablet PCs need to retrieve the info */
+- if ((features->type != TABLETPC) && (features->type != TABLETPC2FG))
++ if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
++ (features->type != BAMBOO_PT))
+ goto out;
+
+ if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
+@@ -499,7 +524,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+
+ strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
+
+- if (features->type == TABLETPC || features->type == TABLETPC2FG) {
++ if (features->type == TABLETPC || features->type == TABLETPC2FG ||
++ features->type == BAMBOO_PT) {
+ /* Append the device type to the name */
+ strlcat(wacom_wac->name,
+ features->device_type == BTN_TOOL_PEN ?
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index d769e9a..fb30895 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -21,6 +21,7 @@
+ #define WACOM_PKGLEN_INTUOS 10
+ #define WACOM_PKGLEN_TPC1FG 5
+ #define WACOM_PKGLEN_TPC2FG 14
++#define WACOM_PKGLEN_BBTOUCH 20
+
+ /* device IDs */
+ #define STYLUS_DEVICE_ID 0x02
+@@ -44,6 +45,7 @@ enum {
+ PTU,
+ PL,
+ DTU,
++ BAMBOO_PT,
+ INTUOS,
+ INTUOS3S,
+ INTUOS3,
diff --git a/wacom-03-collect-device-quirks-into-single-function.patch b/wacom-03-collect-device-quirks-into-single-function.patch
new file mode 100644
index 000000000..7bf768770
--- /dev/null
+++ b/wacom-03-collect-device-quirks-into-single-function.patch
@@ -0,0 +1,107 @@
+From: Henrik Rydberg <rydberg@euromail.se>
+Date: Sun, 5 Sep 2010 19:26:16 +0000 (-0700)
+Subject: Input: wacom - collect device quirks into single function
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=bc73dd39e78dd6e5b34cd938b7f037a8bc041bdd
+
+Input: wacom - collect device quirks into single function
+
+Collect device-specific code into a single function, and use quirks to
+flag specific behavior instead.
+
+Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h
+index 284dfaa..de5adb1 100644
+--- a/drivers/input/tablet/wacom.h
++++ b/drivers/input/tablet/wacom.h
+@@ -118,6 +118,7 @@ struct wacom {
+ 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);
+ #endif
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index 98cba08..fc6fd53 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -381,12 +381,6 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ if (error)
+ goto out;
+
+- /* touch device found but size is not defined. use default */
+- if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) {
+- features->x_max = 1023;
+- features->y_max = 1023;
+- }
+-
+ out:
+ return error;
+ }
+@@ -522,10 +516,11 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
+ if (error)
+ goto fail2;
+
++ wacom_setup_device_quirks(features);
++
+ strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
+
+- if (features->type == TABLETPC || features->type == TABLETPC2FG ||
+- features->type == BAMBOO_PT) {
++ if (features->quirks & WACOM_QUIRK_MULTI_INPUT) {
+ /* Append the device type to the name */
+ strlcat(wacom_wac->name,
+ features->device_type == BTN_TOOL_PEN ?
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 6d7e164..44b4a59 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -941,6 +941,22 @@ static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
+ input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
+ }
+
++
++void wacom_setup_device_quirks(struct wacom_features *features)
++{
++
++ /* touch device found but size is not defined. use default */
++ if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) {
++ features->x_max = 1023;
++ features->y_max = 1023;
++ }
++
++ /* these device have multiple inputs */
++ if (features->type == TABLETPC || features->type == TABLETPC2FG ||
++ features->type == BAMBOO_PT)
++ features->quirks |= WACOM_QUIRK_MULTI_INPUT;
++}
++
+ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ struct wacom_wac *wacom_wac)
+ {
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index fb30895..6a1ff10 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -38,6 +38,9 @@
+ #define WACOM_REPORT_TPC1FG 6
+ #define WACOM_REPORT_TPC2FG 13
+
++/* device quirks */
++#define WACOM_QUIRK_MULTI_INPUT 0x0001
++
+ enum {
+ PENPARTNER = 0,
+ GRAPHIRE,
+@@ -79,6 +82,7 @@ struct wacom_features {
+ int y_fuzz;
+ int pressure_fuzz;
+ int distance_fuzz;
++ unsigned quirks;
+ };
+
+ struct wacom_shared {
diff --git a/wacom-04-add-support-for-the-bamboo-touch-trackpad.patch b/wacom-04-add-support-for-the-bamboo-touch-trackpad.patch
new file mode 100644
index 000000000..f104b2ce3
--- /dev/null
+++ b/wacom-04-add-support-for-the-bamboo-touch-trackpad.patch
@@ -0,0 +1,172 @@
+From: Henrik Rydberg <rydberg@euromail.se>
+Date: Sun, 5 Sep 2010 19:53:16 +0000 (-0700)
+Subject: Input: wacom - add support for the Bamboo Touch trackpad
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=cb734c03680eaaad64a20a666300eafd1ac260b2
+
+Input: wacom - add support for the Bamboo Touch trackpad
+
+Add support for the Bamboo Touch trackpad, and make it work with
+both the Synaptics X Driver and the Multitouch X Driver. The device
+uses MT slots internally, so the choice of protocol is a given.
+
+Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 44b4a59..4e9b1dd 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -855,6 +855,53 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
+ return retval;
+ }
+
++static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
++{
++ struct input_dev *input = wacom->input;
++ unsigned char *data = wacom->data;
++ int sp = 0, sx = 0, sy = 0, count = 0;
++ int i;
++
++ if (len != WACOM_PKGLEN_BBTOUCH)
++ return 0;
++
++ for (i = 0; i < 2; i++) {
++ int p = data[9 * i + 2];
++ input_mt_slot(input, i);
++ if (p) {
++ int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff;
++ int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff;
++ input_report_abs(input, ABS_MT_PRESSURE, p);
++ input_report_abs(input, ABS_MT_POSITION_X, x);
++ input_report_abs(input, ABS_MT_POSITION_Y, y);
++ if (wacom->id[i] < 0)
++ wacom->id[i] = wacom->trk_id++ & MAX_TRACKING_ID;
++ if (!count++)
++ sp = p, sx = x, sy = y;
++ } else {
++ wacom->id[i] = -1;
++ }
++ input_report_abs(input, ABS_MT_TRACKING_ID, wacom->id[i]);
++ }
++
++ input_report_key(input, BTN_TOUCH, count > 0);
++ input_report_key(input, BTN_TOOL_FINGER, count == 1);
++ input_report_key(input, BTN_TOOL_DOUBLETAP, count == 2);
++
++ input_report_abs(input, ABS_PRESSURE, sp);
++ input_report_abs(input, ABS_X, sx);
++ input_report_abs(input, ABS_Y, sy);
++
++ 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);
++
++ input_sync(input);
++
++ return 0;
++}
++
+ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ {
+ bool sync;
+@@ -900,6 +947,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ sync = wacom_tpc_irq(wacom_wac, len);
+ break;
+
++ case BAMBOO_PT:
++ sync = wacom_bpt_irq(wacom_wac, len);
++ break;
++
+ default:
+ sync = false;
+ break;
+@@ -955,6 +1006,13 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ if (features->type == TABLETPC || features->type == TABLETPC2FG ||
+ features->type == BAMBOO_PT)
+ features->quirks |= WACOM_QUIRK_MULTI_INPUT;
++
++ /* quirks for bamboo touch */
++ if (features->type == BAMBOO_PT &&
++ features->device_type == BTN_TOOL_TRIPLETAP) {
++ features->pressure_max = 256;
++ features->pressure_fuzz = 16;
++ }
+ }
+
+ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+@@ -1095,6 +1153,33 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ case PENPARTNER:
+ __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
+ break;
++
++ case BAMBOO_PT:
++ __clear_bit(ABS_MISC, input_dev->absbit);
++
++ if (features->device_type == BTN_TOOL_TRIPLETAP) {
++ __set_bit(BTN_LEFT, input_dev->keybit);
++ __set_bit(BTN_FORWARD, input_dev->keybit);
++ __set_bit(BTN_BACK, input_dev->keybit);
++ __set_bit(BTN_RIGHT, input_dev->keybit);
++
++ __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
++ __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
++
++ input_mt_create_slots(input_dev, 2);
++ 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);
++ input_set_abs_params(input_dev, ABS_MT_PRESSURE,
++ 0, features->pressure_max,
++ features->pressure_fuzz, 0);
++ input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0,
++ MAX_TRACKING_ID, 0, 0);
++ }
++ break;
+ }
+ }
+
+@@ -1232,6 +1317,8 @@ static const struct wacom_features wacom_features_0xE3 =
+ { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG };
+ static const struct wacom_features wacom_features_0x47 =
+ { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS };
++static struct wacom_features wacom_features_0xD0 =
++ { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
+
+ #define USB_DEVICE_WACOM(prod) \
+ USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \
+@@ -1296,6 +1383,7 @@ const struct usb_device_id wacom_ids[] = {
+ { USB_DEVICE_WACOM(0xC6) },
+ { USB_DEVICE_WACOM(0xC7) },
+ { USB_DEVICE_WACOM(0xCE) },
++ { USB_DEVICE_WACOM(0xD0) },
+ { 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 6a1ff10..a23d6a5 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -41,6 +41,9 @@
+ /* device quirks */
+ #define WACOM_QUIRK_MULTI_INPUT 0x0001
+
++/* largest reported tracking id */
++#define MAX_TRACKING_ID 0xfff
++
+ enum {
+ PENPARTNER = 0,
+ GRAPHIRE,
+@@ -96,6 +99,7 @@ struct wacom_wac {
+ int id[3];
+ __u32 serial[2];
+ int last_finger;
++ int trk_id;
+ struct wacom_features features;
+ struct wacom_shared *shared;
+ struct input_dev *input;
diff --git a/wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch b/wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch
new file mode 100644
index 000000000..1809ec03e
--- /dev/null
+++ b/wacom-05-add-a-quirk-for-low-resolution-bamboo-devices.patch
@@ -0,0 +1,69 @@
+From: Henrik Rydberg <rydberg@euromail.se>
+Date: Sun, 5 Sep 2010 19:57:13 +0000 (-0700)
+Subject: Input: wacom - add a quirk for low resolution Bamboo devices
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=f4ccbef2886968ed409939531f6dd0474d53a12a
+
+Input: wacom - add a quirk for low resolution Bamboo devices
+
+The Bamboo Touch reports a sub-screen resolution of 480x320. The
+signal-to-noise ratio is only about 100, so filtering is needed in
+order to reduce the jitter to a usable level. However, the low
+resolution leads to round-off errors in the EWMA filter, resulting in
+extremely jerky pointer motion. This patch explicitly sets a higher
+resolution for those devices, and tells this to the completion handler
+via a low-resolution quirk.
+
+Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 4e9b1dd..2f4411a 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -857,6 +857,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
+
+ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ {
++ struct wacom_features *features = &wacom->features;
+ struct input_dev *input = wacom->input;
+ unsigned char *data = wacom->data;
+ int sp = 0, sx = 0, sy = 0, count = 0;
+@@ -871,6 +872,10 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ if (p) {
+ int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff;
+ int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff;
++ if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
++ x <<= 5;
++ y <<= 5;
++ }
+ input_report_abs(input, ABS_MT_PRESSURE, p);
+ input_report_abs(input, ABS_MT_POSITION_X, x);
+ input_report_abs(input, ABS_MT_POSITION_Y, y);
+@@ -1010,8 +1015,13 @@ void wacom_setup_device_quirks(struct wacom_features *features)
+ /* quirks for bamboo touch */
+ if (features->type == BAMBOO_PT &&
+ features->device_type == BTN_TOOL_TRIPLETAP) {
++ features->x_max <<= 5;
++ features->y_max <<= 5;
++ features->x_fuzz <<= 5;
++ features->y_fuzz <<= 5;
+ features->pressure_max = 256;
+ features->pressure_fuzz = 16;
++ features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
+ }
+ }
+
+diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
+index a23d6a5..00ca015 100644
+--- a/drivers/input/tablet/wacom_wac.h
++++ b/drivers/input/tablet/wacom_wac.h
+@@ -40,6 +40,7 @@
+
+ /* device quirks */
+ #define WACOM_QUIRK_MULTI_INPUT 0x0001
++#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002
+
+ /* largest reported tracking id */
+ #define MAX_TRACKING_ID 0xfff
diff --git a/wacom-06-request-tablet-data-for-bamboo-pens.patch b/wacom-06-request-tablet-data-for-bamboo-pens.patch
new file mode 100644
index 000000000..8b31d4eab
--- /dev/null
+++ b/wacom-06-request-tablet-data-for-bamboo-pens.patch
@@ -0,0 +1,55 @@
+From: Chris Bagwell <chris@cnpbagwell.com>
+Date: Sun, 12 Sep 2010 07:08:40 +0000 (-0700)
+Subject: Input: wacom - request tablet data for Bamboo Pens
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=3dc9f40de4dddf9147b80cf15be633189a2b70f4
+
+Input: wacom - request tablet data for Bamboo Pens
+
+Bamboo P&T need to use second form of usb_set_report() to
+ask to report tablet data.
+
+With previous addition of Bamboo Touch, BTN_TOOL_TRIPLETAP is now used
+for both TABLETPC2FG and BAMBOO_PT types. So reduced check to
+match type=TABLETPC2FG.
+
+This change shows redundant check for !TABLETPC2FG in else statement.
+
+Signed-off-by: Chris Bagwell <chris@cnpbagwell.com>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
+index fc6fd53..1e3af29 100644
+--- a/drivers/input/tablet/wacom_sys.c
++++ b/drivers/input/tablet/wacom_sys.c
+@@ -319,8 +319,9 @@ 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 2FGT or not a Tablet PC */
+- if (features->device_type == BTN_TOOL_TRIPLETAP) {
++ /* ask to report tablet data if it is 2FGT Tablet PC or
++ * not a Tablet PC */
++ if (features->type == TABLETPC2FG) {
+ do {
+ rep_data[0] = 3;
+ rep_data[1] = 4;
+@@ -332,7 +333,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat
+ WAC_HID_FEATURE_REPORT, report_id,
+ rep_data, 3);
+ } while ((error < 0 || rep_data[1] != 4) && limit++ < 5);
+- } else if (features->type != TABLETPC && features->type != TABLETPC2FG) {
++ } else if (features->type != TABLETPC) {
+ do {
+ rep_data[0] = 2;
+ rep_data[1] = 2;
+@@ -364,7 +365,7 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
+ features->pressure_fuzz = 0;
+ features->distance_fuzz = 0;
+
+- /* only Tablet PCs need to retrieve the info */
++ /* only Tablet PCs and Bamboo P&T need to retrieve the info */
+ if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
+ (features->type != BAMBOO_PT))
+ goto out;
diff --git a/wacom-07-move-bamboo-touch-irq-to-its-own-function.patch b/wacom-07-move-bamboo-touch-irq-to-its-own-function.patch
new file mode 100644
index 000000000..7495ac390
--- /dev/null
+++ b/wacom-07-move-bamboo-touch-irq-to-its-own-function.patch
@@ -0,0 +1,52 @@
+From: Chris Bagwell <chris@cnpbagwell.com>
+Date: Sun, 12 Sep 2010 07:09:27 +0000 (-0700)
+Subject: Input: wacom - move Bamboo Touch irq to its own function
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=e1d38e49ad97eec5024342e1244279b645e36688
+
+Input: wacom - move Bamboo Touch irq to its own function
+
+This is in preparation of pen support in same irq handler.
+
+Signed-off-by: Chris Bagwell <chris@cnpbagwell.com>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 2f4411a..2f7ed9a 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -855,7 +855,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
+ return retval;
+ }
+
+-static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
++static int wacom_bpt_touch(struct wacom_wac *wacom)
+ {
+ struct wacom_features *features = &wacom->features;
+ struct input_dev *input = wacom->input;
+@@ -863,9 +863,6 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ int sp = 0, sx = 0, sy = 0, count = 0;
+ int i;
+
+- if (len != WACOM_PKGLEN_BBTOUCH)
+- return 0;
+-
+ for (i = 0; i < 2; i++) {
+ int p = data[9 * i + 2];
+ input_mt_slot(input, i);
+@@ -907,6 +904,14 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
+ return 0;
+ }
+
++static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
++{
++ if (len == WACOM_PKGLEN_BBTOUCH)
++ return wacom_bpt_touch(wacom);
++
++ return 0;
++}
++
+ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
+ {
+ bool sync;
diff --git a/wacom-08-add-support-for-bamboo-pen.patch b/wacom-08-add-support-for-bamboo-pen.patch
new file mode 100644
index 000000000..319bf6c53
--- /dev/null
+++ b/wacom-08-add-support-for-bamboo-pen.patch
@@ -0,0 +1,130 @@
+From: Chris Bagwell <chris@cnpbagwell.com>
+Date: Sun, 12 Sep 2010 07:11:35 +0000 (-0700)
+Subject: Input: wacom - add support for Bamboo Pen
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=2aaacb153689dbe9064e4db7e9d00de0edfc1fa0
+
+Input: wacom - add support for Bamboo Pen
+
+This adds support for Pen on Bamboo Pen and Bamboo Pen&Touch devices.
+Touchpad is handled by previous Bamboo Touch logic.
+
+Signed-off-by: Chris Bagwell <chris@cnpbagwell.com>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 2f7ed9a..536156b 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -904,10 +904,75 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
+ return 0;
+ }
+
++static int wacom_bpt_pen(struct wacom_wac *wacom)
++{
++ struct input_dev *input = wacom->input;
++ 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;
++
++ /*
++ * All reports shared between PEN and RUBBER tool must be
++ * forced to a known starting value (zero) when transitioning to
++ * out-of-prox.
++ *
++ * If not reset then, to userspace, it will look like lost events
++ * if new tool comes in-prox with same values as previous tool sent.
++ *
++ * Hardware does report zero in most out-of-prox cases but not all.
++ */
++ if (prox) {
++ if (!wacom->shared->stylus_in_proximity) {
++ if (data[1] & 0x08) {
++ wacom->tool[0] = BTN_TOOL_RUBBER;
++ wacom->id[0] = ERASER_DEVICE_ID;
++ } else {
++ wacom->tool[0] = BTN_TOOL_PEN;
++ wacom->id[0] = STYLUS_DEVICE_ID;
++ }
++ wacom->shared->stylus_in_proximity = true;
++ }
++ x = le16_to_cpup((__le16 *)&data[2]);
++ y = le16_to_cpup((__le16 *)&data[4]);
++ p = le16_to_cpup((__le16 *)&data[6]);
++ d = data[8];
++ pen = data[1] & 0x01;
++ btn1 = data[1] & 0x02;
++ btn2 = data[1] & 0x04;
++ }
++
++ input_report_key(input, BTN_TOUCH, pen);
++ input_report_key(input, BTN_STYLUS, btn1);
++ input_report_key(input, BTN_STYLUS2, btn2);
++
++ input_report_abs(input, ABS_X, x);
++ input_report_abs(input, ABS_Y, y);
++ input_report_abs(input, ABS_PRESSURE, p);
++ input_report_abs(input, ABS_DISTANCE, d);
++
++ if (!prox) {
++ wacom->id[0] = 0;
++ wacom->shared->stylus_in_proximity = false;
++ }
++
++ input_report_key(input, wacom->tool[0], prox); /* PEN or RUBBER */
++ input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */
++
++ return 1;
++}
++
+ 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)
++ return wacom_bpt_pen(wacom);
+
+ return 0;
+ }
+@@ -1193,6 +1258,11 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
+ features->pressure_fuzz, 0);
+ input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0,
+ MAX_TRACKING_ID, 0, 0);
++ } else if (features->device_type == BTN_TOOL_PEN) {
++ __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
++ __set_bit(BTN_TOOL_PEN, input_dev->keybit);
++ __set_bit(BTN_STYLUS, input_dev->keybit);
++ __set_bit(BTN_STYLUS2, input_dev->keybit);
+ }
+ break;
+ }
+@@ -1334,6 +1404,12 @@ static const struct wacom_features wacom_features_0x47 =
+ { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS };
+ static struct wacom_features wacom_features_0xD0 =
+ { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
++static struct wacom_features wacom_features_0xD1 =
++ { "Wacom Bamboo 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
++static struct wacom_features wacom_features_0xD2 =
++ { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT };
++static struct wacom_features wacom_features_0xD3 =
++ { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT };
+
+ #define USB_DEVICE_WACOM(prod) \
+ USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \
+@@ -1399,6 +1475,9 @@ const struct usb_device_id wacom_ids[] = {
+ { USB_DEVICE_WACOM(0xC7) },
+ { USB_DEVICE_WACOM(0xCE) },
+ { USB_DEVICE_WACOM(0xD0) },
++ { USB_DEVICE_WACOM(0xD1) },
++ { USB_DEVICE_WACOM(0xD2) },
++ { USB_DEVICE_WACOM(0xD3) },
+ { USB_DEVICE_WACOM(0xF0) },
+ { USB_DEVICE_WACOM(0xCC) },
+ { USB_DEVICE_WACOM(0x90) },
diff --git a/wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch b/wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch
new file mode 100644
index 000000000..e14954031
--- /dev/null
+++ b/wacom-09-disable-bamboo-touchpad-when-pen-is-being-used.patch
@@ -0,0 +1,31 @@
+From: Chris Bagwell <chris@cnpbagwell.com>
+Date: Sun, 12 Sep 2010 07:12:28 +0000 (-0700)
+Subject: Input: wacom - disable Bamboo touchpad when pen is being used
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdtor%2Finput.git;a=commitdiff_plain;h=33d5f713a19b0f5cb93e0594f7206d2730cf39da
+
+Input: wacom - disable Bamboo touchpad when pen is being used
+
+Signed-off-by: Chris Bagwell <chris@cnpbagwell.com>
+Acked-by: Ping Cheng <pingc@wacom.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+---
+
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
+index 536156b..e1b65ba 100644
+--- a/drivers/input/tablet/wacom_wac.c
++++ b/drivers/input/tablet/wacom_wac.c
+@@ -866,7 +866,13 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
+ for (i = 0; i < 2; i++) {
+ int p = data[9 * i + 2];
+ input_mt_slot(input, i);
+- if (p) {
++ /*
++ * Touch events need to be disabled while stylus is
++ * in proximity because user's hand is resting on touchpad
++ * and sending unwanted events. User expects tablet buttons
++ * to continue working though.
++ */
++ if (p && !wacom->shared->stylus_in_proximity) {
+ int x = get_unaligned_be16(&data[9 * i + 3]) & 0x7ff;
+ int y = get_unaligned_be16(&data[9 * i + 5]) & 0x7ff;
+ if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {