GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / clk / meson / a1-peripherals.c
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 struct regmap_config a1_periphs_regmap_cfg = {
2187         .reg_bits   = 32,
2188         .val_bits   = 32,
2189         .reg_stride = 4,
2190 };
2191
2192 static struct meson_clk_hw_data a1_periphs_clks = {
2193         .hws = a1_periphs_hw_clks,
2194         .num = ARRAY_SIZE(a1_periphs_hw_clks),
2195 };
2196
2197 static int meson_a1_periphs_probe(struct platform_device *pdev)
2198 {
2199         struct device *dev = &pdev->dev;
2200         void __iomem *base;
2201         struct regmap *map;
2202         int clkid, i, err;
2203
2204         base = devm_platform_ioremap_resource(pdev, 0);
2205         if (IS_ERR(base))
2206                 return dev_err_probe(dev, PTR_ERR(base),
2207                                      "can't ioremap resource\n");
2208
2209         map = devm_regmap_init_mmio(dev, base, &a1_periphs_regmap_cfg);
2210         if (IS_ERR(map))
2211                 return dev_err_probe(dev, PTR_ERR(map),
2212                                      "can't init regmap mmio region\n");
2213
2214         /* Populate regmap for the regmap backed clocks */
2215         for (i = 0; i < ARRAY_SIZE(a1_periphs_regmaps); i++)
2216                 a1_periphs_regmaps[i]->map = map;
2217
2218         for (clkid = 0; clkid < a1_periphs_clks.num; clkid++) {
2219                 err = devm_clk_hw_register(dev, a1_periphs_clks.hws[clkid]);
2220                 if (err)
2221                         return dev_err_probe(dev, err,
2222                                              "clock[%d] registration failed\n",
2223                                              clkid);
2224         }
2225
2226         return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &a1_periphs_clks);
2227 }
2228
2229 static const struct of_device_id a1_periphs_clkc_match_table[] = {
2230         { .compatible = "amlogic,a1-peripherals-clkc", },
2231         {}
2232 };
2233 MODULE_DEVICE_TABLE(of, a1_periphs_clkc_match_table);
2234
2235 static struct platform_driver a1_periphs_clkc_driver = {
2236         .probe = meson_a1_periphs_probe,
2237         .driver = {
2238                 .name = "a1-peripherals-clkc",
2239                 .of_match_table = a1_periphs_clkc_match_table,
2240         },
2241 };
2242
2243 module_platform_driver(a1_periphs_clkc_driver);
2244 MODULE_AUTHOR("Jian Hu <jian.hu@amlogic.com>");
2245 MODULE_AUTHOR("Dmitry Rokosov <ddrokosov@sberdevices.ru>");
2246 MODULE_LICENSE("GPL");