16fba6e04STony Xie /*
26fba6e04STony Xie * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
36fba6e04STony Xie *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
56fba6e04STony Xie */
66fba6e04STony Xie
7941c7147SXing Zheng #include <assert.h>
809d40e0eSAntonio Nino Diaz
909d40e0eSAntonio Nino Diaz #include <platform_def.h>
1009d40e0eSAntonio Nino Diaz
1109d40e0eSAntonio Nino Diaz #include <arch_helpers.h>
1209d40e0eSAntonio Nino Diaz #include <common/debug.h>
1309d40e0eSAntonio Nino Diaz #include <drivers/delay_timer.h>
1409d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
1509d40e0eSAntonio Nino Diaz
16f91b969cSDerek Basehore #include <dfs.h>
17f91b969cSDerek Basehore #include <dram.h>
18977001aaSXing Zheng #include <m0_ctl.h>
196fba6e04STony Xie #include <plat_private.h>
20b4899041SPiotr Szczepanik #include <pmu.h>
216fba6e04STony Xie #include <rk3399_def.h>
22e3525114SXing Zheng #include <secure.h>
236fba6e04STony Xie #include <soc.h>
246fba6e04STony Xie
256fba6e04STony Xie /* Table of regions to map using the MMU. */
266fba6e04STony Xie const mmap_region_t plat_rk_mmap[] = {
271830f790SXing Zheng MAP_REGION_FLAT(DEV_RNG0_BASE, DEV_RNG0_SIZE,
289ec78bdfSTony Xie MT_DEVICE | MT_RW | MT_SECURE),
294c127e68SCaesar Wang MAP_REGION_FLAT(PMUSRAM_BASE, PMUSRAM_SIZE,
304c127e68SCaesar Wang MT_MEMORY | MT_RW | MT_SECURE),
319ec78bdfSTony Xie
326fba6e04STony Xie { 0 }
336fba6e04STony Xie };
346fba6e04STony Xie
356fba6e04STony Xie /* The RockChip power domain tree descriptor */
366fba6e04STony Xie const unsigned char rockchip_power_domain_tree_desc[] = {
376fba6e04STony Xie /* No of root nodes */
386fba6e04STony Xie PLATFORM_SYSTEM_COUNT,
396fba6e04STony Xie /* No of children for the root node */
406fba6e04STony Xie PLATFORM_CLUSTER_COUNT,
416fba6e04STony Xie /* No of children for the first cluster node */
426fba6e04STony Xie PLATFORM_CLUSTER0_CORE_COUNT,
436fba6e04STony Xie /* No of children for the second cluster node */
446fba6e04STony Xie PLATFORM_CLUSTER1_CORE_COUNT
456fba6e04STony Xie };
466fba6e04STony Xie
47e3525114SXing Zheng /* sleep data for pll suspend */
48e3525114SXing Zheng static struct deepsleep_data_s slp_data;
49941c7147SXing Zheng
505b886432SDerek Basehore /* sleep data that needs to be accessed from pmusram */
515b886432SDerek Basehore __pmusramdata struct pmu_sleep_data pmu_slp_data;
525b886432SDerek Basehore
set_pll_slow_mode(uint32_t pll_id)536fba6e04STony Xie static void set_pll_slow_mode(uint32_t pll_id)
546fba6e04STony Xie {
556fba6e04STony Xie if (pll_id == PPLL_ID)
566fba6e04STony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_PPLL_CON(3), PLL_SLOW_MODE);
576fba6e04STony Xie else
586fba6e04STony Xie mmio_write_32((CRU_BASE +
596fba6e04STony Xie CRU_PLL_CON(pll_id, 3)), PLL_SLOW_MODE);
606fba6e04STony Xie }
616fba6e04STony Xie
set_pll_normal_mode(uint32_t pll_id)626fba6e04STony Xie static void set_pll_normal_mode(uint32_t pll_id)
636fba6e04STony Xie {
646fba6e04STony Xie if (pll_id == PPLL_ID)
656fba6e04STony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_PPLL_CON(3), PLL_NOMAL_MODE);
666fba6e04STony Xie else
676fba6e04STony Xie mmio_write_32(CRU_BASE +
686fba6e04STony Xie CRU_PLL_CON(pll_id, 3), PLL_NOMAL_MODE);
696fba6e04STony Xie }
706fba6e04STony Xie
set_pll_bypass(uint32_t pll_id)716fba6e04STony Xie static void set_pll_bypass(uint32_t pll_id)
726fba6e04STony Xie {
736fba6e04STony Xie if (pll_id == PPLL_ID)
746fba6e04STony Xie mmio_write_32(PMUCRU_BASE +
756fba6e04STony Xie PMUCRU_PPLL_CON(3), PLL_BYPASS_MODE);
766fba6e04STony Xie else
776fba6e04STony Xie mmio_write_32(CRU_BASE +
786fba6e04STony Xie CRU_PLL_CON(pll_id, 3), PLL_BYPASS_MODE);
796fba6e04STony Xie }
806fba6e04STony Xie
_pll_suspend(uint32_t pll_id)816fba6e04STony Xie static void _pll_suspend(uint32_t pll_id)
826fba6e04STony Xie {
836fba6e04STony Xie set_pll_slow_mode(pll_id);
846fba6e04STony Xie set_pll_bypass(pll_id);
856fba6e04STony Xie }
866fba6e04STony Xie
874c127e68SCaesar Wang /**
884c127e68SCaesar Wang * disable_dvfs_plls - To suspend the specific PLLs
894c127e68SCaesar Wang *
904c127e68SCaesar Wang * When we close the center logic, the DPLL will be closed,
914c127e68SCaesar Wang * so we need to keep the ABPLL and switch to it to supply
924c127e68SCaesar Wang * clock for DDR during suspend, then we should not close
934c127e68SCaesar Wang * the ABPLL and exclude ABPLL_ID.
944c127e68SCaesar Wang */
disable_dvfs_plls(void)955d3b1067SCaesar Wang void disable_dvfs_plls(void)
965d3b1067SCaesar Wang {
975d3b1067SCaesar Wang _pll_suspend(CPLL_ID);
985d3b1067SCaesar Wang _pll_suspend(NPLL_ID);
995d3b1067SCaesar Wang _pll_suspend(VPLL_ID);
1005d3b1067SCaesar Wang _pll_suspend(GPLL_ID);
1015d3b1067SCaesar Wang _pll_suspend(ALPLL_ID);
1025d3b1067SCaesar Wang }
1035d3b1067SCaesar Wang
1044c127e68SCaesar Wang /**
1054c127e68SCaesar Wang * disable_nodvfs_plls - To suspend the PPLL
1064c127e68SCaesar Wang */
disable_nodvfs_plls(void)1075d3b1067SCaesar Wang void disable_nodvfs_plls(void)
1085d3b1067SCaesar Wang {
1095d3b1067SCaesar Wang _pll_suspend(PPLL_ID);
1105d3b1067SCaesar Wang }
1115d3b1067SCaesar Wang
1124c127e68SCaesar Wang /**
1134c127e68SCaesar Wang * restore_pll - Copy PLL settings from memory to a PLL.
1144c127e68SCaesar Wang *
1154c127e68SCaesar Wang * This will copy PLL settings from an array in memory to the memory mapped
1164c127e68SCaesar Wang * registers for a PLL.
1174c127e68SCaesar Wang *
1184c127e68SCaesar Wang * Note that: above the PLL exclude PPLL.
1194c127e68SCaesar Wang *
1204c127e68SCaesar Wang * pll_id: One of the values from enum plls_id
1214c127e68SCaesar Wang * src: Pointer to the array of values to restore from
1224c127e68SCaesar Wang */
restore_pll(int pll_id,uint32_t * src)1234c127e68SCaesar Wang static void restore_pll(int pll_id, uint32_t *src)
1244c127e68SCaesar Wang {
1254c127e68SCaesar Wang /* Nice to have PLL off while configuring */
1264c127e68SCaesar Wang mmio_write_32((CRU_BASE + CRU_PLL_CON(pll_id, 3)), PLL_SLOW_MODE);
1274c127e68SCaesar Wang
1284c127e68SCaesar Wang mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 0), src[0] | REG_SOC_WMSK);
1294c127e68SCaesar Wang mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 1), src[1] | REG_SOC_WMSK);
1304c127e68SCaesar Wang mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 2), src[2]);
1314c127e68SCaesar Wang mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 4), src[4] | REG_SOC_WMSK);
1324c127e68SCaesar Wang mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 5), src[5] | REG_SOC_WMSK);
1334c127e68SCaesar Wang
1344c127e68SCaesar Wang /* Do PLL_CON3 since that will enable things */
1354c127e68SCaesar Wang mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 3), src[3] | REG_SOC_WMSK);
1364c127e68SCaesar Wang
1374c127e68SCaesar Wang /* Wait for PLL lock done */
1384c127e68SCaesar Wang while ((mmio_read_32(CRU_BASE + CRU_PLL_CON(pll_id, 2)) &
1394c127e68SCaesar Wang 0x80000000) == 0x0)
1404c127e68SCaesar Wang ;
1414c127e68SCaesar Wang }
1424c127e68SCaesar Wang
1434c127e68SCaesar Wang /**
1444c127e68SCaesar Wang * save_pll - Copy PLL settings a PLL to memory
1454c127e68SCaesar Wang *
1464c127e68SCaesar Wang * This will copy PLL settings from the memory mapped registers for a PLL to
1474c127e68SCaesar Wang * an array in memory.
1484c127e68SCaesar Wang *
1494c127e68SCaesar Wang * Note that: above the PLL exclude PPLL.
1504c127e68SCaesar Wang *
1514c127e68SCaesar Wang * pll_id: One of the values from enum plls_id
1524c127e68SCaesar Wang * src: Pointer to the array of values to save to.
1534c127e68SCaesar Wang */
save_pll(uint32_t * dst,int pll_id)1544c127e68SCaesar Wang static void save_pll(uint32_t *dst, int pll_id)
1554c127e68SCaesar Wang {
1564c127e68SCaesar Wang int i;
1574c127e68SCaesar Wang
1584c127e68SCaesar Wang for (i = 0; i < PLL_CON_COUNT; i++)
1594c127e68SCaesar Wang dst[i] = mmio_read_32(CRU_BASE + CRU_PLL_CON(pll_id, i));
1604c127e68SCaesar Wang }
1614c127e68SCaesar Wang
1624c127e68SCaesar Wang /**
1634c127e68SCaesar Wang * prepare_abpll_for_ddrctrl - Copy DPLL settings to ABPLL
1644c127e68SCaesar Wang *
1654c127e68SCaesar Wang * This will copy DPLL settings from the memory mapped registers for a PLL to
1664c127e68SCaesar Wang * an array in memory.
1674c127e68SCaesar Wang */
prepare_abpll_for_ddrctrl(void)1684c127e68SCaesar Wang void prepare_abpll_for_ddrctrl(void)
1694c127e68SCaesar Wang {
1704c127e68SCaesar Wang save_pll(slp_data.plls_con[ABPLL_ID], ABPLL_ID);
1714c127e68SCaesar Wang save_pll(slp_data.plls_con[DPLL_ID], DPLL_ID);
1724c127e68SCaesar Wang
1734c127e68SCaesar Wang restore_pll(ABPLL_ID, slp_data.plls_con[DPLL_ID]);
1744c127e68SCaesar Wang }
1754c127e68SCaesar Wang
restore_abpll(void)1764c127e68SCaesar Wang void restore_abpll(void)
1774c127e68SCaesar Wang {
1784c127e68SCaesar Wang restore_pll(ABPLL_ID, slp_data.plls_con[ABPLL_ID]);
1794c127e68SCaesar Wang }
1804c127e68SCaesar Wang
clk_gate_con_save(void)1819ec78bdfSTony Xie void clk_gate_con_save(void)
1829ec78bdfSTony Xie {
1839ec78bdfSTony Xie uint32_t i = 0;
1849ec78bdfSTony Xie
1859ec78bdfSTony Xie for (i = 0; i < PMUCRU_GATE_COUNT; i++)
1869ec78bdfSTony Xie slp_data.pmucru_gate_con[i] =
1879ec78bdfSTony Xie mmio_read_32(PMUCRU_BASE + PMUCRU_GATE_CON(i));
1889ec78bdfSTony Xie
1899ec78bdfSTony Xie for (i = 0; i < CRU_GATE_COUNT; i++)
1909ec78bdfSTony Xie slp_data.cru_gate_con[i] =
1919ec78bdfSTony Xie mmio_read_32(CRU_BASE + CRU_GATE_CON(i));
1929ec78bdfSTony Xie }
1939ec78bdfSTony Xie
clk_gate_con_disable(void)1949ec78bdfSTony Xie void clk_gate_con_disable(void)
1959ec78bdfSTony Xie {
1969ec78bdfSTony Xie uint32_t i;
1979ec78bdfSTony Xie
1989ec78bdfSTony Xie for (i = 0; i < PMUCRU_GATE_COUNT; i++)
1999ec78bdfSTony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_GATE_CON(i), REG_SOC_WMSK);
2009ec78bdfSTony Xie
2019ec78bdfSTony Xie for (i = 0; i < CRU_GATE_COUNT; i++)
2029ec78bdfSTony Xie mmio_write_32(CRU_BASE + CRU_GATE_CON(i), REG_SOC_WMSK);
2039ec78bdfSTony Xie }
2049ec78bdfSTony Xie
clk_gate_con_restore(void)2059ec78bdfSTony Xie void clk_gate_con_restore(void)
2069ec78bdfSTony Xie {
2079ec78bdfSTony Xie uint32_t i;
2089ec78bdfSTony Xie
2099ec78bdfSTony Xie for (i = 0; i < PMUCRU_GATE_COUNT; i++)
2109ec78bdfSTony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_GATE_CON(i),
2119ec78bdfSTony Xie REG_SOC_WMSK | slp_data.pmucru_gate_con[i]);
2129ec78bdfSTony Xie
2139ec78bdfSTony Xie for (i = 0; i < CRU_GATE_COUNT; i++)
2149ec78bdfSTony Xie mmio_write_32(CRU_BASE + CRU_GATE_CON(i),
2159ec78bdfSTony Xie REG_SOC_WMSK | slp_data.cru_gate_con[i]);
2169ec78bdfSTony Xie }
2179ec78bdfSTony Xie
set_plls_nobypass(uint32_t pll_id)2186fba6e04STony Xie static void set_plls_nobypass(uint32_t pll_id)
2196fba6e04STony Xie {
2206fba6e04STony Xie if (pll_id == PPLL_ID)
2216fba6e04STony Xie mmio_write_32(PMUCRU_BASE + PMUCRU_PPLL_CON(3),
2226fba6e04STony Xie PLL_NO_BYPASS_MODE);
2236fba6e04STony Xie else
2246fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_PLL_CON(pll_id, 3),
2256fba6e04STony Xie PLL_NO_BYPASS_MODE);
2266fba6e04STony Xie }
2276fba6e04STony Xie
_pll_resume(uint32_t pll_id)2285d3b1067SCaesar Wang static void _pll_resume(uint32_t pll_id)
2295d3b1067SCaesar Wang {
2305d3b1067SCaesar Wang set_plls_nobypass(pll_id);
2315d3b1067SCaesar Wang set_pll_normal_mode(pll_id);
2325d3b1067SCaesar Wang }
2335d3b1067SCaesar Wang
set_pmu_rsthold(void)234a109ec92SLin Huang void set_pmu_rsthold(void)
235a109ec92SLin Huang {
236a109ec92SLin Huang uint32_t rstnhold_cofig0;
237a109ec92SLin Huang uint32_t rstnhold_cofig1;
238a109ec92SLin Huang
2395b886432SDerek Basehore pmu_slp_data.pmucru_rstnhold_con0 = mmio_read_32(PMUCRU_BASE +
240a109ec92SLin Huang PMUCRU_RSTNHOLD_CON0);
2415b886432SDerek Basehore pmu_slp_data.pmucru_rstnhold_con1 = mmio_read_32(PMUCRU_BASE +
242a109ec92SLin Huang PMUCRU_RSTNHOLD_CON1);
243a109ec92SLin Huang rstnhold_cofig0 = BIT_WITH_WMSK(PRESETN_NOC_PMU_HOLD) |
244a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_INTMEM_PMU_HOLD) |
245a109ec92SLin Huang BIT_WITH_WMSK(HRESETN_CM0S_PMU_HOLD) |
246a109ec92SLin Huang BIT_WITH_WMSK(HRESETN_CM0S_NOC_PMU_HOLD) |
247a109ec92SLin Huang BIT_WITH_WMSK(DRESETN_CM0S_PMU_HOLD) |
248a109ec92SLin Huang BIT_WITH_WMSK(POESETN_CM0S_PMU_HOLD) |
249a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_TIMER_PMU_0_1_HOLD) |
250a109ec92SLin Huang BIT_WITH_WMSK(RESETN_TIMER_PMU_0_HOLD) |
251a109ec92SLin Huang BIT_WITH_WMSK(RESETN_TIMER_PMU_1_HOLD) |
252a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_UART_M0_PMU_HOLD) |
253a109ec92SLin Huang BIT_WITH_WMSK(RESETN_UART_M0_PMU_HOLD) |
254a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_WDT_PMU_HOLD);
255a109ec92SLin Huang rstnhold_cofig1 = BIT_WITH_WMSK(PRESETN_RKPWM_PMU_HOLD) |
256a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_PMUGRF_HOLD) |
257a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_SGRF_HOLD) |
258a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_GPIO0_HOLD) |
259a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_GPIO1_HOLD) |
260a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_CRU_PMU_HOLD) |
261a109ec92SLin Huang BIT_WITH_WMSK(PRESETN_PVTM_PMU_HOLD);
262a109ec92SLin Huang
263a109ec92SLin Huang mmio_write_32(PMUCRU_BASE + PMUCRU_RSTNHOLD_CON0, rstnhold_cofig0);
264a109ec92SLin Huang mmio_write_32(PMUCRU_BASE + PMUCRU_RSTNHOLD_CON1, rstnhold_cofig1);
265a109ec92SLin Huang }
266a109ec92SLin Huang
pmu_sgrf_rst_hld(void)2675b886432SDerek Basehore void pmu_sgrf_rst_hld(void)
2685b886432SDerek Basehore {
2695b886432SDerek Basehore mmio_write_32(PMUCRU_BASE + CRU_PMU_RSTHOLD_CON(1),
2705b886432SDerek Basehore CRU_PMU_SGRF_RST_HOLD);
2715b886432SDerek Basehore }
2725b886432SDerek Basehore
2735b886432SDerek Basehore /*
2745b886432SDerek Basehore * When system reset in running state, we want the cpus to be reboot
2755b886432SDerek Basehore * from maskrom (system reboot),
2765b886432SDerek Basehore * the pmusgrf reset-hold bits needs to be released.
2775b886432SDerek Basehore * When system wake up from system deep suspend, some soc will be reset
2785b886432SDerek Basehore * when waked up,
2795b886432SDerek Basehore * we want the bootcpu to be reboot from pmusram,
2805b886432SDerek Basehore * the pmusgrf reset-hold bits needs to be held.
2815b886432SDerek Basehore */
pmu_sgrf_rst_hld_release(void)2825b886432SDerek Basehore __pmusramfunc void pmu_sgrf_rst_hld_release(void)
2835b886432SDerek Basehore {
2845b886432SDerek Basehore mmio_write_32(PMUCRU_BASE + CRU_PMU_RSTHOLD_CON(1),
2855b886432SDerek Basehore CRU_PMU_SGRF_RST_RLS);
2865b886432SDerek Basehore }
2875b886432SDerek Basehore
restore_pmu_rsthold(void)2885b886432SDerek Basehore __pmusramfunc void restore_pmu_rsthold(void)
289a109ec92SLin Huang {
290a109ec92SLin Huang mmio_write_32(PMUCRU_BASE + PMUCRU_RSTNHOLD_CON0,
2915b886432SDerek Basehore pmu_slp_data.pmucru_rstnhold_con0 | REG_SOC_WMSK);
292a109ec92SLin Huang mmio_write_32(PMUCRU_BASE + PMUCRU_RSTNHOLD_CON1,
2935b886432SDerek Basehore pmu_slp_data.pmucru_rstnhold_con1 | REG_SOC_WMSK);
294a109ec92SLin Huang }
295a109ec92SLin Huang
2964c127e68SCaesar Wang /**
2974c127e68SCaesar Wang * enable_dvfs_plls - To resume the specific PLLs
2984c127e68SCaesar Wang *
2994c127e68SCaesar Wang * Please see the comment at the disable_dvfs_plls()
3004c127e68SCaesar Wang * we don't suspend the ABPLL, so don't need resume
3014c127e68SCaesar Wang * it too.
3024c127e68SCaesar Wang */
enable_dvfs_plls(void)3035d3b1067SCaesar Wang void enable_dvfs_plls(void)
3046fba6e04STony Xie {
3055d3b1067SCaesar Wang _pll_resume(ALPLL_ID);
3065d3b1067SCaesar Wang _pll_resume(GPLL_ID);
3075d3b1067SCaesar Wang _pll_resume(VPLL_ID);
3085d3b1067SCaesar Wang _pll_resume(NPLL_ID);
3095d3b1067SCaesar Wang _pll_resume(CPLL_ID);
3106fba6e04STony Xie }
3115d3b1067SCaesar Wang
3124c127e68SCaesar Wang /**
3134c127e68SCaesar Wang * enable_nodvfs_plls - To resume the PPLL
3144c127e68SCaesar Wang */
enable_nodvfs_plls(void)3155d3b1067SCaesar Wang void enable_nodvfs_plls(void)
3165d3b1067SCaesar Wang {
3175d3b1067SCaesar Wang _pll_resume(PPLL_ID);
3186fba6e04STony Xie }
3196fba6e04STony Xie
soc_global_soft_reset_init(void)3206fba6e04STony Xie void soc_global_soft_reset_init(void)
3216fba6e04STony Xie {
3226fba6e04STony Xie mmio_write_32(PMUCRU_BASE + CRU_PMU_RSTHOLD_CON(1),
3236fba6e04STony Xie CRU_PMU_SGRF_RST_RLS);
324f47a25ddSCaesar Wang
325f47a25ddSCaesar Wang mmio_clrbits_32(CRU_BASE + CRU_GLB_RST_CON,
326f47a25ddSCaesar Wang CRU_PMU_WDTRST_MSK | CRU_PMU_FIRST_SFTRST_MSK);
3276fba6e04STony Xie }
3286fba6e04STony Xie
soc_global_soft_reset(void)3296fba6e04STony Xie void __dead2 soc_global_soft_reset(void)
3306fba6e04STony Xie {
331b4899041SPiotr Szczepanik pmu_power_domains_on();
3326fba6e04STony Xie set_pll_slow_mode(VPLL_ID);
3336fba6e04STony Xie set_pll_slow_mode(NPLL_ID);
3346fba6e04STony Xie set_pll_slow_mode(GPLL_ID);
3356fba6e04STony Xie set_pll_slow_mode(CPLL_ID);
3366fba6e04STony Xie set_pll_slow_mode(PPLL_ID);
3376fba6e04STony Xie set_pll_slow_mode(ABPLL_ID);
3386fba6e04STony Xie set_pll_slow_mode(ALPLL_ID);
339f47a25ddSCaesar Wang
340f47a25ddSCaesar Wang dsb();
341f47a25ddSCaesar Wang
3426fba6e04STony Xie mmio_write_32(CRU_BASE + CRU_GLB_SRST_FST, GLB_SRST_FST_CFG_VAL);
3436fba6e04STony Xie
3446fba6e04STony Xie /*
3456fba6e04STony Xie * Maybe the HW needs some times to reset the system,
346*1b491eeaSElyes Haouas * so we do not hope the core to execute valid codes.
3476fba6e04STony Xie */
3486fba6e04STony Xie while (1)
3496fba6e04STony Xie ;
3506fba6e04STony Xie }
3516fba6e04STony Xie
plat_rockchip_soc_init(void)3526fba6e04STony Xie void plat_rockchip_soc_init(void)
3536fba6e04STony Xie {
3546fba6e04STony Xie secure_timer_init();
355e3525114SXing Zheng secure_sgrf_init();
356941c7147SXing Zheng secure_sgrf_ddr_rgn_init();
3576fba6e04STony Xie soc_global_soft_reset_init();
3589901dcf6SCaesar Wang plat_rockchip_gpio_init();
359977001aaSXing Zheng m0_init();
360613038bcSCaesar Wang dram_init();
361f91b969cSDerek Basehore dram_dfs_init();
3626fba6e04STony Xie }
363