1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2020 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_rk3568.h>
13*4882a593Smuzhiyun #include <asm/arch/rk_atags.h>
14*4882a593Smuzhiyun #include <linux/libfdt.h>
15*4882a593Smuzhiyun #include <fdt_support.h>
16*4882a593Smuzhiyun #include <asm/arch/clock.h>
17*4882a593Smuzhiyun #include <dt-bindings/clock/rk3568-cru.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #define PMUGRF_BASE 0xfdc20000
22*4882a593Smuzhiyun #define GRF_BASE 0xfdc60000
23*4882a593Smuzhiyun #define GRF_GPIO1B_IOMUX_H 0x0C
24*4882a593Smuzhiyun #define GRF_GPIO1C_IOMUX_L 0x10
25*4882a593Smuzhiyun #define GRF_GPIO1C_IOMUX_H 0x14
26*4882a593Smuzhiyun #define GRF_GPIO1D_IOMUX_L 0x18
27*4882a593Smuzhiyun #define GRF_GPIO1D_IOMUX_H 0x1C
28*4882a593Smuzhiyun #define GRF_GPIO1B_DS_2 0x218
29*4882a593Smuzhiyun #define GRF_GPIO1B_DS_3 0x21c
30*4882a593Smuzhiyun #define GRF_GPIO1C_DS_0 0x220
31*4882a593Smuzhiyun #define GRF_GPIO1C_DS_1 0x224
32*4882a593Smuzhiyun #define GRF_GPIO1C_DS_2 0x228
33*4882a593Smuzhiyun #define GRF_GPIO1C_DS_3 0x22c
34*4882a593Smuzhiyun #define GRF_GPIO1D_DS_0 0x230
35*4882a593Smuzhiyun #define GRF_GPIO1D_DS_1 0x234
36*4882a593Smuzhiyun #define GRF_GPIO1D_DS_2 0x238
37*4882a593Smuzhiyun #define GRF_SOC_CON4 0x510
38*4882a593Smuzhiyun #define PMU_BASE_ADDR 0xfdd90000
39*4882a593Smuzhiyun #define PMU_NOC_AUTO_CON0 (0x70)
40*4882a593Smuzhiyun #define PMU_NOC_AUTO_CON1 (0x74)
41*4882a593Smuzhiyun #define CRU_BASE 0xfdd20000
42*4882a593Smuzhiyun #define CRU_SOFTRST_CON26 0x468
43*4882a593Smuzhiyun #define CRU_SOFTRST_CON28 0x470
44*4882a593Smuzhiyun #define SGRF_BASE 0xFDD18000
45*4882a593Smuzhiyun #define SGRF_SOC_CON3 0xC
46*4882a593Smuzhiyun #define SGRF_SOC_CON4 0x10
47*4882a593Smuzhiyun #define PMUGRF_SOC_CON15 0xfdc20100
48*4882a593Smuzhiyun #define CPU_GRF_BASE 0xfdc30000
49*4882a593Smuzhiyun #define GRF_CORE_PVTPLL_CON0 (0x10)
50*4882a593Smuzhiyun #define USBPHY_U3_GRF 0xfdca0000
51*4882a593Smuzhiyun #define USBPHY_U3_GRF_CON1 (USBPHY_U3_GRF + 0x04)
52*4882a593Smuzhiyun #define USBPHY_U2_GRF 0xfdca8000
53*4882a593Smuzhiyun #define USBPHY_U2_GRF_CON0 (USBPHY_U2_GRF + 0x00)
54*4882a593Smuzhiyun #define USBPHY_U2_GRF_CON1 (USBPHY_U2_GRF + 0x04)
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define PMU_PWR_GATE_SFTCON (0xA0)
57*4882a593Smuzhiyun #define PMU_PWR_DWN_ST (0x98)
58*4882a593Smuzhiyun #define PMU_BUS_IDLE_SFTCON0 (0x50)
59*4882a593Smuzhiyun #define PMU_BUS_IDLE_ST (0x68)
60*4882a593Smuzhiyun #define PMU_BUS_IDLE_ACK (0x60)
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun #define EBC_PRIORITY_REG (0xfe158008)
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun enum {
65*4882a593Smuzhiyun /* PMU_GRF_GPIO0C_IOMUX_L */
66*4882a593Smuzhiyun GPIO0C1_SHIFT = 4,
67*4882a593Smuzhiyun GPIO0C1_MASK = GENMASK(6, 4),
68*4882a593Smuzhiyun GPIO0C1_GPIO = 0,
69*4882a593Smuzhiyun GPIO0C1_PWM2_M0,
70*4882a593Smuzhiyun GPIO0C1_NPU_AVS,
71*4882a593Smuzhiyun GPIO0C1_UART0_TX,
72*4882a593Smuzhiyun GPIO0C1_MCU_JTAGTDI,
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun GPIO0C0_SHIFT = 0,
75*4882a593Smuzhiyun GPIO0C0_MASK = GENMASK(2, 0),
76*4882a593Smuzhiyun GPIO0C0_GPIO = 0,
77*4882a593Smuzhiyun GPIO0C0_PWM1_M0,
78*4882a593Smuzhiyun GPIO0C0_GPU_AVS,
79*4882a593Smuzhiyun GPIO0C0_UART0_RX,
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun /* PMU_GRF_GPIO0D_IOMUX_L */
82*4882a593Smuzhiyun GPIO0D1_SHIFT = 4,
83*4882a593Smuzhiyun GPIO0D1_MASK = GENMASK(6, 4),
84*4882a593Smuzhiyun GPIO0D1_GPIO = 0,
85*4882a593Smuzhiyun GPIO0D1_UART2_TXM0,
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun GPIO0D0_SHIFT = 0,
88*4882a593Smuzhiyun GPIO0D0_MASK = GENMASK(2, 0),
89*4882a593Smuzhiyun GPIO0D0_GPIO = 0,
90*4882a593Smuzhiyun GPIO0D0_UART2_RXM0,
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /* PMU_GRF_SOC_CON0 */
93*4882a593Smuzhiyun UART0_IO_SEL_SHIFT = 8,
94*4882a593Smuzhiyun UART0_IO_SEL_MASK = GENMASK(9, 8),
95*4882a593Smuzhiyun UART0_IO_SEL_M0 = 0,
96*4882a593Smuzhiyun UART0_IO_SEL_M1,
97*4882a593Smuzhiyun UART0_IO_SEL_M2,
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun enum {
101*4882a593Smuzhiyun /* GRF_GPIO1A_IOMUX_L */
102*4882a593Smuzhiyun GPIO1A1_SHIFT = 4,
103*4882a593Smuzhiyun GPIO1A1_MASK = GENMASK(6, 4),
104*4882a593Smuzhiyun GPIO1A1_GPIO = 0,
105*4882a593Smuzhiyun GPIO1A1_I2C3_SCLM0,
106*4882a593Smuzhiyun GPIO1A1_UART3_TXM0,
107*4882a593Smuzhiyun GPIO1A1_CAN1_TXM0,
108*4882a593Smuzhiyun GPIO1A1_AUDIOPWM_ROUT,
109*4882a593Smuzhiyun GPIO1A1_ACODEC_ADCCLK,
110*4882a593Smuzhiyun GPIO1A1_AUDIOPWM_LOUT,
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun GPIO1A0_SHIFT = 0,
113*4882a593Smuzhiyun GPIO1A0_MASK = GENMASK(2, 0),
114*4882a593Smuzhiyun GPIO1A0_GPIO = 0,
115*4882a593Smuzhiyun GPIO1A0_I2C3_SDAM0,
116*4882a593Smuzhiyun GPIO1A0_UART3_RXM0,
117*4882a593Smuzhiyun GPIO1A0_CAN1_RXM0,
118*4882a593Smuzhiyun GPIO1A0_AUDIOPWM_LOUT,
119*4882a593Smuzhiyun GPIO1A0_ACODEC_ADCDATA,
120*4882a593Smuzhiyun GPIO1A0_AUDIOPWM_LOUTP,
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun /* GRF_GPIO1A_IOMUX_H */
123*4882a593Smuzhiyun GPIO1A6_SHIFT = 8,
124*4882a593Smuzhiyun GPIO1A6_MASK = GENMASK(10, 8),
125*4882a593Smuzhiyun GPIO1A6_GPIO = 0,
126*4882a593Smuzhiyun GPIO1A6_I2S1_LRCKRXM0,
127*4882a593Smuzhiyun GPIO1A6_UART4_TXM0,
128*4882a593Smuzhiyun GPIO1A6_PDM_CLK0M0,
129*4882a593Smuzhiyun GPIO1A6_AUDIOPWM_ROUTP,
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun GPIO1A4_SHIFT = 0,
132*4882a593Smuzhiyun GPIO1A4_MASK = GENMASK(2, 0),
133*4882a593Smuzhiyun GPIO1A4_GPIO = 0,
134*4882a593Smuzhiyun GPIO1A4_I2S1_SCLKRXM0,
135*4882a593Smuzhiyun GPIO1A4_UART4_RXM0,
136*4882a593Smuzhiyun GPIO1A4_PDM_CLK1M0,
137*4882a593Smuzhiyun GPIO1A4_SPDIF_TXM0,
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /* GRF_GPIO1D_IOMUX_H */
140*4882a593Smuzhiyun GPIO1D6_SHIFT = 8,
141*4882a593Smuzhiyun GPIO1D6_MASK = GENMASK(10, 8),
142*4882a593Smuzhiyun GPIO1D6_GPIO = 0,
143*4882a593Smuzhiyun GPIO1D6_SDMMC0_D1,
144*4882a593Smuzhiyun GPIO1D6_UART2_RXM1,
145*4882a593Smuzhiyun GPIO1D6_UART6_RXM1,
146*4882a593Smuzhiyun GPIO1D6_PWM9_M1,
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun GPIO1D5_SHIFT = 4,
149*4882a593Smuzhiyun GPIO1D5_MASK = GENMASK(6, 4),
150*4882a593Smuzhiyun GPIO1D5_GPIO = 0,
151*4882a593Smuzhiyun GPIO1D5_SDMMC0_D0,
152*4882a593Smuzhiyun GPIO1D5_UART2_TXM1,
153*4882a593Smuzhiyun GPIO1D5_UART6_TXM1,
154*4882a593Smuzhiyun GPIO1D5_PWM8_M1,
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun /* GRF_GPIO2A_IOMUX_L */
157*4882a593Smuzhiyun GPIO2A3_SHIFT = 12,
158*4882a593Smuzhiyun GPIO2A3_MASK = GENMASK(14, 12),
159*4882a593Smuzhiyun GPIO2A3_GPIO = 0,
160*4882a593Smuzhiyun GPIO2A3_SDMMC1_D0,
161*4882a593Smuzhiyun GPIO2A3_GMAC0_RXD2,
162*4882a593Smuzhiyun GPIO2A3_UART6_RXM0,
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun GPIO2A2_SHIFT = 8,
165*4882a593Smuzhiyun GPIO2A2_MASK = GENMASK(10, 8),
166*4882a593Smuzhiyun GPIO2A2_GPIO = 0,
167*4882a593Smuzhiyun GPIO2A2_SDMMC0_CLK,
168*4882a593Smuzhiyun GPIO2A2_TEST_CLKOUT,
169*4882a593Smuzhiyun GPIO2A2_UART5_TXM0,
170*4882a593Smuzhiyun GPIO2A2_CAN0_RXM1,
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun GPIO2A1_SHIFT = 4,
173*4882a593Smuzhiyun GPIO2A1_MASK = GENMASK(6, 4),
174*4882a593Smuzhiyun GPIO2A1_GPIO = 0,
175*4882a593Smuzhiyun GPIO2A1_SDMMC0_CMD,
176*4882a593Smuzhiyun GPIO2A1_PWM10_M1,
177*4882a593Smuzhiyun GPIO2A1_UART5_RXM0,
178*4882a593Smuzhiyun GPIO2A1_CAN0_TXM1,
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun /* GRF_GPIO2A_IOMUX_H */
181*4882a593Smuzhiyun GPIO2A7_SHIFT = 12,
182*4882a593Smuzhiyun GPIO2A7_MASK = GENMASK(14, 12),
183*4882a593Smuzhiyun GPIO2A7_GPIO = 0,
184*4882a593Smuzhiyun GPIO2A7_SDMMC1_CMD,
185*4882a593Smuzhiyun GPIO2A7_GMAC0_TXD3,
186*4882a593Smuzhiyun GPIO2A7_UART9_RXM0,
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun GPIO2A6_SHIFT = 8,
189*4882a593Smuzhiyun GPIO2A6_MASK = GENMASK(10, 8),
190*4882a593Smuzhiyun GPIO2A6_GPIO = 0,
191*4882a593Smuzhiyun GPIO2A6_SDMMC1_D3,
192*4882a593Smuzhiyun GPIO2A6_GMAC0_TXD2,
193*4882a593Smuzhiyun GPIO2A6_UART7_TXM0,
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun GPIO2A5_SHIFT = 4,
196*4882a593Smuzhiyun GPIO2A5_MASK = GENMASK(6, 4),
197*4882a593Smuzhiyun GPIO2A5_GPIO = 0,
198*4882a593Smuzhiyun GPIO2A5_SDMMC1_D2,
199*4882a593Smuzhiyun GPIO2A5_GMAC0_RXCLK,
200*4882a593Smuzhiyun GPIO2A5_UART7_RXM0,
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun GPIO2A4_SHIFT = 0,
203*4882a593Smuzhiyun GPIO2A4_MASK = GENMASK(2, 0),
204*4882a593Smuzhiyun GPIO2A4_GPIO = 0,
205*4882a593Smuzhiyun GPIO2A4_SDMMC1_D1,
206*4882a593Smuzhiyun GPIO2A4_GMAC0_RXD3,
207*4882a593Smuzhiyun GPIO2A4_UART6_TXM0,
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun /* GRF_GPIO2B_IOMUX_L */
210*4882a593Smuzhiyun GPIO2B3_SHIFT = 12,
211*4882a593Smuzhiyun GPIO2B3_MASK = GENMASK(14, 12),
212*4882a593Smuzhiyun GPIO2B3_GPIO = 0,
213*4882a593Smuzhiyun GPIO2B3_GMAC0_TXD0,
214*4882a593Smuzhiyun GPIO2B3_UART1_RXM0,
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun GPIO2B0_SHIFT = 0,
217*4882a593Smuzhiyun GPIO2B0_MASK = GENMASK(2, 0),
218*4882a593Smuzhiyun GPIO2B0_GPIO = 0,
219*4882a593Smuzhiyun GPIO2B0_SDMMC1_CLK,
220*4882a593Smuzhiyun GPIO2B0_GMAC0_TXCLK,
221*4882a593Smuzhiyun GPIO2B0_UART9_TXM0,
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun /* GRF_GPIO2B_IOMUX_H */
224*4882a593Smuzhiyun GPIO2B4_SHIFT = 0,
225*4882a593Smuzhiyun GPIO2B4_MASK = GENMASK(2, 0),
226*4882a593Smuzhiyun GPIO2B4_GPIO = 0,
227*4882a593Smuzhiyun GPIO2B4_GMAC0_TXD1,
228*4882a593Smuzhiyun GPIO2B4_UART1_TXM0,
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /* GRF_GPIO2C_IOMUX_L */
231*4882a593Smuzhiyun GPIO2C2_SHIFT = 8,
232*4882a593Smuzhiyun GPIO2C2_MASK = GENMASK(10, 8),
233*4882a593Smuzhiyun GPIO2C2_GPIO = 0,
234*4882a593Smuzhiyun GPIO2C2_GMAC0_MCLKINOUT = 2,
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun /* GRF_GPIO2C_IOMUX_H */
237*4882a593Smuzhiyun GPIO2C6_SHIFT = 8,
238*4882a593Smuzhiyun GPIO2C6_MASK = GENMASK(10, 8),
239*4882a593Smuzhiyun GPIO2C6_GPIO = 0,
240*4882a593Smuzhiyun GPIO2C6_CLK32K_OUT1,
241*4882a593Smuzhiyun GPIO2C6_UART8_RXM0,
242*4882a593Smuzhiyun GPIO2C6_SPI1_CS1M0,
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun GPIO2C5_SHIFT = 4,
245*4882a593Smuzhiyun GPIO2C5_MASK = GENMASK(6, 4),
246*4882a593Smuzhiyun GPIO2C5_GPIO = 0,
247*4882a593Smuzhiyun GPIO2C5_I2S2_SDIM0,
248*4882a593Smuzhiyun GPIO2C5_GMAC0_RXER,
249*4882a593Smuzhiyun GPIO2C5_UART8_TXM0,
250*4882a593Smuzhiyun GPIO2C5_SPI2_CS1M0,
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun /* GRF_GPIO2D_IOMUX_H */
253*4882a593Smuzhiyun GPIO2D7_SHIFT = 12,
254*4882a593Smuzhiyun GPIO2D7_MASK = GENMASK(14, 12),
255*4882a593Smuzhiyun GPIO2D7_GPIO = 0,
256*4882a593Smuzhiyun GPIO2D7_LCDC_D7,
257*4882a593Smuzhiyun GPIO2D7_BT656_D7M0,
258*4882a593Smuzhiyun GPIO2D7_SPI2_MISOM1,
259*4882a593Smuzhiyun GPIO2D7_UART8_TXM1,
260*4882a593Smuzhiyun GPIO2D7_I2S1_SDO0M2,
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun /* GRF_GPIO3A_IOMUX_L */
263*4882a593Smuzhiyun GPIO3A0_SHIFT = 0,
264*4882a593Smuzhiyun GPIO3A0_MASK = GENMASK(2, 0),
265*4882a593Smuzhiyun GPIO3A0_GPIO = 0,
266*4882a593Smuzhiyun GPIO3A0_LCDC_CLK,
267*4882a593Smuzhiyun GPIO3A0_BT656_CLKM0,
268*4882a593Smuzhiyun GPIO3A0_SPI2_CLKM1,
269*4882a593Smuzhiyun GPIO3A0_UART8_RXM1,
270*4882a593Smuzhiyun GPIO3A0_I2S1_SDO1M2,
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun /* GRF_GPIO3B_IOMUX_L */
273*4882a593Smuzhiyun GPIO3B2_SHIFT = 8,
274*4882a593Smuzhiyun GPIO3B2_MASK = GENMASK(10, 8),
275*4882a593Smuzhiyun GPIO3B2_GPIO = 0,
276*4882a593Smuzhiyun GPIO3B2_LCDC_D17,
277*4882a593Smuzhiyun GPIO3B2_BT1120_D8,
278*4882a593Smuzhiyun GPIO3B2_GMAC1_RXD1M0,
279*4882a593Smuzhiyun GPIO3B2_UART4_TXM1,
280*4882a593Smuzhiyun GPIO3B2_PWM9_M0,
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun GPIO3B1_SHIFT = 4,
283*4882a593Smuzhiyun GPIO3B1_MASK = GENMASK(6, 4),
284*4882a593Smuzhiyun GPIO3B1_GPIO = 0,
285*4882a593Smuzhiyun GPIO3B1_LCDC_D16,
286*4882a593Smuzhiyun GPIO3B1_BT1120_D7,
287*4882a593Smuzhiyun GPIO3B1_GMAC1_RXD0M0,
288*4882a593Smuzhiyun GPIO3B1_UART4_RXM1,
289*4882a593Smuzhiyun GPIO3B1_PWM8_M0,
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun /* GRF_GPIO3B_IOMUX_H */
292*4882a593Smuzhiyun GPIO3B7_SHIFT = 12,
293*4882a593Smuzhiyun GPIO3B7_MASK = GENMASK(14, 12),
294*4882a593Smuzhiyun GPIO3B7_GPIO = 0,
295*4882a593Smuzhiyun GPIO3B7_LCDC_D22,
296*4882a593Smuzhiyun GPIO3B7_PWM12_M0,
297*4882a593Smuzhiyun GPIO3B7_GMAC1_TXENM0,
298*4882a593Smuzhiyun GPIO3B7_UART3_TXM1,
299*4882a593Smuzhiyun GPIO3B7_PDM_SDI2M2,
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun /* GRF_GPIO3C_IOMUX_L */
302*4882a593Smuzhiyun GPIO3C3_SHIFT = 12,
303*4882a593Smuzhiyun GPIO3C3_MASK = GENMASK(14, 12),
304*4882a593Smuzhiyun GPIO3C3_GPIO = 0,
305*4882a593Smuzhiyun GPIO3C3_LCDC_DEN,
306*4882a593Smuzhiyun GPIO3C3_BT1120_D15,
307*4882a593Smuzhiyun GPIO3C3_SPI1_CLKM1,
308*4882a593Smuzhiyun GPIO3C3_UART5_RXM1,
309*4882a593Smuzhiyun GPIO3C3_I2S1_SCLKRXM,
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun GPIO3C2_SHIFT = 8,
312*4882a593Smuzhiyun GPIO3C2_MASK = GENMASK(10, 8),
313*4882a593Smuzhiyun GPIO3C2_GPIO = 0,
314*4882a593Smuzhiyun GPIO3C2_LCDC_VSYNC,
315*4882a593Smuzhiyun GPIO3C2_BT1120_D14,
316*4882a593Smuzhiyun GPIO3C2_SPI1_MISOM1,
317*4882a593Smuzhiyun GPIO3C2_UART5_TXM1,
318*4882a593Smuzhiyun GPIO3C2_I2S1_SDO3M2,
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun GPIO3C0_SHIFT = 0,
321*4882a593Smuzhiyun GPIO3C0_MASK = GENMASK(2, 0),
322*4882a593Smuzhiyun GPIO3C0_GPIO = 0,
323*4882a593Smuzhiyun GPIO3C0_LCDC_D23,
324*4882a593Smuzhiyun GPIO3C0_PWM13_M0,
325*4882a593Smuzhiyun GPIO3C0_GMAC1_MCLKINOUTM0,
326*4882a593Smuzhiyun GPIO3C0_UART3_RXM1,
327*4882a593Smuzhiyun GPIO3C0_PDM_SDI3M2,
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun /* GRF_GPIO3C_IOMUX_H */
330*4882a593Smuzhiyun GPIO3C5_SHIFT = 4,
331*4882a593Smuzhiyun GPIO3C5_MASK = GENMASK(6, 4),
332*4882a593Smuzhiyun GPIO3C5_GPIO = 0,
333*4882a593Smuzhiyun GPIO3C5_PWM15_IRM0,
334*4882a593Smuzhiyun GPIO3C5_SPDIF_TXM1,
335*4882a593Smuzhiyun GPIO3C5_GMAC1_MDIOM0,
336*4882a593Smuzhiyun GPIO3C5_UART7_RXM1,
337*4882a593Smuzhiyun GPIO3C5_I2S1_LRCKRXM2,
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun GPIO3C4_SHIFT = 0,
340*4882a593Smuzhiyun GPIO3C4_MASK = GENMASK(2, 0),
341*4882a593Smuzhiyun GPIO3C4_GPIO = 0,
342*4882a593Smuzhiyun GPIO3C4_PWM14_M0,
343*4882a593Smuzhiyun GPIO3C4_VOP_PWMM1,
344*4882a593Smuzhiyun GPIO3C4_GMAC1_MDCM0,
345*4882a593Smuzhiyun GPIO3C4_UART7_TXM1,
346*4882a593Smuzhiyun GPIO3C4_PDM_CLK1M2,
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun /* GRF_GPIO3D_IOMUX_H */
349*4882a593Smuzhiyun GPIO3D7_SHIFT = 12,
350*4882a593Smuzhiyun GPIO3D7_MASK = GENMASK(14, 12),
351*4882a593Smuzhiyun GPIO3D7_GPIO = 0,
352*4882a593Smuzhiyun GPIO3D7_CIF_D9,
353*4882a593Smuzhiyun GPIO3D7_EBC_SDDO9,
354*4882a593Smuzhiyun GPIO3D7_GMAC1_TXD3M1,
355*4882a593Smuzhiyun GPIO3D7_UART1_RXM1,
356*4882a593Smuzhiyun GPIO3D7_PDM_SDI0M1,
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun GPIO3D6_SHIFT = 8,
359*4882a593Smuzhiyun GPIO3D6_MASK = GENMASK(10, 8),
360*4882a593Smuzhiyun GPIO3D6_GPIO = 0,
361*4882a593Smuzhiyun GPIO3D6_CIF_D8,
362*4882a593Smuzhiyun GPIO3D6_EBC_SDDO8,
363*4882a593Smuzhiyun GPIO3D6_GMAC1_TXD2M1,
364*4882a593Smuzhiyun GPIO3D6_UART1_TXM1,
365*4882a593Smuzhiyun GPIO3D6_PDM_CLK0M1,
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun /* GRF_GPIO4A_IOMUX_L */
368*4882a593Smuzhiyun GPIO4A3_SHIFT = 12,
369*4882a593Smuzhiyun GPIO4A3_MASK = GENMASK(14, 12),
370*4882a593Smuzhiyun GPIO4A3_GPIO = 0,
371*4882a593Smuzhiyun GPIO4A3_CIF_D13,
372*4882a593Smuzhiyun GPIO4A3_EBC_SDDO13,
373*4882a593Smuzhiyun GPIO4A3_GMAC1_RXCLKM1,
374*4882a593Smuzhiyun GPIO4A3_UART7_RXM2,
375*4882a593Smuzhiyun GPIO4A3_PDM_SDI3M1,
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun GPIO4A2_SHIFT = 8,
378*4882a593Smuzhiyun GPIO4A2_MASK = GENMASK(10, 8),
379*4882a593Smuzhiyun GPIO4A2_GPIO = 0,
380*4882a593Smuzhiyun GPIO4A2_CIF_D12,
381*4882a593Smuzhiyun GPIO4A2_EBC_SDDO12,
382*4882a593Smuzhiyun GPIO4A2_GMAC1_RXD3M1,
383*4882a593Smuzhiyun GPIO4A2_UART7_TXM2,
384*4882a593Smuzhiyun GPIO4A2_PDM_SDI2M1,
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun /* GRF_GPIO4A_IOMUX_H */
387*4882a593Smuzhiyun GPIO4A5_SHIFT = 4,
388*4882a593Smuzhiyun GPIO4A5_MASK = GENMASK(6, 4),
389*4882a593Smuzhiyun GPIO4A5_GPIO = 0,
390*4882a593Smuzhiyun GPIO4A5_CIF_D15,
391*4882a593Smuzhiyun GPIO4A5_EBC_SDDO15,
392*4882a593Smuzhiyun GPIO4A5_GMAC1_TXD1M1,
393*4882a593Smuzhiyun GPIO4A5_UART9_RXM2,
394*4882a593Smuzhiyun GPIO4A5_I2S2_LRCKRXM1,
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun GPIO4A4_SHIFT = 0,
397*4882a593Smuzhiyun GPIO4A4_MASK = GENMASK(2, 0),
398*4882a593Smuzhiyun GPIO4A4_GPIO = 0,
399*4882a593Smuzhiyun GPIO4A4_CIF_D14,
400*4882a593Smuzhiyun GPIO4A4_EBC_SDDO14,
401*4882a593Smuzhiyun GPIO4A4_GMAC1_TXD0M1,
402*4882a593Smuzhiyun GPIO4A4_UART9_TXM2,
403*4882a593Smuzhiyun GPIO4A4_I2S2_LRCKTXM1,
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun /* GRF_GPIO4C_IOMUX_L */
406*4882a593Smuzhiyun GPIO4C1_SHIFT = 4,
407*4882a593Smuzhiyun GPIO4C1_MASK = GENMASK(6, 4),
408*4882a593Smuzhiyun GPIO4C1_GPIO = 0,
409*4882a593Smuzhiyun GPIO4C1_CIF_CLKIN,
410*4882a593Smuzhiyun GPIO4C1_EBC_SDCLK,
411*4882a593Smuzhiyun GPIO4C1_GMAC1_MCLKINOUTM1,
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /* GRF_GPIO4C_IOMUX_H */
414*4882a593Smuzhiyun GPIO4C6_SHIFT = 8,
415*4882a593Smuzhiyun GPIO4C6_MASK = GENMASK(10, 8),
416*4882a593Smuzhiyun GPIO4C6_GPIO = 0,
417*4882a593Smuzhiyun GPIO4C6_PWM13_M1,
418*4882a593Smuzhiyun GPIO4C6_SPI3_CS0M1,
419*4882a593Smuzhiyun GPIO4C6_SATA0_ACTLED,
420*4882a593Smuzhiyun GPIO4C6_UART9_RXM1,
421*4882a593Smuzhiyun GPIO4C6_I2S3_SDIM1,
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun GPIO4C5_SHIFT = 4,
424*4882a593Smuzhiyun GPIO4C5_MASK = GENMASK(6, 4),
425*4882a593Smuzhiyun GPIO4C5_GPIO = 0,
426*4882a593Smuzhiyun GPIO4C5_PWM12_M1,
427*4882a593Smuzhiyun GPIO4C5_SPI3_MISOM1,
428*4882a593Smuzhiyun GPIO4C5_SATA1_ACTLED,
429*4882a593Smuzhiyun GPIO4C5_UART9_TXM1,
430*4882a593Smuzhiyun GPIO4C5_I2S3_SDOM1,
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun /* GRF_IOFUNC_SEL3 */
433*4882a593Smuzhiyun UART4_IO_SEL_SHIFT = 14,
434*4882a593Smuzhiyun UART4_IO_SEL_MASK = GENMASK(14, 14),
435*4882a593Smuzhiyun UART4_IO_SEL_M0 = 0,
436*4882a593Smuzhiyun UART4_IO_SEL_M1,
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun UART3_IO_SEL_SHIFT = 12,
439*4882a593Smuzhiyun UART3_IO_SEL_MASK = GENMASK(12, 12),
440*4882a593Smuzhiyun UART3_IO_SEL_M0 = 0,
441*4882a593Smuzhiyun UART3_IO_SEL_M1,
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun UART2_IO_SEL_SHIFT = 10,
444*4882a593Smuzhiyun UART2_IO_SEL_MASK = GENMASK(11, 10),
445*4882a593Smuzhiyun UART2_IO_SEL_M0 = 0,
446*4882a593Smuzhiyun UART2_IO_SEL_M1,
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun UART1_IO_SEL_SHIFT = 8,
449*4882a593Smuzhiyun UART1_IO_SEL_MASK = GENMASK(8, 8),
450*4882a593Smuzhiyun UART1_IO_SEL_M0 = 0,
451*4882a593Smuzhiyun UART1_IO_SEL_M1,
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun /* GRF_IOFUNC_SEL4 */
454*4882a593Smuzhiyun UART9_IO_SEL_SHIFT = 8,
455*4882a593Smuzhiyun UART9_IO_SEL_MASK = GENMASK(9, 8),
456*4882a593Smuzhiyun UART9_IO_SEL_M0 = 0,
457*4882a593Smuzhiyun UART9_IO_SEL_M1,
458*4882a593Smuzhiyun UART9_IO_SEL_M2,
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun UART8_IO_SEL_SHIFT = 6,
461*4882a593Smuzhiyun UART8_IO_SEL_MASK = GENMASK(6, 6),
462*4882a593Smuzhiyun UART8_IO_SEL_M0 = 0,
463*4882a593Smuzhiyun UART8_IO_SEL_M1,
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun UART7_IO_SEL_SHIFT = 4,
466*4882a593Smuzhiyun UART7_IO_SEL_MASK = GENMASK(5, 4),
467*4882a593Smuzhiyun UART7_IO_SEL_M0 = 0,
468*4882a593Smuzhiyun UART7_IO_SEL_M1,
469*4882a593Smuzhiyun UART7_IO_SEL_M2,
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun UART6_IO_SEL_SHIFT = 2,
472*4882a593Smuzhiyun UART6_IO_SEL_MASK = GENMASK(2, 2),
473*4882a593Smuzhiyun UART6_IO_SEL_M0 = 0,
474*4882a593Smuzhiyun UART6_IO_SEL_M1,
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun UART5_IO_SEL_SHIFT = 0,
477*4882a593Smuzhiyun UART5_IO_SEL_MASK = GENMASK(0, 0),
478*4882a593Smuzhiyun UART5_IO_SEL_M0 = 0,
479*4882a593Smuzhiyun UART5_IO_SEL_M1,
480*4882a593Smuzhiyun };
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun #ifdef CONFIG_ARM64
483*4882a593Smuzhiyun #include <asm/armv8/mmu.h>
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun static struct mm_region rk3568_mem_map[] = {
486*4882a593Smuzhiyun {
487*4882a593Smuzhiyun .virt = 0x0UL,
488*4882a593Smuzhiyun .phys = 0x0UL,
489*4882a593Smuzhiyun .size = 0xf0000000UL,
490*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
491*4882a593Smuzhiyun PTE_BLOCK_INNER_SHARE
492*4882a593Smuzhiyun }, {
493*4882a593Smuzhiyun .virt = 0xf0000000UL,
494*4882a593Smuzhiyun .phys = 0xf0000000UL,
495*4882a593Smuzhiyun .size = 0x10000000UL,
496*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
497*4882a593Smuzhiyun PTE_BLOCK_NON_SHARE |
498*4882a593Smuzhiyun PTE_BLOCK_PXN | PTE_BLOCK_UXN
499*4882a593Smuzhiyun }, {
500*4882a593Smuzhiyun .virt = 0x300000000,
501*4882a593Smuzhiyun .phys = 0x300000000,
502*4882a593Smuzhiyun .size = 0x0c0c00000,
503*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
504*4882a593Smuzhiyun PTE_BLOCK_NON_SHARE |
505*4882a593Smuzhiyun PTE_BLOCK_PXN | PTE_BLOCK_UXN
506*4882a593Smuzhiyun }, {
507*4882a593Smuzhiyun /* List terminator */
508*4882a593Smuzhiyun 0,
509*4882a593Smuzhiyun }
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun struct mm_region *mem_map = rk3568_mem_map;
513*4882a593Smuzhiyun #endif
514*4882a593Smuzhiyun
board_debug_uart_init(void)515*4882a593Smuzhiyun void board_debug_uart_init(void)
516*4882a593Smuzhiyun {
517*4882a593Smuzhiyun #if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfdd50000)
518*4882a593Smuzhiyun static struct rk3568_pmugrf * const pmugrf = (void *)PMUGRF_BASE;
519*4882a593Smuzhiyun /* UART0 M0 */
520*4882a593Smuzhiyun rk_clrsetreg(&pmugrf->pmu_soc_con0, UART0_IO_SEL_MASK,
521*4882a593Smuzhiyun UART0_IO_SEL_M0 << UART0_IO_SEL_SHIFT);
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun /* Switch iomux */
524*4882a593Smuzhiyun rk_clrsetreg(&pmugrf->pmu_gpio0c_iomux_l,
525*4882a593Smuzhiyun GPIO0C1_MASK | GPIO0C0_MASK,
526*4882a593Smuzhiyun GPIO0C1_UART0_TX << GPIO0C1_SHIFT |
527*4882a593Smuzhiyun GPIO0C0_UART0_RX << GPIO0C0_SHIFT);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe650000)
530*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
533*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
534*4882a593Smuzhiyun /* UART1 M0 */
535*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART1_IO_SEL_MASK,
536*4882a593Smuzhiyun UART1_IO_SEL_M0 << UART1_IO_SEL_SHIFT);
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun /* Switch iomux */
539*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2b_iomux_l,
540*4882a593Smuzhiyun GPIO2B3_MASK, GPIO2B3_UART1_RXM0 << GPIO2B3_SHIFT);
541*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2b_iomux_h,
542*4882a593Smuzhiyun GPIO2B4_MASK, GPIO2B4_UART1_TXM0 << GPIO2B4_SHIFT);
543*4882a593Smuzhiyun #else
544*4882a593Smuzhiyun /* UART1 M1 */
545*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART1_IO_SEL_MASK,
546*4882a593Smuzhiyun UART1_IO_SEL_M1 << UART1_IO_SEL_SHIFT);
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun /* Switch iomux */
549*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3d_iomux_h,
550*4882a593Smuzhiyun GPIO3D7_MASK | GPIO3D6_MASK,
551*4882a593Smuzhiyun GPIO3D7_UART1_RXM1 << GPIO3D7_SHIFT |
552*4882a593Smuzhiyun GPIO3D6_UART1_TXM1 << GPIO3D6_SHIFT);
553*4882a593Smuzhiyun #endif
554*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe660000)
555*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
558*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
559*4882a593Smuzhiyun static struct rk3568_pmugrf * const pmugrf = (void *)PMUGRF_BASE;
560*4882a593Smuzhiyun /* UART2 M0 */
561*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART2_IO_SEL_MASK,
562*4882a593Smuzhiyun UART2_IO_SEL_M0 << UART2_IO_SEL_SHIFT);
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun /* Switch iomux */
565*4882a593Smuzhiyun rk_clrsetreg(&pmugrf->pmu_gpio0d_iomux_l,
566*4882a593Smuzhiyun GPIO0D1_MASK | GPIO0D0_MASK,
567*4882a593Smuzhiyun GPIO0D1_UART2_TXM0 << GPIO0D1_SHIFT |
568*4882a593Smuzhiyun GPIO0D0_UART2_RXM0 << GPIO0D0_SHIFT);
569*4882a593Smuzhiyun #else
570*4882a593Smuzhiyun /* UART2 M1 */
571*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART2_IO_SEL_MASK,
572*4882a593Smuzhiyun UART2_IO_SEL_M1 << UART2_IO_SEL_SHIFT);
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun /* Switch iomux */
575*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio1d_iomux_h,
576*4882a593Smuzhiyun GPIO1D6_MASK | GPIO1D5_MASK,
577*4882a593Smuzhiyun GPIO1D6_UART2_RXM1 << GPIO1D6_SHIFT |
578*4882a593Smuzhiyun GPIO1D5_UART2_TXM1 << GPIO1D5_SHIFT);
579*4882a593Smuzhiyun #endif
580*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe670000)
581*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
584*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
585*4882a593Smuzhiyun /* UART3 M0 */
586*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART3_IO_SEL_MASK,
587*4882a593Smuzhiyun UART3_IO_SEL_M0 << UART3_IO_SEL_SHIFT);
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun /* Switch iomux */
590*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio1a_iomux_l,
591*4882a593Smuzhiyun GPIO1A1_MASK | GPIO1A0_MASK,
592*4882a593Smuzhiyun GPIO1A1_UART3_TXM0 << GPIO1A1_SHIFT |
593*4882a593Smuzhiyun GPIO1A0_UART3_RXM0 << GPIO1A0_SHIFT);
594*4882a593Smuzhiyun #else
595*4882a593Smuzhiyun /* UART3 M1 */
596*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART3_IO_SEL_MASK,
597*4882a593Smuzhiyun UART3_IO_SEL_M1 << UART3_IO_SEL_SHIFT);
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun /* Switch iomux */
600*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3b_iomux_h,
601*4882a593Smuzhiyun GPIO3B7_MASK, GPIO3B7_UART3_TXM1 << GPIO3B7_SHIFT);
602*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3c_iomux_l,
603*4882a593Smuzhiyun GPIO3C0_MASK, GPIO3C0_UART3_RXM1 << GPIO3C0_SHIFT);
604*4882a593Smuzhiyun #endif
605*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe680000)
606*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
609*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
610*4882a593Smuzhiyun /* UART4 M0 */
611*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART4_IO_SEL_MASK,
612*4882a593Smuzhiyun UART4_IO_SEL_M0 << UART4_IO_SEL_SHIFT);
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun /* Switch iomux */
615*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio1a_iomux_h,
616*4882a593Smuzhiyun GPIO1A6_MASK | GPIO1A4_MASK,
617*4882a593Smuzhiyun GPIO1A6_UART4_TXM0 << GPIO1A6_SHIFT |
618*4882a593Smuzhiyun GPIO1A4_UART4_RXM0 << GPIO1A4_SHIFT);
619*4882a593Smuzhiyun #else
620*4882a593Smuzhiyun /* UART4 M1 */
621*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel3, UART4_IO_SEL_MASK,
622*4882a593Smuzhiyun UART4_IO_SEL_M1 << UART4_IO_SEL_SHIFT);
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun /* Switch iomux */
625*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3b_iomux_l,
626*4882a593Smuzhiyun GPIO3B2_MASK | GPIO3B1_MASK,
627*4882a593Smuzhiyun GPIO3B2_UART4_TXM1 << GPIO3B2_SHIFT |
628*4882a593Smuzhiyun GPIO3B1_UART4_RXM1 << GPIO3B1_SHIFT);
629*4882a593Smuzhiyun #endif
630*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe690000)
631*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
634*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
635*4882a593Smuzhiyun /* UART5 M0 */
636*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART5_IO_SEL_MASK,
637*4882a593Smuzhiyun UART5_IO_SEL_M0 << UART5_IO_SEL_SHIFT);
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun /* Switch iomux */
640*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2a_iomux_l,
641*4882a593Smuzhiyun GPIO2A2_MASK | GPIO2A1_MASK,
642*4882a593Smuzhiyun GPIO2A2_UART5_TXM0 << GPIO2A2_SHIFT |
643*4882a593Smuzhiyun GPIO2A1_UART5_RXM0 << GPIO2A1_SHIFT);
644*4882a593Smuzhiyun #else
645*4882a593Smuzhiyun /* UART5 M1 */
646*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART5_IO_SEL_MASK,
647*4882a593Smuzhiyun UART5_IO_SEL_M1 << UART5_IO_SEL_SHIFT);
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun /* Switch iomux */
650*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3c_iomux_l,
651*4882a593Smuzhiyun GPIO3C3_MASK | GPIO3C2_MASK,
652*4882a593Smuzhiyun GPIO3C3_UART5_RXM1 << GPIO3C3_SHIFT |
653*4882a593Smuzhiyun GPIO3C2_UART5_TXM1 << GPIO3C2_SHIFT);
654*4882a593Smuzhiyun #endif
655*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe6a0000)
656*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
659*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
660*4882a593Smuzhiyun /* UART6 M0 */
661*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART6_IO_SEL_MASK,
662*4882a593Smuzhiyun UART6_IO_SEL_M0 << UART6_IO_SEL_SHIFT);
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /* Switch iomux */
665*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2a_iomux_l,
666*4882a593Smuzhiyun GPIO2A3_MASK, GPIO2A3_UART6_RXM0 << GPIO2A3_SHIFT);
667*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2a_iomux_h,
668*4882a593Smuzhiyun GPIO2A4_MASK, GPIO2A4_UART6_TXM0 << GPIO2A4_SHIFT);
669*4882a593Smuzhiyun #else
670*4882a593Smuzhiyun /* UART6 M1 */
671*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART6_IO_SEL_MASK,
672*4882a593Smuzhiyun UART6_IO_SEL_M1 << UART6_IO_SEL_SHIFT);
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun /* Switch iomux */
675*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio1d_iomux_h,
676*4882a593Smuzhiyun GPIO1D6_MASK | GPIO1D5_MASK,
677*4882a593Smuzhiyun GPIO1D6_UART6_RXM1 << GPIO1D6_SHIFT |
678*4882a593Smuzhiyun GPIO1D5_UART6_TXM1 << GPIO1D5_SHIFT);
679*4882a593Smuzhiyun #endif
680*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe6b0000)
681*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
684*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
685*4882a593Smuzhiyun /* UART7 M0 */
686*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART7_IO_SEL_MASK,
687*4882a593Smuzhiyun UART7_IO_SEL_M0 << UART7_IO_SEL_SHIFT);
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun /* Switch iomux */
690*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2a_iomux_h,
691*4882a593Smuzhiyun GPIO2A6_MASK | GPIO2A5_MASK,
692*4882a593Smuzhiyun GPIO2A6_UART7_TXM0 << GPIO2A6_SHIFT |
693*4882a593Smuzhiyun GPIO2A5_UART7_RXM0 << GPIO2A5_SHIFT);
694*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
695*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
696*4882a593Smuzhiyun /* UART7 M1 */
697*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART7_IO_SEL_MASK,
698*4882a593Smuzhiyun UART7_IO_SEL_M1 << UART7_IO_SEL_SHIFT);
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun /* Switch iomux */
701*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3c_iomux_h,
702*4882a593Smuzhiyun GPIO3C5_MASK | GPIO3C4_MASK,
703*4882a593Smuzhiyun GPIO3C5_UART7_RXM1 << GPIO3C5_SHIFT |
704*4882a593Smuzhiyun GPIO3C4_UART7_TXM1 << GPIO3C4_SHIFT);
705*4882a593Smuzhiyun #else
706*4882a593Smuzhiyun /* UART7 M2 */
707*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART7_IO_SEL_MASK,
708*4882a593Smuzhiyun UART7_IO_SEL_M2 << UART7_IO_SEL_SHIFT);
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun /* Switch iomux */
711*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio4a_iomux_l,
712*4882a593Smuzhiyun GPIO4A3_MASK | GPIO4A2_MASK,
713*4882a593Smuzhiyun GPIO4A3_UART7_RXM2 << GPIO4A3_SHIFT |
714*4882a593Smuzhiyun GPIO4A2_UART7_TXM2 << GPIO4A2_SHIFT);
715*4882a593Smuzhiyun #endif
716*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe6c0000)
717*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
720*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
721*4882a593Smuzhiyun /* UART8 M0 */
722*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART8_IO_SEL_MASK,
723*4882a593Smuzhiyun UART8_IO_SEL_M0 << UART8_IO_SEL_SHIFT);
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun /* Switch iomux */
726*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2c_iomux_h,
727*4882a593Smuzhiyun GPIO2C6_MASK | GPIO2C5_MASK,
728*4882a593Smuzhiyun GPIO2C6_UART8_RXM0 << GPIO2C6_SHIFT |
729*4882a593Smuzhiyun GPIO2C5_UART8_TXM0 << GPIO2C5_SHIFT);
730*4882a593Smuzhiyun #else
731*4882a593Smuzhiyun /* UART8 M1 */
732*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART8_IO_SEL_MASK,
733*4882a593Smuzhiyun UART8_IO_SEL_M1 << UART8_IO_SEL_SHIFT);
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun /* Switch iomux */
736*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2d_iomux_h,
737*4882a593Smuzhiyun GPIO2D7_MASK | GPIO3A0_MASK,
738*4882a593Smuzhiyun GPIO2D7_UART8_TXM1 << GPIO2D7_SHIFT |
739*4882a593Smuzhiyun GPIO3A0_UART8_RXM1 << GPIO3A0_SHIFT);
740*4882a593Smuzhiyun #endif
741*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfe6d0000)
742*4882a593Smuzhiyun static struct rk3568_grf * const grf = (void *)GRF_BASE;
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
745*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
746*4882a593Smuzhiyun /* UART9 M0 */
747*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART9_IO_SEL_MASK,
748*4882a593Smuzhiyun UART9_IO_SEL_M0 << UART9_IO_SEL_SHIFT);
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun /* Switch iomux */
751*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2a_iomux_h,
752*4882a593Smuzhiyun GPIO2A7_MASK, GPIO2A7_UART9_RXM0 << GPIO2A7_SHIFT);
753*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2b_iomux_l,
754*4882a593Smuzhiyun GPIO2B0_MASK, GPIO2B0_UART9_TXM0 << GPIO2B0_SHIFT);
755*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
756*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
757*4882a593Smuzhiyun /* UART9 M1 */
758*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART9_IO_SEL_MASK,
759*4882a593Smuzhiyun UART9_IO_SEL_M1 << UART9_IO_SEL_SHIFT);
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun /* Switch iomux */
762*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio4c_iomux_h,
763*4882a593Smuzhiyun GPIO4C6_MASK | GPIO4C5_MASK,
764*4882a593Smuzhiyun GPIO4C6_UART9_RXM1 << GPIO4C6_SHIFT |
765*4882a593Smuzhiyun GPIO4C5_UART9_TXM1 << GPIO4C5_SHIFT);
766*4882a593Smuzhiyun #else
767*4882a593Smuzhiyun /* UART9 M2 */
768*4882a593Smuzhiyun rk_clrsetreg(&grf->iofunc_sel4, UART9_IO_SEL_MASK,
769*4882a593Smuzhiyun UART9_IO_SEL_M2 << UART9_IO_SEL_SHIFT);
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun /* Switch iomux */
772*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio4a_iomux_h,
773*4882a593Smuzhiyun GPIO4A5_MASK | GPIO4A4_MASK,
774*4882a593Smuzhiyun GPIO4A5_UART9_RXM2 << GPIO4A5_SHIFT |
775*4882a593Smuzhiyun GPIO4A4_UART9_TXM2 << GPIO4A4_SHIFT);
776*4882a593Smuzhiyun #endif
777*4882a593Smuzhiyun #endif
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun
fit_standalone_release(char * id,uintptr_t entry_point)780*4882a593Smuzhiyun int fit_standalone_release(char *id, uintptr_t entry_point)
781*4882a593Smuzhiyun {
782*4882a593Smuzhiyun /* risc-v configuration: */
783*4882a593Smuzhiyun /* Reset the scr1 */
784*4882a593Smuzhiyun writel(0x04000400, CRU_BASE + CRU_SOFTRST_CON26);
785*4882a593Smuzhiyun udelay(100);
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun /* set the scr1 addr */
788*4882a593Smuzhiyun writel((0xffff0000) | (entry_point >> 16), GRF_BASE + GRF_SOC_CON4);
789*4882a593Smuzhiyun udelay(10);
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun /* release the scr1 */
792*4882a593Smuzhiyun writel(0x04000000, CRU_BASE + CRU_SOFTRST_CON26);
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun return 0;
795*4882a593Smuzhiyun }
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
qos_priority_init(void)798*4882a593Smuzhiyun static void qos_priority_init(void)
799*4882a593Smuzhiyun {
800*4882a593Smuzhiyun u32 delay;
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun /* enable all pd except npu and gpu */
803*4882a593Smuzhiyun writel(0xffff0000 & ~(BIT(0 + 16) | BIT(1 + 16)),
804*4882a593Smuzhiyun PMU_BASE_ADDR + PMU_PWR_GATE_SFTCON);
805*4882a593Smuzhiyun delay = 1000;
806*4882a593Smuzhiyun do {
807*4882a593Smuzhiyun udelay(1);
808*4882a593Smuzhiyun delay--;
809*4882a593Smuzhiyun if (delay == 0) {
810*4882a593Smuzhiyun printf("Fail to set domain.");
811*4882a593Smuzhiyun hang();
812*4882a593Smuzhiyun }
813*4882a593Smuzhiyun } while (readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST) & ~(BIT(0) | BIT(1)));
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun /* release all idle request except npu and gpu */
816*4882a593Smuzhiyun writel(0xffff0000 & ~(BIT(1 + 16) | BIT(2 + 16)),
817*4882a593Smuzhiyun PMU_BASE_ADDR + PMU_BUS_IDLE_SFTCON0);
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun delay = 1000;
820*4882a593Smuzhiyun /* wait ack status */
821*4882a593Smuzhiyun do {
822*4882a593Smuzhiyun udelay(1);
823*4882a593Smuzhiyun delay--;
824*4882a593Smuzhiyun if (delay == 0) {
825*4882a593Smuzhiyun printf("Fail to get ack on domain.\n");
826*4882a593Smuzhiyun hang();
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun } while (readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ACK) & ~(BIT(1) | BIT(2)));
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun delay = 1000;
831*4882a593Smuzhiyun /* wait idle status */
832*4882a593Smuzhiyun do {
833*4882a593Smuzhiyun udelay(1);
834*4882a593Smuzhiyun delay--;
835*4882a593Smuzhiyun if (delay == 0) {
836*4882a593Smuzhiyun printf("Fail to set idle on domain.\n");
837*4882a593Smuzhiyun hang();
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun } while (readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST) & ~(BIT(1) | BIT(2)));
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun writel(0x303, EBC_PRIORITY_REG);
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun #endif
844*4882a593Smuzhiyun
arch_cpu_init(void)845*4882a593Smuzhiyun int arch_cpu_init(void)
846*4882a593Smuzhiyun {
847*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
848*4882a593Smuzhiyun /*
849*4882a593Smuzhiyun * When perform idle operation, corresponding clock can
850*4882a593Smuzhiyun * be opened or gated automatically.
851*4882a593Smuzhiyun */
852*4882a593Smuzhiyun writel(0xffffffff, PMU_BASE_ADDR + PMU_NOC_AUTO_CON0);
853*4882a593Smuzhiyun writel(0x000f000f, PMU_BASE_ADDR + PMU_NOC_AUTO_CON1);
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun /* Set the emmc sdmmc0 to secure */
856*4882a593Smuzhiyun writel(((0x3 << 11 | 0x1 << 4) << 16), SGRF_BASE + SGRF_SOC_CON4);
857*4882a593Smuzhiyun /* set the emmc ds to level 2 */
858*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1B_DS_2);
859*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1B_DS_3);
860*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_0);
861*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_1);
862*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_2);
863*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_3);
864*4882a593Smuzhiyun
865*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_SFC)
866*4882a593Smuzhiyun /* Set the fspi to secure */
867*4882a593Smuzhiyun writel(((0x1 << 14) << 16) | (0x0 << 14), SGRF_BASE + SGRF_SOC_CON3);
868*4882a593Smuzhiyun #endif
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun #ifndef CONFIG_TPL_BUILD
871*4882a593Smuzhiyun /* set the fspi d0~3 cs0 to level 2 */
872*4882a593Smuzhiyun if (get_bootdev_by_brom_bootsource() == BOOT_TYPE_SPI_NOR ||
873*4882a593Smuzhiyun get_bootdev_by_brom_bootsource() == BOOT_TYPE_SPI_NAND) {
874*4882a593Smuzhiyun writel(0x3f000700, GRF_BASE + GRF_GPIO1C_DS_3);
875*4882a593Smuzhiyun writel(0x3f000700, GRF_BASE + GRF_GPIO1D_DS_0);
876*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1D_DS_1);
877*4882a593Smuzhiyun writel(0x003f0007, GRF_BASE + GRF_GPIO1D_DS_2);
878*4882a593Smuzhiyun }
879*4882a593Smuzhiyun #endif
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun /* Set core pvtpll ring length */
882*4882a593Smuzhiyun writel(0x00ff002b, CPU_GRF_BASE + GRF_CORE_PVTPLL_CON0);
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun /*
885*4882a593Smuzhiyun * Assert reset the pipephy0, pipephy1 and pipephy2,
886*4882a593Smuzhiyun * and de-assert reset them in Kernel combphy driver.
887*4882a593Smuzhiyun */
888*4882a593Smuzhiyun writel(0x02a002a0, CRU_BASE + CRU_SOFTRST_CON28);
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun /*
891*4882a593Smuzhiyun * Set USB 2.0 PHY0 port1 and PHY1 port0 and port1
892*4882a593Smuzhiyun * enter suspend mode to to save power. And USB 2.0
893*4882a593Smuzhiyun * PHY0 port0 for OTG interface still in normal mode.
894*4882a593Smuzhiyun */
895*4882a593Smuzhiyun writel(0x01ff01d1, USBPHY_U3_GRF_CON1);
896*4882a593Smuzhiyun writel(0x01ff01d1, USBPHY_U2_GRF_CON0);
897*4882a593Smuzhiyun writel(0x01ff01d1, USBPHY_U2_GRF_CON1);
898*4882a593Smuzhiyun
899*4882a593Smuzhiyun #ifndef CONFIG_TPL_BUILD
900*4882a593Smuzhiyun qos_priority_init();
901*4882a593Smuzhiyun #endif
902*4882a593Smuzhiyun static struct rk3568_pmugrf * const pmugrf = (void *)PMUGRF_BASE;
903*4882a593Smuzhiyun rk_clrsetreg(&pmugrf->pmu_gpio0b_iomux_l,
904*4882a593Smuzhiyun GENMASK(10, 8) | GENMASK(6, 4),
905*4882a593Smuzhiyun 1 << 8 |
906*4882a593Smuzhiyun 1 << 4);
907*4882a593Smuzhiyun #elif defined(CONFIG_SUPPORT_USBPLUG)
908*4882a593Smuzhiyun /*
909*4882a593Smuzhiyun * When perform idle operation, corresponding clock can
910*4882a593Smuzhiyun * be opened or gated automatically.
911*4882a593Smuzhiyun */
912*4882a593Smuzhiyun writel(0xffffffff, PMU_BASE_ADDR + PMU_NOC_AUTO_CON0);
913*4882a593Smuzhiyun writel(0x000f000f, PMU_BASE_ADDR + PMU_NOC_AUTO_CON1);
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun writel(0x00030000, SGRF_BASE + SGRF_SOC_CON4); /* usb3otg0 master secure setting */
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun /* Set the emmc sdmmc0 to secure */
918*4882a593Smuzhiyun writel(((0x3 << 11 | 0x1 << 4) << 16), SGRF_BASE + SGRF_SOC_CON4);
919*4882a593Smuzhiyun /* set the emmc ds to level 2 */
920*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1B_DS_2);
921*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1B_DS_3);
922*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_0);
923*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_1);
924*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_2);
925*4882a593Smuzhiyun writel(0x3f3f0707, GRF_BASE + GRF_GPIO1C_DS_3);
926*4882a593Smuzhiyun
927*4882a593Smuzhiyun /* emmc and sfc iomux */
928*4882a593Smuzhiyun writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1B_IOMUX_H);
929*4882a593Smuzhiyun writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1C_IOMUX_L);
930*4882a593Smuzhiyun writel((0x7777UL << 16) | (0x2111), GRF_BASE + GRF_GPIO1C_IOMUX_H);
931*4882a593Smuzhiyun writel((0x7777UL << 16) | (0x1111), GRF_BASE + GRF_GPIO1D_IOMUX_L);
932*4882a593Smuzhiyun writel(((7 << 0) << 16) | (1 << 0), GRF_BASE + GRF_GPIO1D_IOMUX_H);
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun /* Set the fspi to secure */
935*4882a593Smuzhiyun writel(((0x1 << 14) << 16) | (0x0 << 14), SGRF_BASE + SGRF_SOC_CON3);
936*4882a593Smuzhiyun #else /* U-Boot */
937*4882a593Smuzhiyun /* uboot: config iomux */
938*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_SFC_IOMUX)
939*4882a593Smuzhiyun writel((0x70002000), GRF_BASE + GRF_GPIO1C_IOMUX_H);
940*4882a593Smuzhiyun writel((0x77771111), GRF_BASE + GRF_GPIO1D_IOMUX_L);
941*4882a593Smuzhiyun writel((0x00070001), GRF_BASE + GRF_GPIO1D_IOMUX_H);
942*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_EMMC_IOMUX)
943*4882a593Smuzhiyun writel((0x77771111), GRF_BASE + GRF_GPIO1B_IOMUX_H);
944*4882a593Smuzhiyun writel((0x77771111), GRF_BASE + GRF_GPIO1C_IOMUX_L);
945*4882a593Smuzhiyun writel((0x07770111), GRF_BASE + GRF_GPIO1C_IOMUX_H);
946*4882a593Smuzhiyun #endif
947*4882a593Smuzhiyun #endif
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun return 0;
950*4882a593Smuzhiyun }
951*4882a593Smuzhiyun
952*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
spl_fit_standalone_release(char * id,uintptr_t entry_point)953*4882a593Smuzhiyun int spl_fit_standalone_release(char *id, uintptr_t entry_point)
954*4882a593Smuzhiyun {
955*4882a593Smuzhiyun /* Reset the scr1 */
956*4882a593Smuzhiyun writel(0x04000400, CRU_BASE + CRU_SOFTRST_CON26);
957*4882a593Smuzhiyun udelay(100);
958*4882a593Smuzhiyun /* set the scr1 addr */
959*4882a593Smuzhiyun writel((0xffff0000) | (entry_point >> 16), GRF_BASE + GRF_SOC_CON4);
960*4882a593Smuzhiyun udelay(10);
961*4882a593Smuzhiyun /* release the scr1 */
962*4882a593Smuzhiyun writel(0x04000000, CRU_BASE + CRU_SOFTRST_CON26);
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun return 0;
965*4882a593Smuzhiyun }
966*4882a593Smuzhiyun #endif
967*4882a593Smuzhiyun
968*4882a593Smuzhiyun #if CONFIG_IS_ENABLED(CLK_SCMI)
969*4882a593Smuzhiyun #include <dm.h>
970*4882a593Smuzhiyun /*
971*4882a593Smuzhiyun * armclk: 1104M:
972*4882a593Smuzhiyun * rockchip,clk-init = <1104000000>,
973*4882a593Smuzhiyun * vdd_cpu : regulator-init-microvolt = <825000>;
974*4882a593Smuzhiyun * armclk: 1416M(by default):
975*4882a593Smuzhiyun * rockchip,clk-init = <1416000000>,
976*4882a593Smuzhiyun * vdd_cpu : regulator-init-microvolt = <900000>;
977*4882a593Smuzhiyun * armclk: 1608M:
978*4882a593Smuzhiyun * rockchip,clk-init = <1608000000>,
979*4882a593Smuzhiyun * vdd_cpu : regulator-init-microvolt = <975000>;
980*4882a593Smuzhiyun */
981*4882a593Smuzhiyun
set_armclk_rate(void)982*4882a593Smuzhiyun int set_armclk_rate(void)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun struct clk clk;
985*4882a593Smuzhiyun u32 *rates = NULL;
986*4882a593Smuzhiyun int ret, size, num_rates;
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun ret = rockchip_get_scmi_clk(&clk.dev);
989*4882a593Smuzhiyun if (ret) {
990*4882a593Smuzhiyun printf("Failed to get scmi clk dev\n");
991*4882a593Smuzhiyun return ret;
992*4882a593Smuzhiyun }
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun size = dev_read_size(clk.dev, "rockchip,clk-init");
995*4882a593Smuzhiyun if (size < 0)
996*4882a593Smuzhiyun return 0;
997*4882a593Smuzhiyun
998*4882a593Smuzhiyun num_rates = size / sizeof(u32);
999*4882a593Smuzhiyun rates = calloc(num_rates, sizeof(u32));
1000*4882a593Smuzhiyun if (!rates)
1001*4882a593Smuzhiyun return -ENOMEM;
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun ret = dev_read_u32_array(clk.dev, "rockchip,clk-init",
1004*4882a593Smuzhiyun rates, num_rates);
1005*4882a593Smuzhiyun if (ret) {
1006*4882a593Smuzhiyun printf("Cannot get rockchip,clk-init reg\n");
1007*4882a593Smuzhiyun return -EINVAL;
1008*4882a593Smuzhiyun }
1009*4882a593Smuzhiyun clk.id = 0;
1010*4882a593Smuzhiyun ret = clk_set_rate(&clk, rates[clk.id]);
1011*4882a593Smuzhiyun if (ret < 0) {
1012*4882a593Smuzhiyun printf("Failed to set armclk\n");
1013*4882a593Smuzhiyun return ret;
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun return 0;
1016*4882a593Smuzhiyun }
1017*4882a593Smuzhiyun #endif
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun #define CRU_NODE_FDT_PATH "/clock-controller@fdd20000"
1020*4882a593Smuzhiyun #define CRU_RATE_CNT_MIN 6
1021*4882a593Smuzhiyun #define CRU_PARENT_CNT_MIN 3
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun #define RKVDEC_NODE_FDT_PATH "/rkvdec@fdf80200"
1024*4882a593Smuzhiyun #define RKVDEC_NORMAL_RATE_CNT_MIN 5
1025*4882a593Smuzhiyun #define RKVDEC_RATE_CNT_MIN 4
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun #define GMAC0_NODE_FDT_PATH "/ethernet@fe2a0000"
1028*4882a593Smuzhiyun #define GMAC1_NODE_FDT_PATH "/ethernet@fe010000"
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun #define GMAC0_CLKIN_NODE_FDT_PATH "/external-gmac0-clock"
1031*4882a593Smuzhiyun #define GMAC1_CLKIN_NODE_FDT_PATH "/external-gmac1-clock"
1032*4882a593Smuzhiyun
1033*4882a593Smuzhiyun #define GMAC1M0_MIIM_PINCTRL_PATH "/pinctrl/gmac1/gmac1m0-miim"
1034*4882a593Smuzhiyun
rk3568_board_fdt_fixup_ethernet(const void * blob,int id)1035*4882a593Smuzhiyun static int rk3568_board_fdt_fixup_ethernet(const void *blob, int id)
1036*4882a593Smuzhiyun {
1037*4882a593Smuzhiyun int gmac_node, clkin_node, miim_node, len;
1038*4882a593Smuzhiyun const char *gmac_path, *clkin_path;
1039*4882a593Smuzhiyun void *fdt = (void *)gd->fdt_blob;
1040*4882a593Smuzhiyun u32 phandle, *pp;
1041*4882a593Smuzhiyun
1042*4882a593Smuzhiyun /* get the gmac node and clockin node path at DTB */
1043*4882a593Smuzhiyun if (id == 1) {
1044*4882a593Smuzhiyun gmac_path = GMAC1_NODE_FDT_PATH;
1045*4882a593Smuzhiyun clkin_path = GMAC1_CLKIN_NODE_FDT_PATH;
1046*4882a593Smuzhiyun } else {
1047*4882a593Smuzhiyun gmac_path = GMAC0_NODE_FDT_PATH;
1048*4882a593Smuzhiyun clkin_path = GMAC0_CLKIN_NODE_FDT_PATH;
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun gmac_node = fdt_path_offset(gd->fdt_blob, gmac_path);
1052*4882a593Smuzhiyun if (gmac_node < 0)
1053*4882a593Smuzhiyun return 0;
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun /* only fixes the RGMII clock input mode for gmac node */
1056*4882a593Smuzhiyun if (fdt_stringlist_search(fdt, gmac_node,
1057*4882a593Smuzhiyun "status", "disabled") < 0) {
1058*4882a593Smuzhiyun if (fdt_stringlist_search(fdt, gmac_node,
1059*4882a593Smuzhiyun "phy-mode", "rgmii") >= 0) {
1060*4882a593Smuzhiyun if (fdt_stringlist_search(fdt, gmac_node,
1061*4882a593Smuzhiyun "clock_in_out", "output") >= 0) {
1062*4882a593Smuzhiyun struct rk3568_grf *grf = (void *)GRF_BASE;
1063*4882a593Smuzhiyun
1064*4882a593Smuzhiyun clkin_node = fdt_path_offset(fdt, clkin_path);
1065*4882a593Smuzhiyun if (clkin_node < 0)
1066*4882a593Smuzhiyun return 0;
1067*4882a593Smuzhiyun phandle = fdt_get_phandle(blob, clkin_node);
1068*4882a593Smuzhiyun if (!phandle)
1069*4882a593Smuzhiyun return 0;
1070*4882a593Smuzhiyun /*
1071*4882a593Smuzhiyun * before fixed:
1072*4882a593Smuzhiyun * assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&cru CLK_MAC0_2TOP>;
1073*4882a593Smuzhiyun * after fixed:
1074*4882a593Smuzhiyun * assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&gmac_clkin 0>;
1075*4882a593Smuzhiyun */
1076*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, gmac_node,
1077*4882a593Smuzhiyun "assigned-clock-parents",
1078*4882a593Smuzhiyun &len);
1079*4882a593Smuzhiyun if (!pp)
1080*4882a593Smuzhiyun return 0;
1081*4882a593Smuzhiyun if ((len / 8) >= 2) {
1082*4882a593Smuzhiyun pp[2] = cpu_to_fdt32(phandle);
1083*4882a593Smuzhiyun pp[3] = cpu_to_fdt32(0);
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun
1086*4882a593Smuzhiyun /*
1087*4882a593Smuzhiyun * before fixed:
1088*4882a593Smuzhiyun * clock_in_out = "output";
1089*4882a593Smuzhiyun * after fixed:
1090*4882a593Smuzhiyun * clock_in_out = "input";
1091*4882a593Smuzhiyun */
1092*4882a593Smuzhiyun
1093*4882a593Smuzhiyun do_fixup_by_path(fdt, gmac_path, "clock_in_out",
1094*4882a593Smuzhiyun "input", 6, 0);
1095*4882a593Smuzhiyun /*
1096*4882a593Smuzhiyun * set gmac_clkinout pin iomux for rgmii
1097*4882a593Smuzhiyun * input mode.
1098*4882a593Smuzhiyun */
1099*4882a593Smuzhiyun if (!id) {
1100*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio2c_iomux_l,
1101*4882a593Smuzhiyun GPIO2C2_MASK,
1102*4882a593Smuzhiyun GPIO2C2_GMAC0_MCLKINOUT << GPIO2C2_SHIFT);
1103*4882a593Smuzhiyun } else {
1104*4882a593Smuzhiyun /*
1105*4882a593Smuzhiyun * get the miim pins phandle to check
1106*4882a593Smuzhiyun * m0 or m1 for gmac1_clkinout.
1107*4882a593Smuzhiyun */
1108*4882a593Smuzhiyun miim_node = fdt_path_offset(fdt,
1109*4882a593Smuzhiyun GMAC1M0_MIIM_PINCTRL_PATH);
1110*4882a593Smuzhiyun if (miim_node < 0)
1111*4882a593Smuzhiyun goto gmac1_mclkinoutm1;
1112*4882a593Smuzhiyun phandle = fdt_get_phandle(blob, miim_node);
1113*4882a593Smuzhiyun if (!phandle)
1114*4882a593Smuzhiyun goto gmac1_mclkinoutm1;
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, gmac_node, "pinctrl-0", &len);
1117*4882a593Smuzhiyun if (!pp)
1118*4882a593Smuzhiyun goto gmac1_mclkinoutm1;
1119*4882a593Smuzhiyun if (pp[0] == cpu_to_fdt32(phandle)) {
1120*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio3c_iomux_l,
1121*4882a593Smuzhiyun GPIO3C0_MASK,
1122*4882a593Smuzhiyun GPIO3C0_GMAC1_MCLKINOUTM0 << GPIO3C0_SHIFT);
1123*4882a593Smuzhiyun return 0;
1124*4882a593Smuzhiyun }
1125*4882a593Smuzhiyun gmac1_mclkinoutm1:
1126*4882a593Smuzhiyun rk_clrsetreg(&grf->gpio4c_iomux_l,
1127*4882a593Smuzhiyun GPIO4C1_MASK,
1128*4882a593Smuzhiyun GPIO4C1_GMAC1_MCLKINOUTM1 << GPIO4C1_SHIFT);
1129*4882a593Smuzhiyun }
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun }
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun return 0;
1135*4882a593Smuzhiyun }
1136*4882a593Smuzhiyun
rk_board_fdt_fixup(const void * blob)1137*4882a593Smuzhiyun int rk_board_fdt_fixup(const void *blob)
1138*4882a593Smuzhiyun {
1139*4882a593Smuzhiyun int node, len;
1140*4882a593Smuzhiyun u32 *pp;
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun /* Don't go further if new variant */
1143*4882a593Smuzhiyun if (rockchip_get_cpu_version() > 0)
1144*4882a593Smuzhiyun return 0;
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun node = fdt_path_offset(blob, CRU_NODE_FDT_PATH);
1147*4882a593Smuzhiyun if (node < 0)
1148*4882a593Smuzhiyun return 0;
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun /*
1151*4882a593Smuzhiyun * fixup as:
1152*4882a593Smuzhiyun * rate[1] = <400000000>; // ACLK_RKVDEC_PRE
1153*4882a593Smuzhiyun * rate[2] = <400000000>; // CLK_RKVDEC_CORE
1154*4882a593Smuzhiyun * rate[5] = <400000000>; // PLL_CPLL
1155*4882a593Smuzhiyun */
1156*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, node, "assigned-clock-rates", &len);
1157*4882a593Smuzhiyun if (!pp)
1158*4882a593Smuzhiyun return 0;
1159*4882a593Smuzhiyun if ((len / 4) >= CRU_RATE_CNT_MIN) {
1160*4882a593Smuzhiyun pp[1] = cpu_to_fdt32(400000000);
1161*4882a593Smuzhiyun pp[2] = cpu_to_fdt32(400000000);
1162*4882a593Smuzhiyun pp[5] = cpu_to_fdt32(400000000);
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun /*
1166*4882a593Smuzhiyun * fixup as:
1167*4882a593Smuzhiyun * parents[1] = <&cru PLL_CPLL>;
1168*4882a593Smuzhiyun * parents[2] = <&cru PLL_CPLL>;
1169*4882a593Smuzhiyun */
1170*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, node, "assigned-clock-parents", &len);
1171*4882a593Smuzhiyun if (!pp)
1172*4882a593Smuzhiyun return 0;
1173*4882a593Smuzhiyun if ((len / 8) >= CRU_PARENT_CNT_MIN) {
1174*4882a593Smuzhiyun pp[3] = cpu_to_fdt32(PLL_CPLL);
1175*4882a593Smuzhiyun pp[5] = cpu_to_fdt32(PLL_CPLL);
1176*4882a593Smuzhiyun }
1177*4882a593Smuzhiyun
1178*4882a593Smuzhiyun node = fdt_path_offset(blob, RKVDEC_NODE_FDT_PATH);
1179*4882a593Smuzhiyun if (node < 0)
1180*4882a593Smuzhiyun return 0;
1181*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, node, "rockchip,normal-rates", &len);
1182*4882a593Smuzhiyun if (!pp)
1183*4882a593Smuzhiyun return 0;
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun if ((len / 4) >= RKVDEC_NORMAL_RATE_CNT_MIN) {
1186*4882a593Smuzhiyun pp[0] = cpu_to_fdt32(400000000);
1187*4882a593Smuzhiyun pp[1] = cpu_to_fdt32(0);
1188*4882a593Smuzhiyun pp[2] = cpu_to_fdt32(400000000);
1189*4882a593Smuzhiyun pp[3] = cpu_to_fdt32(400000000);
1190*4882a593Smuzhiyun pp[4] = cpu_to_fdt32(400000000);
1191*4882a593Smuzhiyun }
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, node, "assigned-clock-rates", &len);
1194*4882a593Smuzhiyun if (!pp)
1195*4882a593Smuzhiyun return 0;
1196*4882a593Smuzhiyun
1197*4882a593Smuzhiyun if ((len / 4) >= RKVDEC_RATE_CNT_MIN) {
1198*4882a593Smuzhiyun pp[0] = cpu_to_fdt32(400000000);
1199*4882a593Smuzhiyun pp[1] = cpu_to_fdt32(400000000);
1200*4882a593Smuzhiyun pp[2] = cpu_to_fdt32(400000000);
1201*4882a593Smuzhiyun pp[3] = cpu_to_fdt32(400000000);
1202*4882a593Smuzhiyun }
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun rk3568_board_fdt_fixup_ethernet(blob, 0);
1205*4882a593Smuzhiyun rk3568_board_fdt_fixup_ethernet(blob, 1);
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun return 0;
1208*4882a593Smuzhiyun }
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun // #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_ROCKCHIP_DMC_FSP)
1211*4882a593Smuzhiyun #if 0
1212*4882a593Smuzhiyun int rk_board_init(void)
1213*4882a593Smuzhiyun {
1214*4882a593Smuzhiyun struct udevice *dev;
1215*4882a593Smuzhiyun u32 ret = 0;
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun ret = uclass_get_device_by_driver(UCLASS_DMC, DM_GET_DRIVER(dmc_fsp), &dev);
1218*4882a593Smuzhiyun if (ret) {
1219*4882a593Smuzhiyun printf("dmc_fsp failed, ret=%d\n", ret);
1220*4882a593Smuzhiyun return 0;
1221*4882a593Smuzhiyun }
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun return 0;
1224*4882a593Smuzhiyun }
1225*4882a593Smuzhiyun #endif
1226