Skip to content

Commit d2ec58a

Browse files
skomraJiri Kosina
authored andcommitted
HID: wacom: generic: support generic touch switch
The second generation Intuos Pro is the first device in the generic codepath which has a touchswitch. We utilize a flag in wacom_shared in order to report this switch event received from the pad on the touch input. Signed-off-by: Aaron Skomra <[email protected]> Reviewed-by: Ping Cheng <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent ac2423c commit d2ec58a

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

drivers/hid/wacom_sys.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2053,6 +2053,24 @@ static void wacom_release_resources(struct wacom *wacom)
20532053
wacom->wacom_wac.pad_input = NULL;
20542054
}
20552055

2056+
static void wacom_set_shared_values(struct wacom_wac *wacom_wac)
2057+
{
2058+
if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH) {
2059+
wacom_wac->shared->type = wacom_wac->features.type;
2060+
wacom_wac->shared->touch_input = wacom_wac->touch_input;
2061+
}
2062+
2063+
if (wacom_wac->has_mute_touch_switch)
2064+
wacom_wac->shared->has_mute_touch_switch = true;
2065+
2066+
if (wacom_wac->shared->has_mute_touch_switch &&
2067+
wacom_wac->shared->touch_input) {
2068+
set_bit(EV_SW, wacom_wac->shared->touch_input->evbit);
2069+
input_set_capability(wacom_wac->shared->touch_input, EV_SW,
2070+
SW_MUTE_DEVICE);
2071+
}
2072+
}
2073+
20562074
static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
20572075
{
20582076
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
@@ -2172,13 +2190,7 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
21722190
if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
21732191
error = hid_hw_open(hdev);
21742192

2175-
if ((wacom_wac->features.type == INTUOSHT ||
2176-
wacom_wac->features.type == INTUOSHT2) &&
2177-
(wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)) {
2178-
wacom_wac->shared->type = wacom_wac->features.type;
2179-
wacom_wac->shared->touch_input = wacom_wac->touch_input;
2180-
}
2181-
2193+
wacom_set_shared_values(wacom_wac);
21822194
devres_close_group(&hdev->dev, wacom);
21832195

21842196
return 0;

drivers/hid/wacom_wac.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1728,7 +1728,17 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
17281728
features->device_type |= WACOM_DEVICETYPE_PAD;
17291729
break;
17301730
case WACOM_HID_WD_TOUCHONOFF:
1731-
wacom_map_usage(input, usage, field, EV_SW, SW_MUTE_DEVICE, 0);
1731+
/*
1732+
* This usage, which is used to mute touch events, comes
1733+
* from the pad packet, but is reported on the touch
1734+
* interface. Because the touch interface may not have
1735+
* been created yet, we cannot call wacom_map_usage(). In
1736+
* order to process this usage when we receive it, we set
1737+
* the usage type and code directly.
1738+
*/
1739+
wacom_wac->has_mute_touch_switch = true;
1740+
usage->type = EV_SW;
1741+
usage->code = SW_MUTE_DEVICE;
17321742
features->device_type |= WACOM_DEVICETYPE_PAD;
17331743
break;
17341744
case WACOM_HID_WD_TOUCHSTRIP:
@@ -1807,6 +1817,13 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
18071817
input_event(input, usage->type, usage->code, 0);
18081818
break;
18091819

1820+
case WACOM_HID_WD_TOUCHONOFF:
1821+
if (wacom_wac->shared->touch_input) {
1822+
input_report_switch(wacom_wac->shared->touch_input,
1823+
SW_MUTE_DEVICE, !value);
1824+
input_sync(wacom_wac->shared->touch_input);
1825+
}
1826+
break;
18101827
default:
18111828
input_event(input, usage->type, usage->code, value);
18121829
break;

drivers/hid/wacom_wac.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
116116
#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
117117
#define WACOM_HID_WD_BATTERY_CHARGING (WACOM_HID_UP_WACOMDIGITIZER | 0x0404)
118+
#define WACOM_HID_WD_TOUCHONOFF (WACOM_HID_UP_WACOMDIGITIZER | 0x0454)
118119
#define WACOM_HID_WD_BATTERY_LEVEL (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
119120
#define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
120121
#define WACOM_HID_WD_EXPRESSKEYCAP00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0950)
@@ -124,7 +125,6 @@
124125
#define WACOM_HID_WD_BUTTONLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0993)
125126
#define WACOM_HID_WD_BUTTONRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0994)
126127
#define WACOM_HID_WD_BUTTONCENTER (WACOM_HID_UP_WACOMDIGITIZER | 0x0995)
127-
#define WACOM_HID_WD_TOUCHONOFF (WACOM_HID_UP_WACOMDIGITIZER | 0x0996)
128128
#define WACOM_HID_WD_FINGERWHEEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0d03)
129129
#define WACOM_HID_WD_OFFSETLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d30)
130130
#define WACOM_HID_WD_OFFSETTOP (WACOM_HID_UP_WACOMDIGITIZER | 0x0d31)
@@ -268,6 +268,7 @@ struct wacom_shared {
268268
struct input_dev *touch_input;
269269
struct hid_device *pen;
270270
struct hid_device *touch;
271+
bool has_mute_touch_switch;
271272
};
272273

273274
struct hid_data {
@@ -324,6 +325,7 @@ struct wacom_wac {
324325
int mode_report;
325326
int mode_value;
326327
struct hid_data hid_data;
328+
bool has_mute_touch_switch;
327329
};
328330

329331
#endif

0 commit comments

Comments
 (0)