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 v2.6.34-rc7 723 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, 215 0, wacom_wac->features.distance_max, 0, 0); 216} 217 218void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 219{ 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); 225} 226 227void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 228{ 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); 232} 233 234void input_dev_i4s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 235{ 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); 240} 241 242void input_dev_i4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 243{ 244 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_7) | BIT_MASK(BTN_8); 245} 246 247void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 248{ 249 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); 250} 251 252void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 253{ 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); 272} 273 274void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 275{ 276 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | 277 BIT_MASK(BTN_STYLUS) | BIT_MASK(BTN_STYLUS2); 278} 279 280void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 281{ 282 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); 283} 284 285void input_dev_tpc(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 286{ 287 struct wacom_features *features = &wacom_wac->features; 288 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); 294 } 295} 296 297void input_dev_tpc2fg(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 298{ 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); 303 } 304} 305 306static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc, 307 struct wacom_features *features) 308{ 309 struct usb_device *dev = interface_to_usbdev(intf); 310 char limit = 0; 311 /* result has to be defined as int for some devices */ 312 int result = 0; 313 int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; 314 unsigned char *report; 315 316 report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); 317 if (!report) 318 return -ENOMEM; 319 320 /* retrive report descriptors */ 321 do { 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 */ 327 report, 328 hid_desc->wDescriptorLength, 329 5000); /* 5 secs */ 330 } while (result < 0 && limit++ < 5); 331 332 /* No need to parse the Descriptor. It isn't an error though */ 333 if (result < 0) 334 goto out; 335 336 for (i = 0; i < hid_desc->wDescriptorLength; i++) { 337 338 switch (report[i]) { 339 case HID_USAGE_PAGE: 340 switch (report[i + 1]) { 341 case HID_USAGE_PAGE_DIGITIZER: 342 usage = WCM_DIGITIZER; 343 i++; 344 break; 345 346 case HID_USAGE_PAGE_DESKTOP: 347 usage = WCM_DESKTOP; 348 i++; 349 break; 350 } 351 break; 352 353 case HID_USAGE: 354 switch (report[i + 1]) { 355 case HID_USAGE_X: 356 if (usage == WCM_DESKTOP) { 357 if (finger) { 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; 363 } 364 features->x_max = 365 wacom_le16_to_cpu(&report[i + 3]); 366 features->x_phy = 367 wacom_le16_to_cpu(&report[i + 6]); 368 features->unit = report[i + 9]; 369 features->unitExpo = report[i + 11]; 370 i += 12; 371 } else if (pen) { 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; 376 features->x_max = 377 wacom_le16_to_cpu(&report[i + 3]); 378 i += 4; 379 } 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]); 384 */ 385 features->pressure_max = 255; 386 i += 4; 387 } 388 break; 389 390 case HID_USAGE_Y: 391 if (usage == WCM_DESKTOP) { 392 if (finger) { 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; 398 features->y_max = 399 wacom_le16_to_cpu(&report[i + 3]); 400 features->y_phy = 401 wacom_le16_to_cpu(&report[i + 6]); 402 i += 7; 403 } else { 404 features->y_max = 405 features->x_max; 406 features->y_phy = 407 wacom_le16_to_cpu(&report[i + 3]); 408 i += 4; 409 } 410 } else if (pen) { 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; 415 features->y_max = 416 wacom_le16_to_cpu(&report[i + 3]); 417 i += 4; 418 } 419 } 420 break; 421 422 case HID_USAGE_FINGER: 423 finger = 1; 424 i++; 425 break; 426 427 case HID_USAGE_STYLUS: 428 pen = 1; 429 i++; 430 break; 431 432 case HID_USAGE_UNDEFINED: 433 if (usage == WCM_DESKTOP && finger) /* capacity */ 434 features->pressure_max = 435 wacom_le16_to_cpu(&report[i + 3]); 436 i += 4; 437 break; 438 } 439 break; 440 441 case HID_COLLECTION: 442 /* reset UsagePage and Finger */ 443 finger = usage = 0; 444 break; 445 } 446 } 447 448 out: 449 result = 0; 450 kfree(report); 451 return result; 452} 453 454static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features) 455{ 456 unsigned char *rep_data; 457 int limit = 0, report_id = 2; 458 int error = -ENOMEM; 459 460 rep_data = kmalloc(2, GFP_KERNEL); 461 if (!rep_data) 462 return error; 463 464 /* ask to report tablet data if it is 2FGT or not a Tablet PC */ 465 if (features->device_type == BTN_TOOL_TRIPLETAP) { 466 do { 467 rep_data[0] = 3; 468 rep_data[1] = 4; 469 report_id = 3; 470 error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, 471 report_id, rep_data, 2); 472 if (error >= 0) 473 error = usb_get_report(intf, 474 WAC_HID_FEATURE_REPORT, report_id, 475 rep_data, 3); 476 } while ((error < 0 || rep_data[1] != 4) && limit++ < 5); 477 } else if (features->type != TABLETPC && features->type != TABLETPC2FG) { 478 do { 479 rep_data[0] = 2; 480 rep_data[1] = 2; 481 error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, 482 report_id, rep_data, 2); 483 if (error >= 0) 484 error = usb_get_report(intf, 485 WAC_HID_FEATURE_REPORT, report_id, 486 rep_data, 2); 487 } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); 488 } 489 490 kfree(rep_data); 491 492 return error < 0 ? error : 0; 493} 494 495static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, 496 struct wacom_features *features) 497{ 498 int error = 0; 499 struct usb_host_interface *interface = intf->cur_altsetting; 500 struct hid_descriptor *hid_desc; 501 502 /* default device to penabled */ 503 features->device_type = BTN_TOOL_PEN; 504 505 /* only Tablet PCs need to retrieve the info */ 506 if ((features->type != TABLETPC) && (features->type != TABLETPC2FG)) 507 goto out; 508 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"); 513 error = 1; 514 goto out; 515 } 516 } 517 error = wacom_parse_hid(intf, hid_desc, features); 518 if (error) 519 goto out; 520 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; 525 } 526 527 out: 528 return error; 529} 530 531static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) 532{ 533 struct usb_device *dev = interface_to_usbdev(intf); 534 struct usb_endpoint_descriptor *endpoint; 535 struct wacom *wacom; 536 struct wacom_wac *wacom_wac; 537 struct wacom_features *features; 538 struct input_dev *input_dev; 539 int error; 540 541 if (!id->driver_info) 542 return -EINVAL; 543 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) { 548 error = -ENOMEM; 549 goto fail1; 550 } 551 552 wacom_wac->features = *((struct wacom_features *)id->driver_info); 553 features = &wacom_wac->features; 554 if (features->pktlen > WACOM_PKGLEN_MAX) { 555 error = -EINVAL; 556 goto fail1; 557 } 558 559 wacom_wac->data = usb_buffer_alloc(dev, WACOM_PKGLEN_MAX, 560 GFP_KERNEL, &wacom->data_dma); 561 if (!wacom_wac->data) { 562 error = -ENOMEM; 563 goto fail1; 564 } 565 566 wacom->irq = usb_alloc_urb(0, GFP_KERNEL); 567 if (!wacom->irq) { 568 error = -ENOMEM; 569 goto fail2; 570 } 571 572 wacom->usbdev = dev; 573 wacom->dev = input_dev; 574 wacom->intf = intf; 575 mutex_init(&wacom->lock); 576 usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); 577 strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); 578 579 usb_to_input_id(dev, &input_dev->id); 580 581 input_dev->dev.parent = &intf->dev; 582 583 input_set_drvdata(input_dev, wacom); 584 585 input_dev->open = wacom_open; 586 input_dev->close = wacom_close; 587 588 endpoint = &intf->cur_altsetting->endpoint[0].desc; 589 590 /* Retrieve the physical and logical size for OEM devices */ 591 error = wacom_retrieve_hid_descriptor(intf, features); 592 if (error) 593 goto fail2; 594 595 strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); 596 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 ? 601 " Pen" : " Finger", 602 sizeof(wacom_wac->name)); 603 } 604 605 input_dev->name = wacom_wac->name; 606 wacom->wacom_wac = wacom_wac; 607 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); 610 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); 615 616 wacom_init_input_dev(input_dev, wacom_wac); 617 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; 624 625 error = input_register_device(wacom->dev); 626 if (error) 627 goto fail3; 628 629 /* Note that if query fails it is not a hard failure */ 630 wacom_query_tablet_data(intf, features); 631 632 usb_set_intfdata(intf, wacom); 633 return 0; 634 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); 638 kfree(wacom); 639 kfree(wacom_wac); 640 return error; 641} 642 643static void wacom_disconnect(struct usb_interface *intf) 644{ 645 struct wacom *wacom = usb_get_intfdata(intf); 646 647 usb_set_intfdata(intf, NULL); 648 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); 655 kfree(wacom); 656} 657 658static int wacom_suspend(struct usb_interface *intf, pm_message_t message) 659{ 660 struct wacom *wacom = usb_get_intfdata(intf); 661 662 mutex_lock(&wacom->lock); 663 usb_kill_urb(wacom->irq); 664 mutex_unlock(&wacom->lock); 665 666 return 0; 667} 668 669static int wacom_resume(struct usb_interface *intf) 670{ 671 struct wacom *wacom = usb_get_intfdata(intf); 672 struct wacom_features *features = &wacom->wacom_wac->features; 673 int rv; 674 675 mutex_lock(&wacom->lock); 676 677 /* switch to wacom mode first */ 678 wacom_query_tablet_data(intf, features); 679 680 if (wacom->open) 681 rv = usb_submit_urb(wacom->irq, GFP_NOIO); 682 else 683 rv = 0; 684 685 mutex_unlock(&wacom->lock); 686 687 return rv; 688} 689 690static int wacom_reset_resume(struct usb_interface *intf) 691{ 692 return wacom_resume(intf); 693} 694 695static struct usb_driver wacom_driver = { 696 .name = "wacom", 697 .id_table = wacom_ids, 698 .probe = wacom_probe, 699 .disconnect = wacom_disconnect, 700 .suspend = wacom_suspend, 701 .resume = wacom_resume, 702 .reset_resume = wacom_reset_resume, 703 .supports_autosuspend = 1, 704}; 705 706static int __init wacom_init(void) 707{ 708 int result; 709 710 result = usb_register(&wacom_driver); 711 if (result == 0) 712 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" 713 DRIVER_DESC "\n"); 714 return result; 715} 716 717static void __exit wacom_exit(void) 718{ 719 usb_deregister(&wacom_driver); 720} 721 722module_init(wacom_init); 723module_exit(wacom_exit);