diff options
| -rw-r--r-- | drivers/hid/wacom_sys.c | 26 | ||||
| -rw-r--r-- | drivers/hid/wacom_wac.c | 19 | ||||
| -rw-r--r-- | drivers/hid/wacom_wac.h | 4 |
3 files changed, 40 insertions, 9 deletions
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index a4884e78b3f8..a8e68dc2ca99 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c | |||
| @@ -2053,6 +2053,24 @@ static void wacom_release_resources(struct wacom *wacom) | |||
| 2053 | wacom->wacom_wac.pad_input = NULL; | 2053 | wacom->wacom_wac.pad_input = NULL; |
| 2054 | } | 2054 | } |
| 2055 | 2055 | ||
| 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 | |||
| 2056 | static int wacom_parse_and_register(struct wacom *wacom, bool wireless) | 2074 | static int wacom_parse_and_register(struct wacom *wacom, bool wireless) |
| 2057 | { | 2075 | { |
| 2058 | struct wacom_wac *wacom_wac = &wacom->wacom_wac; | 2076 | struct wacom_wac *wacom_wac = &wacom->wacom_wac; |
| @@ -2172,13 +2190,7 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) | |||
| 2172 | if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) | 2190 | if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) |
| 2173 | error = hid_hw_open(hdev); | 2191 | error = hid_hw_open(hdev); |
| 2174 | 2192 | ||
| 2175 | if ((wacom_wac->features.type == INTUOSHT || | 2193 | wacom_set_shared_values(wacom_wac); |
| 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 | |||
| 2182 | devres_close_group(&hdev->dev, wacom); | 2194 | devres_close_group(&hdev->dev, wacom); |
| 2183 | 2195 | ||
| 2184 | return 0; | 2196 | return 0; |
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 2eeaa05e2068..06d152a286a0 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c | |||
| @@ -1728,7 +1728,17 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev, | |||
| 1728 | features->device_type |= WACOM_DEVICETYPE_PAD; | 1728 | features->device_type |= WACOM_DEVICETYPE_PAD; |
| 1729 | break; | 1729 | break; |
| 1730 | case WACOM_HID_WD_TOUCHONOFF: | 1730 | 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; | ||
| 1732 | features->device_type |= WACOM_DEVICETYPE_PAD; | 1742 | features->device_type |= WACOM_DEVICETYPE_PAD; |
| 1733 | break; | 1743 | break; |
| 1734 | case WACOM_HID_WD_TOUCHSTRIP: | 1744 | case WACOM_HID_WD_TOUCHSTRIP: |
| @@ -1807,6 +1817,13 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field | |||
| 1807 | input_event(input, usage->type, usage->code, 0); | 1817 | input_event(input, usage->type, usage->code, 0); |
| 1808 | break; | 1818 | break; |
| 1809 | 1819 | ||
| 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; | ||
| 1810 | default: | 1827 | default: |
| 1811 | input_event(input, usage->type, usage->code, value); | 1828 | input_event(input, usage->type, usage->code, value); |
| 1812 | break; | 1829 | break; |
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index da38f7736a7a..4feaf94fb08b 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h | |||
| @@ -115,6 +115,7 @@ | |||
| 115 | #define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402) | 115 | #define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402) |
| 116 | #define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403) | 116 | #define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403) |
| 117 | #define WACOM_HID_WD_BATTERY_CHARGING (WACOM_HID_UP_WACOMDIGITIZER | 0x0404) | 117 | #define WACOM_HID_WD_BATTERY_CHARGING (WACOM_HID_UP_WACOMDIGITIZER | 0x0404) |
| 118 | #define WACOM_HID_WD_TOUCHONOFF (WACOM_HID_UP_WACOMDIGITIZER | 0x0454) | ||
| 118 | #define WACOM_HID_WD_BATTERY_LEVEL (WACOM_HID_UP_WACOMDIGITIZER | 0x043b) | 119 | #define WACOM_HID_WD_BATTERY_LEVEL (WACOM_HID_UP_WACOMDIGITIZER | 0x043b) |
| 119 | #define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910) | 120 | #define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910) |
| 120 | #define WACOM_HID_WD_EXPRESSKEYCAP00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0950) | 121 | #define WACOM_HID_WD_EXPRESSKEYCAP00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0950) |
| @@ -124,7 +125,6 @@ | |||
| 124 | #define WACOM_HID_WD_BUTTONLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0993) | 125 | #define WACOM_HID_WD_BUTTONLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0993) |
| 125 | #define WACOM_HID_WD_BUTTONRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0994) | 126 | #define WACOM_HID_WD_BUTTONRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0994) |
| 126 | #define WACOM_HID_WD_BUTTONCENTER (WACOM_HID_UP_WACOMDIGITIZER | 0x0995) | 127 | #define WACOM_HID_WD_BUTTONCENTER (WACOM_HID_UP_WACOMDIGITIZER | 0x0995) |
| 127 | #define WACOM_HID_WD_TOUCHONOFF (WACOM_HID_UP_WACOMDIGITIZER | 0x0996) | ||
| 128 | #define WACOM_HID_WD_FINGERWHEEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0d03) | 128 | #define WACOM_HID_WD_FINGERWHEEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0d03) |
| 129 | #define WACOM_HID_WD_OFFSETLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d30) | 129 | #define WACOM_HID_WD_OFFSETLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d30) |
| 130 | #define WACOM_HID_WD_OFFSETTOP (WACOM_HID_UP_WACOMDIGITIZER | 0x0d31) | 130 | #define WACOM_HID_WD_OFFSETTOP (WACOM_HID_UP_WACOMDIGITIZER | 0x0d31) |
| @@ -268,6 +268,7 @@ struct wacom_shared { | |||
| 268 | struct input_dev *touch_input; | 268 | struct input_dev *touch_input; |
| 269 | struct hid_device *pen; | 269 | struct hid_device *pen; |
| 270 | struct hid_device *touch; | 270 | struct hid_device *touch; |
| 271 | bool has_mute_touch_switch; | ||
| 271 | }; | 272 | }; |
| 272 | 273 | ||
| 273 | struct hid_data { | 274 | struct hid_data { |
| @@ -324,6 +325,7 @@ struct wacom_wac { | |||
| 324 | int mode_report; | 325 | int mode_report; |
| 325 | int mode_value; | 326 | int mode_value; |
| 326 | struct hid_data hid_data; | 327 | struct hid_data hid_data; |
| 328 | bool has_mute_touch_switch; | ||
| 327 | }; | 329 | }; |
| 328 | 330 | ||
| 329 | #endif | 331 | #endif |
