diff options
author | Oleksij Rempel <o.rempel@pengutronix.de> | 2018-08-02 06:34:21 -0400 |
---|---|---|
committer | Shawn Guo <shawnguo@kernel.org> | 2018-09-11 21:10:43 -0400 |
commit | 8148d2136002da2e2887caf6a07bbd9c033f14f3 (patch) | |
tree | 33b725ef68e939b0ea3fd57222af6ce3b91f29a0 | |
parent | 9454a0caff6ac6d2a5ea17dd624dc13387bbfcd3 (diff) |
ARM: imx6: register pm_power_off handler if "fsl,pmic-stby-poweroff" is set
One of the Freescale recommended sequences for power off with external
PMIC is the following:
...
3. SoC is programming PMIC for power off when standby is asserted.
4. In CCM STOP mode, Standby is asserted, PMIC gates SoC supplies.
See:
http://www.nxp.com/assets/documents/data/en/reference-manuals/IMX6DQRM.pdf
page 5083
This patch implements step 4. of this sequence.
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>
-rw-r--r-- | arch/arm/mach-imx/pm-imx6.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c index b08e407d8d96..529f4b5bbd3a 100644 --- a/arch/arm/mach-imx/pm-imx6.c +++ b/arch/arm/mach-imx/pm-imx6.c | |||
@@ -618,6 +618,28 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdata | |||
618 | IMX6Q_GPR1_GINT); | 618 | IMX6Q_GPR1_GINT); |
619 | } | 619 | } |
620 | 620 | ||
621 | static void imx6_pm_stby_poweroff(void) | ||
622 | { | ||
623 | imx6_set_lpm(STOP_POWER_OFF); | ||
624 | imx6q_suspend_finish(0); | ||
625 | |||
626 | mdelay(1000); | ||
627 | |||
628 | pr_emerg("Unable to poweroff system\n"); | ||
629 | } | ||
630 | |||
631 | static int imx6_pm_stby_poweroff_probe(void) | ||
632 | { | ||
633 | if (pm_power_off) { | ||
634 | pr_warn("%s: pm_power_off already claimed %p %pf!\n", | ||
635 | __func__, pm_power_off, pm_power_off); | ||
636 | return -EBUSY; | ||
637 | } | ||
638 | |||
639 | pm_power_off = imx6_pm_stby_poweroff; | ||
640 | return 0; | ||
641 | } | ||
642 | |||
621 | void __init imx6_pm_ccm_init(const char *ccm_compat) | 643 | void __init imx6_pm_ccm_init(const char *ccm_compat) |
622 | { | 644 | { |
623 | struct device_node *np; | 645 | struct device_node *np; |
@@ -634,6 +656,9 @@ void __init imx6_pm_ccm_init(const char *ccm_compat) | |||
634 | val = readl_relaxed(ccm_base + CLPCR); | 656 | val = readl_relaxed(ccm_base + CLPCR); |
635 | val &= ~BM_CLPCR_LPM; | 657 | val &= ~BM_CLPCR_LPM; |
636 | writel_relaxed(val, ccm_base + CLPCR); | 658 | writel_relaxed(val, ccm_base + CLPCR); |
659 | |||
660 | if (of_property_read_bool(np, "fsl,pmic-stby-poweroff")) | ||
661 | imx6_pm_stby_poweroff_probe(); | ||
637 | } | 662 | } |
638 | 663 | ||
639 | void __init imx6q_pm_init(void) | 664 | void __init imx6q_pm_init(void) |