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