xref: /openbmc/linux/drivers/clk/meson/axg.c (revision 5ee9cd065836e5934710ca35653bce7905add20b)
178b4af31SQiufang Dai // SPDX-License-Identifier: GPL-2.0+
278b4af31SQiufang Dai /*
378b4af31SQiufang Dai  * AmLogic Meson-AXG Clock Controller Driver
478b4af31SQiufang Dai  *
578b4af31SQiufang Dai  * Copyright (c) 2016 Baylibre SAS.
678b4af31SQiufang Dai  * Author: Michael Turquette <mturquette@baylibre.com>
778b4af31SQiufang Dai  *
878b4af31SQiufang Dai  * Copyright (c) 2017 Amlogic, inc.
978b4af31SQiufang Dai  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
1078b4af31SQiufang Dai  */
1178b4af31SQiufang Dai 
1278b4af31SQiufang Dai #include <linux/clk-provider.h>
13161f6e5bSJerome Brunet #include <linux/init.h>
14a96cbb14SRob Herring #include <linux/mod_devicetable.h>
1578b4af31SQiufang Dai #include <linux/platform_device.h>
1620425f63SKevin Hilman #include <linux/module.h>
1778b4af31SQiufang Dai 
18889c2b7eSJerome Brunet #include "clk-regmap.h"
19889c2b7eSJerome Brunet #include "clk-pll.h"
20889c2b7eSJerome Brunet #include "clk-mpll.h"
2178b4af31SQiufang Dai #include "axg.h"
226682bd4dSJerome Brunet #include "meson-eeclk.h"
236e73dac7SJerome Brunet 
24ccbfbd36SNeil Armstrong #include <dt-bindings/clock/axg-clkc.h>
25ccbfbd36SNeil Armstrong 
2678b4af31SQiufang Dai static DEFINE_SPINLOCK(meson_clk_lock);
2778b4af31SQiufang Dai 
2887173557SJerome Brunet static struct clk_regmap axg_fixed_pll_dco = {
29722825dcSJerome Brunet 	.data = &(struct meson_clk_pll_data){
30e40c7e3cSJerome Brunet 		.en = {
31e40c7e3cSJerome Brunet 			.reg_off = HHI_MPLL_CNTL,
32e40c7e3cSJerome Brunet 			.shift   = 30,
33e40c7e3cSJerome Brunet 			.width   = 1,
34e40c7e3cSJerome Brunet 		},
3578b4af31SQiufang Dai 		.m = {
3678b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL,
3778b4af31SQiufang Dai 			.shift   = 0,
3878b4af31SQiufang Dai 			.width   = 9,
3978b4af31SQiufang Dai 		},
4078b4af31SQiufang Dai 		.n = {
4178b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL,
4278b4af31SQiufang Dai 			.shift   = 9,
4378b4af31SQiufang Dai 			.width   = 5,
4478b4af31SQiufang Dai 		},
456b71acecSJerome Brunet 		.frac = {
466b71acecSJerome Brunet 			.reg_off = HHI_MPLL_CNTL2,
476b71acecSJerome Brunet 			.shift   = 0,
486b71acecSJerome Brunet 			.width   = 12,
496b71acecSJerome Brunet 		},
50722825dcSJerome Brunet 		.l = {
51722825dcSJerome Brunet 			.reg_off = HHI_MPLL_CNTL,
52722825dcSJerome Brunet 			.shift   = 31,
53722825dcSJerome Brunet 			.width   = 1,
54722825dcSJerome Brunet 		},
55722825dcSJerome Brunet 		.rst = {
56722825dcSJerome Brunet 			.reg_off = HHI_MPLL_CNTL,
57722825dcSJerome Brunet 			.shift   = 29,
58722825dcSJerome Brunet 			.width   = 1,
59722825dcSJerome Brunet 		},
60722825dcSJerome Brunet 	},
6178b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
6287173557SJerome Brunet 		.name = "fixed_pll_dco",
6378b4af31SQiufang Dai 		.ops = &meson_clk_pll_ro_ops,
64cc132d11SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
65cc132d11SAlexandre Mergnat 			.fw_name = "xtal",
66cc132d11SAlexandre Mergnat 		},
6778b4af31SQiufang Dai 		.num_parents = 1,
6878b4af31SQiufang Dai 	},
6978b4af31SQiufang Dai };
7078b4af31SQiufang Dai 
7187173557SJerome Brunet static struct clk_regmap axg_fixed_pll = {
7287173557SJerome Brunet 	.data = &(struct clk_regmap_div_data){
7387173557SJerome Brunet 		.offset = HHI_MPLL_CNTL,
7487173557SJerome Brunet 		.shift = 16,
7587173557SJerome Brunet 		.width = 2,
7687173557SJerome Brunet 		.flags = CLK_DIVIDER_POWER_OF_TWO,
7787173557SJerome Brunet 	},
7887173557SJerome Brunet 	.hw.init = &(struct clk_init_data){
7987173557SJerome Brunet 		.name = "fixed_pll",
8087173557SJerome Brunet 		.ops = &clk_regmap_divider_ro_ops,
81cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
82cc132d11SAlexandre Mergnat 			&axg_fixed_pll_dco.hw
83cc132d11SAlexandre Mergnat 		},
8487173557SJerome Brunet 		.num_parents = 1,
8587173557SJerome Brunet 		/*
8687173557SJerome Brunet 		 * This clock won't ever change at runtime so
8787173557SJerome Brunet 		 * CLK_SET_RATE_PARENT is not required
8887173557SJerome Brunet 		 */
8987173557SJerome Brunet 	},
9087173557SJerome Brunet };
9187173557SJerome Brunet 
9287173557SJerome Brunet static struct clk_regmap axg_sys_pll_dco = {
93722825dcSJerome Brunet 	.data = &(struct meson_clk_pll_data){
94e40c7e3cSJerome Brunet 		.en = {
95e40c7e3cSJerome Brunet 			.reg_off = HHI_SYS_PLL_CNTL,
96e40c7e3cSJerome Brunet 			.shift   = 30,
97e40c7e3cSJerome Brunet 			.width   = 1,
98e40c7e3cSJerome Brunet 		},
9978b4af31SQiufang Dai 		.m = {
10078b4af31SQiufang Dai 			.reg_off = HHI_SYS_PLL_CNTL,
10178b4af31SQiufang Dai 			.shift   = 0,
10278b4af31SQiufang Dai 			.width   = 9,
10378b4af31SQiufang Dai 		},
10478b4af31SQiufang Dai 		.n = {
10578b4af31SQiufang Dai 			.reg_off = HHI_SYS_PLL_CNTL,
10678b4af31SQiufang Dai 			.shift   = 9,
10778b4af31SQiufang Dai 			.width   = 5,
10878b4af31SQiufang Dai 		},
109722825dcSJerome Brunet 		.l = {
110722825dcSJerome Brunet 			.reg_off = HHI_SYS_PLL_CNTL,
111722825dcSJerome Brunet 			.shift   = 31,
112722825dcSJerome Brunet 			.width   = 1,
113722825dcSJerome Brunet 		},
114722825dcSJerome Brunet 		.rst = {
115722825dcSJerome Brunet 			.reg_off = HHI_SYS_PLL_CNTL,
116722825dcSJerome Brunet 			.shift   = 29,
117722825dcSJerome Brunet 			.width   = 1,
118722825dcSJerome Brunet 		},
119722825dcSJerome Brunet 	},
12078b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
12187173557SJerome Brunet 		.name = "sys_pll_dco",
12278b4af31SQiufang Dai 		.ops = &meson_clk_pll_ro_ops,
123cc132d11SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
124cc132d11SAlexandre Mergnat 			.fw_name = "xtal",
125cc132d11SAlexandre Mergnat 		},
12678b4af31SQiufang Dai 		.num_parents = 1,
12778b4af31SQiufang Dai 	},
12878b4af31SQiufang Dai };
12978b4af31SQiufang Dai 
13087173557SJerome Brunet static struct clk_regmap axg_sys_pll = {
13187173557SJerome Brunet 	.data = &(struct clk_regmap_div_data){
13287173557SJerome Brunet 		.offset = HHI_SYS_PLL_CNTL,
13387173557SJerome Brunet 		.shift = 16,
13487173557SJerome Brunet 		.width = 2,
13587173557SJerome Brunet 		.flags = CLK_DIVIDER_POWER_OF_TWO,
13687173557SJerome Brunet 	},
13787173557SJerome Brunet 	.hw.init = &(struct clk_init_data){
13887173557SJerome Brunet 		.name = "sys_pll",
13987173557SJerome Brunet 		.ops = &clk_regmap_divider_ro_ops,
140cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
141cc132d11SAlexandre Mergnat 			&axg_sys_pll_dco.hw
142cc132d11SAlexandre Mergnat 		},
14387173557SJerome Brunet 		.num_parents = 1,
14487173557SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
14587173557SJerome Brunet 	},
14687173557SJerome Brunet };
14787173557SJerome Brunet 
148dd601dbcSJerome Brunet static const struct pll_params_table axg_gp0_pll_params_table[] = {
149dd601dbcSJerome Brunet 	PLL_PARAMS(40, 1),
150dd601dbcSJerome Brunet 	PLL_PARAMS(41, 1),
151dd601dbcSJerome Brunet 	PLL_PARAMS(42, 1),
152dd601dbcSJerome Brunet 	PLL_PARAMS(43, 1),
153dd601dbcSJerome Brunet 	PLL_PARAMS(44, 1),
154dd601dbcSJerome Brunet 	PLL_PARAMS(45, 1),
155dd601dbcSJerome Brunet 	PLL_PARAMS(46, 1),
156dd601dbcSJerome Brunet 	PLL_PARAMS(47, 1),
157dd601dbcSJerome Brunet 	PLL_PARAMS(48, 1),
158dd601dbcSJerome Brunet 	PLL_PARAMS(49, 1),
159dd601dbcSJerome Brunet 	PLL_PARAMS(50, 1),
160dd601dbcSJerome Brunet 	PLL_PARAMS(51, 1),
161dd601dbcSJerome Brunet 	PLL_PARAMS(52, 1),
162dd601dbcSJerome Brunet 	PLL_PARAMS(53, 1),
163dd601dbcSJerome Brunet 	PLL_PARAMS(54, 1),
164dd601dbcSJerome Brunet 	PLL_PARAMS(55, 1),
165dd601dbcSJerome Brunet 	PLL_PARAMS(56, 1),
166dd601dbcSJerome Brunet 	PLL_PARAMS(57, 1),
167dd601dbcSJerome Brunet 	PLL_PARAMS(58, 1),
168dd601dbcSJerome Brunet 	PLL_PARAMS(59, 1),
169dd601dbcSJerome Brunet 	PLL_PARAMS(60, 1),
170dd601dbcSJerome Brunet 	PLL_PARAMS(61, 1),
171dd601dbcSJerome Brunet 	PLL_PARAMS(62, 1),
172dd601dbcSJerome Brunet 	PLL_PARAMS(63, 1),
173dd601dbcSJerome Brunet 	PLL_PARAMS(64, 1),
174dd601dbcSJerome Brunet 	PLL_PARAMS(65, 1),
175dd601dbcSJerome Brunet 	PLL_PARAMS(66, 1),
176dd601dbcSJerome Brunet 	PLL_PARAMS(67, 1),
177dd601dbcSJerome Brunet 	PLL_PARAMS(68, 1),
17878b4af31SQiufang Dai 	{ /* sentinel */ },
17978b4af31SQiufang Dai };
18078b4af31SQiufang Dai 
1815d1c04ddSStephen Boyd static const struct reg_sequence axg_gp0_init_regs[] = {
182c77de0e5SJerome Brunet 	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0xc084b000 },
183722825dcSJerome Brunet 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0xb75020be },
184722825dcSJerome Brunet 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x0a59a288 },
185722825dcSJerome Brunet 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0xc000004d },
186722825dcSJerome Brunet 	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x00078000 },
18778b4af31SQiufang Dai };
18878b4af31SQiufang Dai 
18987173557SJerome Brunet static struct clk_regmap axg_gp0_pll_dco = {
190722825dcSJerome Brunet 	.data = &(struct meson_clk_pll_data){
191e40c7e3cSJerome Brunet 		.en = {
192e40c7e3cSJerome Brunet 			.reg_off = HHI_GP0_PLL_CNTL,
193e40c7e3cSJerome Brunet 			.shift   = 30,
194e40c7e3cSJerome Brunet 			.width   = 1,
195e40c7e3cSJerome Brunet 		},
19678b4af31SQiufang Dai 		.m = {
19778b4af31SQiufang Dai 			.reg_off = HHI_GP0_PLL_CNTL,
19878b4af31SQiufang Dai 			.shift   = 0,
19978b4af31SQiufang Dai 			.width   = 9,
20078b4af31SQiufang Dai 		},
20178b4af31SQiufang Dai 		.n = {
20278b4af31SQiufang Dai 			.reg_off = HHI_GP0_PLL_CNTL,
20378b4af31SQiufang Dai 			.shift   = 9,
20478b4af31SQiufang Dai 			.width   = 5,
20578b4af31SQiufang Dai 		},
206c77de0e5SJerome Brunet 		.frac = {
207c77de0e5SJerome Brunet 			.reg_off = HHI_GP0_PLL_CNTL1,
208c77de0e5SJerome Brunet 			.shift   = 0,
209c77de0e5SJerome Brunet 			.width   = 10,
210c77de0e5SJerome Brunet 		},
211722825dcSJerome Brunet 		.l = {
212722825dcSJerome Brunet 			.reg_off = HHI_GP0_PLL_CNTL,
213722825dcSJerome Brunet 			.shift   = 31,
214722825dcSJerome Brunet 			.width   = 1,
21578b4af31SQiufang Dai 		},
216722825dcSJerome Brunet 		.rst = {
217722825dcSJerome Brunet 			.reg_off = HHI_GP0_PLL_CNTL,
218722825dcSJerome Brunet 			.shift   = 29,
219722825dcSJerome Brunet 			.width   = 1,
220722825dcSJerome Brunet 		},
221dd601dbcSJerome Brunet 		.table = axg_gp0_pll_params_table,
222722825dcSJerome Brunet 		.init_regs = axg_gp0_init_regs,
223722825dcSJerome Brunet 		.init_count = ARRAY_SIZE(axg_gp0_init_regs),
224722825dcSJerome Brunet 	},
22578b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
22687173557SJerome Brunet 		.name = "gp0_pll_dco",
22778b4af31SQiufang Dai 		.ops = &meson_clk_pll_ops,
228cc132d11SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
229cc132d11SAlexandre Mergnat 			.fw_name = "xtal",
230cc132d11SAlexandre Mergnat 		},
23178b4af31SQiufang Dai 		.num_parents = 1,
23278b4af31SQiufang Dai 	},
23378b4af31SQiufang Dai };
23478b4af31SQiufang Dai 
23587173557SJerome Brunet static struct clk_regmap axg_gp0_pll = {
23687173557SJerome Brunet 	.data = &(struct clk_regmap_div_data){
23787173557SJerome Brunet 		.offset = HHI_GP0_PLL_CNTL,
23887173557SJerome Brunet 		.shift = 16,
23987173557SJerome Brunet 		.width = 2,
24087173557SJerome Brunet 		.flags = CLK_DIVIDER_POWER_OF_TWO,
24187173557SJerome Brunet 	},
24287173557SJerome Brunet 	.hw.init = &(struct clk_init_data){
24387173557SJerome Brunet 		.name = "gp0_pll",
24487173557SJerome Brunet 		.ops = &clk_regmap_divider_ops,
245cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
246cc132d11SAlexandre Mergnat 			&axg_gp0_pll_dco.hw
247cc132d11SAlexandre Mergnat 		},
24887173557SJerome Brunet 		.num_parents = 1,
24987173557SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
25087173557SJerome Brunet 	},
25187173557SJerome Brunet };
25287173557SJerome Brunet 
2535d1c04ddSStephen Boyd static const struct reg_sequence axg_hifi_init_regs[] = {
254093c3facSJerome Brunet 	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0xc084b000 },
255093c3facSJerome Brunet 	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0xb75020be },
256093c3facSJerome Brunet 	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x0a6a3a88 },
257093c3facSJerome Brunet 	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0xc000004d },
258093c3facSJerome Brunet 	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x00058000 },
259093c3facSJerome Brunet };
260093c3facSJerome Brunet 
26187173557SJerome Brunet static struct clk_regmap axg_hifi_pll_dco = {
262093c3facSJerome Brunet 	.data = &(struct meson_clk_pll_data){
263e40c7e3cSJerome Brunet 		.en = {
264e40c7e3cSJerome Brunet 			.reg_off = HHI_HIFI_PLL_CNTL,
265e40c7e3cSJerome Brunet 			.shift   = 30,
266e40c7e3cSJerome Brunet 			.width   = 1,
267e40c7e3cSJerome Brunet 		},
268093c3facSJerome Brunet 		.m = {
269093c3facSJerome Brunet 			.reg_off = HHI_HIFI_PLL_CNTL,
270093c3facSJerome Brunet 			.shift   = 0,
271093c3facSJerome Brunet 			.width   = 9,
272093c3facSJerome Brunet 		},
273093c3facSJerome Brunet 		.n = {
274093c3facSJerome Brunet 			.reg_off = HHI_HIFI_PLL_CNTL,
275093c3facSJerome Brunet 			.shift   = 9,
276093c3facSJerome Brunet 			.width   = 5,
277093c3facSJerome Brunet 		},
278093c3facSJerome Brunet 		.frac = {
279093c3facSJerome Brunet 			.reg_off = HHI_HIFI_PLL_CNTL5,
280093c3facSJerome Brunet 			.shift   = 0,
281093c3facSJerome Brunet 			.width   = 13,
282093c3facSJerome Brunet 		},
283093c3facSJerome Brunet 		.l = {
284093c3facSJerome Brunet 			.reg_off = HHI_HIFI_PLL_CNTL,
285093c3facSJerome Brunet 			.shift   = 31,
286093c3facSJerome Brunet 			.width   = 1,
287093c3facSJerome Brunet 		},
288093c3facSJerome Brunet 		.rst = {
289093c3facSJerome Brunet 			.reg_off = HHI_HIFI_PLL_CNTL,
290093c3facSJerome Brunet 			.shift   = 29,
291093c3facSJerome Brunet 			.width   = 1,
292093c3facSJerome Brunet 		},
293dd601dbcSJerome Brunet 		.table = axg_gp0_pll_params_table,
294093c3facSJerome Brunet 		.init_regs = axg_hifi_init_regs,
295093c3facSJerome Brunet 		.init_count = ARRAY_SIZE(axg_hifi_init_regs),
296093c3facSJerome Brunet 		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
297093c3facSJerome Brunet 	},
298093c3facSJerome Brunet 	.hw.init = &(struct clk_init_data){
29987173557SJerome Brunet 		.name = "hifi_pll_dco",
300093c3facSJerome Brunet 		.ops = &meson_clk_pll_ops,
301cc132d11SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
302cc132d11SAlexandre Mergnat 			.fw_name = "xtal",
303cc132d11SAlexandre Mergnat 		},
304093c3facSJerome Brunet 		.num_parents = 1,
305093c3facSJerome Brunet 	},
306093c3facSJerome Brunet };
30778b4af31SQiufang Dai 
30887173557SJerome Brunet static struct clk_regmap axg_hifi_pll = {
30987173557SJerome Brunet 	.data = &(struct clk_regmap_div_data){
31087173557SJerome Brunet 		.offset = HHI_HIFI_PLL_CNTL,
31187173557SJerome Brunet 		.shift = 16,
31287173557SJerome Brunet 		.width = 2,
31387173557SJerome Brunet 		.flags = CLK_DIVIDER_POWER_OF_TWO,
31487173557SJerome Brunet 	},
31587173557SJerome Brunet 	.hw.init = &(struct clk_init_data){
31687173557SJerome Brunet 		.name = "hifi_pll",
31787173557SJerome Brunet 		.ops = &clk_regmap_divider_ops,
318cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
319cc132d11SAlexandre Mergnat 			&axg_hifi_pll_dco.hw
320cc132d11SAlexandre Mergnat 		},
32187173557SJerome Brunet 		.num_parents = 1,
32287173557SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
32387173557SJerome Brunet 	},
32487173557SJerome Brunet };
32587173557SJerome Brunet 
32605f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div2_div = {
32778b4af31SQiufang Dai 	.mult = 1,
32878b4af31SQiufang Dai 	.div = 2,
32978b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
33005f81440SJerome Brunet 		.name = "fclk_div2_div",
33178b4af31SQiufang Dai 		.ops = &clk_fixed_factor_ops,
332cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
33378b4af31SQiufang Dai 		.num_parents = 1,
33478b4af31SQiufang Dai 	},
33578b4af31SQiufang Dai };
33678b4af31SQiufang Dai 
33705f81440SJerome Brunet static struct clk_regmap axg_fclk_div2 = {
33805f81440SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
33905f81440SJerome Brunet 		.offset = HHI_MPLL_CNTL6,
34005f81440SJerome Brunet 		.bit_idx = 27,
34105f81440SJerome Brunet 	},
34205f81440SJerome Brunet 	.hw.init = &(struct clk_init_data){
34305f81440SJerome Brunet 		.name = "fclk_div2",
34405f81440SJerome Brunet 		.ops = &clk_regmap_gate_ops,
345cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
346cc132d11SAlexandre Mergnat 			&axg_fclk_div2_div.hw
347cc132d11SAlexandre Mergnat 		},
34805f81440SJerome Brunet 		.num_parents = 1,
349d6ee1e7eSJerome Brunet 		.flags = CLK_IS_CRITICAL,
35005f81440SJerome Brunet 	},
35105f81440SJerome Brunet };
35205f81440SJerome Brunet 
35305f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div3_div = {
35478b4af31SQiufang Dai 	.mult = 1,
35578b4af31SQiufang Dai 	.div = 3,
35678b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
35705f81440SJerome Brunet 		.name = "fclk_div3_div",
35878b4af31SQiufang Dai 		.ops = &clk_fixed_factor_ops,
359cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
36078b4af31SQiufang Dai 		.num_parents = 1,
36178b4af31SQiufang Dai 	},
36278b4af31SQiufang Dai };
36378b4af31SQiufang Dai 
36405f81440SJerome Brunet static struct clk_regmap axg_fclk_div3 = {
36505f81440SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
36605f81440SJerome Brunet 		.offset = HHI_MPLL_CNTL6,
36705f81440SJerome Brunet 		.bit_idx = 28,
36805f81440SJerome Brunet 	},
36905f81440SJerome Brunet 	.hw.init = &(struct clk_init_data){
37005f81440SJerome Brunet 		.name = "fclk_div3",
37105f81440SJerome Brunet 		.ops = &clk_regmap_gate_ops,
372cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
373cc132d11SAlexandre Mergnat 			&axg_fclk_div3_div.hw
374cc132d11SAlexandre Mergnat 		},
37505f81440SJerome Brunet 		.num_parents = 1,
376d6ee1e7eSJerome Brunet 		/*
377d6ee1e7eSJerome Brunet 		 * FIXME:
378d6ee1e7eSJerome Brunet 		 * This clock, as fdiv2, is used by the SCPI FW and is required
379d6ee1e7eSJerome Brunet 		 * by the platform to operate correctly.
380d6ee1e7eSJerome Brunet 		 * Until the following condition are met, we need this clock to
381d6ee1e7eSJerome Brunet 		 * be marked as critical:
382d6ee1e7eSJerome Brunet 		 * a) The SCPI generic driver claims and enable all the clocks
383d6ee1e7eSJerome Brunet 		 *    it needs
384d6ee1e7eSJerome Brunet 		 * b) CCF has a clock hand-off mechanism to make the sure the
385d6ee1e7eSJerome Brunet 		 *    clock stays on until the proper driver comes along
386d6ee1e7eSJerome Brunet 		 */
387d6ee1e7eSJerome Brunet 		.flags = CLK_IS_CRITICAL,
38805f81440SJerome Brunet 	},
38905f81440SJerome Brunet };
39005f81440SJerome Brunet 
39105f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div4_div = {
39278b4af31SQiufang Dai 	.mult = 1,
39378b4af31SQiufang Dai 	.div = 4,
39478b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
39505f81440SJerome Brunet 		.name = "fclk_div4_div",
39678b4af31SQiufang Dai 		.ops = &clk_fixed_factor_ops,
397cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
39878b4af31SQiufang Dai 		.num_parents = 1,
39978b4af31SQiufang Dai 	},
40078b4af31SQiufang Dai };
40178b4af31SQiufang Dai 
40205f81440SJerome Brunet static struct clk_regmap axg_fclk_div4 = {
40305f81440SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
40405f81440SJerome Brunet 		.offset = HHI_MPLL_CNTL6,
40505f81440SJerome Brunet 		.bit_idx = 29,
40605f81440SJerome Brunet 	},
40705f81440SJerome Brunet 	.hw.init = &(struct clk_init_data){
40805f81440SJerome Brunet 		.name = "fclk_div4",
40905f81440SJerome Brunet 		.ops = &clk_regmap_gate_ops,
410cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
411cc132d11SAlexandre Mergnat 			&axg_fclk_div4_div.hw
412cc132d11SAlexandre Mergnat 		},
41305f81440SJerome Brunet 		.num_parents = 1,
41405f81440SJerome Brunet 	},
41505f81440SJerome Brunet };
41605f81440SJerome Brunet 
41705f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div5_div = {
41878b4af31SQiufang Dai 	.mult = 1,
41978b4af31SQiufang Dai 	.div = 5,
42078b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
42105f81440SJerome Brunet 		.name = "fclk_div5_div",
42278b4af31SQiufang Dai 		.ops = &clk_fixed_factor_ops,
423cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_fixed_pll.hw },
42478b4af31SQiufang Dai 		.num_parents = 1,
42578b4af31SQiufang Dai 	},
42678b4af31SQiufang Dai };
42778b4af31SQiufang Dai 
42805f81440SJerome Brunet static struct clk_regmap axg_fclk_div5 = {
42905f81440SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
43005f81440SJerome Brunet 		.offset = HHI_MPLL_CNTL6,
43105f81440SJerome Brunet 		.bit_idx = 30,
43205f81440SJerome Brunet 	},
43305f81440SJerome Brunet 	.hw.init = &(struct clk_init_data){
43405f81440SJerome Brunet 		.name = "fclk_div5",
43505f81440SJerome Brunet 		.ops = &clk_regmap_gate_ops,
436cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
437cc132d11SAlexandre Mergnat 			&axg_fclk_div5_div.hw
438cc132d11SAlexandre Mergnat 		},
43905f81440SJerome Brunet 		.num_parents = 1,
44005f81440SJerome Brunet 	},
44105f81440SJerome Brunet };
44205f81440SJerome Brunet 
44305f81440SJerome Brunet static struct clk_fixed_factor axg_fclk_div7_div = {
44478b4af31SQiufang Dai 	.mult = 1,
44578b4af31SQiufang Dai 	.div = 7,
44678b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
44705f81440SJerome Brunet 		.name = "fclk_div7_div",
44878b4af31SQiufang Dai 		.ops = &clk_fixed_factor_ops,
449cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
450cc132d11SAlexandre Mergnat 			&axg_fixed_pll.hw
451cc132d11SAlexandre Mergnat 		},
45278b4af31SQiufang Dai 		.num_parents = 1,
45378b4af31SQiufang Dai 	},
45478b4af31SQiufang Dai };
45578b4af31SQiufang Dai 
45605f81440SJerome Brunet static struct clk_regmap axg_fclk_div7 = {
45705f81440SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
45805f81440SJerome Brunet 		.offset = HHI_MPLL_CNTL6,
45905f81440SJerome Brunet 		.bit_idx = 31,
46005f81440SJerome Brunet 	},
46105f81440SJerome Brunet 	.hw.init = &(struct clk_init_data){
46205f81440SJerome Brunet 		.name = "fclk_div7",
46305f81440SJerome Brunet 		.ops = &clk_regmap_gate_ops,
464cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
465cc132d11SAlexandre Mergnat 			&axg_fclk_div7_div.hw
466cc132d11SAlexandre Mergnat 		},
46705f81440SJerome Brunet 		.num_parents = 1,
46805f81440SJerome Brunet 	},
46905f81440SJerome Brunet };
47005f81440SJerome Brunet 
471513b67acSJerome Brunet static struct clk_regmap axg_mpll_prediv = {
472513b67acSJerome Brunet 	.data = &(struct clk_regmap_div_data){
473513b67acSJerome Brunet 		.offset = HHI_MPLL_CNTL5,
474513b67acSJerome Brunet 		.shift = 12,
475513b67acSJerome Brunet 		.width = 1,
476513b67acSJerome Brunet 	},
477513b67acSJerome Brunet 	.hw.init = &(struct clk_init_data){
478513b67acSJerome Brunet 		.name = "mpll_prediv",
479513b67acSJerome Brunet 		.ops = &clk_regmap_divider_ro_ops,
480cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
481cc132d11SAlexandre Mergnat 			&axg_fixed_pll.hw
482cc132d11SAlexandre Mergnat 		},
483513b67acSJerome Brunet 		.num_parents = 1,
484513b67acSJerome Brunet 	},
485513b67acSJerome Brunet };
486513b67acSJerome Brunet 
487d610b54fSJerome Brunet static struct clk_regmap axg_mpll0_div = {
488c763e61aSJerome Brunet 	.data = &(struct meson_clk_mpll_data){
48978b4af31SQiufang Dai 		.sdm = {
49078b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL7,
49178b4af31SQiufang Dai 			.shift   = 0,
49278b4af31SQiufang Dai 			.width   = 14,
49378b4af31SQiufang Dai 		},
49478b4af31SQiufang Dai 		.sdm_en = {
49578b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL7,
49678b4af31SQiufang Dai 			.shift   = 15,
49778b4af31SQiufang Dai 			.width	 = 1,
49878b4af31SQiufang Dai 		},
49978b4af31SQiufang Dai 		.n2 = {
50078b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL7,
50178b4af31SQiufang Dai 			.shift   = 16,
50278b4af31SQiufang Dai 			.width   = 9,
50378b4af31SQiufang Dai 		},
5046c00e7b7SJerome Brunet 		.misc = {
5056c00e7b7SJerome Brunet 			.reg_off = HHI_PLL_TOP_MISC,
5066c00e7b7SJerome Brunet 			.shift   = 0,
5076c00e7b7SJerome Brunet 			.width	 = 1,
5086c00e7b7SJerome Brunet 		},
50978b4af31SQiufang Dai 		.lock = &meson_clk_lock,
510de1ca2d0SJerome Brunet 		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
511c763e61aSJerome Brunet 	},
51278b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
513d610b54fSJerome Brunet 		.name = "mpll0_div",
51478b4af31SQiufang Dai 		.ops = &meson_clk_mpll_ops,
515cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
516cc132d11SAlexandre Mergnat 			&axg_mpll_prediv.hw
517cc132d11SAlexandre Mergnat 		},
51878b4af31SQiufang Dai 		.num_parents = 1,
51978b4af31SQiufang Dai 	},
52078b4af31SQiufang Dai };
52178b4af31SQiufang Dai 
522d610b54fSJerome Brunet static struct clk_regmap axg_mpll0 = {
523d610b54fSJerome Brunet 	.data = &(struct clk_regmap_gate_data){
524d610b54fSJerome Brunet 		.offset = HHI_MPLL_CNTL7,
525d610b54fSJerome Brunet 		.bit_idx = 14,
526d610b54fSJerome Brunet 	},
527d610b54fSJerome Brunet 	.hw.init = &(struct clk_init_data){
528d610b54fSJerome Brunet 		.name = "mpll0",
529d610b54fSJerome Brunet 		.ops = &clk_regmap_gate_ops,
530cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
531cc132d11SAlexandre Mergnat 			&axg_mpll0_div.hw
532cc132d11SAlexandre Mergnat 		},
533d610b54fSJerome Brunet 		.num_parents = 1,
534d610b54fSJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
535d610b54fSJerome Brunet 	},
536d610b54fSJerome Brunet };
537d610b54fSJerome Brunet 
538d610b54fSJerome Brunet static struct clk_regmap axg_mpll1_div = {
539c763e61aSJerome Brunet 	.data = &(struct meson_clk_mpll_data){
54078b4af31SQiufang Dai 		.sdm = {
54178b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL8,
54278b4af31SQiufang Dai 			.shift   = 0,
54378b4af31SQiufang Dai 			.width   = 14,
54478b4af31SQiufang Dai 		},
54578b4af31SQiufang Dai 		.sdm_en = {
54678b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL8,
54778b4af31SQiufang Dai 			.shift   = 15,
54878b4af31SQiufang Dai 			.width	 = 1,
54978b4af31SQiufang Dai 		},
55078b4af31SQiufang Dai 		.n2 = {
55178b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL8,
55278b4af31SQiufang Dai 			.shift   = 16,
55378b4af31SQiufang Dai 			.width   = 9,
55478b4af31SQiufang Dai 		},
5556c00e7b7SJerome Brunet 		.misc = {
5566c00e7b7SJerome Brunet 			.reg_off = HHI_PLL_TOP_MISC,
5576c00e7b7SJerome Brunet 			.shift   = 1,
5586c00e7b7SJerome Brunet 			.width	 = 1,
5596c00e7b7SJerome Brunet 		},
56078b4af31SQiufang Dai 		.lock = &meson_clk_lock,
561de1ca2d0SJerome Brunet 		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
562c763e61aSJerome Brunet 	},
56378b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
564d610b54fSJerome Brunet 		.name = "mpll1_div",
56578b4af31SQiufang Dai 		.ops = &meson_clk_mpll_ops,
566cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
567cc132d11SAlexandre Mergnat 			&axg_mpll_prediv.hw
568cc132d11SAlexandre Mergnat 		},
56978b4af31SQiufang Dai 		.num_parents = 1,
57078b4af31SQiufang Dai 	},
57178b4af31SQiufang Dai };
57278b4af31SQiufang Dai 
573d610b54fSJerome Brunet static struct clk_regmap axg_mpll1 = {
574d610b54fSJerome Brunet 	.data = &(struct clk_regmap_gate_data){
575d610b54fSJerome Brunet 		.offset = HHI_MPLL_CNTL8,
576d610b54fSJerome Brunet 		.bit_idx = 14,
577d610b54fSJerome Brunet 	},
578d610b54fSJerome Brunet 	.hw.init = &(struct clk_init_data){
579d610b54fSJerome Brunet 		.name = "mpll1",
580d610b54fSJerome Brunet 		.ops = &clk_regmap_gate_ops,
581cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
582cc132d11SAlexandre Mergnat 			&axg_mpll1_div.hw
583cc132d11SAlexandre Mergnat 		},
584d610b54fSJerome Brunet 		.num_parents = 1,
585d610b54fSJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
586d610b54fSJerome Brunet 	},
587d610b54fSJerome Brunet };
588d610b54fSJerome Brunet 
589d610b54fSJerome Brunet static struct clk_regmap axg_mpll2_div = {
590c763e61aSJerome Brunet 	.data = &(struct meson_clk_mpll_data){
59178b4af31SQiufang Dai 		.sdm = {
59278b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL9,
59378b4af31SQiufang Dai 			.shift   = 0,
59478b4af31SQiufang Dai 			.width   = 14,
59578b4af31SQiufang Dai 		},
59678b4af31SQiufang Dai 		.sdm_en = {
59778b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL9,
59878b4af31SQiufang Dai 			.shift   = 15,
59978b4af31SQiufang Dai 			.width	 = 1,
60078b4af31SQiufang Dai 		},
60178b4af31SQiufang Dai 		.n2 = {
60278b4af31SQiufang Dai 			.reg_off = HHI_MPLL_CNTL9,
60378b4af31SQiufang Dai 			.shift   = 16,
60478b4af31SQiufang Dai 			.width   = 9,
60578b4af31SQiufang Dai 		},
606dc4e62d3SJerome Brunet 		.ssen = {
607dc4e62d3SJerome Brunet 			.reg_off = HHI_MPLL_CNTL,
608dc4e62d3SJerome Brunet 			.shift   = 25,
609dc4e62d3SJerome Brunet 			.width	 = 1,
610dc4e62d3SJerome Brunet 		},
6116c00e7b7SJerome Brunet 		.misc = {
6126c00e7b7SJerome Brunet 			.reg_off = HHI_PLL_TOP_MISC,
6136c00e7b7SJerome Brunet 			.shift   = 2,
6146c00e7b7SJerome Brunet 			.width	 = 1,
6156c00e7b7SJerome Brunet 		},
61678b4af31SQiufang Dai 		.lock = &meson_clk_lock,
617de1ca2d0SJerome Brunet 		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
618c763e61aSJerome Brunet 	},
61978b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
620d610b54fSJerome Brunet 		.name = "mpll2_div",
62178b4af31SQiufang Dai 		.ops = &meson_clk_mpll_ops,
622cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
623cc132d11SAlexandre Mergnat 			&axg_mpll_prediv.hw
624cc132d11SAlexandre Mergnat 		},
62578b4af31SQiufang Dai 		.num_parents = 1,
62678b4af31SQiufang Dai 	},
62778b4af31SQiufang Dai };
62878b4af31SQiufang Dai 
629d610b54fSJerome Brunet static struct clk_regmap axg_mpll2 = {
630d610b54fSJerome Brunet 	.data = &(struct clk_regmap_gate_data){
631d610b54fSJerome Brunet 		.offset = HHI_MPLL_CNTL9,
632d610b54fSJerome Brunet 		.bit_idx = 14,
633d610b54fSJerome Brunet 	},
634d610b54fSJerome Brunet 	.hw.init = &(struct clk_init_data){
635d610b54fSJerome Brunet 		.name = "mpll2",
636d610b54fSJerome Brunet 		.ops = &clk_regmap_gate_ops,
637cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
638cc132d11SAlexandre Mergnat 			&axg_mpll2_div.hw
639cc132d11SAlexandre Mergnat 		},
640d610b54fSJerome Brunet 		.num_parents = 1,
641d610b54fSJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
642d610b54fSJerome Brunet 	},
643d610b54fSJerome Brunet };
644d610b54fSJerome Brunet 
645d610b54fSJerome Brunet static struct clk_regmap axg_mpll3_div = {
646c763e61aSJerome Brunet 	.data = &(struct meson_clk_mpll_data){
64778b4af31SQiufang Dai 		.sdm = {
64878b4af31SQiufang Dai 			.reg_off = HHI_MPLL3_CNTL0,
64978b4af31SQiufang Dai 			.shift   = 12,
65078b4af31SQiufang Dai 			.width   = 14,
65178b4af31SQiufang Dai 		},
65278b4af31SQiufang Dai 		.sdm_en = {
65378b4af31SQiufang Dai 			.reg_off = HHI_MPLL3_CNTL0,
65478b4af31SQiufang Dai 			.shift   = 11,
65578b4af31SQiufang Dai 			.width	 = 1,
65678b4af31SQiufang Dai 		},
65778b4af31SQiufang Dai 		.n2 = {
65878b4af31SQiufang Dai 			.reg_off = HHI_MPLL3_CNTL0,
65978b4af31SQiufang Dai 			.shift   = 2,
66078b4af31SQiufang Dai 			.width   = 9,
66178b4af31SQiufang Dai 		},
6626c00e7b7SJerome Brunet 		.misc = {
6636c00e7b7SJerome Brunet 			.reg_off = HHI_PLL_TOP_MISC,
6646c00e7b7SJerome Brunet 			.shift   = 3,
6656c00e7b7SJerome Brunet 			.width	 = 1,
6666c00e7b7SJerome Brunet 		},
66778b4af31SQiufang Dai 		.lock = &meson_clk_lock,
668de1ca2d0SJerome Brunet 		.flags = CLK_MESON_MPLL_ROUND_CLOSEST,
669c763e61aSJerome Brunet 	},
67078b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
671d610b54fSJerome Brunet 		.name = "mpll3_div",
67278b4af31SQiufang Dai 		.ops = &meson_clk_mpll_ops,
673cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
674cc132d11SAlexandre Mergnat 			&axg_mpll_prediv.hw
675cc132d11SAlexandre Mergnat 		},
67678b4af31SQiufang Dai 		.num_parents = 1,
67778b4af31SQiufang Dai 	},
67878b4af31SQiufang Dai };
67978b4af31SQiufang Dai 
680d610b54fSJerome Brunet static struct clk_regmap axg_mpll3 = {
681d610b54fSJerome Brunet 	.data = &(struct clk_regmap_gate_data){
682d610b54fSJerome Brunet 		.offset = HHI_MPLL3_CNTL0,
683d610b54fSJerome Brunet 		.bit_idx = 0,
684d610b54fSJerome Brunet 	},
685d610b54fSJerome Brunet 	.hw.init = &(struct clk_init_data){
686d610b54fSJerome Brunet 		.name = "mpll3",
687d610b54fSJerome Brunet 		.ops = &clk_regmap_gate_ops,
688cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
689cc132d11SAlexandre Mergnat 			&axg_mpll3_div.hw
690cc132d11SAlexandre Mergnat 		},
691d610b54fSJerome Brunet 		.num_parents = 1,
692d610b54fSJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
693d610b54fSJerome Brunet 	},
694d610b54fSJerome Brunet };
695d610b54fSJerome Brunet 
696dd601dbcSJerome Brunet static const struct pll_params_table axg_pcie_pll_params_table[] = {
697cddcb20bSYixun Lan 	{
698cddcb20bSYixun Lan 		.m = 200,
699cddcb20bSYixun Lan 		.n = 3,
700cddcb20bSYixun Lan 	},
701cddcb20bSYixun Lan 	{ /* sentinel */ },
702cddcb20bSYixun Lan };
703cddcb20bSYixun Lan 
704cddcb20bSYixun Lan static const struct reg_sequence axg_pcie_init_regs[] = {
705cddcb20bSYixun Lan 	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x0084a2aa },
706cddcb20bSYixun Lan 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0xb75020be },
707cddcb20bSYixun Lan 	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x0a47488e },
708cddcb20bSYixun Lan 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0xc000004d },
709cddcb20bSYixun Lan 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x00078000 },
710cddcb20bSYixun Lan 	{ .reg = HHI_PCIE_PLL_CNTL6,	.def = 0x002323c6 },
71187173557SJerome Brunet 	{ .reg = HHI_PCIE_PLL_CNTL,     .def = 0x400106c8 },
712cddcb20bSYixun Lan };
713cddcb20bSYixun Lan 
71487173557SJerome Brunet static struct clk_regmap axg_pcie_pll_dco = {
715cddcb20bSYixun Lan 	.data = &(struct meson_clk_pll_data){
716e40c7e3cSJerome Brunet 		.en = {
717e40c7e3cSJerome Brunet 			.reg_off = HHI_PCIE_PLL_CNTL,
718e40c7e3cSJerome Brunet 			.shift   = 30,
719e40c7e3cSJerome Brunet 			.width   = 1,
720e40c7e3cSJerome Brunet 		},
721cddcb20bSYixun Lan 		.m = {
722cddcb20bSYixun Lan 			.reg_off = HHI_PCIE_PLL_CNTL,
723cddcb20bSYixun Lan 			.shift   = 0,
724cddcb20bSYixun Lan 			.width   = 9,
725cddcb20bSYixun Lan 		},
726cddcb20bSYixun Lan 		.n = {
727cddcb20bSYixun Lan 			.reg_off = HHI_PCIE_PLL_CNTL,
728cddcb20bSYixun Lan 			.shift   = 9,
729cddcb20bSYixun Lan 			.width   = 5,
730cddcb20bSYixun Lan 		},
731cddcb20bSYixun Lan 		.frac = {
732cddcb20bSYixun Lan 			.reg_off = HHI_PCIE_PLL_CNTL1,
733cddcb20bSYixun Lan 			.shift   = 0,
734cddcb20bSYixun Lan 			.width   = 12,
735cddcb20bSYixun Lan 		},
736cddcb20bSYixun Lan 		.l = {
737cddcb20bSYixun Lan 			.reg_off = HHI_PCIE_PLL_CNTL,
738cddcb20bSYixun Lan 			.shift   = 31,
739cddcb20bSYixun Lan 			.width   = 1,
740cddcb20bSYixun Lan 		},
741cddcb20bSYixun Lan 		.rst = {
742cddcb20bSYixun Lan 			.reg_off = HHI_PCIE_PLL_CNTL,
743cddcb20bSYixun Lan 			.shift   = 29,
744cddcb20bSYixun Lan 			.width   = 1,
745cddcb20bSYixun Lan 		},
746dd601dbcSJerome Brunet 		.table = axg_pcie_pll_params_table,
747cddcb20bSYixun Lan 		.init_regs = axg_pcie_init_regs,
748cddcb20bSYixun Lan 		.init_count = ARRAY_SIZE(axg_pcie_init_regs),
749cddcb20bSYixun Lan 	},
750cddcb20bSYixun Lan 	.hw.init = &(struct clk_init_data){
75187173557SJerome Brunet 		.name = "pcie_pll_dco",
752cddcb20bSYixun Lan 		.ops = &meson_clk_pll_ops,
753cc132d11SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
754cc132d11SAlexandre Mergnat 			.fw_name = "xtal",
755cc132d11SAlexandre Mergnat 		},
756cddcb20bSYixun Lan 		.num_parents = 1,
757cddcb20bSYixun Lan 	},
758cddcb20bSYixun Lan };
759cddcb20bSYixun Lan 
76087173557SJerome Brunet static struct clk_regmap axg_pcie_pll_od = {
76187173557SJerome Brunet 	.data = &(struct clk_regmap_div_data){
76287173557SJerome Brunet 		.offset = HHI_PCIE_PLL_CNTL,
76387173557SJerome Brunet 		.shift = 16,
76487173557SJerome Brunet 		.width = 2,
76587173557SJerome Brunet 		.flags = CLK_DIVIDER_POWER_OF_TWO,
76687173557SJerome Brunet 	},
76787173557SJerome Brunet 	.hw.init = &(struct clk_init_data){
76887173557SJerome Brunet 		.name = "pcie_pll_od",
76987173557SJerome Brunet 		.ops = &clk_regmap_divider_ops,
770cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
771cc132d11SAlexandre Mergnat 			&axg_pcie_pll_dco.hw
772cc132d11SAlexandre Mergnat 		},
77387173557SJerome Brunet 		.num_parents = 1,
77487173557SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
77587173557SJerome Brunet 	},
77687173557SJerome Brunet };
77787173557SJerome Brunet 
77887173557SJerome Brunet static struct clk_regmap axg_pcie_pll = {
77987173557SJerome Brunet 	.data = &(struct clk_regmap_div_data){
78087173557SJerome Brunet 		.offset = HHI_PCIE_PLL_CNTL6,
78187173557SJerome Brunet 		.shift = 6,
78287173557SJerome Brunet 		.width = 2,
78387173557SJerome Brunet 		.flags = CLK_DIVIDER_POWER_OF_TWO,
78487173557SJerome Brunet 	},
78587173557SJerome Brunet 	.hw.init = &(struct clk_init_data){
78687173557SJerome Brunet 		.name = "pcie_pll",
78787173557SJerome Brunet 		.ops = &clk_regmap_divider_ops,
788cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
789cc132d11SAlexandre Mergnat 			&axg_pcie_pll_od.hw
790cc132d11SAlexandre Mergnat 		},
79187173557SJerome Brunet 		.num_parents = 1,
79287173557SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
79387173557SJerome Brunet 	},
79487173557SJerome Brunet };
79587173557SJerome Brunet 
796cddcb20bSYixun Lan static struct clk_regmap axg_pcie_mux = {
797cddcb20bSYixun Lan 	.data = &(struct clk_regmap_mux_data){
798cddcb20bSYixun Lan 		.offset = HHI_PCIE_PLL_CNTL6,
799cddcb20bSYixun Lan 		.mask = 0x1,
800cddcb20bSYixun Lan 		.shift = 2,
80169b93104SYixun Lan 		/* skip the parent mpll3, reserved for debug */
80269b93104SYixun Lan 		.table = (u32[]){ 1 },
803cddcb20bSYixun Lan 	},
804cddcb20bSYixun Lan 	.hw.init = &(struct clk_init_data){
805cddcb20bSYixun Lan 		.name = "pcie_mux",
806cddcb20bSYixun Lan 		.ops = &clk_regmap_mux_ops,
807cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_pll.hw },
80869b93104SYixun Lan 		.num_parents = 1,
809cddcb20bSYixun Lan 		.flags = CLK_SET_RATE_PARENT,
810cddcb20bSYixun Lan 	},
811cddcb20bSYixun Lan };
812cddcb20bSYixun Lan 
813cddcb20bSYixun Lan static struct clk_regmap axg_pcie_ref = {
814cddcb20bSYixun Lan 	.data = &(struct clk_regmap_mux_data){
815cddcb20bSYixun Lan 		.offset = HHI_PCIE_PLL_CNTL6,
816cddcb20bSYixun Lan 		.mask = 0x1,
817cddcb20bSYixun Lan 		.shift = 1,
818cddcb20bSYixun Lan 		/* skip the parent 0, reserved for debug */
819cddcb20bSYixun Lan 		.table = (u32[]){ 1 },
820cddcb20bSYixun Lan 	},
821cddcb20bSYixun Lan 	.hw.init = &(struct clk_init_data){
822cddcb20bSYixun Lan 		.name = "pcie_ref",
823cddcb20bSYixun Lan 		.ops = &clk_regmap_mux_ops,
824cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_mux.hw },
825cddcb20bSYixun Lan 		.num_parents = 1,
826cddcb20bSYixun Lan 		.flags = CLK_SET_RATE_PARENT,
827cddcb20bSYixun Lan 	},
828cddcb20bSYixun Lan };
829cddcb20bSYixun Lan 
830cddcb20bSYixun Lan static struct clk_regmap axg_pcie_cml_en0 = {
831cddcb20bSYixun Lan 	.data = &(struct clk_regmap_gate_data){
832cddcb20bSYixun Lan 		.offset = HHI_PCIE_PLL_CNTL6,
833cddcb20bSYixun Lan 		.bit_idx = 4,
834cddcb20bSYixun Lan 	},
835cddcb20bSYixun Lan 	.hw.init = &(struct clk_init_data) {
836cddcb20bSYixun Lan 		.name = "pcie_cml_en0",
837cddcb20bSYixun Lan 		.ops = &clk_regmap_gate_ops,
838cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
839cddcb20bSYixun Lan 		.num_parents = 1,
840cddcb20bSYixun Lan 		.flags = CLK_SET_RATE_PARENT,
841cddcb20bSYixun Lan 
842cddcb20bSYixun Lan 	},
843cddcb20bSYixun Lan };
844cddcb20bSYixun Lan 
845cddcb20bSYixun Lan static struct clk_regmap axg_pcie_cml_en1 = {
846cddcb20bSYixun Lan 	.data = &(struct clk_regmap_gate_data){
847cddcb20bSYixun Lan 		.offset = HHI_PCIE_PLL_CNTL6,
848cddcb20bSYixun Lan 		.bit_idx = 3,
849cddcb20bSYixun Lan 	},
850cddcb20bSYixun Lan 	.hw.init = &(struct clk_init_data) {
851cddcb20bSYixun Lan 		.name = "pcie_cml_en1",
852cddcb20bSYixun Lan 		.ops = &clk_regmap_gate_ops,
853cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &axg_pcie_ref.hw },
854cddcb20bSYixun Lan 		.num_parents = 1,
855cddcb20bSYixun Lan 		.flags = CLK_SET_RATE_PARENT,
856cddcb20bSYixun Lan 	},
857cddcb20bSYixun Lan };
858cddcb20bSYixun Lan 
85978b4af31SQiufang Dai static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
860cc132d11SAlexandre Mergnat static const struct clk_parent_data clk81_parent_data[] = {
861cc132d11SAlexandre Mergnat 	{ .fw_name = "xtal", },
862cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div7.hw },
863cc132d11SAlexandre Mergnat 	{ .hw = &axg_mpll1.hw },
864cc132d11SAlexandre Mergnat 	{ .hw = &axg_mpll2.hw },
865cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div4.hw },
866cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div3.hw },
867cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div5.hw },
86878b4af31SQiufang Dai };
86978b4af31SQiufang Dai 
8702513a28cSJerome Brunet static struct clk_regmap axg_mpeg_clk_sel = {
8712513a28cSJerome Brunet 	.data = &(struct clk_regmap_mux_data){
8722513a28cSJerome Brunet 		.offset = HHI_MPEG_CLK_CNTL,
87378b4af31SQiufang Dai 		.mask = 0x7,
87478b4af31SQiufang Dai 		.shift = 12,
87578b4af31SQiufang Dai 		.table = mux_table_clk81,
8762513a28cSJerome Brunet 	},
87778b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
87878b4af31SQiufang Dai 		.name = "mpeg_clk_sel",
8792513a28cSJerome Brunet 		.ops = &clk_regmap_mux_ro_ops,
880cc132d11SAlexandre Mergnat 		.parent_data = clk81_parent_data,
881cc132d11SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(clk81_parent_data),
88278b4af31SQiufang Dai 	},
88378b4af31SQiufang Dai };
88478b4af31SQiufang Dai 
885f06ddd28SJerome Brunet static struct clk_regmap axg_mpeg_clk_div = {
886f06ddd28SJerome Brunet 	.data = &(struct clk_regmap_div_data){
887f06ddd28SJerome Brunet 		.offset = HHI_MPEG_CLK_CNTL,
88878b4af31SQiufang Dai 		.shift = 0,
88978b4af31SQiufang Dai 		.width = 7,
890f06ddd28SJerome Brunet 	},
89178b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
89278b4af31SQiufang Dai 		.name = "mpeg_clk_div",
893f06ddd28SJerome Brunet 		.ops = &clk_regmap_divider_ops,
894cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
895cc132d11SAlexandre Mergnat 			&axg_mpeg_clk_sel.hw
896cc132d11SAlexandre Mergnat 		},
89778b4af31SQiufang Dai 		.num_parents = 1,
89878b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
89978b4af31SQiufang Dai 	},
90078b4af31SQiufang Dai };
90178b4af31SQiufang Dai 
9027f9768a5SJerome Brunet static struct clk_regmap axg_clk81 = {
9037f9768a5SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
9047f9768a5SJerome Brunet 		.offset = HHI_MPEG_CLK_CNTL,
90578b4af31SQiufang Dai 		.bit_idx = 7,
9067f9768a5SJerome Brunet 	},
90778b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
90878b4af31SQiufang Dai 		.name = "clk81",
9097f9768a5SJerome Brunet 		.ops = &clk_regmap_gate_ops,
910cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
911cc132d11SAlexandre Mergnat 			&axg_mpeg_clk_div.hw
912cc132d11SAlexandre Mergnat 		},
91378b4af31SQiufang Dai 		.num_parents = 1,
91478b4af31SQiufang Dai 		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
91578b4af31SQiufang Dai 	},
91678b4af31SQiufang Dai };
91778b4af31SQiufang Dai 
918cc132d11SAlexandre Mergnat static const struct clk_parent_data axg_sd_emmc_clk0_parent_data[] = {
919cc132d11SAlexandre Mergnat 	{ .fw_name = "xtal", },
920cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div2.hw },
921cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div3.hw },
922cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div5.hw },
923cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div7.hw },
92478b4af31SQiufang Dai 	/*
92578b4af31SQiufang Dai 	 * Following these parent clocks, we should also have had mpll2, mpll3
92678b4af31SQiufang Dai 	 * and gp0_pll but these clocks are too precious to be used here. All
92778b4af31SQiufang Dai 	 * the necessary rates for MMC and NAND operation can be acheived using
92878b4af31SQiufang Dai 	 * xtal or fclk_div clocks
92978b4af31SQiufang Dai 	 */
93078b4af31SQiufang Dai };
93178b4af31SQiufang Dai 
93278b4af31SQiufang Dai /* SDcard clock */
9332513a28cSJerome Brunet static struct clk_regmap axg_sd_emmc_b_clk0_sel = {
9342513a28cSJerome Brunet 	.data = &(struct clk_regmap_mux_data){
9352513a28cSJerome Brunet 		.offset = HHI_SD_EMMC_CLK_CNTL,
93678b4af31SQiufang Dai 		.mask = 0x7,
93778b4af31SQiufang Dai 		.shift = 25,
9382513a28cSJerome Brunet 	},
93978b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data) {
94078b4af31SQiufang Dai 		.name = "sd_emmc_b_clk0_sel",
9412513a28cSJerome Brunet 		.ops = &clk_regmap_mux_ops,
942cc132d11SAlexandre Mergnat 		.parent_data = axg_sd_emmc_clk0_parent_data,
943cc132d11SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
94478b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
94578b4af31SQiufang Dai 	},
94678b4af31SQiufang Dai };
94778b4af31SQiufang Dai 
948f06ddd28SJerome Brunet static struct clk_regmap axg_sd_emmc_b_clk0_div = {
949f06ddd28SJerome Brunet 	.data = &(struct clk_regmap_div_data){
950f06ddd28SJerome Brunet 		.offset = HHI_SD_EMMC_CLK_CNTL,
95178b4af31SQiufang Dai 		.shift = 16,
95278b4af31SQiufang Dai 		.width = 7,
95378b4af31SQiufang Dai 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
954f06ddd28SJerome Brunet 	},
95578b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data) {
95678b4af31SQiufang Dai 		.name = "sd_emmc_b_clk0_div",
957f06ddd28SJerome Brunet 		.ops = &clk_regmap_divider_ops,
958cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
959cc132d11SAlexandre Mergnat 			&axg_sd_emmc_b_clk0_sel.hw
960cc132d11SAlexandre Mergnat 		},
96178b4af31SQiufang Dai 		.num_parents = 1,
96278b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
96378b4af31SQiufang Dai 	},
96478b4af31SQiufang Dai };
96578b4af31SQiufang Dai 
9667f9768a5SJerome Brunet static struct clk_regmap axg_sd_emmc_b_clk0 = {
9677f9768a5SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
9687f9768a5SJerome Brunet 		.offset = HHI_SD_EMMC_CLK_CNTL,
96978b4af31SQiufang Dai 		.bit_idx = 23,
9707f9768a5SJerome Brunet 	},
97178b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
97278b4af31SQiufang Dai 		.name = "sd_emmc_b_clk0",
9737f9768a5SJerome Brunet 		.ops = &clk_regmap_gate_ops,
974cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
975cc132d11SAlexandre Mergnat 			&axg_sd_emmc_b_clk0_div.hw
976cc132d11SAlexandre Mergnat 		},
97778b4af31SQiufang Dai 		.num_parents = 1,
97878b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
97978b4af31SQiufang Dai 	},
98078b4af31SQiufang Dai };
98178b4af31SQiufang Dai 
98278b4af31SQiufang Dai /* EMMC/NAND clock */
9832513a28cSJerome Brunet static struct clk_regmap axg_sd_emmc_c_clk0_sel = {
9842513a28cSJerome Brunet 	.data = &(struct clk_regmap_mux_data){
9852513a28cSJerome Brunet 		.offset = HHI_NAND_CLK_CNTL,
98678b4af31SQiufang Dai 		.mask = 0x7,
98778b4af31SQiufang Dai 		.shift = 9,
9882513a28cSJerome Brunet 	},
98978b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data) {
99078b4af31SQiufang Dai 		.name = "sd_emmc_c_clk0_sel",
9912513a28cSJerome Brunet 		.ops = &clk_regmap_mux_ops,
992cc132d11SAlexandre Mergnat 		.parent_data = axg_sd_emmc_clk0_parent_data,
993cc132d11SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(axg_sd_emmc_clk0_parent_data),
99478b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
99578b4af31SQiufang Dai 	},
99678b4af31SQiufang Dai };
99778b4af31SQiufang Dai 
998f06ddd28SJerome Brunet static struct clk_regmap axg_sd_emmc_c_clk0_div = {
999f06ddd28SJerome Brunet 	.data = &(struct clk_regmap_div_data){
1000f06ddd28SJerome Brunet 		.offset = HHI_NAND_CLK_CNTL,
100178b4af31SQiufang Dai 		.shift = 0,
100278b4af31SQiufang Dai 		.width = 7,
100378b4af31SQiufang Dai 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1004f06ddd28SJerome Brunet 	},
100578b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data) {
100678b4af31SQiufang Dai 		.name = "sd_emmc_c_clk0_div",
1007f06ddd28SJerome Brunet 		.ops = &clk_regmap_divider_ops,
1008cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
1009cc132d11SAlexandre Mergnat 			&axg_sd_emmc_c_clk0_sel.hw
1010cc132d11SAlexandre Mergnat 		},
101178b4af31SQiufang Dai 		.num_parents = 1,
101278b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
101378b4af31SQiufang Dai 	},
101478b4af31SQiufang Dai };
101578b4af31SQiufang Dai 
10167f9768a5SJerome Brunet static struct clk_regmap axg_sd_emmc_c_clk0 = {
10177f9768a5SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
10187f9768a5SJerome Brunet 		.offset = HHI_NAND_CLK_CNTL,
101978b4af31SQiufang Dai 		.bit_idx = 7,
10207f9768a5SJerome Brunet 	},
102178b4af31SQiufang Dai 	.hw.init = &(struct clk_init_data){
102278b4af31SQiufang Dai 		.name = "sd_emmc_c_clk0",
10237f9768a5SJerome Brunet 		.ops = &clk_regmap_gate_ops,
1024cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
1025cc132d11SAlexandre Mergnat 			&axg_sd_emmc_c_clk0_div.hw
1026cc132d11SAlexandre Mergnat 		},
102778b4af31SQiufang Dai 		.num_parents = 1,
102878b4af31SQiufang Dai 		.flags = CLK_SET_RATE_PARENT,
102978b4af31SQiufang Dai 	},
103078b4af31SQiufang Dai };
103178b4af31SQiufang Dai 
103214ebb315SNeil Armstrong /* VPU Clock */
103314ebb315SNeil Armstrong 
103414ebb315SNeil Armstrong static const struct clk_hw *axg_vpu_parent_hws[] = {
103514ebb315SNeil Armstrong 	&axg_fclk_div4.hw,
103614ebb315SNeil Armstrong 	&axg_fclk_div3.hw,
103714ebb315SNeil Armstrong 	&axg_fclk_div5.hw,
103814ebb315SNeil Armstrong 	&axg_fclk_div7.hw,
103914ebb315SNeil Armstrong };
104014ebb315SNeil Armstrong 
104114ebb315SNeil Armstrong static struct clk_regmap axg_vpu_0_sel = {
104214ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
104314ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
104414ebb315SNeil Armstrong 		.mask = 0x3,
104514ebb315SNeil Armstrong 		.shift = 9,
104614ebb315SNeil Armstrong 	},
104714ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
104814ebb315SNeil Armstrong 		.name = "vpu_0_sel",
104914ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
105014ebb315SNeil Armstrong 		.parent_hws = axg_vpu_parent_hws,
105114ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
105214ebb315SNeil Armstrong 		/* We need a specific parent for VPU clock source, let it be set in DT */
105314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
105414ebb315SNeil Armstrong 	},
105514ebb315SNeil Armstrong };
105614ebb315SNeil Armstrong 
105714ebb315SNeil Armstrong static struct clk_regmap axg_vpu_0_div = {
105814ebb315SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
105914ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
106014ebb315SNeil Armstrong 		.shift = 0,
106114ebb315SNeil Armstrong 		.width = 7,
106214ebb315SNeil Armstrong 	},
106314ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
106414ebb315SNeil Armstrong 		.name = "vpu_0_div",
106514ebb315SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
106614ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_sel.hw },
106714ebb315SNeil Armstrong 		.num_parents = 1,
106814ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
106914ebb315SNeil Armstrong 	},
107014ebb315SNeil Armstrong };
107114ebb315SNeil Armstrong 
107214ebb315SNeil Armstrong static struct clk_regmap axg_vpu_0 = {
107314ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
107414ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
107514ebb315SNeil Armstrong 		.bit_idx = 8,
107614ebb315SNeil Armstrong 	},
107714ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
107814ebb315SNeil Armstrong 		.name = "vpu_0",
107914ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
108014ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_0_div.hw },
108114ebb315SNeil Armstrong 		.num_parents = 1,
108214ebb315SNeil Armstrong 		/*
108314ebb315SNeil Armstrong 		 * We want to avoid CCF to disable the VPU clock if
108414ebb315SNeil Armstrong 		 * display has been set by Bootloader
108514ebb315SNeil Armstrong 		 */
108614ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
108714ebb315SNeil Armstrong 	},
108814ebb315SNeil Armstrong };
108914ebb315SNeil Armstrong 
109014ebb315SNeil Armstrong static struct clk_regmap axg_vpu_1_sel = {
109114ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
109214ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
109314ebb315SNeil Armstrong 		.mask = 0x3,
109414ebb315SNeil Armstrong 		.shift = 25,
109514ebb315SNeil Armstrong 	},
109614ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
109714ebb315SNeil Armstrong 		.name = "vpu_1_sel",
109814ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
109914ebb315SNeil Armstrong 		.parent_hws = axg_vpu_parent_hws,
110014ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
110114ebb315SNeil Armstrong 		/* We need a specific parent for VPU clock source, let it be set in DT */
110214ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
110314ebb315SNeil Armstrong 	},
110414ebb315SNeil Armstrong };
110514ebb315SNeil Armstrong 
110614ebb315SNeil Armstrong static struct clk_regmap axg_vpu_1_div = {
110714ebb315SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
110814ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
110914ebb315SNeil Armstrong 		.shift = 16,
111014ebb315SNeil Armstrong 		.width = 7,
111114ebb315SNeil Armstrong 	},
111214ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
111314ebb315SNeil Armstrong 		.name = "vpu_1_div",
111414ebb315SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
111514ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_sel.hw },
111614ebb315SNeil Armstrong 		.num_parents = 1,
111714ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
111814ebb315SNeil Armstrong 	},
111914ebb315SNeil Armstrong };
112014ebb315SNeil Armstrong 
112114ebb315SNeil Armstrong static struct clk_regmap axg_vpu_1 = {
112214ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
112314ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
112414ebb315SNeil Armstrong 		.bit_idx = 24,
112514ebb315SNeil Armstrong 	},
112614ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
112714ebb315SNeil Armstrong 		.name = "vpu_1",
112814ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
112914ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vpu_1_div.hw },
113014ebb315SNeil Armstrong 		.num_parents = 1,
113114ebb315SNeil Armstrong 		/*
113214ebb315SNeil Armstrong 		 * We want to avoid CCF to disable the VPU clock if
113314ebb315SNeil Armstrong 		 * display has been set by Bootloader
113414ebb315SNeil Armstrong 		 */
113514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
113614ebb315SNeil Armstrong 	},
113714ebb315SNeil Armstrong };
113814ebb315SNeil Armstrong 
113914ebb315SNeil Armstrong static struct clk_regmap axg_vpu = {
114014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
114114ebb315SNeil Armstrong 		.offset = HHI_VPU_CLK_CNTL,
114214ebb315SNeil Armstrong 		.mask = 1,
114314ebb315SNeil Armstrong 		.shift = 31,
114414ebb315SNeil Armstrong 	},
114514ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
114614ebb315SNeil Armstrong 		.name = "vpu",
114714ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
114814ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
114914ebb315SNeil Armstrong 			&axg_vpu_0.hw,
115014ebb315SNeil Armstrong 			&axg_vpu_1.hw
115114ebb315SNeil Armstrong 		},
115214ebb315SNeil Armstrong 		.num_parents = 2,
115314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
115414ebb315SNeil Armstrong 	},
115514ebb315SNeil Armstrong };
115614ebb315SNeil Armstrong 
115714ebb315SNeil Armstrong /* VAPB Clock */
115814ebb315SNeil Armstrong 
115914ebb315SNeil Armstrong static struct clk_regmap axg_vapb_0_sel = {
116014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
116114ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
116214ebb315SNeil Armstrong 		.mask = 0x3,
116314ebb315SNeil Armstrong 		.shift = 9,
116414ebb315SNeil Armstrong 	},
116514ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
116614ebb315SNeil Armstrong 		.name = "vapb_0_sel",
116714ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
116814ebb315SNeil Armstrong 		.parent_hws = axg_vpu_parent_hws,
116914ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
117014ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
117114ebb315SNeil Armstrong 	},
117214ebb315SNeil Armstrong };
117314ebb315SNeil Armstrong 
117414ebb315SNeil Armstrong static struct clk_regmap axg_vapb_0_div = {
117514ebb315SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
117614ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
117714ebb315SNeil Armstrong 		.shift = 0,
117814ebb315SNeil Armstrong 		.width = 7,
117914ebb315SNeil Armstrong 	},
118014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
118114ebb315SNeil Armstrong 		.name = "vapb_0_div",
118214ebb315SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
118314ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
118414ebb315SNeil Armstrong 			&axg_vapb_0_sel.hw
118514ebb315SNeil Armstrong 		},
118614ebb315SNeil Armstrong 		.num_parents = 1,
118714ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
118814ebb315SNeil Armstrong 	},
118914ebb315SNeil Armstrong };
119014ebb315SNeil Armstrong 
119114ebb315SNeil Armstrong static struct clk_regmap axg_vapb_0 = {
119214ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
119314ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
119414ebb315SNeil Armstrong 		.bit_idx = 8,
119514ebb315SNeil Armstrong 	},
119614ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
119714ebb315SNeil Armstrong 		.name = "vapb_0",
119814ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
119914ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
120014ebb315SNeil Armstrong 			&axg_vapb_0_div.hw
120114ebb315SNeil Armstrong 		},
120214ebb315SNeil Armstrong 		.num_parents = 1,
120314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
120414ebb315SNeil Armstrong 	},
120514ebb315SNeil Armstrong };
120614ebb315SNeil Armstrong 
120714ebb315SNeil Armstrong static struct clk_regmap axg_vapb_1_sel = {
120814ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
120914ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
121014ebb315SNeil Armstrong 		.mask = 0x3,
121114ebb315SNeil Armstrong 		.shift = 25,
121214ebb315SNeil Armstrong 	},
121314ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
121414ebb315SNeil Armstrong 		.name = "vapb_1_sel",
121514ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
121614ebb315SNeil Armstrong 		.parent_hws = axg_vpu_parent_hws,
121714ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vpu_parent_hws),
121814ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
121914ebb315SNeil Armstrong 	},
122014ebb315SNeil Armstrong };
122114ebb315SNeil Armstrong 
122214ebb315SNeil Armstrong static struct clk_regmap axg_vapb_1_div = {
122314ebb315SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
122414ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
122514ebb315SNeil Armstrong 		.shift = 16,
122614ebb315SNeil Armstrong 		.width = 7,
122714ebb315SNeil Armstrong 	},
122814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
122914ebb315SNeil Armstrong 		.name = "vapb_1_div",
123014ebb315SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
123114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
123214ebb315SNeil Armstrong 			&axg_vapb_1_sel.hw
123314ebb315SNeil Armstrong 		},
123414ebb315SNeil Armstrong 		.num_parents = 1,
123514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
123614ebb315SNeil Armstrong 	},
123714ebb315SNeil Armstrong };
123814ebb315SNeil Armstrong 
123914ebb315SNeil Armstrong static struct clk_regmap axg_vapb_1 = {
124014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
124114ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
124214ebb315SNeil Armstrong 		.bit_idx = 24,
124314ebb315SNeil Armstrong 	},
124414ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
124514ebb315SNeil Armstrong 		.name = "vapb_1",
124614ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
124714ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
124814ebb315SNeil Armstrong 			&axg_vapb_1_div.hw
124914ebb315SNeil Armstrong 		},
125014ebb315SNeil Armstrong 		.num_parents = 1,
125114ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
125214ebb315SNeil Armstrong 	},
125314ebb315SNeil Armstrong };
125414ebb315SNeil Armstrong 
125514ebb315SNeil Armstrong static struct clk_regmap axg_vapb_sel = {
125614ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
125714ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
125814ebb315SNeil Armstrong 		.mask = 1,
125914ebb315SNeil Armstrong 		.shift = 31,
126014ebb315SNeil Armstrong 	},
126114ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
126214ebb315SNeil Armstrong 		.name = "vapb_sel",
126314ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
126414ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
126514ebb315SNeil Armstrong 			&axg_vapb_0.hw,
126614ebb315SNeil Armstrong 			&axg_vapb_1.hw
126714ebb315SNeil Armstrong 		},
126814ebb315SNeil Armstrong 		.num_parents = 2,
126914ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
127014ebb315SNeil Armstrong 	},
127114ebb315SNeil Armstrong };
127214ebb315SNeil Armstrong 
127314ebb315SNeil Armstrong static struct clk_regmap axg_vapb = {
127414ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
127514ebb315SNeil Armstrong 		.offset = HHI_VAPBCLK_CNTL,
127614ebb315SNeil Armstrong 		.bit_idx = 30,
127714ebb315SNeil Armstrong 	},
127814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
127914ebb315SNeil Armstrong 		.name = "vapb",
128014ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
128114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vapb_sel.hw },
128214ebb315SNeil Armstrong 		.num_parents = 1,
128314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
128414ebb315SNeil Armstrong 	},
128514ebb315SNeil Armstrong };
128614ebb315SNeil Armstrong 
128714ebb315SNeil Armstrong /* Video Clocks */
128814ebb315SNeil Armstrong 
128914ebb315SNeil Armstrong static const struct clk_hw *axg_vclk_parent_hws[] = {
129014ebb315SNeil Armstrong 	&axg_gp0_pll.hw,
129114ebb315SNeil Armstrong 	&axg_fclk_div4.hw,
129214ebb315SNeil Armstrong 	&axg_fclk_div3.hw,
129314ebb315SNeil Armstrong 	&axg_fclk_div5.hw,
129414ebb315SNeil Armstrong 	&axg_fclk_div2.hw,
129514ebb315SNeil Armstrong 	&axg_fclk_div7.hw,
129614ebb315SNeil Armstrong 	&axg_mpll1.hw,
129714ebb315SNeil Armstrong };
129814ebb315SNeil Armstrong 
129914ebb315SNeil Armstrong static struct clk_regmap axg_vclk_sel = {
130014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
130114ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
130214ebb315SNeil Armstrong 		.mask = 0x7,
130314ebb315SNeil Armstrong 		.shift = 16,
130414ebb315SNeil Armstrong 	},
130514ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
130614ebb315SNeil Armstrong 		.name = "vclk_sel",
130714ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
130814ebb315SNeil Armstrong 		.parent_hws = axg_vclk_parent_hws,
130914ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
131014ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
131114ebb315SNeil Armstrong 	},
131214ebb315SNeil Armstrong };
131314ebb315SNeil Armstrong 
131414ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_sel = {
131514ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
131614ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
131714ebb315SNeil Armstrong 		.mask = 0x7,
131814ebb315SNeil Armstrong 		.shift = 16,
131914ebb315SNeil Armstrong 	},
132014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
132114ebb315SNeil Armstrong 		.name = "vclk2_sel",
132214ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
132314ebb315SNeil Armstrong 		.parent_hws = axg_vclk_parent_hws,
132414ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vclk_parent_hws),
132514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
132614ebb315SNeil Armstrong 	},
132714ebb315SNeil Armstrong };
132814ebb315SNeil Armstrong 
132914ebb315SNeil Armstrong static struct clk_regmap axg_vclk_input = {
133014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
133114ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_DIV,
133214ebb315SNeil Armstrong 		.bit_idx = 16,
133314ebb315SNeil Armstrong 	},
133414ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
133514ebb315SNeil Armstrong 		.name = "vclk_input",
133614ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
133714ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk_sel.hw },
133814ebb315SNeil Armstrong 		.num_parents = 1,
133914ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
134014ebb315SNeil Armstrong 	},
134114ebb315SNeil Armstrong };
134214ebb315SNeil Armstrong 
134314ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_input = {
134414ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
134514ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_DIV,
134614ebb315SNeil Armstrong 		.bit_idx = 16,
134714ebb315SNeil Armstrong 	},
134814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
134914ebb315SNeil Armstrong 		.name = "vclk2_input",
135014ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
135114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2_sel.hw },
135214ebb315SNeil Armstrong 		.num_parents = 1,
135314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
135414ebb315SNeil Armstrong 	},
135514ebb315SNeil Armstrong };
135614ebb315SNeil Armstrong 
135714ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div = {
135814ebb315SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
135914ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_DIV,
136014ebb315SNeil Armstrong 		.shift = 0,
136114ebb315SNeil Armstrong 		.width = 8,
136214ebb315SNeil Armstrong 	},
136314ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
136414ebb315SNeil Armstrong 		.name = "vclk_div",
136514ebb315SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
136614ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
136714ebb315SNeil Armstrong 			&axg_vclk_input.hw
136814ebb315SNeil Armstrong 		},
136914ebb315SNeil Armstrong 		.num_parents = 1,
137014ebb315SNeil Armstrong 		.flags = CLK_GET_RATE_NOCACHE,
137114ebb315SNeil Armstrong 	},
137214ebb315SNeil Armstrong };
137314ebb315SNeil Armstrong 
137414ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div = {
137514ebb315SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
137614ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_DIV,
137714ebb315SNeil Armstrong 		.shift = 0,
137814ebb315SNeil Armstrong 		.width = 8,
137914ebb315SNeil Armstrong 	},
138014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
138114ebb315SNeil Armstrong 		.name = "vclk2_div",
138214ebb315SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
138314ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
138414ebb315SNeil Armstrong 			&axg_vclk2_input.hw
138514ebb315SNeil Armstrong 		},
138614ebb315SNeil Armstrong 		.num_parents = 1,
138714ebb315SNeil Armstrong 		.flags = CLK_GET_RATE_NOCACHE,
138814ebb315SNeil Armstrong 	},
138914ebb315SNeil Armstrong };
139014ebb315SNeil Armstrong 
139114ebb315SNeil Armstrong static struct clk_regmap axg_vclk = {
139214ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
139314ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
139414ebb315SNeil Armstrong 		.bit_idx = 19,
139514ebb315SNeil Armstrong 	},
139614ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
139714ebb315SNeil Armstrong 		.name = "vclk",
139814ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
139914ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk_div.hw },
140014ebb315SNeil Armstrong 		.num_parents = 1,
140114ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
140214ebb315SNeil Armstrong 	},
140314ebb315SNeil Armstrong };
140414ebb315SNeil Armstrong 
140514ebb315SNeil Armstrong static struct clk_regmap axg_vclk2 = {
140614ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
140714ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
140814ebb315SNeil Armstrong 		.bit_idx = 19,
140914ebb315SNeil Armstrong 	},
141014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
141114ebb315SNeil Armstrong 		.name = "vclk2",
141214ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
141314ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2_div.hw },
141414ebb315SNeil Armstrong 		.num_parents = 1,
141514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
141614ebb315SNeil Armstrong 	},
141714ebb315SNeil Armstrong };
141814ebb315SNeil Armstrong 
141914ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div1 = {
142014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
142114ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
142214ebb315SNeil Armstrong 		.bit_idx = 0,
142314ebb315SNeil Armstrong 	},
142414ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
142514ebb315SNeil Armstrong 		.name = "vclk_div1",
142614ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
142714ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
142814ebb315SNeil Armstrong 		.num_parents = 1,
142914ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
143014ebb315SNeil Armstrong 	},
143114ebb315SNeil Armstrong };
143214ebb315SNeil Armstrong 
143314ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div2_en = {
143414ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
143514ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
143614ebb315SNeil Armstrong 		.bit_idx = 1,
143714ebb315SNeil Armstrong 	},
143814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
143914ebb315SNeil Armstrong 		.name = "vclk_div2_en",
144014ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
144114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
144214ebb315SNeil Armstrong 		.num_parents = 1,
144314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
144414ebb315SNeil Armstrong 	},
144514ebb315SNeil Armstrong };
144614ebb315SNeil Armstrong 
144714ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div4_en = {
144814ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
144914ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
145014ebb315SNeil Armstrong 		.bit_idx = 2,
145114ebb315SNeil Armstrong 	},
145214ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
145314ebb315SNeil Armstrong 		.name = "vclk_div4_en",
145414ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
145514ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
145614ebb315SNeil Armstrong 		.num_parents = 1,
145714ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
145814ebb315SNeil Armstrong 	},
145914ebb315SNeil Armstrong };
146014ebb315SNeil Armstrong 
146114ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div6_en = {
146214ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
146314ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
146414ebb315SNeil Armstrong 		.bit_idx = 3,
146514ebb315SNeil Armstrong 	},
146614ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
146714ebb315SNeil Armstrong 		.name = "vclk_div6_en",
146814ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
146914ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
147014ebb315SNeil Armstrong 		.num_parents = 1,
147114ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
147214ebb315SNeil Armstrong 	},
147314ebb315SNeil Armstrong };
147414ebb315SNeil Armstrong 
147514ebb315SNeil Armstrong static struct clk_regmap axg_vclk_div12_en = {
147614ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
147714ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL,
147814ebb315SNeil Armstrong 		.bit_idx = 4,
147914ebb315SNeil Armstrong 	},
148014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
148114ebb315SNeil Armstrong 		.name = "vclk_div12_en",
148214ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
148314ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk.hw },
148414ebb315SNeil Armstrong 		.num_parents = 1,
148514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
148614ebb315SNeil Armstrong 	},
148714ebb315SNeil Armstrong };
148814ebb315SNeil Armstrong 
148914ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div1 = {
149014ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
149114ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
149214ebb315SNeil Armstrong 		.bit_idx = 0,
149314ebb315SNeil Armstrong 	},
149414ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
149514ebb315SNeil Armstrong 		.name = "vclk2_div1",
149614ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
149714ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
149814ebb315SNeil Armstrong 		.num_parents = 1,
149914ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
150014ebb315SNeil Armstrong 	},
150114ebb315SNeil Armstrong };
150214ebb315SNeil Armstrong 
150314ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div2_en = {
150414ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
150514ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
150614ebb315SNeil Armstrong 		.bit_idx = 1,
150714ebb315SNeil Armstrong 	},
150814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
150914ebb315SNeil Armstrong 		.name = "vclk2_div2_en",
151014ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
151114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
151214ebb315SNeil Armstrong 		.num_parents = 1,
151314ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
151414ebb315SNeil Armstrong 	},
151514ebb315SNeil Armstrong };
151614ebb315SNeil Armstrong 
151714ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div4_en = {
151814ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
151914ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
152014ebb315SNeil Armstrong 		.bit_idx = 2,
152114ebb315SNeil Armstrong 	},
152214ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
152314ebb315SNeil Armstrong 		.name = "vclk2_div4_en",
152414ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
152514ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
152614ebb315SNeil Armstrong 		.num_parents = 1,
152714ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
152814ebb315SNeil Armstrong 	},
152914ebb315SNeil Armstrong };
153014ebb315SNeil Armstrong 
153114ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div6_en = {
153214ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
153314ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
153414ebb315SNeil Armstrong 		.bit_idx = 3,
153514ebb315SNeil Armstrong 	},
153614ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
153714ebb315SNeil Armstrong 		.name = "vclk2_div6_en",
153814ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
153914ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
154014ebb315SNeil Armstrong 		.num_parents = 1,
154114ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
154214ebb315SNeil Armstrong 	},
154314ebb315SNeil Armstrong };
154414ebb315SNeil Armstrong 
154514ebb315SNeil Armstrong static struct clk_regmap axg_vclk2_div12_en = {
154614ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
154714ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_CNTL,
154814ebb315SNeil Armstrong 		.bit_idx = 4,
154914ebb315SNeil Armstrong 	},
155014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
155114ebb315SNeil Armstrong 		.name = "vclk2_div12_en",
155214ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
155314ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) { &axg_vclk2.hw },
155414ebb315SNeil Armstrong 		.num_parents = 1,
155514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
155614ebb315SNeil Armstrong 	},
155714ebb315SNeil Armstrong };
155814ebb315SNeil Armstrong 
155914ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div2 = {
156014ebb315SNeil Armstrong 	.mult = 1,
156114ebb315SNeil Armstrong 	.div = 2,
156214ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
156314ebb315SNeil Armstrong 		.name = "vclk_div2",
156414ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
156514ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
156614ebb315SNeil Armstrong 			&axg_vclk_div2_en.hw
156714ebb315SNeil Armstrong 		},
156814ebb315SNeil Armstrong 		.num_parents = 1,
156914ebb315SNeil Armstrong 	},
157014ebb315SNeil Armstrong };
157114ebb315SNeil Armstrong 
157214ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div4 = {
157314ebb315SNeil Armstrong 	.mult = 1,
157414ebb315SNeil Armstrong 	.div = 4,
157514ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
157614ebb315SNeil Armstrong 		.name = "vclk_div4",
157714ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
157814ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
157914ebb315SNeil Armstrong 			&axg_vclk_div4_en.hw
158014ebb315SNeil Armstrong 		},
158114ebb315SNeil Armstrong 		.num_parents = 1,
158214ebb315SNeil Armstrong 	},
158314ebb315SNeil Armstrong };
158414ebb315SNeil Armstrong 
158514ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div6 = {
158614ebb315SNeil Armstrong 	.mult = 1,
158714ebb315SNeil Armstrong 	.div = 6,
158814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
158914ebb315SNeil Armstrong 		.name = "vclk_div6",
159014ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
159114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
159214ebb315SNeil Armstrong 			&axg_vclk_div6_en.hw
159314ebb315SNeil Armstrong 		},
159414ebb315SNeil Armstrong 		.num_parents = 1,
159514ebb315SNeil Armstrong 	},
159614ebb315SNeil Armstrong };
159714ebb315SNeil Armstrong 
159814ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk_div12 = {
159914ebb315SNeil Armstrong 	.mult = 1,
160014ebb315SNeil Armstrong 	.div = 12,
160114ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
160214ebb315SNeil Armstrong 		.name = "vclk_div12",
160314ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
160414ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
160514ebb315SNeil Armstrong 			&axg_vclk_div12_en.hw
160614ebb315SNeil Armstrong 		},
160714ebb315SNeil Armstrong 		.num_parents = 1,
160814ebb315SNeil Armstrong 	},
160914ebb315SNeil Armstrong };
161014ebb315SNeil Armstrong 
161114ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div2 = {
161214ebb315SNeil Armstrong 	.mult = 1,
161314ebb315SNeil Armstrong 	.div = 2,
161414ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
161514ebb315SNeil Armstrong 		.name = "vclk2_div2",
161614ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
161714ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
161814ebb315SNeil Armstrong 			&axg_vclk2_div2_en.hw
161914ebb315SNeil Armstrong 		},
162014ebb315SNeil Armstrong 		.num_parents = 1,
162114ebb315SNeil Armstrong 	},
162214ebb315SNeil Armstrong };
162314ebb315SNeil Armstrong 
162414ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div4 = {
162514ebb315SNeil Armstrong 	.mult = 1,
162614ebb315SNeil Armstrong 	.div = 4,
162714ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
162814ebb315SNeil Armstrong 		.name = "vclk2_div4",
162914ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
163014ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
163114ebb315SNeil Armstrong 			&axg_vclk2_div4_en.hw
163214ebb315SNeil Armstrong 		},
163314ebb315SNeil Armstrong 		.num_parents = 1,
163414ebb315SNeil Armstrong 	},
163514ebb315SNeil Armstrong };
163614ebb315SNeil Armstrong 
163714ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div6 = {
163814ebb315SNeil Armstrong 	.mult = 1,
163914ebb315SNeil Armstrong 	.div = 6,
164014ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
164114ebb315SNeil Armstrong 		.name = "vclk2_div6",
164214ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
164314ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
164414ebb315SNeil Armstrong 			&axg_vclk2_div6_en.hw
164514ebb315SNeil Armstrong 		},
164614ebb315SNeil Armstrong 		.num_parents = 1,
164714ebb315SNeil Armstrong 	},
164814ebb315SNeil Armstrong };
164914ebb315SNeil Armstrong 
165014ebb315SNeil Armstrong static struct clk_fixed_factor axg_vclk2_div12 = {
165114ebb315SNeil Armstrong 	.mult = 1,
165214ebb315SNeil Armstrong 	.div = 12,
165314ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
165414ebb315SNeil Armstrong 		.name = "vclk2_div12",
165514ebb315SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
165614ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
165714ebb315SNeil Armstrong 			&axg_vclk2_div12_en.hw
165814ebb315SNeil Armstrong 		},
165914ebb315SNeil Armstrong 		.num_parents = 1,
166014ebb315SNeil Armstrong 	},
166114ebb315SNeil Armstrong };
166214ebb315SNeil Armstrong 
166314ebb315SNeil Armstrong static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
166414ebb315SNeil Armstrong static const struct clk_hw *axg_cts_parent_hws[] = {
166514ebb315SNeil Armstrong 	&axg_vclk_div1.hw,
166614ebb315SNeil Armstrong 	&axg_vclk_div2.hw,
166714ebb315SNeil Armstrong 	&axg_vclk_div4.hw,
166814ebb315SNeil Armstrong 	&axg_vclk_div6.hw,
166914ebb315SNeil Armstrong 	&axg_vclk_div12.hw,
167014ebb315SNeil Armstrong 	&axg_vclk2_div1.hw,
167114ebb315SNeil Armstrong 	&axg_vclk2_div2.hw,
167214ebb315SNeil Armstrong 	&axg_vclk2_div4.hw,
167314ebb315SNeil Armstrong 	&axg_vclk2_div6.hw,
167414ebb315SNeil Armstrong 	&axg_vclk2_div12.hw,
167514ebb315SNeil Armstrong };
167614ebb315SNeil Armstrong 
167714ebb315SNeil Armstrong static struct clk_regmap axg_cts_encl_sel = {
167814ebb315SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
167914ebb315SNeil Armstrong 		.offset = HHI_VIID_CLK_DIV,
168014ebb315SNeil Armstrong 		.mask = 0xf,
168114ebb315SNeil Armstrong 		.shift = 12,
168214ebb315SNeil Armstrong 		.table = mux_table_cts_sel,
168314ebb315SNeil Armstrong 	},
168414ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data){
168514ebb315SNeil Armstrong 		.name = "cts_encl_sel",
168614ebb315SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
168714ebb315SNeil Armstrong 		.parent_hws = axg_cts_parent_hws,
168814ebb315SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_cts_parent_hws),
168914ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
169014ebb315SNeil Armstrong 	},
169114ebb315SNeil Armstrong };
169214ebb315SNeil Armstrong 
169314ebb315SNeil Armstrong static struct clk_regmap axg_cts_encl = {
169414ebb315SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
169514ebb315SNeil Armstrong 		.offset = HHI_VID_CLK_CNTL2,
169614ebb315SNeil Armstrong 		.bit_idx = 3,
169714ebb315SNeil Armstrong 	},
169814ebb315SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
169914ebb315SNeil Armstrong 		.name = "cts_encl",
170014ebb315SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
170114ebb315SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
170214ebb315SNeil Armstrong 			&axg_cts_encl_sel.hw
170314ebb315SNeil Armstrong 		},
170414ebb315SNeil Armstrong 		.num_parents = 1,
170514ebb315SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
170614ebb315SNeil Armstrong 	},
170714ebb315SNeil Armstrong };
170814ebb315SNeil Armstrong 
1709e80d8510SNeil Armstrong /* MIPI DSI Host Clock */
1710e80d8510SNeil Armstrong 
1711e80d8510SNeil Armstrong static u32 mux_table_axg_vdin_meas[]    = { 0, 1, 2, 3, 6, 7 };
1712e80d8510SNeil Armstrong static const struct clk_parent_data axg_vdin_meas_parent_data[] = {
1713e80d8510SNeil Armstrong 	{ .fw_name = "xtal", },
1714e80d8510SNeil Armstrong 	{ .hw = &axg_fclk_div4.hw },
1715e80d8510SNeil Armstrong 	{ .hw = &axg_fclk_div3.hw },
1716e80d8510SNeil Armstrong 	{ .hw = &axg_fclk_div5.hw },
1717e80d8510SNeil Armstrong 	{ .hw = &axg_fclk_div2.hw },
1718e80d8510SNeil Armstrong 	{ .hw = &axg_fclk_div7.hw },
1719e80d8510SNeil Armstrong };
1720e80d8510SNeil Armstrong 
1721e80d8510SNeil Armstrong static struct clk_regmap axg_vdin_meas_sel = {
1722e80d8510SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
1723e80d8510SNeil Armstrong 		.offset = HHI_VDIN_MEAS_CLK_CNTL,
1724e80d8510SNeil Armstrong 		.mask = 0x7,
1725e80d8510SNeil Armstrong 		.shift = 21,
1726e80d8510SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
1727e80d8510SNeil Armstrong 		.table = mux_table_axg_vdin_meas,
1728e80d8510SNeil Armstrong 	},
1729e80d8510SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1730e80d8510SNeil Armstrong 		.name = "vdin_meas_sel",
1731e80d8510SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
1732e80d8510SNeil Armstrong 		.parent_data = axg_vdin_meas_parent_data,
1733e80d8510SNeil Armstrong 		.num_parents = ARRAY_SIZE(axg_vdin_meas_parent_data),
1734e80d8510SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
1735e80d8510SNeil Armstrong 	},
1736e80d8510SNeil Armstrong };
1737e80d8510SNeil Armstrong 
1738e80d8510SNeil Armstrong static struct clk_regmap axg_vdin_meas_div = {
1739e80d8510SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
1740e80d8510SNeil Armstrong 		.offset = HHI_VDIN_MEAS_CLK_CNTL,
1741e80d8510SNeil Armstrong 		.shift = 12,
1742e80d8510SNeil Armstrong 		.width = 7,
1743e80d8510SNeil Armstrong 	},
1744e80d8510SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1745e80d8510SNeil Armstrong 		.name = "vdin_meas_div",
1746e80d8510SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
1747e80d8510SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
1748e80d8510SNeil Armstrong 			&axg_vdin_meas_sel.hw },
1749e80d8510SNeil Armstrong 		.num_parents = 1,
1750e80d8510SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
1751e80d8510SNeil Armstrong 	},
1752e80d8510SNeil Armstrong };
1753e80d8510SNeil Armstrong 
1754e80d8510SNeil Armstrong static struct clk_regmap axg_vdin_meas = {
1755e80d8510SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1756e80d8510SNeil Armstrong 		.offset = HHI_VDIN_MEAS_CLK_CNTL,
1757e80d8510SNeil Armstrong 		.bit_idx = 20,
1758e80d8510SNeil Armstrong 	},
1759e80d8510SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1760e80d8510SNeil Armstrong 		.name = "vdin_meas",
1761e80d8510SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
1762e80d8510SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
1763e80d8510SNeil Armstrong 			&axg_vdin_meas_div.hw },
1764e80d8510SNeil Armstrong 		.num_parents = 1,
1765e80d8510SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
1766e80d8510SNeil Armstrong 	},
1767e80d8510SNeil Armstrong };
1768e80d8510SNeil Armstrong 
17697df533a7SJerome Brunet static u32 mux_table_gen_clk[]	= { 0, 4, 5, 6, 7, 8,
17707df533a7SJerome Brunet 				    9, 10, 11, 13, 14, };
1771cc132d11SAlexandre Mergnat static const struct clk_parent_data gen_clk_parent_data[] = {
1772cc132d11SAlexandre Mergnat 	{ .fw_name = "xtal", },
1773cc132d11SAlexandre Mergnat 	{ .hw = &axg_hifi_pll.hw },
1774cc132d11SAlexandre Mergnat 	{ .hw = &axg_mpll0.hw },
1775cc132d11SAlexandre Mergnat 	{ .hw = &axg_mpll1.hw },
1776cc132d11SAlexandre Mergnat 	{ .hw = &axg_mpll2.hw },
1777cc132d11SAlexandre Mergnat 	{ .hw = &axg_mpll3.hw },
1778cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div4.hw },
1779cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div3.hw },
1780cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div5.hw },
1781cc132d11SAlexandre Mergnat 	{ .hw = &axg_fclk_div7.hw },
1782cc132d11SAlexandre Mergnat 	{ .hw = &axg_gp0_pll.hw },
17837df533a7SJerome Brunet };
17847df533a7SJerome Brunet 
17857df533a7SJerome Brunet static struct clk_regmap axg_gen_clk_sel = {
17867df533a7SJerome Brunet 	.data = &(struct clk_regmap_mux_data){
17877df533a7SJerome Brunet 		.offset = HHI_GEN_CLK_CNTL,
17887df533a7SJerome Brunet 		.mask = 0xf,
17897df533a7SJerome Brunet 		.shift = 12,
17907df533a7SJerome Brunet 		.table = mux_table_gen_clk,
17917df533a7SJerome Brunet 	},
17927df533a7SJerome Brunet 	.hw.init = &(struct clk_init_data){
17937df533a7SJerome Brunet 		.name = "gen_clk_sel",
17947df533a7SJerome Brunet 		.ops = &clk_regmap_mux_ops,
17957df533a7SJerome Brunet 		/*
17967df533a7SJerome Brunet 		 * bits 15:12 selects from 14 possible parents:
17977df533a7SJerome Brunet 		 * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
17987df533a7SJerome Brunet 		 * hifi_pll, mpll0, mpll1, mpll2, mpll3, fdiv4,
17997df533a7SJerome Brunet 		 * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
18007df533a7SJerome Brunet 		 */
1801cc132d11SAlexandre Mergnat 		.parent_data = gen_clk_parent_data,
1802cc132d11SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(gen_clk_parent_data),
18037df533a7SJerome Brunet 	},
18047df533a7SJerome Brunet };
18057df533a7SJerome Brunet 
18067df533a7SJerome Brunet static struct clk_regmap axg_gen_clk_div = {
18077df533a7SJerome Brunet 	.data = &(struct clk_regmap_div_data){
18087df533a7SJerome Brunet 		.offset = HHI_GEN_CLK_CNTL,
18097df533a7SJerome Brunet 		.shift = 0,
18107df533a7SJerome Brunet 		.width = 11,
18117df533a7SJerome Brunet 	},
18127df533a7SJerome Brunet 	.hw.init = &(struct clk_init_data){
18137df533a7SJerome Brunet 		.name = "gen_clk_div",
18147df533a7SJerome Brunet 		.ops = &clk_regmap_divider_ops,
1815cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
1816cc132d11SAlexandre Mergnat 			&axg_gen_clk_sel.hw
1817cc132d11SAlexandre Mergnat 		},
18187df533a7SJerome Brunet 		.num_parents = 1,
18197df533a7SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
18207df533a7SJerome Brunet 	},
18217df533a7SJerome Brunet };
18227df533a7SJerome Brunet 
18237df533a7SJerome Brunet static struct clk_regmap axg_gen_clk = {
18247df533a7SJerome Brunet 	.data = &(struct clk_regmap_gate_data){
18257df533a7SJerome Brunet 		.offset = HHI_GEN_CLK_CNTL,
18267df533a7SJerome Brunet 		.bit_idx = 7,
18277df533a7SJerome Brunet 	},
18287df533a7SJerome Brunet 	.hw.init = &(struct clk_init_data){
18297df533a7SJerome Brunet 		.name = "gen_clk",
18307df533a7SJerome Brunet 		.ops = &clk_regmap_gate_ops,
1831cc132d11SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
1832cc132d11SAlexandre Mergnat 			&axg_gen_clk_div.hw
1833cc132d11SAlexandre Mergnat 		},
18347df533a7SJerome Brunet 		.num_parents = 1,
18357df533a7SJerome Brunet 		.flags = CLK_SET_RATE_PARENT,
18367df533a7SJerome Brunet 	},
18377df533a7SJerome Brunet };
18387df533a7SJerome Brunet 
18393a36044eSAlexandre Mergnat #define MESON_GATE(_name, _reg, _bit) \
18403a36044eSAlexandre Mergnat 	MESON_PCLK(_name, _reg, _bit, &axg_clk81.hw)
18413a36044eSAlexandre Mergnat 
184278b4af31SQiufang Dai /* Everything Else (EE) domain gates */
184378b4af31SQiufang Dai static MESON_GATE(axg_ddr, HHI_GCLK_MPEG0, 0);
184478b4af31SQiufang Dai static MESON_GATE(axg_audio_locker, HHI_GCLK_MPEG0, 2);
184578b4af31SQiufang Dai static MESON_GATE(axg_mipi_dsi_host, HHI_GCLK_MPEG0, 3);
184678b4af31SQiufang Dai static MESON_GATE(axg_isa, HHI_GCLK_MPEG0, 5);
184778b4af31SQiufang Dai static MESON_GATE(axg_pl301, HHI_GCLK_MPEG0, 6);
184878b4af31SQiufang Dai static MESON_GATE(axg_periphs, HHI_GCLK_MPEG0, 7);
184978b4af31SQiufang Dai static MESON_GATE(axg_spicc_0, HHI_GCLK_MPEG0, 8);
185078b4af31SQiufang Dai static MESON_GATE(axg_i2c, HHI_GCLK_MPEG0, 9);
185178b4af31SQiufang Dai static MESON_GATE(axg_rng0, HHI_GCLK_MPEG0, 12);
185278b4af31SQiufang Dai static MESON_GATE(axg_uart0, HHI_GCLK_MPEG0, 13);
185378b4af31SQiufang Dai static MESON_GATE(axg_mipi_dsi_phy, HHI_GCLK_MPEG0, 14);
185478b4af31SQiufang Dai static MESON_GATE(axg_spicc_1, HHI_GCLK_MPEG0, 15);
185578b4af31SQiufang Dai static MESON_GATE(axg_pcie_a, HHI_GCLK_MPEG0, 16);
185678b4af31SQiufang Dai static MESON_GATE(axg_pcie_b, HHI_GCLK_MPEG0, 17);
185778b4af31SQiufang Dai static MESON_GATE(axg_hiu_reg, HHI_GCLK_MPEG0, 19);
185878b4af31SQiufang Dai static MESON_GATE(axg_assist_misc, HHI_GCLK_MPEG0, 23);
185978b4af31SQiufang Dai static MESON_GATE(axg_emmc_b, HHI_GCLK_MPEG0, 25);
186078b4af31SQiufang Dai static MESON_GATE(axg_emmc_c, HHI_GCLK_MPEG0, 26);
186178b4af31SQiufang Dai static MESON_GATE(axg_dma, HHI_GCLK_MPEG0, 27);
186278b4af31SQiufang Dai static MESON_GATE(axg_spi, HHI_GCLK_MPEG0, 30);
186378b4af31SQiufang Dai 
186478b4af31SQiufang Dai static MESON_GATE(axg_audio, HHI_GCLK_MPEG1, 0);
186578b4af31SQiufang Dai static MESON_GATE(axg_eth_core, HHI_GCLK_MPEG1, 3);
186678b4af31SQiufang Dai static MESON_GATE(axg_uart1, HHI_GCLK_MPEG1, 16);
186778b4af31SQiufang Dai static MESON_GATE(axg_g2d, HHI_GCLK_MPEG1, 20);
186878b4af31SQiufang Dai static MESON_GATE(axg_usb0, HHI_GCLK_MPEG1, 21);
186978b4af31SQiufang Dai static MESON_GATE(axg_usb1, HHI_GCLK_MPEG1, 22);
187078b4af31SQiufang Dai static MESON_GATE(axg_reset, HHI_GCLK_MPEG1, 23);
187178b4af31SQiufang Dai static MESON_GATE(axg_usb_general, HHI_GCLK_MPEG1, 26);
187278b4af31SQiufang Dai static MESON_GATE(axg_ahb_arb0, HHI_GCLK_MPEG1, 29);
187378b4af31SQiufang Dai static MESON_GATE(axg_efuse, HHI_GCLK_MPEG1, 30);
187478b4af31SQiufang Dai static MESON_GATE(axg_boot_rom, HHI_GCLK_MPEG1, 31);
187578b4af31SQiufang Dai 
187678b4af31SQiufang Dai static MESON_GATE(axg_ahb_data_bus, HHI_GCLK_MPEG2, 1);
187778b4af31SQiufang Dai static MESON_GATE(axg_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
187878b4af31SQiufang Dai static MESON_GATE(axg_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
187978b4af31SQiufang Dai static MESON_GATE(axg_usb0_to_ddr, HHI_GCLK_MPEG2, 9);
188078b4af31SQiufang Dai static MESON_GATE(axg_mmc_pclk, HHI_GCLK_MPEG2, 11);
188178b4af31SQiufang Dai static MESON_GATE(axg_vpu_intr, HHI_GCLK_MPEG2, 25);
188278b4af31SQiufang Dai static MESON_GATE(axg_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
188378b4af31SQiufang Dai static MESON_GATE(axg_gic, HHI_GCLK_MPEG2, 30);
188478b4af31SQiufang Dai 
188578b4af31SQiufang Dai /* Always On (AO) domain gates */
188678b4af31SQiufang Dai 
188778b4af31SQiufang Dai static MESON_GATE(axg_ao_media_cpu, HHI_GCLK_AO, 0);
188878b4af31SQiufang Dai static MESON_GATE(axg_ao_ahb_sram, HHI_GCLK_AO, 1);
188978b4af31SQiufang Dai static MESON_GATE(axg_ao_ahb_bus, HHI_GCLK_AO, 2);
189078b4af31SQiufang Dai static MESON_GATE(axg_ao_iface, HHI_GCLK_AO, 3);
189178b4af31SQiufang Dai static MESON_GATE(axg_ao_i2c, HHI_GCLK_AO, 4);
189278b4af31SQiufang Dai 
189378b4af31SQiufang Dai /* Array of all clocks provided by this provider */
189478b4af31SQiufang Dai 
1895141fbc27SNeil Armstrong static struct clk_hw *axg_hw_clks[] = {
189678b4af31SQiufang Dai 	[CLKID_SYS_PLL]			= &axg_sys_pll.hw,
189778b4af31SQiufang Dai 	[CLKID_FIXED_PLL]		= &axg_fixed_pll.hw,
189878b4af31SQiufang Dai 	[CLKID_FCLK_DIV2]		= &axg_fclk_div2.hw,
189978b4af31SQiufang Dai 	[CLKID_FCLK_DIV3]		= &axg_fclk_div3.hw,
190078b4af31SQiufang Dai 	[CLKID_FCLK_DIV4]		= &axg_fclk_div4.hw,
190178b4af31SQiufang Dai 	[CLKID_FCLK_DIV5]		= &axg_fclk_div5.hw,
190278b4af31SQiufang Dai 	[CLKID_FCLK_DIV7]		= &axg_fclk_div7.hw,
190378b4af31SQiufang Dai 	[CLKID_GP0_PLL]			= &axg_gp0_pll.hw,
190478b4af31SQiufang Dai 	[CLKID_MPEG_SEL]		= &axg_mpeg_clk_sel.hw,
190578b4af31SQiufang Dai 	[CLKID_MPEG_DIV]		= &axg_mpeg_clk_div.hw,
190678b4af31SQiufang Dai 	[CLKID_CLK81]			= &axg_clk81.hw,
190778b4af31SQiufang Dai 	[CLKID_MPLL0]			= &axg_mpll0.hw,
190878b4af31SQiufang Dai 	[CLKID_MPLL1]			= &axg_mpll1.hw,
190978b4af31SQiufang Dai 	[CLKID_MPLL2]			= &axg_mpll2.hw,
191078b4af31SQiufang Dai 	[CLKID_MPLL3]			= &axg_mpll3.hw,
191178b4af31SQiufang Dai 	[CLKID_DDR]			= &axg_ddr.hw,
191278b4af31SQiufang Dai 	[CLKID_AUDIO_LOCKER]		= &axg_audio_locker.hw,
191378b4af31SQiufang Dai 	[CLKID_MIPI_DSI_HOST]		= &axg_mipi_dsi_host.hw,
191478b4af31SQiufang Dai 	[CLKID_ISA]			= &axg_isa.hw,
191578b4af31SQiufang Dai 	[CLKID_PL301]			= &axg_pl301.hw,
191678b4af31SQiufang Dai 	[CLKID_PERIPHS]			= &axg_periphs.hw,
191778b4af31SQiufang Dai 	[CLKID_SPICC0]			= &axg_spicc_0.hw,
191878b4af31SQiufang Dai 	[CLKID_I2C]			= &axg_i2c.hw,
191978b4af31SQiufang Dai 	[CLKID_RNG0]			= &axg_rng0.hw,
192078b4af31SQiufang Dai 	[CLKID_UART0]			= &axg_uart0.hw,
192178b4af31SQiufang Dai 	[CLKID_MIPI_DSI_PHY]		= &axg_mipi_dsi_phy.hw,
192278b4af31SQiufang Dai 	[CLKID_SPICC1]			= &axg_spicc_1.hw,
192378b4af31SQiufang Dai 	[CLKID_PCIE_A]			= &axg_pcie_a.hw,
192478b4af31SQiufang Dai 	[CLKID_PCIE_B]			= &axg_pcie_b.hw,
192578b4af31SQiufang Dai 	[CLKID_HIU_IFACE]		= &axg_hiu_reg.hw,
192678b4af31SQiufang Dai 	[CLKID_ASSIST_MISC]		= &axg_assist_misc.hw,
192778b4af31SQiufang Dai 	[CLKID_SD_EMMC_B]		= &axg_emmc_b.hw,
192878b4af31SQiufang Dai 	[CLKID_SD_EMMC_C]		= &axg_emmc_c.hw,
192978b4af31SQiufang Dai 	[CLKID_DMA]			= &axg_dma.hw,
193078b4af31SQiufang Dai 	[CLKID_SPI]			= &axg_spi.hw,
193178b4af31SQiufang Dai 	[CLKID_AUDIO]			= &axg_audio.hw,
193278b4af31SQiufang Dai 	[CLKID_ETH]			= &axg_eth_core.hw,
193378b4af31SQiufang Dai 	[CLKID_UART1]			= &axg_uart1.hw,
193478b4af31SQiufang Dai 	[CLKID_G2D]			= &axg_g2d.hw,
193578b4af31SQiufang Dai 	[CLKID_USB0]			= &axg_usb0.hw,
193678b4af31SQiufang Dai 	[CLKID_USB1]			= &axg_usb1.hw,
193778b4af31SQiufang Dai 	[CLKID_RESET]			= &axg_reset.hw,
193878b4af31SQiufang Dai 	[CLKID_USB]			= &axg_usb_general.hw,
193978b4af31SQiufang Dai 	[CLKID_AHB_ARB0]		= &axg_ahb_arb0.hw,
194078b4af31SQiufang Dai 	[CLKID_EFUSE]			= &axg_efuse.hw,
194178b4af31SQiufang Dai 	[CLKID_BOOT_ROM]		= &axg_boot_rom.hw,
194278b4af31SQiufang Dai 	[CLKID_AHB_DATA_BUS]		= &axg_ahb_data_bus.hw,
194378b4af31SQiufang Dai 	[CLKID_AHB_CTRL_BUS]		= &axg_ahb_ctrl_bus.hw,
194478b4af31SQiufang Dai 	[CLKID_USB1_DDR_BRIDGE]		= &axg_usb1_to_ddr.hw,
194578b4af31SQiufang Dai 	[CLKID_USB0_DDR_BRIDGE]		= &axg_usb0_to_ddr.hw,
194678b4af31SQiufang Dai 	[CLKID_MMC_PCLK]		= &axg_mmc_pclk.hw,
194778b4af31SQiufang Dai 	[CLKID_VPU_INTR]		= &axg_vpu_intr.hw,
194878b4af31SQiufang Dai 	[CLKID_SEC_AHB_AHB3_BRIDGE]	= &axg_sec_ahb_ahb3_bridge.hw,
194978b4af31SQiufang Dai 	[CLKID_GIC]			= &axg_gic.hw,
195078b4af31SQiufang Dai 	[CLKID_AO_MEDIA_CPU]		= &axg_ao_media_cpu.hw,
195178b4af31SQiufang Dai 	[CLKID_AO_AHB_SRAM]		= &axg_ao_ahb_sram.hw,
195278b4af31SQiufang Dai 	[CLKID_AO_AHB_BUS]		= &axg_ao_ahb_bus.hw,
195378b4af31SQiufang Dai 	[CLKID_AO_IFACE]		= &axg_ao_iface.hw,
195478b4af31SQiufang Dai 	[CLKID_AO_I2C]			= &axg_ao_i2c.hw,
195578b4af31SQiufang Dai 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &axg_sd_emmc_b_clk0_sel.hw,
195678b4af31SQiufang Dai 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &axg_sd_emmc_b_clk0_div.hw,
195778b4af31SQiufang Dai 	[CLKID_SD_EMMC_B_CLK0]		= &axg_sd_emmc_b_clk0.hw,
195878b4af31SQiufang Dai 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &axg_sd_emmc_c_clk0_sel.hw,
195978b4af31SQiufang Dai 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &axg_sd_emmc_c_clk0_div.hw,
196078b4af31SQiufang Dai 	[CLKID_SD_EMMC_C_CLK0]		= &axg_sd_emmc_c_clk0.hw,
1961d610b54fSJerome Brunet 	[CLKID_MPLL0_DIV]		= &axg_mpll0_div.hw,
1962d610b54fSJerome Brunet 	[CLKID_MPLL1_DIV]		= &axg_mpll1_div.hw,
1963d610b54fSJerome Brunet 	[CLKID_MPLL2_DIV]		= &axg_mpll2_div.hw,
1964d610b54fSJerome Brunet 	[CLKID_MPLL3_DIV]		= &axg_mpll3_div.hw,
1965093c3facSJerome Brunet 	[CLKID_HIFI_PLL]		= &axg_hifi_pll.hw,
1966513b67acSJerome Brunet 	[CLKID_MPLL_PREDIV]		= &axg_mpll_prediv.hw,
196705f81440SJerome Brunet 	[CLKID_FCLK_DIV2_DIV]		= &axg_fclk_div2_div.hw,
196805f81440SJerome Brunet 	[CLKID_FCLK_DIV3_DIV]		= &axg_fclk_div3_div.hw,
196905f81440SJerome Brunet 	[CLKID_FCLK_DIV4_DIV]		= &axg_fclk_div4_div.hw,
197005f81440SJerome Brunet 	[CLKID_FCLK_DIV5_DIV]		= &axg_fclk_div5_div.hw,
197105f81440SJerome Brunet 	[CLKID_FCLK_DIV7_DIV]		= &axg_fclk_div7_div.hw,
1972cddcb20bSYixun Lan 	[CLKID_PCIE_PLL]		= &axg_pcie_pll.hw,
1973cddcb20bSYixun Lan 	[CLKID_PCIE_MUX]		= &axg_pcie_mux.hw,
1974cddcb20bSYixun Lan 	[CLKID_PCIE_REF]		= &axg_pcie_ref.hw,
1975cddcb20bSYixun Lan 	[CLKID_PCIE_CML_EN0]		= &axg_pcie_cml_en0.hw,
1976cddcb20bSYixun Lan 	[CLKID_PCIE_CML_EN1]		= &axg_pcie_cml_en1.hw,
19777df533a7SJerome Brunet 	[CLKID_GEN_CLK_SEL]		= &axg_gen_clk_sel.hw,
19787df533a7SJerome Brunet 	[CLKID_GEN_CLK_DIV]		= &axg_gen_clk_div.hw,
19797df533a7SJerome Brunet 	[CLKID_GEN_CLK]			= &axg_gen_clk.hw,
198087173557SJerome Brunet 	[CLKID_SYS_PLL_DCO]		= &axg_sys_pll_dco.hw,
198187173557SJerome Brunet 	[CLKID_FIXED_PLL_DCO]		= &axg_fixed_pll_dco.hw,
198287173557SJerome Brunet 	[CLKID_GP0_PLL_DCO]		= &axg_gp0_pll_dco.hw,
198387173557SJerome Brunet 	[CLKID_HIFI_PLL_DCO]		= &axg_hifi_pll_dco.hw,
198487173557SJerome Brunet 	[CLKID_PCIE_PLL_DCO]		= &axg_pcie_pll_dco.hw,
198587173557SJerome Brunet 	[CLKID_PCIE_PLL_OD]		= &axg_pcie_pll_od.hw,
198614ebb315SNeil Armstrong 	[CLKID_VPU_0_DIV]		= &axg_vpu_0_div.hw,
198714ebb315SNeil Armstrong 	[CLKID_VPU_0_SEL]		= &axg_vpu_0_sel.hw,
198814ebb315SNeil Armstrong 	[CLKID_VPU_0]			= &axg_vpu_0.hw,
198914ebb315SNeil Armstrong 	[CLKID_VPU_1_DIV]		= &axg_vpu_1_div.hw,
199014ebb315SNeil Armstrong 	[CLKID_VPU_1_SEL]		= &axg_vpu_1_sel.hw,
199114ebb315SNeil Armstrong 	[CLKID_VPU_1]			= &axg_vpu_1.hw,
199214ebb315SNeil Armstrong 	[CLKID_VPU]			= &axg_vpu.hw,
199314ebb315SNeil Armstrong 	[CLKID_VAPB_0_DIV]		= &axg_vapb_0_div.hw,
199414ebb315SNeil Armstrong 	[CLKID_VAPB_0_SEL]		= &axg_vapb_0_sel.hw,
199514ebb315SNeil Armstrong 	[CLKID_VAPB_0]			= &axg_vapb_0.hw,
199614ebb315SNeil Armstrong 	[CLKID_VAPB_1_DIV]		= &axg_vapb_1_div.hw,
199714ebb315SNeil Armstrong 	[CLKID_VAPB_1_SEL]		= &axg_vapb_1_sel.hw,
199814ebb315SNeil Armstrong 	[CLKID_VAPB_1]			= &axg_vapb_1.hw,
199914ebb315SNeil Armstrong 	[CLKID_VAPB_SEL]		= &axg_vapb_sel.hw,
200014ebb315SNeil Armstrong 	[CLKID_VAPB]			= &axg_vapb.hw,
200114ebb315SNeil Armstrong 	[CLKID_VCLK]			= &axg_vclk.hw,
200214ebb315SNeil Armstrong 	[CLKID_VCLK2]			= &axg_vclk2.hw,
200314ebb315SNeil Armstrong 	[CLKID_VCLK_SEL]		= &axg_vclk_sel.hw,
200414ebb315SNeil Armstrong 	[CLKID_VCLK2_SEL]		= &axg_vclk2_sel.hw,
200514ebb315SNeil Armstrong 	[CLKID_VCLK_INPUT]		= &axg_vclk_input.hw,
200614ebb315SNeil Armstrong 	[CLKID_VCLK2_INPUT]		= &axg_vclk2_input.hw,
200714ebb315SNeil Armstrong 	[CLKID_VCLK_DIV]		= &axg_vclk_div.hw,
200814ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV]		= &axg_vclk2_div.hw,
200914ebb315SNeil Armstrong 	[CLKID_VCLK_DIV2_EN]		= &axg_vclk_div2_en.hw,
201014ebb315SNeil Armstrong 	[CLKID_VCLK_DIV4_EN]		= &axg_vclk_div4_en.hw,
201114ebb315SNeil Armstrong 	[CLKID_VCLK_DIV6_EN]		= &axg_vclk_div6_en.hw,
201214ebb315SNeil Armstrong 	[CLKID_VCLK_DIV12_EN]		= &axg_vclk_div12_en.hw,
201314ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV2_EN]		= &axg_vclk2_div2_en.hw,
201414ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV4_EN]		= &axg_vclk2_div4_en.hw,
201514ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV6_EN]		= &axg_vclk2_div6_en.hw,
201614ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV12_EN]		= &axg_vclk2_div12_en.hw,
201714ebb315SNeil Armstrong 	[CLKID_VCLK_DIV1]		= &axg_vclk_div1.hw,
201814ebb315SNeil Armstrong 	[CLKID_VCLK_DIV2]		= &axg_vclk_div2.hw,
201914ebb315SNeil Armstrong 	[CLKID_VCLK_DIV4]		= &axg_vclk_div4.hw,
202014ebb315SNeil Armstrong 	[CLKID_VCLK_DIV6]		= &axg_vclk_div6.hw,
202114ebb315SNeil Armstrong 	[CLKID_VCLK_DIV12]		= &axg_vclk_div12.hw,
202214ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV1]		= &axg_vclk2_div1.hw,
202314ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV2]		= &axg_vclk2_div2.hw,
202414ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV4]		= &axg_vclk2_div4.hw,
202514ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV6]		= &axg_vclk2_div6.hw,
202614ebb315SNeil Armstrong 	[CLKID_VCLK2_DIV12]		= &axg_vclk2_div12.hw,
202714ebb315SNeil Armstrong 	[CLKID_CTS_ENCL_SEL]		= &axg_cts_encl_sel.hw,
202814ebb315SNeil Armstrong 	[CLKID_CTS_ENCL]		= &axg_cts_encl.hw,
2029e80d8510SNeil Armstrong 	[CLKID_VDIN_MEAS_SEL]		= &axg_vdin_meas_sel.hw,
2030e80d8510SNeil Armstrong 	[CLKID_VDIN_MEAS_DIV]		= &axg_vdin_meas_div.hw,
2031e80d8510SNeil Armstrong 	[CLKID_VDIN_MEAS]		= &axg_vdin_meas.hw,
203278b4af31SQiufang Dai };
203378b4af31SQiufang Dai 
2034722825dcSJerome Brunet /* Convenience table to populate regmap in .probe */
20357f9768a5SJerome Brunet static struct clk_regmap *const axg_clk_regmaps[] = {
203678b4af31SQiufang Dai 	&axg_clk81,
203778b4af31SQiufang Dai 	&axg_ddr,
203878b4af31SQiufang Dai 	&axg_audio_locker,
203978b4af31SQiufang Dai 	&axg_mipi_dsi_host,
204078b4af31SQiufang Dai 	&axg_isa,
204178b4af31SQiufang Dai 	&axg_pl301,
204278b4af31SQiufang Dai 	&axg_periphs,
204378b4af31SQiufang Dai 	&axg_spicc_0,
204478b4af31SQiufang Dai 	&axg_i2c,
204578b4af31SQiufang Dai 	&axg_rng0,
204678b4af31SQiufang Dai 	&axg_uart0,
204778b4af31SQiufang Dai 	&axg_mipi_dsi_phy,
204878b4af31SQiufang Dai 	&axg_spicc_1,
204978b4af31SQiufang Dai 	&axg_pcie_a,
205078b4af31SQiufang Dai 	&axg_pcie_b,
205178b4af31SQiufang Dai 	&axg_hiu_reg,
205278b4af31SQiufang Dai 	&axg_assist_misc,
205378b4af31SQiufang Dai 	&axg_emmc_b,
205478b4af31SQiufang Dai 	&axg_emmc_c,
205578b4af31SQiufang Dai 	&axg_dma,
205678b4af31SQiufang Dai 	&axg_spi,
205778b4af31SQiufang Dai 	&axg_audio,
205878b4af31SQiufang Dai 	&axg_eth_core,
205978b4af31SQiufang Dai 	&axg_uart1,
206078b4af31SQiufang Dai 	&axg_g2d,
206178b4af31SQiufang Dai 	&axg_usb0,
206278b4af31SQiufang Dai 	&axg_usb1,
206378b4af31SQiufang Dai 	&axg_reset,
206478b4af31SQiufang Dai 	&axg_usb_general,
206578b4af31SQiufang Dai 	&axg_ahb_arb0,
206678b4af31SQiufang Dai 	&axg_efuse,
206778b4af31SQiufang Dai 	&axg_boot_rom,
206878b4af31SQiufang Dai 	&axg_ahb_data_bus,
206978b4af31SQiufang Dai 	&axg_ahb_ctrl_bus,
207078b4af31SQiufang Dai 	&axg_usb1_to_ddr,
207178b4af31SQiufang Dai 	&axg_usb0_to_ddr,
207278b4af31SQiufang Dai 	&axg_mmc_pclk,
207378b4af31SQiufang Dai 	&axg_vpu_intr,
207478b4af31SQiufang Dai 	&axg_sec_ahb_ahb3_bridge,
207578b4af31SQiufang Dai 	&axg_gic,
207678b4af31SQiufang Dai 	&axg_ao_media_cpu,
207778b4af31SQiufang Dai 	&axg_ao_ahb_sram,
207878b4af31SQiufang Dai 	&axg_ao_ahb_bus,
207978b4af31SQiufang Dai 	&axg_ao_iface,
208078b4af31SQiufang Dai 	&axg_ao_i2c,
208178b4af31SQiufang Dai 	&axg_sd_emmc_b_clk0,
208278b4af31SQiufang Dai 	&axg_sd_emmc_c_clk0,
2083f06ddd28SJerome Brunet 	&axg_mpeg_clk_div,
2084f06ddd28SJerome Brunet 	&axg_sd_emmc_b_clk0_div,
2085f06ddd28SJerome Brunet 	&axg_sd_emmc_c_clk0_div,
20862513a28cSJerome Brunet 	&axg_mpeg_clk_sel,
20872513a28cSJerome Brunet 	&axg_sd_emmc_b_clk0_sel,
20882513a28cSJerome Brunet 	&axg_sd_emmc_c_clk0_sel,
2089c763e61aSJerome Brunet 	&axg_mpll0,
2090c763e61aSJerome Brunet 	&axg_mpll1,
2091c763e61aSJerome Brunet 	&axg_mpll2,
2092c763e61aSJerome Brunet 	&axg_mpll3,
2093d610b54fSJerome Brunet 	&axg_mpll0_div,
2094d610b54fSJerome Brunet 	&axg_mpll1_div,
2095d610b54fSJerome Brunet 	&axg_mpll2_div,
2096d610b54fSJerome Brunet 	&axg_mpll3_div,
2097722825dcSJerome Brunet 	&axg_fixed_pll,
2098722825dcSJerome Brunet 	&axg_sys_pll,
2099722825dcSJerome Brunet 	&axg_gp0_pll,
2100093c3facSJerome Brunet 	&axg_hifi_pll,
2101513b67acSJerome Brunet 	&axg_mpll_prediv,
210205f81440SJerome Brunet 	&axg_fclk_div2,
210305f81440SJerome Brunet 	&axg_fclk_div3,
210405f81440SJerome Brunet 	&axg_fclk_div4,
210505f81440SJerome Brunet 	&axg_fclk_div5,
210605f81440SJerome Brunet 	&axg_fclk_div7,
210787173557SJerome Brunet 	&axg_pcie_pll_dco,
210887173557SJerome Brunet 	&axg_pcie_pll_od,
2109cddcb20bSYixun Lan 	&axg_pcie_pll,
2110cddcb20bSYixun Lan 	&axg_pcie_mux,
2111cddcb20bSYixun Lan 	&axg_pcie_ref,
2112cddcb20bSYixun Lan 	&axg_pcie_cml_en0,
2113cddcb20bSYixun Lan 	&axg_pcie_cml_en1,
21147df533a7SJerome Brunet 	&axg_gen_clk_sel,
21157df533a7SJerome Brunet 	&axg_gen_clk_div,
21167df533a7SJerome Brunet 	&axg_gen_clk,
211787173557SJerome Brunet 	&axg_fixed_pll_dco,
211887173557SJerome Brunet 	&axg_sys_pll_dco,
211987173557SJerome Brunet 	&axg_gp0_pll_dco,
212087173557SJerome Brunet 	&axg_hifi_pll_dco,
212187173557SJerome Brunet 	&axg_pcie_pll_dco,
212287173557SJerome Brunet 	&axg_pcie_pll_od,
212314ebb315SNeil Armstrong 	&axg_vpu_0_div,
212414ebb315SNeil Armstrong 	&axg_vpu_0_sel,
212514ebb315SNeil Armstrong 	&axg_vpu_0,
212614ebb315SNeil Armstrong 	&axg_vpu_1_div,
212714ebb315SNeil Armstrong 	&axg_vpu_1_sel,
212814ebb315SNeil Armstrong 	&axg_vpu_1,
212914ebb315SNeil Armstrong 	&axg_vpu,
213014ebb315SNeil Armstrong 	&axg_vapb_0_div,
213114ebb315SNeil Armstrong 	&axg_vapb_0_sel,
213214ebb315SNeil Armstrong 	&axg_vapb_0,
213314ebb315SNeil Armstrong 	&axg_vapb_1_div,
213414ebb315SNeil Armstrong 	&axg_vapb_1_sel,
213514ebb315SNeil Armstrong 	&axg_vapb_1,
213614ebb315SNeil Armstrong 	&axg_vapb_sel,
213714ebb315SNeil Armstrong 	&axg_vapb,
213814ebb315SNeil Armstrong 	&axg_vclk,
213914ebb315SNeil Armstrong 	&axg_vclk2,
214014ebb315SNeil Armstrong 	&axg_vclk_sel,
214114ebb315SNeil Armstrong 	&axg_vclk2_sel,
214214ebb315SNeil Armstrong 	&axg_vclk_input,
214314ebb315SNeil Armstrong 	&axg_vclk2_input,
214414ebb315SNeil Armstrong 	&axg_vclk_div,
2145*0cbefc7bSIgor Prusov 	&axg_vclk_div1,
214614ebb315SNeil Armstrong 	&axg_vclk2_div,
2147*0cbefc7bSIgor Prusov 	&axg_vclk2_div1,
214814ebb315SNeil Armstrong 	&axg_vclk_div2_en,
214914ebb315SNeil Armstrong 	&axg_vclk_div4_en,
215014ebb315SNeil Armstrong 	&axg_vclk_div6_en,
215114ebb315SNeil Armstrong 	&axg_vclk_div12_en,
215214ebb315SNeil Armstrong 	&axg_vclk2_div2_en,
215314ebb315SNeil Armstrong 	&axg_vclk2_div4_en,
215414ebb315SNeil Armstrong 	&axg_vclk2_div6_en,
215514ebb315SNeil Armstrong 	&axg_vclk2_div12_en,
215614ebb315SNeil Armstrong 	&axg_cts_encl_sel,
215714ebb315SNeil Armstrong 	&axg_cts_encl,
2158e80d8510SNeil Armstrong 	&axg_vdin_meas_sel,
2159e80d8510SNeil Armstrong 	&axg_vdin_meas_div,
2160e80d8510SNeil Armstrong 	&axg_vdin_meas,
216178b4af31SQiufang Dai };
216278b4af31SQiufang Dai 
21636682bd4dSJerome Brunet static const struct meson_eeclkc_data axg_clkc_data = {
21646682bd4dSJerome Brunet 	.regmap_clks = axg_clk_regmaps,
21656682bd4dSJerome Brunet 	.regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps),
2166141fbc27SNeil Armstrong 	.hw_clks = {
2167141fbc27SNeil Armstrong 		.hws = axg_hw_clks,
2168141fbc27SNeil Armstrong 		.num = ARRAY_SIZE(axg_hw_clks),
2169141fbc27SNeil Armstrong 	},
21706682bd4dSJerome Brunet };
21716682bd4dSJerome Brunet 
21726682bd4dSJerome Brunet 
217378b4af31SQiufang Dai static const struct of_device_id clkc_match_table[] = {
21746682bd4dSJerome Brunet 	{ .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data },
217578b4af31SQiufang Dai 	{}
217678b4af31SQiufang Dai };
217720425f63SKevin Hilman MODULE_DEVICE_TABLE(of, clkc_match_table);
217878b4af31SQiufang Dai 
217978b4af31SQiufang Dai static struct platform_driver axg_driver = {
21806682bd4dSJerome Brunet 	.probe		= meson_eeclkc_probe,
218178b4af31SQiufang Dai 	.driver		= {
218278b4af31SQiufang Dai 		.name	= "axg-clkc",
218378b4af31SQiufang Dai 		.of_match_table = clkc_match_table,
218478b4af31SQiufang Dai 	},
218578b4af31SQiufang Dai };
218678b4af31SQiufang Dai 
218720425f63SKevin Hilman module_platform_driver(axg_driver);
218820425f63SKevin Hilman MODULE_LICENSE("GPL v2");
2189