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 <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>
This commit is contained in:
Thomas Weißschuh
2026-05-21 18:42:41 +02:00
committed by Lee Jones
parent 8f040b5c5e
commit b819dc7d8f

View 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;