xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2019 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #include <common.h>
7*4882a593Smuzhiyun #include <ramdisk.h>
8*4882a593Smuzhiyun #include <asm/io.h>
9*4882a593Smuzhiyun #include <asm/arch/boot_mode.h>
10*4882a593Smuzhiyun #include <asm/arch/hardware.h>
11*4882a593Smuzhiyun #include <asm/arch/grf_rv1126.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define FIREWALL_APB_BASE	0xffa60000
16*4882a593Smuzhiyun #define FW_DDR_CON_REG		0x80
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define USB_HOST_PRIORITY_REG	0xfe810008
19*4882a593Smuzhiyun #define USB_OTG_PRIORITY_REG	0xfe810088
20*4882a593Smuzhiyun #define DECOM_PRIORITY_REG	0xfe820088
21*4882a593Smuzhiyun #define DMA_PRIORITY_REG	0xfe820108
22*4882a593Smuzhiyun #define MCU_DM_PRIORITY_REG	0xfe820188
23*4882a593Smuzhiyun #define MCU_IM_PRIORITY_REG	0xfe820208
24*4882a593Smuzhiyun #define A7_PRIORITY_REG		0xfe830008
25*4882a593Smuzhiyun #define GMAC_PRIORITY_REG	0xfe840008
26*4882a593Smuzhiyun #define NPU_PRIORITY_REG	0xfe850008
27*4882a593Smuzhiyun #define EMMC_PRIORITY_REG	0xfe860008
28*4882a593Smuzhiyun #define NANDC_PRIORITY_REG	0xfe860088
29*4882a593Smuzhiyun #define SFC_PRIORITY_REG	0xfe860208
30*4882a593Smuzhiyun #define SDMMC_PRIORITY_REG	0xfe868008
31*4882a593Smuzhiyun #define SDIO_PRIORITY_REG	0xfe86c008
32*4882a593Smuzhiyun #define VEPU_RD0_PRIORITY_REG	0xfe870008
33*4882a593Smuzhiyun #define VEPU_RD1_PRIORITY_REG	0xfe870088
34*4882a593Smuzhiyun #define VEPU_WR_PRIORITY_REG	0xfe870108
35*4882a593Smuzhiyun #define ISPP_M0_PRIORITY_REG	0xfe880008
36*4882a593Smuzhiyun #define ISPP_M1_PRIORITY_REG	0xfe880088
37*4882a593Smuzhiyun #define ISP_PRIORITY_REG	0xfe890008
38*4882a593Smuzhiyun #define CIF_LITE_PRIORITY_REG	0xfe890088
39*4882a593Smuzhiyun #define CIF_PRIORITY_REG	0xfe890108
40*4882a593Smuzhiyun #define IEP_PRIORITY_REG	0xfe8a0008
41*4882a593Smuzhiyun #define RGA_RD_PRIORITY_REG	0xfe8a0088
42*4882a593Smuzhiyun #define RGA_WR_PRIORITY_REG	0xfe8a0108
43*4882a593Smuzhiyun #define VOP_PRIORITY_REG	0xfe8a0188
44*4882a593Smuzhiyun #define VDPU_PRIORITY_REG	0xfe8b0008
45*4882a593Smuzhiyun #define JPEG_PRIORITY_REG	0xfe8c0008
46*4882a593Smuzhiyun #define CRYPTO_PRIORITY_REG	0xfe8d0008
47*4882a593Smuzhiyun /* external priority register */
48*4882a593Smuzhiyun #define ISPP_M0_PRIORITY_EX_REG	0xfe880018
49*4882a593Smuzhiyun #define ISPP_M1_PRIORITY_EX_REG	0xfe880098
50*4882a593Smuzhiyun #define ISP_PRIORITY_EX_REG	0xfe890018
51*4882a593Smuzhiyun #define CIF_LT_PRIORITY_EX_REG	0xfe890098
52*4882a593Smuzhiyun #define CIF_PRIORITY_EX_REG	0xfe890118
53*4882a593Smuzhiyun #define VOP_PRIORITY_EX_REG	0xfe8a0198
54*4882a593Smuzhiyun #define VDPU_PRIORITY_EX_REG	0xfe8b0018
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define PMU_BASE_ADDR		0xff3e0000
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define PMU_BUS_IDLE_SFTCON(n)	(0xc0 + (n) * 4)
59*4882a593Smuzhiyun #define PMU_BUS_IDLE_ACK	(0xd0)
60*4882a593Smuzhiyun #define PMU_BUS_IDLE_ST		(0xd8)
61*4882a593Smuzhiyun #define PMU_NOC_AUTO_CON0	(0xe0)
62*4882a593Smuzhiyun #define PMU_NOC_AUTO_CON1	(0xe4)
63*4882a593Smuzhiyun #define PMU_PWR_DWN_ST		(0x108)
64*4882a593Smuzhiyun #define PMU_PWR_GATE_SFTCON	(0x110)
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define PMU_BUS_IDLE_NPU	BIT(18)
67*4882a593Smuzhiyun #define PMU_BUS_IDLE_VEPU	BIT(9)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define CRU_BASE		0xFF490000
70*4882a593Smuzhiyun #define CRU_CLKSEL_CON02	0x108
71*4882a593Smuzhiyun #define CRU_CLKSEL_CON03	0x10c
72*4882a593Smuzhiyun #define CRU_CLKSEL_CON27	0x16c
73*4882a593Smuzhiyun #define CRU_CLKSEL_CON31	0x17c
74*4882a593Smuzhiyun #define CRU_CLKSEL_CON33	0x184
75*4882a593Smuzhiyun #define CRU_CLKSEL_CON40	0x1a0
76*4882a593Smuzhiyun #define CRU_CLKSEL_CON49	0x1c4
77*4882a593Smuzhiyun #define CRU_CLKSEL_CON50	0x1c8
78*4882a593Smuzhiyun #define CRU_CLKSEL_CON51	0x1cc
79*4882a593Smuzhiyun #define CRU_CLKSEL_CON54	0x1d8
80*4882a593Smuzhiyun #define CRU_CLKSEL_CON61	0x1f4
81*4882a593Smuzhiyun #define CRU_CLKSEL_CON63	0x1fc
82*4882a593Smuzhiyun #define CRU_CLKSEL_CON65	0x204
83*4882a593Smuzhiyun #define CRU_CLKSEL_CON67	0x20c
84*4882a593Smuzhiyun #define CRU_CLKSEL_CON68	0x210
85*4882a593Smuzhiyun #define CRU_CLKSEL_CON69	0x214
86*4882a593Smuzhiyun #define CRU_SOFTRST_CON02	0x308
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define CRU_PMU_BASE		0xFF480000
89*4882a593Smuzhiyun #define CRU_PMU_GPLL_CON0	0x10
90*4882a593Smuzhiyun #define CRU_PMU_GPLL_CON1	0x14
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define GRF_BASE		0xFE000000
93*4882a593Smuzhiyun #define GRF_SOC_CON2		0x008
94*4882a593Smuzhiyun #define PMUGRF_BASE		0xFE020000
95*4882a593Smuzhiyun #define SGRF_BASE		0xFE0A0000
96*4882a593Smuzhiyun #define SGRF_CON_SCR1_BOOT_ADDR	0x0b0
97*4882a593Smuzhiyun #define SGRF_SOC_CON3		0x00c
98*4882a593Smuzhiyun #define CRU_SOFTRST_CON11	0xFF49032C
99*4882a593Smuzhiyun #define PMUGRF_SOC_CON1		0xFE020104
100*4882a593Smuzhiyun #define PMUGRF_RSTFUNC_STATUS	0xFE020230
101*4882a593Smuzhiyun #define PMUGRF_RSTFUNC_CLR	0xFE020234
102*4882a593Smuzhiyun #define WDT_RESET_SRC		BIT(1)
103*4882a593Smuzhiyun #define WDT_RESET_SRC_CLR	BIT(1)
104*4882a593Smuzhiyun #define GRF_IOFUNC_CON3		0xFF01026C
105*4882a593Smuzhiyun #define GRF1_GPIO0D_P		0xFE010104
106*4882a593Smuzhiyun #define OTP_NS_BASE		0xFF5C0000
107*4882a593Smuzhiyun #define OTP_S_BASE		0xFF5D0000
108*4882a593Smuzhiyun #define OTP_NVM_TRWH		0x28
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define PMU_GRF_BASE		0xFE020000
111*4882a593Smuzhiyun #define PMUGRF_GPIO0B_IOMUX_H	0xc
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun enum {
114*4882a593Smuzhiyun 	GPIO1A7_SHIFT		= 12,
115*4882a593Smuzhiyun 	GPIO1A7_MASK		= GENMASK(14, 12),
116*4882a593Smuzhiyun 	GPIO1A7_GPIO		= 0,
117*4882a593Smuzhiyun 	GPIO1A7_SDMMC0_D3,
118*4882a593Smuzhiyun 	GPIO1A7_UART3_TX_M1,
119*4882a593Smuzhiyun 	GPIO1A7_A7_JTAG_TMS_M0,
120*4882a593Smuzhiyun 	GPIO1A7_RISCV_JTAG_TMS,
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	GPIO1A6_SHIFT		= 8,
123*4882a593Smuzhiyun 	GPIO1A6_MASK		= GENMASK(10, 8),
124*4882a593Smuzhiyun 	GPIO1A6_GPIO		= 0,
125*4882a593Smuzhiyun 	GPIO1A6_SDMMC0_D2,
126*4882a593Smuzhiyun 	GPIO1A6_UART3_RX_M1,
127*4882a593Smuzhiyun 	GPIO1A6_A7_JTAG_TCK_M0,
128*4882a593Smuzhiyun 	GPIO1A6_RISCV_JTAG_TCK,
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	GPIO1A5_SHIFT		= 4,
131*4882a593Smuzhiyun 	GPIO1A5_MASK		= GENMASK(6, 4),
132*4882a593Smuzhiyun 	GPIO1A5_GPIO		= 0,
133*4882a593Smuzhiyun 	GPIO1A5_SDMMC0_D1,
134*4882a593Smuzhiyun 	GPIO1A5_TEST_CLK0_OUT,
135*4882a593Smuzhiyun 	GPIO1A5_UART2_TX_M0,
136*4882a593Smuzhiyun 	GPIO1A5_RISCV_JTAG_TRSTN,
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	GPIO1A4_SHIFT		= 0,
139*4882a593Smuzhiyun 	GPIO1A4_MASK		= GENMASK(2, 0),
140*4882a593Smuzhiyun 	GPIO1A4_GPIO		= 0,
141*4882a593Smuzhiyun 	GPIO1A4_SDMMC0_D0,
142*4882a593Smuzhiyun 	GPIO1A4_TEST_CLK1_OUT,
143*4882a593Smuzhiyun 	GPIO1A4_UART2_RX_M0,
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	GPIO1C3_SHIFT		= 12,
146*4882a593Smuzhiyun 	GPIO1C3_MASK		= GENMASK(14, 12),
147*4882a593Smuzhiyun 	GPIO1C3_GPIO		= 0,
148*4882a593Smuzhiyun 	GPIO1C3_UART0_TX,
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	GPIO1C2_SHIFT		= 8,
151*4882a593Smuzhiyun 	GPIO1C2_MASK		= GENMASK(10, 8),
152*4882a593Smuzhiyun 	GPIO1C2_GPIO		= 0,
153*4882a593Smuzhiyun 	GPIO1C2_UART0_RX,
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	GPIO1D5_SHIFT		= 4,
156*4882a593Smuzhiyun 	GPIO1D5_MASK		= GENMASK(6, 4),
157*4882a593Smuzhiyun 	GPIO1D5_GPIO		= 0,
158*4882a593Smuzhiyun 	GPIO1D5_SPI0_CS1N_M1,
159*4882a593Smuzhiyun 	GPIO1D5_I2S1_MCLK_M1,
160*4882a593Smuzhiyun 	GPIO1D5_UART4_TX_M2,
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	GPIO1D4_SHIFT		= 0,
163*4882a593Smuzhiyun 	GPIO1D4_MASK		= GENMASK(2, 0),
164*4882a593Smuzhiyun 	GPIO1D4_GPIO		= 0,
165*4882a593Smuzhiyun 	GPIO1D4_RESERVED0,
166*4882a593Smuzhiyun 	GPIO1D4_RESERVED1,
167*4882a593Smuzhiyun 	GPIO1D4_UART4_RX_M2,
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	GPIO1D1_SHIFT		= 4,
170*4882a593Smuzhiyun 	GPIO1D1_MASK		= GENMASK(6, 4),
171*4882a593Smuzhiyun 	GPIO1D1_GPIO		= 0,
172*4882a593Smuzhiyun 	GPIO1D1_RESERVED0,
173*4882a593Smuzhiyun 	GPIO1D1_SDMMC1_PWR,
174*4882a593Smuzhiyun 	GPIO1D1_RESERVED1,
175*4882a593Smuzhiyun 	GPIO1D1_I2C5_SDA_M2,
176*4882a593Smuzhiyun 	GPIO1D1_UART1_RX_M1,
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	GPIO1D0_SHIFT		= 0,
179*4882a593Smuzhiyun 	GPIO1D0_MASK		= GENMASK(2, 0),
180*4882a593Smuzhiyun 	GPIO1D0_GPIO		= 0,
181*4882a593Smuzhiyun 	GPIO1D0_I2S2_MCLK_M0,
182*4882a593Smuzhiyun 	GPIO1D0_SDMMC1_DET,
183*4882a593Smuzhiyun 	GPIO1D0_SPI1_CS1N_M1,
184*4882a593Smuzhiyun 	GPIO1D0_I2C5_SCL_M2,
185*4882a593Smuzhiyun 	GPIO1D0_UART1_TX_M1,
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	GPIO2A7_SHIFT		= 12,
188*4882a593Smuzhiyun 	GPIO2A7_MASK		= GENMASK(14, 12),
189*4882a593Smuzhiyun 	GPIO2A7_GPIO		= 0,
190*4882a593Smuzhiyun 	GPIO2A7_LCDC_D3,
191*4882a593Smuzhiyun 	GPIO2A7_I2S2_SDO_M1,
192*4882a593Smuzhiyun 	GPIO2A7_RESERVED,
193*4882a593Smuzhiyun 	GPIO2A7_UART4_RX_M1,
194*4882a593Smuzhiyun 	GPIO2A7_PWM4_M1,
195*4882a593Smuzhiyun 	GPIO2A7_SPI0_CS0N_M2,
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	GPIO2A6_SHIFT		= 8,
198*4882a593Smuzhiyun 	GPIO2A6_MASK		= GENMASK(10, 8),
199*4882a593Smuzhiyun 	GPIO2A6_GPIO		= 0,
200*4882a593Smuzhiyun 	GPIO2A6_LCDC_D2,
201*4882a593Smuzhiyun 	GPIO2A6_RGMII_COL_M1,
202*4882a593Smuzhiyun 	GPIO2A6_CIF_D2_M1,
203*4882a593Smuzhiyun 	GPIO2A6_UART4_TX_M1,
204*4882a593Smuzhiyun 	GPIO2A6_PWM5_M1,
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	GPIO2A1_SHIFT		= 4,
207*4882a593Smuzhiyun 	GPIO2A1_MASK		= GENMASK(6, 4),
208*4882a593Smuzhiyun 	GPIO2A1_GPIO		= 0,
209*4882a593Smuzhiyun 	GPIO2A1_SPI0_CLK_M1,
210*4882a593Smuzhiyun 	GPIO2A1_I2S1_SDO_M1,
211*4882a593Smuzhiyun 	GPIO2A1_UART5_RX_M2,
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	GPIO2A0_SHIFT		= 0,
214*4882a593Smuzhiyun 	GPIO2A0_MASK		= GENMASK(2, 0),
215*4882a593Smuzhiyun 	GPIO2A0_GPIO		= 0,
216*4882a593Smuzhiyun 	GPIO2A0_SPI0_CS0N_M1,
217*4882a593Smuzhiyun 	GPIO2A0_I2S1_SDI_M1,
218*4882a593Smuzhiyun 	GPIO2A0_UART5_TX_M2,
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	GPIO2B1_SHIFT		= 4,
221*4882a593Smuzhiyun 	GPIO2B1_MASK		= GENMASK(6, 4),
222*4882a593Smuzhiyun 	GPIO2B1_GPIO		= 0,
223*4882a593Smuzhiyun 	GPIO2B1_LCDC_D5,
224*4882a593Smuzhiyun 	GPIO2B1_I2S2_SCLK_M1,
225*4882a593Smuzhiyun 	GPIO2B1_RESERVED,
226*4882a593Smuzhiyun 	GPIO2B1_UART5_RX_M1,
227*4882a593Smuzhiyun 	GPIO2B1_PWM2_M1,
228*4882a593Smuzhiyun 	GPIO2B1_SPI0_MISO_M2,
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	GPIO2B0_SHIFT		= 0,
231*4882a593Smuzhiyun 	GPIO2B0_MASK		= GENMASK(2, 0),
232*4882a593Smuzhiyun 	GPIO2B0_GPIO		= 0,
233*4882a593Smuzhiyun 	GPIO2B0_LCDC_D4,
234*4882a593Smuzhiyun 	GPIO2B0_I2S2_SDI_M1,
235*4882a593Smuzhiyun 	GPIO2B0_RESERVED,
236*4882a593Smuzhiyun 	GPIO2B0_UART5_TX_M1,
237*4882a593Smuzhiyun 	GPIO2B0_PWM3_IR_M1,
238*4882a593Smuzhiyun 	GPIO2B0_SPI0_MOSI_M2,
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	GPIO3A7_SHIFT		= 12,
241*4882a593Smuzhiyun 	GPIO3A7_MASK		= GENMASK(14, 12),
242*4882a593Smuzhiyun 	GPIO3A7_GPIO		= 0,
243*4882a593Smuzhiyun 	GPIO3A7_CIF_D3_M0,
244*4882a593Smuzhiyun 	GPIO3A7_RGMII_RXD2_M0,
245*4882a593Smuzhiyun 	GPIO3A7_I2S0_SDI0_M1,
246*4882a593Smuzhiyun 	GPIO3A7_UART5_RX_M0,
247*4882a593Smuzhiyun 	GPIO3A7_CAN_TXD_M1,
248*4882a593Smuzhiyun 	GPIO3A7_PWM11_IR_M0,
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	GPIO3A6_SHIFT		= 8,
251*4882a593Smuzhiyun 	GPIO3A6_MASK		= GENMASK(10, 8),
252*4882a593Smuzhiyun 	GPIO3A6_GPIO		= 0,
253*4882a593Smuzhiyun 	GPIO3A6_CIF_D2_M0,
254*4882a593Smuzhiyun 	GPIO3A6_RGMII_COL_M0,
255*4882a593Smuzhiyun 	GPIO3A6_I2S0_SDO0_M1,
256*4882a593Smuzhiyun 	GPIO3A6_UART5_TX_M0,
257*4882a593Smuzhiyun 	GPIO3A6_CAN_RXD_M1,
258*4882a593Smuzhiyun 	GPIO3A6_PWM10_M0,
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	GPIO3A5_SHIFT		= 4,
261*4882a593Smuzhiyun 	GPIO3A5_MASK		= GENMASK(6, 4),
262*4882a593Smuzhiyun 	GPIO3A5_GPIO		= 0,
263*4882a593Smuzhiyun 	GPIO3A5_CIF_D1_M0,
264*4882a593Smuzhiyun 	GPIO3A5_RGMII_CRS_M0,
265*4882a593Smuzhiyun 	GPIO3A5_I2S0_LRCK_TX_M1,
266*4882a593Smuzhiyun 	GPIO3A5_UART4_RX_M0,
267*4882a593Smuzhiyun 	GPIO3A5_I2C3_SDA_M0,
268*4882a593Smuzhiyun 	GPIO3A5_PWM9_M0,
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	GPIO3A4_SHIFT		= 0,
271*4882a593Smuzhiyun 	GPIO3A4_MASK		= GENMASK(2, 0),
272*4882a593Smuzhiyun 	GPIO3A4_GPIO		= 0,
273*4882a593Smuzhiyun 	GPIO3A4_CIF_D0_M0,
274*4882a593Smuzhiyun 	GPIO3A4_RESERVED,
275*4882a593Smuzhiyun 	GPIO3A4_I2S0_SCLK_TX_M1,
276*4882a593Smuzhiyun 	GPIO3A4_UART4_TX_M0,
277*4882a593Smuzhiyun 	GPIO3A4_I2C3_SCL_M0,
278*4882a593Smuzhiyun 	GPIO3A4_PWM8_M0,
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	GPIO3A3_SHIFT		= 12,
281*4882a593Smuzhiyun 	GPIO3A3_MASK		= GENMASK(14, 12),
282*4882a593Smuzhiyun 	GPIO3A3_GPIO		= 0,
283*4882a593Smuzhiyun 	GPIO3A3_UART2_RX_M1,
284*4882a593Smuzhiyun 	GPIO3A3_A7_JTAG_TMS_M1,
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	GPIO3A2_SHIFT		= 8,
287*4882a593Smuzhiyun 	GPIO3A2_MASK		= GENMASK(10, 8),
288*4882a593Smuzhiyun 	GPIO3A2_GPIO		= 0,
289*4882a593Smuzhiyun 	GPIO3A2_UART2_TX_M1,
290*4882a593Smuzhiyun 	GPIO3A2_A7_JTAG_TCK_M1,
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	GPIO3A1_SHIFT		= 4,
293*4882a593Smuzhiyun 	GPIO3A1_MASK		= GENMASK(6, 4),
294*4882a593Smuzhiyun 	GPIO3A1_GPIO		= 0,
295*4882a593Smuzhiyun 	GPIO3A1_RESERVED0,
296*4882a593Smuzhiyun 	GPIO3A1_RESERVED1,
297*4882a593Smuzhiyun 	GPIO3A1_CAN_TXD_M0,
298*4882a593Smuzhiyun 	GPIO3A1_UART3_RX_M2,
299*4882a593Smuzhiyun 	GPIO3A1_PWM6_M1,
300*4882a593Smuzhiyun 	GPIO3A1_RESERVED2,
301*4882a593Smuzhiyun 	GPIO3A1_I2C4_SDA_M0,
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	GPIO3A0_SHIFT		= 0,
304*4882a593Smuzhiyun 	GPIO3A0_MASK		= GENMASK(2, 0),
305*4882a593Smuzhiyun 	GPIO3A0_GPIO		= 0,
306*4882a593Smuzhiyun 	GPIO3A0_RESERVED0,
307*4882a593Smuzhiyun 	GPIO3A0_RESERVED1,
308*4882a593Smuzhiyun 	GPIO3A0_CAN_RXD_M0,
309*4882a593Smuzhiyun 	GPIO3A0_UART3_TX_M2,
310*4882a593Smuzhiyun 	GPIO3A0_PWM7_IR_M1,
311*4882a593Smuzhiyun 	GPIO3A0_SPI1_CS1N_M2,
312*4882a593Smuzhiyun 	GPIO3A0_I2C4_SCL_M0,
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	GPIO3C7_SHIFT		= 12,
315*4882a593Smuzhiyun 	GPIO3C7_MASK		= GENMASK(14, 12),
316*4882a593Smuzhiyun 	GPIO3C7_GPIO		= 0,
317*4882a593Smuzhiyun 	GPIO3C7_CIF_HSYNC_M0,
318*4882a593Smuzhiyun 	GPIO3C7_RGMII_RXCLK_M0,
319*4882a593Smuzhiyun 	GPIO3C7_RESERVED,
320*4882a593Smuzhiyun 	GPIO3C7_UART3_RX_M0,
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	GPIO3C6_SHIFT		= 8,
323*4882a593Smuzhiyun 	GPIO3C6_MASK		= GENMASK(10, 0),
324*4882a593Smuzhiyun 	GPIO3C6_GPIO		= 0,
325*4882a593Smuzhiyun 	GPIO3C6_CIF_CLKOUT_M0,
326*4882a593Smuzhiyun 	GPIO3C6_RGMII_TXCLK_M0,
327*4882a593Smuzhiyun 	GPIO3C6_RESERVED,
328*4882a593Smuzhiyun 	GPIO3C6_UART3_TX_M0,
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 	UART2_IO_SEL_SHIFT	= 8,
331*4882a593Smuzhiyun 	UART2_IO_SEL_MASK	= GENMASK(8, 8),
332*4882a593Smuzhiyun 	UART2_IO_SEL_M0		= 0,
333*4882a593Smuzhiyun 	UART2_IO_SEL_M1,
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	UART3_IO_SEL_SHIFT	= 10,
336*4882a593Smuzhiyun 	UART3_IO_SEL_MASK	= GENMASK(11, 10),
337*4882a593Smuzhiyun 	UART3_IO_SEL_M0		= 0,
338*4882a593Smuzhiyun 	UART3_IO_SEL_M1,
339*4882a593Smuzhiyun 	UART3_IO_SEL_M2,
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	UART4_IO_SEL_SHIFT	= 12,
342*4882a593Smuzhiyun 	UART4_IO_SEL_MASK	= GENMASK(13, 12),
343*4882a593Smuzhiyun 	UART4_IO_SEL_M0		= 0,
344*4882a593Smuzhiyun 	UART4_IO_SEL_M1,
345*4882a593Smuzhiyun 	UART4_IO_SEL_M2,
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	UART5_IO_SEL_SHIFT	= 14,
348*4882a593Smuzhiyun 	UART5_IO_SEL_MASK	= GENMASK(15, 14),
349*4882a593Smuzhiyun 	UART5_IO_SEL_M0		= 0,
350*4882a593Smuzhiyun 	UART5_IO_SEL_M1,
351*4882a593Smuzhiyun 	UART5_IO_SEL_M2,
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun enum {
355*4882a593Smuzhiyun 	UART1_IO_SEL_SHIFT	= 2,
356*4882a593Smuzhiyun 	UART1_IO_SEL_MASK	= GENMASK(2, 2),
357*4882a593Smuzhiyun 	UART1_IO_SEL_M0		= 0,
358*4882a593Smuzhiyun 	UART1_IO_SEL_M1,
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	GPIO0B7_SHIFT		= 12,
361*4882a593Smuzhiyun 	GPIO0B7_MASK		= GENMASK(14, 12),
362*4882a593Smuzhiyun 	GPIO0B7_GPIO		= 0,
363*4882a593Smuzhiyun 	GPIO0B7_RESERVED,
364*4882a593Smuzhiyun 	GPIO0B7_UART1_RX_M0,
365*4882a593Smuzhiyun 	GPIO0B7_PWM1_M0,
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	GPIO0B6_SHIFT		= 8,
368*4882a593Smuzhiyun 	GPIO0B6_MASK		= GENMASK(10, 8),
369*4882a593Smuzhiyun 	GPIO0B6_GPIO		= 0,
370*4882a593Smuzhiyun 	GPIO0B6_RESERVED,
371*4882a593Smuzhiyun 	GPIO0B6_UART1_TX_M0,
372*4882a593Smuzhiyun 	GPIO0B6_PWM0_M0,
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun 
board_debug_uart_init(void)375*4882a593Smuzhiyun void board_debug_uart_init(void)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun #if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff560000)
378*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	/* UART0 Switch iomux */
381*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio1c_iomux_l,
382*4882a593Smuzhiyun 		     GPIO1C3_MASK | GPIO1C2_MASK,
383*4882a593Smuzhiyun 		     GPIO1C3_UART0_TX << GPIO1C3_SHIFT |
384*4882a593Smuzhiyun 		     GPIO1C2_UART0_RX << GPIO1C2_SHIFT);
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff410000)
387*4882a593Smuzhiyun 	static struct rv1126_pmugrf * const pmugrf = (void *)PMUGRF_BASE;
388*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
389*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
390*4882a593Smuzhiyun     (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
391*4882a593Smuzhiyun 	/* UART1 M0 */
392*4882a593Smuzhiyun 	rk_clrsetreg(&pmugrf->soc_con[6], UART1_IO_SEL_MASK,
393*4882a593Smuzhiyun 		     UART1_IO_SEL_M0 << UART1_IO_SEL_SHIFT);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	/* Switch iomux */
396*4882a593Smuzhiyun 	rk_clrsetreg(&pmugrf->gpio0b_iomux_h,
397*4882a593Smuzhiyun 		     GPIO0B7_MASK | GPIO0B6_MASK,
398*4882a593Smuzhiyun 		     GPIO0B7_UART1_RX_M0 << GPIO0B7_SHIFT |
399*4882a593Smuzhiyun 		     GPIO0B6_UART1_TX_M0 << GPIO0B6_SHIFT);
400*4882a593Smuzhiyun #else
401*4882a593Smuzhiyun 	/* UART1 M1 */
402*4882a593Smuzhiyun 	rk_clrsetreg(&pmugrf->soc_con[6], UART1_IO_SEL_MASK,
403*4882a593Smuzhiyun 		     UART1_IO_SEL_M1 << UART1_IO_SEL_SHIFT);
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	/* Switch iomux */
406*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio1d_iomux_l,
407*4882a593Smuzhiyun 		     GPIO1D1_MASK | GPIO1D0_MASK,
408*4882a593Smuzhiyun 		     GPIO1D1_UART1_RX_M1 << GPIO1D1_SHIFT |
409*4882a593Smuzhiyun 		     GPIO1D0_UART1_TX_M1 << GPIO1D0_SHIFT);
410*4882a593Smuzhiyun #endif
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff570000)
413*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
414*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
415*4882a593Smuzhiyun     (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
416*4882a593Smuzhiyun 	/* Enable early UART2 channel m0 on the rv1126 */
417*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART2_IO_SEL_MASK,
418*4882a593Smuzhiyun 		     UART2_IO_SEL_M0 << UART2_IO_SEL_SHIFT);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	/* Switch iomux */
421*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio1a_iomux_h,
422*4882a593Smuzhiyun 		     GPIO1A5_MASK | GPIO1A4_MASK,
423*4882a593Smuzhiyun 		     GPIO1A5_UART2_TX_M0 << GPIO1A5_SHIFT |
424*4882a593Smuzhiyun 		     GPIO1A4_UART2_RX_M0 << GPIO1A4_SHIFT);
425*4882a593Smuzhiyun #else
426*4882a593Smuzhiyun 	/* Enable early UART2 channel m1 on the rv1126 */
427*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART2_IO_SEL_MASK,
428*4882a593Smuzhiyun 		     UART2_IO_SEL_M1 << UART2_IO_SEL_SHIFT);
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	/* Switch iomux */
431*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio3a_iomux_l,
432*4882a593Smuzhiyun 		     GPIO3A3_MASK | GPIO3A2_MASK,
433*4882a593Smuzhiyun 		     GPIO3A3_UART2_RX_M1 << GPIO3A3_SHIFT |
434*4882a593Smuzhiyun 		     GPIO3A2_UART2_TX_M1 << GPIO3A2_SHIFT);
435*4882a593Smuzhiyun #endif
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff580000)
438*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
439*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
440*4882a593Smuzhiyun     (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
441*4882a593Smuzhiyun 	/* UART3 m0*/
442*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART3_IO_SEL_MASK,
443*4882a593Smuzhiyun 		     UART3_IO_SEL_M0 << UART3_IO_SEL_SHIFT);
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	/* Switch iomux */
446*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio3c_iomux_h,
447*4882a593Smuzhiyun 		     GPIO3C7_MASK | GPIO3C6_MASK,
448*4882a593Smuzhiyun 		     GPIO3C7_UART3_RX_M0 << GPIO3C7_SHIFT |
449*4882a593Smuzhiyun 		     GPIO3C6_UART3_TX_M0 << GPIO3C6_SHIFT);
450*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
451*4882a593Smuzhiyun       (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
452*4882a593Smuzhiyun 	/* UART3 m1*/
453*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART3_IO_SEL_MASK,
454*4882a593Smuzhiyun 		     UART3_IO_SEL_M1 << UART3_IO_SEL_SHIFT);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	/* Switch iomux */
457*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio1a_iomux_h,
458*4882a593Smuzhiyun 		     GPIO1A7_MASK | GPIO1A6_MASK,
459*4882a593Smuzhiyun 		     GPIO1A7_UART3_TX_M1 << GPIO1A7_SHIFT |
460*4882a593Smuzhiyun 		     GPIO1A6_UART3_RX_M1 << GPIO1A6_SHIFT);
461*4882a593Smuzhiyun #else
462*4882a593Smuzhiyun 	/* UART3 m2*/
463*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART3_IO_SEL_MASK,
464*4882a593Smuzhiyun 		     UART3_IO_SEL_M2 << UART3_IO_SEL_SHIFT);
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	/* Switch iomux */
467*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio3a_iomux_l,
468*4882a593Smuzhiyun 		     GPIO3A1_MASK | GPIO3A0_MASK,
469*4882a593Smuzhiyun 		     GPIO3A1_UART3_RX_M2 << GPIO3A1_SHIFT |
470*4882a593Smuzhiyun 		     GPIO3A0_UART3_TX_M2 << GPIO3A0_SHIFT);
471*4882a593Smuzhiyun #endif
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff590000)
474*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
475*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
476*4882a593Smuzhiyun     (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
477*4882a593Smuzhiyun 	/* UART4 m0*/
478*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART4_IO_SEL_MASK,
479*4882a593Smuzhiyun 		     UART4_IO_SEL_M0 << UART4_IO_SEL_SHIFT);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	/* Switch iomux */
482*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio3a_iomux_h,
483*4882a593Smuzhiyun 		     GPIO3A5_MASK | GPIO3A4_MASK,
484*4882a593Smuzhiyun 		     GPIO3A5_UART4_RX_M0 << GPIO3A5_SHIFT |
485*4882a593Smuzhiyun 		     GPIO3A4_UART4_TX_M0 << GPIO3A4_SHIFT);
486*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
487*4882a593Smuzhiyun       (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
488*4882a593Smuzhiyun 	/* UART4 m1*/
489*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART4_IO_SEL_MASK,
490*4882a593Smuzhiyun 		     UART4_IO_SEL_M1 << UART4_IO_SEL_SHIFT);
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	/* Switch iomux */
493*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio2a_iomux_h,
494*4882a593Smuzhiyun 		     GPIO2A7_MASK | GPIO2A6_MASK,
495*4882a593Smuzhiyun 		     GPIO2A7_UART4_RX_M1 << GPIO2A7_SHIFT |
496*4882a593Smuzhiyun 		     GPIO2A6_UART4_TX_M1 << GPIO2A6_SHIFT);
497*4882a593Smuzhiyun #else
498*4882a593Smuzhiyun 	/* UART4 m2*/
499*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART4_IO_SEL_MASK,
500*4882a593Smuzhiyun 		     UART4_IO_SEL_M2 << UART4_IO_SEL_SHIFT);
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	/* Switch iomux */
503*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio1d_iomux_h,
504*4882a593Smuzhiyun 		     GPIO1D5_MASK | GPIO1D4_MASK,
505*4882a593Smuzhiyun 		     GPIO1D5_UART4_TX_M2 << GPIO1D5_SHIFT |
506*4882a593Smuzhiyun 		     GPIO1D4_UART4_RX_M2 << GPIO1D4_SHIFT);
507*4882a593Smuzhiyun #endif
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff5a0000)
510*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
511*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
512*4882a593Smuzhiyun     (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
513*4882a593Smuzhiyun 	/* UART5 m0*/
514*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART5_IO_SEL_MASK,
515*4882a593Smuzhiyun 		     UART5_IO_SEL_M0 << UART5_IO_SEL_SHIFT);
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	/* Switch iomux */
518*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio3a_iomux_h,
519*4882a593Smuzhiyun 		     GPIO3A7_MASK | GPIO3A6_MASK,
520*4882a593Smuzhiyun 		     GPIO3A7_UART5_RX_M0 << GPIO3A7_SHIFT |
521*4882a593Smuzhiyun 		     GPIO3A6_UART5_TX_M0 << GPIO3A6_SHIFT);
522*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
523*4882a593Smuzhiyun       (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
524*4882a593Smuzhiyun 	/* UART5 m1*/
525*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART5_IO_SEL_MASK,
526*4882a593Smuzhiyun 		     UART5_IO_SEL_M1 << UART5_IO_SEL_SHIFT);
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	/* Switch iomux */
529*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio2b_iomux_l,
530*4882a593Smuzhiyun 		     GPIO2B1_MASK | GPIO2B0_MASK,
531*4882a593Smuzhiyun 		     GPIO2B1_UART5_RX_M1 << GPIO2B1_SHIFT |
532*4882a593Smuzhiyun 		     GPIO2B0_UART5_TX_M1 << GPIO2B0_SHIFT);
533*4882a593Smuzhiyun #else
534*4882a593Smuzhiyun 	/* UART5 m2*/
535*4882a593Smuzhiyun 	rk_clrsetreg(&grf->iofunc_con2, UART5_IO_SEL_MASK,
536*4882a593Smuzhiyun 		     UART5_IO_SEL_M2 << UART5_IO_SEL_SHIFT);
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun 	/* Switch iomux */
539*4882a593Smuzhiyun 	rk_clrsetreg(&grf->gpio2a_iomux_l,
540*4882a593Smuzhiyun 		     GPIO2A1_MASK | GPIO2A0_MASK,
541*4882a593Smuzhiyun 		     GPIO2A1_UART5_RX_M2 << GPIO2A1_SHIFT |
542*4882a593Smuzhiyun 		     GPIO2A0_UART5_TX_M2 << GPIO2A0_SHIFT);
543*4882a593Smuzhiyun #endif
544*4882a593Smuzhiyun #endif /* CONFIG_DEBUG_UART_BASE && CONFIG_DEBUG_UART_BASE == ... */
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun #ifndef CONFIG_TPL_BUILD
arch_cpu_init(void)548*4882a593Smuzhiyun int arch_cpu_init(void)
549*4882a593Smuzhiyun {
550*4882a593Smuzhiyun 	/*
551*4882a593Smuzhiyun 	 * CONFIG_DM_RAMDISK: for ramboot that without SPL.
552*4882a593Smuzhiyun 	 */
553*4882a593Smuzhiyun #if defined(CONFIG_SPL_BUILD) || defined(CONFIG_DM_RAMDISK)
554*4882a593Smuzhiyun 	u32 pd_st, idle_st;
555*4882a593Smuzhiyun 	int delay;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	/*
558*4882a593Smuzhiyun 	 * Don't rely on CONFIG_DM_RAMDISK since it can be a default
559*4882a593Smuzhiyun 	 * configuration after disk/part_rkram.c was introduced.
560*4882a593Smuzhiyun 	 *
561*4882a593Smuzhiyun 	 * This is compatible code.
562*4882a593Smuzhiyun 	 */
563*4882a593Smuzhiyun   #ifndef CONFIG_SPL_BUILD
564*4882a593Smuzhiyun 	if (!dm_ramdisk_is_enabled())
565*4882a593Smuzhiyun 		return 0;
566*4882a593Smuzhiyun   #endif
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	/* write BOOT_WATCHDOG to boot mode register, if reset by wdt */
569*4882a593Smuzhiyun 	if (readl(PMUGRF_RSTFUNC_STATUS) & WDT_RESET_SRC) {
570*4882a593Smuzhiyun 		writel(BOOT_WATCHDOG, CONFIG_ROCKCHIP_BOOT_MODE_REG);
571*4882a593Smuzhiyun 		/* clear flag for reset by wdt trigger */
572*4882a593Smuzhiyun 		writel(WDT_RESET_SRC_CLR, PMUGRF_RSTFUNC_CLR);
573*4882a593Smuzhiyun 	}
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun   #ifdef CONFIG_SPL_BUILD
576*4882a593Smuzhiyun 	/* set otp tRWH to 0x9 for stable read */
577*4882a593Smuzhiyun 	writel(0x9, OTP_NS_BASE + OTP_NVM_TRWH);
578*4882a593Smuzhiyun 	writel(0x9, OTP_S_BASE + OTP_NVM_TRWH);
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	/*
581*4882a593Smuzhiyun 	 * Just set region 0 to unsecure.
582*4882a593Smuzhiyun 	 * (Note: only secure-world can access this register)
583*4882a593Smuzhiyun 	 */
584*4882a593Smuzhiyun 	writel(0, FIREWALL_APB_BASE + FW_DDR_CON_REG);
585*4882a593Smuzhiyun   #endif
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun 	/* disable force jtag mux route to both group0 and group1 */
588*4882a593Smuzhiyun 	writel(0x00300000, GRF_IOFUNC_CON3);
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	/* make npu aclk and sclk less then 300MHz when reset */
591*4882a593Smuzhiyun 	writel(0x00ff0055, CRU_BASE + CRU_CLKSEL_CON65);
592*4882a593Smuzhiyun 	writel(0x00ff0055, CRU_BASE + CRU_CLKSEL_CON67);
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	/*
595*4882a593Smuzhiyun 	 * When perform idle operation, corresponding clock can
596*4882a593Smuzhiyun 	 * be opened or gated automatically.
597*4882a593Smuzhiyun 	 */
598*4882a593Smuzhiyun 	writel(0xffffffff, PMU_BASE_ADDR + PMU_NOC_AUTO_CON0);
599*4882a593Smuzhiyun 	writel(0xffffffff, PMU_BASE_ADDR + PMU_NOC_AUTO_CON1);
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun   #ifdef CONFIG_SPL_KERNEL_BOOT
602*4882a593Smuzhiyun 	/* Adjust the parameters of GPLL's VCO for reduce power*/
603*4882a593Smuzhiyun 	writel(0x00030000, CRU_PMU_BASE);
604*4882a593Smuzhiyun 	writel(0xffff1063, CRU_PMU_BASE + CRU_PMU_GPLL_CON0);
605*4882a593Smuzhiyun 	writel(0xffff1442, CRU_PMU_BASE + CRU_PMU_GPLL_CON1);
606*4882a593Smuzhiyun 	writel(0x00030001, CRU_PMU_BASE);
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	/* mux clocks to none-cpll */
609*4882a593Smuzhiyun 	writel(0x00ff0003, CRU_BASE + CRU_CLKSEL_CON02);
610*4882a593Smuzhiyun 	writel(0x00ff0005, CRU_BASE + CRU_CLKSEL_CON03);
611*4882a593Smuzhiyun 	writel(0xffff8383, CRU_BASE + CRU_CLKSEL_CON27);
612*4882a593Smuzhiyun 	writel(0x00ff0083, CRU_BASE + CRU_CLKSEL_CON31);
613*4882a593Smuzhiyun 	writel(0x00ff0083, CRU_BASE + CRU_CLKSEL_CON33);
614*4882a593Smuzhiyun 	writel(0xffff4385, CRU_BASE + CRU_CLKSEL_CON40);
615*4882a593Smuzhiyun 	writel(0x00ff0043, CRU_BASE + CRU_CLKSEL_CON49);
616*4882a593Smuzhiyun 	writel(0x00ff0003, CRU_BASE + CRU_CLKSEL_CON50);
617*4882a593Smuzhiyun 	writel(0x00ff0003, CRU_BASE + CRU_CLKSEL_CON51);
618*4882a593Smuzhiyun 	writel(0xff000300, CRU_BASE + CRU_CLKSEL_CON54);
619*4882a593Smuzhiyun 	writel(0xff008900, CRU_BASE + CRU_CLKSEL_CON61);
620*4882a593Smuzhiyun 	writel(0x00ff0089, CRU_BASE + CRU_CLKSEL_CON63);
621*4882a593Smuzhiyun 	writel(0x00ff0045, CRU_BASE + CRU_CLKSEL_CON68);
622*4882a593Smuzhiyun 	writel(0x00ff0043, CRU_BASE + CRU_CLKSEL_CON69);
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun   #endif
625*4882a593Smuzhiyun 	/* enable all pd */
626*4882a593Smuzhiyun 	writel(0xffff0000, PMU_BASE_ADDR + PMU_PWR_GATE_SFTCON);
627*4882a593Smuzhiyun 	delay = 1000;
628*4882a593Smuzhiyun 	do {
629*4882a593Smuzhiyun 		udelay(1);
630*4882a593Smuzhiyun 		delay--;
631*4882a593Smuzhiyun 	} while (delay && readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST));
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun 	/* release all idle request */
634*4882a593Smuzhiyun 	writel(0xffff0000, PMU_BASE_ADDR + PMU_BUS_IDLE_SFTCON(0));
635*4882a593Smuzhiyun 	writel(0xffff0000, PMU_BASE_ADDR + PMU_BUS_IDLE_SFTCON(1));
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	delay = 1000;
638*4882a593Smuzhiyun 	/* wait ack status */
639*4882a593Smuzhiyun 	do {
640*4882a593Smuzhiyun 		udelay(1);
641*4882a593Smuzhiyun 		delay--;
642*4882a593Smuzhiyun 	} while (delay && readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ACK));
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	delay = 1000;
645*4882a593Smuzhiyun 	/* wait idle status */
646*4882a593Smuzhiyun 	do {
647*4882a593Smuzhiyun 		udelay(1);
648*4882a593Smuzhiyun 		delay--;
649*4882a593Smuzhiyun 	} while (delay && readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST));
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	pd_st = readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST);
652*4882a593Smuzhiyun 	idle_st = readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST);
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 	if (pd_st || idle_st) {
655*4882a593Smuzhiyun 		printf("PMU_PWR_DOWN_ST: 0x%08x\n", pd_st);
656*4882a593Smuzhiyun 		printf("PMU_BUS_IDLE_ST: 0x%08x\n", idle_st);
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 		if (idle_st & PMU_BUS_IDLE_NPU)
659*4882a593Smuzhiyun 			printf("Failed to enable PD_NPU, please check VDD_NPU is supplied\n");
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 		if (idle_st & PMU_BUS_IDLE_VEPU)
662*4882a593Smuzhiyun 			printf("Failed to enable PD_VEPU, please check VDD_VEPU is supplied\n");
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 		hang();
665*4882a593Smuzhiyun 	}
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	writel(0x303, USB_HOST_PRIORITY_REG);
668*4882a593Smuzhiyun 	writel(0x303, USB_OTG_PRIORITY_REG);
669*4882a593Smuzhiyun 	writel(0x101, DECOM_PRIORITY_REG);
670*4882a593Smuzhiyun 	writel(0x303, DMA_PRIORITY_REG);
671*4882a593Smuzhiyun 	writel(0x101, MCU_DM_PRIORITY_REG);
672*4882a593Smuzhiyun 	writel(0x101, MCU_IM_PRIORITY_REG);
673*4882a593Smuzhiyun 	writel(0x101, A7_PRIORITY_REG);
674*4882a593Smuzhiyun 	writel(0x303, GMAC_PRIORITY_REG);
675*4882a593Smuzhiyun 	writel(0x101, NPU_PRIORITY_REG);
676*4882a593Smuzhiyun 	writel(0x303, EMMC_PRIORITY_REG);
677*4882a593Smuzhiyun 	writel(0x303, NANDC_PRIORITY_REG);
678*4882a593Smuzhiyun 	writel(0x303, SFC_PRIORITY_REG);
679*4882a593Smuzhiyun 	writel(0x303, SDMMC_PRIORITY_REG);
680*4882a593Smuzhiyun 	writel(0x303, SDIO_PRIORITY_REG);
681*4882a593Smuzhiyun 	writel(0x101, VEPU_RD0_PRIORITY_REG);
682*4882a593Smuzhiyun 	writel(0x101, VEPU_RD1_PRIORITY_REG);
683*4882a593Smuzhiyun 	writel(0x101, VEPU_WR_PRIORITY_REG);
684*4882a593Smuzhiyun 	writel(0x101, ISPP_M0_PRIORITY_REG);
685*4882a593Smuzhiyun 	writel(0x101, ISPP_M1_PRIORITY_REG);
686*4882a593Smuzhiyun 	writel(0x101, ISP_PRIORITY_REG);
687*4882a593Smuzhiyun 	writel(0x202, CIF_LITE_PRIORITY_REG);
688*4882a593Smuzhiyun 	writel(0x202, CIF_PRIORITY_REG);
689*4882a593Smuzhiyun 	writel(0x101, IEP_PRIORITY_REG);
690*4882a593Smuzhiyun 	writel(0x101, RGA_RD_PRIORITY_REG);
691*4882a593Smuzhiyun 	writel(0x101, RGA_WR_PRIORITY_REG);
692*4882a593Smuzhiyun 	writel(0x202, VOP_PRIORITY_REG);
693*4882a593Smuzhiyun 	writel(0x101, VDPU_PRIORITY_REG);
694*4882a593Smuzhiyun 	writel(0x101, JPEG_PRIORITY_REG);
695*4882a593Smuzhiyun 	writel(0x101, CRYPTO_PRIORITY_REG);
696*4882a593Smuzhiyun 	/* enable dynamic priority */
697*4882a593Smuzhiyun 	writel(0x1, ISP_PRIORITY_EX_REG);
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 	/*
700*4882a593Smuzhiyun 	 * Init the i2c0 iomux and use it to control electronic voltmeter
701*4882a593Smuzhiyun 	 * to detect voltage.
702*4882a593Smuzhiyun 	 */
703*4882a593Smuzhiyun   #if defined(CONFIG_SPL_KERNEL_BOOT) && defined(CONFIG_SPL_DM_FUEL_GAUGE)
704*4882a593Smuzhiyun 	writel(0x00770011, PMU_GRF_BASE + PMUGRF_GPIO0B_IOMUX_H);
705*4882a593Smuzhiyun   #endif
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun #elif defined(CONFIG_SUPPORT_USBPLUG)
708*4882a593Smuzhiyun 	/* Just set region 0 to unsecure */
709*4882a593Smuzhiyun 	writel(0, FIREWALL_APB_BASE + FW_DDR_CON_REG);
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	/* reset usbphy_otg usbphypor_otg */
712*4882a593Smuzhiyun 	writel(((0x1 << 6 | (1 << 8)) << 16) | (0x1 << 6) | (1 << 8), CRU_SOFTRST_CON11);
713*4882a593Smuzhiyun 	udelay(50);
714*4882a593Smuzhiyun 	writel(((0x1 << 6 | (1 << 8)) << 16) | (0), CRU_SOFTRST_CON11);
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	/* hold pmugrf's io reset */
717*4882a593Smuzhiyun 	writel(0x1 << 7 | 1 << 23, PMUGRF_SOC_CON1);
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun #else /* U-Boot */
720*4882a593Smuzhiyun 	/* uboot: config iomux for sd boot upgrade firmware */
721*4882a593Smuzhiyun   #if defined(CONFIG_ROCKCHIP_SFC_IOMUX)
722*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 	writel(0x0F0F0303, &grf->gpio0d_iomux_h);
725*4882a593Smuzhiyun 	writel(0xFFFF3333, &grf->gpio1a_iomux_l);
726*4882a593Smuzhiyun   #elif defined(CONFIG_ROCKCHIP_EMMC_IOMUX)
727*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 	writel(0xFFFF2222, &grf->gpio0c_iomux_h);
730*4882a593Smuzhiyun 	writel(0xFFFF2222, &grf->gpio0d_iomux_l);
731*4882a593Smuzhiyun 	writel(0xF0F02020, &grf->gpio0d_iomux_h);
732*4882a593Smuzhiyun   #elif defined(CONFIG_ROCKCHIP_NAND_IOMUX)
733*4882a593Smuzhiyun 	static struct rv1126_grf * const grf = (void *)GRF_BASE;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	writel(0xFFFF1111, &grf->gpio0c_iomux_h);
736*4882a593Smuzhiyun 	writel(0xFFFF1111, &grf->gpio0d_iomux_l);
737*4882a593Smuzhiyun 	writel(0xF0FF1011, &grf->gpio0d_iomux_h);
738*4882a593Smuzhiyun 	writel(0xFFFF1111, &grf->gpio1a_iomux_l);
739*4882a593Smuzhiyun   #endif
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun #endif
742*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_SFC)
743*4882a593Smuzhiyun 	/* GPIO0_D6 pull down in default, pull up it for SPI Flash */
744*4882a593Smuzhiyun 	writel(((0x3 << 12) << 16) | (0x1 << 12), GRF1_GPIO0D_P);
745*4882a593Smuzhiyun #endif
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 	return 0;
748*4882a593Smuzhiyun }
749*4882a593Smuzhiyun #endif
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
spl_fit_standalone_release(char * id,uintptr_t entry_point)752*4882a593Smuzhiyun int spl_fit_standalone_release(char *id, uintptr_t entry_point)
753*4882a593Smuzhiyun {
754*4882a593Smuzhiyun 	/*
755*4882a593Smuzhiyun 	 * Fix mcu does not work probabilistically through reset the
756*4882a593Smuzhiyun 	 * mcu debug module. If use the jtag debug, reset it.
757*4882a593Smuzhiyun 	 */
758*4882a593Smuzhiyun 	writel(0x80008000, GRF_BASE + GRF_SOC_CON2);
759*4882a593Smuzhiyun 	/* Reset the scr1 */
760*4882a593Smuzhiyun 	writel(0x04000400, CRU_BASE + CRU_SOFTRST_CON02);
761*4882a593Smuzhiyun 	udelay(100);
762*4882a593Smuzhiyun 	/* set the scr1 addr */
763*4882a593Smuzhiyun 	writel(entry_point, SGRF_BASE + SGRF_CON_SCR1_BOOT_ADDR);
764*4882a593Smuzhiyun 	writel(0x00ff00bf, SGRF_BASE + SGRF_SOC_CON3);
765*4882a593Smuzhiyun 	udelay(10);
766*4882a593Smuzhiyun 	/* release the scr1 */
767*4882a593Smuzhiyun 	writel(0x04000000, CRU_BASE + CRU_SOFTRST_CON02);
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun 	return 0;
770*4882a593Smuzhiyun }
771*4882a593Smuzhiyun #endif
772