Hi Ezequiel, On 04/04/2016 10:22 PM, Ezequiel Garcia wrote:
Now that we can mark any LED (even those in use by delayed blink triggers) to trigger on a kernel panic, let's introduce a nosleep led_trigger_event API. This API is needed to skip the delayed blink path on led_trigger_event. LEDs that are switched on a kernel panic, might be in use by a delayed blink trigger. This will be used by the panic LED trigger. Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxxxxxxxxx> --- drivers/leds/led-triggers.c | 26 ++++++++++++++++++++++---- include/linux/leds.h | 4 ++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c index f5c9d7c4d181..00b9d8497777 100644 --- a/drivers/leds/led-triggers.c +++ b/drivers/leds/led-triggers.c @@ -307,8 +307,9 @@ EXPORT_SYMBOL_GPL(devm_led_trigger_register); /* Simple LED Tigger Interface */ -void led_trigger_event(struct led_trigger *trig, - enum led_brightness brightness) +static void do_led_trigger_event(struct led_trigger *trig, + enum led_brightness brightness, + bool nosleep) { struct led_classdev *led_cdev; @@ -316,12 +317,29 @@ void led_trigger_event(struct led_trigger *trig, return; read_lock(&trig->leddev_list_lock); - list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) - led_set_brightness(led_cdev, brightness);
led_set_brightness() can gently disable blinking if passed 0 in the brightness argument. IMHO this patch is not needed then.
+ list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) { + if (nosleep) + led_set_brightness_nosleep(led_cdev, brightness); + else + led_set_brightness(led_cdev, brightness); + } read_unlock(&trig->leddev_list_lock); } + +void led_trigger_event(struct led_trigger *trig, + enum led_brightness brightness) +{ + do_led_trigger_event(trig, brightness, false); +} EXPORT_SYMBOL_GPL(led_trigger_event); +void led_trigger_event_nosleep(struct led_trigger *trig, + enum led_brightness brightness) +{ + do_led_trigger_event(trig, brightness, true); +} +EXPORT_SYMBOL_GPL(led_trigger_event_nosleep); + static void led_trigger_blink_setup(struct led_trigger *trig, unsigned long *delay_on, unsigned long *delay_off, diff --git a/include/linux/leds.h b/include/linux/leds.h index 7f1428bb1e69..d33b230ce66d 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -259,6 +259,8 @@ extern void led_trigger_register_simple(const char *name, extern void led_trigger_unregister_simple(struct led_trigger *trigger); extern void led_trigger_event(struct led_trigger *trigger, enum led_brightness event); +extern void led_trigger_event_nosleep(struct led_trigger *trigger, + enum led_brightness event); extern void led_trigger_blink(struct led_trigger *trigger, unsigned long *delay_on, unsigned long *delay_off); @@ -305,6 +307,8 @@ static inline void led_trigger_register_simple(const char *name, static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {} static inline void led_trigger_event(struct led_trigger *trigger, enum led_brightness event) {} +static inline void led_trigger_event_nosleep(struct led_trigger *trigger, + enum led_brightness event) {} static inline void led_trigger_blink(struct led_trigger *trigger, unsigned long *delay_on, unsigned long *delay_off) {}
-- Best regards, Jacek Anaszewski -- To unsubscribe from this list: send the line "unsubscribe linux-leds" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html