xref: /linux/drivers/clk/meson/g12a.c (revision ebf68996de0ab250c5d520eb2291ab65643e9a1e)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Amlogic Meson-G12A Clock Controller Driver
4  *
5  * Copyright (c) 2016 Baylibre SAS.
6  * Author: Michael Turquette <mturquette@baylibre.com>
7  *
8  * Copyright (c) 2018 Amlogic, inc.
9  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
10  * Author: Jian Hu <jian.hu@amlogic.com>
11  */
12 
13 #include <linux/clk-provider.h>
14 #include <linux/init.h>
15 #include <linux/of_device.h>
16 #include <linux/platform_device.h>
17 
18 #include "clk-input.h"
19 #include "clk-mpll.h"
20 #include "clk-pll.h"
21 #include "clk-regmap.h"
22 #include "vid-pll-div.h"
23 #include "meson-eeclk.h"
24 #include "g12a.h"
25 
26 static DEFINE_SPINLOCK(meson_clk_lock);
27 
28 static struct clk_regmap g12a_fixed_pll_dco = {
29 	.data = &(struct meson_clk_pll_data){
30 		.en = {
31 			.reg_off = HHI_FIX_PLL_CNTL0,
32 			.shift   = 28,
33 			.width   = 1,
34 		},
35 		.m = {
36 			.reg_off = HHI_FIX_PLL_CNTL0,
37 			.shift   = 0,
38 			.width   = 8,
39 		},
40 		.n = {
41 			.reg_off = HHI_FIX_PLL_CNTL0,
42 			.shift   = 10,
43 			.width   = 5,
44 		},
45 		.frac = {
46 			.reg_off = HHI_FIX_PLL_CNTL1,
47 			.shift   = 0,
48 			.width   = 17,
49 		},
50 		.l = {
51 			.reg_off = HHI_FIX_PLL_CNTL0,
52 			.shift   = 31,
53 			.width   = 1,
54 		},
55 		.rst = {
56 			.reg_off = HHI_FIX_PLL_CNTL0,
57 			.shift   = 29,
58 			.width   = 1,
59 		},
60 	},
61 	.hw.init = &(struct clk_init_data){
62 		.name = "fixed_pll_dco",
63 		.ops = &meson_clk_pll_ro_ops,
64 		.parent_names = (const char *[]){ IN_PREFIX "xtal" },
65 		.num_parents = 1,
66 	},
67 };
68 
69 static struct clk_regmap g12a_fixed_pll = {
70 	.data = &(struct clk_regmap_div_data){
71 		.offset = HHI_FIX_PLL_CNTL0,
72 		.shift = 16,
73 		.width = 2,
74 		.flags = CLK_DIVIDER_POWER_OF_TWO,
75 	},
76 	.hw.init = &(struct clk_init_data){
77 		.name = "fixed_pll",
78 		.ops = &clk_regmap_divider_ro_ops,
79 		.parent_names = (const char *[]){ "fixed_pll_dco" },
80 		.num_parents = 1,
81 		/*
82 		 * This clock won't ever change at runtime so
83 		 * CLK_SET_RATE_PARENT is not required
84 		 */
85 	},
86 };
87 
88 /*
89  * Internal sys pll emulation configuration parameters
90  */
91 static const struct reg_sequence g12a_sys_init_regs[] = {
92 	{ .reg = HHI_SYS_PLL_CNTL1,	.def = 0x00000000 },
93 	{ .reg = HHI_SYS_PLL_CNTL2,	.def = 0x00000000 },
94 	{ .reg = HHI_SYS_PLL_CNTL3,	.def = 0x48681c00 },
95 	{ .reg = HHI_SYS_PLL_CNTL4,	.def = 0x88770290 },
96 	{ .reg = HHI_SYS_PLL_CNTL5,	.def = 0x39272000 },
97 	{ .reg = HHI_SYS_PLL_CNTL6,	.def = 0x56540000 },
98 };
99 
100 static struct clk_regmap g12a_sys_pll_dco = {
101 	.data = &(struct meson_clk_pll_data){
102 		.en = {
103 			.reg_off = HHI_SYS_PLL_CNTL0,
104 			.shift   = 28,
105 			.width   = 1,
106 		},
107 		.m = {
108 			.reg_off = HHI_SYS_PLL_CNTL0,
109 			.shift   = 0,
110 			.width   = 8,
111 		},
112 		.n = {
113 			.reg_off = HHI_SYS_PLL_CNTL0,
114 			.shift   = 10,
115 			.width   = 5,
116 		},
117 		.l = {
118 			.reg_off = HHI_SYS_PLL_CNTL0,
119 			.shift   = 31,
120 			.width   = 1,
121 		},
122 		.rst = {
123 			.reg_off = HHI_SYS_PLL_CNTL0,
124 			.shift   = 29,
125 			.width   = 1,
126 		},
127 		.init_regs = g12a_sys_init_regs,
128 		.init_count = ARRAY_SIZE(g12a_sys_init_regs),
129 	},
130 	.hw.init = &(struct clk_init_data){
131 		.name = "sys_pll_dco",
132 		.ops = &meson_clk_pll_ro_ops,
133 		.parent_names = (const char *[]){ IN_PREFIX "xtal" },
134 		.num_parents = 1,
135 	},
136 };
137 
138 static struct clk_regmap g12a_sys_pll = {
139 	.data = &(struct clk_regmap_div_data){
140 		.offset = HHI_SYS_PLL_CNTL0,
141 		.shift = 16,
142 		.width = 3,
143 		.flags = CLK_DIVIDER_POWER_OF_TWO,
144 	},
145 	.hw.init = &(struct clk_init_data){
146 		.name = "sys_pll",
147 		.ops = &clk_regmap_divider_ro_ops,
148 		.parent_names = (const char *[]){ "sys_pll_dco" },
149 		.num_parents = 1,
150 	},
151 };
152 
153 static struct clk_regmap g12a_sys_pll_div16_en = {
154 	.data = &(struct clk_regmap_gate_data){
155 		.offset = HHI_SYS_CPU_CLK_CNTL1,
156 		.bit_idx = 24,
157 	},
158 	.hw.init = &(struct clk_init_data) {
159 		.name = "sys_pll_div16_en",
160 		.ops = &clk_regmap_gate_ro_ops,
161 		.parent_names = (const char *[]){ "sys_pll" },
162 		.num_parents = 1,
163 		/*
164 		 * This clock is used to debug the sys_pll range
165 		 * Linux should not change it at runtime
166 		 */
167 	},
168 };
169 
170 static struct clk_fixed_factor g12a_sys_pll_div16 = {
171 	.mult = 1,
172 	.div = 16,
173 	.hw.init = &(struct clk_init_data){
174 		.name = "sys_pll_div16",
175 		.ops = &clk_fixed_factor_ops,
176 		.parent_names = (const char *[]){ "sys_pll_div16_en" },
177 		.num_parents = 1,
178 	},
179 };
180 
181 /* Datasheet names this field as "premux0" */
182 static struct clk_regmap g12a_cpu_clk_premux0 = {
183 	.data = &(struct clk_regmap_mux_data){
184 		.offset = HHI_SYS_CPU_CLK_CNTL0,
185 		.mask = 0x3,
186 		.shift = 0,
187 	},
188 	.hw.init = &(struct clk_init_data){
189 		.name = "cpu_clk_dyn0_sel",
190 		.ops = &clk_regmap_mux_ro_ops,
191 		.parent_names = (const char *[]){ IN_PREFIX "xtal",
192 						  "fclk_div2",
193 						  "fclk_div3" },
194 		.num_parents = 3,
195 	},
196 };
197 
198 /* Datasheet names this field as "mux0_divn_tcnt" */
199 static struct clk_regmap g12a_cpu_clk_mux0_div = {
200 	.data = &(struct clk_regmap_div_data){
201 		.offset = HHI_SYS_CPU_CLK_CNTL0,
202 		.shift = 4,
203 		.width = 6,
204 	},
205 	.hw.init = &(struct clk_init_data){
206 		.name = "cpu_clk_dyn0_div",
207 		.ops = &clk_regmap_divider_ro_ops,
208 		.parent_names = (const char *[]){ "cpu_clk_dyn0_sel" },
209 		.num_parents = 1,
210 	},
211 };
212 
213 /* Datasheet names this field as "postmux0" */
214 static struct clk_regmap g12a_cpu_clk_postmux0 = {
215 	.data = &(struct clk_regmap_mux_data){
216 		.offset = HHI_SYS_CPU_CLK_CNTL0,
217 		.mask = 0x1,
218 		.shift = 2,
219 	},
220 	.hw.init = &(struct clk_init_data){
221 		.name = "cpu_clk_dyn0",
222 		.ops = &clk_regmap_mux_ro_ops,
223 		.parent_names = (const char *[]){ "cpu_clk_dyn0_sel",
224 						  "cpu_clk_dyn0_div" },
225 		.num_parents = 2,
226 	},
227 };
228 
229 /* Datasheet names this field as "premux1" */
230 static struct clk_regmap g12a_cpu_clk_premux1 = {
231 	.data = &(struct clk_regmap_mux_data){
232 		.offset = HHI_SYS_CPU_CLK_CNTL0,
233 		.mask = 0x3,
234 		.shift = 16,
235 	},
236 	.hw.init = &(struct clk_init_data){
237 		.name = "cpu_clk_dyn1_sel",
238 		.ops = &clk_regmap_mux_ro_ops,
239 		.parent_names = (const char *[]){ IN_PREFIX "xtal",
240 						  "fclk_div2",
241 						  "fclk_div3" },
242 		.num_parents = 3,
243 	},
244 };
245 
246 /* Datasheet names this field as "Mux1_divn_tcnt" */
247 static struct clk_regmap g12a_cpu_clk_mux1_div = {
248 	.data = &(struct clk_regmap_div_data){
249 		.offset = HHI_SYS_CPU_CLK_CNTL0,
250 		.shift = 20,
251 		.width = 6,
252 	},
253 	.hw.init = &(struct clk_init_data){
254 		.name = "cpu_clk_dyn1_div",
255 		.ops = &clk_regmap_divider_ro_ops,
256 		.parent_names = (const char *[]){ "cpu_clk_dyn1_sel" },
257 		.num_parents = 1,
258 	},
259 };
260 
261 /* Datasheet names this field as "postmux1" */
262 static struct clk_regmap g12a_cpu_clk_postmux1 = {
263 	.data = &(struct clk_regmap_mux_data){
264 		.offset = HHI_SYS_CPU_CLK_CNTL0,
265 		.mask = 0x1,
266 		.shift = 18,
267 	},
268 	.hw.init = &(struct clk_init_data){
269 		.name = "cpu_clk_dyn1",
270 		.ops = &clk_regmap_mux_ro_ops,
271 		.parent_names = (const char *[]){ "cpu_clk_dyn1_sel",
272 						  "cpu_clk_dyn1_div" },
273 		.num_parents = 2,
274 	},
275 };
276 
277 /* Datasheet names this field as "Final_dyn_mux_sel" */
278 static struct clk_regmap g12a_cpu_clk_dyn = {
279 	.data = &(struct clk_regmap_mux_data){
280 		.offset = HHI_SYS_CPU_CLK_CNTL0,
281 		.mask = 0x1,
282 		.shift = 10,
283 	},
284 	.hw.init = &(struct clk_init_data){
285 		.name = "cpu_clk_dyn",
286 		.ops = &clk_regmap_mux_ro_ops,
287 		.parent_names = (const char *[]){ "cpu_clk_dyn0",
288 						  "cpu_clk_dyn1" },
289 		.num_parents = 2,
290 	},
291 };
292 
293 /* Datasheet names this field as "Final_mux_sel" */
294 static struct clk_regmap g12a_cpu_clk = {
295 	.data = &(struct clk_regmap_mux_data){
296 		.offset = HHI_SYS_CPU_CLK_CNTL0,
297 		.mask = 0x1,
298 		.shift = 11,
299 	},
300 	.hw.init = &(struct clk_init_data){
301 		.name = "cpu_clk",
302 		.ops = &clk_regmap_mux_ro_ops,
303 		.parent_names = (const char *[]){ "cpu_clk_dyn",
304 						  "sys_pll" },
305 		.num_parents = 2,
306 	},
307 };
308 
309 static struct clk_regmap g12a_cpu_clk_div16_en = {
310 	.data = &(struct clk_regmap_gate_data){
311 		.offset = HHI_SYS_CPU_CLK_CNTL1,
312 		.bit_idx = 1,
313 	},
314 	.hw.init = &(struct clk_init_data) {
315 		.name = "cpu_clk_div16_en",
316 		.ops = &clk_regmap_gate_ro_ops,
317 		.parent_names = (const char *[]){ "cpu_clk" },
318 		.num_parents = 1,
319 		/*
320 		 * This clock is used to debug the cpu_clk range
321 		 * Linux should not change it at runtime
322 		 */
323 	},
324 };
325 
326 static struct clk_fixed_factor g12a_cpu_clk_div16 = {
327 	.mult = 1,
328 	.div = 16,
329 	.hw.init = &(struct clk_init_data){
330 		.name = "cpu_clk_div16",
331 		.ops = &clk_fixed_factor_ops,
332 		.parent_names = (const char *[]){ "cpu_clk_div16_en" },
333 		.num_parents = 1,
334 	},
335 };
336 
337 static struct clk_regmap g12a_cpu_clk_apb_div = {
338 	.data = &(struct clk_regmap_div_data){
339 		.offset = HHI_SYS_CPU_CLK_CNTL1,
340 		.shift = 3,
341 		.width = 3,
342 		.flags = CLK_DIVIDER_POWER_OF_TWO,
343 	},
344 	.hw.init = &(struct clk_init_data){
345 		.name = "cpu_clk_apb_div",
346 		.ops = &clk_regmap_divider_ro_ops,
347 		.parent_names = (const char *[]){ "cpu_clk" },
348 		.num_parents = 1,
349 	},
350 };
351 
352 static struct clk_regmap g12a_cpu_clk_apb = {
353 	.data = &(struct clk_regmap_gate_data){
354 		.offset = HHI_SYS_CPU_CLK_CNTL1,
355 		.bit_idx = 1,
356 	},
357 	.hw.init = &(struct clk_init_data) {
358 		.name = "cpu_clk_apb",
359 		.ops = &clk_regmap_gate_ro_ops,
360 		.parent_names = (const char *[]){ "cpu_clk_apb_div" },
361 		.num_parents = 1,
362 		/*
363 		 * This clock is set by the ROM monitor code,
364 		 * Linux should not change it at runtime
365 		 */
366 	},
367 };
368 
369 static struct clk_regmap g12a_cpu_clk_atb_div = {
370 	.data = &(struct clk_regmap_div_data){
371 		.offset = HHI_SYS_CPU_CLK_CNTL1,
372 		.shift = 6,
373 		.width = 3,
374 		.flags = CLK_DIVIDER_POWER_OF_TWO,
375 	},
376 	.hw.init = &(struct clk_init_data){
377 		.name = "cpu_clk_atb_div",
378 		.ops = &clk_regmap_divider_ro_ops,
379 		.parent_names = (const char *[]){ "cpu_clk" },
380 		.num_parents = 1,
381 	},
382 };
383 
384 static struct clk_regmap g12a_cpu_clk_atb = {
385 	.data = &(struct clk_regmap_gate_data){
386 		.offset = HHI_SYS_CPU_CLK_CNTL1,
387 		.bit_idx = 17,
388 	},
389 	.hw.init = &(struct clk_init_data) {
390 		.name = "cpu_clk_atb",
391 		.ops = &clk_regmap_gate_ro_ops,
392 		.parent_names = (const char *[]){ "cpu_clk_atb_div" },
393 		.num_parents = 1,
394 		/*
395 		 * This clock is set by the ROM monitor code,
396 		 * Linux should not change it at runtime
397 		 */
398 	},
399 };
400 
401 static struct clk_regmap g12a_cpu_clk_axi_div = {
402 	.data = &(struct clk_regmap_div_data){
403 		.offset = HHI_SYS_CPU_CLK_CNTL1,
404 		.shift = 9,
405 		.width = 3,
406 		.flags = CLK_DIVIDER_POWER_OF_TWO,
407 	},
408 	.hw.init = &(struct clk_init_data){
409 		.name = "cpu_clk_axi_div",
410 		.ops = &clk_regmap_divider_ro_ops,
411 		.parent_names = (const char *[]){ "cpu_clk" },
412 		.num_parents = 1,
413 	},
414 };
415 
416 static struct clk_regmap g12a_cpu_clk_axi = {
417 	.data = &(struct clk_regmap_gate_data){
418 		.offset = HHI_SYS_CPU_CLK_CNTL1,
419 		.bit_idx = 18,
420 	},
421 	.hw.init = &(struct clk_init_data) {
422 		.name = "cpu_clk_axi",
423 		.ops = &clk_regmap_gate_ro_ops,
424 		.parent_names = (const char *[]){ "cpu_clk_axi_div" },
425 		.num_parents = 1,
426 		/*
427 		 * This clock is set by the ROM monitor code,
428 		 * Linux should not change it at runtime
429 		 */
430 	},
431 };
432 
433 static struct clk_regmap g12a_cpu_clk_trace_div = {
434 	.data = &(struct clk_regmap_div_data){
435 		.offset = HHI_SYS_CPU_CLK_CNTL1,
436 		.shift = 20,
437 		.width = 3,
438 		.flags = CLK_DIVIDER_POWER_OF_TWO,
439 	},
440 	.hw.init = &(struct clk_init_data){
441 		.name = "cpu_clk_trace_div",
442 		.ops = &clk_regmap_divider_ro_ops,
443 		.parent_names = (const char *[]){ "cpu_clk" },
444 		.num_parents = 1,
445 	},
446 };
447 
448 static struct clk_regmap g12a_cpu_clk_trace = {
449 	.data = &(struct clk_regmap_gate_data){
450 		.offset = HHI_SYS_CPU_CLK_CNTL1,
451 		.bit_idx = 23,
452 	},
453 	.hw.init = &(struct clk_init_data) {
454 		.name = "cpu_clk_trace",
455 		.ops = &clk_regmap_gate_ro_ops,
456 		.parent_names = (const char *[]){ "cpu_clk_trace_div" },
457 		.num_parents = 1,
458 		/*
459 		 * This clock is set by the ROM monitor code,
460 		 * Linux should not change it at runtime
461 		 */
462 	},
463 };
464 
465 static const struct pll_mult_range g12a_gp0_pll_mult_range = {
466 	.min = 55,
467 	.max = 255,
468 };
469 
470 /*
471  * Internal gp0 pll emulation configuration parameters
472  */
473 static const struct reg_sequence g12a_gp0_init_regs[] = {
474 	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0x00000000 },
475 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0x00000000 },
476 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x48681c00 },
477 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0x33771290 },
478 	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x39272000 },
479 	{ .reg = HHI_GP0_PLL_CNTL6,	.def = 0x56540000 },
480 };
481 
482 static struct clk_regmap g12a_gp0_pll_dco = {
483 	.data = &(struct meson_clk_pll_data){
484 		.en = {
485 			.reg_off = HHI_GP0_PLL_CNTL0,
486 			.shift   = 28,
487 			.width   = 1,
488 		},
489 		.m = {
490 			.reg_off = HHI_GP0_PLL_CNTL0,
491 			.shift   = 0,
492 			.width   = 8,
493 		},
494 		.n = {
495 			.reg_off = HHI_GP0_PLL_CNTL0,
496 			.shift   = 10,
497 			.width   = 5,
498 		},
499 		.frac = {
500 			.reg_off = HHI_GP0_PLL_CNTL1,
501 			.shift   = 0,
502 			.width   = 17,
503 		},
504 		.l = {
505 			.reg_off = HHI_GP0_PLL_CNTL0,
506 			.shift   = 31,
507 			.width   = 1,
508 		},
509 		.rst = {
510 			.reg_off = HHI_GP0_PLL_CNTL0,
511 			.shift   = 29,
512 			.width   = 1,
513 		},
514 		.range = &g12a_gp0_pll_mult_range,
515 		.init_regs = g12a_gp0_init_regs,
516 		.init_count = ARRAY_SIZE(g12a_gp0_init_regs),
517 	},
518 	.hw.init = &(struct clk_init_data){
519 		.name = "gp0_pll_dco",
520 		.ops = &meson_clk_pll_ops,
521 		.parent_names = (const char *[]){ IN_PREFIX "xtal" },
522 		.num_parents = 1,
523 	},
524 };
525 
526 static struct clk_regmap g12a_gp0_pll = {
527 	.data = &(struct clk_regmap_div_data){
528 		.offset = HHI_GP0_PLL_CNTL0,
529 		.shift = 16,
530 		.width = 3,
531 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
532 			  CLK_DIVIDER_ROUND_CLOSEST),
533 	},
534 	.hw.init = &(struct clk_init_data){
535 		.name = "gp0_pll",
536 		.ops = &clk_regmap_divider_ops,
537 		.parent_names = (const char *[]){ "gp0_pll_dco" },
538 		.num_parents = 1,
539 		.flags = CLK_SET_RATE_PARENT,
540 	},
541 };
542 
543 /*
544  * Internal hifi pll emulation configuration parameters
545  */
546 static const struct reg_sequence g12a_hifi_init_regs[] = {
547 	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0x00000000 },
548 	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0x00000000 },
549 	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x6a285c00 },
550 	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0x65771290 },
551 	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x39272000 },
552 	{ .reg = HHI_HIFI_PLL_CNTL6,	.def = 0x56540000 },
553 };
554 
555 static struct clk_regmap g12a_hifi_pll_dco = {
556 	.data = &(struct meson_clk_pll_data){
557 		.en = {
558 			.reg_off = HHI_HIFI_PLL_CNTL0,
559 			.shift   = 28,
560 			.width   = 1,
561 		},
562 		.m = {
563 			.reg_off = HHI_HIFI_PLL_CNTL0,
564 			.shift   = 0,
565 			.width   = 8,
566 		},
567 		.n = {
568 			.reg_off = HHI_HIFI_PLL_CNTL0,
569 			.shift   = 10,
570 			.width   = 5,
571 		},
572 		.frac = {
573 			.reg_off = HHI_HIFI_PLL_CNTL1,
574 			.shift   = 0,
575 			.width   = 17,
576 		},
577 		.l = {
578 			.reg_off = HHI_HIFI_PLL_CNTL0,
579 			.shift   = 31,
580 			.width   = 1,
581 		},
582 		.rst = {
583 			.reg_off = HHI_HIFI_PLL_CNTL0,
584 			.shift   = 29,
585 			.width   = 1,
586 		},
587 		.range = &g12a_gp0_pll_mult_range,
588 		.init_regs = g12a_hifi_init_regs,
589 		.init_count = ARRAY_SIZE(g12a_hifi_init_regs),
590 		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
591 	},
592 	.hw.init = &(struct clk_init_data){
593 		.name = "hifi_pll_dco",
594 		.ops = &meson_clk_pll_ops,
595 		.parent_names = (const char *[]){ IN_PREFIX "xtal" },
596 		.num_parents = 1,
597 	},
598 };
599 
600 static struct clk_regmap g12a_hifi_pll = {
601 	.data = &(struct clk_regmap_div_data){
602 		.offset = HHI_HIFI_PLL_CNTL0,
603 		.shift = 16,
604 		.width = 2,
605 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
606 			  CLK_DIVIDER_ROUND_CLOSEST),
607 	},
608 	.hw.init = &(struct clk_init_data){
609 		.name = "hifi_pll",
610 		.ops = &clk_regmap_divider_ops,
611 		.parent_names = (const char *[]){ "hifi_pll_dco" },
612 		.num_parents = 1,
613 		.flags = CLK_SET_RATE_PARENT,
614 	},
615 };
616 
617 /*
618  * The Meson G12A PCIE PLL is fined tuned to deliver a very precise
619  * 100MHz reference clock for the PCIe Analog PHY, and thus requires
620  * a strict register sequence to enable the PLL.
621  */
622 static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
623 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x20090496 },
624 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x30090496 },
625 	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x00000000 },
626 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001100 },
627 	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x10058e00 },
628 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x000100c0 },
629 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000048 },
630 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000068, .delay_us = 20 },
631 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x008100c0, .delay_us = 10 },
632 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x34090496 },
633 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x14090496, .delay_us = 10 },
634 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001000 },
635 };
636 
637 /* Keep a single entry table for recalc/round_rate() ops */
638 static const struct pll_params_table g12a_pcie_pll_table[] = {
639 	PLL_PARAMS(150, 1),
640 	{0, 0},
641 };
642 
643 static struct clk_regmap g12a_pcie_pll_dco = {
644 	.data = &(struct meson_clk_pll_data){
645 		.en = {
646 			.reg_off = HHI_PCIE_PLL_CNTL0,
647 			.shift   = 28,
648 			.width   = 1,
649 		},
650 		.m = {
651 			.reg_off = HHI_PCIE_PLL_CNTL0,
652 			.shift   = 0,
653 			.width   = 8,
654 		},
655 		.n = {
656 			.reg_off = HHI_PCIE_PLL_CNTL0,
657 			.shift   = 10,
658 			.width   = 5,
659 		},
660 		.frac = {
661 			.reg_off = HHI_PCIE_PLL_CNTL1,
662 			.shift   = 0,
663 			.width   = 12,
664 		},
665 		.l = {
666 			.reg_off = HHI_PCIE_PLL_CNTL0,
667 			.shift   = 31,
668 			.width   = 1,
669 		},
670 		.rst = {
671 			.reg_off = HHI_PCIE_PLL_CNTL0,
672 			.shift   = 29,
673 			.width   = 1,
674 		},
675 		.table = g12a_pcie_pll_table,
676 		.init_regs = g12a_pcie_pll_init_regs,
677 		.init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
678 	},
679 	.hw.init = &(struct clk_init_data){
680 		.name = "pcie_pll_dco",
681 		.ops = &meson_clk_pcie_pll_ops,
682 		.parent_names = (const char *[]){ IN_PREFIX "xtal" },
683 		.num_parents = 1,
684 	},
685 };
686 
687 static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
688 	.mult = 1,
689 	.div = 2,
690 	.hw.init = &(struct clk_init_data){
691 		.name = "pcie_pll_dco_div2",
692 		.ops = &clk_fixed_factor_ops,
693 		.parent_names = (const char *[]){ "pcie_pll_dco" },
694 		.num_parents = 1,
695 		.flags = CLK_SET_RATE_PARENT,
696 	},
697 };
698 
699 static struct clk_regmap g12a_pcie_pll_od = {
700 	.data = &(struct clk_regmap_div_data){
701 		.offset = HHI_PCIE_PLL_CNTL0,
702 		.shift = 16,
703 		.width = 5,
704 		.flags = CLK_DIVIDER_ROUND_CLOSEST |
705 			 CLK_DIVIDER_ONE_BASED |
706 			 CLK_DIVIDER_ALLOW_ZERO,
707 	},
708 	.hw.init = &(struct clk_init_data){
709 		.name = "pcie_pll_od",
710 		.ops = &clk_regmap_divider_ops,
711 		.parent_names = (const char *[]){ "pcie_pll_dco_div2" },
712 		.num_parents = 1,
713 		.flags = CLK_SET_RATE_PARENT,
714 	},
715 };
716 
717 static struct clk_fixed_factor g12a_pcie_pll = {
718 	.mult = 1,
719 	.div = 2,
720 	.hw.init = &(struct clk_init_data){
721 		.name = "pcie_pll_pll",
722 		.ops = &clk_fixed_factor_ops,
723 		.parent_names = (const char *[]){ "pcie_pll_od" },
724 		.num_parents = 1,
725 		.flags = CLK_SET_RATE_PARENT,
726 	},
727 };
728 
729 static struct clk_regmap g12a_hdmi_pll_dco = {
730 	.data = &(struct meson_clk_pll_data){
731 		.en = {
732 			.reg_off = HHI_HDMI_PLL_CNTL0,
733 			.shift   = 28,
734 			.width   = 1,
735 		},
736 		.m = {
737 			.reg_off = HHI_HDMI_PLL_CNTL0,
738 			.shift   = 0,
739 			.width   = 8,
740 		},
741 		.n = {
742 			.reg_off = HHI_HDMI_PLL_CNTL0,
743 			.shift   = 10,
744 			.width   = 5,
745 		},
746 		.frac = {
747 			.reg_off = HHI_HDMI_PLL_CNTL1,
748 			.shift   = 0,
749 			.width   = 16,
750 		},
751 		.l = {
752 			.reg_off = HHI_HDMI_PLL_CNTL0,
753 			.shift   = 30,
754 			.width   = 1,
755 		},
756 		.rst = {
757 			.reg_off = HHI_HDMI_PLL_CNTL0,
758 			.shift   = 29,
759 			.width   = 1,
760 		},
761 	},
762 	.hw.init = &(struct clk_init_data){
763 		.name = "hdmi_pll_dco",
764 		.ops = &meson_clk_pll_ro_ops,
765 		.parent_names = (const char *[]){ IN_PREFIX "xtal" },
766 		.num_parents = 1,
767 		/*
768 		 * Display directly handle hdmi pll registers ATM, we need
769 		 * NOCACHE to keep our view of the clock as accurate as possible
770 		 */
771 		.flags = CLK_GET_RATE_NOCACHE,
772 	},
773 };
774 
775 static struct clk_regmap g12a_hdmi_pll_od = {
776 	.data = &(struct clk_regmap_div_data){
777 		.offset = HHI_HDMI_PLL_CNTL0,
778 		.shift = 16,
779 		.width = 2,
780 		.flags = CLK_DIVIDER_POWER_OF_TWO,
781 	},
782 	.hw.init = &(struct clk_init_data){
783 		.name = "hdmi_pll_od",
784 		.ops = &clk_regmap_divider_ro_ops,
785 		.parent_names = (const char *[]){ "hdmi_pll_dco" },
786 		.num_parents = 1,
787 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
788 	},
789 };
790 
791 static struct clk_regmap g12a_hdmi_pll_od2 = {
792 	.data = &(struct clk_regmap_div_data){
793 		.offset = HHI_HDMI_PLL_CNTL0,
794 		.shift = 18,
795 		.width = 2,
796 		.flags = CLK_DIVIDER_POWER_OF_TWO,
797 	},
798 	.hw.init = &(struct clk_init_data){
799 		.name = "hdmi_pll_od2",
800 		.ops = &clk_regmap_divider_ro_ops,
801 		.parent_names = (const char *[]){ "hdmi_pll_od" },
802 		.num_parents = 1,
803 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
804 	},
805 };
806 
807 static struct clk_regmap g12a_hdmi_pll = {
808 	.data = &(struct clk_regmap_div_data){
809 		.offset = HHI_HDMI_PLL_CNTL0,
810 		.shift = 20,
811 		.width = 2,
812 		.flags = CLK_DIVIDER_POWER_OF_TWO,
813 	},
814 	.hw.init = &(struct clk_init_data){
815 		.name = "hdmi_pll",
816 		.ops = &clk_regmap_divider_ro_ops,
817 		.parent_names = (const char *[]){ "hdmi_pll_od2" },
818 		.num_parents = 1,
819 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
820 	},
821 };
822 
823 static struct clk_fixed_factor g12a_fclk_div2_div = {
824 	.mult = 1,
825 	.div = 2,
826 	.hw.init = &(struct clk_init_data){
827 		.name = "fclk_div2_div",
828 		.ops = &clk_fixed_factor_ops,
829 		.parent_names = (const char *[]){ "fixed_pll" },
830 		.num_parents = 1,
831 	},
832 };
833 
834 static struct clk_regmap g12a_fclk_div2 = {
835 	.data = &(struct clk_regmap_gate_data){
836 		.offset = HHI_FIX_PLL_CNTL1,
837 		.bit_idx = 24,
838 	},
839 	.hw.init = &(struct clk_init_data){
840 		.name = "fclk_div2",
841 		.ops = &clk_regmap_gate_ops,
842 		.parent_names = (const char *[]){ "fclk_div2_div" },
843 		.num_parents = 1,
844 	},
845 };
846 
847 static struct clk_fixed_factor g12a_fclk_div3_div = {
848 	.mult = 1,
849 	.div = 3,
850 	.hw.init = &(struct clk_init_data){
851 		.name = "fclk_div3_div",
852 		.ops = &clk_fixed_factor_ops,
853 		.parent_names = (const char *[]){ "fixed_pll" },
854 		.num_parents = 1,
855 	},
856 };
857 
858 static struct clk_regmap g12a_fclk_div3 = {
859 	.data = &(struct clk_regmap_gate_data){
860 		.offset = HHI_FIX_PLL_CNTL1,
861 		.bit_idx = 20,
862 	},
863 	.hw.init = &(struct clk_init_data){
864 		.name = "fclk_div3",
865 		.ops = &clk_regmap_gate_ops,
866 		.parent_names = (const char *[]){ "fclk_div3_div" },
867 		.num_parents = 1,
868 	},
869 };
870 
871 static struct clk_fixed_factor g12a_fclk_div4_div = {
872 	.mult = 1,
873 	.div = 4,
874 	.hw.init = &(struct clk_init_data){
875 		.name = "fclk_div4_div",
876 		.ops = &clk_fixed_factor_ops,
877 		.parent_names = (const char *[]){ "fixed_pll" },
878 		.num_parents = 1,
879 	},
880 };
881 
882 static struct clk_regmap g12a_fclk_div4 = {
883 	.data = &(struct clk_regmap_gate_data){
884 		.offset = HHI_FIX_PLL_CNTL1,
885 		.bit_idx = 21,
886 	},
887 	.hw.init = &(struct clk_init_data){
888 		.name = "fclk_div4",
889 		.ops = &clk_regmap_gate_ops,
890 		.parent_names = (const char *[]){ "fclk_div4_div" },
891 		.num_parents = 1,
892 	},
893 };
894 
895 static struct clk_fixed_factor g12a_fclk_div5_div = {
896 	.mult = 1,
897 	.div = 5,
898 	.hw.init = &(struct clk_init_data){
899 		.name = "fclk_div5_div",
900 		.ops = &clk_fixed_factor_ops,
901 		.parent_names = (const char *[]){ "fixed_pll" },
902 		.num_parents = 1,
903 	},
904 };
905 
906 static struct clk_regmap g12a_fclk_div5 = {
907 	.data = &(struct clk_regmap_gate_data){
908 		.offset = HHI_FIX_PLL_CNTL1,
909 		.bit_idx = 22,
910 	},
911 	.hw.init = &(struct clk_init_data){
912 		.name = "fclk_div5",
913 		.ops = &clk_regmap_gate_ops,
914 		.parent_names = (const char *[]){ "fclk_div5_div" },
915 		.num_parents = 1,
916 	},
917 };
918 
919 static struct clk_fixed_factor g12a_fclk_div7_div = {
920 	.mult = 1,
921 	.div = 7,
922 	.hw.init = &(struct clk_init_data){
923 		.name = "fclk_div7_div",
924 		.ops = &clk_fixed_factor_ops,
925 		.parent_names = (const char *[]){ "fixed_pll" },
926 		.num_parents = 1,
927 	},
928 };
929 
930 static struct clk_regmap g12a_fclk_div7 = {
931 	.data = &(struct clk_regmap_gate_data){
932 		.offset = HHI_FIX_PLL_CNTL1,
933 		.bit_idx = 23,
934 	},
935 	.hw.init = &(struct clk_init_data){
936 		.name = "fclk_div7",
937 		.ops = &clk_regmap_gate_ops,
938 		.parent_names = (const char *[]){ "fclk_div7_div" },
939 		.num_parents = 1,
940 	},
941 };
942 
943 static struct clk_fixed_factor g12a_fclk_div2p5_div = {
944 	.mult = 1,
945 	.div = 5,
946 	.hw.init = &(struct clk_init_data){
947 		.name = "fclk_div2p5_div",
948 		.ops = &clk_fixed_factor_ops,
949 		.parent_names = (const char *[]){ "fixed_pll_dco" },
950 		.num_parents = 1,
951 	},
952 };
953 
954 static struct clk_regmap g12a_fclk_div2p5 = {
955 	.data = &(struct clk_regmap_gate_data){
956 		.offset = HHI_FIX_PLL_CNTL1,
957 		.bit_idx = 25,
958 	},
959 	.hw.init = &(struct clk_init_data){
960 		.name = "fclk_div2p5",
961 		.ops = &clk_regmap_gate_ops,
962 		.parent_names = (const char *[]){ "fclk_div2p5_div" },
963 		.num_parents = 1,
964 	},
965 };
966 
967 static struct clk_fixed_factor g12a_mpll_50m_div = {
968 	.mult = 1,
969 	.div = 80,
970 	.hw.init = &(struct clk_init_data){
971 		.name = "mpll_50m_div",
972 		.ops = &clk_fixed_factor_ops,
973 		.parent_names = (const char *[]){ "fixed_pll_dco" },
974 		.num_parents = 1,
975 	},
976 };
977 
978 static struct clk_regmap g12a_mpll_50m = {
979 	.data = &(struct clk_regmap_mux_data){
980 		.offset = HHI_FIX_PLL_CNTL3,
981 		.mask = 0x1,
982 		.shift = 5,
983 	},
984 	.hw.init = &(struct clk_init_data){
985 		.name = "mpll_50m",
986 		.ops = &clk_regmap_mux_ro_ops,
987 		.parent_names = (const char *[]){ IN_PREFIX "xtal",
988 						  "mpll_50m_div" },
989 		.num_parents = 2,
990 	},
991 };
992 
993 static struct clk_fixed_factor g12a_mpll_prediv = {
994 	.mult = 1,
995 	.div = 2,
996 	.hw.init = &(struct clk_init_data){
997 		.name = "mpll_prediv",
998 		.ops = &clk_fixed_factor_ops,
999 		.parent_names = (const char *[]){ "fixed_pll_dco" },
1000 		.num_parents = 1,
1001 	},
1002 };
1003 
1004 static struct clk_regmap g12a_mpll0_div = {
1005 	.data = &(struct meson_clk_mpll_data){
1006 		.sdm = {
1007 			.reg_off = HHI_MPLL_CNTL1,
1008 			.shift   = 0,
1009 			.width   = 14,
1010 		},
1011 		.sdm_en = {
1012 			.reg_off = HHI_MPLL_CNTL1,
1013 			.shift   = 30,
1014 			.width	 = 1,
1015 		},
1016 		.n2 = {
1017 			.reg_off = HHI_MPLL_CNTL1,
1018 			.shift   = 20,
1019 			.width   = 9,
1020 		},
1021 		.ssen = {
1022 			.reg_off = HHI_MPLL_CNTL1,
1023 			.shift   = 29,
1024 			.width	 = 1,
1025 		},
1026 		.lock = &meson_clk_lock,
1027 	},
1028 	.hw.init = &(struct clk_init_data){
1029 		.name = "mpll0_div",
1030 		.ops = &meson_clk_mpll_ops,
1031 		.parent_names = (const char *[]){ "mpll_prediv" },
1032 		.num_parents = 1,
1033 	},
1034 };
1035 
1036 static struct clk_regmap g12a_mpll0 = {
1037 	.data = &(struct clk_regmap_gate_data){
1038 		.offset = HHI_MPLL_CNTL1,
1039 		.bit_idx = 31,
1040 	},
1041 	.hw.init = &(struct clk_init_data){
1042 		.name = "mpll0",
1043 		.ops = &clk_regmap_gate_ops,
1044 		.parent_names = (const char *[]){ "mpll0_div" },
1045 		.num_parents = 1,
1046 		.flags = CLK_SET_RATE_PARENT,
1047 	},
1048 };
1049 
1050 static struct clk_regmap g12a_mpll1_div = {
1051 	.data = &(struct meson_clk_mpll_data){
1052 		.sdm = {
1053 			.reg_off = HHI_MPLL_CNTL3,
1054 			.shift   = 0,
1055 			.width   = 14,
1056 		},
1057 		.sdm_en = {
1058 			.reg_off = HHI_MPLL_CNTL3,
1059 			.shift   = 30,
1060 			.width	 = 1,
1061 		},
1062 		.n2 = {
1063 			.reg_off = HHI_MPLL_CNTL3,
1064 			.shift   = 20,
1065 			.width   = 9,
1066 		},
1067 		.ssen = {
1068 			.reg_off = HHI_MPLL_CNTL3,
1069 			.shift   = 29,
1070 			.width	 = 1,
1071 		},
1072 		.lock = &meson_clk_lock,
1073 	},
1074 	.hw.init = &(struct clk_init_data){
1075 		.name = "mpll1_div",
1076 		.ops = &meson_clk_mpll_ops,
1077 		.parent_names = (const char *[]){ "mpll_prediv" },
1078 		.num_parents = 1,
1079 	},
1080 };
1081 
1082 static struct clk_regmap g12a_mpll1 = {
1083 	.data = &(struct clk_regmap_gate_data){
1084 		.offset = HHI_MPLL_CNTL3,
1085 		.bit_idx = 31,
1086 	},
1087 	.hw.init = &(struct clk_init_data){
1088 		.name = "mpll1",
1089 		.ops = &clk_regmap_gate_ops,
1090 		.parent_names = (const char *[]){ "mpll1_div" },
1091 		.num_parents = 1,
1092 		.flags = CLK_SET_RATE_PARENT,
1093 	},
1094 };
1095 
1096 static struct clk_regmap g12a_mpll2_div = {
1097 	.data = &(struct meson_clk_mpll_data){
1098 		.sdm = {
1099 			.reg_off = HHI_MPLL_CNTL5,
1100 			.shift   = 0,
1101 			.width   = 14,
1102 		},
1103 		.sdm_en = {
1104 			.reg_off = HHI_MPLL_CNTL5,
1105 			.shift   = 30,
1106 			.width	 = 1,
1107 		},
1108 		.n2 = {
1109 			.reg_off = HHI_MPLL_CNTL5,
1110 			.shift   = 20,
1111 			.width   = 9,
1112 		},
1113 		.ssen = {
1114 			.reg_off = HHI_MPLL_CNTL5,
1115 			.shift   = 29,
1116 			.width	 = 1,
1117 		},
1118 		.lock = &meson_clk_lock,
1119 	},
1120 	.hw.init = &(struct clk_init_data){
1121 		.name = "mpll2_div",
1122 		.ops = &meson_clk_mpll_ops,
1123 		.parent_names = (const char *[]){ "mpll_prediv" },
1124 		.num_parents = 1,
1125 	},
1126 };
1127 
1128 static struct clk_regmap g12a_mpll2 = {
1129 	.data = &(struct clk_regmap_gate_data){
1130 		.offset = HHI_MPLL_CNTL5,
1131 		.bit_idx = 31,
1132 	},
1133 	.hw.init = &(struct clk_init_data){
1134 		.name = "mpll2",
1135 		.ops = &clk_regmap_gate_ops,
1136 		.parent_names = (const char *[]){ "mpll2_div" },
1137 		.num_parents = 1,
1138 		.flags = CLK_SET_RATE_PARENT,
1139 	},
1140 };
1141 
1142 static struct clk_regmap g12a_mpll3_div = {
1143 	.data = &(struct meson_clk_mpll_data){
1144 		.sdm = {
1145 			.reg_off = HHI_MPLL_CNTL7,
1146 			.shift   = 0,
1147 			.width   = 14,
1148 		},
1149 		.sdm_en = {
1150 			.reg_off = HHI_MPLL_CNTL7,
1151 			.shift   = 30,
1152 			.width	 = 1,
1153 		},
1154 		.n2 = {
1155 			.reg_off = HHI_MPLL_CNTL7,
1156 			.shift   = 20,
1157 			.width   = 9,
1158 		},
1159 		.ssen = {
1160 			.reg_off = HHI_MPLL_CNTL7,
1161 			.shift   = 29,
1162 			.width	 = 1,
1163 		},
1164 		.lock = &meson_clk_lock,
1165 	},
1166 	.hw.init = &(struct clk_init_data){
1167 		.name = "mpll3_div",
1168 		.ops = &meson_clk_mpll_ops,
1169 		.parent_names = (const char *[]){ "mpll_prediv" },
1170 		.num_parents = 1,
1171 	},
1172 };
1173 
1174 static struct clk_regmap g12a_mpll3 = {
1175 	.data = &(struct clk_regmap_gate_data){
1176 		.offset = HHI_MPLL_CNTL7,
1177 		.bit_idx = 31,
1178 	},
1179 	.hw.init = &(struct clk_init_data){
1180 		.name = "mpll3",
1181 		.ops = &clk_regmap_gate_ops,
1182 		.parent_names = (const char *[]){ "mpll3_div" },
1183 		.num_parents = 1,
1184 		.flags = CLK_SET_RATE_PARENT,
1185 	},
1186 };
1187 
1188 static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
1189 static const char * const clk81_parent_names[] = {
1190 	IN_PREFIX "xtal", "fclk_div7", "mpll1", "mpll2", "fclk_div4",
1191 	"fclk_div3", "fclk_div5"
1192 };
1193 
1194 static struct clk_regmap g12a_mpeg_clk_sel = {
1195 	.data = &(struct clk_regmap_mux_data){
1196 		.offset = HHI_MPEG_CLK_CNTL,
1197 		.mask = 0x7,
1198 		.shift = 12,
1199 		.table = mux_table_clk81,
1200 	},
1201 	.hw.init = &(struct clk_init_data){
1202 		.name = "mpeg_clk_sel",
1203 		.ops = &clk_regmap_mux_ro_ops,
1204 		.parent_names = clk81_parent_names,
1205 		.num_parents = ARRAY_SIZE(clk81_parent_names),
1206 	},
1207 };
1208 
1209 static struct clk_regmap g12a_mpeg_clk_div = {
1210 	.data = &(struct clk_regmap_div_data){
1211 		.offset = HHI_MPEG_CLK_CNTL,
1212 		.shift = 0,
1213 		.width = 7,
1214 	},
1215 	.hw.init = &(struct clk_init_data){
1216 		.name = "mpeg_clk_div",
1217 		.ops = &clk_regmap_divider_ops,
1218 		.parent_names = (const char *[]){ "mpeg_clk_sel" },
1219 		.num_parents = 1,
1220 		.flags = CLK_SET_RATE_PARENT,
1221 	},
1222 };
1223 
1224 static struct clk_regmap g12a_clk81 = {
1225 	.data = &(struct clk_regmap_gate_data){
1226 		.offset = HHI_MPEG_CLK_CNTL,
1227 		.bit_idx = 7,
1228 	},
1229 	.hw.init = &(struct clk_init_data){
1230 		.name = "clk81",
1231 		.ops = &clk_regmap_gate_ops,
1232 		.parent_names = (const char *[]){ "mpeg_clk_div" },
1233 		.num_parents = 1,
1234 		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
1235 	},
1236 };
1237 
1238 static const char * const g12a_sd_emmc_clk0_parent_names[] = {
1239 	IN_PREFIX "xtal", "fclk_div2", "fclk_div3", "fclk_div5", "fclk_div7",
1240 
1241 	/*
1242 	 * Following these parent clocks, we should also have had mpll2, mpll3
1243 	 * and gp0_pll but these clocks are too precious to be used here. All
1244 	 * the necessary rates for MMC and NAND operation can be acheived using
1245 	 * g12a_ee_core or fclk_div clocks
1246 	 */
1247 };
1248 
1249 /* SDIO clock */
1250 static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
1251 	.data = &(struct clk_regmap_mux_data){
1252 		.offset = HHI_SD_EMMC_CLK_CNTL,
1253 		.mask = 0x7,
1254 		.shift = 9,
1255 	},
1256 	.hw.init = &(struct clk_init_data) {
1257 		.name = "sd_emmc_a_clk0_sel",
1258 		.ops = &clk_regmap_mux_ops,
1259 		.parent_names = g12a_sd_emmc_clk0_parent_names,
1260 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_names),
1261 		.flags = CLK_SET_RATE_PARENT,
1262 	},
1263 };
1264 
1265 static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
1266 	.data = &(struct clk_regmap_div_data){
1267 		.offset = HHI_SD_EMMC_CLK_CNTL,
1268 		.shift = 0,
1269 		.width = 7,
1270 	},
1271 	.hw.init = &(struct clk_init_data) {
1272 		.name = "sd_emmc_a_clk0_div",
1273 		.ops = &clk_regmap_divider_ops,
1274 		.parent_names = (const char *[]){ "sd_emmc_a_clk0_sel" },
1275 		.num_parents = 1,
1276 		.flags = CLK_SET_RATE_PARENT,
1277 	},
1278 };
1279 
1280 static struct clk_regmap g12a_sd_emmc_a_clk0 = {
1281 	.data = &(struct clk_regmap_gate_data){
1282 		.offset = HHI_SD_EMMC_CLK_CNTL,
1283 		.bit_idx = 7,
1284 	},
1285 	.hw.init = &(struct clk_init_data){
1286 		.name = "sd_emmc_a_clk0",
1287 		.ops = &clk_regmap_gate_ops,
1288 		.parent_names = (const char *[]){ "sd_emmc_a_clk0_div" },
1289 		.num_parents = 1,
1290 		.flags = CLK_SET_RATE_PARENT,
1291 	},
1292 };
1293 
1294 /* SDcard clock */
1295 static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
1296 	.data = &(struct clk_regmap_mux_data){
1297 		.offset = HHI_SD_EMMC_CLK_CNTL,
1298 		.mask = 0x7,
1299 		.shift = 25,
1300 	},
1301 	.hw.init = &(struct clk_init_data) {
1302 		.name = "sd_emmc_b_clk0_sel",
1303 		.ops = &clk_regmap_mux_ops,
1304 		.parent_names = g12a_sd_emmc_clk0_parent_names,
1305 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_names),
1306 		.flags = CLK_SET_RATE_PARENT,
1307 	},
1308 };
1309 
1310 static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
1311 	.data = &(struct clk_regmap_div_data){
1312 		.offset = HHI_SD_EMMC_CLK_CNTL,
1313 		.shift = 16,
1314 		.width = 7,
1315 	},
1316 	.hw.init = &(struct clk_init_data) {
1317 		.name = "sd_emmc_b_clk0_div",
1318 		.ops = &clk_regmap_divider_ops,
1319 		.parent_names = (const char *[]){ "sd_emmc_b_clk0_sel" },
1320 		.num_parents = 1,
1321 		.flags = CLK_SET_RATE_PARENT,
1322 	},
1323 };
1324 
1325 static struct clk_regmap g12a_sd_emmc_b_clk0 = {
1326 	.data = &(struct clk_regmap_gate_data){
1327 		.offset = HHI_SD_EMMC_CLK_CNTL,
1328 		.bit_idx = 23,
1329 	},
1330 	.hw.init = &(struct clk_init_data){
1331 		.name = "sd_emmc_b_clk0",
1332 		.ops = &clk_regmap_gate_ops,
1333 		.parent_names = (const char *[]){ "sd_emmc_b_clk0_div" },
1334 		.num_parents = 1,
1335 		.flags = CLK_SET_RATE_PARENT,
1336 	},
1337 };
1338 
1339 /* EMMC/NAND clock */
1340 static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
1341 	.data = &(struct clk_regmap_mux_data){
1342 		.offset = HHI_NAND_CLK_CNTL,
1343 		.mask = 0x7,
1344 		.shift = 9,
1345 	},
1346 	.hw.init = &(struct clk_init_data) {
1347 		.name = "sd_emmc_c_clk0_sel",
1348 		.ops = &clk_regmap_mux_ops,
1349 		.parent_names = g12a_sd_emmc_clk0_parent_names,
1350 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_names),
1351 		.flags = CLK_SET_RATE_PARENT,
1352 	},
1353 };
1354 
1355 static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
1356 	.data = &(struct clk_regmap_div_data){
1357 		.offset = HHI_NAND_CLK_CNTL,
1358 		.shift = 0,
1359 		.width = 7,
1360 	},
1361 	.hw.init = &(struct clk_init_data) {
1362 		.name = "sd_emmc_c_clk0_div",
1363 		.ops = &clk_regmap_divider_ops,
1364 		.parent_names = (const char *[]){ "sd_emmc_c_clk0_sel" },
1365 		.num_parents = 1,
1366 		.flags = CLK_SET_RATE_PARENT,
1367 	},
1368 };
1369 
1370 static struct clk_regmap g12a_sd_emmc_c_clk0 = {
1371 	.data = &(struct clk_regmap_gate_data){
1372 		.offset = HHI_NAND_CLK_CNTL,
1373 		.bit_idx = 7,
1374 	},
1375 	.hw.init = &(struct clk_init_data){
1376 		.name = "sd_emmc_c_clk0",
1377 		.ops = &clk_regmap_gate_ops,
1378 		.parent_names = (const char *[]){ "sd_emmc_c_clk0_div" },
1379 		.num_parents = 1,
1380 		.flags = CLK_SET_RATE_PARENT,
1381 	},
1382 };
1383 
1384 /* VPU Clock */
1385 
1386 static const char * const g12a_vpu_parent_names[] = {
1387 	"fclk_div3", "fclk_div4", "fclk_div5", "fclk_div7",
1388 	"mpll1", "vid_pll", "hifi_pll", "gp0_pll",
1389 };
1390 
1391 static struct clk_regmap g12a_vpu_0_sel = {
1392 	.data = &(struct clk_regmap_mux_data){
1393 		.offset = HHI_VPU_CLK_CNTL,
1394 		.mask = 0x7,
1395 		.shift = 9,
1396 	},
1397 	.hw.init = &(struct clk_init_data){
1398 		.name = "vpu_0_sel",
1399 		.ops = &clk_regmap_mux_ops,
1400 		.parent_names = g12a_vpu_parent_names,
1401 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_names),
1402 		.flags = CLK_SET_RATE_NO_REPARENT,
1403 	},
1404 };
1405 
1406 static struct clk_regmap g12a_vpu_0_div = {
1407 	.data = &(struct clk_regmap_div_data){
1408 		.offset = HHI_VPU_CLK_CNTL,
1409 		.shift = 0,
1410 		.width = 7,
1411 	},
1412 	.hw.init = &(struct clk_init_data){
1413 		.name = "vpu_0_div",
1414 		.ops = &clk_regmap_divider_ops,
1415 		.parent_names = (const char *[]){ "vpu_0_sel" },
1416 		.num_parents = 1,
1417 		.flags = CLK_SET_RATE_PARENT,
1418 	},
1419 };
1420 
1421 static struct clk_regmap g12a_vpu_0 = {
1422 	.data = &(struct clk_regmap_gate_data){
1423 		.offset = HHI_VPU_CLK_CNTL,
1424 		.bit_idx = 8,
1425 	},
1426 	.hw.init = &(struct clk_init_data) {
1427 		.name = "vpu_0",
1428 		.ops = &clk_regmap_gate_ops,
1429 		.parent_names = (const char *[]){ "vpu_0_div" },
1430 		.num_parents = 1,
1431 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1432 	},
1433 };
1434 
1435 static struct clk_regmap g12a_vpu_1_sel = {
1436 	.data = &(struct clk_regmap_mux_data){
1437 		.offset = HHI_VPU_CLK_CNTL,
1438 		.mask = 0x7,
1439 		.shift = 25,
1440 	},
1441 	.hw.init = &(struct clk_init_data){
1442 		.name = "vpu_1_sel",
1443 		.ops = &clk_regmap_mux_ops,
1444 		.parent_names = g12a_vpu_parent_names,
1445 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_names),
1446 		.flags = CLK_SET_RATE_NO_REPARENT,
1447 	},
1448 };
1449 
1450 static struct clk_regmap g12a_vpu_1_div = {
1451 	.data = &(struct clk_regmap_div_data){
1452 		.offset = HHI_VPU_CLK_CNTL,
1453 		.shift = 16,
1454 		.width = 7,
1455 	},
1456 	.hw.init = &(struct clk_init_data){
1457 		.name = "vpu_1_div",
1458 		.ops = &clk_regmap_divider_ops,
1459 		.parent_names = (const char *[]){ "vpu_1_sel" },
1460 		.num_parents = 1,
1461 		.flags = CLK_SET_RATE_PARENT,
1462 	},
1463 };
1464 
1465 static struct clk_regmap g12a_vpu_1 = {
1466 	.data = &(struct clk_regmap_gate_data){
1467 		.offset = HHI_VPU_CLK_CNTL,
1468 		.bit_idx = 24,
1469 	},
1470 	.hw.init = &(struct clk_init_data) {
1471 		.name = "vpu_1",
1472 		.ops = &clk_regmap_gate_ops,
1473 		.parent_names = (const char *[]){ "vpu_1_div" },
1474 		.num_parents = 1,
1475 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1476 	},
1477 };
1478 
1479 static struct clk_regmap g12a_vpu = {
1480 	.data = &(struct clk_regmap_mux_data){
1481 		.offset = HHI_VPU_CLK_CNTL,
1482 		.mask = 1,
1483 		.shift = 31,
1484 	},
1485 	.hw.init = &(struct clk_init_data){
1486 		.name = "vpu",
1487 		.ops = &clk_regmap_mux_ops,
1488 		/*
1489 		 * bit 31 selects from 2 possible parents:
1490 		 * vpu_0 or vpu_1
1491 		 */
1492 		.parent_names = (const char *[]){ "vpu_0", "vpu_1" },
1493 		.num_parents = 2,
1494 		.flags = CLK_SET_RATE_NO_REPARENT,
1495 	},
1496 };
1497 
1498 /* VDEC clocks */
1499 
1500 static const char * const g12a_vdec_parent_names[] = {
1501 	"fclk_div2p5", "fclk_div3", "fclk_div4", "fclk_div5", "fclk_div7",
1502 	"hifi_pll", "gp0_pll",
1503 };
1504 
1505 static struct clk_regmap g12a_vdec_1_sel = {
1506 	.data = &(struct clk_regmap_mux_data){
1507 		.offset = HHI_VDEC_CLK_CNTL,
1508 		.mask = 0x7,
1509 		.shift = 9,
1510 		.flags = CLK_MUX_ROUND_CLOSEST,
1511 	},
1512 	.hw.init = &(struct clk_init_data){
1513 		.name = "vdec_1_sel",
1514 		.ops = &clk_regmap_mux_ops,
1515 		.parent_names = g12a_vdec_parent_names,
1516 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_names),
1517 		.flags = CLK_SET_RATE_PARENT,
1518 	},
1519 };
1520 
1521 static struct clk_regmap g12a_vdec_1_div = {
1522 	.data = &(struct clk_regmap_div_data){
1523 		.offset = HHI_VDEC_CLK_CNTL,
1524 		.shift = 0,
1525 		.width = 7,
1526 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1527 	},
1528 	.hw.init = &(struct clk_init_data){
1529 		.name = "vdec_1_div",
1530 		.ops = &clk_regmap_divider_ops,
1531 		.parent_names = (const char *[]){ "vdec_1_sel" },
1532 		.num_parents = 1,
1533 		.flags = CLK_SET_RATE_PARENT,
1534 	},
1535 };
1536 
1537 static struct clk_regmap g12a_vdec_1 = {
1538 	.data = &(struct clk_regmap_gate_data){
1539 		.offset = HHI_VDEC_CLK_CNTL,
1540 		.bit_idx = 8,
1541 	},
1542 	.hw.init = &(struct clk_init_data) {
1543 		.name = "vdec_1",
1544 		.ops = &clk_regmap_gate_ops,
1545 		.parent_names = (const char *[]){ "vdec_1_div" },
1546 		.num_parents = 1,
1547 		.flags = CLK_SET_RATE_PARENT,
1548 	},
1549 };
1550 
1551 static struct clk_regmap g12a_vdec_hevcf_sel = {
1552 	.data = &(struct clk_regmap_mux_data){
1553 		.offset = HHI_VDEC2_CLK_CNTL,
1554 		.mask = 0x7,
1555 		.shift = 9,
1556 		.flags = CLK_MUX_ROUND_CLOSEST,
1557 	},
1558 	.hw.init = &(struct clk_init_data){
1559 		.name = "vdec_hevcf_sel",
1560 		.ops = &clk_regmap_mux_ops,
1561 		.parent_names = g12a_vdec_parent_names,
1562 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_names),
1563 		.flags = CLK_SET_RATE_PARENT,
1564 	},
1565 };
1566 
1567 static struct clk_regmap g12a_vdec_hevcf_div = {
1568 	.data = &(struct clk_regmap_div_data){
1569 		.offset = HHI_VDEC2_CLK_CNTL,
1570 		.shift = 0,
1571 		.width = 7,
1572 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1573 	},
1574 	.hw.init = &(struct clk_init_data){
1575 		.name = "vdec_hevcf_div",
1576 		.ops = &clk_regmap_divider_ops,
1577 		.parent_names = (const char *[]){ "vdec_hevcf_sel" },
1578 		.num_parents = 1,
1579 		.flags = CLK_SET_RATE_PARENT,
1580 	},
1581 };
1582 
1583 static struct clk_regmap g12a_vdec_hevcf = {
1584 	.data = &(struct clk_regmap_gate_data){
1585 		.offset = HHI_VDEC2_CLK_CNTL,
1586 		.bit_idx = 8,
1587 	},
1588 	.hw.init = &(struct clk_init_data) {
1589 		.name = "vdec_hevcf",
1590 		.ops = &clk_regmap_gate_ops,
1591 		.parent_names = (const char *[]){ "vdec_hevcf_div" },
1592 		.num_parents = 1,
1593 		.flags = CLK_SET_RATE_PARENT,
1594 	},
1595 };
1596 
1597 static struct clk_regmap g12a_vdec_hevc_sel = {
1598 	.data = &(struct clk_regmap_mux_data){
1599 		.offset = HHI_VDEC2_CLK_CNTL,
1600 		.mask = 0x7,
1601 		.shift = 25,
1602 		.flags = CLK_MUX_ROUND_CLOSEST,
1603 	},
1604 	.hw.init = &(struct clk_init_data){
1605 		.name = "vdec_hevc_sel",
1606 		.ops = &clk_regmap_mux_ops,
1607 		.parent_names = g12a_vdec_parent_names,
1608 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_names),
1609 		.flags = CLK_SET_RATE_PARENT,
1610 	},
1611 };
1612 
1613 static struct clk_regmap g12a_vdec_hevc_div = {
1614 	.data = &(struct clk_regmap_div_data){
1615 		.offset = HHI_VDEC2_CLK_CNTL,
1616 		.shift = 16,
1617 		.width = 7,
1618 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1619 	},
1620 	.hw.init = &(struct clk_init_data){
1621 		.name = "vdec_hevc_div",
1622 		.ops = &clk_regmap_divider_ops,
1623 		.parent_names = (const char *[]){ "vdec_hevc_sel" },
1624 		.num_parents = 1,
1625 		.flags = CLK_SET_RATE_PARENT,
1626 	},
1627 };
1628 
1629 static struct clk_regmap g12a_vdec_hevc = {
1630 	.data = &(struct clk_regmap_gate_data){
1631 		.offset = HHI_VDEC2_CLK_CNTL,
1632 		.bit_idx = 24,
1633 	},
1634 	.hw.init = &(struct clk_init_data) {
1635 		.name = "vdec_hevc",
1636 		.ops = &clk_regmap_gate_ops,
1637 		.parent_names = (const char *[]){ "vdec_hevc_div" },
1638 		.num_parents = 1,
1639 		.flags = CLK_SET_RATE_PARENT,
1640 	},
1641 };
1642 
1643 /* VAPB Clock */
1644 
1645 static const char * const g12a_vapb_parent_names[] = {
1646 	"fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7",
1647 	"mpll1", "vid_pll", "mpll2", "fclk_div2p5",
1648 };
1649 
1650 static struct clk_regmap g12a_vapb_0_sel = {
1651 	.data = &(struct clk_regmap_mux_data){
1652 		.offset = HHI_VAPBCLK_CNTL,
1653 		.mask = 0x3,
1654 		.shift = 9,
1655 	},
1656 	.hw.init = &(struct clk_init_data){
1657 		.name = "vapb_0_sel",
1658 		.ops = &clk_regmap_mux_ops,
1659 		.parent_names = g12a_vapb_parent_names,
1660 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_names),
1661 		.flags = CLK_SET_RATE_NO_REPARENT,
1662 	},
1663 };
1664 
1665 static struct clk_regmap g12a_vapb_0_div = {
1666 	.data = &(struct clk_regmap_div_data){
1667 		.offset = HHI_VAPBCLK_CNTL,
1668 		.shift = 0,
1669 		.width = 7,
1670 	},
1671 	.hw.init = &(struct clk_init_data){
1672 		.name = "vapb_0_div",
1673 		.ops = &clk_regmap_divider_ops,
1674 		.parent_names = (const char *[]){ "vapb_0_sel" },
1675 		.num_parents = 1,
1676 		.flags = CLK_SET_RATE_PARENT,
1677 	},
1678 };
1679 
1680 static struct clk_regmap g12a_vapb_0 = {
1681 	.data = &(struct clk_regmap_gate_data){
1682 		.offset = HHI_VAPBCLK_CNTL,
1683 		.bit_idx = 8,
1684 	},
1685 	.hw.init = &(struct clk_init_data) {
1686 		.name = "vapb_0",
1687 		.ops = &clk_regmap_gate_ops,
1688 		.parent_names = (const char *[]){ "vapb_0_div" },
1689 		.num_parents = 1,
1690 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1691 	},
1692 };
1693 
1694 static struct clk_regmap g12a_vapb_1_sel = {
1695 	.data = &(struct clk_regmap_mux_data){
1696 		.offset = HHI_VAPBCLK_CNTL,
1697 		.mask = 0x3,
1698 		.shift = 25,
1699 	},
1700 	.hw.init = &(struct clk_init_data){
1701 		.name = "vapb_1_sel",
1702 		.ops = &clk_regmap_mux_ops,
1703 		.parent_names = g12a_vapb_parent_names,
1704 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_names),
1705 		.flags = CLK_SET_RATE_NO_REPARENT,
1706 	},
1707 };
1708 
1709 static struct clk_regmap g12a_vapb_1_div = {
1710 	.data = &(struct clk_regmap_div_data){
1711 		.offset = HHI_VAPBCLK_CNTL,
1712 		.shift = 16,
1713 		.width = 7,
1714 	},
1715 	.hw.init = &(struct clk_init_data){
1716 		.name = "vapb_1_div",
1717 		.ops = &clk_regmap_divider_ops,
1718 		.parent_names = (const char *[]){ "vapb_1_sel" },
1719 		.num_parents = 1,
1720 		.flags = CLK_SET_RATE_PARENT,
1721 	},
1722 };
1723 
1724 static struct clk_regmap g12a_vapb_1 = {
1725 	.data = &(struct clk_regmap_gate_data){
1726 		.offset = HHI_VAPBCLK_CNTL,
1727 		.bit_idx = 24,
1728 	},
1729 	.hw.init = &(struct clk_init_data) {
1730 		.name = "vapb_1",
1731 		.ops = &clk_regmap_gate_ops,
1732 		.parent_names = (const char *[]){ "vapb_1_div" },
1733 		.num_parents = 1,
1734 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1735 	},
1736 };
1737 
1738 static struct clk_regmap g12a_vapb_sel = {
1739 	.data = &(struct clk_regmap_mux_data){
1740 		.offset = HHI_VAPBCLK_CNTL,
1741 		.mask = 1,
1742 		.shift = 31,
1743 	},
1744 	.hw.init = &(struct clk_init_data){
1745 		.name = "vapb_sel",
1746 		.ops = &clk_regmap_mux_ops,
1747 		/*
1748 		 * bit 31 selects from 2 possible parents:
1749 		 * vapb_0 or vapb_1
1750 		 */
1751 		.parent_names = (const char *[]){ "vapb_0", "vapb_1" },
1752 		.num_parents = 2,
1753 		.flags = CLK_SET_RATE_NO_REPARENT,
1754 	},
1755 };
1756 
1757 static struct clk_regmap g12a_vapb = {
1758 	.data = &(struct clk_regmap_gate_data){
1759 		.offset = HHI_VAPBCLK_CNTL,
1760 		.bit_idx = 30,
1761 	},
1762 	.hw.init = &(struct clk_init_data) {
1763 		.name = "vapb",
1764 		.ops = &clk_regmap_gate_ops,
1765 		.parent_names = (const char *[]){ "vapb_sel" },
1766 		.num_parents = 1,
1767 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1768 	},
1769 };
1770 
1771 /* Video Clocks */
1772 
1773 static struct clk_regmap g12a_vid_pll_div = {
1774 	.data = &(struct meson_vid_pll_div_data){
1775 		.val = {
1776 			.reg_off = HHI_VID_PLL_CLK_DIV,
1777 			.shift   = 0,
1778 			.width   = 15,
1779 		},
1780 		.sel = {
1781 			.reg_off = HHI_VID_PLL_CLK_DIV,
1782 			.shift   = 16,
1783 			.width   = 2,
1784 		},
1785 	},
1786 	.hw.init = &(struct clk_init_data) {
1787 		.name = "vid_pll_div",
1788 		.ops = &meson_vid_pll_div_ro_ops,
1789 		.parent_names = (const char *[]){ "hdmi_pll" },
1790 		.num_parents = 1,
1791 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1792 	},
1793 };
1794 
1795 static const char * const g12a_vid_pll_parent_names[] = { "vid_pll_div",
1796 							  "hdmi_pll" };
1797 
1798 static struct clk_regmap g12a_vid_pll_sel = {
1799 	.data = &(struct clk_regmap_mux_data){
1800 		.offset = HHI_VID_PLL_CLK_DIV,
1801 		.mask = 0x1,
1802 		.shift = 18,
1803 	},
1804 	.hw.init = &(struct clk_init_data){
1805 		.name = "vid_pll_sel",
1806 		.ops = &clk_regmap_mux_ops,
1807 		/*
1808 		 * bit 18 selects from 2 possible parents:
1809 		 * vid_pll_div or hdmi_pll
1810 		 */
1811 		.parent_names = g12a_vid_pll_parent_names,
1812 		.num_parents = ARRAY_SIZE(g12a_vid_pll_parent_names),
1813 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1814 	},
1815 };
1816 
1817 static struct clk_regmap g12a_vid_pll = {
1818 	.data = &(struct clk_regmap_gate_data){
1819 		.offset = HHI_VID_PLL_CLK_DIV,
1820 		.bit_idx = 19,
1821 	},
1822 	.hw.init = &(struct clk_init_data) {
1823 		.name = "vid_pll",
1824 		.ops = &clk_regmap_gate_ops,
1825 		.parent_names = (const char *[]){ "vid_pll_sel" },
1826 		.num_parents = 1,
1827 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1828 	},
1829 };
1830 
1831 static const char * const g12a_vclk_parent_names[] = {
1832 	"vid_pll", "gp0_pll", "hifi_pll", "mpll1", "fclk_div3", "fclk_div4",
1833 	"fclk_div5", "fclk_div7"
1834 };
1835 
1836 static struct clk_regmap g12a_vclk_sel = {
1837 	.data = &(struct clk_regmap_mux_data){
1838 		.offset = HHI_VID_CLK_CNTL,
1839 		.mask = 0x7,
1840 		.shift = 16,
1841 	},
1842 	.hw.init = &(struct clk_init_data){
1843 		.name = "vclk_sel",
1844 		.ops = &clk_regmap_mux_ops,
1845 		.parent_names = g12a_vclk_parent_names,
1846 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_names),
1847 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1848 	},
1849 };
1850 
1851 static struct clk_regmap g12a_vclk2_sel = {
1852 	.data = &(struct clk_regmap_mux_data){
1853 		.offset = HHI_VIID_CLK_CNTL,
1854 		.mask = 0x7,
1855 		.shift = 16,
1856 	},
1857 	.hw.init = &(struct clk_init_data){
1858 		.name = "vclk2_sel",
1859 		.ops = &clk_regmap_mux_ops,
1860 		.parent_names = g12a_vclk_parent_names,
1861 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_names),
1862 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1863 	},
1864 };
1865 
1866 static struct clk_regmap g12a_vclk_input = {
1867 	.data = &(struct clk_regmap_gate_data){
1868 		.offset = HHI_VID_CLK_DIV,
1869 		.bit_idx = 16,
1870 	},
1871 	.hw.init = &(struct clk_init_data) {
1872 		.name = "vclk_input",
1873 		.ops = &clk_regmap_gate_ops,
1874 		.parent_names = (const char *[]){ "vclk_sel" },
1875 		.num_parents = 1,
1876 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1877 	},
1878 };
1879 
1880 static struct clk_regmap g12a_vclk2_input = {
1881 	.data = &(struct clk_regmap_gate_data){
1882 		.offset = HHI_VIID_CLK_DIV,
1883 		.bit_idx = 16,
1884 	},
1885 	.hw.init = &(struct clk_init_data) {
1886 		.name = "vclk2_input",
1887 		.ops = &clk_regmap_gate_ops,
1888 		.parent_names = (const char *[]){ "vclk2_sel" },
1889 		.num_parents = 1,
1890 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1891 	},
1892 };
1893 
1894 static struct clk_regmap g12a_vclk_div = {
1895 	.data = &(struct clk_regmap_div_data){
1896 		.offset = HHI_VID_CLK_DIV,
1897 		.shift = 0,
1898 		.width = 8,
1899 	},
1900 	.hw.init = &(struct clk_init_data){
1901 		.name = "vclk_div",
1902 		.ops = &clk_regmap_divider_ops,
1903 		.parent_names = (const char *[]){ "vclk_input" },
1904 		.num_parents = 1,
1905 		.flags = CLK_GET_RATE_NOCACHE,
1906 	},
1907 };
1908 
1909 static struct clk_regmap g12a_vclk2_div = {
1910 	.data = &(struct clk_regmap_div_data){
1911 		.offset = HHI_VIID_CLK_DIV,
1912 		.shift = 0,
1913 		.width = 8,
1914 	},
1915 	.hw.init = &(struct clk_init_data){
1916 		.name = "vclk2_div",
1917 		.ops = &clk_regmap_divider_ops,
1918 		.parent_names = (const char *[]){ "vclk2_input" },
1919 		.num_parents = 1,
1920 		.flags = CLK_GET_RATE_NOCACHE,
1921 	},
1922 };
1923 
1924 static struct clk_regmap g12a_vclk = {
1925 	.data = &(struct clk_regmap_gate_data){
1926 		.offset = HHI_VID_CLK_CNTL,
1927 		.bit_idx = 19,
1928 	},
1929 	.hw.init = &(struct clk_init_data) {
1930 		.name = "vclk",
1931 		.ops = &clk_regmap_gate_ops,
1932 		.parent_names = (const char *[]){ "vclk_div" },
1933 		.num_parents = 1,
1934 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1935 	},
1936 };
1937 
1938 static struct clk_regmap g12a_vclk2 = {
1939 	.data = &(struct clk_regmap_gate_data){
1940 		.offset = HHI_VIID_CLK_CNTL,
1941 		.bit_idx = 19,
1942 	},
1943 	.hw.init = &(struct clk_init_data) {
1944 		.name = "vclk2",
1945 		.ops = &clk_regmap_gate_ops,
1946 		.parent_names = (const char *[]){ "vclk2_div" },
1947 		.num_parents = 1,
1948 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1949 	},
1950 };
1951 
1952 static struct clk_regmap g12a_vclk_div1 = {
1953 	.data = &(struct clk_regmap_gate_data){
1954 		.offset = HHI_VID_CLK_CNTL,
1955 		.bit_idx = 0,
1956 	},
1957 	.hw.init = &(struct clk_init_data) {
1958 		.name = "vclk_div1",
1959 		.ops = &clk_regmap_gate_ops,
1960 		.parent_names = (const char *[]){ "vclk" },
1961 		.num_parents = 1,
1962 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1963 	},
1964 };
1965 
1966 static struct clk_regmap g12a_vclk_div2_en = {
1967 	.data = &(struct clk_regmap_gate_data){
1968 		.offset = HHI_VID_CLK_CNTL,
1969 		.bit_idx = 1,
1970 	},
1971 	.hw.init = &(struct clk_init_data) {
1972 		.name = "vclk_div2_en",
1973 		.ops = &clk_regmap_gate_ops,
1974 		.parent_names = (const char *[]){ "vclk" },
1975 		.num_parents = 1,
1976 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1977 	},
1978 };
1979 
1980 static struct clk_regmap g12a_vclk_div4_en = {
1981 	.data = &(struct clk_regmap_gate_data){
1982 		.offset = HHI_VID_CLK_CNTL,
1983 		.bit_idx = 2,
1984 	},
1985 	.hw.init = &(struct clk_init_data) {
1986 		.name = "vclk_div4_en",
1987 		.ops = &clk_regmap_gate_ops,
1988 		.parent_names = (const char *[]){ "vclk" },
1989 		.num_parents = 1,
1990 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1991 	},
1992 };
1993 
1994 static struct clk_regmap g12a_vclk_div6_en = {
1995 	.data = &(struct clk_regmap_gate_data){
1996 		.offset = HHI_VID_CLK_CNTL,
1997 		.bit_idx = 3,
1998 	},
1999 	.hw.init = &(struct clk_init_data) {
2000 		.name = "vclk_div6_en",
2001 		.ops = &clk_regmap_gate_ops,
2002 		.parent_names = (const char *[]){ "vclk" },
2003 		.num_parents = 1,
2004 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2005 	},
2006 };
2007 
2008 static struct clk_regmap g12a_vclk_div12_en = {
2009 	.data = &(struct clk_regmap_gate_data){
2010 		.offset = HHI_VID_CLK_CNTL,
2011 		.bit_idx = 4,
2012 	},
2013 	.hw.init = &(struct clk_init_data) {
2014 		.name = "vclk_div12_en",
2015 		.ops = &clk_regmap_gate_ops,
2016 		.parent_names = (const char *[]){ "vclk" },
2017 		.num_parents = 1,
2018 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2019 	},
2020 };
2021 
2022 static struct clk_regmap g12a_vclk2_div1 = {
2023 	.data = &(struct clk_regmap_gate_data){
2024 		.offset = HHI_VIID_CLK_CNTL,
2025 		.bit_idx = 0,
2026 	},
2027 	.hw.init = &(struct clk_init_data) {
2028 		.name = "vclk2_div1",
2029 		.ops = &clk_regmap_gate_ops,
2030 		.parent_names = (const char *[]){ "vclk2" },
2031 		.num_parents = 1,
2032 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2033 	},
2034 };
2035 
2036 static struct clk_regmap g12a_vclk2_div2_en = {
2037 	.data = &(struct clk_regmap_gate_data){
2038 		.offset = HHI_VIID_CLK_CNTL,
2039 		.bit_idx = 1,
2040 	},
2041 	.hw.init = &(struct clk_init_data) {
2042 		.name = "vclk2_div2_en",
2043 		.ops = &clk_regmap_gate_ops,
2044 		.parent_names = (const char *[]){ "vclk2" },
2045 		.num_parents = 1,
2046 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2047 	},
2048 };
2049 
2050 static struct clk_regmap g12a_vclk2_div4_en = {
2051 	.data = &(struct clk_regmap_gate_data){
2052 		.offset = HHI_VIID_CLK_CNTL,
2053 		.bit_idx = 2,
2054 	},
2055 	.hw.init = &(struct clk_init_data) {
2056 		.name = "vclk2_div4_en",
2057 		.ops = &clk_regmap_gate_ops,
2058 		.parent_names = (const char *[]){ "vclk2" },
2059 		.num_parents = 1,
2060 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2061 	},
2062 };
2063 
2064 static struct clk_regmap g12a_vclk2_div6_en = {
2065 	.data = &(struct clk_regmap_gate_data){
2066 		.offset = HHI_VIID_CLK_CNTL,
2067 		.bit_idx = 3,
2068 	},
2069 	.hw.init = &(struct clk_init_data) {
2070 		.name = "vclk2_div6_en",
2071 		.ops = &clk_regmap_gate_ops,
2072 		.parent_names = (const char *[]){ "vclk2" },
2073 		.num_parents = 1,
2074 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2075 	},
2076 };
2077 
2078 static struct clk_regmap g12a_vclk2_div12_en = {
2079 	.data = &(struct clk_regmap_gate_data){
2080 		.offset = HHI_VIID_CLK_CNTL,
2081 		.bit_idx = 4,
2082 	},
2083 	.hw.init = &(struct clk_init_data) {
2084 		.name = "vclk2_div12_en",
2085 		.ops = &clk_regmap_gate_ops,
2086 		.parent_names = (const char *[]){ "vclk2" },
2087 		.num_parents = 1,
2088 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2089 	},
2090 };
2091 
2092 static struct clk_fixed_factor g12a_vclk_div2 = {
2093 	.mult = 1,
2094 	.div = 2,
2095 	.hw.init = &(struct clk_init_data){
2096 		.name = "vclk_div2",
2097 		.ops = &clk_fixed_factor_ops,
2098 		.parent_names = (const char *[]){ "vclk_div2_en" },
2099 		.num_parents = 1,
2100 	},
2101 };
2102 
2103 static struct clk_fixed_factor g12a_vclk_div4 = {
2104 	.mult = 1,
2105 	.div = 4,
2106 	.hw.init = &(struct clk_init_data){
2107 		.name = "vclk_div4",
2108 		.ops = &clk_fixed_factor_ops,
2109 		.parent_names = (const char *[]){ "vclk_div4_en" },
2110 		.num_parents = 1,
2111 	},
2112 };
2113 
2114 static struct clk_fixed_factor g12a_vclk_div6 = {
2115 	.mult = 1,
2116 	.div = 6,
2117 	.hw.init = &(struct clk_init_data){
2118 		.name = "vclk_div6",
2119 		.ops = &clk_fixed_factor_ops,
2120 		.parent_names = (const char *[]){ "vclk_div6_en" },
2121 		.num_parents = 1,
2122 	},
2123 };
2124 
2125 static struct clk_fixed_factor g12a_vclk_div12 = {
2126 	.mult = 1,
2127 	.div = 12,
2128 	.hw.init = &(struct clk_init_data){
2129 		.name = "vclk_div12",
2130 		.ops = &clk_fixed_factor_ops,
2131 		.parent_names = (const char *[]){ "vclk_div12_en" },
2132 		.num_parents = 1,
2133 	},
2134 };
2135 
2136 static struct clk_fixed_factor g12a_vclk2_div2 = {
2137 	.mult = 1,
2138 	.div = 2,
2139 	.hw.init = &(struct clk_init_data){
2140 		.name = "vclk2_div2",
2141 		.ops = &clk_fixed_factor_ops,
2142 		.parent_names = (const char *[]){ "vclk2_div2_en" },
2143 		.num_parents = 1,
2144 	},
2145 };
2146 
2147 static struct clk_fixed_factor g12a_vclk2_div4 = {
2148 	.mult = 1,
2149 	.div = 4,
2150 	.hw.init = &(struct clk_init_data){
2151 		.name = "vclk2_div4",
2152 		.ops = &clk_fixed_factor_ops,
2153 		.parent_names = (const char *[]){ "vclk2_div4_en" },
2154 		.num_parents = 1,
2155 	},
2156 };
2157 
2158 static struct clk_fixed_factor g12a_vclk2_div6 = {
2159 	.mult = 1,
2160 	.div = 6,
2161 	.hw.init = &(struct clk_init_data){
2162 		.name = "vclk2_div6",
2163 		.ops = &clk_fixed_factor_ops,
2164 		.parent_names = (const char *[]){ "vclk2_div6_en" },
2165 		.num_parents = 1,
2166 	},
2167 };
2168 
2169 static struct clk_fixed_factor g12a_vclk2_div12 = {
2170 	.mult = 1,
2171 	.div = 12,
2172 	.hw.init = &(struct clk_init_data){
2173 		.name = "vclk2_div12",
2174 		.ops = &clk_fixed_factor_ops,
2175 		.parent_names = (const char *[]){ "vclk2_div12_en" },
2176 		.num_parents = 1,
2177 	},
2178 };
2179 
2180 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
2181 static const char * const g12a_cts_parent_names[] = {
2182 	"vclk_div1", "vclk_div2", "vclk_div4", "vclk_div6",
2183 	"vclk_div12", "vclk2_div1", "vclk2_div2", "vclk2_div4",
2184 	"vclk2_div6", "vclk2_div12"
2185 };
2186 
2187 static struct clk_regmap g12a_cts_enci_sel = {
2188 	.data = &(struct clk_regmap_mux_data){
2189 		.offset = HHI_VID_CLK_DIV,
2190 		.mask = 0xf,
2191 		.shift = 28,
2192 		.table = mux_table_cts_sel,
2193 	},
2194 	.hw.init = &(struct clk_init_data){
2195 		.name = "cts_enci_sel",
2196 		.ops = &clk_regmap_mux_ops,
2197 		.parent_names = g12a_cts_parent_names,
2198 		.num_parents = ARRAY_SIZE(g12a_cts_parent_names),
2199 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2200 	},
2201 };
2202 
2203 static struct clk_regmap g12a_cts_encp_sel = {
2204 	.data = &(struct clk_regmap_mux_data){
2205 		.offset = HHI_VID_CLK_DIV,
2206 		.mask = 0xf,
2207 		.shift = 20,
2208 		.table = mux_table_cts_sel,
2209 	},
2210 	.hw.init = &(struct clk_init_data){
2211 		.name = "cts_encp_sel",
2212 		.ops = &clk_regmap_mux_ops,
2213 		.parent_names = g12a_cts_parent_names,
2214 		.num_parents = ARRAY_SIZE(g12a_cts_parent_names),
2215 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2216 	},
2217 };
2218 
2219 static struct clk_regmap g12a_cts_vdac_sel = {
2220 	.data = &(struct clk_regmap_mux_data){
2221 		.offset = HHI_VIID_CLK_DIV,
2222 		.mask = 0xf,
2223 		.shift = 28,
2224 		.table = mux_table_cts_sel,
2225 	},
2226 	.hw.init = &(struct clk_init_data){
2227 		.name = "cts_vdac_sel",
2228 		.ops = &clk_regmap_mux_ops,
2229 		.parent_names = g12a_cts_parent_names,
2230 		.num_parents = ARRAY_SIZE(g12a_cts_parent_names),
2231 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2232 	},
2233 };
2234 
2235 /* TOFIX: add support for cts_tcon */
2236 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
2237 static const char * const g12a_cts_hdmi_tx_parent_names[] = {
2238 	"vclk_div1", "vclk_div2", "vclk_div4", "vclk_div6",
2239 	"vclk_div12", "vclk2_div1", "vclk2_div2", "vclk2_div4",
2240 	"vclk2_div6", "vclk2_div12"
2241 };
2242 
2243 static struct clk_regmap g12a_hdmi_tx_sel = {
2244 	.data = &(struct clk_regmap_mux_data){
2245 		.offset = HHI_HDMI_CLK_CNTL,
2246 		.mask = 0xf,
2247 		.shift = 16,
2248 		.table = mux_table_hdmi_tx_sel,
2249 	},
2250 	.hw.init = &(struct clk_init_data){
2251 		.name = "hdmi_tx_sel",
2252 		.ops = &clk_regmap_mux_ops,
2253 		.parent_names = g12a_cts_hdmi_tx_parent_names,
2254 		.num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_names),
2255 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2256 	},
2257 };
2258 
2259 static struct clk_regmap g12a_cts_enci = {
2260 	.data = &(struct clk_regmap_gate_data){
2261 		.offset = HHI_VID_CLK_CNTL2,
2262 		.bit_idx = 0,
2263 	},
2264 	.hw.init = &(struct clk_init_data) {
2265 		.name = "cts_enci",
2266 		.ops = &clk_regmap_gate_ops,
2267 		.parent_names = (const char *[]){ "cts_enci_sel" },
2268 		.num_parents = 1,
2269 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2270 	},
2271 };
2272 
2273 static struct clk_regmap g12a_cts_encp = {
2274 	.data = &(struct clk_regmap_gate_data){
2275 		.offset = HHI_VID_CLK_CNTL2,
2276 		.bit_idx = 2,
2277 	},
2278 	.hw.init = &(struct clk_init_data) {
2279 		.name = "cts_encp",
2280 		.ops = &clk_regmap_gate_ops,
2281 		.parent_names = (const char *[]){ "cts_encp_sel" },
2282 		.num_parents = 1,
2283 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2284 	},
2285 };
2286 
2287 static struct clk_regmap g12a_cts_vdac = {
2288 	.data = &(struct clk_regmap_gate_data){
2289 		.offset = HHI_VID_CLK_CNTL2,
2290 		.bit_idx = 4,
2291 	},
2292 	.hw.init = &(struct clk_init_data) {
2293 		.name = "cts_vdac",
2294 		.ops = &clk_regmap_gate_ops,
2295 		.parent_names = (const char *[]){ "cts_vdac_sel" },
2296 		.num_parents = 1,
2297 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2298 	},
2299 };
2300 
2301 static struct clk_regmap g12a_hdmi_tx = {
2302 	.data = &(struct clk_regmap_gate_data){
2303 		.offset = HHI_VID_CLK_CNTL2,
2304 		.bit_idx = 5,
2305 	},
2306 	.hw.init = &(struct clk_init_data) {
2307 		.name = "hdmi_tx",
2308 		.ops = &clk_regmap_gate_ops,
2309 		.parent_names = (const char *[]){ "hdmi_tx_sel" },
2310 		.num_parents = 1,
2311 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2312 	},
2313 };
2314 
2315 /* HDMI Clocks */
2316 
2317 static const char * const g12a_hdmi_parent_names[] = {
2318 	IN_PREFIX "xtal", "fclk_div4", "fclk_div3", "fclk_div5"
2319 };
2320 
2321 static struct clk_regmap g12a_hdmi_sel = {
2322 	.data = &(struct clk_regmap_mux_data){
2323 		.offset = HHI_HDMI_CLK_CNTL,
2324 		.mask = 0x3,
2325 		.shift = 9,
2326 		.flags = CLK_MUX_ROUND_CLOSEST,
2327 	},
2328 	.hw.init = &(struct clk_init_data){
2329 		.name = "hdmi_sel",
2330 		.ops = &clk_regmap_mux_ops,
2331 		.parent_names = g12a_hdmi_parent_names,
2332 		.num_parents = ARRAY_SIZE(g12a_hdmi_parent_names),
2333 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2334 	},
2335 };
2336 
2337 static struct clk_regmap g12a_hdmi_div = {
2338 	.data = &(struct clk_regmap_div_data){
2339 		.offset = HHI_HDMI_CLK_CNTL,
2340 		.shift = 0,
2341 		.width = 7,
2342 	},
2343 	.hw.init = &(struct clk_init_data){
2344 		.name = "hdmi_div",
2345 		.ops = &clk_regmap_divider_ops,
2346 		.parent_names = (const char *[]){ "hdmi_sel" },
2347 		.num_parents = 1,
2348 		.flags = CLK_GET_RATE_NOCACHE,
2349 	},
2350 };
2351 
2352 static struct clk_regmap g12a_hdmi = {
2353 	.data = &(struct clk_regmap_gate_data){
2354 		.offset = HHI_HDMI_CLK_CNTL,
2355 		.bit_idx = 8,
2356 	},
2357 	.hw.init = &(struct clk_init_data) {
2358 		.name = "hdmi",
2359 		.ops = &clk_regmap_gate_ops,
2360 		.parent_names = (const char *[]){ "hdmi_div" },
2361 		.num_parents = 1,
2362 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2363 	},
2364 };
2365 
2366 /*
2367  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
2368  * muxed by a glitch-free switch.
2369  */
2370 
2371 static const char * const g12a_mali_0_1_parent_names[] = {
2372 	IN_PREFIX "xtal", "gp0_pll", "hihi_pll", "fclk_div2p5",
2373 	"fclk_div3", "fclk_div4", "fclk_div5", "fclk_div7"
2374 };
2375 
2376 static struct clk_regmap g12a_mali_0_sel = {
2377 	.data = &(struct clk_regmap_mux_data){
2378 		.offset = HHI_MALI_CLK_CNTL,
2379 		.mask = 0x7,
2380 		.shift = 9,
2381 	},
2382 	.hw.init = &(struct clk_init_data){
2383 		.name = "mali_0_sel",
2384 		.ops = &clk_regmap_mux_ops,
2385 		.parent_names = g12a_mali_0_1_parent_names,
2386 		.num_parents = 8,
2387 		.flags = CLK_SET_RATE_NO_REPARENT,
2388 	},
2389 };
2390 
2391 static struct clk_regmap g12a_mali_0_div = {
2392 	.data = &(struct clk_regmap_div_data){
2393 		.offset = HHI_MALI_CLK_CNTL,
2394 		.shift = 0,
2395 		.width = 7,
2396 	},
2397 	.hw.init = &(struct clk_init_data){
2398 		.name = "mali_0_div",
2399 		.ops = &clk_regmap_divider_ops,
2400 		.parent_names = (const char *[]){ "mali_0_sel" },
2401 		.num_parents = 1,
2402 		.flags = CLK_SET_RATE_NO_REPARENT,
2403 	},
2404 };
2405 
2406 static struct clk_regmap g12a_mali_0 = {
2407 	.data = &(struct clk_regmap_gate_data){
2408 		.offset = HHI_MALI_CLK_CNTL,
2409 		.bit_idx = 8,
2410 	},
2411 	.hw.init = &(struct clk_init_data){
2412 		.name = "mali_0",
2413 		.ops = &clk_regmap_gate_ops,
2414 		.parent_names = (const char *[]){ "mali_0_div" },
2415 		.num_parents = 1,
2416 		.flags = CLK_SET_RATE_PARENT,
2417 	},
2418 };
2419 
2420 static struct clk_regmap g12a_mali_1_sel = {
2421 	.data = &(struct clk_regmap_mux_data){
2422 		.offset = HHI_MALI_CLK_CNTL,
2423 		.mask = 0x7,
2424 		.shift = 25,
2425 	},
2426 	.hw.init = &(struct clk_init_data){
2427 		.name = "mali_1_sel",
2428 		.ops = &clk_regmap_mux_ops,
2429 		.parent_names = g12a_mali_0_1_parent_names,
2430 		.num_parents = 8,
2431 		.flags = CLK_SET_RATE_NO_REPARENT,
2432 	},
2433 };
2434 
2435 static struct clk_regmap g12a_mali_1_div = {
2436 	.data = &(struct clk_regmap_div_data){
2437 		.offset = HHI_MALI_CLK_CNTL,
2438 		.shift = 16,
2439 		.width = 7,
2440 	},
2441 	.hw.init = &(struct clk_init_data){
2442 		.name = "mali_1_div",
2443 		.ops = &clk_regmap_divider_ops,
2444 		.parent_names = (const char *[]){ "mali_1_sel" },
2445 		.num_parents = 1,
2446 		.flags = CLK_SET_RATE_NO_REPARENT,
2447 	},
2448 };
2449 
2450 static struct clk_regmap g12a_mali_1 = {
2451 	.data = &(struct clk_regmap_gate_data){
2452 		.offset = HHI_MALI_CLK_CNTL,
2453 		.bit_idx = 24,
2454 	},
2455 	.hw.init = &(struct clk_init_data){
2456 		.name = "mali_1",
2457 		.ops = &clk_regmap_gate_ops,
2458 		.parent_names = (const char *[]){ "mali_1_div" },
2459 		.num_parents = 1,
2460 		.flags = CLK_SET_RATE_PARENT,
2461 	},
2462 };
2463 
2464 static const char * const g12a_mali_parent_names[] = {
2465 	"mali_0", "mali_1"
2466 };
2467 
2468 static struct clk_regmap g12a_mali = {
2469 	.data = &(struct clk_regmap_mux_data){
2470 		.offset = HHI_MALI_CLK_CNTL,
2471 		.mask = 1,
2472 		.shift = 31,
2473 	},
2474 	.hw.init = &(struct clk_init_data){
2475 		.name = "mali",
2476 		.ops = &clk_regmap_mux_ops,
2477 		.parent_names = g12a_mali_parent_names,
2478 		.num_parents = 2,
2479 		.flags = CLK_SET_RATE_NO_REPARENT,
2480 	},
2481 };
2482 
2483 /* Everything Else (EE) domain gates */
2484 static MESON_GATE(g12a_ddr,			HHI_GCLK_MPEG0,	0);
2485 static MESON_GATE(g12a_dos,			HHI_GCLK_MPEG0,	1);
2486 static MESON_GATE(g12a_audio_locker,		HHI_GCLK_MPEG0,	2);
2487 static MESON_GATE(g12a_mipi_dsi_host,		HHI_GCLK_MPEG0,	3);
2488 static MESON_GATE(g12a_eth_phy,			HHI_GCLK_MPEG0,	4);
2489 static MESON_GATE(g12a_isa,			HHI_GCLK_MPEG0,	5);
2490 static MESON_GATE(g12a_pl301,			HHI_GCLK_MPEG0,	6);
2491 static MESON_GATE(g12a_periphs,			HHI_GCLK_MPEG0,	7);
2492 static MESON_GATE(g12a_spicc_0,			HHI_GCLK_MPEG0,	8);
2493 static MESON_GATE(g12a_i2c,			HHI_GCLK_MPEG0,	9);
2494 static MESON_GATE(g12a_sana,			HHI_GCLK_MPEG0,	10);
2495 static MESON_GATE(g12a_sd,			HHI_GCLK_MPEG0,	11);
2496 static MESON_GATE(g12a_rng0,			HHI_GCLK_MPEG0,	12);
2497 static MESON_GATE(g12a_uart0,			HHI_GCLK_MPEG0,	13);
2498 static MESON_GATE(g12a_spicc_1,			HHI_GCLK_MPEG0,	14);
2499 static MESON_GATE(g12a_hiu_reg,			HHI_GCLK_MPEG0,	19);
2500 static MESON_GATE(g12a_mipi_dsi_phy,		HHI_GCLK_MPEG0,	20);
2501 static MESON_GATE(g12a_assist_misc,		HHI_GCLK_MPEG0,	23);
2502 static MESON_GATE(g12a_emmc_a,			HHI_GCLK_MPEG0,	4);
2503 static MESON_GATE(g12a_emmc_b,			HHI_GCLK_MPEG0,	25);
2504 static MESON_GATE(g12a_emmc_c,			HHI_GCLK_MPEG0,	26);
2505 static MESON_GATE(g12a_audio_codec,		HHI_GCLK_MPEG0,	28);
2506 
2507 static MESON_GATE(g12a_audio,			HHI_GCLK_MPEG1,	0);
2508 static MESON_GATE(g12a_eth_core,		HHI_GCLK_MPEG1,	3);
2509 static MESON_GATE(g12a_demux,			HHI_GCLK_MPEG1,	4);
2510 static MESON_GATE(g12a_audio_ififo,		HHI_GCLK_MPEG1,	11);
2511 static MESON_GATE(g12a_adc,			HHI_GCLK_MPEG1,	13);
2512 static MESON_GATE(g12a_uart1,			HHI_GCLK_MPEG1,	16);
2513 static MESON_GATE(g12a_g2d,			HHI_GCLK_MPEG1,	20);
2514 static MESON_GATE(g12a_reset,			HHI_GCLK_MPEG1,	23);
2515 static MESON_GATE(g12a_pcie_comb,		HHI_GCLK_MPEG1,	24);
2516 static MESON_GATE(g12a_parser,			HHI_GCLK_MPEG1,	25);
2517 static MESON_GATE(g12a_usb_general,		HHI_GCLK_MPEG1,	26);
2518 static MESON_GATE(g12a_pcie_phy,		HHI_GCLK_MPEG1,	27);
2519 static MESON_GATE(g12a_ahb_arb0,		HHI_GCLK_MPEG1,	29);
2520 
2521 static MESON_GATE(g12a_ahb_data_bus,		HHI_GCLK_MPEG2,	1);
2522 static MESON_GATE(g12a_ahb_ctrl_bus,		HHI_GCLK_MPEG2,	2);
2523 static MESON_GATE(g12a_htx_hdcp22,		HHI_GCLK_MPEG2,	3);
2524 static MESON_GATE(g12a_htx_pclk,		HHI_GCLK_MPEG2,	4);
2525 static MESON_GATE(g12a_bt656,			HHI_GCLK_MPEG2,	6);
2526 static MESON_GATE(g12a_usb1_to_ddr,		HHI_GCLK_MPEG2,	8);
2527 static MESON_GATE(g12a_mmc_pclk,		HHI_GCLK_MPEG2,	11);
2528 static MESON_GATE(g12a_uart2,			HHI_GCLK_MPEG2,	15);
2529 static MESON_GATE(g12a_vpu_intr,		HHI_GCLK_MPEG2,	25);
2530 static MESON_GATE(g12a_gic,			HHI_GCLK_MPEG2,	30);
2531 
2532 static MESON_GATE(g12a_vclk2_venci0,		HHI_GCLK_OTHER,	1);
2533 static MESON_GATE(g12a_vclk2_venci1,		HHI_GCLK_OTHER,	2);
2534 static MESON_GATE(g12a_vclk2_vencp0,		HHI_GCLK_OTHER,	3);
2535 static MESON_GATE(g12a_vclk2_vencp1,		HHI_GCLK_OTHER,	4);
2536 static MESON_GATE(g12a_vclk2_venct0,		HHI_GCLK_OTHER,	5);
2537 static MESON_GATE(g12a_vclk2_venct1,		HHI_GCLK_OTHER,	6);
2538 static MESON_GATE(g12a_vclk2_other,		HHI_GCLK_OTHER,	7);
2539 static MESON_GATE(g12a_vclk2_enci,		HHI_GCLK_OTHER,	8);
2540 static MESON_GATE(g12a_vclk2_encp,		HHI_GCLK_OTHER,	9);
2541 static MESON_GATE(g12a_dac_clk,			HHI_GCLK_OTHER,	10);
2542 static MESON_GATE(g12a_aoclk_gate,		HHI_GCLK_OTHER,	14);
2543 static MESON_GATE(g12a_iec958_gate,		HHI_GCLK_OTHER,	16);
2544 static MESON_GATE(g12a_enc480p,			HHI_GCLK_OTHER,	20);
2545 static MESON_GATE(g12a_rng1,			HHI_GCLK_OTHER,	21);
2546 static MESON_GATE(g12a_vclk2_enct,		HHI_GCLK_OTHER,	22);
2547 static MESON_GATE(g12a_vclk2_encl,		HHI_GCLK_OTHER,	23);
2548 static MESON_GATE(g12a_vclk2_venclmmc,		HHI_GCLK_OTHER,	24);
2549 static MESON_GATE(g12a_vclk2_vencl,		HHI_GCLK_OTHER,	25);
2550 static MESON_GATE(g12a_vclk2_other1,		HHI_GCLK_OTHER,	26);
2551 
2552 static MESON_GATE_RO(g12a_dma,			HHI_GCLK_OTHER2, 0);
2553 static MESON_GATE_RO(g12a_efuse,		HHI_GCLK_OTHER2, 1);
2554 static MESON_GATE_RO(g12a_rom_boot,		HHI_GCLK_OTHER2, 2);
2555 static MESON_GATE_RO(g12a_reset_sec,		HHI_GCLK_OTHER2, 3);
2556 static MESON_GATE_RO(g12a_sec_ahb_apb3,		HHI_GCLK_OTHER2, 4);
2557 
2558 /* Array of all clocks provided by this provider */
2559 static struct clk_hw_onecell_data g12a_hw_onecell_data = {
2560 	.hws = {
2561 		[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
2562 		[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
2563 		[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
2564 		[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
2565 		[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
2566 		[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
2567 		[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
2568 		[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
2569 		[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
2570 		[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
2571 		[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
2572 		[CLKID_CLK81]			= &g12a_clk81.hw,
2573 		[CLKID_MPLL0]			= &g12a_mpll0.hw,
2574 		[CLKID_MPLL1]			= &g12a_mpll1.hw,
2575 		[CLKID_MPLL2]			= &g12a_mpll2.hw,
2576 		[CLKID_MPLL3]			= &g12a_mpll3.hw,
2577 		[CLKID_DDR]			= &g12a_ddr.hw,
2578 		[CLKID_DOS]			= &g12a_dos.hw,
2579 		[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
2580 		[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
2581 		[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
2582 		[CLKID_ISA]			= &g12a_isa.hw,
2583 		[CLKID_PL301]			= &g12a_pl301.hw,
2584 		[CLKID_PERIPHS]			= &g12a_periphs.hw,
2585 		[CLKID_SPICC0]			= &g12a_spicc_0.hw,
2586 		[CLKID_I2C]			= &g12a_i2c.hw,
2587 		[CLKID_SANA]			= &g12a_sana.hw,
2588 		[CLKID_SD]			= &g12a_sd.hw,
2589 		[CLKID_RNG0]			= &g12a_rng0.hw,
2590 		[CLKID_UART0]			= &g12a_uart0.hw,
2591 		[CLKID_SPICC1]			= &g12a_spicc_1.hw,
2592 		[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
2593 		[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
2594 		[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
2595 		[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
2596 		[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
2597 		[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
2598 		[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
2599 		[CLKID_AUDIO]			= &g12a_audio.hw,
2600 		[CLKID_ETH]			= &g12a_eth_core.hw,
2601 		[CLKID_DEMUX]			= &g12a_demux.hw,
2602 		[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
2603 		[CLKID_ADC]			= &g12a_adc.hw,
2604 		[CLKID_UART1]			= &g12a_uart1.hw,
2605 		[CLKID_G2D]			= &g12a_g2d.hw,
2606 		[CLKID_RESET]			= &g12a_reset.hw,
2607 		[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
2608 		[CLKID_PARSER]			= &g12a_parser.hw,
2609 		[CLKID_USB]			= &g12a_usb_general.hw,
2610 		[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
2611 		[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
2612 		[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
2613 		[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
2614 		[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
2615 		[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
2616 		[CLKID_BT656]			= &g12a_bt656.hw,
2617 		[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
2618 		[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
2619 		[CLKID_UART2]			= &g12a_uart2.hw,
2620 		[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
2621 		[CLKID_GIC]			= &g12a_gic.hw,
2622 		[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
2623 		[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
2624 		[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
2625 		[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
2626 		[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
2627 		[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
2628 		[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
2629 		[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
2630 		[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
2631 		[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
2632 		[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
2633 		[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
2634 		[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
2635 		[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
2636 		[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
2637 		[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
2638 		[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
2639 		[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
2640 		[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
2641 		[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
2642 		[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
2643 		[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
2644 		[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
2645 		[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
2646 		[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
2647 		[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
2648 		[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
2649 		[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
2650 		[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
2651 		[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
2652 		[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
2653 		[CLKID_IEC958]			= &g12a_iec958_gate.hw,
2654 		[CLKID_ENC480P]			= &g12a_enc480p.hw,
2655 		[CLKID_RNG1]			= &g12a_rng1.hw,
2656 		[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
2657 		[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
2658 		[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
2659 		[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
2660 		[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
2661 		[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
2662 		[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
2663 		[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
2664 		[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
2665 		[CLKID_DMA]			= &g12a_dma.hw,
2666 		[CLKID_EFUSE]			= &g12a_efuse.hw,
2667 		[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
2668 		[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
2669 		[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
2670 		[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
2671 		[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
2672 		[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
2673 		[CLKID_VPU_0]			= &g12a_vpu_0.hw,
2674 		[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
2675 		[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
2676 		[CLKID_VPU_1]			= &g12a_vpu_1.hw,
2677 		[CLKID_VPU]			= &g12a_vpu.hw,
2678 		[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
2679 		[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
2680 		[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
2681 		[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
2682 		[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
2683 		[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
2684 		[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
2685 		[CLKID_VAPB]			= &g12a_vapb.hw,
2686 		[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
2687 		[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
2688 		[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
2689 		[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
2690 		[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
2691 		[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
2692 		[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
2693 		[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
2694 		[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
2695 		[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
2696 		[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
2697 		[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
2698 		[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
2699 		[CLKID_VCLK]			= &g12a_vclk.hw,
2700 		[CLKID_VCLK2]			= &g12a_vclk2.hw,
2701 		[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
2702 		[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
2703 		[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
2704 		[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
2705 		[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
2706 		[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
2707 		[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
2708 		[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
2709 		[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
2710 		[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
2711 		[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
2712 		[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
2713 		[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
2714 		[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
2715 		[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
2716 		[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
2717 		[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
2718 		[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
2719 		[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
2720 		[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
2721 		[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
2722 		[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
2723 		[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
2724 		[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
2725 		[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
2726 		[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
2727 		[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
2728 		[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
2729 		[CLKID_HDMI]			= &g12a_hdmi.hw,
2730 		[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
2731 		[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
2732 		[CLKID_MALI_0]			= &g12a_mali_0.hw,
2733 		[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
2734 		[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
2735 		[CLKID_MALI_1]			= &g12a_mali_1.hw,
2736 		[CLKID_MALI]			= &g12a_mali.hw,
2737 		[CLKID_MPLL_5OM_DIV]		= &g12a_mpll_50m_div.hw,
2738 		[CLKID_MPLL_5OM]		= &g12a_mpll_50m.hw,
2739 		[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
2740 		[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
2741 		[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
2742 		[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
2743 		[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
2744 		[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
2745 		[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
2746 		[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
2747 		[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
2748 		[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
2749 		[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
2750 		[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
2751 		[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
2752 		[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
2753 		[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
2754 		[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
2755 		[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
2756 		[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
2757 		[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
2758 		[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
2759 		[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
2760 		[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
2761 		[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
2762 		[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
2763 		[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
2764 		[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
2765 		[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
2766 		[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
2767 		[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
2768 		[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
2769 		[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
2770 		[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
2771 		[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
2772 		[NR_CLKS]			= NULL,
2773 	},
2774 	.num = NR_CLKS,
2775 };
2776 
2777 /* Convenience table to populate regmap in .probe */
2778 static struct clk_regmap *const g12a_clk_regmaps[] = {
2779 	&g12a_clk81,
2780 	&g12a_dos,
2781 	&g12a_ddr,
2782 	&g12a_audio_locker,
2783 	&g12a_mipi_dsi_host,
2784 	&g12a_eth_phy,
2785 	&g12a_isa,
2786 	&g12a_pl301,
2787 	&g12a_periphs,
2788 	&g12a_spicc_0,
2789 	&g12a_i2c,
2790 	&g12a_sana,
2791 	&g12a_sd,
2792 	&g12a_rng0,
2793 	&g12a_uart0,
2794 	&g12a_spicc_1,
2795 	&g12a_hiu_reg,
2796 	&g12a_mipi_dsi_phy,
2797 	&g12a_assist_misc,
2798 	&g12a_emmc_a,
2799 	&g12a_emmc_b,
2800 	&g12a_emmc_c,
2801 	&g12a_audio_codec,
2802 	&g12a_audio,
2803 	&g12a_eth_core,
2804 	&g12a_demux,
2805 	&g12a_audio_ififo,
2806 	&g12a_adc,
2807 	&g12a_uart1,
2808 	&g12a_g2d,
2809 	&g12a_reset,
2810 	&g12a_pcie_comb,
2811 	&g12a_parser,
2812 	&g12a_usb_general,
2813 	&g12a_pcie_phy,
2814 	&g12a_ahb_arb0,
2815 	&g12a_ahb_data_bus,
2816 	&g12a_ahb_ctrl_bus,
2817 	&g12a_htx_hdcp22,
2818 	&g12a_htx_pclk,
2819 	&g12a_bt656,
2820 	&g12a_usb1_to_ddr,
2821 	&g12a_mmc_pclk,
2822 	&g12a_vpu_intr,
2823 	&g12a_gic,
2824 	&g12a_sd_emmc_a_clk0,
2825 	&g12a_sd_emmc_b_clk0,
2826 	&g12a_sd_emmc_c_clk0,
2827 	&g12a_mpeg_clk_div,
2828 	&g12a_sd_emmc_a_clk0_div,
2829 	&g12a_sd_emmc_b_clk0_div,
2830 	&g12a_sd_emmc_c_clk0_div,
2831 	&g12a_mpeg_clk_sel,
2832 	&g12a_sd_emmc_a_clk0_sel,
2833 	&g12a_sd_emmc_b_clk0_sel,
2834 	&g12a_sd_emmc_c_clk0_sel,
2835 	&g12a_mpll0,
2836 	&g12a_mpll1,
2837 	&g12a_mpll2,
2838 	&g12a_mpll3,
2839 	&g12a_mpll0_div,
2840 	&g12a_mpll1_div,
2841 	&g12a_mpll2_div,
2842 	&g12a_mpll3_div,
2843 	&g12a_fixed_pll,
2844 	&g12a_sys_pll,
2845 	&g12a_gp0_pll,
2846 	&g12a_hifi_pll,
2847 	&g12a_vclk2_venci0,
2848 	&g12a_vclk2_venci1,
2849 	&g12a_vclk2_vencp0,
2850 	&g12a_vclk2_vencp1,
2851 	&g12a_vclk2_venct0,
2852 	&g12a_vclk2_venct1,
2853 	&g12a_vclk2_other,
2854 	&g12a_vclk2_enci,
2855 	&g12a_vclk2_encp,
2856 	&g12a_dac_clk,
2857 	&g12a_aoclk_gate,
2858 	&g12a_iec958_gate,
2859 	&g12a_enc480p,
2860 	&g12a_rng1,
2861 	&g12a_vclk2_enct,
2862 	&g12a_vclk2_encl,
2863 	&g12a_vclk2_venclmmc,
2864 	&g12a_vclk2_vencl,
2865 	&g12a_vclk2_other1,
2866 	&g12a_fixed_pll_dco,
2867 	&g12a_sys_pll_dco,
2868 	&g12a_gp0_pll_dco,
2869 	&g12a_hifi_pll_dco,
2870 	&g12a_fclk_div2,
2871 	&g12a_fclk_div3,
2872 	&g12a_fclk_div4,
2873 	&g12a_fclk_div5,
2874 	&g12a_fclk_div7,
2875 	&g12a_fclk_div2p5,
2876 	&g12a_dma,
2877 	&g12a_efuse,
2878 	&g12a_rom_boot,
2879 	&g12a_reset_sec,
2880 	&g12a_sec_ahb_apb3,
2881 	&g12a_vpu_0_sel,
2882 	&g12a_vpu_0_div,
2883 	&g12a_vpu_0,
2884 	&g12a_vpu_1_sel,
2885 	&g12a_vpu_1_div,
2886 	&g12a_vpu_1,
2887 	&g12a_vpu,
2888 	&g12a_vapb_0_sel,
2889 	&g12a_vapb_0_div,
2890 	&g12a_vapb_0,
2891 	&g12a_vapb_1_sel,
2892 	&g12a_vapb_1_div,
2893 	&g12a_vapb_1,
2894 	&g12a_vapb_sel,
2895 	&g12a_vapb,
2896 	&g12a_hdmi_pll_dco,
2897 	&g12a_hdmi_pll_od,
2898 	&g12a_hdmi_pll_od2,
2899 	&g12a_hdmi_pll,
2900 	&g12a_vid_pll_div,
2901 	&g12a_vid_pll_sel,
2902 	&g12a_vid_pll,
2903 	&g12a_vclk_sel,
2904 	&g12a_vclk2_sel,
2905 	&g12a_vclk_input,
2906 	&g12a_vclk2_input,
2907 	&g12a_vclk_div,
2908 	&g12a_vclk2_div,
2909 	&g12a_vclk,
2910 	&g12a_vclk2,
2911 	&g12a_vclk_div1,
2912 	&g12a_vclk_div2_en,
2913 	&g12a_vclk_div4_en,
2914 	&g12a_vclk_div6_en,
2915 	&g12a_vclk_div12_en,
2916 	&g12a_vclk2_div1,
2917 	&g12a_vclk2_div2_en,
2918 	&g12a_vclk2_div4_en,
2919 	&g12a_vclk2_div6_en,
2920 	&g12a_vclk2_div12_en,
2921 	&g12a_cts_enci_sel,
2922 	&g12a_cts_encp_sel,
2923 	&g12a_cts_vdac_sel,
2924 	&g12a_hdmi_tx_sel,
2925 	&g12a_cts_enci,
2926 	&g12a_cts_encp,
2927 	&g12a_cts_vdac,
2928 	&g12a_hdmi_tx,
2929 	&g12a_hdmi_sel,
2930 	&g12a_hdmi_div,
2931 	&g12a_hdmi,
2932 	&g12a_mali_0_sel,
2933 	&g12a_mali_0_div,
2934 	&g12a_mali_0,
2935 	&g12a_mali_1_sel,
2936 	&g12a_mali_1_div,
2937 	&g12a_mali_1,
2938 	&g12a_mali,
2939 	&g12a_mpll_50m,
2940 	&g12a_sys_pll_div16_en,
2941 	&g12a_cpu_clk_premux0,
2942 	&g12a_cpu_clk_mux0_div,
2943 	&g12a_cpu_clk_postmux0,
2944 	&g12a_cpu_clk_premux1,
2945 	&g12a_cpu_clk_mux1_div,
2946 	&g12a_cpu_clk_postmux1,
2947 	&g12a_cpu_clk_dyn,
2948 	&g12a_cpu_clk,
2949 	&g12a_cpu_clk_div16_en,
2950 	&g12a_cpu_clk_apb_div,
2951 	&g12a_cpu_clk_apb,
2952 	&g12a_cpu_clk_atb_div,
2953 	&g12a_cpu_clk_atb,
2954 	&g12a_cpu_clk_axi_div,
2955 	&g12a_cpu_clk_axi,
2956 	&g12a_cpu_clk_trace_div,
2957 	&g12a_cpu_clk_trace,
2958 	&g12a_pcie_pll_od,
2959 	&g12a_pcie_pll_dco,
2960 	&g12a_vdec_1_sel,
2961 	&g12a_vdec_1_div,
2962 	&g12a_vdec_1,
2963 	&g12a_vdec_hevc_sel,
2964 	&g12a_vdec_hevc_div,
2965 	&g12a_vdec_hevc,
2966 	&g12a_vdec_hevcf_sel,
2967 	&g12a_vdec_hevcf_div,
2968 	&g12a_vdec_hevcf,
2969 };
2970 
2971 static const struct meson_eeclkc_data g12a_clkc_data = {
2972 	.regmap_clks = g12a_clk_regmaps,
2973 	.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
2974 	.hw_onecell_data = &g12a_hw_onecell_data
2975 };
2976 
2977 static const struct of_device_id clkc_match_table[] = {
2978 	{ .compatible = "amlogic,g12a-clkc", .data = &g12a_clkc_data },
2979 	{}
2980 };
2981 
2982 static struct platform_driver g12a_driver = {
2983 	.probe		= meson_eeclkc_probe,
2984 	.driver		= {
2985 		.name	= "g12a-clkc",
2986 		.of_match_table = clkc_match_table,
2987 	},
2988 };
2989 
2990 builtin_platform_driver(g12a_driver);
2991