[PATCH RFC] leds: core: Report ENODATA for brightness of hardware controlled LED

Thomas Weißschuh posted 1 patch 3 days, 2 hours ago
drivers/leds/led-class.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
[PATCH RFC] leds: core: Report ENODATA for brightness of hardware controlled LED
Posted by Thomas Weißschuh 3 days, 2 hours ago
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>
---
 drivers/leds/led-class.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index 9e14ae588f78..a88e274228e5 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;

---
base-commit: 254f49634ee16a731174d2ae34bc50bd5f45e731
change-id: 20260404-cros_ec-leds-hw-trigger-brightness-124ff8ce5dd6

Best regards,
--  
Thomas Weißschuh <linux@weissschuh.net>