From: Thomas Weißschuh Date: Thu, 21 May 2026 16:42:41 +0000 (+0200) Subject: leds: core: Report ENODATA for brightness of hardware controlled LED X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b819dc7d8fb2896b07e51eba0381d61daf35edd7;p=thirdparty%2Fkernel%2Flinux.git leds: core: Report ENODATA for brightness of hardware controlled LED While the LED is controlled fully by the hardware, the value cached by the LED driver core is incorrect. Return ENODATA to userspace in this case. Signed-off-by: Thomas Weißschuh Link: https://patch.msgid.link/20260521-cros_ec-leds-hw-trigger-brightness-v1-1-6cd9d7c9671e@weissschuh.net Signed-off-by: Lee Jones --- diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index a17db3d6644f5..a51b0ed538864 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c @@ -27,12 +27,25 @@ static LIST_HEAD(leds_lookup_list); static struct workqueue_struct *leds_wq; +static bool led_trigger_is_hw_controlled(struct led_classdev *led_cdev) +{ +#ifdef CONFIG_LEDS_TRIGGERS + guard(rwsem_read)(&led_cdev->trigger_lock); + return led_cdev->trigger && led_cdev->trigger->trigger_type; +#else + return false; +#endif +} + static ssize_t brightness_show(struct device *dev, struct device_attribute *attr, char *buf) { struct led_classdev *led_cdev = dev_get_drvdata(dev); unsigned int brightness; + if (led_trigger_is_hw_controlled(led_cdev)) + return -ENODATA; + mutex_lock(&led_cdev->led_access); led_update_brightness(led_cdev); brightness = led_cdev->brightness;