1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2022 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun #include <common.h>
7*4882a593Smuzhiyun #include <clk.h>
8*4882a593Smuzhiyun #include <dm.h>
9*4882a593Smuzhiyun #include <asm/io.h>
10*4882a593Smuzhiyun #include <asm/arch/cpu.h>
11*4882a593Smuzhiyun #include <asm/arch/hardware.h>
12*4882a593Smuzhiyun #include <asm/arch/grf_rk3562.h>
13*4882a593Smuzhiyun #include <asm/arch/ioc_rk3562.h>
14*4882a593Smuzhiyun #include <asm/arch/rk_atags.h>
15*4882a593Smuzhiyun #include <linux/libfdt.h>
16*4882a593Smuzhiyun #include <fdt_support.h>
17*4882a593Smuzhiyun #include <asm/arch/clock.h>
18*4882a593Smuzhiyun #include <dt-bindings/clock/rk3562-cru.h>
19*4882a593Smuzhiyun #include <asm/arch-rockchip/rockchip_smccc.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #define FIREWALL_DDR_BASE 0xfef00000
24*4882a593Smuzhiyun #define FW_DDR_MST3_REG 0x2c /* usb */
25*4882a593Smuzhiyun #define FW_DDR_MST4_REG 0x30 /* emmc */
26*4882a593Smuzhiyun #define FW_DDR_MST5_REG 0x34 /* fspi */
27*4882a593Smuzhiyun #define FW_DDR_MST6_REG 0x38 /* sdmmc mcu */
28*4882a593Smuzhiyun #define FW_DDR_CON_REG 0x80
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define PMU_GRF_BASE 0xff010000
31*4882a593Smuzhiyun #define PMU_GRF_SOC_CON9 0x0124
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #define SYS_GRF_BASE 0xff030000
34*4882a593Smuzhiyun #define SYS_GRF_SOC_CON5 0x0414
35*4882a593Smuzhiyun #define SYS_GRF_SOC_CON6 0x0418
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #define PERI_GRF_BASE 0xff040000
38*4882a593Smuzhiyun #define PERI_GRF_AUDIO_CON 0x0070
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #define PIPEPHY_GRF_BASE 0xff098000
41*4882a593Smuzhiyun #define PIPEPHY_PIPE_CON5 0x0014
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #define TOP_CRU_BASE 0xff100000
44*4882a593Smuzhiyun #define TOP_CRU_GATE_CON23 0x035c
45*4882a593Smuzhiyun #define TOP_CRU_SOFTRST_CON23 0x045c
46*4882a593Smuzhiyun #define TOP_CRU_CM0_GATEMASK 0x0680
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun #define PMU0_CRU_BASE 0xff110000
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define PMU1_CRU_BASE 0xff118000
51*4882a593Smuzhiyun #define PMU1_CRU_GATE_CON02 0x0188
52*4882a593Smuzhiyun #define PMU1_CRU_SOFTRST_CON02 0x0208
53*4882a593Smuzhiyun #define PMU1_CRU_CM0_GATEMASK 0x0420
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #define PMU_BASE_ADDR 0xff258000
56*4882a593Smuzhiyun #define PMU2_BIU_IDLE_SFTCON0 0x110
57*4882a593Smuzhiyun #define PMU2_BIU_IDLE_ACK_STS0 0x120
58*4882a593Smuzhiyun #define PMU2_BIT_IDLE_STS0 0x128
59*4882a593Smuzhiyun #define PMU2_PWR_GATE_SFTCON0 0x210
60*4882a593Smuzhiyun #define PMU2_PWR_GATE_STS0 0x230
61*4882a593Smuzhiyun #define PMU2_MEM_SD_SFTCON0 0x300
62*4882a593Smuzhiyun /* PMU2_PWR_GATE_SFTCON0 */
63*4882a593Smuzhiyun #define PD_GPU_DWN_SFTENA BIT(0)
64*4882a593Smuzhiyun #define PD_VI_DWN_SFTENA BIT(5)
65*4882a593Smuzhiyun #define PD_VO_DWN_SFTENA BIT(6)
66*4882a593Smuzhiyun /* PMU2_BIU_IDLE_SFTCON0 */
67*4882a593Smuzhiyun #define IDLE_REQ_GPU_SFTENA BIT(1)
68*4882a593Smuzhiyun #define IDLE_REQ_VI_SFTENA BIT(3)
69*4882a593Smuzhiyun #define IDLE_REQ_VO_SFTENA BIT(4)
70*4882a593Smuzhiyun /* PMU2_BIU_IDLE_ACK_STS0 */
71*4882a593Smuzhiyun #define IDLE_ACK_GPU BIT(1)
72*4882a593Smuzhiyun #define IDLE_ACK_VI BIT(3)
73*4882a593Smuzhiyun #define IDLE_ACK_VO BIT(4)
74*4882a593Smuzhiyun /* PMU2_BIT_IDLE_STS0 */
75*4882a593Smuzhiyun #define IDLE_GPU BIT(1)
76*4882a593Smuzhiyun #define IDLE_VI BIT(3)
77*4882a593Smuzhiyun #define IDLE_VO BIT(4)
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun #define CRYPTO_PRIORITY_REG 0xfeeb0108
80*4882a593Smuzhiyun #define DCF_PRIORITY_REG 0xfee10408
81*4882a593Smuzhiyun #define DMA2DDR_PRIORITY_REG 0xfee03808
82*4882a593Smuzhiyun #define DMAC_PRIORITY_REG 0xfeeb0208
83*4882a593Smuzhiyun #define EMMC_PRIORITY_REG 0xfeeb0308
84*4882a593Smuzhiyun #define FSPI_PRIORITY_REG 0xfeeb0408
85*4882a593Smuzhiyun #define GMAC_PRIORITY_REG 0xfee10208
86*4882a593Smuzhiyun #define GPU_PRIORITY_REG 0xfee30008
87*4882a593Smuzhiyun #define ISP_PRIORITY_REG 0xfee70008
88*4882a593Smuzhiyun #define MAC100_PRIORITY_REG 0xfee10308
89*4882a593Smuzhiyun #define MCU_PRIORITY_REG 0xfee10008
90*4882a593Smuzhiyun #define PCIE_PRIORITY_REG 0xfeea0008
91*4882a593Smuzhiyun #define RKDMA_PRIORITY_REG 0xfeeb0508
92*4882a593Smuzhiyun #define SDMMC0_PRIORITY_REG 0xfeeb0608
93*4882a593Smuzhiyun #define SDMMC1_PRIORITY_REG 0xfeeb0708
94*4882a593Smuzhiyun #define USB2_PRIORITY_REG 0xfeeb0808
95*4882a593Smuzhiyun #define USB3_PRIORITY_REG 0xfeea0108
96*4882a593Smuzhiyun #define VICAP_PRIORITY_REG 0xfee70108
97*4882a593Smuzhiyun #define VOP_PRIORITY_REG 0xfee80008
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun #define QOS_PRIORITY_LEVEL(h, l) ((((h) & 7) << 8) | ((l) & 7))
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun #ifdef CONFIG_ARM64
102*4882a593Smuzhiyun #include <asm/armv8/mmu.h>
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun static struct mm_region rk3562_mem_map[] = {
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun .virt = 0x0UL,
107*4882a593Smuzhiyun .phys = 0x0UL,
108*4882a593Smuzhiyun .size = 0xfc000000UL,
109*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
110*4882a593Smuzhiyun PTE_BLOCK_INNER_SHARE
111*4882a593Smuzhiyun }, {
112*4882a593Smuzhiyun .virt = 0xfc000000UL,
113*4882a593Smuzhiyun .phys = 0xfc000000UL,
114*4882a593Smuzhiyun .size = 0x04000000UL,
115*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
116*4882a593Smuzhiyun PTE_BLOCK_NON_SHARE |
117*4882a593Smuzhiyun PTE_BLOCK_PXN | PTE_BLOCK_UXN
118*4882a593Smuzhiyun }, {
119*4882a593Smuzhiyun /* List terminator */
120*4882a593Smuzhiyun 0,
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun struct mm_region *mem_map = rk3562_mem_map;
125*4882a593Smuzhiyun #endif
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun #define GPIO0_IOC_BASE 0xFF080000
128*4882a593Smuzhiyun #define GPIO1_IOC_BASE 0xFF060000
129*4882a593Smuzhiyun #define GPIO1A_IOMUX_SEL_L 0x0
130*4882a593Smuzhiyun #define GPIO1A_IOMUX_SEL_H 0x4
131*4882a593Smuzhiyun #define GPIO1B_IOMUX_SEL_L 0x8
132*4882a593Smuzhiyun #define GPIO1_IOC_GPIO1A_DS0 0x200
133*4882a593Smuzhiyun #define GPIO1_IOC_GPIO1A_DS1 0x204
134*4882a593Smuzhiyun #define GPIO1_IOC_GPIO1B_DS0 0x210
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun #define GPIO2_IOC_BASE 0xFF060000
137*4882a593Smuzhiyun #define GPIO2_IOC_IO_VSEL0 0x300
138*4882a593Smuzhiyun /* GPIO2_IOC_IO_VSEL0 */
139*4882a593Smuzhiyun #define POC_VCCIO2_VD_3V3 BIT(12)
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun #define GPIO3_IOC_BASE 0xFF070000
142*4882a593Smuzhiyun #define GPIO4_IOC_BASE 0xFF070000
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* UART0 iomux */
145*4882a593Smuzhiyun /* gpio0d0_sel */
146*4882a593Smuzhiyun #define UART0_RX_M0 1
147*4882a593Smuzhiyun #define UART0_RX_M0_OFFSET 0
148*4882a593Smuzhiyun #define UART0_RX_M0_ADDR (GPIO0_IOC_BASE + 0x18)
149*4882a593Smuzhiyun /* gpio0d1_sel */
150*4882a593Smuzhiyun #define UART0_TX_M0 1
151*4882a593Smuzhiyun #define UART0_TX_M0_OFFSET 4
152*4882a593Smuzhiyun #define UART0_TX_M0_ADDR (GPIO0_IOC_BASE + 0x18)
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /* gpio1b3_sel */
155*4882a593Smuzhiyun #define UART0_RX_M1 2
156*4882a593Smuzhiyun #define UART0_RX_M1_OFFSET 12
157*4882a593Smuzhiyun #define UART0_RX_M1_ADDR (GPIO1_IOC_BASE + 0x08)
158*4882a593Smuzhiyun /* gpio1b4_sel */
159*4882a593Smuzhiyun #define UART0_TX_M1 2
160*4882a593Smuzhiyun #define UART0_TX_M1_OFFSET 0
161*4882a593Smuzhiyun #define UART0_TX_M1_ADDR (GPIO1_IOC_BASE + 0x0C)
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /* UART1 iomux */
164*4882a593Smuzhiyun /* gpio1d1_sel */
165*4882a593Smuzhiyun #define UART1_RX_M0 1
166*4882a593Smuzhiyun #define UART1_RX_M0_OFFSET 4
167*4882a593Smuzhiyun #define UART1_RX_M0_ADDR (GPIO1_IOC_BASE + 0x18)
168*4882a593Smuzhiyun /* gpio1d2_sel */
169*4882a593Smuzhiyun #define UART1_TX_M0 1
170*4882a593Smuzhiyun #define UART1_TX_M0_OFFSET 8
171*4882a593Smuzhiyun #define UART1_TX_M0_ADDR (GPIO1_IOC_BASE + 0x18)
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun /* gpio4a6_sel */
174*4882a593Smuzhiyun #define UART1_RX_M1 4
175*4882a593Smuzhiyun #define UART1_RX_M1_OFFSET 8
176*4882a593Smuzhiyun #define UART1_RX_M1_ADDR (GPIO4_IOC_BASE + 0x64)
177*4882a593Smuzhiyun /* gpio4a5_sel */
178*4882a593Smuzhiyun #define UART1_TX_M1 4
179*4882a593Smuzhiyun #define UART1_TX_M1_OFFSET 4
180*4882a593Smuzhiyun #define UART1_TX_M1_ADDR (GPIO4_IOC_BASE + 0x64)
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun /* UART2 iomux */
183*4882a593Smuzhiyun /* gpio0c1_sel */
184*4882a593Smuzhiyun #define UART2_RX_M0 1
185*4882a593Smuzhiyun #define UART2_RX_M0_OFFSET 4
186*4882a593Smuzhiyun #define UART2_RX_M0_ADDR (GPIO0_IOC_BASE + 0x10)
187*4882a593Smuzhiyun /* gpio0c0_sel */
188*4882a593Smuzhiyun #define UART2_TX_M0 1
189*4882a593Smuzhiyun #define UART2_TX_M0_OFFSET 0
190*4882a593Smuzhiyun #define UART2_TX_M0_ADDR (GPIO0_IOC_BASE + 0x10)
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun /* gpio3a1_sel */
193*4882a593Smuzhiyun #define UART2_RX_M1 2
194*4882a593Smuzhiyun #define UART2_RX_M1_OFFSET 4
195*4882a593Smuzhiyun #define UART2_RX_M1_ADDR (GPIO3_IOC_BASE + 0x40)
196*4882a593Smuzhiyun /* gpio3a0_sel */
197*4882a593Smuzhiyun #define UART2_TX_M1 2
198*4882a593Smuzhiyun #define UART2_TX_M1_OFFSET 0
199*4882a593Smuzhiyun #define UART2_TX_M1_ADDR (GPIO3_IOC_BASE + 0x40)
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /* UART3 iomux */
202*4882a593Smuzhiyun /* gpio4b5_sel */
203*4882a593Smuzhiyun #define UART3_RX_M0 7
204*4882a593Smuzhiyun #define UART3_RX_M0_OFFSET 4
205*4882a593Smuzhiyun #define UART3_RX_M0_ADDR (GPIO4_IOC_BASE + 0x6C)
206*4882a593Smuzhiyun /* gpio4b4_sel */
207*4882a593Smuzhiyun #define UART3_TX_M0 7
208*4882a593Smuzhiyun #define UART3_TX_M0_OFFSET 0
209*4882a593Smuzhiyun #define UART3_TX_M0_ADDR (GPIO4_IOC_BASE + 0x6C)
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun /* gpio3c0_sel */
212*4882a593Smuzhiyun #define UART3_RX_M1 3
213*4882a593Smuzhiyun #define UART3_RX_M1_OFFSET 0
214*4882a593Smuzhiyun #define UART3_RX_M1_ADDR (GPIO3_IOC_BASE + 0x50)
215*4882a593Smuzhiyun /* gpio3b7_sel */
216*4882a593Smuzhiyun #define UART3_TX_M1 3
217*4882a593Smuzhiyun #define UART3_TX_M1_OFFSET 12
218*4882a593Smuzhiyun #define UART3_TX_M1_ADDR (GPIO3_IOC_BASE + 0x4C)
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun /* UART4 iomux */
221*4882a593Smuzhiyun /* gpio3d1_sel */
222*4882a593Smuzhiyun #define UART4_RX_M0 4
223*4882a593Smuzhiyun #define UART4_RX_M0_OFFSET 4
224*4882a593Smuzhiyun #define UART4_RX_M0_ADDR (GPIO3_IOC_BASE + 0x58)
225*4882a593Smuzhiyun /* gpio3d0_sel */
226*4882a593Smuzhiyun #define UART4_TX_M0 4
227*4882a593Smuzhiyun #define UART4_TX_M0_OFFSET 0
228*4882a593Smuzhiyun #define UART4_TX_M0_ADDR (GPIO3_IOC_BASE + 0x58)
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /* gpio1d5_sel */
231*4882a593Smuzhiyun #define UART4_RX_M1 3
232*4882a593Smuzhiyun #define UART4_RX_M1_OFFSET 4
233*4882a593Smuzhiyun #define UART4_RX_M1_ADDR (GPIO1_IOC_BASE + 0x1C)
234*4882a593Smuzhiyun /* gpio1d6_sel */
235*4882a593Smuzhiyun #define UART4_TX_M1 3
236*4882a593Smuzhiyun #define UART4_TX_M1_OFFSET 8
237*4882a593Smuzhiyun #define UART4_TX_M1_ADDR (GPIO1_IOC_BASE + 0x1C)
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun /* UART5 iomux */
240*4882a593Smuzhiyun /* gpio1b7_sel */
241*4882a593Smuzhiyun #define UART5_RX_M0 3
242*4882a593Smuzhiyun #define UART5_RX_M0_OFFSET 12
243*4882a593Smuzhiyun #define UART5_RX_M0_ADDR (GPIO1_IOC_BASE + 0xC)
244*4882a593Smuzhiyun /* gpio1c0_sel */
245*4882a593Smuzhiyun #define UART5_TX_M0 3
246*4882a593Smuzhiyun #define UART5_TX_M0_OFFSET 0
247*4882a593Smuzhiyun #define UART5_TX_M0_ADDR (GPIO1_IOC_BASE + 0x10)
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun /* gpio3a7_sel */
250*4882a593Smuzhiyun #define UART5_RX_M1 5
251*4882a593Smuzhiyun #define UART5_RX_M1_OFFSET 12
252*4882a593Smuzhiyun #define UART5_RX_M1_ADDR (GPIO3_IOC_BASE + 0x44)
253*4882a593Smuzhiyun /* gpio3a6_sel */
254*4882a593Smuzhiyun #define UART5_TX_M1 5
255*4882a593Smuzhiyun #define UART5_TX_M1_OFFSET 8
256*4882a593Smuzhiyun #define UART5_TX_M1_ADDR (GPIO3_IOC_BASE + 0x44)
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun /* UART6 iomux */
259*4882a593Smuzhiyun /* gpio0c7_sel */
260*4882a593Smuzhiyun #define UART6_RX_M0 1
261*4882a593Smuzhiyun #define UART6_RX_M0_OFFSET 12
262*4882a593Smuzhiyun #define UART6_RX_M0_ADDR (GPIO0_IOC_BASE + 0x14)
263*4882a593Smuzhiyun /* gpio0c6_sel */
264*4882a593Smuzhiyun #define UART6_TX_M0 1
265*4882a593Smuzhiyun #define UART6_TX_M0_OFFSET 8
266*4882a593Smuzhiyun #define UART6_TX_M0_ADDR (GPIO0_IOC_BASE + 0x14)
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun /* gpio4b0_sel */
269*4882a593Smuzhiyun #define UART6_RX_M1 6
270*4882a593Smuzhiyun #define UART6_RX_M1_OFFSET 0
271*4882a593Smuzhiyun #define UART6_RX_M1_ADDR (GPIO4_IOC_BASE + 0x68)
272*4882a593Smuzhiyun /* gpio4a7_sel */
273*4882a593Smuzhiyun #define UART6_TX_M1 6
274*4882a593Smuzhiyun #define UART6_TX_M1_OFFSET 12
275*4882a593Smuzhiyun #define UART6_TX_M1_ADDR (GPIO4_IOC_BASE + 0x64)
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun /* UART7 iomux */
278*4882a593Smuzhiyun /* gpio3c7_sel */
279*4882a593Smuzhiyun #define UART7_RX_M0 4
280*4882a593Smuzhiyun #define UART7_RX_M0_OFFSET 12
281*4882a593Smuzhiyun #define UART7_RX_M0_ADDR (GPIO3_IOC_BASE + 0x54)
282*4882a593Smuzhiyun /* gpio3c4_sel */
283*4882a593Smuzhiyun #define UART7_TX_M0 4
284*4882a593Smuzhiyun #define UART7_TX_M0_OFFSET 0
285*4882a593Smuzhiyun #define UART7_TX_M0_ADDR (GPIO3_IOC_BASE + 0x54)
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun /* gpio1b3_sel */
288*4882a593Smuzhiyun #define UART7_RX_M1 3
289*4882a593Smuzhiyun #define UART7_RX_M1_OFFSET 12
290*4882a593Smuzhiyun #define UART7_RX_M1_ADDR (GPIO1_IOC_BASE + 0x08)
291*4882a593Smuzhiyun /* gpio1b4_sel */
292*4882a593Smuzhiyun #define UART7_TX_M1 3
293*4882a593Smuzhiyun #define UART7_TX_M1_OFFSET 0
294*4882a593Smuzhiyun #define UART7_TX_M1_ADDR (GPIO1_IOC_BASE + 0x0C)
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* UART8 iomux */
297*4882a593Smuzhiyun /* gpio3b3_sel */
298*4882a593Smuzhiyun #define UART8_RX_M0 3
299*4882a593Smuzhiyun #define UART8_RX_M0_OFFSET 12
300*4882a593Smuzhiyun #define UART8_RX_M0_ADDR (GPIO3_IOC_BASE + 0x48)
301*4882a593Smuzhiyun /* gpio3b2_sel */
302*4882a593Smuzhiyun #define UART8_TX_M0 3
303*4882a593Smuzhiyun #define UART8_TX_M0_OFFSET 8
304*4882a593Smuzhiyun #define UART8_TX_M0_ADDR (GPIO3_IOC_BASE + 0x48)
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun /* gpio3d5_sel */
307*4882a593Smuzhiyun #define UART8_RX_M1 4
308*4882a593Smuzhiyun #define UART8_RX_M1_OFFSET 4
309*4882a593Smuzhiyun #define UART8_RX_M1_ADDR (GPIO3_IOC_BASE + 0x5C)
310*4882a593Smuzhiyun /* gpio3d4_sel */
311*4882a593Smuzhiyun #define UART8_TX_M1 4
312*4882a593Smuzhiyun #define UART8_TX_M1_OFFSET 0
313*4882a593Smuzhiyun #define UART8_TX_M1_ADDR (GPIO3_IOC_BASE + 0x5C)
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun /* UART9 iomux */
316*4882a593Smuzhiyun /* gpio4b3_sel */
317*4882a593Smuzhiyun #define UART9_RX_M0 4
318*4882a593Smuzhiyun #define UART9_RX_M0_OFFSET 12
319*4882a593Smuzhiyun #define UART9_RX_M0_ADDR (GPIO4_IOC_BASE + 0x68)
320*4882a593Smuzhiyun /* gpio4b2_sel */
321*4882a593Smuzhiyun #define UART9_TX_M0 4
322*4882a593Smuzhiyun #define UART9_TX_M0_OFFSET 8
323*4882a593Smuzhiyun #define UART9_TX_M0_ADDR (GPIO4_IOC_BASE + 0x68)
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun /* gpio3c3_sel */
326*4882a593Smuzhiyun #define UART9_RX_M1 3
327*4882a593Smuzhiyun #define UART9_RX_M1_OFFSET 12
328*4882a593Smuzhiyun #define UART9_RX_M1_ADDR (GPIO3_IOC_BASE + 0x50)
329*4882a593Smuzhiyun /* gpio3c2_sel */
330*4882a593Smuzhiyun #define UART9_TX_M1 3
331*4882a593Smuzhiyun #define UART9_TX_M1_OFFSET 8
332*4882a593Smuzhiyun #define UART9_TX_M1_ADDR (GPIO3_IOC_BASE + 0x50)
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun #define set_uart_iomux(bits_offset, bits_val, addr) \
335*4882a593Smuzhiyun writel(GENMASK(bits_offset + 19, bits_offset + 16) | (bits_val << bits_offset) , addr)
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun #define set_uart_iomux_rx(ID, MODE) \
338*4882a593Smuzhiyun set_uart_iomux(UART##ID##_RX_M##MODE##_OFFSET, UART##ID##_RX_M##MODE, UART##ID##_RX_M##MODE##_ADDR);
339*4882a593Smuzhiyun #define set_uart_iomux_tx(ID, MODE) \
340*4882a593Smuzhiyun set_uart_iomux(UART##ID##_TX_M##MODE##_OFFSET, UART##ID##_TX_M##MODE, UART##ID##_TX_M##MODE##_ADDR);
341*4882a593Smuzhiyun
board_debug_uart_init(void)342*4882a593Smuzhiyun void board_debug_uart_init(void)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun /* UART 0 */
345*4882a593Smuzhiyun #if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff210000)
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
348*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /* UART0_M0 Switch iomux */
351*4882a593Smuzhiyun set_uart_iomux_rx(0, 0);
352*4882a593Smuzhiyun set_uart_iomux_tx(0, 0);
353*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
354*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun /* UART0_M1 Switch iomux */
357*4882a593Smuzhiyun set_uart_iomux_rx(0, 1);
358*4882a593Smuzhiyun set_uart_iomux_tx(0, 1);
359*4882a593Smuzhiyun #endif
360*4882a593Smuzhiyun /* UART 1 */
361*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff670000)
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
364*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun /* UART1_M0 Switch iomux */
367*4882a593Smuzhiyun set_uart_iomux_rx(1, 0);
368*4882a593Smuzhiyun set_uart_iomux_tx(1, 0);
369*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
370*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun /* UART1_M1 Switch iomux */
373*4882a593Smuzhiyun set_uart_iomux_rx(1, 1);
374*4882a593Smuzhiyun set_uart_iomux_tx(1, 1);
375*4882a593Smuzhiyun #endif
376*4882a593Smuzhiyun /* UART 2 */
377*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff680000)
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
380*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun /* UART2_M0 Switch iomux */
383*4882a593Smuzhiyun set_uart_iomux_rx(2, 0);
384*4882a593Smuzhiyun set_uart_iomux_tx(2, 0);
385*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
386*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun /* UART2_M1 Switch iomux */
389*4882a593Smuzhiyun set_uart_iomux_rx(2, 1);
390*4882a593Smuzhiyun set_uart_iomux_tx(2, 1);
391*4882a593Smuzhiyun #endif
392*4882a593Smuzhiyun /* UART 3 */
393*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff690000)
394*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
395*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /* UART3_M0 Switch iomux */
398*4882a593Smuzhiyun set_uart_iomux_rx(3, 0);
399*4882a593Smuzhiyun set_uart_iomux_tx(3, 0);
400*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
401*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun /* UART3_M1 Switch iomux */
404*4882a593Smuzhiyun set_uart_iomux_rx(3, 1);
405*4882a593Smuzhiyun set_uart_iomux_tx(3, 1);
406*4882a593Smuzhiyun #endif
407*4882a593Smuzhiyun /* UART 4 */
408*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6a0000)
409*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
410*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun /* UART4_M0 Switch iomux */
413*4882a593Smuzhiyun set_uart_iomux_rx(4, 0);
414*4882a593Smuzhiyun set_uart_iomux_tx(4, 0);
415*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
416*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun /* UART4_M1 Switch iomux */
419*4882a593Smuzhiyun set_uart_iomux_rx(4, 1);
420*4882a593Smuzhiyun set_uart_iomux_tx(4, 1);
421*4882a593Smuzhiyun #endif
422*4882a593Smuzhiyun /* UART 5 */
423*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6b0000)
424*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
425*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun /* UART5_M0 Switch iomux */
428*4882a593Smuzhiyun set_uart_iomux_rx(5, 0);
429*4882a593Smuzhiyun set_uart_iomux_tx(5, 0);
430*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
431*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun /* UART5_M1 Switch iomux */
434*4882a593Smuzhiyun set_uart_iomux_rx(5, 1);
435*4882a593Smuzhiyun set_uart_iomux_tx(5, 1);
436*4882a593Smuzhiyun #endif
437*4882a593Smuzhiyun /* UART 6 */
438*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6c0000)
439*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
440*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun /* UART6_M0 Switch iomux */
443*4882a593Smuzhiyun set_uart_iomux_rx(6, 0);
444*4882a593Smuzhiyun set_uart_iomux_tx(6, 0);
445*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
446*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun /* UART6_M1 Switch iomux */
449*4882a593Smuzhiyun set_uart_iomux_rx(6, 1);
450*4882a593Smuzhiyun set_uart_iomux_tx(6, 1);
451*4882a593Smuzhiyun #endif
452*4882a593Smuzhiyun /* UART 7 */
453*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6d0000)
454*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
455*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun /* UART7_M0 Switch iomux */
458*4882a593Smuzhiyun set_uart_iomux_rx(7, 0);
459*4882a593Smuzhiyun set_uart_iomux_tx(7, 0);
460*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
461*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun /* UART7_M1 Switch iomux */
464*4882a593Smuzhiyun set_uart_iomux_rx(7, 1);
465*4882a593Smuzhiyun set_uart_iomux_tx(7, 1);
466*4882a593Smuzhiyun #endif
467*4882a593Smuzhiyun /* UART 8 */
468*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6e0000)
469*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
470*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun /* UART8_M0 Switch iomux */
473*4882a593Smuzhiyun set_uart_iomux_rx(8, 0);
474*4882a593Smuzhiyun set_uart_iomux_tx(8, 0);
475*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
476*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun /* UART8_M1 Switch iomux */
479*4882a593Smuzhiyun set_uart_iomux_rx(8, 1);
480*4882a593Smuzhiyun set_uart_iomux_tx(8, 1);
481*4882a593Smuzhiyun #endif
482*4882a593Smuzhiyun /* UART 9 */
483*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6f0000)
484*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
485*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun /* UART9_M0 Switch iomux */
488*4882a593Smuzhiyun set_uart_iomux_rx(9, 0);
489*4882a593Smuzhiyun set_uart_iomux_tx(9, 0);
490*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
491*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun /* UART9_M1 Switch iomux */
494*4882a593Smuzhiyun set_uart_iomux_rx(9, 1);
495*4882a593Smuzhiyun set_uart_iomux_tx(9, 1);
496*4882a593Smuzhiyun #endif
497*4882a593Smuzhiyun #endif
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun
fit_standalone_release(char * id,uintptr_t entry_point)500*4882a593Smuzhiyun int fit_standalone_release(char *id, uintptr_t entry_point)
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun /* bus m0 configuration: */
503*4882a593Smuzhiyun /* open hclk_dcache / hclk_icache / clk_bus m0 rtc / fclk_bus_m0_core */
504*4882a593Smuzhiyun writel(0x03180000, TOP_CRU_BASE + TOP_CRU_GATE_CON23);
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun /* open bus m0 sclk / bus m0 hclk / bus m0 dclk */
507*4882a593Smuzhiyun writel(0x00070000, TOP_CRU_BASE + TOP_CRU_CM0_GATEMASK);
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun /* mcu_cache_peripheral_addr */
510*4882a593Smuzhiyun writel(0xa0000000, SYS_GRF_BASE + SYS_GRF_SOC_CON5);
511*4882a593Smuzhiyun writel(0xffb40000, SYS_GRF_BASE + SYS_GRF_SOC_CON6);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID,
514*4882a593Smuzhiyun ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR,
515*4882a593Smuzhiyun 0xffff0000 | (entry_point >> 16));
516*4882a593Smuzhiyun sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID,
517*4882a593Smuzhiyun ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR, 0xffffa000);
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun /* release dcache / icache / bus m0 jtag / bus m0 */
520*4882a593Smuzhiyun writel(0x03280000, TOP_CRU_BASE + TOP_CRU_SOFTRST_CON23);
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun /* release pmu m0 jtag / pmu m0 */
523*4882a593Smuzhiyun /* writel(0x00050000, PMU1_CRU_BASE + PMU1_CRU_SOFTRST_CON02); */
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun return 0;
526*4882a593Smuzhiyun }
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
qos_priority_init(void)529*4882a593Smuzhiyun static void qos_priority_init(void)
530*4882a593Smuzhiyun {
531*4882a593Smuzhiyun u32 delay;
532*4882a593Smuzhiyun u32 i;
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun /* power up vo,vi,gpu */
535*4882a593Smuzhiyun rk_clrreg(PMU_BASE_ADDR + PMU2_PWR_GATE_SFTCON0,
536*4882a593Smuzhiyun PD_VO_DWN_SFTENA | PD_VI_DWN_SFTENA);
537*4882a593Smuzhiyun delay = 1000;
538*4882a593Smuzhiyun do {
539*4882a593Smuzhiyun udelay(1);
540*4882a593Smuzhiyun delay--;
541*4882a593Smuzhiyun if (delay == 0) {
542*4882a593Smuzhiyun printf("Fail to set domain. PMU2_PWR_GATE_STS0=0x%x\n",
543*4882a593Smuzhiyun readl(PMU_BASE_ADDR + PMU2_PWR_GATE_STS0));
544*4882a593Smuzhiyun hang();
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun } while (readl(PMU_BASE_ADDR + PMU2_PWR_GATE_STS0) &
547*4882a593Smuzhiyun (PD_VO_DWN_SFTENA | PD_VI_DWN_SFTENA));
548*4882a593Smuzhiyun /* power up vop memory */
549*4882a593Smuzhiyun for (i = 0; i < 16; i++)
550*4882a593Smuzhiyun rk_clrreg(PMU_BASE_ADDR + PMU2_MEM_SD_SFTCON0, BIT(i));
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun /* release vo,vi,gpu idle request */
553*4882a593Smuzhiyun rk_clrreg(PMU_BASE_ADDR + PMU2_BIU_IDLE_SFTCON0,
554*4882a593Smuzhiyun (IDLE_REQ_VO_SFTENA | IDLE_REQ_VI_SFTENA));
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun delay = 1000;
557*4882a593Smuzhiyun /* wait ack status */
558*4882a593Smuzhiyun do {
559*4882a593Smuzhiyun udelay(1);
560*4882a593Smuzhiyun delay--;
561*4882a593Smuzhiyun if (delay == 0) {
562*4882a593Smuzhiyun printf("Fail to get ack on domain. PMU2_BIU_IDLE_ACK_STS0=0x%x\n",
563*4882a593Smuzhiyun readl(PMU_BASE_ADDR + PMU2_BIU_IDLE_ACK_STS0));
564*4882a593Smuzhiyun hang();
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun } while (readl(PMU_BASE_ADDR + PMU2_BIU_IDLE_ACK_STS0) &
567*4882a593Smuzhiyun (IDLE_ACK_VO | IDLE_ACK_VI));
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun delay = 1000;
570*4882a593Smuzhiyun /* wait idle status */
571*4882a593Smuzhiyun do {
572*4882a593Smuzhiyun udelay(1);
573*4882a593Smuzhiyun delay--;
574*4882a593Smuzhiyun if (delay == 0) {
575*4882a593Smuzhiyun printf("Fail to set idle on domain. PMU2_BIT_IDLE_STS0=0x%x\n",
576*4882a593Smuzhiyun readl(PMU_BASE_ADDR + PMU2_BIT_IDLE_STS0));
577*4882a593Smuzhiyun hang();
578*4882a593Smuzhiyun }
579*4882a593Smuzhiyun } while (readl(PMU_BASE_ADDR + PMU2_BIT_IDLE_STS0) &
580*4882a593Smuzhiyun (IDLE_VO | IDLE_VI));
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun /*
583*4882a593Smuzhiyun * modify default qos priority setting, then
584*4882a593Smuzhiyun * Peri > VOP/ISP/VICAP > CPU > GPU/NPU/RKVDEC/RGA/Other
585*4882a593Smuzhiyun * (5) (4) (3) (2)
586*4882a593Smuzhiyun *
587*4882a593Smuzhiyun * NOTE: GPU qos init is in kernel, in case that vdd gpu is off now.
588*4882a593Smuzhiyun */
589*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), CRYPTO_PRIORITY_REG);
590*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), DMAC_PRIORITY_REG);
591*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), EMMC_PRIORITY_REG);
592*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), FSPI_PRIORITY_REG);
593*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), GMAC_PRIORITY_REG);
594*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), MAC100_PRIORITY_REG);
595*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), MCU_PRIORITY_REG);
596*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), RKDMA_PRIORITY_REG);
597*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), SDMMC0_PRIORITY_REG);
598*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), SDMMC1_PRIORITY_REG);
599*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), USB2_PRIORITY_REG);
600*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(5, 5), USB3_PRIORITY_REG);
601*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(4, 4), ISP_PRIORITY_REG);
602*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(4, 4), VICAP_PRIORITY_REG);
603*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(4, 4), VOP_PRIORITY_REG);
604*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(2, 2), DCF_PRIORITY_REG);
605*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(2, 2), DMA2DDR_PRIORITY_REG);
606*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(2, 2), PCIE_PRIORITY_REG);
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun
arch_cpu_init(void)609*4882a593Smuzhiyun int arch_cpu_init(void)
610*4882a593Smuzhiyun {
611*4882a593Smuzhiyun u32 val;
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun /* Set the emmc to access ddr memory */
614*4882a593Smuzhiyun val = readl(FIREWALL_DDR_BASE + FW_DDR_MST4_REG);
615*4882a593Smuzhiyun writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST4_REG);
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun /* Set the sdmmc to access ddr memory */
618*4882a593Smuzhiyun val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
619*4882a593Smuzhiyun writel(val & 0xff0000ff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun /*
622*4882a593Smuzhiyun * Set SAIx_MCLK as input default
623*4882a593Smuzhiyun *
624*4882a593Smuzhiyun * It's safe to set mclk as input default to avoid high freq glitch
625*4882a593Smuzhiyun * which may make devices work unexpected. And then enabled by
626*4882a593Smuzhiyun * kernel stage or any state where user use it.
627*4882a593Smuzhiyun */
628*4882a593Smuzhiyun writel(0x0a100000, PERI_GRF_BASE + PERI_GRF_AUDIO_CON);
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun /* Assert reset the pipe phy to save power and de-assert when in use */
631*4882a593Smuzhiyun writel(0x00030001, PIPEPHY_GRF_BASE + PIPEPHY_PIPE_CON5);
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_SFC)
634*4882a593Smuzhiyun /* Set the fspi to access ddr memory */
635*4882a593Smuzhiyun val = readl(FIREWALL_DDR_BASE + FW_DDR_MST5_REG);
636*4882a593Smuzhiyun writel(val & 0x00ffffff, FIREWALL_DDR_BASE + FW_DDR_MST5_REG);
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun /*
639*4882a593Smuzhiyun * Fix fspi io ds level:
640*4882a593Smuzhiyun *
641*4882a593Smuzhiyun * level 2 for 1V8
642*4882a593Smuzhiyun * level 3 for 3V3
643*4882a593Smuzhiyun */
644*4882a593Smuzhiyun if (readl(GPIO1_IOC_BASE + GPIO1A_IOMUX_SEL_L) == 0x2222) {
645*4882a593Smuzhiyun if (readl(GPIO2_IOC_BASE + GPIO2_IOC_IO_VSEL0) & POC_VCCIO2_VD_3V3) {
646*4882a593Smuzhiyun writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS0);
647*4882a593Smuzhiyun writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS1);
648*4882a593Smuzhiyun writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1B_DS0);
649*4882a593Smuzhiyun } else {
650*4882a593Smuzhiyun writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS0);
651*4882a593Smuzhiyun writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS1);
652*4882a593Smuzhiyun writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1B_DS0);
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun #endif
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun qos_priority_init();
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun return 0;
660*4882a593Smuzhiyun }
661*4882a593Smuzhiyun #endif
662