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