1
2
3
4
5
6
7
8
9
10
11#include "wacom_wac.h"
12#include "wacom.h"
13#include <linux/input/mt.h>
14
15#define WAC_MSG_RETRIES 5
16#define WAC_CMD_RETRIES 10
17
18#define DEV_ATTR_RW_PERM (S_IRUGO | S_IWUSR | S_IWGRP)
19#define DEV_ATTR_WO_PERM (S_IWUSR | S_IWGRP)
20#define DEV_ATTR_RO_PERM (S_IRUSR | S_IRGRP)
21
22static int wacom_get_report(struct hid_device *hdev, u8 type, u8 *buf,
23 size_t size, unsigned int retries)
24{
25 int retval;
26
27 do {
28 retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
29 HID_REQ_GET_REPORT);
30 } while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);
31
32 if (retval < 0)
33 hid_err(hdev, "wacom_get_report: ran out of retries "
34 "(last error = %d)\n", retval);
35
36 return retval;
37}
38
39static int wacom_set_report(struct hid_device *hdev, u8 type, u8 *buf,
40 size_t size, unsigned int retries)
41{
42 int retval;
43
44 do {
45 retval = hid_hw_raw_request(hdev, buf[0], buf, size, type,
46 HID_REQ_SET_REPORT);
47 } while ((retval == -ETIMEDOUT || retval == -EAGAIN) && --retries);
48
49 if (retval < 0)
50 hid_err(hdev, "wacom_set_report: ran out of retries "
51 "(last error = %d)\n", retval);
52
53 return retval;
54}
55
56static void wacom_wac_queue_insert(struct hid_device *hdev,
57 struct kfifo_rec_ptr_2 *fifo,
58 u8 *raw_data, int size)
59{
60 bool warned = false;
61
62 while (kfifo_avail(fifo) < size) {
63 if (!warned)
64 hid_warn(hdev, "%s: kfifo has filled, starting to drop events\n", __func__);
65 warned = true;
66
67 kfifo_skip(fifo);
68 }
69
70 kfifo_in(fifo, raw_data, size);
71}
72
73static void wacom_wac_queue_flush(struct hid_device *hdev,
74 struct kfifo_rec_ptr_2 *fifo)
75{
76 while (!kfifo_is_empty(fifo)) {
77 u8 buf[WACOM_PKGLEN_MAX];
78 int size;
79 int err;
80
81 size = kfifo_out(fifo, buf, sizeof(buf));
82 err = hid_report_raw_event(hdev, HID_INPUT_REPORT, buf, size, false);
83 if (err) {
84 hid_warn(hdev, "%s: unable to flush event due to error %d\n",
85 __func__, err);
86 }
87 }
88}
89
90static int wacom_wac_pen_serial_enforce(struct hid_device *hdev,
91 struct hid_report *report, u8 *raw_data, int report_size)
92{
93 struct wacom *wacom = hid_get_drvdata(hdev);
94 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
95 struct wacom_features *features = &wacom_wac->features;
96 bool flush = false;
97 bool insert = false;
98 int i, j;
99
100 if (wacom_wac->serial[0] || !(features->quirks & WACOM_QUIRK_TOOLSERIAL))
101 return 0;
102
103
104 for (i = 0; i < report->maxfield; i++) {
105 for (j = 0; j < report->field[i]->maxusage; j++) {
106 struct hid_field *field = report->field[i];
107 struct hid_usage *usage = &field->usage[j];
108 unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
109 unsigned int offset;
110 unsigned int size;
111 unsigned int value;
112
113 if (equivalent_usage != HID_DG_INRANGE &&
114 equivalent_usage != HID_DG_TOOLSERIALNUMBER &&
115 equivalent_usage != WACOM_HID_WD_SERIALHI &&
116 equivalent_usage != WACOM_HID_WD_TOOLTYPE)
117 continue;
118
119 offset = field->report_offset;
120 size = field->report_size;
121 value = hid_field_extract(hdev, raw_data+1, offset + j * size, size);
122
123
124 if (equivalent_usage == HID_DG_INRANGE)
125 value = !value;
126
127 if (value) {
128 flush = true;
129 switch (equivalent_usage) {
130 case HID_DG_TOOLSERIALNUMBER:
131 wacom_wac->serial[0] = value;
132 break;
133
134 case WACOM_HID_WD_SERIALHI:
135 wacom_wac->serial[0] |= ((__u64)value) << 32;
136 break;
137
138 case WACOM_HID_WD_TOOLTYPE:
139 wacom_wac->id[0] = value;
140 break;
141 }
142 }
143 else {
144 insert = true;
145 }
146 }
147 }
148
149 if (flush)
150 wacom_wac_queue_flush(hdev, wacom_wac->pen_fifo);
151 else if (insert)
152 wacom_wac_queue_insert(hdev, wacom_wac->pen_fifo,
153 raw_data, report_size);
154
155 return insert && !flush;
156}
157
158static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
159 u8 *raw_data, int size)
160{
161 struct wacom *wacom = hid_get_drvdata(hdev);
162
163 if (size > WACOM_PKGLEN_MAX)
164 return 1;
165
166 if (wacom_wac_pen_serial_enforce(hdev, report, raw_data, size))
167 return -1;
168
169 memcpy(wacom->wacom_wac.data, raw_data, size);
170
171 wacom_wac_irq(&wacom->wacom_wac, size);
172
173 return 0;
174}
175
176static int wacom_open(struct input_dev *dev)
177{
178 struct wacom *wacom = input_get_drvdata(dev);
179
180 return hid_hw_open(wacom->hdev);
181}
182
183static void wacom_close(struct input_dev *dev)
184{
185 struct wacom *wacom = input_get_drvdata(dev);
186
187
188
189
190
191 if (wacom->hdev)
192 hid_hw_close(wacom->hdev);
193}
194
195
196
197
198static int wacom_calc_hid_res(int logical_extents, int physical_extents,
199 unsigned unit, int exponent)
200{
201 struct hid_field field = {
202 .logical_maximum = logical_extents,
203 .physical_maximum = physical_extents,
204 .unit = unit,
205 .unit_exponent = exponent,
206 };
207
208 return hidinput_calc_abs_res(&field, ABS_X);
209}
210
211static void wacom_hid_usage_quirk(struct hid_device *hdev,
212 struct hid_field *field, struct hid_usage *usage)
213{
214 struct wacom *wacom = hid_get_drvdata(hdev);
215 struct wacom_features *features = &wacom->wacom_wac.features;
216 unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
217
218
219
220
221
222 if (hdev->vendor == USB_VENDOR_ID_WACOM &&
223 hdev->product == 0x4200 &&
224 field->application == HID_UP_MSVENDOR) {
225 wacom->wacom_wac.mode_report = field->report->id;
226 wacom->wacom_wac.mode_value = 2;
227 }
228
229
230
231
232
233
234
235
236
237 if (features->type == HID_GENERIC &&
238 usage->hid == 0x000D0000 &&
239 field->application == HID_DG_PEN &&
240 field->physical == HID_DG_STYLUS) {
241 int i = usage->usage_index;
242
243 if (i-4 >= 0 && i+1 < field->maxusage &&
244 field->usage[i-4].hid == HID_DG_TIPSWITCH &&
245 field->usage[i-3].hid == HID_DG_BARRELSWITCH &&
246 field->usage[i-2].hid == HID_DG_ERASER &&
247 field->usage[i-1].hid == HID_DG_INVERT &&
248 field->usage[i+1].hid == HID_DG_INRANGE) {
249 usage->hid = HID_DG_BARRELSWITCH2;
250 }
251 }
252
253
254
255
256
257
258
259
260
261 if (usage->hid == WACOM_HID_WT_SERIALNUMBER &&
262 field->report_size == 16 &&
263 field->index + 2 < field->report->maxfield) {
264 struct hid_field *a = field->report->field[field->index + 1];
265 struct hid_field *b = field->report->field[field->index + 2];
266
267 if (a->maxusage > 0 &&
268 a->usage[0].hid == HID_DG_TOOLSERIALNUMBER &&
269 a->report_size == 32 &&
270 b->maxusage > 0 &&
271 b->usage[0].hid == 0xFF000000 &&
272 b->report_size == 8) {
273 features->quirks |= WACOM_QUIRK_AESPEN;
274 usage->hid = WACOM_HID_WD_TOOLTYPE;
275 field->logical_minimum = S16_MIN;
276 field->logical_maximum = S16_MAX;
277 a->logical_minimum = S32_MIN;
278 a->logical_maximum = S32_MAX;
279 b->usage[0].hid = WACOM_HID_WD_SERIALHI;
280 b->logical_minimum = 0;
281 b->logical_maximum = U8_MAX;
282 }
283 }
284
285
286 if (hdev->vendor == USB_VENDOR_ID_WACOM &&
287 hdev->product == 0x0358 &&
288 WACOM_PEN_FIELD(field) &&
289 equivalent_usage == HID_GD_Y) {
290 field->logical_maximum = 43200;
291 }
292}
293
294static void wacom_feature_mapping(struct hid_device *hdev,
295 struct hid_field *field, struct hid_usage *usage)
296{
297 struct wacom *wacom = hid_get_drvdata(hdev);
298 struct wacom_features *features = &wacom->wacom_wac.features;
299 struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
300 unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
301 u8 *data;
302 int ret;
303 u32 n;
304
305 wacom_hid_usage_quirk(hdev, field, usage);
306
307 switch (equivalent_usage) {
308 case WACOM_HID_WD_TOUCH_RING_SETTING:
309 wacom->generic_has_leds = true;
310 break;
311 case HID_DG_CONTACTMAX:
312
313 if (!features->touch_max) {
314
315 n = hid_report_len(field->report);
316 data = hid_alloc_report_buf(field->report, GFP_KERNEL);
317 if (!data)
318 break;
319 data[0] = field->report->id;
320 ret = wacom_get_report(hdev, HID_FEATURE_REPORT,
321 data, n, WAC_CMD_RETRIES);
322 if (ret == n && features->type == HID_GENERIC) {
323 ret = hid_report_raw_event(hdev,
324 HID_FEATURE_REPORT, data, n, 0);
325 } else if (ret == 2 && features->type != HID_GENERIC) {
326 features->touch_max = data[1];
327 } else {
328 features->touch_max = 16;
329 hid_warn(hdev, "wacom_feature_mapping: "
330 "could not get HID_DG_CONTACTMAX, "
331 "defaulting to %d\n",
332 features->touch_max);
333 }
334 kfree(data);
335 }
336 break;
337 case HID_DG_INPUTMODE:
338
339 if (usage->usage_index >= field->report_count) {
340 dev_err(&hdev->dev, "HID_DG_INPUTMODE out of range\n");
341 break;
342 }
343
344 hid_data->inputmode = field->report->id;
345 hid_data->inputmode_index = usage->usage_index;
346 break;
347
348 case HID_UP_DIGITIZER:
349 if (field->report->id == 0x0B &&
350 (field->application == WACOM_HID_G9_PEN ||
351 field->application == WACOM_HID_G11_PEN)) {
352 wacom->wacom_wac.mode_report = field->report->id;
353 wacom->wacom_wac.mode_value = 0;
354 }
355 break;
356
357 case WACOM_HID_WD_DATAMODE:
358 wacom->wacom_wac.mode_report = field->report->id;
359 wacom->wacom_wac.mode_value = 2;
360 break;
361
362 case WACOM_HID_UP_G9:
363 case WACOM_HID_UP_G11:
364 if (field->report->id == 0x03 &&
365 (field->application == WACOM_HID_G9_TOUCHSCREEN ||
366 field->application == WACOM_HID_G11_TOUCHSCREEN)) {
367 wacom->wacom_wac.mode_report = field->report->id;
368 wacom->wacom_wac.mode_value = 0;
369 }
370 break;
371 case WACOM_HID_WD_OFFSETLEFT:
372 case WACOM_HID_WD_OFFSETTOP:
373 case WACOM_HID_WD_OFFSETRIGHT:
374 case WACOM_HID_WD_OFFSETBOTTOM:
375
376 n = hid_report_len(field->report);
377 data = hid_alloc_report_buf(field->report, GFP_KERNEL);
378 if (!data)
379 break;
380 data[0] = field->report->id;
381 ret = wacom_get_report(hdev, HID_FEATURE_REPORT,
382 data, n, WAC_CMD_RETRIES);
383 if (ret == n) {
384 ret = hid_report_raw_event(hdev, HID_FEATURE_REPORT,
385 data, n, 0);
386 } else {
387 hid_warn(hdev, "%s: could not retrieve sensor offsets\n",
388 __func__);
389 }
390 kfree(data);
391 break;
392 }
393}
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427static void wacom_usage_mapping(struct hid_device *hdev,
428 struct hid_field *field, struct hid_usage *usage)
429{
430 struct wacom *wacom = hid_get_drvdata(hdev);
431 struct wacom_features *features = &wacom->wacom_wac.features;
432 bool finger = WACOM_FINGER_FIELD(field);
433 bool pen = WACOM_PEN_FIELD(field);
434 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
435
436
437
438
439
440
441 if (pen)
442 features->device_type |= WACOM_DEVICETYPE_PEN;
443 else if (finger)
444 features->device_type |= WACOM_DEVICETYPE_TOUCH;
445 else
446 return;
447
448 wacom_hid_usage_quirk(hdev, field, usage);
449
450 switch (equivalent_usage) {
451 case HID_GD_X:
452 features->x_max = field->logical_maximum;
453 if (finger) {
454 features->x_phy = field->physical_maximum;
455 if ((features->type != BAMBOO_PT) &&
456 (features->type != BAMBOO_TOUCH)) {
457 features->unit = field->unit;
458 features->unitExpo = field->unit_exponent;
459 }
460 }
461 break;
462 case HID_GD_Y:
463 features->y_max = field->logical_maximum;
464 if (finger) {
465 features->y_phy = field->physical_maximum;
466 if ((features->type != BAMBOO_PT) &&
467 (features->type != BAMBOO_TOUCH)) {
468 features->unit = field->unit;
469 features->unitExpo = field->unit_exponent;
470 }
471 }
472 break;
473 case HID_DG_TIPPRESSURE:
474 if (pen)
475 features->pressure_max = field->logical_maximum;
476 break;
477 }
478
479 if (features->type == HID_GENERIC)
480 wacom_wac_usage_mapping(hdev, field, usage);
481}
482
483static void wacom_post_parse_hid(struct hid_device *hdev,
484 struct wacom_features *features)
485{
486 struct wacom *wacom = hid_get_drvdata(hdev);
487 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
488
489 if (features->type == HID_GENERIC) {
490
491 if (wacom_wac->has_mode_change) {
492 if (wacom_wac->is_direct_mode)
493 features->device_type |= WACOM_DEVICETYPE_DIRECT;
494 else
495 features->device_type &= ~WACOM_DEVICETYPE_DIRECT;
496 }
497
498 if (features->touch_max > 1) {
499 if (features->device_type & WACOM_DEVICETYPE_DIRECT)
500 input_mt_init_slots(wacom_wac->touch_input,
501 wacom_wac->features.touch_max,
502 INPUT_MT_DIRECT);
503 else
504 input_mt_init_slots(wacom_wac->touch_input,
505 wacom_wac->features.touch_max,
506 INPUT_MT_POINTER);
507 }
508 }
509}
510
511static void wacom_parse_hid(struct hid_device *hdev,
512 struct wacom_features *features)
513{
514 struct hid_report_enum *rep_enum;
515 struct hid_report *hreport;
516 int i, j;
517
518
519 rep_enum = &hdev->report_enum[HID_FEATURE_REPORT];
520 list_for_each_entry(hreport, &rep_enum->report_list, list) {
521 for (i = 0; i < hreport->maxfield; i++) {
522
523 if (hreport->field[i]->report_count < 1)
524 continue;
525
526 for (j = 0; j < hreport->field[i]->maxusage; j++) {
527 wacom_feature_mapping(hdev, hreport->field[i],
528 hreport->field[i]->usage + j);
529 }
530 }
531 }
532
533
534 rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
535 list_for_each_entry(hreport, &rep_enum->report_list, list) {
536
537 if (!hreport->maxfield)
538 continue;
539
540 for (i = 0; i < hreport->maxfield; i++)
541 for (j = 0; j < hreport->field[i]->maxusage; j++)
542 wacom_usage_mapping(hdev, hreport->field[i],
543 hreport->field[i]->usage + j);
544 }
545
546 wacom_post_parse_hid(hdev, features);
547}
548
549static int wacom_hid_set_device_mode(struct hid_device *hdev)
550{
551 struct wacom *wacom = hid_get_drvdata(hdev);
552 struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
553 struct hid_report *r;
554 struct hid_report_enum *re;
555
556 if (hid_data->inputmode < 0)
557 return 0;
558
559 re = &(hdev->report_enum[HID_FEATURE_REPORT]);
560 r = re->report_id_hash[hid_data->inputmode];
561 if (r) {
562 r->field[0]->value[hid_data->inputmode_index] = 2;
563 hid_hw_request(hdev, r, HID_REQ_SET_REPORT);
564 }
565 return 0;
566}
567
568static int wacom_set_device_mode(struct hid_device *hdev,
569 struct wacom_wac *wacom_wac)
570{
571 u8 *rep_data;
572 struct hid_report *r;
573 struct hid_report_enum *re;
574 u32 length;
575 int error = -ENOMEM, limit = 0;
576
577 if (wacom_wac->mode_report < 0)
578 return 0;
579
580 re = &(hdev->report_enum[HID_FEATURE_REPORT]);
581 r = re->report_id_hash[wacom_wac->mode_report];
582 if (!r)
583 return -EINVAL;
584
585 rep_data = hid_alloc_report_buf(r, GFP_KERNEL);
586 if (!rep_data)
587 return -ENOMEM;
588
589 length = hid_report_len(r);
590
591 do {
592 rep_data[0] = wacom_wac->mode_report;
593 rep_data[1] = wacom_wac->mode_value;
594
595 error = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data,
596 length, 1);
597 if (error >= 0)
598 error = wacom_get_report(hdev, HID_FEATURE_REPORT,
599 rep_data, length, 1);
600 } while (error >= 0 &&
601 rep_data[1] != wacom_wac->mode_report &&
602 limit++ < WAC_MSG_RETRIES);
603
604 kfree(rep_data);
605
606 return error < 0 ? error : 0;
607}
608
609static int wacom_bt_query_tablet_data(struct hid_device *hdev, u8 speed,
610 struct wacom_features *features)
611{
612 struct wacom *wacom = hid_get_drvdata(hdev);
613 int ret;
614 u8 rep_data[2];
615
616 switch (features->type) {
617 case GRAPHIRE_BT:
618 rep_data[0] = 0x03;
619 rep_data[1] = 0x00;
620 ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
621 3);
622
623 if (ret >= 0) {
624 rep_data[0] = speed == 0 ? 0x05 : 0x06;
625 rep_data[1] = 0x00;
626
627 ret = wacom_set_report(hdev, HID_FEATURE_REPORT,
628 rep_data, 2, 3);
629
630 if (ret >= 0) {
631 wacom->wacom_wac.bt_high_speed = speed;
632 return 0;
633 }
634 }
635
636
637
638
639
640 hid_warn(hdev, "failed to poke device, command %d, err %d\n",
641 rep_data[0], ret);
642 break;
643 case INTUOS4WL:
644 if (speed == 1)
645 wacom->wacom_wac.bt_features &= ~0x20;
646 else
647 wacom->wacom_wac.bt_features |= 0x20;
648
649 rep_data[0] = 0x03;
650 rep_data[1] = wacom->wacom_wac.bt_features;
651
652 ret = wacom_set_report(hdev, HID_FEATURE_REPORT, rep_data, 2,
653 1);
654 if (ret >= 0)
655 wacom->wacom_wac.bt_high_speed = speed;
656 break;
657 }
658
659 return 0;
660}
661
662
663
664
665
666
667
668
669static int _wacom_query_tablet_data(struct wacom *wacom)
670{
671 struct hid_device *hdev = wacom->hdev;
672 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
673 struct wacom_features *features = &wacom_wac->features;
674
675 if (hdev->bus == BUS_BLUETOOTH)
676 return wacom_bt_query_tablet_data(hdev, 1, features);
677
678 if (features->type != HID_GENERIC) {
679 if (features->device_type & WACOM_DEVICETYPE_TOUCH) {
680 if (features->type > TABLETPC) {
681
682 wacom_wac->mode_report = 3;
683 wacom_wac->mode_value = 4;
684 } else if (features->type == WACOM_24HDT) {
685 wacom_wac->mode_report = 18;
686 wacom_wac->mode_value = 2;
687 } else if (features->type == WACOM_27QHDT) {
688 wacom_wac->mode_report = 131;
689 wacom_wac->mode_value = 2;
690 } else if (features->type == BAMBOO_PAD) {
691 wacom_wac->mode_report = 2;
692 wacom_wac->mode_value = 2;
693 }
694 } else if (features->device_type & WACOM_DEVICETYPE_PEN) {
695 if (features->type <= BAMBOO_PT) {
696 wacom_wac->mode_report = 2;
697 wacom_wac->mode_value = 2;
698 }
699 }
700 }
701
702 wacom_set_device_mode(hdev, wacom_wac);
703
704 if (features->type == HID_GENERIC)
705 return wacom_hid_set_device_mode(hdev);
706
707 return 0;
708}
709
710static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,
711 struct wacom_features *features)
712{
713 struct wacom *wacom = hid_get_drvdata(hdev);
714 struct usb_interface *intf = wacom->intf;
715
716
717 features->x_fuzz = 4;
718 features->y_fuzz = 4;
719 features->pressure_fuzz = 0;
720 features->distance_fuzz = 1;
721 features->tilt_fuzz = 1;
722
723
724
725
726
727
728
729 if (features->type == WIRELESS) {
730 if (intf->cur_altsetting->desc.bInterfaceNumber == 0)
731 features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
732 else
733 features->device_type = WACOM_DEVICETYPE_NONE;
734 return;
735 }
736
737 wacom_parse_hid(hdev, features);
738}
739
740struct wacom_hdev_data {
741 struct list_head list;
742 struct kref kref;
743 struct hid_device *dev;
744 struct wacom_shared shared;
745};
746
747static LIST_HEAD(wacom_udev_list);
748static DEFINE_MUTEX(wacom_udev_list_lock);
749
750static bool wacom_are_sibling(struct hid_device *hdev,
751 struct hid_device *sibling)
752{
753 struct wacom *wacom = hid_get_drvdata(hdev);
754 struct wacom_features *features = &wacom->wacom_wac.features;
755 struct wacom *sibling_wacom = hid_get_drvdata(sibling);
756 struct wacom_features *sibling_features = &sibling_wacom->wacom_wac.features;
757 __u32 oVid = features->oVid ? features->oVid : hdev->vendor;
758 __u32 oPid = features->oPid ? features->oPid : hdev->product;
759
760
761 if (features->oVid != HID_ANY_ID && sibling->vendor != oVid)
762 return false;
763 if (features->oPid != HID_ANY_ID && sibling->product != oPid)
764 return false;
765
766
767
768
769
770
771 if (hdev->vendor == sibling->vendor && hdev->product == sibling->product) {
772 if (!hid_compare_device_paths(hdev, sibling, '/'))
773 return false;
774 } else {
775 if (!hid_compare_device_paths(hdev, sibling, '.'))
776 return false;
777 }
778
779
780 if (features->type != HID_GENERIC)
781 return true;
782
783
784
785
786
787 if ((features->device_type & WACOM_DEVICETYPE_DIRECT) &&
788 !(sibling_features->device_type & WACOM_DEVICETYPE_DIRECT))
789 return false;
790
791
792
793
794
795 if (!(features->device_type & WACOM_DEVICETYPE_DIRECT) &&
796 (sibling_features->device_type & WACOM_DEVICETYPE_DIRECT))
797 return false;
798
799
800 if ((features->device_type & WACOM_DEVICETYPE_PEN) &&
801 !(sibling_features->device_type & WACOM_DEVICETYPE_TOUCH))
802 return false;
803
804
805 if ((features->device_type & WACOM_DEVICETYPE_TOUCH) &&
806 !(sibling_features->device_type & WACOM_DEVICETYPE_PEN))
807 return false;
808
809
810
811
812
813 return true;
814}
815
816static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev)
817{
818 struct wacom_hdev_data *data;
819
820
821 list_for_each_entry(data, &wacom_udev_list, list) {
822 if (hid_compare_device_paths(hdev, data->dev, '/')) {
823 kref_get(&data->kref);
824 return data;
825 }
826 }
827
828
829 list_for_each_entry(data, &wacom_udev_list, list) {
830 if (wacom_are_sibling(hdev, data->dev)) {
831 kref_get(&data->kref);
832 return data;
833 }
834 }
835
836 return NULL;
837}
838
839static void wacom_release_shared_data(struct kref *kref)
840{
841 struct wacom_hdev_data *data =
842 container_of(kref, struct wacom_hdev_data, kref);
843
844 mutex_lock(&wacom_udev_list_lock);
845 list_del(&data->list);
846 mutex_unlock(&wacom_udev_list_lock);
847
848 kfree(data);
849}
850
851static void wacom_remove_shared_data(void *res)
852{
853 struct wacom *wacom = res;
854 struct wacom_hdev_data *data;
855 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
856
857 if (wacom_wac->shared) {
858 data = container_of(wacom_wac->shared, struct wacom_hdev_data,
859 shared);
860
861 if (wacom_wac->shared->touch == wacom->hdev)
862 wacom_wac->shared->touch = NULL;
863 else if (wacom_wac->shared->pen == wacom->hdev)
864 wacom_wac->shared->pen = NULL;
865
866 kref_put(&data->kref, wacom_release_shared_data);
867 wacom_wac->shared = NULL;
868 }
869}
870
871static int wacom_add_shared_data(struct hid_device *hdev)
872{
873 struct wacom *wacom = hid_get_drvdata(hdev);
874 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
875 struct wacom_hdev_data *data;
876 int retval = 0;
877
878 mutex_lock(&wacom_udev_list_lock);
879
880 data = wacom_get_hdev_data(hdev);
881 if (!data) {
882 data = kzalloc(sizeof(struct wacom_hdev_data), GFP_KERNEL);
883 if (!data) {
884 retval = -ENOMEM;
885 goto out;
886 }
887
888 kref_init(&data->kref);
889 data->dev = hdev;
890 list_add_tail(&data->list, &wacom_udev_list);
891 }
892
893 wacom_wac->shared = &data->shared;
894
895 retval = devm_add_action(&hdev->dev, wacom_remove_shared_data, wacom);
896 if (retval) {
897 mutex_unlock(&wacom_udev_list_lock);
898 wacom_remove_shared_data(wacom);
899 return retval;
900 }
901
902 if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH)
903 wacom_wac->shared->touch = hdev;
904 else if (wacom_wac->features.device_type & WACOM_DEVICETYPE_PEN)
905 wacom_wac->shared->pen = hdev;
906
907out:
908 mutex_unlock(&wacom_udev_list_lock);
909 return retval;
910}
911
912static int wacom_led_control(struct wacom *wacom)
913{
914 unsigned char *buf;
915 int retval;
916 unsigned char report_id = WAC_CMD_LED_CONTROL;
917 int buf_size = 9;
918
919 if (!wacom->led.groups)
920 return -ENOTSUPP;
921
922 if (wacom->wacom_wac.features.type == REMOTE)
923 return -ENOTSUPP;
924
925 if (wacom->wacom_wac.pid) {
926 report_id = WAC_CMD_WL_LED_CONTROL;
927 buf_size = 13;
928 }
929 else if (wacom->wacom_wac.features.type == INTUOSP2_BT) {
930 report_id = WAC_CMD_WL_INTUOSP2;
931 buf_size = 51;
932 }
933 buf = kzalloc(buf_size, GFP_KERNEL);
934 if (!buf)
935 return -ENOMEM;
936
937 if (wacom->wacom_wac.features.type == HID_GENERIC) {
938 buf[0] = WAC_CMD_LED_CONTROL_GENERIC;
939 buf[1] = wacom->led.llv;
940 buf[2] = wacom->led.groups[0].select & 0x03;
941
942 } else if ((wacom->wacom_wac.features.type >= INTUOS5S &&
943 wacom->wacom_wac.features.type <= INTUOSPL)) {
944
945
946
947
948
949 int ring_led = wacom->led.groups[0].select & 0x03;
950 int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
951 int crop_lum = 0;
952 unsigned char led_bits = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
953
954 buf[0] = report_id;
955 if (wacom->wacom_wac.pid) {
956 wacom_get_report(wacom->hdev, HID_FEATURE_REPORT,
957 buf, buf_size, WAC_CMD_RETRIES);
958 buf[0] = report_id;
959 buf[4] = led_bits;
960 } else
961 buf[1] = led_bits;
962 }
963 else if (wacom->wacom_wac.features.type == INTUOSP2_BT) {
964 buf[0] = report_id;
965 buf[4] = 100;
966 buf[5] = 100;
967 buf[6] = 100;
968 buf[7] = 100;
969 buf[8] = 100;
970 buf[9] = wacom->led.llv;
971 buf[10] = wacom->led.groups[0].select & 0x03;
972 }
973 else {
974 int led = wacom->led.groups[0].select | 0x4;
975
976 if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
977 wacom->wacom_wac.features.type == WACOM_24HD)
978 led |= (wacom->led.groups[1].select << 4) | 0x40;
979
980 buf[0] = report_id;
981 buf[1] = led;
982 buf[2] = wacom->led.llv;
983 buf[3] = wacom->led.hlv;
984 buf[4] = wacom->led.img_lum;
985 }
986
987 retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, buf_size,
988 WAC_CMD_RETRIES);
989 kfree(buf);
990
991 return retval;
992}
993
994static int wacom_led_putimage(struct wacom *wacom, int button_id, u8 xfer_id,
995 const unsigned len, const void *img)
996{
997 unsigned char *buf;
998 int i, retval;
999 const unsigned chunk_len = len / 4;
1000
1001 buf = kzalloc(chunk_len + 3 , GFP_KERNEL);
1002 if (!buf)
1003 return -ENOMEM;
1004
1005
1006 buf[0] = WAC_CMD_ICON_START;
1007 buf[1] = 1;
1008 retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
1009 WAC_CMD_RETRIES);
1010 if (retval < 0)
1011 goto out;
1012
1013 buf[0] = xfer_id;
1014 buf[1] = button_id & 0x07;
1015 for (i = 0; i < 4; i++) {
1016 buf[2] = i;
1017 memcpy(buf + 3, img + i * chunk_len, chunk_len);
1018
1019 retval = wacom_set_report(wacom->hdev, HID_FEATURE_REPORT,
1020 buf, chunk_len + 3, WAC_CMD_RETRIES);
1021 if (retval < 0)
1022 break;
1023 }
1024
1025
1026 buf[0] = WAC_CMD_ICON_START;
1027 buf[1] = 0;
1028 wacom_set_report(wacom->hdev, HID_FEATURE_REPORT, buf, 2,
1029 WAC_CMD_RETRIES);
1030
1031out:
1032 kfree(buf);
1033 return retval;
1034}
1035
1036static ssize_t wacom_led_select_store(struct device *dev, int set_id,
1037 const char *buf, size_t count)
1038{
1039 struct hid_device *hdev = to_hid_device(dev);
1040 struct wacom *wacom = hid_get_drvdata(hdev);
1041 unsigned int id;
1042 int err;
1043
1044 err = kstrtouint(buf, 10, &id);
1045 if (err)
1046 return err;
1047
1048 mutex_lock(&wacom->lock);
1049
1050 wacom->led.groups[set_id].select = id & 0x3;
1051 err = wacom_led_control(wacom);
1052
1053 mutex_unlock(&wacom->lock);
1054
1055 return err < 0 ? err : count;
1056}
1057
1058#define DEVICE_LED_SELECT_ATTR(SET_ID) \
1059static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \
1060 struct device_attribute *attr, const char *buf, size_t count) \
1061{ \
1062 return wacom_led_select_store(dev, SET_ID, buf, count); \
1063} \
1064static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \
1065 struct device_attribute *attr, char *buf) \
1066{ \
1067 struct hid_device *hdev = to_hid_device(dev);\
1068 struct wacom *wacom = hid_get_drvdata(hdev); \
1069 return scnprintf(buf, PAGE_SIZE, "%d\n", \
1070 wacom->led.groups[SET_ID].select); \
1071} \
1072static DEVICE_ATTR(status_led##SET_ID##_select, DEV_ATTR_RW_PERM, \
1073 wacom_led##SET_ID##_select_show, \
1074 wacom_led##SET_ID##_select_store)
1075
1076DEVICE_LED_SELECT_ATTR(0);
1077DEVICE_LED_SELECT_ATTR(1);
1078
1079static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
1080 const char *buf, size_t count)
1081{
1082 unsigned int value;
1083 int err;
1084
1085 err = kstrtouint(buf, 10, &value);
1086 if (err)
1087 return err;
1088
1089 mutex_lock(&wacom->lock);
1090
1091 *dest = value & 0x7f;
1092 err = wacom_led_control(wacom);
1093
1094 mutex_unlock(&wacom->lock);
1095
1096 return err < 0 ? err : count;
1097}
1098
1099#define DEVICE_LUMINANCE_ATTR(name, field) \
1100static ssize_t wacom_##name##_luminance_store(struct device *dev, \
1101 struct device_attribute *attr, const char *buf, size_t count) \
1102{ \
1103 struct hid_device *hdev = to_hid_device(dev);\
1104 struct wacom *wacom = hid_get_drvdata(hdev); \
1105 \
1106 return wacom_luminance_store(wacom, &wacom->led.field, \
1107 buf, count); \
1108} \
1109static ssize_t wacom_##name##_luminance_show(struct device *dev, \
1110 struct device_attribute *attr, char *buf) \
1111{ \
1112 struct wacom *wacom = dev_get_drvdata(dev); \
1113 return scnprintf(buf, PAGE_SIZE, "%d\n", wacom->led.field); \
1114} \
1115static DEVICE_ATTR(name##_luminance, DEV_ATTR_RW_PERM, \
1116 wacom_##name##_luminance_show, \
1117 wacom_##name##_luminance_store)
1118
1119DEVICE_LUMINANCE_ATTR(status0, llv);
1120DEVICE_LUMINANCE_ATTR(status1, hlv);
1121DEVICE_LUMINANCE_ATTR(buttons, img_lum);
1122
1123static ssize_t wacom_button_image_store(struct device *dev, int button_id,
1124 const char *buf, size_t count)
1125{
1126 struct hid_device *hdev = to_hid_device(dev);
1127 struct wacom *wacom = hid_get_drvdata(hdev);
1128 int err;
1129 unsigned len;
1130 u8 xfer_id;
1131
1132 if (hdev->bus == BUS_BLUETOOTH) {
1133 len = 256;
1134 xfer_id = WAC_CMD_ICON_BT_XFER;
1135 } else {
1136 len = 1024;
1137 xfer_id = WAC_CMD_ICON_XFER;
1138 }
1139
1140 if (count != len)
1141 return -EINVAL;
1142
1143 mutex_lock(&wacom->lock);
1144
1145 err = wacom_led_putimage(wacom, button_id, xfer_id, len, buf);
1146
1147 mutex_unlock(&wacom->lock);
1148
1149 return err < 0 ? err : count;
1150}
1151
1152#define DEVICE_BTNIMG_ATTR(BUTTON_ID) \
1153static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \
1154 struct device_attribute *attr, const char *buf, size_t count) \
1155{ \
1156 return wacom_button_image_store(dev, BUTTON_ID, buf, count); \
1157} \
1158static DEVICE_ATTR(button##BUTTON_ID##_rawimg, DEV_ATTR_WO_PERM, \
1159 NULL, wacom_btnimg##BUTTON_ID##_store)
1160
1161DEVICE_BTNIMG_ATTR(0);
1162DEVICE_BTNIMG_ATTR(1);
1163DEVICE_BTNIMG_ATTR(2);
1164DEVICE_BTNIMG_ATTR(3);
1165DEVICE_BTNIMG_ATTR(4);
1166DEVICE_BTNIMG_ATTR(5);
1167DEVICE_BTNIMG_ATTR(6);
1168DEVICE_BTNIMG_ATTR(7);
1169
1170static struct attribute *cintiq_led_attrs[] = {
1171 &dev_attr_status_led0_select.attr,
1172 &dev_attr_status_led1_select.attr,
1173 NULL
1174};
1175
1176static const struct attribute_group cintiq_led_attr_group = {
1177 .name = "wacom_led",
1178 .attrs = cintiq_led_attrs,
1179};
1180
1181static struct attribute *intuos4_led_attrs[] = {
1182 &dev_attr_status0_luminance.attr,
1183 &dev_attr_status1_luminance.attr,
1184 &dev_attr_status_led0_select.attr,
1185 &dev_attr_buttons_luminance.attr,
1186 &dev_attr_button0_rawimg.attr,
1187 &dev_attr_button1_rawimg.attr,
1188 &dev_attr_button2_rawimg.attr,
1189 &dev_attr_button3_rawimg.attr,
1190 &dev_attr_button4_rawimg.attr,
1191 &dev_attr_button5_rawimg.attr,
1192 &dev_attr_button6_rawimg.attr,
1193 &dev_attr_button7_rawimg.attr,
1194 NULL
1195};
1196
1197static const struct attribute_group intuos4_led_attr_group = {
1198 .name = "wacom_led",
1199 .attrs = intuos4_led_attrs,
1200};
1201
1202static struct attribute *intuos5_led_attrs[] = {
1203 &dev_attr_status0_luminance.attr,
1204 &dev_attr_status_led0_select.attr,
1205 NULL
1206};
1207
1208static const struct attribute_group intuos5_led_attr_group = {
1209 .name = "wacom_led",
1210 .attrs = intuos5_led_attrs,
1211};
1212
1213static struct attribute *generic_led_attrs[] = {
1214 &dev_attr_status0_luminance.attr,
1215 &dev_attr_status_led0_select.attr,
1216 NULL
1217};
1218
1219static const struct attribute_group generic_led_attr_group = {
1220 .name = "wacom_led",
1221 .attrs = generic_led_attrs,
1222};
1223
1224struct wacom_sysfs_group_devres {
1225 const struct attribute_group *group;
1226 struct kobject *root;
1227};
1228
1229static void wacom_devm_sysfs_group_release(struct device *dev, void *res)
1230{
1231 struct wacom_sysfs_group_devres *devres = res;
1232 struct kobject *kobj = devres->root;
1233
1234 dev_dbg(dev, "%s: dropping reference to %s\n",
1235 __func__, devres->group->name);
1236 sysfs_remove_group(kobj, devres->group);
1237}
1238
1239static int __wacom_devm_sysfs_create_group(struct wacom *wacom,
1240 struct kobject *root,
1241 const struct attribute_group *group)
1242{
1243 struct wacom_sysfs_group_devres *devres;
1244 int error;
1245
1246 devres = devres_alloc(wacom_devm_sysfs_group_release,
1247 sizeof(struct wacom_sysfs_group_devres),
1248 GFP_KERNEL);
1249 if (!devres)
1250 return -ENOMEM;
1251
1252 devres->group = group;
1253 devres->root = root;
1254
1255 error = sysfs_create_group(devres->root, group);
1256 if (error) {
1257 devres_free(devres);
1258 return error;
1259 }
1260
1261 devres_add(&wacom->hdev->dev, devres);
1262
1263 return 0;
1264}
1265
1266static int wacom_devm_sysfs_create_group(struct wacom *wacom,
1267 const struct attribute_group *group)
1268{
1269 return __wacom_devm_sysfs_create_group(wacom, &wacom->hdev->dev.kobj,
1270 group);
1271}
1272
1273static void wacom_devm_kfifo_release(struct device *dev, void *res)
1274{
1275 struct kfifo_rec_ptr_2 *devres = res;
1276
1277 kfifo_free(devres);
1278}
1279
1280static int wacom_devm_kfifo_alloc(struct wacom *wacom)
1281{
1282 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1283 struct kfifo_rec_ptr_2 *pen_fifo;
1284 int error;
1285
1286 pen_fifo = devres_alloc(wacom_devm_kfifo_release,
1287 sizeof(struct kfifo_rec_ptr_2),
1288 GFP_KERNEL);
1289
1290 if (!pen_fifo)
1291 return -ENOMEM;
1292
1293 error = kfifo_alloc(pen_fifo, WACOM_PKGLEN_MAX, GFP_KERNEL);
1294 if (error) {
1295 devres_free(pen_fifo);
1296 return error;
1297 }
1298
1299 devres_add(&wacom->hdev->dev, pen_fifo);
1300 wacom_wac->pen_fifo = pen_fifo;
1301
1302 return 0;
1303}
1304
1305enum led_brightness wacom_leds_brightness_get(struct wacom_led *led)
1306{
1307 struct wacom *wacom = led->wacom;
1308
1309 if (wacom->led.max_hlv)
1310 return led->hlv * LED_FULL / wacom->led.max_hlv;
1311
1312 if (wacom->led.max_llv)
1313 return led->llv * LED_FULL / wacom->led.max_llv;
1314
1315
1316 return LED_FULL;
1317}
1318
1319static enum led_brightness __wacom_led_brightness_get(struct led_classdev *cdev)
1320{
1321 struct wacom_led *led = container_of(cdev, struct wacom_led, cdev);
1322 struct wacom *wacom = led->wacom;
1323
1324 if (wacom->led.groups[led->group].select != led->id)
1325 return LED_OFF;
1326
1327 return wacom_leds_brightness_get(led);
1328}
1329
1330static int wacom_led_brightness_set(struct led_classdev *cdev,
1331 enum led_brightness brightness)
1332{
1333 struct wacom_led *led = container_of(cdev, struct wacom_led, cdev);
1334 struct wacom *wacom = led->wacom;
1335 int error;
1336
1337 mutex_lock(&wacom->lock);
1338
1339 if (!wacom->led.groups || (brightness == LED_OFF &&
1340 wacom->led.groups[led->group].select != led->id)) {
1341 error = 0;
1342 goto out;
1343 }
1344
1345 led->llv = wacom->led.llv = wacom->led.max_llv * brightness / LED_FULL;
1346 led->hlv = wacom->led.hlv = wacom->led.max_hlv * brightness / LED_FULL;
1347
1348 wacom->led.groups[led->group].select = led->id;
1349
1350 error = wacom_led_control(wacom);
1351
1352out:
1353 mutex_unlock(&wacom->lock);
1354
1355 return error;
1356}
1357
1358static void wacom_led_readonly_brightness_set(struct led_classdev *cdev,
1359 enum led_brightness brightness)
1360{
1361}
1362
1363static int wacom_led_register_one(struct device *dev, struct wacom *wacom,
1364 struct wacom_led *led, unsigned int group,
1365 unsigned int id, bool read_only)
1366{
1367 int error;
1368 char *name;
1369
1370 name = devm_kasprintf(dev, GFP_KERNEL,
1371 "%s::wacom-%d.%d",
1372 dev_name(dev),
1373 group,
1374 id);
1375 if (!name)
1376 return -ENOMEM;
1377
1378 if (!read_only) {
1379 led->trigger.name = name;
1380 error = devm_led_trigger_register(dev, &led->trigger);
1381 if (error) {
1382 hid_err(wacom->hdev,
1383 "failed to register LED trigger %s: %d\n",
1384 led->cdev.name, error);
1385 return error;
1386 }
1387 }
1388
1389 led->group = group;
1390 led->id = id;
1391 led->wacom = wacom;
1392 led->llv = wacom->led.llv;
1393 led->hlv = wacom->led.hlv;
1394 led->cdev.name = name;
1395 led->cdev.max_brightness = LED_FULL;
1396 led->cdev.flags = LED_HW_PLUGGABLE;
1397 led->cdev.brightness_get = __wacom_led_brightness_get;
1398 if (!read_only) {
1399 led->cdev.brightness_set_blocking = wacom_led_brightness_set;
1400 led->cdev.default_trigger = led->cdev.name;
1401 } else {
1402 led->cdev.brightness_set = wacom_led_readonly_brightness_set;
1403 }
1404
1405 error = devm_led_classdev_register(dev, &led->cdev);
1406 if (error) {
1407 hid_err(wacom->hdev,
1408 "failed to register LED %s: %d\n",
1409 led->cdev.name, error);
1410 led->cdev.name = NULL;
1411 return error;
1412 }
1413
1414 return 0;
1415}
1416
1417static void wacom_led_groups_release_one(void *data)
1418{
1419 struct wacom_group_leds *group = data;
1420
1421 devres_release_group(group->dev, group);
1422}
1423
1424static int wacom_led_groups_alloc_and_register_one(struct device *dev,
1425 struct wacom *wacom,
1426 int group_id, int count,
1427 bool read_only)
1428{
1429 struct wacom_led *leds;
1430 int i, error;
1431
1432 if (group_id >= wacom->led.count || count <= 0)
1433 return -EINVAL;
1434
1435 if (!devres_open_group(dev, &wacom->led.groups[group_id], GFP_KERNEL))
1436 return -ENOMEM;
1437
1438 leds = devm_kcalloc(dev, count, sizeof(struct wacom_led), GFP_KERNEL);
1439 if (!leds) {
1440 error = -ENOMEM;
1441 goto err;
1442 }
1443
1444 wacom->led.groups[group_id].leds = leds;
1445 wacom->led.groups[group_id].count = count;
1446
1447 for (i = 0; i < count; i++) {
1448 error = wacom_led_register_one(dev, wacom, &leds[i],
1449 group_id, i, read_only);
1450 if (error)
1451 goto err;
1452 }
1453
1454 wacom->led.groups[group_id].dev = dev;
1455
1456 devres_close_group(dev, &wacom->led.groups[group_id]);
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467 error = devm_add_action_or_reset(&wacom->hdev->dev,
1468 wacom_led_groups_release_one,
1469 &wacom->led.groups[group_id]);
1470 if (error)
1471 return error;
1472
1473 return 0;
1474
1475err:
1476 devres_release_group(dev, &wacom->led.groups[group_id]);
1477 return error;
1478}
1479
1480struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group_id,
1481 unsigned int id)
1482{
1483 struct wacom_group_leds *group;
1484
1485 if (group_id >= wacom->led.count)
1486 return NULL;
1487
1488 group = &wacom->led.groups[group_id];
1489
1490 if (!group->leds)
1491 return NULL;
1492
1493 id %= group->count;
1494
1495 return &group->leds[id];
1496}
1497
1498
1499
1500
1501
1502
1503
1504struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur)
1505{
1506 struct wacom_led *next_led;
1507 int group, next;
1508
1509 if (!wacom || !cur)
1510 return NULL;
1511
1512 group = cur->group;
1513 next = cur->id;
1514
1515 do {
1516 next_led = wacom_led_find(wacom, group, ++next);
1517 if (!next_led || next_led == cur)
1518 return next_led;
1519 } while (next_led->cdev.trigger != &next_led->trigger);
1520
1521 return next_led;
1522}
1523
1524static void wacom_led_groups_release(void *data)
1525{
1526 struct wacom *wacom = data;
1527
1528 wacom->led.groups = NULL;
1529 wacom->led.count = 0;
1530}
1531
1532static int wacom_led_groups_allocate(struct wacom *wacom, int count)
1533{
1534 struct device *dev = &wacom->hdev->dev;
1535 struct wacom_group_leds *groups;
1536 int error;
1537
1538 groups = devm_kcalloc(dev, count, sizeof(struct wacom_group_leds),
1539 GFP_KERNEL);
1540 if (!groups)
1541 return -ENOMEM;
1542
1543 error = devm_add_action_or_reset(dev, wacom_led_groups_release, wacom);
1544 if (error)
1545 return error;
1546
1547 wacom->led.groups = groups;
1548 wacom->led.count = count;
1549
1550 return 0;
1551}
1552
1553static int wacom_leds_alloc_and_register(struct wacom *wacom, int group_count,
1554 int led_per_group, bool read_only)
1555{
1556 struct device *dev;
1557 int i, error;
1558
1559 if (!wacom->wacom_wac.pad_input)
1560 return -EINVAL;
1561
1562 dev = &wacom->wacom_wac.pad_input->dev;
1563
1564 error = wacom_led_groups_allocate(wacom, group_count);
1565 if (error)
1566 return error;
1567
1568 for (i = 0; i < group_count; i++) {
1569 error = wacom_led_groups_alloc_and_register_one(dev, wacom, i,
1570 led_per_group,
1571 read_only);
1572 if (error)
1573 return error;
1574 }
1575
1576 return 0;
1577}
1578
1579int wacom_initialize_leds(struct wacom *wacom)
1580{
1581 int error;
1582
1583 if (!(wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD))
1584 return 0;
1585
1586
1587 switch (wacom->wacom_wac.features.type) {
1588 case HID_GENERIC:
1589 if (!wacom->generic_has_leds)
1590 return 0;
1591 wacom->led.llv = 100;
1592 wacom->led.max_llv = 100;
1593
1594 error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1595 if (error) {
1596 hid_err(wacom->hdev,
1597 "cannot create leds err: %d\n", error);
1598 return error;
1599 }
1600
1601 error = wacom_devm_sysfs_create_group(wacom,
1602 &generic_led_attr_group);
1603 break;
1604
1605 case INTUOS4S:
1606 case INTUOS4:
1607 case INTUOS4WL:
1608 case INTUOS4L:
1609 wacom->led.llv = 10;
1610 wacom->led.hlv = 20;
1611 wacom->led.max_llv = 127;
1612 wacom->led.max_hlv = 127;
1613 wacom->led.img_lum = 10;
1614
1615 error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1616 if (error) {
1617 hid_err(wacom->hdev,
1618 "cannot create leds err: %d\n", error);
1619 return error;
1620 }
1621
1622 error = wacom_devm_sysfs_create_group(wacom,
1623 &intuos4_led_attr_group);
1624 break;
1625
1626 case WACOM_24HD:
1627 case WACOM_21UX2:
1628 wacom->led.llv = 0;
1629 wacom->led.hlv = 0;
1630 wacom->led.img_lum = 0;
1631
1632 error = wacom_leds_alloc_and_register(wacom, 2, 4, false);
1633 if (error) {
1634 hid_err(wacom->hdev,
1635 "cannot create leds err: %d\n", error);
1636 return error;
1637 }
1638
1639 error = wacom_devm_sysfs_create_group(wacom,
1640 &cintiq_led_attr_group);
1641 break;
1642
1643 case INTUOS5S:
1644 case INTUOS5:
1645 case INTUOS5L:
1646 case INTUOSPS:
1647 case INTUOSPM:
1648 case INTUOSPL:
1649 wacom->led.llv = 32;
1650 wacom->led.max_llv = 96;
1651
1652 error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1653 if (error) {
1654 hid_err(wacom->hdev,
1655 "cannot create leds err: %d\n", error);
1656 return error;
1657 }
1658
1659 error = wacom_devm_sysfs_create_group(wacom,
1660 &intuos5_led_attr_group);
1661 break;
1662
1663 case INTUOSP2_BT:
1664 wacom->led.llv = 50;
1665 wacom->led.max_llv = 100;
1666 error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1667 if (error) {
1668 hid_err(wacom->hdev,
1669 "cannot create leds err: %d\n", error);
1670 return error;
1671 }
1672 return 0;
1673
1674 case REMOTE:
1675 wacom->led.llv = 255;
1676 wacom->led.max_llv = 255;
1677 error = wacom_led_groups_allocate(wacom, 5);
1678 if (error) {
1679 hid_err(wacom->hdev,
1680 "cannot create leds err: %d\n", error);
1681 return error;
1682 }
1683 return 0;
1684
1685 default:
1686 return 0;
1687 }
1688
1689 if (error) {
1690 hid_err(wacom->hdev,
1691 "cannot create sysfs group err: %d\n", error);
1692 return error;
1693 }
1694
1695 return 0;
1696}
1697
1698static void wacom_init_work(struct work_struct *work)
1699{
1700 struct wacom *wacom = container_of(work, struct wacom, init_work.work);
1701
1702 _wacom_query_tablet_data(wacom);
1703 wacom_led_control(wacom);
1704}
1705
1706static void wacom_query_tablet_data(struct wacom *wacom)
1707{
1708 schedule_delayed_work(&wacom->init_work, msecs_to_jiffies(1000));
1709}
1710
1711static enum power_supply_property wacom_battery_props[] = {
1712 POWER_SUPPLY_PROP_MODEL_NAME,
1713 POWER_SUPPLY_PROP_PRESENT,
1714 POWER_SUPPLY_PROP_STATUS,
1715 POWER_SUPPLY_PROP_SCOPE,
1716 POWER_SUPPLY_PROP_CAPACITY
1717};
1718
1719static int wacom_battery_get_property(struct power_supply *psy,
1720 enum power_supply_property psp,
1721 union power_supply_propval *val)
1722{
1723 struct wacom_battery *battery = power_supply_get_drvdata(psy);
1724 int ret = 0;
1725
1726 switch (psp) {
1727 case POWER_SUPPLY_PROP_MODEL_NAME:
1728 val->strval = battery->wacom->wacom_wac.name;
1729 break;
1730 case POWER_SUPPLY_PROP_PRESENT:
1731 val->intval = battery->bat_connected;
1732 break;
1733 case POWER_SUPPLY_PROP_SCOPE:
1734 val->intval = POWER_SUPPLY_SCOPE_DEVICE;
1735 break;
1736 case POWER_SUPPLY_PROP_CAPACITY:
1737 val->intval = battery->battery_capacity;
1738 break;
1739 case POWER_SUPPLY_PROP_STATUS:
1740 if (battery->bat_status != WACOM_POWER_SUPPLY_STATUS_AUTO)
1741 val->intval = battery->bat_status;
1742 else if (battery->bat_charging)
1743 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1744 else if (battery->battery_capacity == 100 &&
1745 battery->ps_connected)
1746 val->intval = POWER_SUPPLY_STATUS_FULL;
1747 else if (battery->ps_connected)
1748 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
1749 else
1750 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1751 break;
1752 default:
1753 ret = -EINVAL;
1754 break;
1755 }
1756
1757 return ret;
1758}
1759
1760static int __wacom_initialize_battery(struct wacom *wacom,
1761 struct wacom_battery *battery)
1762{
1763 static atomic_t battery_no = ATOMIC_INIT(0);
1764 struct device *dev = &wacom->hdev->dev;
1765 struct power_supply_config psy_cfg = { .drv_data = battery, };
1766 struct power_supply *ps_bat;
1767 struct power_supply_desc *bat_desc = &battery->bat_desc;
1768 unsigned long n;
1769 int error;
1770
1771 if (!devres_open_group(dev, bat_desc, GFP_KERNEL))
1772 return -ENOMEM;
1773
1774 battery->wacom = wacom;
1775
1776 n = atomic_inc_return(&battery_no) - 1;
1777
1778 bat_desc->properties = wacom_battery_props;
1779 bat_desc->num_properties = ARRAY_SIZE(wacom_battery_props);
1780 bat_desc->get_property = wacom_battery_get_property;
1781 sprintf(battery->bat_name, "wacom_battery_%ld", n);
1782 bat_desc->name = battery->bat_name;
1783 bat_desc->type = POWER_SUPPLY_TYPE_USB;
1784 bat_desc->use_for_apm = 0;
1785
1786 ps_bat = devm_power_supply_register(dev, bat_desc, &psy_cfg);
1787 if (IS_ERR(ps_bat)) {
1788 error = PTR_ERR(ps_bat);
1789 goto err;
1790 }
1791
1792 power_supply_powers(ps_bat, &wacom->hdev->dev);
1793
1794 battery->battery = ps_bat;
1795
1796 devres_close_group(dev, bat_desc);
1797 return 0;
1798
1799err:
1800 devres_release_group(dev, bat_desc);
1801 return error;
1802}
1803
1804static int wacom_initialize_battery(struct wacom *wacom)
1805{
1806 if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY)
1807 return __wacom_initialize_battery(wacom, &wacom->battery);
1808
1809 return 0;
1810}
1811
1812static void wacom_destroy_battery(struct wacom *wacom)
1813{
1814 if (wacom->battery.battery) {
1815 devres_release_group(&wacom->hdev->dev,
1816 &wacom->battery.bat_desc);
1817 wacom->battery.battery = NULL;
1818 }
1819}
1820
1821static ssize_t wacom_show_speed(struct device *dev,
1822 struct device_attribute
1823 *attr, char *buf)
1824{
1825 struct hid_device *hdev = to_hid_device(dev);
1826 struct wacom *wacom = hid_get_drvdata(hdev);
1827
1828 return sysfs_emit(buf, "%i\n", wacom->wacom_wac.bt_high_speed);
1829}
1830
1831static ssize_t wacom_store_speed(struct device *dev,
1832 struct device_attribute *attr,
1833 const char *buf, size_t count)
1834{
1835 struct hid_device *hdev = to_hid_device(dev);
1836 struct wacom *wacom = hid_get_drvdata(hdev);
1837 u8 new_speed;
1838
1839 if (kstrtou8(buf, 0, &new_speed))
1840 return -EINVAL;
1841
1842 if (new_speed != 0 && new_speed != 1)
1843 return -EINVAL;
1844
1845 wacom_bt_query_tablet_data(hdev, new_speed, &wacom->wacom_wac.features);
1846
1847 return count;
1848}
1849
1850static DEVICE_ATTR(speed, DEV_ATTR_RW_PERM,
1851 wacom_show_speed, wacom_store_speed);
1852
1853
1854static ssize_t wacom_show_remote_mode(struct kobject *kobj,
1855 struct kobj_attribute *kattr,
1856 char *buf, int index)
1857{
1858 struct device *dev = kobj_to_dev(kobj->parent);
1859 struct hid_device *hdev = to_hid_device(dev);
1860 struct wacom *wacom = hid_get_drvdata(hdev);
1861 u8 mode;
1862
1863 mode = wacom->led.groups[index].select;
1864 return sprintf(buf, "%d\n", mode < 3 ? mode : -1);
1865}
1866
1867#define DEVICE_EKR_ATTR_GROUP(SET_ID) \
1868static ssize_t wacom_show_remote##SET_ID##_mode(struct kobject *kobj, \
1869 struct kobj_attribute *kattr, char *buf) \
1870{ \
1871 return wacom_show_remote_mode(kobj, kattr, buf, SET_ID); \
1872} \
1873static struct kobj_attribute remote##SET_ID##_mode_attr = { \
1874 .attr = {.name = "remote_mode", \
1875 .mode = DEV_ATTR_RO_PERM}, \
1876 .show = wacom_show_remote##SET_ID##_mode, \
1877}; \
1878static struct attribute *remote##SET_ID##_serial_attrs[] = { \
1879 &remote##SET_ID##_mode_attr.attr, \
1880 NULL \
1881}; \
1882static const struct attribute_group remote##SET_ID##_serial_group = { \
1883 .name = NULL, \
1884 .attrs = remote##SET_ID##_serial_attrs, \
1885}
1886
1887DEVICE_EKR_ATTR_GROUP(0);
1888DEVICE_EKR_ATTR_GROUP(1);
1889DEVICE_EKR_ATTR_GROUP(2);
1890DEVICE_EKR_ATTR_GROUP(3);
1891DEVICE_EKR_ATTR_GROUP(4);
1892
1893static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
1894 int index)
1895{
1896 int error = 0;
1897 struct wacom_remote *remote = wacom->remote;
1898
1899 remote->remotes[index].group.name = devm_kasprintf(&wacom->hdev->dev,
1900 GFP_KERNEL,
1901 "%d", serial);
1902 if (!remote->remotes[index].group.name)
1903 return -ENOMEM;
1904
1905 error = __wacom_devm_sysfs_create_group(wacom, remote->remote_dir,
1906 &remote->remotes[index].group);
1907 if (error) {
1908 remote->remotes[index].group.name = NULL;
1909 hid_err(wacom->hdev,
1910 "cannot create sysfs group err: %d\n", error);
1911 return error;
1912 }
1913
1914 return 0;
1915}
1916
1917static int wacom_cmd_unpair_remote(struct wacom *wacom, unsigned char selector)
1918{
1919 const size_t buf_size = 2;
1920 unsigned char *buf;
1921 int retval;
1922
1923 buf = kzalloc(buf_size, GFP_KERNEL);
1924 if (!buf)
1925 return -ENOMEM;
1926
1927 buf[0] = WAC_CMD_DELETE_PAIRING;
1928 buf[1] = selector;
1929
1930 retval = wacom_set_report(wacom->hdev, HID_OUTPUT_REPORT, buf,
1931 buf_size, WAC_CMD_RETRIES);
1932 kfree(buf);
1933
1934 return retval;
1935}
1936
1937static ssize_t wacom_store_unpair_remote(struct kobject *kobj,
1938 struct kobj_attribute *attr,
1939 const char *buf, size_t count)
1940{
1941 unsigned char selector = 0;
1942 struct device *dev = kobj_to_dev(kobj->parent);
1943 struct hid_device *hdev = to_hid_device(dev);
1944 struct wacom *wacom = hid_get_drvdata(hdev);
1945 int err;
1946
1947 if (!strncmp(buf, "*\n", 2)) {
1948 selector = WAC_CMD_UNPAIR_ALL;
1949 } else {
1950 hid_info(wacom->hdev, "remote: unrecognized unpair code: %s\n",
1951 buf);
1952 return -1;
1953 }
1954
1955 mutex_lock(&wacom->lock);
1956
1957 err = wacom_cmd_unpair_remote(wacom, selector);
1958 mutex_unlock(&wacom->lock);
1959
1960 return err < 0 ? err : count;
1961}
1962
1963static struct kobj_attribute unpair_remote_attr = {
1964 .attr = {.name = "unpair_remote", .mode = 0200},
1965 .store = wacom_store_unpair_remote,
1966};
1967
1968static const struct attribute *remote_unpair_attrs[] = {
1969 &unpair_remote_attr.attr,
1970 NULL
1971};
1972
1973static void wacom_remotes_destroy(void *data)
1974{
1975 struct wacom *wacom = data;
1976 struct wacom_remote *remote = wacom->remote;
1977
1978 if (!remote)
1979 return;
1980
1981 kobject_put(remote->remote_dir);
1982 kfifo_free(&remote->remote_fifo);
1983 wacom->remote = NULL;
1984}
1985
1986static int wacom_initialize_remotes(struct wacom *wacom)
1987{
1988 int error = 0;
1989 struct wacom_remote *remote;
1990 int i;
1991
1992 if (wacom->wacom_wac.features.type != REMOTE)
1993 return 0;
1994
1995 remote = devm_kzalloc(&wacom->hdev->dev, sizeof(*wacom->remote),
1996 GFP_KERNEL);
1997 if (!remote)
1998 return -ENOMEM;
1999
2000 wacom->remote = remote;
2001
2002 spin_lock_init(&remote->remote_lock);
2003
2004 error = kfifo_alloc(&remote->remote_fifo,
2005 5 * sizeof(struct wacom_remote_data),
2006 GFP_KERNEL);
2007 if (error) {
2008 hid_err(wacom->hdev, "failed allocating remote_fifo\n");
2009 return -ENOMEM;
2010 }
2011
2012 remote->remotes[0].group = remote0_serial_group;
2013 remote->remotes[1].group = remote1_serial_group;
2014 remote->remotes[2].group = remote2_serial_group;
2015 remote->remotes[3].group = remote3_serial_group;
2016 remote->remotes[4].group = remote4_serial_group;
2017
2018 remote->remote_dir = kobject_create_and_add("wacom_remote",
2019 &wacom->hdev->dev.kobj);
2020 if (!remote->remote_dir)
2021 return -ENOMEM;
2022
2023 error = sysfs_create_files(remote->remote_dir, remote_unpair_attrs);
2024
2025 if (error) {
2026 hid_err(wacom->hdev,
2027 "cannot create sysfs group err: %d\n", error);
2028 return error;
2029 }
2030
2031 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2032 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
2033 remote->remotes[i].serial = 0;
2034 }
2035
2036 error = devm_add_action_or_reset(&wacom->hdev->dev,
2037 wacom_remotes_destroy, wacom);
2038 if (error)
2039 return error;
2040
2041 return 0;
2042}
2043
2044static struct input_dev *wacom_allocate_input(struct wacom *wacom)
2045{
2046 struct input_dev *input_dev;
2047 struct hid_device *hdev = wacom->hdev;
2048 struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
2049
2050 input_dev = devm_input_allocate_device(&hdev->dev);
2051 if (!input_dev)
2052 return NULL;
2053
2054 input_dev->name = wacom_wac->features.name;
2055 input_dev->phys = hdev->phys;
2056 input_dev->dev.parent = &hdev->dev;
2057 input_dev->open = wacom_open;
2058 input_dev->close = wacom_close;
2059 input_dev->uniq = hdev->uniq;
2060 input_dev->id.bustype = hdev->bus;
2061 input_dev->id.vendor = hdev->vendor;
2062 input_dev->id.product = wacom_wac->pid ? wacom_wac->pid : hdev->product;
2063 input_dev->id.version = hdev->version;
2064 input_set_drvdata(input_dev, wacom);
2065
2066 return input_dev;
2067}
2068
2069static int wacom_allocate_inputs(struct wacom *wacom)
2070{
2071 struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
2072
2073 wacom_wac->pen_input = wacom_allocate_input(wacom);
2074 wacom_wac->touch_input = wacom_allocate_input(wacom);
2075 wacom_wac->pad_input = wacom_allocate_input(wacom);
2076 if (!wacom_wac->pen_input ||
2077 !wacom_wac->touch_input ||
2078 !wacom_wac->pad_input)
2079 return -ENOMEM;
2080
2081 wacom_wac->pen_input->name = wacom_wac->pen_name;
2082 wacom_wac->touch_input->name = wacom_wac->touch_name;
2083 wacom_wac->pad_input->name = wacom_wac->pad_name;
2084
2085 return 0;
2086}
2087
2088static int wacom_register_inputs(struct wacom *wacom)
2089{
2090 struct input_dev *pen_input_dev, *touch_input_dev, *pad_input_dev;
2091 struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
2092 int error = 0;
2093
2094 pen_input_dev = wacom_wac->pen_input;
2095 touch_input_dev = wacom_wac->touch_input;
2096 pad_input_dev = wacom_wac->pad_input;
2097
2098 if (!pen_input_dev || !touch_input_dev || !pad_input_dev)
2099 return -EINVAL;
2100
2101 error = wacom_setup_pen_input_capabilities(pen_input_dev, wacom_wac);
2102 if (error) {
2103
2104 input_free_device(pen_input_dev);
2105 wacom_wac->pen_input = NULL;
2106 pen_input_dev = NULL;
2107 } else {
2108 error = input_register_device(pen_input_dev);
2109 if (error)
2110 goto fail;
2111 }
2112
2113 error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac);
2114 if (error) {
2115
2116 input_free_device(touch_input_dev);
2117 wacom_wac->touch_input = NULL;
2118 touch_input_dev = NULL;
2119 } else {
2120 error = input_register_device(touch_input_dev);
2121 if (error)
2122 goto fail;
2123 }
2124
2125 error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
2126 if (error) {
2127
2128 input_free_device(pad_input_dev);
2129 wacom_wac->pad_input = NULL;
2130 pad_input_dev = NULL;
2131 } else {
2132 error = input_register_device(pad_input_dev);
2133 if (error)
2134 goto fail;
2135 }
2136
2137 return 0;
2138
2139fail:
2140 wacom_wac->pad_input = NULL;
2141 wacom_wac->touch_input = NULL;
2142 wacom_wac->pen_input = NULL;
2143 return error;
2144}
2145
2146
2147
2148
2149
2150
2151static void wacom_set_default_phy(struct wacom_features *features)
2152{
2153 if (features->x_resolution) {
2154 features->x_phy = (features->x_max * 100) /
2155 features->x_resolution;
2156 features->y_phy = (features->y_max * 100) /
2157 features->y_resolution;
2158 }
2159}
2160
2161static void wacom_calculate_res(struct wacom_features *features)
2162{
2163
2164 if (!features->unit) {
2165 features->unit = 0x11;
2166 features->unitExpo = -3;
2167 }
2168
2169 features->x_resolution = wacom_calc_hid_res(features->x_max,
2170 features->x_phy,
2171 features->unit,
2172 features->unitExpo);
2173 features->y_resolution = wacom_calc_hid_res(features->y_max,
2174 features->y_phy,
2175 features->unit,
2176 features->unitExpo);
2177}
2178
2179void wacom_battery_work(struct work_struct *work)
2180{
2181 struct wacom *wacom = container_of(work, struct wacom, battery_work);
2182
2183 if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
2184 !wacom->battery.battery) {
2185 wacom_initialize_battery(wacom);
2186 }
2187 else if (!(wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
2188 wacom->battery.battery) {
2189 wacom_destroy_battery(wacom);
2190 }
2191}
2192
2193static size_t wacom_compute_pktlen(struct hid_device *hdev)
2194{
2195 struct hid_report_enum *report_enum;
2196 struct hid_report *report;
2197 size_t size = 0;
2198
2199 report_enum = hdev->report_enum + HID_INPUT_REPORT;
2200
2201 list_for_each_entry(report, &report_enum->report_list, list) {
2202 size_t report_size = hid_report_len(report);
2203 if (report_size > size)
2204 size = report_size;
2205 }
2206
2207 return size;
2208}
2209
2210static void wacom_update_name(struct wacom *wacom, const char *suffix)
2211{
2212 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2213 struct wacom_features *features = &wacom_wac->features;
2214 char name[WACOM_NAME_MAX - 20];
2215
2216
2217 if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
2218 char *product_name = wacom->hdev->name;
2219
2220 if (hid_is_using_ll_driver(wacom->hdev, &usb_hid_driver)) {
2221 struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent);
2222 struct usb_device *dev = interface_to_usbdev(intf);
2223 product_name = dev->product;
2224 }
2225
2226 if (wacom->hdev->bus == BUS_I2C) {
2227 snprintf(name, sizeof(name), "%s %X",
2228 features->name, wacom->hdev->product);
2229 } else if (strstr(product_name, "Wacom") ||
2230 strstr(product_name, "wacom") ||
2231 strstr(product_name, "WACOM")) {
2232 strlcpy(name, product_name, sizeof(name));
2233 } else {
2234 snprintf(name, sizeof(name), "Wacom %s", product_name);
2235 }
2236
2237
2238 while (1) {
2239 char *gap = strstr(name, " ");
2240 if (gap == NULL)
2241 break;
2242
2243 memmove(gap, gap+1, strlen(gap));
2244 }
2245
2246
2247 if (name[strlen(name)-1] == ' ')
2248 name[strlen(name)-1] = '\0';
2249 } else {
2250 strlcpy(name, features->name, sizeof(name));
2251 }
2252
2253 snprintf(wacom_wac->name, sizeof(wacom_wac->name), "%s%s",
2254 name, suffix);
2255
2256
2257 snprintf(wacom_wac->pen_name, sizeof(wacom_wac->pen_name),
2258 "%s%s Pen", name, suffix);
2259 snprintf(wacom_wac->touch_name, sizeof(wacom_wac->touch_name),
2260 "%s%s Finger", name, suffix);
2261 snprintf(wacom_wac->pad_name, sizeof(wacom_wac->pad_name),
2262 "%s%s Pad", name, suffix);
2263}
2264
2265static void wacom_release_resources(struct wacom *wacom)
2266{
2267 struct hid_device *hdev = wacom->hdev;
2268
2269 if (!wacom->resources)
2270 return;
2271
2272 devres_release_group(&hdev->dev, wacom);
2273
2274 wacom->resources = false;
2275
2276 wacom->wacom_wac.pen_input = NULL;
2277 wacom->wacom_wac.touch_input = NULL;
2278 wacom->wacom_wac.pad_input = NULL;
2279}
2280
2281static void wacom_set_shared_values(struct wacom_wac *wacom_wac)
2282{
2283 if (wacom_wac->features.device_type & WACOM_DEVICETYPE_TOUCH) {
2284 wacom_wac->shared->type = wacom_wac->features.type;
2285 wacom_wac->shared->touch_input = wacom_wac->touch_input;
2286 }
2287
2288 if (wacom_wac->has_mute_touch_switch) {
2289 wacom_wac->shared->has_mute_touch_switch = true;
2290
2291
2292
2293
2294
2295 if (wacom_wac->is_soft_touch_switch)
2296 wacom_wac->shared->is_touch_on = true;
2297 }
2298
2299 if (wacom_wac->shared->has_mute_touch_switch &&
2300 wacom_wac->shared->touch_input) {
2301 set_bit(EV_SW, wacom_wac->shared->touch_input->evbit);
2302 input_set_capability(wacom_wac->shared->touch_input, EV_SW,
2303 SW_MUTE_DEVICE);
2304 }
2305}
2306
2307static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
2308{
2309 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2310 struct wacom_features *features = &wacom_wac->features;
2311 struct hid_device *hdev = wacom->hdev;
2312 int error;
2313 unsigned int connect_mask = HID_CONNECT_HIDRAW;
2314
2315 features->pktlen = wacom_compute_pktlen(hdev);
2316 if (features->pktlen > WACOM_PKGLEN_MAX)
2317 return -EINVAL;
2318
2319 if (!devres_open_group(&hdev->dev, wacom, GFP_KERNEL))
2320 return -ENOMEM;
2321
2322 wacom->resources = true;
2323
2324 error = wacom_allocate_inputs(wacom);
2325 if (error)
2326 goto fail;
2327
2328
2329
2330
2331
2332
2333 if (features->type == BAMBOO_PAD) {
2334 if (features->pktlen == WACOM_PKGLEN_PENABLED) {
2335 features->type = HID_GENERIC;
2336 } else if ((features->pktlen != WACOM_PKGLEN_BPAD_TOUCH) &&
2337 (features->pktlen != WACOM_PKGLEN_BPAD_TOUCH_USB)) {
2338 error = -ENODEV;
2339 goto fail;
2340 }
2341 }
2342
2343
2344 wacom_set_default_phy(features);
2345
2346
2347 wacom_retrieve_hid_descriptor(hdev, features);
2348 wacom_setup_device_quirks(wacom);
2349
2350 if (features->device_type == WACOM_DEVICETYPE_NONE &&
2351 features->type != WIRELESS) {
2352 error = features->type == HID_GENERIC ? -ENODEV : 0;
2353
2354 dev_warn(&hdev->dev, "Unknown device_type for '%s'. %s.",
2355 hdev->name,
2356 error ? "Ignoring" : "Assuming pen");
2357
2358 if (error)
2359 goto fail;
2360
2361 features->device_type |= WACOM_DEVICETYPE_PEN;
2362 }
2363
2364 wacom_calculate_res(features);
2365
2366 wacom_update_name(wacom, wireless ? " (WL)" : "");
2367
2368
2369 if ((features->type == BAMBOO_PEN) &&
2370 ((features->device_type & WACOM_DEVICETYPE_TOUCH) ||
2371 (features->device_type & WACOM_DEVICETYPE_PAD))) {
2372 error = -ENODEV;
2373 goto fail;
2374 }
2375
2376 error = wacom_add_shared_data(hdev);
2377 if (error)
2378 goto fail;
2379
2380 if (!(features->device_type & WACOM_DEVICETYPE_WL_MONITOR) &&
2381 (features->quirks & WACOM_QUIRK_BATTERY)) {
2382 error = wacom_initialize_battery(wacom);
2383 if (error)
2384 goto fail;
2385 }
2386
2387 error = wacom_register_inputs(wacom);
2388 if (error)
2389 goto fail;
2390
2391 if (wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD) {
2392 error = wacom_initialize_leds(wacom);
2393 if (error)
2394 goto fail;
2395
2396 error = wacom_initialize_remotes(wacom);
2397 if (error)
2398 goto fail;
2399 }
2400
2401 if (features->type == HID_GENERIC)
2402 connect_mask |= HID_CONNECT_DRIVER;
2403
2404
2405 error = hid_hw_start(hdev, connect_mask);
2406 if (error) {
2407 hid_err(hdev, "hw start failed\n");
2408 goto fail;
2409 }
2410
2411 if (!wireless) {
2412
2413 wacom_query_tablet_data(wacom);
2414 }
2415
2416
2417 if ((features->type == BAMBOO_TOUCH) &&
2418 (features->device_type & WACOM_DEVICETYPE_PEN)) {
2419 cancel_delayed_work_sync(&wacom->init_work);
2420 _wacom_query_tablet_data(wacom);
2421 error = -ENODEV;
2422 goto fail_quirks;
2423 }
2424
2425 if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2426 error = hid_hw_open(hdev);
2427
2428 wacom_set_shared_values(wacom_wac);
2429 devres_close_group(&hdev->dev, wacom);
2430
2431 return 0;
2432
2433fail_quirks:
2434 hid_hw_stop(hdev);
2435fail:
2436 wacom_release_resources(wacom);
2437 return error;
2438}
2439
2440static void wacom_wireless_work(struct work_struct *work)
2441{
2442 struct wacom *wacom = container_of(work, struct wacom, wireless_work);
2443 struct usb_device *usbdev = wacom->usbdev;
2444 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2445 struct hid_device *hdev1, *hdev2;
2446 struct wacom *wacom1, *wacom2;
2447 struct wacom_wac *wacom_wac1, *wacom_wac2;
2448 int error;
2449
2450
2451
2452
2453
2454
2455 wacom_destroy_battery(wacom);
2456
2457
2458 hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
2459 wacom1 = hid_get_drvdata(hdev1);
2460 wacom_wac1 = &(wacom1->wacom_wac);
2461 wacom_release_resources(wacom1);
2462
2463
2464 hdev2 = usb_get_intfdata(usbdev->config->interface[2]);
2465 wacom2 = hid_get_drvdata(hdev2);
2466 wacom_wac2 = &(wacom2->wacom_wac);
2467 wacom_release_resources(wacom2);
2468
2469 if (wacom_wac->pid == 0) {
2470 hid_info(wacom->hdev, "wireless tablet disconnected\n");
2471 } else {
2472 const struct hid_device_id *id = wacom_ids;
2473
2474 hid_info(wacom->hdev, "wireless tablet connected with PID %x\n",
2475 wacom_wac->pid);
2476
2477 while (id->bus) {
2478 if (id->vendor == USB_VENDOR_ID_WACOM &&
2479 id->product == wacom_wac->pid)
2480 break;
2481 id++;
2482 }
2483
2484 if (!id->bus) {
2485 hid_info(wacom->hdev, "ignoring unknown PID.\n");
2486 return;
2487 }
2488
2489
2490 wacom_wac1->features =
2491 *((struct wacom_features *)id->driver_data);
2492
2493 wacom_wac1->pid = wacom_wac->pid;
2494 hid_hw_stop(hdev1);
2495 error = wacom_parse_and_register(wacom1, true);
2496 if (error)
2497 goto fail;
2498
2499
2500 if (wacom_wac1->features.touch_max ||
2501 (wacom_wac1->features.type >= INTUOSHT &&
2502 wacom_wac1->features.type <= BAMBOO_PT)) {
2503 wacom_wac2->features =
2504 *((struct wacom_features *)id->driver_data);
2505 wacom_wac2->pid = wacom_wac->pid;
2506 hid_hw_stop(hdev2);
2507 error = wacom_parse_and_register(wacom2, true);
2508 if (error)
2509 goto fail;
2510 }
2511
2512 strlcpy(wacom_wac->name, wacom_wac1->name,
2513 sizeof(wacom_wac->name));
2514 error = wacom_initialize_battery(wacom);
2515 if (error)
2516 goto fail;
2517 }
2518
2519 return;
2520
2521fail:
2522 wacom_release_resources(wacom1);
2523 wacom_release_resources(wacom2);
2524 return;
2525}
2526
2527static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
2528{
2529 struct wacom_remote *remote = wacom->remote;
2530 u32 serial = remote->remotes[index].serial;
2531 int i;
2532 unsigned long flags;
2533
2534 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2535 if (remote->remotes[i].serial == serial) {
2536
2537 spin_lock_irqsave(&remote->remote_lock, flags);
2538 remote->remotes[i].registered = false;
2539 spin_unlock_irqrestore(&remote->remote_lock, flags);
2540
2541 if (remote->remotes[i].battery.battery)
2542 devres_release_group(&wacom->hdev->dev,
2543 &remote->remotes[i].battery.bat_desc);
2544
2545 if (remote->remotes[i].group.name)
2546 devres_release_group(&wacom->hdev->dev,
2547 &remote->remotes[i]);
2548
2549 remote->remotes[i].serial = 0;
2550 remote->remotes[i].group.name = NULL;
2551 remote->remotes[i].battery.battery = NULL;
2552 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
2553 }
2554 }
2555}
2556
2557static int wacom_remote_create_one(struct wacom *wacom, u32 serial,
2558 unsigned int index)
2559{
2560 struct wacom_remote *remote = wacom->remote;
2561 struct device *dev = &wacom->hdev->dev;
2562 int error, k;
2563
2564
2565
2566
2567 for (k = 0; k < WACOM_MAX_REMOTES; k++) {
2568 if (remote->remotes[k].serial == serial)
2569 break;
2570 }
2571
2572 if (k < WACOM_MAX_REMOTES) {
2573 remote->remotes[index].serial = serial;
2574 return 0;
2575 }
2576
2577 if (!devres_open_group(dev, &remote->remotes[index], GFP_KERNEL))
2578 return -ENOMEM;
2579
2580 error = wacom_remote_create_attr_group(wacom, serial, index);
2581 if (error)
2582 goto fail;
2583
2584 remote->remotes[index].input = wacom_allocate_input(wacom);
2585 if (!remote->remotes[index].input) {
2586 error = -ENOMEM;
2587 goto fail;
2588 }
2589 remote->remotes[index].input->uniq = remote->remotes[index].group.name;
2590 remote->remotes[index].input->name = wacom->wacom_wac.pad_name;
2591
2592 if (!remote->remotes[index].input->name) {
2593 error = -EINVAL;
2594 goto fail;
2595 }
2596
2597 error = wacom_setup_pad_input_capabilities(remote->remotes[index].input,
2598 &wacom->wacom_wac);
2599 if (error)
2600 goto fail;
2601
2602 remote->remotes[index].serial = serial;
2603
2604 error = input_register_device(remote->remotes[index].input);
2605 if (error)
2606 goto fail;
2607
2608 error = wacom_led_groups_alloc_and_register_one(
2609 &remote->remotes[index].input->dev,
2610 wacom, index, 3, true);
2611 if (error)
2612 goto fail;
2613
2614 remote->remotes[index].registered = true;
2615
2616 devres_close_group(dev, &remote->remotes[index]);
2617 return 0;
2618
2619fail:
2620 devres_release_group(dev, &remote->remotes[index]);
2621 remote->remotes[index].serial = 0;
2622 return error;
2623}
2624
2625static int wacom_remote_attach_battery(struct wacom *wacom, int index)
2626{
2627 struct wacom_remote *remote = wacom->remote;
2628 int error;
2629
2630 if (!remote->remotes[index].registered)
2631 return 0;
2632
2633 if (remote->remotes[index].battery.battery)
2634 return 0;
2635
2636 if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN)
2637 return 0;
2638
2639 error = __wacom_initialize_battery(wacom,
2640 &wacom->remote->remotes[index].battery);
2641 if (error)
2642 return error;
2643
2644 return 0;
2645}
2646
2647static void wacom_remote_work(struct work_struct *work)
2648{
2649 struct wacom *wacom = container_of(work, struct wacom, remote_work);
2650 struct wacom_remote *remote = wacom->remote;
2651 struct wacom_remote_data data;
2652 unsigned long flags;
2653 unsigned int count;
2654 u32 serial;
2655 int i;
2656
2657 spin_lock_irqsave(&remote->remote_lock, flags);
2658
2659 count = kfifo_out(&remote->remote_fifo, &data, sizeof(data));
2660
2661 if (count != sizeof(data)) {
2662 hid_err(wacom->hdev,
2663 "workitem triggered without status available\n");
2664 spin_unlock_irqrestore(&remote->remote_lock, flags);
2665 return;
2666 }
2667
2668 if (!kfifo_is_empty(&remote->remote_fifo))
2669 wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_REMOTE);
2670
2671 spin_unlock_irqrestore(&remote->remote_lock, flags);
2672
2673 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
2674 serial = data.remote[i].serial;
2675 if (data.remote[i].connected) {
2676
2677 if (remote->remotes[i].serial == serial) {
2678 wacom_remote_attach_battery(wacom, i);
2679 continue;
2680 }
2681
2682 if (remote->remotes[i].serial)
2683 wacom_remote_destroy_one(wacom, i);
2684
2685 wacom_remote_create_one(wacom, serial, i);
2686
2687 } else if (remote->remotes[i].serial) {
2688 wacom_remote_destroy_one(wacom, i);
2689 }
2690 }
2691}
2692
2693static void wacom_mode_change_work(struct work_struct *work)
2694{
2695 struct wacom *wacom = container_of(work, struct wacom, mode_change_work);
2696 struct wacom_shared *shared = wacom->wacom_wac.shared;
2697 struct wacom *wacom1 = NULL;
2698 struct wacom *wacom2 = NULL;
2699 bool is_direct = wacom->wacom_wac.is_direct_mode;
2700 int error = 0;
2701
2702 if (shared->pen) {
2703 wacom1 = hid_get_drvdata(shared->pen);
2704 wacom_release_resources(wacom1);
2705 hid_hw_stop(wacom1->hdev);
2706 wacom1->wacom_wac.has_mode_change = true;
2707 wacom1->wacom_wac.is_direct_mode = is_direct;
2708 }
2709
2710 if (shared->touch) {
2711 wacom2 = hid_get_drvdata(shared->touch);
2712 wacom_release_resources(wacom2);
2713 hid_hw_stop(wacom2->hdev);
2714 wacom2->wacom_wac.has_mode_change = true;
2715 wacom2->wacom_wac.is_direct_mode = is_direct;
2716 }
2717
2718 if (wacom1) {
2719 error = wacom_parse_and_register(wacom1, false);
2720 if (error)
2721 return;
2722 }
2723
2724 if (wacom2) {
2725 error = wacom_parse_and_register(wacom2, false);
2726 if (error)
2727 return;
2728 }
2729
2730 return;
2731}
2732
2733static int wacom_probe(struct hid_device *hdev,
2734 const struct hid_device_id *id)
2735{
2736 struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
2737 struct usb_device *dev = interface_to_usbdev(intf);
2738 struct wacom *wacom;
2739 struct wacom_wac *wacom_wac;
2740 struct wacom_features *features;
2741 int error;
2742
2743 if (!id->driver_data)
2744 return -EINVAL;
2745
2746 hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS;
2747
2748
2749 hdev->quirks &= ~HID_QUIRK_NOGET;
2750
2751 wacom = devm_kzalloc(&hdev->dev, sizeof(struct wacom), GFP_KERNEL);
2752 if (!wacom)
2753 return -ENOMEM;
2754
2755 hid_set_drvdata(hdev, wacom);
2756 wacom->hdev = hdev;
2757
2758 wacom_wac = &wacom->wacom_wac;
2759 wacom_wac->features = *((struct wacom_features *)id->driver_data);
2760 features = &wacom_wac->features;
2761
2762 if (features->check_for_hid_type && features->hid_type != hdev->type)
2763 return -ENODEV;
2764
2765 error = wacom_devm_kfifo_alloc(wacom);
2766 if (error)
2767 return error;
2768
2769 wacom_wac->hid_data.inputmode = -1;
2770 wacom_wac->mode_report = -1;
2771
2772 wacom->usbdev = dev;
2773 wacom->intf = intf;
2774 mutex_init(&wacom->lock);
2775 INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work);
2776 INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
2777 INIT_WORK(&wacom->battery_work, wacom_battery_work);
2778 INIT_WORK(&wacom->remote_work, wacom_remote_work);
2779 INIT_WORK(&wacom->mode_change_work, wacom_mode_change_work);
2780
2781
2782 error = hid_parse(hdev);
2783 if (error) {
2784 hid_err(hdev, "parse failed\n");
2785 return error;
2786 }
2787
2788 error = wacom_parse_and_register(wacom, false);
2789 if (error)
2790 return error;
2791
2792 if (hdev->bus == BUS_BLUETOOTH) {
2793 error = device_create_file(&hdev->dev, &dev_attr_speed);
2794 if (error)
2795 hid_warn(hdev,
2796 "can't create sysfs speed attribute err: %d\n",
2797 error);
2798 }
2799
2800 wacom_wac->probe_complete = true;
2801 return 0;
2802}
2803
2804static void wacom_remove(struct hid_device *hdev)
2805{
2806 struct wacom *wacom = hid_get_drvdata(hdev);
2807 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
2808 struct wacom_features *features = &wacom_wac->features;
2809
2810 if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
2811 hid_hw_close(hdev);
2812
2813 hid_hw_stop(hdev);
2814
2815 cancel_delayed_work_sync(&wacom->init_work);
2816 cancel_work_sync(&wacom->wireless_work);
2817 cancel_work_sync(&wacom->battery_work);
2818 cancel_work_sync(&wacom->remote_work);
2819 cancel_work_sync(&wacom->mode_change_work);
2820 if (hdev->bus == BUS_BLUETOOTH)
2821 device_remove_file(&hdev->dev, &dev_attr_speed);
2822
2823
2824 wacom_led_groups_release(wacom);
2825
2826 if (wacom->wacom_wac.features.type != REMOTE)
2827 wacom_release_resources(wacom);
2828}
2829
2830#ifdef CONFIG_PM
2831static int wacom_resume(struct hid_device *hdev)
2832{
2833 struct wacom *wacom = hid_get_drvdata(hdev);
2834
2835 mutex_lock(&wacom->lock);
2836
2837
2838 _wacom_query_tablet_data(wacom);
2839 wacom_led_control(wacom);
2840
2841 mutex_unlock(&wacom->lock);
2842
2843 return 0;
2844}
2845
2846static int wacom_reset_resume(struct hid_device *hdev)
2847{
2848 return wacom_resume(hdev);
2849}
2850#endif
2851
2852static struct hid_driver wacom_driver = {
2853 .name = "wacom",
2854 .id_table = wacom_ids,
2855 .probe = wacom_probe,
2856 .remove = wacom_remove,
2857 .report = wacom_wac_report,
2858#ifdef CONFIG_PM
2859 .resume = wacom_resume,
2860 .reset_resume = wacom_reset_resume,
2861#endif
2862 .raw_event = wacom_raw_event,
2863};
2864module_hid_driver(wacom_driver);
2865
2866MODULE_VERSION(DRIVER_VERSION);
2867MODULE_AUTHOR(DRIVER_AUTHOR);
2868MODULE_DESCRIPTION(DRIVER_DESC);
2869MODULE_LICENSE("GPL");
2870