]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
HID: wacom: peport In Range event according to the spec
authorPing Cheng <pinglinux@gmail.com>
Fri, 9 Jan 2015 19:05:13 +0000 (11:05 -0800)
committerJiri Kosina <jkosina@suse.cz>
Mon, 12 Jan 2015 09:16:32 +0000 (10:16 +0100)
Some Cintiq and Intuos tablets report In Range event. This event is sent before
valid data is reported when tool enters proximity; or before out of proximity
event is reported when tool exits.

While entering proximity, In Range means a pen is detected. This information
can be used for palm/touch rejection on both pen and touch enabled devices.
While exiting, it means the tool has reached its maximum detectable distance.

Signed-off-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom_wac.c
drivers/hid/wacom_wac.h

index 527668913a260c1db124601138ea2b2bec0fabe2..a4ba8caa2456c962d949fc136d5c051a8fde47e8 100644 (file)
@@ -443,9 +443,6 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
 
        /* Enter report */
        if ((data[1] & 0xfc) == 0xc0) {
-               if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
-                       wacom->shared->stylus_in_proximity = true;
-
                /* serial number of the tool */
                wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
                        (data[4] << 20) + (data[5] << 12) +
@@ -554,19 +551,22 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
           (features->type == CINTIQ && !(data[1] & 0x40)))
                return 1;
 
-       /* Range Report */
-       if ((data[1] & 0xfe) == 0x20) {
+       if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
+               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);
-               if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
-                       wacom->shared->stylus_in_proximity = true;
+               return 2;
        }
 
        /* Exit report */
        if ((data[1] & 0xfe) == 0x80) {
                if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
                        wacom->shared->stylus_in_proximity = false;
+               wacom->reporting_data = false;
 
                /* don't report exit if we don't know the ID */
                if (!wacom->id[idx])
@@ -952,6 +952,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
        input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */
        input_report_key(input, wacom->tool[idx], 1);
        input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
+       wacom->reporting_data = true;
        return 1;
 }
 
index 7afd9294927aeffb29ceec3c5af30332bce72f40..72e78cc189339d96dc56390f3f9a694fb4dd22d3 100644 (file)
@@ -189,6 +189,7 @@ struct wacom_wac {
        int tool[2];
        int id[2];
        __u32 serial[2];
+       bool reporting_data;
        struct wacom_features features;
        struct wacom_shared *shared;
        struct input_dev *input;