1*6fba6e04STony Xie /* 2*6fba6e04STony Xie * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3*6fba6e04STony Xie * 4*6fba6e04STony Xie * Redistribution and use in source and binary forms, with or without 5*6fba6e04STony Xie * modification, are permitted provided that the following conditions are met: 6*6fba6e04STony Xie * 7*6fba6e04STony Xie * Redistributions of source code must retain the above copyright notice, this 8*6fba6e04STony Xie * list of conditions and the following disclaimer. 9*6fba6e04STony Xie * 10*6fba6e04STony Xie * Redistributions in binary form must reproduce the above copyright notice, 11*6fba6e04STony Xie * this list of conditions and the following disclaimer in the documentation 12*6fba6e04STony Xie * and/or other materials provided with the distribution. 13*6fba6e04STony Xie * 14*6fba6e04STony Xie * Neither the name of ARM nor the names of its contributors may be used 15*6fba6e04STony Xie * to endorse or promote products derived from this software without specific 16*6fba6e04STony Xie * prior written permission. 17*6fba6e04STony Xie * 18*6fba6e04STony Xie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*6fba6e04STony Xie * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*6fba6e04STony Xie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*6fba6e04STony Xie * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*6fba6e04STony Xie * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*6fba6e04STony Xie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*6fba6e04STony Xie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*6fba6e04STony Xie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*6fba6e04STony Xie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*6fba6e04STony Xie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*6fba6e04STony Xie * POSSIBILITY OF SUCH DAMAGE. 29*6fba6e04STony Xie */ 30*6fba6e04STony Xie 31*6fba6e04STony Xie #include <arch_helpers.h> 32*6fba6e04STony Xie #include <debug.h> 33*6fba6e04STony Xie #include <delay_timer.h> 34*6fba6e04STony Xie #include <mmio.h> 35*6fba6e04STony Xie #include <platform_def.h> 36*6fba6e04STony Xie #include <plat_private.h> 37*6fba6e04STony Xie #include <rk3399_def.h> 38*6fba6e04STony Xie #include <soc.h> 39*6fba6e04STony Xie 40*6fba6e04STony Xie /* Table of regions to map using the MMU. */ 41*6fba6e04STony Xie const mmap_region_t plat_rk_mmap[] = { 42*6fba6e04STony Xie MAP_REGION_FLAT(GIC500_BASE, GIC500_SIZE, 43*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 44*6fba6e04STony Xie MAP_REGION_FLAT(CCI500_BASE, CCI500_SIZE, 45*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 46*6fba6e04STony Xie MAP_REGION_FLAT(STIME_BASE, STIME_SIZE, 47*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 48*6fba6e04STony Xie MAP_REGION_FLAT(CRUS_BASE, CRUS_SIZE, 49*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 50*6fba6e04STony Xie MAP_REGION_FLAT(SGRF_BASE, SGRF_SIZE, 51*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 52*6fba6e04STony Xie MAP_REGION_FLAT(PMU_BASE, PMU_SIZE, 53*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_NS), 54*6fba6e04STony Xie MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE, 55*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 56*6fba6e04STony Xie MAP_REGION_FLAT(RK3399_UART2_BASE, RK3399_UART2_SIZE, 57*6fba6e04STony Xie MT_DEVICE | MT_RW | MT_SECURE), 58*6fba6e04STony Xie { 0 } 59*6fba6e04STony Xie }; 60*6fba6e04STony Xie 61*6fba6e04STony Xie /* The RockChip power domain tree descriptor */ 62*6fba6e04STony Xie const unsigned char rockchip_power_domain_tree_desc[] = { 63*6fba6e04STony Xie /* No of root nodes */ 64*6fba6e04STony Xie PLATFORM_SYSTEM_COUNT, 65*6fba6e04STony Xie /* No of children for the root node */ 66*6fba6e04STony Xie PLATFORM_CLUSTER_COUNT, 67*6fba6e04STony Xie /* No of children for the first cluster node */ 68*6fba6e04STony Xie PLATFORM_CLUSTER0_CORE_COUNT, 69*6fba6e04STony Xie /* No of children for the second cluster node */ 70*6fba6e04STony Xie PLATFORM_CLUSTER1_CORE_COUNT 71*6fba6e04STony Xie }; 72*6fba6e04STony Xie 73*6fba6e04STony Xie void secure_timer_init(void) 74*6fba6e04STony Xie { 75*6fba6e04STony Xie mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_END_COUNT0, 0xffffffff); 76*6fba6e04STony Xie mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_END_COUNT1, 0xffffffff); 77*6fba6e04STony Xie 78*6fba6e04STony Xie mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_INIT_COUNT0, 0x0); 79*6fba6e04STony Xie mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_INIT_COUNT0, 0x0); 80*6fba6e04STony Xie 81*6fba6e04STony Xie /* auto reload & enable the timer */ 82*6fba6e04STony Xie mmio_write_32(STIMER1_CHN_BASE(5) + TIMER_CONTROL_REG, 83*6fba6e04STony Xie TIMER_EN | TIMER_FMODE); 84*6fba6e04STony Xie } 85*6fba6e04STony Xie 86*6fba6e04STony Xie void sgrf_init(void) 87*6fba6e04STony Xie { 88*6fba6e04STony Xie /* security config for master */ 89*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(5), 90*6fba6e04STony Xie SGRF_SOC_CON_WMSK | SGRF_SOC_ALLMST_NS); 91*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(6), 92*6fba6e04STony Xie SGRF_SOC_CON_WMSK | SGRF_SOC_ALLMST_NS); 93*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON3_7(7), 94*6fba6e04STony Xie SGRF_SOC_CON_WMSK | SGRF_SOC_ALLMST_NS); 95*6fba6e04STony Xie 96*6fba6e04STony Xie /* security config for slave */ 97*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_PMU_SLV_CON0_1(0), 98*6fba6e04STony Xie SGRF_PMU_SLV_S_CFGED | 99*6fba6e04STony Xie SGRF_PMU_SLV_CRYPTO1_NS); 100*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_PMU_SLV_CON0_1(1), 101*6fba6e04STony Xie SGRF_PMU_SLV_CON1_CFG); 102*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SLV_SECURE_CON0_4(0), 103*6fba6e04STony Xie SGRF_SLV_S_WMSK | SGRF_SLV_S_ALL_NS); 104*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SLV_SECURE_CON0_4(1), 105*6fba6e04STony Xie SGRF_SLV_S_WMSK | SGRF_SLV_S_ALL_NS); 106*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SLV_SECURE_CON0_4(2), 107*6fba6e04STony Xie SGRF_SLV_S_WMSK | SGRF_SLV_S_ALL_NS); 108*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SLV_SECURE_CON0_4(3), 109*6fba6e04STony Xie SGRF_SLV_S_WMSK | SGRF_SLV_S_ALL_NS); 110*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SLV_SECURE_CON0_4(4), 111*6fba6e04STony Xie SGRF_SLV_S_WMSK | SGRF_SLV_S_ALL_NS); 112*6fba6e04STony Xie 113*6fba6e04STony Xie /* security config for ddr memery */ 114*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_DDRRGN_CON0_16(16), 115*6fba6e04STony Xie SGRF_DDR_RGN_BYPS); 116*6fba6e04STony Xie } 117*6fba6e04STony Xie 118*6fba6e04STony Xie static void dma_secure_cfg(uint32_t secure) 119*6fba6e04STony Xie { 120*6fba6e04STony Xie if (secure) { 121*6fba6e04STony Xie /* rgn0 secure for dmac0 and dmac1 */ 122*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_DDRRGN_CON20_34(22), 123*6fba6e04STony Xie SGRF_L_MST_S_DDR_RGN(0) | /* dmac0 */ 124*6fba6e04STony Xie SGRF_H_MST_S_DDR_RGN(0) /* dmac1 */ 125*6fba6e04STony Xie ); 126*6fba6e04STony Xie 127*6fba6e04STony Xie /* set dmac0 boot, under secure state */ 128*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(8), 129*6fba6e04STony Xie SGRF_DMAC_CFG_S); 130*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(9), 131*6fba6e04STony Xie SGRF_DMAC_CFG_S); 132*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(10), 133*6fba6e04STony Xie SGRF_DMAC_CFG_S); 134*6fba6e04STony Xie 135*6fba6e04STony Xie /* dmac0 soft reset */ 136*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 137*6fba6e04STony Xie CRU_DMAC0_RST); 138*6fba6e04STony Xie udelay(5); 139*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 140*6fba6e04STony Xie CRU_DMAC0_RST_RLS); 141*6fba6e04STony Xie 142*6fba6e04STony Xie /* set dmac1 boot, under secure state */ 143*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(11), 144*6fba6e04STony Xie SGRF_DMAC_CFG_S); 145*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(12), 146*6fba6e04STony Xie SGRF_DMAC_CFG_S); 147*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(13), 148*6fba6e04STony Xie SGRF_DMAC_CFG_S); 149*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(14), 150*6fba6e04STony Xie SGRF_DMAC_CFG_S); 151*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(15), 152*6fba6e04STony Xie SGRF_DMAC_CFG_S); 153*6fba6e04STony Xie 154*6fba6e04STony Xie /* dmac1 soft reset */ 155*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 156*6fba6e04STony Xie CRU_DMAC1_RST); 157*6fba6e04STony Xie udelay(5); 158*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 159*6fba6e04STony Xie CRU_DMAC1_RST_RLS); 160*6fba6e04STony Xie } else { 161*6fba6e04STony Xie /* rgn non-secure for dmac0 and dmac1 */ 162*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_DDRRGN_CON20_34(22), 163*6fba6e04STony Xie DMAC1_RGN_NS | DMAC0_RGN_NS); 164*6fba6e04STony Xie 165*6fba6e04STony Xie /* set dmac0 boot, under non-secure state */ 166*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(8), 167*6fba6e04STony Xie DMAC0_BOOT_CFG_NS); 168*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(9), 169*6fba6e04STony Xie DMAC0_BOOT_PERIPH_NS); 170*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(10), 171*6fba6e04STony Xie DMAC0_BOOT_ADDR_NS); 172*6fba6e04STony Xie 173*6fba6e04STony Xie /* dmac0 soft reset */ 174*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 175*6fba6e04STony Xie CRU_DMAC0_RST); 176*6fba6e04STony Xie udelay(5); 177*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 178*6fba6e04STony Xie CRU_DMAC0_RST_RLS); 179*6fba6e04STony Xie 180*6fba6e04STony Xie /* set dmac1 boot, under non-secure state */ 181*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(11), 182*6fba6e04STony Xie DMAC1_BOOT_CFG_NS); 183*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(12), 184*6fba6e04STony Xie DMAC1_BOOT_PERIPH_L_NS); 185*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(13), 186*6fba6e04STony Xie DMAC1_BOOT_ADDR_NS); 187*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(14), 188*6fba6e04STony Xie DMAC1_BOOT_PERIPH_H_NS); 189*6fba6e04STony Xie mmio_write_32(SGRF_BASE + SGRF_SOC_CON8_15(15), 190*6fba6e04STony Xie DMAC1_BOOT_IRQ_NS); 191*6fba6e04STony Xie 192*6fba6e04STony Xie /* dmac1 soft reset */ 193*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 194*6fba6e04STony Xie CRU_DMAC1_RST); 195*6fba6e04STony Xie udelay(5); 196*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_SOFTRST_CON(10), 197*6fba6e04STony Xie CRU_DMAC1_RST_RLS); 198*6fba6e04STony Xie } 199*6fba6e04STony Xie } 200*6fba6e04STony Xie 201*6fba6e04STony Xie /* pll suspend */ 202*6fba6e04STony Xie struct deepsleep_data_s slp_data; 203*6fba6e04STony Xie 204*6fba6e04STony Xie static void pll_suspend_prepare(uint32_t pll_id) 205*6fba6e04STony Xie { 206*6fba6e04STony Xie int i; 207*6fba6e04STony Xie 208*6fba6e04STony Xie if (pll_id == PPLL_ID) 209*6fba6e04STony Xie for (i = 0; i < PLL_CON_COUNT; i++) 210*6fba6e04STony Xie slp_data.plls_con[pll_id][i] = 211*6fba6e04STony Xie mmio_read_32(PMUCRU_BASE + PMUCRU_PPLL_CON(i)); 212*6fba6e04STony Xie else 213*6fba6e04STony Xie for (i = 0; i < PLL_CON_COUNT; i++) 214*6fba6e04STony Xie slp_data.plls_con[pll_id][i] = 215*6fba6e04STony Xie mmio_read_32(CRU_BASE + CRU_PLL_CON(pll_id, i)); 216*6fba6e04STony Xie } 217*6fba6e04STony Xie 218*6fba6e04STony Xie static void set_pll_slow_mode(uint32_t pll_id) 219*6fba6e04STony Xie { 220*6fba6e04STony Xie if (pll_id == PPLL_ID) 221*6fba6e04STony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_PPLL_CON(3), PLL_SLOW_MODE); 222*6fba6e04STony Xie else 223*6fba6e04STony Xie mmio_write_32((CRU_BASE + 224*6fba6e04STony Xie CRU_PLL_CON(pll_id, 3)), PLL_SLOW_MODE); 225*6fba6e04STony Xie } 226*6fba6e04STony Xie 227*6fba6e04STony Xie static void set_pll_normal_mode(uint32_t pll_id) 228*6fba6e04STony Xie { 229*6fba6e04STony Xie if (pll_id == PPLL_ID) 230*6fba6e04STony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_PPLL_CON(3), PLL_NOMAL_MODE); 231*6fba6e04STony Xie else 232*6fba6e04STony Xie mmio_write_32(CRU_BASE + 233*6fba6e04STony Xie CRU_PLL_CON(pll_id, 3), PLL_NOMAL_MODE); 234*6fba6e04STony Xie } 235*6fba6e04STony Xie 236*6fba6e04STony Xie static void set_pll_bypass(uint32_t pll_id) 237*6fba6e04STony Xie { 238*6fba6e04STony Xie if (pll_id == PPLL_ID) 239*6fba6e04STony Xie mmio_write_32(PMUCRU_BASE + 240*6fba6e04STony Xie PMUCRU_PPLL_CON(3), PLL_BYPASS_MODE); 241*6fba6e04STony Xie else 242*6fba6e04STony Xie mmio_write_32(CRU_BASE + 243*6fba6e04STony Xie CRU_PLL_CON(pll_id, 3), PLL_BYPASS_MODE); 244*6fba6e04STony Xie } 245*6fba6e04STony Xie 246*6fba6e04STony Xie static void _pll_suspend(uint32_t pll_id) 247*6fba6e04STony Xie { 248*6fba6e04STony Xie set_pll_slow_mode(pll_id); 249*6fba6e04STony Xie set_pll_bypass(pll_id); 250*6fba6e04STony Xie } 251*6fba6e04STony Xie 252*6fba6e04STony Xie void plls_suspend(void) 253*6fba6e04STony Xie { 254*6fba6e04STony Xie uint32_t i, pll_id; 255*6fba6e04STony Xie 256*6fba6e04STony Xie for (pll_id = ALPLL_ID; pll_id < END_PLL_ID; pll_id++) 257*6fba6e04STony Xie pll_suspend_prepare(pll_id); 258*6fba6e04STony Xie 259*6fba6e04STony Xie for (i = 0; i < CRU_CLKSEL_COUNT; i++) 260*6fba6e04STony Xie slp_data.cru_clksel_con[i] = 261*6fba6e04STony Xie mmio_read_32(CRU_BASE + 262*6fba6e04STony Xie CRU_CLKSEL_OFFSET + i * REG_SIZE); 263*6fba6e04STony Xie 264*6fba6e04STony Xie for (i = 0; i < PMUCRU_CLKSEL_CONUT; i++) 265*6fba6e04STony Xie slp_data.pmucru_clksel_con[i] = 266*6fba6e04STony Xie mmio_read_32(PMUCRU_BASE + 267*6fba6e04STony Xie PMUCRU_CLKSEL_OFFSET + i * REG_SIZE); 268*6fba6e04STony Xie 269*6fba6e04STony Xie _pll_suspend(CPLL_ID); 270*6fba6e04STony Xie _pll_suspend(NPLL_ID); 271*6fba6e04STony Xie _pll_suspend(VPLL_ID); 272*6fba6e04STony Xie _pll_suspend(PPLL_ID); 273*6fba6e04STony Xie _pll_suspend(GPLL_ID); 274*6fba6e04STony Xie _pll_suspend(ABPLL_ID); 275*6fba6e04STony Xie _pll_suspend(ALPLL_ID); 276*6fba6e04STony Xie } 277*6fba6e04STony Xie 278*6fba6e04STony Xie static void set_plls_nobypass(uint32_t pll_id) 279*6fba6e04STony Xie { 280*6fba6e04STony Xie if (pll_id == PPLL_ID) 281*6fba6e04STony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_PPLL_CON(3), 282*6fba6e04STony Xie PLL_NO_BYPASS_MODE); 283*6fba6e04STony Xie else 284*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 3), 285*6fba6e04STony Xie PLL_NO_BYPASS_MODE); 286*6fba6e04STony Xie } 287*6fba6e04STony Xie 288*6fba6e04STony Xie static void plls_resume_prepare(void) 289*6fba6e04STony Xie { 290*6fba6e04STony Xie int i; 291*6fba6e04STony Xie 292*6fba6e04STony Xie for (i = 0; i < CRU_CLKSEL_COUNT; i++) 293*6fba6e04STony Xie mmio_write_32((CRU_BASE + CRU_CLKSEL_OFFSET + i * REG_SIZE), 294*6fba6e04STony Xie REG_SOC_WMSK | slp_data.cru_clksel_con[i]); 295*6fba6e04STony Xie for (i = 0; i < PMUCRU_CLKSEL_CONUT; i++) 296*6fba6e04STony Xie mmio_write_32((PMUCRU_BASE + 297*6fba6e04STony Xie PMUCRU_CLKSEL_OFFSET + i * REG_SIZE), 298*6fba6e04STony Xie REG_SOC_WMSK | slp_data.pmucru_clksel_con[i]); 299*6fba6e04STony Xie } 300*6fba6e04STony Xie 301*6fba6e04STony Xie void plls_resume(void) 302*6fba6e04STony Xie { 303*6fba6e04STony Xie int pll_id; 304*6fba6e04STony Xie 305*6fba6e04STony Xie plls_resume_prepare(); 306*6fba6e04STony Xie for (pll_id = ALPLL_ID; pll_id < END_PLL_ID; pll_id++) { 307*6fba6e04STony Xie set_plls_nobypass(pll_id); 308*6fba6e04STony Xie set_pll_normal_mode(pll_id); 309*6fba6e04STony Xie } 310*6fba6e04STony Xie } 311*6fba6e04STony Xie 312*6fba6e04STony Xie void soc_global_soft_reset_init(void) 313*6fba6e04STony Xie { 314*6fba6e04STony Xie mmio_write_32(PMUCRU_BASE + CRU_PMU_RSTHOLD_CON(1), 315*6fba6e04STony Xie CRU_PMU_SGRF_RST_RLS); 316*6fba6e04STony Xie } 317*6fba6e04STony Xie 318*6fba6e04STony Xie void __dead2 soc_global_soft_reset(void) 319*6fba6e04STony Xie { 320*6fba6e04STony Xie uint32_t temp_val; 321*6fba6e04STony Xie 322*6fba6e04STony Xie set_pll_slow_mode(VPLL_ID); 323*6fba6e04STony Xie set_pll_slow_mode(NPLL_ID); 324*6fba6e04STony Xie set_pll_slow_mode(GPLL_ID); 325*6fba6e04STony Xie set_pll_slow_mode(CPLL_ID); 326*6fba6e04STony Xie set_pll_slow_mode(PPLL_ID); 327*6fba6e04STony Xie set_pll_slow_mode(ABPLL_ID); 328*6fba6e04STony Xie set_pll_slow_mode(ALPLL_ID); 329*6fba6e04STony Xie temp_val = mmio_read_32(CRU_BASE + CRU_GLB_RST_CON) | 330*6fba6e04STony Xie PMU_RST_BY_FIRST_SFT; 331*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_GLB_RST_CON, temp_val); 332*6fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_GLB_SRST_FST, GLB_SRST_FST_CFG_VAL); 333*6fba6e04STony Xie 334*6fba6e04STony Xie /* 335*6fba6e04STony Xie * Maybe the HW needs some times to reset the system, 336*6fba6e04STony Xie * so we do not hope the core to excute valid codes. 337*6fba6e04STony Xie */ 338*6fba6e04STony Xie while (1) 339*6fba6e04STony Xie ; 340*6fba6e04STony Xie } 341*6fba6e04STony Xie 342*6fba6e04STony Xie void plat_rockchip_soc_init(void) 343*6fba6e04STony Xie { 344*6fba6e04STony Xie secure_timer_init(); 345*6fba6e04STony Xie dma_secure_cfg(0); 346*6fba6e04STony Xie sgrf_init(); 347*6fba6e04STony Xie soc_global_soft_reset_init(); 348*6fba6e04STony Xie } 349