Commit 007414e8 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Jiri Kosina
Browse files

HID: hid-led: add support for ThingM blink(1)



Add support for ThingM blink(1) and make the dedicated ThingM driver
obsolete.

Successfully tested with a blink(1) mk2.

Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 43745730
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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.
+66 −0
Original line number Diff line number Diff line
@@ -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);