|
@@ -574,23 +574,39 @@ static void wacom_remove_shared_data(struct wacom_wac *wacom)
|
|
|
static int wacom_led_control(struct wacom *wacom)
|
|
|
{
|
|
|
unsigned char *buf;
|
|
|
- int retval, led = 0;
|
|
|
+ int retval;
|
|
|
|
|
|
buf = kzalloc(9, GFP_KERNEL);
|
|
|
if (!buf)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
|
|
|
- wacom->wacom_wac.features.type == WACOM_24HD)
|
|
|
- led = (wacom->led.select[1] << 4) | 0x40;
|
|
|
-
|
|
|
- led |= wacom->led.select[0] | 0x4;
|
|
|
-
|
|
|
- buf[0] = WAC_CMD_LED_CONTROL;
|
|
|
- buf[1] = led;
|
|
|
- buf[2] = wacom->led.llv;
|
|
|
- buf[3] = wacom->led.hlv;
|
|
|
- buf[4] = wacom->led.img_lum;
|
|
|
+ if (wacom->wacom_wac.features.type >= INTUOS5S &&
|
|
|
+ wacom->wacom_wac.features.type <= INTUOS5L) {
|
|
|
+ /*
|
|
|
+ * Touch Ring and crop mark LED luminance may take on
|
|
|
+ * one of four values:
|
|
|
+ * 0 = Low; 1 = Medium; 2 = High; 3 = Off
|
|
|
+ */
|
|
|
+ int ring_led = wacom->led.select[0] & 0x03;
|
|
|
+ int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
|
|
|
+ int crop_lum = 0;
|
|
|
+
|
|
|
+ buf[0] = WAC_CMD_LED_CONTROL;
|
|
|
+ buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ int led = wacom->led.select[0] | 0x4;
|
|
|
+
|
|
|
+ if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
|
|
|
+ wacom->wacom_wac.features.type == WACOM_24HD)
|
|
|
+ led |= (wacom->led.select[1] << 4) | 0x40;
|
|
|
+
|
|
|
+ buf[0] = WAC_CMD_LED_CONTROL;
|
|
|
+ buf[1] = led;
|
|
|
+ buf[2] = wacom->led.llv;
|
|
|
+ buf[3] = wacom->led.hlv;
|
|
|
+ buf[4] = wacom->led.img_lum;
|
|
|
+ }
|
|
|
|
|
|
retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL,
|
|
|
buf, 9, WAC_CMD_RETRIES);
|
|
@@ -783,6 +799,17 @@ static struct attribute_group intuos4_led_attr_group = {
|
|
|
.attrs = intuos4_led_attrs,
|
|
|
};
|
|
|
|
|
|
+static struct attribute *intuos5_led_attrs[] = {
|
|
|
+ &dev_attr_status0_luminance.attr,
|
|
|
+ &dev_attr_status_led0_select.attr,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static struct attribute_group intuos5_led_attr_group = {
|
|
|
+ .name = "wacom_led",
|
|
|
+ .attrs = intuos5_led_attrs,
|
|
|
+};
|
|
|
+
|
|
|
static int wacom_initialize_leds(struct wacom *wacom)
|
|
|
{
|
|
|
int error;
|
|
@@ -812,6 +839,19 @@ static int wacom_initialize_leds(struct wacom *wacom)
|
|
|
&cintiq_led_attr_group);
|
|
|
break;
|
|
|
|
|
|
+ case INTUOS5S:
|
|
|
+ case INTUOS5:
|
|
|
+ case INTUOS5L:
|
|
|
+ wacom->led.select[0] = 0;
|
|
|
+ wacom->led.select[1] = 0;
|
|
|
+ wacom->led.llv = 32;
|
|
|
+ wacom->led.hlv = 0;
|
|
|
+ wacom->led.img_lum = 0;
|
|
|
+
|
|
|
+ error = sysfs_create_group(&wacom->intf->dev.kobj,
|
|
|
+ &intuos5_led_attr_group);
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
return 0;
|
|
|
}
|
|
@@ -840,6 +880,13 @@ static void wacom_destroy_leds(struct wacom *wacom)
|
|
|
sysfs_remove_group(&wacom->intf->dev.kobj,
|
|
|
&cintiq_led_attr_group);
|
|
|
break;
|
|
|
+
|
|
|
+ case INTUOS5S:
|
|
|
+ case INTUOS5:
|
|
|
+ case INTUOS5L:
|
|
|
+ sysfs_remove_group(&wacom->intf->dev.kobj,
|
|
|
+ &intuos5_led_attr_group);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|