HID: wacom: generic: add the "Report Valid" usage
authorAaron Armstrong Skomra <skomra@gmail.com>
Tue, 6 Mar 2018 18:48:35 +0000 (10:48 -0800)
committerJiri Kosina <jkosina@suse.cz>
Wed, 7 Mar 2018 14:21:44 +0000 (15:21 +0100)
Wacom Bluetooth reports contain multiple pen frames per report.
Each frame contains a flag indicating if the frame is valid.
Future Wacom devices with this type of report may contain HID
descriptors, add support for this usage to the generic codepath
of the Wacom driver.

Signed-off-by: Aaron Armstrong Skomra <skomra@gmail.com>
Reviewed-by: Ping Cheng <ping.cheng@wacom.com>
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom_wac.c
drivers/hid/wacom_wac.h

index 7a0a7f67e7eda0d98e0604e93d17a38e2130675f..afa8c9f24a42515d39dec538b1c5cf5f8f0d70ba 100644 (file)
@@ -1715,7 +1715,8 @@ int wacom_equivalent_usage(int usage)
                    usage == WACOM_HID_WD_TOUCHSTRIP ||
                    usage == WACOM_HID_WD_TOUCHSTRIP2 ||
                    usage == WACOM_HID_WD_TOUCHRING ||
-                   usage == WACOM_HID_WD_TOUCHRINGSTATUS) {
+                   usage == WACOM_HID_WD_TOUCHRINGSTATUS ||
+                   usage == WACOM_HID_WD_REPORT_VALID) {
                        return usage;
                }
 
@@ -2199,6 +2200,9 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
        struct input_dev *input = wacom_wac->pen_input;
        unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
 
+       if (wacom_wac->is_invalid_bt_frame)
+               return;
+
        switch (equivalent_usage) {
        case HID_GD_Z:
                /*
@@ -2295,6 +2299,9 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
                                 features->offset_bottom);
                features->offset_bottom = value;
                return;
+       case WACOM_HID_WD_REPORT_VALID:
+               wacom_wac->is_invalid_bt_frame = !value;
+               return;
        }
 
        /* send pen events only when touch is up or forced out
@@ -2313,6 +2320,10 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
 static void wacom_wac_pen_pre_report(struct hid_device *hdev,
                struct hid_report *report)
 {
+       struct wacom *wacom = hid_get_drvdata(hdev);
+       struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+
+       wacom_wac->is_invalid_bt_frame = false;
        return;
 }
 
@@ -2325,6 +2336,9 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
        bool range = wacom_wac->hid_data.inrange_state;
        bool sense = wacom_wac->hid_data.sense_state;
 
+       if (wacom_wac->is_invalid_bt_frame)
+               return;
+
        if (!wacom_wac->tool[0] && range) { /* first in range */
                /* Going into range select tool */
                if (wacom_wac->hid_data.invert_state)
index 827d8fc4a3f257ed539113065e032a77569766fc..295fd3718caa0bed767683775c852d47de92fd7b 100644 (file)
 #define WACOM_HID_WD_TOUCHSTRIP2        (WACOM_HID_UP_WACOMDIGITIZER | 0x0137)
 #define WACOM_HID_WD_TOUCHRING          (WACOM_HID_UP_WACOMDIGITIZER | 0x0138)
 #define WACOM_HID_WD_TOUCHRINGSTATUS    (WACOM_HID_UP_WACOMDIGITIZER | 0x0139)
+#define WACOM_HID_WD_REPORT_VALID       (WACOM_HID_UP_WACOMDIGITIZER | 0x01d0)
 #define WACOM_HID_WD_ACCELEROMETER_X    (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
 #define WACOM_HID_WD_ACCELEROMETER_Y    (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
 #define WACOM_HID_WD_ACCELEROMETER_Z    (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
@@ -353,7 +354,7 @@ struct wacom_wac {
        bool has_mute_touch_switch;
        bool has_mode_change;
        bool is_direct_mode;
-
+       bool is_invalid_bt_frame;
 };
 
 #endif