imx6_ccm.c revision 1.1 1 1.1 skrll /* $NetBSD: imx6_ccm.c,v 1.1 2020/12/23 14:42:38 skrll Exp $ */
2 1.1 skrll
3 1.1 skrll /*
4 1.1 skrll * Copyright (c) 2010-2012, 2014 Genetec Corporation. All rights reserved.
5 1.1 skrll * Written by Hashimoto Kenichi for Genetec Corporation.
6 1.1 skrll *
7 1.1 skrll * Redistribution and use in source and binary forms, with or without
8 1.1 skrll * modification, are permitted provided that the following conditions
9 1.1 skrll * are met:
10 1.1 skrll * 1. Redistributions of source code must retain the above copyright
11 1.1 skrll * notice, this list of conditions and the following disclaimer.
12 1.1 skrll * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 skrll * notice, this list of conditions and the following disclaimer in the
14 1.1 skrll * documentation and/or other materials provided with the distribution.
15 1.1 skrll *
16 1.1 skrll * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
17 1.1 skrll * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 skrll * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 skrll * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
20 1.1 skrll * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 skrll * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 skrll * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 skrll * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 skrll * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 skrll * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 skrll * POSSIBILITY OF SUCH DAMAGE.
27 1.1 skrll */
28 1.1 skrll /*
29 1.1 skrll * Clock Controller Module (CCM) for i.MX6
30 1.1 skrll */
31 1.1 skrll
32 1.1 skrll #include <sys/cdefs.h>
33 1.1 skrll __KERNEL_RCSID(0, "$NetBSD: imx6_ccm.c,v 1.1 2020/12/23 14:42:38 skrll Exp $");
34 1.1 skrll
35 1.1 skrll #include "opt_imx.h"
36 1.1 skrll #include "opt_cputypes.h"
37 1.1 skrll
38 1.1 skrll #include "locators.h"
39 1.1 skrll
40 1.1 skrll #include <sys/types.h>
41 1.1 skrll #include <sys/time.h>
42 1.1 skrll #include <sys/bus.h>
43 1.1 skrll #include <sys/device.h>
44 1.1 skrll #include <sys/sysctl.h>
45 1.1 skrll #include <sys/cpufreq.h>
46 1.1 skrll #include <sys/malloc.h>
47 1.1 skrll #include <sys/param.h>
48 1.1 skrll
49 1.1 skrll #include <machine/cpu.h>
50 1.1 skrll
51 1.1 skrll #include <arm/nxp/imx6_ccmvar.h>
52 1.1 skrll #include <arm/nxp/imx6_ccmreg.h>
53 1.1 skrll
54 1.1 skrll #include <dev/clk/clk_backend.h>
55 1.1 skrll
56 1.1 skrll /* Clock Parents Tables */
57 1.1 skrll static const char *step_p[] = {
58 1.1 skrll "osc",
59 1.1 skrll "pll2_pfd2_396m"
60 1.1 skrll };
61 1.1 skrll
62 1.1 skrll static const char *pll1_sw_p[] = {
63 1.1 skrll "pll1_sys",
64 1.1 skrll "step"
65 1.1 skrll };
66 1.1 skrll
67 1.1 skrll static const char *periph_pre_p[] = {
68 1.1 skrll "pll2_bus",
69 1.1 skrll "pll2_pfd2_396m",
70 1.1 skrll "pll2_pfd0_352m",
71 1.1 skrll "pll2_198m"
72 1.1 skrll };
73 1.1 skrll
74 1.1 skrll static const char *periph_clk2_p[] = {
75 1.1 skrll "pll3_usb_otg",
76 1.1 skrll "osc",
77 1.1 skrll "osc",
78 1.1 skrll "dummy"
79 1.1 skrll };
80 1.1 skrll
81 1.1 skrll static const char *periph2_clk2_p[] = {
82 1.1 skrll "pll3_usb_otg",
83 1.1 skrll "pll2_bus"
84 1.1 skrll };
85 1.1 skrll
86 1.1 skrll static const char *axi_p[] = {
87 1.1 skrll "periph",
88 1.1 skrll "pll2_pfd2_396m",
89 1.1 skrll "periph",
90 1.1 skrll "pll3_pfd1_540m"
91 1.1 skrll };
92 1.1 skrll
93 1.1 skrll static const char *audio_p[] = {
94 1.1 skrll "pll4_audio_div",
95 1.1 skrll "pll3_pfd2_508m",
96 1.1 skrll "pll3_pfd3_454m",
97 1.1 skrll "pll3_usb_otg"
98 1.1 skrll };
99 1.1 skrll
100 1.1 skrll static const char *gpu2d_core_p[] = {
101 1.1 skrll "axi",
102 1.1 skrll "pll3_usb_otg",
103 1.1 skrll "pll2_pfd0_352m",
104 1.1 skrll "pll2_pfd2_396m"
105 1.1 skrll };
106 1.1 skrll
107 1.1 skrll static const char *gpu3d_core_p[] = {
108 1.1 skrll "mmdc_ch0_axi",
109 1.1 skrll "pll3_usb_otg",
110 1.1 skrll "pll2_pfd1_594m",
111 1.1 skrll "pll2_pfd2_396m"
112 1.1 skrll };
113 1.1 skrll
114 1.1 skrll static const char *gpu3d_shader_p[] = {
115 1.1 skrll "mmdc_ch0_axi",
116 1.1 skrll "pll3_usb_otg",
117 1.1 skrll "pll2_pfd1_594m",
118 1.1 skrll "pll3_pfd0_720m"
119 1.1 skrll };
120 1.1 skrll
121 1.1 skrll static const char *ipu_p[] = {
122 1.1 skrll "mmdc_ch0_axi",
123 1.1 skrll "pll2_pfd2_396m",
124 1.1 skrll "pll3_120m",
125 1.1 skrll "pll3_pfd1_540m"
126 1.1 skrll };
127 1.1 skrll
128 1.1 skrll static const char *pll_bypass_src_p[] = {
129 1.1 skrll "osc",
130 1.1 skrll "lvds1_in",
131 1.1 skrll "lvds2_in",
132 1.1 skrll "dummy"
133 1.1 skrll };
134 1.1 skrll
135 1.1 skrll static const char *pll1_bypass_p[] = {
136 1.1 skrll "pll1",
137 1.1 skrll "pll1_bypass_src"
138 1.1 skrll };
139 1.1 skrll
140 1.1 skrll static const char *pll2_bypass_p[] = {
141 1.1 skrll "pll2",
142 1.1 skrll "pll2_bypass_src"
143 1.1 skrll };
144 1.1 skrll
145 1.1 skrll static const char *pll3_bypass_p[] = {
146 1.1 skrll "pll3",
147 1.1 skrll "pll3_bypass_src"
148 1.1 skrll };
149 1.1 skrll
150 1.1 skrll static const char *pll4_bypass_p[] = {
151 1.1 skrll "pll4",
152 1.1 skrll "pll4_bypass_src"
153 1.1 skrll };
154 1.1 skrll
155 1.1 skrll static const char *pll5_bypass_p[] = {
156 1.1 skrll "pll5",
157 1.1 skrll "pll5_bypass_src"
158 1.1 skrll };
159 1.1 skrll
160 1.1 skrll static const char *pll6_bypass_p[] = {
161 1.1 skrll "pll6",
162 1.1 skrll "pll6_bypass_src"
163 1.1 skrll };
164 1.1 skrll
165 1.1 skrll static const char *pll7_bypass_p[] = {
166 1.1 skrll "pll7",
167 1.1 skrll "pll7_bypass_src"
168 1.1 skrll };
169 1.1 skrll
170 1.1 skrll static const char *ipu_di_pre_p[] = {
171 1.1 skrll "mmdc_ch0_axi",
172 1.1 skrll "pll3_usb_otg",
173 1.1 skrll "pll5_video_div",
174 1.1 skrll "pll2_pfd0_352m",
175 1.1 skrll "pll2_pfd2_396m",
176 1.1 skrll "pll3_pfd1_540m"
177 1.1 skrll };
178 1.1 skrll
179 1.1 skrll static const char *ipu1_di0_p[] = {
180 1.1 skrll "ipu1_di0_pre",
181 1.1 skrll "dummy",
182 1.1 skrll "dummy",
183 1.1 skrll "ldb_di0",
184 1.1 skrll "ldb_di1"
185 1.1 skrll };
186 1.1 skrll
187 1.1 skrll static const char *ipu1_di1_p[] = {
188 1.1 skrll "ipu1_di1_pre",
189 1.1 skrll "dummy",
190 1.1 skrll "dummy",
191 1.1 skrll "ldb_di0",
192 1.1 skrll "ldb_di1"
193 1.1 skrll };
194 1.1 skrll
195 1.1 skrll static const char *ipu2_di0_p[] = {
196 1.1 skrll "ipu2_di0_pre",
197 1.1 skrll "dummy",
198 1.1 skrll "dummy",
199 1.1 skrll "ldb_di0",
200 1.1 skrll "ldb_di1"
201 1.1 skrll };
202 1.1 skrll
203 1.1 skrll static const char *ipu2_di1_p[] = {
204 1.1 skrll "ipu2_di1_pre",
205 1.1 skrll "dummy",
206 1.1 skrll "dummy",
207 1.1 skrll "ldb_di0",
208 1.1 skrll "ldb_di1"
209 1.1 skrll };
210 1.1 skrll
211 1.1 skrll static const char *ldb_di_p[] = {
212 1.1 skrll "pll5_video_div",
213 1.1 skrll "pll2_pfd0_352m",
214 1.1 skrll "pll2_pfd2_396m",
215 1.1 skrll "mmdc_ch1_axi",
216 1.1 skrll "pll3_usb_otg"
217 1.1 skrll };
218 1.1 skrll
219 1.1 skrll static const char *periph_p[] = {
220 1.1 skrll "periph_pre",
221 1.1 skrll "periph_clk2"
222 1.1 skrll };
223 1.1 skrll
224 1.1 skrll static const char *periph2_p[] = {
225 1.1 skrll "periph2_pre",
226 1.1 skrll "periph2_clk2"
227 1.1 skrll };
228 1.1 skrll
229 1.1 skrll static const char *vdo_axi_p[] = {
230 1.1 skrll "axi",
231 1.1 skrll "ahb"
232 1.1 skrll };
233 1.1 skrll
234 1.1 skrll static const char *vpu_axi_p[] = {
235 1.1 skrll "axi",
236 1.1 skrll "pll2_pfd2_396m",
237 1.1 skrll "pll2_pfd0_352m"
238 1.1 skrll };
239 1.1 skrll
240 1.1 skrll static const char *cko1_p[] = {
241 1.1 skrll "pll3_usb_otg",
242 1.1 skrll "pll2_bus",
243 1.1 skrll "pll1_sys",
244 1.1 skrll "pll5_video_div",
245 1.1 skrll "dummy",
246 1.1 skrll "axi",
247 1.1 skrll "enfc",
248 1.1 skrll "ipu1_di0",
249 1.1 skrll "ipu1_di1",
250 1.1 skrll "ipu2_di0",
251 1.1 skrll "ipu2_di1",
252 1.1 skrll "ahb",
253 1.1 skrll "ipg",
254 1.1 skrll "ipg_per",
255 1.1 skrll "ckil",
256 1.1 skrll "pll4_audio_div"
257 1.1 skrll };
258 1.1 skrll
259 1.1 skrll static const char *cko2_p[] = {
260 1.1 skrll "mmdc_ch0_axi",
261 1.1 skrll "mmdc_ch1_axi",
262 1.1 skrll "usdhc4",
263 1.1 skrll "usdhc1",
264 1.1 skrll "gpu2d_axi",
265 1.1 skrll "dummy",
266 1.1 skrll "ecspi_root",
267 1.1 skrll "gpu3d_axi",
268 1.1 skrll "usdhc3",
269 1.1 skrll "dummy",
270 1.1 skrll "arm",
271 1.1 skrll "ipu1",
272 1.1 skrll "ipu2",
273 1.1 skrll "vdo_axi",
274 1.1 skrll "osc",
275 1.1 skrll "gpu2d_core",
276 1.1 skrll "gpu3d_core",
277 1.1 skrll "usdhc2",
278 1.1 skrll "ssi1",
279 1.1 skrll "ssi2",
280 1.1 skrll "ssi3",
281 1.1 skrll "gpu3d_shader",
282 1.1 skrll "vpu_axi",
283 1.1 skrll "can_root",
284 1.1 skrll "ldb_di0",
285 1.1 skrll "ldb_di1",
286 1.1 skrll "esai_extal",
287 1.1 skrll "eim_slow",
288 1.1 skrll "uart_serial",
289 1.1 skrll "spdif",
290 1.1 skrll "asrc",
291 1.1 skrll "hsi_tx"
292 1.1 skrll };
293 1.1 skrll
294 1.1 skrll static const char *cko_p[] = {
295 1.1 skrll "cko1",
296 1.1 skrll "cko2"
297 1.1 skrll };
298 1.1 skrll
299 1.1 skrll static const char *hsi_tx_p[] = {
300 1.1 skrll "pll3_120m",
301 1.1 skrll "pll2_pfd2_396m"
302 1.1 skrll };
303 1.1 skrll
304 1.1 skrll static const char *pcie_axi_p[] = {
305 1.1 skrll "axi",
306 1.1 skrll "ahb"
307 1.1 skrll };
308 1.1 skrll
309 1.1 skrll static const char *ssi_p[] = {
310 1.1 skrll "pll3_pfd2_508m",
311 1.1 skrll "pll3_pfd3_454m",
312 1.1 skrll "pll4_audio_div"
313 1.1 skrll };
314 1.1 skrll
315 1.1 skrll static const char *usdhc_p[] = {
316 1.1 skrll "pll2_pfd2_396m",
317 1.1 skrll "pll2_pfd0_352m"
318 1.1 skrll };
319 1.1 skrll
320 1.1 skrll static const char *eim_p[] = {
321 1.1 skrll "pll2_pfd2_396m",
322 1.1 skrll "pll3_usb_otg",
323 1.1 skrll "axi",
324 1.1 skrll "pll2_pfd0_352m"
325 1.1 skrll };
326 1.1 skrll
327 1.1 skrll static const char *eim_slow_p[] = {
328 1.1 skrll "axi",
329 1.1 skrll "pll3_usb_otg",
330 1.1 skrll "pll2_pfd2_396m",
331 1.1 skrll "pll2_pfd0_352m"
332 1.1 skrll };
333 1.1 skrll
334 1.1 skrll static const char *enfc_p[] = {
335 1.1 skrll "pll2_pfd0_352m",
336 1.1 skrll "pll2_bus",
337 1.1 skrll "pll3_usb_otg",
338 1.1 skrll "pll2_pfd2_396m"
339 1.1 skrll };
340 1.1 skrll
341 1.1 skrll static const char *lvds_p[] = {
342 1.1 skrll "dummy",
343 1.1 skrll "dummy",
344 1.1 skrll "dummy",
345 1.1 skrll "dummy",
346 1.1 skrll "dummy",
347 1.1 skrll "dummy",
348 1.1 skrll "pll4_audio",
349 1.1 skrll "pll5_video",
350 1.1 skrll "pll8_mlb",
351 1.1 skrll "enet_ref",
352 1.1 skrll "pcie_ref_125m",
353 1.1 skrll "sata_ref_100m"
354 1.1 skrll };
355 1.1 skrll
356 1.1 skrll /* DT clock ID to clock name mappings */
357 1.1 skrll static struct imx_clock_id {
358 1.1 skrll u_int id;
359 1.1 skrll const char *name;
360 1.1 skrll } imx6_clock_ids[] = {
361 1.1 skrll { IMX6CLK_DUMMY, "dummy" },
362 1.1 skrll { IMX6CLK_CKIL, "ckil" },
363 1.1 skrll { IMX6CLK_CKIH, "ckih" },
364 1.1 skrll { IMX6CLK_OSC, "osc" },
365 1.1 skrll { IMX6CLK_PLL2_PFD0_352M, "pll2_pfd0_352m" },
366 1.1 skrll { IMX6CLK_PLL2_PFD1_594M, "pll2_pfd1_594m" },
367 1.1 skrll { IMX6CLK_PLL2_PFD2_396M, "pll2_pfd2_396m" },
368 1.1 skrll { IMX6CLK_PLL3_PFD0_720M, "pll3_pfd0_720m" },
369 1.1 skrll { IMX6CLK_PLL3_PFD1_540M, "pll3_pfd1_540m" },
370 1.1 skrll { IMX6CLK_PLL3_PFD2_508M, "pll3_pfd2_508m" },
371 1.1 skrll { IMX6CLK_PLL3_PFD3_454M, "pll3_pfd3_454m" },
372 1.1 skrll { IMX6CLK_PLL2_198M, "pll2_198m" },
373 1.1 skrll { IMX6CLK_PLL3_120M, "pll3_120m" },
374 1.1 skrll { IMX6CLK_PLL3_80M, "pll3_80m" },
375 1.1 skrll { IMX6CLK_PLL3_60M, "pll3_60m" },
376 1.1 skrll { IMX6CLK_TWD, "twd" },
377 1.1 skrll { IMX6CLK_STEP, "step" },
378 1.1 skrll { IMX6CLK_PLL1_SW, "pll1_sw" },
379 1.1 skrll { IMX6CLK_PERIPH_PRE, "periph_pre" },
380 1.1 skrll { IMX6CLK_PERIPH2_PRE, "periph2_pre" },
381 1.1 skrll { IMX6CLK_PERIPH_CLK2_SEL, "periph_clk2_sel" },
382 1.1 skrll { IMX6CLK_PERIPH2_CLK2_SEL, "periph2_clk2_sel" },
383 1.1 skrll { IMX6CLK_AXI_SEL, "axi_sel" },
384 1.1 skrll { IMX6CLK_ESAI_SEL, "esai_sel" },
385 1.1 skrll { IMX6CLK_ASRC_SEL, "asrc_sel" },
386 1.1 skrll { IMX6CLK_SPDIF_SEL, "spdif_sel" },
387 1.1 skrll { IMX6CLK_GPU2D_AXI, "gpu2d_axi" },
388 1.1 skrll { IMX6CLK_GPU3D_AXI, "gpu3d_axi" },
389 1.1 skrll { IMX6CLK_GPU2D_CORE_SEL, "gpu2d_core_sel" },
390 1.1 skrll { IMX6CLK_GPU3D_CORE_SEL, "gpu3d_core_sel" },
391 1.1 skrll { IMX6CLK_GPU3D_SHADER_SEL, "gpu3d_shader_sel" },
392 1.1 skrll { IMX6CLK_IPU1_SEL, "ipu1_sel" },
393 1.1 skrll { IMX6CLK_IPU2_SEL, "ipu2_sel" },
394 1.1 skrll { IMX6CLK_LDB_DI0_SEL, "ldb_di0_sel" },
395 1.1 skrll { IMX6CLK_LDB_DI1_SEL, "ldb_di1_sel" },
396 1.1 skrll { IMX6CLK_IPU1_DI0_PRE_SEL, "ipu1_di0_pre_sel" },
397 1.1 skrll { IMX6CLK_IPU1_DI1_PRE_SEL, "ipu1_di1_pre_sel" },
398 1.1 skrll { IMX6CLK_IPU2_DI0_PRE_SEL, "ipu2_di0_pre_sel" },
399 1.1 skrll { IMX6CLK_IPU2_DI1_PRE_SEL, "ipu2_di1_pre_sel" },
400 1.1 skrll { IMX6CLK_IPU1_DI0_SEL, "ipu1_di0_sel" },
401 1.1 skrll { IMX6CLK_IPU1_DI1_SEL, "ipu1_di1_sel" },
402 1.1 skrll { IMX6CLK_IPU2_DI0_SEL, "ipu2_di0_sel" },
403 1.1 skrll { IMX6CLK_IPU2_DI1_SEL, "ipu2_di1_sel" },
404 1.1 skrll { IMX6CLK_HSI_TX_SEL, "hsi_tx_sel" },
405 1.1 skrll { IMX6CLK_PCIE_AXI_SEL, "pcie_axi_sel" },
406 1.1 skrll { IMX6CLK_SSI1_SEL, "ssi1_sel" },
407 1.1 skrll { IMX6CLK_SSI2_SEL, "ssi2_sel" },
408 1.1 skrll { IMX6CLK_SSI3_SEL, "ssi3_sel" },
409 1.1 skrll { IMX6CLK_USDHC1_SEL, "usdhc1_sel" },
410 1.1 skrll { IMX6CLK_USDHC2_SEL, "usdhc2_sel" },
411 1.1 skrll { IMX6CLK_USDHC3_SEL, "usdhc3_sel" },
412 1.1 skrll { IMX6CLK_USDHC4_SEL, "usdhc4_sel" },
413 1.1 skrll { IMX6CLK_ENFC_SEL, "enfc_sel" },
414 1.1 skrll { IMX6CLK_EIM_SEL, "eim_sel" },
415 1.1 skrll { IMX6CLK_EIM_SLOW_SEL, "eim_slow_sel" },
416 1.1 skrll { IMX6CLK_VDO_AXI_SEL, "vdo_axi_sel" },
417 1.1 skrll { IMX6CLK_VPU_AXI_SEL, "vpu_axi_sel" },
418 1.1 skrll { IMX6CLK_CKO1_SEL, "cko1_sel" },
419 1.1 skrll { IMX6CLK_PERIPH, "periph" },
420 1.1 skrll { IMX6CLK_PERIPH2, "periph2" },
421 1.1 skrll { IMX6CLK_PERIPH_CLK2, "periph_clk2" },
422 1.1 skrll { IMX6CLK_PERIPH2_CLK2, "periph2_clk2" },
423 1.1 skrll { IMX6CLK_IPG, "ipg" },
424 1.1 skrll { IMX6CLK_IPG_PER, "ipg_per" },
425 1.1 skrll { IMX6CLK_ESAI_PRED, "esai_pred" },
426 1.1 skrll { IMX6CLK_ESAI_PODF, "esai_podf" },
427 1.1 skrll { IMX6CLK_ASRC_PRED, "asrc_pred" },
428 1.1 skrll { IMX6CLK_ASRC_PODF, "asrc_podf" },
429 1.1 skrll { IMX6CLK_SPDIF_PRED, "spdif_pred" },
430 1.1 skrll { IMX6CLK_SPDIF_PODF, "spdif_podf" },
431 1.1 skrll { IMX6CLK_CAN_ROOT, "can_root" },
432 1.1 skrll { IMX6CLK_ECSPI_ROOT, "ecspi_root" },
433 1.1 skrll { IMX6CLK_GPU2D_CORE_PODF, "gpu2d_core_podf" },
434 1.1 skrll { IMX6CLK_GPU3D_CORE_PODF, "gpu3d_core_podf" },
435 1.1 skrll { IMX6CLK_GPU3D_SHADER, "gpu3d_shader" },
436 1.1 skrll { IMX6CLK_IPU1_PODF, "ipu1_podf" },
437 1.1 skrll { IMX6CLK_IPU2_PODF, "ipu2_podf" },
438 1.1 skrll { IMX6CLK_LDB_DI0_PODF, "ldb_di0_podf" },
439 1.1 skrll { IMX6CLK_LDB_DI1_PODF, "ldb_di1_podf" },
440 1.1 skrll { IMX6CLK_IPU1_DI0_PRE, "ipu1_di0_pre" },
441 1.1 skrll { IMX6CLK_IPU1_DI1_PRE, "ipu1_di1_pre" },
442 1.1 skrll { IMX6CLK_IPU2_DI0_PRE, "ipu2_di0_pre" },
443 1.1 skrll { IMX6CLK_IPU2_DI1_PRE, "ipu2_di1_pre" },
444 1.1 skrll { IMX6CLK_HSI_TX_PODF, "hsi_tx_podf" },
445 1.1 skrll { IMX6CLK_SSI1_PRED, "ssi1_pred" },
446 1.1 skrll { IMX6CLK_SSI1_PODF, "ssi1_podf" },
447 1.1 skrll { IMX6CLK_SSI2_PRED, "ssi2_pred" },
448 1.1 skrll { IMX6CLK_SSI2_PODF, "ssi2_podf" },
449 1.1 skrll { IMX6CLK_SSI3_PRED, "ssi3_pred" },
450 1.1 skrll { IMX6CLK_SSI3_PODF, "ssi3_podf" },
451 1.1 skrll { IMX6CLK_UART_SERIAL_PODF, "uart_serial_podf" },
452 1.1 skrll { IMX6CLK_USDHC1_PODF, "usdhc1_podf" },
453 1.1 skrll { IMX6CLK_USDHC2_PODF, "usdhc2_podf" },
454 1.1 skrll { IMX6CLK_USDHC3_PODF, "usdhc3_podf" },
455 1.1 skrll { IMX6CLK_USDHC4_PODF, "usdhc4_podf" },
456 1.1 skrll { IMX6CLK_ENFC_PRED, "enfc_pred" },
457 1.1 skrll { IMX6CLK_ENFC_PODF, "enfc_podf" },
458 1.1 skrll { IMX6CLK_EIM_PODF, "eim_podf" },
459 1.1 skrll { IMX6CLK_EIM_SLOW_PODF, "eim_slow_podf" },
460 1.1 skrll { IMX6CLK_VPU_AXI_PODF, "vpu_axi_podf" },
461 1.1 skrll { IMX6CLK_CKO1_PODF, "cko1_podf" },
462 1.1 skrll { IMX6CLK_AXI, "axi" },
463 1.1 skrll { IMX6CLK_MMDC_CH0_AXI_PODF, "mmdc_ch0_axi_podf" },
464 1.1 skrll { IMX6CLK_MMDC_CH1_AXI_PODF, "mmdc_ch1_axi_podf" },
465 1.1 skrll { IMX6CLK_ARM, "arm" },
466 1.1 skrll { IMX6CLK_AHB, "ahb" },
467 1.1 skrll { IMX6CLK_APBH_DMA, "apbh_dma" },
468 1.1 skrll { IMX6CLK_ASRC, "asrc" },
469 1.1 skrll { IMX6CLK_CAN1_IPG, "can1_ipg" },
470 1.1 skrll { IMX6CLK_CAN1_SERIAL, "can1_serial" },
471 1.1 skrll { IMX6CLK_CAN2_IPG, "can2_ipg" },
472 1.1 skrll { IMX6CLK_CAN2_SERIAL, "can2_serial" },
473 1.1 skrll { IMX6CLK_ECSPI1, "ecspi1" },
474 1.1 skrll { IMX6CLK_ECSPI2, "ecspi2" },
475 1.1 skrll { IMX6CLK_ECSPI3, "ecspi3" },
476 1.1 skrll { IMX6CLK_ECSPI4, "ecspi4" },
477 1.1 skrll { IMX6CLK_ECSPI5, "ecspi5" },
478 1.1 skrll { IMX6CLK_ENET, "enet" },
479 1.1 skrll { IMX6CLK_ESAI_EXTAL, "esai_extal" },
480 1.1 skrll { IMX6CLK_GPT_IPG, "gpt_ipg" },
481 1.1 skrll { IMX6CLK_GPT_IPG_PER, "gpt_ipg_per" },
482 1.1 skrll { IMX6CLK_GPU2D_CORE, "gpu2d_core" },
483 1.1 skrll { IMX6CLK_GPU3D_CORE, "gpu3d_core" },
484 1.1 skrll { IMX6CLK_HDMI_IAHB, "hdmi_iahb" },
485 1.1 skrll { IMX6CLK_HDMI_ISFR, "hdmi_isfr" },
486 1.1 skrll { IMX6CLK_I2C1, "i2c1" },
487 1.1 skrll { IMX6CLK_I2C2, "i2c2" },
488 1.1 skrll { IMX6CLK_I2C3, "i2c3" },
489 1.1 skrll { IMX6CLK_IIM, "iim" },
490 1.1 skrll { IMX6CLK_ENFC, "enfc" },
491 1.1 skrll { IMX6CLK_IPU1, "ipu1" },
492 1.1 skrll { IMX6CLK_IPU1_DI0, "ipu1_di0" },
493 1.1 skrll { IMX6CLK_IPU1_DI1, "ipu1_di1" },
494 1.1 skrll { IMX6CLK_IPU2, "ipu2" },
495 1.1 skrll { IMX6CLK_IPU2_DI0, "ipu2_di0" },
496 1.1 skrll { IMX6CLK_LDB_DI0, "ldb_di0" },
497 1.1 skrll { IMX6CLK_LDB_DI1, "ldb_di1" },
498 1.1 skrll { IMX6CLK_IPU2_DI1, "ipu2_di1" },
499 1.1 skrll { IMX6CLK_HSI_TX, "hsi_tx" },
500 1.1 skrll { IMX6CLK_MLB, "mlb" },
501 1.1 skrll { IMX6CLK_MMDC_CH0_AXI, "mmdc_ch0_axi" },
502 1.1 skrll { IMX6CLK_MMDC_CH1_AXI, "mmdc_ch1_axi" },
503 1.1 skrll { IMX6CLK_OCRAM, "ocram" },
504 1.1 skrll { IMX6CLK_OPENVG_AXI, "openvg_axi" },
505 1.1 skrll { IMX6CLK_PCIE_AXI, "pcie_axi" },
506 1.1 skrll { IMX6CLK_PWM1, "pwm1" },
507 1.1 skrll { IMX6CLK_PWM2, "pwm2" },
508 1.1 skrll { IMX6CLK_PWM3, "pwm3" },
509 1.1 skrll { IMX6CLK_PWM4, "pwm4" },
510 1.1 skrll { IMX6CLK_PER1_BCH, "per1_bch" },
511 1.1 skrll { IMX6CLK_GPMI_BCH_APB, "gpmi_bch_apb" },
512 1.1 skrll { IMX6CLK_GPMI_BCH, "gpmi_bch" },
513 1.1 skrll { IMX6CLK_GPMI_IO, "gpmi_io" },
514 1.1 skrll { IMX6CLK_GPMI_APB, "gpmi_apb" },
515 1.1 skrll { IMX6CLK_SATA, "sata" },
516 1.1 skrll { IMX6CLK_SDMA, "sdma" },
517 1.1 skrll { IMX6CLK_SPBA, "spba" },
518 1.1 skrll { IMX6CLK_SSI1, "ssi1" },
519 1.1 skrll { IMX6CLK_SSI2, "ssi2" },
520 1.1 skrll { IMX6CLK_SSI3, "ssi3" },
521 1.1 skrll { IMX6CLK_UART_IPG, "uart_ipg" },
522 1.1 skrll { IMX6CLK_UART_SERIAL, "uart_serial" },
523 1.1 skrll { IMX6CLK_USBOH3, "usboh3" },
524 1.1 skrll { IMX6CLK_USDHC1, "usdhc1" },
525 1.1 skrll { IMX6CLK_USDHC2, "usdhc2" },
526 1.1 skrll { IMX6CLK_USDHC3, "usdhc3" },
527 1.1 skrll { IMX6CLK_USDHC4, "usdhc4" },
528 1.1 skrll { IMX6CLK_VDO_AXI, "vdo_axi" },
529 1.1 skrll { IMX6CLK_VPU_AXI, "vpu_axi" },
530 1.1 skrll { IMX6CLK_CKO1, "cko1" },
531 1.1 skrll { IMX6CLK_PLL1_SYS, "pll1_sys" },
532 1.1 skrll { IMX6CLK_PLL2_BUS, "pll2_bus" },
533 1.1 skrll { IMX6CLK_PLL3_USB_OTG, "pll3_usb_otg" },
534 1.1 skrll { IMX6CLK_PLL4_AUDIO, "pll4_audio" },
535 1.1 skrll { IMX6CLK_PLL5_VIDEO, "pll5_video" },
536 1.1 skrll { IMX6CLK_PLL8_MLB, "pll8_mlb" },
537 1.1 skrll { IMX6CLK_PLL7_USB_HOST, "pll7_usb_host" },
538 1.1 skrll { IMX6CLK_PLL6_ENET, "pll6_enet" },
539 1.1 skrll { IMX6CLK_SSI1_IPG, "ssi1_ipg" },
540 1.1 skrll { IMX6CLK_SSI2_IPG, "ssi2_ipg" },
541 1.1 skrll { IMX6CLK_SSI3_IPG, "ssi3_ipg" },
542 1.1 skrll { IMX6CLK_ROM, "rom" },
543 1.1 skrll { IMX6CLK_USBPHY1, "usbphy1" },
544 1.1 skrll { IMX6CLK_USBPHY2, "usbphy2" },
545 1.1 skrll { IMX6CLK_LDB_DI0_DIV_3_5, "ldb_di0_div_3_5" },
546 1.1 skrll { IMX6CLK_LDB_DI1_DIV_3_5, "ldb_di1_div_3_5" },
547 1.1 skrll { IMX6CLK_SATA_REF, "sata_ref" },
548 1.1 skrll { IMX6CLK_SATA_REF_100M, "sata_ref_100m" },
549 1.1 skrll { IMX6CLK_PCIE_REF, "pcie_ref" },
550 1.1 skrll { IMX6CLK_PCIE_REF_125M, "pcie_ref_125m" },
551 1.1 skrll { IMX6CLK_ENET_REF, "enet_ref" },
552 1.1 skrll { IMX6CLK_USBPHY1_GATE, "usbphy1_gate" },
553 1.1 skrll { IMX6CLK_USBPHY2_GATE, "usbphy2_gate" },
554 1.1 skrll { IMX6CLK_PLL4_POST_DIV, "pll4_post_div" },
555 1.1 skrll { IMX6CLK_PLL5_POST_DIV, "pll5_post_div" },
556 1.1 skrll { IMX6CLK_PLL5_VIDEO_DIV, "pll5_video_div" },
557 1.1 skrll { IMX6CLK_EIM_SLOW, "eim_slow" },
558 1.1 skrll { IMX6CLK_SPDIF, "spdif" },
559 1.1 skrll { IMX6CLK_CKO2_SEL, "cko2_sel" },
560 1.1 skrll { IMX6CLK_CKO2_PODF, "cko2_podf" },
561 1.1 skrll { IMX6CLK_CKO2, "cko2" },
562 1.1 skrll { IMX6CLK_CKO, "cko" },
563 1.1 skrll { IMX6CLK_VDOA, "vdoa" },
564 1.1 skrll { IMX6CLK_PLL4_AUDIO_DIV, "pll4_audio_div" },
565 1.1 skrll { IMX6CLK_LVDS1_SEL, "lvds1_sel" },
566 1.1 skrll { IMX6CLK_LVDS2_SEL, "lvds2_sel" },
567 1.1 skrll { IMX6CLK_LVDS1_GATE, "lvds1_gate" },
568 1.1 skrll { IMX6CLK_LVDS2_GATE, "lvds2_gate" },
569 1.1 skrll { IMX6CLK_ESAI_IPG, "esai_ipg" },
570 1.1 skrll { IMX6CLK_ESAI_MEM, "esai_mem" },
571 1.1 skrll { IMX6CLK_ASRC_IPG, "asrc_ipg" },
572 1.1 skrll { IMX6CLK_ASRC_MEM, "asrc_mem" },
573 1.1 skrll { IMX6CLK_LVDS1_IN, "lvds1_in" },
574 1.1 skrll { IMX6CLK_LVDS2_IN, "lvds2_in" },
575 1.1 skrll { IMX6CLK_ANACLK1, "anaclk1" },
576 1.1 skrll { IMX6CLK_ANACLK2, "anaclk2" },
577 1.1 skrll { IMX6CLK_PLL1_BYPASS_SRC, "pll1_bypass_src" },
578 1.1 skrll { IMX6CLK_PLL2_BYPASS_SRC, "pll2_bypass_src" },
579 1.1 skrll { IMX6CLK_PLL3_BYPASS_SRC, "pll3_bypass_src" },
580 1.1 skrll { IMX6CLK_PLL4_BYPASS_SRC, "pll4_bypass_src" },
581 1.1 skrll { IMX6CLK_PLL5_BYPASS_SRC, "pll5_bypass_src" },
582 1.1 skrll { IMX6CLK_PLL6_BYPASS_SRC, "pll6_bypass_src" },
583 1.1 skrll { IMX6CLK_PLL7_BYPASS_SRC, "pll7_bypass_src" },
584 1.1 skrll { IMX6CLK_PLL1, "pll1" },
585 1.1 skrll { IMX6CLK_PLL2, "pll2" },
586 1.1 skrll { IMX6CLK_PLL3, "pll3" },
587 1.1 skrll { IMX6CLK_PLL4, "pll4" },
588 1.1 skrll { IMX6CLK_PLL5, "pll5" },
589 1.1 skrll { IMX6CLK_PLL6, "pll6" },
590 1.1 skrll { IMX6CLK_PLL7, "pll7" },
591 1.1 skrll { IMX6CLK_PLL1_BYPASS, "pll1_bypass" },
592 1.1 skrll { IMX6CLK_PLL2_BYPASS, "pll2_bypass" },
593 1.1 skrll { IMX6CLK_PLL3_BYPASS, "pll3_bypass" },
594 1.1 skrll { IMX6CLK_PLL4_BYPASS, "pll4_bypass" },
595 1.1 skrll { IMX6CLK_PLL5_BYPASS, "pll5_bypass" },
596 1.1 skrll { IMX6CLK_PLL6_BYPASS, "pll6_bypass" },
597 1.1 skrll { IMX6CLK_PLL7_BYPASS, "pll7_bypass" },
598 1.1 skrll { IMX6CLK_GPT_3M, "gpt_3m" },
599 1.1 skrll { IMX6CLK_VIDEO_27M, "video_27m" },
600 1.1 skrll { IMX6CLK_MIPI_CORE_CFG, "mipi_core_cfg" },
601 1.1 skrll { IMX6CLK_MIPI_IPG, "mipi_ipg" },
602 1.1 skrll { IMX6CLK_CAAM_MEM, "caam_mem" },
603 1.1 skrll { IMX6CLK_CAAM_ACLK, "caam_aclk" },
604 1.1 skrll { IMX6CLK_CAAM_IPG, "caam_ipg" },
605 1.1 skrll { IMX6CLK_SPDIF_GCLK, "spdif_gclk" },
606 1.1 skrll { IMX6CLK_UART_SEL, "uart_sel" },
607 1.1 skrll { IMX6CLK_IPG_PER_SEL, "ipg_per_sel" },
608 1.1 skrll { IMX6CLK_ECSPI_SEL, "ecspi_sel" },
609 1.1 skrll { IMX6CLK_CAN_SEL, "can_sel" },
610 1.1 skrll { IMX6CLK_MMDC_CH1_AXI_CG, "mmdc_ch1_axi_cg" },
611 1.1 skrll { IMX6CLK_PRE0, "pre0" },
612 1.1 skrll { IMX6CLK_PRE1, "pre1" },
613 1.1 skrll { IMX6CLK_PRE2, "pre2" },
614 1.1 skrll { IMX6CLK_PRE3, "pre3" },
615 1.1 skrll { IMX6CLK_PRG0_AXI, "prg0_axi" },
616 1.1 skrll { IMX6CLK_PRG1_AXI, "prg1_axi" },
617 1.1 skrll { IMX6CLK_PRG0_APB, "prg0_apb" },
618 1.1 skrll { IMX6CLK_PRG1_APB, "prg1_apb" },
619 1.1 skrll { IMX6CLK_PRE_AXI, "pre_axi" },
620 1.1 skrll { IMX6CLK_MLB_SEL, "mlb_sel" },
621 1.1 skrll { IMX6CLK_MLB_PODF, "mlb_podf" },
622 1.1 skrll { IMX6CLK_END, "end" },
623 1.1 skrll };
624 1.1 skrll
625 1.1 skrll /* Clock Divider Tables */
626 1.1 skrll static const int enet_ref_tbl[] = { 20, 10, 5, 4, 0 };
627 1.1 skrll static const int post_div_tbl[] = { 4, 2, 1, 0 };
628 1.1 skrll static const int audiovideo_div_tbl[] = { 1, 2, 1, 4, 0 };
629 1.1 skrll
630 1.1 skrll static struct imx6_clk imx6_clks[] = {
631 1.1 skrll CLK_FIXED("dummy", 0),
632 1.1 skrll
633 1.1 skrll CLK_FIXED("ckil", IMX6_CKIL_FREQ),
634 1.1 skrll CLK_FIXED("ckih", IMX6_CKIH_FREQ),
635 1.1 skrll CLK_FIXED("osc", IMX6_OSC_FREQ),
636 1.1 skrll CLK_FIXED("anaclk1", IMX6_ANACLK1_FREQ),
637 1.1 skrll CLK_FIXED("anaclk2", IMX6_ANACLK2_FREQ),
638 1.1 skrll
639 1.1 skrll CLK_FIXED_FACTOR("sata_ref", "pll6_enet", 5, 1),
640 1.1 skrll CLK_FIXED_FACTOR("pcie_ref", "pll6_enet", 4, 1),
641 1.1 skrll CLK_FIXED_FACTOR("pll2_198m", "pll2_pfd2_396m", 2, 1),
642 1.1 skrll CLK_FIXED_FACTOR("pll3_120m", "pll3_usb_otg", 4, 1),
643 1.1 skrll CLK_FIXED_FACTOR("pll3_80m", "pll3_usb_otg", 6, 1),
644 1.1 skrll CLK_FIXED_FACTOR("pll3_60m", "pll3_usb_otg", 8, 1),
645 1.1 skrll CLK_FIXED_FACTOR("twd", "arm", 2, 1),
646 1.1 skrll CLK_FIXED_FACTOR("gpt_3m", "osc", 8, 1),
647 1.1 skrll CLK_FIXED_FACTOR("video_27m", "pll3_pfd1_540m", 20, 1),
648 1.1 skrll CLK_FIXED_FACTOR("gpu2d_axi", "mmdc_ch0_axi_podf", 1, 1),
649 1.1 skrll CLK_FIXED_FACTOR("gpu3d_axi", "mmdc_ch0_axi_podf", 1, 1),
650 1.1 skrll CLK_FIXED_FACTOR("ldb_di0_div_3_5", "ldb_di0_sel", 7, 2),
651 1.1 skrll CLK_FIXED_FACTOR("ldb_di1_div_3_5", "ldb_di1_sel", 7, 2),
652 1.1 skrll
653 1.1 skrll CLK_PFD("pll2_pfd0_352m", "pll2_bus", PFD_528, 0),
654 1.1 skrll CLK_PFD("pll2_pfd1_594m", "pll2_bus", PFD_528, 1),
655 1.1 skrll CLK_PFD("pll2_pfd2_396m", "pll2_bus", PFD_528, 2),
656 1.1 skrll CLK_PFD("pll3_pfd0_720m", "pll3_usb_otg", PFD_480, 0),
657 1.1 skrll CLK_PFD("pll3_pfd1_540m", "pll3_usb_otg", PFD_480, 1),
658 1.1 skrll CLK_PFD("pll3_pfd2_508m", "pll3_usb_otg", PFD_480, 2),
659 1.1 skrll CLK_PFD("pll3_pfd3_454m", "pll3_usb_otg", PFD_480, 3),
660 1.1 skrll
661 1.1 skrll CLK_PLL("pll1", "osc", SYS, PLL_ARM, DIV_SELECT, POWERDOWN, 0),
662 1.1 skrll CLK_PLL("pll2", "osc", GENERIC, PLL_SYS, DIV_SELECT, POWERDOWN, 0),
663 1.1 skrll CLK_PLL("pll3", "osc", USB, PLL_USB1, DIV_SELECT, POWER, 0),
664 1.1 skrll CLK_PLL("pll4", "osc", AUDIO_VIDEO, PLL_AUDIO, DIV_SELECT, POWERDOWN, 0),
665 1.1 skrll CLK_PLL("pll5", "osc", AUDIO_VIDEO, PLL_VIDEO, DIV_SELECT, POWERDOWN, 0),
666 1.1 skrll CLK_PLL("pll6", "osc", ENET, PLL_ENET, DIV_SELECT, POWERDOWN, 500000000),
667 1.1 skrll CLK_PLL("pll7", "osc", USB, PLL_USB2, DIV_SELECT, POWER, 0),
668 1.1 skrll
669 1.1 skrll CLK_DIV("periph_clk2", "periph_clk2_sel", CBCDR, PERIPH_CLK2_PODF),
670 1.1 skrll CLK_DIV("periph2_clk2", "periph2_clk2_sel", CBCDR, PERIPH2_CLK2_PODF),
671 1.1 skrll CLK_DIV("ipg", "ahb", CBCDR, IPG_PODF),
672 1.1 skrll CLK_DIV("esai_pred", "esai_sel", CS1CDR, ESAI_CLK_PRED),
673 1.1 skrll CLK_DIV("esai_podf", "esai_pred", CS1CDR, ESAI_CLK_PODF),
674 1.1 skrll CLK_DIV("asrc_pred", "asrc_sel", CDCDR, SPDIF1_CLK_PRED),
675 1.1 skrll CLK_DIV("asrc_podf", "asrc_pred", CDCDR, SPDIF1_CLK_PODF),
676 1.1 skrll CLK_DIV("spdif_pred", "spdif_sel", CDCDR, SPDIF0_CLK_PRED),
677 1.1 skrll CLK_DIV("spdif_podf", "spdif_pred", CDCDR, SPDIF0_CLK_PODF),
678 1.1 skrll CLK_DIV("ecspi_root", "pll3_60m", CSCDR2, ECSPI_CLK_PODF),
679 1.1 skrll CLK_DIV("can_root", "pll3_60m", CSCMR2, CAN_CLK_PODF),
680 1.1 skrll CLK_DIV("uart_serial_podf", "pll3_80m", CSCDR1, UART_CLK_PODF),
681 1.1 skrll CLK_DIV("gpu2d_core_podf", "gpu2d_core_sel", CBCMR, GPU2D_CORE_CLK_PODF),
682 1.1 skrll CLK_DIV("gpu3d_core_podf", "gpu3d_core_sel", CBCMR, GPU3D_CORE_PODF),
683 1.1 skrll CLK_DIV("gpu3d_shader", "gpu3d_shader_sel", CBCMR, GPU3D_SHADER_PODF),
684 1.1 skrll CLK_DIV("ipu1_podf", "ipu1_sel", CSCDR3, IPU1_HSP_PODF),
685 1.1 skrll CLK_DIV("ipu2_podf", "ipu2_sel", CSCDR3, IPU2_HSP_PODF),
686 1.1 skrll CLK_DIV("ldb_di0_podf", "ldb_di0_div_3_5", CSCMR2, LDB_DI0_IPU_DIV),
687 1.1 skrll CLK_DIV("ldb_di1_podf", "ldb_di1_div_3_5", CSCMR2, LDB_DI1_IPU_DIV),
688 1.1 skrll CLK_DIV("ipu1_di0_pre", "ipu1_di0_pre_sel", CHSCCDR, IPU1_DI0_PODF),
689 1.1 skrll CLK_DIV("ipu1_di1_pre", "ipu1_di1_pre_sel", CHSCCDR, IPU1_DI1_PODF),
690 1.1 skrll CLK_DIV("ipu2_di0_pre", "ipu2_di0_pre_sel", CSCDR2, IPU2_DI0_PODF),
691 1.1 skrll CLK_DIV("ipu2_di1_pre", "ipu2_di1_pre_sel", CSCDR2, IPU2_DI1_PODF),
692 1.1 skrll CLK_DIV("hsi_tx_podf", "hsi_tx_sel", CDCDR, HSI_TX_PODF),
693 1.1 skrll CLK_DIV("ssi1_pred", "ssi1_sel", CS1CDR, SSI1_CLK_PRED),
694 1.1 skrll CLK_DIV("ssi1_podf", "ssi1_pred", CS1CDR, SSI1_CLK_PODF),
695 1.1 skrll CLK_DIV("ssi2_pred", "ssi2_sel", CS2CDR, SSI2_CLK_PRED),
696 1.1 skrll CLK_DIV("ssi2_podf", "ssi2_pred", CS2CDR, SSI2_CLK_PODF),
697 1.1 skrll CLK_DIV("ssi3_pred", "ssi3_sel", CS1CDR, SSI3_CLK_PRED),
698 1.1 skrll CLK_DIV("ssi3_podf", "ssi3_pred", CS1CDR, SSI3_CLK_PODF),
699 1.1 skrll CLK_DIV("usdhc1_podf", "usdhc1_sel", CSCDR1, USDHC1_PODF),
700 1.1 skrll CLK_DIV("usdhc2_podf", "usdhc2_sel", CSCDR1, USDHC2_PODF),
701 1.1 skrll CLK_DIV("usdhc3_podf", "usdhc3_sel", CSCDR1, USDHC3_PODF),
702 1.1 skrll CLK_DIV("usdhc4_podf", "usdhc4_sel", CSCDR1, USDHC4_PODF),
703 1.1 skrll CLK_DIV("enfc_pred", "enfc_sel", CS2CDR, ENFC_CLK_PRED),
704 1.1 skrll CLK_DIV("enfc_podf", "enfc_pred", CS2CDR, ENFC_CLK_PODF),
705 1.1 skrll CLK_DIV("vpu_axi_podf", "vpu_axi_sel", CSCDR1, VPU_AXI_PODF),
706 1.1 skrll CLK_DIV("cko1_podf", "cko1_sel", CCOSR, CLKO1_DIV),
707 1.1 skrll CLK_DIV("cko2_podf", "cko2_sel", CCOSR, CLKO2_DIV),
708 1.1 skrll CLK_DIV("ipg_per", "ipg", CSCMR1, PERCLK_PODF),
709 1.1 skrll CLK_DIV("eim_podf", "eim_sel", CSCMR1, ACLK_PODF),
710 1.1 skrll CLK_DIV("eim_slow_podf", "eim_slow_sel", CSCMR1, ACLK_EIM_SLOW_PODF),
711 1.1 skrll
712 1.1 skrll CLK_DIV_BUSY("axi", "axi_sel", CBCDR, AXI_PODF, CDHIPR, AXI_PODF_BUSY),
713 1.1 skrll CLK_DIV_BUSY("mmdc_ch0_axi_podf", "periph", CBCDR, MMDC_CH0_AXI_PODF, CDHIPR, MMDC_CH0_PODF_BUSY),
714 1.1 skrll CLK_DIV_BUSY("mmdc_ch1_axi_podf", "periph2", CBCDR, MMDC_CH1_AXI_PODF, CDHIPR, MMDC_CH1_PODF_BUSY),
715 1.1 skrll CLK_DIV_BUSY("arm", "pll1_sw", CACRR, ARM_PODF, CDHIPR, ARM_PODF_BUSY),
716 1.1 skrll CLK_DIV_BUSY("ahb", "periph", CBCDR, AHB_PODF, CDHIPR, AHB_PODF_BUSY),
717 1.1 skrll
718 1.1 skrll CLK_DIV_TABLE("pll4_post_div", "pll4_audio", PLL_AUDIO, POST_DIV_SELECT, post_div_tbl),
719 1.1 skrll CLK_DIV_TABLE("pll4_audio_div", "pll4_post_div", MISC2, AUDIO_DIV_LSB, audiovideo_div_tbl),
720 1.1 skrll CLK_DIV_TABLE("pll5_post_div", "pll5_video", PLL_VIDEO, POST_DIV_SELECT, post_div_tbl),
721 1.1 skrll CLK_DIV_TABLE("pll5_video_div", "pll5_post_div", MISC2, VIDEO_DIV, audiovideo_div_tbl),
722 1.1 skrll CLK_DIV_TABLE("enet_ref", "pll6_enet", PLL_ENET, DIV_SELECT, enet_ref_tbl),
723 1.1 skrll
724 1.1 skrll CLK_MUX("step", step_p, CCM, CCSR, STEP_SEL),
725 1.1 skrll CLK_MUX("pll1_sw", pll1_sw_p, CCM, CCSR, PLL1_SW_CLK_SEL),
726 1.1 skrll CLK_MUX("periph_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH_CLK_SEL),
727 1.1 skrll CLK_MUX("periph2_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH2_CLK_SEL),
728 1.1 skrll CLK_MUX("periph_clk2_sel", periph_clk2_p, CCM,CBCMR, PERIPH_CLK2_SEL),
729 1.1 skrll CLK_MUX("periph2_clk2_sel", periph2_clk2_p, CCM,CBCMR, PERIPH2_CLK2_SEL),
730 1.1 skrll CLK_MUX("axi_sel", axi_p, CCM, CBCDR, AXI_SEL),
731 1.1 skrll CLK_MUX("asrc_sel", audio_p, CCM, CDCDR, SPDIF1_CLK_SEL),
732 1.1 skrll CLK_MUX("spdif_sel", audio_p, CCM, CDCDR, SPDIF0_CLK_SEL),
733 1.1 skrll CLK_MUX("gpu2d_core_sel", gpu2d_core_p, CCM, CBCMR, GPU2D_CLK_SEL),
734 1.1 skrll CLK_MUX("gpu3d_core_sel", gpu3d_core_p, CCM, CBCMR, GPU3D_CORE_CLK_SEL),
735 1.1 skrll CLK_MUX("gpu3d_shader_sel", gpu3d_shader_p, CCM,CBCMR, GPU3D_SHADER_CLK_SEL),
736 1.1 skrll CLK_MUX("esai_sel", audio_p, CCM, CSCMR2, ESAI_CLK_SEL),
737 1.1 skrll CLK_MUX("ipu1_sel", ipu_p, CCM, CSCDR3, IPU1_HSP_CLK_SEL),
738 1.1 skrll CLK_MUX("ipu2_sel", ipu_p, CCM, CSCDR3, IPU2_HSP_CLK_SEL),
739 1.1 skrll CLK_MUX("ipu1_di0_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI0_PRE_CLK_SEL),
740 1.1 skrll CLK_MUX("ipu1_di1_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI1_PRE_CLK_SEL),
741 1.1 skrll CLK_MUX("ipu2_di0_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI0_PRE_CLK_SEL),
742 1.1 skrll CLK_MUX("ipu2_di1_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI1_PRE_CLK_SEL),
743 1.1 skrll CLK_MUX("ipu1_di0_sel", ipu1_di0_p, CCM, CHSCCDR, IPU1_DI0_CLK_SEL),
744 1.1 skrll CLK_MUX("ipu1_di1_sel", ipu1_di1_p, CCM, CHSCCDR, IPU1_DI1_CLK_SEL),
745 1.1 skrll CLK_MUX("ipu2_di0_sel", ipu2_di0_p, CCM, CSCDR2, IPU2_DI0_CLK_SEL),
746 1.1 skrll CLK_MUX("ipu2_di1_sel", ipu2_di1_p, CCM, CSCDR2, IPU2_DI1_CLK_SEL),
747 1.1 skrll CLK_MUX("ldb_di0_sel", ldb_di_p, CCM, CS2CDR, LDB_DI0_CLK_SEL),
748 1.1 skrll CLK_MUX("ldb_di1_sel", ldb_di_p, CCM, CS2CDR, LDB_DI1_CLK_SEL),
749 1.1 skrll CLK_MUX("vdo_axi_sel", vdo_axi_p, CCM, CBCMR, VDOAXI_CLK_SEL),
750 1.1 skrll CLK_MUX("vpu_axi_sel", vpu_axi_p, CCM, CBCMR, VPU_AXI_CLK_SEL),
751 1.1 skrll CLK_MUX("cko1_sel", cko1_p, CCM, CCOSR, CLKO1_SEL),
752 1.1 skrll CLK_MUX("cko2_sel", cko2_p, CCM, CCOSR, CLKO2_SEL),
753 1.1 skrll CLK_MUX("cko", cko_p, CCM, CCOSR, CLK_OUT_SEL),
754 1.1 skrll CLK_MUX("hsi_tx_sel", hsi_tx_p, CCM, CDCDR, HSI_TX_CLK_SEL),
755 1.1 skrll CLK_MUX("pcie_axi_sel", pcie_axi_p, CCM, CBCMR, PCIE_AXI_CLK_SEL),
756 1.1 skrll CLK_MUX("ssi1_sel", ssi_p, CCM, CSCMR1, SSI1_CLK_SEL),
757 1.1 skrll CLK_MUX("ssi2_sel", ssi_p, CCM, CSCMR1, SSI2_CLK_SEL),
758 1.1 skrll CLK_MUX("ssi3_sel", ssi_p, CCM, CSCMR1, SSI3_CLK_SEL),
759 1.1 skrll CLK_MUX("usdhc1_sel", usdhc_p, CCM, CSCMR1, USDHC1_CLK_SEL),
760 1.1 skrll CLK_MUX("usdhc2_sel", usdhc_p, CCM, CSCMR1, USDHC2_CLK_SEL),
761 1.1 skrll CLK_MUX("usdhc3_sel", usdhc_p, CCM, CSCMR1, USDHC3_CLK_SEL),
762 1.1 skrll CLK_MUX("usdhc4_sel", usdhc_p, CCM, CSCMR1, USDHC4_CLK_SEL),
763 1.1 skrll CLK_MUX("eim_sel", eim_p, CCM, CSCMR1, ACLK_SEL),
764 1.1 skrll CLK_MUX("eim_slow_sel", eim_slow_p, CCM, CSCMR1, ACLK_EIM_SLOW_SEL),
765 1.1 skrll CLK_MUX("enfc_sel", enfc_p, CCM, CS2CDR, ENFC_CLK_SEL),
766 1.1 skrll
767 1.1 skrll CLK_MUX("pll1_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ARM, BYPASS_CLK_SRC),
768 1.1 skrll CLK_MUX("pll2_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_SYS, BYPASS_CLK_SRC),
769 1.1 skrll CLK_MUX("pll3_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB1, BYPASS_CLK_SRC),
770 1.1 skrll CLK_MUX("pll4_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_AUDIO, BYPASS_CLK_SRC),
771 1.1 skrll CLK_MUX("pll5_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_VIDEO, BYPASS_CLK_SRC),
772 1.1 skrll CLK_MUX("pll6_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ENET, BYPASS_CLK_SRC),
773 1.1 skrll CLK_MUX("pll7_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB2, BYPASS_CLK_SRC),
774 1.1 skrll CLK_MUX("pll1_bypass", pll1_bypass_p, CCM_ANALOG, PLL_ARM, BYPASS),
775 1.1 skrll CLK_MUX("pll2_bypass", pll2_bypass_p, CCM_ANALOG, PLL_SYS, BYPASS),
776 1.1 skrll CLK_MUX("pll3_bypass", pll3_bypass_p, CCM_ANALOG, PLL_USB1, BYPASS),
777 1.1 skrll CLK_MUX("pll4_bypass", pll4_bypass_p, CCM_ANALOG, PLL_AUDIO, BYPASS),
778 1.1 skrll CLK_MUX("pll5_bypass", pll5_bypass_p, CCM_ANALOG, PLL_VIDEO, BYPASS),
779 1.1 skrll CLK_MUX("pll6_bypass", pll6_bypass_p, CCM_ANALOG, PLL_ENET, BYPASS),
780 1.1 skrll CLK_MUX("pll7_bypass", pll7_bypass_p, CCM_ANALOG, PLL_USB2, BYPASS),
781 1.1 skrll
782 1.1 skrll CLK_MUX("lvds1_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK1_SRC),
783 1.1 skrll CLK_MUX("lvds2_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK2_SRC),
784 1.1 skrll
785 1.1 skrll CLK_MUX_BUSY("periph", periph_p, CBCDR, PERIPH_CLK_SEL, CDHIPR, PERIPH_CLK_SEL_BUSY),
786 1.1 skrll CLK_MUX_BUSY("periph2", periph2_p, CBCDR, PERIPH2_CLK_SEL, CDHIPR, PERIPH2_CLK_SEL_BUSY),
787 1.1 skrll
788 1.1 skrll CLK_GATE("apbh_dma", "usdhc3", CCM, CCGR0, APBHDMA_HCLK_ENABLE),
789 1.1 skrll CLK_GATE("asrc", "asrc_podf", CCM, CCGR0, ASRC_CLK_ENABLE),
790 1.1 skrll CLK_GATE("asrc_ipg", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE),
791 1.1 skrll CLK_GATE("asrc_mem", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE),
792 1.1 skrll CLK_GATE("caam_mem", "ahb", CCM, CCGR0, CAAM_SECURE_MEM_CLK_ENABLE),
793 1.1 skrll CLK_GATE("caam_aclk", "ahb", CCM, CCGR0, CAAM_WRAPPER_ACLK_ENABLE),
794 1.1 skrll CLK_GATE("caam_ipg", "ipg", CCM, CCGR0, CAAM_WRAPPER_IPG_ENABLE),
795 1.1 skrll CLK_GATE("can1_ipg", "ipg", CCM, CCGR0, CAN1_CLK_ENABLE),
796 1.1 skrll CLK_GATE("can1_serial", "can_root", CCM, CCGR0, CAN1_SERIAL_CLK_ENABLE),
797 1.1 skrll CLK_GATE("can2_ipg", "ipg", CCM, CCGR0, CAN2_CLK_ENABLE),
798 1.1 skrll CLK_GATE("can2_serial", "can_root", CCM, CCGR0, CAN2_SERIAL_CLK_ENABLE),
799 1.1 skrll CLK_GATE("ecspi1", "ecspi_root", CCM, CCGR1, ECSPI1_CLK_ENABLE),
800 1.1 skrll CLK_GATE("ecspi2", "ecspi_root", CCM, CCGR1, ECSPI2_CLK_ENABLE),
801 1.1 skrll CLK_GATE("ecspi3", "ecspi_root", CCM, CCGR1, ECSPI3_CLK_ENABLE),
802 1.1 skrll CLK_GATE("ecspi4", "ecspi_root", CCM, CCGR1, ECSPI4_CLK_ENABLE),
803 1.1 skrll CLK_GATE("ecspi5", "ecspi_root", CCM, CCGR1, ECSPI5_CLK_ENABLE),
804 1.1 skrll CLK_GATE("enet", "ipg", CCM, CCGR1, ENET_CLK_ENABLE),
805 1.1 skrll CLK_GATE("esai_extal", "esai_podf", CCM, CCGR1, ESAI_CLK_ENABLE),
806 1.1 skrll CLK_GATE("esai_ipg", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE),
807 1.1 skrll CLK_GATE("esai_mem", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE),
808 1.1 skrll CLK_GATE("gpt_ipg", "ipg", CCM, CCGR1, GPT_CLK_ENABLE),
809 1.1 skrll CLK_GATE("gpt_ipg_per", "ipg_per", CCM, CCGR1, GPT_SERIAL_CLK_ENABLE),
810 1.1 skrll CLK_GATE("gpu2d_core", "gpu2d_core_podf", CCM, CCGR1, GPU2D_CLK_ENABLE),
811 1.1 skrll CLK_GATE("gpu3d_core", "gpu3d_core_podf", CCM, CCGR1, GPU3D_CLK_ENABLE),
812 1.1 skrll CLK_GATE("hdmi_iahb", "ahb", CCM, CCGR2, HDMI_TX_IAHBCLK_ENABLE),
813 1.1 skrll CLK_GATE("hdmi_isfr", "video_27m", CCM, CCGR2, HDMI_TX_ISFRCLK_ENABLE),
814 1.1 skrll CLK_GATE("i2c1", "ipg_per", CCM, CCGR2, I2C1_SERIAL_CLK_ENABLE),
815 1.1 skrll CLK_GATE("i2c2", "ipg_per", CCM, CCGR2, I2C2_SERIAL_CLK_ENABLE),
816 1.1 skrll CLK_GATE("i2c3", "ipg_per", CCM, CCGR2, I2C3_SERIAL_CLK_ENABLE),
817 1.1 skrll CLK_GATE("iim", "ipg", CCM, CCGR2, IIM_CLK_ENABLE),
818 1.1 skrll CLK_GATE("enfc", "enfc_podf", CCM, CCGR2, IOMUX_IPT_CLK_IO_CLK_ENABLE),
819 1.1 skrll CLK_GATE("vdoa", "vdo_axi", CCM, CCGR2, IPSYNC_VDOA_IPG_CLK_ENABLE),
820 1.1 skrll CLK_GATE("ipu1", "ipu1_podf", CCM, CCGR3, IPU1_IPU_CLK_ENABLE),
821 1.1 skrll CLK_GATE("ipu1_di0", "ipu1_di0_sel", CCM, CCGR3, IPU1_IPU_DI0_CLK_ENABLE),
822 1.1 skrll CLK_GATE("ipu1_di1", "ipu1_di1_sel", CCM, CCGR3, IPU1_IPU_DI1_CLK_ENABLE),
823 1.1 skrll CLK_GATE("ipu2", "ipu2_podf", CCM, CCGR3, IPU2_IPU_CLK_ENABLE),
824 1.1 skrll CLK_GATE("ipu2_di0", "ipu2_di0_sel", CCM, CCGR3, IPU2_IPU_DI0_CLK_ENABLE),
825 1.1 skrll CLK_GATE("ldb_di0", "ldb_di0_podf", CCM, CCGR3, LDB_DI0_CLK_ENABLE),
826 1.1 skrll CLK_GATE("ldb_di1", "ldb_di1_podf", CCM, CCGR3, LDB_DI1_CLK_ENABLE),
827 1.1 skrll CLK_GATE("ipu2_di1", "ipu2_di1_sel", CCM, CCGR3, IPU2_IPU_DI1_CLK_ENABLE),
828 1.1 skrll CLK_GATE("hsi_tx", "hsi_tx_podf", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
829 1.1 skrll CLK_GATE("mipi_core_cfg", "video_27m", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
830 1.1 skrll CLK_GATE("mipi_ipg", "ipg", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
831 1.1 skrll CLK_GATE("mlb", "axi", CCM, CCGR3, MLB_CLK_ENABLE),
832 1.1 skrll CLK_GATE("mmdc_ch0_axi", "mmdc_ch0_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P0_ENABLE),
833 1.1 skrll CLK_GATE("mmdc_ch1_axi", "mmdc_ch1_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P1_ENABLE),
834 1.1 skrll CLK_GATE("ocram", "ahb", CCM, CCGR3, OCRAM_CLK_ENABLE),
835 1.1 skrll CLK_GATE("openvg_axi", "axi", CCM, CCGR3, OPENVGAXICLK_CLK_ROOT_ENABLE),
836 1.1 skrll CLK_GATE("pcie_axi", "pcie_axi_sel", CCM, CCGR4, PCIE_ROOT_ENABLE),
837 1.1 skrll CLK_GATE("per1_bch", "usdhc3", CCM, CCGR4, PL301_MX6QPER1_BCHCLK_ENABLE),
838 1.1 skrll CLK_GATE("pwm1", "ipg_per", CCM, CCGR4, PWM1_CLK_ENABLE),
839 1.1 skrll CLK_GATE("pwm2", "ipg_per", CCM, CCGR4, PWM2_CLK_ENABLE),
840 1.1 skrll CLK_GATE("pwm3", "ipg_per", CCM, CCGR4, PWM3_CLK_ENABLE),
841 1.1 skrll CLK_GATE("pwm4", "ipg_per", CCM, CCGR4, PWM4_CLK_ENABLE),
842 1.1 skrll CLK_GATE("gpmi_bch_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_BCH_INPUT_APB_CLK_ENABLE),
843 1.1 skrll CLK_GATE("gpmi_bch", "usdhc4", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_BCH_CLK_ENABLE),
844 1.1 skrll CLK_GATE("gpmi_io", "enfc", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_CLK_ENABLE),
845 1.1 skrll CLK_GATE("gpmi_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_GPMI_INPUT_APB_CLK_ENABLE),
846 1.1 skrll CLK_GATE("rom", "ahb", CCM, CCGR5, ROM_CLK_ENABLE),
847 1.1 skrll CLK_GATE("sata", "ahb", CCM, CCGR5, SATA_CLK_ENABLE),
848 1.1 skrll CLK_GATE("sdma", "ahb", CCM, CCGR5, SDMA_CLK_ENABLE),
849 1.1 skrll CLK_GATE("spba", "ipg", CCM, CCGR5, SPBA_CLK_ENABLE),
850 1.1 skrll CLK_GATE("spdif", "spdif_podf", CCM, CCGR5, SPDIF_CLK_ENABLE),
851 1.1 skrll CLK_GATE("spdif_gclk", "ipg", CCM, CCGR5, SPDIF_CLK_ENABLE),
852 1.1 skrll CLK_GATE("ssi1_ipg", "ipg", CCM, CCGR5, SSI1_CLK_ENABLE),
853 1.1 skrll CLK_GATE("ssi2_ipg", "ipg", CCM, CCGR5, SSI2_CLK_ENABLE),
854 1.1 skrll CLK_GATE("ssi3_ipg", "ipg", CCM, CCGR5, SSI3_CLK_ENABLE),
855 1.1 skrll CLK_GATE("ssi1", "ssi1_podf", CCM, CCGR5, SSI1_CLK_ENABLE),
856 1.1 skrll CLK_GATE("ssi2", "ssi2_podf", CCM, CCGR5, SSI2_CLK_ENABLE),
857 1.1 skrll CLK_GATE("ssi3", "ssi3_podf", CCM, CCGR5, SSI3_CLK_ENABLE),
858 1.1 skrll CLK_GATE("uart_ipg", "ipg", CCM, CCGR5, UART_CLK_ENABLE),
859 1.1 skrll CLK_GATE("uart_serial", "uart_serial_podf", CCM, CCGR5, UART_SERIAL_CLK_ENABLE),
860 1.1 skrll CLK_GATE("usboh3", "ipg", CCM, CCGR6, USBOH3_CLK_ENABLE),
861 1.1 skrll CLK_GATE("usdhc1", "usdhc1_podf", CCM, CCGR6, USDHC1_CLK_ENABLE),
862 1.1 skrll CLK_GATE("usdhc2", "usdhc2_podf", CCM, CCGR6, USDHC2_CLK_ENABLE),
863 1.1 skrll CLK_GATE("usdhc3", "usdhc3_podf", CCM, CCGR6, USDHC3_CLK_ENABLE),
864 1.1 skrll CLK_GATE("usdhc4", "usdhc4_podf", CCM, CCGR6, USDHC4_CLK_ENABLE),
865 1.1 skrll CLK_GATE("eim_slow", "eim_slow_podf", CCM, CCGR6, EIM_SLOW_CLK_ENABLE),
866 1.1 skrll CLK_GATE("vdo_axi", "vdo_axi_sel", CCM, CCGR6, VDOAXICLK_CLK_ENABLE),
867 1.1 skrll CLK_GATE("vpu_axi", "vpu_axi_podf", CCM, CCGR6, VPU_CLK_ENABLE),
868 1.1 skrll CLK_GATE("cko1", "cko1_podf", CCM, CCOSR, CLKO1_EN),
869 1.1 skrll CLK_GATE("cko2", "cko2_podf", CCM, CCOSR, CLKO2_EN),
870 1.1 skrll
871 1.1 skrll CLK_GATE("sata_ref_100m", "sata_ref", CCM_ANALOG, PLL_ENET, ENABLE_100M),
872 1.1 skrll CLK_GATE("pcie_ref_125m", "pcie_ref", CCM_ANALOG, PLL_ENET, ENABLE_125M),
873 1.1 skrll
874 1.1 skrll CLK_GATE("pll1_sys", "pll1_bypass", CCM_ANALOG, PLL_ARM, ENABLE),
875 1.1 skrll CLK_GATE("pll2_bus", "pll2_bypass", CCM_ANALOG, PLL_SYS, ENABLE),
876 1.1 skrll CLK_GATE("pll3_usb_otg", "pll3_bypass", CCM_ANALOG, PLL_USB1, ENABLE),
877 1.1 skrll CLK_GATE("pll4_audio", "pll4_bypass", CCM_ANALOG, PLL_AUDIO, ENABLE),
878 1.1 skrll CLK_GATE("pll5_video", "pll5_bypass", CCM_ANALOG, PLL_VIDEO, ENABLE),
879 1.1 skrll CLK_GATE("pll6_enet", "pll6_bypass", CCM_ANALOG, PLL_ENET, ENABLE),
880 1.1 skrll CLK_GATE("pll7_usb_host", "pll7_bypass", CCM_ANALOG, PLL_USB2, ENABLE),
881 1.1 skrll
882 1.1 skrll CLK_GATE("usbphy1", "pll3_usb_otg", CCM_ANALOG, PLL_USB1, RESERVED),
883 1.1 skrll CLK_GATE("usbphy2", "pll7_usb_host", CCM_ANALOG, PLL_USB2, RESERVED),
884 1.1 skrll
885 1.1 skrll CLK_GATE_EXCLUSIVE("lvds1_gate", "lvds1_sel", CCM_ANALOG, MISC1, LVDS_CLK1_OBEN, LVDS_CLK1_IBEN),
886 1.1 skrll CLK_GATE_EXCLUSIVE("lvds2_gate", "lvds2_sel", CCM_ANALOG, MISC1, LVDS_CLK2_OBEN, LVDS_CLK2_IBEN),
887 1.1 skrll CLK_GATE_EXCLUSIVE("lvds1_in", "anaclk1", CCM_ANALOG, MISC1, LVDS_CLK1_IBEN, LVDS_CLK1_OBEN),
888 1.1 skrll CLK_GATE_EXCLUSIVE("lvds2_in", "anaclk2", CCM_ANALOG, MISC1, LVDS_CLK2_IBEN, LVDS_CLK2_OBEN),
889 1.1 skrll };
890 1.1 skrll
891 1.1 skrll static struct imx6_clk *imx6_clk_find(const char *);
892 1.1 skrll static struct imx6_clk *imx6_clk_find_by_id(u_int);
893 1.1 skrll
894 1.1 skrll static void imxccm_init_clocks(struct imx6ccm_softc *);
895 1.1 skrll static struct clk *imxccm_clk_get(void *, const char *);
896 1.1 skrll static void imxccm_clk_put(void *, struct clk *);
897 1.1 skrll static u_int imxccm_clk_get_rate(void *, struct clk *);
898 1.1 skrll static int imxccm_clk_set_rate(void *, struct clk *, u_int);
899 1.1 skrll static int imxccm_clk_enable(void *, struct clk *);
900 1.1 skrll static int imxccm_clk_disable(void *, struct clk *);
901 1.1 skrll static int imxccm_clk_set_parent(void *, struct clk *, struct clk *);
902 1.1 skrll static struct clk *imxccm_clk_get_parent(void *, struct clk *);
903 1.1 skrll
904 1.1 skrll static const struct clk_funcs imxccm_clk_funcs = {
905 1.1 skrll .get = imxccm_clk_get,
906 1.1 skrll .put = imxccm_clk_put,
907 1.1 skrll .get_rate = imxccm_clk_get_rate,
908 1.1 skrll .set_rate = imxccm_clk_set_rate,
909 1.1 skrll .enable = imxccm_clk_enable,
910 1.1 skrll .disable = imxccm_clk_disable,
911 1.1 skrll .set_parent = imxccm_clk_set_parent,
912 1.1 skrll .get_parent = imxccm_clk_get_parent,
913 1.1 skrll };
914 1.1 skrll
915 1.1 skrll void
916 1.1 skrll imx6ccm_attach_common(device_t self)
917 1.1 skrll {
918 1.1 skrll struct imx6ccm_softc * const sc = device_private(self);
919 1.1 skrll
920 1.1 skrll sc->sc_dev = self;
921 1.1 skrll
922 1.1 skrll sc->sc_clkdom.name = device_xname(self);
923 1.1 skrll sc->sc_clkdom.funcs = &imxccm_clk_funcs;
924 1.1 skrll sc->sc_clkdom.priv = sc;
925 1.1 skrll for (u_int n = 0; n < __arraycount(imx6_clks); n++) {
926 1.1 skrll imx6_clks[n].base.domain = &sc->sc_clkdom;
927 1.1 skrll clk_attach(&imx6_clks[n].base);
928 1.1 skrll }
929 1.1 skrll
930 1.1 skrll imxccm_init_clocks(sc);
931 1.1 skrll
932 1.1 skrll for (int n = 0; n < __arraycount(imx6_clks); n++) {
933 1.1 skrll struct clk *clk = &imx6_clks[n].base;
934 1.1 skrll struct clk *clk_parent = clk_get_parent(clk);
935 1.1 skrll const char *parent_str = clk_parent ? clk_parent->name : "none";
936 1.1 skrll aprint_verbose_dev(self, "%s (%s) : %u Hz\n", clk->name,
937 1.1 skrll parent_str, clk_get_rate(clk));
938 1.1 skrll }
939 1.1 skrll }
940 1.1 skrll
941 1.1 skrll struct clk *
942 1.1 skrll imx6_get_clock(const char *name)
943 1.1 skrll {
944 1.1 skrll struct imx6_clk *iclk;
945 1.1 skrll iclk = imx6_clk_find(name);
946 1.1 skrll
947 1.1 skrll if (iclk == NULL)
948 1.1 skrll return NULL;
949 1.1 skrll
950 1.1 skrll return &iclk->base;
951 1.1 skrll }
952 1.1 skrll
953 1.1 skrll struct clk *
954 1.1 skrll imx6_get_clock_by_id(u_int clock_id)
955 1.1 skrll {
956 1.1 skrll struct imx6_clk *iclk;
957 1.1 skrll iclk = imx6_clk_find_by_id(clock_id);
958 1.1 skrll
959 1.1 skrll if (iclk == NULL)
960 1.1 skrll return NULL;
961 1.1 skrll
962 1.1 skrll return &iclk->base;
963 1.1 skrll }
964 1.1 skrll
965 1.1 skrll static struct imx6_clk *
966 1.1 skrll imx6_clk_find(const char *name)
967 1.1 skrll {
968 1.1 skrll if (name == NULL)
969 1.1 skrll return NULL;
970 1.1 skrll
971 1.1 skrll for (int n = 0; n < __arraycount(imx6_clks); n++) {
972 1.1 skrll if (strcmp(imx6_clks[n].base.name, name) == 0)
973 1.1 skrll return &imx6_clks[n];
974 1.1 skrll }
975 1.1 skrll
976 1.1 skrll return NULL;
977 1.1 skrll }
978 1.1 skrll
979 1.1 skrll static struct imx6_clk *
980 1.1 skrll imx6_clk_find_by_id(u_int clock_id)
981 1.1 skrll {
982 1.1 skrll for (int n = 0; n < __arraycount(imx6_clock_ids); n++) {
983 1.1 skrll if (imx6_clock_ids[n].id == clock_id) {
984 1.1 skrll const char *name = imx6_clock_ids[n].name;
985 1.1 skrll return imx6_clk_find(name);
986 1.1 skrll }
987 1.1 skrll }
988 1.1 skrll
989 1.1 skrll return NULL;
990 1.1 skrll }
991 1.1 skrll
992 1.1 skrll struct imxccm_init_parent {
993 1.1 skrll const char *clock;
994 1.1 skrll const char *parent;
995 1.1 skrll } imxccm_init_parents[] = {
996 1.1 skrll { "pll1_bypass", "pll1" },
997 1.1 skrll { "pll2_bypass", "pll2" },
998 1.1 skrll { "pll3_bypass", "pll3" },
999 1.1 skrll { "pll4_bypass", "pll4" },
1000 1.1 skrll { "pll5_bypass", "pll5" },
1001 1.1 skrll { "pll6_bypass", "pll6" },
1002 1.1 skrll { "pll7_bypass", "pll7" },
1003 1.1 skrll { "lvds1_sel", "sata_ref_100m" },
1004 1.1 skrll };
1005 1.1 skrll
1006 1.1 skrll static void
1007 1.1 skrll imxccm_init_clocks(struct imx6ccm_softc *sc)
1008 1.1 skrll {
1009 1.1 skrll struct clk *clk;
1010 1.1 skrll struct clk *clk_parent;
1011 1.1 skrll
1012 1.1 skrll for (u_int n = 0; n < __arraycount(imxccm_init_parents); n++) {
1013 1.1 skrll clk = clk_get(&sc->sc_clkdom, imxccm_init_parents[n].clock);
1014 1.1 skrll KASSERT(clk != NULL);
1015 1.1 skrll clk_parent = clk_get(&sc->sc_clkdom, imxccm_init_parents[n].parent);
1016 1.1 skrll KASSERT(clk_parent != NULL);
1017 1.1 skrll
1018 1.1 skrll int error = clk_set_parent(clk, clk_parent);
1019 1.1 skrll if (error) {
1020 1.1 skrll aprint_error_dev(sc->sc_dev,
1021 1.1 skrll "couldn't set '%s' parent to '%s': %d\n",
1022 1.1 skrll clk->name, clk_parent->name, error);
1023 1.1 skrll }
1024 1.1 skrll clk_put(clk_parent);
1025 1.1 skrll clk_put(clk);
1026 1.1 skrll }
1027 1.1 skrll }
1028 1.1 skrll
1029 1.1 skrll static u_int
1030 1.1 skrll imxccm_clk_get_rate_pll_generic(struct imx6ccm_softc *sc, struct imx6_clk *iclk,
1031 1.1 skrll const u_int rate_parent)
1032 1.1 skrll {
1033 1.1 skrll struct imx6_clk_pll *pll = &iclk->clk.pll;
1034 1.1 skrll uint64_t freq = rate_parent;
1035 1.1 skrll
1036 1.1 skrll KASSERT((pll->type == IMX6_CLK_PLL_GENERIC) ||
1037 1.1 skrll (pll->type == IMX6_CLK_PLL_USB));
1038 1.1 skrll
1039 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
1040 1.1 skrll uint32_t div = __SHIFTOUT(v, pll->mask);
1041 1.1 skrll
1042 1.1 skrll return freq * ((div == 1) ? 22 : 20);
1043 1.1 skrll }
1044 1.1 skrll
1045 1.1 skrll static u_int
1046 1.1 skrll imxccm_clk_get_rate_pll_sys(struct imx6ccm_softc *sc, struct imx6_clk *iclk,
1047 1.1 skrll const u_int rate_parent)
1048 1.1 skrll {
1049 1.1 skrll struct imx6_clk_pll *pll = &iclk->clk.pll;
1050 1.1 skrll uint64_t freq = rate_parent;
1051 1.1 skrll
1052 1.1 skrll KASSERT(pll->type == IMX6_CLK_PLL_SYS);
1053 1.1 skrll
1054 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
1055 1.1 skrll uint32_t div = __SHIFTOUT(v, pll->mask);
1056 1.1 skrll
1057 1.1 skrll return freq * div / 2;
1058 1.1 skrll }
1059 1.1 skrll
1060 1.1 skrll #define PLL_AUDIO_VIDEO_NUM_OFFSET 0x10
1061 1.1 skrll #define PLL_AUDIO_VIDEO_DENOM_OFFSET 0x20
1062 1.1 skrll
1063 1.1 skrll static u_int
1064 1.1 skrll imxccm_clk_get_rate_pll_audio_video(struct imx6ccm_softc *sc,
1065 1.1 skrll struct imx6_clk *iclk, const u_int rate_parent)
1066 1.1 skrll {
1067 1.1 skrll struct imx6_clk_pll *pll = &iclk->clk.pll;
1068 1.1 skrll uint64_t freq = rate_parent;
1069 1.1 skrll
1070 1.1 skrll KASSERT(pll->type == IMX6_CLK_PLL_AUDIO_VIDEO);
1071 1.1 skrll
1072 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pll->reg);
1073 1.1 skrll uint32_t div = __SHIFTOUT(v, pll->mask);
1074 1.1 skrll uint32_t num = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog,
1075 1.1 skrll pll->reg + PLL_AUDIO_VIDEO_NUM_OFFSET);
1076 1.1 skrll uint32_t denom = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog,
1077 1.1 skrll pll->reg + PLL_AUDIO_VIDEO_DENOM_OFFSET);
1078 1.1 skrll
1079 1.1 skrll uint64_t tmp = freq * num / denom;
1080 1.1 skrll
1081 1.1 skrll return freq * div + tmp;
1082 1.1 skrll }
1083 1.1 skrll
1084 1.1 skrll static u_int
1085 1.1 skrll imxccm_clk_get_rate_pll_enet(struct imx6ccm_softc *sc,
1086 1.1 skrll struct imx6_clk *iclk, const u_int rate_parent)
1087 1.1 skrll {
1088 1.1 skrll struct imx6_clk_pll *pll = &iclk->clk.pll;
1089 1.1 skrll
1090 1.1 skrll KASSERT(pll->type == IMX6_CLK_PLL_ENET);
1091 1.1 skrll
1092 1.1 skrll return pll->ref;
1093 1.1 skrll }
1094 1.1 skrll
1095 1.1 skrll static u_int
1096 1.1 skrll imxccm_clk_get_rate_fixed_factor(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
1097 1.1 skrll {
1098 1.1 skrll struct imx6_clk_fixed_factor *fixed_factor = &iclk->clk.fixed_factor;
1099 1.1 skrll struct imx6_clk *parent;
1100 1.1 skrll
1101 1.1 skrll KASSERT(iclk->type == IMX6_CLK_FIXED_FACTOR);
1102 1.1 skrll
1103 1.1 skrll parent = imx6_clk_find(iclk->parent);
1104 1.1 skrll KASSERT(parent != NULL);
1105 1.1 skrll
1106 1.1 skrll uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
1107 1.1 skrll
1108 1.1 skrll return rate_parent * fixed_factor->mult / fixed_factor->div;
1109 1.1 skrll }
1110 1.1 skrll
1111 1.1 skrll static u_int
1112 1.1 skrll imxccm_clk_get_rate_pll(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
1113 1.1 skrll {
1114 1.1 skrll struct imx6_clk_pll *pll = &iclk->clk.pll;
1115 1.1 skrll struct imx6_clk *parent;
1116 1.1 skrll
1117 1.1 skrll KASSERT(iclk->type == IMX6_CLK_PLL);
1118 1.1 skrll
1119 1.1 skrll parent = imx6_clk_find(iclk->parent);
1120 1.1 skrll KASSERT(parent != NULL);
1121 1.1 skrll
1122 1.1 skrll uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
1123 1.1 skrll
1124 1.1 skrll switch(pll->type) {
1125 1.1 skrll case IMX6_CLK_PLL_GENERIC:
1126 1.1 skrll return imxccm_clk_get_rate_pll_generic(sc, iclk, rate_parent);
1127 1.1 skrll case IMX6_CLK_PLL_SYS:
1128 1.1 skrll return imxccm_clk_get_rate_pll_sys(sc, iclk, rate_parent);
1129 1.1 skrll case IMX6_CLK_PLL_USB:
1130 1.1 skrll return imxccm_clk_get_rate_pll_generic(sc, iclk, rate_parent);
1131 1.1 skrll case IMX6_CLK_PLL_AUDIO_VIDEO:
1132 1.1 skrll return imxccm_clk_get_rate_pll_audio_video(sc, iclk, rate_parent);
1133 1.1 skrll case IMX6_CLK_PLL_ENET:
1134 1.1 skrll return imxccm_clk_get_rate_pll_enet(sc, iclk, rate_parent);
1135 1.1 skrll default:
1136 1.1 skrll panic("imx6: unknown pll type %d", iclk->type);
1137 1.1 skrll }
1138 1.1 skrll }
1139 1.1 skrll
1140 1.1 skrll static u_int
1141 1.1 skrll imxccm_clk_get_rate_div(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
1142 1.1 skrll {
1143 1.1 skrll struct imx6_clk_div *div = &iclk->clk.div;
1144 1.1 skrll struct imx6_clk *parent;
1145 1.1 skrll
1146 1.1 skrll KASSERT(iclk->type == IMX6_CLK_DIV);
1147 1.1 skrll
1148 1.1 skrll parent = imx6_clk_find(iclk->parent);
1149 1.1 skrll KASSERT(parent != NULL);
1150 1.1 skrll
1151 1.1 skrll u_int rate = imxccm_clk_get_rate(sc, &parent->base);
1152 1.1 skrll
1153 1.1 skrll bus_space_handle_t ioh;
1154 1.1 skrll if (div->base == IMX6_CLK_REG_CCM_ANALOG)
1155 1.1 skrll ioh = sc->sc_ioh_analog;
1156 1.1 skrll else
1157 1.1 skrll ioh = sc->sc_ioh;
1158 1.1 skrll
1159 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, ioh, div->reg);
1160 1.1 skrll uint32_t n = __SHIFTOUT(v, div->mask);
1161 1.1 skrll
1162 1.1 skrll if (div->type == IMX6_CLK_DIV_TABLE) {
1163 1.1 skrll KASSERT(div->tbl != NULL);
1164 1.1 skrll
1165 1.1 skrll for (int i = 0; div->tbl[i] != 0; i++)
1166 1.1 skrll if (i == n)
1167 1.1 skrll rate /= div->tbl[i];
1168 1.1 skrll } else {
1169 1.1 skrll rate /= n + 1;
1170 1.1 skrll }
1171 1.1 skrll
1172 1.1 skrll return rate;
1173 1.1 skrll }
1174 1.1 skrll
1175 1.1 skrll static u_int
1176 1.1 skrll imxccm_clk_get_rate_pfd(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
1177 1.1 skrll {
1178 1.1 skrll struct imx6_clk_pfd *pfd = &iclk->clk.pfd;
1179 1.1 skrll struct imx6_clk *parent;
1180 1.1 skrll
1181 1.1 skrll KASSERT(iclk->type == IMX6_CLK_PFD);
1182 1.1 skrll
1183 1.1 skrll parent = imx6_clk_find(iclk->parent);
1184 1.1 skrll KASSERT(parent != NULL);
1185 1.1 skrll
1186 1.1 skrll uint64_t rate_parent = imxccm_clk_get_rate(sc, &parent->base);
1187 1.1 skrll
1188 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, sc->sc_ioh_analog, pfd->reg);
1189 1.1 skrll uint32_t n = __SHIFTOUT(v, __BITS(5, 0) << (pfd->index * 8));
1190 1.1 skrll
1191 1.1 skrll KASSERT(n != 0);
1192 1.1 skrll
1193 1.1 skrll return (rate_parent * 18) / n;
1194 1.1 skrll }
1195 1.1 skrll
1196 1.1 skrll static int
1197 1.1 skrll imxccm_clk_mux_wait(struct imx6ccm_softc *sc, struct imx6_clk_mux *mux)
1198 1.1 skrll {
1199 1.1 skrll KASSERT(mux->busy_reg == 0);
1200 1.1 skrll KASSERT(mux->busy_mask == 0);
1201 1.1 skrll
1202 1.1 skrll bus_space_handle_t ioh;
1203 1.1 skrll if (mux->base == IMX6_CLK_REG_CCM_ANALOG)
1204 1.1 skrll ioh = sc->sc_ioh_analog;
1205 1.1 skrll else
1206 1.1 skrll ioh = sc->sc_ioh;
1207 1.1 skrll
1208 1.1 skrll while (bus_space_read_4(sc->sc_iot, ioh, mux->busy_reg) & mux->busy_mask)
1209 1.1 skrll delay(10);
1210 1.1 skrll
1211 1.1 skrll return 0;
1212 1.1 skrll }
1213 1.1 skrll
1214 1.1 skrll static int
1215 1.1 skrll imxccm_clk_set_parent_mux(struct imx6ccm_softc *sc,
1216 1.1 skrll struct imx6_clk *iclk, struct clk *parent)
1217 1.1 skrll {
1218 1.1 skrll struct imx6_clk_mux *mux = &iclk->clk.mux;
1219 1.1 skrll const char *pname = parent->name;
1220 1.1 skrll u_int sel;
1221 1.1 skrll
1222 1.1 skrll KASSERT(iclk->type == IMX6_CLK_MUX);
1223 1.1 skrll
1224 1.1 skrll for (sel = 0; sel < mux->nparents; sel++)
1225 1.1 skrll if (strcmp(pname, mux->parents[sel]) == 0)
1226 1.1 skrll break;
1227 1.1 skrll
1228 1.1 skrll if (sel == mux->nparents)
1229 1.1 skrll return EINVAL;
1230 1.1 skrll
1231 1.1 skrll bus_space_handle_t ioh;
1232 1.1 skrll if (mux->base == IMX6_CLK_REG_CCM_ANALOG)
1233 1.1 skrll ioh = sc->sc_ioh_analog;
1234 1.1 skrll else
1235 1.1 skrll ioh = sc->sc_ioh;
1236 1.1 skrll
1237 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, ioh, mux->reg);
1238 1.1 skrll v &= ~mux->mask;
1239 1.1 skrll v |= __SHIFTIN(sel, mux->mask);
1240 1.1 skrll
1241 1.1 skrll bus_space_write_4(sc->sc_iot, ioh, mux->reg, v);
1242 1.1 skrll
1243 1.1 skrll iclk->parent = pname;
1244 1.1 skrll
1245 1.1 skrll if (mux->type == IMX6_CLK_MUX_BUSY)
1246 1.1 skrll imxccm_clk_mux_wait(sc, mux);
1247 1.1 skrll
1248 1.1 skrll return 0;
1249 1.1 skrll }
1250 1.1 skrll
1251 1.1 skrll static struct imx6_clk *
1252 1.1 skrll imxccm_clk_get_parent_mux(struct imx6ccm_softc *sc, struct imx6_clk *iclk)
1253 1.1 skrll {
1254 1.1 skrll struct imx6_clk_mux *mux = &iclk->clk.mux;
1255 1.1 skrll
1256 1.1 skrll KASSERT(iclk->type == IMX6_CLK_MUX);
1257 1.1 skrll
1258 1.1 skrll bus_space_handle_t ioh;
1259 1.1 skrll if (mux->base == IMX6_CLK_REG_CCM_ANALOG)
1260 1.1 skrll ioh = sc->sc_ioh_analog;
1261 1.1 skrll else
1262 1.1 skrll ioh = sc->sc_ioh;
1263 1.1 skrll
1264 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, ioh, mux->reg);
1265 1.1 skrll u_int sel = __SHIFTOUT(v, mux->mask);
1266 1.1 skrll
1267 1.1 skrll KASSERT(sel < mux->nparents);
1268 1.1 skrll
1269 1.1 skrll iclk->parent = mux->parents[sel];
1270 1.1 skrll
1271 1.1 skrll return imx6_clk_find(iclk->parent);
1272 1.1 skrll }
1273 1.1 skrll
1274 1.1 skrll static int
1275 1.1 skrll imxccm_clk_set_rate_pll(struct imx6ccm_softc *sc,
1276 1.1 skrll struct imx6_clk *iclk, u_int rate)
1277 1.1 skrll {
1278 1.1 skrll /* ToDo */
1279 1.1 skrll
1280 1.1 skrll return EOPNOTSUPP;
1281 1.1 skrll }
1282 1.1 skrll
1283 1.1 skrll static int
1284 1.1 skrll imxccm_clk_set_rate_div(struct imx6ccm_softc *sc,
1285 1.1 skrll struct imx6_clk *iclk, u_int rate)
1286 1.1 skrll {
1287 1.1 skrll struct imx6_clk_div *div = &iclk->clk.div;
1288 1.1 skrll struct imx6_clk *parent;
1289 1.1 skrll
1290 1.1 skrll KASSERT(iclk->type == IMX6_CLK_DIV);
1291 1.1 skrll
1292 1.1 skrll parent = imx6_clk_find(iclk->parent);
1293 1.1 skrll KASSERT(parent != NULL);
1294 1.1 skrll
1295 1.1 skrll u_int rate_parent = imxccm_clk_get_rate(sc, &parent->base);
1296 1.1 skrll u_int divider = uimax(1, rate_parent / rate);
1297 1.1 skrll
1298 1.1 skrll bus_space_handle_t ioh;
1299 1.1 skrll if (div->base == IMX6_CLK_REG_CCM_ANALOG)
1300 1.1 skrll ioh = sc->sc_ioh_analog;
1301 1.1 skrll else
1302 1.1 skrll ioh = sc->sc_ioh;
1303 1.1 skrll
1304 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, ioh, div->reg);
1305 1.1 skrll v &= ~div->mask;
1306 1.1 skrll if (div->type == IMX6_CLK_DIV_TABLE) {
1307 1.1 skrll int n = -1;
1308 1.1 skrll
1309 1.1 skrll KASSERT(div->tbl != NULL);
1310 1.1 skrll for (int i = 0; div->tbl[i] != 0; i++)
1311 1.1 skrll if (div->tbl[i] == divider)
1312 1.1 skrll n = i;
1313 1.1 skrll
1314 1.1 skrll if (n >= 0)
1315 1.1 skrll v |= __SHIFTIN(n, div->mask);
1316 1.1 skrll else
1317 1.1 skrll return EINVAL;
1318 1.1 skrll } else {
1319 1.1 skrll v |= __SHIFTIN(divider - 1, div->mask);
1320 1.1 skrll }
1321 1.1 skrll bus_space_write_4(sc->sc_iot, ioh, div->reg, v);
1322 1.1 skrll
1323 1.1 skrll return 0;
1324 1.1 skrll }
1325 1.1 skrll
1326 1.1 skrll /*
1327 1.1 skrll * CLK Driver APIs
1328 1.1 skrll */
1329 1.1 skrll static struct clk *
1330 1.1 skrll imxccm_clk_get(void *priv, const char *name)
1331 1.1 skrll {
1332 1.1 skrll struct imx6_clk *iclk;
1333 1.1 skrll
1334 1.1 skrll iclk = imx6_clk_find(name);
1335 1.1 skrll if (iclk == NULL)
1336 1.1 skrll return NULL;
1337 1.1 skrll
1338 1.1 skrll atomic_inc_uint(&iclk->refcnt);
1339 1.1 skrll
1340 1.1 skrll return &iclk->base;
1341 1.1 skrll }
1342 1.1 skrll
1343 1.1 skrll static void
1344 1.1 skrll imxccm_clk_put(void *priv, struct clk *clk)
1345 1.1 skrll {
1346 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1347 1.1 skrll
1348 1.1 skrll KASSERT(iclk->refcnt > 0);
1349 1.1 skrll
1350 1.1 skrll atomic_dec_uint(&iclk->refcnt);
1351 1.1 skrll }
1352 1.1 skrll
1353 1.1 skrll static u_int
1354 1.1 skrll imxccm_clk_get_rate(void *priv, struct clk *clk)
1355 1.1 skrll {
1356 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1357 1.1 skrll struct clk *parent;
1358 1.1 skrll struct imx6ccm_softc *sc = priv;
1359 1.1 skrll
1360 1.1 skrll switch (iclk->type) {
1361 1.1 skrll case IMX6_CLK_FIXED:
1362 1.1 skrll return iclk->clk.fixed.rate;
1363 1.1 skrll case IMX6_CLK_FIXED_FACTOR:
1364 1.1 skrll return imxccm_clk_get_rate_fixed_factor(sc, iclk);
1365 1.1 skrll case IMX6_CLK_PLL:
1366 1.1 skrll return imxccm_clk_get_rate_pll(sc, iclk);
1367 1.1 skrll case IMX6_CLK_MUX:
1368 1.1 skrll case IMX6_CLK_GATE:
1369 1.1 skrll parent = imxccm_clk_get_parent(sc, clk);
1370 1.1 skrll return imxccm_clk_get_rate(sc, parent);
1371 1.1 skrll case IMX6_CLK_DIV:
1372 1.1 skrll return imxccm_clk_get_rate_div(sc, iclk);
1373 1.1 skrll case IMX6_CLK_PFD:
1374 1.1 skrll return imxccm_clk_get_rate_pfd(sc, iclk);
1375 1.1 skrll default:
1376 1.1 skrll panic("imx6: unknown clk type %d", iclk->type);
1377 1.1 skrll }
1378 1.1 skrll }
1379 1.1 skrll
1380 1.1 skrll static int
1381 1.1 skrll imxccm_clk_set_rate(void *priv, struct clk *clk, u_int rate)
1382 1.1 skrll {
1383 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1384 1.1 skrll struct imx6ccm_softc *sc = priv;
1385 1.1 skrll
1386 1.1 skrll switch (iclk->type) {
1387 1.1 skrll case IMX6_CLK_FIXED:
1388 1.1 skrll case IMX6_CLK_FIXED_FACTOR:
1389 1.1 skrll return ENXIO;
1390 1.1 skrll case IMX6_CLK_PLL:
1391 1.1 skrll return imxccm_clk_set_rate_pll(sc, iclk, rate);
1392 1.1 skrll case IMX6_CLK_MUX:
1393 1.1 skrll return ENXIO;
1394 1.1 skrll case IMX6_CLK_GATE:
1395 1.1 skrll return ENXIO;
1396 1.1 skrll case IMX6_CLK_DIV:
1397 1.1 skrll return imxccm_clk_set_rate_div(sc, iclk, rate);
1398 1.1 skrll case IMX6_CLK_PFD:
1399 1.1 skrll return EINVAL;
1400 1.1 skrll default:
1401 1.1 skrll panic("imx6: unknown clk type %d", iclk->type);
1402 1.1 skrll }
1403 1.1 skrll }
1404 1.1 skrll
1405 1.1 skrll static int
1406 1.1 skrll imxccm_clk_enable_pll(struct imx6ccm_softc *sc, struct imx6_clk *iclk, bool enable)
1407 1.1 skrll {
1408 1.1 skrll struct imx6_clk_pll *pll = &iclk->clk.pll;
1409 1.1 skrll
1410 1.1 skrll KASSERT(iclk->type == IMX6_CLK_PLL);
1411 1.1 skrll
1412 1.1 skrll /* Power up bit */
1413 1.1 skrll if (pll->type == IMX6_CLK_PLL_USB)
1414 1.1 skrll enable = !enable;
1415 1.1 skrll
1416 1.1 skrll bus_space_handle_t ioh = sc->sc_ioh_analog;
1417 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, ioh, pll->reg);
1418 1.1 skrll if (__SHIFTOUT(v, pll->powerdown) != enable)
1419 1.1 skrll return 0;
1420 1.1 skrll if (enable)
1421 1.1 skrll v &= ~pll->powerdown;
1422 1.1 skrll else
1423 1.1 skrll v |= pll->powerdown;
1424 1.1 skrll bus_space_write_4(sc->sc_iot, ioh, pll->reg, v);
1425 1.1 skrll
1426 1.1 skrll /* wait look */
1427 1.1 skrll while (!(bus_space_read_4(sc->sc_iot, ioh, pll->reg) & CCM_ANALOG_PLL_LOCK))
1428 1.1 skrll delay(10);
1429 1.1 skrll
1430 1.1 skrll return 0;
1431 1.1 skrll }
1432 1.1 skrll
1433 1.1 skrll static int
1434 1.1 skrll imxccm_clk_enable_gate(struct imx6ccm_softc *sc, struct imx6_clk *iclk, bool enable)
1435 1.1 skrll {
1436 1.1 skrll struct imx6_clk_gate *gate = &iclk->clk.gate;
1437 1.1 skrll
1438 1.1 skrll KASSERT(iclk->type == IMX6_CLK_GATE);
1439 1.1 skrll
1440 1.1 skrll bus_space_handle_t ioh;
1441 1.1 skrll if (gate->base == IMX6_CLK_REG_CCM_ANALOG)
1442 1.1 skrll ioh = sc->sc_ioh_analog;
1443 1.1 skrll else
1444 1.1 skrll ioh = sc->sc_ioh;
1445 1.1 skrll
1446 1.1 skrll uint32_t v = bus_space_read_4(sc->sc_iot, ioh, gate->reg);
1447 1.1 skrll if (enable) {
1448 1.1 skrll if (gate->exclusive_mask)
1449 1.1 skrll v &= ~gate->exclusive_mask;
1450 1.1 skrll v |= gate->mask;
1451 1.1 skrll } else {
1452 1.1 skrll if (gate->exclusive_mask)
1453 1.1 skrll v |= gate->exclusive_mask;
1454 1.1 skrll v &= ~gate->mask;
1455 1.1 skrll }
1456 1.1 skrll bus_space_write_4(sc->sc_iot, ioh, gate->reg, v);
1457 1.1 skrll
1458 1.1 skrll return 0;
1459 1.1 skrll }
1460 1.1 skrll
1461 1.1 skrll static int
1462 1.1 skrll imxccm_clk_enable(void *priv, struct clk *clk)
1463 1.1 skrll {
1464 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1465 1.1 skrll struct imx6_clk *parent = NULL;
1466 1.1 skrll struct imx6ccm_softc *sc = priv;
1467 1.1 skrll
1468 1.1 skrll if ((parent = imx6_clk_find(iclk->parent)) != NULL)
1469 1.1 skrll imxccm_clk_enable(sc, &parent->base);
1470 1.1 skrll
1471 1.1 skrll switch (iclk->type) {
1472 1.1 skrll case IMX6_CLK_FIXED:
1473 1.1 skrll case IMX6_CLK_FIXED_FACTOR:
1474 1.1 skrll return 0; /* always on */
1475 1.1 skrll case IMX6_CLK_PLL:
1476 1.1 skrll return imxccm_clk_enable_pll(sc, iclk, true);
1477 1.1 skrll case IMX6_CLK_MUX:
1478 1.1 skrll case IMX6_CLK_DIV:
1479 1.1 skrll case IMX6_CLK_PFD:
1480 1.1 skrll return 0;
1481 1.1 skrll case IMX6_CLK_GATE:
1482 1.1 skrll return imxccm_clk_enable_gate(sc, iclk, true);
1483 1.1 skrll default:
1484 1.1 skrll panic("imx6: unknown clk type %d", iclk->type);
1485 1.1 skrll }
1486 1.1 skrll }
1487 1.1 skrll
1488 1.1 skrll static int
1489 1.1 skrll imxccm_clk_disable(void *priv, struct clk *clk)
1490 1.1 skrll {
1491 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1492 1.1 skrll struct imx6ccm_softc *sc = priv;
1493 1.1 skrll
1494 1.1 skrll switch (iclk->type) {
1495 1.1 skrll case IMX6_CLK_FIXED:
1496 1.1 skrll case IMX6_CLK_FIXED_FACTOR:
1497 1.1 skrll return EINVAL; /* always on */
1498 1.1 skrll case IMX6_CLK_PLL:
1499 1.1 skrll return imxccm_clk_enable_pll(sc, iclk, false);
1500 1.1 skrll case IMX6_CLK_MUX:
1501 1.1 skrll case IMX6_CLK_DIV:
1502 1.1 skrll case IMX6_CLK_PFD:
1503 1.1 skrll return EINVAL;
1504 1.1 skrll case IMX6_CLK_GATE:
1505 1.1 skrll return imxccm_clk_enable_gate(sc, iclk, false);
1506 1.1 skrll default:
1507 1.1 skrll panic("imx6: unknown clk type %d", iclk->type);
1508 1.1 skrll }
1509 1.1 skrll }
1510 1.1 skrll
1511 1.1 skrll static int
1512 1.1 skrll imxccm_clk_set_parent(void *priv, struct clk *clk, struct clk *parent)
1513 1.1 skrll {
1514 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1515 1.1 skrll struct imx6ccm_softc *sc = priv;
1516 1.1 skrll
1517 1.1 skrll switch (iclk->type) {
1518 1.1 skrll case IMX6_CLK_FIXED:
1519 1.1 skrll case IMX6_CLK_FIXED_FACTOR:
1520 1.1 skrll case IMX6_CLK_PLL:
1521 1.1 skrll case IMX6_CLK_GATE:
1522 1.1 skrll case IMX6_CLK_DIV:
1523 1.1 skrll case IMX6_CLK_PFD:
1524 1.1 skrll return EINVAL;
1525 1.1 skrll case IMX6_CLK_MUX:
1526 1.1 skrll return imxccm_clk_set_parent_mux(sc, iclk, parent);
1527 1.1 skrll default:
1528 1.1 skrll panic("imx6: unknown clk type %d", iclk->type);
1529 1.1 skrll }
1530 1.1 skrll }
1531 1.1 skrll
1532 1.1 skrll static struct clk *
1533 1.1 skrll imxccm_clk_get_parent(void *priv, struct clk *clk)
1534 1.1 skrll {
1535 1.1 skrll struct imx6_clk *iclk = (struct imx6_clk *)clk;
1536 1.1 skrll struct imx6_clk *parent = NULL;
1537 1.1 skrll struct imx6ccm_softc *sc = priv;
1538 1.1 skrll
1539 1.1 skrll switch (iclk->type) {
1540 1.1 skrll case IMX6_CLK_FIXED:
1541 1.1 skrll case IMX6_CLK_FIXED_FACTOR:
1542 1.1 skrll case IMX6_CLK_PLL:
1543 1.1 skrll case IMX6_CLK_GATE:
1544 1.1 skrll case IMX6_CLK_DIV:
1545 1.1 skrll case IMX6_CLK_PFD:
1546 1.1 skrll if (iclk->parent != NULL)
1547 1.1 skrll parent = imx6_clk_find(iclk->parent);
1548 1.1 skrll break;
1549 1.1 skrll case IMX6_CLK_MUX:
1550 1.1 skrll parent = imxccm_clk_get_parent_mux(sc, iclk);
1551 1.1 skrll break;
1552 1.1 skrll default:
1553 1.1 skrll panic("imx6: unknown clk type %d", iclk->type);
1554 1.1 skrll }
1555 1.1 skrll
1556 1.1 skrll return (struct clk *)parent;
1557 1.1 skrll }
1558