xref: /kernel/linux/linux-5.10/drivers/clk/meson/axg.c (revision 8c2ecf20)
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
17#include "clk-regmap.h"
18#include "clk-pll.h"
19#include "clk-mpll.h"
20#include "axg.h"
21#include "meson-eeclk.h"
22
23static DEFINE_SPINLOCK(meson_clk_lock);
24
25static struct clk_regmap axg_fixed_pll_dco = {
26	.data = &(struct meson_clk_pll_data){
27		.en = {
28			.reg_off = HHI_MPLL_CNTL,
29			.shift   = 30,
30			.width   = 1,
31		},
32		.m = {
33			.reg_off = HHI_MPLL_CNTL,
34			.shift   = 0,
35			.width   = 9,
36		},
37		.n = {
38			.reg_off = HHI_MPLL_CNTL,
39			.shift   = 9,
40			.width   = 5,
41		},
42		.frac = {
43			.reg_off = HHI_MPLL_CNTL2,
44			.shift   = 0,
45			.width   = 12,
46		},
47		.l = {
48			.reg_off = HHI_MPLL_CNTL,
49			.shift   = 31,
50			.width   = 1,
51		},
52		.rst = {
53			.reg_off = HHI_MPLL_CNTL,
54			.shift   = 29,
55			.width   = 1,
56		},
57	},
58	.hw.init = &(struct clk_init_data){
59		.name = "fixed_pll_dco",
60		.ops = &meson_clk_pll_ro_ops,
61		.parent_data = &(const struct clk_parent_data) {
62			.fw_name = "xtal",
63		},
64		.num_parents = 1,
65	},
66};
67
68static struct clk_regmap axg_fixed_pll = {
69	.data = &(struct clk_regmap_div_data){
70		.offset = HHI_MPLL_CNTL,
71		.shift = 16,
72		.width = 2,
73		.flags = CLK_DIVIDER_POWER_OF_TWO,
74	},
75	.hw.init = &(struct clk_init_data){
76		.name = "fixed_pll",
77		.ops = &clk_regmap_divider_ro_ops,
78		.parent_hws = (const struct clk_hw *[]) {
79			&axg_fixed_pll_dco.hw
80		},
81		.num_parents = 1,
82		/*
83		 * This clock won't ever change at runtime so
84		 * CLK_SET_RATE_PARENT is not required
85		 */
86	},
87};
88
89static struct clk_regmap axg_sys_pll_dco = {
90	.data = &(struct meson_clk_pll_data){
91		.en = {
92			.reg_off = HHI_SYS_PLL_CNTL,
93			.shift   = 30,
94			.width   = 1,
95		},
96		.m = {
97			.reg_off = HHI_SYS_PLL_CNTL,
98			.shift   = 0,
99			.width   = 9,
100		},
101		.n = {
102			.reg_off = HHI_SYS_PLL_CNTL,
103			.shift   = 9,
104			.width   = 5,
105		},
106		.l = {
107			.reg_off = HHI_SYS_PLL_CNTL,
108			.shift   = 31,
109			.width   = 1,
110		},
111		.rst = {
112			.reg_off = HHI_SYS_PLL_CNTL,
113			.shift   = 29,
114			.width   = 1,
115		},
116	},
117	.hw.init = &(struct clk_init_data){
118		.name = "sys_pll_dco",
119		.ops = &meson_clk_pll_ro_ops,
120		.parent_data = &(const struct clk_parent_data) {
121			.fw_name = "xtal",
122		},
123		.num_parents = 1,
124	},
125};
126
127static struct clk_regmap axg_sys_pll = {
128	.data = &(struct clk_regmap_div_data){
129		.offset = HHI_SYS_PLL_CNTL,
130		.shift = 16,
131		.width = 2,
132		.flags = CLK_DIVIDER_POWER_OF_TWO,
133	},
134	.hw.init = &(struct clk_init_data){
135		.name = "sys_pll",
136		.ops = &clk_regmap_divider_ro_ops,
137		.parent_hws = (const struct clk_hw *[]) {
138			&axg_sys_pll_dco.hw
139		},
140		.num_parents = 1,
141		.flags = CLK_SET_RATE_PARENT,
142	},
143};
144
145static const struct pll_params_table axg_gp0_pll_params_table[] = {
146	PLL_PARAMS(40, 1),
147	PLL_PARAMS(41, 1),
148	PLL_PARAMS(42, 1),
149	PLL_PARAMS(43, 1),
150	PLL_PARAMS(44, 1),
151	PLL_PARAMS(45, 1),
152	PLL_PARAMS(46, 1),
153	PLL_PARAMS(47, 1),
154	PLL_PARAMS(48, 1),
155	PLL_PARAMS(49, 1),
156	PLL_PARAMS(50, 1),
157	PLL_PARAMS(51, 1),
158	PLL_PARAMS(52, 1),
159	PLL_PARAMS(53, 1),
160	PLL_PARAMS(54, 1),
161	PLL_PARAMS(55, 1),
162	PLL_PARAMS(56, 1),
163	PLL_PARAMS(57, 1),
164	PLL_PARAMS(58, 1),
165	PLL_PARAMS(59, 1),
166	PLL_PARAMS(60, 1),
167	PLL_PARAMS(61, 1),
168	PLL_PARAMS(62, 1),
169	PLL_PARAMS(63, 1),
170	PLL_PARAMS(64, 1),
171	PLL_PARAMS(65, 1),
172	PLL_PARAMS(66, 1),
173	PLL_PARAMS(67, 1),
174	PLL_PARAMS(68, 1),
175	{ /* sentinel */ },
176};
177
178static const struct reg_sequence axg_gp0_init_regs[] = {
179	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0xc084b000 },
180	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0xb75020be },
181	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x0a59a288 },
182	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0xc000004d },
183	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x00078000 },
184};
185
186static struct clk_regmap axg_gp0_pll_dco = {
187	.data = &(struct meson_clk_pll_data){
188		.en = {
189			.reg_off = HHI_GP0_PLL_CNTL,
190			.shift   = 30,
191			.width   = 1,
192		},
193		.m = {
194			.reg_off = HHI_GP0_PLL_CNTL,
195			.shift   = 0,
196			.width   = 9,
197		},
198		.n = {
199			.reg_off = HHI_GP0_PLL_CNTL,
200			.shift   = 9,
201			.width   = 5,
202		},
203		.frac = {
204			.reg_off = HHI_GP0_PLL_CNTL1,
205			.shift   = 0,
206			.width   = 10,
207		},
208		.l = {
209			.reg_off = HHI_GP0_PLL_CNTL,
210			.shift   = 31,
211			.width   = 1,
212		},
213		.rst = {
214			.reg_off = HHI_GP0_PLL_CNTL,
215			.shift   = 29,
216			.width   = 1,
217		},
218		.table = axg_gp0_pll_params_table,
219		.init_regs = axg_gp0_init_regs,
220		.init_count = ARRAY_SIZE(axg_gp0_init_regs),
221	},
222	.hw.init = &(struct clk_init_data){
223		.name = "gp0_pll_dco",
224		.ops = &meson_clk_pll_ops,
225		.parent_data = &(const struct clk_parent_data) {
226			.fw_name = "xtal",
227		},
228		.num_parents = 1,
229	},
230};
231
232static struct clk_regmap axg_gp0_pll = {
233	.data = &(struct clk_regmap_div_data){
234		.offset = HHI_GP0_PLL_CNTL,
235		.shift = 16,
236		.width = 2,
237		.flags = CLK_DIVIDER_POWER_OF_TWO,
238	},
239	.hw.init = &(struct clk_init_data){
240		.name = "gp0_pll",
241		.ops = &clk_regmap_divider_ops,
242		.parent_hws = (const struct clk_hw *[]) {
243			&axg_gp0_pll_dco.hw
244		},
245		.num_parents = 1,
246		.flags = CLK_SET_RATE_PARENT,
247	},
248};
249
250static const struct reg_sequence axg_hifi_init_regs[] = {
251	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0xc084b000 },
252	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0xb75020be },
253	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x0a6a3a88 },
254	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0xc000004d },
255	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x00058000 },
256};
257
258static struct clk_regmap axg_hifi_pll_dco = {
259	.data = &(struct meson_clk_pll_data){
260		.en = {
261			.reg_off = HHI_HIFI_PLL_CNTL,
262			.shift   = 30,
263			.width   = 1,
264		},
265		.m = {
266			.reg_off = HHI_HIFI_PLL_CNTL,
267			.shift   = 0,
268			.width   = 9,
269		},
270		.n = {
271			.reg_off = HHI_HIFI_PLL_CNTL,
272			.shift   = 9,
273			.width   = 5,
274		},
275		.frac = {
276			.reg_off = HHI_HIFI_PLL_CNTL5,
277			.shift   = 0,
278			.width   = 13,
279		},
280		.l = {
281			.reg_off = HHI_HIFI_PLL_CNTL,
282			.shift   = 31,
283			.width   = 1,
284		},
285		.rst = {
286			.reg_off = HHI_HIFI_PLL_CNTL,
287			.shift   = 29,
288			.width   = 1,
289		},
290		.table = axg_gp0_pll_params_table,
291		.init_regs = axg_hifi_init_regs,
292		.init_count = ARRAY_SIZE(axg_hifi_init_regs),
293		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
294	},
295	.hw.init = &(struct clk_init_data){
296		.name = "hifi_pll_dco",
297		.ops = &meson_clk_pll_ops,
298		.parent_data = &(const struct clk_parent_data) {
299			.fw_name = "xtal",
300		},
301		.num_parents = 1,
302	},
303};
304
305static struct clk_regmap axg_hifi_pll = {
306	.data = &(struct clk_regmap_div_data){
307		.offset = HHI_HIFI_PLL_CNTL,
308		.shift = 16,
309		.width = 2,
310		.flags = CLK_DIVIDER_POWER_OF_TWO,
311	},
312	.hw.init = &(struct clk_init_data){
313		.name = "hifi_pll",
314		.ops = &clk_regmap_divider_ops,
315		.parent_hws = (const struct clk_hw *[]) {
316			&axg_hifi_pll_dco.hw
317		},
318		.num_parents = 1,
319		.flags = CLK_SET_RATE_PARENT,
320	},
321};
322
323static struct clk_fixed_factor axg_fclk_div2_div = {
324	.mult = 1,
325	.div = 2,
326	.hw.init = &(struct clk_init_data){
327		.name = "fclk_div2_div",
328		.ops = &clk_fixed_factor_ops,
329		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
330		.num_parents = 1,
331	},
332};
333
334static struct clk_regmap axg_fclk_div2 = {
335	.data = &(struct clk_regmap_gate_data){
336		.offset = HHI_MPLL_CNTL6,
337		.bit_idx = 27,
338	},
339	.hw.init = &(struct clk_init_data){
340		.name = "fclk_div2",
341		.ops = &clk_regmap_gate_ops,
342		.parent_hws = (const struct clk_hw *[]) {
343			&axg_fclk_div2_div.hw
344		},
345		.num_parents = 1,
346		.flags = CLK_IS_CRITICAL,
347	},
348};
349
350static struct clk_fixed_factor axg_fclk_div3_div = {
351	.mult = 1,
352	.div = 3,
353	.hw.init = &(struct clk_init_data){
354		.name = "fclk_div3_div",
355		.ops = &clk_fixed_factor_ops,
356		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
357		.num_parents = 1,
358	},
359};
360
361static struct clk_regmap axg_fclk_div3 = {
362	.data = &(struct clk_regmap_gate_data){
363		.offset = HHI_MPLL_CNTL6,
364		.bit_idx = 28,
365	},
366	.hw.init = &(struct clk_init_data){
367		.name = "fclk_div3",
368		.ops = &clk_regmap_gate_ops,
369		.parent_hws = (const struct clk_hw *[]) {
370			&axg_fclk_div3_div.hw
371		},
372		.num_parents = 1,
373		/*
374		 * FIXME:
375		 * This clock, as fdiv2, is used by the SCPI FW and is required
376		 * by the platform to operate correctly.
377		 * Until the following condition are met, we need this clock to
378		 * be marked as critical:
379		 * a) The SCPI generic driver claims and enable all the clocks
380		 *    it needs
381		 * b) CCF has a clock hand-off mechanism to make the sure the
382		 *    clock stays on until the proper driver comes along
383		 */
384		.flags = CLK_IS_CRITICAL,
385	},
386};
387
388static struct clk_fixed_factor axg_fclk_div4_div = {
389	.mult = 1,
390	.div = 4,
391	.hw.init = &(struct clk_init_data){
392		.name = "fclk_div4_div",
393		.ops = &clk_fixed_factor_ops,
394		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
395		.num_parents = 1,
396	},
397};
398
399static struct clk_regmap axg_fclk_div4 = {
400	.data = &(struct clk_regmap_gate_data){
401		.offset = HHI_MPLL_CNTL6,
402		.bit_idx = 29,
403	},
404	.hw.init = &(struct clk_init_data){
405		.name = "fclk_div4",
406		.ops = &clk_regmap_gate_ops,
407		.parent_hws = (const struct clk_hw *[]) {
408			&axg_fclk_div4_div.hw
409		},
410		.num_parents = 1,
411	},
412};
413
414static struct clk_fixed_factor axg_fclk_div5_div = {
415	.mult = 1,
416	.div = 5,
417	.hw.init = &(struct clk_init_data){
418		.name = "fclk_div5_div",
419		.ops = &clk_fixed_factor_ops,
420		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
421		.num_parents = 1,
422	},
423};
424
425static struct clk_regmap axg_fclk_div5 = {
426	.data = &(struct clk_regmap_gate_data){
427		.offset = HHI_MPLL_CNTL6,
428		.bit_idx = 30,
429	},
430	.hw.init = &(struct clk_init_data){
431		.name = "fclk_div5",
432		.ops = &clk_regmap_gate_ops,
433		.parent_hws = (const struct clk_hw *[]) {
434			&axg_fclk_div5_div.hw
435		},
436		.num_parents = 1,
437	},
438};
439
440static struct clk_fixed_factor axg_fclk_div7_div = {
441	.mult = 1,
442	.div = 7,
443	.hw.init = &(struct clk_init_data){
444		.name = "fclk_div7_div",
445		.ops = &clk_fixed_factor_ops,
446		.parent_hws = (const struct clk_hw *[]) {
447			&axg_fixed_pll.hw
448		},
449		.num_parents = 1,
450	},
451};
452
453static struct clk_regmap axg_fclk_div7 = {
454	.data = &(struct clk_regmap_gate_data){
455		.offset = HHI_MPLL_CNTL6,
456		.bit_idx = 31,
457	},
458	.hw.init = &(struct clk_init_data){
459		.name = "fclk_div7",
460		.ops = &clk_regmap_gate_ops,
461		.parent_hws = (const struct clk_hw *[]) {
462			&axg_fclk_div7_div.hw
463		},
464		.num_parents = 1,
465	},
466};
467
468static struct clk_regmap axg_mpll_prediv = {
469	.data = &(struct clk_regmap_div_data){
470		.offset = HHI_MPLL_CNTL5,
471		.shift = 12,
472		.width = 1,
473	},
474	.hw.init = &(struct clk_init_data){
475		.name = "mpll_prediv",
476		.ops = &clk_regmap_divider_ro_ops,
477		.parent_hws = (const struct clk_hw *[]) {
478			&axg_fixed_pll.hw
479		},
480		.num_parents = 1,
481	},
482};
483
484static struct clk_regmap axg_mpll0_div = {
485	.data = &(struct meson_clk_mpll_data){
486		.sdm = {
487			.reg_off = HHI_MPLL_CNTL7,
488			.shift   = 0,
489			.width   = 14,
490		},
491		.sdm_en = {
492			.reg_off = HHI_MPLL_CNTL7,
493			.shift   = 15,
494			.width	 = 1,
495		},
496		.n2 = {
497			.reg_off = HHI_MPLL_CNTL7,
498			.shift   = 16,
499			.width   = 9,
500		},
501		.misc = {
502			.reg_off = HHI_PLL_TOP_MISC,
503			.shift   = 0,
504			.width	 = 1,
505		},
506		.lock = &meson_clk_lock,
507		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
508	},
509	.hw.init = &(struct clk_init_data){
510		.name = "mpll0_div",
511		.ops = &meson_clk_mpll_ops,
512		.parent_hws = (const struct clk_hw *[]) {
513			&axg_mpll_prediv.hw
514		},
515		.num_parents = 1,
516	},
517};
518
519static struct clk_regmap axg_mpll0 = {
520	.data = &(struct clk_regmap_gate_data){
521		.offset = HHI_MPLL_CNTL7,
522		.bit_idx = 14,
523	},
524	.hw.init = &(struct clk_init_data){
525		.name = "mpll0",
526		.ops = &clk_regmap_gate_ops,
527		.parent_hws = (const struct clk_hw *[]) {
528			&axg_mpll0_div.hw
529		},
530		.num_parents = 1,
531		.flags = CLK_SET_RATE_PARENT,
532	},
533};
534
535static struct clk_regmap axg_mpll1_div = {
536	.data = &(struct meson_clk_mpll_data){
537		.sdm = {
538			.reg_off = HHI_MPLL_CNTL8,
539			.shift   = 0,
540			.width   = 14,
541		},
542		.sdm_en = {
543			.reg_off = HHI_MPLL_CNTL8,
544			.shift   = 15,
545			.width	 = 1,
546		},
547		.n2 = {
548			.reg_off = HHI_MPLL_CNTL8,
549			.shift   = 16,
550			.width   = 9,
551		},
552		.misc = {
553			.reg_off = HHI_PLL_TOP_MISC,
554			.shift   = 1,
555			.width	 = 1,
556		},
557		.lock = &meson_clk_lock,
558		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
559	},
560	.hw.init = &(struct clk_init_data){
561		.name = "mpll1_div",
562		.ops = &meson_clk_mpll_ops,
563		.parent_hws = (const struct clk_hw *[]) {
564			&axg_mpll_prediv.hw
565		},
566		.num_parents = 1,
567	},
568};
569
570static struct clk_regmap axg_mpll1 = {
571	.data = &(struct clk_regmap_gate_data){
572		.offset = HHI_MPLL_CNTL8,
573		.bit_idx = 14,
574	},
575	.hw.init = &(struct clk_init_data){
576		.name = "mpll1",
577		.ops = &clk_regmap_gate_ops,
578		.parent_hws = (const struct clk_hw *[]) {
579			&axg_mpll1_div.hw
580		},
581		.num_parents = 1,
582		.flags = CLK_SET_RATE_PARENT,
583	},
584};
585
586static struct clk_regmap axg_mpll2_div = {
587	.data = &(struct meson_clk_mpll_data){
588		.sdm = {
589			.reg_off = HHI_MPLL_CNTL9,
590			.shift   = 0,
591			.width   = 14,
592		},
593		.sdm_en = {
594			.reg_off = HHI_MPLL_CNTL9,
595			.shift   = 15,
596			.width	 = 1,
597		},
598		.n2 = {
599			.reg_off = HHI_MPLL_CNTL9,
600			.shift   = 16,
601			.width   = 9,
602		},
603		.ssen = {
604			.reg_off = HHI_MPLL_CNTL,
605			.shift   = 25,
606			.width	 = 1,
607		},
608		.misc = {
609			.reg_off = HHI_PLL_TOP_MISC,
610			.shift   = 2,
611			.width	 = 1,
612		},
613		.lock = &meson_clk_lock,
614		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
615	},
616	.hw.init = &(struct clk_init_data){
617		.name = "mpll2_div",
618		.ops = &meson_clk_mpll_ops,
619		.parent_hws = (const struct clk_hw *[]) {
620			&axg_mpll_prediv.hw
621		},
622		.num_parents = 1,
623	},
624};
625
626static struct clk_regmap axg_mpll2 = {
627	.data = &(struct clk_regmap_gate_data){
628		.offset = HHI_MPLL_CNTL9,
629		.bit_idx = 14,
630	},
631	.hw.init = &(struct clk_init_data){
632		.name = "mpll2",
633		.ops = &clk_regmap_gate_ops,
634		.parent_hws = (const struct clk_hw *[]) {
635			&axg_mpll2_div.hw
636		},
637		.num_parents = 1,
638		.flags = CLK_SET_RATE_PARENT,
639	},
640};
641
642static struct clk_regmap axg_mpll3_div = {
643	.data = &(struct meson_clk_mpll_data){
644		.sdm = {
645			.reg_off = HHI_MPLL3_CNTL0,
646			.shift   = 12,
647			.width   = 14,
648		},
649		.sdm_en = {
650			.reg_off = HHI_MPLL3_CNTL0,
651			.shift   = 11,
652			.width	 = 1,
653		},
654		.n2 = {
655			.reg_off = HHI_MPLL3_CNTL0,
656			.shift   = 2,
657			.width   = 9,
658		},
659		.misc = {
660			.reg_off = HHI_PLL_TOP_MISC,
661			.shift   = 3,
662			.width	 = 1,
663		},
664		.lock = &meson_clk_lock,
665		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
666	},
667	.hw.init = &(struct clk_init_data){
668		.name = "mpll3_div",
669		.ops = &meson_clk_mpll_ops,
670		.parent_hws = (const struct clk_hw *[]) {
671			&axg_mpll_prediv.hw
672		},
673		.num_parents = 1,
674	},
675};
676
677static struct clk_regmap axg_mpll3 = {
678	.data = &(struct clk_regmap_gate_data){
679		.offset = HHI_MPLL3_CNTL0,
680		.bit_idx = 0,
681	},
682	.hw.init = &(struct clk_init_data){
683		.name = "mpll3",
684		.ops = &clk_regmap_gate_ops,
685		.parent_hws = (const struct clk_hw *[]) {
686			&axg_mpll3_div.hw
687		},
688		.num_parents = 1,
689		.flags = CLK_SET_RATE_PARENT,
690	},
691};
692
693static const struct pll_params_table axg_pcie_pll_params_table[] = {
694	{
695		.m = 200,
696		.n = 3,
697	},
698	{ /* sentinel */ },
699};
700
701static const struct reg_sequence axg_pcie_init_regs[] = {
702	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x0084a2aa },
703	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0xb75020be },
704	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x0a47488e },
705	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0xc000004d },
706	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x00078000 },
707	{ .reg = HHI_PCIE_PLL_CNTL6,	.def = 0x002323c6 },
708	{ .reg = HHI_PCIE_PLL_CNTL,     .def = 0x400106c8 },
709};
710
711static struct clk_regmap axg_pcie_pll_dco = {
712	.data = &(struct meson_clk_pll_data){
713		.en = {
714			.reg_off = HHI_PCIE_PLL_CNTL,
715			.shift   = 30,
716			.width   = 1,
717		},
718		.m = {
719			.reg_off = HHI_PCIE_PLL_CNTL,
720			.shift   = 0,
721			.width   = 9,
722		},
723		.n = {
724			.reg_off = HHI_PCIE_PLL_CNTL,
725			.shift   = 9,
726			.width   = 5,
727		},
728		.frac = {
729			.reg_off = HHI_PCIE_PLL_CNTL1,
730			.shift   = 0,
731			.width   = 12,
732		},
733		.l = {
734			.reg_off = HHI_PCIE_PLL_CNTL,
735			.shift   = 31,
736			.width   = 1,
737		},
738		.rst = {
739			.reg_off = HHI_PCIE_PLL_CNTL,
740			.shift   = 29,
741			.width   = 1,
742		},
743		.table = axg_pcie_pll_params_table,
744		.init_regs = axg_pcie_init_regs,
745		.init_count = ARRAY_SIZE(axg_pcie_init_regs),
746	},
747	.hw.init = &(struct clk_init_data){
748		.name = "pcie_pll_dco",
749		.ops = &meson_clk_pll_ops,
750		.parent_data = &(const struct clk_parent_data) {
751			.fw_name = "xtal",
752		},
753		.num_parents = 1,
754	},
755};
756
757static struct clk_regmap axg_pcie_pll_od = {
758	.data = &(struct clk_regmap_div_data){
759		.offset = HHI_PCIE_PLL_CNTL,
760		.shift = 16,
761		.width = 2,
762		.flags = CLK_DIVIDER_POWER_OF_TWO,
763	},
764	.hw.init = &(struct clk_init_data){
765		.name = "pcie_pll_od",
766		.ops = &clk_regmap_divider_ops,
767		.parent_hws = (const struct clk_hw *[]) {
768			&axg_pcie_pll_dco.hw
769		},
770		.num_parents = 1,
771		.flags = CLK_SET_RATE_PARENT,
772	},
773};
774
775static struct clk_regmap axg_pcie_pll = {
776	.data = &(struct clk_regmap_div_data){
777		.offset = HHI_PCIE_PLL_CNTL6,
778		.shift = 6,
779		.width = 2,
780		.flags = CLK_DIVIDER_POWER_OF_TWO,
781	},
782	.hw.init = &(struct clk_init_data){
783		.name = "pcie_pll",
784		.ops = &clk_regmap_divider_ops,
785		.parent_hws = (const struct clk_hw *[]) {
786			&axg_pcie_pll_od.hw
787		},
788		.num_parents = 1,
789		.flags = CLK_SET_RATE_PARENT,
790	},
791};
792
793static struct clk_regmap axg_pcie_mux = {
794	.data = &(struct clk_regmap_mux_data){
795		.offset = HHI_PCIE_PLL_CNTL6,
796		.mask = 0x1,
797		.shift = 2,
798		/* skip the parent mpll3, reserved for debug */
799		.table = (u32[]){ 1 },
800	},
801	.hw.init = &(struct clk_init_data){
802		.name = "pcie_mux",
803		.ops = &clk_regmap_mux_ops,
804		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_pll.hw },
805		.num_parents = 1,
806		.flags = CLK_SET_RATE_PARENT,
807	},
808};
809
810static struct clk_regmap axg_pcie_ref = {
811	.data = &(struct clk_regmap_mux_data){
812		.offset = HHI_PCIE_PLL_CNTL6,
813		.mask = 0x1,
814		.shift = 1,
815		/* skip the parent 0, reserved for debug */
816		.table = (u32[]){ 1 },
817	},
818	.hw.init = &(struct clk_init_data){
819		.name = "pcie_ref",
820		.ops = &clk_regmap_mux_ops,
821		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_mux.hw },
822		.num_parents = 1,
823		.flags = CLK_SET_RATE_PARENT,
824	},
825};
826
827static struct clk_regmap axg_pcie_cml_en0 = {
828	.data = &(struct clk_regmap_gate_data){
829		.offset = HHI_PCIE_PLL_CNTL6,
830		.bit_idx = 4,
831	},
832	.hw.init = &(struct clk_init_data) {
833		.name = "pcie_cml_en0",
834		.ops = &clk_regmap_gate_ops,
835		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
836		.num_parents = 1,
837		.flags = CLK_SET_RATE_PARENT,
838
839	},
840};
841
842static struct clk_regmap axg_pcie_cml_en1 = {
843	.data = &(struct clk_regmap_gate_data){
844		.offset = HHI_PCIE_PLL_CNTL6,
845		.bit_idx = 3,
846	},
847	.hw.init = &(struct clk_init_data) {
848		.name = "pcie_cml_en1",
849		.ops = &clk_regmap_gate_ops,
850		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
851		.num_parents = 1,
852		.flags = CLK_SET_RATE_PARENT,
853	},
854};
855
856static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
857static const struct clk_parent_data clk81_parent_data[] = {
858	{ .fw_name = "xtal", },
859	{ .hw = &axg_fclk_div7.hw },
860	{ .hw = &axg_mpll1.hw },
861	{ .hw = &axg_mpll2.hw },
862	{ .hw = &axg_fclk_div4.hw },
863	{ .hw = &axg_fclk_div3.hw },
864	{ .hw = &axg_fclk_div5.hw },
865};
866
867static struct clk_regmap axg_mpeg_clk_sel = {
868	.data = &(struct clk_regmap_mux_data){
869		.offset = HHI_MPEG_CLK_CNTL,
870		.mask = 0x7,
871		.shift = 12,
872		.table = mux_table_clk81,
873	},
874	.hw.init = &(struct clk_init_data){
875		.name = "mpeg_clk_sel",
876		.ops = &clk_regmap_mux_ro_ops,
877		.parent_data = clk81_parent_data,
878		.num_parents = ARRAY_SIZE(clk81_parent_data),
879	},
880};
881
882static struct clk_regmap axg_mpeg_clk_div = {
883	.data = &(struct clk_regmap_div_data){
884		.offset = HHI_MPEG_CLK_CNTL,
885		.shift = 0,
886		.width = 7,
887	},
888	.hw.init = &(struct clk_init_data){
889		.name = "mpeg_clk_div",
890		.ops = &clk_regmap_divider_ops,
891		.parent_hws = (const struct clk_hw *[]) {
892			&axg_mpeg_clk_sel.hw
893		},
894		.num_parents = 1,
895		.flags = CLK_SET_RATE_PARENT,
896	},
897};
898
899static struct clk_regmap axg_clk81 = {
900	.data = &(struct clk_regmap_gate_data){
901		.offset = HHI_MPEG_CLK_CNTL,
902		.bit_idx = 7,
903	},
904	.hw.init = &(struct clk_init_data){
905		.name = "clk81",
906		.ops = &clk_regmap_gate_ops,
907		.parent_hws = (const struct clk_hw *[]) {
908			&axg_mpeg_clk_div.hw
909		},
910		.num_parents = 1,
911		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
912	},
913};
914
915static const struct clk_parent_data axg_sd_emmc_clk0_parent_data[] = {
916	{ .fw_name = "xtal", },
917	{ .hw = &axg_fclk_div2.hw },
918	{ .hw = &axg_fclk_div3.hw },
919	{ .hw = &axg_fclk_div5.hw },
920	{ .hw = &axg_fclk_div7.hw },
921	/*
922	 * Following these parent clocks, we should also have had mpll2, mpll3
923	 * and gp0_pll but these clocks are too precious to be used here. All
924	 * the necessary rates for MMC and NAND operation can be acheived using
925	 * xtal or fclk_div clocks
926	 */
927};
928
929/* SDcard clock */
930static struct clk_regmap axg_sd_emmc_b_clk0_sel = {
931	.data = &(struct clk_regmap_mux_data){
932		.offset = HHI_SD_EMMC_CLK_CNTL,
933		.mask = 0x7,
934		.shift = 25,
935	},
936	.hw.init = &(struct clk_init_data) {
937		.name = "sd_emmc_b_clk0_sel",
938		.ops = &clk_regmap_mux_ops,
939		.parent_data = axg_sd_emmc_clk0_parent_data,
940		.num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
941		.flags = CLK_SET_RATE_PARENT,
942	},
943};
944
945static struct clk_regmap axg_sd_emmc_b_clk0_div = {
946	.data = &(struct clk_regmap_div_data){
947		.offset = HHI_SD_EMMC_CLK_CNTL,
948		.shift = 16,
949		.width = 7,
950		.flags = CLK_DIVIDER_ROUND_CLOSEST,
951	},
952	.hw.init = &(struct clk_init_data) {
953		.name = "sd_emmc_b_clk0_div",
954		.ops = &clk_regmap_divider_ops,
955		.parent_hws = (const struct clk_hw *[]) {
956			&axg_sd_emmc_b_clk0_sel.hw
957		},
958		.num_parents = 1,
959		.flags = CLK_SET_RATE_PARENT,
960	},
961};
962
963static struct clk_regmap axg_sd_emmc_b_clk0 = {
964	.data = &(struct clk_regmap_gate_data){
965		.offset = HHI_SD_EMMC_CLK_CNTL,
966		.bit_idx = 23,
967	},
968	.hw.init = &(struct clk_init_data){
969		.name = "sd_emmc_b_clk0",
970		.ops = &clk_regmap_gate_ops,
971		.parent_hws = (const struct clk_hw *[]) {
972			&axg_sd_emmc_b_clk0_div.hw
973		},
974		.num_parents = 1,
975		.flags = CLK_SET_RATE_PARENT,
976	},
977};
978
979/* EMMC/NAND clock */
980static struct clk_regmap axg_sd_emmc_c_clk0_sel = {
981	.data = &(struct clk_regmap_mux_data){
982		.offset = HHI_NAND_CLK_CNTL,
983		.mask = 0x7,
984		.shift = 9,
985	},
986	.hw.init = &(struct clk_init_data) {
987		.name = "sd_emmc_c_clk0_sel",
988		.ops = &clk_regmap_mux_ops,
989		.parent_data = axg_sd_emmc_clk0_parent_data,
990		.num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
991		.flags = CLK_SET_RATE_PARENT,
992	},
993};
994
995static struct clk_regmap axg_sd_emmc_c_clk0_div = {
996	.data = &(struct clk_regmap_div_data){
997		.offset = HHI_NAND_CLK_CNTL,
998		.shift = 0,
999		.width = 7,
1000		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1001	},
1002	.hw.init = &(struct clk_init_data) {
1003		.name = "sd_emmc_c_clk0_div",
1004		.ops = &clk_regmap_divider_ops,
1005		.parent_hws = (const struct clk_hw *[]) {
1006			&axg_sd_emmc_c_clk0_sel.hw
1007		},
1008		.num_parents = 1,
1009		.flags = CLK_SET_RATE_PARENT,
1010	},
1011};
1012
1013static struct clk_regmap axg_sd_emmc_c_clk0 = {
1014	.data = &(struct clk_regmap_gate_data){
1015		.offset = HHI_NAND_CLK_CNTL,
1016		.bit_idx = 7,
1017	},
1018	.hw.init = &(struct clk_init_data){
1019		.name = "sd_emmc_c_clk0",
1020		.ops = &clk_regmap_gate_ops,
1021		.parent_hws = (const struct clk_hw *[]) {
1022			&axg_sd_emmc_c_clk0_div.hw
1023		},
1024		.num_parents = 1,
1025		.flags = CLK_SET_RATE_PARENT,
1026	},
1027};
1028
1029static u32 mux_table_gen_clk[]	= { 0, 4, 5, 6, 7, 8,
1030				    9, 10, 11, 13, 14, };
1031static const struct clk_parent_data gen_clk_parent_data[] = {
1032	{ .fw_name = "xtal", },
1033	{ .hw = &axg_hifi_pll.hw },
1034	{ .hw = &axg_mpll0.hw },
1035	{ .hw = &axg_mpll1.hw },
1036	{ .hw = &axg_mpll2.hw },
1037	{ .hw = &axg_mpll3.hw },
1038	{ .hw = &axg_fclk_div4.hw },
1039	{ .hw = &axg_fclk_div3.hw },
1040	{ .hw = &axg_fclk_div5.hw },
1041	{ .hw = &axg_fclk_div7.hw },
1042	{ .hw = &axg_gp0_pll.hw },
1043};
1044
1045static struct clk_regmap axg_gen_clk_sel = {
1046	.data = &(struct clk_regmap_mux_data){
1047		.offset = HHI_GEN_CLK_CNTL,
1048		.mask = 0xf,
1049		.shift = 12,
1050		.table = mux_table_gen_clk,
1051	},
1052	.hw.init = &(struct clk_init_data){
1053		.name = "gen_clk_sel",
1054		.ops = &clk_regmap_mux_ops,
1055		/*
1056		 * bits 15:12 selects from 14 possible parents:
1057		 * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
1058		 * hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4,
1059		 * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
1060		 */
1061		.parent_data = gen_clk_parent_data,
1062		.num_parents = ARRAY_SIZE(gen_clk_parent_data),
1063	},
1064};
1065
1066static struct clk_regmap axg_gen_clk_div = {
1067	.data = &(struct clk_regmap_div_data){
1068		.offset = HHI_GEN_CLK_CNTL,
1069		.shift = 0,
1070		.width = 11,
1071	},
1072	.hw.init = &(struct clk_init_data){
1073		.name = "gen_clk_div",
1074		.ops = &clk_regmap_divider_ops,
1075		.parent_hws = (const struct clk_hw *[]) {
1076			&axg_gen_clk_sel.hw
1077		},
1078		.num_parents = 1,
1079		.flags = CLK_SET_RATE_PARENT,
1080	},
1081};
1082
1083static struct clk_regmap axg_gen_clk = {
1084	.data = &(struct clk_regmap_gate_data){
1085		.offset = HHI_GEN_CLK_CNTL,
1086		.bit_idx = 7,
1087	},
1088	.hw.init = &(struct clk_init_data){
1089		.name = "gen_clk",
1090		.ops = &clk_regmap_gate_ops,
1091		.parent_hws = (const struct clk_hw *[]) {
1092			&axg_gen_clk_div.hw
1093		},
1094		.num_parents = 1,
1095		.flags = CLK_SET_RATE_PARENT,
1096	},
1097};
1098
1099#define MESON_GATE(_name, _reg, _bit) \
1100	MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw)
1101
1102/* Everything Else (EE) domain gates */
1103static MESON_GATE(axg_ddr, HHI_GCLK_MPEG0, 0);
1104static MESON_GATE(axg_audio_locker, HHI_GCLK_MPEG0, 2);
1105static MESON_GATE(axg_mipi_dsi_host, HHI_GCLK_MPEG0, 3);
1106static MESON_GATE(axg_isa, HHI_GCLK_MPEG0, 5);
1107static MESON_GATE(axg_pl301, HHI_GCLK_MPEG0, 6);
1108static MESON_GATE(axg_periphs, HHI_GCLK_MPEG0, 7);
1109static MESON_GATE(axg_spicc_0, HHI_GCLK_MPEG0, 8);
1110static MESON_GATE(axg_i2c, HHI_GCLK_MPEG0, 9);
1111static MESON_GATE(axg_rng0, HHI_GCLK_MPEG0, 12);
1112static MESON_GATE(axg_uart0, HHI_GCLK_MPEG0, 13);
1113static MESON_GATE(axg_mipi_dsi_phy, HHI_GCLK_MPEG0, 14);
1114static MESON_GATE(axg_spicc_1, HHI_GCLK_MPEG0, 15);
1115static MESON_GATE(axg_pcie_a, HHI_GCLK_MPEG0, 16);
1116static MESON_GATE(axg_pcie_b, HHI_GCLK_MPEG0, 17);
1117static MESON_GATE(axg_hiu_reg, HHI_GCLK_MPEG0, 19);
1118static MESON_GATE(axg_assist_misc, HHI_GCLK_MPEG0, 23);
1119static MESON_GATE(axg_emmc_b, HHI_GCLK_MPEG0, 25);
1120static MESON_GATE(axg_emmc_c, HHI_GCLK_MPEG0, 26);
1121static MESON_GATE(axg_dma, HHI_GCLK_MPEG0, 27);
1122static MESON_GATE(axg_spi, HHI_GCLK_MPEG0, 30);
1123
1124static MESON_GATE(axg_audio, HHI_GCLK_MPEG1, 0);
1125static MESON_GATE(axg_eth_core, HHI_GCLK_MPEG1, 3);
1126static MESON_GATE(axg_uart1, HHI_GCLK_MPEG1, 16);
1127static MESON_GATE(axg_g2d, HHI_GCLK_MPEG1, 20);
1128static MESON_GATE(axg_usb0, HHI_GCLK_MPEG1, 21);
1129static MESON_GATE(axg_usb1, HHI_GCLK_MPEG1, 22);
1130static MESON_GATE(axg_reset, HHI_GCLK_MPEG1, 23);
1131static MESON_GATE(axg_usb_general, HHI_GCLK_MPEG1, 26);
1132static MESON_GATE(axg_ahb_arb0, HHI_GCLK_MPEG1, 29);
1133static MESON_GATE(axg_efuse, HHI_GCLK_MPEG1, 30);
1134static MESON_GATE(axg_boot_rom, HHI_GCLK_MPEG1, 31);
1135
1136static MESON_GATE(axg_ahb_data_bus, HHI_GCLK_MPEG2, 1);
1137static MESON_GATE(axg_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
1138static MESON_GATE(axg_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
1139static MESON_GATE(axg_usb0_to_ddr, HHI_GCLK_MPEG2, 9);
1140static MESON_GATE(axg_mmc_pclk, HHI_GCLK_MPEG2, 11);
1141static MESON_GATE(axg_vpu_intr, HHI_GCLK_MPEG2, 25);
1142static MESON_GATE(axg_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
1143static MESON_GATE(axg_gic, HHI_GCLK_MPEG2, 30);
1144static MESON_GATE(axg_mipi_enable, HHI_MIPI_CNTL0, 29);
1145
1146/* Always On (AO) domain gates */
1147
1148static MESON_GATE(axg_ao_media_cpu, HHI_GCLK_AO, 0);
1149static MESON_GATE(axg_ao_ahb_sram, HHI_GCLK_AO, 1);
1150static MESON_GATE(axg_ao_ahb_bus, HHI_GCLK_AO, 2);
1151static MESON_GATE(axg_ao_iface, HHI_GCLK_AO, 3);
1152static MESON_GATE(axg_ao_i2c, HHI_GCLK_AO, 4);
1153
1154/* Array of all clocks provided by this provider */
1155
1156static struct clk_hw_onecell_data axg_hw_onecell_data = {
1157	.hws = {
1158		[CLKID_SYS_PLL]			= &axg_sys_pll.hw,
1159		[CLKID_FIXED_PLL]		= &axg_fixed_pll.hw,
1160		[CLKID_FCLK_DIV2]		= &axg_fclk_div2.hw,
1161		[CLKID_FCLK_DIV3]		= &axg_fclk_div3.hw,
1162		[CLKID_FCLK_DIV4]		= &axg_fclk_div4.hw,
1163		[CLKID_FCLK_DIV5]		= &axg_fclk_div5.hw,
1164		[CLKID_FCLK_DIV7]		= &axg_fclk_div7.hw,
1165		[CLKID_GP0_PLL]			= &axg_gp0_pll.hw,
1166		[CLKID_MPEG_SEL]		= &axg_mpeg_clk_sel.hw,
1167		[CLKID_MPEG_DIV]		= &axg_mpeg_clk_div.hw,
1168		[CLKID_CLK81]			= &axg_clk81.hw,
1169		[CLKID_MPLL0]			= &axg_mpll0.hw,
1170		[CLKID_MPLL1]			= &axg_mpll1.hw,
1171		[CLKID_MPLL2]			= &axg_mpll2.hw,
1172		[CLKID_MPLL3]			= &axg_mpll3.hw,
1173		[CLKID_DDR]			= &axg_ddr.hw,
1174		[CLKID_AUDIO_LOCKER]		= &axg_audio_locker.hw,
1175		[CLKID_MIPI_DSI_HOST]		= &axg_mipi_dsi_host.hw,
1176		[CLKID_ISA]			= &axg_isa.hw,
1177		[CLKID_PL301]			= &axg_pl301.hw,
1178		[CLKID_PERIPHS]			= &axg_periphs.hw,
1179		[CLKID_SPICC0]			= &axg_spicc_0.hw,
1180		[CLKID_I2C]			= &axg_i2c.hw,
1181		[CLKID_RNG0]			= &axg_rng0.hw,
1182		[CLKID_UART0]			= &axg_uart0.hw,
1183		[CLKID_MIPI_DSI_PHY]		= &axg_mipi_dsi_phy.hw,
1184		[CLKID_SPICC1]			= &axg_spicc_1.hw,
1185		[CLKID_PCIE_A]			= &axg_pcie_a.hw,
1186		[CLKID_PCIE_B]			= &axg_pcie_b.hw,
1187		[CLKID_HIU_IFACE]		= &axg_hiu_reg.hw,
1188		[CLKID_ASSIST_MISC]		= &axg_assist_misc.hw,
1189		[CLKID_SD_EMMC_B]		= &axg_emmc_b.hw,
1190		[CLKID_SD_EMMC_C]		= &axg_emmc_c.hw,
1191		[CLKID_DMA]			= &axg_dma.hw,
1192		[CLKID_SPI]			= &axg_spi.hw,
1193		[CLKID_AUDIO]			= &axg_audio.hw,
1194		[CLKID_ETH]			= &axg_eth_core.hw,
1195		[CLKID_UART1]			= &axg_uart1.hw,
1196		[CLKID_G2D]			= &axg_g2d.hw,
1197		[CLKID_USB0]			= &axg_usb0.hw,
1198		[CLKID_USB1]			= &axg_usb1.hw,
1199		[CLKID_RESET]			= &axg_reset.hw,
1200		[CLKID_USB]			= &axg_usb_general.hw,
1201		[CLKID_AHB_ARB0]		= &axg_ahb_arb0.hw,
1202		[CLKID_EFUSE]			= &axg_efuse.hw,
1203		[CLKID_BOOT_ROM]		= &axg_boot_rom.hw,
1204		[CLKID_AHB_DATA_BUS]		= &axg_ahb_data_bus.hw,
1205		[CLKID_AHB_CTRL_BUS]		= &axg_ahb_ctrl_bus.hw,
1206		[CLKID_USB1_DDR_BRIDGE]		= &axg_usb1_to_ddr.hw,
1207		[CLKID_USB0_DDR_BRIDGE]		= &axg_usb0_to_ddr.hw,
1208		[CLKID_MMC_PCLK]		= &axg_mmc_pclk.hw,
1209		[CLKID_VPU_INTR]		= &axg_vpu_intr.hw,
1210		[CLKID_SEC_AHB_AHB3_BRIDGE]	= &axg_sec_ahb_ahb3_bridge.hw,
1211		[CLKID_GIC]			= &axg_gic.hw,
1212		[CLKID_AO_MEDIA_CPU]		= &axg_ao_media_cpu.hw,
1213		[CLKID_AO_AHB_SRAM]		= &axg_ao_ahb_sram.hw,
1214		[CLKID_AO_AHB_BUS]		= &axg_ao_ahb_bus.hw,
1215		[CLKID_AO_IFACE]		= &axg_ao_iface.hw,
1216		[CLKID_AO_I2C]			= &axg_ao_i2c.hw,
1217		[CLKID_SD_EMMC_B_CLK0_SEL]	= &axg_sd_emmc_b_clk0_sel.hw,
1218		[CLKID_SD_EMMC_B_CLK0_DIV]	= &axg_sd_emmc_b_clk0_div.hw,
1219		[CLKID_SD_EMMC_B_CLK0]		= &axg_sd_emmc_b_clk0.hw,
1220		[CLKID_SD_EMMC_C_CLK0_SEL]	= &axg_sd_emmc_c_clk0_sel.hw,
1221		[CLKID_SD_EMMC_C_CLK0_DIV]	= &axg_sd_emmc_c_clk0_div.hw,
1222		[CLKID_SD_EMMC_C_CLK0]		= &axg_sd_emmc_c_clk0.hw,
1223		[CLKID_MPLL0_DIV]		= &axg_mpll0_div.hw,
1224		[CLKID_MPLL1_DIV]		= &axg_mpll1_div.hw,
1225		[CLKID_MPLL2_DIV]		= &axg_mpll2_div.hw,
1226		[CLKID_MPLL3_DIV]		= &axg_mpll3_div.hw,
1227		[CLKID_HIFI_PLL]		= &axg_hifi_pll.hw,
1228		[CLKID_MPLL_PREDIV]		= &axg_mpll_prediv.hw,
1229		[CLKID_FCLK_DIV2_DIV]		= &axg_fclk_div2_div.hw,
1230		[CLKID_FCLK_DIV3_DIV]		= &axg_fclk_div3_div.hw,
1231		[CLKID_FCLK_DIV4_DIV]		= &axg_fclk_div4_div.hw,
1232		[CLKID_FCLK_DIV5_DIV]		= &axg_fclk_div5_div.hw,
1233		[CLKID_FCLK_DIV7_DIV]		= &axg_fclk_div7_div.hw,
1234		[CLKID_PCIE_PLL]		= &axg_pcie_pll.hw,
1235		[CLKID_PCIE_MUX]		= &axg_pcie_mux.hw,
1236		[CLKID_PCIE_REF]		= &axg_pcie_ref.hw,
1237		[CLKID_PCIE_CML_EN0]		= &axg_pcie_cml_en0.hw,
1238		[CLKID_PCIE_CML_EN1]		= &axg_pcie_cml_en1.hw,
1239		[CLKID_MIPI_ENABLE]		= &axg_mipi_enable.hw,
1240		[CLKID_GEN_CLK_SEL]		= &axg_gen_clk_sel.hw,
1241		[CLKID_GEN_CLK_DIV]		= &axg_gen_clk_div.hw,
1242		[CLKID_GEN_CLK]			= &axg_gen_clk.hw,
1243		[CLKID_SYS_PLL_DCO]		= &axg_sys_pll_dco.hw,
1244		[CLKID_FIXED_PLL_DCO]		= &axg_fixed_pll_dco.hw,
1245		[CLKID_GP0_PLL_DCO]		= &axg_gp0_pll_dco.hw,
1246		[CLKID_HIFI_PLL_DCO]		= &axg_hifi_pll_dco.hw,
1247		[CLKID_PCIE_PLL_DCO]		= &axg_pcie_pll_dco.hw,
1248		[CLKID_PCIE_PLL_OD]		= &axg_pcie_pll_od.hw,
1249		[NR_CLKS]			= NULL,
1250	},
1251	.num = NR_CLKS,
1252};
1253
1254/* Convenience table to populate regmap in .probe */
1255static struct clk_regmap *const axg_clk_regmaps[] = {
1256	&axg_clk81,
1257	&axg_ddr,
1258	&axg_audio_locker,
1259	&axg_mipi_dsi_host,
1260	&axg_isa,
1261	&axg_pl301,
1262	&axg_periphs,
1263	&axg_spicc_0,
1264	&axg_i2c,
1265	&axg_rng0,
1266	&axg_uart0,
1267	&axg_mipi_dsi_phy,
1268	&axg_spicc_1,
1269	&axg_pcie_a,
1270	&axg_pcie_b,
1271	&axg_hiu_reg,
1272	&axg_assist_misc,
1273	&axg_emmc_b,
1274	&axg_emmc_c,
1275	&axg_dma,
1276	&axg_spi,
1277	&axg_audio,
1278	&axg_eth_core,
1279	&axg_uart1,
1280	&axg_g2d,
1281	&axg_usb0,
1282	&axg_usb1,
1283	&axg_reset,
1284	&axg_usb_general,
1285	&axg_ahb_arb0,
1286	&axg_efuse,
1287	&axg_boot_rom,
1288	&axg_ahb_data_bus,
1289	&axg_ahb_ctrl_bus,
1290	&axg_usb1_to_ddr,
1291	&axg_usb0_to_ddr,
1292	&axg_mmc_pclk,
1293	&axg_vpu_intr,
1294	&axg_sec_ahb_ahb3_bridge,
1295	&axg_gic,
1296	&axg_ao_media_cpu,
1297	&axg_ao_ahb_sram,
1298	&axg_ao_ahb_bus,
1299	&axg_ao_iface,
1300	&axg_ao_i2c,
1301	&axg_sd_emmc_b_clk0,
1302	&axg_sd_emmc_c_clk0,
1303	&axg_mpeg_clk_div,
1304	&axg_sd_emmc_b_clk0_div,
1305	&axg_sd_emmc_c_clk0_div,
1306	&axg_mpeg_clk_sel,
1307	&axg_sd_emmc_b_clk0_sel,
1308	&axg_sd_emmc_c_clk0_sel,
1309	&axg_mpll0,
1310	&axg_mpll1,
1311	&axg_mpll2,
1312	&axg_mpll3,
1313	&axg_mpll0_div,
1314	&axg_mpll1_div,
1315	&axg_mpll2_div,
1316	&axg_mpll3_div,
1317	&axg_fixed_pll,
1318	&axg_sys_pll,
1319	&axg_gp0_pll,
1320	&axg_hifi_pll,
1321	&axg_mpll_prediv,
1322	&axg_fclk_div2,
1323	&axg_fclk_div3,
1324	&axg_fclk_div4,
1325	&axg_fclk_div5,
1326	&axg_fclk_div7,
1327	&axg_pcie_pll_dco,
1328	&axg_pcie_pll_od,
1329	&axg_pcie_pll,
1330	&axg_pcie_mux,
1331	&axg_pcie_ref,
1332	&axg_pcie_cml_en0,
1333	&axg_pcie_cml_en1,
1334	&axg_mipi_enable,
1335	&axg_gen_clk_sel,
1336	&axg_gen_clk_div,
1337	&axg_gen_clk,
1338	&axg_fixed_pll_dco,
1339	&axg_sys_pll_dco,
1340	&axg_gp0_pll_dco,
1341	&axg_hifi_pll_dco,
1342	&axg_pcie_pll_dco,
1343	&axg_pcie_pll_od,
1344};
1345
1346static const struct meson_eeclkc_data axg_clkc_data = {
1347	.regmap_clks = axg_clk_regmaps,
1348	.regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps),
1349	.hw_onecell_data = &axg_hw_onecell_data,
1350};
1351
1352
1353static const struct of_device_id clkc_match_table[] = {
1354	{ .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data },
1355	{}
1356};
1357
1358static struct platform_driver axg_driver = {
1359	.probe		= meson_eeclkc_probe,
1360	.driver		= {
1361		.name	= "axg-clkc",
1362		.of_match_table = clkc_match_table,
1363	},
1364};
1365
1366builtin_platform_driver(axg_driver);
1367