Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: trigger: Store brightness set by led_trigger_event()

If a simple trigger is assigned to a LED, then the LED may be off until
the next led_trigger_event() call. This may be an issue for simple
triggers with rare led_trigger_event() calls, e.g. power supply
charging indicators (drivers/power/supply/power_supply_leds.c).
Therefore persist the brightness value of the last led_trigger_event()
call and use this value if the trigger is assigned to a LED.
In addition add a getter for the trigger brightness value.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/b1358b25-3f30-458d-8240-5705ae007a8a@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Heiner Kallweit and committed by
Lee Jones
822c91e7 4cece764

+19 -2
+4 -2
drivers/leds/led-triggers.c
··· 194 194 spin_unlock(&trig->leddev_list_lock); 195 195 led_cdev->trigger = trig; 196 196 197 + ret = 0; 197 198 if (trig->activate) 198 199 ret = trig->activate(led_cdev); 199 200 else 200 - ret = 0; 201 - 201 + led_set_brightness(led_cdev, trig->brightness); 202 202 if (ret) 203 203 goto err_activate; 204 204 ··· 386 386 387 387 if (!trig) 388 388 return; 389 + 390 + trig->brightness = brightness; 389 391 390 392 rcu_read_lock(); 391 393 list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list)
+15
include/linux/leds.h
··· 455 455 int (*activate)(struct led_classdev *led_cdev); 456 456 void (*deactivate)(struct led_classdev *led_cdev); 457 457 458 + /* Brightness set by led_trigger_event */ 459 + enum led_brightness brightness; 460 + 458 461 /* LED-private triggers have this set */ 459 462 struct led_hw_trigger_type *trigger_type; 460 463 ··· 511 508 return led_cdev->trigger_data; 512 509 } 513 510 511 + static inline enum led_brightness 512 + led_trigger_get_brightness(const struct led_trigger *trigger) 513 + { 514 + return trigger ? trigger->brightness : LED_OFF; 515 + } 516 + 514 517 #define module_led_trigger(__led_trigger) \ 515 518 module_driver(__led_trigger, led_trigger_register, \ 516 519 led_trigger_unregister) ··· 551 542 static inline void *led_get_trigger_data(struct led_classdev *led_cdev) 552 543 { 553 544 return NULL; 545 + } 546 + 547 + static inline enum led_brightness 548 + led_trigger_get_brightness(const struct led_trigger *trigger) 549 + { 550 + return LED_OFF; 554 551 } 555 552 556 553 #endif /* CONFIG_LEDS_TRIGGERS */