]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
leds: core: Report ENODATA for brightness of hardware controlled LED
authorThomas Weißschuh <linux@weissschuh.net>
Thu, 21 May 2026 16:42:41 +0000 (18:42 +0200)
committerLee Jones <lee@kernel.org>
Wed, 17 Jun 2026 10:29:42 +0000 (11:29 +0100)
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 <linux@weissschuh.net>
Link: https://patch.msgid.link/20260521-cros_ec-leds-hw-trigger-brightness-v1-1-6cd9d7c9671e@weissschuh.net
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/led-class.c

index a17db3d6644f5d62a9a4606ff28ea19a9a3190fb..a51b0ed5388644e41c2050eabf528ac1da7401e6 100644 (file)
@@ -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;