HID: wacom - Cleanup touch arbitration logic
authorPing Cheng <pinglinux@gmail.com>
Sat, 9 Jan 2016 01:16:06 +0000 (17:16 -0800)
committerJiri Kosina <jkosina@suse.cz>
Mon, 18 Jan 2016 22:02:56 +0000 (23:02 +0100)
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>
drivers/hid/wacom_wac.c

index c92ea1a24ee41fe9442ac04121118a2453018d96..28f6a9e2ad6fe9f2c3efcf8196da68aa3bbcbb81 100644 (file)
@@ -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 */