Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 4dfd459b738cf1f65b3eac4e0a9b19bc93cc91c6 691 lines 20 kB view raw
1/* 2 * drivers/input/tablet/wacom_sys.c 3 * 4 * USB Wacom tablet support - system specific code 5 */ 6 7/* 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. 12 */ 13 14#include "wacom.h" 15#include "wacom_wac.h" 16 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 32 33enum { 34 WCM_UNDEFINED = 0, 35 WCM_DESKTOP, 36 WCM_DIGITIZER, 37}; 38 39struct hid_descriptor { 40 struct usb_descriptor_header header; 41 __le16 bcdHID; 42 u8 bCountryCode; 43 u8 bNumDescriptors; 44 u8 bDescriptorType; 45 __le16 wDescriptorLength; 46} __attribute__ ((packed)); 47 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 53static int usb_get_report(struct usb_interface *intf, unsigned char type, 54 unsigned char id, void *buf, int size) 55{ 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, 60 buf, size, 100); 61} 62 63static int usb_set_report(struct usb_interface *intf, unsigned char type, 64 unsigned char id, void *buf, int size) 65{ 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, 70 buf, size, 1000); 71} 72 73static struct input_dev * get_input_dev(struct wacom_combo *wcombo) 74{ 75 return wcombo->wacom->dev; 76} 77 78static void wacom_sys_irq(struct urb *urb) 79{ 80 struct wacom *wacom = urb->context; 81 struct wacom_combo wcombo; 82 int retval; 83 84 switch (urb->status) { 85 case 0: 86 /* success */ 87 break; 88 case -ECONNRESET: 89 case -ENOENT: 90 case -ESHUTDOWN: 91 /* this urb is terminated, clean up */ 92 dbg("%s - urb shutting down with status: %d", __func__, urb->status); 93 return; 94 default: 95 dbg("%s - nonzero urb status received: %d", __func__, urb->status); 96 goto exit; 97 } 98 99 wcombo.wacom = wacom; 100 wcombo.urb = urb; 101 102 if (wacom_wac_irq(wacom->wacom_wac, (void *)&wcombo)) 103 input_sync(get_input_dev(&wcombo)); 104 105 exit: 106 usb_mark_last_busy(wacom->usbdev); 107 retval = usb_submit_urb (urb, GFP_ATOMIC); 108 if (retval) 109 err ("%s - usb_submit_urb failed with result %d", 110 __func__, retval); 111} 112 113void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) 114{ 115 input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); 116} 117 118void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) 119{ 120 input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); 121} 122 123void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) 124{ 125 input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); 126} 127 128void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) 129{ 130 input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); 131} 132 133__u16 wacom_be16_to_cpu(unsigned char *data) 134{ 135 __u16 value; 136 value = be16_to_cpu(*(__be16 *) data); 137 return value; 138} 139 140__u16 wacom_le16_to_cpu(unsigned char *data) 141{ 142 __u16 value; 143 value = le16_to_cpu(*(__le16 *) data); 144 return value; 145} 146 147void wacom_input_sync(void *wcombo) 148{ 149 input_sync(get_input_dev((struct wacom_combo *)wcombo)); 150} 151 152static int wacom_open(struct input_dev *dev) 153{ 154 struct wacom *wacom = input_get_drvdata(dev); 155 156 mutex_lock(&wacom->lock); 157 158 wacom->irq->dev = wacom->usbdev; 159 160 if (usb_autopm_get_interface(wacom->intf) < 0) { 161 mutex_unlock(&wacom->lock); 162 return -EIO; 163 } 164 165 if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { 166 usb_autopm_put_interface(wacom->intf); 167 mutex_unlock(&wacom->lock); 168 return -EIO; 169 } 170 171 wacom->open = 1; 172 wacom->intf->needs_remote_wakeup = 1; 173 174 mutex_unlock(&wacom->lock); 175 return 0; 176} 177 178static void wacom_close(struct input_dev *dev) 179{ 180 struct wacom *wacom = input_get_drvdata(dev); 181 182 mutex_lock(&wacom->lock); 183 usb_kill_urb(wacom->irq); 184 wacom->open = 0; 185 wacom->intf->needs_remote_wakeup = 0; 186 mutex_unlock(&wacom->lock); 187} 188 189void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 190{ 191 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_1) | 192 BIT_MASK(BTN_5); 193 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 194} 195 196void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 197{ 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) | 202 BIT_MASK(BTN_4); 203} 204 205void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 206{ 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, 0, wacom_wac->features->distance_max, 0, 0); 215} 216 217void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 218{ 219 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); 220 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | 221 BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); 222 input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); 223 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 224} 225 226void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 227{ 228 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) | 229 BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); 230 input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); 231} 232 233void input_dev_i4s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 234{ 235 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); 236 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); 237 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) | BIT_MASK(BTN_5) | BIT_MASK(BTN_6); 238 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 239} 240 241void input_dev_i4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 242{ 243 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_7) | BIT_MASK(BTN_8); 244} 245 246void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 247{ 248 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); 249} 250 251void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 252{ 253 input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); 254 input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); 255 input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); 256 input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | 257 BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | 258 BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); 259 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | 260 BIT_MASK(BTN_TOOL_PEN) | BIT_MASK(BTN_STYLUS) | 261 BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_TOOL_BRUSH) | 262 BIT_MASK(BTN_TOOL_PENCIL) | BIT_MASK(BTN_TOOL_AIRBRUSH) | 263 BIT_MASK(BTN_TOOL_LENS) | BIT_MASK(BTN_STYLUS2); 264 input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0); 265 input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0); 266 input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0); 267 input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0); 268 input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0); 269 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); 270} 271 272void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 273{ 274 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | 275 BIT_MASK(BTN_STYLUS) | BIT_MASK(BTN_STYLUS2); 276} 277 278void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 279{ 280 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); 281} 282 283void input_dev_tpc(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 284{ 285 if (wacom_wac->features->device_type == BTN_TOOL_DOUBLETAP || 286 wacom_wac->features->device_type == BTN_TOOL_TRIPLETAP) { 287 input_set_abs_params(input_dev, ABS_RX, 0, wacom_wac->features->x_phy, 0, 0); 288 input_set_abs_params(input_dev, ABS_RY, 0, wacom_wac->features->y_phy, 0, 0); 289 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP); 290 } 291} 292 293void input_dev_tpc2fg(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 294{ 295 if (wacom_wac->features->device_type == BTN_TOOL_TRIPLETAP) { 296 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_TRIPLETAP); 297 input_dev->evbit[0] |= BIT_MASK(EV_MSC); 298 input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); 299 } 300} 301 302static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc, 303 struct wacom_features *features) 304{ 305 struct usb_device *dev = interface_to_usbdev(intf); 306 char limit = 0; 307 /* result has to be defined as int for some devices */ 308 int result = 0; 309 int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; 310 unsigned char *report; 311 312 report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); 313 if (!report) 314 return -ENOMEM; 315 316 /* retrive report descriptors */ 317 do { 318 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 319 USB_REQ_GET_DESCRIPTOR, 320 USB_RECIP_INTERFACE | USB_DIR_IN, 321 HID_DEVICET_REPORT << 8, 322 intf->altsetting[0].desc.bInterfaceNumber, /* interface */ 323 report, 324 hid_desc->wDescriptorLength, 325 5000); /* 5 secs */ 326 } while (result < 0 && limit++ < 5); 327 328 /* No need to parse the Descriptor. It isn't an error though */ 329 if (result < 0) 330 goto out; 331 332 for (i = 0; i < hid_desc->wDescriptorLength; i++) { 333 334 switch (report[i]) { 335 case HID_USAGE_PAGE: 336 switch (report[i + 1]) { 337 case HID_USAGE_PAGE_DIGITIZER: 338 usage = WCM_DIGITIZER; 339 i++; 340 break; 341 342 case HID_USAGE_PAGE_DESKTOP: 343 usage = WCM_DESKTOP; 344 i++; 345 break; 346 } 347 break; 348 349 case HID_USAGE: 350 switch (report[i + 1]) { 351 case HID_USAGE_X: 352 if (usage == WCM_DESKTOP) { 353 if (finger) { 354 features->device_type = BTN_TOOL_DOUBLETAP; 355 if (features->type == TABLETPC2FG) { 356 /* need to reset back */ 357 features->pktlen = WACOM_PKGLEN_TPC2FG; 358 features->device_type = BTN_TOOL_TRIPLETAP; 359 } 360 features->x_max = 361 wacom_le16_to_cpu(&report[i + 3]); 362 features->x_phy = 363 wacom_le16_to_cpu(&report[i + 6]); 364 features->unit = report[i + 9]; 365 features->unitExpo = report[i + 11]; 366 i += 12; 367 } else if (pen) { 368 /* penabled only accepts exact bytes of data */ 369 if (features->type == TABLETPC2FG) 370 features->pktlen = WACOM_PKGLEN_PENABLED; 371 features->device_type = BTN_TOOL_PEN; 372 features->x_max = 373 wacom_le16_to_cpu(&report[i + 3]); 374 i += 4; 375 } 376 } else if (usage == WCM_DIGITIZER) { 377 /* max pressure isn't reported 378 features->pressure_max = (unsigned short) 379 (report[i+4] << 8 | report[i + 3]); 380 */ 381 features->pressure_max = 255; 382 i += 4; 383 } 384 break; 385 386 case HID_USAGE_Y: 387 if (usage == WCM_DESKTOP) { 388 if (finger) { 389 features->device_type = BTN_TOOL_DOUBLETAP; 390 if (features->type == TABLETPC2FG) { 391 /* need to reset back */ 392 features->pktlen = WACOM_PKGLEN_TPC2FG; 393 features->device_type = BTN_TOOL_TRIPLETAP; 394 features->y_max = 395 wacom_le16_to_cpu(&report[i + 3]); 396 features->y_phy = 397 wacom_le16_to_cpu(&report[i + 6]); 398 i += 7; 399 } else { 400 features->y_max = 401 features->x_max; 402 features->y_phy = 403 wacom_le16_to_cpu(&report[i + 3]); 404 i += 4; 405 } 406 } else if (pen) { 407 /* penabled only accepts exact bytes of data */ 408 if (features->type == TABLETPC2FG) 409 features->pktlen = WACOM_PKGLEN_PENABLED; 410 features->device_type = BTN_TOOL_PEN; 411 features->y_max = 412 wacom_le16_to_cpu(&report[i + 3]); 413 i += 4; 414 } 415 } 416 break; 417 418 case HID_USAGE_FINGER: 419 finger = 1; 420 i++; 421 break; 422 423 case HID_USAGE_STYLUS: 424 pen = 1; 425 i++; 426 break; 427 428 case HID_USAGE_UNDEFINED: 429 if (usage == WCM_DESKTOP && finger) /* capacity */ 430 features->pressure_max = 431 wacom_le16_to_cpu(&report[i + 3]); 432 i += 4; 433 break; 434 } 435 break; 436 437 case HID_COLLECTION: 438 /* reset UsagePage and Finger */ 439 finger = usage = 0; 440 break; 441 } 442 } 443 444 out: 445 result = 0; 446 kfree(report); 447 return result; 448} 449 450static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features) 451{ 452 unsigned char *rep_data; 453 int limit = 0, report_id = 2; 454 int error = -ENOMEM; 455 456 rep_data = kmalloc(2, GFP_KERNEL); 457 if (!rep_data) 458 return error; 459 460 /* ask to report tablet data if it is 2FGT or not a Tablet PC */ 461 if (features->device_type == BTN_TOOL_TRIPLETAP) { 462 do { 463 rep_data[0] = 3; 464 rep_data[1] = 4; 465 report_id = 3; 466 error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, 467 report_id, rep_data, 2); 468 if (error >= 0) 469 error = usb_get_report(intf, 470 WAC_HID_FEATURE_REPORT, report_id, 471 rep_data, 3); 472 } while ((error < 0 || rep_data[1] != 4) && limit++ < 5); 473 } else if (features->type != TABLETPC && features->type != TABLETPC2FG) { 474 do { 475 rep_data[0] = 2; 476 rep_data[1] = 2; 477 error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, 478 report_id, rep_data, 2); 479 if (error >= 0) 480 error = usb_get_report(intf, 481 WAC_HID_FEATURE_REPORT, report_id, 482 rep_data, 2); 483 } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); 484 } 485 486 kfree(rep_data); 487 488 return error < 0 ? error : 0; 489} 490 491static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, 492 struct wacom_features *features) 493{ 494 int error = 0; 495 struct usb_host_interface *interface = intf->cur_altsetting; 496 struct hid_descriptor *hid_desc; 497 498 /* default device to penabled */ 499 features->device_type = BTN_TOOL_PEN; 500 501 /* only Tablet PCs need to retrieve the info */ 502 if ((features->type != TABLETPC) && (features->type != TABLETPC2FG)) 503 goto out; 504 505 if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { 506 if (usb_get_extra_descriptor(&interface->endpoint[0], 507 HID_DEVICET_REPORT, &hid_desc)) { 508 printk("wacom: can not retrieve extra class descriptor\n"); 509 error = 1; 510 goto out; 511 } 512 } 513 error = wacom_parse_hid(intf, hid_desc, features); 514 if (error) 515 goto out; 516 517 /* touch device found but size is not defined. use default */ 518 if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) { 519 features->x_max = 1023; 520 features->y_max = 1023; 521 } 522 523 out: 524 return error; 525} 526 527static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) 528{ 529 struct usb_device *dev = interface_to_usbdev(intf); 530 struct usb_endpoint_descriptor *endpoint; 531 struct wacom *wacom; 532 struct wacom_wac *wacom_wac; 533 struct wacom_features *features; 534 struct input_dev *input_dev; 535 int error = -ENOMEM; 536 537 wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); 538 wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); 539 input_dev = input_allocate_device(); 540 if (!wacom || !input_dev || !wacom_wac) 541 goto fail1; 542 543 wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX, GFP_KERNEL, &wacom->data_dma); 544 if (!wacom_wac->data) 545 goto fail1; 546 547 wacom->irq = usb_alloc_urb(0, GFP_KERNEL); 548 if (!wacom->irq) 549 goto fail2; 550 551 wacom->usbdev = dev; 552 wacom->dev = input_dev; 553 wacom->intf = intf; 554 mutex_init(&wacom->lock); 555 usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); 556 strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); 557 558 wacom_wac->features = features = get_wacom_feature(id); 559 BUG_ON(features->pktlen > WACOM_PKGLEN_MAX); 560 561 input_dev->name = wacom_wac->features->name; 562 wacom->wacom_wac = wacom_wac; 563 usb_to_input_id(dev, &input_dev->id); 564 565 input_dev->dev.parent = &intf->dev; 566 567 input_set_drvdata(input_dev, wacom); 568 569 input_dev->open = wacom_open; 570 input_dev->close = wacom_close; 571 572 endpoint = &intf->cur_altsetting->endpoint[0].desc; 573 574 /* Retrieve the physical and logical size for OEM devices */ 575 error = wacom_retrieve_hid_descriptor(intf, features); 576 if (error) 577 goto fail2; 578 579 input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 580 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOUCH); 581 582 input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); 583 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); 584 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); 585 input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); 586 587 wacom_init_input_dev(input_dev, wacom_wac); 588 589 usb_fill_int_urb(wacom->irq, dev, 590 usb_rcvintpipe(dev, endpoint->bEndpointAddress), 591 wacom_wac->data, features->pktlen, 592 wacom_sys_irq, wacom, endpoint->bInterval); 593 wacom->irq->transfer_dma = wacom->data_dma; 594 wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 595 596 error = input_register_device(wacom->dev); 597 if (error) 598 goto fail3; 599 600 /* Note that if query fails it is not a hard failure */ 601 wacom_query_tablet_data(intf, features); 602 603 usb_set_intfdata(intf, wacom); 604 return 0; 605 606 fail3: usb_free_urb(wacom->irq); 607 fail2: usb_buffer_free(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma); 608 fail1: input_free_device(input_dev); 609 kfree(wacom); 610 kfree(wacom_wac); 611 return error; 612} 613 614static void wacom_disconnect(struct usb_interface *intf) 615{ 616 struct wacom *wacom = usb_get_intfdata(intf); 617 618 usb_set_intfdata(intf, NULL); 619 620 usb_kill_urb(wacom->irq); 621 input_unregister_device(wacom->dev); 622 usb_free_urb(wacom->irq); 623 usb_buffer_free(interface_to_usbdev(intf), WACOM_PKGLEN_MAX, 624 wacom->wacom_wac->data, wacom->data_dma); 625 kfree(wacom->wacom_wac); 626 kfree(wacom); 627} 628 629static int wacom_suspend(struct usb_interface *intf, pm_message_t message) 630{ 631 struct wacom *wacom = usb_get_intfdata(intf); 632 633 mutex_lock(&wacom->lock); 634 usb_kill_urb(wacom->irq); 635 mutex_unlock(&wacom->lock); 636 637 return 0; 638} 639 640static int wacom_resume(struct usb_interface *intf) 641{ 642 struct wacom *wacom = usb_get_intfdata(intf); 643 struct wacom_features *features = wacom->wacom_wac->features; 644 int rv; 645 646 mutex_lock(&wacom->lock); 647 if (wacom->open) { 648 rv = usb_submit_urb(wacom->irq, GFP_NOIO); 649 /* switch to wacom mode if needed */ 650 if (!wacom_retrieve_hid_descriptor(intf, features)) 651 wacom_query_tablet_data(intf, features); 652 } else 653 rv = 0; 654 mutex_unlock(&wacom->lock); 655 656 return rv; 657} 658 659static int wacom_reset_resume(struct usb_interface *intf) 660{ 661 return wacom_resume(intf); 662} 663 664static struct usb_driver wacom_driver = { 665 .name = "wacom", 666 .probe = wacom_probe, 667 .disconnect = wacom_disconnect, 668 .suspend = wacom_suspend, 669 .resume = wacom_resume, 670 .reset_resume = wacom_reset_resume, 671 .supports_autosuspend = 1, 672}; 673 674static int __init wacom_init(void) 675{ 676 int result; 677 wacom_driver.id_table = get_device_table(); 678 result = usb_register(&wacom_driver); 679 if (result == 0) 680 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" 681 DRIVER_DESC "\n"); 682 return result; 683} 684 685static void __exit wacom_exit(void) 686{ 687 usb_deregister(&wacom_driver); 688} 689 690module_init(wacom_init); 691module_exit(wacom_exit);