xref: /rk3399_ARM-atf/plat/rockchip/rk3568/drivers/pmu/pmu.c (revision 9fd9f1d024872b440e3906eded28037330b6f422)
1*9fd9f1d0Sshengfei Xu /*
2*9fd9f1d0Sshengfei Xu  * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved.
3*9fd9f1d0Sshengfei Xu  *
4*9fd9f1d0Sshengfei Xu  * The power management unit (PMU) is designed for controlling power resources.
5*9fd9f1d0Sshengfei Xu  * The PMU is dedicated for managing the power of the whole chip.
6*9fd9f1d0Sshengfei Xu  *
7*9fd9f1d0Sshengfei Xu  * SPDX-License-Identifier: BSD-3-Clause
8*9fd9f1d0Sshengfei Xu  */
9*9fd9f1d0Sshengfei Xu 
10*9fd9f1d0Sshengfei Xu #include <assert.h>
11*9fd9f1d0Sshengfei Xu #include <errno.h>
12*9fd9f1d0Sshengfei Xu 
13*9fd9f1d0Sshengfei Xu #include <bakery_lock.h>
14*9fd9f1d0Sshengfei Xu #include <cortex_a55.h>
15*9fd9f1d0Sshengfei Xu #include <dsu_def.h>
16*9fd9f1d0Sshengfei Xu #include <mmio.h>
17*9fd9f1d0Sshengfei Xu #include <platform.h>
18*9fd9f1d0Sshengfei Xu #include <platform_def.h>
19*9fd9f1d0Sshengfei Xu #include <pmu.h>
20*9fd9f1d0Sshengfei Xu 
21*9fd9f1d0Sshengfei Xu #include <cpus_on_fixed_addr.h>
22*9fd9f1d0Sshengfei Xu #include <plat_private.h>
23*9fd9f1d0Sshengfei Xu #include <soc.h>
24*9fd9f1d0Sshengfei Xu 
25*9fd9f1d0Sshengfei Xu /*
26*9fd9f1d0Sshengfei Xu  * Use this macro to instantiate lock before it is used in below
27*9fd9f1d0Sshengfei Xu  * rockchip_pd_lock_xxx() macros
28*9fd9f1d0Sshengfei Xu  */
29*9fd9f1d0Sshengfei Xu DECLARE_BAKERY_LOCK(rockchip_pd_lock);
30*9fd9f1d0Sshengfei Xu 
31*9fd9f1d0Sshengfei Xu static uint32_t grf_ddr_con3;
32*9fd9f1d0Sshengfei Xu static struct psram_data_t *psram_sleep_cfg =
33*9fd9f1d0Sshengfei Xu 	(struct psram_data_t *)&sys_sleep_flag_sram;
34*9fd9f1d0Sshengfei Xu 
35*9fd9f1d0Sshengfei Xu /*
36*9fd9f1d0Sshengfei Xu  * These are wrapper macros to the powe domain Bakery Lock API.
37*9fd9f1d0Sshengfei Xu  */
38*9fd9f1d0Sshengfei Xu #define rockchip_pd_lock_init() bakery_lock_init(&rockchip_pd_lock)
39*9fd9f1d0Sshengfei Xu #define rockchip_pd_lock_get() bakery_lock_get(&rockchip_pd_lock)
40*9fd9f1d0Sshengfei Xu #define rockchip_pd_lock_rls() bakery_lock_release(&rockchip_pd_lock)
41*9fd9f1d0Sshengfei Xu 
42*9fd9f1d0Sshengfei Xu void __dead2 rockchip_soc_sys_pd_pwr_dn_wfi(void)
43*9fd9f1d0Sshengfei Xu {
44*9fd9f1d0Sshengfei Xu 	uint64_t ctrl;
45*9fd9f1d0Sshengfei Xu 
46*9fd9f1d0Sshengfei Xu 	__asm__ volatile ("mrs %0, " __XSTRING(CORTEX_A55_CPUPWRCTLR_EL1) : "=r" (ctrl));
47*9fd9f1d0Sshengfei Xu 	ctrl |= 0x01;
48*9fd9f1d0Sshengfei Xu 	__asm__ volatile ("msr " __XSTRING(CORTEX_A55_CPUPWRCTLR_EL1) ", %0" : : "r" (ctrl));
49*9fd9f1d0Sshengfei Xu 	isb();
50*9fd9f1d0Sshengfei Xu 
51*9fd9f1d0Sshengfei Xu 	while (1)
52*9fd9f1d0Sshengfei Xu 		wfi();
53*9fd9f1d0Sshengfei Xu }
54*9fd9f1d0Sshengfei Xu 
55*9fd9f1d0Sshengfei Xu static void pmu_pmic_sleep_mode_config(void)
56*9fd9f1d0Sshengfei Xu {
57*9fd9f1d0Sshengfei Xu 	/* pmic sleep function selection
58*9fd9f1d0Sshengfei Xu 	 * 1'b0: From reset pulse generator, can reset external PMIC
59*9fd9f1d0Sshengfei Xu 	 * 1'b1: From pmu block, only support sleep function for external PMIC
60*9fd9f1d0Sshengfei Xu 	 */
61*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUGRF_BASE + PMU_GRF_SOC_CON(0),  WRITE_MASK_SET(BIT(7)));
62*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUGRF_BASE + PMU_GRF_GPIO0A_IOMUX_L, PMIC_SLEEP_FUN);
63*9fd9f1d0Sshengfei Xu }
64*9fd9f1d0Sshengfei Xu 
65*9fd9f1d0Sshengfei Xu static void pmu_wakeup_source_config(void)
66*9fd9f1d0Sshengfei Xu {
67*9fd9f1d0Sshengfei Xu 	/* config wakeup source */
68*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_WAKEUP_INT_CON, WRITE_MASK_SET(BIT(WAKEUP_GPIO0_INT_EN)));
69*9fd9f1d0Sshengfei Xu 
70*9fd9f1d0Sshengfei Xu 	INFO("WAKEUP: PMU_WAKEUP_INT_CON:0x%x, reg: 0x%x\n",
71*9fd9f1d0Sshengfei Xu 	     mmio_read_32(PMU_BASE + PMU_WAKEUP_INT_CON), PMU_WAKEUP_INT_CON);
72*9fd9f1d0Sshengfei Xu }
73*9fd9f1d0Sshengfei Xu 
74*9fd9f1d0Sshengfei Xu static void pmu_pll_powerdown_config(void)
75*9fd9f1d0Sshengfei Xu {
76*9fd9f1d0Sshengfei Xu 	uint32_t pll_id;
77*9fd9f1d0Sshengfei Xu 
78*9fd9f1d0Sshengfei Xu 	/* PLL power down by PMU */
79*9fd9f1d0Sshengfei Xu 	pll_id = BIT(APLL_PD_ENA) |
80*9fd9f1d0Sshengfei Xu 		BIT(CPLL_PD_ENA) |
81*9fd9f1d0Sshengfei Xu 		BIT(GPLL_PD_ENA) |
82*9fd9f1d0Sshengfei Xu 		BIT(MPLL_PD_ENA) |
83*9fd9f1d0Sshengfei Xu 		BIT(NPLL_PD_ENA) |
84*9fd9f1d0Sshengfei Xu 		BIT(HPLL_PD_ENA) |
85*9fd9f1d0Sshengfei Xu 		BIT(PPLL_PD_ENA) |
86*9fd9f1d0Sshengfei Xu 		BIT(VPLL_PD_ENA);
87*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PLLPD_CON, WRITE_MASK_SET(pll_id));
88*9fd9f1d0Sshengfei Xu 	INFO("PLL: PMU_PLLPD_CON(0x%x):0x%x\n",
89*9fd9f1d0Sshengfei Xu 	     PMU_PLLPD_CON, mmio_read_32(PMU_BASE + PMU_PLLPD_CON));
90*9fd9f1d0Sshengfei Xu }
91*9fd9f1d0Sshengfei Xu 
92*9fd9f1d0Sshengfei Xu static void pmu_stable_count_config(void)
93*9fd9f1d0Sshengfei Xu {
94*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DSU_STABLE_CNT, 0x180);
95*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PMIC_STABLE_CNT, 0x180);
96*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_OSC_STABLE_CNT, 0x180);
97*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_WAKEUP_RSTCLR_CNT, 0x180);
98*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PLL_LOCK_CNT, 0x180);
99*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DSU_PWRUP_CNT, 0x180);
100*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DSU_PWRDN_CNT, 0x180);
101*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_GPU_VOLUP_CNT, 0x180);
102*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_GPU_VOLDN_CNT, 0x180);
103*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_WAKEUP_TIMEOUT_CNT, 0x180);
104*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWM_SWITCH_CNT, 0x180);
105*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DBG_RST_CNT, 0x180);
106*9fd9f1d0Sshengfei Xu }
107*9fd9f1d0Sshengfei Xu 
108*9fd9f1d0Sshengfei Xu static void pmu_pd_powerdown_config(void)
109*9fd9f1d0Sshengfei Xu {
110*9fd9f1d0Sshengfei Xu 	uint32_t pwr_gate_con, pwr_dwn_st, pmu_bus_idle_con0 = 0;
111*9fd9f1d0Sshengfei Xu 	uint32_t pmu_bus_idle_con1;
112*9fd9f1d0Sshengfei Xu 
113*9fd9f1d0Sshengfei Xu 	/* Pd power down by PMU */
114*9fd9f1d0Sshengfei Xu 	pwr_dwn_st = mmio_read_32(PMU_BASE + PMU_PWR_DWN_ST);
115*9fd9f1d0Sshengfei Xu 	pwr_gate_con = ~pwr_dwn_st & 0x3ff;
116*9fd9f1d0Sshengfei Xu 
117*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_GPU_DWN_ENA)) {
118*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_GPU);
119*9fd9f1d0Sshengfei Xu 	}
120*9fd9f1d0Sshengfei Xu 
121*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_NPU_DWN_ENA)) {
122*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_NPU);
123*9fd9f1d0Sshengfei Xu 	}
124*9fd9f1d0Sshengfei Xu 
125*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_RKVENC_DWN_ENA)) {
126*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_RKVENC);
127*9fd9f1d0Sshengfei Xu 	}
128*9fd9f1d0Sshengfei Xu 
129*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_RKVDEC_DWN_ENA)) {
130*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_RKVDEC);
131*9fd9f1d0Sshengfei Xu 	}
132*9fd9f1d0Sshengfei Xu 
133*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_RGA_DWN_ENA)) {
134*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_RGA);
135*9fd9f1d0Sshengfei Xu 	}
136*9fd9f1d0Sshengfei Xu 
137*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_VI_DWN_ENA)) {
138*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_VI);
139*9fd9f1d0Sshengfei Xu 	}
140*9fd9f1d0Sshengfei Xu 
141*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_VO_DWN_ENA)) {
142*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_VO);
143*9fd9f1d0Sshengfei Xu 	}
144*9fd9f1d0Sshengfei Xu 
145*9fd9f1d0Sshengfei Xu 	if (pwr_gate_con & BIT(PD_PIPE_DWN_ENA)) {
146*9fd9f1d0Sshengfei Xu 		pmu_bus_idle_con0 |= BIT(IDLE_REQ_PIPE);
147*9fd9f1d0Sshengfei Xu 	}
148*9fd9f1d0Sshengfei Xu 
149*9fd9f1d0Sshengfei Xu 	pmu_bus_idle_con0 |= BIT(IDLE_REQ_GIC_AUDIO) |
150*9fd9f1d0Sshengfei Xu 		BIT(IDLE_REQ_MSCH) |
151*9fd9f1d0Sshengfei Xu 		BIT(IDLE_REQ_PHP) |
152*9fd9f1d0Sshengfei Xu 		BIT(IDLE_REQ_SECURE_FLASH) |
153*9fd9f1d0Sshengfei Xu 		BIT(IDLE_REQ_PERIMID) |
154*9fd9f1d0Sshengfei Xu 		BIT(IDLE_REQ_USB) |
155*9fd9f1d0Sshengfei Xu 		BIT(IDLE_REQ_BUS);
156*9fd9f1d0Sshengfei Xu 
157*9fd9f1d0Sshengfei Xu 	/* Enable power down PD by PMU automatically */
158*9fd9f1d0Sshengfei Xu 	pwr_gate_con |= (BIT(PD_GPU_DWN_ENA) |
159*9fd9f1d0Sshengfei Xu 		BIT(PD_NPU_DWN_ENA) |
160*9fd9f1d0Sshengfei Xu 		BIT(PD_VPU_DWN_ENA) |
161*9fd9f1d0Sshengfei Xu 		BIT(PD_RKVENC_DWN_ENA) |
162*9fd9f1d0Sshengfei Xu 		BIT(PD_RKVDEC_DWN_ENA) |
163*9fd9f1d0Sshengfei Xu 		BIT(PD_RGA_DWN_ENA) |
164*9fd9f1d0Sshengfei Xu 		BIT(PD_VI_DWN_ENA) |
165*9fd9f1d0Sshengfei Xu 		BIT(PD_VO_DWN_ENA) |
166*9fd9f1d0Sshengfei Xu 		BIT(PD_PIPE_DWN_ENA)) << 16;
167*9fd9f1d0Sshengfei Xu 
168*9fd9f1d0Sshengfei Xu 	pmu_bus_idle_con1 = 0;
169*9fd9f1d0Sshengfei Xu 
170*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_GATE_CON, pwr_gate_con);
171*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_BUS_IDLE_CON0, WRITE_MASK_SET(pmu_bus_idle_con0));
172*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_BUS_IDLE_CON1, WRITE_MASK_SET(pmu_bus_idle_con1));
173*9fd9f1d0Sshengfei Xu 
174*9fd9f1d0Sshengfei Xu 	/* When perform idle operation,
175*9fd9f1d0Sshengfei Xu 	 * corresponding clock can be opened or gated automatically
176*9fd9f1d0Sshengfei Xu 	 */
177*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_NOC_AUTO_CON0, 0xffffffff);
178*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_NOC_AUTO_CON1, 0x00070007);
179*9fd9f1d0Sshengfei Xu 
180*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_VOL_GATE_SFTCON, WRITE_MASK_SET(BIT(VD_NPU_ENA)));
181*9fd9f1d0Sshengfei Xu 
182*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, WRITE_MASK_CLR(BIT(PWRDN_BYPASS)));
183*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, WRITE_MASK_CLR(BIT(BUS_BYPASS)));
184*9fd9f1d0Sshengfei Xu 
185*9fd9f1d0Sshengfei Xu 	INFO("PD & BUS:PMU_PWR_DWN_ST(0x%x):0x%x\n",
186*9fd9f1d0Sshengfei Xu 	     PMU_PWR_DWN_ST, mmio_read_32(PMU_BASE + PMU_PWR_DWN_ST));
187*9fd9f1d0Sshengfei Xu 	INFO("PD & BUS:PMU_PWR_GATE_CON(0x%x):0x%x\n",
188*9fd9f1d0Sshengfei Xu 	     PMU_PWR_GATE_CON, mmio_read_32(PMU_BASE + PMU_PWR_GATE_CON));
189*9fd9f1d0Sshengfei Xu 	INFO("PD & BUS:PMU_BUS_IDLE_CON0(0x%x):0x%x\n",
190*9fd9f1d0Sshengfei Xu 	     PMU_BUS_IDLE_CON0, mmio_read_32(PMU_BASE + PMU_BUS_IDLE_CON0));
191*9fd9f1d0Sshengfei Xu 	INFO("PD & BUS:PMU_BUS_IDLE_CON1(0x%x):0x%x\n",
192*9fd9f1d0Sshengfei Xu 	     PMU_BUS_IDLE_CON1, mmio_read_32(PMU_BASE + PMU_BUS_IDLE_CON1));
193*9fd9f1d0Sshengfei Xu 	INFO("PD & BUS:PMU_PWR_CON(0x%x):0x%x\n",
194*9fd9f1d0Sshengfei Xu 	     PMU_PWR_CON, mmio_read_32(PMU_BASE + PMU_PWR_CON));
195*9fd9f1d0Sshengfei Xu }
196*9fd9f1d0Sshengfei Xu 
197*9fd9f1d0Sshengfei Xu static void pmu_ddr_suspend_config(void)
198*9fd9f1d0Sshengfei Xu {
199*9fd9f1d0Sshengfei Xu 	uint32_t pmu_ddr_pwr_con;
200*9fd9f1d0Sshengfei Xu 
201*9fd9f1d0Sshengfei Xu 	pmu_ddr_pwr_con = BIT(DDR_SREF_ENA) |
202*9fd9f1d0Sshengfei Xu 		BIT(DDRIO_RET_ENTER_ENA) |
203*9fd9f1d0Sshengfei Xu 		BIT(DDRIO_RET_EXIT_ENA) |
204*9fd9f1d0Sshengfei Xu 		BIT(DDRPHY_AUTO_GATING_ENA);
205*9fd9f1d0Sshengfei Xu 
206*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DDR_PWR_CON, WRITE_MASK_SET(pmu_ddr_pwr_con));
207*9fd9f1d0Sshengfei Xu 	/* DPLL power down by PMU */
208*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PLLPD_CON, WRITE_MASK_SET(BIT(DPLL_PD_ENA)));
209*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, WRITE_MASK_CLR(BIT(DDR_BYPASS)));
210*9fd9f1d0Sshengfei Xu 
211*9fd9f1d0Sshengfei Xu 	grf_ddr_con3 = mmio_read_32(DDRGRF_BASE + GRF_DDR_CON3);
212*9fd9f1d0Sshengfei Xu 
213*9fd9f1d0Sshengfei Xu 	mmio_write_32(DDRGRF_BASE + GRF_DDR_CON3, 0x00600020);
214*9fd9f1d0Sshengfei Xu 
215*9fd9f1d0Sshengfei Xu 	pmu_ddr_pwr_con = mmio_read_32(PMU_BASE + PMU_DDR_PWR_CON);
216*9fd9f1d0Sshengfei Xu 
217*9fd9f1d0Sshengfei Xu 	INFO("DDR: PMU_PLLPD_CON(0x%x):0x%x\n",
218*9fd9f1d0Sshengfei Xu 	     PMU_PLLPD_CON, mmio_read_32(PMU_BASE + PMU_PLLPD_CON));
219*9fd9f1d0Sshengfei Xu 	INFO("DDR: PMU_DDR_PWR_CON(0x%x):\t0x%x\n",
220*9fd9f1d0Sshengfei Xu 	     PMU_DDR_PWR_CON, pmu_ddr_pwr_con);
221*9fd9f1d0Sshengfei Xu 
222*9fd9f1d0Sshengfei Xu 	if (pmu_ddr_pwr_con & BIT(DDR_SREF_ENA)) {
223*9fd9f1d0Sshengfei Xu 		INFO("\t DDR_SREF_ENA\n");
224*9fd9f1d0Sshengfei Xu 	}
225*9fd9f1d0Sshengfei Xu 
226*9fd9f1d0Sshengfei Xu 	if (pmu_ddr_pwr_con & BIT(DDRIO_RET_ENTER_ENA)) {
227*9fd9f1d0Sshengfei Xu 		INFO("\t DDRIO_RET_ENTER_ENA\n");
228*9fd9f1d0Sshengfei Xu 	}
229*9fd9f1d0Sshengfei Xu 
230*9fd9f1d0Sshengfei Xu 	if (pmu_ddr_pwr_con & BIT(DDRIO_RET_EXIT_ENA)) {
231*9fd9f1d0Sshengfei Xu 		INFO("\t DDRIO_RET_EXIT_ENA\n");
232*9fd9f1d0Sshengfei Xu 	}
233*9fd9f1d0Sshengfei Xu 
234*9fd9f1d0Sshengfei Xu 	if (pmu_ddr_pwr_con & BIT(DDRPHY_AUTO_GATING_ENA)) {
235*9fd9f1d0Sshengfei Xu 		INFO("\t DDRPHY_AUTO_GATING_ENA\n");
236*9fd9f1d0Sshengfei Xu 	}
237*9fd9f1d0Sshengfei Xu }
238*9fd9f1d0Sshengfei Xu 
239*9fd9f1d0Sshengfei Xu static void pmu_dsu_suspend_config(void)
240*9fd9f1d0Sshengfei Xu {
241*9fd9f1d0Sshengfei Xu 	uint32_t pmu_dsu_pwr_con;
242*9fd9f1d0Sshengfei Xu 
243*9fd9f1d0Sshengfei Xu 	pmu_dsu_pwr_con = BIT(DSU_PWRDN_ENA);
244*9fd9f1d0Sshengfei Xu 
245*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CLUSTER_IDLE_CON, 0x000f000f);
246*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DSU_PWR_CON, WRITE_MASK_SET(pmu_dsu_pwr_con));
247*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, WRITE_MASK_CLR(BIT(DSU_BYPASS)));
248*9fd9f1d0Sshengfei Xu 	dsu_pwr_dwn();
249*9fd9f1d0Sshengfei Xu 
250*9fd9f1d0Sshengfei Xu 	INFO("DSU: PMU_DSU_PWR_CON(0x%x): 0x%x\n",
251*9fd9f1d0Sshengfei Xu 	     PMU_DSU_PWR_CON, mmio_read_32(PMU_BASE + PMU_DSU_PWR_CON));
252*9fd9f1d0Sshengfei Xu 	INFO("DSU: PMU_CLUSTER_IDLE_CON(0x%x),: 0x%x\n",
253*9fd9f1d0Sshengfei Xu 	     PMU_CLUSTER_IDLE_CON,  mmio_read_32(PMU_BASE + PMU_CLUSTER_IDLE_CON));
254*9fd9f1d0Sshengfei Xu 	INFO("DSU: PMU_PWR_CON(0x%x),: 0x%x\n",
255*9fd9f1d0Sshengfei Xu 	     PMU_PWR_CON, mmio_read_32(PMU_BASE + PMU_PWR_CON));
256*9fd9f1d0Sshengfei Xu }
257*9fd9f1d0Sshengfei Xu 
258*9fd9f1d0Sshengfei Xu static void pmu_cpu_powerdown_config(void)
259*9fd9f1d0Sshengfei Xu {
260*9fd9f1d0Sshengfei Xu 	uint32_t pmu_cluster_pwr_st, cpus_state, cpus_bypass;
261*9fd9f1d0Sshengfei Xu 
262*9fd9f1d0Sshengfei Xu 	pmu_cluster_pwr_st = mmio_read_32(PMU_BASE + PMU_CLUSTER_PWR_ST);
263*9fd9f1d0Sshengfei Xu 	cpus_state = pmu_cluster_pwr_st & 0x0f;
264*9fd9f1d0Sshengfei Xu 
265*9fd9f1d0Sshengfei Xu 	cpus_bypass = cpus_state << CPU0_BYPASS;
266*9fd9f1d0Sshengfei Xu 
267*9fd9f1d0Sshengfei Xu 	INFO("CPU: PMU_CLUSTER_PWR_ST(0x%x):0x%x\n",
268*9fd9f1d0Sshengfei Xu 	     PMU_CLUSTER_PWR_ST, mmio_read_32(PMU_BASE + PMU_CLUSTER_PWR_ST));
269*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, (0xf << (16 + CPU0_BYPASS)) | cpus_bypass);
270*9fd9f1d0Sshengfei Xu 
271*9fd9f1d0Sshengfei Xu 	INFO("CPU: PMU_PWR_CON(0x%x), 0x%x\n",
272*9fd9f1d0Sshengfei Xu 	     PMU_PWR_CON,  mmio_read_32(PMU_BASE + PMU_PWR_CON));
273*9fd9f1d0Sshengfei Xu }
274*9fd9f1d0Sshengfei Xu 
275*9fd9f1d0Sshengfei Xu static void pvtm_32k_config(void)
276*9fd9f1d0Sshengfei Xu {
277*9fd9f1d0Sshengfei Xu 	uint32_t pmu_cru_pwr_con;
278*9fd9f1d0Sshengfei Xu 	uint32_t pvtm_freq_khz, pvtm_div;
279*9fd9f1d0Sshengfei Xu 
280*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUCRU_BASE + PMUCRU_PMUGATE_CON01, 0x38000000);
281*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUPVTM_BASE + PVTM_CON0, 0x00020002);
282*9fd9f1d0Sshengfei Xu 	dsb();
283*9fd9f1d0Sshengfei Xu 
284*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUPVTM_BASE + PVTM_CON0, 0x001c0000);
285*9fd9f1d0Sshengfei Xu 
286*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUPVTM_BASE + PVTM_CON1, PVTM_CALC_CNT);
287*9fd9f1d0Sshengfei Xu 	dsb();
288*9fd9f1d0Sshengfei Xu 
289*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUPVTM_BASE + PVTM_CON0, 0x00010001);
290*9fd9f1d0Sshengfei Xu 	dsb();
291*9fd9f1d0Sshengfei Xu 
292*9fd9f1d0Sshengfei Xu 	while (mmio_read_32(PMUPVTM_BASE + PVTM_STATUS1) < 30) {
293*9fd9f1d0Sshengfei Xu 		;
294*9fd9f1d0Sshengfei Xu 	}
295*9fd9f1d0Sshengfei Xu 
296*9fd9f1d0Sshengfei Xu 	dsb();
297*9fd9f1d0Sshengfei Xu 	while (!(mmio_read_32(PMUPVTM_BASE + PVTM_STATUS0) & 0x1)) {
298*9fd9f1d0Sshengfei Xu 		;
299*9fd9f1d0Sshengfei Xu 	}
300*9fd9f1d0Sshengfei Xu 
301*9fd9f1d0Sshengfei Xu 	pvtm_freq_khz = (mmio_read_32(PMUPVTM_BASE + PVTM_STATUS1) * 24000 +
302*9fd9f1d0Sshengfei Xu 		PVTM_CALC_CNT / 2) / PVTM_CALC_CNT;
303*9fd9f1d0Sshengfei Xu 	pvtm_div = (pvtm_freq_khz + 16) / 32;
304*9fd9f1d0Sshengfei Xu 
305*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUGRF_BASE + PMU_GRF_DLL_CON0, pvtm_div);
306*9fd9f1d0Sshengfei Xu 
307*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUCRU_BASE + PMUCRU_PMUCLKSEL_CON00, 0x00c00000);
308*9fd9f1d0Sshengfei Xu 
309*9fd9f1d0Sshengfei Xu 	pmu_cru_pwr_con = BIT(ALIVE_32K_ENA) | BIT(OSC_DIS_ENA);
310*9fd9f1d0Sshengfei Xu 
311*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_WAKEUP_TIMEOUT_CNT, 32000 * 10);
312*9fd9f1d0Sshengfei Xu 
313*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CRU_PWR_CON, WRITE_MASK_SET(pmu_cru_pwr_con));
314*9fd9f1d0Sshengfei Xu 	INFO("PVTM: PMU_CRU_PWR_CON(0x0%x): 0x%x\n",
315*9fd9f1d0Sshengfei Xu 	     PMU_CRU_PWR_CON, mmio_read_32(PMU_BASE + PMU_CRU_PWR_CON));
316*9fd9f1d0Sshengfei Xu }
317*9fd9f1d0Sshengfei Xu 
318*9fd9f1d0Sshengfei Xu static void pmu_cru_suspendmode_config(void)
319*9fd9f1d0Sshengfei Xu {
320*9fd9f1d0Sshengfei Xu 	uint32_t pmu_cru_pwr_con;
321*9fd9f1d0Sshengfei Xu 
322*9fd9f1d0Sshengfei Xu 	pmu_cru_pwr_con = BIT(ALIVE_OSC_ENA);
323*9fd9f1d0Sshengfei Xu 
324*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CRU_PWR_CON, WRITE_MASK_SET(pmu_cru_pwr_con));
325*9fd9f1d0Sshengfei Xu 	INFO("CRU: PMU_CRU_PWR_CON(0x0%x): 0x%x\n",
326*9fd9f1d0Sshengfei Xu 	     PMU_CRU_PWR_CON, mmio_read_32(PMU_BASE + PMU_CRU_PWR_CON));
327*9fd9f1d0Sshengfei Xu }
328*9fd9f1d0Sshengfei Xu 
329*9fd9f1d0Sshengfei Xu static void pmu_suspend_cru_fsm(void)
330*9fd9f1d0Sshengfei Xu {
331*9fd9f1d0Sshengfei Xu 	pmu_pmic_sleep_mode_config();
332*9fd9f1d0Sshengfei Xu 
333*9fd9f1d0Sshengfei Xu 	/* Global interrupt disable */
334*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_INT_MASK_CON, CLB_INT_DISABLE);
335*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, CPUS_BYPASS);
336*9fd9f1d0Sshengfei Xu 
337*9fd9f1d0Sshengfei Xu 	pmu_stable_count_config();
338*9fd9f1d0Sshengfei Xu 	pmu_wakeup_source_config();
339*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_WAKEUP_TIMEOUT_CNT, 0x5dc0 * 20000);
340*9fd9f1d0Sshengfei Xu 	/* default cru config */
341*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CRU_PWR_CON, WRITE_MASK_SET(BIT(ALIVE_OSC_ENA)));
342*9fd9f1d0Sshengfei Xu 
343*9fd9f1d0Sshengfei Xu 	pmu_cru_suspendmode_config();
344*9fd9f1d0Sshengfei Xu 	pmu_cpu_powerdown_config();
345*9fd9f1d0Sshengfei Xu 	pmu_pll_powerdown_config();
346*9fd9f1d0Sshengfei Xu 	pmu_pd_powerdown_config();
347*9fd9f1d0Sshengfei Xu 	pmu_ddr_suspend_config();
348*9fd9f1d0Sshengfei Xu 	pmu_dsu_suspend_config();
349*9fd9f1d0Sshengfei Xu 	pvtm_32k_config();
350*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, 0x00010001);
351*9fd9f1d0Sshengfei Xu }
352*9fd9f1d0Sshengfei Xu 
353*9fd9f1d0Sshengfei Xu static void pmu_reinit(void)
354*9fd9f1d0Sshengfei Xu {
355*9fd9f1d0Sshengfei Xu 	mmio_write_32(DDRGRF_BASE + GRF_DDR_CON3, grf_ddr_con3 | 0xffff0000);
356*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_CON, 0xffff0000);
357*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_INT_MASK_CON, 0xffff0000);
358*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_WAKEUP_INT_CON, 0xffff0000);
359*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_BUS_IDLE_CON0, 0xffff0000);
360*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DDR_PWR_CON, 0xffff0000);
361*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_BUS_IDLE_CON1, 0xffff0000);
362*9fd9f1d0Sshengfei Xu 
363*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PWR_GATE_CON, 0xffff0000);
364*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_VOL_GATE_SFTCON, 0xffff0000);
365*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CRU_PWR_CON, 0xffff0000);
366*9fd9f1d0Sshengfei Xu 
367*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_PLLPD_CON, 0xffff0000);
368*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_INFO_TX_CON, 0xffff0000);
369*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_DSU_PWR_CON, 0xffff0000);
370*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CLUSTER_IDLE_CON, 0xffff0000);
371*9fd9f1d0Sshengfei Xu }
372*9fd9f1d0Sshengfei Xu 
373*9fd9f1d0Sshengfei Xu void rockchip_plat_mmu_el3(void)
374*9fd9f1d0Sshengfei Xu {
375*9fd9f1d0Sshengfei Xu }
376*9fd9f1d0Sshengfei Xu 
377*9fd9f1d0Sshengfei Xu int rockchip_soc_cores_pwr_dm_suspend(void)
378*9fd9f1d0Sshengfei Xu {
379*9fd9f1d0Sshengfei Xu 	return 0;
380*9fd9f1d0Sshengfei Xu }
381*9fd9f1d0Sshengfei Xu 
382*9fd9f1d0Sshengfei Xu int rockchip_soc_cores_pwr_dm_resume(void)
383*9fd9f1d0Sshengfei Xu {
384*9fd9f1d0Sshengfei Xu 	return 0;
385*9fd9f1d0Sshengfei Xu }
386*9fd9f1d0Sshengfei Xu 
387*9fd9f1d0Sshengfei Xu int rockchip_soc_sys_pwr_dm_suspend(void)
388*9fd9f1d0Sshengfei Xu {
389*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->pm_flag = 0;
390*9fd9f1d0Sshengfei Xu 	flush_dcache_range((uintptr_t)&(psram_sleep_cfg->pm_flag),
391*9fd9f1d0Sshengfei Xu 			   sizeof(uint32_t));
392*9fd9f1d0Sshengfei Xu 	pmu_suspend_cru_fsm();
393*9fd9f1d0Sshengfei Xu 
394*9fd9f1d0Sshengfei Xu 	return 0;
395*9fd9f1d0Sshengfei Xu }
396*9fd9f1d0Sshengfei Xu 
397*9fd9f1d0Sshengfei Xu int rockchip_soc_sys_pwr_dm_resume(void)
398*9fd9f1d0Sshengfei Xu {
399*9fd9f1d0Sshengfei Xu 	pmu_reinit();
400*9fd9f1d0Sshengfei Xu 	plat_rockchip_gic_cpuif_enable();
401*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->pm_flag = PM_WARM_BOOT_BIT;
402*9fd9f1d0Sshengfei Xu 	flush_dcache_range((uintptr_t)&(psram_sleep_cfg->pm_flag),
403*9fd9f1d0Sshengfei Xu 			   sizeof(uint32_t));
404*9fd9f1d0Sshengfei Xu 
405*9fd9f1d0Sshengfei Xu 	return 0;
406*9fd9f1d0Sshengfei Xu }
407*9fd9f1d0Sshengfei Xu 
408*9fd9f1d0Sshengfei Xu static int cpus_power_domain_off(uint32_t cpu_id, uint32_t pd_cfg)
409*9fd9f1d0Sshengfei Xu {
410*9fd9f1d0Sshengfei Xu 	uint32_t apm_value, offset, idx;
411*9fd9f1d0Sshengfei Xu 
412*9fd9f1d0Sshengfei Xu 	apm_value = BIT(core_pm_en) | BIT(core_pm_int_wakeup_glb_msk);
413*9fd9f1d0Sshengfei Xu 
414*9fd9f1d0Sshengfei Xu 	if (pd_cfg == core_pwr_wfi_int) {
415*9fd9f1d0Sshengfei Xu 		apm_value |= BIT(core_pm_int_wakeup_en);
416*9fd9f1d0Sshengfei Xu 	}
417*9fd9f1d0Sshengfei Xu 
418*9fd9f1d0Sshengfei Xu 	idx = cpu_id / 2;
419*9fd9f1d0Sshengfei Xu 	offset = (cpu_id % 2) << 3;
420*9fd9f1d0Sshengfei Xu 
421*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(idx),
422*9fd9f1d0Sshengfei Xu 		      BITS_WITH_WMASK(apm_value, 0xf, offset));
423*9fd9f1d0Sshengfei Xu 	dsb();
424*9fd9f1d0Sshengfei Xu 
425*9fd9f1d0Sshengfei Xu 	return 0;
426*9fd9f1d0Sshengfei Xu }
427*9fd9f1d0Sshengfei Xu 
428*9fd9f1d0Sshengfei Xu static int cpus_power_domain_on(uint32_t cpu_id)
429*9fd9f1d0Sshengfei Xu {
430*9fd9f1d0Sshengfei Xu 	uint32_t offset, idx;
431*9fd9f1d0Sshengfei Xu 
432*9fd9f1d0Sshengfei Xu 	idx = cpu_id / 2;
433*9fd9f1d0Sshengfei Xu 	offset = (cpu_id % 2) << 3;
434*9fd9f1d0Sshengfei Xu 
435*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(idx),
436*9fd9f1d0Sshengfei Xu 		      WMSK_BIT(core_pm_en + offset));
437*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(idx),
438*9fd9f1d0Sshengfei Xu 		      BIT_WITH_WMSK(core_pm_sft_wakeup_en + offset));
439*9fd9f1d0Sshengfei Xu 	dsb();
440*9fd9f1d0Sshengfei Xu 
441*9fd9f1d0Sshengfei Xu 	return 0;
442*9fd9f1d0Sshengfei Xu }
443*9fd9f1d0Sshengfei Xu 
444*9fd9f1d0Sshengfei Xu int rockchip_soc_cores_pwr_dm_on(unsigned long mpidr, uint64_t entrypoint)
445*9fd9f1d0Sshengfei Xu {
446*9fd9f1d0Sshengfei Xu 	uint32_t cpu_id = plat_core_pos_by_mpidr(mpidr);
447*9fd9f1d0Sshengfei Xu 
448*9fd9f1d0Sshengfei Xu 	assert(cpu_id < PLATFORM_CORE_COUNT);
449*9fd9f1d0Sshengfei Xu 
450*9fd9f1d0Sshengfei Xu 	cpuson_flags[cpu_id] = PMU_CPU_HOTPLUG;
451*9fd9f1d0Sshengfei Xu 	cpuson_entry_point[cpu_id] = entrypoint;
452*9fd9f1d0Sshengfei Xu 	flush_dcache_range((uintptr_t)cpuson_flags, sizeof(cpuson_flags));
453*9fd9f1d0Sshengfei Xu 	flush_dcache_range((uintptr_t)cpuson_entry_point,
454*9fd9f1d0Sshengfei Xu 			   sizeof(cpuson_entry_point));
455*9fd9f1d0Sshengfei Xu 
456*9fd9f1d0Sshengfei Xu 	cpus_power_domain_on(cpu_id);
457*9fd9f1d0Sshengfei Xu 	return 0;
458*9fd9f1d0Sshengfei Xu }
459*9fd9f1d0Sshengfei Xu 
460*9fd9f1d0Sshengfei Xu int rockchip_soc_cores_pwr_dm_off(void)
461*9fd9f1d0Sshengfei Xu {
462*9fd9f1d0Sshengfei Xu 	uint32_t cpu_id = plat_my_core_pos();
463*9fd9f1d0Sshengfei Xu 
464*9fd9f1d0Sshengfei Xu 	cpus_power_domain_off(cpu_id,
465*9fd9f1d0Sshengfei Xu 			      core_pwr_wfi);
466*9fd9f1d0Sshengfei Xu 	return 0;
467*9fd9f1d0Sshengfei Xu }
468*9fd9f1d0Sshengfei Xu 
469*9fd9f1d0Sshengfei Xu int rockchip_soc_cores_pwr_dm_on_finish(void)
470*9fd9f1d0Sshengfei Xu {
471*9fd9f1d0Sshengfei Xu 	uint32_t cpu_id = plat_my_core_pos();
472*9fd9f1d0Sshengfei Xu 	uint32_t offset, idx;
473*9fd9f1d0Sshengfei Xu 
474*9fd9f1d0Sshengfei Xu 	/* Disable core_pm */
475*9fd9f1d0Sshengfei Xu 	idx = cpu_id / 2;
476*9fd9f1d0Sshengfei Xu 	offset = (cpu_id % 2) << 3;
477*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_CPUAPM_CON(idx),
478*9fd9f1d0Sshengfei Xu 		      BITS_WITH_WMASK(0, 0xf, offset));
479*9fd9f1d0Sshengfei Xu 
480*9fd9f1d0Sshengfei Xu 	return 0;
481*9fd9f1d0Sshengfei Xu }
482*9fd9f1d0Sshengfei Xu 
483*9fd9f1d0Sshengfei Xu static void nonboot_cpus_off(void)
484*9fd9f1d0Sshengfei Xu {
485*9fd9f1d0Sshengfei Xu 	uint32_t tmp;
486*9fd9f1d0Sshengfei Xu 
487*9fd9f1d0Sshengfei Xu 	cpus_power_domain_off(1, 0);
488*9fd9f1d0Sshengfei Xu 	cpus_power_domain_off(2, 0);
489*9fd9f1d0Sshengfei Xu 	cpus_power_domain_off(3, 0);
490*9fd9f1d0Sshengfei Xu 
491*9fd9f1d0Sshengfei Xu 	mmio_write_32(SYSSRAM_BASE + 0x04, 0xdeadbeaf);
492*9fd9f1d0Sshengfei Xu 	mmio_write_32(SYSSRAM_BASE + 0x08, (uintptr_t)&rockchip_soc_sys_pd_pwr_dn_wfi);
493*9fd9f1d0Sshengfei Xu 	sev();
494*9fd9f1d0Sshengfei Xu 
495*9fd9f1d0Sshengfei Xu 	do {
496*9fd9f1d0Sshengfei Xu 		tmp = mmio_read_32(PMU_BASE + PMU_CLUSTER_PWR_ST);
497*9fd9f1d0Sshengfei Xu 	} while ((tmp & 0xe) != 0xe);
498*9fd9f1d0Sshengfei Xu }
499*9fd9f1d0Sshengfei Xu 
500*9fd9f1d0Sshengfei Xu void plat_rockchip_pmu_init(void)
501*9fd9f1d0Sshengfei Xu {
502*9fd9f1d0Sshengfei Xu 	uint32_t cpu;
503*9fd9f1d0Sshengfei Xu 
504*9fd9f1d0Sshengfei Xu 	rockchip_pd_lock_init();
505*9fd9f1d0Sshengfei Xu 	nonboot_cpus_off();
506*9fd9f1d0Sshengfei Xu 	for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++)
507*9fd9f1d0Sshengfei Xu 		cpuson_flags[cpu] = PMU_CPU_HOTPLUG;
508*9fd9f1d0Sshengfei Xu 
509*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->ddr_data = (uint64_t)0;
510*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->sp = PSRAM_SP_TOP;
511*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->ddr_flag = 0x00;
512*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->boot_mpidr = read_mpidr_el1() & 0xffff;
513*9fd9f1d0Sshengfei Xu 	psram_sleep_cfg->pm_flag = PM_WARM_BOOT_BIT;
514*9fd9f1d0Sshengfei Xu 
515*9fd9f1d0Sshengfei Xu 	/*
516*9fd9f1d0Sshengfei Xu 	 * When perform idle operation, corresponding clock can be
517*9fd9f1d0Sshengfei Xu 	 * opened or gated automatically.
518*9fd9f1d0Sshengfei Xu 	 */
519*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_NOC_AUTO_CON0, 0xffffffff);
520*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMU_BASE + PMU_NOC_AUTO_CON1, 0x00070007);
521*9fd9f1d0Sshengfei Xu 
522*9fd9f1d0Sshengfei Xu 	/* grf_con_pmic_sleep_sel
523*9fd9f1d0Sshengfei Xu 	 * pmic sleep function selection
524*9fd9f1d0Sshengfei Xu 	 * 1'b0: From reset pulse generator, can reset external PMIC
525*9fd9f1d0Sshengfei Xu 	 * 1'b1: From pmu block, only support sleep function for external PMIC
526*9fd9f1d0Sshengfei Xu 	 */
527*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUGRF_BASE + PMU_GRF_SOC_CON(0), 0x00800080);
528*9fd9f1d0Sshengfei Xu 
529*9fd9f1d0Sshengfei Xu 	/*
530*9fd9f1d0Sshengfei Xu 	 * force jtag control
531*9fd9f1d0Sshengfei Xu 	 * 1'b0: CPU debug port IO mux is controlled by sdmmc_detect_en status
532*9fd9f1d0Sshengfei Xu 	 * 1'b0: CPU debug port IO mux IS controlled by GRF
533*9fd9f1d0Sshengfei Xu 	 */
534*9fd9f1d0Sshengfei Xu 	mmio_write_32(SGRF_BASE + 0x008, 0x00100000);
535*9fd9f1d0Sshengfei Xu 
536*9fd9f1d0Sshengfei Xu 	/*
537*9fd9f1d0Sshengfei Xu 	 * remap
538*9fd9f1d0Sshengfei Xu 	 * 2'b00: Boot from boot-rom.
539*9fd9f1d0Sshengfei Xu 	 * 2'b01: Boot from pmu mem.
540*9fd9f1d0Sshengfei Xu 	 * 2'b10: Boot from sys mem.
541*9fd9f1d0Sshengfei Xu 	 */
542*9fd9f1d0Sshengfei Xu 	mmio_write_32(PMUSGRF_BASE + PMU_SGRF_SOC_CON1, 0x18000800);
543*9fd9f1d0Sshengfei Xu }
544