aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2018-01-31 10:23:05 -0500
committerJiri Kosina <jkosina@suse.cz>2018-01-31 10:23:05 -0500
commit740c84eec79ad7c53e1fdb4cf54af9e7170dd825 (patch)
tree7a6beb1ca12481f4cf9b8dd44ebc7eb93671809c
parenta44f3ec625002a3631f95ea317a9c25f70578fe7 (diff)
parentc947218951da68e3fd18a25e9af19556308caf45 (diff)
Merge branch 'for-4.16/wacom' into for-linus
Pull Wacom device driver updates. These don't have to go on top of the hid_have_special_driver[] revamp, as the whole group is assumed to have a special driver based on VID.
-rw-r--r--drivers/hid/wacom_sys.c134
-rw-r--r--drivers/hid/wacom_wac.c67
-rw-r--r--drivers/hid/wacom_wac.h6
3 files changed, 178 insertions, 29 deletions
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index ee71ad9b6cc1..409543160af7 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -56,6 +56,107 @@ static int wacom_set_report(struct hid_device *hdev, u8 type, u8 *buf,
56 return retval; 56 return retval;
57} 57}
58 58
59static void wacom_wac_queue_insert(struct hid_device *hdev,
60 struct kfifo_rec_ptr_2 *fifo,
61 u8 *raw_data, int size)
62{
63 bool warned = false;
64
65 while (kfifo_avail(fifo) < size) {
66 if (!warned)
67 hid_warn(hdev, "%s: kfifo has filled, starting to drop events\n", __func__);
68 warned = true;
69
70 kfifo_skip(fifo);
71 }
72
73 kfifo_in(fifo, raw_data, size);
74}
75
76static void wacom_wac_queue_flush(struct hid_device *hdev,
77 struct kfifo_rec_ptr_2 *fifo)
78{
79 while (!kfifo_is_empty(fifo)) {
80 u8 buf[WACOM_PKGLEN_MAX];
81 int size;
82 int err;
83
84 size = kfifo_out(fifo, buf, sizeof(buf));
85 err = hid_report_raw_event(hdev, HID_INPUT_REPORT, buf, size, false);
86 if (err) {
87 hid_warn(hdev, "%s: unable to flush event due to error %d\n",
88 __func__, err);
89 }
90 }
91}
92
93static int wacom_wac_pen_serial_enforce(struct hid_device *hdev,
94 struct hid_report *report, u8 *raw_data, int size)
95{
96 struct wacom *wacom = hid_get_drvdata(hdev);
97 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
98 struct wacom_features *features = &wacom_wac->features;
99 bool flush = false;
100 bool insert = false;
101 int i, j;
102
103 if (wacom_wac->serial[0] || !(features->quirks & WACOM_QUIRK_TOOLSERIAL))
104 return 0;
105
106 /* Queue events which have invalid tool type or serial number */
107 for (i = 0; i < report->maxfield; i++) {
108 for (j = 0; j < report->field[i]->maxusage; j++) {
109 struct hid_field *field = report->field[i];
110 struct hid_usage *usage = &field->usage[j];
111 unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
112 unsigned int offset;
113 unsigned int size;
114 unsigned int value;
115
116 if (equivalent_usage != HID_DG_INRANGE &&
117 equivalent_usage != HID_DG_TOOLSERIALNUMBER &&
118 equivalent_usage != WACOM_HID_WD_SERIALHI &&
119 equivalent_usage != WACOM_HID_WD_TOOLTYPE)
120 continue;
121
122 offset = field->report_offset;
123 size = field->report_size;
124 value = hid_field_extract(hdev, raw_data+1, offset + j * size, size);
125
126 /* If we go out of range, we need to flush the queue ASAP */
127 if (equivalent_usage == HID_DG_INRANGE)
128 value = !value;
129
130 if (value) {
131 flush = true;
132 switch (equivalent_usage) {
133 case HID_DG_TOOLSERIALNUMBER:
134 wacom_wac->serial[0] = value;
135 break;
136
137 case WACOM_HID_WD_SERIALHI:
138 wacom_wac->serial[0] |= ((__u64)value) << 32;
139 break;
140
141 case WACOM_HID_WD_TOOLTYPE:
142 wacom_wac->id[0] = value;
143 break;
144 }
145 }
146 else {
147 insert = true;
148 }
149 }
150 }
151
152 if (flush)
153 wacom_wac_queue_flush(hdev, &wacom_wac->pen_fifo);
154 else if (insert)
155 wacom_wac_queue_insert(hdev, &wacom_wac->pen_fifo, raw_data, size);
156
157 return insert && !flush;
158}
159
59static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, 160static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
60 u8 *raw_data, int size) 161 u8 *raw_data, int size)
61{ 162{
@@ -64,6 +165,9 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
64 if (size > WACOM_PKGLEN_MAX) 165 if (size > WACOM_PKGLEN_MAX)
65 return 1; 166 return 1;
66 167
168 if (wacom_wac_pen_serial_enforce(hdev, report, raw_data, size))
169 return -1;
170
67 memcpy(wacom->wacom_wac.data, raw_data, size); 171 memcpy(wacom->wacom_wac.data, raw_data, size);
68 172
69 wacom_wac_irq(&wacom->wacom_wac, size); 173 wacom_wac_irq(&wacom->wacom_wac, size);
@@ -2347,23 +2451,23 @@ static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
2347 int i; 2451 int i;
2348 unsigned long flags; 2452 unsigned long flags;
2349 2453
2350 spin_lock_irqsave(&remote->remote_lock, flags); 2454 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2351 remote->remotes[index].registered = false; 2455 if (remote->remotes[i].serial == serial) {
2352 spin_unlock_irqrestore(&remote->remote_lock, flags);
2353 2456
2354 if (remote->remotes[index].battery.battery) 2457 spin_lock_irqsave(&remote->remote_lock, flags);
2355 devres_release_group(&wacom->hdev->dev, 2458 remote->remotes[i].registered = false;
2356 &remote->remotes[index].battery.bat_desc); 2459 spin_unlock_irqrestore(&remote->remote_lock, flags);
2357 2460
2358 if (remote->remotes[index].group.name) 2461 if (remote->remotes[i].battery.battery)
2359 devres_release_group(&wacom->hdev->dev, 2462 devres_release_group(&wacom->hdev->dev,
2360 &remote->remotes[index]); 2463 &remote->remotes[i].battery.bat_desc);
2464
2465 if (remote->remotes[i].group.name)
2466 devres_release_group(&wacom->hdev->dev,
2467 &remote->remotes[i]);
2361 2468
2362 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2363 if (remote->remotes[i].serial == serial) {
2364 remote->remotes[i].serial = 0; 2469 remote->remotes[i].serial = 0;
2365 remote->remotes[i].group.name = NULL; 2470 remote->remotes[i].group.name = NULL;
2366 remote->remotes[i].registered = false;
2367 remote->remotes[i].battery.battery = NULL; 2471 remote->remotes[i].battery.battery = NULL;
2368 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN; 2472 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
2369 } 2473 }
@@ -2580,6 +2684,10 @@ static int wacom_probe(struct hid_device *hdev,
2580 goto fail; 2684 goto fail;
2581 } 2685 }
2582 2686
2687 error = kfifo_alloc(&wacom_wac->pen_fifo, WACOM_PKGLEN_MAX, GFP_KERNEL);
2688 if (error)
2689 goto fail;
2690
2583 wacom_wac->hid_data.inputmode = -1; 2691 wacom_wac->hid_data.inputmode = -1;
2584 wacom_wac->mode_report = -1; 2692 wacom_wac->mode_report = -1;
2585 2693
@@ -2643,6 +2751,8 @@ static void wacom_remove(struct hid_device *hdev)
2643 if (wacom->wacom_wac.features.type != REMOTE) 2751 if (wacom->wacom_wac.features.type != REMOTE)
2644 wacom_release_resources(wacom); 2752 wacom_release_resources(wacom);
2645 2753
2754 kfifo_free(&wacom_wac->pen_fifo);
2755
2646 hid_set_drvdata(hdev, NULL); 2756 hid_set_drvdata(hdev, NULL);
2647} 2757}
2648 2758
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 16af6886e828..90c38a0523e9 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1924,7 +1924,6 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
1924 struct wacom_features *features = &wacom_wac->features; 1924 struct wacom_features *features = &wacom_wac->features;
1925 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid); 1925 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1926 int i; 1926 int i;
1927 bool is_touch_on = value;
1928 bool do_report = false; 1927 bool do_report = false;
1929 1928
1930 /* 1929 /*
@@ -1969,16 +1968,17 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
1969 break; 1968 break;
1970 1969
1971 case WACOM_HID_WD_MUTE_DEVICE: 1970 case WACOM_HID_WD_MUTE_DEVICE:
1972 if (wacom_wac->shared->touch_input && value) {
1973 wacom_wac->shared->is_touch_on = !wacom_wac->shared->is_touch_on;
1974 is_touch_on = wacom_wac->shared->is_touch_on;
1975 }
1976
1977 /* fall through*/
1978 case WACOM_HID_WD_TOUCHONOFF: 1971 case WACOM_HID_WD_TOUCHONOFF:
1979 if (wacom_wac->shared->touch_input) { 1972 if (wacom_wac->shared->touch_input) {
1973 bool *is_touch_on = &wacom_wac->shared->is_touch_on;
1974
1975 if (equivalent_usage == WACOM_HID_WD_MUTE_DEVICE && value)
1976 *is_touch_on = !(*is_touch_on);
1977 else if (equivalent_usage == WACOM_HID_WD_TOUCHONOFF)
1978 *is_touch_on = value;
1979
1980 input_report_switch(wacom_wac->shared->touch_input, 1980 input_report_switch(wacom_wac->shared->touch_input,
1981 SW_MUTE_DEVICE, !is_touch_on); 1981 SW_MUTE_DEVICE, !(*is_touch_on));
1982 input_sync(wacom_wac->shared->touch_input); 1982 input_sync(wacom_wac->shared->touch_input);
1983 } 1983 }
1984 break; 1984 break;
@@ -2085,7 +2085,29 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
2085 wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS2, 0); 2085 wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS2, 0);
2086 break; 2086 break;
2087 case HID_DG_TOOLSERIALNUMBER: 2087 case HID_DG_TOOLSERIALNUMBER:
2088 features->quirks |= WACOM_QUIRK_TOOLSERIAL;
2088 wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0); 2089 wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0);
2090
2091 /* Adjust AES usages to match modern convention */
2092 if (usage->hid == WACOM_HID_WT_SERIALNUMBER && field->report_size == 16) {
2093 if (field->index + 2 < field->report->maxfield) {
2094 struct hid_field *a = field->report->field[field->index + 1];
2095 struct hid_field *b = field->report->field[field->index + 2];
2096
2097 if (a->maxusage > 0 && a->usage[0].hid == HID_DG_TOOLSERIALNUMBER && a->report_size == 32 &&
2098 b->maxusage > 0 && b->usage[0].hid == 0xFF000000 && b->report_size == 8) {
2099 features->quirks |= WACOM_QUIRK_AESPEN;
2100 usage->hid = WACOM_HID_WD_TOOLTYPE;
2101 field->logical_minimum = S16_MIN;
2102 field->logical_maximum = S16_MAX;
2103 a->logical_minimum = S32_MIN;
2104 a->logical_maximum = S32_MAX;
2105 b->usage[0].hid = WACOM_HID_WD_SERIALHI;
2106 b->logical_minimum = 0;
2107 b->logical_maximum = U8_MAX;
2108 }
2109 }
2110 }
2089 break; 2111 break;
2090 case WACOM_HID_WD_SENSE: 2112 case WACOM_HID_WD_SENSE:
2091 features->quirks |= WACOM_QUIRK_SENSE; 2113 features->quirks |= WACOM_QUIRK_SENSE;
@@ -2093,15 +2115,18 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
2093 break; 2115 break;
2094 case WACOM_HID_WD_SERIALHI: 2116 case WACOM_HID_WD_SERIALHI:
2095 wacom_map_usage(input, usage, field, EV_ABS, ABS_MISC, 0); 2117 wacom_map_usage(input, usage, field, EV_ABS, ABS_MISC, 0);
2096 set_bit(EV_KEY, input->evbit); 2118
2097 input_set_capability(input, EV_KEY, BTN_TOOL_PEN); 2119 if (!(features->quirks & WACOM_QUIRK_AESPEN)) {
2098 input_set_capability(input, EV_KEY, BTN_TOOL_RUBBER); 2120 set_bit(EV_KEY, input->evbit);
2099 input_set_capability(input, EV_KEY, BTN_TOOL_BRUSH); 2121 input_set_capability(input, EV_KEY, BTN_TOOL_PEN);
2100 input_set_capability(input, EV_KEY, BTN_TOOL_PENCIL); 2122 input_set_capability(input, EV_KEY, BTN_TOOL_RUBBER);
2101 input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH); 2123 input_set_capability(input, EV_KEY, BTN_TOOL_BRUSH);
2102 if (!(features->device_type & WACOM_DEVICETYPE_DIRECT)) { 2124 input_set_capability(input, EV_KEY, BTN_TOOL_PENCIL);
2103 input_set_capability(input, EV_KEY, BTN_TOOL_MOUSE); 2125 input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH);
2104 input_set_capability(input, EV_KEY, BTN_TOOL_LENS); 2126 if (!(features->device_type & WACOM_DEVICETYPE_DIRECT)) {
2127 input_set_capability(input, EV_KEY, BTN_TOOL_MOUSE);
2128 input_set_capability(input, EV_KEY, BTN_TOOL_LENS);
2129 }
2105 } 2130 }
2106 break; 2131 break;
2107 case WACOM_HID_WD_FINGERWHEEL: 2132 case WACOM_HID_WD_FINGERWHEEL:
@@ -4390,6 +4415,12 @@ static const struct wacom_features wacom_features_0x360 =
4390static const struct wacom_features wacom_features_0x361 = 4415static const struct wacom_features wacom_features_0x361 =
4391 { "Wacom Intuos Pro L", 62200, 43200, 8191, 63, 4416 { "Wacom Intuos Pro L", 62200, 43200, 8191, 63,
4392 INTUOSP2_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 10 }; 4417 INTUOSP2_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 10 };
4418static const struct wacom_features wacom_features_0x37A =
4419 { "Wacom One by Wacom S", 15200, 9500, 2047, 63,
4420 BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
4421static const struct wacom_features wacom_features_0x37B =
4422 { "Wacom One by Wacom M", 21600, 13500, 2047, 63,
4423 BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
4393 4424
4394static const struct wacom_features wacom_features_HID_ANY_ID = 4425static const struct wacom_features wacom_features_HID_ANY_ID =
4395 { "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID }; 4426 { "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
@@ -4558,6 +4589,8 @@ const struct hid_device_id wacom_ids[] = {
4558 { USB_DEVICE_WACOM(0x343) }, 4589 { USB_DEVICE_WACOM(0x343) },
4559 { BT_DEVICE_WACOM(0x360) }, 4590 { BT_DEVICE_WACOM(0x360) },
4560 { BT_DEVICE_WACOM(0x361) }, 4591 { BT_DEVICE_WACOM(0x361) },
4592 { USB_DEVICE_WACOM(0x37A) },
4593 { USB_DEVICE_WACOM(0x37B) },
4561 { USB_DEVICE_WACOM(0x4001) }, 4594 { USB_DEVICE_WACOM(0x4001) },
4562 { USB_DEVICE_WACOM(0x4004) }, 4595 { USB_DEVICE_WACOM(0x4004) },
4563 { USB_DEVICE_WACOM(0x5000) }, 4596 { USB_DEVICE_WACOM(0x5000) },
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 64d8f014602e..15d9c14fbdf7 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -11,6 +11,7 @@
11 11
12#include <linux/types.h> 12#include <linux/types.h>
13#include <linux/hid.h> 13#include <linux/hid.h>
14#include <linux/kfifo.h>
14 15
15/* maximum packet length for USB/BT devices */ 16/* maximum packet length for USB/BT devices */
16#define WACOM_PKGLEN_MAX 361 17#define WACOM_PKGLEN_MAX 361
@@ -86,7 +87,9 @@
86/* device quirks */ 87/* device quirks */
87#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0001 88#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0001
88#define WACOM_QUIRK_SENSE 0x0002 89#define WACOM_QUIRK_SENSE 0x0002
90#define WACOM_QUIRK_AESPEN 0x0004
89#define WACOM_QUIRK_BATTERY 0x0008 91#define WACOM_QUIRK_BATTERY 0x0008
92#define WACOM_QUIRK_TOOLSERIAL 0x0010
90 93
91/* device types */ 94/* device types */
92#define WACOM_DEVICETYPE_NONE 0x0000 95#define WACOM_DEVICETYPE_NONE 0x0000
@@ -107,6 +110,7 @@
107#define WACOM_HID_WD_PEN (WACOM_HID_UP_WACOMDIGITIZER | 0x02) 110#define WACOM_HID_WD_PEN (WACOM_HID_UP_WACOMDIGITIZER | 0x02)
108#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36) 111#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36)
109#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39) 112#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
113#define WACOM_HID_WD_SERIALNUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x5b)
110#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c) 114#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
111#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77) 115#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77)
112#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132) 116#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132)
@@ -150,6 +154,7 @@
150#define WACOM_HID_WT_TOUCHSCREEN (WACOM_HID_UP_WACOMTOUCH | 0x04) 154#define WACOM_HID_WT_TOUCHSCREEN (WACOM_HID_UP_WACOMTOUCH | 0x04)
151#define WACOM_HID_WT_TOUCHPAD (WACOM_HID_UP_WACOMTOUCH | 0x05) 155#define WACOM_HID_WT_TOUCHPAD (WACOM_HID_UP_WACOMTOUCH | 0x05)
152#define WACOM_HID_WT_CONTACTMAX (WACOM_HID_UP_WACOMTOUCH | 0x55) 156#define WACOM_HID_WT_CONTACTMAX (WACOM_HID_UP_WACOMTOUCH | 0x55)
157#define WACOM_HID_WT_SERIALNUMBER (WACOM_HID_UP_WACOMTOUCH | 0x5b)
153#define WACOM_HID_WT_X (WACOM_HID_UP_WACOMTOUCH | 0x130) 158#define WACOM_HID_WT_X (WACOM_HID_UP_WACOMTOUCH | 0x130)
154#define WACOM_HID_WT_Y (WACOM_HID_UP_WACOMTOUCH | 0x131) 159#define WACOM_HID_WT_Y (WACOM_HID_UP_WACOMTOUCH | 0x131)
155 160
@@ -336,6 +341,7 @@ struct wacom_wac {
336 struct input_dev *pen_input; 341 struct input_dev *pen_input;
337 struct input_dev *touch_input; 342 struct input_dev *touch_input;
338 struct input_dev *pad_input; 343 struct input_dev *pad_input;
344 struct kfifo_rec_ptr_2 pen_fifo;
339 int pid; 345 int pid;
340 int num_contacts_left; 346 int num_contacts_left;
341 u8 bt_features; 347 u8 bt_features;