1
2
3
4
5
6
7
8
9
10
11
12
13
14#include "wacom_wac.h"
15#include "wacom.h"
16
17
18#define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01)
19#define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02)
20#define HID_USAGE_UNDEFINED 0x00
21#define HID_USAGE_PAGE 0x05
22#define HID_USAGE_PAGE_DIGITIZER 0x0d
23#define HID_USAGE_PAGE_DESKTOP 0x01
24#define HID_USAGE 0x09
25#define HID_USAGE_X 0x30
26#define HID_USAGE_Y 0x31
27#define HID_USAGE_X_TILT 0x3d
28#define HID_USAGE_Y_TILT 0x3e
29#define HID_USAGE_FINGER 0x22
30#define HID_USAGE_STYLUS 0x20
31#define HID_USAGE_CONTACTMAX 0x55
32#define HID_COLLECTION 0xa1
33#define HID_COLLECTION_LOGICAL 0x02
34#define HID_COLLECTION_END 0xc0
35
36enum {
37 WCM_UNDEFINED = 0,
38 WCM_DESKTOP,
39 WCM_DIGITIZER,
40};
41
42struct hid_descriptor {
43 struct usb_descriptor_header header;
44 __le16 bcdHID;
45 u8 bCountryCode;
46 u8 bNumDescriptors;
47 u8 bDescriptorType;
48 __le16 wDescriptorLength;
49} __attribute__ ((packed));
50
51
52#define USB_REQ_GET_REPORT 0x01
53#define USB_REQ_SET_REPORT 0x09
54
55#define WAC_HID_FEATURE_REPORT 0x03
56#define WAC_MSG_RETRIES 5
57
58#define WAC_CMD_LED_CONTROL 0x20
59#define WAC_CMD_ICON_START 0x21
60#define WAC_CMD_ICON_XFER 0x23
61#define WAC_CMD_RETRIES 10
62
63static int wacom_get_report(struct usb_interface *intf, u8 type, u8 id,
64 void *buf, size_t size, unsigned int retries)
65{
66 struct usb_device *dev = interface_to_usbdev(intf);
67 int retval;
68
69 do {
70 retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
71 USB_REQ_GET_REPORT,
72 USB_DIR_IN | USB_TYPE_CLASS |
73 USB_RECIP_INTERFACE,
74 (type << 8) + id,
75 intf->altsetting[0].desc.bInterfaceNumber,
76 buf, size, 100);
77 } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries);
78
79 return retval;
80}
81
82static int wacom_set_report(struct usb_interface *intf, u8 type, u8 id,
83 void *buf, size_t size, unsigned int retries)
84{
85 struct usb_device *dev = interface_to_usbdev(intf);
86 int retval;
87
88 do {
89 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
90 USB_REQ_SET_REPORT,
91 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
92 (type << 8) + id,
93 intf->altsetting[0].desc.bInterfaceNumber,
94 buf, size, 1000);
95 } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries);
96
97 return retval;
98}
99
100static void wacom_sys_irq(struct urb *urb)
101{
102 struct wacom *wacom = urb->context;
103 struct device *dev = &wacom->intf->dev;
104 int retval;
105
106 switch (urb->status) {
107 case 0:
108
109 break;
110 case -ECONNRESET:
111 case -ENOENT:
112 case -ESHUTDOWN:
113
114 dev_dbg(dev, "%s - urb shutting down with status: %d\n",
115 __func__, urb->status);
116 return;
117 default:
118 dev_dbg(dev, "%s - nonzero urb status received: %d\n",
119 __func__, urb->status);
120 goto exit;
121 }
122
123 wacom_wac_irq(&wacom->wacom_wac, urb->actual_length);
124
125 exit:
126 usb_mark_last_busy(wacom->usbdev);
127 retval = usb_submit_urb(urb, GFP_ATOMIC);
128 if (retval)
129 dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
130 __func__, retval);
131}
132
133static int wacom_open(struct input_dev *dev)
134{
135 struct wacom *wacom = input_get_drvdata(dev);
136 int retval = 0;
137
138 if (usb_autopm_get_interface(wacom->intf) < 0)
139 return -EIO;
140
141 mutex_lock(&wacom->lock);
142
143 if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
144 retval = -EIO;
145 goto out;
146 }
147
148 wacom->open = true;
149 wacom->intf->needs_remote_wakeup = 1;
150
151out:
152 mutex_unlock(&wacom->lock);
153 usb_autopm_put_interface(wacom->intf);
154 return retval;
155}
156
157static void wacom_close(struct input_dev *dev)
158{
159 struct wacom *wacom = input_get_drvdata(dev);
160 int autopm_error;
161
162 autopm_error = usb_autopm_get_interface(wacom->intf);
163
164 mutex_lock(&wacom->lock);
165 usb_kill_urb(wacom->irq);
166 wacom->open = false;
167 wacom->intf->needs_remote_wakeup = 0;
168 mutex_unlock(&wacom->lock);
169
170 if (!autopm_error)
171 usb_autopm_put_interface(wacom->intf);
172}
173
174
175
176
177
178static int wacom_calc_hid_res(int logical_extents, int physical_extents,
179 unsigned char unit, unsigned char exponent)
180{
181 int prev, unit_exponent;
182
183
184 if (logical_extents <= 0 || physical_extents <= 0)
185 return 0;
186
187
188 unit_exponent = exponent;
189 if (unit_exponent > 7)
190 unit_exponent -= 16;
191
192
193 if (unit == 0x11) {
194 unit_exponent += 1;
195 } else if (unit == 0x13) {
196 prev = physical_extents;
197 physical_extents *= 254;
198 if (physical_extents < prev)
199 return 0;
200 unit_exponent -= 1;
201 } else {
202 return 0;
203 }
204
205
206 for (; unit_exponent < 0; unit_exponent++) {
207 prev = logical_extents;
208 logical_extents *= 10;
209 if (logical_extents < prev)
210 return 0;
211 }
212
213 for (; unit_exponent > 0; unit_exponent--) {
214 prev = physical_extents;
215 physical_extents *= 10;
216 if (physical_extents < prev)
217 return 0;
218 }
219
220
221 return logical_extents / physical_extents;
222}
223
224
225
226
227
228
229
230
231static void wacom_fix_phy_from_hid(struct wacom_features *features)
232{
233 int xres = wacom_calc_hid_res(features->x_max, features->x_phy,
234 features->unit, features->unitExpo);
235 int yres = wacom_calc_hid_res(features->y_max, features->y_phy,
236 features->unit, features->unitExpo);
237
238 if (xres > 0 && yres > 0) {
239 features->x_phy = (100 * features->x_max) / xres;
240 features->y_phy = (100 * features->y_max) / yres;
241 }
242}
243
244
245
246
247
248
249
250
251static void wacom_set_phy_from_res(struct wacom_features *features)
252{
253 features->x_phy = (features->x_max * 100) / features->x_resolution;
254 features->y_phy = (features->y_max * 100) / features->y_resolution;
255}
256
257static int wacom_parse_logical_collection(unsigned char *report,
258 struct wacom_features *features)
259{
260 int length = 0;
261
262 if (features->type == BAMBOO_PT) {
263
264
265 features->pktlen = WACOM_PKGLEN_BBTOUCH3;
266 features->device_type = BTN_TOOL_FINGER;
267
268 wacom_set_phy_from_res(features);
269
270 features->x_max = features->y_max =
271 get_unaligned_le16(&report[10]);
272
273 length = 11;
274 }
275 return length;
276}
277
278static void wacom_retrieve_report_data(struct usb_interface *intf,
279 struct wacom_features *features)
280{
281 int result = 0;
282 unsigned char *rep_data;
283
284 rep_data = kmalloc(2, GFP_KERNEL);
285 if (rep_data) {
286
287 rep_data[0] = 12;
288 result = wacom_get_report(intf, WAC_HID_FEATURE_REPORT,
289 rep_data[0], rep_data, 2,
290 WAC_MSG_RETRIES);
291
292 if (result >= 0 && rep_data[1] > 2)
293 features->touch_max = rep_data[1];
294
295 kfree(rep_data);
296 }
297}
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335static int wacom_parse_hid(struct usb_interface *intf,
336 struct hid_descriptor *hid_desc,
337 struct wacom_features *features)
338{
339 struct usb_device *dev = interface_to_usbdev(intf);
340 char limit = 0;
341
342 int result = 0;
343 int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0;
344 unsigned char *report;
345
346 report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
347 if (!report)
348 return -ENOMEM;
349
350
351 do {
352 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
353 USB_REQ_GET_DESCRIPTOR,
354 USB_RECIP_INTERFACE | USB_DIR_IN,
355 HID_DEVICET_REPORT << 8,
356 intf->altsetting[0].desc.bInterfaceNumber,
357 report,
358 hid_desc->wDescriptorLength,
359 5000);
360 } while (result < 0 && limit++ < WAC_MSG_RETRIES);
361
362
363 if (result < 0)
364 goto out;
365
366 for (i = 0; i < hid_desc->wDescriptorLength; i++) {
367
368 switch (report[i]) {
369 case HID_USAGE_PAGE:
370 switch (report[i + 1]) {
371 case HID_USAGE_PAGE_DIGITIZER:
372 usage = WCM_DIGITIZER;
373 i++;
374 break;
375
376 case HID_USAGE_PAGE_DESKTOP:
377 usage = WCM_DESKTOP;
378 i++;
379 break;
380 }
381 break;
382
383 case HID_USAGE:
384 switch (report[i + 1]) {
385 case HID_USAGE_X:
386 if (usage == WCM_DESKTOP) {
387 if (finger) {
388 features->device_type = BTN_TOOL_FINGER;
389
390 switch (features->type) {
391 case TABLETPC2FG:
392 features->pktlen = WACOM_PKGLEN_TPC2FG;
393 break;
394
395 case MTSCREEN:
396 case WACOM_24HDT:
397 features->pktlen = WACOM_PKGLEN_MTOUCH;
398 break;
399
400 case MTTPC:
401 features->pktlen = WACOM_PKGLEN_MTTPC;
402 break;
403
404 case BAMBOO_PT:
405 features->pktlen = WACOM_PKGLEN_BBTOUCH;
406 break;
407
408 default:
409 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
410 break;
411 }
412
413 switch (features->type) {
414 case BAMBOO_PT:
415 features->x_phy =
416 get_unaligned_le16(&report[i + 5]);
417 features->x_max =
418 get_unaligned_le16(&report[i + 8]);
419 i += 15;
420 break;
421
422 case WACOM_24HDT:
423 features->x_max =
424 get_unaligned_le16(&report[i + 3]);
425 features->x_phy =
426 get_unaligned_le16(&report[i + 8]);
427 features->unit = report[i - 1];
428 features->unitExpo = report[i - 3];
429 i += 12;
430 break;
431
432 default:
433 features->x_max =
434 get_unaligned_le16(&report[i + 3]);
435 features->x_phy =
436 get_unaligned_le16(&report[i + 6]);
437 features->unit = report[i + 9];
438 features->unitExpo = report[i + 11];
439 i += 12;
440 break;
441 }
442 } else if (pen) {
443
444 if (features->type >= TABLETPC)
445 features->pktlen = WACOM_PKGLEN_GRAPHIRE;
446 features->device_type = BTN_TOOL_PEN;
447 features->x_max =
448 get_unaligned_le16(&report[i + 3]);
449 i += 4;
450 }
451 }
452 break;
453
454 case HID_USAGE_Y:
455 if (usage == WCM_DESKTOP) {
456 if (finger) {
457 switch (features->type) {
458 case TABLETPC2FG:
459 case MTSCREEN:
460 case MTTPC:
461 features->y_max =
462 get_unaligned_le16(&report[i + 3]);
463 features->y_phy =
464 get_unaligned_le16(&report[i + 6]);
465 i += 7;
466 break;
467
468 case WACOM_24HDT:
469 features->y_max =
470 get_unaligned_le16(&report[i + 3]);
471 features->y_phy =
472 get_unaligned_le16(&report[i - 2]);
473 i += 7;
474 break;
475
476 case BAMBOO_PT:
477 features->y_phy =
478 get_unaligned_le16(&report[i + 3]);
479 features->y_max =
480 get_unaligned_le16(&report[i + 6]);
481 i += 12;
482 break;
483
484 default:
485 features->y_max =
486 features->x_max;
487 features->y_phy =
488 get_unaligned_le16(&report[i + 3]);
489 i += 4;
490 break;
491 }
492 } else if (pen) {
493 features->y_max =
494 get_unaligned_le16(&report[i + 3]);
495 i += 4;
496 }
497 }
498 break;
499
500 case HID_USAGE_FINGER:
501 finger = 1;
502 i++;
503 break;
504
505
506
507
508
509
510 case HID_USAGE_STYLUS:
511 pen = 1;
512 i++;
513 break;
514
515 case HID_USAGE_CONTACTMAX:
516
517 if (!features->touch_max)
518 wacom_retrieve_report_data(intf, features);
519 i++;
520 break;
521 }
522 break;
523
524 case HID_COLLECTION_END:
525
526 finger = usage = 0;
527 break;
528
529 case HID_COLLECTION:
530 i++;
531 switch (report[i]) {
532 case HID_COLLECTION_LOGICAL:
533 i += wacom_parse_logical_collection(&report[i],
534 features);
535 break;
536 }
537 break;
538 }
539 }
540
541 out:
542 result = 0;
543 kfree(report);
544 return result;
545}
546
547static int wacom_set_device_mode(struct usb_interface *intf, int report_id, int length, int mode)
548{
549 unsigned char *rep_data;
550 int error = -ENOMEM, limit = 0;
551
552 rep_data = kzalloc(length, GFP_KERNEL);
553 if (!rep_data)
554 return error;
555
556 do {
557 rep_data[0] = report_id;
558 rep_data[1] = mode;
559
560 error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
561 report_id, rep_data, length, 1);
562 if (error >= 0)
563 error = wacom_get_report(intf, WAC_HID_FEATURE_REPORT,
564 report_id, rep_data, length, 1);
565 } while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES);
566
567 kfree(rep_data);
568
569 return error < 0 ? error : 0;
570}
571
572
573
574
575
576
577
578
579static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features)
580{
581 if (features->device_type == BTN_TOOL_FINGER) {
582 if (features->type > TABLETPC) {
583
584 return wacom_set_device_mode(intf, 3, 4, 4);
585 }
586 else if (features->type == WACOM_24HDT) {
587 return wacom_set_device_mode(intf, 18, 3, 2);
588 }
589 } else if (features->device_type == BTN_TOOL_PEN) {
590 if (features->type <= BAMBOO_PT && features->type != WIRELESS) {
591 return wacom_set_device_mode(intf, 2, 2, 2);
592 }
593 }
594
595 return 0;
596}
597
598static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
599 struct wacom_features *features)
600{
601 int error = 0;
602 struct usb_host_interface *interface = intf->cur_altsetting;
603 struct hid_descriptor *hid_desc;
604
605
606 features->device_type = BTN_TOOL_PEN;
607 features->x_fuzz = 4;
608 features->y_fuzz = 4;
609 features->pressure_fuzz = 0;
610 features->distance_fuzz = 0;
611
612
613
614
615
616
617
618 if (features->type == WIRELESS) {
619 if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
620 features->device_type = 0;
621 } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) {
622 features->device_type = BTN_TOOL_FINGER;
623 features->pktlen = WACOM_PKGLEN_BBTOUCH3;
624 }
625 }
626
627
628 if (features->type < BAMBOO_PT) {
629 goto out;
630 }
631
632 error = usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc);
633 if (error) {
634 error = usb_get_extra_descriptor(&interface->endpoint[0],
635 HID_DEVICET_REPORT, &hid_desc);
636 if (error) {
637 dev_err(&intf->dev,
638 "can not retrieve extra class descriptor\n");
639 goto out;
640 }
641 }
642 error = wacom_parse_hid(intf, hid_desc, features);
643 if (error)
644 goto out;
645 wacom_fix_phy_from_hid(features);
646
647 out:
648 return error;
649}
650
651struct wacom_usbdev_data {
652 struct list_head list;
653 struct kref kref;
654 struct usb_device *dev;
655 struct wacom_shared shared;
656};
657
658static LIST_HEAD(wacom_udev_list);
659static DEFINE_MUTEX(wacom_udev_list_lock);
660
661static struct usb_device *wacom_get_sibling(struct usb_device *dev, int vendor, int product)
662{
663 int port1;
664 struct usb_device *sibling;
665
666 if (vendor == 0 && product == 0)
667 return dev;
668
669 if (dev->parent == NULL)
670 return NULL;
671
672 usb_hub_for_each_child(dev->parent, port1, sibling) {
673 struct usb_device_descriptor *d;
674 if (sibling == NULL)
675 continue;
676
677 d = &sibling->descriptor;
678 if (d->idVendor == vendor && d->idProduct == product)
679 return sibling;
680 }
681
682 return NULL;
683}
684
685static struct wacom_usbdev_data *wacom_get_usbdev_data(struct usb_device *dev)
686{
687 struct wacom_usbdev_data *data;
688
689 list_for_each_entry(data, &wacom_udev_list, list) {
690 if (data->dev == dev) {
691 kref_get(&data->kref);
692 return data;
693 }
694 }
695
696 return NULL;
697}
698
699static int wacom_add_shared_data(struct wacom_wac *wacom,
700 struct usb_device *dev)
701{
702 struct wacom_usbdev_data *data;
703 int retval = 0;
704
705 mutex_lock(&wacom_udev_list_lock);
706
707 data = wacom_get_usbdev_data(dev);
708 if (!data) {
709 data = kzalloc(sizeof(struct wacom_usbdev_data), GFP_KERNEL);
710 if (!data) {
711 retval = -ENOMEM;
712 goto out;
713 }
714
715 kref_init(&data->kref);
716 data->dev = dev;
717 list_add_tail(&data->list, &wacom_udev_list);
718 }
719
720 wacom->shared = &data->shared;
721
722out:
723 mutex_unlock(&wacom_udev_list_lock);
724 return retval;
725}
726
727static void wacom_release_shared_data(struct kref *kref)
728{
729 struct wacom_usbdev_data *data =
730 container_of(kref, struct wacom_usbdev_data, kref);
731
732 mutex_lock(&wacom_udev_list_lock);
733 list_del(&data->list);
734 mutex_unlock(&wacom_udev_list_lock);
735
736 kfree(data);
737}
738
739static void wacom_remove_shared_data(struct wacom_wac *wacom)
740{
741 struct wacom_usbdev_data *data;
742
743 if (wacom->shared) {
744 data = container_of(wacom->shared, struct wacom_usbdev_data, shared);
745 kref_put(&data->kref, wacom_release_shared_data);
746 wacom->shared = NULL;
747 }
748}
749
750static int wacom_led_control(struct wacom *wacom)
751{
752 unsigned char *buf;
753 int retval;
754
755 buf = kzalloc(9, GFP_KERNEL);
756 if (!buf)
757 return -ENOMEM;
758
759 if (wacom->wacom_wac.features.type >= INTUOS5S &&
760 wacom->wacom_wac.features.type <= INTUOS5L) {
761
762
763
764
765
766 int ring_led = wacom->led.select[0] & 0x03;
767 int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
768 int crop_lum = 0;
769
770 buf[0] = WAC_CMD_LED_CONTROL;
771 buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
772 }
773 else {
774 int led = wacom->led.select[0] | 0x4;
775
776 if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
777 wacom->wacom_wac.features.type == WACOM_24HD)
778 led |= (wacom->led.select[1] << 4) | 0x40;
779
780 buf[0] = WAC_CMD_LED_CONTROL;
781 buf[1] = led;
782 buf[2] = wacom->led.llv;
783 buf[3] = wacom->led.hlv;
784 buf[4] = wacom->led.img_lum;
785 }
786
787 retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL,
788 buf, 9, WAC_CMD_RETRIES);
789 kfree(buf);
790
791 return retval;
792}
793
794static int wacom_led_putimage(struct wacom *wacom, int button_id, const void *img)
795{
796 unsigned char *buf;
797 int i, retval;
798
799 buf = kzalloc(259, GFP_KERNEL);
800 if (!buf)
801 return -ENOMEM;
802
803
804 buf[0] = WAC_CMD_ICON_START;
805 buf[1] = 1;
806 retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START,
807 buf, 2, WAC_CMD_RETRIES);
808 if (retval < 0)
809 goto out;
810
811 buf[0] = WAC_CMD_ICON_XFER;
812 buf[1] = button_id & 0x07;
813 for (i = 0; i < 4; i++) {
814 buf[2] = i;
815 memcpy(buf + 3, img + i * 256, 256);
816
817 retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_XFER,
818 buf, 259, WAC_CMD_RETRIES);
819 if (retval < 0)
820 break;
821 }
822
823
824 buf[0] = WAC_CMD_ICON_START;
825 buf[1] = 0;
826 wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START,
827 buf, 2, WAC_CMD_RETRIES);
828
829out:
830 kfree(buf);
831 return retval;
832}
833
834static ssize_t wacom_led_select_store(struct device *dev, int set_id,
835 const char *buf, size_t count)
836{
837 struct wacom *wacom = dev_get_drvdata(dev);
838 unsigned int id;
839 int err;
840
841 err = kstrtouint(buf, 10, &id);
842 if (err)
843 return err;
844
845 mutex_lock(&wacom->lock);
846
847 wacom->led.select[set_id] = id & 0x3;
848 err = wacom_led_control(wacom);
849
850 mutex_unlock(&wacom->lock);
851
852 return err < 0 ? err : count;
853}
854
855#define DEVICE_LED_SELECT_ATTR(SET_ID) \
856static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \
857 struct device_attribute *attr, const char *buf, size_t count) \
858{ \
859 return wacom_led_select_store(dev, SET_ID, buf, count); \
860} \
861static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \
862 struct device_attribute *attr, char *buf) \
863{ \
864 struct wacom *wacom = dev_get_drvdata(dev); \
865 return snprintf(buf, 2, "%d\n", wacom->led.select[SET_ID]); \
866} \
867static DEVICE_ATTR(status_led##SET_ID##_select, S_IWUSR | S_IRUSR, \
868 wacom_led##SET_ID##_select_show, \
869 wacom_led##SET_ID##_select_store)
870
871DEVICE_LED_SELECT_ATTR(0);
872DEVICE_LED_SELECT_ATTR(1);
873
874static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
875 const char *buf, size_t count)
876{
877 unsigned int value;
878 int err;
879
880 err = kstrtouint(buf, 10, &value);
881 if (err)
882 return err;
883
884 mutex_lock(&wacom->lock);
885
886 *dest = value & 0x7f;
887 err = wacom_led_control(wacom);
888
889 mutex_unlock(&wacom->lock);
890
891 return err < 0 ? err : count;
892}
893
894#define DEVICE_LUMINANCE_ATTR(name, field) \
895static ssize_t wacom_##name##_luminance_store(struct device *dev, \
896 struct device_attribute *attr, const char *buf, size_t count) \
897{ \
898 struct wacom *wacom = dev_get_drvdata(dev); \
899 \
900 return wacom_luminance_store(wacom, &wacom->led.field, \
901 buf, count); \
902} \
903static DEVICE_ATTR(name##_luminance, S_IWUSR, \
904 NULL, wacom_##name##_luminance_store)
905
906DEVICE_LUMINANCE_ATTR(status0, llv);
907DEVICE_LUMINANCE_ATTR(status1, hlv);
908DEVICE_LUMINANCE_ATTR(buttons, img_lum);
909
910static ssize_t wacom_button_image_store(struct device *dev, int button_id,
911 const char *buf, size_t count)
912{
913 struct wacom *wacom = dev_get_drvdata(dev);
914 int err;
915
916 if (count != 1024)
917 return -EINVAL;
918
919 mutex_lock(&wacom->lock);
920
921 err = wacom_led_putimage(wacom, button_id, buf);
922
923 mutex_unlock(&wacom->lock);
924
925 return err < 0 ? err : count;
926}
927
928#define DEVICE_BTNIMG_ATTR(BUTTON_ID) \
929static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \
930 struct device_attribute *attr, const char *buf, size_t count) \
931{ \
932 return wacom_button_image_store(dev, BUTTON_ID, buf, count); \
933} \
934static DEVICE_ATTR(button##BUTTON_ID##_rawimg, S_IWUSR, \
935 NULL, wacom_btnimg##BUTTON_ID##_store)
936
937DEVICE_BTNIMG_ATTR(0);
938DEVICE_BTNIMG_ATTR(1);
939DEVICE_BTNIMG_ATTR(2);
940DEVICE_BTNIMG_ATTR(3);
941DEVICE_BTNIMG_ATTR(4);
942DEVICE_BTNIMG_ATTR(5);
943DEVICE_BTNIMG_ATTR(6);
944DEVICE_BTNIMG_ATTR(7);
945
946static struct attribute *cintiq_led_attrs[] = {
947 &dev_attr_status_led0_select.attr,
948 &dev_attr_status_led1_select.attr,
949 NULL
950};
951
952static struct attribute_group cintiq_led_attr_group = {
953 .name = "wacom_led",
954 .attrs = cintiq_led_attrs,
955};
956
957static struct attribute *intuos4_led_attrs[] = {
958 &dev_attr_status0_luminance.attr,
959 &dev_attr_status1_luminance.attr,
960 &dev_attr_status_led0_select.attr,
961 &dev_attr_buttons_luminance.attr,
962 &dev_attr_button0_rawimg.attr,
963 &dev_attr_button1_rawimg.attr,
964 &dev_attr_button2_rawimg.attr,
965 &dev_attr_button3_rawimg.attr,
966 &dev_attr_button4_rawimg.attr,
967 &dev_attr_button5_rawimg.attr,
968 &dev_attr_button6_rawimg.attr,
969 &dev_attr_button7_rawimg.attr,
970 NULL
971};
972
973static struct attribute_group intuos4_led_attr_group = {
974 .name = "wacom_led",
975 .attrs = intuos4_led_attrs,
976};
977
978static struct attribute *intuos5_led_attrs[] = {
979 &dev_attr_status0_luminance.attr,
980 &dev_attr_status_led0_select.attr,
981 NULL
982};
983
984static struct attribute_group intuos5_led_attr_group = {
985 .name = "wacom_led",
986 .attrs = intuos5_led_attrs,
987};
988
989static int wacom_initialize_leds(struct wacom *wacom)
990{
991 int error;
992
993
994 switch (wacom->wacom_wac.features.type) {
995 case INTUOS4S:
996 case INTUOS4:
997 case INTUOS4L:
998 wacom->led.select[0] = 0;
999 wacom->led.select[1] = 0;
1000 wacom->led.llv = 10;
1001 wacom->led.hlv = 20;
1002 wacom->led.img_lum = 10;
1003 error = sysfs_create_group(&wacom->intf->dev.kobj,
1004 &intuos4_led_attr_group);
1005 break;
1006
1007 case WACOM_24HD:
1008 case WACOM_21UX2:
1009 wacom->led.select[0] = 0;
1010 wacom->led.select[1] = 0;
1011 wacom->led.llv = 0;
1012 wacom->led.hlv = 0;
1013 wacom->led.img_lum = 0;
1014
1015 error = sysfs_create_group(&wacom->intf->dev.kobj,
1016 &cintiq_led_attr_group);
1017 break;
1018
1019 case INTUOS5S:
1020 case INTUOS5:
1021 case INTUOS5L:
1022 wacom->led.select[0] = 0;
1023 wacom->led.select[1] = 0;
1024 wacom->led.llv = 32;
1025 wacom->led.hlv = 0;
1026 wacom->led.img_lum = 0;
1027
1028 error = sysfs_create_group(&wacom->intf->dev.kobj,
1029 &intuos5_led_attr_group);
1030 break;
1031
1032 default:
1033 return 0;
1034 }
1035
1036 if (error) {
1037 dev_err(&wacom->intf->dev,
1038 "cannot create sysfs group err: %d\n", error);
1039 return error;
1040 }
1041 wacom_led_control(wacom);
1042
1043 return 0;
1044}
1045
1046static void wacom_destroy_leds(struct wacom *wacom)
1047{
1048 switch (wacom->wacom_wac.features.type) {
1049 case INTUOS4S:
1050 case INTUOS4:
1051 case INTUOS4L:
1052 sysfs_remove_group(&wacom->intf->dev.kobj,
1053 &intuos4_led_attr_group);
1054 break;
1055
1056 case WACOM_24HD:
1057 case WACOM_21UX2:
1058 sysfs_remove_group(&wacom->intf->dev.kobj,
1059 &cintiq_led_attr_group);
1060 break;
1061
1062 case INTUOS5S:
1063 case INTUOS5:
1064 case INTUOS5L:
1065 sysfs_remove_group(&wacom->intf->dev.kobj,
1066 &intuos5_led_attr_group);
1067 break;
1068 }
1069}
1070
1071static enum power_supply_property wacom_battery_props[] = {
1072 POWER_SUPPLY_PROP_CAPACITY
1073};
1074
1075static int wacom_battery_get_property(struct power_supply *psy,
1076 enum power_supply_property psp,
1077 union power_supply_propval *val)
1078{
1079 struct wacom *wacom = container_of(psy, struct wacom, battery);
1080 int ret = 0;
1081
1082 switch (psp) {
1083 case POWER_SUPPLY_PROP_CAPACITY:
1084 val->intval =
1085 wacom->wacom_wac.battery_capacity * 100 / 31;
1086 break;
1087 default:
1088 ret = -EINVAL;
1089 break;
1090 }
1091
1092 return ret;
1093}
1094
1095static int wacom_initialize_battery(struct wacom *wacom)
1096{
1097 int error = 0;
1098
1099 if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR) {
1100 wacom->battery.properties = wacom_battery_props;
1101 wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props);
1102 wacom->battery.get_property = wacom_battery_get_property;
1103 wacom->battery.name = "wacom_battery";
1104 wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY;
1105 wacom->battery.use_for_apm = 0;
1106
1107 error = power_supply_register(&wacom->usbdev->dev,
1108 &wacom->battery);
1109
1110 if (!error)
1111 power_supply_powers(&wacom->battery,
1112 &wacom->usbdev->dev);
1113 }
1114
1115 return error;
1116}
1117
1118static void wacom_destroy_battery(struct wacom *wacom)
1119{
1120 if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR &&
1121 wacom->battery.dev) {
1122 power_supply_unregister(&wacom->battery);
1123 wacom->battery.dev = NULL;
1124 }
1125}
1126
1127static int wacom_register_input(struct wacom *wacom)
1128{
1129 struct input_dev *input_dev;
1130 struct usb_interface *intf = wacom->intf;
1131 struct usb_device *dev = interface_to_usbdev(intf);
1132 struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
1133 int error;
1134
1135 input_dev = input_allocate_device();
1136 if (!input_dev) {
1137 error = -ENOMEM;
1138 goto fail1;
1139 }
1140
1141 input_dev->name = wacom_wac->name;
1142 input_dev->dev.parent = &intf->dev;
1143 input_dev->open = wacom_open;
1144 input_dev->close = wacom_close;
1145 usb_to_input_id(dev, &input_dev->id);
1146 input_set_drvdata(input_dev, wacom);
1147
1148 wacom_wac->input = input_dev;
1149 error = wacom_setup_input_capabilities(input_dev, wacom_wac);
1150 if (error)
1151 goto fail1;
1152
1153 error = input_register_device(input_dev);
1154 if (error)
1155 goto fail2;
1156
1157 return 0;
1158
1159fail2:
1160 input_free_device(input_dev);
1161 wacom_wac->input = NULL;
1162fail1:
1163 return error;
1164}
1165
1166static void wacom_wireless_work(struct work_struct *work)
1167{
1168 struct wacom *wacom = container_of(work, struct wacom, work);
1169 struct usb_device *usbdev = wacom->usbdev;
1170 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1171 struct wacom *wacom1, *wacom2;
1172 struct wacom_wac *wacom_wac1, *wacom_wac2;
1173 int error;
1174
1175
1176
1177
1178
1179
1180 wacom_destroy_battery(wacom);
1181
1182
1183 wacom1 = usb_get_intfdata(usbdev->config->interface[1]);
1184 wacom_wac1 = &(wacom1->wacom_wac);
1185 if (wacom_wac1->input)
1186 input_unregister_device(wacom_wac1->input);
1187 wacom_wac1->input = NULL;
1188
1189
1190 wacom2 = usb_get_intfdata(usbdev->config->interface[2]);
1191 wacom_wac2 = &(wacom2->wacom_wac);
1192 if (wacom_wac2->input)
1193 input_unregister_device(wacom_wac2->input);
1194 wacom_wac2->input = NULL;
1195
1196 if (wacom_wac->pid == 0) {
1197 dev_info(&wacom->intf->dev, "wireless tablet disconnected\n");
1198 } else {
1199 const struct usb_device_id *id = wacom_ids;
1200
1201 dev_info(&wacom->intf->dev,
1202 "wireless tablet connected with PID %x\n",
1203 wacom_wac->pid);
1204
1205 while (id->match_flags) {
1206 if (id->idVendor == USB_VENDOR_ID_WACOM &&
1207 id->idProduct == wacom_wac->pid)
1208 break;
1209 id++;
1210 }
1211
1212 if (!id->match_flags) {
1213 dev_info(&wacom->intf->dev,
1214 "ignoring unknown PID.\n");
1215 return;
1216 }
1217
1218
1219 wacom_wac1->features =
1220 *((struct wacom_features *)id->driver_info);
1221 wacom_wac1->features.device_type = BTN_TOOL_PEN;
1222 error = wacom_register_input(wacom1);
1223 if (error)
1224 goto fail1;
1225
1226
1227 wacom_wac2->features =
1228 *((struct wacom_features *)id->driver_info);
1229 wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
1230 wacom_wac2->features.device_type = BTN_TOOL_FINGER;
1231 wacom_set_phy_from_res(&wacom_wac2->features);
1232 wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
1233 error = wacom_register_input(wacom2);
1234 if (error)
1235 goto fail2;
1236
1237 error = wacom_initialize_battery(wacom);
1238 if (error)
1239 goto fail3;
1240 }
1241
1242 return;
1243
1244fail3:
1245 input_unregister_device(wacom_wac2->input);
1246 wacom_wac2->input = NULL;
1247fail2:
1248 input_unregister_device(wacom_wac1->input);
1249 wacom_wac1->input = NULL;
1250fail1:
1251 return;
1252}
1253
1254static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
1255{
1256 struct usb_device *dev = interface_to_usbdev(intf);
1257 struct usb_endpoint_descriptor *endpoint;
1258 struct wacom *wacom;
1259 struct wacom_wac *wacom_wac;
1260 struct wacom_features *features;
1261 int error;
1262
1263 if (!id->driver_info)
1264 return -EINVAL;
1265
1266 wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
1267 if (!wacom)
1268 return -ENOMEM;
1269
1270 wacom_wac = &wacom->wacom_wac;
1271 wacom_wac->features = *((struct wacom_features *)id->driver_info);
1272 features = &wacom_wac->features;
1273 if (features->pktlen > WACOM_PKGLEN_MAX) {
1274 error = -EINVAL;
1275 goto fail1;
1276 }
1277
1278 wacom_wac->data = usb_alloc_coherent(dev, WACOM_PKGLEN_MAX,
1279 GFP_KERNEL, &wacom->data_dma);
1280 if (!wacom_wac->data) {
1281 error = -ENOMEM;
1282 goto fail1;
1283 }
1284
1285 wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
1286 if (!wacom->irq) {
1287 error = -ENOMEM;
1288 goto fail2;
1289 }
1290
1291 wacom->usbdev = dev;
1292 wacom->intf = intf;
1293 mutex_init(&wacom->lock);
1294 INIT_WORK(&wacom->work, wacom_wireless_work);
1295 usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
1296 strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
1297
1298 endpoint = &intf->cur_altsetting->endpoint[0].desc;
1299
1300
1301 error = wacom_retrieve_hid_descriptor(intf, features);
1302 if (error)
1303 goto fail3;
1304
1305
1306
1307
1308
1309
1310 if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
1311 if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
1312 features->device_type = BTN_TOOL_FINGER;
1313 features->pktlen = WACOM_PKGLEN_BBTOUCH3;
1314
1315 wacom_set_phy_from_res(features);
1316
1317 features->x_max = 4096;
1318 features->y_max = 4096;
1319 } else {
1320 features->device_type = BTN_TOOL_PEN;
1321 }
1322 }
1323
1324 wacom_setup_device_quirks(features);
1325
1326 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
1327
1328 if (features->quirks & WACOM_QUIRK_MULTI_INPUT) {
1329 struct usb_device *other_dev;
1330
1331
1332 strlcat(wacom_wac->name,
1333 features->device_type == BTN_TOOL_PEN ?
1334 " Pen" : " Finger",
1335 sizeof(wacom_wac->name));
1336
1337
1338 other_dev = wacom_get_sibling(dev, features->oVid, features->oPid);
1339 if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL)
1340 other_dev = dev;
1341 error = wacom_add_shared_data(wacom_wac, other_dev);
1342 if (error)
1343 goto fail3;
1344 }
1345
1346 usb_fill_int_urb(wacom->irq, dev,
1347 usb_rcvintpipe(dev, endpoint->bEndpointAddress),
1348 wacom_wac->data, features->pktlen,
1349 wacom_sys_irq, wacom, endpoint->bInterval);
1350 wacom->irq->transfer_dma = wacom->data_dma;
1351 wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1352
1353 error = wacom_initialize_leds(wacom);
1354 if (error)
1355 goto fail4;
1356
1357 if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) {
1358 error = wacom_register_input(wacom);
1359 if (error)
1360 goto fail5;
1361 }
1362
1363
1364 wacom_query_tablet_data(intf, features);
1365
1366 usb_set_intfdata(intf, wacom);
1367
1368 if (features->quirks & WACOM_QUIRK_MONITOR) {
1369 if (usb_submit_urb(wacom->irq, GFP_KERNEL))
1370 goto fail5;
1371 }
1372
1373 return 0;
1374
1375 fail5: wacom_destroy_leds(wacom);
1376 fail4: wacom_remove_shared_data(wacom_wac);
1377 fail3: usb_free_urb(wacom->irq);
1378 fail2: usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma);
1379 fail1: kfree(wacom);
1380 return error;
1381}
1382
1383static void wacom_disconnect(struct usb_interface *intf)
1384{
1385 struct wacom *wacom = usb_get_intfdata(intf);
1386
1387 usb_set_intfdata(intf, NULL);
1388
1389 usb_kill_urb(wacom->irq);
1390 cancel_work_sync(&wacom->work);
1391 if (wacom->wacom_wac.input)
1392 input_unregister_device(wacom->wacom_wac.input);
1393 wacom_destroy_battery(wacom);
1394 wacom_destroy_leds(wacom);
1395 usb_free_urb(wacom->irq);
1396 usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX,
1397 wacom->wacom_wac.data, wacom->data_dma);
1398 wacom_remove_shared_data(&wacom->wacom_wac);
1399 kfree(wacom);
1400}
1401
1402static int wacom_suspend(struct usb_interface *intf, pm_message_t message)
1403{
1404 struct wacom *wacom = usb_get_intfdata(intf);
1405
1406 mutex_lock(&wacom->lock);
1407 usb_kill_urb(wacom->irq);
1408 mutex_unlock(&wacom->lock);
1409
1410 return 0;
1411}
1412
1413static int wacom_resume(struct usb_interface *intf)
1414{
1415 struct wacom *wacom = usb_get_intfdata(intf);
1416 struct wacom_features *features = &wacom->wacom_wac.features;
1417 int rv = 0;
1418
1419 mutex_lock(&wacom->lock);
1420
1421
1422 wacom_query_tablet_data(intf, features);
1423 wacom_led_control(wacom);
1424
1425 if ((wacom->open || features->quirks & WACOM_QUIRK_MONITOR)
1426 && usb_submit_urb(wacom->irq, GFP_NOIO) < 0)
1427 rv = -EIO;
1428
1429 mutex_unlock(&wacom->lock);
1430
1431 return rv;
1432}
1433
1434static int wacom_reset_resume(struct usb_interface *intf)
1435{
1436 return wacom_resume(intf);
1437}
1438
1439static struct usb_driver wacom_driver = {
1440 .name = "wacom",
1441 .id_table = wacom_ids,
1442 .probe = wacom_probe,
1443 .disconnect = wacom_disconnect,
1444 .suspend = wacom_suspend,
1445 .resume = wacom_resume,
1446 .reset_resume = wacom_reset_resume,
1447 .supports_autosuspend = 1,
1448};
1449
1450module_usb_driver(wacom_driver);
1451