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