On the device Logitech Litra Glow it is possible to set not only the brightness but also the color temperature (both via usb as well as via hardware). I am currently trying to add support for the device - and expose it via LED - into the kernel. So to support all device capabilities I am proposing to extend LEDs by color temperature: And initial patch for the headers: diff --git a/include/linux/leds.h b/include/linux/leds.h index ba4861ec7..494eab49b 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -72,6 +72,9 @@ struct led_classdev { unsigned int brightness; unsigned int max_brightness; int flags; + unsigned int color_temperature; + unsigned int min_color_temperature; + unsigned int max_color_temperature; /* Lower 16 bits reflect status */ #define LED_SUSPENDED BIT(0) @@ -123,6 +126,21 @@ struct led_classdev { unsigned long *delay_on, unsigned long *delay_off); + /* Set LED color temperature + * Must not sleep. Use color_temperature_set_blocking for drivers + * that can sleep while setting color temperature. + */ + void (*color_temperature_set)(struct led_classdev *led_cdev, + unsigned int color_temperature); + /* + * Set LED color temperature immediately - it can block the caller for + * the time required for accessing a LED device register. + */ + int (*color_temperature_set_blocking)(struct led_classdev *led_cdev, + unsigned int color_temperature); + /* Get LED color temperature */ + unsigned int (*color_temperature_get)(struct led_classdev *led_cdev); + int (*pattern_set)(struct led_classdev *led_cdev, struct led_pattern *pattern, u32 len, int repeat); int (*pattern_clear)(struct led_classdev *led_cdev); @@ -140,6 +158,7 @@ struct led_classdev { void (*flash_resume)(struct led_classdev *led_cdev); struct work_struct set_brightness_work; + struct work_struct set_color_temperature_work; int delayed_set_value; #ifdef CONFIG_LEDS_TRIGGERS @@ -160,6 +179,10 @@ struct led_classdev { int brightness_hw_changed; struct kernfs_node *brightness_hw_changed_kn; #endif +#ifdef CONFIG_LEDS_COLOR_TEMPERATURE_HW_CHANGED + int color_temperature_hw_changed; + struct kernfs_node *color_temperature_hw_changed_kn; +#endif /* Ensures consistent access to the LED Flash Class device */ struct mutex led_access; @@ -574,6 +597,14 @@ void led_classdev_notify_brightness_hw_changed( static inline void led_classdev_notify_brightness_hw_changed( struct led_classdev *led_cdev, enum led_brightness brightness) { } #endif +#ifdef CONFIG_LEDS_COLOR_TEMPERATURE_HW_CHANGED +void led_classdev_notify_color_temperature_hw_changed( + struct led_classdev *led_cdev, unsigned int color_temperature); +#else +static inline void led_classdev_notify_color_temperature_hw_changed( + struct led_classdev *led_cdev, unsigned int color_temperature) { } +#endif + /** * struct led_pattern - pattern interval settings What do you think? Cheers