2 * drivers/input/tablet/wacom_sys.c
4 * USB Wacom tablet support - system specific code
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
14 #include "wacom_wac.h"
17 /* defines to get HID report descriptor */
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_COLLECTION 0xc0
39 struct hid_descriptor
{
40 struct usb_descriptor_header header
;
45 __le16 wDescriptorLength
;
46 } __attribute__ ((packed
));
48 /* defines to get/set USB message */
49 #define USB_REQ_GET_REPORT 0x01
50 #define USB_REQ_SET_REPORT 0x09
51 #define WAC_HID_FEATURE_REPORT 0x03
52 #define WAC_MSG_RETRIES 5
54 static int usb_get_report(struct usb_interface
*intf
, unsigned char type
,
55 unsigned char id
, void *buf
, int size
)
57 return usb_control_msg(interface_to_usbdev(intf
),
58 usb_rcvctrlpipe(interface_to_usbdev(intf
), 0),
59 USB_REQ_GET_REPORT
, USB_TYPE_CLASS
| USB_RECIP_INTERFACE
,
60 (type
<< 8) + id
, intf
->altsetting
[0].desc
.bInterfaceNumber
,
64 static int usb_set_report(struct usb_interface
*intf
, unsigned char type
,
65 unsigned char id
, void *buf
, int size
)
67 return usb_control_msg(interface_to_usbdev(intf
),
68 usb_sndctrlpipe(interface_to_usbdev(intf
), 0),
69 USB_REQ_SET_REPORT
, USB_TYPE_CLASS
| USB_RECIP_INTERFACE
,
70 (type
<< 8) + id
, intf
->altsetting
[0].desc
.bInterfaceNumber
,
74 static void wacom_sys_irq(struct urb
*urb
)
76 struct wacom
*wacom
= urb
->context
;
79 switch (urb
->status
) {
86 /* this urb is terminated, clean up */
87 dbg("%s - urb shutting down with status: %d", __func__
, urb
->status
);
90 dbg("%s - nonzero urb status received: %d", __func__
, urb
->status
);
94 wacom_wac_irq(&wacom
->wacom_wac
, urb
->actual_length
);
97 usb_mark_last_busy(wacom
->usbdev
);
98 retval
= usb_submit_urb(urb
, GFP_ATOMIC
);
100 err ("%s - usb_submit_urb failed with result %d",
104 static int wacom_open(struct input_dev
*dev
)
106 struct wacom
*wacom
= input_get_drvdata(dev
);
109 if (usb_autopm_get_interface(wacom
->intf
) < 0)
112 mutex_lock(&wacom
->lock
);
114 if (usb_submit_urb(wacom
->irq
, GFP_KERNEL
)) {
120 wacom
->intf
->needs_remote_wakeup
= 1;
123 mutex_unlock(&wacom
->lock
);
124 usb_autopm_put_interface(wacom
->intf
);
128 static void wacom_close(struct input_dev
*dev
)
130 struct wacom
*wacom
= input_get_drvdata(dev
);
133 autopm_error
= usb_autopm_get_interface(wacom
->intf
);
135 mutex_lock(&wacom
->lock
);
136 usb_kill_urb(wacom
->irq
);
138 wacom
->intf
->needs_remote_wakeup
= 0;
139 mutex_unlock(&wacom
->lock
);
142 usb_autopm_put_interface(wacom
->intf
);
145 static int wacom_parse_hid(struct usb_interface
*intf
, struct hid_descriptor
*hid_desc
,
146 struct wacom_features
*features
)
148 struct usb_device
*dev
= interface_to_usbdev(intf
);
150 /* result has to be defined as int for some devices */
152 int i
= 0, usage
= WCM_UNDEFINED
, finger
= 0, pen
= 0;
153 unsigned char *report
;
155 report
= kzalloc(hid_desc
->wDescriptorLength
, GFP_KERNEL
);
159 /* retrive report descriptors */
161 result
= usb_control_msg(dev
, usb_rcvctrlpipe(dev
, 0),
162 USB_REQ_GET_DESCRIPTOR
,
163 USB_RECIP_INTERFACE
| USB_DIR_IN
,
164 HID_DEVICET_REPORT
<< 8,
165 intf
->altsetting
[0].desc
.bInterfaceNumber
, /* interface */
167 hid_desc
->wDescriptorLength
,
169 } while (result
< 0 && limit
++ < WAC_MSG_RETRIES
);
171 /* No need to parse the Descriptor. It isn't an error though */
175 for (i
= 0; i
< hid_desc
->wDescriptorLength
; i
++) {
179 switch (report
[i
+ 1]) {
180 case HID_USAGE_PAGE_DIGITIZER
:
181 usage
= WCM_DIGITIZER
;
185 case HID_USAGE_PAGE_DESKTOP
:
193 switch (report
[i
+ 1]) {
195 if (usage
== WCM_DESKTOP
) {
197 features
->device_type
= BTN_TOOL_FINGER
;
198 if (features
->type
== TABLETPC2FG
) {
199 /* need to reset back */
200 features
->pktlen
= WACOM_PKGLEN_TPC2FG
;
201 features
->device_type
= BTN_TOOL_DOUBLETAP
;
203 if (features
->type
== BAMBOO_PT
) {
204 /* need to reset back */
205 features
->pktlen
= WACOM_PKGLEN_BBTOUCH
;
206 features
->device_type
= BTN_TOOL_DOUBLETAP
;
208 get_unaligned_le16(&report
[i
+ 5]);
210 get_unaligned_le16(&report
[i
+ 8]);
214 get_unaligned_le16(&report
[i
+ 3]);
216 get_unaligned_le16(&report
[i
+ 6]);
217 features
->unit
= report
[i
+ 9];
218 features
->unitExpo
= report
[i
+ 11];
222 /* penabled only accepts exact bytes of data */
223 if (features
->type
== TABLETPC2FG
)
224 features
->pktlen
= WACOM_PKGLEN_GRAPHIRE
;
225 if (features
->type
== BAMBOO_PT
)
226 features
->pktlen
= WACOM_PKGLEN_BBFUN
;
227 features
->device_type
= BTN_TOOL_PEN
;
229 get_unaligned_le16(&report
[i
+ 3]);
236 if (usage
== WCM_DESKTOP
) {
238 features
->device_type
= BTN_TOOL_FINGER
;
239 if (features
->type
== TABLETPC2FG
) {
240 /* need to reset back */
241 features
->pktlen
= WACOM_PKGLEN_TPC2FG
;
242 features
->device_type
= BTN_TOOL_DOUBLETAP
;
244 get_unaligned_le16(&report
[i
+ 3]);
246 get_unaligned_le16(&report
[i
+ 6]);
248 } else if (features
->type
== BAMBOO_PT
) {
249 /* need to reset back */
250 features
->pktlen
= WACOM_PKGLEN_BBTOUCH
;
251 features
->device_type
= BTN_TOOL_DOUBLETAP
;
253 get_unaligned_le16(&report
[i
+ 3]);
255 get_unaligned_le16(&report
[i
+ 6]);
261 get_unaligned_le16(&report
[i
+ 3]);
265 /* penabled only accepts exact bytes of data */
266 if (features
->type
== TABLETPC2FG
)
267 features
->pktlen
= WACOM_PKGLEN_GRAPHIRE
;
268 if (features
->type
== BAMBOO_PT
)
269 features
->pktlen
= WACOM_PKGLEN_BBFUN
;
270 features
->device_type
= BTN_TOOL_PEN
;
272 get_unaligned_le16(&report
[i
+ 3]);
278 case HID_USAGE_FINGER
:
283 case HID_USAGE_STYLUS
:
291 /* reset UsagePage and Finger */
303 static int wacom_query_tablet_data(struct usb_interface
*intf
, struct wacom_features
*features
)
305 unsigned char *rep_data
;
306 int limit
= 0, report_id
= 2;
309 rep_data
= kmalloc(4, GFP_KERNEL
);
313 /* ask to report tablet data if it is MT Tablet PC or
315 if (features
->type
== TABLETPC2FG
) {
322 error
= usb_set_report(intf
, WAC_HID_FEATURE_REPORT
,
323 report_id
, rep_data
, 4);
325 error
= usb_get_report(intf
,
326 WAC_HID_FEATURE_REPORT
, report_id
,
328 } while ((error
< 0 || rep_data
[1] != 4) && limit
++ < WAC_MSG_RETRIES
);
329 } else if (features
->type
!= TABLETPC
) {
333 error
= usb_set_report(intf
, WAC_HID_FEATURE_REPORT
,
334 report_id
, rep_data
, 2);
336 error
= usb_get_report(intf
,
337 WAC_HID_FEATURE_REPORT
, report_id
,
339 } while ((error
< 0 || rep_data
[1] != 2) && limit
++ < WAC_MSG_RETRIES
);
344 return error
< 0 ? error
: 0;
347 static int wacom_retrieve_hid_descriptor(struct usb_interface
*intf
,
348 struct wacom_features
*features
)
351 struct usb_host_interface
*interface
= intf
->cur_altsetting
;
352 struct hid_descriptor
*hid_desc
;
354 /* default features */
355 features
->device_type
= BTN_TOOL_PEN
;
356 features
->x_fuzz
= 4;
357 features
->y_fuzz
= 4;
358 features
->pressure_fuzz
= 0;
359 features
->distance_fuzz
= 0;
361 /* only Tablet PCs and Bamboo P&T need to retrieve the info */
362 if ((features
->type
!= TABLETPC
) && (features
->type
!= TABLETPC2FG
) &&
363 (features
->type
!= BAMBOO_PT
))
366 if (usb_get_extra_descriptor(interface
, HID_DEVICET_HID
, &hid_desc
)) {
367 if (usb_get_extra_descriptor(&interface
->endpoint
[0],
368 HID_DEVICET_REPORT
, &hid_desc
)) {
369 printk("wacom: can not retrieve extra class descriptor\n");
374 error
= wacom_parse_hid(intf
, hid_desc
, features
);
382 struct wacom_usbdev_data
{
383 struct list_head list
;
385 struct usb_device
*dev
;
386 struct wacom_shared shared
;
389 static LIST_HEAD(wacom_udev_list
);
390 static DEFINE_MUTEX(wacom_udev_list_lock
);
392 static struct wacom_usbdev_data
*wacom_get_usbdev_data(struct usb_device
*dev
)
394 struct wacom_usbdev_data
*data
;
396 list_for_each_entry(data
, &wacom_udev_list
, list
) {
397 if (data
->dev
== dev
) {
398 kref_get(&data
->kref
);
406 static int wacom_add_shared_data(struct wacom_wac
*wacom
,
407 struct usb_device
*dev
)
409 struct wacom_usbdev_data
*data
;
412 mutex_lock(&wacom_udev_list_lock
);
414 data
= wacom_get_usbdev_data(dev
);
416 data
= kzalloc(sizeof(struct wacom_usbdev_data
), GFP_KERNEL
);
422 kref_init(&data
->kref
);
424 list_add_tail(&data
->list
, &wacom_udev_list
);
427 wacom
->shared
= &data
->shared
;
430 mutex_unlock(&wacom_udev_list_lock
);
434 static void wacom_release_shared_data(struct kref
*kref
)
436 struct wacom_usbdev_data
*data
=
437 container_of(kref
, struct wacom_usbdev_data
, kref
);
439 mutex_lock(&wacom_udev_list_lock
);
440 list_del(&data
->list
);
441 mutex_unlock(&wacom_udev_list_lock
);
446 static void wacom_remove_shared_data(struct wacom_wac
*wacom
)
448 struct wacom_usbdev_data
*data
;
451 data
= container_of(wacom
->shared
, struct wacom_usbdev_data
, shared
);
452 kref_put(&data
->kref
, wacom_release_shared_data
);
453 wacom
->shared
= NULL
;
457 static int wacom_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
459 struct usb_device
*dev
= interface_to_usbdev(intf
);
460 struct usb_endpoint_descriptor
*endpoint
;
462 struct wacom_wac
*wacom_wac
;
463 struct wacom_features
*features
;
464 struct input_dev
*input_dev
;
467 if (!id
->driver_info
)
470 wacom
= kzalloc(sizeof(struct wacom
), GFP_KERNEL
);
471 input_dev
= input_allocate_device();
472 if (!wacom
|| !input_dev
) {
477 wacom_wac
= &wacom
->wacom_wac
;
478 wacom_wac
->features
= *((struct wacom_features
*)id
->driver_info
);
479 features
= &wacom_wac
->features
;
480 if (features
->pktlen
> WACOM_PKGLEN_MAX
) {
485 wacom_wac
->data
= usb_alloc_coherent(dev
, WACOM_PKGLEN_MAX
,
486 GFP_KERNEL
, &wacom
->data_dma
);
487 if (!wacom_wac
->data
) {
492 wacom
->irq
= usb_alloc_urb(0, GFP_KERNEL
);
500 mutex_init(&wacom
->lock
);
501 usb_make_path(dev
, wacom
->phys
, sizeof(wacom
->phys
));
502 strlcat(wacom
->phys
, "/input0", sizeof(wacom
->phys
));
504 wacom_wac
->input
= input_dev
;
506 endpoint
= &intf
->cur_altsetting
->endpoint
[0].desc
;
508 /* Retrieve the physical and logical size for OEM devices */
509 error
= wacom_retrieve_hid_descriptor(intf
, features
);
513 wacom_setup_device_quirks(features
);
515 strlcpy(wacom_wac
->name
, features
->name
, sizeof(wacom_wac
->name
));
517 if (features
->quirks
& WACOM_QUIRK_MULTI_INPUT
) {
518 /* Append the device type to the name */
519 strlcat(wacom_wac
->name
,
520 features
->device_type
== BTN_TOOL_PEN
?
522 sizeof(wacom_wac
->name
));
524 error
= wacom_add_shared_data(wacom_wac
, dev
);
529 input_dev
->name
= wacom_wac
->name
;
530 input_dev
->dev
.parent
= &intf
->dev
;
531 input_dev
->open
= wacom_open
;
532 input_dev
->close
= wacom_close
;
533 usb_to_input_id(dev
, &input_dev
->id
);
534 input_set_drvdata(input_dev
, wacom
);
536 wacom_setup_input_capabilities(input_dev
, wacom_wac
);
538 usb_fill_int_urb(wacom
->irq
, dev
,
539 usb_rcvintpipe(dev
, endpoint
->bEndpointAddress
),
540 wacom_wac
->data
, features
->pktlen
,
541 wacom_sys_irq
, wacom
, endpoint
->bInterval
);
542 wacom
->irq
->transfer_dma
= wacom
->data_dma
;
543 wacom
->irq
->transfer_flags
|= URB_NO_TRANSFER_DMA_MAP
;
545 error
= input_register_device(input_dev
);
549 /* Note that if query fails it is not a hard failure */
550 wacom_query_tablet_data(intf
, features
);
552 usb_set_intfdata(intf
, wacom
);
555 fail4
: wacom_remove_shared_data(wacom_wac
);
556 fail3
: usb_free_urb(wacom
->irq
);
557 fail2
: usb_free_coherent(dev
, WACOM_PKGLEN_MAX
, wacom_wac
->data
, wacom
->data_dma
);
558 fail1
: input_free_device(input_dev
);
563 static void wacom_disconnect(struct usb_interface
*intf
)
565 struct wacom
*wacom
= usb_get_intfdata(intf
);
567 usb_set_intfdata(intf
, NULL
);
569 usb_kill_urb(wacom
->irq
);
570 input_unregister_device(wacom
->wacom_wac
.input
);
571 usb_free_urb(wacom
->irq
);
572 usb_free_coherent(interface_to_usbdev(intf
), WACOM_PKGLEN_MAX
,
573 wacom
->wacom_wac
.data
, wacom
->data_dma
);
574 wacom_remove_shared_data(&wacom
->wacom_wac
);
578 static int wacom_suspend(struct usb_interface
*intf
, pm_message_t message
)
580 struct wacom
*wacom
= usb_get_intfdata(intf
);
582 mutex_lock(&wacom
->lock
);
583 usb_kill_urb(wacom
->irq
);
584 mutex_unlock(&wacom
->lock
);
589 static int wacom_resume(struct usb_interface
*intf
)
591 struct wacom
*wacom
= usb_get_intfdata(intf
);
592 struct wacom_features
*features
= &wacom
->wacom_wac
.features
;
595 mutex_lock(&wacom
->lock
);
597 /* switch to wacom mode first */
598 wacom_query_tablet_data(intf
, features
);
601 rv
= usb_submit_urb(wacom
->irq
, GFP_NOIO
);
605 mutex_unlock(&wacom
->lock
);
610 static int wacom_reset_resume(struct usb_interface
*intf
)
612 return wacom_resume(intf
);
615 static struct usb_driver wacom_driver
= {
617 .id_table
= wacom_ids
,
618 .probe
= wacom_probe
,
619 .disconnect
= wacom_disconnect
,
620 .suspend
= wacom_suspend
,
621 .resume
= wacom_resume
,
622 .reset_resume
= wacom_reset_resume
,
623 .supports_autosuspend
= 1,
626 static int __init
wacom_init(void)
630 result
= usb_register(&wacom_driver
);
632 printk(KERN_INFO KBUILD_MODNAME
": " DRIVER_VERSION
":"
637 static void __exit
wacom_exit(void)
639 usb_deregister(&wacom_driver
);
642 module_init(wacom_init
);
643 module_exit(wacom_exit
);