1*cd357ad1SPeng Fan // SPDX-License-Identifier: GPL-2.0+
2*cd357ad1SPeng Fan /*
3*cd357ad1SPeng Fan * Copyright 2017 NXP
4*cd357ad1SPeng Fan *
5*cd357ad1SPeng Fan * Peng Fan <peng.fan@nxp.com>
6*cd357ad1SPeng Fan */
7*cd357ad1SPeng Fan
8*cd357ad1SPeng Fan #include <common.h>
9*cd357ad1SPeng Fan #include <asm/arch/clock.h>
10*cd357ad1SPeng Fan #include <asm/arch/imx-regs.h>
11*cd357ad1SPeng Fan #include <asm/io.h>
12*cd357ad1SPeng Fan #include <errno.h>
13*cd357ad1SPeng Fan
14*cd357ad1SPeng Fan static struct ccm_reg *ccm_reg = (struct ccm_reg *)CCM_BASE_ADDR;
15*cd357ad1SPeng Fan
16*cd357ad1SPeng Fan static struct clk_root_map root_array[] = {
17*cd357ad1SPeng Fan {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
18*cd357ad1SPeng Fan {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
19*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
20*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
21*cd357ad1SPeng Fan },
22*cd357ad1SPeng Fan {ARM_M4_CLK_ROOT, CORE_CLOCK_SLICE, 1,
23*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
24*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
25*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
26*cd357ad1SPeng Fan },
27*cd357ad1SPeng Fan {VPU_A53_CLK_ROOT, CORE_CLOCK_SLICE, 2,
28*cd357ad1SPeng Fan {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
29*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
30*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VPU_PLL_CLK}
31*cd357ad1SPeng Fan },
32*cd357ad1SPeng Fan {GPU_CORE_CLK_ROOT, CORE_CLOCK_SLICE, 3,
33*cd357ad1SPeng Fan {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
34*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
35*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
36*cd357ad1SPeng Fan },
37*cd357ad1SPeng Fan {GPU_SHADER_CLK_ROOT, CORE_CLOCK_SLICE, 4,
38*cd357ad1SPeng Fan {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
39*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
40*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
41*cd357ad1SPeng Fan },
42*cd357ad1SPeng Fan {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
43*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
44*cd357ad1SPeng Fan SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK,
45*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
46*cd357ad1SPeng Fan },
47*cd357ad1SPeng Fan {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
48*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
49*cd357ad1SPeng Fan SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
50*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
51*cd357ad1SPeng Fan },
52*cd357ad1SPeng Fan {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
53*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
54*cd357ad1SPeng Fan SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
55*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
56*cd357ad1SPeng Fan },
57*cd357ad1SPeng Fan {VPU_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 3,
58*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, VPU_PLL_CLK,
59*cd357ad1SPeng Fan AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
60*cd357ad1SPeng Fan SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_100M_CLK}
61*cd357ad1SPeng Fan },
62*cd357ad1SPeng Fan {DISPLAY_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 4,
63*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
64*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
65*cd357ad1SPeng Fan EXT_CLK_1, EXT_CLK_4}
66*cd357ad1SPeng Fan },
67*cd357ad1SPeng Fan {DISPLAY_APB_CLK_ROOT, BUS_CLOCK_SLICE, 5,
68*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
69*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
70*cd357ad1SPeng Fan EXT_CLK_1, EXT_CLK_3}
71*cd357ad1SPeng Fan },
72*cd357ad1SPeng Fan {DISPLAY_RTRM_CLK_ROOT, BUS_CLOCK_SLICE, 6,
73*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_200M_CLK,
74*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
75*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_3}
76*cd357ad1SPeng Fan },
77*cd357ad1SPeng Fan {USB_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 7,
78*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
79*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
80*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
81*cd357ad1SPeng Fan },
82*cd357ad1SPeng Fan {GPU_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 8,
83*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
84*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
85*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
86*cd357ad1SPeng Fan },
87*cd357ad1SPeng Fan {GPU_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 9,
88*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
89*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
90*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
91*cd357ad1SPeng Fan },
92*cd357ad1SPeng Fan {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
93*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
94*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
95*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
96*cd357ad1SPeng Fan },
97*cd357ad1SPeng Fan {NOC_APB_CLK_ROOT, BUS_CLOCK_SLICE, 11,
98*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL3_CLK,
99*cd357ad1SPeng Fan SYSTEM_PLL2_333M_CLK, SYSTEM_PLL2_200M_CLK,
100*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
101*cd357ad1SPeng Fan },
102*cd357ad1SPeng Fan {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
103*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
104*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
105*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
106*cd357ad1SPeng Fan },
107*cd357ad1SPeng Fan {IPG_CLK_ROOT, IPG_CLOCK_SLICE, 0,
108*cd357ad1SPeng Fan {}
109*cd357ad1SPeng Fan },
110*cd357ad1SPeng Fan {AUDIO_AHB_CLK_ROOT, AHB_CLOCK_SLICE, 1,
111*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
112*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_166M_CLK,
113*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
114*cd357ad1SPeng Fan },
115*cd357ad1SPeng Fan {MIPI_DSI_ESC_RX_CLK_ROOT, AHB_CLOCK_SLICE, 2,
116*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_40M_CLK,
117*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
118*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL1_CLK },
119*cd357ad1SPeng Fan },
120*cd357ad1SPeng Fan {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
121*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
122*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_250M_CLK,
123*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
124*cd357ad1SPeng Fan },
125*cd357ad1SPeng Fan {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
126*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
127*cd357ad1SPeng Fan SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
128*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
129*cd357ad1SPeng Fan },
130*cd357ad1SPeng Fan {VPU_G1_CLK_ROOT, IP_CLOCK_SLICE, 2,
131*cd357ad1SPeng Fan {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
132*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
133*cd357ad1SPeng Fan SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
134*cd357ad1SPeng Fan },
135*cd357ad1SPeng Fan {VPU_G2_CLK_ROOT, IP_CLOCK_SLICE, 3,
136*cd357ad1SPeng Fan {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
137*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
138*cd357ad1SPeng Fan SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
139*cd357ad1SPeng Fan },
140*cd357ad1SPeng Fan {DISPLAY_DTRC_CLK_ROOT, IP_CLOCK_SLICE, 4,
141*cd357ad1SPeng Fan {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
142*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
143*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
144*cd357ad1SPeng Fan },
145*cd357ad1SPeng Fan {DISPLAY_DC8000_CLK_ROOT, IP_CLOCK_SLICE, 5,
146*cd357ad1SPeng Fan {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
147*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
148*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
149*cd357ad1SPeng Fan },
150*cd357ad1SPeng Fan {PCIE1_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 6,
151*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
152*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
153*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
154*cd357ad1SPeng Fan },
155*cd357ad1SPeng Fan {PCIE1_PHY_CLK_ROOT, IP_CLOCK_SLICE, 7,
156*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
157*cd357ad1SPeng Fan EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
158*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK}
159*cd357ad1SPeng Fan },
160*cd357ad1SPeng Fan {PCIE1_AUX_CLK_ROOT, IP_CLOCK_SLICE, 8,
161*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
162*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
163*cd357ad1SPeng Fan SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
164*cd357ad1SPeng Fan },
165*cd357ad1SPeng Fan {DC_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 9,
166*cd357ad1SPeng Fan {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
167*cd357ad1SPeng Fan AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
168*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
169*cd357ad1SPeng Fan },
170*cd357ad1SPeng Fan {LCDIF_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 10,
171*cd357ad1SPeng Fan {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
172*cd357ad1SPeng Fan AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
173*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
174*cd357ad1SPeng Fan },
175*cd357ad1SPeng Fan {SAI1_CLK_ROOT, IP_CLOCK_SLICE, 11,
176*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
177*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
178*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
179*cd357ad1SPeng Fan },
180*cd357ad1SPeng Fan {SAI2_CLK_ROOT, IP_CLOCK_SLICE, 12,
181*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
182*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
183*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
184*cd357ad1SPeng Fan },
185*cd357ad1SPeng Fan {SAI3_CLK_ROOT, IP_CLOCK_SLICE, 13,
186*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
187*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
188*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
189*cd357ad1SPeng Fan },
190*cd357ad1SPeng Fan {SAI4_CLK_ROOT, IP_CLOCK_SLICE, 14,
191*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
192*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
193*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
194*cd357ad1SPeng Fan },
195*cd357ad1SPeng Fan {SAI5_CLK_ROOT, IP_CLOCK_SLICE, 15,
196*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
197*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
198*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
199*cd357ad1SPeng Fan },
200*cd357ad1SPeng Fan {SAI6_CLK_ROOT, IP_CLOCK_SLICE, 16,
201*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
202*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
203*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
204*cd357ad1SPeng Fan },
205*cd357ad1SPeng Fan {SPDIF1_CLK_ROOT, IP_CLOCK_SLICE, 17,
206*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
207*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
208*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
209*cd357ad1SPeng Fan },
210*cd357ad1SPeng Fan {SPDIF2_CLK_ROOT, IP_CLOCK_SLICE, 18,
211*cd357ad1SPeng Fan {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
212*cd357ad1SPeng Fan VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
213*cd357ad1SPeng Fan OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
214*cd357ad1SPeng Fan },
215*cd357ad1SPeng Fan {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
216*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
217*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
218*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
219*cd357ad1SPeng Fan },
220*cd357ad1SPeng Fan {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
221*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK,
222*cd357ad1SPeng Fan EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
223*cd357ad1SPeng Fan VIDEO_PLL_CLK}
224*cd357ad1SPeng Fan },
225*cd357ad1SPeng Fan {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
226*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
227*cd357ad1SPeng Fan SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK,
228*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
229*cd357ad1SPeng Fan },
230*cd357ad1SPeng Fan {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
231*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
232*cd357ad1SPeng Fan SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
233*cd357ad1SPeng Fan SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
234*cd357ad1SPeng Fan },
235*cd357ad1SPeng Fan {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
236*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
237*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
238*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
239*cd357ad1SPeng Fan },
240*cd357ad1SPeng Fan {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
241*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
242*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
243*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
244*cd357ad1SPeng Fan },
245*cd357ad1SPeng Fan {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
246*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
247*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
248*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
249*cd357ad1SPeng Fan },
250*cd357ad1SPeng Fan {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
251*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
252*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
253*cd357ad1SPeng Fan AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
254*cd357ad1SPeng Fan },
255*cd357ad1SPeng Fan {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
256*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
257*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
258*cd357ad1SPeng Fan AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
259*cd357ad1SPeng Fan },
260*cd357ad1SPeng Fan {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
261*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
262*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
263*cd357ad1SPeng Fan AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
264*cd357ad1SPeng Fan },
265*cd357ad1SPeng Fan {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
266*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
267*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
268*cd357ad1SPeng Fan AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
269*cd357ad1SPeng Fan },
270*cd357ad1SPeng Fan {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
271*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
272*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
273*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
274*cd357ad1SPeng Fan },
275*cd357ad1SPeng Fan {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
276*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
277*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
278*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
279*cd357ad1SPeng Fan },
280*cd357ad1SPeng Fan {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
281*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
282*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
283*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
284*cd357ad1SPeng Fan },
285*cd357ad1SPeng Fan {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
286*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
287*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
288*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
289*cd357ad1SPeng Fan },
290*cd357ad1SPeng Fan {USB_CORE_REF_CLK_ROOT, IP_CLOCK_SLICE, 34,
291*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
292*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
293*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
294*cd357ad1SPeng Fan },
295*cd357ad1SPeng Fan {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
296*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
297*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
298*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
299*cd357ad1SPeng Fan },
300*cd357ad1SPeng Fan {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
301*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
302*cd357ad1SPeng Fan SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
303*cd357ad1SPeng Fan EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
304*cd357ad1SPeng Fan },
305*cd357ad1SPeng Fan {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
306*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
307*cd357ad1SPeng Fan SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
308*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
309*cd357ad1SPeng Fan },
310*cd357ad1SPeng Fan {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
311*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
312*cd357ad1SPeng Fan SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
313*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
314*cd357ad1SPeng Fan },
315*cd357ad1SPeng Fan {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
316*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
317*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
318*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
319*cd357ad1SPeng Fan },
320*cd357ad1SPeng Fan {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
321*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
322*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
323*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
324*cd357ad1SPeng Fan },
325*cd357ad1SPeng Fan {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
326*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
327*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
328*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
329*cd357ad1SPeng Fan },
330*cd357ad1SPeng Fan {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
331*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
332*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
333*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
334*cd357ad1SPeng Fan },
335*cd357ad1SPeng Fan {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
336*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
337*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
338*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
339*cd357ad1SPeng Fan },
340*cd357ad1SPeng Fan {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
341*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
342*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
343*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
344*cd357ad1SPeng Fan },
345*cd357ad1SPeng Fan {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
346*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
347*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
348*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
349*cd357ad1SPeng Fan },
350*cd357ad1SPeng Fan {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
351*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
352*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
353*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
354*cd357ad1SPeng Fan },
355*cd357ad1SPeng Fan {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
356*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
357*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
358*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
359*cd357ad1SPeng Fan },
360*cd357ad1SPeng Fan {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
361*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
362*cd357ad1SPeng Fan SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
363*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
364*cd357ad1SPeng Fan },
365*cd357ad1SPeng Fan {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
366*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
367*cd357ad1SPeng Fan VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
368*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
369*cd357ad1SPeng Fan },
370*cd357ad1SPeng Fan {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
371*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
372*cd357ad1SPeng Fan VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
373*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
374*cd357ad1SPeng Fan },
375*cd357ad1SPeng Fan {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
376*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
377*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
378*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
379*cd357ad1SPeng Fan },
380*cd357ad1SPeng Fan {IPP_DO_CLKO1, IP_CLOCK_SLICE, 52,
381*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, OSC_27M_CLK,
382*cd357ad1SPeng Fan SYSTEM_PLL1_200M_CLK, AUDIO_PLL2_CLK,
383*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_80M_CLK}
384*cd357ad1SPeng Fan },
385*cd357ad1SPeng Fan {IPP_DO_CLKO2, IP_CLOCK_SLICE, 53,
386*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_400M_CLK,
387*cd357ad1SPeng Fan SYSTEM_PLL2_166M_CLK, SYSTEM_PLL3_CLK,
388*cd357ad1SPeng Fan AUDIO_PLL1_CLK, VIDEO_PLL_CLK, OSC_32K_CLK}
389*cd357ad1SPeng Fan },
390*cd357ad1SPeng Fan {MIPI_DSI_CORE_CLK_ROOT, IP_CLOCK_SLICE, 54,
391*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
392*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
393*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
394*cd357ad1SPeng Fan },
395*cd357ad1SPeng Fan {MIPI_DSI_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 55,
396*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
397*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
398*cd357ad1SPeng Fan EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
399*cd357ad1SPeng Fan },
400*cd357ad1SPeng Fan {MIPI_DSI_DBI_CLK_ROOT, IP_CLOCK_SLICE, 56,
401*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_100M_CLK,
402*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
403*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
404*cd357ad1SPeng Fan },
405*cd357ad1SPeng Fan {OLD_MIPI_DSI_ESC_CLK_ROOT, IP_CLOCK_SLICE, 57,
406*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
407*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
408*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
409*cd357ad1SPeng Fan },
410*cd357ad1SPeng Fan {MIPI_CSI1_CORE_CLK_ROOT, IP_CLOCK_SLICE, 58,
411*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
412*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
413*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
414*cd357ad1SPeng Fan },
415*cd357ad1SPeng Fan {MIPI_CSI1_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 59,
416*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
417*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
418*cd357ad1SPeng Fan EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
419*cd357ad1SPeng Fan },
420*cd357ad1SPeng Fan {MIPI_CSI1_ESC_CLK_ROOT, IP_CLOCK_SLICE, 60,
421*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
422*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
423*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
424*cd357ad1SPeng Fan },
425*cd357ad1SPeng Fan {MIPI_CSI2_CORE_CLK_ROOT, IP_CLOCK_SLICE, 61,
426*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
427*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
428*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
429*cd357ad1SPeng Fan },
430*cd357ad1SPeng Fan {MIPI_CSI2_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 62,
431*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
432*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
433*cd357ad1SPeng Fan EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
434*cd357ad1SPeng Fan },
435*cd357ad1SPeng Fan {MIPI_CSI2_ESC_CLK_ROOT, IP_CLOCK_SLICE, 63,
436*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
437*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
438*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
439*cd357ad1SPeng Fan },
440*cd357ad1SPeng Fan {PCIE2_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 64,
441*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
442*cd357ad1SPeng Fan SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
443*cd357ad1SPeng Fan SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
444*cd357ad1SPeng Fan },
445*cd357ad1SPeng Fan {PCIE2_PHY_CLK_ROOT, IP_CLOCK_SLICE, 65,
446*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
447*cd357ad1SPeng Fan EXT_CLK_1, EXT_CLK_2, EXT_CLK_3,
448*cd357ad1SPeng Fan EXT_CLK_4, SYSTEM_PLL1_400M_CLK}
449*cd357ad1SPeng Fan },
450*cd357ad1SPeng Fan {PCIE2_AUX_CLK_ROOT, IP_CLOCK_SLICE, 66,
451*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
452*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK,
453*cd357ad1SPeng Fan SYSTEM_PLL1_80M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
454*cd357ad1SPeng Fan },
455*cd357ad1SPeng Fan {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
456*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
457*cd357ad1SPeng Fan SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
458*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
459*cd357ad1SPeng Fan },
460*cd357ad1SPeng Fan {OLD_MIPI_DSI_ESC_RX_ROOT, IP_CLOCK_SLICE, 68,
461*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
462*cd357ad1SPeng Fan SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
463*cd357ad1SPeng Fan SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK},
464*cd357ad1SPeng Fan },
465*cd357ad1SPeng Fan {DISPLAY_HDMI_CLK_ROOT, IP_CLOCK_SLICE, 69,
466*cd357ad1SPeng Fan {OSC_25M_CLK, SYSTEM_PLL1_200M_CLK, SYSTEM_PLL2_200M_CLK,
467*cd357ad1SPeng Fan VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
468*cd357ad1SPeng Fan SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
469*cd357ad1SPeng Fan },
470*cd357ad1SPeng Fan {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
471*cd357ad1SPeng Fan {DRAM_PLL1_CLK}
472*cd357ad1SPeng Fan },
473*cd357ad1SPeng Fan {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
474*cd357ad1SPeng Fan {DRAM_PLL1_CLK}
475*cd357ad1SPeng Fan },
476*cd357ad1SPeng Fan };
477*cd357ad1SPeng Fan
select(enum clk_root_index clock_id)478*cd357ad1SPeng Fan static int select(enum clk_root_index clock_id)
479*cd357ad1SPeng Fan {
480*cd357ad1SPeng Fan int i, size;
481*cd357ad1SPeng Fan struct clk_root_map *p = root_array;
482*cd357ad1SPeng Fan
483*cd357ad1SPeng Fan size = ARRAY_SIZE(root_array);
484*cd357ad1SPeng Fan
485*cd357ad1SPeng Fan for (i = 0; i < size; i++, p++) {
486*cd357ad1SPeng Fan if (clock_id == p->entry)
487*cd357ad1SPeng Fan return i;
488*cd357ad1SPeng Fan }
489*cd357ad1SPeng Fan
490*cd357ad1SPeng Fan return -EINVAL;
491*cd357ad1SPeng Fan }
492*cd357ad1SPeng Fan
get_clk_root_target(enum clk_slice_type slice_type,u32 slice_index)493*cd357ad1SPeng Fan static void __iomem *get_clk_root_target(enum clk_slice_type slice_type,
494*cd357ad1SPeng Fan u32 slice_index)
495*cd357ad1SPeng Fan {
496*cd357ad1SPeng Fan void __iomem *clk_root_target;
497*cd357ad1SPeng Fan
498*cd357ad1SPeng Fan switch (slice_type) {
499*cd357ad1SPeng Fan case CORE_CLOCK_SLICE:
500*cd357ad1SPeng Fan clk_root_target =
501*cd357ad1SPeng Fan (void __iomem *)&ccm_reg->core_root[slice_index];
502*cd357ad1SPeng Fan break;
503*cd357ad1SPeng Fan case BUS_CLOCK_SLICE:
504*cd357ad1SPeng Fan clk_root_target =
505*cd357ad1SPeng Fan (void __iomem *)&ccm_reg->bus_root[slice_index];
506*cd357ad1SPeng Fan break;
507*cd357ad1SPeng Fan case IP_CLOCK_SLICE:
508*cd357ad1SPeng Fan clk_root_target =
509*cd357ad1SPeng Fan (void __iomem *)&ccm_reg->ip_root[slice_index];
510*cd357ad1SPeng Fan break;
511*cd357ad1SPeng Fan case AHB_CLOCK_SLICE:
512*cd357ad1SPeng Fan clk_root_target =
513*cd357ad1SPeng Fan (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2];
514*cd357ad1SPeng Fan break;
515*cd357ad1SPeng Fan case IPG_CLOCK_SLICE:
516*cd357ad1SPeng Fan clk_root_target =
517*cd357ad1SPeng Fan (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2 + 1];
518*cd357ad1SPeng Fan break;
519*cd357ad1SPeng Fan case CORE_SEL_CLOCK_SLICE:
520*cd357ad1SPeng Fan clk_root_target = (void __iomem *)&ccm_reg->core_sel;
521*cd357ad1SPeng Fan break;
522*cd357ad1SPeng Fan case DRAM_SEL_CLOCK_SLICE:
523*cd357ad1SPeng Fan clk_root_target = (void __iomem *)&ccm_reg->dram_sel;
524*cd357ad1SPeng Fan break;
525*cd357ad1SPeng Fan default:
526*cd357ad1SPeng Fan return NULL;
527*cd357ad1SPeng Fan }
528*cd357ad1SPeng Fan
529*cd357ad1SPeng Fan return clk_root_target;
530*cd357ad1SPeng Fan }
531*cd357ad1SPeng Fan
clock_get_target_val(enum clk_root_index clock_id,u32 * val)532*cd357ad1SPeng Fan int clock_get_target_val(enum clk_root_index clock_id, u32 *val)
533*cd357ad1SPeng Fan {
534*cd357ad1SPeng Fan int root_entry;
535*cd357ad1SPeng Fan struct clk_root_map *p;
536*cd357ad1SPeng Fan void __iomem *clk_root_target;
537*cd357ad1SPeng Fan
538*cd357ad1SPeng Fan if (clock_id >= CLK_ROOT_MAX)
539*cd357ad1SPeng Fan return -EINVAL;
540*cd357ad1SPeng Fan
541*cd357ad1SPeng Fan root_entry = select(clock_id);
542*cd357ad1SPeng Fan if (root_entry < 0)
543*cd357ad1SPeng Fan return -EINVAL;
544*cd357ad1SPeng Fan
545*cd357ad1SPeng Fan p = &root_array[root_entry];
546*cd357ad1SPeng Fan clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
547*cd357ad1SPeng Fan if (!clk_root_target)
548*cd357ad1SPeng Fan return -EINVAL;
549*cd357ad1SPeng Fan
550*cd357ad1SPeng Fan *val = readl(clk_root_target);
551*cd357ad1SPeng Fan
552*cd357ad1SPeng Fan return 0;
553*cd357ad1SPeng Fan }
554*cd357ad1SPeng Fan
clock_set_target_val(enum clk_root_index clock_id,u32 val)555*cd357ad1SPeng Fan int clock_set_target_val(enum clk_root_index clock_id, u32 val)
556*cd357ad1SPeng Fan {
557*cd357ad1SPeng Fan int root_entry;
558*cd357ad1SPeng Fan struct clk_root_map *p;
559*cd357ad1SPeng Fan void __iomem *clk_root_target;
560*cd357ad1SPeng Fan
561*cd357ad1SPeng Fan if (clock_id >= CLK_ROOT_MAX)
562*cd357ad1SPeng Fan return -EINVAL;
563*cd357ad1SPeng Fan
564*cd357ad1SPeng Fan root_entry = select(clock_id);
565*cd357ad1SPeng Fan if (root_entry < 0)
566*cd357ad1SPeng Fan return -EINVAL;
567*cd357ad1SPeng Fan
568*cd357ad1SPeng Fan p = &root_array[root_entry];
569*cd357ad1SPeng Fan clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
570*cd357ad1SPeng Fan if (!clk_root_target)
571*cd357ad1SPeng Fan return -EINVAL;
572*cd357ad1SPeng Fan
573*cd357ad1SPeng Fan writel(val, clk_root_target);
574*cd357ad1SPeng Fan
575*cd357ad1SPeng Fan return 0;
576*cd357ad1SPeng Fan }
577*cd357ad1SPeng Fan
clock_root_enabled(enum clk_root_index clock_id)578*cd357ad1SPeng Fan int clock_root_enabled(enum clk_root_index clock_id)
579*cd357ad1SPeng Fan {
580*cd357ad1SPeng Fan void __iomem *clk_root_target;
581*cd357ad1SPeng Fan u32 slice_index, slice_type;
582*cd357ad1SPeng Fan u32 val;
583*cd357ad1SPeng Fan int root_entry;
584*cd357ad1SPeng Fan
585*cd357ad1SPeng Fan if (clock_id >= CLK_ROOT_MAX)
586*cd357ad1SPeng Fan return -EINVAL;
587*cd357ad1SPeng Fan
588*cd357ad1SPeng Fan root_entry = select(clock_id);
589*cd357ad1SPeng Fan if (root_entry < 0)
590*cd357ad1SPeng Fan return -EINVAL;
591*cd357ad1SPeng Fan
592*cd357ad1SPeng Fan slice_type = root_array[root_entry].slice_type;
593*cd357ad1SPeng Fan slice_index = root_array[root_entry].slice_index;
594*cd357ad1SPeng Fan
595*cd357ad1SPeng Fan if ((slice_type == IPG_CLOCK_SLICE) ||
596*cd357ad1SPeng Fan (slice_type == DRAM_SEL_CLOCK_SLICE) ||
597*cd357ad1SPeng Fan (slice_type == CORE_SEL_CLOCK_SLICE)) {
598*cd357ad1SPeng Fan /*
599*cd357ad1SPeng Fan * Not supported, from CCM doc
600*cd357ad1SPeng Fan * TODO
601*cd357ad1SPeng Fan */
602*cd357ad1SPeng Fan return 0;
603*cd357ad1SPeng Fan }
604*cd357ad1SPeng Fan
605*cd357ad1SPeng Fan clk_root_target = get_clk_root_target(slice_type, slice_index);
606*cd357ad1SPeng Fan if (!clk_root_target)
607*cd357ad1SPeng Fan return -EINVAL;
608*cd357ad1SPeng Fan
609*cd357ad1SPeng Fan val = readl(clk_root_target);
610*cd357ad1SPeng Fan
611*cd357ad1SPeng Fan return (val & CLK_ROOT_ON) ? 1 : 0;
612*cd357ad1SPeng Fan }
613*cd357ad1SPeng Fan
614*cd357ad1SPeng Fan /* CCGR CLK gate operation */
clock_enable(enum clk_ccgr_index index,bool enable)615*cd357ad1SPeng Fan int clock_enable(enum clk_ccgr_index index, bool enable)
616*cd357ad1SPeng Fan {
617*cd357ad1SPeng Fan void __iomem *ccgr;
618*cd357ad1SPeng Fan
619*cd357ad1SPeng Fan if (index >= CCGR_MAX)
620*cd357ad1SPeng Fan return -EINVAL;
621*cd357ad1SPeng Fan
622*cd357ad1SPeng Fan if (enable)
623*cd357ad1SPeng Fan ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_set;
624*cd357ad1SPeng Fan else
625*cd357ad1SPeng Fan ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_clr;
626*cd357ad1SPeng Fan
627*cd357ad1SPeng Fan writel(CCGR_CLK_ON_MASK, ccgr);
628*cd357ad1SPeng Fan
629*cd357ad1SPeng Fan return 0;
630*cd357ad1SPeng Fan }
631*cd357ad1SPeng Fan
clock_get_prediv(enum clk_root_index clock_id,enum root_pre_div * pre_div)632*cd357ad1SPeng Fan int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div)
633*cd357ad1SPeng Fan {
634*cd357ad1SPeng Fan u32 val;
635*cd357ad1SPeng Fan int root_entry;
636*cd357ad1SPeng Fan struct clk_root_map *p;
637*cd357ad1SPeng Fan void __iomem *clk_root_target;
638*cd357ad1SPeng Fan
639*cd357ad1SPeng Fan if (clock_id >= CLK_ROOT_MAX)
640*cd357ad1SPeng Fan return -EINVAL;
641*cd357ad1SPeng Fan
642*cd357ad1SPeng Fan root_entry = select(clock_id);
643*cd357ad1SPeng Fan if (root_entry < 0)
644*cd357ad1SPeng Fan return -EINVAL;
645*cd357ad1SPeng Fan
646*cd357ad1SPeng Fan p = &root_array[root_entry];
647*cd357ad1SPeng Fan
648*cd357ad1SPeng Fan if ((p->slice_type == CORE_CLOCK_SLICE) ||
649*cd357ad1SPeng Fan (p->slice_type == IPG_CLOCK_SLICE) ||
650*cd357ad1SPeng Fan (p->slice_type == CORE_SEL_CLOCK_SLICE) ||
651*cd357ad1SPeng Fan (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
652*cd357ad1SPeng Fan *pre_div = 0;
653*cd357ad1SPeng Fan return 0;
654*cd357ad1SPeng Fan }
655*cd357ad1SPeng Fan
656*cd357ad1SPeng Fan clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
657*cd357ad1SPeng Fan if (!clk_root_target)
658*cd357ad1SPeng Fan return -EINVAL;
659*cd357ad1SPeng Fan
660*cd357ad1SPeng Fan val = readl(clk_root_target);
661*cd357ad1SPeng Fan val &= CLK_ROOT_PRE_DIV_MASK;
662*cd357ad1SPeng Fan val >>= CLK_ROOT_PRE_DIV_SHIFT;
663*cd357ad1SPeng Fan
664*cd357ad1SPeng Fan *pre_div = val;
665*cd357ad1SPeng Fan
666*cd357ad1SPeng Fan return 0;
667*cd357ad1SPeng Fan }
668*cd357ad1SPeng Fan
clock_get_postdiv(enum clk_root_index clock_id,enum root_post_div * post_div)669*cd357ad1SPeng Fan int clock_get_postdiv(enum clk_root_index clock_id,
670*cd357ad1SPeng Fan enum root_post_div *post_div)
671*cd357ad1SPeng Fan {
672*cd357ad1SPeng Fan u32 val, mask;
673*cd357ad1SPeng Fan int root_entry;
674*cd357ad1SPeng Fan struct clk_root_map *p;
675*cd357ad1SPeng Fan void __iomem *clk_root_target;
676*cd357ad1SPeng Fan
677*cd357ad1SPeng Fan if (clock_id >= CLK_ROOT_MAX)
678*cd357ad1SPeng Fan return -EINVAL;
679*cd357ad1SPeng Fan
680*cd357ad1SPeng Fan root_entry = select(clock_id);
681*cd357ad1SPeng Fan if (root_entry < 0)
682*cd357ad1SPeng Fan return -EINVAL;
683*cd357ad1SPeng Fan
684*cd357ad1SPeng Fan p = &root_array[root_entry];
685*cd357ad1SPeng Fan
686*cd357ad1SPeng Fan if ((p->slice_type == CORE_SEL_CLOCK_SLICE) ||
687*cd357ad1SPeng Fan (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
688*cd357ad1SPeng Fan *post_div = 0;
689*cd357ad1SPeng Fan return 0;
690*cd357ad1SPeng Fan }
691*cd357ad1SPeng Fan
692*cd357ad1SPeng Fan clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
693*cd357ad1SPeng Fan if (!clk_root_target)
694*cd357ad1SPeng Fan return -EINVAL;
695*cd357ad1SPeng Fan
696*cd357ad1SPeng Fan if (p->slice_type == IPG_CLOCK_SLICE)
697*cd357ad1SPeng Fan mask = CLK_ROOT_IPG_POST_DIV_MASK;
698*cd357ad1SPeng Fan else if (p->slice_type == CORE_CLOCK_SLICE)
699*cd357ad1SPeng Fan mask = CLK_ROOT_CORE_POST_DIV_MASK;
700*cd357ad1SPeng Fan else
701*cd357ad1SPeng Fan mask = CLK_ROOT_POST_DIV_MASK;
702*cd357ad1SPeng Fan
703*cd357ad1SPeng Fan val = readl(clk_root_target);
704*cd357ad1SPeng Fan val &= mask;
705*cd357ad1SPeng Fan val >>= CLK_ROOT_POST_DIV_SHIFT;
706*cd357ad1SPeng Fan
707*cd357ad1SPeng Fan *post_div = val;
708*cd357ad1SPeng Fan
709*cd357ad1SPeng Fan return 0;
710*cd357ad1SPeng Fan }
711*cd357ad1SPeng Fan
clock_get_src(enum clk_root_index clock_id,enum clk_root_src * p_clock_src)712*cd357ad1SPeng Fan int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src)
713*cd357ad1SPeng Fan {
714*cd357ad1SPeng Fan u32 val;
715*cd357ad1SPeng Fan int root_entry;
716*cd357ad1SPeng Fan struct clk_root_map *p;
717*cd357ad1SPeng Fan void __iomem *clk_root_target;
718*cd357ad1SPeng Fan
719*cd357ad1SPeng Fan if (clock_id >= CLK_ROOT_MAX)
720*cd357ad1SPeng Fan return -EINVAL;
721*cd357ad1SPeng Fan
722*cd357ad1SPeng Fan root_entry = select(clock_id);
723*cd357ad1SPeng Fan if (root_entry < 0)
724*cd357ad1SPeng Fan return -EINVAL;
725*cd357ad1SPeng Fan
726*cd357ad1SPeng Fan p = &root_array[root_entry];
727*cd357ad1SPeng Fan
728*cd357ad1SPeng Fan clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
729*cd357ad1SPeng Fan if (!clk_root_target)
730*cd357ad1SPeng Fan return -EINVAL;
731*cd357ad1SPeng Fan
732*cd357ad1SPeng Fan val = readl(clk_root_target);
733*cd357ad1SPeng Fan val &= CLK_ROOT_SRC_MUX_MASK;
734*cd357ad1SPeng Fan val >>= CLK_ROOT_SRC_MUX_SHIFT;
735*cd357ad1SPeng Fan
736*cd357ad1SPeng Fan *p_clock_src = p->src_mux[val];
737*cd357ad1SPeng Fan
738*cd357ad1SPeng Fan return 0;
739*cd357ad1SPeng Fan }
740