diff options
author | Teo Hall <teo.hall@freescale.com> | 2015-10-30 09:53:52 -0500 |
---|---|---|
committer | Teo Hall <teo.hall@freescale.com> | 2015-11-03 10:34:46 -0600 |
commit | eae33480b615c1586248a761ef3c6bcd9e0c59af (patch) | |
tree | 7235718a73907dc92ae9a7c36f662727408869b1 | |
parent | 52234ae38e6e4f2b3452d807dd1c1e199be6350c (diff) | |
download | freescale-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.c | 50 |
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); |