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