summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Krummenacher <max.krummenacher@toradex.com>2015-12-12 10:07:31 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2017-04-03 15:36:43 +0200
commit894914718e9e563eb601e0090e1ae2ddadf426a9 (patch)
tree0957f66983df72e1b9e8f356aa726c74dd1a99b5
parent29ff2389ecf7cb4e30924c80b8d42165cf306936 (diff)
pm-imx6.c: fix power off by stop mode
With the 3.14.28 release of the kernel imx6_stop_mode_poweroff() does not enter stop mode. Thus the function does not switch of power but returns. This seems to be caused by the second processor which has been stopped. Set the WFI event mask for the stopped processor works around the issue. Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> (cherry-picked from commit 2acff0eaece38533e85e08431e7ae9f3027c677a)
-rw-r--r--arch/arm/mach-imx/pm-imx6.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c
index 3ef6310319ae..c86371f3bd5f 100644
--- a/arch/arm/mach-imx/pm-imx6.c
+++ b/arch/arm/mach-imx/pm-imx6.c
@@ -1172,7 +1172,22 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdata
void imx6_stop_mode_poweroff(void)
{
- imx6q_set_lpm(STOP_POWER_OFF);
+ /* compare with imx6q_set_lpm */
+ u32 val = readl_relaxed(ccm_base + CLPCR);
+
+ val &= ~BM_CLPCR_LPM;
+ /* mask the stopped processor, otherwise we will not enter stop mode */
+ val |= smp_processor_id() ? BM_CLPCR_MASK_CORE0_WFI : BM_CLPCR_MASK_CORE1_WFI;
+ val |= 0x2 << BP_CLPCR_LPM;
+ val |= 0x3 << BP_CLPCR_STBY_COUNT;
+ val |= BM_CLPCR_VSTBY;
+ val |= BM_CLPCR_SBYOS;
+ val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;
+
+ imx_gpc_hwirq_unmask(0);
+ writel_relaxed(val, ccm_base + CLPCR);
+ imx_gpc_hwirq_mask(0);
+ imx_gpc_mask_all();
cpu_do_idle();
}