aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Armstrong Skomra <skomra@gmail.com>2017-01-25 15:08:40 -0500
committerJiri Kosina <jkosina@suse.cz>2017-01-26 15:46:44 -0500
commitac2423c975dbd3e8c2afc6dec53ee25be38f723b (patch)
tree572452586dab9e57cda4d995dd1f665f7b46e813
parent60a221869803a0864c4b1683395ef574ee15aba6 (diff)
HID: wacom: generic: add vendor defined touch
Add vendor defined touch to support the second generation Intuos Pro. Previously all generic Wacom devices used true HID to report their touch. Signed-off-by: Aaron Skomra <aaron.skomra@wacom.com> Reviewed-by: Ping Cheng <pingc@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom.h1
-rw-r--r--drivers/hid/wacom_sys.c13
-rw-r--r--drivers/hid/wacom_wac.c22
-rw-r--r--drivers/hid/wacom_wac.h16
4 files changed, 43 insertions, 9 deletions
diff --git a/drivers/hid/wacom.h b/drivers/hid/wacom.h
index 8d8fe309c872..0e7b840bb80b 100644
--- a/drivers/hid/wacom.h
+++ b/drivers/hid/wacom.h
@@ -219,4 +219,5 @@ enum led_brightness wacom_leds_brightness_get(struct wacom_led *led);
219struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group, 219struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group,
220 unsigned int id); 220 unsigned int id);
221struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur); 221struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur);
222int wacom_equivalent_usage(int usage);
222#endif 223#endif
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 4a70783e64e1..a4884e78b3f8 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -112,11 +112,12 @@ static void wacom_feature_mapping(struct hid_device *hdev,
112 struct wacom *wacom = hid_get_drvdata(hdev); 112 struct wacom *wacom = hid_get_drvdata(hdev);
113 struct wacom_features *features = &wacom->wacom_wac.features; 113 struct wacom_features *features = &wacom->wacom_wac.features;
114 struct hid_data *hid_data = &wacom->wacom_wac.hid_data; 114 struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
115 unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
115 u8 *data; 116 u8 *data;
116 int ret; 117 int ret;
117 int n; 118 int n;
118 119
119 switch (usage->hid) { 120 switch (equivalent_usage) {
120 case HID_DG_CONTACTMAX: 121 case HID_DG_CONTACTMAX:
121 /* leave touch_max as is if predefined */ 122 /* leave touch_max as is if predefined */
122 if (!features->touch_max) { 123 if (!features->touch_max) {
@@ -325,8 +326,14 @@ static void wacom_post_parse_hid(struct hid_device *hdev,
325 if (features->type == HID_GENERIC) { 326 if (features->type == HID_GENERIC) {
326 /* Any last-minute generic device setup */ 327 /* Any last-minute generic device setup */
327 if (features->touch_max > 1) { 328 if (features->touch_max > 1) {
328 input_mt_init_slots(wacom_wac->touch_input, wacom_wac->features.touch_max, 329 if (features->device_type & WACOM_DEVICETYPE_DIRECT)
329 INPUT_MT_DIRECT); 330 input_mt_init_slots(wacom_wac->touch_input,
331 wacom_wac->features.touch_max,
332 INPUT_MT_DIRECT);
333 else
334 input_mt_init_slots(wacom_wac->touch_input,
335 wacom_wac->features.touch_max,
336 INPUT_MT_POINTER);
330 } 337 }
331 } 338 }
332} 339}
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 636c4a1ee958..2eeaa05e2068 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1599,7 +1599,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
1599 return 0; 1599 return 0;
1600} 1600}
1601 1601
1602static int wacom_equivalent_usage(int usage) 1602int wacom_equivalent_usage(int usage)
1603{ 1603{
1604 if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMDIGITIZER) { 1604 if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMDIGITIZER) {
1605 int subpage = (usage & 0xFF00) << 8; 1605 int subpage = (usage & 0xFF00) << 8;
@@ -1626,6 +1626,16 @@ static int wacom_equivalent_usage(int usage)
1626 return subpage | subusage; 1626 return subpage | subusage;
1627 } 1627 }
1628 1628
1629 if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMTOUCH) {
1630 int subpage = (usage & 0xFF00) << 8;
1631 int subusage = (usage & 0xFF);
1632
1633 if (subpage == HID_UP_UNDEFINED)
1634 subpage = WACOM_HID_SP_DIGITIZER;
1635
1636 return subpage | subusage;
1637 }
1638
1629 return usage; 1639 return usage;
1630} 1640}
1631 1641
@@ -2218,8 +2228,10 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
2218 2228
2219 for (j = 0; j < field->maxusage; j++) { 2229 for (j = 0; j < field->maxusage; j++) {
2220 struct hid_usage *usage = &field->usage[j]; 2230 struct hid_usage *usage = &field->usage[j];
2231 unsigned int equivalent_usage =
2232 wacom_equivalent_usage(usage->hid);
2221 2233
2222 switch (usage->hid) { 2234 switch (equivalent_usage) {
2223 case HID_GD_X: 2235 case HID_GD_X:
2224 case HID_GD_Y: 2236 case HID_GD_Y:
2225 case HID_DG_WIDTH: 2237 case HID_DG_WIDTH:
@@ -2228,7 +2240,7 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
2228 case HID_DG_INRANGE: 2240 case HID_DG_INRANGE:
2229 case HID_DG_INVERT: 2241 case HID_DG_INVERT:
2230 case HID_DG_TIPSWITCH: 2242 case HID_DG_TIPSWITCH:
2231 hid_data->last_slot_field = usage->hid; 2243 hid_data->last_slot_field = equivalent_usage;
2232 break; 2244 break;
2233 case HID_DG_CONTACTCOUNT: 2245 case HID_DG_CONTACTCOUNT:
2234 hid_data->cc_report = report->id; 2246 hid_data->cc_report = report->id;
@@ -2283,8 +2295,8 @@ void wacom_wac_usage_mapping(struct hid_device *hdev,
2283 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 2295 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2284 struct wacom_features *features = &wacom_wac->features; 2296 struct wacom_features *features = &wacom_wac->features;
2285 2297
2286 /* currently, only direct devices have proper hid report descriptors */ 2298 if (WACOM_DIRECT_DEVICE(field))
2287 features->device_type |= WACOM_DEVICETYPE_DIRECT; 2299 features->device_type |= WACOM_DEVICETYPE_DIRECT;
2288 2300
2289 if (WACOM_PAD_FIELD(field)) 2301 if (WACOM_PAD_FIELD(field))
2290 wacom_wac_pad_usage_mapping(hdev, field, usage); 2302 wacom_wac_pad_usage_mapping(hdev, field, usage);
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index dac95ba49888..da38f7736a7a 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -101,6 +101,7 @@
101#define WACOM_HID_SP_DIGITIZER 0x000d0000 101#define WACOM_HID_SP_DIGITIZER 0x000d0000
102#define WACOM_HID_SP_DIGITIZERINFO 0x00100000 102#define WACOM_HID_SP_DIGITIZERINFO 0x00100000
103#define WACOM_HID_WD_DIGITIZER (WACOM_HID_UP_WACOMDIGITIZER | 0x01) 103#define WACOM_HID_WD_DIGITIZER (WACOM_HID_UP_WACOMDIGITIZER | 0x01)
104#define WACOM_HID_WD_PEN (WACOM_HID_UP_WACOMDIGITIZER | 0x02)
104#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36) 105#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36)
105#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39) 106#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
106#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c) 107#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
@@ -137,6 +138,12 @@
137#define WACOM_HID_UP_G11 0xff110000 138#define WACOM_HID_UP_G11 0xff110000
138#define WACOM_HID_G11_PEN (WACOM_HID_UP_G11 | 0x02) 139#define WACOM_HID_G11_PEN (WACOM_HID_UP_G11 | 0x02)
139#define WACOM_HID_G11_TOUCHSCREEN (WACOM_HID_UP_G11 | 0x11) 140#define WACOM_HID_G11_TOUCHSCREEN (WACOM_HID_UP_G11 | 0x11)
141#define WACOM_HID_UP_WACOMTOUCH 0xff000000
142#define WACOM_HID_WT_TOUCHSCREEN (WACOM_HID_UP_WACOMTOUCH | 0x04)
143#define WACOM_HID_WT_TOUCHPAD (WACOM_HID_UP_WACOMTOUCH | 0x05)
144#define WACOM_HID_WT_CONTACTMAX (WACOM_HID_UP_WACOMTOUCH | 0x55)
145#define WACOM_HID_WT_X (WACOM_HID_UP_WACOMTOUCH | 0x130)
146#define WACOM_HID_WT_Y (WACOM_HID_UP_WACOMTOUCH | 0x131)
140 147
141#define WACOM_PAD_FIELD(f) (((f)->physical == HID_DG_TABLETFUNCTIONKEY) || \ 148#define WACOM_PAD_FIELD(f) (((f)->physical == HID_DG_TABLETFUNCTIONKEY) || \
142 ((f)->physical == WACOM_HID_WD_DIGITIZERFNKEYS) || \ 149 ((f)->physical == WACOM_HID_WD_DIGITIZERFNKEYS) || \
@@ -154,7 +161,14 @@
154 ((f)->physical == HID_DG_FINGER) || \ 161 ((f)->physical == HID_DG_FINGER) || \
155 ((f)->application == HID_DG_TOUCHSCREEN) || \ 162 ((f)->application == HID_DG_TOUCHSCREEN) || \
156 ((f)->application == WACOM_HID_G9_TOUCHSCREEN) || \ 163 ((f)->application == WACOM_HID_G9_TOUCHSCREEN) || \
157 ((f)->application == WACOM_HID_G11_TOUCHSCREEN)) 164 ((f)->application == WACOM_HID_G11_TOUCHSCREEN) || \
165 ((f)->application == WACOM_HID_WT_TOUCHPAD) || \
166 ((f)->application == HID_DG_TOUCHPAD))
167
168#define WACOM_DIRECT_DEVICE(f) (((f)->application == HID_DG_TOUCHSCREEN) || \
169 ((f)->application == WACOM_HID_WT_TOUCHSCREEN) || \
170 ((f)->application == HID_DG_PEN) || \
171 ((f)->application == WACOM_HID_WD_PEN))
158 172
159enum { 173enum {
160 PENPARTNER = 0, 174 PENPARTNER = 0,