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