@@ -2036,7 +2036,6 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
2036
2036
wacom_wac -> has_mute_touch_switch = true;
2037
2037
usage -> type = EV_SW ;
2038
2038
usage -> code = SW_MUTE_DEVICE ;
2039
- features -> device_type |= WACOM_DEVICETYPE_PAD ;
2040
2039
break ;
2041
2040
case WACOM_HID_WD_TOUCHSTRIP :
2042
2041
wacom_map_usage (input , usage , field , EV_ABS , ABS_RX , 0 );
@@ -2114,6 +2113,30 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
2114
2113
wacom_wac -> hid_data .inrange_state |= value ;
2115
2114
}
2116
2115
2116
+ /* Process touch switch state first since it is reported through touch interface,
2117
+ * which is indepentent of pad interface. In the case when there are no other pad
2118
+ * events, the pad interface will not even be created.
2119
+ */
2120
+ if ((equivalent_usage == WACOM_HID_WD_MUTE_DEVICE ) ||
2121
+ (equivalent_usage == WACOM_HID_WD_TOUCHONOFF )) {
2122
+ if (wacom_wac -> shared -> touch_input ) {
2123
+ bool * is_touch_on = & wacom_wac -> shared -> is_touch_on ;
2124
+
2125
+ if (equivalent_usage == WACOM_HID_WD_MUTE_DEVICE && value )
2126
+ * is_touch_on = !(* is_touch_on );
2127
+ else if (equivalent_usage == WACOM_HID_WD_TOUCHONOFF )
2128
+ * is_touch_on = value ;
2129
+
2130
+ input_report_switch (wacom_wac -> shared -> touch_input ,
2131
+ SW_MUTE_DEVICE , !(* is_touch_on ));
2132
+ input_sync (wacom_wac -> shared -> touch_input );
2133
+ }
2134
+ return ;
2135
+ }
2136
+
2137
+ if (!input )
2138
+ return ;
2139
+
2117
2140
switch (equivalent_usage ) {
2118
2141
case WACOM_HID_WD_TOUCHRING :
2119
2142
/*
@@ -2149,22 +2172,6 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
2149
2172
input_event (input , usage -> type , usage -> code , 0 );
2150
2173
break ;
2151
2174
2152
- case WACOM_HID_WD_MUTE_DEVICE :
2153
- case WACOM_HID_WD_TOUCHONOFF :
2154
- if (wacom_wac -> shared -> touch_input ) {
2155
- bool * is_touch_on = & wacom_wac -> shared -> is_touch_on ;
2156
-
2157
- if (equivalent_usage == WACOM_HID_WD_MUTE_DEVICE && value )
2158
- * is_touch_on = !(* is_touch_on );
2159
- else if (equivalent_usage == WACOM_HID_WD_TOUCHONOFF )
2160
- * is_touch_on = value ;
2161
-
2162
- input_report_switch (wacom_wac -> shared -> touch_input ,
2163
- SW_MUTE_DEVICE , !(* is_touch_on ));
2164
- input_sync (wacom_wac -> shared -> touch_input );
2165
- }
2166
- break ;
2167
-
2168
2175
case WACOM_HID_WD_MODE_CHANGE :
2169
2176
if (wacom_wac -> is_direct_mode != value ) {
2170
2177
wacom_wac -> is_direct_mode = value ;
@@ -2851,7 +2858,7 @@ void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
2851
2858
/* usage tests must precede field tests */
2852
2859
if (WACOM_BATTERY_USAGE (usage ))
2853
2860
wacom_wac_battery_event (hdev , field , usage , value );
2854
- else if (WACOM_PAD_FIELD (field ) && wacom -> wacom_wac . pad_input )
2861
+ else if (WACOM_PAD_FIELD (field ))
2855
2862
wacom_wac_pad_event (hdev , field , usage , value );
2856
2863
else if (WACOM_PEN_FIELD (field ) && wacom -> wacom_wac .pen_input )
2857
2864
wacom_wac_pen_event (hdev , field , usage , value );
0 commit comments