This functionality is similar to heartbeat and activity triggers and turns the timer-triggered LEDs off right before reboot. It's configurable via new module parameter "reboot_off" to preserve original behaviour. Signed-off-by: Alexander Sverdlin <alexander.sverdlin@xxxxxxxxx> --- drivers/leds/trigger/ledtrig-timer.c | 39 +++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/leds/trigger/ledtrig-timer.c b/drivers/leds/trigger/ledtrig-timer.c index 7c14983781ee..3eadcb0a629a 100644 --- a/drivers/leds/trigger/ledtrig-timer.c +++ b/drivers/leds/trigger/ledtrig-timer.c @@ -16,6 +16,11 @@ #include <linux/device.h> #include <linux/ctype.h> #include <linux/leds.h> +#include <linux/reboot.h> + +static bool reboot_off; +module_param(reboot_off, bool, 0444); +MODULE_PARM_DESC(reboot_off, "Switch LED off on reboot"); static ssize_t led_delay_on_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -97,7 +102,39 @@ static struct led_trigger timer_led_trigger = { .deactivate = timer_trig_deactivate, .groups = timer_trig_groups, }; -module_led_trigger(timer_led_trigger); + +static int timer_reboot_notifier(struct notifier_block *nb, unsigned long code, + void *unused) +{ + led_trigger_unregister(&timer_led_trigger); + return NOTIFY_DONE; +} + +static struct notifier_block timer_reboot_nb = { + .notifier_call = timer_reboot_notifier, +}; + +static int __init timer_trig_init(void) +{ + int ret; + + ret = led_trigger_register(&timer_led_trigger); + if (ret) + return ret; + if (reboot_off) + register_reboot_notifier(&timer_reboot_nb); + return 0; +} + +static void __exit timer_trig_exit(void) +{ + /* Not afraid of -ENOENT */ + unregister_reboot_notifier(&timer_reboot_nb); + led_trigger_unregister(&timer_led_trigger); +} + +module_init(timer_trig_init); +module_exit(timer_trig_exit); MODULE_AUTHOR("Richard Purdie <rpurdie@xxxxxxxxxxxxxx>"); MODULE_DESCRIPTION("Timer LED trigger"); -- 2.19.1