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 v3.8-rc5 1450 lines 36 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_wac.h" 15#include "wacom.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_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/* defines to get/set USB message */ 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 /* success */ 109 break; 110 case -ECONNRESET: 111 case -ENOENT: 112 case -ESHUTDOWN: 113 /* this urb is terminated, clean up */ 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 * Calculate the resolution of the X or Y axis, given appropriate HID data. 176 * This function is little more than hidinput_calc_abs_res stripped down. 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 /* Check if the extents are sane */ 184 if (logical_extents <= 0 || physical_extents <= 0) 185 return 0; 186 187 /* Get signed value of nybble-sized twos-compliment exponent */ 188 unit_exponent = exponent; 189 if (unit_exponent > 7) 190 unit_exponent -= 16; 191 192 /* Convert physical_extents to millimeters */ 193 if (unit == 0x11) { /* If centimeters */ 194 unit_exponent += 1; 195 } else if (unit == 0x13) { /* If inches */ 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 /* Apply negative unit exponent */ 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 /* Apply positive unit exponent */ 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 /* Calculate resolution */ 221 return logical_extents / physical_extents; 222} 223 224/* 225 * The physical dimension specified by the HID descriptor is likely not in 226 * the "100th of a mm" units expected by wacom_calculate_touch_res. This 227 * function adjusts the value of [xy]_phy based on the unit and exponent 228 * provided by the HID descriptor. If an error occurs durring conversion 229 * (e.g. from the unit being left unspecified) [xy]_phy is not modified. 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 * Static values for max X/Y and resolution of Pen interface is stored in 246 * features. This mean physical size of active area can be computed. 247 * This is useful to do when Pen and Touch have same active area of tablet. 248 * This means for Touch device, we only need to find max X/Y value and we 249 * have enough information to compute resolution of touch. 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 /* Logical collection is only used by 3rd gen Bamboo Touch */ 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 * Interface Descriptor of wacom devices can be incomplete and 301 * inconsistent so wacom_features table is used to store stylus 302 * device's packet lengths, various maximum values, and tablet 303 * resolution based on product ID's. 304 * 305 * For devices that contain 2 interfaces, wacom_features table is 306 * inaccurate for the touch interface. Since the Interface Descriptor 307 * for touch interfaces has pretty complete data, this function exists 308 * to query tablet for this missing information instead of hard coding in 309 * an additional table. 310 * 311 * A typical Interface Descriptor for a stylus will contain a 312 * boot mouse application collection that is not of interest and this 313 * function will ignore it. 314 * 315 * It also contains a digitizer application collection that also is not 316 * of interest since any information it contains would be duplicate 317 * of what is in wacom_features. Usually it defines a report of an array 318 * of bytes that could be used as max length of the stylus packet returned. 319 * If it happens to define a Digitizer-Stylus Physical Collection then 320 * the X and Y logical values contain valid data but it is ignored. 321 * 322 * A typical Interface Descriptor for a touch interface will contain a 323 * Digitizer-Finger Physical Collection which will define both logical 324 * X/Y maximum as well as the physical size of tablet. Since touch 325 * interfaces haven't supported pressure or distance, this is enough 326 * information to override invalid values in the wacom_features table. 327 * 328 * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical 329 * Collection. Instead they define a Logical Collection with a single 330 * Logical Maximum for both X and Y. 331 * 332 * Intuos5 touch interface does not contain useful data. We deal with 333 * this after returning from this function. 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 /* result has to be defined as int for some devices */ 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 /* retrive report descriptors */ 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, /* interface */ 357 report, 358 hid_desc->wDescriptorLength, 359 5000); /* 5 secs */ 360 } while (result < 0 && limit++ < WAC_MSG_RETRIES); 361 362 /* No need to parse the Descriptor. It isn't an error though */ 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 /* penabled only accepts exact bytes of data */ 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 * Requiring Stylus Usage will ignore boot mouse 507 * X/Y values and some cases of invalid Digitizer X/Y 508 * values commonly reported. 509 */ 510 case HID_USAGE_STYLUS: 511 pen = 1; 512 i++; 513 break; 514 515 case HID_USAGE_CONTACTMAX: 516 /* leave touch_max as is if predefined */ 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 /* reset UsagePage and Finger */ 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 rep_data[0] = report_id; 557 rep_data[1] = mode; 558 559 do { 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 * Switch the tablet into its most-capable mode. Wacom tablets are 574 * typically configured to power-up in a mode which sends mouse-like 575 * reports to the OS. To get absolute position, pressure data, etc. 576 * from the tablet, it is necessary to switch the tablet out of this 577 * mode and into one which sends the full range of tablet data. 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 /* MT Tablet PC touch */ 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 /* default features */ 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 * The wireless device HID is basic and layout conflicts with 614 * other tablets (monitor and touch interface can look like pen). 615 * Skip the query for this type and modify defaults based on 616 * interface number. 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 /* only devices that support touch need to retrieve the info */ 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 * Touch Ring and crop mark LED luminance may take on 763 * one of four values: 764 * 0 = Low; 1 = Medium; 2 = High; 3 = Off 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 /* Send 'start' command */ 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 /* Send 'stop' */ 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 /* Initialize default values */ 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 * Regardless if this is a disconnect or a new tablet, 1177 * remove any existing input and battery devices. 1178 */ 1179 1180 wacom_destroy_battery(wacom); 1181 1182 /* Stylus interface */ 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 /* Touch interface */ 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 /* Stylus interface */ 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 /* Touch interface */ 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 /* Retrieve the physical and logical size for touch devices */ 1301 error = wacom_retrieve_hid_descriptor(intf, features); 1302 if (error) 1303 goto fail3; 1304 1305 /* 1306 * Intuos5 has no useful data about its touch interface in its 1307 * HID descriptor. If this is the touch interface (wMaxPacketSize 1308 * of WACOM_PKGLEN_BBTOUCH3), override the table values. 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 /* Append the device type to the name */ 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 /* Note that if query fails it is not a hard failure */ 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 /* switch to wacom mode first */ 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);