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