HID: hid-led: add support for ThingM blink(1)
authorHeiner Kallweit <hkallweit1@gmail.com>
Tue, 21 Jun 2016 19:49:29 +0000 (21:49 +0200)
committerJiri Kosina <jkosina@suse.cz>
Thu, 23 Jun 2016 06:47:41 +0000 (08:47 +0200)
Add support for ThingM blink(1) and make the dedicated ThingM driver
obsolete.

Successfully tested with a blink(1) mk2.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/Kconfig
drivers/hid/hid-led.c

index 9eeb0138ede3a50a1101ee16253c00820f8142e9..0fecf8f0bb9d76a15c4592375b0c35790cc307bc 100644 (file)
@@ -393,9 +393,10 @@ config HID_LED
        depends on HID
        depends on LEDS_CLASS
        ---help---
-       Support for simple RGB LED devices. Currently supported are the
-       Riso Kagaku Webmail Notifier and the Dream Cheeky Webmail Notifier
-       and Friends Alert.
+       Support for simple RGB LED devices. Currently supported are:
+       - Riso Kagaku Webmail Notifier
+       - Dream Cheeky Webmail Notifier and Friends Alert
+       - ThingM blink(1)
 
        To compile this driver as a module, choose M here: the
        module will be called hid-led.
index 4075f095c2a22820e38372d3c57a1d98c7325315..e11b6455429b843dec999c2c1bb46a2c61be3e6d 100644 (file)
@@ -26,6 +26,7 @@ enum hidled_report_type {
 enum hidled_type {
        RISO_KAGAKU,
        DREAM_CHEEKY,
+       THINGM,
 };
 
 static unsigned const char riso_kagaku_tbl[] = {
@@ -198,6 +199,57 @@ static int dream_cheeky_init(struct hidled_device *ldev)
        return hidled_send(ldev, buf);
 }
 
+static int _thingm_write(struct led_classdev *cdev, enum led_brightness br,
+                        u8 offset)
+{
+       struct hidled_led *led = to_hidled_led(cdev);
+       __u8 buf[MAX_REPORT_SIZE] = { [1] = 'c' };
+
+       buf[2] = led->rgb->red.cdev.brightness;
+       buf[3] = led->rgb->green.cdev.brightness;
+       buf[4] = led->rgb->blue.cdev.brightness;
+       buf[7] = led->rgb->num + offset;
+
+       return hidled_send(led->rgb->ldev, buf);
+}
+
+static int thingm_write_v1(struct led_classdev *cdev, enum led_brightness br)
+{
+       return _thingm_write(cdev, br, 0);
+}
+
+static int thingm_write(struct led_classdev *cdev, enum led_brightness br)
+{
+       return _thingm_write(cdev, br, 1);
+}
+
+static const struct hidled_config hidled_config_thingm_v1 = {
+       .name = "ThingM blink(1) v1",
+       .short_name = "thingm",
+       .max_brightness = 255,
+       .num_leds = 1,
+       .report_size = 9,
+       .report_type = RAW_REQUEST,
+       .report_id = 1,
+       .write = thingm_write_v1,
+};
+
+static int thingm_init(struct hidled_device *ldev)
+{
+       __u8 buf[MAX_REPORT_SIZE] = { [1] = 'v' };
+       int ret;
+
+       ret = hidled_recv(ldev, buf);
+       if (ret)
+               return ret;
+
+       /* Check for firmware major version 1 */
+       if (buf[3] == '1')
+               ldev->config = &hidled_config_thingm_v1;
+
+       return 0;
+}
+
 static const struct hidled_config hidled_configs[] = {
        {
                .type = RISO_KAGAKU,
@@ -222,6 +274,18 @@ static const struct hidled_config hidled_configs[] = {
                .init = dream_cheeky_init,
                .write = dream_cheeky_write,
        },
+       {
+               .type = THINGM,
+               .name = "ThingM blink(1)",
+               .short_name = "thingm",
+               .max_brightness = 255,
+               .num_leds = 2,
+               .report_size = 9,
+               .report_type = RAW_REQUEST,
+               .report_id = 1,
+               .init = thingm_init,
+               .write = thingm_write,
+       },
 };
 
 static int hidled_init_led(struct hidled_led *led, const char *color_name,
@@ -325,6 +389,8 @@ static const struct hid_device_id hidled_table[] = {
          USB_DEVICE_ID_DREAM_CHEEKY_WN), .driver_data = DREAM_CHEEKY },
        { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY,
          USB_DEVICE_ID_DREAM_CHEEKY_FA), .driver_data = DREAM_CHEEKY },
+       { HID_USB_DEVICE(USB_VENDOR_ID_THINGM,
+         USB_DEVICE_ID_BLINK1), .driver_data = THINGM },
        { }
 };
 MODULE_DEVICE_TABLE(hid, hidled_table);
This page took 0.054416 seconds and 5 git commands to generate.