xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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