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