48
48
/* defines to get/set USB message */
49
49
#define USB_REQ_GET_REPORT 0x01
50
50
#define USB_REQ_SET_REPORT 0x09
51
52
#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)
53
#define WAC_MSG_RETRIES 5
55
#define WAC_CMD_LED_CONTROL 0x20
56
#define WAC_CMD_ICON_START 0x21
57
#define WAC_CMD_ICON_XFER 0x23
58
#define WAC_CMD_RETRIES 10
60
static int wacom_get_report(struct usb_interface *intf, u8 type, u8 id,
61
void *buf, size_t size, unsigned int retries)
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
struct usb_device *dev = interface_to_usbdev(intf);
67
retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
69
USB_TYPE_CLASS | USB_RECIP_INTERFACE,
71
intf->altsetting[0].desc.bInterfaceNumber,
73
} while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries);
63
static int usb_set_report(struct usb_interface *intf, unsigned char type,
64
unsigned char id, void *buf, int size)
78
static int wacom_set_report(struct usb_interface *intf, u8 type, u8 id,
79
void *buf, size_t size, unsigned int retries)
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,
81
struct usb_device *dev = interface_to_usbdev(intf);
85
retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
87
USB_TYPE_CLASS | USB_RECIP_INTERFACE,
89
intf->altsetting[0].desc.bInterfaceNumber,
91
} while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries);
73
96
static void wacom_sys_irq(struct urb *urb)
319
328
int limit = 0, report_id = 2;
320
329
int error = -ENOMEM;
322
rep_data = kmalloc(2, GFP_KERNEL);
331
rep_data = kmalloc(4, GFP_KERNEL);
326
/* ask to report tablet data if it is 2FGT Tablet PC or
335
/* ask to report tablet data if it is MT Tablet PC or
327
336
* not a Tablet PC */
328
337
if (features->type == TABLETPC2FG) {
333
error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
334
report_id, rep_data, 2);
344
error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
345
report_id, rep_data, 4, 1);
336
error = usb_get_report(intf,
337
WAC_HID_FEATURE_REPORT, report_id,
339
} while ((error < 0 || rep_data[1] != 4) && limit++ < 5);
347
error = wacom_get_report(intf,
348
WAC_HID_FEATURE_REPORT,
349
report_id, rep_data, 4, 1);
350
} while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES);
340
351
} else if (features->type != TABLETPC) {
344
error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
345
report_id, rep_data, 2);
355
error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
356
report_id, rep_data, 2, 1);
347
error = usb_get_report(intf,
348
WAC_HID_FEATURE_REPORT, report_id,
350
} while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
358
error = wacom_get_report(intf,
359
WAC_HID_FEATURE_REPORT,
360
report_id, rep_data, 2, 1);
361
} while ((error < 0 || rep_data[1] != 2) && limit++ < WAC_MSG_RETRIES);
479
static int wacom_led_control(struct wacom *wacom)
484
buf = kzalloc(9, GFP_KERNEL);
488
if (wacom->wacom_wac.features.type == WACOM_21UX2)
489
led = (wacom->led.select[1] << 4) | 0x40;
491
led |= wacom->led.select[0] | 0x4;
493
buf[0] = WAC_CMD_LED_CONTROL;
495
buf[2] = wacom->led.llv;
496
buf[3] = wacom->led.hlv;
497
buf[4] = wacom->led.img_lum;
499
retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL,
500
buf, 9, WAC_CMD_RETRIES);
506
static int wacom_led_putimage(struct wacom *wacom, int button_id, const void *img)
511
buf = kzalloc(259, GFP_KERNEL);
515
/* Send 'start' command */
516
buf[0] = WAC_CMD_ICON_START;
518
retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START,
519
buf, 2, WAC_CMD_RETRIES);
523
buf[0] = WAC_CMD_ICON_XFER;
524
buf[1] = button_id & 0x07;
525
for (i = 0; i < 4; i++) {
527
memcpy(buf + 3, img + i * 256, 256);
529
retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_XFER,
530
buf, 259, WAC_CMD_RETRIES);
536
buf[0] = WAC_CMD_ICON_START;
538
wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START,
539
buf, 2, WAC_CMD_RETRIES);
546
static ssize_t wacom_led_select_store(struct device *dev, int set_id,
547
const char *buf, size_t count)
549
struct wacom *wacom = dev_get_drvdata(dev);
553
err = kstrtouint(buf, 10, &id);
557
mutex_lock(&wacom->lock);
559
wacom->led.select[set_id] = id & 0x3;
560
err = wacom_led_control(wacom);
562
mutex_unlock(&wacom->lock);
564
return err < 0 ? err : count;
567
#define DEVICE_LED_SELECT_ATTR(SET_ID) \
568
static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \
569
struct device_attribute *attr, const char *buf, size_t count) \
571
return wacom_led_select_store(dev, SET_ID, buf, count); \
573
static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \
574
struct device_attribute *attr, char *buf) \
576
struct wacom *wacom = dev_get_drvdata(dev); \
577
return snprintf(buf, 2, "%d\n", wacom->led.select[SET_ID]); \
579
static DEVICE_ATTR(status_led##SET_ID##_select, S_IWUSR | S_IRUSR, \
580
wacom_led##SET_ID##_select_show, \
581
wacom_led##SET_ID##_select_store)
583
DEVICE_LED_SELECT_ATTR(0);
584
DEVICE_LED_SELECT_ATTR(1);
586
static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest,
587
const char *buf, size_t count)
592
err = kstrtouint(buf, 10, &value);
596
mutex_lock(&wacom->lock);
598
*dest = value & 0x7f;
599
err = wacom_led_control(wacom);
601
mutex_unlock(&wacom->lock);
603
return err < 0 ? err : count;
606
#define DEVICE_LUMINANCE_ATTR(name, field) \
607
static ssize_t wacom_##name##_luminance_store(struct device *dev, \
608
struct device_attribute *attr, const char *buf, size_t count) \
610
struct wacom *wacom = dev_get_drvdata(dev); \
612
return wacom_luminance_store(wacom, &wacom->led.field, \
615
static DEVICE_ATTR(name##_luminance, S_IWUSR, \
616
NULL, wacom_##name##_luminance_store)
618
DEVICE_LUMINANCE_ATTR(status0, llv);
619
DEVICE_LUMINANCE_ATTR(status1, hlv);
620
DEVICE_LUMINANCE_ATTR(buttons, img_lum);
622
static ssize_t wacom_button_image_store(struct device *dev, int button_id,
623
const char *buf, size_t count)
625
struct wacom *wacom = dev_get_drvdata(dev);
631
mutex_lock(&wacom->lock);
633
err = wacom_led_putimage(wacom, button_id, buf);
635
mutex_unlock(&wacom->lock);
637
return err < 0 ? err : count;
640
#define DEVICE_BTNIMG_ATTR(BUTTON_ID) \
641
static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \
642
struct device_attribute *attr, const char *buf, size_t count) \
644
return wacom_button_image_store(dev, BUTTON_ID, buf, count); \
646
static DEVICE_ATTR(button##BUTTON_ID##_rawimg, S_IWUSR, \
647
NULL, wacom_btnimg##BUTTON_ID##_store)
649
DEVICE_BTNIMG_ATTR(0);
650
DEVICE_BTNIMG_ATTR(1);
651
DEVICE_BTNIMG_ATTR(2);
652
DEVICE_BTNIMG_ATTR(3);
653
DEVICE_BTNIMG_ATTR(4);
654
DEVICE_BTNIMG_ATTR(5);
655
DEVICE_BTNIMG_ATTR(6);
656
DEVICE_BTNIMG_ATTR(7);
658
static struct attribute *cintiq_led_attrs[] = {
659
&dev_attr_status_led0_select.attr,
660
&dev_attr_status_led1_select.attr,
664
static struct attribute_group cintiq_led_attr_group = {
666
.attrs = cintiq_led_attrs,
669
static struct attribute *intuos4_led_attrs[] = {
670
&dev_attr_status0_luminance.attr,
671
&dev_attr_status1_luminance.attr,
672
&dev_attr_status_led0_select.attr,
673
&dev_attr_buttons_luminance.attr,
674
&dev_attr_button0_rawimg.attr,
675
&dev_attr_button1_rawimg.attr,
676
&dev_attr_button2_rawimg.attr,
677
&dev_attr_button3_rawimg.attr,
678
&dev_attr_button4_rawimg.attr,
679
&dev_attr_button5_rawimg.attr,
680
&dev_attr_button6_rawimg.attr,
681
&dev_attr_button7_rawimg.attr,
685
static struct attribute_group intuos4_led_attr_group = {
687
.attrs = intuos4_led_attrs,
690
static int wacom_initialize_leds(struct wacom *wacom)
694
/* Initialize default values */
695
switch (wacom->wacom_wac.features.type) {
698
wacom->led.select[0] = 0;
699
wacom->led.select[1] = 0;
702
wacom->led.img_lum = 10;
703
error = sysfs_create_group(&wacom->intf->dev.kobj,
704
&intuos4_led_attr_group);
708
wacom->led.select[0] = 0;
709
wacom->led.select[1] = 0;
712
wacom->led.img_lum = 0;
714
error = sysfs_create_group(&wacom->intf->dev.kobj,
715
&cintiq_led_attr_group);
723
dev_err(&wacom->intf->dev,
724
"cannot create sysfs group err: %d\n", error);
727
wacom_led_control(wacom);
732
static void wacom_destroy_leds(struct wacom *wacom)
734
switch (wacom->wacom_wac.features.type) {
737
sysfs_remove_group(&wacom->intf->dev.kobj,
738
&intuos4_led_attr_group);
742
sysfs_remove_group(&wacom->intf->dev.kobj,
743
&cintiq_led_attr_group);
468
748
static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
470
750
struct usb_device *dev = interface_to_usbdev(intf);