Merge tag 'ti-v2020.07-next' of https://gitlab.denx.de/u-boot/custodians/u-boot-ti...
[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         {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
481          {OSC_24M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
482           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
483           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
484         },
485         {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
486          {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
487           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
488           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
489         },
490         {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
491          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
492           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
493           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
494         },
495 #ifdef CONFIG_IMX8MM
496         {NOC_APB_CLK_ROOT, BUS_CLOCK_SLICE, 11,
497          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL3_CLK,
498           SYSTEM_PLL2_333M_CLK, SYSTEM_PLL2_200M_CLK,
499           SYSTEM_PLL1_800M_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
500         },
501 #endif
502         {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
503          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
504           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_1000M_CLK,
505           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
506         },
507         {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
508          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
509           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
510           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
511         },
512         {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
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_4, AUDIO_PLL2_CLK}
516         },
517         {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
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_3, AUDIO_PLL2_CLK}
521         },
522         {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
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_4, AUDIO_PLL2_CLK}
526         },
527         {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
528          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
529           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
530           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
531         },
532         {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
533          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
534           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
535           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
536         },
537         {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
538          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
539           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
540           SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
541         },
542         {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
543          {DRAM_PLL1_CLK}
544         },
545 };
546 #elif defined(CONFIG_IMX8MP)
547 static struct clk_root_map root_array[] = {
548         {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
549          {OSC_24M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
550           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
551           SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
552         },
553         {ARM_M7_CLK_ROOT, CORE_CLOCK_SLICE, 1,
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         {ML_CLK_ROOT, CORE_CLOCK_SLICE, 2,
559          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
560           VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
561           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
562         },
563         {HSIO_AXI_CLK_ROOT, CORE_CLOCK_SLICE, 7,
564          {OSC_24M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
565           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK, EXT_CLK_2,
566           EXT_CLK_4, AUDIO_PLL2_CLK}
567         },
568         {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
569          {OSC_24M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
570           SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK, AUDIO_PLL1_CLK,
571           VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
572         },
573         {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
574          {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
575           SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK, AUDIO_PLL1_CLK,
576           VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
577         },
578         {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
579          {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
580           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
581           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
582         },
583         {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
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         {NOC_IO_CLK_ROOT, BUS_CLOCK_SLICE, 11,
589          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
590           SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
591           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
592         },
593         {ML_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 12,
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         {ML_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 13,
599          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
600           SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
601           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
602         },
603         {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
604          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
605           SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
606           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
607         },
608         {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
609          {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
610           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_1000M_CLK,
611           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
612         },
613         {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
614          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
615           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
616           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
617         },
618         {MEMREPAIR_CLK_ROOT, IP_CLOCK_SLICE, 6,
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         {I2C5_CLK_ROOT, IP_CLOCK_SLICE, 9,
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         {I2C6_CLK_ROOT, IP_CLOCK_SLICE, 10,
629          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
630           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
631           SYSTEM_PLL1_133M_CLK}
632         },
633         {ENET_QOS_CLK_ROOT, IP_CLOCK_SLICE, 17,
634          {OSC_24M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
635           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
636           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
637         },
638         {ENET_QOS_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 18,
639          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1,
640           EXT_CLK_2, EXT_CLK_3, EXT_CLK_4, VIDEO_PLL_CLK}
641         },
642         {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
643          {OSC_24M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
644           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
645           AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
646         },
647         {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
648          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1,
649           EXT_CLK_2, EXT_CLK_3, EXT_CLK_4, VIDEO_PLL_CLK}
650         },
651         {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
652          {OSC_24M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
653           SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
654           VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
655         },
656         {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
657          {OSC_24M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
658           SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
659           SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
660         },
661         {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
662          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_333M_CLK,
663           SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
664           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
665         },
666         {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
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         {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
672          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
673           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
674           SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
675         },
676         {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
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         {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
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         {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
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         {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
692          {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
693           SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
694           AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
695         },
696         {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
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_4, AUDIO_PLL2_CLK}
700         },
701         {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
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_3, AUDIO_PLL2_CLK}
705         },
706         {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
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_4, AUDIO_PLL2_CLK}
710         },
711         {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
712          {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
713           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
714           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
715         },
716         {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
717          {OSC_24M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
718           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
719           EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
720         },
721         {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
722          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
723           SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
724           EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
725         },
726         {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
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         {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
732          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
733           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
734           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
735         },
736         {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
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         {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
742          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
743           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
744           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
745         },
746         {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
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         {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
752          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
753           SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_2,
754           SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
755         },
756         {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
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_1}
760         },
761         {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
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_2}
765         },
766         {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
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_3}
770         },
771         {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
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_1}
775         },
776         {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
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_2}
780         },
781         {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
782          {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
783           SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
784           SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
785         },
786         {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
787          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
788           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
789           SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
790         },
791         {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
792          {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
793           VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
794           SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
795         },
796         {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
797          {OSC_24M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
798           SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
799           SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
800         },
801         {USDHC3_CLK_ROOT, IP_CLOCK_SLICE, 57,
802          {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
803           SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
804           SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
805         },
806         {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
807          {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
808           SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
809           SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
810         },
811         {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
812          {DRAM_PLL1_CLK}
813         },
814         {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
815          {DRAM_PLL1_CLK}
816         },
817 };
818 #endif
819
820 static int select(enum clk_root_index clock_id)
821 {
822         int i, size;
823         struct clk_root_map *p = root_array;
824
825         size = ARRAY_SIZE(root_array);
826
827         for (i = 0; i < size; i++, p++) {
828                 if (clock_id == p->entry)
829                         return i;
830         }
831
832         return -EINVAL;
833 }
834
835 static void __iomem *get_clk_root_target(enum clk_slice_type slice_type,
836                                          u32 slice_index)
837 {
838         void __iomem *clk_root_target;
839
840         switch (slice_type) {
841         case CORE_CLOCK_SLICE:
842                 clk_root_target =
843                 (void __iomem *)&ccm_reg->core_root[slice_index];
844                 break;
845         case BUS_CLOCK_SLICE:
846                 clk_root_target =
847                         (void __iomem *)&ccm_reg->bus_root[slice_index];
848                 break;
849         case IP_CLOCK_SLICE:
850                 clk_root_target =
851                         (void __iomem *)&ccm_reg->ip_root[slice_index];
852                 break;
853         case AHB_CLOCK_SLICE:
854                 clk_root_target =
855                         (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2];
856                 break;
857         case IPG_CLOCK_SLICE:
858                 clk_root_target =
859                         (void __iomem *)&ccm_reg->ahb_ipg_root[slice_index * 2 + 1];
860                 break;
861         case CORE_SEL_CLOCK_SLICE:
862                 clk_root_target = (void __iomem *)&ccm_reg->core_sel;
863                 break;
864         case DRAM_SEL_CLOCK_SLICE:
865                 clk_root_target = (void __iomem *)&ccm_reg->dram_sel;
866                 break;
867         default:
868                 return NULL;
869         }
870
871         return clk_root_target;
872 }
873
874 int clock_get_target_val(enum clk_root_index clock_id, u32 *val)
875 {
876         int root_entry;
877         struct clk_root_map *p;
878         void __iomem *clk_root_target;
879
880         if (clock_id >= CLK_ROOT_MAX)
881                 return -EINVAL;
882
883         root_entry = select(clock_id);
884         if (root_entry < 0)
885                 return -EINVAL;
886
887         p = &root_array[root_entry];
888         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
889         if (!clk_root_target)
890                 return -EINVAL;
891
892         *val = readl(clk_root_target);
893
894         return 0;
895 }
896
897 int clock_set_target_val(enum clk_root_index clock_id, u32 val)
898 {
899         int root_entry;
900         struct clk_root_map *p;
901         void __iomem *clk_root_target;
902
903         if (clock_id >= CLK_ROOT_MAX)
904                 return -EINVAL;
905
906         root_entry = select(clock_id);
907         if (root_entry < 0)
908                 return -EINVAL;
909
910         p = &root_array[root_entry];
911         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
912         if (!clk_root_target)
913                 return -EINVAL;
914
915         writel(val, clk_root_target);
916
917         return 0;
918 }
919
920 int clock_root_enabled(enum clk_root_index clock_id)
921 {
922         void __iomem *clk_root_target;
923         u32 slice_index, slice_type;
924         u32 val;
925         int root_entry;
926
927         if (clock_id >= CLK_ROOT_MAX)
928                 return -EINVAL;
929
930         root_entry = select(clock_id);
931         if (root_entry < 0)
932                 return -EINVAL;
933
934         slice_type = root_array[root_entry].slice_type;
935         slice_index = root_array[root_entry].slice_index;
936
937         if ((slice_type == IPG_CLOCK_SLICE) ||
938             (slice_type == DRAM_SEL_CLOCK_SLICE) ||
939             (slice_type == CORE_SEL_CLOCK_SLICE)) {
940                 /*
941                  * Not supported, from CCM doc
942                  * TODO
943                  */
944                 return 0;
945         }
946
947         clk_root_target = get_clk_root_target(slice_type, slice_index);
948         if (!clk_root_target)
949                 return -EINVAL;
950
951         val = readl(clk_root_target);
952
953         return (val & CLK_ROOT_ON) ? 1 : 0;
954 }
955
956 /* CCGR CLK gate operation */
957 int clock_enable(enum clk_ccgr_index index, bool enable)
958 {
959         void __iomem *ccgr;
960
961         if (index >= CCGR_MAX)
962                 return -EINVAL;
963
964         if (enable)
965                 ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_set;
966         else
967                 ccgr = (void __iomem *)&ccm_reg->ccgr_array[index].ccgr_clr;
968
969         writel(CCGR_CLK_ON_MASK, ccgr);
970
971         return 0;
972 }
973
974 int clock_get_prediv(enum clk_root_index clock_id, enum root_pre_div *pre_div)
975 {
976         u32 val;
977         int root_entry;
978         struct clk_root_map *p;
979         void __iomem *clk_root_target;
980
981         if (clock_id >= CLK_ROOT_MAX)
982                 return -EINVAL;
983
984         root_entry = select(clock_id);
985         if (root_entry < 0)
986                 return -EINVAL;
987
988         p = &root_array[root_entry];
989
990         if ((p->slice_type == CORE_CLOCK_SLICE) ||
991             (p->slice_type == IPG_CLOCK_SLICE) ||
992             (p->slice_type == CORE_SEL_CLOCK_SLICE) ||
993             (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
994                 *pre_div = 0;
995                 return 0;
996         }
997
998         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
999         if (!clk_root_target)
1000                 return -EINVAL;
1001
1002         val = readl(clk_root_target);
1003         val &= CLK_ROOT_PRE_DIV_MASK;
1004         val >>= CLK_ROOT_PRE_DIV_SHIFT;
1005
1006         *pre_div = val;
1007
1008         return 0;
1009 }
1010
1011 int clock_get_postdiv(enum clk_root_index clock_id,
1012                       enum root_post_div *post_div)
1013 {
1014         u32 val, mask;
1015         int root_entry;
1016         struct clk_root_map *p;
1017         void __iomem *clk_root_target;
1018
1019         if (clock_id >= CLK_ROOT_MAX)
1020                 return -EINVAL;
1021
1022         root_entry = select(clock_id);
1023         if (root_entry < 0)
1024                 return -EINVAL;
1025
1026         p = &root_array[root_entry];
1027
1028         if ((p->slice_type == CORE_SEL_CLOCK_SLICE) ||
1029             (p->slice_type == DRAM_SEL_CLOCK_SLICE)) {
1030                 *post_div = 0;
1031                 return 0;
1032         }
1033
1034         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
1035         if (!clk_root_target)
1036                 return -EINVAL;
1037
1038         if (p->slice_type == IPG_CLOCK_SLICE)
1039                 mask = CLK_ROOT_IPG_POST_DIV_MASK;
1040         else if (p->slice_type == CORE_CLOCK_SLICE)
1041                 mask = CLK_ROOT_CORE_POST_DIV_MASK;
1042         else
1043                 mask = CLK_ROOT_POST_DIV_MASK;
1044
1045         val = readl(clk_root_target);
1046         val &= mask;
1047         val >>= CLK_ROOT_POST_DIV_SHIFT;
1048
1049         *post_div = val;
1050
1051         return 0;
1052 }
1053
1054 int clock_get_src(enum clk_root_index clock_id, enum clk_root_src *p_clock_src)
1055 {
1056         u32 val;
1057         int root_entry;
1058         struct clk_root_map *p;
1059         void __iomem *clk_root_target;
1060
1061         if (clock_id >= CLK_ROOT_MAX)
1062                 return -EINVAL;
1063
1064         root_entry = select(clock_id);
1065         if (root_entry < 0)
1066                 return -EINVAL;
1067
1068         p = &root_array[root_entry];
1069
1070         clk_root_target = get_clk_root_target(p->slice_type, p->slice_index);
1071         if (!clk_root_target)
1072                 return -EINVAL;
1073
1074         val = readl(clk_root_target);
1075         val &= CLK_ROOT_SRC_MUX_MASK;
1076         val >>= CLK_ROOT_SRC_MUX_SHIFT;
1077
1078         *p_clock_src = p->src_mux[val];
1079
1080         return 0;
1081 }