Skip to content

Commit 822c91e

Browse files
hkallweitlag-linaro
authored andcommitted
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 <[email protected]> Reviewed-by: Takashi Iwai <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent 4cece76 commit 822c91e

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

drivers/leds/led-triggers.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,11 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)
194194
spin_unlock(&trig->leddev_list_lock);
195195
led_cdev->trigger = trig;
196196

197+
ret = 0;
197198
if (trig->activate)
198199
ret = trig->activate(led_cdev);
199200
else
200-
ret = 0;
201-
201+
led_set_brightness(led_cdev, trig->brightness);
202202
if (ret)
203203
goto err_activate;
204204

@@ -387,6 +387,8 @@ void led_trigger_event(struct led_trigger *trig,
387387
if (!trig)
388388
return;
389389

390+
trig->brightness = brightness;
391+
390392
rcu_read_lock();
391393
list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list)
392394
led_set_brightness(led_cdev, brightness);

include/linux/leds.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,9 @@ struct led_trigger {
455455
int (*activate)(struct led_classdev *led_cdev);
456456
void (*deactivate)(struct led_classdev *led_cdev);
457457

458+
/* Brightness set by led_trigger_event */
459+
enum led_brightness brightness;
460+
458461
/* LED-private triggers have this set */
459462
struct led_hw_trigger_type *trigger_type;
460463

@@ -508,6 +511,12 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
508511
return led_cdev->trigger_data;
509512
}
510513

514+
static inline enum led_brightness
515+
led_trigger_get_brightness(const struct led_trigger *trigger)
516+
{
517+
return trigger ? trigger->brightness : LED_OFF;
518+
}
519+
511520
#define module_led_trigger(__led_trigger) \
512521
module_driver(__led_trigger, led_trigger_register, \
513522
led_trigger_unregister)
@@ -544,6 +553,12 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
544553
return NULL;
545554
}
546555

556+
static inline enum led_brightness
557+
led_trigger_get_brightness(const struct led_trigger *trigger)
558+
{
559+
return LED_OFF;
560+
}
561+
547562
#endif /* CONFIG_LEDS_TRIGGERS */
548563

549564
/* Trigger specific enum */

0 commit comments

Comments
 (0)