HID: wacom: generic: support touch on/off softkey
authorPing Cheng <pinglinux@gmail.com>
Wed, 15 Feb 2017 05:27:45 +0000 (21:27 -0800)
committerJiri Kosina <jkosina@suse.cz>
Mon, 6 Mar 2017 13:07:31 +0000 (14:07 +0100)
Wacom Cintiq Pro has a softkey to turn touch on/off. Since it is
a softkey, hardware/firmware still reports touch events no matter
what state the softkey is. We need to ignore touch events when
the key is in off mode.

Signed-off-by: Ping Cheng <ping.cheng@wacom.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Aaron Armstrong Skomra <aaron.skomra@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom_sys.c
drivers/hid/wacom_wac.c
drivers/hid/wacom_wac.h

index 9aec5b3a45bde28ba853ead5141de866d92920ec..037b9c04745a1a0474113176a7599c1dcb5055d0 100644 (file)
@@ -2100,8 +2100,10 @@ static void wacom_set_shared_values(struct wacom_wac *wacom_wac)
                wacom_wac->shared->touch_input = wacom_wac->touch_input;
        }
 
-       if (wacom_wac->has_mute_touch_switch)
+       if (wacom_wac->has_mute_touch_switch) {
                wacom_wac->shared->has_mute_touch_switch = true;
+               wacom_wac->shared->is_touch_on = true;
+       }
 
        if (wacom_wac->shared->has_mute_touch_switch &&
            wacom_wac->shared->touch_input) {
index 2c399a4239579017655fa8eb22b5a6ef43a3a39e..68fb9e114a0b36c2731c4b56cff37a8e81e9b5c7 100644 (file)
@@ -1739,6 +1739,7 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
                features->device_type |= WACOM_DEVICETYPE_PAD;
                break;
        case WACOM_HID_WD_TOUCHONOFF:
+       case WACOM_HID_WD_MUTE_DEVICE:
                /*
                 * This usage, which is used to mute touch events, comes
                 * from the pad packet, but is reported on the touch
@@ -1831,6 +1832,7 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
        struct wacom_features *features = &wacom_wac->features;
        unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
        int i;
+       bool is_touch_on = value;
 
        /*
         * Avoid reporting this event and setting inrange_state if this usage
@@ -1850,10 +1852,17 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
                        input_event(input, usage->type, usage->code, 0);
                break;
 
+       case WACOM_HID_WD_MUTE_DEVICE:
+               if (wacom_wac->shared->touch_input && value) {
+                       wacom_wac->shared->is_touch_on = !wacom_wac->shared->is_touch_on;
+                       is_touch_on = wacom_wac->shared->is_touch_on;
+               }
+
+               /* fall through*/
        case WACOM_HID_WD_TOUCHONOFF:
                if (wacom_wac->shared->touch_input) {
                        input_report_switch(wacom_wac->shared->touch_input,
-                                           SW_MUTE_DEVICE, !value);
+                                           SW_MUTE_DEVICE, !is_touch_on);
                        input_sync(wacom_wac->shared->touch_input);
                }
                break;
@@ -2212,6 +2221,13 @@ static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
        bool prox = hid_data->tipswitch &&
                    report_touch_events(wacom_wac);
 
+       if (wacom_wac->shared->has_mute_touch_switch &&
+           !wacom_wac->shared->is_touch_on) {
+               if (!wacom_wac->shared->touch_down)
+                       return;
+               prox = 0;
+       }
+
        wacom_wac->hid_data.num_received++;
        if (wacom_wac->hid_data.num_received > wacom_wac->hid_data.num_expected)
                return;
index d9669c6116b7dadc77a44d2ad5fa8fc2bdc72b9c..839bd4b6388c6f2f442cf348004ce37b3ac2127a 100644 (file)
 #define WACOM_HID_WD_EXPRESSKEY00       (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
 #define WACOM_HID_WD_EXPRESSKEYCAP00    (WACOM_HID_UP_WACOMDIGITIZER | 0x0950)
 #define WACOM_HID_WD_MODE_CHANGE        (WACOM_HID_UP_WACOMDIGITIZER | 0x0980)
+#define WACOM_HID_WD_MUTE_DEVICE        (WACOM_HID_UP_WACOMDIGITIZER | 0x0981)
 #define WACOM_HID_WD_CONTROLPANEL       (WACOM_HID_UP_WACOMDIGITIZER | 0x0982)
 #define WACOM_HID_WD_ONSCREEN_KEYBOARD  (WACOM_HID_UP_WACOMDIGITIZER | 0x0983)
 #define WACOM_HID_WD_BUTTONCONFIG       (WACOM_HID_UP_WACOMDIGITIZER | 0x0986)
@@ -274,6 +275,7 @@ struct wacom_shared {
        struct hid_device *pen;
        struct hid_device *touch;
        bool has_mute_touch_switch;
+       bool is_touch_on;
 };
 
 struct hid_data {