From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jacek Anaszewski Subject: Re: [PATCH] leds: handle suspend/resume in heartbeat trigger Date: Fri, 03 Jun 2016 10:41:08 +0200 Message-ID: <575142A4.5030603@samsung.com> References: <1464874906-13120-1-git-send-email-linus.walleij@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mailout2.w1.samsung.com ([210.118.77.12]:9218 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752463AbcFCIlN (ORCPT ); Fri, 3 Jun 2016 04:41:13 -0400 In-reply-to: <1464874906-13120-1-git-send-email-linus.walleij@linaro.org> Sender: linux-leds-owner@vger.kernel.org List-Id: linux-leds@vger.kernel.org To: Linus Walleij Cc: Richard Purdie , linux-leds@vger.kernel.org, linux-pm@vger.kernel.org, Ulf Hansson Hi Linus, Thanks for the patch, applied. Best regards, Jacek Anaszewski On 06/02/2016 03:41 PM, Linus Walleij wrote: > The following phenomena was observed: when suspending the > system, sometimes the heartbeat LED was left on, glowing and > wasting power while the rest of the system is asleep, also > disturbing power dissapation measures on the odd suspend > cycle when it's left on. > > Clearly this is not how we want the heartbeat trigger to > work: it should turn off and leave the LED off during > system suspend. > > This removes the heartbeat trigger when preparing suspend and > restores it during resume. The trigger code will make sure all > LEDs are left in OFF state after removing the trigger, and > will re-enable the trigger on all LEDs after resuming. > > Cc: linux-pm@vger.kernel.org > Cc: Ulf Hansson > Signed-off-by: Linus Walleij > --- > drivers/leds/trigger/ledtrig-heartbeat.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/leds/trigger/ledtrig-heartbeat.c b/drivers/leds/trigger/ledtrig-heartbeat.c > index 410c39c62dc7..c80e91152b6b 100644 > --- a/drivers/leds/trigger/ledtrig-heartbeat.c > +++ b/drivers/leds/trigger/ledtrig-heartbeat.c > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > #include "../leds.h" > > static int panic_heartbeats; > @@ -154,6 +155,26 @@ static struct led_trigger heartbeat_led_trigger = { > .deactivate = heartbeat_trig_deactivate, > }; > > +static int heartbeat_pm_notifier(struct notifier_block *nb, > + unsigned long pm_event, void *unused) > +{ > + int rc; > + > + switch (pm_event) { > + case PM_SUSPEND_PREPARE: > + led_trigger_unregister(&heartbeat_led_trigger); > + break; > + case PM_POST_SUSPEND: > + rc = led_trigger_register(&heartbeat_led_trigger); > + if (rc) > + pr_err("could not re-register heartbeat trigger\n"); > + break; > + default: > + break; > + } > + return NOTIFY_DONE; > +} > + > static int heartbeat_reboot_notifier(struct notifier_block *nb, > unsigned long code, void *unused) > { > @@ -168,6 +189,10 @@ static int heartbeat_panic_notifier(struct notifier_block *nb, > return NOTIFY_DONE; > } > > +static struct notifier_block heartbeat_pm_nb = { > + .notifier_call = heartbeat_pm_notifier, > +}; > + > static struct notifier_block heartbeat_reboot_nb = { > .notifier_call = heartbeat_reboot_notifier, > }; > @@ -184,12 +209,14 @@ static int __init heartbeat_trig_init(void) > atomic_notifier_chain_register(&panic_notifier_list, > &heartbeat_panic_nb); > register_reboot_notifier(&heartbeat_reboot_nb); > + register_pm_notifier(&heartbeat_pm_nb); > } > return rc; > } > > static void __exit heartbeat_trig_exit(void) > { > + unregister_pm_notifier(&heartbeat_pm_nb); > unregister_reboot_notifier(&heartbeat_reboot_nb); > atomic_notifier_chain_unregister(&panic_notifier_list, > &heartbeat_panic_nb); >