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