1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 * Author: Jian Hu <jian.hu@amlogic.com>
5 *
6 * Copyright (c) 2023, SberDevices. All Rights Reserved.
7 * Author: Dmitry Rokosov <ddrokosov@sberdevices.ru>
8 */
9
10 #include <linux/clk-provider.h>
11 #include <linux/mod_devicetable.h>
12 #include <linux/platform_device.h>
13 #include "a1-peripherals.h"
14 #include "clk-dualdiv.h"
15 #include "clk-regmap.h"
16 #include "meson-clkc-utils.h"
17
18 #include <dt-bindings/clock/amlogic,a1-peripherals-clkc.h>
19
20 static struct clk_regmap xtal_in = {
21 .data = &(struct clk_regmap_gate_data){
22 .offset = SYS_OSCIN_CTRL,
23 .bit_idx = 0,
24 },
25 .hw.init = &(struct clk_init_data) {
26 .name = "xtal_in",
27 .ops = &clk_regmap_gate_ro_ops,
28 .parent_data = &(const struct clk_parent_data) {
29 .fw_name = "xtal",
30 },
31 .num_parents = 1,
32 },
33 };
34
35 static struct clk_regmap fixpll_in = {
36 .data = &(struct clk_regmap_gate_data){
37 .offset = SYS_OSCIN_CTRL,
38 .bit_idx = 1,
39 },
40 .hw.init = &(struct clk_init_data) {
41 .name = "fixpll_in",
42 .ops = &clk_regmap_gate_ro_ops,
43 .parent_data = &(const struct clk_parent_data) {
44 .fw_name = "xtal",
45 },
46 .num_parents = 1,
47 },
48 };
49
50 static struct clk_regmap usb_phy_in = {
51 .data = &(struct clk_regmap_gate_data){
52 .offset = SYS_OSCIN_CTRL,
53 .bit_idx = 2,
54 },
55 .hw.init = &(struct clk_init_data) {
56 .name = "usb_phy_in",
57 .ops = &clk_regmap_gate_ops,
58 .parent_data = &(const struct clk_parent_data) {
59 .fw_name = "xtal",
60 },
61 .num_parents = 1,
62 },
63 };
64
65 static struct clk_regmap usb_ctrl_in = {
66 .data = &(struct clk_regmap_gate_data){
67 .offset = SYS_OSCIN_CTRL,
68 .bit_idx = 3,
69 },
70 .hw.init = &(struct clk_init_data) {
71 .name = "usb_ctrl_in",
72 .ops = &clk_regmap_gate_ops,
73 .parent_data = &(const struct clk_parent_data) {
74 .fw_name = "xtal",
75 },
76 .num_parents = 1,
77 },
78 };
79
80 static struct clk_regmap hifipll_in = {
81 .data = &(struct clk_regmap_gate_data){
82 .offset = SYS_OSCIN_CTRL,
83 .bit_idx = 4,
84 },
85 .hw.init = &(struct clk_init_data) {
86 .name = "hifipll_in",
87 .ops = &clk_regmap_gate_ops,
88 .parent_data = &(const struct clk_parent_data) {
89 .fw_name = "xtal",
90 },
91 .num_parents = 1,
92 },
93 };
94
95 static struct clk_regmap syspll_in = {
96 .data = &(struct clk_regmap_gate_data){
97 .offset = SYS_OSCIN_CTRL,
98 .bit_idx = 5,
99 },
100 .hw.init = &(struct clk_init_data) {
101 .name = "syspll_in",
102 .ops = &clk_regmap_gate_ops,
103 .parent_data = &(const struct clk_parent_data) {
104 .fw_name = "xtal",
105 },
106 .num_parents = 1,
107 },
108 };
109
110 static struct clk_regmap dds_in = {
111 .data = &(struct clk_regmap_gate_data){
112 .offset = SYS_OSCIN_CTRL,
113 .bit_idx = 6,
114 },
115 .hw.init = &(struct clk_init_data) {
116 .name = "dds_in",
117 .ops = &clk_regmap_gate_ops,
118 .parent_data = &(const struct clk_parent_data) {
119 .fw_name = "xtal",
120 },
121 .num_parents = 1,
122 },
123 };
124
125 static struct clk_regmap rtc_32k_in = {
126 .data = &(struct clk_regmap_gate_data){
127 .offset = RTC_BY_OSCIN_CTRL0,
128 .bit_idx = 31,
129 },
130 .hw.init = &(struct clk_init_data) {
131 .name = "rtc_32k_in",
132 .ops = &clk_regmap_gate_ops,
133 .parent_data = &(const struct clk_parent_data) {
134 .fw_name = "xtal",
135 },
136 .num_parents = 1,
137 },
138 };
139
140 static const struct meson_clk_dualdiv_param clk_32k_div_table[] = {
141 {
142 .dual = 1,
143 .n1 = 733,
144 .m1 = 8,
145 .n2 = 732,
146 .m2 = 11,
147 },
148 {}
149 };
150
151 static struct clk_regmap rtc_32k_div = {
152 .data = &(struct meson_clk_dualdiv_data){
153 .n1 = {
154 .reg_off = RTC_BY_OSCIN_CTRL0,
155 .shift = 0,
156 .width = 12,
157 },
158 .n2 = {
159 .reg_off = RTC_BY_OSCIN_CTRL0,
160 .shift = 12,
161 .width = 12,
162 },
163 .m1 = {
164 .reg_off = RTC_BY_OSCIN_CTRL1,
165 .shift = 0,
166 .width = 12,
167 },
168 .m2 = {
169 .reg_off = RTC_BY_OSCIN_CTRL1,
170 .shift = 12,
171 .width = 12,
172 },
173 .dual = {
174 .reg_off = RTC_BY_OSCIN_CTRL0,
175 .shift = 28,
176 .width = 1,
177 },
178 .table = clk_32k_div_table,
179 },
180 .hw.init = &(struct clk_init_data){
181 .name = "rtc_32k_div",
182 .ops = &meson_clk_dualdiv_ops,
183 .parent_hws = (const struct clk_hw *[]) {
184 &rtc_32k_in.hw
185 },
186 .num_parents = 1,
187 },
188 };
189
190 static struct clk_regmap rtc_32k_xtal = {
191 .data = &(struct clk_regmap_gate_data){
192 .offset = RTC_BY_OSCIN_CTRL1,
193 .bit_idx = 24,
194 },
195 .hw.init = &(struct clk_init_data) {
196 .name = "rtc_32k_xtal",
197 .ops = &clk_regmap_gate_ops,
198 .parent_hws = (const struct clk_hw *[]) {
199 &rtc_32k_in.hw
200 },
201 .num_parents = 1,
202 },
203 };
204
205 static struct clk_regmap rtc_32k_sel = {
206 .data = &(struct clk_regmap_mux_data) {
207 .offset = RTC_CTRL,
208 .mask = 0x3,
209 .shift = 0,
210 .flags = CLK_MUX_ROUND_CLOSEST,
211 },
212 .hw.init = &(struct clk_init_data){
213 .name = "rtc_32k_sel",
214 .ops = &clk_regmap_mux_ops,
215 .parent_hws = (const struct clk_hw *[]) {
216 &rtc_32k_xtal.hw,
217 &rtc_32k_div.hw,
218 },
219 .num_parents = 2,
220 .flags = CLK_SET_RATE_PARENT,
221 },
222 };
223
224 static struct clk_regmap rtc = {
225 .data = &(struct clk_regmap_gate_data){
226 .offset = RTC_BY_OSCIN_CTRL0,
227 .bit_idx = 30,
228 },
229 .hw.init = &(struct clk_init_data){
230 .name = "rtc",
231 .ops = &clk_regmap_gate_ops,
232 .parent_hws = (const struct clk_hw *[]) {
233 &rtc_32k_sel.hw
234 },
235 .num_parents = 1,
236 .flags = CLK_SET_RATE_PARENT,
237 },
238 };
239
240 static u32 mux_table_sys[] = { 0, 1, 2, 3, 7 };
241 static const struct clk_parent_data sys_parents[] = {
242 { .fw_name = "xtal" },
243 { .fw_name = "fclk_div2" },
244 { .fw_name = "fclk_div3" },
245 { .fw_name = "fclk_div5" },
246 { .hw = &rtc.hw },
247 };
248
249 static struct clk_regmap sys_b_sel = {
250 .data = &(struct clk_regmap_mux_data){
251 .offset = SYS_CLK_CTRL0,
252 .mask = 0x7,
253 .shift = 26,
254 .table = mux_table_sys,
255 },
256 .hw.init = &(struct clk_init_data){
257 .name = "sys_b_sel",
258 .ops = &clk_regmap_mux_ro_ops,
259 .parent_data = sys_parents,
260 .num_parents = ARRAY_SIZE(sys_parents),
261 },
262 };
263
264 static struct clk_regmap sys_b_div = {
265 .data = &(struct clk_regmap_div_data){
266 .offset = SYS_CLK_CTRL0,
267 .shift = 16,
268 .width = 10,
269 },
270 .hw.init = &(struct clk_init_data){
271 .name = "sys_b_div",
272 .ops = &clk_regmap_divider_ro_ops,
273 .parent_hws = (const struct clk_hw *[]) {
274 &sys_b_sel.hw
275 },
276 .num_parents = 1,
277 .flags = CLK_SET_RATE_PARENT,
278 },
279 };
280
281 static struct clk_regmap sys_b = {
282 .data = &(struct clk_regmap_gate_data){
283 .offset = SYS_CLK_CTRL0,
284 .bit_idx = 29,
285 },
286 .hw.init = &(struct clk_init_data) {
287 .name = "sys_b",
288 .ops = &clk_regmap_gate_ro_ops,
289 .parent_hws = (const struct clk_hw *[]) {
290 &sys_b_div.hw
291 },
292 .num_parents = 1,
293 .flags = CLK_SET_RATE_PARENT,
294 },
295 };
296
297 static struct clk_regmap sys_a_sel = {
298 .data = &(struct clk_regmap_mux_data){
299 .offset = SYS_CLK_CTRL0,
300 .mask = 0x7,
301 .shift = 10,
302 .table = mux_table_sys,
303 },
304 .hw.init = &(struct clk_init_data){
305 .name = "sys_a_sel",
306 .ops = &clk_regmap_mux_ro_ops,
307 .parent_data = sys_parents,
308 .num_parents = ARRAY_SIZE(sys_parents),
309 },
310 };
311
312 static struct clk_regmap sys_a_div = {
313 .data = &(struct clk_regmap_div_data){
314 .offset = SYS_CLK_CTRL0,
315 .shift = 0,
316 .width = 10,
317 },
318 .hw.init = &(struct clk_init_data){
319 .name = "sys_a_div",
320 .ops = &clk_regmap_divider_ro_ops,
321 .parent_hws = (const struct clk_hw *[]) {
322 &sys_a_sel.hw
323 },
324 .num_parents = 1,
325 .flags = CLK_SET_RATE_PARENT,
326 },
327 };
328
329 static struct clk_regmap sys_a = {
330 .data = &(struct clk_regmap_gate_data){
331 .offset = SYS_CLK_CTRL0,
332 .bit_idx = 13,
333 },
334 .hw.init = &(struct clk_init_data) {
335 .name = "sys_a",
336 .ops = &clk_regmap_gate_ro_ops,
337 .parent_hws = (const struct clk_hw *[]) {
338 &sys_a_div.hw
339 },
340 .num_parents = 1,
341 .flags = CLK_SET_RATE_PARENT,
342 },
343 };
344
345 static struct clk_regmap sys = {
346 .data = &(struct clk_regmap_mux_data){
347 .offset = SYS_CLK_CTRL0,
348 .mask = 0x1,
349 .shift = 31,
350 },
351 .hw.init = &(struct clk_init_data){
352 .name = "sys",
353 .ops = &clk_regmap_mux_ro_ops,
354 .parent_hws = (const struct clk_hw *[]) {
355 &sys_a.hw,
356 &sys_b.hw,
357 },
358 .num_parents = 2,
359 /*
360 * This clock is used by APB bus which is set in boot ROM code
361 * and is required by the platform to operate correctly.
362 * Until the following condition are met, we need this clock to
363 * be marked as critical:
364 * a) Mark the clock used by a firmware resource, if possible
365 * b) CCF has a clock hand-off mechanism to make the sure the
366 * clock stays on until the proper driver comes along
367 */
368 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
369 },
370 };
371
372 static u32 mux_table_dsp_ab[] = { 0, 1, 2, 3, 4, 7 };
373 static const struct clk_parent_data dsp_ab_parent_data[] = {
374 { .fw_name = "xtal", },
375 { .fw_name = "fclk_div2", },
376 { .fw_name = "fclk_div3", },
377 { .fw_name = "fclk_div5", },
378 { .fw_name = "hifi_pll", },
379 { .hw = &rtc.hw },
380 };
381
382 static struct clk_regmap dspa_a_sel = {
383 .data = &(struct clk_regmap_mux_data){
384 .offset = DSPA_CLK_CTRL0,
385 .mask = 0x7,
386 .shift = 10,
387 .table = mux_table_dsp_ab,
388 },
389 .hw.init = &(struct clk_init_data){
390 .name = "dspa_a_sel",
391 .ops = &clk_regmap_mux_ops,
392 .parent_data = dsp_ab_parent_data,
393 .num_parents = ARRAY_SIZE(dsp_ab_parent_data),
394 },
395 };
396
397 static struct clk_regmap dspa_a_div = {
398 .data = &(struct clk_regmap_div_data){
399 .offset = DSPA_CLK_CTRL0,
400 .shift = 0,
401 .width = 10,
402 },
403 .hw.init = &(struct clk_init_data){
404 .name = "dspa_a_div",
405 .ops = &clk_regmap_divider_ops,
406 .parent_hws = (const struct clk_hw *[]) {
407 &dspa_a_sel.hw
408 },
409 .num_parents = 1,
410 .flags = CLK_SET_RATE_PARENT,
411 },
412 };
413
414 static struct clk_regmap dspa_a = {
415 .data = &(struct clk_regmap_gate_data){
416 .offset = DSPA_CLK_CTRL0,
417 .bit_idx = 13,
418 },
419 .hw.init = &(struct clk_init_data) {
420 .name = "dspa_a",
421 .ops = &clk_regmap_gate_ops,
422 .parent_hws = (const struct clk_hw *[]) {
423 &dspa_a_div.hw
424 },
425 .num_parents = 1,
426 .flags = CLK_SET_RATE_PARENT,
427 },
428 };
429
430 static struct clk_regmap dspa_b_sel = {
431 .data = &(struct clk_regmap_mux_data){
432 .offset = DSPA_CLK_CTRL0,
433 .mask = 0x7,
434 .shift = 26,
435 .table = mux_table_dsp_ab,
436 },
437 .hw.init = &(struct clk_init_data){
438 .name = "dspa_b_sel",
439 .ops = &clk_regmap_mux_ops,
440 .parent_data = dsp_ab_parent_data,
441 .num_parents = ARRAY_SIZE(dsp_ab_parent_data),
442 },
443 };
444
445 static struct clk_regmap dspa_b_div = {
446 .data = &(struct clk_regmap_div_data){
447 .offset = DSPA_CLK_CTRL0,
448 .shift = 16,
449 .width = 10,
450 },
451 .hw.init = &(struct clk_init_data){
452 .name = "dspa_b_div",
453 .ops = &clk_regmap_divider_ops,
454 .parent_hws = (const struct clk_hw *[]) {
455 &dspa_b_sel.hw
456 },
457 .num_parents = 1,
458 .flags = CLK_SET_RATE_PARENT,
459 },
460 };
461
462 static struct clk_regmap dspa_b = {
463 .data = &(struct clk_regmap_gate_data){
464 .offset = DSPA_CLK_CTRL0,
465 .bit_idx = 29,
466 },
467 .hw.init = &(struct clk_init_data) {
468 .name = "dspa_b",
469 .ops = &clk_regmap_gate_ops,
470 .parent_hws = (const struct clk_hw *[]) {
471 &dspa_b_div.hw
472 },
473 .num_parents = 1,
474 .flags = CLK_SET_RATE_PARENT,
475 },
476 };
477
478 static struct clk_regmap dspa_sel = {
479 .data = &(struct clk_regmap_mux_data){
480 .offset = DSPA_CLK_CTRL0,
481 .mask = 0x1,
482 .shift = 15,
483 },
484 .hw.init = &(struct clk_init_data){
485 .name = "dspa_sel",
486 .ops = &clk_regmap_mux_ops,
487 .parent_hws = (const struct clk_hw *[]) {
488 &dspa_a.hw,
489 &dspa_b.hw,
490 },
491 .num_parents = 2,
492 .flags = CLK_SET_RATE_PARENT,
493 },
494 };
495
496 static struct clk_regmap dspa_en = {
497 .data = &(struct clk_regmap_gate_data){
498 .offset = DSPA_CLK_EN,
499 .bit_idx = 1,
500 },
501 .hw.init = &(struct clk_init_data) {
502 .name = "dspa_en",
503 .ops = &clk_regmap_gate_ops,
504 .parent_hws = (const struct clk_hw *[]) {
505 &dspa_sel.hw
506 },
507 .num_parents = 1,
508 .flags = CLK_SET_RATE_PARENT,
509 },
510 };
511
512 static struct clk_regmap dspa_en_nic = {
513 .data = &(struct clk_regmap_gate_data){
514 .offset = DSPA_CLK_EN,
515 .bit_idx = 0,
516 },
517 .hw.init = &(struct clk_init_data) {
518 .name = "dspa_en_nic",
519 .ops = &clk_regmap_gate_ops,
520 .parent_hws = (const struct clk_hw *[]) {
521 &dspa_sel.hw
522 },
523 .num_parents = 1,
524 .flags = CLK_SET_RATE_PARENT,
525 },
526 };
527
528 static struct clk_regmap dspb_a_sel = {
529 .data = &(struct clk_regmap_mux_data){
530 .offset = DSPB_CLK_CTRL0,
531 .mask = 0x7,
532 .shift = 10,
533 .table = mux_table_dsp_ab,
534 },
535 .hw.init = &(struct clk_init_data){
536 .name = "dspb_a_sel",
537 .ops = &clk_regmap_mux_ops,
538 .parent_data = dsp_ab_parent_data,
539 .num_parents = ARRAY_SIZE(dsp_ab_parent_data),
540 },
541 };
542
543 static struct clk_regmap dspb_a_div = {
544 .data = &(struct clk_regmap_div_data){
545 .offset = DSPB_CLK_CTRL0,
546 .shift = 0,
547 .width = 10,
548 },
549 .hw.init = &(struct clk_init_data){
550 .name = "dspb_a_div",
551 .ops = &clk_regmap_divider_ops,
552 .parent_hws = (const struct clk_hw *[]) {
553 &dspb_a_sel.hw
554 },
555 .num_parents = 1,
556 .flags = CLK_SET_RATE_PARENT,
557 },
558 };
559
560 static struct clk_regmap dspb_a = {
561 .data = &(struct clk_regmap_gate_data){
562 .offset = DSPB_CLK_CTRL0,
563 .bit_idx = 13,
564 },
565 .hw.init = &(struct clk_init_data) {
566 .name = "dspb_a",
567 .ops = &clk_regmap_gate_ops,
568 .parent_hws = (const struct clk_hw *[]) {
569 &dspb_a_div.hw
570 },
571 .num_parents = 1,
572 .flags = CLK_SET_RATE_PARENT,
573 },
574 };
575
576 static struct clk_regmap dspb_b_sel = {
577 .data = &(struct clk_regmap_mux_data){
578 .offset = DSPB_CLK_CTRL0,
579 .mask = 0x7,
580 .shift = 26,
581 .table = mux_table_dsp_ab,
582 },
583 .hw.init = &(struct clk_init_data){
584 .name = "dspb_b_sel",
585 .ops = &clk_regmap_mux_ops,
586 .parent_data = dsp_ab_parent_data,
587 .num_parents = ARRAY_SIZE(dsp_ab_parent_data),
588 },
589 };
590
591 static struct clk_regmap dspb_b_div = {
592 .data = &(struct clk_regmap_div_data){
593 .offset = DSPB_CLK_CTRL0,
594 .shift = 16,
595 .width = 10,
596 },
597 .hw.init = &(struct clk_init_data){
598 .name = "dspb_b_div",
599 .ops = &clk_regmap_divider_ops,
600 .parent_hws = (const struct clk_hw *[]) {
601 &dspb_b_sel.hw
602 },
603 .num_parents = 1,
604 .flags = CLK_SET_RATE_PARENT,
605 },
606 };
607
608 static struct clk_regmap dspb_b = {
609 .data = &(struct clk_regmap_gate_data){
610 .offset = DSPB_CLK_CTRL0,
611 .bit_idx = 29,
612 },
613 .hw.init = &(struct clk_init_data) {
614 .name = "dspb_b",
615 .ops = &clk_regmap_gate_ops,
616 .parent_hws = (const struct clk_hw *[]) {
617 &dspb_b_div.hw
618 },
619 .num_parents = 1,
620 .flags = CLK_SET_RATE_PARENT,
621 },
622 };
623
624 static struct clk_regmap dspb_sel = {
625 .data = &(struct clk_regmap_mux_data){
626 .offset = DSPB_CLK_CTRL0,
627 .mask = 0x1,
628 .shift = 15,
629 },
630 .hw.init = &(struct clk_init_data){
631 .name = "dspb_sel",
632 .ops = &clk_regmap_mux_ops,
633 .parent_hws = (const struct clk_hw *[]) {
634 &dspb_a.hw,
635 &dspb_b.hw,
636 },
637 .num_parents = 2,
638 .flags = CLK_SET_RATE_PARENT,
639 },
640 };
641
642 static struct clk_regmap dspb_en = {
643 .data = &(struct clk_regmap_gate_data){
644 .offset = DSPB_CLK_EN,
645 .bit_idx = 1,
646 },
647 .hw.init = &(struct clk_init_data) {
648 .name = "dspb_en",
649 .ops = &clk_regmap_gate_ops,
650 .parent_hws = (const struct clk_hw *[]) {
651 &dspb_sel.hw
652 },
653 .num_parents = 1,
654 .flags = CLK_SET_RATE_PARENT,
655 },
656 };
657
658 static struct clk_regmap dspb_en_nic = {
659 .data = &(struct clk_regmap_gate_data){
660 .offset = DSPB_CLK_EN,
661 .bit_idx = 0,
662 },
663 .hw.init = &(struct clk_init_data) {
664 .name = "dspb_en_nic",
665 .ops = &clk_regmap_gate_ops,
666 .parent_hws = (const struct clk_hw *[]) {
667 &dspb_sel.hw
668 },
669 .num_parents = 1,
670 .flags = CLK_SET_RATE_PARENT,
671 },
672 };
673
674 static struct clk_regmap clk_24m = {
675 .data = &(struct clk_regmap_gate_data){
676 .offset = CLK12_24_CTRL,
677 .bit_idx = 11,
678 },
679 .hw.init = &(struct clk_init_data) {
680 .name = "24m",
681 .ops = &clk_regmap_gate_ops,
682 .parent_data = &(const struct clk_parent_data) {
683 .fw_name = "xtal",
684 },
685 .num_parents = 1,
686 },
687 };
688
689 static struct clk_fixed_factor clk_24m_div2 = {
690 .mult = 1,
691 .div = 2,
692 .hw.init = &(struct clk_init_data){
693 .name = "24m_div2",
694 .ops = &clk_fixed_factor_ops,
695 .parent_hws = (const struct clk_hw *[]) {
696 &clk_24m.hw
697 },
698 .num_parents = 1,
699 },
700 };
701
702 static struct clk_regmap clk_12m = {
703 .data = &(struct clk_regmap_gate_data){
704 .offset = CLK12_24_CTRL,
705 .bit_idx = 10,
706 },
707 .hw.init = &(struct clk_init_data) {
708 .name = "12m",
709 .ops = &clk_regmap_gate_ops,
710 .parent_hws = (const struct clk_hw *[]) {
711 &clk_24m_div2.hw
712 },
713 .num_parents = 1,
714 },
715 };
716
717 static struct clk_regmap fclk_div2_divn_pre = {
718 .data = &(struct clk_regmap_div_data){
719 .offset = CLK12_24_CTRL,
720 .shift = 0,
721 .width = 8,
722 },
723 .hw.init = &(struct clk_init_data){
724 .name = "fclk_div2_divn_pre",
725 .ops = &clk_regmap_divider_ops,
726 .parent_data = &(const struct clk_parent_data) {
727 .fw_name = "fclk_div2",
728 },
729 .num_parents = 1,
730 },
731 };
732
733 static struct clk_regmap fclk_div2_divn = {
734 .data = &(struct clk_regmap_gate_data){
735 .offset = CLK12_24_CTRL,
736 .bit_idx = 12,
737 },
738 .hw.init = &(struct clk_init_data){
739 .name = "fclk_div2_divn",
740 .ops = &clk_regmap_gate_ops,
741 .parent_hws = (const struct clk_hw *[]) {
742 &fclk_div2_divn_pre.hw
743 },
744 .num_parents = 1,
745 .flags = CLK_SET_RATE_PARENT,
746 },
747 };
748
749 /*
750 * the index 2 is sys_pll_div16, it will be implemented in the CPU clock driver,
751 * the index 4 is the clock measurement source, it's not supported yet
752 */
753 static u32 gen_table[] = { 0, 1, 3, 5, 6, 7, 8 };
754 static const struct clk_parent_data gen_parent_data[] = {
755 { .fw_name = "xtal", },
756 { .hw = &rtc.hw },
757 { .fw_name = "hifi_pll", },
758 { .fw_name = "fclk_div2", },
759 { .fw_name = "fclk_div3", },
760 { .fw_name = "fclk_div5", },
761 { .fw_name = "fclk_div7", },
762 };
763
764 static struct clk_regmap gen_sel = {
765 .data = &(struct clk_regmap_mux_data){
766 .offset = GEN_CLK_CTRL,
767 .mask = 0xf,
768 .shift = 12,
769 .table = gen_table,
770 },
771 .hw.init = &(struct clk_init_data){
772 .name = "gen_sel",
773 .ops = &clk_regmap_mux_ops,
774 .parent_data = gen_parent_data,
775 .num_parents = ARRAY_SIZE(gen_parent_data),
776 /*
777 * The GEN clock can be connected to an external pad, so it
778 * may be set up directly from the device tree. Additionally,
779 * the GEN clock can be inherited from a more accurate RTC
780 * clock, so in certain situations, it may be necessary
781 * to freeze its parent.
782 */
783 .flags = CLK_SET_RATE_NO_REPARENT,
784 },
785 };
786
787 static struct clk_regmap gen_div = {
788 .data = &(struct clk_regmap_div_data){
789 .offset = GEN_CLK_CTRL,
790 .shift = 0,
791 .width = 11,
792 },
793 .hw.init = &(struct clk_init_data){
794 .name = "gen_div",
795 .ops = &clk_regmap_divider_ops,
796 .parent_hws = (const struct clk_hw *[]) {
797 &gen_sel.hw
798 },
799 .num_parents = 1,
800 .flags = CLK_SET_RATE_PARENT,
801 },
802 };
803
804 static struct clk_regmap gen = {
805 .data = &(struct clk_regmap_gate_data){
806 .offset = GEN_CLK_CTRL,
807 .bit_idx = 11,
808 },
809 .hw.init = &(struct clk_init_data) {
810 .name = "gen",
811 .ops = &clk_regmap_gate_ops,
812 .parent_hws = (const struct clk_hw *[]) {
813 &gen_div.hw
814 },
815 .num_parents = 1,
816 .flags = CLK_SET_RATE_PARENT,
817 },
818 };
819
820 static struct clk_regmap saradc_sel = {
821 .data = &(struct clk_regmap_mux_data){
822 .offset = SAR_ADC_CLK_CTRL,
823 .mask = 0x1,
824 .shift = 9,
825 },
826 .hw.init = &(struct clk_init_data){
827 .name = "saradc_sel",
828 .ops = &clk_regmap_mux_ops,
829 .parent_data = (const struct clk_parent_data []) {
830 { .fw_name = "xtal", },
831 { .hw = &sys.hw, },
832 },
833 .num_parents = 2,
834 },
835 };
836
837 static struct clk_regmap saradc_div = {
838 .data = &(struct clk_regmap_div_data){
839 .offset = SAR_ADC_CLK_CTRL,
840 .shift = 0,
841 .width = 8,
842 },
843 .hw.init = &(struct clk_init_data){
844 .name = "saradc_div",
845 .ops = &clk_regmap_divider_ops,
846 .parent_hws = (const struct clk_hw *[]) {
847 &saradc_sel.hw
848 },
849 .num_parents = 1,
850 .flags = CLK_SET_RATE_PARENT,
851 },
852 };
853
854 static struct clk_regmap saradc = {
855 .data = &(struct clk_regmap_gate_data){
856 .offset = SAR_ADC_CLK_CTRL,
857 .bit_idx = 8,
858 },
859 .hw.init = &(struct clk_init_data) {
860 .name = "saradc",
861 .ops = &clk_regmap_gate_ops,
862 .parent_hws = (const struct clk_hw *[]) {
863 &saradc_div.hw
864 },
865 .num_parents = 1,
866 .flags = CLK_SET_RATE_PARENT,
867 },
868 };
869
870 static const struct clk_parent_data pwm_abcd_parents[] = {
871 { .fw_name = "xtal", },
872 { .hw = &sys.hw },
873 { .hw = &rtc.hw },
874 };
875
876 static struct clk_regmap pwm_a_sel = {
877 .data = &(struct clk_regmap_mux_data){
878 .offset = PWM_CLK_AB_CTRL,
879 .mask = 0x1,
880 .shift = 9,
881 },
882 .hw.init = &(struct clk_init_data){
883 .name = "pwm_a_sel",
884 .ops = &clk_regmap_mux_ops,
885 .parent_data = pwm_abcd_parents,
886 .num_parents = ARRAY_SIZE(pwm_abcd_parents),
887 },
888 };
889
890 static struct clk_regmap pwm_a_div = {
891 .data = &(struct clk_regmap_div_data){
892 .offset = PWM_CLK_AB_CTRL,
893 .shift = 0,
894 .width = 8,
895 },
896 .hw.init = &(struct clk_init_data){
897 .name = "pwm_a_div",
898 .ops = &clk_regmap_divider_ops,
899 .parent_hws = (const struct clk_hw *[]) {
900 &pwm_a_sel.hw
901 },
902 .num_parents = 1,
903 .flags = CLK_SET_RATE_PARENT,
904 },
905 };
906
907 static struct clk_regmap pwm_a = {
908 .data = &(struct clk_regmap_gate_data){
909 .offset = PWM_CLK_AB_CTRL,
910 .bit_idx = 8,
911 },
912 .hw.init = &(struct clk_init_data) {
913 .name = "pwm_a",
914 .ops = &clk_regmap_gate_ops,
915 .parent_hws = (const struct clk_hw *[]) {
916 &pwm_a_div.hw
917 },
918 .num_parents = 1,
919 .flags = CLK_SET_RATE_PARENT,
920 },
921 };
922
923 static struct clk_regmap pwm_b_sel = {
924 .data = &(struct clk_regmap_mux_data){
925 .offset = PWM_CLK_AB_CTRL,
926 .mask = 0x1,
927 .shift = 25,
928 },
929 .hw.init = &(struct clk_init_data){
930 .name = "pwm_b_sel",
931 .ops = &clk_regmap_mux_ops,
932 .parent_data = pwm_abcd_parents,
933 .num_parents = ARRAY_SIZE(pwm_abcd_parents),
934 },
935 };
936
937 static struct clk_regmap pwm_b_div = {
938 .data = &(struct clk_regmap_div_data){
939 .offset = PWM_CLK_AB_CTRL,
940 .shift = 16,
941 .width = 8,
942 },
943 .hw.init = &(struct clk_init_data){
944 .name = "pwm_b_div",
945 .ops = &clk_regmap_divider_ops,
946 .parent_hws = (const struct clk_hw *[]) {
947 &pwm_b_sel.hw
948 },
949 .num_parents = 1,
950 .flags = CLK_SET_RATE_PARENT,
951 },
952 };
953
954 static struct clk_regmap pwm_b = {
955 .data = &(struct clk_regmap_gate_data){
956 .offset = PWM_CLK_AB_CTRL,
957 .bit_idx = 24,
958 },
959 .hw.init = &(struct clk_init_data) {
960 .name = "pwm_b",
961 .ops = &clk_regmap_gate_ops,
962 .parent_hws = (const struct clk_hw *[]) {
963 &pwm_b_div.hw
964 },
965 .num_parents = 1,
966 .flags = CLK_SET_RATE_PARENT,
967 },
968 };
969
970 static struct clk_regmap pwm_c_sel = {
971 .data = &(struct clk_regmap_mux_data){
972 .offset = PWM_CLK_CD_CTRL,
973 .mask = 0x1,
974 .shift = 9,
975 },
976 .hw.init = &(struct clk_init_data){
977 .name = "pwm_c_sel",
978 .ops = &clk_regmap_mux_ops,
979 .parent_data = pwm_abcd_parents,
980 .num_parents = ARRAY_SIZE(pwm_abcd_parents),
981 },
982 };
983
984 static struct clk_regmap pwm_c_div = {
985 .data = &(struct clk_regmap_div_data){
986 .offset = PWM_CLK_CD_CTRL,
987 .shift = 0,
988 .width = 8,
989 },
990 .hw.init = &(struct clk_init_data){
991 .name = "pwm_c_div",
992 .ops = &clk_regmap_divider_ops,
993 .parent_hws = (const struct clk_hw *[]) {
994 &pwm_c_sel.hw
995 },
996 .num_parents = 1,
997 .flags = CLK_SET_RATE_PARENT,
998 },
999 };
1000
1001 static struct clk_regmap pwm_c = {
1002 .data = &(struct clk_regmap_gate_data){
1003 .offset = PWM_CLK_CD_CTRL,
1004 .bit_idx = 8,
1005 },
1006 .hw.init = &(struct clk_init_data) {
1007 .name = "pwm_c",
1008 .ops = &clk_regmap_gate_ops,
1009 .parent_hws = (const struct clk_hw *[]) {
1010 &pwm_c_div.hw
1011 },
1012 .num_parents = 1,
1013 .flags = CLK_SET_RATE_PARENT,
1014 },
1015 };
1016
1017 static struct clk_regmap pwm_d_sel = {
1018 .data = &(struct clk_regmap_mux_data){
1019 .offset = PWM_CLK_CD_CTRL,
1020 .mask = 0x1,
1021 .shift = 25,
1022 },
1023 .hw.init = &(struct clk_init_data){
1024 .name = "pwm_d_sel",
1025 .ops = &clk_regmap_mux_ops,
1026 .parent_data = pwm_abcd_parents,
1027 .num_parents = ARRAY_SIZE(pwm_abcd_parents),
1028 },
1029 };
1030
1031 static struct clk_regmap pwm_d_div = {
1032 .data = &(struct clk_regmap_div_data){
1033 .offset = PWM_CLK_CD_CTRL,
1034 .shift = 16,
1035 .width = 8,
1036 },
1037 .hw.init = &(struct clk_init_data){
1038 .name = "pwm_d_div",
1039 .ops = &clk_regmap_divider_ops,
1040 .parent_hws = (const struct clk_hw *[]) {
1041 &pwm_d_sel.hw
1042 },
1043 .num_parents = 1,
1044 .flags = CLK_SET_RATE_PARENT,
1045 },
1046 };
1047
1048 static struct clk_regmap pwm_d = {
1049 .data = &(struct clk_regmap_gate_data){
1050 .offset = PWM_CLK_CD_CTRL,
1051 .bit_idx = 24,
1052 },
1053 .hw.init = &(struct clk_init_data) {
1054 .name = "pwm_d",
1055 .ops = &clk_regmap_gate_ops,
1056 .parent_hws = (const struct clk_hw *[]) {
1057 &pwm_d_div.hw
1058 },
1059 .num_parents = 1,
1060 .flags = CLK_SET_RATE_PARENT,
1061 },
1062 };
1063
1064 static const struct clk_parent_data pwm_ef_parents[] = {
1065 { .fw_name = "xtal", },
1066 { .hw = &sys.hw },
1067 { .fw_name = "fclk_div5", },
1068 { .hw = &rtc.hw },
1069 };
1070
1071 static struct clk_regmap pwm_e_sel = {
1072 .data = &(struct clk_regmap_mux_data){
1073 .offset = PWM_CLK_EF_CTRL,
1074 .mask = 0x3,
1075 .shift = 9,
1076 },
1077 .hw.init = &(struct clk_init_data){
1078 .name = "pwm_e_sel",
1079 .ops = &clk_regmap_mux_ops,
1080 .parent_data = pwm_ef_parents,
1081 .num_parents = ARRAY_SIZE(pwm_ef_parents),
1082 },
1083 };
1084
1085 static struct clk_regmap pwm_e_div = {
1086 .data = &(struct clk_regmap_div_data){
1087 .offset = PWM_CLK_EF_CTRL,
1088 .shift = 0,
1089 .width = 8,
1090 },
1091 .hw.init = &(struct clk_init_data){
1092 .name = "pwm_e_div",
1093 .ops = &clk_regmap_divider_ops,
1094 .parent_hws = (const struct clk_hw *[]) {
1095 &pwm_e_sel.hw
1096 },
1097 .num_parents = 1,
1098 .flags = CLK_SET_RATE_PARENT,
1099 },
1100 };
1101
1102 static struct clk_regmap pwm_e = {
1103 .data = &(struct clk_regmap_gate_data){
1104 .offset = PWM_CLK_EF_CTRL,
1105 .bit_idx = 8,
1106 },
1107 .hw.init = &(struct clk_init_data) {
1108 .name = "pwm_e",
1109 .ops = &clk_regmap_gate_ops,
1110 .parent_hws = (const struct clk_hw *[]) {
1111 &pwm_e_div.hw
1112 },
1113 .num_parents = 1,
1114 .flags = CLK_SET_RATE_PARENT,
1115 },
1116 };
1117
1118 static struct clk_regmap pwm_f_sel = {
1119 .data = &(struct clk_regmap_mux_data){
1120 .offset = PWM_CLK_EF_CTRL,
1121 .mask = 0x3,
1122 .shift = 25,
1123 },
1124 .hw.init = &(struct clk_init_data){
1125 .name = "pwm_f_sel",
1126 .ops = &clk_regmap_mux_ops,
1127 .parent_data = pwm_ef_parents,
1128 .num_parents = ARRAY_SIZE(pwm_ef_parents),
1129 },
1130 };
1131
1132 static struct clk_regmap pwm_f_div = {
1133 .data = &(struct clk_regmap_div_data){
1134 .offset = PWM_CLK_EF_CTRL,
1135 .shift = 16,
1136 .width = 8,
1137 },
1138 .hw.init = &(struct clk_init_data){
1139 .name = "pwm_f_div",
1140 .ops = &clk_regmap_divider_ops,
1141 .parent_hws = (const struct clk_hw *[]) {
1142 &pwm_f_sel.hw
1143 },
1144 .num_parents = 1,
1145 .flags = CLK_SET_RATE_PARENT,
1146 },
1147 };
1148
1149 static struct clk_regmap pwm_f = {
1150 .data = &(struct clk_regmap_gate_data){
1151 .offset = PWM_CLK_EF_CTRL,
1152 .bit_idx = 24,
1153 },
1154 .hw.init = &(struct clk_init_data) {
1155 .name = "pwm_f",
1156 .ops = &clk_regmap_gate_ops,
1157 .parent_hws = (const struct clk_hw *[]) {
1158 &pwm_f_div.hw
1159 },
1160 .num_parents = 1,
1161 .flags = CLK_SET_RATE_PARENT,
1162 },
1163 };
1164
1165 /*
1166 * spicc clk
1167 * fdiv2 |\ |\ _____
1168 * ---------| |---DIV--| | | | spicc out
1169 * ---------| | | |-----|GATE |---------
1170 * ..... |/ | / |_____|
1171 * --------------------|/
1172 * 24M
1173 */
1174 static const struct clk_parent_data spicc_spifc_parents[] = {
1175 { .fw_name = "fclk_div2"},
1176 { .fw_name = "fclk_div3"},
1177 { .fw_name = "fclk_div5"},
1178 { .fw_name = "hifi_pll" },
1179 };
1180
1181 static struct clk_regmap spicc_sel = {
1182 .data = &(struct clk_regmap_mux_data){
1183 .offset = SPICC_CLK_CTRL,
1184 .mask = 0x3,
1185 .shift = 9,
1186 },
1187 .hw.init = &(struct clk_init_data){
1188 .name = "spicc_sel",
1189 .ops = &clk_regmap_mux_ops,
1190 .parent_data = spicc_spifc_parents,
1191 .num_parents = ARRAY_SIZE(spicc_spifc_parents),
1192 },
1193 };
1194
1195 static struct clk_regmap spicc_div = {
1196 .data = &(struct clk_regmap_div_data){
1197 .offset = SPICC_CLK_CTRL,
1198 .shift = 0,
1199 .width = 8,
1200 },
1201 .hw.init = &(struct clk_init_data){
1202 .name = "spicc_div",
1203 .ops = &clk_regmap_divider_ops,
1204 .parent_hws = (const struct clk_hw *[]) {
1205 &spicc_sel.hw
1206 },
1207 .num_parents = 1,
1208 .flags = CLK_SET_RATE_PARENT,
1209 },
1210 };
1211
1212 static struct clk_regmap spicc_sel2 = {
1213 .data = &(struct clk_regmap_mux_data){
1214 .offset = SPICC_CLK_CTRL,
1215 .mask = 0x1,
1216 .shift = 15,
1217 },
1218 .hw.init = &(struct clk_init_data){
1219 .name = "spicc_sel2",
1220 .ops = &clk_regmap_mux_ops,
1221 .parent_data = (const struct clk_parent_data []) {
1222 { .hw = &spicc_div.hw },
1223 { .fw_name = "xtal", },
1224 },
1225 .num_parents = 2,
1226 .flags = CLK_SET_RATE_PARENT,
1227 },
1228 };
1229
1230 static struct clk_regmap spicc = {
1231 .data = &(struct clk_regmap_gate_data){
1232 .offset = SPICC_CLK_CTRL,
1233 .bit_idx = 8,
1234 },
1235 .hw.init = &(struct clk_init_data) {
1236 .name = "spicc",
1237 .ops = &clk_regmap_gate_ops,
1238 .parent_hws = (const struct clk_hw *[]) {
1239 &spicc_sel2.hw
1240 },
1241 .num_parents = 1,
1242 .flags = CLK_SET_RATE_PARENT,
1243 },
1244 };
1245
1246 static struct clk_regmap ts_div = {
1247 .data = &(struct clk_regmap_div_data){
1248 .offset = TS_CLK_CTRL,
1249 .shift = 0,
1250 .width = 8,
1251 },
1252 .hw.init = &(struct clk_init_data){
1253 .name = "ts_div",
1254 .ops = &clk_regmap_divider_ops,
1255 .parent_data = &(const struct clk_parent_data) {
1256 .fw_name = "xtal",
1257 },
1258 .num_parents = 1,
1259 },
1260 };
1261
1262 static struct clk_regmap ts = {
1263 .data = &(struct clk_regmap_gate_data){
1264 .offset = TS_CLK_CTRL,
1265 .bit_idx = 8,
1266 },
1267 .hw.init = &(struct clk_init_data) {
1268 .name = "ts",
1269 .ops = &clk_regmap_gate_ops,
1270 .parent_hws = (const struct clk_hw *[]) {
1271 &ts_div.hw
1272 },
1273 .num_parents = 1,
1274 .flags = CLK_SET_RATE_PARENT,
1275 },
1276 };
1277
1278 static struct clk_regmap spifc_sel = {
1279 .data = &(struct clk_regmap_mux_data){
1280 .offset = SPIFC_CLK_CTRL,
1281 .mask = 0x3,
1282 .shift = 9,
1283 },
1284 .hw.init = &(struct clk_init_data){
1285 .name = "spifc_sel",
1286 .ops = &clk_regmap_mux_ops,
1287 .parent_data = spicc_spifc_parents,
1288 .num_parents = ARRAY_SIZE(spicc_spifc_parents),
1289 },
1290 };
1291
1292 static struct clk_regmap spifc_div = {
1293 .data = &(struct clk_regmap_div_data){
1294 .offset = SPIFC_CLK_CTRL,
1295 .shift = 0,
1296 .width = 8,
1297 },
1298 .hw.init = &(struct clk_init_data){
1299 .name = "spifc_div",
1300 .ops = &clk_regmap_divider_ops,
1301 .parent_hws = (const struct clk_hw *[]) {
1302 &spifc_sel.hw
1303 },
1304 .num_parents = 1,
1305 .flags = CLK_SET_RATE_PARENT,
1306 },
1307 };
1308
1309 static struct clk_regmap spifc_sel2 = {
1310 .data = &(struct clk_regmap_mux_data){
1311 .offset = SPIFC_CLK_CTRL,
1312 .mask = 0x1,
1313 .shift = 15,
1314 },
1315 .hw.init = &(struct clk_init_data){
1316 .name = "spifc_sel2",
1317 .ops = &clk_regmap_mux_ops,
1318 .parent_data = (const struct clk_parent_data []) {
1319 { .hw = &spifc_div.hw },
1320 { .fw_name = "xtal", },
1321 },
1322 .num_parents = 2,
1323 .flags = CLK_SET_RATE_PARENT,
1324 },
1325 };
1326
1327 static struct clk_regmap spifc = {
1328 .data = &(struct clk_regmap_gate_data){
1329 .offset = SPIFC_CLK_CTRL,
1330 .bit_idx = 8,
1331 },
1332 .hw.init = &(struct clk_init_data) {
1333 .name = "spifc",
1334 .ops = &clk_regmap_gate_ops,
1335 .parent_hws = (const struct clk_hw *[]) {
1336 &spifc_sel2.hw
1337 },
1338 .num_parents = 1,
1339 .flags = CLK_SET_RATE_PARENT,
1340 },
1341 };
1342
1343 static const struct clk_parent_data usb_bus_parents[] = {
1344 { .fw_name = "xtal", },
1345 { .hw = &sys.hw },
1346 { .fw_name = "fclk_div3", },
1347 { .fw_name = "fclk_div5", },
1348 };
1349
1350 static struct clk_regmap usb_bus_sel = {
1351 .data = &(struct clk_regmap_mux_data){
1352 .offset = USB_BUSCLK_CTRL,
1353 .mask = 0x3,
1354 .shift = 9,
1355 },
1356 .hw.init = &(struct clk_init_data){
1357 .name = "usb_bus_sel",
1358 .ops = &clk_regmap_mux_ops,
1359 .parent_data = usb_bus_parents,
1360 .num_parents = ARRAY_SIZE(usb_bus_parents),
1361 .flags = CLK_SET_RATE_PARENT,
1362 },
1363 };
1364
1365 static struct clk_regmap usb_bus_div = {
1366 .data = &(struct clk_regmap_div_data){
1367 .offset = USB_BUSCLK_CTRL,
1368 .shift = 0,
1369 .width = 8,
1370 },
1371 .hw.init = &(struct clk_init_data){
1372 .name = "usb_bus_div",
1373 .ops = &clk_regmap_divider_ops,
1374 .parent_hws = (const struct clk_hw *[]) {
1375 &usb_bus_sel.hw
1376 },
1377 .num_parents = 1,
1378 .flags = CLK_SET_RATE_PARENT,
1379 },
1380 };
1381
1382 static struct clk_regmap usb_bus = {
1383 .data = &(struct clk_regmap_gate_data){
1384 .offset = USB_BUSCLK_CTRL,
1385 .bit_idx = 8,
1386 },
1387 .hw.init = &(struct clk_init_data) {
1388 .name = "usb_bus",
1389 .ops = &clk_regmap_gate_ops,
1390 .parent_hws = (const struct clk_hw *[]) {
1391 &usb_bus_div.hw
1392 },
1393 .num_parents = 1,
1394 .flags = CLK_SET_RATE_PARENT,
1395 },
1396 };
1397
1398 static const struct clk_parent_data sd_emmc_psram_dmc_parents[] = {
1399 { .fw_name = "fclk_div2", },
1400 { .fw_name = "fclk_div3", },
1401 { .fw_name = "fclk_div5", },
1402 { .fw_name = "hifi_pll", },
1403 };
1404
1405 static struct clk_regmap sd_emmc_sel = {
1406 .data = &(struct clk_regmap_mux_data){
1407 .offset = SD_EMMC_CLK_CTRL,
1408 .mask = 0x3,
1409 .shift = 9,
1410 },
1411 .hw.init = &(struct clk_init_data){
1412 .name = "sd_emmc_sel",
1413 .ops = &clk_regmap_mux_ops,
1414 .parent_data = sd_emmc_psram_dmc_parents,
1415 .num_parents = ARRAY_SIZE(sd_emmc_psram_dmc_parents),
1416 },
1417 };
1418
1419 static struct clk_regmap sd_emmc_div = {
1420 .data = &(struct clk_regmap_div_data){
1421 .offset = SD_EMMC_CLK_CTRL,
1422 .shift = 0,
1423 .width = 8,
1424 },
1425 .hw.init = &(struct clk_init_data){
1426 .name = "sd_emmc_div",
1427 .ops = &clk_regmap_divider_ops,
1428 .parent_hws = (const struct clk_hw *[]) {
1429 &sd_emmc_sel.hw
1430 },
1431 .num_parents = 1,
1432 .flags = CLK_SET_RATE_PARENT,
1433 },
1434 };
1435
1436 static struct clk_regmap sd_emmc_sel2 = {
1437 .data = &(struct clk_regmap_mux_data){
1438 .offset = SD_EMMC_CLK_CTRL,
1439 .mask = 0x1,
1440 .shift = 15,
1441 },
1442 .hw.init = &(struct clk_init_data){
1443 .name = "sd_emmc_sel2",
1444 .ops = &clk_regmap_mux_ops,
1445 .parent_data = (const struct clk_parent_data []) {
1446 { .hw = &sd_emmc_div.hw },
1447 { .fw_name = "xtal", },
1448 },
1449 .num_parents = 2,
1450 .flags = CLK_SET_RATE_PARENT,
1451 },
1452 };
1453
1454 static struct clk_regmap sd_emmc = {
1455 .data = &(struct clk_regmap_gate_data){
1456 .offset = SD_EMMC_CLK_CTRL,
1457 .bit_idx = 8,
1458 },
1459 .hw.init = &(struct clk_init_data) {
1460 .name = "sd_emmc",
1461 .ops = &clk_regmap_gate_ops,
1462 .parent_hws = (const struct clk_hw *[]) {
1463 &sd_emmc_sel2.hw
1464 },
1465 .num_parents = 1,
1466 .flags = CLK_SET_RATE_PARENT,
1467 },
1468 };
1469
1470 static struct clk_regmap psram_sel = {
1471 .data = &(struct clk_regmap_mux_data){
1472 .offset = PSRAM_CLK_CTRL,
1473 .mask = 0x3,
1474 .shift = 9,
1475 },
1476 .hw.init = &(struct clk_init_data){
1477 .name = "psram_sel",
1478 .ops = &clk_regmap_mux_ops,
1479 .parent_data = sd_emmc_psram_dmc_parents,
1480 .num_parents = ARRAY_SIZE(sd_emmc_psram_dmc_parents),
1481 },
1482 };
1483
1484 static struct clk_regmap psram_div = {
1485 .data = &(struct clk_regmap_div_data){
1486 .offset = PSRAM_CLK_CTRL,
1487 .shift = 0,
1488 .width = 8,
1489 },
1490 .hw.init = &(struct clk_init_data){
1491 .name = "psram_div",
1492 .ops = &clk_regmap_divider_ops,
1493 .parent_hws = (const struct clk_hw *[]) {
1494 &psram_sel.hw
1495 },
1496 .num_parents = 1,
1497 .flags = CLK_SET_RATE_PARENT,
1498 },
1499 };
1500
1501 static struct clk_regmap psram_sel2 = {
1502 .data = &(struct clk_regmap_mux_data){
1503 .offset = PSRAM_CLK_CTRL,
1504 .mask = 0x1,
1505 .shift = 15,
1506 },
1507 .hw.init = &(struct clk_init_data){
1508 .name = "psram_sel2",
1509 .ops = &clk_regmap_mux_ops,
1510 .parent_data = (const struct clk_parent_data []) {
1511 { .hw = &psram_div.hw },
1512 { .fw_name = "xtal", },
1513 },
1514 .num_parents = 2,
1515 .flags = CLK_SET_RATE_PARENT,
1516 },
1517 };
1518
1519 static struct clk_regmap psram = {
1520 .data = &(struct clk_regmap_gate_data){
1521 .offset = PSRAM_CLK_CTRL,
1522 .bit_idx = 8,
1523 },
1524 .hw.init = &(struct clk_init_data) {
1525 .name = "psram",
1526 .ops = &clk_regmap_gate_ops,
1527 .parent_hws = (const struct clk_hw *[]) {
1528 &psram_sel2.hw
1529 },
1530 .num_parents = 1,
1531 .flags = CLK_SET_RATE_PARENT,
1532 },
1533 };
1534
1535 static struct clk_regmap dmc_sel = {
1536 .data = &(struct clk_regmap_mux_data){
1537 .offset = DMC_CLK_CTRL,
1538 .mask = 0x3,
1539 .shift = 9,
1540 },
1541 .hw.init = &(struct clk_init_data){
1542 .name = "dmc_sel",
1543 .ops = &clk_regmap_mux_ops,
1544 .parent_data = sd_emmc_psram_dmc_parents,
1545 .num_parents = ARRAY_SIZE(sd_emmc_psram_dmc_parents),
1546 },
1547 };
1548
1549 static struct clk_regmap dmc_div = {
1550 .data = &(struct clk_regmap_div_data){
1551 .offset = DMC_CLK_CTRL,
1552 .shift = 0,
1553 .width = 8,
1554 },
1555 .hw.init = &(struct clk_init_data){
1556 .name = "dmc_div",
1557 .ops = &clk_regmap_divider_ops,
1558 .parent_hws = (const struct clk_hw *[]) {
1559 &dmc_sel.hw
1560 },
1561 .num_parents = 1,
1562 .flags = CLK_SET_RATE_PARENT,
1563 },
1564 };
1565
1566 static struct clk_regmap dmc_sel2 = {
1567 .data = &(struct clk_regmap_mux_data){
1568 .offset = DMC_CLK_CTRL,
1569 .mask = 0x1,
1570 .shift = 15,
1571 },
1572 .hw.init = &(struct clk_init_data){
1573 .name = "dmc_sel2",
1574 .ops = &clk_regmap_mux_ops,
1575 .parent_data = (const struct clk_parent_data []) {
1576 { .hw = &dmc_div.hw },
1577 { .fw_name = "xtal", },
1578 },
1579 .num_parents = 2,
1580 .flags = CLK_SET_RATE_PARENT,
1581 },
1582 };
1583
1584 static struct clk_regmap dmc = {
1585 .data = &(struct clk_regmap_gate_data){
1586 .offset = DMC_CLK_CTRL,
1587 .bit_idx = 8,
1588 },
1589 .hw.init = &(struct clk_init_data) {
1590 .name = "dmc",
1591 .ops = &clk_regmap_gate_ro_ops,
1592 .parent_hws = (const struct clk_hw *[]) {
1593 &dmc_sel2.hw
1594 },
1595 .num_parents = 1,
1596 .flags = CLK_SET_RATE_PARENT,
1597 },
1598 };
1599
1600 static struct clk_regmap ceca_32k_in = {
1601 .data = &(struct clk_regmap_gate_data){
1602 .offset = CECA_CLK_CTRL0,
1603 .bit_idx = 31,
1604 },
1605 .hw.init = &(struct clk_init_data) {
1606 .name = "ceca_32k_in",
1607 .ops = &clk_regmap_gate_ops,
1608 .parent_data = &(const struct clk_parent_data) {
1609 .fw_name = "xtal",
1610 },
1611 .num_parents = 1,
1612 },
1613 };
1614
1615 static struct clk_regmap ceca_32k_div = {
1616 .data = &(struct meson_clk_dualdiv_data){
1617 .n1 = {
1618 .reg_off = CECA_CLK_CTRL0,
1619 .shift = 0,
1620 .width = 12,
1621 },
1622 .n2 = {
1623 .reg_off = CECA_CLK_CTRL0,
1624 .shift = 12,
1625 .width = 12,
1626 },
1627 .m1 = {
1628 .reg_off = CECA_CLK_CTRL1,
1629 .shift = 0,
1630 .width = 12,
1631 },
1632 .m2 = {
1633 .reg_off = CECA_CLK_CTRL1,
1634 .shift = 12,
1635 .width = 12,
1636 },
1637 .dual = {
1638 .reg_off = CECA_CLK_CTRL0,
1639 .shift = 28,
1640 .width = 1,
1641 },
1642 .table = clk_32k_div_table,
1643 },
1644 .hw.init = &(struct clk_init_data){
1645 .name = "ceca_32k_div",
1646 .ops = &meson_clk_dualdiv_ops,
1647 .parent_hws = (const struct clk_hw *[]) {
1648 &ceca_32k_in.hw
1649 },
1650 .num_parents = 1,
1651 },
1652 };
1653
1654 static struct clk_regmap ceca_32k_sel_pre = {
1655 .data = &(struct clk_regmap_mux_data) {
1656 .offset = CECA_CLK_CTRL1,
1657 .mask = 0x1,
1658 .shift = 24,
1659 .flags = CLK_MUX_ROUND_CLOSEST,
1660 },
1661 .hw.init = &(struct clk_init_data){
1662 .name = "ceca_32k_sel_pre",
1663 .ops = &clk_regmap_mux_ops,
1664 .parent_hws = (const struct clk_hw *[]) {
1665 &ceca_32k_div.hw,
1666 &ceca_32k_in.hw,
1667 },
1668 .num_parents = 2,
1669 .flags = CLK_SET_RATE_PARENT,
1670 },
1671 };
1672
1673 static struct clk_regmap ceca_32k_sel = {
1674 .data = &(struct clk_regmap_mux_data) {
1675 .offset = CECA_CLK_CTRL1,
1676 .mask = 0x1,
1677 .shift = 31,
1678 .flags = CLK_MUX_ROUND_CLOSEST,
1679 },
1680 .hw.init = &(struct clk_init_data){
1681 .name = "ceca_32k_sel",
1682 .ops = &clk_regmap_mux_ops,
1683 .parent_hws = (const struct clk_hw *[]) {
1684 &ceca_32k_sel_pre.hw,
1685 &rtc.hw,
1686 },
1687 .num_parents = 2,
1688 },
1689 };
1690
1691 static struct clk_regmap ceca_32k_out = {
1692 .data = &(struct clk_regmap_gate_data){
1693 .offset = CECA_CLK_CTRL0,
1694 .bit_idx = 30,
1695 },
1696 .hw.init = &(struct clk_init_data){
1697 .name = "ceca_32k_out",
1698 .ops = &clk_regmap_gate_ops,
1699 .parent_hws = (const struct clk_hw *[]) {
1700 &ceca_32k_sel.hw
1701 },
1702 .num_parents = 1,
1703 .flags = CLK_SET_RATE_PARENT,
1704 },
1705 };
1706
1707 static struct clk_regmap cecb_32k_in = {
1708 .data = &(struct clk_regmap_gate_data){
1709 .offset = CECB_CLK_CTRL0,
1710 .bit_idx = 31,
1711 },
1712 .hw.init = &(struct clk_init_data) {
1713 .name = "cecb_32k_in",
1714 .ops = &clk_regmap_gate_ops,
1715 .parent_data = &(const struct clk_parent_data) {
1716 .fw_name = "xtal",
1717 },
1718 .num_parents = 1,
1719 },
1720 };
1721
1722 static struct clk_regmap cecb_32k_div = {
1723 .data = &(struct meson_clk_dualdiv_data){
1724 .n1 = {
1725 .reg_off = CECB_CLK_CTRL0,
1726 .shift = 0,
1727 .width = 12,
1728 },
1729 .n2 = {
1730 .reg_off = CECB_CLK_CTRL0,
1731 .shift = 12,
1732 .width = 12,
1733 },
1734 .m1 = {
1735 .reg_off = CECB_CLK_CTRL1,
1736 .shift = 0,
1737 .width = 12,
1738 },
1739 .m2 = {
1740 .reg_off = CECB_CLK_CTRL1,
1741 .shift = 12,
1742 .width = 12,
1743 },
1744 .dual = {
1745 .reg_off = CECB_CLK_CTRL0,
1746 .shift = 28,
1747 .width = 1,
1748 },
1749 .table = clk_32k_div_table,
1750 },
1751 .hw.init = &(struct clk_init_data){
1752 .name = "cecb_32k_div",
1753 .ops = &meson_clk_dualdiv_ops,
1754 .parent_hws = (const struct clk_hw *[]) {
1755 &cecb_32k_in.hw
1756 },
1757 .num_parents = 1,
1758 },
1759 };
1760
1761 static struct clk_regmap cecb_32k_sel_pre = {
1762 .data = &(struct clk_regmap_mux_data) {
1763 .offset = CECB_CLK_CTRL1,
1764 .mask = 0x1,
1765 .shift = 24,
1766 .flags = CLK_MUX_ROUND_CLOSEST,
1767 },
1768 .hw.init = &(struct clk_init_data){
1769 .name = "cecb_32k_sel_pre",
1770 .ops = &clk_regmap_mux_ops,
1771 .parent_hws = (const struct clk_hw *[]) {
1772 &cecb_32k_div.hw,
1773 &cecb_32k_in.hw,
1774 },
1775 .num_parents = 2,
1776 .flags = CLK_SET_RATE_PARENT,
1777 },
1778 };
1779
1780 static struct clk_regmap cecb_32k_sel = {
1781 .data = &(struct clk_regmap_mux_data) {
1782 .offset = CECB_CLK_CTRL1,
1783 .mask = 0x1,
1784 .shift = 31,
1785 .flags = CLK_MUX_ROUND_CLOSEST,
1786 },
1787 .hw.init = &(struct clk_init_data){
1788 .name = "cecb_32k_sel",
1789 .ops = &clk_regmap_mux_ops,
1790 .parent_hws = (const struct clk_hw *[]) {
1791 &cecb_32k_sel_pre.hw,
1792 &rtc.hw,
1793 },
1794 .num_parents = 2,
1795 },
1796 };
1797
1798 static struct clk_regmap cecb_32k_out = {
1799 .data = &(struct clk_regmap_gate_data){
1800 .offset = CECB_CLK_CTRL0,
1801 .bit_idx = 30,
1802 },
1803 .hw.init = &(struct clk_init_data){
1804 .name = "cecb_32k_out",
1805 .ops = &clk_regmap_gate_ops,
1806 .parent_hws = (const struct clk_hw *[]) {
1807 &cecb_32k_sel.hw
1808 },
1809 .num_parents = 1,
1810 .flags = CLK_SET_RATE_PARENT,
1811 },
1812 };
1813
1814 #define MESON_GATE(_name, _reg, _bit) \
1815 MESON_PCLK(_name, _reg, _bit, &sys.hw)
1816
1817 static MESON_GATE(clktree, SYS_CLK_EN0, 0);
1818 static MESON_GATE(reset_ctrl, SYS_CLK_EN0, 1);
1819 static MESON_GATE(analog_ctrl, SYS_CLK_EN0, 2);
1820 static MESON_GATE(pwr_ctrl, SYS_CLK_EN0, 3);
1821 static MESON_GATE(pad_ctrl, SYS_CLK_EN0, 4);
1822 static MESON_GATE(sys_ctrl, SYS_CLK_EN0, 5);
1823 static MESON_GATE(temp_sensor, SYS_CLK_EN0, 6);
1824 static MESON_GATE(am2axi_dev, SYS_CLK_EN0, 7);
1825 static MESON_GATE(spicc_b, SYS_CLK_EN0, 8);
1826 static MESON_GATE(spicc_a, SYS_CLK_EN0, 9);
1827 static MESON_GATE(msr, SYS_CLK_EN0, 10);
1828 static MESON_GATE(audio, SYS_CLK_EN0, 11);
1829 static MESON_GATE(jtag_ctrl, SYS_CLK_EN0, 12);
1830 static MESON_GATE(saradc_en, SYS_CLK_EN0, 13);
1831 static MESON_GATE(pwm_ef, SYS_CLK_EN0, 14);
1832 static MESON_GATE(pwm_cd, SYS_CLK_EN0, 15);
1833 static MESON_GATE(pwm_ab, SYS_CLK_EN0, 16);
1834 static MESON_GATE(cec, SYS_CLK_EN0, 17);
1835 static MESON_GATE(i2c_s, SYS_CLK_EN0, 18);
1836 static MESON_GATE(ir_ctrl, SYS_CLK_EN0, 19);
1837 static MESON_GATE(i2c_m_d, SYS_CLK_EN0, 20);
1838 static MESON_GATE(i2c_m_c, SYS_CLK_EN0, 21);
1839 static MESON_GATE(i2c_m_b, SYS_CLK_EN0, 22);
1840 static MESON_GATE(i2c_m_a, SYS_CLK_EN0, 23);
1841 static MESON_GATE(acodec, SYS_CLK_EN0, 24);
1842 static MESON_GATE(otp, SYS_CLK_EN0, 25);
1843 static MESON_GATE(sd_emmc_a, SYS_CLK_EN0, 26);
1844 static MESON_GATE(usb_phy, SYS_CLK_EN0, 27);
1845 static MESON_GATE(usb_ctrl, SYS_CLK_EN0, 28);
1846 static MESON_GATE(sys_dspb, SYS_CLK_EN0, 29);
1847 static MESON_GATE(sys_dspa, SYS_CLK_EN0, 30);
1848 static MESON_GATE(dma, SYS_CLK_EN0, 31);
1849 static MESON_GATE(irq_ctrl, SYS_CLK_EN1, 0);
1850 static MESON_GATE(nic, SYS_CLK_EN1, 1);
1851 static MESON_GATE(gic, SYS_CLK_EN1, 2);
1852 static MESON_GATE(uart_c, SYS_CLK_EN1, 3);
1853 static MESON_GATE(uart_b, SYS_CLK_EN1, 4);
1854 static MESON_GATE(uart_a, SYS_CLK_EN1, 5);
1855 static MESON_GATE(sys_psram, SYS_CLK_EN1, 6);
1856 static MESON_GATE(rsa, SYS_CLK_EN1, 8);
1857 static MESON_GATE(coresight, SYS_CLK_EN1, 9);
1858 static MESON_GATE(am2axi_vad, AXI_CLK_EN, 0);
1859 static MESON_GATE(audio_vad, AXI_CLK_EN, 1);
1860 static MESON_GATE(axi_dmc, AXI_CLK_EN, 3);
1861 static MESON_GATE(axi_psram, AXI_CLK_EN, 4);
1862 static MESON_GATE(ramb, AXI_CLK_EN, 5);
1863 static MESON_GATE(rama, AXI_CLK_EN, 6);
1864 static MESON_GATE(axi_spifc, AXI_CLK_EN, 7);
1865 static MESON_GATE(axi_nic, AXI_CLK_EN, 8);
1866 static MESON_GATE(axi_dma, AXI_CLK_EN, 9);
1867 static MESON_GATE(cpu_ctrl, AXI_CLK_EN, 10);
1868 static MESON_GATE(rom, AXI_CLK_EN, 11);
1869 static MESON_GATE(prod_i2c, AXI_CLK_EN, 12);
1870
1871 /* Array of all clocks registered by this provider */
1872 static struct clk_hw *a1_periphs_hw_clks[] = {
1873 [CLKID_XTAL_IN] = &xtal_in.hw,
1874 [CLKID_FIXPLL_IN] = &fixpll_in.hw,
1875 [CLKID_USB_PHY_IN] = &usb_phy_in.hw,
1876 [CLKID_USB_CTRL_IN] = &usb_ctrl_in.hw,
1877 [CLKID_HIFIPLL_IN] = &hifipll_in.hw,
1878 [CLKID_SYSPLL_IN] = &syspll_in.hw,
1879 [CLKID_DDS_IN] = &dds_in.hw,
1880 [CLKID_SYS] = &sys.hw,
1881 [CLKID_CLKTREE] = &clktree.hw,
1882 [CLKID_RESET_CTRL] = &reset_ctrl.hw,
1883 [CLKID_ANALOG_CTRL] = &analog_ctrl.hw,
1884 [CLKID_PWR_CTRL] = &pwr_ctrl.hw,
1885 [CLKID_PAD_CTRL] = &pad_ctrl.hw,
1886 [CLKID_SYS_CTRL] = &sys_ctrl.hw,
1887 [CLKID_TEMP_SENSOR] = &temp_sensor.hw,
1888 [CLKID_AM2AXI_DIV] = &am2axi_dev.hw,
1889 [CLKID_SPICC_B] = &spicc_b.hw,
1890 [CLKID_SPICC_A] = &spicc_a.hw,
1891 [CLKID_MSR] = &msr.hw,
1892 [CLKID_AUDIO] = &audio.hw,
1893 [CLKID_JTAG_CTRL] = &jtag_ctrl.hw,
1894 [CLKID_SARADC_EN] = &saradc_en.hw,
1895 [CLKID_PWM_EF] = &pwm_ef.hw,
1896 [CLKID_PWM_CD] = &pwm_cd.hw,
1897 [CLKID_PWM_AB] = &pwm_ab.hw,
1898 [CLKID_CEC] = &cec.hw,
1899 [CLKID_I2C_S] = &i2c_s.hw,
1900 [CLKID_IR_CTRL] = &ir_ctrl.hw,
1901 [CLKID_I2C_M_D] = &i2c_m_d.hw,
1902 [CLKID_I2C_M_C] = &i2c_m_c.hw,
1903 [CLKID_I2C_M_B] = &i2c_m_b.hw,
1904 [CLKID_I2C_M_A] = &i2c_m_a.hw,
1905 [CLKID_ACODEC] = &acodec.hw,
1906 [CLKID_OTP] = &otp.hw,
1907 [CLKID_SD_EMMC_A] = &sd_emmc_a.hw,
1908 [CLKID_USB_PHY] = &usb_phy.hw,
1909 [CLKID_USB_CTRL] = &usb_ctrl.hw,
1910 [CLKID_SYS_DSPB] = &sys_dspb.hw,
1911 [CLKID_SYS_DSPA] = &sys_dspa.hw,
1912 [CLKID_DMA] = &dma.hw,
1913 [CLKID_IRQ_CTRL] = &irq_ctrl.hw,
1914 [CLKID_NIC] = &nic.hw,
1915 [CLKID_GIC] = &gic.hw,
1916 [CLKID_UART_C] = &uart_c.hw,
1917 [CLKID_UART_B] = &uart_b.hw,
1918 [CLKID_UART_A] = &uart_a.hw,
1919 [CLKID_SYS_PSRAM] = &sys_psram.hw,
1920 [CLKID_RSA] = &rsa.hw,
1921 [CLKID_CORESIGHT] = &coresight.hw,
1922 [CLKID_AM2AXI_VAD] = &am2axi_vad.hw,
1923 [CLKID_AUDIO_VAD] = &audio_vad.hw,
1924 [CLKID_AXI_DMC] = &axi_dmc.hw,
1925 [CLKID_AXI_PSRAM] = &axi_psram.hw,
1926 [CLKID_RAMB] = &ramb.hw,
1927 [CLKID_RAMA] = &rama.hw,
1928 [CLKID_AXI_SPIFC] = &axi_spifc.hw,
1929 [CLKID_AXI_NIC] = &axi_nic.hw,
1930 [CLKID_AXI_DMA] = &axi_dma.hw,
1931 [CLKID_CPU_CTRL] = &cpu_ctrl.hw,
1932 [CLKID_ROM] = &rom.hw,
1933 [CLKID_PROC_I2C] = &prod_i2c.hw,
1934 [CLKID_DSPA_SEL] = &dspa_sel.hw,
1935 [CLKID_DSPB_SEL] = &dspb_sel.hw,
1936 [CLKID_DSPA_EN] = &dspa_en.hw,
1937 [CLKID_DSPA_EN_NIC] = &dspa_en_nic.hw,
1938 [CLKID_DSPB_EN] = &dspb_en.hw,
1939 [CLKID_DSPB_EN_NIC] = &dspb_en_nic.hw,
1940 [CLKID_RTC] = &rtc.hw,
1941 [CLKID_CECA_32K] = &ceca_32k_out.hw,
1942 [CLKID_CECB_32K] = &cecb_32k_out.hw,
1943 [CLKID_24M] = &clk_24m.hw,
1944 [CLKID_12M] = &clk_12m.hw,
1945 [CLKID_FCLK_DIV2_DIVN] = &fclk_div2_divn.hw,
1946 [CLKID_GEN] = &gen.hw,
1947 [CLKID_SARADC_SEL] = &saradc_sel.hw,
1948 [CLKID_SARADC] = &saradc.hw,
1949 [CLKID_PWM_A] = &pwm_a.hw,
1950 [CLKID_PWM_B] = &pwm_b.hw,
1951 [CLKID_PWM_C] = &pwm_c.hw,
1952 [CLKID_PWM_D] = &pwm_d.hw,
1953 [CLKID_PWM_E] = &pwm_e.hw,
1954 [CLKID_PWM_F] = &pwm_f.hw,
1955 [CLKID_SPICC] = &spicc.hw,
1956 [CLKID_TS] = &ts.hw,
1957 [CLKID_SPIFC] = &spifc.hw,
1958 [CLKID_USB_BUS] = &usb_bus.hw,
1959 [CLKID_SD_EMMC] = &sd_emmc.hw,
1960 [CLKID_PSRAM] = &psram.hw,
1961 [CLKID_DMC] = &dmc.hw,
1962 [CLKID_SYS_A_SEL] = &sys_a_sel.hw,
1963 [CLKID_SYS_A_DIV] = &sys_a_div.hw,
1964 [CLKID_SYS_A] = &sys_a.hw,
1965 [CLKID_SYS_B_SEL] = &sys_b_sel.hw,
1966 [CLKID_SYS_B_DIV] = &sys_b_div.hw,
1967 [CLKID_SYS_B] = &sys_b.hw,
1968 [CLKID_DSPA_A_SEL] = &dspa_a_sel.hw,
1969 [CLKID_DSPA_A_DIV] = &dspa_a_div.hw,
1970 [CLKID_DSPA_A] = &dspa_a.hw,
1971 [CLKID_DSPA_B_SEL] = &dspa_b_sel.hw,
1972 [CLKID_DSPA_B_DIV] = &dspa_b_div.hw,
1973 [CLKID_DSPA_B] = &dspa_b.hw,
1974 [CLKID_DSPB_A_SEL] = &dspb_a_sel.hw,
1975 [CLKID_DSPB_A_DIV] = &dspb_a_div.hw,
1976 [CLKID_DSPB_A] = &dspb_a.hw,
1977 [CLKID_DSPB_B_SEL] = &dspb_b_sel.hw,
1978 [CLKID_DSPB_B_DIV] = &dspb_b_div.hw,
1979 [CLKID_DSPB_B] = &dspb_b.hw,
1980 [CLKID_RTC_32K_IN] = &rtc_32k_in.hw,
1981 [CLKID_RTC_32K_DIV] = &rtc_32k_div.hw,
1982 [CLKID_RTC_32K_XTAL] = &rtc_32k_xtal.hw,
1983 [CLKID_RTC_32K_SEL] = &rtc_32k_sel.hw,
1984 [CLKID_CECB_32K_IN] = &cecb_32k_in.hw,
1985 [CLKID_CECB_32K_DIV] = &cecb_32k_div.hw,
1986 [CLKID_CECB_32K_SEL_PRE] = &cecb_32k_sel_pre.hw,
1987 [CLKID_CECB_32K_SEL] = &cecb_32k_sel.hw,
1988 [CLKID_CECA_32K_IN] = &ceca_32k_in.hw,
1989 [CLKID_CECA_32K_DIV] = &ceca_32k_div.hw,
1990 [CLKID_CECA_32K_SEL_PRE] = &ceca_32k_sel_pre.hw,
1991 [CLKID_CECA_32K_SEL] = &ceca_32k_sel.hw,
1992 [CLKID_DIV2_PRE] = &fclk_div2_divn_pre.hw,
1993 [CLKID_24M_DIV2] = &clk_24m_div2.hw,
1994 [CLKID_GEN_SEL] = &gen_sel.hw,
1995 [CLKID_GEN_DIV] = &gen_div.hw,
1996 [CLKID_SARADC_DIV] = &saradc_div.hw,
1997 [CLKID_PWM_A_SEL] = &pwm_a_sel.hw,
1998 [CLKID_PWM_A_DIV] = &pwm_a_div.hw,
1999 [CLKID_PWM_B_SEL] = &pwm_b_sel.hw,
2000 [CLKID_PWM_B_DIV] = &pwm_b_div.hw,
2001 [CLKID_PWM_C_SEL] = &pwm_c_sel.hw,
2002 [CLKID_PWM_C_DIV] = &pwm_c_div.hw,
2003 [CLKID_PWM_D_SEL] = &pwm_d_sel.hw,
2004 [CLKID_PWM_D_DIV] = &pwm_d_div.hw,
2005 [CLKID_PWM_E_SEL] = &pwm_e_sel.hw,
2006 [CLKID_PWM_E_DIV] = &pwm_e_div.hw,
2007 [CLKID_PWM_F_SEL] = &pwm_f_sel.hw,
2008 [CLKID_PWM_F_DIV] = &pwm_f_div.hw,
2009 [CLKID_SPICC_SEL] = &spicc_sel.hw,
2010 [CLKID_SPICC_DIV] = &spicc_div.hw,
2011 [CLKID_SPICC_SEL2] = &spicc_sel2.hw,
2012 [CLKID_TS_DIV] = &ts_div.hw,
2013 [CLKID_SPIFC_SEL] = &spifc_sel.hw,
2014 [CLKID_SPIFC_DIV] = &spifc_div.hw,
2015 [CLKID_SPIFC_SEL2] = &spifc_sel2.hw,
2016 [CLKID_USB_BUS_SEL] = &usb_bus_sel.hw,
2017 [CLKID_USB_BUS_DIV] = &usb_bus_div.hw,
2018 [CLKID_SD_EMMC_SEL] = &sd_emmc_sel.hw,
2019 [CLKID_SD_EMMC_DIV] = &sd_emmc_div.hw,
2020 [CLKID_SD_EMMC_SEL2] = &sd_emmc_sel2.hw,
2021 [CLKID_PSRAM_SEL] = &psram_sel.hw,
2022 [CLKID_PSRAM_DIV] = &psram_div.hw,
2023 [CLKID_PSRAM_SEL2] = &psram_sel2.hw,
2024 [CLKID_DMC_SEL] = &dmc_sel.hw,
2025 [CLKID_DMC_DIV] = &dmc_div.hw,
2026 [CLKID_DMC_SEL2] = &dmc_sel2.hw,
2027 };
2028
2029 /* Convenience table to populate regmap in .probe */
2030 static struct clk_regmap *const a1_periphs_regmaps[] = {
2031 &xtal_in,
2032 &fixpll_in,
2033 &usb_phy_in,
2034 &usb_ctrl_in,
2035 &hifipll_in,
2036 &syspll_in,
2037 &dds_in,
2038 &sys,
2039 &clktree,
2040 &reset_ctrl,
2041 &analog_ctrl,
2042 &pwr_ctrl,
2043 &pad_ctrl,
2044 &sys_ctrl,
2045 &temp_sensor,
2046 &am2axi_dev,
2047 &spicc_b,
2048 &spicc_a,
2049 &msr,
2050 &audio,
2051 &jtag_ctrl,
2052 &saradc_en,
2053 &pwm_ef,
2054 &pwm_cd,
2055 &pwm_ab,
2056 &cec,
2057 &i2c_s,
2058 &ir_ctrl,
2059 &i2c_m_d,
2060 &i2c_m_c,
2061 &i2c_m_b,
2062 &i2c_m_a,
2063 &acodec,
2064 &otp,
2065 &sd_emmc_a,
2066 &usb_phy,
2067 &usb_ctrl,
2068 &sys_dspb,
2069 &sys_dspa,
2070 &dma,
2071 &irq_ctrl,
2072 &nic,
2073 &gic,
2074 &uart_c,
2075 &uart_b,
2076 &uart_a,
2077 &sys_psram,
2078 &rsa,
2079 &coresight,
2080 &am2axi_vad,
2081 &audio_vad,
2082 &axi_dmc,
2083 &axi_psram,
2084 &ramb,
2085 &rama,
2086 &axi_spifc,
2087 &axi_nic,
2088 &axi_dma,
2089 &cpu_ctrl,
2090 &rom,
2091 &prod_i2c,
2092 &dspa_sel,
2093 &dspb_sel,
2094 &dspa_en,
2095 &dspa_en_nic,
2096 &dspb_en,
2097 &dspb_en_nic,
2098 &rtc,
2099 &ceca_32k_out,
2100 &cecb_32k_out,
2101 &clk_24m,
2102 &clk_12m,
2103 &fclk_div2_divn,
2104 &gen,
2105 &saradc_sel,
2106 &saradc,
2107 &pwm_a,
2108 &pwm_b,
2109 &pwm_c,
2110 &pwm_d,
2111 &pwm_e,
2112 &pwm_f,
2113 &spicc,
2114 &ts,
2115 &spifc,
2116 &usb_bus,
2117 &sd_emmc,
2118 &psram,
2119 &dmc,
2120 &sys_a_sel,
2121 &sys_a_div,
2122 &sys_a,
2123 &sys_b_sel,
2124 &sys_b_div,
2125 &sys_b,
2126 &dspa_a_sel,
2127 &dspa_a_div,
2128 &dspa_a,
2129 &dspa_b_sel,
2130 &dspa_b_div,
2131 &dspa_b,
2132 &dspb_a_sel,
2133 &dspb_a_div,
2134 &dspb_a,
2135 &dspb_b_sel,
2136 &dspb_b_div,
2137 &dspb_b,
2138 &rtc_32k_in,
2139 &rtc_32k_div,
2140 &rtc_32k_xtal,
2141 &rtc_32k_sel,
2142 &cecb_32k_in,
2143 &cecb_32k_div,
2144 &cecb_32k_sel_pre,
2145 &cecb_32k_sel,
2146 &ceca_32k_in,
2147 &ceca_32k_div,
2148 &ceca_32k_sel_pre,
2149 &ceca_32k_sel,
2150 &fclk_div2_divn_pre,
2151 &gen_sel,
2152 &gen_div,
2153 &saradc_div,
2154 &pwm_a_sel,
2155 &pwm_a_div,
2156 &pwm_b_sel,
2157 &pwm_b_div,
2158 &pwm_c_sel,
2159 &pwm_c_div,
2160 &pwm_d_sel,
2161 &pwm_d_div,
2162 &pwm_e_sel,
2163 &pwm_e_div,
2164 &pwm_f_sel,
2165 &pwm_f_div,
2166 &spicc_sel,
2167 &spicc_div,
2168 &spicc_sel2,
2169 &ts_div,
2170 &spifc_sel,
2171 &spifc_div,
2172 &spifc_sel2,
2173 &usb_bus_sel,
2174 &usb_bus_div,
2175 &sd_emmc_sel,
2176 &sd_emmc_div,
2177 &sd_emmc_sel2,
2178 &psram_sel,
2179 &psram_div,
2180 &psram_sel2,
2181 &dmc_sel,
2182 &dmc_div,
2183 &dmc_sel2,
2184 };
2185
2186 static const struct regmap_config a1_periphs_regmap_cfg = {
2187 .reg_bits = 32,
2188 .val_bits = 32,
2189 .reg_stride = 4,
2190 .max_register = DMC_CLK_CTRL,
2191 };
2192
2193 static struct meson_clk_hw_data a1_periphs_clks = {
2194 .hws = a1_periphs_hw_clks,
2195 .num = ARRAY_SIZE(a1_periphs_hw_clks),
2196 };
2197
meson_a1_periphs_probe(struct platform_device * pdev)2198 static int meson_a1_periphs_probe(struct platform_device *pdev)
2199 {
2200 struct device *dev = &pdev->dev;
2201 void __iomem *base;
2202 struct regmap *map;
2203 int clkid, i, err;
2204
2205 base = devm_platform_ioremap_resource(pdev, 0);
2206 if (IS_ERR(base))
2207 return dev_err_probe(dev, PTR_ERR(base),
2208 "can't ioremap resource\n");
2209
2210 map = devm_regmap_init_mmio(dev, base, &a1_periphs_regmap_cfg);
2211 if (IS_ERR(map))
2212 return dev_err_probe(dev, PTR_ERR(map),
2213 "can't init regmap mmio region\n");
2214
2215 /* Populate regmap for the regmap backed clocks */
2216 for (i = 0; i < ARRAY_SIZE(a1_periphs_regmaps); i++)
2217 a1_periphs_regmaps[i]->map = map;
2218
2219 for (clkid = 0; clkid < a1_periphs_clks.num; clkid++) {
2220 err = devm_clk_hw_register(dev, a1_periphs_clks.hws[clkid]);
2221 if (err)
2222 return dev_err_probe(dev, err,
2223 "clock[%d] registration failed\n",
2224 clkid);
2225 }
2226
2227 return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &a1_periphs_clks);
2228 }
2229
2230 static const struct of_device_id a1_periphs_clkc_match_table[] = {
2231 { .compatible = "amlogic,a1-peripherals-clkc", },
2232 {}
2233 };
2234 MODULE_DEVICE_TABLE(of, a1_periphs_clkc_match_table);
2235
2236 static struct platform_driver a1_periphs_clkc_driver = {
2237 .probe = meson_a1_periphs_probe,
2238 .driver = {
2239 .name = "a1-peripherals-clkc",
2240 .of_match_table = a1_periphs_clkc_match_table,
2241 },
2242 };
2243 module_platform_driver(a1_periphs_clkc_driver);
2244
2245 MODULE_DESCRIPTION("Amlogic A1 Peripherals Clock Controller driver");
2246 MODULE_AUTHOR("Jian Hu <jian.hu@amlogic.com>");
2247 MODULE_AUTHOR("Dmitry Rokosov <ddrokosov@sberdevices.ru>");
2248 MODULE_LICENSE("GPL");
2249 MODULE_IMPORT_NS("CLK_MESON");
2250