aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeo Hall <teo.hall@freescale.com>2015-10-30 09:53:52 -0500
committerTeo Hall <teo.hall@freescale.com>2015-11-03 10:34:46 -0600
commiteae33480b615c1586248a761ef3c6bcd9e0c59af (patch)
tree7235718a73907dc92ae9a7c36f662727408869b1
parent52234ae38e6e4f2b3452d807dd1c1e199be6350c (diff)
downloadfreescale-eae33480b615c1586248a761ef3c6bcd9e0c59af.tar.gz
MLK-11262-3: ARM: imx: Change GPC settings for Multicore LPM
change the slots to persistent to be congruent with M4 image. Also change so that slots do read/modify/write so that M4 settings are not overwritten. Signed-off-by: Teo Hall <teo.hall@freescale.com>
-rw-r--r--arch/arm/mach-imx/gpcv2.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/arch/arm/mach-imx/gpcv2.c b/arch/arm/mach-imx/gpcv2.c
index dbe99b7e0d0..56010dfd17d 100644
--- a/arch/arm/mach-imx/gpcv2.c
+++ b/arch/arm/mach-imx/gpcv2.c
@@ -116,8 +116,9 @@ void imx_gpcv2_set_slot_ack(u32 index, enum imx_gpc_slot m_core,
if (index >= MAX_SLOT_NUMBER)
pr_err("Invalid slot index!\n");
/* set slot */
- writel_relaxed((mode + 1) << (m_core * 2), gpc_base +
- GPC_SLOT0_CFG + index * 4);
+ writel_relaxed(readl_relaxed(gpc_base + GPC_SLOT0_CFG + index * 4)|
+ ((mode + 1) << (m_core * 2)),
+ gpc_base + GPC_SLOT0_CFG + index * 4);
if (ack) {
/* set ack */
@@ -306,16 +307,16 @@ void imx_gpcv2_set_cpu_power_gate_in_idle(bool pdn)
if (pdn) {
imx_gpcv2_set_slot_ack(0, CORE0_A7, false, false);
if (num_online_cpus() > 1)
- imx_gpcv2_set_slot_ack(1, CORE1_A7, false, false);
- imx_gpcv2_set_slot_ack(2, SCU_A7, false, true);
+ imx_gpcv2_set_slot_ack(2, CORE1_A7, false, false);
+ imx_gpcv2_set_slot_ack(3, SCU_A7, false, true);
imx_gpcv2_set_slot_ack(6, SCU_A7, true, false);
imx_gpcv2_set_slot_ack(7, CORE0_A7, true, false);
if (num_online_cpus() > 1)
imx_gpcv2_set_slot_ack(8, CORE1_A7, true, true);
} else {
writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 0 * 0x4);
- writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 1 * 0x4);
writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 2 * 0x4);
+ writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 3 * 0x4);
writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 6 * 0x4);
writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 7 * 0x4);
writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 8 * 0x4);
@@ -352,7 +353,9 @@ static void imx_gpcv2_mf_mix_off(void)
return;
pr_info("Turn off Mega/Fast mix in DSM\n");
- imx_gpcv2_set_mix_phy_gate_by_lpm(1, 5);
+
+ imx_gpcv2_set_slot_ack(1, FAST_MEGA_MIX, false, false);
+ imx_gpcv2_set_slot_ack(5, FAST_MEGA_MIX, true, false);
imx_gpcv2_set_m_core_pgc(true, GPC_PGC_FM);
}
@@ -399,8 +402,9 @@ void imx_gpcv2_pre_suspend(bool arm_power_off)
*/
imx_gpcv2_set_slot_ack(0, CORE0_A7, false, false);
imx_gpcv2_set_slot_ack(2, SCU_A7, false, true);
-
- imx_gpcv2_mf_mix_off();
+ if ((!imx_src_is_m4_enabled()) ||
+ (imx_src_is_m4_enabled() && imx_mu_is_m4_in_stop()))
+ imx_gpcv2_mf_mix_off();
imx_gpcv2_set_slot_ack(6, SCU_A7, true, false);
imx_gpcv2_set_slot_ack(7, CORE0_A7, true, true);
@@ -427,9 +431,10 @@ void imx_gpcv2_post_resume(void)
val = readl_relaxed(gpc_base + GPC_LPCR_A7_BSC);
val |= BM_LPCR_A7_BSC_IRQ_SRC_A7_WAKEUP;
writel_relaxed(val, gpc_base + GPC_LPCR_A7_BSC);
- /* mask m4 dsm trigger */
- writel_relaxed(readl_relaxed(gpc_base + GPC_LPCR_M4) |
- BM_LPCR_M4_MASK_DSM_TRIGGER, gpc_base + GPC_LPCR_M4);
+ /* mask m4 dsm trigger if M4 not enabled*/
+ if (!imx_src_is_m4_enabled())
+ writel_relaxed(readl_relaxed(gpc_base + GPC_LPCR_M4) |
+ BM_LPCR_M4_MASK_DSM_TRIGGER, gpc_base + GPC_LPCR_M4);
/* set mega/fast mix in A7 domain */
writel_relaxed(0x1, gpc_base + GPC_PGC_CPU_MAPPING);
/* set SCU timing */
@@ -437,8 +442,10 @@ void imx_gpcv2_post_resume(void)
gpc_base + GPC_PGC_SCU_TIMING);
val = readl_relaxed(gpc_base + GPC_SLPCR);
- val &= ~(BM_SLPCR_EN_DSM | BM_SLPCR_VSTBY | BM_SLPCR_RBC_EN |
- BM_SLPCR_SBYOS | BM_SLPCR_BYPASS_PMIC_READY);
+ val &= ~(BM_SLPCR_EN_DSM);
+ if (!imx_src_is_m4_enabled())
+ val &= ~(BM_SLPCR_VSTBY | BM_SLPCR_RBC_EN |
+ BM_SLPCR_SBYOS | BM_SLPCR_BYPASS_PMIC_READY);
val |= BM_SLPCR_EN_A7_FASTWUP_WAIT_MODE;
writel_relaxed(val, gpc_base + GPC_SLPCR);
@@ -458,7 +465,11 @@ void imx_gpcv2_post_resume(void)
imx_gpcv2_set_m_core_pgc(false, GPC_PGC_SCU);
imx_gpcv2_set_m_core_pgc(false, GPC_PGC_FM);
for (i = 0; i < MAX_SLOT_NUMBER; i++)
+ {
+ if (i==1||i==4) /* skip slts m4 uses */
+ continue;
writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + i * 0x4);
+ }
writel_relaxed(BM_GPC_PGC_ACK_SEL_A7_DUMMY_PUP_ACK |
BM_GPC_PGC_ACK_SEL_A7_DUMMY_PDN_ACK,
gpc_base + GPC_PGC_ACK_SEL_A7);
@@ -647,9 +658,10 @@ void __init imx_gpcv2_init(void)
val = readl_relaxed(gpc_base + GPC_LPCR_A7_BSC);
val |= BM_LPCR_A7_BSC_IRQ_SRC_A7_WAKEUP;
writel_relaxed(val, gpc_base + GPC_LPCR_A7_BSC);
- /* mask m4 dsm trigger */
- writel_relaxed(readl_relaxed(gpc_base + GPC_LPCR_M4) |
- BM_LPCR_M4_MASK_DSM_TRIGGER, gpc_base + GPC_LPCR_M4);
+ /* mask m4 dsm trigger if M4 not enabled*/
+ if (!imx_src_is_m4_enabled())
+ writel_relaxed(readl_relaxed(gpc_base + GPC_LPCR_M4) |
+ BM_LPCR_M4_MASK_DSM_TRIGGER, gpc_base + GPC_LPCR_M4);
/* set mega/fast mix in A7 domain */
writel_relaxed(0x1, gpc_base + GPC_PGC_CPU_MAPPING);
/* set SCU timing */
@@ -660,8 +672,10 @@ void __init imx_gpcv2_init(void)
gpc_base + GPC_PGC_ACK_SEL_A7);
val = readl_relaxed(gpc_base + GPC_SLPCR);
- val &= ~(BM_SLPCR_EN_DSM | BM_SLPCR_VSTBY | BM_SLPCR_RBC_EN |
- BM_SLPCR_SBYOS | BM_SLPCR_BYPASS_PMIC_READY);
+ val &= ~(BM_SLPCR_EN_DSM);
+ if (!imx_src_is_m4_enabled())
+ val &= ~(BM_SLPCR_VSTBY | BM_SLPCR_RBC_EN |
+ BM_SLPCR_SBYOS | BM_SLPCR_BYPASS_PMIC_READY);
val |= BM_SLPCR_EN_A7_FASTWUP_WAIT_MODE;
writel_relaxed(val, gpc_base + GPC_SLPCR);