Merge tag 'efi-2020-04-rc1' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / arch / arm / mach-imx / imx8m / clock_slice.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2017 NXP
4  *
5  * Peng Fan <peng.fan@nxp.com>
6  */
7
8 #include <common.h>
9 #include <asm/arch/clock.h>
10 #include <asm/arch/imx-regs.h>
11 #include <asm/io.h>
12 #include <errno.h>
13
14 static struct ccm_reg *ccm_reg = (struct ccm_reg *)CCM_BASE_ADDR;
15
16 #ifdef CONFIG_IMX8MQ
17 static struct clk_root_map root_array[] = {
18         {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
19          {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
20           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
21           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
22         },
23         {ARM_M4_CLK_ROOT, CORE_CLOCK_SLICE, 1,
24          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
25           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
26           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
27         },
28         {VPU_A53_CLK_ROOT, CORE_CLOCK_SLICE, 2,
29          {OSC_25M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
30           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
31           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VPU_PLL_CLK}
32         },
33         {GPU_CORE_CLK_ROOT, CORE_CLOCK_SLICE, 3,
34          {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
35           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
36           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
37         },
38         {GPU_SHADER_CLK_ROOT, CORE_CLOCK_SLICE, 4,
39          {OSC_25M_CLK, GPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
40           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
41           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
42         },
43         {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
44          {OSC_25M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
45           SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK,
46           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
47         },
48         {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
49          {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
50           SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
51           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
52         },
53         {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
54          {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
55           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
56           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
57         },
58         {VPU_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 3,
59          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, VPU_PLL_CLK,
60           AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
61           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_100M_CLK}
62         },
63         {DISPLAY_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 4,
64          {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
65           SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
66           EXT_CLK_1, EXT_CLK_4}
67         },
68         {DISPLAY_APB_CLK_ROOT, BUS_CLOCK_SLICE, 5,
69          {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL1_800M_CLK,
70           SYSTEM_PLL3_CLK, SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK,
71           EXT_CLK_1, EXT_CLK_3}
72         },
73         {DISPLAY_RTRM_CLK_ROOT, BUS_CLOCK_SLICE, 6,
74          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_200M_CLK,
75           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
76           EXT_CLK_2, EXT_CLK_3}
77         },
78         {USB_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 7,
79          {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
80           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
81           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
82         },
83         {GPU_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 8,
84          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
85           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
86           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
87         },
88         {GPU_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 9,
89          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
90           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
91           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
92         },
93         {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
94          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
95           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
96           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
97         },
98         {NOC_APB_CLK_ROOT, BUS_CLOCK_SLICE, 11,
99          {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL3_CLK,
100           SYSTEM_PLL2_333M_CLK, SYSTEM_PLL2_200M_CLK,
101           SYSTEM_PLL1_800M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
102         },
103         {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
104          {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
105           SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
106           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
107         },
108         {IPG_CLK_ROOT, IPG_CLOCK_SLICE, 0,
109          {}
110         },
111         {AUDIO_AHB_CLK_ROOT, AHB_CLOCK_SLICE, 1,
112          {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
113           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_166M_CLK,
114           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
115         },
116         {MIPI_DSI_ESC_RX_CLK_ROOT, AHB_CLOCK_SLICE, 2,
117          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_40M_CLK,
118           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
119           SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL1_CLK },
120         },
121         {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
122          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
123           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_250M_CLK,
124           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
125         },
126         {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
127          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
128           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
129           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
130         },
131         {VPU_G1_CLK_ROOT, IP_CLOCK_SLICE, 2,
132          {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
133           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
134           SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
135         },
136         {VPU_G2_CLK_ROOT, IP_CLOCK_SLICE, 3,
137          {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
138           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_100M_CLK,
139           SYSTEM_PLL2_125M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK}
140         },
141         {DISPLAY_DTRC_CLK_ROOT, IP_CLOCK_SLICE, 4,
142          {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
143           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
144           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
145         },
146         {DISPLAY_DC8000_CLK_ROOT, IP_CLOCK_SLICE, 5,
147          {OSC_25M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
148           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_160M_CLK,
149           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK}
150         },
151         {PCIE1_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 6,
152          {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
153           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
154           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
155         },
156         {PCIE1_PHY_CLK_ROOT, IP_CLOCK_SLICE, 7,
157          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
158           EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
159           SYSTEM_PLL1_400M_CLK}
160         },
161         {PCIE1_AUX_CLK_ROOT, IP_CLOCK_SLICE, 8,
162          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
163           SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
164           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
165         },
166         {DC_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 9,
167          {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
168           AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
169           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
170         },
171         {LCDIF_PIXEL_CLK_ROOT, IP_CLOCK_SLICE, 10,
172          {OSC_25M_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
173           AUDIO_PLL1_CLK, SYSTEM_PLL1_800M_CLK,
174           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
175         },
176         {SAI1_CLK_ROOT, IP_CLOCK_SLICE, 11,
177          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
178           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
179           OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
180         },
181         {SAI2_CLK_ROOT, IP_CLOCK_SLICE, 12,
182          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
183           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
184           OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
185         },
186         {SAI3_CLK_ROOT, IP_CLOCK_SLICE, 13,
187          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
188           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
189           OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
190         },
191         {SAI4_CLK_ROOT, IP_CLOCK_SLICE, 14,
192          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
193           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
194           OSC_27M_CLK, EXT_CLK_1, EXT_CLK_2}
195         },
196         {SAI5_CLK_ROOT, IP_CLOCK_SLICE, 15,
197          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
198           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
199           OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
200         },
201         {SAI6_CLK_ROOT, IP_CLOCK_SLICE, 16,
202          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
203           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
204           OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
205         },
206         {SPDIF1_CLK_ROOT, IP_CLOCK_SLICE, 17,
207          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
208           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
209           OSC_27M_CLK, EXT_CLK_2, EXT_CLK_3}
210         },
211         {SPDIF2_CLK_ROOT, IP_CLOCK_SLICE, 18,
212          {OSC_25M_CLK, AUDIO_PLL1_CLK, AUDIO_PLL2_CLK,
213           VIDEO_PLL_CLK, SYSTEM_PLL1_133M_CLK,
214           OSC_27M_CLK, EXT_CLK_3, EXT_CLK_4}
215         },
216         {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
217          {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
218           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
219           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
220         },
221         {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
222          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK,
223           EXT_CLK_1, EXT_CLK_2, EXT_CLK_3, EXT_CLK_4,
224           VIDEO_PLL_CLK}
225         },
226         {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
227          {OSC_25M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
228           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK,
229           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
230         },
231         {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
232          {OSC_25M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
233           SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
234           SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
235         },
236         {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
237          {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
238           SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
239           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
240         },
241         {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
242          {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
243           SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
244           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
245         },
246         {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
247          {OSC_25M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
248           SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
249           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
250         },
251         {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
252          {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
253           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
254           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
255         },
256         {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
257          {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
258           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
259           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
260         },
261         {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
262          {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
263           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
264           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
265         },
266         {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
267          {OSC_25M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
268           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
269           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
270         },
271         {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
272          {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
273           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
274           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
275         },
276         {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
277          {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
278           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
279           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
280         },
281         {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
282          {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
283           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
284           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
285         },
286         {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
287          {OSC_25M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
288           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
289           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
290         },
291         {USB_CORE_REF_CLK_ROOT, IP_CLOCK_SLICE, 34,
292          {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
293           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
294           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
295         },
296         {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
297          {OSC_25M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
298           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
299           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
300         },
301         {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
302          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
303           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
304           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
305         },
306         {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
307          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
308           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
309           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
310         },
311         {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
312          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
313           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
314           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
315         },
316         {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
317          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
318           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
319           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
320         },
321         {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
322          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
323           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
324           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
325         },
326         {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
327          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
328           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
329           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
330         },
331         {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
332          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
333           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
334           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
335         },
336         {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
337          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
338           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
339           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
340         },
341         {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
342          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
343           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
344           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
345         },
346         {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
347          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
348           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
349           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
350         },
351         {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
352          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
353           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
354           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
355         },
356         {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
357          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
358           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
359           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
360         },
361         {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
362          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
363           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
364           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
365         },
366         {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
367          {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
368           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
369           SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
370         },
371         {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
372          {OSC_25M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
373           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
374           SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
375         },
376         {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
377          {OSC_25M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
378           SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
379           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
380         },
381         {IPP_DO_CLKO1, IP_CLOCK_SLICE, 52,
382          {OSC_25M_CLK, SYSTEM_PLL1_800M_CLK, OSC_27M_CLK,
383           SYSTEM_PLL1_200M_CLK, AUDIO_PLL2_CLK,
384           SYSTEM_PLL2_500M_CLK, VPU_PLL_CLK, SYSTEM_PLL1_80M_CLK}
385         },
386         {IPP_DO_CLKO2, IP_CLOCK_SLICE, 53,
387          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_400M_CLK,
388           SYSTEM_PLL2_166M_CLK, SYSTEM_PLL3_CLK,
389           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, OSC_32K_CLK}
390         },
391         {MIPI_DSI_CORE_CLK_ROOT, IP_CLOCK_SLICE, 54,
392          {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
393           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
394           SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
395         },
396         {MIPI_DSI_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 55,
397          {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
398           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
399           EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
400         },
401         {MIPI_DSI_DBI_CLK_ROOT, IP_CLOCK_SLICE, 56,
402          {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_100M_CLK,
403           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
404           SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
405         },
406         {OLD_MIPI_DSI_ESC_CLK_ROOT, IP_CLOCK_SLICE, 57,
407          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
408           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
409           SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
410         },
411         {MIPI_CSI1_CORE_CLK_ROOT, IP_CLOCK_SLICE, 58,
412          {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
413           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
414           SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
415         },
416         {MIPI_CSI1_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 59,
417          {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
418           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
419           EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
420         },
421         {MIPI_CSI1_ESC_CLK_ROOT, IP_CLOCK_SLICE, 60,
422          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
423           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
424           SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
425         },
426         {MIPI_CSI2_CORE_CLK_ROOT, IP_CLOCK_SLICE, 61,
427          {OSC_25M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_250M_CLK,
428           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
429           SYSTEM_PLL3_CLK, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
430         },
431         {MIPI_CSI2_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 62,
432          {OSC_25M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_100M_CLK,
433           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
434           EXT_CLK_2, AUDIO_PLL2_CLK, VIDEO_PLL_CLK}
435         },
436         {MIPI_CSI2_ESC_CLK_ROOT, IP_CLOCK_SLICE, 63,
437          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
438           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
439           SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK}
440         },
441         {PCIE2_CTRL_CLK_ROOT, IP_CLOCK_SLICE, 64,
442          {OSC_25M_CLK, SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK,
443           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
444           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL3_CLK}
445         },
446         {PCIE2_PHY_CLK_ROOT, IP_CLOCK_SLICE, 65,
447          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_500M_CLK,
448           EXT_CLK_1, EXT_CLK_2, EXT_CLK_3,
449           EXT_CLK_4, SYSTEM_PLL1_400M_CLK}
450         },
451         {PCIE2_AUX_CLK_ROOT, IP_CLOCK_SLICE, 66,
452          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_50M_CLK,
453           SYSTEM_PLL3_CLK, SYSTEM_PLL2_100M_CLK,
454           SYSTEM_PLL1_80M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_200M_CLK}
455         },
456         {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
457          {OSC_25M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
458           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
459           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
460         },
461         {OLD_MIPI_DSI_ESC_RX_ROOT, IP_CLOCK_SLICE, 68,
462          {OSC_25M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_80M_CLK,
463           SYSTEM_PLL1_800M_CLK, SYSTEM_PLL2_1000M_CLK,
464           SYSTEM_PLL3_CLK, EXT_CLK_3, AUDIO_PLL2_CLK},
465         },
466         {DISPLAY_HDMI_CLK_ROOT, IP_CLOCK_SLICE, 69,
467          {OSC_25M_CLK, SYSTEM_PLL1_200M_CLK, SYSTEM_PLL2_200M_CLK,
468           VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
469           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_4}
470         },
471         {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
472          {DRAM_PLL1_CLK}
473         },
474         {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
475          {DRAM_PLL1_CLK}
476         },
477 };
478 #elif defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN)
479 static struct clk_root_map root_array[] = {
480         {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
481          {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
482           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
483           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
484         },
485         {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
486          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
487           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
488           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
489         },
490 #ifdef CONFIG_IMX8MM
491         {NOC_APB_CLK_ROOT, BUS_CLOCK_SLICE, 11,
492          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL3_CLK,
493           SYSTEM_PLL2_333M_CLK, SYSTEM_PLL2_200M_CLK,
494           SYSTEM_PLL1_800M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
495         },
496 #endif
497         {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
498          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
499           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_1000M_CLK,
500           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
501         },
502         {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
503          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
504           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
505           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
506         },
507         {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
508          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
509           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
510           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
511         },
512         {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
513          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
514           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
515           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
516         },
517         {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
518          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
519           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
520           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
521         },
522         {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
523          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
524           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
525           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
526         },
527         {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
528          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
529           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
530           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
531         },
532         {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
533          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
534           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
535           SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
536         },
537         {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
538          {DRAM_PLL1_CLK}
539         },
540 };
541 #elif defined(CONFIG_IMX8MP)
542 static struct clk_root_map root_array[] = {
543         {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
544          {OSC_24M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
545           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
546           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
547         },
548         {ARM_M7_CLK_ROOT, CORE_CLOCK_SLICE, 1,
549          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
550           VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
551           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
552         },
553         {ML_CLK_ROOT, CORE_CLOCK_SLICE, 2,
554          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
555           VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
556           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
557         },
558         {HSIO_AXI_CLK_ROOT, CORE_CLOCK_SLICE, 7,
559          {OSC_24M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
560           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK, EXT_CLK_2,
561           EXT_CLK_4, AUDIO_PLL2_CLK}
562         },
563         {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
564          {OSC_24M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
565           SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK, AUDIO_PLL1_CLK,
566           VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
567         },
568         {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
569          {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
570           SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK, AUDIO_PLL1_CLK,
571           VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
572         },
573         {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
574          {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
575           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
576           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
577         },
578         {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
579          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
580           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
581           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
582         },
583         {NOC_IO_CLK_ROOT, BUS_CLOCK_SLICE, 11,
584          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
585           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
586           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
587         },
588         {ML_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 12,
589          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
590           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
591           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
592         },
593         {ML_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 13,
594          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
595           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
596           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
597         },
598         {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
599          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
600           SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
601           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
602         },
603         {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
604          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
605           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_1000M_CLK,
606           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
607         },
608         {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
609          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
610           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
611           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
612         },
613         {MEMREPAIR_CLK_ROOT, IP_CLOCK_SLICE, 6,
614          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
615           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
616           SYSTEM_PLL1_133M_CLK}
617         },
618         {I2C5_CLK_ROOT, IP_CLOCK_SLICE, 9,
619          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
620           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
621           SYSTEM_PLL1_133M_CLK}
622         },
623         {I2C6_CLK_ROOT, IP_CLOCK_SLICE, 10,
624          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
625           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
626           SYSTEM_PLL1_133M_CLK}
627         },
628         {ENET_QOS_CLK_ROOT, IP_CLOCK_SLICE, 17,
629          {OSC_24M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
630           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
631           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
632         },
633         {ENET_QOS_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 18,
634          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1,
635           EXT_CLK_2, EXT_CLK_3, EXT_CLK_4, VIDEO_PLL_CLK}
636         },
637         {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
638          {OSC_24M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
639           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
640           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
641         },
642         {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
643          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1,
644           EXT_CLK_2, EXT_CLK_3, EXT_CLK_4, VIDEO_PLL_CLK}
645         },
646         {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
647          {OSC_24M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
648           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
649           VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
650         },
651         {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
652          {OSC_24M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
653           SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
654           SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
655         },
656         {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
657          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_333M_CLK,
658           SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
659           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
660         },
661         {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
662          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
663           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
664           SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
665         },
666         {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
667          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
668           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
669           SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
670         },
671         {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
672          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
673           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
674           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
675         },
676         {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
677          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
678           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
679           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
680         },
681         {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
682          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
683           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
684           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
685         },
686         {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
687          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
688           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
689           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
690         },
691         {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
692          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
693           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
694           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
695         },
696         {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
697          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
698           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
699           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
700         },
701         {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
702          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
703           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
704           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
705         },
706         {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
707          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
708           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
709           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
710         },
711         {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
712          {OSC_24M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
713           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
714           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
715         },
716         {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
717          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
718           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
719           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
720         },
721         {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
722          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
723           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
724           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
725         },
726         {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
727          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
728           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
729           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
730         },
731         {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
732          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
733           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
734           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
735         },
736         {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
737          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
738           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
739           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
740         },
741         {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
742          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
743           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_2,
744           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
745         },
746         {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
747          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
748           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_2,
749           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
750         },
751         {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
752          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
753           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
754           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
755         },
756         {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
757          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
758           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
759           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
760         },
761         {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
762          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
763           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
764           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
765         },
766         {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
767          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
768           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
769           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
770         },
771         {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
772          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
773           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
774           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
775         },
776         {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
777          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
778           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
779           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
780         },
781         {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
782          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
783           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
784           SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
785         },
786         {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
787          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
788           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
789           SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
790         },
791         {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
792          {OSC_24M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
793           SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
794           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
795         },
796         {USDHC3_CLK_ROOT, IP_CLOCK_SLICE, 57,
797          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
798           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
799           SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
800         },
801         {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
802          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
803           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
804           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
805         },
806         {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
807          {DRAM_PLL1_CLK}
808         },
809         {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
810          {DRAM_PLL1_CLK}
811         },
812 };
813 #endif
814
815 static int select(enum clk_root_index clock_id)
816 {
817         int i, size;
818         struct clk_root_map *p = root_array;
819
820         size = ARRAY_SIZE(root_array);
821
822         for (i = 0; i < size; i++, p++) {
823                 if (clock_id == p->entry)
824                         return i;
825         }
826
827         return -EINVAL;
828 }
829
830 static void __iomem *get_clk_root_target(enum clk_slice_type slice_type,
831                                          u32 slice_index)
832 {
833         void __iomem *clk_root_target;
834
835         switch (slice_type) {
836         case CORE_CLOCK_SLICE:
837                 clk_root_target =
838                 (void __iomem *)&ccm_reg->core_root[slice_index];
839                 break;
840         case BUS_CLOCK_SLICE:
841                 clk_root_target =
842                         (void __iomem *)&ccm_reg->bus_root[slice_index];
843                 break;
844         case IP_CLOCK_SLICE:
845                 clk_root_target =
846                         (void __iomem *)&ccm_reg->ip_root[slice_index];
847                 break;
848         case AHB_CLOCK_SLICE:
849                 clk_root_target =
850                         (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2];
851                 break;
852         case IPG_CLOCK_SLICE:
853                 clk_root_target =
854                         (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2 + 1];
855                 break;
856         case CORE_SEL_CLOCK_SLICE:
857                 clk_root_target = (void __iomem *)&ccm_reg->core_sel;
858                 break;
859         case DRAM_SEL_CLOCK_SLICE:
860                 clk_root_target = (void __iomem *)&ccm_reg->dram_sel;
861                 break;
862         default:
863                 return NULL;
864         }
865
866         return clk_root_target;
867 }
868
869 int clock_get_target_val(enum clk_root_index clock_id, u32 *val)
870 {
871         int root_entry;
872         struct clk_root_map *p;
873         void __iomem *clk_root_target;
874
875         if (clock_id >= CLK_ROOT_MAX)
876                 return -EINVAL;
877
878         root_entry = select(clock_id);
879         if (root_entry < 0)
880                 return -EINVAL;
881
882         p = &root_array[root_entry];
883         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
884         if (!clk_root_target)
885                 return -EINVAL;
886
887         *val = readl(clk_root_target);
888
889         return 0;
890 }
891
892 int clock_set_target_val(enum clk_root_index clock_id, u32 val)
893 {
894         int root_entry;
895         struct clk_root_map *p;
896         void __iomem *clk_root_target;
897
898         if (clock_id >= CLK_ROOT_MAX)
899                 return -EINVAL;
900
901         root_entry = select(clock_id);
902         if (root_entry < 0)
903                 return -EINVAL;
904
905         p = &root_array[root_entry];
906         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
907         if (!clk_root_target)
908                 return -EINVAL;
909
910         writel(val, clk_root_target);
911
912         return 0;
913 }
914
915 int clock_root_enabled(enum clk_root_index clock_id)
916 {
917         void __iomem *clk_root_target;
918         u32 slice_index, slice_type;
919         u32 val;
920         int root_entry;
921
922         if (clock_id >= CLK_ROOT_MAX)
923                 return -EINVAL;
924
925         root_entry = select(clock_id);
926         if (root_entry < 0)
927                 return -EINVAL;
928
929         slice_type = root_array[root_entry].slice_type;
930         slice_index = root_array[root_entry].slice_index;
931
932         if ((slice_type == IPG_CLOCK_SLICE) ||
933             (slice_type == DRAM_SEL_CLOCK_SLICE) ||
934             (slice_type == CORE_SEL_CLOCK_SLICE)) {
935                 /*
936                  * Not supported, from CCM doc
937                  * TODO
938                  */
939                 return 0;
940         }
941
942         clk_root_target = get_clk_root_target(slice_type, slice_index);
943         if (!clk_root_target)
944                 return -EINVAL;
945
946         val = readl(clk_root_target);
947
948         return (val & CLK_ROOT_ON) ? 1 : 0;
949 }
950
951 /* CCGR CLK gate operation */
952 int clock_enable(enum clk_ccgr_index index, bool enable)
953 {
954         void __iomem *ccgr;
955
956         if (index >= CCGR_MAX)
957                 return -EINVAL;
958
959         if (enable)
960                 ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_set;
961         else
962                 ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_clr;
963
964         writel(CCGR_CLK_ON_MASK, ccgr);
965
966         return 0;
967 }
968
969 int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div)
970 {
971         u32 val;
972         int root_entry;
973         struct clk_root_map *p;
974         void __iomem *clk_root_target;
975
976         if (clock_id >= CLK_ROOT_MAX)
977                 return -EINVAL;
978
979         root_entry = select(clock_id);
980         if (root_entry < 0)
981                 return -EINVAL;
982
983         p = &root_array[root_entry];
984
985         if ((p->slice_type == CORE_CLOCK_SLICE) ||
986             (p->slice_type == IPG_CLOCK_SLICE) ||
987             (p->slice_type == CORE_SEL_CLOCK_SLICE) ||
988             (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
989                 *pre_div = 0;
990                 return 0;
991         }
992
993         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
994         if (!clk_root_target)
995                 return -EINVAL;
996
997         val = readl(clk_root_target);
998         val &= CLK_ROOT_PRE_DIV_MASK;
999         val >>= CLK_ROOT_PRE_DIV_SHIFT;
1000
1001         *pre_div = val;
1002
1003         return 0;
1004 }
1005
1006 int clock_get_postdiv(enum clk_root_index clock_id,
1007                       enum root_post_div *post_div)
1008 {
1009         u32 val, mask;
1010         int root_entry;
1011         struct clk_root_map *p;
1012         void __iomem *clk_root_target;
1013
1014         if (clock_id >= CLK_ROOT_MAX)
1015                 return -EINVAL;
1016
1017         root_entry = select(clock_id);
1018         if (root_entry < 0)
1019                 return -EINVAL;
1020
1021         p = &root_array[root_entry];
1022
1023         if ((p->slice_type == CORE_SEL_CLOCK_SLICE) ||
1024             (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
1025                 *post_div = 0;
1026                 return 0;
1027         }
1028
1029         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
1030         if (!clk_root_target)
1031                 return -EINVAL;
1032
1033         if (p->slice_type == IPG_CLOCK_SLICE)
1034                 mask = CLK_ROOT_IPG_POST_DIV_MASK;
1035         else if (p->slice_type == CORE_CLOCK_SLICE)
1036                 mask = CLK_ROOT_CORE_POST_DIV_MASK;
1037         else
1038                 mask = CLK_ROOT_POST_DIV_MASK;
1039
1040         val = readl(clk_root_target);
1041         val &= mask;
1042         val >>= CLK_ROOT_POST_DIV_SHIFT;
1043
1044         *post_div = val;
1045
1046         return 0;
1047 }
1048
1049 int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src)
1050 {
1051         u32 val;
1052         int root_entry;
1053         struct clk_root_map *p;
1054         void __iomem *clk_root_target;
1055
1056         if (clock_id >= CLK_ROOT_MAX)
1057                 return -EINVAL;
1058
1059         root_entry = select(clock_id);
1060         if (root_entry < 0)
1061                 return -EINVAL;
1062
1063         p = &root_array[root_entry];
1064
1065         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
1066         if (!clk_root_target)
1067                 return -EINVAL;
1068
1069         val = readl(clk_root_target);
1070         val &= CLK_ROOT_SRC_MUX_MASK;
1071         val >>= CLK_ROOT_SRC_MUX_SHIFT;
1072
1073         *p_clock_src = p->src_mux[val];
1074
1075         return 0;
1076 }