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.
15 #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
53 static int usb_get_report(struct usb_interface
*intf
, unsigned char type
,
54 unsigned char id
, void *buf
, int size
)
56 return usb_control_msg(interface_to_usbdev(intf
),
57 usb_rcvctrlpipe(interface_to_usbdev(intf
), 0),
58 USB_REQ_GET_REPORT
, USB_TYPE_CLASS
| USB_RECIP_INTERFACE
,
59 (type
<< 8) + id
, intf
->altsetting
[0].desc
.bInterfaceNumber
,
63 static int usb_set_report(struct usb_interface
*intf
, unsigned char type
,
64 unsigned char id
, void *buf
, int size
)
66 return usb_control_msg(interface_to_usbdev(intf
),
67 usb_sndctrlpipe(interface_to_usbdev(intf
), 0),
68 USB_REQ_SET_REPORT
, USB_TYPE_CLASS
| USB_RECIP_INTERFACE
,
69 (type
<< 8) + id
, intf
->altsetting
[0].desc
.bInterfaceNumber
,
73 static struct input_dev
* get_input_dev(struct wacom_combo
*wcombo
)
75 return wcombo
->wacom
->dev
;
78 static void wacom_sys_irq(struct urb
*urb
)
80 struct wacom
*wacom
= urb
->context
;
81 struct wacom_combo wcombo
;
84 switch (urb
->status
) {
91 /* this urb is terminated, clean up */
92 dbg("%s - urb shutting down with status: %d", __func__
, urb
->status
);
95 dbg("%s - nonzero urb status received: %d", __func__
, urb
->status
);
102 if (wacom_wac_irq(wacom
->wacom_wac
, (void *)&wcombo
))
103 input_sync(get_input_dev(&wcombo
));
106 usb_mark_last_busy(wacom
->usbdev
);
107 retval
= usb_submit_urb (urb
, GFP_ATOMIC
);
109 err ("%s - usb_submit_urb failed with result %d",
113 void wacom_report_key(void *wcombo
, unsigned int key_type
, int key_data
)
115 input_report_key(get_input_dev((struct wacom_combo
*)wcombo
), key_type
, key_data
);
118 void wacom_report_abs(void *wcombo
, unsigned int abs_type
, int abs_data
)
120 input_report_abs(get_input_dev((struct wacom_combo
*)wcombo
), abs_type
, abs_data
);
123 void wacom_report_rel(void *wcombo
, unsigned int rel_type
, int rel_data
)
125 input_report_rel(get_input_dev((struct wacom_combo
*)wcombo
), rel_type
, rel_data
);
128 void wacom_input_event(void *wcombo
, unsigned int type
, unsigned int code
, int value
)
130 input_event(get_input_dev((struct wacom_combo
*)wcombo
), type
, code
, value
);
133 __u16
wacom_be16_to_cpu(unsigned char *data
)
136 value
= be16_to_cpu(*(__be16
*) data
);
140 __u16
wacom_le16_to_cpu(unsigned char *data
)
143 value
= le16_to_cpu(*(__le16
*) data
);
147 void wacom_input_sync(void *wcombo
)
149 input_sync(get_input_dev((struct wacom_combo
*)wcombo
));
152 static int wacom_open(struct input_dev
*dev
)
154 struct wacom
*wacom
= input_get_drvdata(dev
);
156 mutex_lock(&wacom
->lock
);
158 wacom
->irq
->dev
= wacom
->usbdev
;
160 if (usb_autopm_get_interface(wacom
->intf
) < 0) {
161 mutex_unlock(&wacom
->lock
);
165 if (usb_submit_urb(wacom
->irq
, GFP_KERNEL
)) {
166 usb_autopm_put_interface(wacom
->intf
);
167 mutex_unlock(&wacom
->lock
);
172 wacom
->intf
->needs_remote_wakeup
= 1;
174 mutex_unlock(&wacom
->lock
);
178 static void wacom_close(struct input_dev
*dev
)
180 struct wacom
*wacom
= input_get_drvdata(dev
);
182 mutex_lock(&wacom
->lock
);
183 usb_kill_urb(wacom
->irq
);
185 wacom
->intf
->needs_remote_wakeup
= 0;
186 mutex_unlock(&wacom
->lock
);
189 void input_dev_mo(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
191 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_1
) |
193 input_set_abs_params(input_dev
, ABS_WHEEL
, 0, 71, 0, 0);
196 void input_dev_g4(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
198 input_dev
->evbit
[0] |= BIT_MASK(EV_MSC
);
199 input_dev
->mscbit
[0] |= BIT_MASK(MSC_SERIAL
);
200 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_FINGER
);
201 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_0
) |
205 void input_dev_g(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
207 input_dev
->evbit
[0] |= BIT_MASK(EV_REL
);
208 input_dev
->relbit
[0] |= BIT_MASK(REL_WHEEL
);
209 input_dev
->keybit
[BIT_WORD(BTN_MOUSE
)] |= BIT_MASK(BTN_LEFT
) |
210 BIT_MASK(BTN_RIGHT
) | BIT_MASK(BTN_MIDDLE
);
211 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_RUBBER
) |
212 BIT_MASK(BTN_TOOL_PEN
) | BIT_MASK(BTN_STYLUS
) |
213 BIT_MASK(BTN_TOOL_MOUSE
) | BIT_MASK(BTN_STYLUS2
);
214 input_set_abs_params(input_dev
, ABS_DISTANCE
,
215 0, wacom_wac
->features
.distance_max
, 0, 0);
218 void input_dev_i3s(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
220 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_FINGER
);
221 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_0
) |
222 BIT_MASK(BTN_1
) | BIT_MASK(BTN_2
) | BIT_MASK(BTN_3
);
223 input_set_abs_params(input_dev
, ABS_RX
, 0, 4096, 0, 0);
224 input_set_abs_params(input_dev
, ABS_Z
, -900, 899, 0, 0);
227 void input_dev_i3(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
229 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_4
) |
230 BIT_MASK(BTN_5
) | BIT_MASK(BTN_6
) | BIT_MASK(BTN_7
);
231 input_set_abs_params(input_dev
, ABS_RY
, 0, 4096, 0, 0);
234 void input_dev_i4s(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
236 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_FINGER
);
237 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_0
) | BIT_MASK(BTN_1
) | BIT_MASK(BTN_2
) | BIT_MASK(BTN_3
);
238 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_4
) | BIT_MASK(BTN_5
) | BIT_MASK(BTN_6
);
239 input_set_abs_params(input_dev
, ABS_Z
, -900, 899, 0, 0);
242 void input_dev_i4(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
244 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_7
) | BIT_MASK(BTN_8
);
247 void input_dev_bee(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
249 input_dev
->keybit
[BIT_WORD(BTN_MISC
)] |= BIT_MASK(BTN_8
) | BIT_MASK(BTN_9
);
252 void input_dev_i(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
254 input_dev
->evbit
[0] |= BIT_MASK(EV_MSC
) | BIT_MASK(EV_REL
);
255 input_dev
->mscbit
[0] |= BIT_MASK(MSC_SERIAL
);
256 input_dev
->relbit
[0] |= BIT_MASK(REL_WHEEL
);
257 input_dev
->keybit
[BIT_WORD(BTN_MOUSE
)] |= BIT_MASK(BTN_LEFT
) |
258 BIT_MASK(BTN_RIGHT
) | BIT_MASK(BTN_MIDDLE
) |
259 BIT_MASK(BTN_SIDE
) | BIT_MASK(BTN_EXTRA
);
260 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_RUBBER
) |
261 BIT_MASK(BTN_TOOL_PEN
) | BIT_MASK(BTN_STYLUS
) |
262 BIT_MASK(BTN_TOOL_MOUSE
) | BIT_MASK(BTN_TOOL_BRUSH
) |
263 BIT_MASK(BTN_TOOL_PENCIL
) | BIT_MASK(BTN_TOOL_AIRBRUSH
) |
264 BIT_MASK(BTN_TOOL_LENS
) | BIT_MASK(BTN_STYLUS2
);
265 input_set_abs_params(input_dev
, ABS_DISTANCE
,
266 0, wacom_wac
->features
.distance_max
, 0, 0);
267 input_set_abs_params(input_dev
, ABS_WHEEL
, 0, 1023, 0, 0);
268 input_set_abs_params(input_dev
, ABS_TILT_X
, 0, 127, 0, 0);
269 input_set_abs_params(input_dev
, ABS_TILT_Y
, 0, 127, 0, 0);
270 input_set_abs_params(input_dev
, ABS_RZ
, -900, 899, 0, 0);
271 input_set_abs_params(input_dev
, ABS_THROTTLE
, -1023, 1023, 0, 0);
274 void input_dev_pl(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
276 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_PEN
) |
277 BIT_MASK(BTN_STYLUS
) | BIT_MASK(BTN_STYLUS2
);
280 void input_dev_pt(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
282 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_RUBBER
);
285 void input_dev_tpc(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
287 struct wacom_features
*features
= &wacom_wac
->features
;
289 if (features
->device_type
== BTN_TOOL_DOUBLETAP
||
290 features
->device_type
== BTN_TOOL_TRIPLETAP
) {
291 input_set_abs_params(input_dev
, ABS_RX
, 0, features
->x_phy
, 0, 0);
292 input_set_abs_params(input_dev
, ABS_RY
, 0, features
->y_phy
, 0, 0);
293 __set_bit(BTN_TOOL_DOUBLETAP
, input_dev
->keybit
);
297 void input_dev_tpc2fg(struct input_dev
*input_dev
, struct wacom_wac
*wacom_wac
)
299 if (wacom_wac
->features
.device_type
== BTN_TOOL_TRIPLETAP
) {
300 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOOL_TRIPLETAP
);
301 input_dev
->evbit
[0] |= BIT_MASK(EV_MSC
);
302 input_dev
->mscbit
[0] |= BIT_MASK(MSC_SERIAL
);
306 static int wacom_parse_hid(struct usb_interface
*intf
, struct hid_descriptor
*hid_desc
,
307 struct wacom_features
*features
)
309 struct usb_device
*dev
= interface_to_usbdev(intf
);
311 /* result has to be defined as int for some devices */
313 int i
= 0, usage
= WCM_UNDEFINED
, finger
= 0, pen
= 0;
314 unsigned char *report
;
316 report
= kzalloc(hid_desc
->wDescriptorLength
, GFP_KERNEL
);
320 /* retrive report descriptors */
322 result
= usb_control_msg(dev
, usb_rcvctrlpipe(dev
, 0),
323 USB_REQ_GET_DESCRIPTOR
,
324 USB_RECIP_INTERFACE
| USB_DIR_IN
,
325 HID_DEVICET_REPORT
<< 8,
326 intf
->altsetting
[0].desc
.bInterfaceNumber
, /* interface */
328 hid_desc
->wDescriptorLength
,
330 } while (result
< 0 && limit
++ < 5);
332 /* No need to parse the Descriptor. It isn't an error though */
336 for (i
= 0; i
< hid_desc
->wDescriptorLength
; i
++) {
340 switch (report
[i
+ 1]) {
341 case HID_USAGE_PAGE_DIGITIZER
:
342 usage
= WCM_DIGITIZER
;
346 case HID_USAGE_PAGE_DESKTOP
:
354 switch (report
[i
+ 1]) {
356 if (usage
== WCM_DESKTOP
) {
358 features
->device_type
= BTN_TOOL_DOUBLETAP
;
359 if (features
->type
== TABLETPC2FG
) {
360 /* need to reset back */
361 features
->pktlen
= WACOM_PKGLEN_TPC2FG
;
362 features
->device_type
= BTN_TOOL_TRIPLETAP
;
365 wacom_le16_to_cpu(&report
[i
+ 3]);
367 wacom_le16_to_cpu(&report
[i
+ 6]);
368 features
->unit
= report
[i
+ 9];
369 features
->unitExpo
= report
[i
+ 11];
372 /* penabled only accepts exact bytes of data */
373 if (features
->type
== TABLETPC2FG
)
374 features
->pktlen
= WACOM_PKGLEN_GRAPHIRE
;
375 features
->device_type
= BTN_TOOL_PEN
;
377 wacom_le16_to_cpu(&report
[i
+ 3]);
380 } else if (usage
== WCM_DIGITIZER
) {
381 /* max pressure isn't reported
382 features->pressure_max = (unsigned short)
383 (report[i+4] << 8 | report[i + 3]);
385 features
->pressure_max
= 255;
391 if (usage
== WCM_DESKTOP
) {
393 features
->device_type
= BTN_TOOL_DOUBLETAP
;
394 if (features
->type
== TABLETPC2FG
) {
395 /* need to reset back */
396 features
->pktlen
= WACOM_PKGLEN_TPC2FG
;
397 features
->device_type
= BTN_TOOL_TRIPLETAP
;
399 wacom_le16_to_cpu(&report
[i
+ 3]);
401 wacom_le16_to_cpu(&report
[i
+ 6]);
407 wacom_le16_to_cpu(&report
[i
+ 3]);
411 /* penabled only accepts exact bytes of data */
412 if (features
->type
== TABLETPC2FG
)
413 features
->pktlen
= WACOM_PKGLEN_GRAPHIRE
;
414 features
->device_type
= BTN_TOOL_PEN
;
416 wacom_le16_to_cpu(&report
[i
+ 3]);
422 case HID_USAGE_FINGER
:
427 case HID_USAGE_STYLUS
:
432 case HID_USAGE_UNDEFINED
:
433 if (usage
== WCM_DESKTOP
&& finger
) /* capacity */
434 features
->pressure_max
=
435 wacom_le16_to_cpu(&report
[i
+ 3]);
442 /* reset UsagePage and Finger */
454 static int wacom_query_tablet_data(struct usb_interface
*intf
, struct wacom_features
*features
)
456 unsigned char *rep_data
;
457 int limit
= 0, report_id
= 2;
460 rep_data
= kmalloc(2, GFP_KERNEL
);
464 /* ask to report tablet data if it is 2FGT or not a Tablet PC */
465 if (features
->device_type
== BTN_TOOL_TRIPLETAP
) {
470 error
= usb_set_report(intf
, WAC_HID_FEATURE_REPORT
,
471 report_id
, rep_data
, 2);
473 error
= usb_get_report(intf
,
474 WAC_HID_FEATURE_REPORT
, report_id
,
476 } while ((error
< 0 || rep_data
[1] != 4) && limit
++ < 5);
477 } else if (features
->type
!= TABLETPC
&& features
->type
!= TABLETPC2FG
) {
481 error
= usb_set_report(intf
, WAC_HID_FEATURE_REPORT
,
482 report_id
, rep_data
, 2);
484 error
= usb_get_report(intf
,
485 WAC_HID_FEATURE_REPORT
, report_id
,
487 } while ((error
< 0 || rep_data
[1] != 2) && limit
++ < 5);
492 return error
< 0 ? error
: 0;
495 static int wacom_retrieve_hid_descriptor(struct usb_interface
*intf
,
496 struct wacom_features
*features
)
499 struct usb_host_interface
*interface
= intf
->cur_altsetting
;
500 struct hid_descriptor
*hid_desc
;
502 /* default device to penabled */
503 features
->device_type
= BTN_TOOL_PEN
;
505 /* only Tablet PCs need to retrieve the info */
506 if ((features
->type
!= TABLETPC
) && (features
->type
!= TABLETPC2FG
))
509 if (usb_get_extra_descriptor(interface
, HID_DEVICET_HID
, &hid_desc
)) {
510 if (usb_get_extra_descriptor(&interface
->endpoint
[0],
511 HID_DEVICET_REPORT
, &hid_desc
)) {
512 printk("wacom: can not retrieve extra class descriptor\n");
517 error
= wacom_parse_hid(intf
, hid_desc
, features
);
521 /* touch device found but size is not defined. use default */
522 if (features
->device_type
== BTN_TOOL_DOUBLETAP
&& !features
->x_max
) {
523 features
->x_max
= 1023;
524 features
->y_max
= 1023;
531 static int wacom_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
533 struct usb_device
*dev
= interface_to_usbdev(intf
);
534 struct usb_endpoint_descriptor
*endpoint
;
536 struct wacom_wac
*wacom_wac
;
537 struct wacom_features
*features
;
538 struct input_dev
*input_dev
;
541 if (!id
->driver_info
)
544 wacom
= kzalloc(sizeof(struct wacom
), GFP_KERNEL
);
545 wacom_wac
= kzalloc(sizeof(struct wacom_wac
), GFP_KERNEL
);
546 input_dev
= input_allocate_device();
547 if (!wacom
|| !input_dev
|| !wacom_wac
) {
552 wacom_wac
->features
= *((struct wacom_features
*)id
->driver_info
);
553 features
= &wacom_wac
->features
;
554 if (features
->pktlen
> WACOM_PKGLEN_MAX
) {
559 wacom_wac
->data
= usb_buffer_alloc(dev
, WACOM_PKGLEN_MAX
,
560 GFP_KERNEL
, &wacom
->data_dma
);
561 if (!wacom_wac
->data
) {
566 wacom
->irq
= usb_alloc_urb(0, GFP_KERNEL
);
573 wacom
->dev
= input_dev
;
575 mutex_init(&wacom
->lock
);
576 usb_make_path(dev
, wacom
->phys
, sizeof(wacom
->phys
));
577 strlcat(wacom
->phys
, "/input0", sizeof(wacom
->phys
));
579 usb_to_input_id(dev
, &input_dev
->id
);
581 input_dev
->dev
.parent
= &intf
->dev
;
583 input_set_drvdata(input_dev
, wacom
);
585 input_dev
->open
= wacom_open
;
586 input_dev
->close
= wacom_close
;
588 endpoint
= &intf
->cur_altsetting
->endpoint
[0].desc
;
590 /* Retrieve the physical and logical size for OEM devices */
591 error
= wacom_retrieve_hid_descriptor(intf
, features
);
595 strlcpy(wacom_wac
->name
, features
->name
, sizeof(wacom_wac
->name
));
597 if (features
->type
== TABLETPC
|| features
->type
== TABLETPC2FG
) {
598 /* Append the device type to the name */
599 strlcat(wacom_wac
->name
,
600 features
->device_type
== BTN_TOOL_PEN
?
602 sizeof(wacom_wac
->name
));
605 input_dev
->name
= wacom_wac
->name
;
606 wacom
->wacom_wac
= wacom_wac
;
608 input_dev
->evbit
[0] |= BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
609 input_dev
->keybit
[BIT_WORD(BTN_DIGI
)] |= BIT_MASK(BTN_TOUCH
);
611 input_set_abs_params(input_dev
, ABS_X
, 0, features
->x_max
, 4, 0);
612 input_set_abs_params(input_dev
, ABS_Y
, 0, features
->y_max
, 4, 0);
613 input_set_abs_params(input_dev
, ABS_PRESSURE
, 0, features
->pressure_max
, 0, 0);
614 input_dev
->absbit
[BIT_WORD(ABS_MISC
)] |= BIT_MASK(ABS_MISC
);
616 wacom_init_input_dev(input_dev
, wacom_wac
);
618 usb_fill_int_urb(wacom
->irq
, dev
,
619 usb_rcvintpipe(dev
, endpoint
->bEndpointAddress
),
620 wacom_wac
->data
, features
->pktlen
,
621 wacom_sys_irq
, wacom
, endpoint
->bInterval
);
622 wacom
->irq
->transfer_dma
= wacom
->data_dma
;
623 wacom
->irq
->transfer_flags
|= URB_NO_TRANSFER_DMA_MAP
;
625 error
= input_register_device(wacom
->dev
);
629 /* Note that if query fails it is not a hard failure */
630 wacom_query_tablet_data(intf
, features
);
632 usb_set_intfdata(intf
, wacom
);
635 fail3
: usb_free_urb(wacom
->irq
);
636 fail2
: usb_buffer_free(dev
, WACOM_PKGLEN_MAX
, wacom_wac
->data
, wacom
->data_dma
);
637 fail1
: input_free_device(input_dev
);
643 static void wacom_disconnect(struct usb_interface
*intf
)
645 struct wacom
*wacom
= usb_get_intfdata(intf
);
647 usb_set_intfdata(intf
, NULL
);
649 usb_kill_urb(wacom
->irq
);
650 input_unregister_device(wacom
->dev
);
651 usb_free_urb(wacom
->irq
);
652 usb_buffer_free(interface_to_usbdev(intf
), WACOM_PKGLEN_MAX
,
653 wacom
->wacom_wac
->data
, wacom
->data_dma
);
654 kfree(wacom
->wacom_wac
);
658 static int wacom_suspend(struct usb_interface
*intf
, pm_message_t message
)
660 struct wacom
*wacom
= usb_get_intfdata(intf
);
662 mutex_lock(&wacom
->lock
);
663 usb_kill_urb(wacom
->irq
);
664 mutex_unlock(&wacom
->lock
);
669 static int wacom_resume(struct usb_interface
*intf
)
671 struct wacom
*wacom
= usb_get_intfdata(intf
);
672 struct wacom_features
*features
= &wacom
->wacom_wac
->features
;
675 mutex_lock(&wacom
->lock
);
677 rv
= usb_submit_urb(wacom
->irq
, GFP_NOIO
);
678 /* switch to wacom mode if needed */
679 if (!wacom_retrieve_hid_descriptor(intf
, features
))
680 wacom_query_tablet_data(intf
, features
);
683 mutex_unlock(&wacom
->lock
);
688 static int wacom_reset_resume(struct usb_interface
*intf
)
690 return wacom_resume(intf
);
693 static struct usb_driver wacom_driver
= {
695 .id_table
= wacom_ids
,
696 .probe
= wacom_probe
,
697 .disconnect
= wacom_disconnect
,
698 .suspend
= wacom_suspend
,
699 .resume
= wacom_resume
,
700 .reset_resume
= wacom_reset_resume
,
701 .supports_autosuspend
= 1,
704 static int __init
wacom_init(void)
708 result
= usb_register(&wacom_driver
);
710 printk(KERN_INFO KBUILD_MODNAME
": " DRIVER_VERSION
":"
715 static void __exit
wacom_exit(void)
717 usb_deregister(&wacom_driver
);
720 module_init(wacom_init
);
721 module_exit(wacom_exit
);