Commit 06d99fcf authored by Craig McQueen's avatar Craig McQueen Committed by Lee Jones
Browse files

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: default avatarCraig McQueen <craig@mcqueen.au>
Reviewed-by: default avatarJacek Anaszewski <jacek.anaszewski@gmail.com>
Link: https://lore.kernel.org/r/20250317022630.424015-1-craig@mcqueen.au


Signed-off-by: default avatarLee Jones <lee@kernel.org>
parent 08ca89e9
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -72,6 +72,12 @@ Description:
		/sys/class/leds/<led> once a given trigger is selected. For
		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
Date:		January 2011
KernelVersion:	2.6.38
+13 −0
Original line number Diff line number Diff line
@@ -54,6 +54,11 @@ ssize_t led_trigger_write(struct file *filp, struct kobject *kobj,
		goto unlock;
	}

	if (sysfs_streq(buf, "default")) {
		led_trigger_set_default(led_cdev);
		goto unlock;
	}

	down_read(&triggers_list_lock);
	list_for_each_entry(trig, &trigger_list, next_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",
				       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) {
		bool hit;

@@ -281,6 +289,11 @@ void led_trigger_set_default(struct led_classdev *led_cdev)
	if (!led_cdev->default_trigger)
		return;

	if (!strcmp(led_cdev->default_trigger, "none")) {
		led_trigger_remove(led_cdev);
		return;
	}

	down_read(&triggers_list_lock);
	down_write(&led_cdev->trigger_lock);
	list_for_each_entry(trig, &trigger_list, next_trig) {