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 <[email protected]>
7  *
8  * Copyright (c) 2018 Amlogic, inc.
9  * Author: Qiufang Dai <[email protected]>
10  * Author: Jian Hu <[email protected]>
11  */
12 
13 #include <linux/clk-provider.h>
14 #include <linux/init.h>
15 #include <linux/of.h>
16 #include <linux/platform_device.h>
17 #include <linux/clk.h>
18 #include <linux/module.h>
19 
20 #include "clk-mpll.h"
21 #include "clk-pll.h"
22 #include "clk-regmap.h"
23 #include "clk-cpu-dyndiv.h"
24 #include "vid-pll-div.h"
25 #include "vclk.h"
26 #include "meson-eeclk.h"
27 #include "g12a.h"
28 
29 #include <dt-bindings/clock/g12a-clkc.h>
30 
31 static struct clk_regmap g12a_fixed_pll_dco = {
32 	.data = &(struct meson_clk_pll_data){
33 		.en = {
34 			.reg_off = HHI_FIX_PLL_CNTL0,
35 			.shift   = 28,
36 			.width   = 1,
37 		},
38 		.m = {
39 			.reg_off = HHI_FIX_PLL_CNTL0,
40 			.shift   = 0,
41 			.width   = 8,
42 		},
43 		.n = {
44 			.reg_off = HHI_FIX_PLL_CNTL0,
45 			.shift   = 10,
46 			.width   = 5,
47 		},
48 		.frac = {
49 			.reg_off = HHI_FIX_PLL_CNTL1,
50 			.shift   = 0,
51 			.width   = 17,
52 		},
53 		.l = {
54 			.reg_off = HHI_FIX_PLL_CNTL0,
55 			.shift   = 31,
56 			.width   = 1,
57 		},
58 		.rst = {
59 			.reg_off = HHI_FIX_PLL_CNTL0,
60 			.shift   = 29,
61 			.width   = 1,
62 		},
63 	},
64 	.hw.init = &(struct clk_init_data){
65 		.name = "fixed_pll_dco",
66 		.ops = &meson_clk_pll_ro_ops,
67 		.parent_data = &(const struct clk_parent_data) {
68 			.fw_name = "xtal",
69 		},
70 		.num_parents = 1,
71 	},
72 };
73 
74 static struct clk_regmap g12a_fixed_pll = {
75 	.data = &(struct clk_regmap_div_data){
76 		.offset = HHI_FIX_PLL_CNTL0,
77 		.shift = 16,
78 		.width = 2,
79 		.flags = CLK_DIVIDER_POWER_OF_TWO,
80 	},
81 	.hw.init = &(struct clk_init_data){
82 		.name = "fixed_pll",
83 		.ops = &clk_regmap_divider_ro_ops,
84 		.parent_hws = (const struct clk_hw *[]) {
85 			&g12a_fixed_pll_dco.hw
86 		},
87 		.num_parents = 1,
88 		/*
89 		 * This clock won't ever change at runtime so
90 		 * CLK_SET_RATE_PARENT is not required
91 		 */
92 	},
93 };
94 
95 static const struct pll_mult_range g12a_sys_pll_mult_range = {
96 	.min = 128,
97 	.max = 250,
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 		.range = &g12a_sys_pll_mult_range,
128 	},
129 	.hw.init = &(struct clk_init_data){
130 		.name = "sys_pll_dco",
131 		.ops = &meson_clk_pll_ops,
132 		.parent_data = &(const struct clk_parent_data) {
133 			.fw_name = "xtal",
134 		},
135 		.num_parents = 1,
136 		/* This clock feeds the CPU, avoid disabling it */
137 		.flags = CLK_IS_CRITICAL,
138 	},
139 };
140 
141 static struct clk_regmap g12a_sys_pll = {
142 	.data = &(struct clk_regmap_div_data){
143 		.offset = HHI_SYS_PLL_CNTL0,
144 		.shift = 16,
145 		.width = 3,
146 		.flags = CLK_DIVIDER_POWER_OF_TWO,
147 	},
148 	.hw.init = &(struct clk_init_data){
149 		.name = "sys_pll",
150 		.ops = &clk_regmap_divider_ops,
151 		.parent_hws = (const struct clk_hw *[]) {
152 			&g12a_sys_pll_dco.hw
153 		},
154 		.num_parents = 1,
155 		.flags = CLK_SET_RATE_PARENT,
156 	},
157 };
158 
159 static struct clk_regmap g12b_sys1_pll_dco = {
160 	.data = &(struct meson_clk_pll_data){
161 		.en = {
162 			.reg_off = HHI_SYS1_PLL_CNTL0,
163 			.shift   = 28,
164 			.width   = 1,
165 		},
166 		.m = {
167 			.reg_off = HHI_SYS1_PLL_CNTL0,
168 			.shift   = 0,
169 			.width   = 8,
170 		},
171 		.n = {
172 			.reg_off = HHI_SYS1_PLL_CNTL0,
173 			.shift   = 10,
174 			.width   = 5,
175 		},
176 		.l = {
177 			.reg_off = HHI_SYS1_PLL_CNTL0,
178 			.shift   = 31,
179 			.width   = 1,
180 		},
181 		.rst = {
182 			.reg_off = HHI_SYS1_PLL_CNTL0,
183 			.shift   = 29,
184 			.width   = 1,
185 		},
186 		.range = &g12a_sys_pll_mult_range,
187 	},
188 	.hw.init = &(struct clk_init_data){
189 		.name = "sys1_pll_dco",
190 		.ops = &meson_clk_pll_ops,
191 		.parent_data = &(const struct clk_parent_data) {
192 			.fw_name = "xtal",
193 		},
194 		.num_parents = 1,
195 		/* This clock feeds the CPU, avoid disabling it */
196 		.flags = CLK_IS_CRITICAL,
197 	},
198 };
199 
200 static struct clk_regmap g12b_sys1_pll = {
201 	.data = &(struct clk_regmap_div_data){
202 		.offset = HHI_SYS1_PLL_CNTL0,
203 		.shift = 16,
204 		.width = 3,
205 		.flags = CLK_DIVIDER_POWER_OF_TWO,
206 	},
207 	.hw.init = &(struct clk_init_data){
208 		.name = "sys1_pll",
209 		.ops = &clk_regmap_divider_ops,
210 		.parent_hws = (const struct clk_hw *[]) {
211 			&g12b_sys1_pll_dco.hw
212 		},
213 		.num_parents = 1,
214 		.flags = CLK_SET_RATE_PARENT,
215 	},
216 };
217 
218 static struct clk_regmap g12a_sys_pll_div16_en = {
219 	.data = &(struct clk_regmap_gate_data){
220 		.offset = HHI_SYS_CPU_CLK_CNTL1,
221 		.bit_idx = 24,
222 	},
223 	.hw.init = &(struct clk_init_data) {
224 		.name = "sys_pll_div16_en",
225 		.ops = &clk_regmap_gate_ro_ops,
226 		.parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
227 		.num_parents = 1,
228 		/*
229 		 * This clock is used to debug the sys_pll range
230 		 * Linux should not change it at runtime
231 		 */
232 	},
233 };
234 
235 static struct clk_regmap g12b_sys1_pll_div16_en = {
236 	.data = &(struct clk_regmap_gate_data){
237 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
238 		.bit_idx = 24,
239 	},
240 	.hw.init = &(struct clk_init_data) {
241 		.name = "sys1_pll_div16_en",
242 		.ops = &clk_regmap_gate_ro_ops,
243 		.parent_hws = (const struct clk_hw *[]) {
244 			&g12b_sys1_pll.hw
245 		},
246 		.num_parents = 1,
247 		/*
248 		 * This clock is used to debug the sys_pll range
249 		 * Linux should not change it at runtime
250 		 */
251 	},
252 };
253 
254 static struct clk_fixed_factor g12a_sys_pll_div16 = {
255 	.mult = 1,
256 	.div = 16,
257 	.hw.init = &(struct clk_init_data){
258 		.name = "sys_pll_div16",
259 		.ops = &clk_fixed_factor_ops,
260 		.parent_hws = (const struct clk_hw *[]) {
261 			&g12a_sys_pll_div16_en.hw
262 		},
263 		.num_parents = 1,
264 	},
265 };
266 
267 static struct clk_fixed_factor g12b_sys1_pll_div16 = {
268 	.mult = 1,
269 	.div = 16,
270 	.hw.init = &(struct clk_init_data){
271 		.name = "sys1_pll_div16",
272 		.ops = &clk_fixed_factor_ops,
273 		.parent_hws = (const struct clk_hw *[]) {
274 			&g12b_sys1_pll_div16_en.hw
275 		},
276 		.num_parents = 1,
277 	},
278 };
279 
280 static struct clk_fixed_factor g12a_fclk_div2_div = {
281 	.mult = 1,
282 	.div = 2,
283 	.hw.init = &(struct clk_init_data){
284 		.name = "fclk_div2_div",
285 		.ops = &clk_fixed_factor_ops,
286 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
287 		.num_parents = 1,
288 	},
289 };
290 
291 static struct clk_regmap g12a_fclk_div2 = {
292 	.data = &(struct clk_regmap_gate_data){
293 		.offset = HHI_FIX_PLL_CNTL1,
294 		.bit_idx = 24,
295 	},
296 	.hw.init = &(struct clk_init_data){
297 		.name = "fclk_div2",
298 		.ops = &clk_regmap_gate_ops,
299 		.parent_hws = (const struct clk_hw *[]) {
300 			&g12a_fclk_div2_div.hw
301 		},
302 		.num_parents = 1,
303 		/*
304 		 * Similar to fclk_div3, it seems that this clock is used by
305 		 * the resident firmware and is required by the platform to
306 		 * operate correctly.
307 		 * Until the following condition are met, we need this clock to
308 		 * be marked as critical:
309 		 * a) Mark the clock used by a firmware resource, if possible
310 		 * b) CCF has a clock hand-off mechanism to make the sure the
311 		 *    clock stays on until the proper driver comes along
312 		 */
313 		.flags = CLK_IS_CRITICAL,
314 	},
315 };
316 
317 static struct clk_fixed_factor g12a_fclk_div3_div = {
318 	.mult = 1,
319 	.div = 3,
320 	.hw.init = &(struct clk_init_data){
321 		.name = "fclk_div3_div",
322 		.ops = &clk_fixed_factor_ops,
323 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
324 		.num_parents = 1,
325 	},
326 };
327 
328 static struct clk_regmap g12a_fclk_div3 = {
329 	.data = &(struct clk_regmap_gate_data){
330 		.offset = HHI_FIX_PLL_CNTL1,
331 		.bit_idx = 20,
332 	},
333 	.hw.init = &(struct clk_init_data){
334 		.name = "fclk_div3",
335 		.ops = &clk_regmap_gate_ops,
336 		.parent_hws = (const struct clk_hw *[]) {
337 			&g12a_fclk_div3_div.hw
338 		},
339 		.num_parents = 1,
340 		/*
341 		 * This clock is used by the resident firmware and is required
342 		 * by the platform to operate correctly.
343 		 * Until the following condition are met, we need this clock to
344 		 * be marked as critical:
345 		 * a) Mark the clock used by a firmware resource, if possible
346 		 * b) CCF has a clock hand-off mechanism to make the sure the
347 		 *    clock stays on until the proper driver comes along
348 		 */
349 		.flags = CLK_IS_CRITICAL,
350 	},
351 };
352 
353 /* Datasheet names this field as "premux0" */
354 static struct clk_regmap g12a_cpu_clk_premux0 = {
355 	.data = &(struct clk_regmap_mux_data){
356 		.offset = HHI_SYS_CPU_CLK_CNTL0,
357 		.mask = 0x3,
358 		.shift = 0,
359 		.flags = CLK_MUX_ROUND_CLOSEST,
360 	},
361 	.hw.init = &(struct clk_init_data){
362 		.name = "cpu_clk_dyn0_sel",
363 		.ops = &clk_regmap_mux_ops,
364 		.parent_data = (const struct clk_parent_data []) {
365 			{ .fw_name = "xtal", },
366 			{ .hw = &g12a_fclk_div2.hw },
367 			{ .hw = &g12a_fclk_div3.hw },
368 		},
369 		.num_parents = 3,
370 		.flags = CLK_SET_RATE_PARENT,
371 	},
372 };
373 
374 /* Datasheet names this field as "premux1" */
375 static struct clk_regmap g12a_cpu_clk_premux1 = {
376 	.data = &(struct clk_regmap_mux_data){
377 		.offset = HHI_SYS_CPU_CLK_CNTL0,
378 		.mask = 0x3,
379 		.shift = 16,
380 	},
381 	.hw.init = &(struct clk_init_data){
382 		.name = "cpu_clk_dyn1_sel",
383 		.ops = &clk_regmap_mux_ops,
384 		.parent_data = (const struct clk_parent_data []) {
385 			{ .fw_name = "xtal", },
386 			{ .hw = &g12a_fclk_div2.hw },
387 			{ .hw = &g12a_fclk_div3.hw },
388 		},
389 		.num_parents = 3,
390 		/* This sub-tree is used a parking clock */
391 		.flags = CLK_SET_RATE_NO_REPARENT
392 	},
393 };
394 
395 /* Datasheet names this field as "mux0_divn_tcnt" */
396 static struct clk_regmap g12a_cpu_clk_mux0_div = {
397 	.data = &(struct meson_clk_cpu_dyndiv_data){
398 		.div = {
399 			.reg_off = HHI_SYS_CPU_CLK_CNTL0,
400 			.shift = 4,
401 			.width = 6,
402 		},
403 		.dyn = {
404 			.reg_off = HHI_SYS_CPU_CLK_CNTL0,
405 			.shift = 26,
406 			.width = 1,
407 		},
408 	},
409 	.hw.init = &(struct clk_init_data){
410 		.name = "cpu_clk_dyn0_div",
411 		.ops = &meson_clk_cpu_dyndiv_ops,
412 		.parent_hws = (const struct clk_hw *[]) {
413 			&g12a_cpu_clk_premux0.hw
414 		},
415 		.num_parents = 1,
416 		.flags = CLK_SET_RATE_PARENT,
417 	},
418 };
419 
420 /* Datasheet names this field as "postmux0" */
421 static struct clk_regmap g12a_cpu_clk_postmux0 = {
422 	.data = &(struct clk_regmap_mux_data){
423 		.offset = HHI_SYS_CPU_CLK_CNTL0,
424 		.mask = 0x1,
425 		.shift = 2,
426 		.flags = CLK_MUX_ROUND_CLOSEST,
427 	},
428 	.hw.init = &(struct clk_init_data){
429 		.name = "cpu_clk_dyn0",
430 		.ops = &clk_regmap_mux_ops,
431 		.parent_hws = (const struct clk_hw *[]) {
432 			&g12a_cpu_clk_premux0.hw,
433 			&g12a_cpu_clk_mux0_div.hw,
434 		},
435 		.num_parents = 2,
436 		.flags = CLK_SET_RATE_PARENT,
437 	},
438 };
439 
440 /* Datasheet names this field as "Mux1_divn_tcnt" */
441 static struct clk_regmap g12a_cpu_clk_mux1_div = {
442 	.data = &(struct clk_regmap_div_data){
443 		.offset = HHI_SYS_CPU_CLK_CNTL0,
444 		.shift = 20,
445 		.width = 6,
446 	},
447 	.hw.init = &(struct clk_init_data){
448 		.name = "cpu_clk_dyn1_div",
449 		.ops = &clk_regmap_divider_ro_ops,
450 		.parent_hws = (const struct clk_hw *[]) {
451 			&g12a_cpu_clk_premux1.hw
452 		},
453 		.num_parents = 1,
454 	},
455 };
456 
457 /* Datasheet names this field as "postmux1" */
458 static struct clk_regmap g12a_cpu_clk_postmux1 = {
459 	.data = &(struct clk_regmap_mux_data){
460 		.offset = HHI_SYS_CPU_CLK_CNTL0,
461 		.mask = 0x1,
462 		.shift = 18,
463 	},
464 	.hw.init = &(struct clk_init_data){
465 		.name = "cpu_clk_dyn1",
466 		.ops = &clk_regmap_mux_ops,
467 		.parent_hws = (const struct clk_hw *[]) {
468 			&g12a_cpu_clk_premux1.hw,
469 			&g12a_cpu_clk_mux1_div.hw,
470 		},
471 		.num_parents = 2,
472 		/* This sub-tree is used a parking clock */
473 		.flags = CLK_SET_RATE_NO_REPARENT,
474 	},
475 };
476 
477 /* Datasheet names this field as "Final_dyn_mux_sel" */
478 static struct clk_regmap g12a_cpu_clk_dyn = {
479 	.data = &(struct clk_regmap_mux_data){
480 		.offset = HHI_SYS_CPU_CLK_CNTL0,
481 		.mask = 0x1,
482 		.shift = 10,
483 		.flags = CLK_MUX_ROUND_CLOSEST,
484 	},
485 	.hw.init = &(struct clk_init_data){
486 		.name = "cpu_clk_dyn",
487 		.ops = &clk_regmap_mux_ops,
488 		.parent_hws = (const struct clk_hw *[]) {
489 			&g12a_cpu_clk_postmux0.hw,
490 			&g12a_cpu_clk_postmux1.hw,
491 		},
492 		.num_parents = 2,
493 		.flags = CLK_SET_RATE_PARENT,
494 	},
495 };
496 
497 /* Datasheet names this field as "Final_mux_sel" */
498 static struct clk_regmap g12a_cpu_clk = {
499 	.data = &(struct clk_regmap_mux_data){
500 		.offset = HHI_SYS_CPU_CLK_CNTL0,
501 		.mask = 0x1,
502 		.shift = 11,
503 		.flags = CLK_MUX_ROUND_CLOSEST,
504 	},
505 	.hw.init = &(struct clk_init_data){
506 		.name = "cpu_clk",
507 		.ops = &clk_regmap_mux_ops,
508 		.parent_hws = (const struct clk_hw *[]) {
509 			&g12a_cpu_clk_dyn.hw,
510 			&g12a_sys_pll.hw,
511 		},
512 		.num_parents = 2,
513 		.flags = CLK_SET_RATE_PARENT,
514 	},
515 };
516 
517 /* Datasheet names this field as "Final_mux_sel" */
518 static struct clk_regmap g12b_cpu_clk = {
519 	.data = &(struct clk_regmap_mux_data){
520 		.offset = HHI_SYS_CPU_CLK_CNTL0,
521 		.mask = 0x1,
522 		.shift = 11,
523 		.flags = CLK_MUX_ROUND_CLOSEST,
524 	},
525 	.hw.init = &(struct clk_init_data){
526 		.name = "cpu_clk",
527 		.ops = &clk_regmap_mux_ops,
528 		.parent_hws = (const struct clk_hw *[]) {
529 			&g12a_cpu_clk_dyn.hw,
530 			&g12b_sys1_pll.hw
531 		},
532 		.num_parents = 2,
533 		.flags = CLK_SET_RATE_PARENT,
534 	},
535 };
536 
537 /* Datasheet names this field as "premux0" */
538 static struct clk_regmap g12b_cpub_clk_premux0 = {
539 	.data = &(struct clk_regmap_mux_data){
540 		.offset = HHI_SYS_CPUB_CLK_CNTL,
541 		.mask = 0x3,
542 		.shift = 0,
543 		.flags = CLK_MUX_ROUND_CLOSEST,
544 	},
545 	.hw.init = &(struct clk_init_data){
546 		.name = "cpub_clk_dyn0_sel",
547 		.ops = &clk_regmap_mux_ops,
548 		.parent_data = (const struct clk_parent_data []) {
549 			{ .fw_name = "xtal", },
550 			{ .hw = &g12a_fclk_div2.hw },
551 			{ .hw = &g12a_fclk_div3.hw },
552 		},
553 		.num_parents = 3,
554 		.flags = CLK_SET_RATE_PARENT,
555 	},
556 };
557 
558 /* Datasheet names this field as "mux0_divn_tcnt" */
559 static struct clk_regmap g12b_cpub_clk_mux0_div = {
560 	.data = &(struct meson_clk_cpu_dyndiv_data){
561 		.div = {
562 			.reg_off = HHI_SYS_CPUB_CLK_CNTL,
563 			.shift = 4,
564 			.width = 6,
565 		},
566 		.dyn = {
567 			.reg_off = HHI_SYS_CPUB_CLK_CNTL,
568 			.shift = 26,
569 			.width = 1,
570 		},
571 	},
572 	.hw.init = &(struct clk_init_data){
573 		.name = "cpub_clk_dyn0_div",
574 		.ops = &meson_clk_cpu_dyndiv_ops,
575 		.parent_hws = (const struct clk_hw *[]) {
576 			&g12b_cpub_clk_premux0.hw
577 		},
578 		.num_parents = 1,
579 		.flags = CLK_SET_RATE_PARENT,
580 	},
581 };
582 
583 /* Datasheet names this field as "postmux0" */
584 static struct clk_regmap g12b_cpub_clk_postmux0 = {
585 	.data = &(struct clk_regmap_mux_data){
586 		.offset = HHI_SYS_CPUB_CLK_CNTL,
587 		.mask = 0x1,
588 		.shift = 2,
589 		.flags = CLK_MUX_ROUND_CLOSEST,
590 	},
591 	.hw.init = &(struct clk_init_data){
592 		.name = "cpub_clk_dyn0",
593 		.ops = &clk_regmap_mux_ops,
594 		.parent_hws = (const struct clk_hw *[]) {
595 			&g12b_cpub_clk_premux0.hw,
596 			&g12b_cpub_clk_mux0_div.hw
597 		},
598 		.num_parents = 2,
599 		.flags = CLK_SET_RATE_PARENT,
600 	},
601 };
602 
603 /* Datasheet names this field as "premux1" */
604 static struct clk_regmap g12b_cpub_clk_premux1 = {
605 	.data = &(struct clk_regmap_mux_data){
606 		.offset = HHI_SYS_CPUB_CLK_CNTL,
607 		.mask = 0x3,
608 		.shift = 16,
609 	},
610 	.hw.init = &(struct clk_init_data){
611 		.name = "cpub_clk_dyn1_sel",
612 		.ops = &clk_regmap_mux_ops,
613 		.parent_data = (const struct clk_parent_data []) {
614 			{ .fw_name = "xtal", },
615 			{ .hw = &g12a_fclk_div2.hw },
616 			{ .hw = &g12a_fclk_div3.hw },
617 		},
618 		.num_parents = 3,
619 		/* This sub-tree is used a parking clock */
620 		.flags = CLK_SET_RATE_NO_REPARENT,
621 	},
622 };
623 
624 /* Datasheet names this field as "Mux1_divn_tcnt" */
625 static struct clk_regmap g12b_cpub_clk_mux1_div = {
626 	.data = &(struct clk_regmap_div_data){
627 		.offset = HHI_SYS_CPUB_CLK_CNTL,
628 		.shift = 20,
629 		.width = 6,
630 	},
631 	.hw.init = &(struct clk_init_data){
632 		.name = "cpub_clk_dyn1_div",
633 		.ops = &clk_regmap_divider_ro_ops,
634 		.parent_hws = (const struct clk_hw *[]) {
635 			&g12b_cpub_clk_premux1.hw
636 		},
637 		.num_parents = 1,
638 	},
639 };
640 
641 /* Datasheet names this field as "postmux1" */
642 static struct clk_regmap g12b_cpub_clk_postmux1 = {
643 	.data = &(struct clk_regmap_mux_data){
644 		.offset = HHI_SYS_CPUB_CLK_CNTL,
645 		.mask = 0x1,
646 		.shift = 18,
647 	},
648 	.hw.init = &(struct clk_init_data){
649 		.name = "cpub_clk_dyn1",
650 		.ops = &clk_regmap_mux_ops,
651 		.parent_hws = (const struct clk_hw *[]) {
652 			&g12b_cpub_clk_premux1.hw,
653 			&g12b_cpub_clk_mux1_div.hw
654 		},
655 		.num_parents = 2,
656 		/* This sub-tree is used a parking clock */
657 		.flags = CLK_SET_RATE_NO_REPARENT,
658 	},
659 };
660 
661 /* Datasheet names this field as "Final_dyn_mux_sel" */
662 static struct clk_regmap g12b_cpub_clk_dyn = {
663 	.data = &(struct clk_regmap_mux_data){
664 		.offset = HHI_SYS_CPUB_CLK_CNTL,
665 		.mask = 0x1,
666 		.shift = 10,
667 		.flags = CLK_MUX_ROUND_CLOSEST,
668 	},
669 	.hw.init = &(struct clk_init_data){
670 		.name = "cpub_clk_dyn",
671 		.ops = &clk_regmap_mux_ops,
672 		.parent_hws = (const struct clk_hw *[]) {
673 			&g12b_cpub_clk_postmux0.hw,
674 			&g12b_cpub_clk_postmux1.hw
675 		},
676 		.num_parents = 2,
677 		.flags = CLK_SET_RATE_PARENT,
678 	},
679 };
680 
681 /* Datasheet names this field as "Final_mux_sel" */
682 static struct clk_regmap g12b_cpub_clk = {
683 	.data = &(struct clk_regmap_mux_data){
684 		.offset = HHI_SYS_CPUB_CLK_CNTL,
685 		.mask = 0x1,
686 		.shift = 11,
687 		.flags = CLK_MUX_ROUND_CLOSEST,
688 	},
689 	.hw.init = &(struct clk_init_data){
690 		.name = "cpub_clk",
691 		.ops = &clk_regmap_mux_ops,
692 		.parent_hws = (const struct clk_hw *[]) {
693 			&g12b_cpub_clk_dyn.hw,
694 			&g12a_sys_pll.hw
695 		},
696 		.num_parents = 2,
697 		.flags = CLK_SET_RATE_PARENT,
698 	},
699 };
700 
701 static struct clk_regmap sm1_gp1_pll;
702 
703 /* Datasheet names this field as "premux0" */
704 static struct clk_regmap sm1_dsu_clk_premux0 = {
705 	.data = &(struct clk_regmap_mux_data){
706 		.offset = HHI_SYS_CPU_CLK_CNTL5,
707 		.mask = 0x3,
708 		.shift = 0,
709 	},
710 	.hw.init = &(struct clk_init_data){
711 		.name = "dsu_clk_dyn0_sel",
712 		.ops = &clk_regmap_mux_ro_ops,
713 		.parent_data = (const struct clk_parent_data []) {
714 			{ .fw_name = "xtal", },
715 			{ .hw = &g12a_fclk_div2.hw },
716 			{ .hw = &g12a_fclk_div3.hw },
717 			{ .hw = &sm1_gp1_pll.hw },
718 		},
719 		.num_parents = 4,
720 	},
721 };
722 
723 /* Datasheet names this field as "premux1" */
724 static struct clk_regmap sm1_dsu_clk_premux1 = {
725 	.data = &(struct clk_regmap_mux_data){
726 		.offset = HHI_SYS_CPU_CLK_CNTL5,
727 		.mask = 0x3,
728 		.shift = 16,
729 	},
730 	.hw.init = &(struct clk_init_data){
731 		.name = "dsu_clk_dyn1_sel",
732 		.ops = &clk_regmap_mux_ro_ops,
733 		.parent_data = (const struct clk_parent_data []) {
734 			{ .fw_name = "xtal", },
735 			{ .hw = &g12a_fclk_div2.hw },
736 			{ .hw = &g12a_fclk_div3.hw },
737 			{ .hw = &sm1_gp1_pll.hw },
738 		},
739 		.num_parents = 4,
740 	},
741 };
742 
743 /* Datasheet names this field as "Mux0_divn_tcnt" */
744 static struct clk_regmap sm1_dsu_clk_mux0_div = {
745 	.data = &(struct clk_regmap_div_data){
746 		.offset = HHI_SYS_CPU_CLK_CNTL5,
747 		.shift = 4,
748 		.width = 6,
749 	},
750 	.hw.init = &(struct clk_init_data){
751 		.name = "dsu_clk_dyn0_div",
752 		.ops = &clk_regmap_divider_ro_ops,
753 		.parent_hws = (const struct clk_hw *[]) {
754 			&sm1_dsu_clk_premux0.hw
755 		},
756 		.num_parents = 1,
757 	},
758 };
759 
760 /* Datasheet names this field as "postmux0" */
761 static struct clk_regmap sm1_dsu_clk_postmux0 = {
762 	.data = &(struct clk_regmap_mux_data){
763 		.offset = HHI_SYS_CPU_CLK_CNTL5,
764 		.mask = 0x1,
765 		.shift = 2,
766 	},
767 	.hw.init = &(struct clk_init_data){
768 		.name = "dsu_clk_dyn0",
769 		.ops = &clk_regmap_mux_ro_ops,
770 		.parent_hws = (const struct clk_hw *[]) {
771 			&sm1_dsu_clk_premux0.hw,
772 			&sm1_dsu_clk_mux0_div.hw,
773 		},
774 		.num_parents = 2,
775 	},
776 };
777 
778 /* Datasheet names this field as "Mux1_divn_tcnt" */
779 static struct clk_regmap sm1_dsu_clk_mux1_div = {
780 	.data = &(struct clk_regmap_div_data){
781 		.offset = HHI_SYS_CPU_CLK_CNTL5,
782 		.shift = 20,
783 		.width = 6,
784 	},
785 	.hw.init = &(struct clk_init_data){
786 		.name = "dsu_clk_dyn1_div",
787 		.ops = &clk_regmap_divider_ro_ops,
788 		.parent_hws = (const struct clk_hw *[]) {
789 			&sm1_dsu_clk_premux1.hw
790 		},
791 		.num_parents = 1,
792 	},
793 };
794 
795 /* Datasheet names this field as "postmux1" */
796 static struct clk_regmap sm1_dsu_clk_postmux1 = {
797 	.data = &(struct clk_regmap_mux_data){
798 		.offset = HHI_SYS_CPU_CLK_CNTL5,
799 		.mask = 0x1,
800 		.shift = 18,
801 	},
802 	.hw.init = &(struct clk_init_data){
803 		.name = "dsu_clk_dyn1",
804 		.ops = &clk_regmap_mux_ro_ops,
805 		.parent_hws = (const struct clk_hw *[]) {
806 			&sm1_dsu_clk_premux1.hw,
807 			&sm1_dsu_clk_mux1_div.hw,
808 		},
809 		.num_parents = 2,
810 	},
811 };
812 
813 /* Datasheet names this field as "Final_dyn_mux_sel" */
814 static struct clk_regmap sm1_dsu_clk_dyn = {
815 	.data = &(struct clk_regmap_mux_data){
816 		.offset = HHI_SYS_CPU_CLK_CNTL5,
817 		.mask = 0x1,
818 		.shift = 10,
819 	},
820 	.hw.init = &(struct clk_init_data){
821 		.name = "dsu_clk_dyn",
822 		.ops = &clk_regmap_mux_ro_ops,
823 		.parent_hws = (const struct clk_hw *[]) {
824 			&sm1_dsu_clk_postmux0.hw,
825 			&sm1_dsu_clk_postmux1.hw,
826 		},
827 		.num_parents = 2,
828 	},
829 };
830 
831 /* Datasheet names this field as "Final_mux_sel" */
832 static struct clk_regmap sm1_dsu_final_clk = {
833 	.data = &(struct clk_regmap_mux_data){
834 		.offset = HHI_SYS_CPU_CLK_CNTL5,
835 		.mask = 0x1,
836 		.shift = 11,
837 	},
838 	.hw.init = &(struct clk_init_data){
839 		.name = "dsu_clk_final",
840 		.ops = &clk_regmap_mux_ro_ops,
841 		.parent_hws = (const struct clk_hw *[]) {
842 			&sm1_dsu_clk_dyn.hw,
843 			&g12a_sys_pll.hw,
844 		},
845 		.num_parents = 2,
846 	},
847 };
848 
849 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
850 static struct clk_regmap sm1_cpu1_clk = {
851 	.data = &(struct clk_regmap_mux_data){
852 		.offset = HHI_SYS_CPU_CLK_CNTL6,
853 		.mask = 0x1,
854 		.shift = 24,
855 	},
856 	.hw.init = &(struct clk_init_data){
857 		.name = "cpu1_clk",
858 		.ops = &clk_regmap_mux_ro_ops,
859 		.parent_hws = (const struct clk_hw *[]) {
860 			&g12a_cpu_clk.hw,
861 			/* This CPU also have a dedicated clock tree */
862 		},
863 		.num_parents = 1,
864 	},
865 };
866 
867 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
868 static struct clk_regmap sm1_cpu2_clk = {
869 	.data = &(struct clk_regmap_mux_data){
870 		.offset = HHI_SYS_CPU_CLK_CNTL6,
871 		.mask = 0x1,
872 		.shift = 25,
873 	},
874 	.hw.init = &(struct clk_init_data){
875 		.name = "cpu2_clk",
876 		.ops = &clk_regmap_mux_ro_ops,
877 		.parent_hws = (const struct clk_hw *[]) {
878 			&g12a_cpu_clk.hw,
879 			/* This CPU also have a dedicated clock tree */
880 		},
881 		.num_parents = 1,
882 	},
883 };
884 
885 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
886 static struct clk_regmap sm1_cpu3_clk = {
887 	.data = &(struct clk_regmap_mux_data){
888 		.offset = HHI_SYS_CPU_CLK_CNTL6,
889 		.mask = 0x1,
890 		.shift = 26,
891 	},
892 	.hw.init = &(struct clk_init_data){
893 		.name = "cpu3_clk",
894 		.ops = &clk_regmap_mux_ro_ops,
895 		.parent_hws = (const struct clk_hw *[]) {
896 			&g12a_cpu_clk.hw,
897 			/* This CPU also have a dedicated clock tree */
898 		},
899 		.num_parents = 1,
900 	},
901 };
902 
903 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
904 static struct clk_regmap sm1_dsu_clk = {
905 	.data = &(struct clk_regmap_mux_data){
906 		.offset = HHI_SYS_CPU_CLK_CNTL6,
907 		.mask = 0x1,
908 		.shift = 27,
909 	},
910 	.hw.init = &(struct clk_init_data){
911 		.name = "dsu_clk",
912 		.ops = &clk_regmap_mux_ro_ops,
913 		.parent_hws = (const struct clk_hw *[]) {
914 			&g12a_cpu_clk.hw,
915 			&sm1_dsu_final_clk.hw,
916 		},
917 		.num_parents = 2,
918 	},
919 };
920 
g12a_cpu_clk_mux_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)921 static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
922 					unsigned long event, void *data)
923 {
924 	if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
925 		/* Wait for clock propagation before/after changing the mux */
926 		udelay(100);
927 		return NOTIFY_OK;
928 	}
929 
930 	return NOTIFY_DONE;
931 }
932 
933 static struct notifier_block g12a_cpu_clk_mux_nb = {
934 	.notifier_call = g12a_cpu_clk_mux_notifier_cb,
935 };
936 
937 struct g12a_cpu_clk_postmux_nb_data {
938 	struct notifier_block nb;
939 	struct clk_hw *xtal;
940 	struct clk_hw *cpu_clk_dyn;
941 	struct clk_hw *cpu_clk_postmux0;
942 	struct clk_hw *cpu_clk_postmux1;
943 	struct clk_hw *cpu_clk_premux1;
944 };
945 
g12a_cpu_clk_postmux_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)946 static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
947 					    unsigned long event, void *data)
948 {
949 	struct g12a_cpu_clk_postmux_nb_data *nb_data =
950 		container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
951 
952 	switch (event) {
953 	case PRE_RATE_CHANGE:
954 		/*
955 		 * This notifier means cpu_clk_postmux0 clock will be changed
956 		 * to feed cpu_clk, this is the current path :
957 		 * cpu_clk
958 		 *    \- cpu_clk_dyn
959 		 *          \- cpu_clk_postmux0
960 		 *                \- cpu_clk_muxX_div
961 		 *                      \- cpu_clk_premux0
962 		 *				\- fclk_div3 or fclk_div2
963 		 *		OR
964 		 *                \- cpu_clk_premux0
965 		 *			\- fclk_div3 or fclk_div2
966 		 */
967 
968 		/* Setup cpu_clk_premux1 to xtal */
969 		clk_hw_set_parent(nb_data->cpu_clk_premux1,
970 				  nb_data->xtal);
971 
972 		/* Setup cpu_clk_postmux1 to bypass divider */
973 		clk_hw_set_parent(nb_data->cpu_clk_postmux1,
974 				  nb_data->cpu_clk_premux1);
975 
976 		/* Switch to parking clk on cpu_clk_postmux1 */
977 		clk_hw_set_parent(nb_data->cpu_clk_dyn,
978 				  nb_data->cpu_clk_postmux1);
979 
980 		/*
981 		 * Now, cpu_clk is 24MHz in the current path :
982 		 * cpu_clk
983 		 *    \- cpu_clk_dyn
984 		 *          \- cpu_clk_postmux1
985 		 *                \- cpu_clk_premux1
986 		 *                      \- xtal
987 		 */
988 
989 		udelay(100);
990 
991 		return NOTIFY_OK;
992 
993 	case POST_RATE_CHANGE:
994 		/*
995 		 * The cpu_clk_postmux0 has ben updated, now switch back
996 		 * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
997 		 * in account.
998 		 */
999 
1000 		/* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
1001 		clk_hw_set_parent(nb_data->cpu_clk_dyn,
1002 				  nb_data->cpu_clk_postmux0);
1003 
1004 		/*
1005 		 * new path :
1006 		 * cpu_clk
1007 		 *    \- cpu_clk_dyn
1008 		 *          \- cpu_clk_postmux0
1009 		 *                \- cpu_clk_muxX_div
1010 		 *                      \- cpu_clk_premux0
1011 		 *				\- fclk_div3 or fclk_div2
1012 		 *		OR
1013 		 *                \- cpu_clk_premux0
1014 		 *			\- fclk_div3 or fclk_div2
1015 		 */
1016 
1017 		udelay(100);
1018 
1019 		return NOTIFY_OK;
1020 
1021 	default:
1022 		return NOTIFY_DONE;
1023 	}
1024 }
1025 
1026 static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
1027 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1028 	.cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
1029 	.cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
1030 	.cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
1031 	.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1032 };
1033 
1034 static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
1035 	.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1036 	.cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
1037 	.cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
1038 	.cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
1039 	.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1040 };
1041 
1042 struct g12a_sys_pll_nb_data {
1043 	struct notifier_block nb;
1044 	struct clk_hw *sys_pll;
1045 	struct clk_hw *cpu_clk;
1046 	struct clk_hw *cpu_clk_dyn;
1047 };
1048 
g12a_sys_pll_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)1049 static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
1050 				    unsigned long event, void *data)
1051 {
1052 	struct g12a_sys_pll_nb_data *nb_data =
1053 		container_of(nb, struct g12a_sys_pll_nb_data, nb);
1054 
1055 	switch (event) {
1056 	case PRE_RATE_CHANGE:
1057 		/*
1058 		 * This notifier means sys_pll clock will be changed
1059 		 * to feed cpu_clk, this the current path :
1060 		 * cpu_clk
1061 		 *    \- sys_pll
1062 		 *          \- sys_pll_dco
1063 		 */
1064 
1065 		/* Configure cpu_clk to use cpu_clk_dyn */
1066 		clk_hw_set_parent(nb_data->cpu_clk,
1067 				  nb_data->cpu_clk_dyn);
1068 
1069 		/*
1070 		 * Now, cpu_clk uses the dyn path
1071 		 * cpu_clk
1072 		 *    \- cpu_clk_dyn
1073 		 *          \- cpu_clk_dynX
1074 		 *                \- cpu_clk_dynX_sel
1075 		 *		     \- cpu_clk_dynX_div
1076 		 *                      \- xtal/fclk_div2/fclk_div3
1077 		 *                   \- xtal/fclk_div2/fclk_div3
1078 		 */
1079 
1080 		udelay(100);
1081 
1082 		return NOTIFY_OK;
1083 
1084 	case POST_RATE_CHANGE:
1085 		/*
1086 		 * The sys_pll has ben updated, now switch back cpu_clk to
1087 		 * sys_pll
1088 		 */
1089 
1090 		/* Configure cpu_clk to use sys_pll */
1091 		clk_hw_set_parent(nb_data->cpu_clk,
1092 				  nb_data->sys_pll);
1093 
1094 		udelay(100);
1095 
1096 		/* new path :
1097 		 * cpu_clk
1098 		 *    \- sys_pll
1099 		 *          \- sys_pll_dco
1100 		 */
1101 
1102 		return NOTIFY_OK;
1103 
1104 	default:
1105 		return NOTIFY_DONE;
1106 	}
1107 }
1108 
1109 static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
1110 	.sys_pll = &g12a_sys_pll.hw,
1111 	.cpu_clk = &g12a_cpu_clk.hw,
1112 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1113 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1114 };
1115 
1116 /* G12B first CPU cluster uses sys1_pll */
1117 static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
1118 	.sys_pll = &g12b_sys1_pll.hw,
1119 	.cpu_clk = &g12b_cpu_clk.hw,
1120 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1121 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1122 };
1123 
1124 /* G12B second CPU cluster uses sys_pll */
1125 static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
1126 	.sys_pll = &g12a_sys_pll.hw,
1127 	.cpu_clk = &g12b_cpub_clk.hw,
1128 	.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1129 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1130 };
1131 
1132 static struct clk_regmap g12a_cpu_clk_div16_en = {
1133 	.data = &(struct clk_regmap_gate_data){
1134 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1135 		.bit_idx = 1,
1136 	},
1137 	.hw.init = &(struct clk_init_data) {
1138 		.name = "cpu_clk_div16_en",
1139 		.ops = &clk_regmap_gate_ro_ops,
1140 		.parent_data = &(const struct clk_parent_data) {
1141 			/*
1142 			 * Note:
1143 			 * G12A and G12B have different cpu clocks (with
1144 			 * different struct clk_hw). We fallback to the global
1145 			 * naming string mechanism so this clock picks
1146 			 * up the appropriate one. Same goes for the other
1147 			 * clock using cpu cluster A clock output and present
1148 			 * on both G12 variant.
1149 			 */
1150 			.name = "cpu_clk",
1151 			.index = -1,
1152 		},
1153 		.num_parents = 1,
1154 		/*
1155 		 * This clock is used to debug the cpu_clk range
1156 		 * Linux should not change it at runtime
1157 		 */
1158 	},
1159 };
1160 
1161 static struct clk_regmap g12b_cpub_clk_div16_en = {
1162 	.data = &(struct clk_regmap_gate_data){
1163 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1164 		.bit_idx = 1,
1165 	},
1166 	.hw.init = &(struct clk_init_data) {
1167 		.name = "cpub_clk_div16_en",
1168 		.ops = &clk_regmap_gate_ro_ops,
1169 		.parent_hws = (const struct clk_hw *[]) {
1170 			&g12b_cpub_clk.hw
1171 		},
1172 		.num_parents = 1,
1173 		/*
1174 		 * This clock is used to debug the cpu_clk range
1175 		 * Linux should not change it at runtime
1176 		 */
1177 	},
1178 };
1179 
1180 static struct clk_fixed_factor g12a_cpu_clk_div16 = {
1181 	.mult = 1,
1182 	.div = 16,
1183 	.hw.init = &(struct clk_init_data){
1184 		.name = "cpu_clk_div16",
1185 		.ops = &clk_fixed_factor_ops,
1186 		.parent_hws = (const struct clk_hw *[]) {
1187 			&g12a_cpu_clk_div16_en.hw
1188 		},
1189 		.num_parents = 1,
1190 	},
1191 };
1192 
1193 static struct clk_fixed_factor g12b_cpub_clk_div16 = {
1194 	.mult = 1,
1195 	.div = 16,
1196 	.hw.init = &(struct clk_init_data){
1197 		.name = "cpub_clk_div16",
1198 		.ops = &clk_fixed_factor_ops,
1199 		.parent_hws = (const struct clk_hw *[]) {
1200 			&g12b_cpub_clk_div16_en.hw
1201 		},
1202 		.num_parents = 1,
1203 	},
1204 };
1205 
1206 static struct clk_regmap g12a_cpu_clk_apb_div = {
1207 	.data = &(struct clk_regmap_div_data){
1208 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1209 		.shift = 3,
1210 		.width = 3,
1211 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1212 	},
1213 	.hw.init = &(struct clk_init_data){
1214 		.name = "cpu_clk_apb_div",
1215 		.ops = &clk_regmap_divider_ro_ops,
1216 		.parent_data = &(const struct clk_parent_data) {
1217 			.name = "cpu_clk",
1218 			.index = -1,
1219 		},
1220 		.num_parents = 1,
1221 	},
1222 };
1223 
1224 static struct clk_regmap g12a_cpu_clk_apb = {
1225 	.data = &(struct clk_regmap_gate_data){
1226 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1227 		.bit_idx = 1,
1228 	},
1229 	.hw.init = &(struct clk_init_data) {
1230 		.name = "cpu_clk_apb",
1231 		.ops = &clk_regmap_gate_ro_ops,
1232 		.parent_hws = (const struct clk_hw *[]) {
1233 			&g12a_cpu_clk_apb_div.hw
1234 		},
1235 		.num_parents = 1,
1236 		/*
1237 		 * This clock is set by the ROM monitor code,
1238 		 * Linux should not change it at runtime
1239 		 */
1240 	},
1241 };
1242 
1243 static struct clk_regmap g12a_cpu_clk_atb_div = {
1244 	.data = &(struct clk_regmap_div_data){
1245 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1246 		.shift = 6,
1247 		.width = 3,
1248 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1249 	},
1250 	.hw.init = &(struct clk_init_data){
1251 		.name = "cpu_clk_atb_div",
1252 		.ops = &clk_regmap_divider_ro_ops,
1253 		.parent_data = &(const struct clk_parent_data) {
1254 			.name = "cpu_clk",
1255 			.index = -1,
1256 		},
1257 		.num_parents = 1,
1258 	},
1259 };
1260 
1261 static struct clk_regmap g12a_cpu_clk_atb = {
1262 	.data = &(struct clk_regmap_gate_data){
1263 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1264 		.bit_idx = 17,
1265 	},
1266 	.hw.init = &(struct clk_init_data) {
1267 		.name = "cpu_clk_atb",
1268 		.ops = &clk_regmap_gate_ro_ops,
1269 		.parent_hws = (const struct clk_hw *[]) {
1270 			&g12a_cpu_clk_atb_div.hw
1271 		},
1272 		.num_parents = 1,
1273 		/*
1274 		 * This clock is set by the ROM monitor code,
1275 		 * Linux should not change it at runtime
1276 		 */
1277 	},
1278 };
1279 
1280 static struct clk_regmap g12a_cpu_clk_axi_div = {
1281 	.data = &(struct clk_regmap_div_data){
1282 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1283 		.shift = 9,
1284 		.width = 3,
1285 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1286 	},
1287 	.hw.init = &(struct clk_init_data){
1288 		.name = "cpu_clk_axi_div",
1289 		.ops = &clk_regmap_divider_ro_ops,
1290 		.parent_data = &(const struct clk_parent_data) {
1291 			.name = "cpu_clk",
1292 			.index = -1,
1293 		},
1294 		.num_parents = 1,
1295 	},
1296 };
1297 
1298 static struct clk_regmap g12a_cpu_clk_axi = {
1299 	.data = &(struct clk_regmap_gate_data){
1300 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1301 		.bit_idx = 18,
1302 	},
1303 	.hw.init = &(struct clk_init_data) {
1304 		.name = "cpu_clk_axi",
1305 		.ops = &clk_regmap_gate_ro_ops,
1306 		.parent_hws = (const struct clk_hw *[]) {
1307 			&g12a_cpu_clk_axi_div.hw
1308 		},
1309 		.num_parents = 1,
1310 		/*
1311 		 * This clock is set by the ROM monitor code,
1312 		 * Linux should not change it at runtime
1313 		 */
1314 	},
1315 };
1316 
1317 static struct clk_regmap g12a_cpu_clk_trace_div = {
1318 	.data = &(struct clk_regmap_div_data){
1319 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1320 		.shift = 20,
1321 		.width = 3,
1322 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1323 	},
1324 	.hw.init = &(struct clk_init_data){
1325 		.name = "cpu_clk_trace_div",
1326 		.ops = &clk_regmap_divider_ro_ops,
1327 		.parent_data = &(const struct clk_parent_data) {
1328 			.name = "cpu_clk",
1329 			.index = -1,
1330 		},
1331 		.num_parents = 1,
1332 	},
1333 };
1334 
1335 static struct clk_regmap g12a_cpu_clk_trace = {
1336 	.data = &(struct clk_regmap_gate_data){
1337 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1338 		.bit_idx = 23,
1339 	},
1340 	.hw.init = &(struct clk_init_data) {
1341 		.name = "cpu_clk_trace",
1342 		.ops = &clk_regmap_gate_ro_ops,
1343 		.parent_hws = (const struct clk_hw *[]) {
1344 			&g12a_cpu_clk_trace_div.hw
1345 		},
1346 		.num_parents = 1,
1347 		/*
1348 		 * This clock is set by the ROM monitor code,
1349 		 * Linux should not change it at runtime
1350 		 */
1351 	},
1352 };
1353 
1354 static struct clk_fixed_factor g12b_cpub_clk_div2 = {
1355 	.mult = 1,
1356 	.div = 2,
1357 	.hw.init = &(struct clk_init_data){
1358 		.name = "cpub_clk_div2",
1359 		.ops = &clk_fixed_factor_ops,
1360 		.parent_hws = (const struct clk_hw *[]) {
1361 			&g12b_cpub_clk.hw
1362 		},
1363 		.num_parents = 1,
1364 	},
1365 };
1366 
1367 static struct clk_fixed_factor g12b_cpub_clk_div3 = {
1368 	.mult = 1,
1369 	.div = 3,
1370 	.hw.init = &(struct clk_init_data){
1371 		.name = "cpub_clk_div3",
1372 		.ops = &clk_fixed_factor_ops,
1373 		.parent_hws = (const struct clk_hw *[]) {
1374 			&g12b_cpub_clk.hw
1375 		},
1376 		.num_parents = 1,
1377 	},
1378 };
1379 
1380 static struct clk_fixed_factor g12b_cpub_clk_div4 = {
1381 	.mult = 1,
1382 	.div = 4,
1383 	.hw.init = &(struct clk_init_data){
1384 		.name = "cpub_clk_div4",
1385 		.ops = &clk_fixed_factor_ops,
1386 		.parent_hws = (const struct clk_hw *[]) {
1387 			&g12b_cpub_clk.hw
1388 		},
1389 		.num_parents = 1,
1390 	},
1391 };
1392 
1393 static struct clk_fixed_factor g12b_cpub_clk_div5 = {
1394 	.mult = 1,
1395 	.div = 5,
1396 	.hw.init = &(struct clk_init_data){
1397 		.name = "cpub_clk_div5",
1398 		.ops = &clk_fixed_factor_ops,
1399 		.parent_hws = (const struct clk_hw *[]) {
1400 			&g12b_cpub_clk.hw
1401 		},
1402 		.num_parents = 1,
1403 	},
1404 };
1405 
1406 static struct clk_fixed_factor g12b_cpub_clk_div6 = {
1407 	.mult = 1,
1408 	.div = 6,
1409 	.hw.init = &(struct clk_init_data){
1410 		.name = "cpub_clk_div6",
1411 		.ops = &clk_fixed_factor_ops,
1412 		.parent_hws = (const struct clk_hw *[]) {
1413 			&g12b_cpub_clk.hw
1414 		},
1415 		.num_parents = 1,
1416 	},
1417 };
1418 
1419 static struct clk_fixed_factor g12b_cpub_clk_div7 = {
1420 	.mult = 1,
1421 	.div = 7,
1422 	.hw.init = &(struct clk_init_data){
1423 		.name = "cpub_clk_div7",
1424 		.ops = &clk_fixed_factor_ops,
1425 		.parent_hws = (const struct clk_hw *[]) {
1426 			&g12b_cpub_clk.hw
1427 		},
1428 		.num_parents = 1,
1429 	},
1430 };
1431 
1432 static struct clk_fixed_factor g12b_cpub_clk_div8 = {
1433 	.mult = 1,
1434 	.div = 8,
1435 	.hw.init = &(struct clk_init_data){
1436 		.name = "cpub_clk_div8",
1437 		.ops = &clk_fixed_factor_ops,
1438 		.parent_hws = (const struct clk_hw *[]) {
1439 			&g12b_cpub_clk.hw
1440 		},
1441 		.num_parents = 1,
1442 	},
1443 };
1444 
1445 static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
1446 static struct clk_regmap g12b_cpub_clk_apb_sel = {
1447 	.data = &(struct clk_regmap_mux_data){
1448 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1449 		.mask = 7,
1450 		.shift = 3,
1451 		.table = mux_table_cpub,
1452 	},
1453 	.hw.init = &(struct clk_init_data){
1454 		.name = "cpub_clk_apb_sel",
1455 		.ops = &clk_regmap_mux_ro_ops,
1456 		.parent_hws = (const struct clk_hw *[]) {
1457 			&g12b_cpub_clk_div2.hw,
1458 			&g12b_cpub_clk_div3.hw,
1459 			&g12b_cpub_clk_div4.hw,
1460 			&g12b_cpub_clk_div5.hw,
1461 			&g12b_cpub_clk_div6.hw,
1462 			&g12b_cpub_clk_div7.hw,
1463 			&g12b_cpub_clk_div8.hw
1464 		},
1465 		.num_parents = 7,
1466 	},
1467 };
1468 
1469 static struct clk_regmap g12b_cpub_clk_apb = {
1470 	.data = &(struct clk_regmap_gate_data){
1471 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1472 		.bit_idx = 16,
1473 		.flags = CLK_GATE_SET_TO_DISABLE,
1474 	},
1475 	.hw.init = &(struct clk_init_data) {
1476 		.name = "cpub_clk_apb",
1477 		.ops = &clk_regmap_gate_ro_ops,
1478 		.parent_hws = (const struct clk_hw *[]) {
1479 			&g12b_cpub_clk_apb_sel.hw
1480 		},
1481 		.num_parents = 1,
1482 		/*
1483 		 * This clock is set by the ROM monitor code,
1484 		 * Linux should not change it at runtime
1485 		 */
1486 	},
1487 };
1488 
1489 static struct clk_regmap g12b_cpub_clk_atb_sel = {
1490 	.data = &(struct clk_regmap_mux_data){
1491 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1492 		.mask = 7,
1493 		.shift = 6,
1494 		.table = mux_table_cpub,
1495 	},
1496 	.hw.init = &(struct clk_init_data){
1497 		.name = "cpub_clk_atb_sel",
1498 		.ops = &clk_regmap_mux_ro_ops,
1499 		.parent_hws = (const struct clk_hw *[]) {
1500 			&g12b_cpub_clk_div2.hw,
1501 			&g12b_cpub_clk_div3.hw,
1502 			&g12b_cpub_clk_div4.hw,
1503 			&g12b_cpub_clk_div5.hw,
1504 			&g12b_cpub_clk_div6.hw,
1505 			&g12b_cpub_clk_div7.hw,
1506 			&g12b_cpub_clk_div8.hw
1507 		},
1508 		.num_parents = 7,
1509 	},
1510 };
1511 
1512 static struct clk_regmap g12b_cpub_clk_atb = {
1513 	.data = &(struct clk_regmap_gate_data){
1514 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1515 		.bit_idx = 17,
1516 		.flags = CLK_GATE_SET_TO_DISABLE,
1517 	},
1518 	.hw.init = &(struct clk_init_data) {
1519 		.name = "cpub_clk_atb",
1520 		.ops = &clk_regmap_gate_ro_ops,
1521 		.parent_hws = (const struct clk_hw *[]) {
1522 			&g12b_cpub_clk_atb_sel.hw
1523 		},
1524 		.num_parents = 1,
1525 		/*
1526 		 * This clock is set by the ROM monitor code,
1527 		 * Linux should not change it at runtime
1528 		 */
1529 	},
1530 };
1531 
1532 static struct clk_regmap g12b_cpub_clk_axi_sel = {
1533 	.data = &(struct clk_regmap_mux_data){
1534 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1535 		.mask = 7,
1536 		.shift = 9,
1537 		.table = mux_table_cpub,
1538 	},
1539 	.hw.init = &(struct clk_init_data){
1540 		.name = "cpub_clk_axi_sel",
1541 		.ops = &clk_regmap_mux_ro_ops,
1542 		.parent_hws = (const struct clk_hw *[]) {
1543 			&g12b_cpub_clk_div2.hw,
1544 			&g12b_cpub_clk_div3.hw,
1545 			&g12b_cpub_clk_div4.hw,
1546 			&g12b_cpub_clk_div5.hw,
1547 			&g12b_cpub_clk_div6.hw,
1548 			&g12b_cpub_clk_div7.hw,
1549 			&g12b_cpub_clk_div8.hw
1550 		},
1551 		.num_parents = 7,
1552 	},
1553 };
1554 
1555 static struct clk_regmap g12b_cpub_clk_axi = {
1556 	.data = &(struct clk_regmap_gate_data){
1557 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1558 		.bit_idx = 18,
1559 		.flags = CLK_GATE_SET_TO_DISABLE,
1560 	},
1561 	.hw.init = &(struct clk_init_data) {
1562 		.name = "cpub_clk_axi",
1563 		.ops = &clk_regmap_gate_ro_ops,
1564 		.parent_hws = (const struct clk_hw *[]) {
1565 			&g12b_cpub_clk_axi_sel.hw
1566 		},
1567 		.num_parents = 1,
1568 		/*
1569 		 * This clock is set by the ROM monitor code,
1570 		 * Linux should not change it at runtime
1571 		 */
1572 	},
1573 };
1574 
1575 static struct clk_regmap g12b_cpub_clk_trace_sel = {
1576 	.data = &(struct clk_regmap_mux_data){
1577 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1578 		.mask = 7,
1579 		.shift = 20,
1580 		.table = mux_table_cpub,
1581 	},
1582 	.hw.init = &(struct clk_init_data){
1583 		.name = "cpub_clk_trace_sel",
1584 		.ops = &clk_regmap_mux_ro_ops,
1585 		.parent_hws = (const struct clk_hw *[]) {
1586 			&g12b_cpub_clk_div2.hw,
1587 			&g12b_cpub_clk_div3.hw,
1588 			&g12b_cpub_clk_div4.hw,
1589 			&g12b_cpub_clk_div5.hw,
1590 			&g12b_cpub_clk_div6.hw,
1591 			&g12b_cpub_clk_div7.hw,
1592 			&g12b_cpub_clk_div8.hw
1593 		},
1594 		.num_parents = 7,
1595 	},
1596 };
1597 
1598 static struct clk_regmap g12b_cpub_clk_trace = {
1599 	.data = &(struct clk_regmap_gate_data){
1600 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1601 		.bit_idx = 23,
1602 		.flags = CLK_GATE_SET_TO_DISABLE,
1603 	},
1604 	.hw.init = &(struct clk_init_data) {
1605 		.name = "cpub_clk_trace",
1606 		.ops = &clk_regmap_gate_ro_ops,
1607 		.parent_hws = (const struct clk_hw *[]) {
1608 			&g12b_cpub_clk_trace_sel.hw
1609 		},
1610 		.num_parents = 1,
1611 		/*
1612 		 * This clock is set by the ROM monitor code,
1613 		 * Linux should not change it at runtime
1614 		 */
1615 	},
1616 };
1617 
1618 static const struct pll_mult_range g12a_gp0_pll_mult_range = {
1619 	.min = 125,
1620 	.max = 255,
1621 };
1622 
1623 /*
1624  * Internal gp0 pll emulation configuration parameters
1625  */
1626 static const struct reg_sequence g12a_gp0_init_regs[] = {
1627 	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0x00000000 },
1628 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0x00000000 },
1629 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x48681c00 },
1630 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0x33771290 },
1631 	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x39272000 },
1632 	{ .reg = HHI_GP0_PLL_CNTL6,	.def = 0x56540000 },
1633 };
1634 
1635 static struct clk_regmap g12a_gp0_pll_dco = {
1636 	.data = &(struct meson_clk_pll_data){
1637 		.en = {
1638 			.reg_off = HHI_GP0_PLL_CNTL0,
1639 			.shift   = 28,
1640 			.width   = 1,
1641 		},
1642 		.m = {
1643 			.reg_off = HHI_GP0_PLL_CNTL0,
1644 			.shift   = 0,
1645 			.width   = 8,
1646 		},
1647 		.n = {
1648 			.reg_off = HHI_GP0_PLL_CNTL0,
1649 			.shift   = 10,
1650 			.width   = 5,
1651 		},
1652 		.frac = {
1653 			.reg_off = HHI_GP0_PLL_CNTL1,
1654 			.shift   = 0,
1655 			.width   = 17,
1656 		},
1657 		.l = {
1658 			.reg_off = HHI_GP0_PLL_CNTL0,
1659 			.shift   = 31,
1660 			.width   = 1,
1661 		},
1662 		.rst = {
1663 			.reg_off = HHI_GP0_PLL_CNTL0,
1664 			.shift   = 29,
1665 			.width   = 1,
1666 		},
1667 		.range = &g12a_gp0_pll_mult_range,
1668 		.init_regs = g12a_gp0_init_regs,
1669 		.init_count = ARRAY_SIZE(g12a_gp0_init_regs),
1670 	},
1671 	.hw.init = &(struct clk_init_data){
1672 		.name = "gp0_pll_dco",
1673 		.ops = &meson_clk_pll_ops,
1674 		.parent_data = &(const struct clk_parent_data) {
1675 			.fw_name = "xtal",
1676 		},
1677 		.num_parents = 1,
1678 	},
1679 };
1680 
1681 static struct clk_regmap g12a_gp0_pll = {
1682 	.data = &(struct clk_regmap_div_data){
1683 		.offset = HHI_GP0_PLL_CNTL0,
1684 		.shift = 16,
1685 		.width = 3,
1686 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1687 			  CLK_DIVIDER_ROUND_CLOSEST),
1688 	},
1689 	.hw.init = &(struct clk_init_data){
1690 		.name = "gp0_pll",
1691 		.ops = &clk_regmap_divider_ops,
1692 		.parent_hws = (const struct clk_hw *[]) {
1693 			&g12a_gp0_pll_dco.hw
1694 		},
1695 		.num_parents = 1,
1696 		.flags = CLK_SET_RATE_PARENT,
1697 	},
1698 };
1699 
1700 static struct clk_regmap sm1_gp1_pll_dco = {
1701 	.data = &(struct meson_clk_pll_data){
1702 		.en = {
1703 			.reg_off = HHI_GP1_PLL_CNTL0,
1704 			.shift   = 28,
1705 			.width   = 1,
1706 		},
1707 		.m = {
1708 			.reg_off = HHI_GP1_PLL_CNTL0,
1709 			.shift   = 0,
1710 			.width   = 8,
1711 		},
1712 		.n = {
1713 			.reg_off = HHI_GP1_PLL_CNTL0,
1714 			.shift   = 10,
1715 			.width   = 5,
1716 		},
1717 		.frac = {
1718 			.reg_off = HHI_GP1_PLL_CNTL1,
1719 			.shift   = 0,
1720 			.width   = 17,
1721 		},
1722 		.l = {
1723 			.reg_off = HHI_GP1_PLL_CNTL0,
1724 			.shift   = 31,
1725 			.width   = 1,
1726 		},
1727 		.rst = {
1728 			.reg_off = HHI_GP1_PLL_CNTL0,
1729 			.shift   = 29,
1730 			.width   = 1,
1731 		},
1732 	},
1733 	.hw.init = &(struct clk_init_data){
1734 		.name = "gp1_pll_dco",
1735 		.ops = &meson_clk_pll_ro_ops,
1736 		.parent_data = &(const struct clk_parent_data) {
1737 			.fw_name = "xtal",
1738 		},
1739 		.num_parents = 1,
1740 		/* This clock feeds the DSU, avoid disabling it */
1741 		.flags = CLK_IS_CRITICAL,
1742 	},
1743 };
1744 
1745 static struct clk_regmap sm1_gp1_pll = {
1746 	.data = &(struct clk_regmap_div_data){
1747 		.offset = HHI_GP1_PLL_CNTL0,
1748 		.shift = 16,
1749 		.width = 3,
1750 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1751 			  CLK_DIVIDER_ROUND_CLOSEST),
1752 	},
1753 	.hw.init = &(struct clk_init_data){
1754 		.name = "gp1_pll",
1755 		.ops = &clk_regmap_divider_ro_ops,
1756 		.parent_hws = (const struct clk_hw *[]) {
1757 			&sm1_gp1_pll_dco.hw
1758 		},
1759 		.num_parents = 1,
1760 	},
1761 };
1762 
1763 /*
1764  * Internal hifi pll emulation configuration parameters
1765  */
1766 static const struct reg_sequence g12a_hifi_init_regs[] = {
1767 	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0x00000000 },
1768 	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0x00000000 },
1769 	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x6a285c00 },
1770 	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0x65771290 },
1771 	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x39272000 },
1772 	{ .reg = HHI_HIFI_PLL_CNTL6,	.def = 0x56540000 },
1773 };
1774 
1775 static struct clk_regmap g12a_hifi_pll_dco = {
1776 	.data = &(struct meson_clk_pll_data){
1777 		.en = {
1778 			.reg_off = HHI_HIFI_PLL_CNTL0,
1779 			.shift   = 28,
1780 			.width   = 1,
1781 		},
1782 		.m = {
1783 			.reg_off = HHI_HIFI_PLL_CNTL0,
1784 			.shift   = 0,
1785 			.width   = 8,
1786 		},
1787 		.n = {
1788 			.reg_off = HHI_HIFI_PLL_CNTL0,
1789 			.shift   = 10,
1790 			.width   = 5,
1791 		},
1792 		.frac = {
1793 			.reg_off = HHI_HIFI_PLL_CNTL1,
1794 			.shift   = 0,
1795 			.width   = 17,
1796 		},
1797 		.l = {
1798 			.reg_off = HHI_HIFI_PLL_CNTL0,
1799 			.shift   = 31,
1800 			.width   = 1,
1801 		},
1802 		.rst = {
1803 			.reg_off = HHI_HIFI_PLL_CNTL0,
1804 			.shift   = 29,
1805 			.width   = 1,
1806 		},
1807 		.range = &g12a_gp0_pll_mult_range,
1808 		.init_regs = g12a_hifi_init_regs,
1809 		.init_count = ARRAY_SIZE(g12a_hifi_init_regs),
1810 		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
1811 	},
1812 	.hw.init = &(struct clk_init_data){
1813 		.name = "hifi_pll_dco",
1814 		.ops = &meson_clk_pll_ops,
1815 		.parent_data = &(const struct clk_parent_data) {
1816 			.fw_name = "xtal",
1817 		},
1818 		.num_parents = 1,
1819 	},
1820 };
1821 
1822 static struct clk_regmap g12a_hifi_pll = {
1823 	.data = &(struct clk_regmap_div_data){
1824 		.offset = HHI_HIFI_PLL_CNTL0,
1825 		.shift = 16,
1826 		.width = 2,
1827 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1828 			  CLK_DIVIDER_ROUND_CLOSEST),
1829 	},
1830 	.hw.init = &(struct clk_init_data){
1831 		.name = "hifi_pll",
1832 		.ops = &clk_regmap_divider_ops,
1833 		.parent_hws = (const struct clk_hw *[]) {
1834 			&g12a_hifi_pll_dco.hw
1835 		},
1836 		.num_parents = 1,
1837 		.flags = CLK_SET_RATE_PARENT,
1838 	},
1839 };
1840 
1841 /*
1842  * The Meson G12A PCIE PLL is fined tuned to deliver a very precise
1843  * 100MHz reference clock for the PCIe Analog PHY, and thus requires
1844  * a strict register sequence to enable the PLL.
1845  */
1846 static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
1847 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x20090496 },
1848 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x30090496 },
1849 	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x00000000 },
1850 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001100 },
1851 	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x10058e00 },
1852 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x000100c0 },
1853 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000048 },
1854 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000068, .delay_us = 20 },
1855 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x008100c0, .delay_us = 10 },
1856 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x34090496 },
1857 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x14090496, .delay_us = 10 },
1858 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001000 },
1859 };
1860 
1861 /* Keep a single entry table for recalc/round_rate() ops */
1862 static const struct pll_params_table g12a_pcie_pll_table[] = {
1863 	PLL_PARAMS(150, 1),
1864 	{0, 0},
1865 };
1866 
1867 static struct clk_regmap g12a_pcie_pll_dco = {
1868 	.data = &(struct meson_clk_pll_data){
1869 		.en = {
1870 			.reg_off = HHI_PCIE_PLL_CNTL0,
1871 			.shift   = 28,
1872 			.width   = 1,
1873 		},
1874 		.m = {
1875 			.reg_off = HHI_PCIE_PLL_CNTL0,
1876 			.shift   = 0,
1877 			.width   = 8,
1878 		},
1879 		.n = {
1880 			.reg_off = HHI_PCIE_PLL_CNTL0,
1881 			.shift   = 10,
1882 			.width   = 5,
1883 		},
1884 		.frac = {
1885 			.reg_off = HHI_PCIE_PLL_CNTL1,
1886 			.shift   = 0,
1887 			.width   = 12,
1888 		},
1889 		.l = {
1890 			.reg_off = HHI_PCIE_PLL_CNTL0,
1891 			.shift   = 31,
1892 			.width   = 1,
1893 		},
1894 		.rst = {
1895 			.reg_off = HHI_PCIE_PLL_CNTL0,
1896 			.shift   = 29,
1897 			.width   = 1,
1898 		},
1899 		.table = g12a_pcie_pll_table,
1900 		.init_regs = g12a_pcie_pll_init_regs,
1901 		.init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
1902 	},
1903 	.hw.init = &(struct clk_init_data){
1904 		.name = "pcie_pll_dco",
1905 		.ops = &meson_clk_pcie_pll_ops,
1906 		.parent_data = &(const struct clk_parent_data) {
1907 			.fw_name = "xtal",
1908 		},
1909 		.num_parents = 1,
1910 	},
1911 };
1912 
1913 static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
1914 	.mult = 1,
1915 	.div = 2,
1916 	.hw.init = &(struct clk_init_data){
1917 		.name = "pcie_pll_dco_div2",
1918 		.ops = &clk_fixed_factor_ops,
1919 		.parent_hws = (const struct clk_hw *[]) {
1920 			&g12a_pcie_pll_dco.hw
1921 		},
1922 		.num_parents = 1,
1923 		.flags = CLK_SET_RATE_PARENT,
1924 	},
1925 };
1926 
1927 static struct clk_regmap g12a_pcie_pll_od = {
1928 	.data = &(struct clk_regmap_div_data){
1929 		.offset = HHI_PCIE_PLL_CNTL0,
1930 		.shift = 16,
1931 		.width = 5,
1932 		.flags = CLK_DIVIDER_ROUND_CLOSEST |
1933 			 CLK_DIVIDER_ONE_BASED |
1934 			 CLK_DIVIDER_ALLOW_ZERO,
1935 	},
1936 	.hw.init = &(struct clk_init_data){
1937 		.name = "pcie_pll_od",
1938 		.ops = &clk_regmap_divider_ops,
1939 		.parent_hws = (const struct clk_hw *[]) {
1940 			&g12a_pcie_pll_dco_div2.hw
1941 		},
1942 		.num_parents = 1,
1943 		.flags = CLK_SET_RATE_PARENT,
1944 	},
1945 };
1946 
1947 static struct clk_fixed_factor g12a_pcie_pll = {
1948 	.mult = 1,
1949 	.div = 2,
1950 	.hw.init = &(struct clk_init_data){
1951 		.name = "pcie_pll_pll",
1952 		.ops = &clk_fixed_factor_ops,
1953 		.parent_hws = (const struct clk_hw *[]) {
1954 			&g12a_pcie_pll_od.hw
1955 		},
1956 		.num_parents = 1,
1957 		.flags = CLK_SET_RATE_PARENT,
1958 	},
1959 };
1960 
1961 static struct clk_regmap g12a_hdmi_pll_dco = {
1962 	.data = &(struct meson_clk_pll_data){
1963 		.en = {
1964 			.reg_off = HHI_HDMI_PLL_CNTL0,
1965 			.shift   = 28,
1966 			.width   = 1,
1967 		},
1968 		.m = {
1969 			.reg_off = HHI_HDMI_PLL_CNTL0,
1970 			.shift   = 0,
1971 			.width   = 8,
1972 		},
1973 		.n = {
1974 			.reg_off = HHI_HDMI_PLL_CNTL0,
1975 			.shift   = 10,
1976 			.width   = 5,
1977 		},
1978 		.frac = {
1979 			.reg_off = HHI_HDMI_PLL_CNTL1,
1980 			.shift   = 0,
1981 			.width   = 16,
1982 		},
1983 		.l = {
1984 			.reg_off = HHI_HDMI_PLL_CNTL0,
1985 			.shift   = 30,
1986 			.width   = 1,
1987 		},
1988 		.rst = {
1989 			.reg_off = HHI_HDMI_PLL_CNTL0,
1990 			.shift   = 29,
1991 			.width   = 1,
1992 		},
1993 	},
1994 	.hw.init = &(struct clk_init_data){
1995 		.name = "hdmi_pll_dco",
1996 		.ops = &meson_clk_pll_ro_ops,
1997 		.parent_data = &(const struct clk_parent_data) {
1998 			.fw_name = "xtal",
1999 		},
2000 		.num_parents = 1,
2001 		/*
2002 		 * Display directly handle hdmi pll registers ATM, we need
2003 		 * NOCACHE to keep our view of the clock as accurate as possible
2004 		 */
2005 		.flags = CLK_GET_RATE_NOCACHE,
2006 	},
2007 };
2008 
2009 static struct clk_regmap g12a_hdmi_pll_od = {
2010 	.data = &(struct clk_regmap_div_data){
2011 		.offset = HHI_HDMI_PLL_CNTL0,
2012 		.shift = 16,
2013 		.width = 2,
2014 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2015 	},
2016 	.hw.init = &(struct clk_init_data){
2017 		.name = "hdmi_pll_od",
2018 		.ops = &clk_regmap_divider_ro_ops,
2019 		.parent_hws = (const struct clk_hw *[]) {
2020 			&g12a_hdmi_pll_dco.hw
2021 		},
2022 		.num_parents = 1,
2023 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2024 	},
2025 };
2026 
2027 static struct clk_regmap g12a_hdmi_pll_od2 = {
2028 	.data = &(struct clk_regmap_div_data){
2029 		.offset = HHI_HDMI_PLL_CNTL0,
2030 		.shift = 18,
2031 		.width = 2,
2032 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2033 	},
2034 	.hw.init = &(struct clk_init_data){
2035 		.name = "hdmi_pll_od2",
2036 		.ops = &clk_regmap_divider_ro_ops,
2037 		.parent_hws = (const struct clk_hw *[]) {
2038 			&g12a_hdmi_pll_od.hw
2039 		},
2040 		.num_parents = 1,
2041 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2042 	},
2043 };
2044 
2045 static struct clk_regmap g12a_hdmi_pll = {
2046 	.data = &(struct clk_regmap_div_data){
2047 		.offset = HHI_HDMI_PLL_CNTL0,
2048 		.shift = 20,
2049 		.width = 2,
2050 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2051 	},
2052 	.hw.init = &(struct clk_init_data){
2053 		.name = "hdmi_pll",
2054 		.ops = &clk_regmap_divider_ro_ops,
2055 		.parent_hws = (const struct clk_hw *[]) {
2056 			&g12a_hdmi_pll_od2.hw
2057 		},
2058 		.num_parents = 1,
2059 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2060 	},
2061 };
2062 
2063 static struct clk_fixed_factor g12a_fclk_div4_div = {
2064 	.mult = 1,
2065 	.div = 4,
2066 	.hw.init = &(struct clk_init_data){
2067 		.name = "fclk_div4_div",
2068 		.ops = &clk_fixed_factor_ops,
2069 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2070 		.num_parents = 1,
2071 	},
2072 };
2073 
2074 static struct clk_regmap g12a_fclk_div4 = {
2075 	.data = &(struct clk_regmap_gate_data){
2076 		.offset = HHI_FIX_PLL_CNTL1,
2077 		.bit_idx = 21,
2078 	},
2079 	.hw.init = &(struct clk_init_data){
2080 		.name = "fclk_div4",
2081 		.ops = &clk_regmap_gate_ops,
2082 		.parent_hws = (const struct clk_hw *[]) {
2083 			&g12a_fclk_div4_div.hw
2084 		},
2085 		.num_parents = 1,
2086 	},
2087 };
2088 
2089 static struct clk_fixed_factor g12a_fclk_div5_div = {
2090 	.mult = 1,
2091 	.div = 5,
2092 	.hw.init = &(struct clk_init_data){
2093 		.name = "fclk_div5_div",
2094 		.ops = &clk_fixed_factor_ops,
2095 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2096 		.num_parents = 1,
2097 	},
2098 };
2099 
2100 static struct clk_regmap g12a_fclk_div5 = {
2101 	.data = &(struct clk_regmap_gate_data){
2102 		.offset = HHI_FIX_PLL_CNTL1,
2103 		.bit_idx = 22,
2104 	},
2105 	.hw.init = &(struct clk_init_data){
2106 		.name = "fclk_div5",
2107 		.ops = &clk_regmap_gate_ops,
2108 		.parent_hws = (const struct clk_hw *[]) {
2109 			&g12a_fclk_div5_div.hw
2110 		},
2111 		.num_parents = 1,
2112 	},
2113 };
2114 
2115 static struct clk_fixed_factor g12a_fclk_div7_div = {
2116 	.mult = 1,
2117 	.div = 7,
2118 	.hw.init = &(struct clk_init_data){
2119 		.name = "fclk_div7_div",
2120 		.ops = &clk_fixed_factor_ops,
2121 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2122 		.num_parents = 1,
2123 	},
2124 };
2125 
2126 static struct clk_regmap g12a_fclk_div7 = {
2127 	.data = &(struct clk_regmap_gate_data){
2128 		.offset = HHI_FIX_PLL_CNTL1,
2129 		.bit_idx = 23,
2130 	},
2131 	.hw.init = &(struct clk_init_data){
2132 		.name = "fclk_div7",
2133 		.ops = &clk_regmap_gate_ops,
2134 		.parent_hws = (const struct clk_hw *[]) {
2135 			&g12a_fclk_div7_div.hw
2136 		},
2137 		.num_parents = 1,
2138 	},
2139 };
2140 
2141 static struct clk_fixed_factor g12a_fclk_div2p5_div = {
2142 	.mult = 1,
2143 	.div = 5,
2144 	.hw.init = &(struct clk_init_data){
2145 		.name = "fclk_div2p5_div",
2146 		.ops = &clk_fixed_factor_ops,
2147 		.parent_hws = (const struct clk_hw *[]) {
2148 			&g12a_fixed_pll_dco.hw
2149 		},
2150 		.num_parents = 1,
2151 	},
2152 };
2153 
2154 static struct clk_regmap g12a_fclk_div2p5 = {
2155 	.data = &(struct clk_regmap_gate_data){
2156 		.offset = HHI_FIX_PLL_CNTL1,
2157 		.bit_idx = 25,
2158 	},
2159 	.hw.init = &(struct clk_init_data){
2160 		.name = "fclk_div2p5",
2161 		.ops = &clk_regmap_gate_ops,
2162 		.parent_hws = (const struct clk_hw *[]) {
2163 			&g12a_fclk_div2p5_div.hw
2164 		},
2165 		.num_parents = 1,
2166 	},
2167 };
2168 
2169 static struct clk_fixed_factor g12a_mpll_50m_div = {
2170 	.mult = 1,
2171 	.div = 80,
2172 	.hw.init = &(struct clk_init_data){
2173 		.name = "mpll_50m_div",
2174 		.ops = &clk_fixed_factor_ops,
2175 		.parent_hws = (const struct clk_hw *[]) {
2176 			&g12a_fixed_pll_dco.hw
2177 		},
2178 		.num_parents = 1,
2179 	},
2180 };
2181 
2182 static struct clk_regmap g12a_mpll_50m = {
2183 	.data = &(struct clk_regmap_mux_data){
2184 		.offset = HHI_FIX_PLL_CNTL3,
2185 		.mask = 0x1,
2186 		.shift = 5,
2187 	},
2188 	.hw.init = &(struct clk_init_data){
2189 		.name = "mpll_50m",
2190 		.ops = &clk_regmap_mux_ro_ops,
2191 		.parent_data = (const struct clk_parent_data []) {
2192 			{ .fw_name = "xtal", },
2193 			{ .hw = &g12a_mpll_50m_div.hw },
2194 		},
2195 		.num_parents = 2,
2196 	},
2197 };
2198 
2199 static struct clk_fixed_factor g12a_mpll_prediv = {
2200 	.mult = 1,
2201 	.div = 2,
2202 	.hw.init = &(struct clk_init_data){
2203 		.name = "mpll_prediv",
2204 		.ops = &clk_fixed_factor_ops,
2205 		.parent_hws = (const struct clk_hw *[]) {
2206 			&g12a_fixed_pll_dco.hw
2207 		},
2208 		.num_parents = 1,
2209 	},
2210 };
2211 
2212 static const struct reg_sequence g12a_mpll0_init_regs[] = {
2213 	{ .reg = HHI_MPLL_CNTL2,	.def = 0x40000033 },
2214 };
2215 
2216 static struct clk_regmap g12a_mpll0_div = {
2217 	.data = &(struct meson_clk_mpll_data){
2218 		.sdm = {
2219 			.reg_off = HHI_MPLL_CNTL1,
2220 			.shift   = 0,
2221 			.width   = 14,
2222 		},
2223 		.sdm_en = {
2224 			.reg_off = HHI_MPLL_CNTL1,
2225 			.shift   = 30,
2226 			.width	 = 1,
2227 		},
2228 		.n2 = {
2229 			.reg_off = HHI_MPLL_CNTL1,
2230 			.shift   = 20,
2231 			.width   = 9,
2232 		},
2233 		.ssen = {
2234 			.reg_off = HHI_MPLL_CNTL1,
2235 			.shift   = 29,
2236 			.width	 = 1,
2237 		},
2238 		.init_regs = g12a_mpll0_init_regs,
2239 		.init_count = ARRAY_SIZE(g12a_mpll0_init_regs),
2240 	},
2241 	.hw.init = &(struct clk_init_data){
2242 		.name = "mpll0_div",
2243 		.ops = &meson_clk_mpll_ops,
2244 		.parent_hws = (const struct clk_hw *[]) {
2245 			&g12a_mpll_prediv.hw
2246 		},
2247 		.num_parents = 1,
2248 	},
2249 };
2250 
2251 static struct clk_regmap g12a_mpll0 = {
2252 	.data = &(struct clk_regmap_gate_data){
2253 		.offset = HHI_MPLL_CNTL1,
2254 		.bit_idx = 31,
2255 	},
2256 	.hw.init = &(struct clk_init_data){
2257 		.name = "mpll0",
2258 		.ops = &clk_regmap_gate_ops,
2259 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw },
2260 		.num_parents = 1,
2261 		.flags = CLK_SET_RATE_PARENT,
2262 	},
2263 };
2264 
2265 static const struct reg_sequence g12a_mpll1_init_regs[] = {
2266 	{ .reg = HHI_MPLL_CNTL4,	.def = 0x40000033 },
2267 };
2268 
2269 static struct clk_regmap g12a_mpll1_div = {
2270 	.data = &(struct meson_clk_mpll_data){
2271 		.sdm = {
2272 			.reg_off = HHI_MPLL_CNTL3,
2273 			.shift   = 0,
2274 			.width   = 14,
2275 		},
2276 		.sdm_en = {
2277 			.reg_off = HHI_MPLL_CNTL3,
2278 			.shift   = 30,
2279 			.width	 = 1,
2280 		},
2281 		.n2 = {
2282 			.reg_off = HHI_MPLL_CNTL3,
2283 			.shift   = 20,
2284 			.width   = 9,
2285 		},
2286 		.ssen = {
2287 			.reg_off = HHI_MPLL_CNTL3,
2288 			.shift   = 29,
2289 			.width	 = 1,
2290 		},
2291 		.init_regs = g12a_mpll1_init_regs,
2292 		.init_count = ARRAY_SIZE(g12a_mpll1_init_regs),
2293 	},
2294 	.hw.init = &(struct clk_init_data){
2295 		.name = "mpll1_div",
2296 		.ops = &meson_clk_mpll_ops,
2297 		.parent_hws = (const struct clk_hw *[]) {
2298 			&g12a_mpll_prediv.hw
2299 		},
2300 		.num_parents = 1,
2301 	},
2302 };
2303 
2304 static struct clk_regmap g12a_mpll1 = {
2305 	.data = &(struct clk_regmap_gate_data){
2306 		.offset = HHI_MPLL_CNTL3,
2307 		.bit_idx = 31,
2308 	},
2309 	.hw.init = &(struct clk_init_data){
2310 		.name = "mpll1",
2311 		.ops = &clk_regmap_gate_ops,
2312 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw },
2313 		.num_parents = 1,
2314 		.flags = CLK_SET_RATE_PARENT,
2315 	},
2316 };
2317 
2318 static const struct reg_sequence g12a_mpll2_init_regs[] = {
2319 	{ .reg = HHI_MPLL_CNTL6,	.def = 0x40000033 },
2320 };
2321 
2322 static struct clk_regmap g12a_mpll2_div = {
2323 	.data = &(struct meson_clk_mpll_data){
2324 		.sdm = {
2325 			.reg_off = HHI_MPLL_CNTL5,
2326 			.shift   = 0,
2327 			.width   = 14,
2328 		},
2329 		.sdm_en = {
2330 			.reg_off = HHI_MPLL_CNTL5,
2331 			.shift   = 30,
2332 			.width	 = 1,
2333 		},
2334 		.n2 = {
2335 			.reg_off = HHI_MPLL_CNTL5,
2336 			.shift   = 20,
2337 			.width   = 9,
2338 		},
2339 		.ssen = {
2340 			.reg_off = HHI_MPLL_CNTL5,
2341 			.shift   = 29,
2342 			.width	 = 1,
2343 		},
2344 		.init_regs = g12a_mpll2_init_regs,
2345 		.init_count = ARRAY_SIZE(g12a_mpll2_init_regs),
2346 	},
2347 	.hw.init = &(struct clk_init_data){
2348 		.name = "mpll2_div",
2349 		.ops = &meson_clk_mpll_ops,
2350 		.parent_hws = (const struct clk_hw *[]) {
2351 			&g12a_mpll_prediv.hw
2352 		},
2353 		.num_parents = 1,
2354 	},
2355 };
2356 
2357 static struct clk_regmap g12a_mpll2 = {
2358 	.data = &(struct clk_regmap_gate_data){
2359 		.offset = HHI_MPLL_CNTL5,
2360 		.bit_idx = 31,
2361 	},
2362 	.hw.init = &(struct clk_init_data){
2363 		.name = "mpll2",
2364 		.ops = &clk_regmap_gate_ops,
2365 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw },
2366 		.num_parents = 1,
2367 		.flags = CLK_SET_RATE_PARENT,
2368 	},
2369 };
2370 
2371 static const struct reg_sequence g12a_mpll3_init_regs[] = {
2372 	{ .reg = HHI_MPLL_CNTL8,	.def = 0x40000033 },
2373 };
2374 
2375 static struct clk_regmap g12a_mpll3_div = {
2376 	.data = &(struct meson_clk_mpll_data){
2377 		.sdm = {
2378 			.reg_off = HHI_MPLL_CNTL7,
2379 			.shift   = 0,
2380 			.width   = 14,
2381 		},
2382 		.sdm_en = {
2383 			.reg_off = HHI_MPLL_CNTL7,
2384 			.shift   = 30,
2385 			.width	 = 1,
2386 		},
2387 		.n2 = {
2388 			.reg_off = HHI_MPLL_CNTL7,
2389 			.shift   = 20,
2390 			.width   = 9,
2391 		},
2392 		.ssen = {
2393 			.reg_off = HHI_MPLL_CNTL7,
2394 			.shift   = 29,
2395 			.width	 = 1,
2396 		},
2397 		.init_regs = g12a_mpll3_init_regs,
2398 		.init_count = ARRAY_SIZE(g12a_mpll3_init_regs),
2399 	},
2400 	.hw.init = &(struct clk_init_data){
2401 		.name = "mpll3_div",
2402 		.ops = &meson_clk_mpll_ops,
2403 		.parent_hws = (const struct clk_hw *[]) {
2404 			&g12a_mpll_prediv.hw
2405 		},
2406 		.num_parents = 1,
2407 	},
2408 };
2409 
2410 static struct clk_regmap g12a_mpll3 = {
2411 	.data = &(struct clk_regmap_gate_data){
2412 		.offset = HHI_MPLL_CNTL7,
2413 		.bit_idx = 31,
2414 	},
2415 	.hw.init = &(struct clk_init_data){
2416 		.name = "mpll3",
2417 		.ops = &clk_regmap_gate_ops,
2418 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw },
2419 		.num_parents = 1,
2420 		.flags = CLK_SET_RATE_PARENT,
2421 	},
2422 };
2423 
2424 static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
2425 static const struct clk_parent_data clk81_parent_data[] = {
2426 	{ .fw_name = "xtal", },
2427 	{ .hw = &g12a_fclk_div7.hw },
2428 	{ .hw = &g12a_mpll1.hw },
2429 	{ .hw = &g12a_mpll2.hw },
2430 	{ .hw = &g12a_fclk_div4.hw },
2431 	{ .hw = &g12a_fclk_div3.hw },
2432 	{ .hw = &g12a_fclk_div5.hw },
2433 };
2434 
2435 static struct clk_regmap g12a_mpeg_clk_sel = {
2436 	.data = &(struct clk_regmap_mux_data){
2437 		.offset = HHI_MPEG_CLK_CNTL,
2438 		.mask = 0x7,
2439 		.shift = 12,
2440 		.table = mux_table_clk81,
2441 	},
2442 	.hw.init = &(struct clk_init_data){
2443 		.name = "mpeg_clk_sel",
2444 		.ops = &clk_regmap_mux_ro_ops,
2445 		.parent_data = clk81_parent_data,
2446 		.num_parents = ARRAY_SIZE(clk81_parent_data),
2447 	},
2448 };
2449 
2450 static struct clk_regmap g12a_mpeg_clk_div = {
2451 	.data = &(struct clk_regmap_div_data){
2452 		.offset = HHI_MPEG_CLK_CNTL,
2453 		.shift = 0,
2454 		.width = 7,
2455 	},
2456 	.hw.init = &(struct clk_init_data){
2457 		.name = "mpeg_clk_div",
2458 		.ops = &clk_regmap_divider_ops,
2459 		.parent_hws = (const struct clk_hw *[]) {
2460 			&g12a_mpeg_clk_sel.hw
2461 		},
2462 		.num_parents = 1,
2463 		.flags = CLK_SET_RATE_PARENT,
2464 	},
2465 };
2466 
2467 static struct clk_regmap g12a_clk81 = {
2468 	.data = &(struct clk_regmap_gate_data){
2469 		.offset = HHI_MPEG_CLK_CNTL,
2470 		.bit_idx = 7,
2471 	},
2472 	.hw.init = &(struct clk_init_data){
2473 		.name = "clk81",
2474 		.ops = &clk_regmap_gate_ops,
2475 		.parent_hws = (const struct clk_hw *[]) {
2476 			&g12a_mpeg_clk_div.hw
2477 		},
2478 		.num_parents = 1,
2479 		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
2480 	},
2481 };
2482 
2483 static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = {
2484 	{ .fw_name = "xtal", },
2485 	{ .hw = &g12a_fclk_div2.hw },
2486 	{ .hw = &g12a_fclk_div3.hw },
2487 	{ .hw = &g12a_fclk_div5.hw },
2488 	{ .hw = &g12a_fclk_div7.hw },
2489 	/*
2490 	 * Following these parent clocks, we should also have had mpll2, mpll3
2491 	 * and gp0_pll but these clocks are too precious to be used here. All
2492 	 * the necessary rates for MMC and NAND operation can be acheived using
2493 	 * g12a_ee_core or fclk_div clocks
2494 	 */
2495 };
2496 
2497 /* SDIO clock */
2498 static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
2499 	.data = &(struct clk_regmap_mux_data){
2500 		.offset = HHI_SD_EMMC_CLK_CNTL,
2501 		.mask = 0x7,
2502 		.shift = 9,
2503 	},
2504 	.hw.init = &(struct clk_init_data) {
2505 		.name = "sd_emmc_a_clk0_sel",
2506 		.ops = &clk_regmap_mux_ops,
2507 		.parent_data = g12a_sd_emmc_clk0_parent_data,
2508 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2509 		.flags = CLK_SET_RATE_PARENT,
2510 	},
2511 };
2512 
2513 static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
2514 	.data = &(struct clk_regmap_div_data){
2515 		.offset = HHI_SD_EMMC_CLK_CNTL,
2516 		.shift = 0,
2517 		.width = 7,
2518 	},
2519 	.hw.init = &(struct clk_init_data) {
2520 		.name = "sd_emmc_a_clk0_div",
2521 		.ops = &clk_regmap_divider_ops,
2522 		.parent_hws = (const struct clk_hw *[]) {
2523 			&g12a_sd_emmc_a_clk0_sel.hw
2524 		},
2525 		.num_parents = 1,
2526 		.flags = CLK_SET_RATE_PARENT,
2527 	},
2528 };
2529 
2530 static struct clk_regmap g12a_sd_emmc_a_clk0 = {
2531 	.data = &(struct clk_regmap_gate_data){
2532 		.offset = HHI_SD_EMMC_CLK_CNTL,
2533 		.bit_idx = 7,
2534 	},
2535 	.hw.init = &(struct clk_init_data){
2536 		.name = "sd_emmc_a_clk0",
2537 		.ops = &clk_regmap_gate_ops,
2538 		.parent_hws = (const struct clk_hw *[]) {
2539 			&g12a_sd_emmc_a_clk0_div.hw
2540 		},
2541 		.num_parents = 1,
2542 		.flags = CLK_SET_RATE_PARENT,
2543 	},
2544 };
2545 
2546 /* SDcard clock */
2547 static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
2548 	.data = &(struct clk_regmap_mux_data){
2549 		.offset = HHI_SD_EMMC_CLK_CNTL,
2550 		.mask = 0x7,
2551 		.shift = 25,
2552 	},
2553 	.hw.init = &(struct clk_init_data) {
2554 		.name = "sd_emmc_b_clk0_sel",
2555 		.ops = &clk_regmap_mux_ops,
2556 		.parent_data = g12a_sd_emmc_clk0_parent_data,
2557 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2558 		.flags = CLK_SET_RATE_PARENT,
2559 	},
2560 };
2561 
2562 static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
2563 	.data = &(struct clk_regmap_div_data){
2564 		.offset = HHI_SD_EMMC_CLK_CNTL,
2565 		.shift = 16,
2566 		.width = 7,
2567 	},
2568 	.hw.init = &(struct clk_init_data) {
2569 		.name = "sd_emmc_b_clk0_div",
2570 		.ops = &clk_regmap_divider_ops,
2571 		.parent_hws = (const struct clk_hw *[]) {
2572 			&g12a_sd_emmc_b_clk0_sel.hw
2573 		},
2574 		.num_parents = 1,
2575 		.flags = CLK_SET_RATE_PARENT,
2576 	},
2577 };
2578 
2579 static struct clk_regmap g12a_sd_emmc_b_clk0 = {
2580 	.data = &(struct clk_regmap_gate_data){
2581 		.offset = HHI_SD_EMMC_CLK_CNTL,
2582 		.bit_idx = 23,
2583 	},
2584 	.hw.init = &(struct clk_init_data){
2585 		.name = "sd_emmc_b_clk0",
2586 		.ops = &clk_regmap_gate_ops,
2587 		.parent_hws = (const struct clk_hw *[]) {
2588 			&g12a_sd_emmc_b_clk0_div.hw
2589 		},
2590 		.num_parents = 1,
2591 		.flags = CLK_SET_RATE_PARENT,
2592 	},
2593 };
2594 
2595 /* EMMC/NAND clock */
2596 static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
2597 	.data = &(struct clk_regmap_mux_data){
2598 		.offset = HHI_NAND_CLK_CNTL,
2599 		.mask = 0x7,
2600 		.shift = 9,
2601 	},
2602 	.hw.init = &(struct clk_init_data) {
2603 		.name = "sd_emmc_c_clk0_sel",
2604 		.ops = &clk_regmap_mux_ops,
2605 		.parent_data = g12a_sd_emmc_clk0_parent_data,
2606 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2607 		.flags = CLK_SET_RATE_PARENT,
2608 	},
2609 };
2610 
2611 static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
2612 	.data = &(struct clk_regmap_div_data){
2613 		.offset = HHI_NAND_CLK_CNTL,
2614 		.shift = 0,
2615 		.width = 7,
2616 	},
2617 	.hw.init = &(struct clk_init_data) {
2618 		.name = "sd_emmc_c_clk0_div",
2619 		.ops = &clk_regmap_divider_ops,
2620 		.parent_hws = (const struct clk_hw *[]) {
2621 			&g12a_sd_emmc_c_clk0_sel.hw
2622 		},
2623 		.num_parents = 1,
2624 		.flags = CLK_SET_RATE_PARENT,
2625 	},
2626 };
2627 
2628 static struct clk_regmap g12a_sd_emmc_c_clk0 = {
2629 	.data = &(struct clk_regmap_gate_data){
2630 		.offset = HHI_NAND_CLK_CNTL,
2631 		.bit_idx = 7,
2632 	},
2633 	.hw.init = &(struct clk_init_data){
2634 		.name = "sd_emmc_c_clk0",
2635 		.ops = &clk_regmap_gate_ops,
2636 		.parent_hws = (const struct clk_hw *[]) {
2637 			&g12a_sd_emmc_c_clk0_div.hw
2638 		},
2639 		.num_parents = 1,
2640 		.flags = CLK_SET_RATE_PARENT,
2641 	},
2642 };
2643 
2644 /* Video Clocks */
2645 
2646 static struct clk_regmap g12a_vid_pll_div = {
2647 	.data = &(struct meson_vid_pll_div_data){
2648 		.val = {
2649 			.reg_off = HHI_VID_PLL_CLK_DIV,
2650 			.shift   = 0,
2651 			.width   = 15,
2652 		},
2653 		.sel = {
2654 			.reg_off = HHI_VID_PLL_CLK_DIV,
2655 			.shift   = 16,
2656 			.width   = 2,
2657 		},
2658 	},
2659 	.hw.init = &(struct clk_init_data) {
2660 		.name = "vid_pll_div",
2661 		.ops = &meson_vid_pll_div_ro_ops,
2662 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw },
2663 		.num_parents = 1,
2664 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2665 	},
2666 };
2667 
2668 static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
2669 	&g12a_vid_pll_div.hw,
2670 	&g12a_hdmi_pll.hw,
2671 };
2672 
2673 static struct clk_regmap g12a_vid_pll_sel = {
2674 	.data = &(struct clk_regmap_mux_data){
2675 		.offset = HHI_VID_PLL_CLK_DIV,
2676 		.mask = 0x1,
2677 		.shift = 18,
2678 	},
2679 	.hw.init = &(struct clk_init_data){
2680 		.name = "vid_pll_sel",
2681 		.ops = &clk_regmap_mux_ops,
2682 		/*
2683 		 * bit 18 selects from 2 possible parents:
2684 		 * vid_pll_div or hdmi_pll
2685 		 */
2686 		.parent_hws = g12a_vid_pll_parent_hws,
2687 		.num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws),
2688 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2689 	},
2690 };
2691 
2692 static struct clk_regmap g12a_vid_pll = {
2693 	.data = &(struct clk_regmap_gate_data){
2694 		.offset = HHI_VID_PLL_CLK_DIV,
2695 		.bit_idx = 19,
2696 	},
2697 	.hw.init = &(struct clk_init_data) {
2698 		.name = "vid_pll",
2699 		.ops = &clk_regmap_gate_ops,
2700 		.parent_hws = (const struct clk_hw *[]) {
2701 			&g12a_vid_pll_sel.hw
2702 		},
2703 		.num_parents = 1,
2704 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2705 	},
2706 };
2707 
2708 /* VPU Clock */
2709 
2710 static const struct clk_hw *g12a_vpu_parent_hws[] = {
2711 	&g12a_fclk_div3.hw,
2712 	&g12a_fclk_div4.hw,
2713 	&g12a_fclk_div5.hw,
2714 	&g12a_fclk_div7.hw,
2715 	&g12a_mpll1.hw,
2716 	&g12a_vid_pll.hw,
2717 	&g12a_hifi_pll.hw,
2718 	&g12a_gp0_pll.hw,
2719 };
2720 
2721 static struct clk_regmap g12a_vpu_0_sel = {
2722 	.data = &(struct clk_regmap_mux_data){
2723 		.offset = HHI_VPU_CLK_CNTL,
2724 		.mask = 0x7,
2725 		.shift = 9,
2726 	},
2727 	.hw.init = &(struct clk_init_data){
2728 		.name = "vpu_0_sel",
2729 		.ops = &clk_regmap_mux_ops,
2730 		.parent_hws = g12a_vpu_parent_hws,
2731 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
2732 		.flags = CLK_SET_RATE_NO_REPARENT,
2733 	},
2734 };
2735 
2736 static struct clk_regmap g12a_vpu_0_div = {
2737 	.data = &(struct clk_regmap_div_data){
2738 		.offset = HHI_VPU_CLK_CNTL,
2739 		.shift = 0,
2740 		.width = 7,
2741 	},
2742 	.hw.init = &(struct clk_init_data){
2743 		.name = "vpu_0_div",
2744 		.ops = &clk_regmap_divider_ops,
2745 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw },
2746 		.num_parents = 1,
2747 		.flags = CLK_SET_RATE_PARENT,
2748 	},
2749 };
2750 
2751 static struct clk_regmap g12a_vpu_0 = {
2752 	.data = &(struct clk_regmap_gate_data){
2753 		.offset = HHI_VPU_CLK_CNTL,
2754 		.bit_idx = 8,
2755 	},
2756 	.hw.init = &(struct clk_init_data) {
2757 		.name = "vpu_0",
2758 		.ops = &clk_regmap_gate_ops,
2759 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw },
2760 		.num_parents = 1,
2761 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2762 	},
2763 };
2764 
2765 static struct clk_regmap g12a_vpu_1_sel = {
2766 	.data = &(struct clk_regmap_mux_data){
2767 		.offset = HHI_VPU_CLK_CNTL,
2768 		.mask = 0x7,
2769 		.shift = 25,
2770 	},
2771 	.hw.init = &(struct clk_init_data){
2772 		.name = "vpu_1_sel",
2773 		.ops = &clk_regmap_mux_ops,
2774 		.parent_hws = g12a_vpu_parent_hws,
2775 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
2776 		.flags = CLK_SET_RATE_NO_REPARENT,
2777 	},
2778 };
2779 
2780 static struct clk_regmap g12a_vpu_1_div = {
2781 	.data = &(struct clk_regmap_div_data){
2782 		.offset = HHI_VPU_CLK_CNTL,
2783 		.shift = 16,
2784 		.width = 7,
2785 	},
2786 	.hw.init = &(struct clk_init_data){
2787 		.name = "vpu_1_div",
2788 		.ops = &clk_regmap_divider_ops,
2789 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw },
2790 		.num_parents = 1,
2791 		.flags = CLK_SET_RATE_PARENT,
2792 	},
2793 };
2794 
2795 static struct clk_regmap g12a_vpu_1 = {
2796 	.data = &(struct clk_regmap_gate_data){
2797 		.offset = HHI_VPU_CLK_CNTL,
2798 		.bit_idx = 24,
2799 	},
2800 	.hw.init = &(struct clk_init_data) {
2801 		.name = "vpu_1",
2802 		.ops = &clk_regmap_gate_ops,
2803 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw },
2804 		.num_parents = 1,
2805 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2806 	},
2807 };
2808 
2809 static struct clk_regmap g12a_vpu = {
2810 	.data = &(struct clk_regmap_mux_data){
2811 		.offset = HHI_VPU_CLK_CNTL,
2812 		.mask = 1,
2813 		.shift = 31,
2814 	},
2815 	.hw.init = &(struct clk_init_data){
2816 		.name = "vpu",
2817 		.ops = &clk_regmap_mux_ops,
2818 		/*
2819 		 * bit 31 selects from 2 possible parents:
2820 		 * vpu_0 or vpu_1
2821 		 */
2822 		.parent_hws = (const struct clk_hw *[]) {
2823 			&g12a_vpu_0.hw,
2824 			&g12a_vpu_1.hw,
2825 		},
2826 		.num_parents = 2,
2827 		.flags = CLK_SET_RATE_NO_REPARENT,
2828 	},
2829 };
2830 
2831 /* VDEC clocks */
2832 
2833 static const struct clk_hw *g12a_vdec_parent_hws[] = {
2834 	&g12a_fclk_div2p5.hw,
2835 	&g12a_fclk_div3.hw,
2836 	&g12a_fclk_div4.hw,
2837 	&g12a_fclk_div5.hw,
2838 	&g12a_fclk_div7.hw,
2839 	&g12a_hifi_pll.hw,
2840 	&g12a_gp0_pll.hw,
2841 };
2842 
2843 static struct clk_regmap g12a_vdec_1_sel = {
2844 	.data = &(struct clk_regmap_mux_data){
2845 		.offset = HHI_VDEC_CLK_CNTL,
2846 		.mask = 0x7,
2847 		.shift = 9,
2848 		.flags = CLK_MUX_ROUND_CLOSEST,
2849 	},
2850 	.hw.init = &(struct clk_init_data){
2851 		.name = "vdec_1_sel",
2852 		.ops = &clk_regmap_mux_ops,
2853 		.parent_hws = g12a_vdec_parent_hws,
2854 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2855 		.flags = CLK_SET_RATE_PARENT,
2856 	},
2857 };
2858 
2859 static struct clk_regmap g12a_vdec_1_div = {
2860 	.data = &(struct clk_regmap_div_data){
2861 		.offset = HHI_VDEC_CLK_CNTL,
2862 		.shift = 0,
2863 		.width = 7,
2864 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
2865 	},
2866 	.hw.init = &(struct clk_init_data){
2867 		.name = "vdec_1_div",
2868 		.ops = &clk_regmap_divider_ops,
2869 		.parent_hws = (const struct clk_hw *[]) {
2870 			&g12a_vdec_1_sel.hw
2871 		},
2872 		.num_parents = 1,
2873 		.flags = CLK_SET_RATE_PARENT,
2874 	},
2875 };
2876 
2877 static struct clk_regmap g12a_vdec_1 = {
2878 	.data = &(struct clk_regmap_gate_data){
2879 		.offset = HHI_VDEC_CLK_CNTL,
2880 		.bit_idx = 8,
2881 	},
2882 	.hw.init = &(struct clk_init_data) {
2883 		.name = "vdec_1",
2884 		.ops = &clk_regmap_gate_ops,
2885 		.parent_hws = (const struct clk_hw *[]) {
2886 			&g12a_vdec_1_div.hw
2887 		},
2888 		.num_parents = 1,
2889 		.flags = CLK_SET_RATE_PARENT,
2890 	},
2891 };
2892 
2893 static struct clk_regmap g12a_vdec_hevcf_sel = {
2894 	.data = &(struct clk_regmap_mux_data){
2895 		.offset = HHI_VDEC2_CLK_CNTL,
2896 		.mask = 0x7,
2897 		.shift = 9,
2898 		.flags = CLK_MUX_ROUND_CLOSEST,
2899 	},
2900 	.hw.init = &(struct clk_init_data){
2901 		.name = "vdec_hevcf_sel",
2902 		.ops = &clk_regmap_mux_ops,
2903 		.parent_hws = g12a_vdec_parent_hws,
2904 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2905 		.flags = CLK_SET_RATE_PARENT,
2906 	},
2907 };
2908 
2909 static struct clk_regmap g12a_vdec_hevcf_div = {
2910 	.data = &(struct clk_regmap_div_data){
2911 		.offset = HHI_VDEC2_CLK_CNTL,
2912 		.shift = 0,
2913 		.width = 7,
2914 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
2915 	},
2916 	.hw.init = &(struct clk_init_data){
2917 		.name = "vdec_hevcf_div",
2918 		.ops = &clk_regmap_divider_ops,
2919 		.parent_hws = (const struct clk_hw *[]) {
2920 			&g12a_vdec_hevcf_sel.hw
2921 		},
2922 		.num_parents = 1,
2923 		.flags = CLK_SET_RATE_PARENT,
2924 	},
2925 };
2926 
2927 static struct clk_regmap g12a_vdec_hevcf = {
2928 	.data = &(struct clk_regmap_gate_data){
2929 		.offset = HHI_VDEC2_CLK_CNTL,
2930 		.bit_idx = 8,
2931 	},
2932 	.hw.init = &(struct clk_init_data) {
2933 		.name = "vdec_hevcf",
2934 		.ops = &clk_regmap_gate_ops,
2935 		.parent_hws = (const struct clk_hw *[]) {
2936 			&g12a_vdec_hevcf_div.hw
2937 		},
2938 		.num_parents = 1,
2939 		.flags = CLK_SET_RATE_PARENT,
2940 	},
2941 };
2942 
2943 static struct clk_regmap g12a_vdec_hevc_sel = {
2944 	.data = &(struct clk_regmap_mux_data){
2945 		.offset = HHI_VDEC2_CLK_CNTL,
2946 		.mask = 0x7,
2947 		.shift = 25,
2948 		.flags = CLK_MUX_ROUND_CLOSEST,
2949 	},
2950 	.hw.init = &(struct clk_init_data){
2951 		.name = "vdec_hevc_sel",
2952 		.ops = &clk_regmap_mux_ops,
2953 		.parent_hws = g12a_vdec_parent_hws,
2954 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2955 		.flags = CLK_SET_RATE_PARENT,
2956 	},
2957 };
2958 
2959 static struct clk_regmap g12a_vdec_hevc_div = {
2960 	.data = &(struct clk_regmap_div_data){
2961 		.offset = HHI_VDEC2_CLK_CNTL,
2962 		.shift = 16,
2963 		.width = 7,
2964 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
2965 	},
2966 	.hw.init = &(struct clk_init_data){
2967 		.name = "vdec_hevc_div",
2968 		.ops = &clk_regmap_divider_ops,
2969 		.parent_hws = (const struct clk_hw *[]) {
2970 			&g12a_vdec_hevc_sel.hw
2971 		},
2972 		.num_parents = 1,
2973 		.flags = CLK_SET_RATE_PARENT,
2974 	},
2975 };
2976 
2977 static struct clk_regmap g12a_vdec_hevc = {
2978 	.data = &(struct clk_regmap_gate_data){
2979 		.offset = HHI_VDEC2_CLK_CNTL,
2980 		.bit_idx = 24,
2981 	},
2982 	.hw.init = &(struct clk_init_data) {
2983 		.name = "vdec_hevc",
2984 		.ops = &clk_regmap_gate_ops,
2985 		.parent_hws = (const struct clk_hw *[]) {
2986 			&g12a_vdec_hevc_div.hw
2987 		},
2988 		.num_parents = 1,
2989 		.flags = CLK_SET_RATE_PARENT,
2990 	},
2991 };
2992 
2993 /* VAPB Clock */
2994 
2995 static const struct clk_hw *g12a_vapb_parent_hws[] = {
2996 	&g12a_fclk_div4.hw,
2997 	&g12a_fclk_div3.hw,
2998 	&g12a_fclk_div5.hw,
2999 	&g12a_fclk_div7.hw,
3000 	&g12a_mpll1.hw,
3001 	&g12a_vid_pll.hw,
3002 	&g12a_mpll2.hw,
3003 	&g12a_fclk_div2p5.hw,
3004 };
3005 
3006 static struct clk_regmap g12a_vapb_0_sel = {
3007 	.data = &(struct clk_regmap_mux_data){
3008 		.offset = HHI_VAPBCLK_CNTL,
3009 		.mask = 0x3,
3010 		.shift = 9,
3011 	},
3012 	.hw.init = &(struct clk_init_data){
3013 		.name = "vapb_0_sel",
3014 		.ops = &clk_regmap_mux_ops,
3015 		.parent_hws = g12a_vapb_parent_hws,
3016 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
3017 		.flags = CLK_SET_RATE_NO_REPARENT,
3018 	},
3019 };
3020 
3021 static struct clk_regmap g12a_vapb_0_div = {
3022 	.data = &(struct clk_regmap_div_data){
3023 		.offset = HHI_VAPBCLK_CNTL,
3024 		.shift = 0,
3025 		.width = 7,
3026 	},
3027 	.hw.init = &(struct clk_init_data){
3028 		.name = "vapb_0_div",
3029 		.ops = &clk_regmap_divider_ops,
3030 		.parent_hws = (const struct clk_hw *[]) {
3031 			&g12a_vapb_0_sel.hw
3032 		},
3033 		.num_parents = 1,
3034 		.flags = CLK_SET_RATE_PARENT,
3035 	},
3036 };
3037 
3038 static struct clk_regmap g12a_vapb_0 = {
3039 	.data = &(struct clk_regmap_gate_data){
3040 		.offset = HHI_VAPBCLK_CNTL,
3041 		.bit_idx = 8,
3042 	},
3043 	.hw.init = &(struct clk_init_data) {
3044 		.name = "vapb_0",
3045 		.ops = &clk_regmap_gate_ops,
3046 		.parent_hws = (const struct clk_hw *[]) {
3047 			&g12a_vapb_0_div.hw
3048 		},
3049 		.num_parents = 1,
3050 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3051 	},
3052 };
3053 
3054 static struct clk_regmap g12a_vapb_1_sel = {
3055 	.data = &(struct clk_regmap_mux_data){
3056 		.offset = HHI_VAPBCLK_CNTL,
3057 		.mask = 0x3,
3058 		.shift = 25,
3059 	},
3060 	.hw.init = &(struct clk_init_data){
3061 		.name = "vapb_1_sel",
3062 		.ops = &clk_regmap_mux_ops,
3063 		.parent_hws = g12a_vapb_parent_hws,
3064 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
3065 		.flags = CLK_SET_RATE_NO_REPARENT,
3066 	},
3067 };
3068 
3069 static struct clk_regmap g12a_vapb_1_div = {
3070 	.data = &(struct clk_regmap_div_data){
3071 		.offset = HHI_VAPBCLK_CNTL,
3072 		.shift = 16,
3073 		.width = 7,
3074 	},
3075 	.hw.init = &(struct clk_init_data){
3076 		.name = "vapb_1_div",
3077 		.ops = &clk_regmap_divider_ops,
3078 		.parent_hws = (const struct clk_hw *[]) {
3079 			&g12a_vapb_1_sel.hw
3080 		},
3081 		.num_parents = 1,
3082 		.flags = CLK_SET_RATE_PARENT,
3083 	},
3084 };
3085 
3086 static struct clk_regmap g12a_vapb_1 = {
3087 	.data = &(struct clk_regmap_gate_data){
3088 		.offset = HHI_VAPBCLK_CNTL,
3089 		.bit_idx = 24,
3090 	},
3091 	.hw.init = &(struct clk_init_data) {
3092 		.name = "vapb_1",
3093 		.ops = &clk_regmap_gate_ops,
3094 		.parent_hws = (const struct clk_hw *[]) {
3095 			&g12a_vapb_1_div.hw
3096 		},
3097 		.num_parents = 1,
3098 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3099 	},
3100 };
3101 
3102 static struct clk_regmap g12a_vapb_sel = {
3103 	.data = &(struct clk_regmap_mux_data){
3104 		.offset = HHI_VAPBCLK_CNTL,
3105 		.mask = 1,
3106 		.shift = 31,
3107 	},
3108 	.hw.init = &(struct clk_init_data){
3109 		.name = "vapb_sel",
3110 		.ops = &clk_regmap_mux_ops,
3111 		/*
3112 		 * bit 31 selects from 2 possible parents:
3113 		 * vapb_0 or vapb_1
3114 		 */
3115 		.parent_hws = (const struct clk_hw *[]) {
3116 			&g12a_vapb_0.hw,
3117 			&g12a_vapb_1.hw,
3118 		},
3119 		.num_parents = 2,
3120 		.flags = CLK_SET_RATE_NO_REPARENT,
3121 	},
3122 };
3123 
3124 static struct clk_regmap g12a_vapb = {
3125 	.data = &(struct clk_regmap_gate_data){
3126 		.offset = HHI_VAPBCLK_CNTL,
3127 		.bit_idx = 30,
3128 	},
3129 	.hw.init = &(struct clk_init_data) {
3130 		.name = "vapb",
3131 		.ops = &clk_regmap_gate_ops,
3132 		.parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw },
3133 		.num_parents = 1,
3134 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3135 	},
3136 };
3137 
3138 static const struct clk_hw *g12a_vclk_parent_hws[] = {
3139 	&g12a_vid_pll.hw,
3140 	&g12a_gp0_pll.hw,
3141 	&g12a_hifi_pll.hw,
3142 	&g12a_mpll1.hw,
3143 	&g12a_fclk_div3.hw,
3144 	&g12a_fclk_div4.hw,
3145 	&g12a_fclk_div5.hw,
3146 	&g12a_fclk_div7.hw,
3147 };
3148 
3149 static struct clk_regmap g12a_vclk_sel = {
3150 	.data = &(struct clk_regmap_mux_data){
3151 		.offset = HHI_VID_CLK_CNTL,
3152 		.mask = 0x7,
3153 		.shift = 16,
3154 	},
3155 	.hw.init = &(struct clk_init_data){
3156 		.name = "vclk_sel",
3157 		.ops = &clk_regmap_mux_ops,
3158 		.parent_hws = g12a_vclk_parent_hws,
3159 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3160 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3161 	},
3162 };
3163 
3164 static struct clk_regmap g12a_vclk2_sel = {
3165 	.data = &(struct clk_regmap_mux_data){
3166 		.offset = HHI_VIID_CLK_CNTL,
3167 		.mask = 0x7,
3168 		.shift = 16,
3169 	},
3170 	.hw.init = &(struct clk_init_data){
3171 		.name = "vclk2_sel",
3172 		.ops = &clk_regmap_mux_ops,
3173 		.parent_hws = g12a_vclk_parent_hws,
3174 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3175 		.flags = CLK_SET_RATE_NO_REPARENT,
3176 	},
3177 };
3178 
3179 static struct clk_regmap g12a_vclk_input = {
3180 	.data = &(struct clk_regmap_gate_data){
3181 		.offset = HHI_VID_CLK_DIV,
3182 		.bit_idx = 16,
3183 	},
3184 	.hw.init = &(struct clk_init_data) {
3185 		.name = "vclk_input",
3186 		.ops = &clk_regmap_gate_ops,
3187 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw },
3188 		.num_parents = 1,
3189 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3190 	},
3191 };
3192 
3193 static struct clk_regmap g12a_vclk2_input = {
3194 	.data = &(struct clk_regmap_gate_data){
3195 		.offset = HHI_VIID_CLK_DIV,
3196 		.bit_idx = 16,
3197 	},
3198 	.hw.init = &(struct clk_init_data) {
3199 		.name = "vclk2_input",
3200 		.ops = &clk_regmap_gate_ops,
3201 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw },
3202 		.num_parents = 1,
3203 	},
3204 };
3205 
3206 static struct clk_regmap g12a_vclk_div = {
3207 	.data = &(struct clk_regmap_div_data){
3208 		.offset = HHI_VID_CLK_DIV,
3209 		.shift = 0,
3210 		.width = 8,
3211 	},
3212 	.hw.init = &(struct clk_init_data){
3213 		.name = "vclk_div",
3214 		.ops = &clk_regmap_divider_ops,
3215 		.parent_hws = (const struct clk_hw *[]) {
3216 			&g12a_vclk_input.hw
3217 		},
3218 		.num_parents = 1,
3219 		.flags = CLK_GET_RATE_NOCACHE,
3220 	},
3221 };
3222 
3223 static struct clk_regmap g12a_vclk2_div = {
3224 	.data = &(struct meson_vclk_div_data){
3225 		.div = {
3226 			.reg_off = HHI_VIID_CLK_DIV,
3227 			.shift   = 0,
3228 			.width   = 8,
3229 		},
3230 		.enable = {
3231 			.reg_off = HHI_VIID_CLK_DIV,
3232 			.shift   = 16,
3233 			.width   = 1,
3234 		},
3235 		.reset = {
3236 			.reg_off = HHI_VIID_CLK_DIV,
3237 			.shift   = 17,
3238 			.width   = 1,
3239 		},
3240 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
3241 	},
3242 	.hw.init = &(struct clk_init_data){
3243 		.name = "vclk2_div",
3244 		.ops = &meson_vclk_div_ops,
3245 		.parent_hws = (const struct clk_hw *[]) {
3246 			&g12a_vclk2_input.hw
3247 		},
3248 		.num_parents = 1,
3249 		.flags = CLK_SET_RATE_GATE,
3250 	},
3251 };
3252 
3253 static struct clk_regmap g12a_vclk = {
3254 	.data = &(struct clk_regmap_gate_data){
3255 		.offset = HHI_VID_CLK_CNTL,
3256 		.bit_idx = 19,
3257 	},
3258 	.hw.init = &(struct clk_init_data) {
3259 		.name = "vclk",
3260 		.ops = &clk_regmap_gate_ops,
3261 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw },
3262 		.num_parents = 1,
3263 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3264 	},
3265 };
3266 
3267 static struct clk_regmap g12a_vclk2 = {
3268 	.data = &(struct meson_vclk_gate_data){
3269 		.enable = {
3270 			.reg_off = HHI_VIID_CLK_CNTL,
3271 			.shift   = 19,
3272 			.width   = 1,
3273 		},
3274 		.reset = {
3275 			.reg_off = HHI_VIID_CLK_CNTL,
3276 			.shift   = 15,
3277 			.width   = 1,
3278 		},
3279 	},
3280 	.hw.init = &(struct clk_init_data) {
3281 		.name = "vclk2",
3282 		.ops = &meson_vclk_gate_ops,
3283 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw },
3284 		.num_parents = 1,
3285 		.flags = CLK_SET_RATE_PARENT,
3286 	},
3287 };
3288 
3289 static struct clk_regmap g12a_vclk_div1 = {
3290 	.data = &(struct clk_regmap_gate_data){
3291 		.offset = HHI_VID_CLK_CNTL,
3292 		.bit_idx = 0,
3293 	},
3294 	.hw.init = &(struct clk_init_data) {
3295 		.name = "vclk_div1",
3296 		.ops = &clk_regmap_gate_ops,
3297 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3298 		.num_parents = 1,
3299 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3300 	},
3301 };
3302 
3303 static struct clk_regmap g12a_vclk_div2_en = {
3304 	.data = &(struct clk_regmap_gate_data){
3305 		.offset = HHI_VID_CLK_CNTL,
3306 		.bit_idx = 1,
3307 	},
3308 	.hw.init = &(struct clk_init_data) {
3309 		.name = "vclk_div2_en",
3310 		.ops = &clk_regmap_gate_ops,
3311 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3312 		.num_parents = 1,
3313 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3314 	},
3315 };
3316 
3317 static struct clk_regmap g12a_vclk_div4_en = {
3318 	.data = &(struct clk_regmap_gate_data){
3319 		.offset = HHI_VID_CLK_CNTL,
3320 		.bit_idx = 2,
3321 	},
3322 	.hw.init = &(struct clk_init_data) {
3323 		.name = "vclk_div4_en",
3324 		.ops = &clk_regmap_gate_ops,
3325 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3326 		.num_parents = 1,
3327 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3328 	},
3329 };
3330 
3331 static struct clk_regmap g12a_vclk_div6_en = {
3332 	.data = &(struct clk_regmap_gate_data){
3333 		.offset = HHI_VID_CLK_CNTL,
3334 		.bit_idx = 3,
3335 	},
3336 	.hw.init = &(struct clk_init_data) {
3337 		.name = "vclk_div6_en",
3338 		.ops = &clk_regmap_gate_ops,
3339 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3340 		.num_parents = 1,
3341 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3342 	},
3343 };
3344 
3345 static struct clk_regmap g12a_vclk_div12_en = {
3346 	.data = &(struct clk_regmap_gate_data){
3347 		.offset = HHI_VID_CLK_CNTL,
3348 		.bit_idx = 4,
3349 	},
3350 	.hw.init = &(struct clk_init_data) {
3351 		.name = "vclk_div12_en",
3352 		.ops = &clk_regmap_gate_ops,
3353 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3354 		.num_parents = 1,
3355 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3356 	},
3357 };
3358 
3359 static struct clk_regmap g12a_vclk2_div1 = {
3360 	.data = &(struct clk_regmap_gate_data){
3361 		.offset = HHI_VIID_CLK_CNTL,
3362 		.bit_idx = 0,
3363 	},
3364 	.hw.init = &(struct clk_init_data) {
3365 		.name = "vclk2_div1",
3366 		.ops = &clk_regmap_gate_ops,
3367 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3368 		.num_parents = 1,
3369 		.flags = CLK_SET_RATE_PARENT,
3370 	},
3371 };
3372 
3373 static struct clk_regmap g12a_vclk2_div2_en = {
3374 	.data = &(struct clk_regmap_gate_data){
3375 		.offset = HHI_VIID_CLK_CNTL,
3376 		.bit_idx = 1,
3377 	},
3378 	.hw.init = &(struct clk_init_data) {
3379 		.name = "vclk2_div2_en",
3380 		.ops = &clk_regmap_gate_ops,
3381 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3382 		.num_parents = 1,
3383 		.flags = CLK_SET_RATE_PARENT,
3384 	},
3385 };
3386 
3387 static struct clk_regmap g12a_vclk2_div4_en = {
3388 	.data = &(struct clk_regmap_gate_data){
3389 		.offset = HHI_VIID_CLK_CNTL,
3390 		.bit_idx = 2,
3391 	},
3392 	.hw.init = &(struct clk_init_data) {
3393 		.name = "vclk2_div4_en",
3394 		.ops = &clk_regmap_gate_ops,
3395 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3396 		.num_parents = 1,
3397 		.flags = CLK_SET_RATE_PARENT,
3398 	},
3399 };
3400 
3401 static struct clk_regmap g12a_vclk2_div6_en = {
3402 	.data = &(struct clk_regmap_gate_data){
3403 		.offset = HHI_VIID_CLK_CNTL,
3404 		.bit_idx = 3,
3405 	},
3406 	.hw.init = &(struct clk_init_data) {
3407 		.name = "vclk2_div6_en",
3408 		.ops = &clk_regmap_gate_ops,
3409 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3410 		.num_parents = 1,
3411 		.flags = CLK_SET_RATE_PARENT,
3412 	},
3413 };
3414 
3415 static struct clk_regmap g12a_vclk2_div12_en = {
3416 	.data = &(struct clk_regmap_gate_data){
3417 		.offset = HHI_VIID_CLK_CNTL,
3418 		.bit_idx = 4,
3419 	},
3420 	.hw.init = &(struct clk_init_data) {
3421 		.name = "vclk2_div12_en",
3422 		.ops = &clk_regmap_gate_ops,
3423 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3424 		.num_parents = 1,
3425 		.flags = CLK_SET_RATE_PARENT,
3426 	},
3427 };
3428 
3429 static struct clk_fixed_factor g12a_vclk_div2 = {
3430 	.mult = 1,
3431 	.div = 2,
3432 	.hw.init = &(struct clk_init_data){
3433 		.name = "vclk_div2",
3434 		.ops = &clk_fixed_factor_ops,
3435 		.parent_hws = (const struct clk_hw *[]) {
3436 			&g12a_vclk_div2_en.hw
3437 		},
3438 		.num_parents = 1,
3439 	},
3440 };
3441 
3442 static struct clk_fixed_factor g12a_vclk_div4 = {
3443 	.mult = 1,
3444 	.div = 4,
3445 	.hw.init = &(struct clk_init_data){
3446 		.name = "vclk_div4",
3447 		.ops = &clk_fixed_factor_ops,
3448 		.parent_hws = (const struct clk_hw *[]) {
3449 			&g12a_vclk_div4_en.hw
3450 		},
3451 		.num_parents = 1,
3452 	},
3453 };
3454 
3455 static struct clk_fixed_factor g12a_vclk_div6 = {
3456 	.mult = 1,
3457 	.div = 6,
3458 	.hw.init = &(struct clk_init_data){
3459 		.name = "vclk_div6",
3460 		.ops = &clk_fixed_factor_ops,
3461 		.parent_hws = (const struct clk_hw *[]) {
3462 			&g12a_vclk_div6_en.hw
3463 		},
3464 		.num_parents = 1,
3465 	},
3466 };
3467 
3468 static struct clk_fixed_factor g12a_vclk_div12 = {
3469 	.mult = 1,
3470 	.div = 12,
3471 	.hw.init = &(struct clk_init_data){
3472 		.name = "vclk_div12",
3473 		.ops = &clk_fixed_factor_ops,
3474 		.parent_hws = (const struct clk_hw *[]) {
3475 			&g12a_vclk_div12_en.hw
3476 		},
3477 		.num_parents = 1,
3478 	},
3479 };
3480 
3481 static struct clk_fixed_factor g12a_vclk2_div2 = {
3482 	.mult = 1,
3483 	.div = 2,
3484 	.hw.init = &(struct clk_init_data){
3485 		.name = "vclk2_div2",
3486 		.ops = &clk_fixed_factor_ops,
3487 		.parent_hws = (const struct clk_hw *[]) {
3488 			&g12a_vclk2_div2_en.hw
3489 		},
3490 		.num_parents = 1,
3491 		.flags = CLK_SET_RATE_PARENT,
3492 	},
3493 };
3494 
3495 static struct clk_fixed_factor g12a_vclk2_div4 = {
3496 	.mult = 1,
3497 	.div = 4,
3498 	.hw.init = &(struct clk_init_data){
3499 		.name = "vclk2_div4",
3500 		.ops = &clk_fixed_factor_ops,
3501 		.parent_hws = (const struct clk_hw *[]) {
3502 			&g12a_vclk2_div4_en.hw
3503 		},
3504 		.num_parents = 1,
3505 		.flags = CLK_SET_RATE_PARENT,
3506 	},
3507 };
3508 
3509 static struct clk_fixed_factor g12a_vclk2_div6 = {
3510 	.mult = 1,
3511 	.div = 6,
3512 	.hw.init = &(struct clk_init_data){
3513 		.name = "vclk2_div6",
3514 		.ops = &clk_fixed_factor_ops,
3515 		.parent_hws = (const struct clk_hw *[]) {
3516 			&g12a_vclk2_div6_en.hw
3517 		},
3518 		.num_parents = 1,
3519 		.flags = CLK_SET_RATE_PARENT,
3520 	},
3521 };
3522 
3523 static struct clk_fixed_factor g12a_vclk2_div12 = {
3524 	.mult = 1,
3525 	.div = 12,
3526 	.hw.init = &(struct clk_init_data){
3527 		.name = "vclk2_div12",
3528 		.ops = &clk_fixed_factor_ops,
3529 		.parent_hws = (const struct clk_hw *[]) {
3530 			&g12a_vclk2_div12_en.hw
3531 		},
3532 		.num_parents = 1,
3533 		.flags = CLK_SET_RATE_PARENT,
3534 	},
3535 };
3536 
3537 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3538 static const struct clk_hw *g12a_cts_parent_hws[] = {
3539 	&g12a_vclk_div1.hw,
3540 	&g12a_vclk_div2.hw,
3541 	&g12a_vclk_div4.hw,
3542 	&g12a_vclk_div6.hw,
3543 	&g12a_vclk_div12.hw,
3544 	&g12a_vclk2_div1.hw,
3545 	&g12a_vclk2_div2.hw,
3546 	&g12a_vclk2_div4.hw,
3547 	&g12a_vclk2_div6.hw,
3548 	&g12a_vclk2_div12.hw,
3549 };
3550 
3551 static struct clk_regmap g12a_cts_enci_sel = {
3552 	.data = &(struct clk_regmap_mux_data){
3553 		.offset = HHI_VID_CLK_DIV,
3554 		.mask = 0xf,
3555 		.shift = 28,
3556 		.table = mux_table_cts_sel,
3557 	},
3558 	.hw.init = &(struct clk_init_data){
3559 		.name = "cts_enci_sel",
3560 		.ops = &clk_regmap_mux_ops,
3561 		.parent_hws = g12a_cts_parent_hws,
3562 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3563 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3564 	},
3565 };
3566 
3567 static struct clk_regmap g12a_cts_encp_sel = {
3568 	.data = &(struct clk_regmap_mux_data){
3569 		.offset = HHI_VID_CLK_DIV,
3570 		.mask = 0xf,
3571 		.shift = 20,
3572 		.table = mux_table_cts_sel,
3573 	},
3574 	.hw.init = &(struct clk_init_data){
3575 		.name = "cts_encp_sel",
3576 		.ops = &clk_regmap_mux_ops,
3577 		.parent_hws = g12a_cts_parent_hws,
3578 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3579 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3580 	},
3581 };
3582 
3583 static struct clk_regmap g12a_cts_encl_sel = {
3584 	.data = &(struct clk_regmap_mux_data){
3585 		.offset = HHI_VIID_CLK_DIV,
3586 		.mask = 0xf,
3587 		.shift = 12,
3588 		.table = mux_table_cts_sel,
3589 	},
3590 	.hw.init = &(struct clk_init_data){
3591 		.name = "cts_encl_sel",
3592 		.ops = &clk_regmap_mux_ops,
3593 		.parent_hws = g12a_cts_parent_hws,
3594 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3595 		.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
3596 	},
3597 };
3598 
3599 static struct clk_regmap g12a_cts_vdac_sel = {
3600 	.data = &(struct clk_regmap_mux_data){
3601 		.offset = HHI_VIID_CLK_DIV,
3602 		.mask = 0xf,
3603 		.shift = 28,
3604 		.table = mux_table_cts_sel,
3605 	},
3606 	.hw.init = &(struct clk_init_data){
3607 		.name = "cts_vdac_sel",
3608 		.ops = &clk_regmap_mux_ops,
3609 		.parent_hws = g12a_cts_parent_hws,
3610 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3611 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3612 	},
3613 };
3614 
3615 /* TOFIX: add support for cts_tcon */
3616 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3617 static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = {
3618 	&g12a_vclk_div1.hw,
3619 	&g12a_vclk_div2.hw,
3620 	&g12a_vclk_div4.hw,
3621 	&g12a_vclk_div6.hw,
3622 	&g12a_vclk_div12.hw,
3623 	&g12a_vclk2_div1.hw,
3624 	&g12a_vclk2_div2.hw,
3625 	&g12a_vclk2_div4.hw,
3626 	&g12a_vclk2_div6.hw,
3627 	&g12a_vclk2_div12.hw,
3628 };
3629 
3630 static struct clk_regmap g12a_hdmi_tx_sel = {
3631 	.data = &(struct clk_regmap_mux_data){
3632 		.offset = HHI_HDMI_CLK_CNTL,
3633 		.mask = 0xf,
3634 		.shift = 16,
3635 		.table = mux_table_hdmi_tx_sel,
3636 	},
3637 	.hw.init = &(struct clk_init_data){
3638 		.name = "hdmi_tx_sel",
3639 		.ops = &clk_regmap_mux_ops,
3640 		.parent_hws = g12a_cts_hdmi_tx_parent_hws,
3641 		.num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws),
3642 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3643 	},
3644 };
3645 
3646 static struct clk_regmap g12a_cts_enci = {
3647 	.data = &(struct clk_regmap_gate_data){
3648 		.offset = HHI_VID_CLK_CNTL2,
3649 		.bit_idx = 0,
3650 	},
3651 	.hw.init = &(struct clk_init_data) {
3652 		.name = "cts_enci",
3653 		.ops = &clk_regmap_gate_ops,
3654 		.parent_hws = (const struct clk_hw *[]) {
3655 			&g12a_cts_enci_sel.hw
3656 		},
3657 		.num_parents = 1,
3658 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3659 	},
3660 };
3661 
3662 static struct clk_regmap g12a_cts_encp = {
3663 	.data = &(struct clk_regmap_gate_data){
3664 		.offset = HHI_VID_CLK_CNTL2,
3665 		.bit_idx = 2,
3666 	},
3667 	.hw.init = &(struct clk_init_data) {
3668 		.name = "cts_encp",
3669 		.ops = &clk_regmap_gate_ops,
3670 		.parent_hws = (const struct clk_hw *[]) {
3671 			&g12a_cts_encp_sel.hw
3672 		},
3673 		.num_parents = 1,
3674 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3675 	},
3676 };
3677 
3678 static struct clk_regmap g12a_cts_encl = {
3679 	.data = &(struct clk_regmap_gate_data){
3680 		.offset = HHI_VID_CLK_CNTL2,
3681 		.bit_idx = 3,
3682 	},
3683 	.hw.init = &(struct clk_init_data) {
3684 		.name = "cts_encl",
3685 		.ops = &clk_regmap_gate_ops,
3686 		.parent_hws = (const struct clk_hw *[]) {
3687 			&g12a_cts_encl_sel.hw
3688 		},
3689 		.num_parents = 1,
3690 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3691 	},
3692 };
3693 
3694 static struct clk_regmap g12a_cts_vdac = {
3695 	.data = &(struct clk_regmap_gate_data){
3696 		.offset = HHI_VID_CLK_CNTL2,
3697 		.bit_idx = 4,
3698 	},
3699 	.hw.init = &(struct clk_init_data) {
3700 		.name = "cts_vdac",
3701 		.ops = &clk_regmap_gate_ops,
3702 		.parent_hws = (const struct clk_hw *[]) {
3703 			&g12a_cts_vdac_sel.hw
3704 		},
3705 		.num_parents = 1,
3706 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3707 	},
3708 };
3709 
3710 static struct clk_regmap g12a_hdmi_tx = {
3711 	.data = &(struct clk_regmap_gate_data){
3712 		.offset = HHI_VID_CLK_CNTL2,
3713 		.bit_idx = 5,
3714 	},
3715 	.hw.init = &(struct clk_init_data) {
3716 		.name = "hdmi_tx",
3717 		.ops = &clk_regmap_gate_ops,
3718 		.parent_hws = (const struct clk_hw *[]) {
3719 			&g12a_hdmi_tx_sel.hw
3720 		},
3721 		.num_parents = 1,
3722 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3723 	},
3724 };
3725 
3726 /* MIPI DSI Host Clocks */
3727 
3728 static const struct clk_hw *g12a_mipi_dsi_pxclk_parent_hws[] = {
3729 	&g12a_vid_pll.hw,
3730 	&g12a_gp0_pll.hw,
3731 	&g12a_hifi_pll.hw,
3732 	&g12a_mpll1.hw,
3733 	&g12a_fclk_div2.hw,
3734 	&g12a_fclk_div2p5.hw,
3735 	&g12a_fclk_div3.hw,
3736 	&g12a_fclk_div7.hw,
3737 };
3738 
3739 static struct clk_regmap g12a_mipi_dsi_pxclk_sel = {
3740 	.data = &(struct clk_regmap_mux_data){
3741 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
3742 		.mask = 0x7,
3743 		.shift = 12,
3744 		.flags = CLK_MUX_ROUND_CLOSEST,
3745 	},
3746 	.hw.init = &(struct clk_init_data){
3747 		.name = "mipi_dsi_pxclk_sel",
3748 		.ops = &clk_regmap_mux_ops,
3749 		.parent_hws = g12a_mipi_dsi_pxclk_parent_hws,
3750 		.num_parents = ARRAY_SIZE(g12a_mipi_dsi_pxclk_parent_hws),
3751 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
3752 	},
3753 };
3754 
3755 /*
3756  * FIXME: Force as bypass by forcing a single /1 table entry, and doensn't on boot value
3757  * when setting a clock whith this node in the clock path, but doesn't garantee the divider
3758  * is at /1 at boot until a rate is set.
3759  */
3760 static const struct clk_div_table g12a_mipi_dsi_pxclk_div_table[] = {
3761 	{ .val = 0, .div = 1 },
3762 	{ /* sentinel */ },
3763 };
3764 
3765 static struct clk_regmap g12a_mipi_dsi_pxclk_div = {
3766 	.data = &(struct clk_regmap_div_data){
3767 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
3768 		.shift = 0,
3769 		.width = 7,
3770 		.table = g12a_mipi_dsi_pxclk_div_table,
3771 	},
3772 	.hw.init = &(struct clk_init_data){
3773 		.name = "mipi_dsi_pxclk_div",
3774 		.ops = &clk_regmap_divider_ops,
3775 		.parent_hws = (const struct clk_hw *[]) {
3776 			&g12a_mipi_dsi_pxclk_sel.hw
3777 		},
3778 		.num_parents = 1,
3779 		.flags = CLK_SET_RATE_PARENT,
3780 	},
3781 };
3782 
3783 static struct clk_regmap g12a_mipi_dsi_pxclk = {
3784 	.data = &(struct clk_regmap_gate_data){
3785 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
3786 		.bit_idx = 8,
3787 	},
3788 	.hw.init = &(struct clk_init_data) {
3789 		.name = "mipi_dsi_pxclk",
3790 		.ops = &clk_regmap_gate_ops,
3791 		.parent_hws = (const struct clk_hw *[]) {
3792 			&g12a_mipi_dsi_pxclk_div.hw
3793 		},
3794 		.num_parents = 1,
3795 		.flags = CLK_SET_RATE_PARENT,
3796 	},
3797 };
3798 
3799 /* MIPI ISP Clocks */
3800 
3801 static const struct clk_parent_data g12b_mipi_isp_parent_data[] = {
3802 	{ .fw_name = "xtal", },
3803 	{ .hw = &g12a_gp0_pll.hw },
3804 	{ .hw = &g12a_hifi_pll.hw },
3805 	{ .hw = &g12a_fclk_div2p5.hw },
3806 	{ .hw = &g12a_fclk_div3.hw },
3807 	{ .hw = &g12a_fclk_div4.hw },
3808 	{ .hw = &g12a_fclk_div5.hw },
3809 	{ .hw = &g12a_fclk_div7.hw },
3810 };
3811 
3812 static struct clk_regmap g12b_mipi_isp_sel = {
3813 	.data = &(struct clk_regmap_mux_data){
3814 		.offset = HHI_ISP_CLK_CNTL,
3815 		.mask = 7,
3816 		.shift = 9,
3817 	},
3818 	.hw.init = &(struct clk_init_data){
3819 		.name = "mipi_isp_sel",
3820 		.ops = &clk_regmap_mux_ops,
3821 		.parent_data = g12b_mipi_isp_parent_data,
3822 		.num_parents = ARRAY_SIZE(g12b_mipi_isp_parent_data),
3823 	},
3824 };
3825 
3826 static struct clk_regmap g12b_mipi_isp_div = {
3827 	.data = &(struct clk_regmap_div_data){
3828 		.offset = HHI_ISP_CLK_CNTL,
3829 		.shift = 0,
3830 		.width = 7,
3831 	},
3832 	.hw.init = &(struct clk_init_data){
3833 		.name = "mipi_isp_div",
3834 		.ops = &clk_regmap_divider_ops,
3835 		.parent_hws = (const struct clk_hw *[]) {
3836 			&g12b_mipi_isp_sel.hw
3837 		},
3838 		.num_parents = 1,
3839 		.flags = CLK_SET_RATE_PARENT,
3840 	},
3841 };
3842 
3843 static struct clk_regmap g12b_mipi_isp = {
3844 	.data = &(struct clk_regmap_gate_data){
3845 		.offset = HHI_ISP_CLK_CNTL,
3846 		.bit_idx = 8,
3847 	},
3848 	.hw.init = &(struct clk_init_data) {
3849 		.name = "mipi_isp",
3850 		.ops = &clk_regmap_gate_ops,
3851 		.parent_hws = (const struct clk_hw *[]) {
3852 			&g12b_mipi_isp_div.hw
3853 		},
3854 		.num_parents = 1,
3855 		.flags = CLK_SET_RATE_PARENT,
3856 	},
3857 };
3858 
3859 /* HDMI Clocks */
3860 
3861 static const struct clk_parent_data g12a_hdmi_parent_data[] = {
3862 	{ .fw_name = "xtal", },
3863 	{ .hw = &g12a_fclk_div4.hw },
3864 	{ .hw = &g12a_fclk_div3.hw },
3865 	{ .hw = &g12a_fclk_div5.hw },
3866 };
3867 
3868 static struct clk_regmap g12a_hdmi_sel = {
3869 	.data = &(struct clk_regmap_mux_data){
3870 		.offset = HHI_HDMI_CLK_CNTL,
3871 		.mask = 0x3,
3872 		.shift = 9,
3873 		.flags = CLK_MUX_ROUND_CLOSEST,
3874 	},
3875 	.hw.init = &(struct clk_init_data){
3876 		.name = "hdmi_sel",
3877 		.ops = &clk_regmap_mux_ops,
3878 		.parent_data = g12a_hdmi_parent_data,
3879 		.num_parents = ARRAY_SIZE(g12a_hdmi_parent_data),
3880 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3881 	},
3882 };
3883 
3884 static struct clk_regmap g12a_hdmi_div = {
3885 	.data = &(struct clk_regmap_div_data){
3886 		.offset = HHI_HDMI_CLK_CNTL,
3887 		.shift = 0,
3888 		.width = 7,
3889 	},
3890 	.hw.init = &(struct clk_init_data){
3891 		.name = "hdmi_div",
3892 		.ops = &clk_regmap_divider_ops,
3893 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw },
3894 		.num_parents = 1,
3895 		.flags = CLK_GET_RATE_NOCACHE,
3896 	},
3897 };
3898 
3899 static struct clk_regmap g12a_hdmi = {
3900 	.data = &(struct clk_regmap_gate_data){
3901 		.offset = HHI_HDMI_CLK_CNTL,
3902 		.bit_idx = 8,
3903 	},
3904 	.hw.init = &(struct clk_init_data) {
3905 		.name = "hdmi",
3906 		.ops = &clk_regmap_gate_ops,
3907 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw },
3908 		.num_parents = 1,
3909 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3910 	},
3911 };
3912 
3913 /*
3914  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
3915  * muxed by a glitch-free switch. The CCF can manage this glitch-free
3916  * mux because it does top-to-bottom updates the each clock tree and
3917  * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
3918  */
3919 static const struct clk_parent_data g12a_mali_0_1_parent_data[] = {
3920 	{ .fw_name = "xtal", },
3921 	{ .hw = &g12a_gp0_pll.hw },
3922 	{ .hw = &g12a_hifi_pll.hw },
3923 	{ .hw = &g12a_fclk_div2p5.hw },
3924 	{ .hw = &g12a_fclk_div3.hw },
3925 	{ .hw = &g12a_fclk_div4.hw },
3926 	{ .hw = &g12a_fclk_div5.hw },
3927 	{ .hw = &g12a_fclk_div7.hw },
3928 };
3929 
3930 static struct clk_regmap g12a_mali_0_sel = {
3931 	.data = &(struct clk_regmap_mux_data){
3932 		.offset = HHI_MALI_CLK_CNTL,
3933 		.mask = 0x7,
3934 		.shift = 9,
3935 	},
3936 	.hw.init = &(struct clk_init_data){
3937 		.name = "mali_0_sel",
3938 		.ops = &clk_regmap_mux_ops,
3939 		.parent_data = g12a_mali_0_1_parent_data,
3940 		.num_parents = 8,
3941 		/*
3942 		 * Don't request the parent to change the rate because
3943 		 * all GPU frequencies can be derived from the fclk_*
3944 		 * clocks and one special GP0_PLL setting. This is
3945 		 * important because we need the MPLL clocks for audio.
3946 		 */
3947 		.flags = 0,
3948 	},
3949 };
3950 
3951 static struct clk_regmap g12a_mali_0_div = {
3952 	.data = &(struct clk_regmap_div_data){
3953 		.offset = HHI_MALI_CLK_CNTL,
3954 		.shift = 0,
3955 		.width = 7,
3956 	},
3957 	.hw.init = &(struct clk_init_data){
3958 		.name = "mali_0_div",
3959 		.ops = &clk_regmap_divider_ops,
3960 		.parent_hws = (const struct clk_hw *[]) {
3961 			&g12a_mali_0_sel.hw
3962 		},
3963 		.num_parents = 1,
3964 		.flags = CLK_SET_RATE_PARENT,
3965 	},
3966 };
3967 
3968 static struct clk_regmap g12a_mali_0 = {
3969 	.data = &(struct clk_regmap_gate_data){
3970 		.offset = HHI_MALI_CLK_CNTL,
3971 		.bit_idx = 8,
3972 	},
3973 	.hw.init = &(struct clk_init_data){
3974 		.name = "mali_0",
3975 		.ops = &clk_regmap_gate_ops,
3976 		.parent_hws = (const struct clk_hw *[]) {
3977 			&g12a_mali_0_div.hw
3978 		},
3979 		.num_parents = 1,
3980 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
3981 	},
3982 };
3983 
3984 static struct clk_regmap g12a_mali_1_sel = {
3985 	.data = &(struct clk_regmap_mux_data){
3986 		.offset = HHI_MALI_CLK_CNTL,
3987 		.mask = 0x7,
3988 		.shift = 25,
3989 	},
3990 	.hw.init = &(struct clk_init_data){
3991 		.name = "mali_1_sel",
3992 		.ops = &clk_regmap_mux_ops,
3993 		.parent_data = g12a_mali_0_1_parent_data,
3994 		.num_parents = 8,
3995 		/*
3996 		 * Don't request the parent to change the rate because
3997 		 * all GPU frequencies can be derived from the fclk_*
3998 		 * clocks and one special GP0_PLL setting. This is
3999 		 * important because we need the MPLL clocks for audio.
4000 		 */
4001 		.flags = 0,
4002 	},
4003 };
4004 
4005 static struct clk_regmap g12a_mali_1_div = {
4006 	.data = &(struct clk_regmap_div_data){
4007 		.offset = HHI_MALI_CLK_CNTL,
4008 		.shift = 16,
4009 		.width = 7,
4010 	},
4011 	.hw.init = &(struct clk_init_data){
4012 		.name = "mali_1_div",
4013 		.ops = &clk_regmap_divider_ops,
4014 		.parent_hws = (const struct clk_hw *[]) {
4015 			&g12a_mali_1_sel.hw
4016 		},
4017 		.num_parents = 1,
4018 		.flags = CLK_SET_RATE_PARENT,
4019 	},
4020 };
4021 
4022 static struct clk_regmap g12a_mali_1 = {
4023 	.data = &(struct clk_regmap_gate_data){
4024 		.offset = HHI_MALI_CLK_CNTL,
4025 		.bit_idx = 24,
4026 	},
4027 	.hw.init = &(struct clk_init_data){
4028 		.name = "mali_1",
4029 		.ops = &clk_regmap_gate_ops,
4030 		.parent_hws = (const struct clk_hw *[]) {
4031 			&g12a_mali_1_div.hw
4032 		},
4033 		.num_parents = 1,
4034 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
4035 	},
4036 };
4037 
4038 static const struct clk_hw *g12a_mali_parent_hws[] = {
4039 	&g12a_mali_0.hw,
4040 	&g12a_mali_1.hw,
4041 };
4042 
4043 static struct clk_regmap g12a_mali = {
4044 	.data = &(struct clk_regmap_mux_data){
4045 		.offset = HHI_MALI_CLK_CNTL,
4046 		.mask = 1,
4047 		.shift = 31,
4048 	},
4049 	.hw.init = &(struct clk_init_data){
4050 		.name = "mali",
4051 		.ops = &clk_regmap_mux_ops,
4052 		.parent_hws = g12a_mali_parent_hws,
4053 		.num_parents = 2,
4054 		.flags = CLK_SET_RATE_PARENT,
4055 	},
4056 };
4057 
4058 static struct clk_regmap g12a_ts_div = {
4059 	.data = &(struct clk_regmap_div_data){
4060 		.offset = HHI_TS_CLK_CNTL,
4061 		.shift = 0,
4062 		.width = 8,
4063 	},
4064 	.hw.init = &(struct clk_init_data){
4065 		.name = "ts_div",
4066 		.ops = &clk_regmap_divider_ro_ops,
4067 		.parent_data = &(const struct clk_parent_data) {
4068 			.fw_name = "xtal",
4069 		},
4070 		.num_parents = 1,
4071 	},
4072 };
4073 
4074 static struct clk_regmap g12a_ts = {
4075 	.data = &(struct clk_regmap_gate_data){
4076 		.offset = HHI_TS_CLK_CNTL,
4077 		.bit_idx = 8,
4078 	},
4079 	.hw.init = &(struct clk_init_data){
4080 		.name = "ts",
4081 		.ops = &clk_regmap_gate_ops,
4082 		.parent_hws = (const struct clk_hw *[]) {
4083 			&g12a_ts_div.hw
4084 		},
4085 		.num_parents = 1,
4086 	},
4087 };
4088 
4089 /* SPICC SCLK source clock */
4090 
4091 static const struct clk_parent_data spicc_sclk_parent_data[] = {
4092 	{ .fw_name = "xtal", },
4093 	{ .hw = &g12a_clk81.hw },
4094 	{ .hw = &g12a_fclk_div4.hw },
4095 	{ .hw = &g12a_fclk_div3.hw },
4096 	{ .hw = &g12a_fclk_div5.hw },
4097 	{ .hw = &g12a_fclk_div7.hw },
4098 };
4099 
4100 static struct clk_regmap g12a_spicc0_sclk_sel = {
4101 	.data = &(struct clk_regmap_mux_data){
4102 		.offset = HHI_SPICC_CLK_CNTL,
4103 		.mask = 7,
4104 		.shift = 7,
4105 	},
4106 	.hw.init = &(struct clk_init_data){
4107 		.name = "spicc0_sclk_sel",
4108 		.ops = &clk_regmap_mux_ops,
4109 		.parent_data = spicc_sclk_parent_data,
4110 		.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
4111 	},
4112 };
4113 
4114 static struct clk_regmap g12a_spicc0_sclk_div = {
4115 	.data = &(struct clk_regmap_div_data){
4116 		.offset = HHI_SPICC_CLK_CNTL,
4117 		.shift = 0,
4118 		.width = 6,
4119 	},
4120 	.hw.init = &(struct clk_init_data){
4121 		.name = "spicc0_sclk_div",
4122 		.ops = &clk_regmap_divider_ops,
4123 		.parent_hws = (const struct clk_hw *[]) {
4124 			&g12a_spicc0_sclk_sel.hw
4125 		},
4126 		.num_parents = 1,
4127 		.flags = CLK_SET_RATE_PARENT,
4128 	},
4129 };
4130 
4131 static struct clk_regmap g12a_spicc0_sclk = {
4132 	.data = &(struct clk_regmap_gate_data){
4133 		.offset = HHI_SPICC_CLK_CNTL,
4134 		.bit_idx = 6,
4135 	},
4136 	.hw.init = &(struct clk_init_data){
4137 		.name = "spicc0_sclk",
4138 		.ops = &clk_regmap_gate_ops,
4139 		.parent_hws = (const struct clk_hw *[]) {
4140 			&g12a_spicc0_sclk_div.hw
4141 		},
4142 		.num_parents = 1,
4143 		.flags = CLK_SET_RATE_PARENT,
4144 	},
4145 };
4146 
4147 static struct clk_regmap g12a_spicc1_sclk_sel = {
4148 	.data = &(struct clk_regmap_mux_data){
4149 		.offset = HHI_SPICC_CLK_CNTL,
4150 		.mask = 7,
4151 		.shift = 23,
4152 	},
4153 	.hw.init = &(struct clk_init_data){
4154 		.name = "spicc1_sclk_sel",
4155 		.ops = &clk_regmap_mux_ops,
4156 		.parent_data = spicc_sclk_parent_data,
4157 		.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
4158 	},
4159 };
4160 
4161 static struct clk_regmap g12a_spicc1_sclk_div = {
4162 	.data = &(struct clk_regmap_div_data){
4163 		.offset = HHI_SPICC_CLK_CNTL,
4164 		.shift = 16,
4165 		.width = 6,
4166 	},
4167 	.hw.init = &(struct clk_init_data){
4168 		.name = "spicc1_sclk_div",
4169 		.ops = &clk_regmap_divider_ops,
4170 		.parent_hws = (const struct clk_hw *[]) {
4171 			&g12a_spicc1_sclk_sel.hw
4172 		},
4173 		.num_parents = 1,
4174 		.flags = CLK_SET_RATE_PARENT,
4175 	},
4176 };
4177 
4178 static struct clk_regmap g12a_spicc1_sclk = {
4179 	.data = &(struct clk_regmap_gate_data){
4180 		.offset = HHI_SPICC_CLK_CNTL,
4181 		.bit_idx = 22,
4182 	},
4183 	.hw.init = &(struct clk_init_data){
4184 		.name = "spicc1_sclk",
4185 		.ops = &clk_regmap_gate_ops,
4186 		.parent_hws = (const struct clk_hw *[]) {
4187 			&g12a_spicc1_sclk_div.hw
4188 		},
4189 		.num_parents = 1,
4190 		.flags = CLK_SET_RATE_PARENT,
4191 	},
4192 };
4193 
4194 /* Neural Network Accelerator source clock */
4195 
4196 static const struct clk_parent_data nna_clk_parent_data[] = {
4197 	{ .fw_name = "xtal", },
4198 	{ .hw = &g12a_gp0_pll.hw, },
4199 	{ .hw = &g12a_hifi_pll.hw, },
4200 	{ .hw = &g12a_fclk_div2p5.hw, },
4201 	{ .hw = &g12a_fclk_div3.hw, },
4202 	{ .hw = &g12a_fclk_div4.hw, },
4203 	{ .hw = &g12a_fclk_div5.hw, },
4204 	{ .hw = &g12a_fclk_div7.hw },
4205 };
4206 
4207 static struct clk_regmap sm1_nna_axi_clk_sel = {
4208 	.data = &(struct clk_regmap_mux_data){
4209 		.offset = HHI_NNA_CLK_CNTL,
4210 		.mask = 7,
4211 		.shift = 9,
4212 	},
4213 	.hw.init = &(struct clk_init_data){
4214 		.name = "nna_axi_clk_sel",
4215 		.ops = &clk_regmap_mux_ops,
4216 		.parent_data = nna_clk_parent_data,
4217 		.num_parents = ARRAY_SIZE(nna_clk_parent_data),
4218 	},
4219 };
4220 
4221 static struct clk_regmap sm1_nna_axi_clk_div = {
4222 	.data = &(struct clk_regmap_div_data){
4223 		.offset = HHI_NNA_CLK_CNTL,
4224 		.shift = 0,
4225 		.width = 7,
4226 	},
4227 	.hw.init = &(struct clk_init_data){
4228 		.name = "nna_axi_clk_div",
4229 		.ops = &clk_regmap_divider_ops,
4230 		.parent_hws = (const struct clk_hw *[]) {
4231 			&sm1_nna_axi_clk_sel.hw
4232 		},
4233 		.num_parents = 1,
4234 		.flags = CLK_SET_RATE_PARENT,
4235 	},
4236 };
4237 
4238 static struct clk_regmap sm1_nna_axi_clk = {
4239 	.data = &(struct clk_regmap_gate_data){
4240 		.offset = HHI_NNA_CLK_CNTL,
4241 		.bit_idx = 8,
4242 	},
4243 	.hw.init = &(struct clk_init_data){
4244 		.name = "nna_axi_clk",
4245 		.ops = &clk_regmap_gate_ops,
4246 		.parent_hws = (const struct clk_hw *[]) {
4247 			&sm1_nna_axi_clk_div.hw
4248 		},
4249 		.num_parents = 1,
4250 		.flags = CLK_SET_RATE_PARENT,
4251 	},
4252 };
4253 
4254 static struct clk_regmap sm1_nna_core_clk_sel = {
4255 	.data = &(struct clk_regmap_mux_data){
4256 		.offset = HHI_NNA_CLK_CNTL,
4257 		.mask = 7,
4258 		.shift = 25,
4259 	},
4260 	.hw.init = &(struct clk_init_data){
4261 		.name = "nna_core_clk_sel",
4262 		.ops = &clk_regmap_mux_ops,
4263 		.parent_data = nna_clk_parent_data,
4264 		.num_parents = ARRAY_SIZE(nna_clk_parent_data),
4265 	},
4266 };
4267 
4268 static struct clk_regmap sm1_nna_core_clk_div = {
4269 	.data = &(struct clk_regmap_div_data){
4270 		.offset = HHI_NNA_CLK_CNTL,
4271 		.shift = 16,
4272 		.width = 7,
4273 	},
4274 	.hw.init = &(struct clk_init_data){
4275 		.name = "nna_core_clk_div",
4276 		.ops = &clk_regmap_divider_ops,
4277 		.parent_hws = (const struct clk_hw *[]) {
4278 			&sm1_nna_core_clk_sel.hw
4279 		},
4280 		.num_parents = 1,
4281 		.flags = CLK_SET_RATE_PARENT,
4282 	},
4283 };
4284 
4285 static struct clk_regmap sm1_nna_core_clk = {
4286 	.data = &(struct clk_regmap_gate_data){
4287 		.offset = HHI_NNA_CLK_CNTL,
4288 		.bit_idx = 24,
4289 	},
4290 	.hw.init = &(struct clk_init_data){
4291 		.name = "nna_core_clk",
4292 		.ops = &clk_regmap_gate_ops,
4293 		.parent_hws = (const struct clk_hw *[]) {
4294 			&sm1_nna_core_clk_div.hw
4295 		},
4296 		.num_parents = 1,
4297 		.flags = CLK_SET_RATE_PARENT,
4298 	},
4299 };
4300 
4301 #define MESON_GATE(_name, _reg, _bit) \
4302 	MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
4303 
4304 #define MESON_GATE_RO(_name, _reg, _bit) \
4305 	MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
4306 
4307 /* Everything Else (EE) domain gates */
4308 static MESON_GATE(g12a_ddr,			HHI_GCLK_MPEG0,	0);
4309 static MESON_GATE(g12a_dos,			HHI_GCLK_MPEG0,	1);
4310 static MESON_GATE(g12a_audio_locker,		HHI_GCLK_MPEG0,	2);
4311 static MESON_GATE(g12a_mipi_dsi_host,		HHI_GCLK_MPEG0,	3);
4312 static MESON_GATE(g12a_eth_phy,			HHI_GCLK_MPEG0,	4);
4313 static MESON_GATE(g12a_isa,			HHI_GCLK_MPEG0,	5);
4314 static MESON_GATE(g12a_pl301,			HHI_GCLK_MPEG0,	6);
4315 static MESON_GATE(g12a_periphs,			HHI_GCLK_MPEG0,	7);
4316 static MESON_GATE(g12a_spicc_0,			HHI_GCLK_MPEG0,	8);
4317 static MESON_GATE(g12a_i2c,			HHI_GCLK_MPEG0,	9);
4318 static MESON_GATE(g12a_sana,			HHI_GCLK_MPEG0,	10);
4319 static MESON_GATE(g12a_sd,			HHI_GCLK_MPEG0,	11);
4320 static MESON_GATE(g12a_rng0,			HHI_GCLK_MPEG0,	12);
4321 static MESON_GATE(g12a_uart0,			HHI_GCLK_MPEG0,	13);
4322 static MESON_GATE(g12a_spicc_1,			HHI_GCLK_MPEG0,	14);
4323 static MESON_GATE(g12a_hiu_reg,			HHI_GCLK_MPEG0,	19);
4324 static MESON_GATE(g12a_mipi_dsi_phy,		HHI_GCLK_MPEG0,	20);
4325 static MESON_GATE(g12a_assist_misc,		HHI_GCLK_MPEG0,	23);
4326 static MESON_GATE(g12a_emmc_a,			HHI_GCLK_MPEG0,	24);
4327 static MESON_GATE(g12a_emmc_b,			HHI_GCLK_MPEG0,	25);
4328 static MESON_GATE(g12a_emmc_c,			HHI_GCLK_MPEG0,	26);
4329 static MESON_GATE(g12a_audio_codec,		HHI_GCLK_MPEG0,	28);
4330 
4331 static MESON_GATE(g12a_audio,			HHI_GCLK_MPEG1,	0);
4332 static MESON_GATE(g12a_eth_core,		HHI_GCLK_MPEG1,	3);
4333 static MESON_GATE(g12a_demux,			HHI_GCLK_MPEG1,	4);
4334 static MESON_GATE(g12a_audio_ififo,		HHI_GCLK_MPEG1,	11);
4335 static MESON_GATE(g12a_adc,			HHI_GCLK_MPEG1,	13);
4336 static MESON_GATE(g12a_uart1,			HHI_GCLK_MPEG1,	16);
4337 static MESON_GATE(g12a_g2d,			HHI_GCLK_MPEG1,	20);
4338 static MESON_GATE(g12a_reset,			HHI_GCLK_MPEG1,	23);
4339 static MESON_GATE(g12a_pcie_comb,		HHI_GCLK_MPEG1,	24);
4340 static MESON_GATE(g12a_parser,			HHI_GCLK_MPEG1,	25);
4341 static MESON_GATE(g12a_usb_general,		HHI_GCLK_MPEG1,	26);
4342 static MESON_GATE(g12a_pcie_phy,		HHI_GCLK_MPEG1,	27);
4343 static MESON_GATE(g12a_ahb_arb0,		HHI_GCLK_MPEG1,	29);
4344 
4345 static MESON_GATE(g12a_ahb_data_bus,		HHI_GCLK_MPEG2,	1);
4346 static MESON_GATE(g12a_ahb_ctrl_bus,		HHI_GCLK_MPEG2,	2);
4347 static MESON_GATE(g12a_htx_hdcp22,		HHI_GCLK_MPEG2,	3);
4348 static MESON_GATE(g12a_htx_pclk,		HHI_GCLK_MPEG2,	4);
4349 static MESON_GATE(g12a_bt656,			HHI_GCLK_MPEG2,	6);
4350 static MESON_GATE(g12a_usb1_to_ddr,		HHI_GCLK_MPEG2,	8);
4351 static MESON_GATE(g12b_mipi_isp_gate,		HHI_GCLK_MPEG2,	17);
4352 static MESON_GATE(g12a_mmc_pclk,		HHI_GCLK_MPEG2,	11);
4353 static MESON_GATE(g12a_uart2,			HHI_GCLK_MPEG2,	15);
4354 static MESON_GATE(g12a_vpu_intr,		HHI_GCLK_MPEG2,	25);
4355 static MESON_GATE(g12b_csi_phy1,		HHI_GCLK_MPEG2,	28);
4356 static MESON_GATE(g12b_csi_phy0,		HHI_GCLK_MPEG2,	29);
4357 static MESON_GATE(g12a_gic,			HHI_GCLK_MPEG2,	30);
4358 
4359 static MESON_GATE(g12a_vclk2_venci0,		HHI_GCLK_OTHER,	1);
4360 static MESON_GATE(g12a_vclk2_venci1,		HHI_GCLK_OTHER,	2);
4361 static MESON_GATE(g12a_vclk2_vencp0,		HHI_GCLK_OTHER,	3);
4362 static MESON_GATE(g12a_vclk2_vencp1,		HHI_GCLK_OTHER,	4);
4363 static MESON_GATE(g12a_vclk2_venct0,		HHI_GCLK_OTHER,	5);
4364 static MESON_GATE(g12a_vclk2_venct1,		HHI_GCLK_OTHER,	6);
4365 static MESON_GATE(g12a_vclk2_other,		HHI_GCLK_OTHER,	7);
4366 static MESON_GATE(g12a_vclk2_enci,		HHI_GCLK_OTHER,	8);
4367 static MESON_GATE(g12a_vclk2_encp,		HHI_GCLK_OTHER,	9);
4368 static MESON_GATE(g12a_dac_clk,			HHI_GCLK_OTHER,	10);
4369 static MESON_GATE(g12a_aoclk_gate,		HHI_GCLK_OTHER,	14);
4370 static MESON_GATE(g12a_iec958_gate,		HHI_GCLK_OTHER,	16);
4371 static MESON_GATE(g12a_enc480p,			HHI_GCLK_OTHER,	20);
4372 static MESON_GATE(g12a_rng1,			HHI_GCLK_OTHER,	21);
4373 static MESON_GATE(g12a_vclk2_enct,		HHI_GCLK_OTHER,	22);
4374 static MESON_GATE(g12a_vclk2_encl,		HHI_GCLK_OTHER,	23);
4375 static MESON_GATE(g12a_vclk2_venclmmc,		HHI_GCLK_OTHER,	24);
4376 static MESON_GATE(g12a_vclk2_vencl,		HHI_GCLK_OTHER,	25);
4377 static MESON_GATE(g12a_vclk2_other1,		HHI_GCLK_OTHER,	26);
4378 
4379 static MESON_GATE_RO(g12a_dma,			HHI_GCLK_OTHER2, 0);
4380 static MESON_GATE_RO(g12a_efuse,		HHI_GCLK_OTHER2, 1);
4381 static MESON_GATE_RO(g12a_rom_boot,		HHI_GCLK_OTHER2, 2);
4382 static MESON_GATE_RO(g12a_reset_sec,		HHI_GCLK_OTHER2, 3);
4383 static MESON_GATE_RO(g12a_sec_ahb_apb3,		HHI_GCLK_OTHER2, 4);
4384 
4385 /* Array of all clocks provided by this provider */
4386 static struct clk_hw *g12a_hw_clks[] = {
4387 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4388 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4389 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4390 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4391 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4392 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4393 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4394 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4395 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4396 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4397 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4398 	[CLKID_CLK81]			= &g12a_clk81.hw,
4399 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4400 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4401 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4402 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4403 	[CLKID_DDR]			= &g12a_ddr.hw,
4404 	[CLKID_DOS]			= &g12a_dos.hw,
4405 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4406 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4407 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4408 	[CLKID_ISA]			= &g12a_isa.hw,
4409 	[CLKID_PL301]			= &g12a_pl301.hw,
4410 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4411 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4412 	[CLKID_I2C]			= &g12a_i2c.hw,
4413 	[CLKID_SANA]			= &g12a_sana.hw,
4414 	[CLKID_SD]			= &g12a_sd.hw,
4415 	[CLKID_RNG0]			= &g12a_rng0.hw,
4416 	[CLKID_UART0]			= &g12a_uart0.hw,
4417 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4418 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4419 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4420 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4421 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4422 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4423 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4424 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4425 	[CLKID_AUDIO]			= &g12a_audio.hw,
4426 	[CLKID_ETH]			= &g12a_eth_core.hw,
4427 	[CLKID_DEMUX]			= &g12a_demux.hw,
4428 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4429 	[CLKID_ADC]			= &g12a_adc.hw,
4430 	[CLKID_UART1]			= &g12a_uart1.hw,
4431 	[CLKID_G2D]			= &g12a_g2d.hw,
4432 	[CLKID_RESET]			= &g12a_reset.hw,
4433 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4434 	[CLKID_PARSER]			= &g12a_parser.hw,
4435 	[CLKID_USB]			= &g12a_usb_general.hw,
4436 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4437 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4438 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4439 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4440 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4441 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4442 	[CLKID_BT656]			= &g12a_bt656.hw,
4443 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4444 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4445 	[CLKID_UART2]			= &g12a_uart2.hw,
4446 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4447 	[CLKID_GIC]			= &g12a_gic.hw,
4448 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4449 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4450 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4451 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4452 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4453 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4454 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4455 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4456 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4457 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4458 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4459 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4460 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4461 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4462 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4463 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4464 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4465 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4466 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4467 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4468 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4469 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4470 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4471 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4472 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4473 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4474 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4475 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4476 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4477 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4478 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4479 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4480 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4481 	[CLKID_RNG1]			= &g12a_rng1.hw,
4482 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4483 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4484 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4485 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4486 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4487 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4488 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4489 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4490 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4491 	[CLKID_DMA]			= &g12a_dma.hw,
4492 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4493 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4494 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4495 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4496 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4497 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4498 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4499 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4500 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4501 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4502 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4503 	[CLKID_VPU]			= &g12a_vpu.hw,
4504 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
4505 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
4506 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
4507 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
4508 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
4509 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
4510 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
4511 	[CLKID_VAPB]			= &g12a_vapb.hw,
4512 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
4513 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
4514 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
4515 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
4516 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
4517 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
4518 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
4519 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
4520 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
4521 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
4522 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
4523 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
4524 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
4525 	[CLKID_VCLK]			= &g12a_vclk.hw,
4526 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
4527 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
4528 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
4529 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
4530 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
4531 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
4532 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
4533 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
4534 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
4535 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
4536 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
4537 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
4538 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
4539 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
4540 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
4541 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
4542 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
4543 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
4544 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
4545 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
4546 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
4547 	[CLKID_CTS_ENCL_SEL]		= &g12a_cts_encl_sel.hw,
4548 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
4549 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
4550 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
4551 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
4552 	[CLKID_CTS_ENCL]		= &g12a_cts_encl.hw,
4553 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
4554 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
4555 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
4556 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
4557 	[CLKID_HDMI]			= &g12a_hdmi.hw,
4558 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
4559 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
4560 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
4561 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
4562 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
4563 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
4564 	[CLKID_MALI]			= &g12a_mali.hw,
4565 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
4566 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
4567 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
4568 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
4569 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
4570 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
4571 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
4572 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
4573 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
4574 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
4575 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
4576 	[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
4577 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
4578 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
4579 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
4580 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
4581 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
4582 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
4583 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
4584 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
4585 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
4586 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
4587 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
4588 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
4589 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
4590 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
4591 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
4592 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
4593 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
4594 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
4595 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
4596 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
4597 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
4598 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
4599 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
4600 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
4601 	[CLKID_TS]			= &g12a_ts.hw,
4602 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4603 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4604 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4605 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4606 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4607 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
4608 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
4609 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
4610 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
4611 };
4612 
4613 static struct clk_hw *g12b_hw_clks[] = {
4614 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4615 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4616 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4617 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4618 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4619 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4620 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4621 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4622 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4623 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4624 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4625 	[CLKID_CLK81]			= &g12a_clk81.hw,
4626 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4627 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4628 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4629 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4630 	[CLKID_DDR]			= &g12a_ddr.hw,
4631 	[CLKID_DOS]			= &g12a_dos.hw,
4632 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4633 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4634 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4635 	[CLKID_ISA]			= &g12a_isa.hw,
4636 	[CLKID_PL301]			= &g12a_pl301.hw,
4637 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4638 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4639 	[CLKID_I2C]			= &g12a_i2c.hw,
4640 	[CLKID_SANA]			= &g12a_sana.hw,
4641 	[CLKID_SD]			= &g12a_sd.hw,
4642 	[CLKID_RNG0]			= &g12a_rng0.hw,
4643 	[CLKID_UART0]			= &g12a_uart0.hw,
4644 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4645 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4646 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4647 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4648 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4649 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4650 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4651 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4652 	[CLKID_AUDIO]			= &g12a_audio.hw,
4653 	[CLKID_ETH]			= &g12a_eth_core.hw,
4654 	[CLKID_DEMUX]			= &g12a_demux.hw,
4655 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4656 	[CLKID_ADC]			= &g12a_adc.hw,
4657 	[CLKID_UART1]			= &g12a_uart1.hw,
4658 	[CLKID_G2D]			= &g12a_g2d.hw,
4659 	[CLKID_RESET]			= &g12a_reset.hw,
4660 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4661 	[CLKID_PARSER]			= &g12a_parser.hw,
4662 	[CLKID_USB]			= &g12a_usb_general.hw,
4663 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4664 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4665 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4666 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4667 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4668 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4669 	[CLKID_BT656]			= &g12a_bt656.hw,
4670 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4671 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4672 	[CLKID_UART2]			= &g12a_uart2.hw,
4673 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4674 	[CLKID_GIC]			= &g12a_gic.hw,
4675 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4676 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4677 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4678 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4679 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4680 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4681 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4682 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4683 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4684 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4685 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4686 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4687 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4688 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4689 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4690 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4691 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4692 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4693 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4694 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4695 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4696 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4697 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4698 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4699 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4700 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4701 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4702 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4703 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4704 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4705 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4706 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4707 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4708 	[CLKID_RNG1]			= &g12a_rng1.hw,
4709 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4710 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4711 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4712 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4713 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4714 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4715 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4716 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4717 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4718 	[CLKID_DMA]			= &g12a_dma.hw,
4719 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4720 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4721 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4722 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4723 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4724 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4725 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4726 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4727 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4728 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4729 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4730 	[CLKID_VPU]			= &g12a_vpu.hw,
4731 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
4732 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
4733 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
4734 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
4735 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
4736 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
4737 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
4738 	[CLKID_VAPB]			= &g12a_vapb.hw,
4739 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
4740 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
4741 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
4742 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
4743 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
4744 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
4745 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
4746 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
4747 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
4748 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
4749 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
4750 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
4751 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
4752 	[CLKID_VCLK]			= &g12a_vclk.hw,
4753 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
4754 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
4755 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
4756 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
4757 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
4758 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
4759 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
4760 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
4761 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
4762 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
4763 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
4764 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
4765 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
4766 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
4767 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
4768 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
4769 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
4770 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
4771 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
4772 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
4773 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
4774 	[CLKID_CTS_ENCL_SEL]		= &g12a_cts_encl_sel.hw,
4775 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
4776 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
4777 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
4778 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
4779 	[CLKID_CTS_ENCL]		= &g12a_cts_encl.hw,
4780 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
4781 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
4782 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
4783 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
4784 	[CLKID_HDMI]			= &g12a_hdmi.hw,
4785 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
4786 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
4787 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
4788 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
4789 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
4790 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
4791 	[CLKID_MALI]			= &g12a_mali.hw,
4792 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
4793 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
4794 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
4795 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
4796 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
4797 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
4798 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
4799 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
4800 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
4801 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
4802 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
4803 	[CLKID_CPU_CLK]			= &g12b_cpu_clk.hw,
4804 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
4805 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
4806 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
4807 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
4808 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
4809 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
4810 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
4811 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
4812 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
4813 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
4814 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
4815 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
4816 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
4817 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
4818 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
4819 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
4820 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
4821 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
4822 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
4823 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
4824 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
4825 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
4826 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
4827 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
4828 	[CLKID_TS]			= &g12a_ts.hw,
4829 	[CLKID_SYS1_PLL_DCO]		= &g12b_sys1_pll_dco.hw,
4830 	[CLKID_SYS1_PLL]		= &g12b_sys1_pll.hw,
4831 	[CLKID_SYS1_PLL_DIV16_EN]	= &g12b_sys1_pll_div16_en.hw,
4832 	[CLKID_SYS1_PLL_DIV16]		= &g12b_sys1_pll_div16.hw,
4833 	[CLKID_CPUB_CLK_DYN0_SEL]	= &g12b_cpub_clk_premux0.hw,
4834 	[CLKID_CPUB_CLK_DYN0_DIV]	= &g12b_cpub_clk_mux0_div.hw,
4835 	[CLKID_CPUB_CLK_DYN0]		= &g12b_cpub_clk_postmux0.hw,
4836 	[CLKID_CPUB_CLK_DYN1_SEL]	= &g12b_cpub_clk_premux1.hw,
4837 	[CLKID_CPUB_CLK_DYN1_DIV]	= &g12b_cpub_clk_mux1_div.hw,
4838 	[CLKID_CPUB_CLK_DYN1]		= &g12b_cpub_clk_postmux1.hw,
4839 	[CLKID_CPUB_CLK_DYN]		= &g12b_cpub_clk_dyn.hw,
4840 	[CLKID_CPUB_CLK]		= &g12b_cpub_clk.hw,
4841 	[CLKID_CPUB_CLK_DIV16_EN]	= &g12b_cpub_clk_div16_en.hw,
4842 	[CLKID_CPUB_CLK_DIV16]		= &g12b_cpub_clk_div16.hw,
4843 	[CLKID_CPUB_CLK_DIV2]		= &g12b_cpub_clk_div2.hw,
4844 	[CLKID_CPUB_CLK_DIV3]		= &g12b_cpub_clk_div3.hw,
4845 	[CLKID_CPUB_CLK_DIV4]		= &g12b_cpub_clk_div4.hw,
4846 	[CLKID_CPUB_CLK_DIV5]		= &g12b_cpub_clk_div5.hw,
4847 	[CLKID_CPUB_CLK_DIV6]		= &g12b_cpub_clk_div6.hw,
4848 	[CLKID_CPUB_CLK_DIV7]		= &g12b_cpub_clk_div7.hw,
4849 	[CLKID_CPUB_CLK_DIV8]		= &g12b_cpub_clk_div8.hw,
4850 	[CLKID_CPUB_CLK_APB_SEL]	= &g12b_cpub_clk_apb_sel.hw,
4851 	[CLKID_CPUB_CLK_APB]		= &g12b_cpub_clk_apb.hw,
4852 	[CLKID_CPUB_CLK_ATB_SEL]	= &g12b_cpub_clk_atb_sel.hw,
4853 	[CLKID_CPUB_CLK_ATB]		= &g12b_cpub_clk_atb.hw,
4854 	[CLKID_CPUB_CLK_AXI_SEL]	= &g12b_cpub_clk_axi_sel.hw,
4855 	[CLKID_CPUB_CLK_AXI]		= &g12b_cpub_clk_axi.hw,
4856 	[CLKID_CPUB_CLK_TRACE_SEL]	= &g12b_cpub_clk_trace_sel.hw,
4857 	[CLKID_CPUB_CLK_TRACE]		= &g12b_cpub_clk_trace.hw,
4858 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4859 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4860 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4861 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4862 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4863 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
4864 	[CLKID_NNA_AXI_CLK_SEL]		= &sm1_nna_axi_clk_sel.hw,
4865 	[CLKID_NNA_AXI_CLK_DIV]		= &sm1_nna_axi_clk_div.hw,
4866 	[CLKID_NNA_AXI_CLK]		= &sm1_nna_axi_clk.hw,
4867 	[CLKID_NNA_CORE_CLK_SEL]	= &sm1_nna_core_clk_sel.hw,
4868 	[CLKID_NNA_CORE_CLK_DIV]	= &sm1_nna_core_clk_div.hw,
4869 	[CLKID_NNA_CORE_CLK]		= &sm1_nna_core_clk.hw,
4870 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
4871 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
4872 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
4873 	[CLKID_MIPI_ISP_SEL]		= &g12b_mipi_isp_sel.hw,
4874 	[CLKID_MIPI_ISP_DIV]		= &g12b_mipi_isp_div.hw,
4875 	[CLKID_MIPI_ISP]		= &g12b_mipi_isp.hw,
4876 	[CLKID_MIPI_ISP_GATE]		= &g12b_mipi_isp_gate.hw,
4877 	[CLKID_MIPI_ISP_CSI_PHY0]	= &g12b_csi_phy0.hw,
4878 	[CLKID_MIPI_ISP_CSI_PHY1]	= &g12b_csi_phy1.hw,
4879 };
4880 
4881 static struct clk_hw *sm1_hw_clks[] = {
4882 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4883 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4884 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4885 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4886 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4887 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4888 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4889 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4890 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4891 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4892 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4893 	[CLKID_CLK81]			= &g12a_clk81.hw,
4894 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4895 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4896 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4897 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4898 	[CLKID_DDR]			= &g12a_ddr.hw,
4899 	[CLKID_DOS]			= &g12a_dos.hw,
4900 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4901 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4902 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4903 	[CLKID_ISA]			= &g12a_isa.hw,
4904 	[CLKID_PL301]			= &g12a_pl301.hw,
4905 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4906 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4907 	[CLKID_I2C]			= &g12a_i2c.hw,
4908 	[CLKID_SANA]			= &g12a_sana.hw,
4909 	[CLKID_SD]			= &g12a_sd.hw,
4910 	[CLKID_RNG0]			= &g12a_rng0.hw,
4911 	[CLKID_UART0]			= &g12a_uart0.hw,
4912 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4913 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4914 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4915 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4916 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4917 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4918 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4919 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4920 	[CLKID_AUDIO]			= &g12a_audio.hw,
4921 	[CLKID_ETH]			= &g12a_eth_core.hw,
4922 	[CLKID_DEMUX]			= &g12a_demux.hw,
4923 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4924 	[CLKID_ADC]			= &g12a_adc.hw,
4925 	[CLKID_UART1]			= &g12a_uart1.hw,
4926 	[CLKID_G2D]			= &g12a_g2d.hw,
4927 	[CLKID_RESET]			= &g12a_reset.hw,
4928 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4929 	[CLKID_PARSER]			= &g12a_parser.hw,
4930 	[CLKID_USB]			= &g12a_usb_general.hw,
4931 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4932 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4933 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4934 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4935 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4936 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4937 	[CLKID_BT656]			= &g12a_bt656.hw,
4938 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4939 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4940 	[CLKID_UART2]			= &g12a_uart2.hw,
4941 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4942 	[CLKID_GIC]			= &g12a_gic.hw,
4943 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4944 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4945 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4946 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4947 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4948 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4949 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4950 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4951 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4952 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4953 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4954 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4955 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4956 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4957 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4958 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4959 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4960 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4961 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4962 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4963 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4964 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4965 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4966 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4967 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4968 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4969 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4970 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4971 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4972 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4973 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4974 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4975 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4976 	[CLKID_RNG1]			= &g12a_rng1.hw,
4977 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4978 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4979 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4980 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4981 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4982 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4983 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4984 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4985 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4986 	[CLKID_DMA]			= &g12a_dma.hw,
4987 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4988 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4989 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4990 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4991 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4992 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4993 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4994 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4995 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4996 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4997 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4998 	[CLKID_VPU]			= &g12a_vpu.hw,
4999 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
5000 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
5001 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
5002 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
5003 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
5004 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
5005 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
5006 	[CLKID_VAPB]			= &g12a_vapb.hw,
5007 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
5008 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
5009 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
5010 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
5011 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
5012 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
5013 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
5014 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
5015 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
5016 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
5017 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
5018 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
5019 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
5020 	[CLKID_VCLK]			= &g12a_vclk.hw,
5021 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
5022 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
5023 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
5024 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
5025 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
5026 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
5027 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
5028 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
5029 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
5030 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
5031 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
5032 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
5033 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
5034 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
5035 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
5036 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
5037 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
5038 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
5039 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
5040 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
5041 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
5042 	[CLKID_CTS_ENCL_SEL]		= &g12a_cts_encl_sel.hw,
5043 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
5044 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
5045 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
5046 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
5047 	[CLKID_CTS_ENCL]		= &g12a_cts_encl.hw,
5048 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
5049 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
5050 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
5051 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
5052 	[CLKID_HDMI]			= &g12a_hdmi.hw,
5053 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
5054 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
5055 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
5056 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
5057 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
5058 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
5059 	[CLKID_MALI]			= &g12a_mali.hw,
5060 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
5061 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
5062 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
5063 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
5064 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
5065 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
5066 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
5067 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
5068 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
5069 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
5070 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
5071 	[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
5072 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
5073 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
5074 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
5075 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
5076 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
5077 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
5078 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
5079 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
5080 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
5081 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
5082 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
5083 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
5084 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
5085 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
5086 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
5087 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
5088 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
5089 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
5090 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
5091 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
5092 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
5093 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
5094 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
5095 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
5096 	[CLKID_TS]			= &g12a_ts.hw,
5097 	[CLKID_GP1_PLL_DCO]		= &sm1_gp1_pll_dco.hw,
5098 	[CLKID_GP1_PLL]			= &sm1_gp1_pll.hw,
5099 	[CLKID_DSU_CLK_DYN0_SEL]	= &sm1_dsu_clk_premux0.hw,
5100 	[CLKID_DSU_CLK_DYN0_DIV]	= &sm1_dsu_clk_premux1.hw,
5101 	[CLKID_DSU_CLK_DYN0]		= &sm1_dsu_clk_mux0_div.hw,
5102 	[CLKID_DSU_CLK_DYN1_SEL]	= &sm1_dsu_clk_postmux0.hw,
5103 	[CLKID_DSU_CLK_DYN1_DIV]	= &sm1_dsu_clk_mux1_div.hw,
5104 	[CLKID_DSU_CLK_DYN1]		= &sm1_dsu_clk_postmux1.hw,
5105 	[CLKID_DSU_CLK_DYN]		= &sm1_dsu_clk_dyn.hw,
5106 	[CLKID_DSU_CLK_FINAL]		= &sm1_dsu_final_clk.hw,
5107 	[CLKID_DSU_CLK]			= &sm1_dsu_clk.hw,
5108 	[CLKID_CPU1_CLK]		= &sm1_cpu1_clk.hw,
5109 	[CLKID_CPU2_CLK]		= &sm1_cpu2_clk.hw,
5110 	[CLKID_CPU3_CLK]		= &sm1_cpu3_clk.hw,
5111 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
5112 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
5113 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
5114 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
5115 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
5116 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
5117 	[CLKID_NNA_AXI_CLK_SEL]		= &sm1_nna_axi_clk_sel.hw,
5118 	[CLKID_NNA_AXI_CLK_DIV]		= &sm1_nna_axi_clk_div.hw,
5119 	[CLKID_NNA_AXI_CLK]		= &sm1_nna_axi_clk.hw,
5120 	[CLKID_NNA_CORE_CLK_SEL]	= &sm1_nna_core_clk_sel.hw,
5121 	[CLKID_NNA_CORE_CLK_DIV]	= &sm1_nna_core_clk_div.hw,
5122 	[CLKID_NNA_CORE_CLK]		= &sm1_nna_core_clk.hw,
5123 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
5124 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
5125 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
5126 };
5127 
5128 /* Convenience table to populate regmap in .probe */
5129 static struct clk_regmap *const g12a_clk_regmaps[] = {
5130 	&g12a_clk81,
5131 	&g12a_dos,
5132 	&g12a_ddr,
5133 	&g12a_audio_locker,
5134 	&g12a_mipi_dsi_host,
5135 	&g12a_eth_phy,
5136 	&g12a_isa,
5137 	&g12a_pl301,
5138 	&g12a_periphs,
5139 	&g12a_spicc_0,
5140 	&g12a_i2c,
5141 	&g12a_sana,
5142 	&g12a_sd,
5143 	&g12a_rng0,
5144 	&g12a_uart0,
5145 	&g12a_spicc_1,
5146 	&g12a_hiu_reg,
5147 	&g12a_mipi_dsi_phy,
5148 	&g12a_assist_misc,
5149 	&g12a_emmc_a,
5150 	&g12a_emmc_b,
5151 	&g12a_emmc_c,
5152 	&g12a_audio_codec,
5153 	&g12a_audio,
5154 	&g12a_eth_core,
5155 	&g12a_demux,
5156 	&g12a_audio_ififo,
5157 	&g12a_adc,
5158 	&g12a_uart1,
5159 	&g12a_g2d,
5160 	&g12a_reset,
5161 	&g12a_pcie_comb,
5162 	&g12a_parser,
5163 	&g12a_usb_general,
5164 	&g12a_pcie_phy,
5165 	&g12a_ahb_arb0,
5166 	&g12a_ahb_data_bus,
5167 	&g12a_ahb_ctrl_bus,
5168 	&g12a_htx_hdcp22,
5169 	&g12a_htx_pclk,
5170 	&g12a_bt656,
5171 	&g12a_usb1_to_ddr,
5172 	&g12a_mmc_pclk,
5173 	&g12a_uart2,
5174 	&g12a_vpu_intr,
5175 	&g12a_gic,
5176 	&g12a_sd_emmc_a_clk0,
5177 	&g12a_sd_emmc_b_clk0,
5178 	&g12a_sd_emmc_c_clk0,
5179 	&g12a_mpeg_clk_div,
5180 	&g12a_sd_emmc_a_clk0_div,
5181 	&g12a_sd_emmc_b_clk0_div,
5182 	&g12a_sd_emmc_c_clk0_div,
5183 	&g12a_mpeg_clk_sel,
5184 	&g12a_sd_emmc_a_clk0_sel,
5185 	&g12a_sd_emmc_b_clk0_sel,
5186 	&g12a_sd_emmc_c_clk0_sel,
5187 	&g12a_mpll0,
5188 	&g12a_mpll1,
5189 	&g12a_mpll2,
5190 	&g12a_mpll3,
5191 	&g12a_mpll0_div,
5192 	&g12a_mpll1_div,
5193 	&g12a_mpll2_div,
5194 	&g12a_mpll3_div,
5195 	&g12a_fixed_pll,
5196 	&g12a_sys_pll,
5197 	&g12a_gp0_pll,
5198 	&g12a_hifi_pll,
5199 	&g12a_vclk2_venci0,
5200 	&g12a_vclk2_venci1,
5201 	&g12a_vclk2_vencp0,
5202 	&g12a_vclk2_vencp1,
5203 	&g12a_vclk2_venct0,
5204 	&g12a_vclk2_venct1,
5205 	&g12a_vclk2_other,
5206 	&g12a_vclk2_enci,
5207 	&g12a_vclk2_encp,
5208 	&g12a_dac_clk,
5209 	&g12a_aoclk_gate,
5210 	&g12a_iec958_gate,
5211 	&g12a_enc480p,
5212 	&g12a_rng1,
5213 	&g12a_vclk2_enct,
5214 	&g12a_vclk2_encl,
5215 	&g12a_vclk2_venclmmc,
5216 	&g12a_vclk2_vencl,
5217 	&g12a_vclk2_other1,
5218 	&g12a_fixed_pll_dco,
5219 	&g12a_sys_pll_dco,
5220 	&g12a_gp0_pll_dco,
5221 	&g12a_hifi_pll_dco,
5222 	&g12a_fclk_div2,
5223 	&g12a_fclk_div3,
5224 	&g12a_fclk_div4,
5225 	&g12a_fclk_div5,
5226 	&g12a_fclk_div7,
5227 	&g12a_fclk_div2p5,
5228 	&g12a_dma,
5229 	&g12a_efuse,
5230 	&g12a_rom_boot,
5231 	&g12a_reset_sec,
5232 	&g12a_sec_ahb_apb3,
5233 	&g12a_vpu_0_sel,
5234 	&g12a_vpu_0_div,
5235 	&g12a_vpu_0,
5236 	&g12a_vpu_1_sel,
5237 	&g12a_vpu_1_div,
5238 	&g12a_vpu_1,
5239 	&g12a_vpu,
5240 	&g12a_vapb_0_sel,
5241 	&g12a_vapb_0_div,
5242 	&g12a_vapb_0,
5243 	&g12a_vapb_1_sel,
5244 	&g12a_vapb_1_div,
5245 	&g12a_vapb_1,
5246 	&g12a_vapb_sel,
5247 	&g12a_vapb,
5248 	&g12a_hdmi_pll_dco,
5249 	&g12a_hdmi_pll_od,
5250 	&g12a_hdmi_pll_od2,
5251 	&g12a_hdmi_pll,
5252 	&g12a_vid_pll_div,
5253 	&g12a_vid_pll_sel,
5254 	&g12a_vid_pll,
5255 	&g12a_vclk_sel,
5256 	&g12a_vclk2_sel,
5257 	&g12a_vclk_input,
5258 	&g12a_vclk2_input,
5259 	&g12a_vclk_div,
5260 	&g12a_vclk2_div,
5261 	&g12a_vclk,
5262 	&g12a_vclk2,
5263 	&g12a_vclk_div1,
5264 	&g12a_vclk_div2_en,
5265 	&g12a_vclk_div4_en,
5266 	&g12a_vclk_div6_en,
5267 	&g12a_vclk_div12_en,
5268 	&g12a_vclk2_div1,
5269 	&g12a_vclk2_div2_en,
5270 	&g12a_vclk2_div4_en,
5271 	&g12a_vclk2_div6_en,
5272 	&g12a_vclk2_div12_en,
5273 	&g12a_cts_enci_sel,
5274 	&g12a_cts_encp_sel,
5275 	&g12a_cts_encl_sel,
5276 	&g12a_cts_vdac_sel,
5277 	&g12a_hdmi_tx_sel,
5278 	&g12a_cts_enci,
5279 	&g12a_cts_encp,
5280 	&g12a_cts_encl,
5281 	&g12a_cts_vdac,
5282 	&g12a_hdmi_tx,
5283 	&g12a_hdmi_sel,
5284 	&g12a_hdmi_div,
5285 	&g12a_hdmi,
5286 	&g12a_mali_0_sel,
5287 	&g12a_mali_0_div,
5288 	&g12a_mali_0,
5289 	&g12a_mali_1_sel,
5290 	&g12a_mali_1_div,
5291 	&g12a_mali_1,
5292 	&g12a_mali,
5293 	&g12a_mpll_50m,
5294 	&g12a_sys_pll_div16_en,
5295 	&g12a_cpu_clk_premux0,
5296 	&g12a_cpu_clk_mux0_div,
5297 	&g12a_cpu_clk_postmux0,
5298 	&g12a_cpu_clk_premux1,
5299 	&g12a_cpu_clk_mux1_div,
5300 	&g12a_cpu_clk_postmux1,
5301 	&g12a_cpu_clk_dyn,
5302 	&g12a_cpu_clk,
5303 	&g12a_cpu_clk_div16_en,
5304 	&g12a_cpu_clk_apb_div,
5305 	&g12a_cpu_clk_apb,
5306 	&g12a_cpu_clk_atb_div,
5307 	&g12a_cpu_clk_atb,
5308 	&g12a_cpu_clk_axi_div,
5309 	&g12a_cpu_clk_axi,
5310 	&g12a_cpu_clk_trace_div,
5311 	&g12a_cpu_clk_trace,
5312 	&g12a_pcie_pll_od,
5313 	&g12a_pcie_pll_dco,
5314 	&g12a_vdec_1_sel,
5315 	&g12a_vdec_1_div,
5316 	&g12a_vdec_1,
5317 	&g12a_vdec_hevc_sel,
5318 	&g12a_vdec_hevc_div,
5319 	&g12a_vdec_hevc,
5320 	&g12a_vdec_hevcf_sel,
5321 	&g12a_vdec_hevcf_div,
5322 	&g12a_vdec_hevcf,
5323 	&g12a_ts_div,
5324 	&g12a_ts,
5325 	&g12b_cpu_clk,
5326 	&g12b_sys1_pll_dco,
5327 	&g12b_sys1_pll,
5328 	&g12b_sys1_pll_div16_en,
5329 	&g12b_cpub_clk_premux0,
5330 	&g12b_cpub_clk_mux0_div,
5331 	&g12b_cpub_clk_postmux0,
5332 	&g12b_cpub_clk_premux1,
5333 	&g12b_cpub_clk_mux1_div,
5334 	&g12b_cpub_clk_postmux1,
5335 	&g12b_cpub_clk_dyn,
5336 	&g12b_cpub_clk,
5337 	&g12b_cpub_clk_div16_en,
5338 	&g12b_cpub_clk_apb_sel,
5339 	&g12b_cpub_clk_apb,
5340 	&g12b_cpub_clk_atb_sel,
5341 	&g12b_cpub_clk_atb,
5342 	&g12b_cpub_clk_axi_sel,
5343 	&g12b_cpub_clk_axi,
5344 	&g12b_cpub_clk_trace_sel,
5345 	&g12b_cpub_clk_trace,
5346 	&sm1_gp1_pll_dco,
5347 	&sm1_gp1_pll,
5348 	&sm1_dsu_clk_premux0,
5349 	&sm1_dsu_clk_premux1,
5350 	&sm1_dsu_clk_mux0_div,
5351 	&sm1_dsu_clk_postmux0,
5352 	&sm1_dsu_clk_mux1_div,
5353 	&sm1_dsu_clk_postmux1,
5354 	&sm1_dsu_clk_dyn,
5355 	&sm1_dsu_final_clk,
5356 	&sm1_dsu_clk,
5357 	&sm1_cpu1_clk,
5358 	&sm1_cpu2_clk,
5359 	&sm1_cpu3_clk,
5360 	&g12a_spicc0_sclk_sel,
5361 	&g12a_spicc0_sclk_div,
5362 	&g12a_spicc0_sclk,
5363 	&g12a_spicc1_sclk_sel,
5364 	&g12a_spicc1_sclk_div,
5365 	&g12a_spicc1_sclk,
5366 	&sm1_nna_axi_clk_sel,
5367 	&sm1_nna_axi_clk_div,
5368 	&sm1_nna_axi_clk,
5369 	&sm1_nna_core_clk_sel,
5370 	&sm1_nna_core_clk_div,
5371 	&sm1_nna_core_clk,
5372 	&g12a_mipi_dsi_pxclk_sel,
5373 	&g12a_mipi_dsi_pxclk_div,
5374 	&g12a_mipi_dsi_pxclk,
5375 	&g12b_mipi_isp_sel,
5376 	&g12b_mipi_isp_div,
5377 	&g12b_mipi_isp,
5378 	&g12b_mipi_isp_gate,
5379 	&g12b_csi_phy1,
5380 	&g12b_csi_phy0,
5381 };
5382 
5383 static const struct reg_sequence g12a_init_regs[] = {
5384 	{ .reg = HHI_MPLL_CNTL0,	.def = 0x00000543 },
5385 };
5386 
5387 #define DVFS_CON_ID "dvfs"
5388 
meson_g12a_dvfs_setup_common(struct device * dev,struct clk_hw ** hws)5389 static int meson_g12a_dvfs_setup_common(struct device *dev,
5390 					struct clk_hw **hws)
5391 {
5392 	struct clk *notifier_clk;
5393 	struct clk_hw *xtal;
5394 	int ret;
5395 
5396 	xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
5397 
5398 	/* Setup clock notifier for cpu_clk_postmux0 */
5399 	g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
5400 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw,
5401 					   DVFS_CON_ID);
5402 	ret = devm_clk_notifier_register(dev, notifier_clk,
5403 					 &g12a_cpu_clk_postmux0_nb_data.nb);
5404 	if (ret) {
5405 		dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n");
5406 		return ret;
5407 	}
5408 
5409 	/* Setup clock notifier for cpu_clk_dyn mux */
5410 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw,
5411 					   DVFS_CON_ID);
5412 	ret = devm_clk_notifier_register(dev, notifier_clk,
5413 					 &g12a_cpu_clk_mux_nb);
5414 	if (ret) {
5415 		dev_err(dev, "failed to register the cpu_clk_dyn notifier\n");
5416 		return ret;
5417 	}
5418 
5419 	return 0;
5420 }
5421 
meson_g12b_dvfs_setup(struct platform_device * pdev)5422 static int meson_g12b_dvfs_setup(struct platform_device *pdev)
5423 {
5424 	struct clk_hw **hws = g12b_hw_clks;
5425 	struct device *dev = &pdev->dev;
5426 	struct clk *notifier_clk;
5427 	struct clk_hw *xtal;
5428 	int ret;
5429 
5430 	ret = meson_g12a_dvfs_setup_common(dev, hws);
5431 	if (ret)
5432 		return ret;
5433 
5434 	xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
5435 
5436 	/* Setup clock notifier for cpu_clk mux */
5437 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw,
5438 					   DVFS_CON_ID);
5439 	ret = devm_clk_notifier_register(dev, notifier_clk,
5440 					 &g12a_cpu_clk_mux_nb);
5441 	if (ret) {
5442 		dev_err(dev, "failed to register the cpu_clk notifier\n");
5443 		return ret;
5444 	}
5445 
5446 	/* Setup clock notifier for sys1_pll */
5447 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw,
5448 					   DVFS_CON_ID);
5449 	ret = devm_clk_notifier_register(dev, notifier_clk,
5450 					 &g12b_cpu_clk_sys1_pll_nb_data.nb);
5451 	if (ret) {
5452 		dev_err(dev, "failed to register the sys1_pll notifier\n");
5453 		return ret;
5454 	}
5455 
5456 	/* Add notifiers for the second CPU cluster */
5457 
5458 	/* Setup clock notifier for cpub_clk_postmux0 */
5459 	g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
5460 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw,
5461 					   DVFS_CON_ID);
5462 	ret = devm_clk_notifier_register(dev, notifier_clk,
5463 					 &g12b_cpub_clk_postmux0_nb_data.nb);
5464 	if (ret) {
5465 		dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n");
5466 		return ret;
5467 	}
5468 
5469 	/* Setup clock notifier for cpub_clk_dyn mux */
5470 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs");
5471 	ret = devm_clk_notifier_register(dev, notifier_clk,
5472 					 &g12a_cpu_clk_mux_nb);
5473 	if (ret) {
5474 		dev_err(dev, "failed to register the cpub_clk_dyn notifier\n");
5475 		return ret;
5476 	}
5477 
5478 	/* Setup clock notifier for cpub_clk mux */
5479 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID);
5480 	ret = devm_clk_notifier_register(dev, notifier_clk,
5481 					 &g12a_cpu_clk_mux_nb);
5482 	if (ret) {
5483 		dev_err(dev, "failed to register the cpub_clk notifier\n");
5484 		return ret;
5485 	}
5486 
5487 	/* Setup clock notifier for sys_pll */
5488 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
5489 	ret = devm_clk_notifier_register(dev, notifier_clk,
5490 					 &g12b_cpub_clk_sys_pll_nb_data.nb);
5491 	if (ret) {
5492 		dev_err(dev, "failed to register the sys_pll notifier\n");
5493 		return ret;
5494 	}
5495 
5496 	return 0;
5497 }
5498 
meson_g12a_dvfs_setup(struct platform_device * pdev)5499 static int meson_g12a_dvfs_setup(struct platform_device *pdev)
5500 {
5501 	struct clk_hw **hws = g12a_hw_clks;
5502 	struct device *dev = &pdev->dev;
5503 	struct clk *notifier_clk;
5504 	int ret;
5505 
5506 	ret = meson_g12a_dvfs_setup_common(dev, hws);
5507 	if (ret)
5508 		return ret;
5509 
5510 	/* Setup clock notifier for cpu_clk mux */
5511 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID);
5512 	ret = devm_clk_notifier_register(dev, notifier_clk,
5513 				    &g12a_cpu_clk_mux_nb);
5514 	if (ret) {
5515 		dev_err(dev, "failed to register the cpu_clk notifier\n");
5516 		return ret;
5517 	}
5518 
5519 	/* Setup clock notifier for sys_pll */
5520 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
5521 	ret = devm_clk_notifier_register(dev, notifier_clk,
5522 					 &g12a_sys_pll_nb_data.nb);
5523 	if (ret) {
5524 		dev_err(dev, "failed to register the sys_pll notifier\n");
5525 		return ret;
5526 	}
5527 
5528 	return 0;
5529 }
5530 
5531 struct meson_g12a_data {
5532 	const struct meson_eeclkc_data eeclkc_data;
5533 	int (*dvfs_setup)(struct platform_device *pdev);
5534 };
5535 
meson_g12a_probe(struct platform_device * pdev)5536 static int meson_g12a_probe(struct platform_device *pdev)
5537 {
5538 	const struct meson_eeclkc_data *eeclkc_data;
5539 	const struct meson_g12a_data *g12a_data;
5540 	int ret;
5541 
5542 	eeclkc_data = of_device_get_match_data(&pdev->dev);
5543 	if (!eeclkc_data)
5544 		return -EINVAL;
5545 
5546 	ret = meson_eeclkc_probe(pdev);
5547 	if (ret)
5548 		return ret;
5549 
5550 	g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
5551 				 eeclkc_data);
5552 
5553 	if (g12a_data->dvfs_setup)
5554 		return g12a_data->dvfs_setup(pdev);
5555 
5556 	return 0;
5557 }
5558 
5559 static const struct meson_g12a_data g12a_clkc_data = {
5560 	.eeclkc_data = {
5561 		.regmap_clks = g12a_clk_regmaps,
5562 		.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5563 		.hw_clks = {
5564 			.hws = g12a_hw_clks,
5565 			.num = ARRAY_SIZE(g12a_hw_clks),
5566 		},
5567 		.init_regs = g12a_init_regs,
5568 		.init_count = ARRAY_SIZE(g12a_init_regs),
5569 	},
5570 	.dvfs_setup = meson_g12a_dvfs_setup,
5571 };
5572 
5573 static const struct meson_g12a_data g12b_clkc_data = {
5574 	.eeclkc_data = {
5575 		.regmap_clks = g12a_clk_regmaps,
5576 		.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5577 		.hw_clks = {
5578 			.hws = g12b_hw_clks,
5579 			.num = ARRAY_SIZE(g12b_hw_clks),
5580 		},
5581 	},
5582 	.dvfs_setup = meson_g12b_dvfs_setup,
5583 };
5584 
5585 static const struct meson_g12a_data sm1_clkc_data = {
5586 	.eeclkc_data = {
5587 		.regmap_clks = g12a_clk_regmaps,
5588 		.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5589 		.hw_clks = {
5590 			.hws = sm1_hw_clks,
5591 			.num = ARRAY_SIZE(sm1_hw_clks),
5592 		},
5593 	},
5594 	.dvfs_setup = meson_g12a_dvfs_setup,
5595 };
5596 
5597 static const struct of_device_id clkc_match_table[] = {
5598 	{
5599 		.compatible = "amlogic,g12a-clkc",
5600 		.data = &g12a_clkc_data.eeclkc_data
5601 	},
5602 	{
5603 		.compatible = "amlogic,g12b-clkc",
5604 		.data = &g12b_clkc_data.eeclkc_data
5605 	},
5606 	{
5607 		.compatible = "amlogic,sm1-clkc",
5608 		.data = &sm1_clkc_data.eeclkc_data
5609 	},
5610 	{}
5611 };
5612 MODULE_DEVICE_TABLE(of, clkc_match_table);
5613 
5614 static struct platform_driver g12a_driver = {
5615 	.probe		= meson_g12a_probe,
5616 	.driver		= {
5617 		.name	= "g12a-clkc",
5618 		.of_match_table = clkc_match_table,
5619 	},
5620 };
5621 module_platform_driver(g12a_driver);
5622 
5623 MODULE_DESCRIPTION("Amlogic G12/SM1 Main Clock Controller driver");
5624 MODULE_LICENSE("GPL");
5625 MODULE_IMPORT_NS("CLK_MESON");
5626