Merge tag 'at24-fixes-for-v5.14' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / clk / meson / axg.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * AmLogic Meson-AXG Clock Controller Driver
4  *
5  * Copyright (c) 2016 Baylibre SAS.
6  * Author: Michael Turquette <mturquette@baylibre.com>
7  *
8  * Copyright (c) 2017 Amlogic, inc.
9  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
10  */
11
12 #include <linux/clk-provider.h>
13 #include <linux/init.h>
14 #include <linux/of_device.h>
15 #include <linux/platform_device.h>
16 #include <linux/module.h>
17
18 #include "clk-regmap.h"
19 #include "clk-pll.h"
20 #include "clk-mpll.h"
21 #include "axg.h"
22 #include "meson-eeclk.h"
23
24 static DEFINE_SPINLOCK(meson_clk_lock);
25
26 static struct clk_regmap axg_fixed_pll_dco = {
27         .data = &(struct meson_clk_pll_data){
28                 .en = {
29                         .reg_off = HHI_MPLL_CNTL,
30                         .shift   = 30,
31                         .width   = 1,
32                 },
33                 .m = {
34                         .reg_off = HHI_MPLL_CNTL,
35                         .shift   = 0,
36                         .width   = 9,
37                 },
38                 .n = {
39                         .reg_off = HHI_MPLL_CNTL,
40                         .shift   = 9,
41                         .width   = 5,
42                 },
43                 .frac = {
44                         .reg_off = HHI_MPLL_CNTL2,
45                         .shift   = 0,
46                         .width   = 12,
47                 },
48                 .l = {
49                         .reg_off = HHI_MPLL_CNTL,
50                         .shift   = 31,
51                         .width   = 1,
52                 },
53                 .rst = {
54                         .reg_off = HHI_MPLL_CNTL,
55                         .shift   = 29,
56                         .width   = 1,
57                 },
58         },
59         .hw.init = &(struct clk_init_data){
60                 .name = "fixed_pll_dco",
61                 .ops = &meson_clk_pll_ro_ops,
62                 .parent_data = &(const struct clk_parent_data) {
63                         .fw_name = "xtal",
64                 },
65                 .num_parents = 1,
66         },
67 };
68
69 static struct clk_regmap axg_fixed_pll = {
70         .data = &(struct clk_regmap_div_data){
71                 .offset = HHI_MPLL_CNTL,
72                 .shift = 16,
73                 .width = 2,
74                 .flags = CLK_DIVIDER_POWER_OF_TWO,
75         },
76         .hw.init = &(struct clk_init_data){
77                 .name = "fixed_pll",
78                 .ops = &clk_regmap_divider_ro_ops,
79                 .parent_hws = (const struct clk_hw *[]) {
80                         &axg_fixed_pll_dco.hw
81                 },
82                 .num_parents = 1,
83                 /*
84                  * This clock won't ever change at runtime so
85                  * CLK_SET_RATE_PARENT is not required
86                  */
87         },
88 };
89
90 static struct clk_regmap axg_sys_pll_dco = {
91         .data = &(struct meson_clk_pll_data){
92                 .en = {
93                         .reg_off = HHI_SYS_PLL_CNTL,
94                         .shift   = 30,
95                         .width   = 1,
96                 },
97                 .m = {
98                         .reg_off = HHI_SYS_PLL_CNTL,
99                         .shift   = 0,
100                         .width   = 9,
101                 },
102                 .n = {
103                         .reg_off = HHI_SYS_PLL_CNTL,
104                         .shift   = 9,
105                         .width   = 5,
106                 },
107                 .l = {
108                         .reg_off = HHI_SYS_PLL_CNTL,
109                         .shift   = 31,
110                         .width   = 1,
111                 },
112                 .rst = {
113                         .reg_off = HHI_SYS_PLL_CNTL,
114                         .shift   = 29,
115                         .width   = 1,
116                 },
117         },
118         .hw.init = &(struct clk_init_data){
119                 .name = "sys_pll_dco",
120                 .ops = &meson_clk_pll_ro_ops,
121                 .parent_data = &(const struct clk_parent_data) {
122                         .fw_name = "xtal",
123                 },
124                 .num_parents = 1,
125         },
126 };
127
128 static struct clk_regmap axg_sys_pll = {
129         .data = &(struct clk_regmap_div_data){
130                 .offset = HHI_SYS_PLL_CNTL,
131                 .shift = 16,
132                 .width = 2,
133                 .flags = CLK_DIVIDER_POWER_OF_TWO,
134         },
135         .hw.init = &(struct clk_init_data){
136                 .name = "sys_pll",
137                 .ops = &clk_regmap_divider_ro_ops,
138                 .parent_hws = (const struct clk_hw *[]) {
139                         &axg_sys_pll_dco.hw
140                 },
141                 .num_parents = 1,
142                 .flags = CLK_SET_RATE_PARENT,
143         },
144 };
145
146 static const struct pll_params_table axg_gp0_pll_params_table[] = {
147         PLL_PARAMS(40, 1),
148         PLL_PARAMS(41, 1),
149         PLL_PARAMS(42, 1),
150         PLL_PARAMS(43, 1),
151         PLL_PARAMS(44, 1),
152         PLL_PARAMS(45, 1),
153         PLL_PARAMS(46, 1),
154         PLL_PARAMS(47, 1),
155         PLL_PARAMS(48, 1),
156         PLL_PARAMS(49, 1),
157         PLL_PARAMS(50, 1),
158         PLL_PARAMS(51, 1),
159         PLL_PARAMS(52, 1),
160         PLL_PARAMS(53, 1),
161         PLL_PARAMS(54, 1),
162         PLL_PARAMS(55, 1),
163         PLL_PARAMS(56, 1),
164         PLL_PARAMS(57, 1),
165         PLL_PARAMS(58, 1),
166         PLL_PARAMS(59, 1),
167         PLL_PARAMS(60, 1),
168         PLL_PARAMS(61, 1),
169         PLL_PARAMS(62, 1),
170         PLL_PARAMS(63, 1),
171         PLL_PARAMS(64, 1),
172         PLL_PARAMS(65, 1),
173         PLL_PARAMS(66, 1),
174         PLL_PARAMS(67, 1),
175         PLL_PARAMS(68, 1),
176         { /* sentinel */ },
177 };
178
179 static const struct reg_sequence axg_gp0_init_regs[] = {
180         { .reg = HHI_GP0_PLL_CNTL1,     .def = 0xc084b000 },
181         { .reg = HHI_GP0_PLL_CNTL2,     .def = 0xb75020be },
182         { .reg = HHI_GP0_PLL_CNTL3,     .def = 0x0a59a288 },
183         { .reg = HHI_GP0_PLL_CNTL4,     .def = 0xc000004d },
184         { .reg = HHI_GP0_PLL_CNTL5,     .def = 0x00078000 },
185 };
186
187 static struct clk_regmap axg_gp0_pll_dco = {
188         .data = &(struct meson_clk_pll_data){
189                 .en = {
190                         .reg_off = HHI_GP0_PLL_CNTL,
191                         .shift   = 30,
192                         .width   = 1,
193                 },
194                 .m = {
195                         .reg_off = HHI_GP0_PLL_CNTL,
196                         .shift   = 0,
197                         .width   = 9,
198                 },
199                 .n = {
200                         .reg_off = HHI_GP0_PLL_CNTL,
201                         .shift   = 9,
202                         .width   = 5,
203                 },
204                 .frac = {
205                         .reg_off = HHI_GP0_PLL_CNTL1,
206                         .shift   = 0,
207                         .width   = 10,
208                 },
209                 .l = {
210                         .reg_off = HHI_GP0_PLL_CNTL,
211                         .shift   = 31,
212                         .width   = 1,
213                 },
214                 .rst = {
215                         .reg_off = HHI_GP0_PLL_CNTL,
216                         .shift   = 29,
217                         .width   = 1,
218                 },
219                 .table = axg_gp0_pll_params_table,
220                 .init_regs = axg_gp0_init_regs,
221                 .init_count = ARRAY_SIZE(axg_gp0_init_regs),
222         },
223         .hw.init = &(struct clk_init_data){
224                 .name = "gp0_pll_dco",
225                 .ops = &meson_clk_pll_ops,
226                 .parent_data = &(const struct clk_parent_data) {
227                         .fw_name = "xtal",
228                 },
229                 .num_parents = 1,
230         },
231 };
232
233 static struct clk_regmap axg_gp0_pll = {
234         .data = &(struct clk_regmap_div_data){
235                 .offset = HHI_GP0_PLL_CNTL,
236                 .shift = 16,
237                 .width = 2,
238                 .flags = CLK_DIVIDER_POWER_OF_TWO,
239         },
240         .hw.init = &(struct clk_init_data){
241                 .name = "gp0_pll",
242                 .ops = &clk_regmap_divider_ops,
243                 .parent_hws = (const struct clk_hw *[]) {
244                         &axg_gp0_pll_dco.hw
245                 },
246                 .num_parents = 1,
247                 .flags = CLK_SET_RATE_PARENT,
248         },
249 };
250
251 static const struct reg_sequence axg_hifi_init_regs[] = {
252         { .reg = HHI_HIFI_PLL_CNTL1,    .def = 0xc084b000 },
253         { .reg = HHI_HIFI_PLL_CNTL2,    .def = 0xb75020be },
254         { .reg = HHI_HIFI_PLL_CNTL3,    .def = 0x0a6a3a88 },
255         { .reg = HHI_HIFI_PLL_CNTL4,    .def = 0xc000004d },
256         { .reg = HHI_HIFI_PLL_CNTL5,    .def = 0x00058000 },
257 };
258
259 static struct clk_regmap axg_hifi_pll_dco = {
260         .data = &(struct meson_clk_pll_data){
261                 .en = {
262                         .reg_off = HHI_HIFI_PLL_CNTL,
263                         .shift   = 30,
264                         .width   = 1,
265                 },
266                 .m = {
267                         .reg_off = HHI_HIFI_PLL_CNTL,
268                         .shift   = 0,
269                         .width   = 9,
270                 },
271                 .n = {
272                         .reg_off = HHI_HIFI_PLL_CNTL,
273                         .shift   = 9,
274                         .width   = 5,
275                 },
276                 .frac = {
277                         .reg_off = HHI_HIFI_PLL_CNTL5,
278                         .shift   = 0,
279                         .width   = 13,
280                 },
281                 .l = {
282                         .reg_off = HHI_HIFI_PLL_CNTL,
283                         .shift   = 31,
284                         .width   = 1,
285                 },
286                 .rst = {
287                         .reg_off = HHI_HIFI_PLL_CNTL,
288                         .shift   = 29,
289                         .width   = 1,
290                 },
291                 .table = axg_gp0_pll_params_table,
292                 .init_regs = axg_hifi_init_regs,
293                 .init_count = ARRAY_SIZE(axg_hifi_init_regs),
294                 .flags = CLK_MESON_PLL_ROUND_CLOSEST,
295         },
296         .hw.init = &(struct clk_init_data){
297                 .name = "hifi_pll_dco",
298                 .ops = &meson_clk_pll_ops,
299                 .parent_data = &(const struct clk_parent_data) {
300                         .fw_name = "xtal",
301                 },
302                 .num_parents = 1,
303         },
304 };
305
306 static struct clk_regmap axg_hifi_pll = {
307         .data = &(struct clk_regmap_div_data){
308                 .offset = HHI_HIFI_PLL_CNTL,
309                 .shift = 16,
310                 .width = 2,
311                 .flags = CLK_DIVIDER_POWER_OF_TWO,
312         },
313         .hw.init = &(struct clk_init_data){
314                 .name = "hifi_pll",
315                 .ops = &clk_regmap_divider_ops,
316                 .parent_hws = (const struct clk_hw *[]) {
317                         &axg_hifi_pll_dco.hw
318                 },
319                 .num_parents = 1,
320                 .flags = CLK_SET_RATE_PARENT,
321         },
322 };
323
324 static struct clk_fixed_factor axg_fclk_div2_div = {
325         .mult = 1,
326         .div = 2,
327         .hw.init = &(struct clk_init_data){
328                 .name = "fclk_div2_div",
329                 .ops = &clk_fixed_factor_ops,
330                 .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
331                 .num_parents = 1,
332         },
333 };
334
335 static struct clk_regmap axg_fclk_div2 = {
336         .data = &(struct clk_regmap_gate_data){
337                 .offset = HHI_MPLL_CNTL6,
338                 .bit_idx = 27,
339         },
340         .hw.init = &(struct clk_init_data){
341                 .name = "fclk_div2",
342                 .ops = &clk_regmap_gate_ops,
343                 .parent_hws = (const struct clk_hw *[]) {
344                         &axg_fclk_div2_div.hw
345                 },
346                 .num_parents = 1,
347                 .flags = CLK_IS_CRITICAL,
348         },
349 };
350
351 static struct clk_fixed_factor axg_fclk_div3_div = {
352         .mult = 1,
353         .div = 3,
354         .hw.init = &(struct clk_init_data){
355                 .name = "fclk_div3_div",
356                 .ops = &clk_fixed_factor_ops,
357                 .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
358                 .num_parents = 1,
359         },
360 };
361
362 static struct clk_regmap axg_fclk_div3 = {
363         .data = &(struct clk_regmap_gate_data){
364                 .offset = HHI_MPLL_CNTL6,
365                 .bit_idx = 28,
366         },
367         .hw.init = &(struct clk_init_data){
368                 .name = "fclk_div3",
369                 .ops = &clk_regmap_gate_ops,
370                 .parent_hws = (const struct clk_hw *[]) {
371                         &axg_fclk_div3_div.hw
372                 },
373                 .num_parents = 1,
374                 /*
375                  * FIXME:
376                  * This clock, as fdiv2, is used by the SCPI FW and is required
377                  * by the platform to operate correctly.
378                  * Until the following condition are met, we need this clock to
379                  * be marked as critical:
380                  * a) The SCPI generic driver claims and enable all the clocks
381                  *    it needs
382                  * b) CCF has a clock hand-off mechanism to make the sure the
383                  *    clock stays on until the proper driver comes along
384                  */
385                 .flags = CLK_IS_CRITICAL,
386         },
387 };
388
389 static struct clk_fixed_factor axg_fclk_div4_div = {
390         .mult = 1,
391         .div = 4,
392         .hw.init = &(struct clk_init_data){
393                 .name = "fclk_div4_div",
394                 .ops = &clk_fixed_factor_ops,
395                 .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
396                 .num_parents = 1,
397         },
398 };
399
400 static struct clk_regmap axg_fclk_div4 = {
401         .data = &(struct clk_regmap_gate_data){
402                 .offset = HHI_MPLL_CNTL6,
403                 .bit_idx = 29,
404         },
405         .hw.init = &(struct clk_init_data){
406                 .name = "fclk_div4",
407                 .ops = &clk_regmap_gate_ops,
408                 .parent_hws = (const struct clk_hw *[]) {
409                         &axg_fclk_div4_div.hw
410                 },
411                 .num_parents = 1,
412         },
413 };
414
415 static struct clk_fixed_factor axg_fclk_div5_div = {
416         .mult = 1,
417         .div = 5,
418         .hw.init = &(struct clk_init_data){
419                 .name = "fclk_div5_div",
420                 .ops = &clk_fixed_factor_ops,
421                 .parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
422                 .num_parents = 1,
423         },
424 };
425
426 static struct clk_regmap axg_fclk_div5 = {
427         .data = &(struct clk_regmap_gate_data){
428                 .offset = HHI_MPLL_CNTL6,
429                 .bit_idx = 30,
430         },
431         .hw.init = &(struct clk_init_data){
432                 .name = "fclk_div5",
433                 .ops = &clk_regmap_gate_ops,
434                 .parent_hws = (const struct clk_hw *[]) {
435                         &axg_fclk_div5_div.hw
436                 },
437                 .num_parents = 1,
438         },
439 };
440
441 static struct clk_fixed_factor axg_fclk_div7_div = {
442         .mult = 1,
443         .div = 7,
444         .hw.init = &(struct clk_init_data){
445                 .name = "fclk_div7_div",
446                 .ops = &clk_fixed_factor_ops,
447                 .parent_hws = (const struct clk_hw *[]) {
448                         &axg_fixed_pll.hw
449                 },
450                 .num_parents = 1,
451         },
452 };
453
454 static struct clk_regmap axg_fclk_div7 = {
455         .data = &(struct clk_regmap_gate_data){
456                 .offset = HHI_MPLL_CNTL6,
457                 .bit_idx = 31,
458         },
459         .hw.init = &(struct clk_init_data){
460                 .name = "fclk_div7",
461                 .ops = &clk_regmap_gate_ops,
462                 .parent_hws = (const struct clk_hw *[]) {
463                         &axg_fclk_div7_div.hw
464                 },
465                 .num_parents = 1,
466         },
467 };
468
469 static struct clk_regmap axg_mpll_prediv = {
470         .data = &(struct clk_regmap_div_data){
471                 .offset = HHI_MPLL_CNTL5,
472                 .shift = 12,
473                 .width = 1,
474         },
475         .hw.init = &(struct clk_init_data){
476                 .name = "mpll_prediv",
477                 .ops = &clk_regmap_divider_ro_ops,
478                 .parent_hws = (const struct clk_hw *[]) {
479                         &axg_fixed_pll.hw
480                 },
481                 .num_parents = 1,
482         },
483 };
484
485 static struct clk_regmap axg_mpll0_div = {
486         .data = &(struct meson_clk_mpll_data){
487                 .sdm = {
488                         .reg_off = HHI_MPLL_CNTL7,
489                         .shift   = 0,
490                         .width   = 14,
491                 },
492                 .sdm_en = {
493                         .reg_off = HHI_MPLL_CNTL7,
494                         .shift   = 15,
495                         .width   = 1,
496                 },
497                 .n2 = {
498                         .reg_off = HHI_MPLL_CNTL7,
499                         .shift   = 16,
500                         .width   = 9,
501                 },
502                 .misc = {
503                         .reg_off = HHI_PLL_TOP_MISC,
504                         .shift   = 0,
505                         .width   = 1,
506                 },
507                 .lock = &meson_clk_lock,
508                 .flags = CLK_MESON_MPLL_ROUND_CLOSEST,
509         },
510         .hw.init = &(struct clk_init_data){
511                 .name = "mpll0_div",
512                 .ops = &meson_clk_mpll_ops,
513                 .parent_hws = (const struct clk_hw *[]) {
514                         &axg_mpll_prediv.hw
515                 },
516                 .num_parents = 1,
517         },
518 };
519
520 static struct clk_regmap axg_mpll0 = {
521         .data = &(struct clk_regmap_gate_data){
522                 .offset = HHI_MPLL_CNTL7,
523                 .bit_idx = 14,
524         },
525         .hw.init = &(struct clk_init_data){
526                 .name = "mpll0",
527                 .ops = &clk_regmap_gate_ops,
528                 .parent_hws = (const struct clk_hw *[]) {
529                         &axg_mpll0_div.hw
530                 },
531                 .num_parents = 1,
532                 .flags = CLK_SET_RATE_PARENT,
533         },
534 };
535
536 static struct clk_regmap axg_mpll1_div = {
537         .data = &(struct meson_clk_mpll_data){
538                 .sdm = {
539                         .reg_off = HHI_MPLL_CNTL8,
540                         .shift   = 0,
541                         .width   = 14,
542                 },
543                 .sdm_en = {
544                         .reg_off = HHI_MPLL_CNTL8,
545                         .shift   = 15,
546                         .width   = 1,
547                 },
548                 .n2 = {
549                         .reg_off = HHI_MPLL_CNTL8,
550                         .shift   = 16,
551                         .width   = 9,
552                 },
553                 .misc = {
554                         .reg_off = HHI_PLL_TOP_MISC,
555                         .shift   = 1,
556                         .width   = 1,
557                 },
558                 .lock = &meson_clk_lock,
559                 .flags = CLK_MESON_MPLL_ROUND_CLOSEST,
560         },
561         .hw.init = &(struct clk_init_data){
562                 .name = "mpll1_div",
563                 .ops = &meson_clk_mpll_ops,
564                 .parent_hws = (const struct clk_hw *[]) {
565                         &axg_mpll_prediv.hw
566                 },
567                 .num_parents = 1,
568         },
569 };
570
571 static struct clk_regmap axg_mpll1 = {
572         .data = &(struct clk_regmap_gate_data){
573                 .offset = HHI_MPLL_CNTL8,
574                 .bit_idx = 14,
575         },
576         .hw.init = &(struct clk_init_data){
577                 .name = "mpll1",
578                 .ops = &clk_regmap_gate_ops,
579                 .parent_hws = (const struct clk_hw *[]) {
580                         &axg_mpll1_div.hw
581                 },
582                 .num_parents = 1,
583                 .flags = CLK_SET_RATE_PARENT,
584         },
585 };
586
587 static struct clk_regmap axg_mpll2_div = {
588         .data = &(struct meson_clk_mpll_data){
589                 .sdm = {
590                         .reg_off = HHI_MPLL_CNTL9,
591                         .shift   = 0,
592                         .width   = 14,
593                 },
594                 .sdm_en = {
595                         .reg_off = HHI_MPLL_CNTL9,
596                         .shift   = 15,
597                         .width   = 1,
598                 },
599                 .n2 = {
600                         .reg_off = HHI_MPLL_CNTL9,
601                         .shift   = 16,
602                         .width   = 9,
603                 },
604                 .ssen = {
605                         .reg_off = HHI_MPLL_CNTL,
606                         .shift   = 25,
607                         .width   = 1,
608                 },
609                 .misc = {
610                         .reg_off = HHI_PLL_TOP_MISC,
611                         .shift   = 2,
612                         .width   = 1,
613                 },
614                 .lock = &meson_clk_lock,
615                 .flags = CLK_MESON_MPLL_ROUND_CLOSEST,
616         },
617         .hw.init = &(struct clk_init_data){
618                 .name = "mpll2_div",
619                 .ops = &meson_clk_mpll_ops,
620                 .parent_hws = (const struct clk_hw *[]) {
621                         &axg_mpll_prediv.hw
622                 },
623                 .num_parents = 1,
624         },
625 };
626
627 static struct clk_regmap axg_mpll2 = {
628         .data = &(struct clk_regmap_gate_data){
629                 .offset = HHI_MPLL_CNTL9,
630                 .bit_idx = 14,
631         },
632         .hw.init = &(struct clk_init_data){
633                 .name = "mpll2",
634                 .ops = &clk_regmap_gate_ops,
635                 .parent_hws = (const struct clk_hw *[]) {
636                         &axg_mpll2_div.hw
637                 },
638                 .num_parents = 1,
639                 .flags = CLK_SET_RATE_PARENT,
640         },
641 };
642
643 static struct clk_regmap axg_mpll3_div = {
644         .data = &(struct meson_clk_mpll_data){
645                 .sdm = {
646                         .reg_off = HHI_MPLL3_CNTL0,
647                         .shift   = 12,
648                         .width   = 14,
649                 },
650                 .sdm_en = {
651                         .reg_off = HHI_MPLL3_CNTL0,
652                         .shift   = 11,
653                         .width   = 1,
654                 },
655                 .n2 = {
656                         .reg_off = HHI_MPLL3_CNTL0,
657                         .shift   = 2,
658                         .width   = 9,
659                 },
660                 .misc = {
661                         .reg_off = HHI_PLL_TOP_MISC,
662                         .shift   = 3,
663                         .width   = 1,
664                 },
665                 .lock = &meson_clk_lock,
666                 .flags = CLK_MESON_MPLL_ROUND_CLOSEST,
667         },
668         .hw.init = &(struct clk_init_data){
669                 .name = "mpll3_div",
670                 .ops = &meson_clk_mpll_ops,
671                 .parent_hws = (const struct clk_hw *[]) {
672                         &axg_mpll_prediv.hw
673                 },
674                 .num_parents = 1,
675         },
676 };
677
678 static struct clk_regmap axg_mpll3 = {
679         .data = &(struct clk_regmap_gate_data){
680                 .offset = HHI_MPLL3_CNTL0,
681                 .bit_idx = 0,
682         },
683         .hw.init = &(struct clk_init_data){
684                 .name = "mpll3",
685                 .ops = &clk_regmap_gate_ops,
686                 .parent_hws = (const struct clk_hw *[]) {
687                         &axg_mpll3_div.hw
688                 },
689                 .num_parents = 1,
690                 .flags = CLK_SET_RATE_PARENT,
691         },
692 };
693
694 static const struct pll_params_table axg_pcie_pll_params_table[] = {
695         {
696                 .m = 200,
697                 .n = 3,
698         },
699         { /* sentinel */ },
700 };
701
702 static const struct reg_sequence axg_pcie_init_regs[] = {
703         { .reg = HHI_PCIE_PLL_CNTL1,    .def = 0x0084a2aa },
704         { .reg = HHI_PCIE_PLL_CNTL2,    .def = 0xb75020be },
705         { .reg = HHI_PCIE_PLL_CNTL3,    .def = 0x0a47488e },
706         { .reg = HHI_PCIE_PLL_CNTL4,    .def = 0xc000004d },
707         { .reg = HHI_PCIE_PLL_CNTL5,    .def = 0x00078000 },
708         { .reg = HHI_PCIE_PLL_CNTL6,    .def = 0x002323c6 },
709         { .reg = HHI_PCIE_PLL_CNTL,     .def = 0x400106c8 },
710 };
711
712 static struct clk_regmap axg_pcie_pll_dco = {
713         .data = &(struct meson_clk_pll_data){
714                 .en = {
715                         .reg_off = HHI_PCIE_PLL_CNTL,
716                         .shift   = 30,
717                         .width   = 1,
718                 },
719                 .m = {
720                         .reg_off = HHI_PCIE_PLL_CNTL,
721                         .shift   = 0,
722                         .width   = 9,
723                 },
724                 .n = {
725                         .reg_off = HHI_PCIE_PLL_CNTL,
726                         .shift   = 9,
727                         .width   = 5,
728                 },
729                 .frac = {
730                         .reg_off = HHI_PCIE_PLL_CNTL1,
731                         .shift   = 0,
732                         .width   = 12,
733                 },
734                 .l = {
735                         .reg_off = HHI_PCIE_PLL_CNTL,
736                         .shift   = 31,
737                         .width   = 1,
738                 },
739                 .rst = {
740                         .reg_off = HHI_PCIE_PLL_CNTL,
741                         .shift   = 29,
742                         .width   = 1,
743                 },
744                 .table = axg_pcie_pll_params_table,
745                 .init_regs = axg_pcie_init_regs,
746                 .init_count = ARRAY_SIZE(axg_pcie_init_regs),
747         },
748         .hw.init = &(struct clk_init_data){
749                 .name = "pcie_pll_dco",
750                 .ops = &meson_clk_pll_ops,
751                 .parent_data = &(const struct clk_parent_data) {
752                         .fw_name = "xtal",
753                 },
754                 .num_parents = 1,
755         },
756 };
757
758 static struct clk_regmap axg_pcie_pll_od = {
759         .data = &(struct clk_regmap_div_data){
760                 .offset = HHI_PCIE_PLL_CNTL,
761                 .shift = 16,
762                 .width = 2,
763                 .flags = CLK_DIVIDER_POWER_OF_TWO,
764         },
765         .hw.init = &(struct clk_init_data){
766                 .name = "pcie_pll_od",
767                 .ops = &clk_regmap_divider_ops,
768                 .parent_hws = (const struct clk_hw *[]) {
769                         &axg_pcie_pll_dco.hw
770                 },
771                 .num_parents = 1,
772                 .flags = CLK_SET_RATE_PARENT,
773         },
774 };
775
776 static struct clk_regmap axg_pcie_pll = {
777         .data = &(struct clk_regmap_div_data){
778                 .offset = HHI_PCIE_PLL_CNTL6,
779                 .shift = 6,
780                 .width = 2,
781                 .flags = CLK_DIVIDER_POWER_OF_TWO,
782         },
783         .hw.init = &(struct clk_init_data){
784                 .name = "pcie_pll",
785                 .ops = &clk_regmap_divider_ops,
786                 .parent_hws = (const struct clk_hw *[]) {
787                         &axg_pcie_pll_od.hw
788                 },
789                 .num_parents = 1,
790                 .flags = CLK_SET_RATE_PARENT,
791         },
792 };
793
794 static struct clk_regmap axg_pcie_mux = {
795         .data = &(struct clk_regmap_mux_data){
796                 .offset = HHI_PCIE_PLL_CNTL6,
797                 .mask = 0x1,
798                 .shift = 2,
799                 /* skip the parent mpll3, reserved for debug */
800                 .table = (u32[]){ 1 },
801         },
802         .hw.init = &(struct clk_init_data){
803                 .name = "pcie_mux",
804                 .ops = &clk_regmap_mux_ops,
805                 .parent_hws = (const struct clk_hw *[]) { &axg_pcie_pll.hw },
806                 .num_parents = 1,
807                 .flags = CLK_SET_RATE_PARENT,
808         },
809 };
810
811 static struct clk_regmap axg_pcie_ref = {
812         .data = &(struct clk_regmap_mux_data){
813                 .offset = HHI_PCIE_PLL_CNTL6,
814                 .mask = 0x1,
815                 .shift = 1,
816                 /* skip the parent 0, reserved for debug */
817                 .table = (u32[]){ 1 },
818         },
819         .hw.init = &(struct clk_init_data){
820                 .name = "pcie_ref",
821                 .ops = &clk_regmap_mux_ops,
822                 .parent_hws = (const struct clk_hw *[]) { &axg_pcie_mux.hw },
823                 .num_parents = 1,
824                 .flags = CLK_SET_RATE_PARENT,
825         },
826 };
827
828 static struct clk_regmap axg_pcie_cml_en0 = {
829         .data = &(struct clk_regmap_gate_data){
830                 .offset = HHI_PCIE_PLL_CNTL6,
831                 .bit_idx = 4,
832         },
833         .hw.init = &(struct clk_init_data) {
834                 .name = "pcie_cml_en0",
835                 .ops = &clk_regmap_gate_ops,
836                 .parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
837                 .num_parents = 1,
838                 .flags = CLK_SET_RATE_PARENT,
839
840         },
841 };
842
843 static struct clk_regmap axg_pcie_cml_en1 = {
844         .data = &(struct clk_regmap_gate_data){
845                 .offset = HHI_PCIE_PLL_CNTL6,
846                 .bit_idx = 3,
847         },
848         .hw.init = &(struct clk_init_data) {
849                 .name = "pcie_cml_en1",
850                 .ops = &clk_regmap_gate_ops,
851                 .parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
852                 .num_parents = 1,
853                 .flags = CLK_SET_RATE_PARENT,
854         },
855 };
856
857 static u32 mux_table_clk81[]    = { 0, 2, 3, 4, 5, 6, 7 };
858 static const struct clk_parent_data clk81_parent_data[] = {
859         { .fw_name = "xtal", },
860         { .hw = &axg_fclk_div7.hw },
861         { .hw = &axg_mpll1.hw },
862         { .hw = &axg_mpll2.hw },
863         { .hw = &axg_fclk_div4.hw },
864         { .hw = &axg_fclk_div3.hw },
865         { .hw = &axg_fclk_div5.hw },
866 };
867
868 static struct clk_regmap axg_mpeg_clk_sel = {
869         .data = &(struct clk_regmap_mux_data){
870                 .offset = HHI_MPEG_CLK_CNTL,
871                 .mask = 0x7,
872                 .shift = 12,
873                 .table = mux_table_clk81,
874         },
875         .hw.init = &(struct clk_init_data){
876                 .name = "mpeg_clk_sel",
877                 .ops = &clk_regmap_mux_ro_ops,
878                 .parent_data = clk81_parent_data,
879                 .num_parents = ARRAY_SIZE(clk81_parent_data),
880         },
881 };
882
883 static struct clk_regmap axg_mpeg_clk_div = {
884         .data = &(struct clk_regmap_div_data){
885                 .offset = HHI_MPEG_CLK_CNTL,
886                 .shift = 0,
887                 .width = 7,
888         },
889         .hw.init = &(struct clk_init_data){
890                 .name = "mpeg_clk_div",
891                 .ops = &clk_regmap_divider_ops,
892                 .parent_hws = (const struct clk_hw *[]) {
893                         &axg_mpeg_clk_sel.hw
894                 },
895                 .num_parents = 1,
896                 .flags = CLK_SET_RATE_PARENT,
897         },
898 };
899
900 static struct clk_regmap axg_clk81 = {
901         .data = &(struct clk_regmap_gate_data){
902                 .offset = HHI_MPEG_CLK_CNTL,
903                 .bit_idx = 7,
904         },
905         .hw.init = &(struct clk_init_data){
906                 .name = "clk81",
907                 .ops = &clk_regmap_gate_ops,
908                 .parent_hws = (const struct clk_hw *[]) {
909                         &axg_mpeg_clk_div.hw
910                 },
911                 .num_parents = 1,
912                 .flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
913         },
914 };
915
916 static const struct clk_parent_data axg_sd_emmc_clk0_parent_data[] = {
917         { .fw_name = "xtal", },
918         { .hw = &axg_fclk_div2.hw },
919         { .hw = &axg_fclk_div3.hw },
920         { .hw = &axg_fclk_div5.hw },
921         { .hw = &axg_fclk_div7.hw },
922         /*
923          * Following these parent clocks, we should also have had mpll2, mpll3
924          * and gp0_pll but these clocks are too precious to be used here. All
925          * the necessary rates for MMC and NAND operation can be acheived using
926          * xtal or fclk_div clocks
927          */
928 };
929
930 /* SDcard clock */
931 static struct clk_regmap axg_sd_emmc_b_clk0_sel = {
932         .data = &(struct clk_regmap_mux_data){
933                 .offset = HHI_SD_EMMC_CLK_CNTL,
934                 .mask = 0x7,
935                 .shift = 25,
936         },
937         .hw.init = &(struct clk_init_data) {
938                 .name = "sd_emmc_b_clk0_sel",
939                 .ops = &clk_regmap_mux_ops,
940                 .parent_data = axg_sd_emmc_clk0_parent_data,
941                 .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
942                 .flags = CLK_SET_RATE_PARENT,
943         },
944 };
945
946 static struct clk_regmap axg_sd_emmc_b_clk0_div = {
947         .data = &(struct clk_regmap_div_data){
948                 .offset = HHI_SD_EMMC_CLK_CNTL,
949                 .shift = 16,
950                 .width = 7,
951                 .flags = CLK_DIVIDER_ROUND_CLOSEST,
952         },
953         .hw.init = &(struct clk_init_data) {
954                 .name = "sd_emmc_b_clk0_div",
955                 .ops = &clk_regmap_divider_ops,
956                 .parent_hws = (const struct clk_hw *[]) {
957                         &axg_sd_emmc_b_clk0_sel.hw
958                 },
959                 .num_parents = 1,
960                 .flags = CLK_SET_RATE_PARENT,
961         },
962 };
963
964 static struct clk_regmap axg_sd_emmc_b_clk0 = {
965         .data = &(struct clk_regmap_gate_data){
966                 .offset = HHI_SD_EMMC_CLK_CNTL,
967                 .bit_idx = 23,
968         },
969         .hw.init = &(struct clk_init_data){
970                 .name = "sd_emmc_b_clk0",
971                 .ops = &clk_regmap_gate_ops,
972                 .parent_hws = (const struct clk_hw *[]) {
973                         &axg_sd_emmc_b_clk0_div.hw
974                 },
975                 .num_parents = 1,
976                 .flags = CLK_SET_RATE_PARENT,
977         },
978 };
979
980 /* EMMC/NAND clock */
981 static struct clk_regmap axg_sd_emmc_c_clk0_sel = {
982         .data = &(struct clk_regmap_mux_data){
983                 .offset = HHI_NAND_CLK_CNTL,
984                 .mask = 0x7,
985                 .shift = 9,
986         },
987         .hw.init = &(struct clk_init_data) {
988                 .name = "sd_emmc_c_clk0_sel",
989                 .ops = &clk_regmap_mux_ops,
990                 .parent_data = axg_sd_emmc_clk0_parent_data,
991                 .num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
992                 .flags = CLK_SET_RATE_PARENT,
993         },
994 };
995
996 static struct clk_regmap axg_sd_emmc_c_clk0_div = {
997         .data = &(struct clk_regmap_div_data){
998                 .offset = HHI_NAND_CLK_CNTL,
999                 .shift = 0,
1000                 .width = 7,
1001                 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1002         },
1003         .hw.init = &(struct clk_init_data) {
1004                 .name = "sd_emmc_c_clk0_div",
1005                 .ops = &clk_regmap_divider_ops,
1006                 .parent_hws = (const struct clk_hw *[]) {
1007                         &axg_sd_emmc_c_clk0_sel.hw
1008                 },
1009                 .num_parents = 1,
1010                 .flags = CLK_SET_RATE_PARENT,
1011         },
1012 };
1013
1014 static struct clk_regmap axg_sd_emmc_c_clk0 = {
1015         .data = &(struct clk_regmap_gate_data){
1016                 .offset = HHI_NAND_CLK_CNTL,
1017                 .bit_idx = 7,
1018         },
1019         .hw.init = &(struct clk_init_data){
1020                 .name = "sd_emmc_c_clk0",
1021                 .ops = &clk_regmap_gate_ops,
1022                 .parent_hws = (const struct clk_hw *[]) {
1023                         &axg_sd_emmc_c_clk0_div.hw
1024                 },
1025                 .num_parents = 1,
1026                 .flags = CLK_SET_RATE_PARENT,
1027         },
1028 };
1029
1030 /* VPU Clock */
1031
1032 static const struct clk_hw *axg_vpu_parent_hws[] = {
1033         &axg_fclk_div4.hw,
1034         &axg_fclk_div3.hw,
1035         &axg_fclk_div5.hw,
1036         &axg_fclk_div7.hw,
1037 };
1038
1039 static struct clk_regmap axg_vpu_0_sel = {
1040         .data = &(struct clk_regmap_mux_data){
1041                 .offset = HHI_VPU_CLK_CNTL,
1042                 .mask = 0x3,
1043                 .shift = 9,
1044         },
1045         .hw.init = &(struct clk_init_data){
1046                 .name = "vpu_0_sel",
1047                 .ops = &clk_regmap_mux_ops,
1048                 .parent_hws = axg_vpu_parent_hws,
1049                 .num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
1050                 /* We need a specific parent for VPU clock source, let it be set in DT */
1051                 .flags = CLK_SET_RATE_NO_REPARENT,
1052         },
1053 };
1054
1055 static struct clk_regmap axg_vpu_0_div = {
1056         .data = &(struct clk_regmap_div_data){
1057                 .offset = HHI_VPU_CLK_CNTL,
1058                 .shift = 0,
1059                 .width = 7,
1060         },
1061         .hw.init = &(struct clk_init_data){
1062                 .name = "vpu_0_div",
1063                 .ops = &clk_regmap_divider_ops,
1064                 .parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_sel.hw },
1065                 .num_parents = 1,
1066                 .flags = CLK_SET_RATE_PARENT,
1067         },
1068 };
1069
1070 static struct clk_regmap axg_vpu_0 = {
1071         .data = &(struct clk_regmap_gate_data){
1072                 .offset = HHI_VPU_CLK_CNTL,
1073                 .bit_idx = 8,
1074         },
1075         .hw.init = &(struct clk_init_data) {
1076                 .name = "vpu_0",
1077                 .ops = &clk_regmap_gate_ops,
1078                 .parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_div.hw },
1079                 .num_parents = 1,
1080                 /*
1081                  * We want to avoid CCF to disable the VPU clock if
1082                  * display has been set by Bootloader
1083                  */
1084                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1085         },
1086 };
1087
1088 static struct clk_regmap axg_vpu_1_sel = {
1089         .data = &(struct clk_regmap_mux_data){
1090                 .offset = HHI_VPU_CLK_CNTL,
1091                 .mask = 0x3,
1092                 .shift = 25,
1093         },
1094         .hw.init = &(struct clk_init_data){
1095                 .name = "vpu_1_sel",
1096                 .ops = &clk_regmap_mux_ops,
1097                 .parent_hws = axg_vpu_parent_hws,
1098                 .num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
1099                 /* We need a specific parent for VPU clock source, let it be set in DT */
1100                 .flags = CLK_SET_RATE_NO_REPARENT,
1101         },
1102 };
1103
1104 static struct clk_regmap axg_vpu_1_div = {
1105         .data = &(struct clk_regmap_div_data){
1106                 .offset = HHI_VPU_CLK_CNTL,
1107                 .shift = 16,
1108                 .width = 7,
1109         },
1110         .hw.init = &(struct clk_init_data){
1111                 .name = "vpu_1_div",
1112                 .ops = &clk_regmap_divider_ops,
1113                 .parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_sel.hw },
1114                 .num_parents = 1,
1115                 .flags = CLK_SET_RATE_PARENT,
1116         },
1117 };
1118
1119 static struct clk_regmap axg_vpu_1 = {
1120         .data = &(struct clk_regmap_gate_data){
1121                 .offset = HHI_VPU_CLK_CNTL,
1122                 .bit_idx = 24,
1123         },
1124         .hw.init = &(struct clk_init_data) {
1125                 .name = "vpu_1",
1126                 .ops = &clk_regmap_gate_ops,
1127                 .parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_div.hw },
1128                 .num_parents = 1,
1129                 /*
1130                  * We want to avoid CCF to disable the VPU clock if
1131                  * display has been set by Bootloader
1132                  */
1133                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1134         },
1135 };
1136
1137 static struct clk_regmap axg_vpu = {
1138         .data = &(struct clk_regmap_mux_data){
1139                 .offset = HHI_VPU_CLK_CNTL,
1140                 .mask = 1,
1141                 .shift = 31,
1142         },
1143         .hw.init = &(struct clk_init_data){
1144                 .name = "vpu",
1145                 .ops = &clk_regmap_mux_ops,
1146                 .parent_hws = (const struct clk_hw *[]) {
1147                         &axg_vpu_0.hw,
1148                         &axg_vpu_1.hw
1149                 },
1150                 .num_parents = 2,
1151                 .flags = CLK_SET_RATE_NO_REPARENT,
1152         },
1153 };
1154
1155 /* VAPB Clock */
1156
1157 static struct clk_regmap axg_vapb_0_sel = {
1158         .data = &(struct clk_regmap_mux_data){
1159                 .offset = HHI_VAPBCLK_CNTL,
1160                 .mask = 0x3,
1161                 .shift = 9,
1162         },
1163         .hw.init = &(struct clk_init_data){
1164                 .name = "vapb_0_sel",
1165                 .ops = &clk_regmap_mux_ops,
1166                 .parent_hws = axg_vpu_parent_hws,
1167                 .num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
1168                 .flags = CLK_SET_RATE_NO_REPARENT,
1169         },
1170 };
1171
1172 static struct clk_regmap axg_vapb_0_div = {
1173         .data = &(struct clk_regmap_div_data){
1174                 .offset = HHI_VAPBCLK_CNTL,
1175                 .shift = 0,
1176                 .width = 7,
1177         },
1178         .hw.init = &(struct clk_init_data){
1179                 .name = "vapb_0_div",
1180                 .ops = &clk_regmap_divider_ops,
1181                 .parent_hws = (const struct clk_hw *[]) {
1182                         &axg_vapb_0_sel.hw
1183                 },
1184                 .num_parents = 1,
1185                 .flags = CLK_SET_RATE_PARENT,
1186         },
1187 };
1188
1189 static struct clk_regmap axg_vapb_0 = {
1190         .data = &(struct clk_regmap_gate_data){
1191                 .offset = HHI_VAPBCLK_CNTL,
1192                 .bit_idx = 8,
1193         },
1194         .hw.init = &(struct clk_init_data) {
1195                 .name = "vapb_0",
1196                 .ops = &clk_regmap_gate_ops,
1197                 .parent_hws = (const struct clk_hw *[]) {
1198                         &axg_vapb_0_div.hw
1199                 },
1200                 .num_parents = 1,
1201                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1202         },
1203 };
1204
1205 static struct clk_regmap axg_vapb_1_sel = {
1206         .data = &(struct clk_regmap_mux_data){
1207                 .offset = HHI_VAPBCLK_CNTL,
1208                 .mask = 0x3,
1209                 .shift = 25,
1210         },
1211         .hw.init = &(struct clk_init_data){
1212                 .name = "vapb_1_sel",
1213                 .ops = &clk_regmap_mux_ops,
1214                 .parent_hws = axg_vpu_parent_hws,
1215                 .num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
1216                 .flags = CLK_SET_RATE_NO_REPARENT,
1217         },
1218 };
1219
1220 static struct clk_regmap axg_vapb_1_div = {
1221         .data = &(struct clk_regmap_div_data){
1222                 .offset = HHI_VAPBCLK_CNTL,
1223                 .shift = 16,
1224                 .width = 7,
1225         },
1226         .hw.init = &(struct clk_init_data){
1227                 .name = "vapb_1_div",
1228                 .ops = &clk_regmap_divider_ops,
1229                 .parent_hws = (const struct clk_hw *[]) {
1230                         &axg_vapb_1_sel.hw
1231                 },
1232                 .num_parents = 1,
1233                 .flags = CLK_SET_RATE_PARENT,
1234         },
1235 };
1236
1237 static struct clk_regmap axg_vapb_1 = {
1238         .data = &(struct clk_regmap_gate_data){
1239                 .offset = HHI_VAPBCLK_CNTL,
1240                 .bit_idx = 24,
1241         },
1242         .hw.init = &(struct clk_init_data) {
1243                 .name = "vapb_1",
1244                 .ops = &clk_regmap_gate_ops,
1245                 .parent_hws = (const struct clk_hw *[]) {
1246                         &axg_vapb_1_div.hw
1247                 },
1248                 .num_parents = 1,
1249                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1250         },
1251 };
1252
1253 static struct clk_regmap axg_vapb_sel = {
1254         .data = &(struct clk_regmap_mux_data){
1255                 .offset = HHI_VAPBCLK_CNTL,
1256                 .mask = 1,
1257                 .shift = 31,
1258         },
1259         .hw.init = &(struct clk_init_data){
1260                 .name = "vapb_sel",
1261                 .ops = &clk_regmap_mux_ops,
1262                 .parent_hws = (const struct clk_hw *[]) {
1263                         &axg_vapb_0.hw,
1264                         &axg_vapb_1.hw
1265                 },
1266                 .num_parents = 2,
1267                 .flags = CLK_SET_RATE_NO_REPARENT,
1268         },
1269 };
1270
1271 static struct clk_regmap axg_vapb = {
1272         .data = &(struct clk_regmap_gate_data){
1273                 .offset = HHI_VAPBCLK_CNTL,
1274                 .bit_idx = 30,
1275         },
1276         .hw.init = &(struct clk_init_data) {
1277                 .name = "vapb",
1278                 .ops = &clk_regmap_gate_ops,
1279                 .parent_hws = (const struct clk_hw *[]) { &axg_vapb_sel.hw },
1280                 .num_parents = 1,
1281                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1282         },
1283 };
1284
1285 /* Video Clocks */
1286
1287 static const struct clk_hw *axg_vclk_parent_hws[] = {
1288         &axg_gp0_pll.hw,
1289         &axg_fclk_div4.hw,
1290         &axg_fclk_div3.hw,
1291         &axg_fclk_div5.hw,
1292         &axg_fclk_div2.hw,
1293         &axg_fclk_div7.hw,
1294         &axg_mpll1.hw,
1295 };
1296
1297 static struct clk_regmap axg_vclk_sel = {
1298         .data = &(struct clk_regmap_mux_data){
1299                 .offset = HHI_VID_CLK_CNTL,
1300                 .mask = 0x7,
1301                 .shift = 16,
1302         },
1303         .hw.init = &(struct clk_init_data){
1304                 .name = "vclk_sel",
1305                 .ops = &clk_regmap_mux_ops,
1306                 .parent_hws = axg_vclk_parent_hws,
1307                 .num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
1308                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1309         },
1310 };
1311
1312 static struct clk_regmap axg_vclk2_sel = {
1313         .data = &(struct clk_regmap_mux_data){
1314                 .offset = HHI_VIID_CLK_CNTL,
1315                 .mask = 0x7,
1316                 .shift = 16,
1317         },
1318         .hw.init = &(struct clk_init_data){
1319                 .name = "vclk2_sel",
1320                 .ops = &clk_regmap_mux_ops,
1321                 .parent_hws = axg_vclk_parent_hws,
1322                 .num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
1323                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1324         },
1325 };
1326
1327 static struct clk_regmap axg_vclk_input = {
1328         .data = &(struct clk_regmap_gate_data){
1329                 .offset = HHI_VID_CLK_DIV,
1330                 .bit_idx = 16,
1331         },
1332         .hw.init = &(struct clk_init_data) {
1333                 .name = "vclk_input",
1334                 .ops = &clk_regmap_gate_ops,
1335                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk_sel.hw },
1336                 .num_parents = 1,
1337                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1338         },
1339 };
1340
1341 static struct clk_regmap axg_vclk2_input = {
1342         .data = &(struct clk_regmap_gate_data){
1343                 .offset = HHI_VIID_CLK_DIV,
1344                 .bit_idx = 16,
1345         },
1346         .hw.init = &(struct clk_init_data) {
1347                 .name = "vclk2_input",
1348                 .ops = &clk_regmap_gate_ops,
1349                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2_sel.hw },
1350                 .num_parents = 1,
1351                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1352         },
1353 };
1354
1355 static struct clk_regmap axg_vclk_div = {
1356         .data = &(struct clk_regmap_div_data){
1357                 .offset = HHI_VID_CLK_DIV,
1358                 .shift = 0,
1359                 .width = 8,
1360         },
1361         .hw.init = &(struct clk_init_data){
1362                 .name = "vclk_div",
1363                 .ops = &clk_regmap_divider_ops,
1364                 .parent_hws = (const struct clk_hw *[]) {
1365                         &axg_vclk_input.hw
1366                 },
1367                 .num_parents = 1,
1368                 .flags = CLK_GET_RATE_NOCACHE,
1369         },
1370 };
1371
1372 static struct clk_regmap axg_vclk2_div = {
1373         .data = &(struct clk_regmap_div_data){
1374                 .offset = HHI_VIID_CLK_DIV,
1375                 .shift = 0,
1376                 .width = 8,
1377         },
1378         .hw.init = &(struct clk_init_data){
1379                 .name = "vclk2_div",
1380                 .ops = &clk_regmap_divider_ops,
1381                 .parent_hws = (const struct clk_hw *[]) {
1382                         &axg_vclk2_input.hw
1383                 },
1384                 .num_parents = 1,
1385                 .flags = CLK_GET_RATE_NOCACHE,
1386         },
1387 };
1388
1389 static struct clk_regmap axg_vclk = {
1390         .data = &(struct clk_regmap_gate_data){
1391                 .offset = HHI_VID_CLK_CNTL,
1392                 .bit_idx = 19,
1393         },
1394         .hw.init = &(struct clk_init_data) {
1395                 .name = "vclk",
1396                 .ops = &clk_regmap_gate_ops,
1397                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk_div.hw },
1398                 .num_parents = 1,
1399                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1400         },
1401 };
1402
1403 static struct clk_regmap axg_vclk2 = {
1404         .data = &(struct clk_regmap_gate_data){
1405                 .offset = HHI_VIID_CLK_CNTL,
1406                 .bit_idx = 19,
1407         },
1408         .hw.init = &(struct clk_init_data) {
1409                 .name = "vclk2",
1410                 .ops = &clk_regmap_gate_ops,
1411                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2_div.hw },
1412                 .num_parents = 1,
1413                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1414         },
1415 };
1416
1417 static struct clk_regmap axg_vclk_div1 = {
1418         .data = &(struct clk_regmap_gate_data){
1419                 .offset = HHI_VID_CLK_CNTL,
1420                 .bit_idx = 0,
1421         },
1422         .hw.init = &(struct clk_init_data) {
1423                 .name = "vclk_div1",
1424                 .ops = &clk_regmap_gate_ops,
1425                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
1426                 .num_parents = 1,
1427                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1428         },
1429 };
1430
1431 static struct clk_regmap axg_vclk_div2_en = {
1432         .data = &(struct clk_regmap_gate_data){
1433                 .offset = HHI_VID_CLK_CNTL,
1434                 .bit_idx = 1,
1435         },
1436         .hw.init = &(struct clk_init_data) {
1437                 .name = "vclk_div2_en",
1438                 .ops = &clk_regmap_gate_ops,
1439                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
1440                 .num_parents = 1,
1441                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1442         },
1443 };
1444
1445 static struct clk_regmap axg_vclk_div4_en = {
1446         .data = &(struct clk_regmap_gate_data){
1447                 .offset = HHI_VID_CLK_CNTL,
1448                 .bit_idx = 2,
1449         },
1450         .hw.init = &(struct clk_init_data) {
1451                 .name = "vclk_div4_en",
1452                 .ops = &clk_regmap_gate_ops,
1453                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
1454                 .num_parents = 1,
1455                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1456         },
1457 };
1458
1459 static struct clk_regmap axg_vclk_div6_en = {
1460         .data = &(struct clk_regmap_gate_data){
1461                 .offset = HHI_VID_CLK_CNTL,
1462                 .bit_idx = 3,
1463         },
1464         .hw.init = &(struct clk_init_data) {
1465                 .name = "vclk_div6_en",
1466                 .ops = &clk_regmap_gate_ops,
1467                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
1468                 .num_parents = 1,
1469                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1470         },
1471 };
1472
1473 static struct clk_regmap axg_vclk_div12_en = {
1474         .data = &(struct clk_regmap_gate_data){
1475                 .offset = HHI_VID_CLK_CNTL,
1476                 .bit_idx = 4,
1477         },
1478         .hw.init = &(struct clk_init_data) {
1479                 .name = "vclk_div12_en",
1480                 .ops = &clk_regmap_gate_ops,
1481                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
1482                 .num_parents = 1,
1483                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1484         },
1485 };
1486
1487 static struct clk_regmap axg_vclk2_div1 = {
1488         .data = &(struct clk_regmap_gate_data){
1489                 .offset = HHI_VIID_CLK_CNTL,
1490                 .bit_idx = 0,
1491         },
1492         .hw.init = &(struct clk_init_data) {
1493                 .name = "vclk2_div1",
1494                 .ops = &clk_regmap_gate_ops,
1495                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
1496                 .num_parents = 1,
1497                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1498         },
1499 };
1500
1501 static struct clk_regmap axg_vclk2_div2_en = {
1502         .data = &(struct clk_regmap_gate_data){
1503                 .offset = HHI_VIID_CLK_CNTL,
1504                 .bit_idx = 1,
1505         },
1506         .hw.init = &(struct clk_init_data) {
1507                 .name = "vclk2_div2_en",
1508                 .ops = &clk_regmap_gate_ops,
1509                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
1510                 .num_parents = 1,
1511                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1512         },
1513 };
1514
1515 static struct clk_regmap axg_vclk2_div4_en = {
1516         .data = &(struct clk_regmap_gate_data){
1517                 .offset = HHI_VIID_CLK_CNTL,
1518                 .bit_idx = 2,
1519         },
1520         .hw.init = &(struct clk_init_data) {
1521                 .name = "vclk2_div4_en",
1522                 .ops = &clk_regmap_gate_ops,
1523                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
1524                 .num_parents = 1,
1525                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1526         },
1527 };
1528
1529 static struct clk_regmap axg_vclk2_div6_en = {
1530         .data = &(struct clk_regmap_gate_data){
1531                 .offset = HHI_VIID_CLK_CNTL,
1532                 .bit_idx = 3,
1533         },
1534         .hw.init = &(struct clk_init_data) {
1535                 .name = "vclk2_div6_en",
1536                 .ops = &clk_regmap_gate_ops,
1537                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
1538                 .num_parents = 1,
1539                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1540         },
1541 };
1542
1543 static struct clk_regmap axg_vclk2_div12_en = {
1544         .data = &(struct clk_regmap_gate_data){
1545                 .offset = HHI_VIID_CLK_CNTL,
1546                 .bit_idx = 4,
1547         },
1548         .hw.init = &(struct clk_init_data) {
1549                 .name = "vclk2_div12_en",
1550                 .ops = &clk_regmap_gate_ops,
1551                 .parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
1552                 .num_parents = 1,
1553                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1554         },
1555 };
1556
1557 static struct clk_fixed_factor axg_vclk_div2 = {
1558         .mult = 1,
1559         .div = 2,
1560         .hw.init = &(struct clk_init_data){
1561                 .name = "vclk_div2",
1562                 .ops = &clk_fixed_factor_ops,
1563                 .parent_hws = (const struct clk_hw *[]) {
1564                         &axg_vclk_div2_en.hw
1565                 },
1566                 .num_parents = 1,
1567         },
1568 };
1569
1570 static struct clk_fixed_factor axg_vclk_div4 = {
1571         .mult = 1,
1572         .div = 4,
1573         .hw.init = &(struct clk_init_data){
1574                 .name = "vclk_div4",
1575                 .ops = &clk_fixed_factor_ops,
1576                 .parent_hws = (const struct clk_hw *[]) {
1577                         &axg_vclk_div4_en.hw
1578                 },
1579                 .num_parents = 1,
1580         },
1581 };
1582
1583 static struct clk_fixed_factor axg_vclk_div6 = {
1584         .mult = 1,
1585         .div = 6,
1586         .hw.init = &(struct clk_init_data){
1587                 .name = "vclk_div6",
1588                 .ops = &clk_fixed_factor_ops,
1589                 .parent_hws = (const struct clk_hw *[]) {
1590                         &axg_vclk_div6_en.hw
1591                 },
1592                 .num_parents = 1,
1593         },
1594 };
1595
1596 static struct clk_fixed_factor axg_vclk_div12 = {
1597         .mult = 1,
1598         .div = 12,
1599         .hw.init = &(struct clk_init_data){
1600                 .name = "vclk_div12",
1601                 .ops = &clk_fixed_factor_ops,
1602                 .parent_hws = (const struct clk_hw *[]) {
1603                         &axg_vclk_div12_en.hw
1604                 },
1605                 .num_parents = 1,
1606         },
1607 };
1608
1609 static struct clk_fixed_factor axg_vclk2_div2 = {
1610         .mult = 1,
1611         .div = 2,
1612         .hw.init = &(struct clk_init_data){
1613                 .name = "vclk2_div2",
1614                 .ops = &clk_fixed_factor_ops,
1615                 .parent_hws = (const struct clk_hw *[]) {
1616                         &axg_vclk2_div2_en.hw
1617                 },
1618                 .num_parents = 1,
1619         },
1620 };
1621
1622 static struct clk_fixed_factor axg_vclk2_div4 = {
1623         .mult = 1,
1624         .div = 4,
1625         .hw.init = &(struct clk_init_data){
1626                 .name = "vclk2_div4",
1627                 .ops = &clk_fixed_factor_ops,
1628                 .parent_hws = (const struct clk_hw *[]) {
1629                         &axg_vclk2_div4_en.hw
1630                 },
1631                 .num_parents = 1,
1632         },
1633 };
1634
1635 static struct clk_fixed_factor axg_vclk2_div6 = {
1636         .mult = 1,
1637         .div = 6,
1638         .hw.init = &(struct clk_init_data){
1639                 .name = "vclk2_div6",
1640                 .ops = &clk_fixed_factor_ops,
1641                 .parent_hws = (const struct clk_hw *[]) {
1642                         &axg_vclk2_div6_en.hw
1643                 },
1644                 .num_parents = 1,
1645         },
1646 };
1647
1648 static struct clk_fixed_factor axg_vclk2_div12 = {
1649         .mult = 1,
1650         .div = 12,
1651         .hw.init = &(struct clk_init_data){
1652                 .name = "vclk2_div12",
1653                 .ops = &clk_fixed_factor_ops,
1654                 .parent_hws = (const struct clk_hw *[]) {
1655                         &axg_vclk2_div12_en.hw
1656                 },
1657                 .num_parents = 1,
1658         },
1659 };
1660
1661 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
1662 static const struct clk_hw *axg_cts_parent_hws[] = {
1663         &axg_vclk_div1.hw,
1664         &axg_vclk_div2.hw,
1665         &axg_vclk_div4.hw,
1666         &axg_vclk_div6.hw,
1667         &axg_vclk_div12.hw,
1668         &axg_vclk2_div1.hw,
1669         &axg_vclk2_div2.hw,
1670         &axg_vclk2_div4.hw,
1671         &axg_vclk2_div6.hw,
1672         &axg_vclk2_div12.hw,
1673 };
1674
1675 static struct clk_regmap axg_cts_encl_sel = {
1676         .data = &(struct clk_regmap_mux_data){
1677                 .offset = HHI_VIID_CLK_DIV,
1678                 .mask = 0xf,
1679                 .shift = 12,
1680                 .table = mux_table_cts_sel,
1681         },
1682         .hw.init = &(struct clk_init_data){
1683                 .name = "cts_encl_sel",
1684                 .ops = &clk_regmap_mux_ops,
1685                 .parent_hws = axg_cts_parent_hws,
1686                 .num_parents = ARRAY_SIZE(axg_cts_parent_hws),
1687                 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1688         },
1689 };
1690
1691 static struct clk_regmap axg_cts_encl = {
1692         .data = &(struct clk_regmap_gate_data){
1693                 .offset = HHI_VID_CLK_CNTL2,
1694                 .bit_idx = 3,
1695         },
1696         .hw.init = &(struct clk_init_data) {
1697                 .name = "cts_encl",
1698                 .ops = &clk_regmap_gate_ops,
1699                 .parent_hws = (const struct clk_hw *[]) {
1700                         &axg_cts_encl_sel.hw
1701                 },
1702                 .num_parents = 1,
1703                 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1704         },
1705 };
1706
1707 /* MIPI DSI Host Clock */
1708
1709 static u32 mux_table_axg_vdin_meas[]    = { 0, 1, 2, 3, 6, 7 };
1710 static const struct clk_parent_data axg_vdin_meas_parent_data[] = {
1711         { .fw_name = "xtal", },
1712         { .hw = &axg_fclk_div4.hw },
1713         { .hw = &axg_fclk_div3.hw },
1714         { .hw = &axg_fclk_div5.hw },
1715         { .hw = &axg_fclk_div2.hw },
1716         { .hw = &axg_fclk_div7.hw },
1717 };
1718
1719 static struct clk_regmap axg_vdin_meas_sel = {
1720         .data = &(struct clk_regmap_mux_data){
1721                 .offset = HHI_VDIN_MEAS_CLK_CNTL,
1722                 .mask = 0x7,
1723                 .shift = 21,
1724                 .flags = CLK_MUX_ROUND_CLOSEST,
1725                 .table = mux_table_axg_vdin_meas,
1726         },
1727         .hw.init = &(struct clk_init_data){
1728                 .name = "vdin_meas_sel",
1729                 .ops = &clk_regmap_mux_ops,
1730                 .parent_data = axg_vdin_meas_parent_data,
1731                 .num_parents = ARRAY_SIZE(axg_vdin_meas_parent_data),
1732                 .flags = CLK_SET_RATE_PARENT,
1733         },
1734 };
1735
1736 static struct clk_regmap axg_vdin_meas_div = {
1737         .data = &(struct clk_regmap_div_data){
1738                 .offset = HHI_VDIN_MEAS_CLK_CNTL,
1739                 .shift = 12,
1740                 .width = 7,
1741         },
1742         .hw.init = &(struct clk_init_data){
1743                 .name = "vdin_meas_div",
1744                 .ops = &clk_regmap_divider_ops,
1745                 .parent_hws = (const struct clk_hw *[]) {
1746                         &axg_vdin_meas_sel.hw },
1747                 .num_parents = 1,
1748                 .flags = CLK_SET_RATE_PARENT,
1749         },
1750 };
1751
1752 static struct clk_regmap axg_vdin_meas = {
1753         .data = &(struct clk_regmap_gate_data){
1754                 .offset = HHI_VDIN_MEAS_CLK_CNTL,
1755                 .bit_idx = 20,
1756         },
1757         .hw.init = &(struct clk_init_data) {
1758                 .name = "vdin_meas",
1759                 .ops = &clk_regmap_gate_ops,
1760                 .parent_hws = (const struct clk_hw *[]) {
1761                         &axg_vdin_meas_div.hw },
1762                 .num_parents = 1,
1763                 .flags = CLK_SET_RATE_PARENT,
1764         },
1765 };
1766
1767 static u32 mux_table_gen_clk[]  = { 0, 4, 5, 6, 7, 8,
1768                                     9, 10, 11, 13, 14, };
1769 static const struct clk_parent_data gen_clk_parent_data[] = {
1770         { .fw_name = "xtal", },
1771         { .hw = &axg_hifi_pll.hw },
1772         { .hw = &axg_mpll0.hw },
1773         { .hw = &axg_mpll1.hw },
1774         { .hw = &axg_mpll2.hw },
1775         { .hw = &axg_mpll3.hw },
1776         { .hw = &axg_fclk_div4.hw },
1777         { .hw = &axg_fclk_div3.hw },
1778         { .hw = &axg_fclk_div5.hw },
1779         { .hw = &axg_fclk_div7.hw },
1780         { .hw = &axg_gp0_pll.hw },
1781 };
1782
1783 static struct clk_regmap axg_gen_clk_sel = {
1784         .data = &(struct clk_regmap_mux_data){
1785                 .offset = HHI_GEN_CLK_CNTL,
1786                 .mask = 0xf,
1787                 .shift = 12,
1788                 .table = mux_table_gen_clk,
1789         },
1790         .hw.init = &(struct clk_init_data){
1791                 .name = "gen_clk_sel",
1792                 .ops = &clk_regmap_mux_ops,
1793                 /*
1794                  * bits 15:12 selects from 14 possible parents:
1795                  * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
1796                  * hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4,
1797                  * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
1798                  */
1799                 .parent_data = gen_clk_parent_data,
1800                 .num_parents = ARRAY_SIZE(gen_clk_parent_data),
1801         },
1802 };
1803
1804 static struct clk_regmap axg_gen_clk_div = {
1805         .data = &(struct clk_regmap_div_data){
1806                 .offset = HHI_GEN_CLK_CNTL,
1807                 .shift = 0,
1808                 .width = 11,
1809         },
1810         .hw.init = &(struct clk_init_data){
1811                 .name = "gen_clk_div",
1812                 .ops = &clk_regmap_divider_ops,
1813                 .parent_hws = (const struct clk_hw *[]) {
1814                         &axg_gen_clk_sel.hw
1815                 },
1816                 .num_parents = 1,
1817                 .flags = CLK_SET_RATE_PARENT,
1818         },
1819 };
1820
1821 static struct clk_regmap axg_gen_clk = {
1822         .data = &(struct clk_regmap_gate_data){
1823                 .offset = HHI_GEN_CLK_CNTL,
1824                 .bit_idx = 7,
1825         },
1826         .hw.init = &(struct clk_init_data){
1827                 .name = "gen_clk",
1828                 .ops = &clk_regmap_gate_ops,
1829                 .parent_hws = (const struct clk_hw *[]) {
1830                         &axg_gen_clk_div.hw
1831                 },
1832                 .num_parents = 1,
1833                 .flags = CLK_SET_RATE_PARENT,
1834         },
1835 };
1836
1837 #define MESON_GATE(_name, _reg, _bit) \
1838         MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw)
1839
1840 /* Everything Else (EE) domain gates */
1841 static MESON_GATE(axg_ddr, HHI_GCLK_MPEG0, 0);
1842 static MESON_GATE(axg_audio_locker, HHI_GCLK_MPEG0, 2);
1843 static MESON_GATE(axg_mipi_dsi_host, HHI_GCLK_MPEG0, 3);
1844 static MESON_GATE(axg_isa, HHI_GCLK_MPEG0, 5);
1845 static MESON_GATE(axg_pl301, HHI_GCLK_MPEG0, 6);
1846 static MESON_GATE(axg_periphs, HHI_GCLK_MPEG0, 7);
1847 static MESON_GATE(axg_spicc_0, HHI_GCLK_MPEG0, 8);
1848 static MESON_GATE(axg_i2c, HHI_GCLK_MPEG0, 9);
1849 static MESON_GATE(axg_rng0, HHI_GCLK_MPEG0, 12);
1850 static MESON_GATE(axg_uart0, HHI_GCLK_MPEG0, 13);
1851 static MESON_GATE(axg_mipi_dsi_phy, HHI_GCLK_MPEG0, 14);
1852 static MESON_GATE(axg_spicc_1, HHI_GCLK_MPEG0, 15);
1853 static MESON_GATE(axg_pcie_a, HHI_GCLK_MPEG0, 16);
1854 static MESON_GATE(axg_pcie_b, HHI_GCLK_MPEG0, 17);
1855 static MESON_GATE(axg_hiu_reg, HHI_GCLK_MPEG0, 19);
1856 static MESON_GATE(axg_assist_misc, HHI_GCLK_MPEG0, 23);
1857 static MESON_GATE(axg_emmc_b, HHI_GCLK_MPEG0, 25);
1858 static MESON_GATE(axg_emmc_c, HHI_GCLK_MPEG0, 26);
1859 static MESON_GATE(axg_dma, HHI_GCLK_MPEG0, 27);
1860 static MESON_GATE(axg_spi, HHI_GCLK_MPEG0, 30);
1861
1862 static MESON_GATE(axg_audio, HHI_GCLK_MPEG1, 0);
1863 static MESON_GATE(axg_eth_core, HHI_GCLK_MPEG1, 3);
1864 static MESON_GATE(axg_uart1, HHI_GCLK_MPEG1, 16);
1865 static MESON_GATE(axg_g2d, HHI_GCLK_MPEG1, 20);
1866 static MESON_GATE(axg_usb0, HHI_GCLK_MPEG1, 21);
1867 static MESON_GATE(axg_usb1, HHI_GCLK_MPEG1, 22);
1868 static MESON_GATE(axg_reset, HHI_GCLK_MPEG1, 23);
1869 static MESON_GATE(axg_usb_general, HHI_GCLK_MPEG1, 26);
1870 static MESON_GATE(axg_ahb_arb0, HHI_GCLK_MPEG1, 29);
1871 static MESON_GATE(axg_efuse, HHI_GCLK_MPEG1, 30);
1872 static MESON_GATE(axg_boot_rom, HHI_GCLK_MPEG1, 31);
1873
1874 static MESON_GATE(axg_ahb_data_bus, HHI_GCLK_MPEG2, 1);
1875 static MESON_GATE(axg_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
1876 static MESON_GATE(axg_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
1877 static MESON_GATE(axg_usb0_to_ddr, HHI_GCLK_MPEG2, 9);
1878 static MESON_GATE(axg_mmc_pclk, HHI_GCLK_MPEG2, 11);
1879 static MESON_GATE(axg_vpu_intr, HHI_GCLK_MPEG2, 25);
1880 static MESON_GATE(axg_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
1881 static MESON_GATE(axg_gic, HHI_GCLK_MPEG2, 30);
1882
1883 /* Always On (AO) domain gates */
1884
1885 static MESON_GATE(axg_ao_media_cpu, HHI_GCLK_AO, 0);
1886 static MESON_GATE(axg_ao_ahb_sram, HHI_GCLK_AO, 1);
1887 static MESON_GATE(axg_ao_ahb_bus, HHI_GCLK_AO, 2);
1888 static MESON_GATE(axg_ao_iface, HHI_GCLK_AO, 3);
1889 static MESON_GATE(axg_ao_i2c, HHI_GCLK_AO, 4);
1890
1891 /* Array of all clocks provided by this provider */
1892
1893 static struct clk_hw_onecell_data axg_hw_onecell_data = {
1894         .hws = {
1895                 [CLKID_SYS_PLL]                 = &axg_sys_pll.hw,
1896                 [CLKID_FIXED_PLL]               = &axg_fixed_pll.hw,
1897                 [CLKID_FCLK_DIV2]               = &axg_fclk_div2.hw,
1898                 [CLKID_FCLK_DIV3]               = &axg_fclk_div3.hw,
1899                 [CLKID_FCLK_DIV4]               = &axg_fclk_div4.hw,
1900                 [CLKID_FCLK_DIV5]               = &axg_fclk_div5.hw,
1901                 [CLKID_FCLK_DIV7]               = &axg_fclk_div7.hw,
1902                 [CLKID_GP0_PLL]                 = &axg_gp0_pll.hw,
1903                 [CLKID_MPEG_SEL]                = &axg_mpeg_clk_sel.hw,
1904                 [CLKID_MPEG_DIV]                = &axg_mpeg_clk_div.hw,
1905                 [CLKID_CLK81]                   = &axg_clk81.hw,
1906                 [CLKID_MPLL0]                   = &axg_mpll0.hw,
1907                 [CLKID_MPLL1]                   = &axg_mpll1.hw,
1908                 [CLKID_MPLL2]                   = &axg_mpll2.hw,
1909                 [CLKID_MPLL3]                   = &axg_mpll3.hw,
1910                 [CLKID_DDR]                     = &axg_ddr.hw,
1911                 [CLKID_AUDIO_LOCKER]            = &axg_audio_locker.hw,
1912                 [CLKID_MIPI_DSI_HOST]           = &axg_mipi_dsi_host.hw,
1913                 [CLKID_ISA]                     = &axg_isa.hw,
1914                 [CLKID_PL301]                   = &axg_pl301.hw,
1915                 [CLKID_PERIPHS]                 = &axg_periphs.hw,
1916                 [CLKID_SPICC0]                  = &axg_spicc_0.hw,
1917                 [CLKID_I2C]                     = &axg_i2c.hw,
1918                 [CLKID_RNG0]                    = &axg_rng0.hw,
1919                 [CLKID_UART0]                   = &axg_uart0.hw,
1920                 [CLKID_MIPI_DSI_PHY]            = &axg_mipi_dsi_phy.hw,
1921                 [CLKID_SPICC1]                  = &axg_spicc_1.hw,
1922                 [CLKID_PCIE_A]                  = &axg_pcie_a.hw,
1923                 [CLKID_PCIE_B]                  = &axg_pcie_b.hw,
1924                 [CLKID_HIU_IFACE]               = &axg_hiu_reg.hw,
1925                 [CLKID_ASSIST_MISC]             = &axg_assist_misc.hw,
1926                 [CLKID_SD_EMMC_B]               = &axg_emmc_b.hw,
1927                 [CLKID_SD_EMMC_C]               = &axg_emmc_c.hw,
1928                 [CLKID_DMA]                     = &axg_dma.hw,
1929                 [CLKID_SPI]                     = &axg_spi.hw,
1930                 [CLKID_AUDIO]                   = &axg_audio.hw,
1931                 [CLKID_ETH]                     = &axg_eth_core.hw,
1932                 [CLKID_UART1]                   = &axg_uart1.hw,
1933                 [CLKID_G2D]                     = &axg_g2d.hw,
1934                 [CLKID_USB0]                    = &axg_usb0.hw,
1935                 [CLKID_USB1]                    = &axg_usb1.hw,
1936                 [CLKID_RESET]                   = &axg_reset.hw,
1937                 [CLKID_USB]                     = &axg_usb_general.hw,
1938                 [CLKID_AHB_ARB0]                = &axg_ahb_arb0.hw,
1939                 [CLKID_EFUSE]                   = &axg_efuse.hw,
1940                 [CLKID_BOOT_ROM]                = &axg_boot_rom.hw,
1941                 [CLKID_AHB_DATA_BUS]            = &axg_ahb_data_bus.hw,
1942                 [CLKID_AHB_CTRL_BUS]            = &axg_ahb_ctrl_bus.hw,
1943                 [CLKID_USB1_DDR_BRIDGE]         = &axg_usb1_to_ddr.hw,
1944                 [CLKID_USB0_DDR_BRIDGE]         = &axg_usb0_to_ddr.hw,
1945                 [CLKID_MMC_PCLK]                = &axg_mmc_pclk.hw,
1946                 [CLKID_VPU_INTR]                = &axg_vpu_intr.hw,
1947                 [CLKID_SEC_AHB_AHB3_BRIDGE]     = &axg_sec_ahb_ahb3_bridge.hw,
1948                 [CLKID_GIC]                     = &axg_gic.hw,
1949                 [CLKID_AO_MEDIA_CPU]            = &axg_ao_media_cpu.hw,
1950                 [CLKID_AO_AHB_SRAM]             = &axg_ao_ahb_sram.hw,
1951                 [CLKID_AO_AHB_BUS]              = &axg_ao_ahb_bus.hw,
1952                 [CLKID_AO_IFACE]                = &axg_ao_iface.hw,
1953                 [CLKID_AO_I2C]                  = &axg_ao_i2c.hw,
1954                 [CLKID_SD_EMMC_B_CLK0_SEL]      = &axg_sd_emmc_b_clk0_sel.hw,
1955                 [CLKID_SD_EMMC_B_CLK0_DIV]      = &axg_sd_emmc_b_clk0_div.hw,
1956                 [CLKID_SD_EMMC_B_CLK0]          = &axg_sd_emmc_b_clk0.hw,
1957                 [CLKID_SD_EMMC_C_CLK0_SEL]      = &axg_sd_emmc_c_clk0_sel.hw,
1958                 [CLKID_SD_EMMC_C_CLK0_DIV]      = &axg_sd_emmc_c_clk0_div.hw,
1959                 [CLKID_SD_EMMC_C_CLK0]          = &axg_sd_emmc_c_clk0.hw,
1960                 [CLKID_MPLL0_DIV]               = &axg_mpll0_div.hw,
1961                 [CLKID_MPLL1_DIV]               = &axg_mpll1_div.hw,
1962                 [CLKID_MPLL2_DIV]               = &axg_mpll2_div.hw,
1963                 [CLKID_MPLL3_DIV]               = &axg_mpll3_div.hw,
1964                 [CLKID_HIFI_PLL]                = &axg_hifi_pll.hw,
1965                 [CLKID_MPLL_PREDIV]             = &axg_mpll_prediv.hw,
1966                 [CLKID_FCLK_DIV2_DIV]           = &axg_fclk_div2_div.hw,
1967                 [CLKID_FCLK_DIV3_DIV]           = &axg_fclk_div3_div.hw,
1968                 [CLKID_FCLK_DIV4_DIV]           = &axg_fclk_div4_div.hw,
1969                 [CLKID_FCLK_DIV5_DIV]           = &axg_fclk_div5_div.hw,
1970                 [CLKID_FCLK_DIV7_DIV]           = &axg_fclk_div7_div.hw,
1971                 [CLKID_PCIE_PLL]                = &axg_pcie_pll.hw,
1972                 [CLKID_PCIE_MUX]                = &axg_pcie_mux.hw,
1973                 [CLKID_PCIE_REF]                = &axg_pcie_ref.hw,
1974                 [CLKID_PCIE_CML_EN0]            = &axg_pcie_cml_en0.hw,
1975                 [CLKID_PCIE_CML_EN1]            = &axg_pcie_cml_en1.hw,
1976                 [CLKID_GEN_CLK_SEL]             = &axg_gen_clk_sel.hw,
1977                 [CLKID_GEN_CLK_DIV]             = &axg_gen_clk_div.hw,
1978                 [CLKID_GEN_CLK]                 = &axg_gen_clk.hw,
1979                 [CLKID_SYS_PLL_DCO]             = &axg_sys_pll_dco.hw,
1980                 [CLKID_FIXED_PLL_DCO]           = &axg_fixed_pll_dco.hw,
1981                 [CLKID_GP0_PLL_DCO]             = &axg_gp0_pll_dco.hw,
1982                 [CLKID_HIFI_PLL_DCO]            = &axg_hifi_pll_dco.hw,
1983                 [CLKID_PCIE_PLL_DCO]            = &axg_pcie_pll_dco.hw,
1984                 [CLKID_PCIE_PLL_OD]             = &axg_pcie_pll_od.hw,
1985                 [CLKID_VPU_0_DIV]               = &axg_vpu_0_div.hw,
1986                 [CLKID_VPU_0_SEL]               = &axg_vpu_0_sel.hw,
1987                 [CLKID_VPU_0]                   = &axg_vpu_0.hw,
1988                 [CLKID_VPU_1_DIV]               = &axg_vpu_1_div.hw,
1989                 [CLKID_VPU_1_SEL]               = &axg_vpu_1_sel.hw,
1990                 [CLKID_VPU_1]                   = &axg_vpu_1.hw,
1991                 [CLKID_VPU]                     = &axg_vpu.hw,
1992                 [CLKID_VAPB_0_DIV]              = &axg_vapb_0_div.hw,
1993                 [CLKID_VAPB_0_SEL]              = &axg_vapb_0_sel.hw,
1994                 [CLKID_VAPB_0]                  = &axg_vapb_0.hw,
1995                 [CLKID_VAPB_1_DIV]              = &axg_vapb_1_div.hw,
1996                 [CLKID_VAPB_1_SEL]              = &axg_vapb_1_sel.hw,
1997                 [CLKID_VAPB_1]                  = &axg_vapb_1.hw,
1998                 [CLKID_VAPB_SEL]                = &axg_vapb_sel.hw,
1999                 [CLKID_VAPB]                    = &axg_vapb.hw,
2000                 [CLKID_VCLK]                    = &axg_vclk.hw,
2001                 [CLKID_VCLK2]                   = &axg_vclk2.hw,
2002                 [CLKID_VCLK_SEL]                = &axg_vclk_sel.hw,
2003                 [CLKID_VCLK2_SEL]               = &axg_vclk2_sel.hw,
2004                 [CLKID_VCLK_INPUT]              = &axg_vclk_input.hw,
2005                 [CLKID_VCLK2_INPUT]             = &axg_vclk2_input.hw,
2006                 [CLKID_VCLK_DIV]                = &axg_vclk_div.hw,
2007                 [CLKID_VCLK2_DIV]               = &axg_vclk2_div.hw,
2008                 [CLKID_VCLK_DIV2_EN]            = &axg_vclk_div2_en.hw,
2009                 [CLKID_VCLK_DIV4_EN]            = &axg_vclk_div4_en.hw,
2010                 [CLKID_VCLK_DIV6_EN]            = &axg_vclk_div6_en.hw,
2011                 [CLKID_VCLK_DIV12_EN]           = &axg_vclk_div12_en.hw,
2012                 [CLKID_VCLK2_DIV2_EN]           = &axg_vclk2_div2_en.hw,
2013                 [CLKID_VCLK2_DIV4_EN]           = &axg_vclk2_div4_en.hw,
2014                 [CLKID_VCLK2_DIV6_EN]           = &axg_vclk2_div6_en.hw,
2015                 [CLKID_VCLK2_DIV12_EN]          = &axg_vclk2_div12_en.hw,
2016                 [CLKID_VCLK_DIV1]               = &axg_vclk_div1.hw,
2017                 [CLKID_VCLK_DIV2]               = &axg_vclk_div2.hw,
2018                 [CLKID_VCLK_DIV4]               = &axg_vclk_div4.hw,
2019                 [CLKID_VCLK_DIV6]               = &axg_vclk_div6.hw,
2020                 [CLKID_VCLK_DIV12]              = &axg_vclk_div12.hw,
2021                 [CLKID_VCLK2_DIV1]              = &axg_vclk2_div1.hw,
2022                 [CLKID_VCLK2_DIV2]              = &axg_vclk2_div2.hw,
2023                 [CLKID_VCLK2_DIV4]              = &axg_vclk2_div4.hw,
2024                 [CLKID_VCLK2_DIV6]              = &axg_vclk2_div6.hw,
2025                 [CLKID_VCLK2_DIV12]             = &axg_vclk2_div12.hw,
2026                 [CLKID_CTS_ENCL_SEL]            = &axg_cts_encl_sel.hw,
2027                 [CLKID_CTS_ENCL]                = &axg_cts_encl.hw,
2028                 [CLKID_VDIN_MEAS_SEL]           = &axg_vdin_meas_sel.hw,
2029                 [CLKID_VDIN_MEAS_DIV]           = &axg_vdin_meas_div.hw,
2030                 [CLKID_VDIN_MEAS]               = &axg_vdin_meas.hw,
2031                 [NR_CLKS]                       = NULL,
2032         },
2033         .num = NR_CLKS,
2034 };
2035
2036 /* Convenience table to populate regmap in .probe */
2037 static struct clk_regmap *const axg_clk_regmaps[] = {
2038         &axg_clk81,
2039         &axg_ddr,
2040         &axg_audio_locker,
2041         &axg_mipi_dsi_host,
2042         &axg_isa,
2043         &axg_pl301,
2044         &axg_periphs,
2045         &axg_spicc_0,
2046         &axg_i2c,
2047         &axg_rng0,
2048         &axg_uart0,
2049         &axg_mipi_dsi_phy,
2050         &axg_spicc_1,
2051         &axg_pcie_a,
2052         &axg_pcie_b,
2053         &axg_hiu_reg,
2054         &axg_assist_misc,
2055         &axg_emmc_b,
2056         &axg_emmc_c,
2057         &axg_dma,
2058         &axg_spi,
2059         &axg_audio,
2060         &axg_eth_core,
2061         &axg_uart1,
2062         &axg_g2d,
2063         &axg_usb0,
2064         &axg_usb1,
2065         &axg_reset,
2066         &axg_usb_general,
2067         &axg_ahb_arb0,
2068         &axg_efuse,
2069         &axg_boot_rom,
2070         &axg_ahb_data_bus,
2071         &axg_ahb_ctrl_bus,
2072         &axg_usb1_to_ddr,
2073         &axg_usb0_to_ddr,
2074         &axg_mmc_pclk,
2075         &axg_vpu_intr,
2076         &axg_sec_ahb_ahb3_bridge,
2077         &axg_gic,
2078         &axg_ao_media_cpu,
2079         &axg_ao_ahb_sram,
2080         &axg_ao_ahb_bus,
2081         &axg_ao_iface,
2082         &axg_ao_i2c,
2083         &axg_sd_emmc_b_clk0,
2084         &axg_sd_emmc_c_clk0,
2085         &axg_mpeg_clk_div,
2086         &axg_sd_emmc_b_clk0_div,
2087         &axg_sd_emmc_c_clk0_div,
2088         &axg_mpeg_clk_sel,
2089         &axg_sd_emmc_b_clk0_sel,
2090         &axg_sd_emmc_c_clk0_sel,
2091         &axg_mpll0,
2092         &axg_mpll1,
2093         &axg_mpll2,
2094         &axg_mpll3,
2095         &axg_mpll0_div,
2096         &axg_mpll1_div,
2097         &axg_mpll2_div,
2098         &axg_mpll3_div,
2099         &axg_fixed_pll,
2100         &axg_sys_pll,
2101         &axg_gp0_pll,
2102         &axg_hifi_pll,
2103         &axg_mpll_prediv,
2104         &axg_fclk_div2,
2105         &axg_fclk_div3,
2106         &axg_fclk_div4,
2107         &axg_fclk_div5,
2108         &axg_fclk_div7,
2109         &axg_pcie_pll_dco,
2110         &axg_pcie_pll_od,
2111         &axg_pcie_pll,
2112         &axg_pcie_mux,
2113         &axg_pcie_ref,
2114         &axg_pcie_cml_en0,
2115         &axg_pcie_cml_en1,
2116         &axg_gen_clk_sel,
2117         &axg_gen_clk_div,
2118         &axg_gen_clk,
2119         &axg_fixed_pll_dco,
2120         &axg_sys_pll_dco,
2121         &axg_gp0_pll_dco,
2122         &axg_hifi_pll_dco,
2123         &axg_pcie_pll_dco,
2124         &axg_pcie_pll_od,
2125         &axg_vpu_0_div,
2126         &axg_vpu_0_sel,
2127         &axg_vpu_0,
2128         &axg_vpu_1_div,
2129         &axg_vpu_1_sel,
2130         &axg_vpu_1,
2131         &axg_vpu,
2132         &axg_vapb_0_div,
2133         &axg_vapb_0_sel,
2134         &axg_vapb_0,
2135         &axg_vapb_1_div,
2136         &axg_vapb_1_sel,
2137         &axg_vapb_1,
2138         &axg_vapb_sel,
2139         &axg_vapb,
2140         &axg_vclk,
2141         &axg_vclk2,
2142         &axg_vclk_sel,
2143         &axg_vclk2_sel,
2144         &axg_vclk_input,
2145         &axg_vclk2_input,
2146         &axg_vclk_div,
2147         &axg_vclk2_div,
2148         &axg_vclk_div2_en,
2149         &axg_vclk_div4_en,
2150         &axg_vclk_div6_en,
2151         &axg_vclk_div12_en,
2152         &axg_vclk2_div2_en,
2153         &axg_vclk2_div4_en,
2154         &axg_vclk2_div6_en,
2155         &axg_vclk2_div12_en,
2156         &axg_cts_encl_sel,
2157         &axg_cts_encl,
2158         &axg_vdin_meas_sel,
2159         &axg_vdin_meas_div,
2160         &axg_vdin_meas,
2161 };
2162
2163 static const struct meson_eeclkc_data axg_clkc_data = {
2164         .regmap_clks = axg_clk_regmaps,
2165         .regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps),
2166         .hw_onecell_data = &axg_hw_onecell_data,
2167 };
2168
2169
2170 static const struct of_device_id clkc_match_table[] = {
2171         { .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data },
2172         {}
2173 };
2174 MODULE_DEVICE_TABLE(of, clkc_match_table);
2175
2176 static struct platform_driver axg_driver = {
2177         .probe          = meson_eeclkc_probe,
2178         .driver         = {
2179                 .name   = "axg-clkc",
2180                 .of_match_table = clkc_match_table,
2181         },
2182 };
2183
2184 module_platform_driver(axg_driver);
2185 MODULE_LICENSE("GPL v2");