diff options
author | Anson Huang <Anson.Huang@nxp.com> | 2016-01-13 18:59:56 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2019-02-12 10:31:20 +0800 |
commit | 2047e3f99437656cef4461b76638490648785f5e (patch) | |
tree | 4653793dfed443b1e4bf3de0536237b1df6725f8 /arch/arm/mach-imx | |
parent | 3f381c1b120606f294024ede2a6a6d6c82c369e2 (diff) |
MLK-12136-1 ARM: imx: adjust slot control to meet design requirement on i.MX7D
Design team recommend to put SCU/C0/C1 in same power up slot
to avoid reset timing issue of debug mode, adjust the power
up slot and timing per their requirement.
Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Diffstat (limited to 'arch/arm/mach-imx')
-rw-r--r-- | arch/arm/mach-imx/gpcv2.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/arch/arm/mach-imx/gpcv2.c b/arch/arm/mach-imx/gpcv2.c index 9be7de4efda4..0ee279c6299c 100644 --- a/arch/arm/mach-imx/gpcv2.c +++ b/arch/arm/mach-imx/gpcv2.c @@ -44,8 +44,10 @@ #define GPC_PU_PGC_SW_PDN_REQ 0x104 #define GPC_GTOR 0x124 #define GPC_PGC_C0 0x800 +#define GPC_PGC_C0_PUPSCR 0x804 #define GPC_PGC_SCU_TIMING 0x890 #define GPC_PGC_C1 0x840 +#define GPC_PGC_C1_PUPSCR 0x844 #define GPC_PGC_SCU 0x880 #define GPC_PGC_FM 0xa00 #define GPC_PGC_MIPI_PHY 0xc00 @@ -80,6 +82,7 @@ #define BM_CPU_PGC_SW_PDN_PUP_REQ_CORE1_A7 0x2 #define BM_GPC_PGC_PCG 0x1 +#define BM_GPC_PGC_CORE_PUPSCR 0x7fff80 #define BM_GPC_PGC_ACK_SEL_A7_DUMMY_PUP_ACK 0x80000000 #define BM_GPC_PGC_ACK_SEL_A7_DUMMY_PDN_ACK 0x8000 @@ -412,8 +415,8 @@ void imx_gpcv2_set_cpu_power_gate_in_idle(bool pdn) imx_gpcv2_set_slot_ack(3, SCU_A7, false, true); imx_gpcv2_set_slot_ack(6, SCU_A7, true, false); if (num_online_cpus() > 1) - imx_gpcv2_set_slot_ack(7, CORE1_A7, true, false); - imx_gpcv2_set_slot_ack(8, CORE0_A7, true, true); + imx_gpcv2_set_slot_ack(6, CORE1_A7, true, false); + imx_gpcv2_set_slot_ack(6, CORE0_A7, true, true); } else { writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 0 * 0x4); writel_relaxed(0x0, gpc_base + GPC_SLOT0_CFG + 2 * 0x4); @@ -511,7 +514,7 @@ void imx_gpcv2_pre_suspend(bool arm_power_off) 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); + imx_gpcv2_set_slot_ack(6, CORE0_A7, true, true); /* enable core0, scu */ imx_gpcv2_set_m_core_pgc(true, GPC_PGC_C0); @@ -565,6 +568,17 @@ void imx_gpcv2_post_resume(void) writel_relaxed((0x59 << 10) | 0x5B | (0x51 << 20), gpc_base + GPC_PGC_SCU_TIMING); + /* set C0/C1 power up timming per design requirement */ + val = readl_relaxed(gpc_base + GPC_PGC_C0_PUPSCR); + val &= ~BM_GPC_PGC_CORE_PUPSCR; + val |= (0x1A << 7); + writel_relaxed(val, gpc_base + GPC_PGC_C0_PUPSCR); + + val = readl_relaxed(gpc_base + GPC_PGC_C1_PUPSCR); + val &= ~BM_GPC_PGC_CORE_PUPSCR; + val |= (0x19 << 7); + writel_relaxed(val, gpc_base + GPC_PGC_C1_PUPSCR); + val = readl_relaxed(gpc_base + GPC_SLPCR); val &= ~(BM_SLPCR_EN_DSM); if (!imx_src_is_m4_enabled()) @@ -861,6 +875,18 @@ static int __init imx_gpcv2_init(struct device_node *node, /* set SCU timing */ writel_relaxed((0x59 << 10) | 0x5B | (0x51 << 20), gpc_base + GPC_PGC_SCU_TIMING); + + /* set C0/C1 power up timming per design requirement */ + val = readl_relaxed(gpc_base + GPC_PGC_C0_PUPSCR); + val &= ~BM_GPC_PGC_CORE_PUPSCR; + val |= (0x1A << 7); + writel_relaxed(val, gpc_base + GPC_PGC_C0_PUPSCR); + + val = readl_relaxed(gpc_base + GPC_PGC_C1_PUPSCR); + val &= ~BM_GPC_PGC_CORE_PUPSCR; + val |= (0x19 << 7); + writel_relaxed(val, gpc_base + GPC_PGC_C1_PUPSCR); + 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); |