Input: wacom - add Intuos5 Touch Ring LED support
authorJason Gerecke <killertofu@gmail.com>
Tue, 3 Apr 2012 22:50:37 +0000 (15:50 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 4 Apr 2012 16:25:42 +0000 (09:25 -0700)
The Touch Ring LEDs on Intuos5 tablets use a different report
format which supports only 4 levels of brightness. We remap
the 7-bit value obtained from sysfs to an appropriate value
for the tablet. Control of the crop mark LEDs (new to the I5)
is left for a later patch.

Signed-off-by: Jason Gerecke <killertofu@gmail.com>
Reviewed-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Documentation/ABI/testing/sysfs-driver-wacom
drivers/input/tablet/wacom_sys.c

index 0130d6683c14eecf01c3a9b6226aec0549487a81..5e9cbdc7486eb29402f53f087d2b7f3724b0cffb 100644 (file)
@@ -15,9 +15,10 @@ Contact:     linux-input@vger.kernel.org
 Description:
                Attribute group for control of the status LEDs and the OLEDs.
                This attribute group is only available for Intuos 4 M, L,
-               and XL (with LEDs and OLEDs) and Cintiq 21UX2 and Cintiq 24HD
-               (LEDs only). Therefore its presence implicitly signifies the
-               presence of said LEDs and OLEDs on the tablet device.
+               and XL (with LEDs and OLEDs), Intuos 5 (LEDs only), and Cintiq
+               21UX2 and Cintiq 24HD (LEDs only). Therefore its presence
+               implicitly signifies the presence of said LEDs and OLEDs on the
+               tablet device.
 
 What:          /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status0_luminance
 Date:          August 2011
@@ -40,10 +41,10 @@ What:               /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led0
 Date:          August 2011
 Contact:       linux-input@vger.kernel.org
 Description:
-               Writing to this file sets which one of the four (for Intuos 4)
-               or of the right four (for Cintiq 21UX2 and Cintiq 24HD) status
-               LEDs is active (0..3). The other three LEDs on the same side are
-               always inactive.
+               Writing to this file sets which one of the four (for Intuos 4
+               and Intuos 5) or of the right four (for Cintiq 21UX2 and Cintiq
+               24HD) status LEDs is active (0..3). The other three LEDs on the
+               same side are always inactive.
 
 What:          /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led1_select
 Date:          September 2011
index 19ba58640dc2d3a12e96d24825ae96dc83b07fa8..d7713388a953d518d24d672649e5e1bcf24e8aef 100644 (file)
@@ -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;
        }
 }