1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2021 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun #include <common.h>
7*4882a593Smuzhiyun #include <dm.h>
8*4882a593Smuzhiyun #include <misc.h>
9*4882a593Smuzhiyun #include <mmc.h>
10*4882a593Smuzhiyun #include <spl.h>
11*4882a593Smuzhiyun #include <asm/io.h>
12*4882a593Smuzhiyun #include <asm/arch/cpu.h>
13*4882a593Smuzhiyun #include <asm/arch/hardware.h>
14*4882a593Smuzhiyun #include <asm/arch/ioc_rk3588.h>
15*4882a593Smuzhiyun #include <dt-bindings/clock/rk3588-cru.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define FIREWALL_DDR_BASE 0xfe030000
20*4882a593Smuzhiyun #define FW_DDR_MST5_REG 0x54
21*4882a593Smuzhiyun #define FW_DDR_MST13_REG 0x74
22*4882a593Smuzhiyun #define FW_DDR_MST19_REG 0x8c
23*4882a593Smuzhiyun #define FW_DDR_MST21_REG 0x94
24*4882a593Smuzhiyun #define FW_DDR_MST26_REG 0xa8
25*4882a593Smuzhiyun #define FW_DDR_MST27_REG 0xac
26*4882a593Smuzhiyun #define FIREWALL_SYSMEM_BASE 0xfe038000
27*4882a593Smuzhiyun #define FW_SYSM_MST5_REG 0x54
28*4882a593Smuzhiyun #define FW_SYSM_MST13_REG 0x74
29*4882a593Smuzhiyun #define FW_SYSM_MST19_REG 0x8c
30*4882a593Smuzhiyun #define FW_SYSM_MST21_REG 0x94
31*4882a593Smuzhiyun #define FW_SYSM_MST26_REG 0xa8
32*4882a593Smuzhiyun #define FW_SYSM_MST27_REG 0xac
33*4882a593Smuzhiyun #define PMU1_SGRF_BASE 0xfd582000
34*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON0 0x0
35*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON6 0x18
36*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON7 0x1c
37*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON8 0x20
38*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON9 0x24
39*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON10 0x28
40*4882a593Smuzhiyun #define PMU1_SGRF_SOC_CON13 0x34
41*4882a593Smuzhiyun #define SYS_GRF_BASE 0xfd58c000
42*4882a593Smuzhiyun #define SYS_GRF_SOC_CON6 0x0318
43*4882a593Smuzhiyun #define USBGRF_BASE 0xfd5ac000
44*4882a593Smuzhiyun #define USB_GRF_USB3OTG0_CON1 0x001c
45*4882a593Smuzhiyun #define BUS_SGRF_BASE 0xfd586000
46*4882a593Smuzhiyun #define BUS_SGRF_SOC_CON2 0x08
47*4882a593Smuzhiyun #define BUS_SGRF_FIREWALL_CON18 0x288
48*4882a593Smuzhiyun #define PMU_BASE 0xfd8d0000
49*4882a593Smuzhiyun #define PMU_PWR_GATE_SFTCON1 0x8150
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun #define USB2PHY1_GRF_BASE 0xfd5d4000
52*4882a593Smuzhiyun #define USB2PHY2_GRF_BASE 0xfd5d8000
53*4882a593Smuzhiyun #define USB2PHY3_GRF_BASE 0xfd5dc000
54*4882a593Smuzhiyun #define USB2PHY_GRF_CON2 0x0008
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define PMU1_IOC_BASE 0xfd5f0000
57*4882a593Smuzhiyun #define PMU2_IOC_BASE 0xfd5f4000
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define BUS_IOC_BASE 0xfd5f8000
60*4882a593Smuzhiyun #define BUS_IOC_GPIO2A_IOMUX_SEL_L 0x40
61*4882a593Smuzhiyun #define BUS_IOC_GPIO2B_IOMUX_SEL_L 0x48
62*4882a593Smuzhiyun #define BUS_IOC_GPIO2D_IOMUX_SEL_L 0x58
63*4882a593Smuzhiyun #define BUS_IOC_GPIO2D_IOMUX_SEL_H 0x5c
64*4882a593Smuzhiyun #define BUS_IOC_GPIO3A_IOMUX_SEL_L 0x60
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun #define VCCIO3_5_IOC_BASE 0xfd5fa000
67*4882a593Smuzhiyun #define IOC_VCCIO3_5_GPIO2A_DS_H 0x44
68*4882a593Smuzhiyun #define IOC_VCCIO3_5_GPIO2B_DS_L 0x48
69*4882a593Smuzhiyun #define IOC_VCCIO3_5_GPIO2B_DS_H 0x4c
70*4882a593Smuzhiyun #define IOC_VCCIO3_5_GPIO3A_DS_L 0x60
71*4882a593Smuzhiyun #define IOC_VCCIO3_5_GPIO3A_DS_H 0x64
72*4882a593Smuzhiyun #define IOC_VCCIO3_5_GPIO3C_DS_H 0x74
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun #define EMMC_IOC_BASE 0xfd5fd000
75*4882a593Smuzhiyun #define EMMC_IOC_GPIO2A_DS_L 0x40
76*4882a593Smuzhiyun #define EMMC_IOC_GPIO2D_DS_L 0x58
77*4882a593Smuzhiyun #define EMMC_IOC_GPIO2D_DS_H 0x5c
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun #define CRU_BASE 0xfd7c0000
80*4882a593Smuzhiyun #define CRU_GPLL_CON1 0x01c4
81*4882a593Smuzhiyun #define CRU_SOFTRST_CON77 0x0b34
82*4882a593Smuzhiyun #define CRU_GLB_RST_CON 0x0c10
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun #define PMU1CRU_BASE 0xfd7f0000
85*4882a593Smuzhiyun #define PMU1CRU_SOFTRST_CON00 0x0a00
86*4882a593Smuzhiyun #define PMU1CRU_SOFTRST_CON03 0x0a0c
87*4882a593Smuzhiyun #define PMU1CRU_SOFTRST_CON04 0x0a10
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun #define HDMIRX_NODE_FDT_PATH "/hdmirx-controller@fdee0000"
90*4882a593Smuzhiyun #define RK3588_PHY_CONFIG 0xfdee00c0
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun #define VOP_M0_PRIORITY_REG 0xfdf82008
93*4882a593Smuzhiyun #define VOP_M1_PRIORITY_REG 0xfdf82208
94*4882a593Smuzhiyun #define QOS_PRIORITY_LEVEL(h, l) ((((h) & 7) << 8) | ((l) & 7))
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun #ifdef CONFIG_ARM64
97*4882a593Smuzhiyun #include <asm/armv8/mmu.h>
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun static struct mm_region rk3588_mem_map[] = {
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun .virt = 0x0UL,
102*4882a593Smuzhiyun .phys = 0x0UL,
103*4882a593Smuzhiyun .size = 0xf0000000UL,
104*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
105*4882a593Smuzhiyun PTE_BLOCK_INNER_SHARE
106*4882a593Smuzhiyun }, {
107*4882a593Smuzhiyun .virt = 0xf0000000UL,
108*4882a593Smuzhiyun .phys = 0xf0000000UL,
109*4882a593Smuzhiyun .size = 0x10000000UL,
110*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
111*4882a593Smuzhiyun PTE_BLOCK_NON_SHARE |
112*4882a593Smuzhiyun PTE_BLOCK_PXN | PTE_BLOCK_UXN
113*4882a593Smuzhiyun }, {
114*4882a593Smuzhiyun .virt = 0x900000000,
115*4882a593Smuzhiyun .phys = 0x900000000,
116*4882a593Smuzhiyun .size = 0x150000000,
117*4882a593Smuzhiyun .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
118*4882a593Smuzhiyun PTE_BLOCK_NON_SHARE |
119*4882a593Smuzhiyun PTE_BLOCK_PXN | PTE_BLOCK_UXN
120*4882a593Smuzhiyun }, {
121*4882a593Smuzhiyun /* List terminator */
122*4882a593Smuzhiyun 0,
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun struct mm_region *mem_map = rk3588_mem_map;
127*4882a593Smuzhiyun #endif
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun /* GPIO0B_IOMUX_SEL_L */
130*4882a593Smuzhiyun enum {
131*4882a593Smuzhiyun GPIO0B0_SHIFT = 0,
132*4882a593Smuzhiyun GPIO0B0_MASK = GENMASK(3, 0),
133*4882a593Smuzhiyun GPIO0B0_UART0_RX_M1 = 4,
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun GPIO0B1_SHIFT = 4,
136*4882a593Smuzhiyun GPIO0B1_MASK = GENMASK(7, 4),
137*4882a593Smuzhiyun GPIO0B1_UART0_TX_M1 = 4,
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* GPIO0C_IOMUX_SEL_H */
141*4882a593Smuzhiyun enum {
142*4882a593Smuzhiyun GPIO0C4_SHIFT = 0,
143*4882a593Smuzhiyun GPIO0C4_MASK = GENMASK(3, 0),
144*4882a593Smuzhiyun GPIO0C4_UART0_RX_M0 = 4,
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun GPIO0C5_SHIFT = 4,
147*4882a593Smuzhiyun GPIO0C5_MASK = GENMASK(7, 4),
148*4882a593Smuzhiyun GPIO0C5_UART0_TX_M0 = 4,
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun /* GPIO0B_IOMUX_SEL_H */
152*4882a593Smuzhiyun enum {
153*4882a593Smuzhiyun GPIO0B5_SHIFT = 4,
154*4882a593Smuzhiyun GPIO0B5_MASK = GENMASK(7, 4),
155*4882a593Smuzhiyun GPIO0B5_REFER = 8,
156*4882a593Smuzhiyun GPIO0B5_UART2_TX_M0 = 10,
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun GPIO0B6_SHIFT = 8,
159*4882a593Smuzhiyun GPIO0B6_MASK = GENMASK(11, 8),
160*4882a593Smuzhiyun GPIO0B6_REFER = 8,
161*4882a593Smuzhiyun GPIO0B6_UART2_RX_M0 = 10,
162*4882a593Smuzhiyun };
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun /* GPIO0D_IOMUX_SEL_L */
165*4882a593Smuzhiyun enum {
166*4882a593Smuzhiyun GPIO0D1_SHIFT = 4,
167*4882a593Smuzhiyun GPIO0D1_MASK = GENMASK(7, 4),
168*4882a593Smuzhiyun GPIO0D1_REFER = 8,
169*4882a593Smuzhiyun GPIO0D1_UART1_TX_M2 = 10,
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun GPIO0D2_SHIFT = 8,
172*4882a593Smuzhiyun GPIO0D2_MASK = GENMASK(11, 8),
173*4882a593Smuzhiyun GPIO0D2_REFER = 8,
174*4882a593Smuzhiyun GPIO0D2_UART1_RX_M2 = 10,
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* GPIO1A_IOMUX_SEL_L */
178*4882a593Smuzhiyun enum {
179*4882a593Smuzhiyun GPIO1A0_SHIFT = 0,
180*4882a593Smuzhiyun GPIO1A0_MASK = GENMASK(3, 0),
181*4882a593Smuzhiyun GPIO1A0_UART6_RX_M1 = 10,
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun GPIO1A1_SHIFT = 4,
184*4882a593Smuzhiyun GPIO1A1_MASK = GENMASK(7, 4),
185*4882a593Smuzhiyun GPIO1A1_UART6_TX_M1 = 10,
186*4882a593Smuzhiyun };
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun /* GPIO1B_IOMUX_SEL_L */
189*4882a593Smuzhiyun enum {
190*4882a593Smuzhiyun GPIO1B2_SHIFT = 8,
191*4882a593Smuzhiyun GPIO1B2_MASK = GENMASK(11, 8),
192*4882a593Smuzhiyun GPIO1B2_UART4_RX_M2 = 10,
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun GPIO1B3_SHIFT = 12,
195*4882a593Smuzhiyun GPIO1B3_MASK = GENMASK(15, 12),
196*4882a593Smuzhiyun GPIO1B3_UART4_TX_M2 = 10,
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /* GPIO1B_IOMUX_SEL_H */
200*4882a593Smuzhiyun enum {
201*4882a593Smuzhiyun GPIO1B4_SHIFT = 0,
202*4882a593Smuzhiyun GPIO1B4_MASK = GENMASK(3, 0),
203*4882a593Smuzhiyun GPIO1B4_UART7_RX_M2 = 10,
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun GPIO1B5_SHIFT = 4,
206*4882a593Smuzhiyun GPIO1B5_MASK = GENMASK(7, 4),
207*4882a593Smuzhiyun GPIO1B5_UART7_TX_M2 = 10,
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun GPIO1B6_SHIFT = 8,
210*4882a593Smuzhiyun GPIO1B6_MASK = GENMASK(11, 8),
211*4882a593Smuzhiyun GPIO1B6_UART1_TX_M1 = 10,
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun GPIO1B7_SHIFT = 12,
214*4882a593Smuzhiyun GPIO1B7_MASK = GENMASK(15, 12),
215*4882a593Smuzhiyun GPIO1B7_UART1_RX_M1 = 10,
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* GPIO1C_IOMUX_SEL_L */
219*4882a593Smuzhiyun enum {
220*4882a593Smuzhiyun GPIO1C0_SHIFT = 0,
221*4882a593Smuzhiyun GPIO1C0_MASK = GENMASK(3, 0),
222*4882a593Smuzhiyun GPIO1C0_UART3_RX_M0 = 10,
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun GPIO1C1_SHIFT = 4,
225*4882a593Smuzhiyun GPIO1C1_MASK = GENMASK(7, 4),
226*4882a593Smuzhiyun GPIO1C1_UART3_TX_M0 = 10,
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun /* GPIO1D_IOMUX_SEL_L */
230*4882a593Smuzhiyun enum {
231*4882a593Smuzhiyun GPIO1D0_SHIFT = 0,
232*4882a593Smuzhiyun GPIO1D0_MASK = GENMASK(3, 0),
233*4882a593Smuzhiyun GPIO1D0_UART6_TX_M2 = 10,
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun GPIO1D1_SHIFT = 4,
236*4882a593Smuzhiyun GPIO1D1_MASK = GENMASK(7, 4),
237*4882a593Smuzhiyun GPIO1D1_UART6_RX_M2 = 10,
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun GPIO1D2_SHIFT = 8,
240*4882a593Smuzhiyun GPIO1D2_MASK = GENMASK(11, 8),
241*4882a593Smuzhiyun GPIO1D2_UART4_TX_M0 = 10,
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun GPIO1D3_SHIFT = 12,
244*4882a593Smuzhiyun GPIO1D3_MASK = GENMASK(15, 12),
245*4882a593Smuzhiyun GPIO1D3_UART4_RX_M0 = 10,
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun /* GPIO2A_IOMUX_SEL_H */
249*4882a593Smuzhiyun enum {
250*4882a593Smuzhiyun GPIO2A6_SHIFT = 8,
251*4882a593Smuzhiyun GPIO2A6_MASK = GENMASK(11, 8),
252*4882a593Smuzhiyun GPIO2A6_UART6_RX_M0 = 10,
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun GPIO2A7_SHIFT = 12,
255*4882a593Smuzhiyun GPIO2A7_MASK = GENMASK(15, 12),
256*4882a593Smuzhiyun GPIO2A7_UART6_TX_M0 = 10,
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun /* GPIO2B_IOMUX_SEL_H */
260*4882a593Smuzhiyun enum {
261*4882a593Smuzhiyun GPIO2B4_SHIFT = 0,
262*4882a593Smuzhiyun GPIO2B4_MASK = GENMASK(3, 0),
263*4882a593Smuzhiyun GPIO2B4_UART7_RX_M0 = 10,
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun GPIO2B5_SHIFT = 4,
266*4882a593Smuzhiyun GPIO2B5_MASK = GENMASK(7, 4),
267*4882a593Smuzhiyun GPIO2B5_UART7_TX_M0 = 10,
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun GPIO2B6_SHIFT = 8,
270*4882a593Smuzhiyun GPIO2B6_MASK = GENMASK(11, 8),
271*4882a593Smuzhiyun GPIO2B6_UART1_RX_M0 = 10,
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun GPIO2B7_SHIFT = 12,
274*4882a593Smuzhiyun GPIO2B7_MASK = GENMASK(15, 12),
275*4882a593Smuzhiyun GPIO2B7_UART1_TX_M0 = 10,
276*4882a593Smuzhiyun };
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun /* GPIO2C_IOMUX_SEL_L */
279*4882a593Smuzhiyun enum {
280*4882a593Smuzhiyun GPIO2C2_SHIFT = 8,
281*4882a593Smuzhiyun GPIO2C2_MASK = GENMASK(11, 8),
282*4882a593Smuzhiyun GPIO2C2_UART9_TX_M0 = 10,
283*4882a593Smuzhiyun };
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun /* GPIO2C_IOMUX_SEL_H */
286*4882a593Smuzhiyun enum {
287*4882a593Smuzhiyun GPIO2C4_SHIFT = 0,
288*4882a593Smuzhiyun GPIO2C4_MASK = GENMASK(3, 0),
289*4882a593Smuzhiyun GPIO2C4_UART9_RX_M0 = 10,
290*4882a593Smuzhiyun };
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun /* GPIO2D_IOMUX_SEL_H */
293*4882a593Smuzhiyun enum {
294*4882a593Smuzhiyun GPIO2D4_SHIFT = 0,
295*4882a593Smuzhiyun GPIO2D4_MASK = GENMASK(3, 0),
296*4882a593Smuzhiyun GPIO2D4_UART5_RX_M2 = 10,
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun GPIO2D5_SHIFT = 4,
299*4882a593Smuzhiyun GPIO2D5_MASK = GENMASK(7, 4),
300*4882a593Smuzhiyun GPIO2D5_UART5_TX_M2 = 10,
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun /* GPIO3A_IOMUX_SEL_H */
304*4882a593Smuzhiyun enum {
305*4882a593Smuzhiyun GPIO3A2_SHIFT = 8,
306*4882a593Smuzhiyun GPIO3A2_MASK = GENMASK(11, 8),
307*4882a593Smuzhiyun GPIO3A2_UART8_TX_M1 = 10,
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun GPIO3A3_SHIFT = 12,
310*4882a593Smuzhiyun GPIO3A3_MASK = GENMASK(15, 12),
311*4882a593Smuzhiyun GPIO3A3_UART8_RX_M1 = 10,
312*4882a593Smuzhiyun };
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun /* GPIO3B_IOMUX_SEL_L */
315*4882a593Smuzhiyun enum {
316*4882a593Smuzhiyun GPIO3B1_SHIFT = 4,
317*4882a593Smuzhiyun GPIO3B1_MASK = GENMASK(7, 4),
318*4882a593Smuzhiyun GPIO3B1_UART2_TX_M2 = 10,
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun GPIO3B2_SHIFT = 8,
321*4882a593Smuzhiyun GPIO3B2_MASK = GENMASK(11, 8),
322*4882a593Smuzhiyun GPIO3B2_UART2_RX_M2 = 10,
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun /* GPIO3B_IOMUX_SEL_H */
326*4882a593Smuzhiyun enum {
327*4882a593Smuzhiyun GPIO3B5_SHIFT = 4,
328*4882a593Smuzhiyun GPIO3B5_MASK = GENMASK(7, 4),
329*4882a593Smuzhiyun GPIO3B5_UART3_TX_M1 = 10,
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun GPIO3B6_SHIFT = 8,
332*4882a593Smuzhiyun GPIO3B6_MASK = GENMASK(11, 8),
333*4882a593Smuzhiyun GPIO3B6_UART3_RX_M1 = 10,
334*4882a593Smuzhiyun };
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /* GPIO3C_IOMUX_SEL_L */
337*4882a593Smuzhiyun enum {
338*4882a593Smuzhiyun GPIO3C0_SHIFT = 0,
339*4882a593Smuzhiyun GPIO3C0_MASK = GENMASK(3, 0),
340*4882a593Smuzhiyun GPIO3C0_UART7_TX_M1 = 10,
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun GPIO3C1_SHIFT = 4,
343*4882a593Smuzhiyun GPIO3C1_MASK = GENMASK(7, 4),
344*4882a593Smuzhiyun GPIO3C1_UART7_RX_M1 = 10,
345*4882a593Smuzhiyun };
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun /* GPIO3C_IOMUX_SEL_H */
348*4882a593Smuzhiyun enum {
349*4882a593Smuzhiyun GPIO3C4_SHIFT = 0,
350*4882a593Smuzhiyun GPIO3C4_MASK = GENMASK(3, 0),
351*4882a593Smuzhiyun GPIO3C4_UART5_TX_M1 = 10,
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun GPIO3C5_SHIFT = 4,
354*4882a593Smuzhiyun GPIO3C5_MASK = GENMASK(7, 4),
355*4882a593Smuzhiyun GPIO3C5_UART5_RX_M1 = 10,
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun /* GPIO3D_IOMUX_SEL_L */
359*4882a593Smuzhiyun enum {
360*4882a593Smuzhiyun GPIO3D0_SHIFT = 0,
361*4882a593Smuzhiyun GPIO3D0_MASK = GENMASK(3, 0),
362*4882a593Smuzhiyun GPIO3D0_UART4_RX_M1 = 10,
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun GPIO3D1_SHIFT = 4,
365*4882a593Smuzhiyun GPIO3D1_MASK = GENMASK(7, 4),
366*4882a593Smuzhiyun GPIO3D1_UART4_TX_M1 = 10,
367*4882a593Smuzhiyun };
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun /* GPIO3D_IOMUX_SEL_H */
370*4882a593Smuzhiyun enum {
371*4882a593Smuzhiyun GPIO3D4_SHIFT = 0,
372*4882a593Smuzhiyun GPIO3D4_MASK = GENMASK(3, 0),
373*4882a593Smuzhiyun GPIO3D4_UART9_RX_M2 = 10,
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun GPIO3D5_SHIFT = 4,
376*4882a593Smuzhiyun GPIO3D5_MASK = GENMASK(7, 4),
377*4882a593Smuzhiyun GPIO3D5_UART9_TX_M2 = 10,
378*4882a593Smuzhiyun };
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun /* GPIO4A_IOMUX_SEL_L */
381*4882a593Smuzhiyun enum {
382*4882a593Smuzhiyun GPIO4A3_SHIFT = 12,
383*4882a593Smuzhiyun GPIO4A3_MASK = GENMASK(15, 12),
384*4882a593Smuzhiyun GPIO4A3_UART0_TX_M2 = 10,
385*4882a593Smuzhiyun };
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun /* GPIO4A_IOMUX_SEL_H */
388*4882a593Smuzhiyun enum {
389*4882a593Smuzhiyun GPIO4A4_SHIFT = 0,
390*4882a593Smuzhiyun GPIO4A4_MASK = GENMASK(3, 0),
391*4882a593Smuzhiyun GPIO4A4_UART0_RX_M2 = 10,
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun GPIO4A5_SHIFT = 4,
394*4882a593Smuzhiyun GPIO4A5_MASK = GENMASK(7, 4),
395*4882a593Smuzhiyun GPIO4A5_UART3_TX_M2 = 10,
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun GPIO4A6_SHIFT = 8,
398*4882a593Smuzhiyun GPIO4A6_MASK = GENMASK(11, 8),
399*4882a593Smuzhiyun GPIO4A6_UART3_RX_M2 = 10,
400*4882a593Smuzhiyun };
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun /* GPIO4B_IOMUX_SEL_L */
403*4882a593Smuzhiyun enum {
404*4882a593Smuzhiyun GPIO4B0_SHIFT = 0,
405*4882a593Smuzhiyun GPIO4B0_MASK = GENMASK(3, 0),
406*4882a593Smuzhiyun GPIO4B0_UART8_TX_M0 = 10,
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun GPIO4B1_SHIFT = 4,
409*4882a593Smuzhiyun GPIO4B1_MASK = GENMASK(7, 4),
410*4882a593Smuzhiyun GPIO4B1_UART8_RX_M0 = 10,
411*4882a593Smuzhiyun };
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /* GPIO4B_IOMUX_SEL_H */
414*4882a593Smuzhiyun enum {
415*4882a593Smuzhiyun GPIO4B4_SHIFT = 0,
416*4882a593Smuzhiyun GPIO4B4_MASK = GENMASK(3, 0),
417*4882a593Smuzhiyun GPIO4B4_UART9_TX_M1 = 10,
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun GPIO4B5_SHIFT = 4,
420*4882a593Smuzhiyun GPIO4B5_MASK = GENMASK(7, 4),
421*4882a593Smuzhiyun GPIO4B5_UART9_RX_M1 = 10,
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun /* GPIO4D_IOMUX_SEL_L */
425*4882a593Smuzhiyun enum {
426*4882a593Smuzhiyun GPIO4D0_SHIFT = 0,
427*4882a593Smuzhiyun GPIO4D0_MASK = GENMASK(3, 0),
428*4882a593Smuzhiyun GPIO4D0_GPIO = 0,
429*4882a593Smuzhiyun GPIO4D0_SDMMC_D0 = 1,
430*4882a593Smuzhiyun GPIO4D0_PDM1_SDI3_M0 = 2,
431*4882a593Smuzhiyun GPIO4D0_JTAG_TCK_M1 = 5,
432*4882a593Smuzhiyun GPIO4D0_I2C3_SCL_M4 = 9,
433*4882a593Smuzhiyun GPIO4D0_UART2_TX_M1 = 10,
434*4882a593Smuzhiyun GPIO4D0_PWM8_M1 = 12,
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun GPIO4D1_SHIFT = 4,
437*4882a593Smuzhiyun GPIO4D1_MASK = GENMASK(7, 4),
438*4882a593Smuzhiyun GPIO4D1_GPIO = 0,
439*4882a593Smuzhiyun GPIO4D1_SDMMC_D1 = 1,
440*4882a593Smuzhiyun GPIO4D1_PDM1_SDI2_M0 = 2,
441*4882a593Smuzhiyun GPIO4D1_JTAG_TMS_M1 = 5,
442*4882a593Smuzhiyun GPIO4D1_I2C3_SDA_M4 = 9,
443*4882a593Smuzhiyun GPIO4D1_UART2_RX_M1 = 10,
444*4882a593Smuzhiyun GPIO4D1_PWM9_M1 = 12,
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun /* GPIO4D_IOMUX_SEL_H */
448*4882a593Smuzhiyun enum {
449*4882a593Smuzhiyun GPIO4D4_SHIFT = 0,
450*4882a593Smuzhiyun GPIO4D4_MASK = GENMASK(3, 0),
451*4882a593Smuzhiyun GPIO4D4_UART5_RX_M0 = 10,
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun GPIO4D5_SHIFT = 4,
454*4882a593Smuzhiyun GPIO4D5_MASK = GENMASK(7, 4),
455*4882a593Smuzhiyun GPIO4D5_UART5_TX_M0 = 10,
456*4882a593Smuzhiyun };
457*4882a593Smuzhiyun
board_debug_uart_init(void)458*4882a593Smuzhiyun void board_debug_uart_init(void)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun __maybe_unused static struct rk3588_bus_ioc * const bus_ioc = (void *)BUS_IOC_BASE;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun /* UART 0 */
463*4882a593Smuzhiyun #if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfd890000)
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
466*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
467*4882a593Smuzhiyun static struct rk3588_pmu2_ioc * const pmu2_ioc = (void *)PMU2_IOC_BASE;
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun /* UART0_M0 Switch iomux */
470*4882a593Smuzhiyun rk_clrsetreg(&pmu2_ioc->gpio0c_iomux_sel_h,
471*4882a593Smuzhiyun GPIO0C4_MASK | GPIO0C5_MASK,
472*4882a593Smuzhiyun GPIO0C4_UART0_RX_M0 << GPIO0C4_SHIFT |
473*4882a593Smuzhiyun GPIO0C5_UART0_TX_M0 << GPIO0C5_SHIFT);
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
476*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
477*4882a593Smuzhiyun static struct rk3588_pmu1_ioc * const pmu1_ioc = (void *)PMU1_IOC_BASE;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun /* UART0_M1 Switch iomux */
480*4882a593Smuzhiyun rk_clrsetreg(&pmu1_ioc->gpio0b_iomux_sel_l,
481*4882a593Smuzhiyun GPIO0B0_MASK | GPIO0B1_MASK,
482*4882a593Smuzhiyun GPIO0B0_UART0_RX_M1 << GPIO0B0_SHIFT |
483*4882a593Smuzhiyun GPIO0B1_UART0_TX_M1 << GPIO0B1_SHIFT);
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
486*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun /* UART0_M2 Switch iomux */
489*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4a_iomux_sel_h,
490*4882a593Smuzhiyun GPIO4A4_MASK,
491*4882a593Smuzhiyun GPIO4A4_UART0_RX_M2 << GPIO4A4_SHIFT);
492*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4a_iomux_sel_l,
493*4882a593Smuzhiyun GPIO4A3_MASK,
494*4882a593Smuzhiyun GPIO4A3_UART0_TX_M2 << GPIO4A3_SHIFT);
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun #endif
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun /* UART 1 */
499*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeb40000)
500*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
501*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun /* UART1_M0 Switch iomux */
504*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio2b_iomux_sel_h,
505*4882a593Smuzhiyun GPIO2B6_MASK | GPIO2B7_MASK,
506*4882a593Smuzhiyun GPIO2B6_UART1_RX_M0 << GPIO2B6_SHIFT |
507*4882a593Smuzhiyun GPIO2B7_UART1_TX_M0 << GPIO2B7_SHIFT);
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
510*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun /* UART1_M1 Switch iomux */
513*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1b_iomux_sel_h,
514*4882a593Smuzhiyun GPIO1B7_MASK | GPIO1B6_MASK,
515*4882a593Smuzhiyun GPIO1B7_UART1_RX_M1 << GPIO1B7_SHIFT |
516*4882a593Smuzhiyun GPIO1B6_UART1_TX_M1 << GPIO1B6_SHIFT);
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
519*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun static struct rk3588_pmu2_ioc * const pmu2_ioc = (void *)PMU2_IOC_BASE;
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun /* Refer to BUS_IOC */
524*4882a593Smuzhiyun rk_clrsetreg(&pmu2_ioc->gpio0d_iomux_sel_l,
525*4882a593Smuzhiyun GPIO0D2_MASK | GPIO0D1_MASK,
526*4882a593Smuzhiyun GPIO0D2_REFER << GPIO0D2_SHIFT |
527*4882a593Smuzhiyun GPIO0D1_REFER << GPIO0D1_SHIFT);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun /* UART1_M2 Switch iomux */
530*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio0d_iomux_sel_l,
531*4882a593Smuzhiyun GPIO0D2_MASK | GPIO0D1_MASK,
532*4882a593Smuzhiyun GPIO0D2_UART1_RX_M2 << GPIO0D2_SHIFT |
533*4882a593Smuzhiyun GPIO0D1_UART1_TX_M2 << GPIO0D1_SHIFT);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun #endif
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun /* UART 2 */
538*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeb50000)
539*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
540*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun static struct rk3588_pmu2_ioc * const pmu2_ioc = (void *)PMU2_IOC_BASE;
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun /* Refer to BUS_IOC */
545*4882a593Smuzhiyun rk_clrsetreg(&pmu2_ioc->gpio0b_iomux_sel_h,
546*4882a593Smuzhiyun GPIO0B6_MASK | GPIO0B5_MASK,
547*4882a593Smuzhiyun GPIO0B6_REFER << GPIO0B6_SHIFT |
548*4882a593Smuzhiyun GPIO0B5_REFER << GPIO0B5_SHIFT);
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun /* UART2_M0 Switch iomux */
551*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio0b_iomux_sel_h,
552*4882a593Smuzhiyun GPIO0B6_MASK | GPIO0B5_MASK,
553*4882a593Smuzhiyun GPIO0B6_UART2_RX_M0 << GPIO0B6_SHIFT |
554*4882a593Smuzhiyun GPIO0B5_UART2_TX_M0 << GPIO0B5_SHIFT);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
557*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun /* UART2_M1 Switch iomux */
560*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4d_iomux_sel_l,
561*4882a593Smuzhiyun GPIO4D1_MASK | GPIO4D0_MASK,
562*4882a593Smuzhiyun GPIO4D1_UART2_RX_M1 << GPIO4D1_SHIFT |
563*4882a593Smuzhiyun GPIO4D0_UART2_TX_M1 << GPIO4D0_SHIFT);
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
566*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun /* UART2_M2 Switch iomux */
569*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3b_iomux_sel_l,
570*4882a593Smuzhiyun GPIO3B2_MASK | GPIO3B1_MASK,
571*4882a593Smuzhiyun GPIO3B2_UART2_RX_M2 << GPIO3B2_SHIFT |
572*4882a593Smuzhiyun GPIO3B1_UART2_TX_M2 << GPIO3B1_SHIFT);
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun #endif
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun /* UART 3 */
577*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeb60000)
578*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
579*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun /* UART3_M0 Switch iomux */
582*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1c_iomux_sel_l,
583*4882a593Smuzhiyun GPIO1C0_MASK | GPIO1C1_MASK,
584*4882a593Smuzhiyun GPIO1C0_UART3_RX_M0 << GPIO1C0_SHIFT |
585*4882a593Smuzhiyun GPIO1C1_UART3_TX_M0 << GPIO1C1_SHIFT);
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
588*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun /* UART3_M1 Switch iomux */
591*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3b_iomux_sel_h,
592*4882a593Smuzhiyun GPIO3B6_MASK | GPIO3B5_MASK,
593*4882a593Smuzhiyun GPIO3B6_UART3_RX_M1 << GPIO3B6_SHIFT |
594*4882a593Smuzhiyun GPIO3B5_UART3_TX_M1 << GPIO3B5_SHIFT);
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
597*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun /* UART3_M2 Switch iomux */
600*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4a_iomux_sel_h,
601*4882a593Smuzhiyun GPIO4A6_MASK | GPIO4A5_MASK,
602*4882a593Smuzhiyun GPIO4A6_UART3_RX_M2 << GPIO4A6_SHIFT |
603*4882a593Smuzhiyun GPIO4A5_UART3_TX_M2 << GPIO4A5_SHIFT);
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun #endif
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun /* UART 4 */
608*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeb70000)
609*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
610*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun /* UART4_M0 Switch iomux */
613*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1d_iomux_sel_l,
614*4882a593Smuzhiyun GPIO1D3_MASK | GPIO1D2_MASK,
615*4882a593Smuzhiyun GPIO1D3_UART4_RX_M0 << GPIO1D3_SHIFT |
616*4882a593Smuzhiyun GPIO1D2_UART4_TX_M0 << GPIO1D2_SHIFT);
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
619*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun /* UART4_M1 Switch iomux */
622*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3d_iomux_sel_l,
623*4882a593Smuzhiyun GPIO3D0_MASK | GPIO3D1_MASK,
624*4882a593Smuzhiyun GPIO3D0_UART4_RX_M1 << GPIO3D0_SHIFT |
625*4882a593Smuzhiyun GPIO3D1_UART4_TX_M1 << GPIO3D1_SHIFT);
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
628*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun /* UART4_M2 Switch iomux */
631*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1b_iomux_sel_l,
632*4882a593Smuzhiyun GPIO1B2_MASK | GPIO1B3_MASK,
633*4882a593Smuzhiyun GPIO1B2_UART4_RX_M2 << GPIO1B2_SHIFT |
634*4882a593Smuzhiyun GPIO1B3_UART4_TX_M2 << GPIO1B3_SHIFT);
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun #endif
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun /* UART 5 */
639*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeb80000)
640*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
641*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun /* UART5_M0 Switch iomux */
644*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4d_iomux_sel_h,
645*4882a593Smuzhiyun GPIO4D4_MASK | GPIO4D5_MASK,
646*4882a593Smuzhiyun GPIO4D4_UART5_RX_M0 << GPIO4D4_SHIFT |
647*4882a593Smuzhiyun GPIO4D5_UART5_TX_M0 << GPIO4D5_SHIFT);
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
650*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun /* UART5_M1 Switch iomux */
653*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3c_iomux_sel_h,
654*4882a593Smuzhiyun GPIO3C5_MASK | GPIO3C4_MASK,
655*4882a593Smuzhiyun GPIO3C5_UART5_RX_M1 << GPIO3C5_SHIFT |
656*4882a593Smuzhiyun GPIO3C4_UART5_TX_M1 << GPIO3C4_SHIFT);
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
659*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun /* UART5_M2 Switch iomux */
662*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio2d_iomux_sel_h,
663*4882a593Smuzhiyun GPIO2D4_MASK | GPIO2D5_MASK,
664*4882a593Smuzhiyun GPIO2D4_UART5_RX_M2 << GPIO2D4_SHIFT |
665*4882a593Smuzhiyun GPIO2D5_UART5_TX_M2 << GPIO2D5_SHIFT);
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun #endif
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun /* UART 6 */
670*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeb90000)
671*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
672*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun /* UART6_M0 Switch iomux */
675*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio2a_iomux_sel_h,
676*4882a593Smuzhiyun GPIO2A6_MASK | GPIO2A7_MASK,
677*4882a593Smuzhiyun GPIO2A6_UART6_RX_M0 << GPIO2A6_SHIFT |
678*4882a593Smuzhiyun GPIO2A7_UART6_TX_M0 << GPIO2A7_SHIFT);
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
681*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun /* UART6_M1 Switch iomux */
684*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1a_iomux_sel_l,
685*4882a593Smuzhiyun GPIO1A0_MASK | GPIO1A1_MASK,
686*4882a593Smuzhiyun GPIO1A0_UART6_RX_M1 << GPIO1A0_SHIFT |
687*4882a593Smuzhiyun GPIO1A1_UART6_TX_M1 << GPIO1A1_SHIFT);
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
690*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun /* UART6_M2 Switch iomux */
693*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1d_iomux_sel_l,
694*4882a593Smuzhiyun GPIO1D1_MASK | GPIO1D0_MASK,
695*4882a593Smuzhiyun GPIO1D1_UART6_RX_M2 << GPIO1D1_SHIFT |
696*4882a593Smuzhiyun GPIO1D0_UART6_TX_M2 << GPIO1D0_SHIFT);
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun #endif
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun /* UART 7 */
701*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfeba0000)
702*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
703*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
704*4882a593Smuzhiyun
705*4882a593Smuzhiyun /* UART7_M0 Switch iomux */
706*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio2b_iomux_sel_h,
707*4882a593Smuzhiyun GPIO2B4_MASK | GPIO2B5_MASK,
708*4882a593Smuzhiyun GPIO2B4_UART7_RX_M0 << GPIO2B4_SHIFT |
709*4882a593Smuzhiyun GPIO2B5_UART7_TX_M0 << GPIO2B5_SHIFT);
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
712*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun /* UART7_M1 Switch iomux */
715*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3c_iomux_sel_l,
716*4882a593Smuzhiyun GPIO3C1_MASK | GPIO3C0_MASK,
717*4882a593Smuzhiyun GPIO3C1_UART7_RX_M1 << GPIO3C1_SHIFT |
718*4882a593Smuzhiyun GPIO3C0_UART7_TX_M1 << GPIO3C0_SHIFT);
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
721*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun /* UART7_M2 Switch iomux */
724*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio1b_iomux_sel_h,
725*4882a593Smuzhiyun GPIO1B4_MASK | GPIO1B5_MASK,
726*4882a593Smuzhiyun GPIO1B4_UART7_RX_M2 << GPIO1B4_SHIFT |
727*4882a593Smuzhiyun GPIO1B5_UART7_TX_M2 << GPIO1B5_SHIFT);
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun #endif
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun /* UART 8 */
732*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfebb0000)
733*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
734*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun /* UART8_M0 Switch iomux */
737*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4b_iomux_sel_l,
738*4882a593Smuzhiyun GPIO4B1_MASK | GPIO4B0_MASK,
739*4882a593Smuzhiyun GPIO4B1_UART8_RX_M0 << GPIO4B1_SHIFT |
740*4882a593Smuzhiyun GPIO4B0_UART8_TX_M0 << GPIO4B0_SHIFT);
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
743*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun /* UART8_M1 Switch iomux */
746*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3a_iomux_sel_l,
747*4882a593Smuzhiyun GPIO3A3_MASK | GPIO3A2_MASK,
748*4882a593Smuzhiyun GPIO3A3_UART8_RX_M1 << GPIO3A3_SHIFT |
749*4882a593Smuzhiyun GPIO3A2_UART8_TX_M1 << GPIO3A2_SHIFT);
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun #endif
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun /* UART 9 */
754*4882a593Smuzhiyun #elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xfebc0000)
755*4882a593Smuzhiyun #if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
756*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun /* UART9_M0 Switch iomux */
759*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio2c_iomux_sel_h,
760*4882a593Smuzhiyun GPIO2C4_MASK,
761*4882a593Smuzhiyun GPIO2C4_UART9_RX_M0 << GPIO2C4_SHIFT);
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun /* UART9_M0 Switch iomux */
764*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio2c_iomux_sel_l,
765*4882a593Smuzhiyun GPIO2C2_MASK,
766*4882a593Smuzhiyun GPIO2C2_UART9_TX_M0 << GPIO2C2_SHIFT);
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
769*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun /* UART9_M1 Switch iomux */
772*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio4b_iomux_sel_h,
773*4882a593Smuzhiyun GPIO4B5_MASK | GPIO4B4_MASK,
774*4882a593Smuzhiyun GPIO4B5_UART9_RX_M1 << GPIO4B5_SHIFT |
775*4882a593Smuzhiyun GPIO4B4_UART9_TX_M1 << GPIO4B4_SHIFT);
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun #elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
778*4882a593Smuzhiyun (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 2)
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun /* UART9_M2 Switch iomux */
781*4882a593Smuzhiyun rk_clrsetreg(&bus_ioc->gpio3d_iomux_sel_h,
782*4882a593Smuzhiyun GPIO3D4_MASK | GPIO3D5_MASK,
783*4882a593Smuzhiyun GPIO3D4_UART9_RX_M2 << GPIO3D4_SHIFT |
784*4882a593Smuzhiyun GPIO3D5_UART9_TX_M2 << GPIO3D5_SHIFT);
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun #endif
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun #endif
789*4882a593Smuzhiyun }
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
rockchip_stimer_init(void)792*4882a593Smuzhiyun void rockchip_stimer_init(void)
793*4882a593Smuzhiyun {
794*4882a593Smuzhiyun /* If Timer already enabled, don't re-init it */
795*4882a593Smuzhiyun u32 reg = readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x4);
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun if (reg & 0x1)
798*4882a593Smuzhiyun return;
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun asm volatile("msr CNTFRQ_EL0, %0" : : "r" (COUNTER_FREQUENCY));
801*4882a593Smuzhiyun writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 0x14);
802*4882a593Smuzhiyun writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 0x18);
803*4882a593Smuzhiyun writel(0x1, CONFIG_ROCKCHIP_STIMER_BASE + 0x4);
804*4882a593Smuzhiyun }
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun static u32 gpio4d_iomux_sel_l = 0xffffffff;
807*4882a593Smuzhiyun static u32 gpio4d_iomux_sel_h;
808*4882a593Smuzhiyun static u32 gpio0a_iomux_sel_h;
809*4882a593Smuzhiyun
spl_board_sd_iomux_save(void)810*4882a593Smuzhiyun void spl_board_sd_iomux_save(void)
811*4882a593Smuzhiyun {
812*4882a593Smuzhiyun struct rk3588_bus_ioc * const bus_ioc = (void *)BUS_IOC_BASE;
813*4882a593Smuzhiyun struct rk3588_pmu1_ioc * const pmu1_ioc = (void *)PMU1_IOC_BASE;
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun gpio4d_iomux_sel_l = readl(&bus_ioc->gpio4d_iomux_sel_l);
816*4882a593Smuzhiyun gpio4d_iomux_sel_h = readl(&bus_ioc->gpio4d_iomux_sel_h);
817*4882a593Smuzhiyun gpio0a_iomux_sel_h = readl(&pmu1_ioc->gpio0a_iomux_sel_h);
818*4882a593Smuzhiyun }
819*4882a593Smuzhiyun
spl_board_storages_fixup(struct spl_image_loader * loader)820*4882a593Smuzhiyun void spl_board_storages_fixup(struct spl_image_loader *loader)
821*4882a593Smuzhiyun {
822*4882a593Smuzhiyun int ret = 0;
823*4882a593Smuzhiyun
824*4882a593Smuzhiyun if (!loader)
825*4882a593Smuzhiyun return;
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun if (loader->boot_device == BOOT_DEVICE_MMC2 && gpio4d_iomux_sel_l != 0xffffffff) {
828*4882a593Smuzhiyun struct rk3588_bus_ioc * const bus_ioc = (void *)BUS_IOC_BASE;
829*4882a593Smuzhiyun struct rk3588_pmu1_ioc * const pmu1_ioc = (void *)PMU1_IOC_BASE;
830*4882a593Smuzhiyun struct mmc *mmc = NULL;
831*4882a593Smuzhiyun bool no_card;
832*4882a593Smuzhiyun
833*4882a593Smuzhiyun ret = spl_mmc_find_device(&mmc, BOOT_DEVICE_MMC2);
834*4882a593Smuzhiyun if (ret)
835*4882a593Smuzhiyun return;
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun no_card = mmc_getcd(mmc) == 0;
838*4882a593Smuzhiyun if (no_card) {
839*4882a593Smuzhiyun writel(0xffffuL << 16 | gpio4d_iomux_sel_l, &bus_ioc->gpio4d_iomux_sel_l);
840*4882a593Smuzhiyun writel(0xffffuL << 16 | gpio4d_iomux_sel_h, &bus_ioc->gpio4d_iomux_sel_h);
841*4882a593Smuzhiyun writel(0xffffuL << 16 | gpio0a_iomux_sel_h, &pmu1_ioc->gpio0a_iomux_sel_h);
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun }
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun #endif
846*4882a593Smuzhiyun
847*4882a593Smuzhiyun #ifndef CONFIG_TPL_BUILD
arch_cpu_init(void)848*4882a593Smuzhiyun int arch_cpu_init(void)
849*4882a593Smuzhiyun {
850*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
851*4882a593Smuzhiyun int secure_reg;
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun /* Set the SDMMC eMMC crypto_ns FSPI access secure area */
854*4882a593Smuzhiyun secure_reg = readl(FIREWALL_DDR_BASE + FW_DDR_MST5_REG);
855*4882a593Smuzhiyun secure_reg &= 0xffff;
856*4882a593Smuzhiyun writel(secure_reg, FIREWALL_DDR_BASE + FW_DDR_MST5_REG);
857*4882a593Smuzhiyun secure_reg = readl(FIREWALL_DDR_BASE + FW_DDR_MST13_REG);
858*4882a593Smuzhiyun secure_reg &= 0xffff;
859*4882a593Smuzhiyun writel(secure_reg, FIREWALL_DDR_BASE + FW_DDR_MST13_REG);
860*4882a593Smuzhiyun secure_reg = readl(FIREWALL_DDR_BASE + FW_DDR_MST21_REG);
861*4882a593Smuzhiyun secure_reg &= 0xffff;
862*4882a593Smuzhiyun writel(secure_reg, FIREWALL_DDR_BASE + FW_DDR_MST21_REG);
863*4882a593Smuzhiyun secure_reg = readl(FIREWALL_DDR_BASE + FW_DDR_MST26_REG);
864*4882a593Smuzhiyun secure_reg &= 0xffff;
865*4882a593Smuzhiyun writel(secure_reg, FIREWALL_DDR_BASE + FW_DDR_MST26_REG);
866*4882a593Smuzhiyun secure_reg = readl(FIREWALL_DDR_BASE + FW_DDR_MST27_REG);
867*4882a593Smuzhiyun secure_reg &= 0xffff0000;
868*4882a593Smuzhiyun writel(secure_reg, FIREWALL_DDR_BASE + FW_DDR_MST27_REG);
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun secure_reg = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST5_REG);
871*4882a593Smuzhiyun secure_reg &= 0xffff;
872*4882a593Smuzhiyun writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST5_REG);
873*4882a593Smuzhiyun secure_reg = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST13_REG);
874*4882a593Smuzhiyun secure_reg &= 0xffff;
875*4882a593Smuzhiyun writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST13_REG);
876*4882a593Smuzhiyun secure_reg = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST21_REG);
877*4882a593Smuzhiyun secure_reg &= 0xffff;
878*4882a593Smuzhiyun writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST21_REG);
879*4882a593Smuzhiyun secure_reg = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST26_REG);
880*4882a593Smuzhiyun secure_reg &= 0xffff;
881*4882a593Smuzhiyun writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST26_REG);
882*4882a593Smuzhiyun secure_reg = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST27_REG);
883*4882a593Smuzhiyun secure_reg &= 0xffff0000;
884*4882a593Smuzhiyun writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST27_REG);
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun /*
887*4882a593Smuzhiyun * Select clk_tx source as default for i2s2/i2s3
888*4882a593Smuzhiyun * Set I2Sx_MCLK as input default
889*4882a593Smuzhiyun *
890*4882a593Smuzhiyun * It's safe to set mclk as input default to avoid high freq glitch
891*4882a593Smuzhiyun * which may make devices work unexpected. And then enabled by
892*4882a593Smuzhiyun * kernel stage or any state where user use it.
893*4882a593Smuzhiyun */
894*4882a593Smuzhiyun writel(0x03c703c7, SYS_GRF_BASE + SYS_GRF_SOC_CON6);
895*4882a593Smuzhiyun
896*4882a593Smuzhiyun if (readl(BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L) == 0x2222) {
897*4882a593Smuzhiyun /* Set the fspi m0 io ds level to 55ohm */
898*4882a593Smuzhiyun writel(0x00070002, EMMC_IOC_BASE + EMMC_IOC_GPIO2A_DS_L);
899*4882a593Smuzhiyun writel(0x77772222, EMMC_IOC_BASE + EMMC_IOC_GPIO2D_DS_L);
900*4882a593Smuzhiyun writel(0x07000200, EMMC_IOC_BASE + EMMC_IOC_GPIO2D_DS_H);
901*4882a593Smuzhiyun } else if (readl(BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L) == 0x1111) {
902*4882a593Smuzhiyun /*
903*4882a593Smuzhiyun * set the emmc io drive strength:
904*4882a593Smuzhiyun * data and cmd: 50ohm
905*4882a593Smuzhiyun * clock: 25ohm
906*4882a593Smuzhiyun */
907*4882a593Smuzhiyun writel(0x00770052, EMMC_IOC_BASE + EMMC_IOC_GPIO2A_DS_L);
908*4882a593Smuzhiyun writel(0x77772222, EMMC_IOC_BASE + EMMC_IOC_GPIO2D_DS_L);
909*4882a593Smuzhiyun writel(0x77772222, EMMC_IOC_BASE + EMMC_IOC_GPIO2D_DS_H);
910*4882a593Smuzhiyun } else if ((readl(BUS_IOC_BASE + BUS_IOC_GPIO2B_IOMUX_SEL_L) & 0xf0ff) == 0x3033) {
911*4882a593Smuzhiyun /* Set the fspi m1 io ds level to 55ohm */
912*4882a593Smuzhiyun writel(0x33002200, VCCIO3_5_IOC_BASE + IOC_VCCIO3_5_GPIO2A_DS_H);
913*4882a593Smuzhiyun writel(0x30332022, VCCIO3_5_IOC_BASE + IOC_VCCIO3_5_GPIO2B_DS_L);
914*4882a593Smuzhiyun writel(0x00030002, VCCIO3_5_IOC_BASE + IOC_VCCIO3_5_GPIO2B_DS_H);
915*4882a593Smuzhiyun } else if (readl(BUS_IOC_BASE + BUS_IOC_GPIO3A_IOMUX_SEL_L) == 0x5555) {
916*4882a593Smuzhiyun /* Set the fspi m2 io ds level to 55ohm */
917*4882a593Smuzhiyun writel(0x77772222, VCCIO3_5_IOC_BASE + IOC_VCCIO3_5_GPIO3A_DS_L);
918*4882a593Smuzhiyun writel(0x00700020, VCCIO3_5_IOC_BASE + IOC_VCCIO3_5_GPIO3A_DS_H);
919*4882a593Smuzhiyun writel(0x00070002, VCCIO3_5_IOC_BASE + IOC_VCCIO3_5_GPIO3C_DS_H);
920*4882a593Smuzhiyun }
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun /*
923*4882a593Smuzhiyun * Assert reset the pipephy0, pipephy1 and pipephy2,
924*4882a593Smuzhiyun * and de-assert reset them in Kernel combphy driver.
925*4882a593Smuzhiyun */
926*4882a593Smuzhiyun writel(0x01c001c0, CRU_BASE + CRU_SOFTRST_CON77);
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun /*
929*4882a593Smuzhiyun * Assert SIDDQ for USB 2.0 PHY1, PHY2 and PHY3 to
930*4882a593Smuzhiyun * power down all analog block to save power. And
931*4882a593Smuzhiyun * PHY0 for OTG0 interface still in normal mode.
932*4882a593Smuzhiyun */
933*4882a593Smuzhiyun writel(0x20002000, USB2PHY1_GRF_BASE + USB2PHY_GRF_CON2);
934*4882a593Smuzhiyun writel(0x20002000, USB2PHY2_GRF_BASE + USB2PHY_GRF_CON2);
935*4882a593Smuzhiyun writel(0x20002000, USB2PHY3_GRF_BASE + USB2PHY_GRF_CON2);
936*4882a593Smuzhiyun
937*4882a593Smuzhiyun /* Assert hdptxphy init,cmn,lane reset */
938*4882a593Smuzhiyun writel(0xb800b800, PMU1CRU_BASE + PMU1CRU_SOFTRST_CON03);
939*4882a593Smuzhiyun writel(0x00030003, PMU1CRU_BASE + PMU1CRU_SOFTRST_CON04);
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun spl_board_sd_iomux_save();
942*4882a593Smuzhiyun #else /* U-Boot */
943*4882a593Smuzhiyun /* uboot: config iomux */
944*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_EMMC_IOMUX
945*4882a593Smuzhiyun /* Set emmc iomux for good extention if the emmc is not the boot device */
946*4882a593Smuzhiyun writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2A_IOMUX_SEL_L);
947*4882a593Smuzhiyun writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L);
948*4882a593Smuzhiyun writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_H);
949*4882a593Smuzhiyun #endif
950*4882a593Smuzhiyun /*
951*4882a593Smuzhiyun * set VOP M0 and VOP M1 to priority 0x303,then
952*4882a593Smuzhiyun * Peri > VOP/MCU > ISP/VICAP > other
953*4882a593Smuzhiyun * Note: VOP priority can only be modified during the u-boot stage,
954*4882a593Smuzhiyun * as VOP default power down, and power up after trust.
955*4882a593Smuzhiyun */
956*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(3, 3), VOP_M0_PRIORITY_REG);
957*4882a593Smuzhiyun writel(QOS_PRIORITY_LEVEL(3, 3), VOP_M1_PRIORITY_REG);
958*4882a593Smuzhiyun #endif
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun /* Select usb otg0 phy status to 0 that make rockusb can work at high-speed */
961*4882a593Smuzhiyun writel(0x00080008, USBGRF_BASE + USB_GRF_USB3OTG0_CON1);
962*4882a593Smuzhiyun
963*4882a593Smuzhiyun return 0;
964*4882a593Smuzhiyun }
965*4882a593Smuzhiyun #endif
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun #define BAD_CPU(mask, n) ((mask) & (1 << (n)))
968*4882a593Smuzhiyun #define BAD_RKVENC(mask, n) ((mask) & (1 << (n)))
969*4882a593Smuzhiyun
fdt_rm_path(void * blob,const char * path)970*4882a593Smuzhiyun static void fdt_rm_path(void *blob, const char *path)
971*4882a593Smuzhiyun {
972*4882a593Smuzhiyun fdt_del_node(blob, fdt_path_offset(blob, path));
973*4882a593Smuzhiyun }
974*4882a593Smuzhiyun
fdt_rm_cooling_map(const void * blob,u8 cpu_mask)975*4882a593Smuzhiyun static void fdt_rm_cooling_map(const void *blob, u8 cpu_mask)
976*4882a593Smuzhiyun {
977*4882a593Smuzhiyun int map1, map2;
978*4882a593Smuzhiyun int cpub1_phd;
979*4882a593Smuzhiyun int cpub3_phd;
980*4882a593Smuzhiyun int node;
981*4882a593Smuzhiyun u32 *pp;
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun node = fdt_path_offset(blob, "/cpus/cpu@500");
984*4882a593Smuzhiyun cpub1_phd = fdtdec_get_uint(blob, node, "phandle", -1);
985*4882a593Smuzhiyun node = fdt_path_offset(blob, "/cpus/cpu@700");
986*4882a593Smuzhiyun cpub3_phd = fdtdec_get_uint(blob, node, "phandle", -1);
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 4)) {
989*4882a593Smuzhiyun map1 = fdt_path_offset(blob, "/thermal-zones/soc-thermal/cooling-maps/map1");
990*4882a593Smuzhiyun if (map1 > 0) {
991*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 5)) {
992*4882a593Smuzhiyun debug("rm: cooling-device map1\n");
993*4882a593Smuzhiyun fdt_del_node((void *)blob, map1);
994*4882a593Smuzhiyun } else {
995*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, map1, "cooling-device", NULL);
996*4882a593Smuzhiyun if (pp) {
997*4882a593Smuzhiyun pp[0] = cpu_to_fdt32(cpub1_phd);
998*4882a593Smuzhiyun debug("fix: cooling-device cpub0->cpub1\n");
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun }
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 6)) {
1005*4882a593Smuzhiyun map2 = fdt_path_offset(blob, "/thermal-zones/soc-thermal/cooling-maps/map2");
1006*4882a593Smuzhiyun if (map2 > 0) {
1007*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 7)) {
1008*4882a593Smuzhiyun debug("rm: cooling-device map2\n");
1009*4882a593Smuzhiyun fdt_del_node((void *)blob, map2);
1010*4882a593Smuzhiyun } else {
1011*4882a593Smuzhiyun pp = (u32 *)fdt_getprop(blob, map2, "cooling-device", NULL);
1012*4882a593Smuzhiyun if (pp) {
1013*4882a593Smuzhiyun pp[0] = cpu_to_fdt32(cpub3_phd);
1014*4882a593Smuzhiyun debug("fix: cooling-device cpub2->cpub3\n");
1015*4882a593Smuzhiyun }
1016*4882a593Smuzhiyun }
1017*4882a593Smuzhiyun }
1018*4882a593Smuzhiyun }
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun
fdt_rm_cpu_affinity(const void * blob,u8 cpu_mask)1021*4882a593Smuzhiyun static void fdt_rm_cpu_affinity(const void *blob, u8 cpu_mask)
1022*4882a593Smuzhiyun {
1023*4882a593Smuzhiyun int i, remain, arm_pmu;
1024*4882a593Smuzhiyun u32 new_aff[8];
1025*4882a593Smuzhiyun u32 *aff;
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun arm_pmu = fdt_path_offset(blob, "/arm-pmu");
1028*4882a593Smuzhiyun if (arm_pmu > 0) {
1029*4882a593Smuzhiyun aff = (u32 *)fdt_getprop(blob, arm_pmu, "interrupt-affinity", NULL);
1030*4882a593Smuzhiyun if (!aff)
1031*4882a593Smuzhiyun return;
1032*4882a593Smuzhiyun
1033*4882a593Smuzhiyun for (i = 0, remain = 0; i < 8; i++) {
1034*4882a593Smuzhiyun if (!BAD_CPU(cpu_mask, i)) {
1035*4882a593Smuzhiyun new_aff[remain++] = aff[i];
1036*4882a593Smuzhiyun debug("new_aff: 0x%08x\n", (u32)aff[i]);
1037*4882a593Smuzhiyun }
1038*4882a593Smuzhiyun }
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun fdt_setprop((void *)blob, arm_pmu, "interrupt-affinity", new_aff, remain * 4);
1041*4882a593Smuzhiyun }
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun
fdt_rm_cpu(const void * blob,u8 cpu_mask)1044*4882a593Smuzhiyun static void fdt_rm_cpu(const void *blob, u8 cpu_mask)
1045*4882a593Smuzhiyun {
1046*4882a593Smuzhiyun const char *cpu_node_name[] = {
1047*4882a593Smuzhiyun "cpu@0", "cpu@100", "cpu@200", "cpu@300",
1048*4882a593Smuzhiyun "cpu@400", "cpu@500", "cpu@600", "cpu@700",
1049*4882a593Smuzhiyun };
1050*4882a593Smuzhiyun const char *cluster_core_name[] = {
1051*4882a593Smuzhiyun "core0", "core1", "core2", "core3",
1052*4882a593Smuzhiyun "core0", "core1", "core0", "core1",
1053*4882a593Smuzhiyun };
1054*4882a593Smuzhiyun const char *cluster_core, *cpu_node;
1055*4882a593Smuzhiyun int root_cpus, cpu;
1056*4882a593Smuzhiyun int cluster;
1057*4882a593Smuzhiyun int i;
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun root_cpus = fdt_path_offset(blob, "/cpus");
1060*4882a593Smuzhiyun if (root_cpus < 0)
1061*4882a593Smuzhiyun return;
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun for (i = 0; i < 8; i++) {
1064*4882a593Smuzhiyun if (!BAD_CPU(cpu_mask, i))
1065*4882a593Smuzhiyun continue;
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun if (i < 4)
1068*4882a593Smuzhiyun cluster = fdt_path_offset(blob, "/cpus/cpu-map/cluster0");
1069*4882a593Smuzhiyun else if (i < 6)
1070*4882a593Smuzhiyun cluster = fdt_path_offset(blob, "/cpus/cpu-map/cluster1");
1071*4882a593Smuzhiyun else
1072*4882a593Smuzhiyun cluster = fdt_path_offset(blob, "/cpus/cpu-map/cluster2");
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun if (cluster < 0)
1075*4882a593Smuzhiyun return;
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun cpu_node = cpu_node_name[i];
1078*4882a593Smuzhiyun cluster_core = cluster_core_name[i];
1079*4882a593Smuzhiyun debug("rm: %s, %s\n", cpu_node, cluster_core);
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun cpu = fdt_subnode_offset(blob, cluster, cluster_core);
1082*4882a593Smuzhiyun if (cpu > 0)
1083*4882a593Smuzhiyun fdt_del_node((void *)blob, cpu);
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun cpu = fdt_subnode_offset(blob, root_cpus, cpu_node);
1086*4882a593Smuzhiyun if (cpu > 0)
1087*4882a593Smuzhiyun fdt_del_node((void *)blob, cpu);
1088*4882a593Smuzhiyun }
1089*4882a593Smuzhiyun
1090*4882a593Smuzhiyun cluster = fdt_path_offset(blob, "/cpus/cpu-map/cluster1");
1091*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 4) && BAD_CPU(cpu_mask, 5)) {
1092*4882a593Smuzhiyun debug("rm: cpu cluster1\n");
1093*4882a593Smuzhiyun fdt_del_node((void *)blob, cluster);
1094*4882a593Smuzhiyun }
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun cluster = fdt_path_offset(blob, "/cpus/cpu-map/cluster2");
1097*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 6) && BAD_CPU(cpu_mask, 7)) {
1098*4882a593Smuzhiyun debug("rm: cpu cluster2\n");
1099*4882a593Smuzhiyun fdt_del_node((void *)blob, cluster);
1100*4882a593Smuzhiyun } else {
1101*4882a593Smuzhiyun /* rename, otherwise linux only handles cluster0 */
1102*4882a593Smuzhiyun if (fdt_path_offset(blob, "/cpus/cpu-map/cluster1") < 0)
1103*4882a593Smuzhiyun fdt_set_name((void *)blob, cluster, "cluster1");
1104*4882a593Smuzhiyun }
1105*4882a593Smuzhiyun }
1106*4882a593Smuzhiyun
fdt_rm_cpus(const void * blob,u8 cpu_mask)1107*4882a593Smuzhiyun static void fdt_rm_cpus(const void *blob, u8 cpu_mask)
1108*4882a593Smuzhiyun {
1109*4882a593Smuzhiyun /*
1110*4882a593Smuzhiyun * policy:
1111*4882a593Smuzhiyun *
1112*4882a593Smuzhiyun * 1. both of cores within the same cluster should be normal, otherwise
1113*4882a593Smuzhiyun * remove both of them.
1114*4882a593Smuzhiyun * 2. if core4~7 are all normal, remove core6 and core7 anyway.
1115*4882a593Smuzhiyun */
1116*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 4) || BAD_CPU(cpu_mask, 5))
1117*4882a593Smuzhiyun cpu_mask |= BIT(4) | BIT(5);
1118*4882a593Smuzhiyun if (BAD_CPU(cpu_mask, 6) || BAD_CPU(cpu_mask, 7))
1119*4882a593Smuzhiyun cpu_mask |= BIT(6) | BIT(7);
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun if (!BAD_CPU(cpu_mask, 4) & !BAD_CPU(cpu_mask, 5) &&
1122*4882a593Smuzhiyun !BAD_CPU(cpu_mask, 6) & !BAD_CPU(cpu_mask, 7))
1123*4882a593Smuzhiyun cpu_mask |= BIT(6) | BIT(7);
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun fdt_rm_cooling_map(blob, cpu_mask);
1126*4882a593Smuzhiyun fdt_rm_cpu_affinity(blob, cpu_mask);
1127*4882a593Smuzhiyun fdt_rm_cpu(blob, cpu_mask);
1128*4882a593Smuzhiyun }
1129*4882a593Smuzhiyun
fdt_rm_gpu(void * blob)1130*4882a593Smuzhiyun static void fdt_rm_gpu(void *blob)
1131*4882a593Smuzhiyun {
1132*4882a593Smuzhiyun /*
1133*4882a593Smuzhiyun * policy:
1134*4882a593Smuzhiyun *
1135*4882a593Smuzhiyun * Remove GPU by default.
1136*4882a593Smuzhiyun */
1137*4882a593Smuzhiyun fdt_rm_path(blob, "/gpu@fb000000");
1138*4882a593Smuzhiyun fdt_rm_path(blob, "/thermal-zones/soc-thermal/cooling-maps/map3");
1139*4882a593Smuzhiyun debug("rm: gpu\n");
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun
fdt_rm_rkvdec01(void * blob)1142*4882a593Smuzhiyun static void fdt_rm_rkvdec01(void *blob)
1143*4882a593Smuzhiyun {
1144*4882a593Smuzhiyun /*
1145*4882a593Smuzhiyun * policy:
1146*4882a593Smuzhiyun *
1147*4882a593Smuzhiyun * Remove rkvdec0 and rkvdec1 by default.
1148*4882a593Smuzhiyun */
1149*4882a593Smuzhiyun fdt_rm_path(blob, "/rkvdec-core@fdc38000");
1150*4882a593Smuzhiyun fdt_rm_path(blob, "/iommu@fdc38700");
1151*4882a593Smuzhiyun fdt_rm_path(blob, "/rkvdec-core@fdc48000");
1152*4882a593Smuzhiyun fdt_rm_path(blob, "/iommu@fdc48700");
1153*4882a593Smuzhiyun debug("rm: rkvdec0, rkvdec1\n");
1154*4882a593Smuzhiyun }
1155*4882a593Smuzhiyun
fdt_rm_rkvenc01(void * blob,u8 mask)1156*4882a593Smuzhiyun static void fdt_rm_rkvenc01(void *blob, u8 mask)
1157*4882a593Smuzhiyun {
1158*4882a593Smuzhiyun /*
1159*4882a593Smuzhiyun * policy:
1160*4882a593Smuzhiyun *
1161*4882a593Smuzhiyun * 1. remove bad.
1162*4882a593Smuzhiyun * 2. if both of rkvenc0 and rkvenc1 are normal, remove rkvenc1 by default.
1163*4882a593Smuzhiyun */
1164*4882a593Smuzhiyun if (!BAD_RKVENC(mask, 0) && !BAD_RKVENC(mask, 1)) {
1165*4882a593Smuzhiyun /* rkvenc1 */
1166*4882a593Smuzhiyun fdt_rm_path(blob, "/rkvenc-core@fdbe0000");
1167*4882a593Smuzhiyun fdt_rm_path(blob, "/iommu@fdbef000");
1168*4882a593Smuzhiyun debug("rm: rkvenv1\n");
1169*4882a593Smuzhiyun } else {
1170*4882a593Smuzhiyun if (BAD_RKVENC(mask, 0)) {
1171*4882a593Smuzhiyun fdt_rm_path(blob, "/rkvenc-core@fdbd0000");
1172*4882a593Smuzhiyun fdt_rm_path(blob, "/iommu@fdbdf000");
1173*4882a593Smuzhiyun debug("rm: rkvenv0\n");
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun }
1176*4882a593Smuzhiyun if (BAD_RKVENC(mask, 1)) {
1177*4882a593Smuzhiyun fdt_rm_path(blob, "/rkvenc-core@fdbe0000");
1178*4882a593Smuzhiyun fdt_rm_path(blob, "/iommu@fdbef000");
1179*4882a593Smuzhiyun debug("rm: rkvenv1\n");
1180*4882a593Smuzhiyun }
1181*4882a593Smuzhiyun }
1182*4882a593Smuzhiyun }
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun #define CHIP_ID_OFF 2
1185*4882a593Smuzhiyun #define IP_STATE_OFF 29
1186*4882a593Smuzhiyun
fdt_fixup_modules(void * blob)1187*4882a593Smuzhiyun static int fdt_fixup_modules(void *blob)
1188*4882a593Smuzhiyun {
1189*4882a593Smuzhiyun struct udevice *dev;
1190*4882a593Smuzhiyun u8 ip_state[3];
1191*4882a593Smuzhiyun u8 chip_id[2];
1192*4882a593Smuzhiyun u8 rkvenc_mask;
1193*4882a593Smuzhiyun u8 cpu_mask;
1194*4882a593Smuzhiyun int ret;
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun ret = uclass_get_device_by_driver(UCLASS_MISC,
1197*4882a593Smuzhiyun DM_GET_DRIVER(rockchip_otp), &dev);
1198*4882a593Smuzhiyun if (ret) {
1199*4882a593Smuzhiyun printf("can't get otp device, ret=%d\n", ret);
1200*4882a593Smuzhiyun return ret;
1201*4882a593Smuzhiyun }
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun ret = misc_read(dev, CHIP_ID_OFF, &chip_id, sizeof(chip_id));
1204*4882a593Smuzhiyun if (ret) {
1205*4882a593Smuzhiyun printf("can't read chip id, ret=%d\n", ret);
1206*4882a593Smuzhiyun return ret;
1207*4882a593Smuzhiyun }
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun debug("# chip: rk%02x%02x\n", chip_id[0], chip_id[1]);
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun /* only rk3582 goes further */
1212*4882a593Smuzhiyun if (!(chip_id[0] == 0x35 && chip_id[1] == 0x82))
1213*4882a593Smuzhiyun return 0;
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun ret = misc_read(dev, IP_STATE_OFF, &ip_state, sizeof(ip_state));
1216*4882a593Smuzhiyun if (ret) {
1217*4882a593Smuzhiyun printf("can't read ip state, ret=%d\n", ret);
1218*4882a593Smuzhiyun return ret;
1219*4882a593Smuzhiyun }
1220*4882a593Smuzhiyun
1221*4882a593Smuzhiyun /* ip_state[0]: bit0~7 */
1222*4882a593Smuzhiyun cpu_mask = ip_state[0];
1223*4882a593Smuzhiyun /* ip_state[2]: bit0,2 */
1224*4882a593Smuzhiyun rkvenc_mask = (ip_state[2] & 0x1) | ((ip_state[2] & 0x4) >> 1);
1225*4882a593Smuzhiyun #if 0
1226*4882a593Smuzhiyun /* ip_state[1]: bit1~4 */
1227*4882a593Smuzhiyun gpu_mask = (ip_state[1] & 0x1e) >> 1;
1228*4882a593Smuzhiyun /* ip_state[1]: bit6,7 */
1229*4882a593Smuzhiyun rkvdec_mask = (ip_state[1] & 0xc0) >> 6;
1230*4882a593Smuzhiyun #endif
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun debug("hwmask: 0x%02x, 0x%02x, 0x%02x\n", ip_state[0], ip_state[1], ip_state[2]);
1233*4882a593Smuzhiyun debug("swmask: 0x%02x, 0x%02x\n", cpu_mask, rkvenc_mask);
1234*4882a593Smuzhiyun
1235*4882a593Smuzhiyun /*
1236*4882a593Smuzhiyun * RK3582 Policy: gpu/rkvdec are removed by default, the same for other
1237*4882a593Smuzhiyun * IP under some condition.
1238*4882a593Smuzhiyun *
1239*4882a593Smuzhiyun * So don't use pattern like "if (rkvenc_mask) then fdt_rm_rkvenc01()",
1240*4882a593Smuzhiyun * just go through all of them as this chip is rk3582.
1241*4882a593Smuzhiyun *
1242*4882a593Smuzhiyun * FIXUP WARNING!
1243*4882a593Smuzhiyun *
1244*4882a593Smuzhiyun * The node delete changes the fdt structure, a node offset you already
1245*4882a593Smuzhiyun * got before maybe not right by now. Make sure always reading the node
1246*4882a593Smuzhiyun * offset exactly before you are going to use.
1247*4882a593Smuzhiyun */
1248*4882a593Smuzhiyun fdt_rm_gpu(blob);
1249*4882a593Smuzhiyun fdt_rm_rkvdec01(blob);
1250*4882a593Smuzhiyun fdt_rm_rkvenc01(blob, rkvenc_mask);
1251*4882a593Smuzhiyun fdt_rm_cpus(blob, cpu_mask);
1252*4882a593Smuzhiyun
1253*4882a593Smuzhiyun return 0;
1254*4882a593Smuzhiyun }
1255*4882a593Smuzhiyun
rk_board_dm_fdt_fixup(const void * blob)1256*4882a593Smuzhiyun int rk_board_dm_fdt_fixup(const void *blob)
1257*4882a593Smuzhiyun {
1258*4882a593Smuzhiyun return fdt_fixup_modules((void *)blob);
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun
rk_board_fdt_fixup(const void * blob)1261*4882a593Smuzhiyun int rk_board_fdt_fixup(const void *blob)
1262*4882a593Smuzhiyun {
1263*4882a593Smuzhiyun int node;
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun /* set hdmirx to low power mode */
1266*4882a593Smuzhiyun node = fdt_path_offset(blob, HDMIRX_NODE_FDT_PATH);
1267*4882a593Smuzhiyun if (node >= 0) {
1268*4882a593Smuzhiyun if (fdtdec_get_int(blob, node, "low-power-mode", 0)) {
1269*4882a593Smuzhiyun printf("hdmirx low power mode\n");
1270*4882a593Smuzhiyun writel(0x00000100, RK3588_PHY_CONFIG);
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun }
1273*4882a593Smuzhiyun
1274*4882a593Smuzhiyun return 0;
1275*4882a593Smuzhiyun }
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
spl_fit_standalone_release(char * id,uintptr_t entry_point)1278*4882a593Smuzhiyun int spl_fit_standalone_release(char *id, uintptr_t entry_point)
1279*4882a593Smuzhiyun {
1280*4882a593Smuzhiyun u32 val;
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun /* pmu m0 configuration: */
1283*4882a593Smuzhiyun /* set gpll */
1284*4882a593Smuzhiyun writel(0x00f00042, CRU_BASE + CRU_GPLL_CON1);
1285*4882a593Smuzhiyun /* set pmu mcu to access ddr memory */
1286*4882a593Smuzhiyun val = readl(FIREWALL_DDR_BASE + FW_DDR_MST19_REG);
1287*4882a593Smuzhiyun writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST19_REG);
1288*4882a593Smuzhiyun /* set pmu mcu to access system memory */
1289*4882a593Smuzhiyun val = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST19_REG);
1290*4882a593Smuzhiyun writel(val & 0x000000ff, FIREWALL_SYSMEM_BASE + FW_SYSM_MST19_REG);
1291*4882a593Smuzhiyun /* set pmu mcu to secure */
1292*4882a593Smuzhiyun writel(0x00080000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON0);
1293*4882a593Smuzhiyun /* set start addr, pmu_mcu_code_addr_start */
1294*4882a593Smuzhiyun writel(0xFFFF0000 | (entry_point >> 16), PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON9);
1295*4882a593Smuzhiyun /* set pmu_mcu_sram_addr_start */
1296*4882a593Smuzhiyun writel(0xFFFF2000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON10);
1297*4882a593Smuzhiyun /* set pmu_mcu_tcm_addr_start */
1298*4882a593Smuzhiyun writel(0xFFFF2000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON13);
1299*4882a593Smuzhiyun /* set cache cache_peripheral_addr */
1300*4882a593Smuzhiyun /* 0xf0000000 ~ 0xfee00000 */
1301*4882a593Smuzhiyun writel(0xffff0000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON6);
1302*4882a593Smuzhiyun writel(0xffffee00, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON7);
1303*4882a593Smuzhiyun writel(0x00ff00ff, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON8);
1304*4882a593Smuzhiyun /* enable PMU WDT reset system */
1305*4882a593Smuzhiyun writel(0x02000200, BUS_SGRF_BASE + BUS_SGRF_SOC_CON2);
1306*4882a593Smuzhiyun /* select WDT trigger global reset. */
1307*4882a593Smuzhiyun writel(0x08400840, CRU_BASE + CRU_GLB_RST_CON);
1308*4882a593Smuzhiyun /* release pmu mcu */
1309*4882a593Smuzhiyun /* writel(0x20000000, PMU1CRU_BASE + PMU1CRU_SOFTRST_CON00); */
1310*4882a593Smuzhiyun
1311*4882a593Smuzhiyun return 0;
1312*4882a593Smuzhiyun }
1313*4882a593Smuzhiyun #endif
1314