leds: led-triggers: Improvements for default trigger

Accept "default" written to sysfs trigger attr.
If the text "default" is written to the LED's sysfs 'trigger' attr, then
call led_trigger_set_default() to set the LED to its default trigger.

If the default trigger is set to "none", then led_trigger_set_default()
will remove a trigger. This is in contrast to the default trigger being
unset, in which case led_trigger_set_default() does nothing.

Signed-off-by: Craig McQueen <craig@mcqueen.au>
Reviewed-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
Link: https://lore.kernel.org/r/20250317022630.424015-1-craig@mcqueen.au
Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
Craig McQueen 2025-03-17 13:26:30 +11:00 committed by Lee Jones
parent 08ca89e986
commit 06d99fcf1f
2 changed files with 19 additions and 0 deletions

View File

@ -72,6 +72,12 @@ Description:
/sys/class/leds/<led> once a given trigger is selected. For /sys/class/leds/<led> once a given trigger is selected. For
their documentation see `sysfs-class-led-trigger-*`. their documentation see `sysfs-class-led-trigger-*`.
Writing "none" removes the trigger for this LED.
Writing "default" sets the trigger to the LED's default trigger
(which would often be configured in the device tree for the
hardware).
What: /sys/class/leds/<led>/inverted What: /sys/class/leds/<led>/inverted
Date: January 2011 Date: January 2011
KernelVersion: 2.6.38 KernelVersion: 2.6.38

View File

@ -54,6 +54,11 @@ ssize_t led_trigger_write(struct file *filp, struct kobject *kobj,
goto unlock; goto unlock;
} }
if (sysfs_streq(buf, "default")) {
led_trigger_set_default(led_cdev);
goto unlock;
}
down_read(&triggers_list_lock); down_read(&triggers_list_lock);
list_for_each_entry(trig, &trigger_list, next_trig) { list_for_each_entry(trig, &trigger_list, next_trig) {
if (sysfs_streq(buf, trig->name) && trigger_relevant(led_cdev, trig)) { if (sysfs_streq(buf, trig->name) && trigger_relevant(led_cdev, trig)) {
@ -98,6 +103,9 @@ static int led_trigger_format(char *buf, size_t size,
int len = led_trigger_snprintf(buf, size, "%s", int len = led_trigger_snprintf(buf, size, "%s",
led_cdev->trigger ? "none" : "[none]"); led_cdev->trigger ? "none" : "[none]");
if (led_cdev->default_trigger)
len += led_trigger_snprintf(buf + len, size - len, " default");
list_for_each_entry(trig, &trigger_list, next_trig) { list_for_each_entry(trig, &trigger_list, next_trig) {
bool hit; bool hit;
@ -281,6 +289,11 @@ void led_trigger_set_default(struct led_classdev *led_cdev)
if (!led_cdev->default_trigger) if (!led_cdev->default_trigger)
return; return;
if (!strcmp(led_cdev->default_trigger, "none")) {
led_trigger_remove(led_cdev);
return;
}
down_read(&triggers_list_lock); down_read(&triggers_list_lock);
down_write(&led_cdev->trigger_lock); down_write(&led_cdev->trigger_lock);
list_for_each_entry(trig, &trigger_list, next_trig) { list_for_each_entry(trig, &trigger_list, next_trig) {