aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorPing Cheng <pinglinux@gmail.com>2016-01-08 17:16:06 -0800
committerJiri Kosina <jkosina@suse.cz>2016-01-18 23:02:56 +0100
commitc1b03f5511d6aeab3c141c133b492ea492207e64 (patch)
treec9ae729be516edad5853ae2d9afb49978eafc13b /drivers/hid
parentHID: wacom - make sure wacom_intuos_inout only process in/out events (diff)
downloadlinux-dev-c1b03f5511d6aeab3c141c133b492ea492207e64.tar.xz
linux-dev-c1b03f5511d6aeab3c141c133b492ea492207e64.zip
HID: wacom - Cleanup touch arbitration logic
stylus_in_proximity was introduced to support touch arbitration before in range was supported. With in range event, the logic changed. stylus_in_proximity should be set for both in prox and in range events. To finish a clean touch arbitration logic, we should send touch up (if it was down) before posting any general pen events. Signed-off-by: Ping Cheng <pingc@wacom.com> Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/wacom_wac.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index c92ea1a24ee4..28f6a9e2ad6f 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -674,19 +674,22 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
wacom->tool[idx] = BTN_TOOL_PEN;
break;
}
+ wacom->shared->stylus_in_proximity = true;
return 1;
}
- wacom->shared->stylus_in_proximity = true;
- if (wacom->shared->touch_down)
- return 1;
+ /* in Range */
+ if ((data[1] & 0xfe) == 0x20) {
+ wacom->shared->stylus_in_proximity = true;
- /* in Range while exiting */
- if (((data[1] & 0xfe) == 0x20) && wacom->reporting_data) {
- input_report_key(input, BTN_TOUCH, 0);
- input_report_abs(input, ABS_PRESSURE, 0);
- input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
- return 2;
+ /* in Range while exiting */
+ if (wacom->reporting_data) {
+ input_report_key(input, BTN_TOUCH, 0);
+ input_report_abs(input, ABS_PRESSURE, 0);
+ input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
+ return 2;
+ }
+ return 1;
}
/* Exit report */
@@ -871,6 +874,9 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
data[0] != WACOM_REPORT_INTUOS_PEN)
return 0;
+ if (wacom->shared->touch_down)
+ return 1;
+
/* don't report events if we don't know the tool ID */
if (!wacom->id[idx]) {
/* but reschedule a read of the current tool */