diff mbox

mfd: axp20x: Add a 500ms delay at the end of axp20x_power_off

Message ID 1465134648-27113-1-git-send-email-hdegoede@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Hans de Goede June 5, 2016, 1:50 p.m. UTC
The kernel expects the power_off function to not return, and if it does
it panics. At a slight delay after the i2c write which turns off power
through the pmic, to give capacitors etc. some time to drain.

Without this the kernel lives on long enough after the poweroff to
print the following on the serial console on my Mele A1000G quad:

[  248.583588] reboot: Power down
[  248.600490] Kernel pa

With the delay the start of printing "Kernel panic" is gone.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/mfd/axp20x.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Chen-Yu Tsai June 5, 2016, 3:03 p.m. UTC | #1
On Sun, Jun 5, 2016 at 9:50 PM, Hans de Goede <hdegoede@redhat.com> wrote:
> The kernel expects the power_off function to not return, and if it does
> it panics. At a slight delay after the i2c write which turns off power

             ^^^ Add?

Otherwise,

Acked-by: Chen-Yu Tsai <wens@csie.org>

> through the pmic, to give capacitors etc. some time to drain.
>
> Without this the kernel lives on long enough after the poweroff to
> print the following on the serial console on my Mele A1000G quad:
>
> [  248.583588] reboot: Power down
> [  248.600490] Kernel pa
>
> With the delay the start of printing "Kernel panic" is gone.
>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  drivers/mfd/axp20x.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 6364dab..fd80b09 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -17,6 +17,7 @@
>   */
>
>  #include <linux/err.h>
> +#include <linux/delay.h>
>  #include <linux/interrupt.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> @@ -677,6 +678,9 @@ static void axp20x_power_off(void)
>
>         regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
>                      AXP20X_OFF);
> +
> +       /* Give capacitors etc. time to drain to avoid kernel panic msg. */
> +       msleep(500);
>  }
>
>  int axp20x_match_device(struct axp20x_dev *axp20x)
> --
> 2.7.4
>
Lee Jones June 8, 2016, 3:42 p.m. UTC | #2
On Sun, 05 Jun 2016, Hans de Goede wrote:

> The kernel expects the power_off function to not return, and if it does
> it panics. At a slight delay after the i2c write which turns off power
> through the pmic, to give capacitors etc. some time to drain.
> 
> Without this the kernel lives on long enough after the poweroff to
> print the following on the serial console on my Mele A1000G quad:
> 
> [  248.583588] reboot: Power down
> [  248.600490] Kernel pa
> 
> With the delay the start of printing "Kernel panic" is gone.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  drivers/mfd/axp20x.c | 4 ++++
>  1 file changed, 4 insertions(+)

Applied, thanks.

> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 6364dab..fd80b09 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -17,6 +17,7 @@
>   */
>  
>  #include <linux/err.h>
> +#include <linux/delay.h>
>  #include <linux/interrupt.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> @@ -677,6 +678,9 @@ static void axp20x_power_off(void)
>  
>  	regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
>  		     AXP20X_OFF);
> +
> +	/* Give capacitors etc. time to drain to avoid kernel panic msg. */
> +	msleep(500);
>  }
>  
>  int axp20x_match_device(struct axp20x_dev *axp20x)
diff mbox

Patch

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 6364dab..fd80b09 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -17,6 +17,7 @@ 
  */
 
 #include <linux/err.h>
+#include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -677,6 +678,9 @@  static void axp20x_power_off(void)
 
 	regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
 		     AXP20X_OFF);
+
+	/* Give capacitors etc. time to drain to avoid kernel panic msg. */
+	msleep(500);
 }
 
 int axp20x_match_device(struct axp20x_dev *axp20x)