xref: /openbmc/linux/drivers/clk/meson/g12a.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1085a4ea9SJian Hu // SPDX-License-Identifier: GPL-2.0+
2085a4ea9SJian Hu /*
3085a4ea9SJian Hu  * Amlogic Meson-G12A Clock Controller Driver
4085a4ea9SJian Hu  *
5085a4ea9SJian Hu  * Copyright (c) 2016 Baylibre SAS.
6085a4ea9SJian Hu  * Author: Michael Turquette <mturquette@baylibre.com>
7085a4ea9SJian Hu  *
8085a4ea9SJian Hu  * Copyright (c) 2018 Amlogic, inc.
9085a4ea9SJian Hu  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
10085a4ea9SJian Hu  * Author: Jian Hu <jian.hu@amlogic.com>
11085a4ea9SJian Hu  */
12085a4ea9SJian Hu 
13085a4ea9SJian Hu #include <linux/clk-provider.h>
14085a4ea9SJian Hu #include <linux/init.h>
15a96cbb14SRob Herring #include <linux/of.h>
16085a4ea9SJian Hu #include <linux/platform_device.h>
17ffae8475SNeil Armstrong #include <linux/clk.h>
1820425f63SKevin Hilman #include <linux/module.h>
19085a4ea9SJian Hu 
20085a4ea9SJian Hu #include "clk-mpll.h"
21085a4ea9SJian Hu #include "clk-pll.h"
22085a4ea9SJian Hu #include "clk-regmap.h"
23ffae8475SNeil Armstrong #include "clk-cpu-dyndiv.h"
24085a4ea9SJian Hu #include "vid-pll-div.h"
256682bd4dSJerome Brunet #include "meson-eeclk.h"
26085a4ea9SJian Hu #include "g12a.h"
27085a4ea9SJian Hu 
28*ccbfbd36SNeil Armstrong #include <dt-bindings/clock/g12a-clkc.h>
29*ccbfbd36SNeil Armstrong 
30085a4ea9SJian Hu static DEFINE_SPINLOCK(meson_clk_lock);
31085a4ea9SJian Hu 
32085a4ea9SJian Hu static struct clk_regmap g12a_fixed_pll_dco = {
33085a4ea9SJian Hu 	.data = &(struct meson_clk_pll_data){
34085a4ea9SJian Hu 		.en = {
35085a4ea9SJian Hu 			.reg_off = HHI_FIX_PLL_CNTL0,
36085a4ea9SJian Hu 			.shift   = 28,
37085a4ea9SJian Hu 			.width   = 1,
38085a4ea9SJian Hu 		},
39085a4ea9SJian Hu 		.m = {
40085a4ea9SJian Hu 			.reg_off = HHI_FIX_PLL_CNTL0,
41085a4ea9SJian Hu 			.shift   = 0,
42085a4ea9SJian Hu 			.width   = 8,
43085a4ea9SJian Hu 		},
44085a4ea9SJian Hu 		.n = {
45085a4ea9SJian Hu 			.reg_off = HHI_FIX_PLL_CNTL0,
46085a4ea9SJian Hu 			.shift   = 10,
47085a4ea9SJian Hu 			.width   = 5,
48085a4ea9SJian Hu 		},
49085a4ea9SJian Hu 		.frac = {
50085a4ea9SJian Hu 			.reg_off = HHI_FIX_PLL_CNTL1,
51085a4ea9SJian Hu 			.shift   = 0,
52085a4ea9SJian Hu 			.width   = 17,
53085a4ea9SJian Hu 		},
54085a4ea9SJian Hu 		.l = {
55085a4ea9SJian Hu 			.reg_off = HHI_FIX_PLL_CNTL0,
56085a4ea9SJian Hu 			.shift   = 31,
57085a4ea9SJian Hu 			.width   = 1,
58085a4ea9SJian Hu 		},
59085a4ea9SJian Hu 		.rst = {
60085a4ea9SJian Hu 			.reg_off = HHI_FIX_PLL_CNTL0,
61085a4ea9SJian Hu 			.shift   = 29,
62085a4ea9SJian Hu 			.width   = 1,
63085a4ea9SJian Hu 		},
64085a4ea9SJian Hu 	},
65085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
66085a4ea9SJian Hu 		.name = "fixed_pll_dco",
67085a4ea9SJian Hu 		.ops = &meson_clk_pll_ro_ops,
6825e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
6925e682a0SAlexandre Mergnat 			.fw_name = "xtal",
7025e682a0SAlexandre Mergnat 		},
71085a4ea9SJian Hu 		.num_parents = 1,
72085a4ea9SJian Hu 	},
73085a4ea9SJian Hu };
74085a4ea9SJian Hu 
75085a4ea9SJian Hu static struct clk_regmap g12a_fixed_pll = {
76085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
77085a4ea9SJian Hu 		.offset = HHI_FIX_PLL_CNTL0,
78085a4ea9SJian Hu 		.shift = 16,
79085a4ea9SJian Hu 		.width = 2,
80085a4ea9SJian Hu 		.flags = CLK_DIVIDER_POWER_OF_TWO,
81085a4ea9SJian Hu 	},
82085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
83085a4ea9SJian Hu 		.name = "fixed_pll",
84085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ro_ops,
8525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
8625e682a0SAlexandre Mergnat 			&g12a_fixed_pll_dco.hw
8725e682a0SAlexandre Mergnat 		},
88085a4ea9SJian Hu 		.num_parents = 1,
89085a4ea9SJian Hu 		/*
90085a4ea9SJian Hu 		 * This clock won't ever change at runtime so
91085a4ea9SJian Hu 		 * CLK_SET_RATE_PARENT is not required
92085a4ea9SJian Hu 		 */
93085a4ea9SJian Hu 	},
94085a4ea9SJian Hu };
95085a4ea9SJian Hu 
96ffae8475SNeil Armstrong static const struct pll_mult_range g12a_sys_pll_mult_range = {
97ffae8475SNeil Armstrong 	.min = 128,
98ffae8475SNeil Armstrong 	.max = 250,
99085a4ea9SJian Hu };
100085a4ea9SJian Hu 
101085a4ea9SJian Hu static struct clk_regmap g12a_sys_pll_dco = {
102085a4ea9SJian Hu 	.data = &(struct meson_clk_pll_data){
103085a4ea9SJian Hu 		.en = {
104085a4ea9SJian Hu 			.reg_off = HHI_SYS_PLL_CNTL0,
105085a4ea9SJian Hu 			.shift   = 28,
106085a4ea9SJian Hu 			.width   = 1,
107085a4ea9SJian Hu 		},
108085a4ea9SJian Hu 		.m = {
109085a4ea9SJian Hu 			.reg_off = HHI_SYS_PLL_CNTL0,
110085a4ea9SJian Hu 			.shift   = 0,
111085a4ea9SJian Hu 			.width   = 8,
112085a4ea9SJian Hu 		},
113085a4ea9SJian Hu 		.n = {
114085a4ea9SJian Hu 			.reg_off = HHI_SYS_PLL_CNTL0,
115085a4ea9SJian Hu 			.shift   = 10,
116085a4ea9SJian Hu 			.width   = 5,
117085a4ea9SJian Hu 		},
118085a4ea9SJian Hu 		.l = {
119085a4ea9SJian Hu 			.reg_off = HHI_SYS_PLL_CNTL0,
120085a4ea9SJian Hu 			.shift   = 31,
121085a4ea9SJian Hu 			.width   = 1,
122085a4ea9SJian Hu 		},
123085a4ea9SJian Hu 		.rst = {
124085a4ea9SJian Hu 			.reg_off = HHI_SYS_PLL_CNTL0,
125085a4ea9SJian Hu 			.shift   = 29,
126085a4ea9SJian Hu 			.width   = 1,
127085a4ea9SJian Hu 		},
128ffae8475SNeil Armstrong 		.range = &g12a_sys_pll_mult_range,
129085a4ea9SJian Hu 	},
130085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
131085a4ea9SJian Hu 		.name = "sys_pll_dco",
132ffae8475SNeil Armstrong 		.ops = &meson_clk_pll_ops,
13325e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
13425e682a0SAlexandre Mergnat 			.fw_name = "xtal",
13525e682a0SAlexandre Mergnat 		},
136085a4ea9SJian Hu 		.num_parents = 1,
137ffae8475SNeil Armstrong 		/* This clock feeds the CPU, avoid disabling it */
138ffae8475SNeil Armstrong 		.flags = CLK_IS_CRITICAL,
139085a4ea9SJian Hu 	},
140085a4ea9SJian Hu };
141085a4ea9SJian Hu 
142085a4ea9SJian Hu static struct clk_regmap g12a_sys_pll = {
143085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
144085a4ea9SJian Hu 		.offset = HHI_SYS_PLL_CNTL0,
145085a4ea9SJian Hu 		.shift = 16,
146085a4ea9SJian Hu 		.width = 3,
147085a4ea9SJian Hu 		.flags = CLK_DIVIDER_POWER_OF_TWO,
148085a4ea9SJian Hu 	},
149085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
150085a4ea9SJian Hu 		.name = "sys_pll",
151ffae8475SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
15225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
15325e682a0SAlexandre Mergnat 			&g12a_sys_pll_dco.hw
15425e682a0SAlexandre Mergnat 		},
155085a4ea9SJian Hu 		.num_parents = 1,
156ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
157085a4ea9SJian Hu 	},
158085a4ea9SJian Hu };
159085a4ea9SJian Hu 
160d43628e9SNeil Armstrong static struct clk_regmap g12b_sys1_pll_dco = {
161d43628e9SNeil Armstrong 	.data = &(struct meson_clk_pll_data){
162d43628e9SNeil Armstrong 		.en = {
163d43628e9SNeil Armstrong 			.reg_off = HHI_SYS1_PLL_CNTL0,
164d43628e9SNeil Armstrong 			.shift   = 28,
165d43628e9SNeil Armstrong 			.width   = 1,
166d43628e9SNeil Armstrong 		},
167d43628e9SNeil Armstrong 		.m = {
168d43628e9SNeil Armstrong 			.reg_off = HHI_SYS1_PLL_CNTL0,
169d43628e9SNeil Armstrong 			.shift   = 0,
170d43628e9SNeil Armstrong 			.width   = 8,
171d43628e9SNeil Armstrong 		},
172d43628e9SNeil Armstrong 		.n = {
173d43628e9SNeil Armstrong 			.reg_off = HHI_SYS1_PLL_CNTL0,
174d43628e9SNeil Armstrong 			.shift   = 10,
175d43628e9SNeil Armstrong 			.width   = 5,
176d43628e9SNeil Armstrong 		},
177d43628e9SNeil Armstrong 		.l = {
178d43628e9SNeil Armstrong 			.reg_off = HHI_SYS1_PLL_CNTL0,
179d43628e9SNeil Armstrong 			.shift   = 31,
180d43628e9SNeil Armstrong 			.width   = 1,
181d43628e9SNeil Armstrong 		},
182d43628e9SNeil Armstrong 		.rst = {
183d43628e9SNeil Armstrong 			.reg_off = HHI_SYS1_PLL_CNTL0,
184d43628e9SNeil Armstrong 			.shift   = 29,
185d43628e9SNeil Armstrong 			.width   = 1,
186d43628e9SNeil Armstrong 		},
187ffae8475SNeil Armstrong 		.range = &g12a_sys_pll_mult_range,
188d43628e9SNeil Armstrong 	},
189d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
190d43628e9SNeil Armstrong 		.name = "sys1_pll_dco",
191ffae8475SNeil Armstrong 		.ops = &meson_clk_pll_ops,
19225e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
19325e682a0SAlexandre Mergnat 			.fw_name = "xtal",
19425e682a0SAlexandre Mergnat 		},
195d43628e9SNeil Armstrong 		.num_parents = 1,
196ffae8475SNeil Armstrong 		/* This clock feeds the CPU, avoid disabling it */
197ffae8475SNeil Armstrong 		.flags = CLK_IS_CRITICAL,
198d43628e9SNeil Armstrong 	},
199d43628e9SNeil Armstrong };
200d43628e9SNeil Armstrong 
201d43628e9SNeil Armstrong static struct clk_regmap g12b_sys1_pll = {
202d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
203d43628e9SNeil Armstrong 		.offset = HHI_SYS1_PLL_CNTL0,
204d43628e9SNeil Armstrong 		.shift = 16,
205d43628e9SNeil Armstrong 		.width = 3,
206d43628e9SNeil Armstrong 		.flags = CLK_DIVIDER_POWER_OF_TWO,
207d43628e9SNeil Armstrong 	},
208d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
209d43628e9SNeil Armstrong 		.name = "sys1_pll",
210ffae8475SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
21125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
21225e682a0SAlexandre Mergnat 			&g12b_sys1_pll_dco.hw
21325e682a0SAlexandre Mergnat 		},
214d43628e9SNeil Armstrong 		.num_parents = 1,
215ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
216d43628e9SNeil Armstrong 	},
217d43628e9SNeil Armstrong };
218d43628e9SNeil Armstrong 
219370294e2SNeil Armstrong static struct clk_regmap g12a_sys_pll_div16_en = {
220370294e2SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
221370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
222370294e2SNeil Armstrong 		.bit_idx = 24,
223370294e2SNeil Armstrong 	},
224370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
225370294e2SNeil Armstrong 		.name = "sys_pll_div16_en",
226370294e2SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
22725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
228370294e2SNeil Armstrong 		.num_parents = 1,
229370294e2SNeil Armstrong 		/*
230370294e2SNeil Armstrong 		 * This clock is used to debug the sys_pll range
231370294e2SNeil Armstrong 		 * Linux should not change it at runtime
232370294e2SNeil Armstrong 		 */
233370294e2SNeil Armstrong 	},
234370294e2SNeil Armstrong };
235370294e2SNeil Armstrong 
236d43628e9SNeil Armstrong static struct clk_regmap g12b_sys1_pll_div16_en = {
237d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
238d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
239d43628e9SNeil Armstrong 		.bit_idx = 24,
240d43628e9SNeil Armstrong 	},
241d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
242d43628e9SNeil Armstrong 		.name = "sys1_pll_div16_en",
243d43628e9SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
24425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
24525e682a0SAlexandre Mergnat 			&g12b_sys1_pll.hw
24625e682a0SAlexandre Mergnat 		},
247d43628e9SNeil Armstrong 		.num_parents = 1,
248d43628e9SNeil Armstrong 		/*
249d43628e9SNeil Armstrong 		 * This clock is used to debug the sys_pll range
250d43628e9SNeil Armstrong 		 * Linux should not change it at runtime
251d43628e9SNeil Armstrong 		 */
252d43628e9SNeil Armstrong 	},
253d43628e9SNeil Armstrong };
254d43628e9SNeil Armstrong 
255370294e2SNeil Armstrong static struct clk_fixed_factor g12a_sys_pll_div16 = {
256370294e2SNeil Armstrong 	.mult = 1,
257370294e2SNeil Armstrong 	.div = 16,
258370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
259370294e2SNeil Armstrong 		.name = "sys_pll_div16",
260370294e2SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
26125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
26225e682a0SAlexandre Mergnat 			&g12a_sys_pll_div16_en.hw
26325e682a0SAlexandre Mergnat 		},
264370294e2SNeil Armstrong 		.num_parents = 1,
265370294e2SNeil Armstrong 	},
266370294e2SNeil Armstrong };
267370294e2SNeil Armstrong 
268d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_sys1_pll_div16 = {
269d43628e9SNeil Armstrong 	.mult = 1,
270d43628e9SNeil Armstrong 	.div = 16,
271d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
272d43628e9SNeil Armstrong 		.name = "sys1_pll_div16",
273d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
27425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
27525e682a0SAlexandre Mergnat 			&g12b_sys1_pll_div16_en.hw
27625e682a0SAlexandre Mergnat 		},
277d43628e9SNeil Armstrong 		.num_parents = 1,
278d43628e9SNeil Armstrong 	},
279d43628e9SNeil Armstrong };
280d43628e9SNeil Armstrong 
28125e682a0SAlexandre Mergnat static struct clk_fixed_factor g12a_fclk_div2_div = {
28225e682a0SAlexandre Mergnat 	.mult = 1,
28325e682a0SAlexandre Mergnat 	.div = 2,
28425e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
28525e682a0SAlexandre Mergnat 		.name = "fclk_div2_div",
28625e682a0SAlexandre Mergnat 		.ops = &clk_fixed_factor_ops,
28725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
28825e682a0SAlexandre Mergnat 		.num_parents = 1,
28925e682a0SAlexandre Mergnat 	},
29025e682a0SAlexandre Mergnat };
29125e682a0SAlexandre Mergnat 
29225e682a0SAlexandre Mergnat static struct clk_regmap g12a_fclk_div2 = {
29325e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
29425e682a0SAlexandre Mergnat 		.offset = HHI_FIX_PLL_CNTL1,
29525e682a0SAlexandre Mergnat 		.bit_idx = 24,
29625e682a0SAlexandre Mergnat 	},
29725e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
29825e682a0SAlexandre Mergnat 		.name = "fclk_div2",
29925e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
30025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
30125e682a0SAlexandre Mergnat 			&g12a_fclk_div2_div.hw
30225e682a0SAlexandre Mergnat 		},
30325e682a0SAlexandre Mergnat 		.num_parents = 1,
3042c4e80e0SStefan Agner 		/*
3052c4e80e0SStefan Agner 		 * Similar to fclk_div3, it seems that this clock is used by
3062c4e80e0SStefan Agner 		 * the resident firmware and is required by the platform to
3072c4e80e0SStefan Agner 		 * operate correctly.
3082c4e80e0SStefan Agner 		 * Until the following condition are met, we need this clock to
3092c4e80e0SStefan Agner 		 * be marked as critical:
3102c4e80e0SStefan Agner 		 * a) Mark the clock used by a firmware resource, if possible
3112c4e80e0SStefan Agner 		 * b) CCF has a clock hand-off mechanism to make the sure the
3122c4e80e0SStefan Agner 		 *    clock stays on until the proper driver comes along
3132c4e80e0SStefan Agner 		 */
3142c4e80e0SStefan Agner 		.flags = CLK_IS_CRITICAL,
31525e682a0SAlexandre Mergnat 	},
31625e682a0SAlexandre Mergnat };
31725e682a0SAlexandre Mergnat 
31825e682a0SAlexandre Mergnat static struct clk_fixed_factor g12a_fclk_div3_div = {
31925e682a0SAlexandre Mergnat 	.mult = 1,
32025e682a0SAlexandre Mergnat 	.div = 3,
32125e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
32225e682a0SAlexandre Mergnat 		.name = "fclk_div3_div",
32325e682a0SAlexandre Mergnat 		.ops = &clk_fixed_factor_ops,
32425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
32525e682a0SAlexandre Mergnat 		.num_parents = 1,
32625e682a0SAlexandre Mergnat 	},
32725e682a0SAlexandre Mergnat };
32825e682a0SAlexandre Mergnat 
32925e682a0SAlexandre Mergnat static struct clk_regmap g12a_fclk_div3 = {
33025e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
33125e682a0SAlexandre Mergnat 		.offset = HHI_FIX_PLL_CNTL1,
33225e682a0SAlexandre Mergnat 		.bit_idx = 20,
33325e682a0SAlexandre Mergnat 	},
33425e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
33525e682a0SAlexandre Mergnat 		.name = "fclk_div3",
33625e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
33725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
33825e682a0SAlexandre Mergnat 			&g12a_fclk_div3_div.hw
33925e682a0SAlexandre Mergnat 		},
34025e682a0SAlexandre Mergnat 		.num_parents = 1,
34125e682a0SAlexandre Mergnat 		/*
34225e682a0SAlexandre Mergnat 		 * This clock is used by the resident firmware and is required
34325e682a0SAlexandre Mergnat 		 * by the platform to operate correctly.
34425e682a0SAlexandre Mergnat 		 * Until the following condition are met, we need this clock to
34525e682a0SAlexandre Mergnat 		 * be marked as critical:
34625e682a0SAlexandre Mergnat 		 * a) Mark the clock used by a firmware resource, if possible
34725e682a0SAlexandre Mergnat 		 * b) CCF has a clock hand-off mechanism to make the sure the
34825e682a0SAlexandre Mergnat 		 *    clock stays on until the proper driver comes along
34925e682a0SAlexandre Mergnat 		 */
35025e682a0SAlexandre Mergnat 		.flags = CLK_IS_CRITICAL,
35125e682a0SAlexandre Mergnat 	},
35225e682a0SAlexandre Mergnat };
35325e682a0SAlexandre Mergnat 
354370294e2SNeil Armstrong /* Datasheet names this field as "premux0" */
355370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_premux0 = {
356370294e2SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
357370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
358370294e2SNeil Armstrong 		.mask = 0x3,
359370294e2SNeil Armstrong 		.shift = 0,
36090b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
361370294e2SNeil Armstrong 	},
362370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
363370294e2SNeil Armstrong 		.name = "cpu_clk_dyn0_sel",
364ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
36525e682a0SAlexandre Mergnat 		.parent_data = (const struct clk_parent_data []) {
36625e682a0SAlexandre Mergnat 			{ .fw_name = "xtal", },
36725e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div2.hw },
36825e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div3.hw },
36925e682a0SAlexandre Mergnat 		},
37025e682a0SAlexandre Mergnat 		.num_parents = 3,
3714a079643SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
37225e682a0SAlexandre Mergnat 	},
37325e682a0SAlexandre Mergnat };
37425e682a0SAlexandre Mergnat 
37525e682a0SAlexandre Mergnat /* Datasheet names this field as "premux1" */
37625e682a0SAlexandre Mergnat static struct clk_regmap g12a_cpu_clk_premux1 = {
37725e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
37825e682a0SAlexandre Mergnat 		.offset = HHI_SYS_CPU_CLK_CNTL0,
37925e682a0SAlexandre Mergnat 		.mask = 0x3,
38025e682a0SAlexandre Mergnat 		.shift = 16,
38125e682a0SAlexandre Mergnat 	},
38225e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
38325e682a0SAlexandre Mergnat 		.name = "cpu_clk_dyn1_sel",
384ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
38525e682a0SAlexandre Mergnat 		.parent_data = (const struct clk_parent_data []) {
38625e682a0SAlexandre Mergnat 			{ .fw_name = "xtal", },
38725e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div2.hw },
38825e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div3.hw },
38925e682a0SAlexandre Mergnat 		},
390370294e2SNeil Armstrong 		.num_parents = 3,
391ffae8475SNeil Armstrong 		/* This sub-tree is used a parking clock */
392ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT
393370294e2SNeil Armstrong 	},
394370294e2SNeil Armstrong };
395370294e2SNeil Armstrong 
396370294e2SNeil Armstrong /* Datasheet names this field as "mux0_divn_tcnt" */
397370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_mux0_div = {
398ffae8475SNeil Armstrong 	.data = &(struct meson_clk_cpu_dyndiv_data){
399ffae8475SNeil Armstrong 		.div = {
400ffae8475SNeil Armstrong 			.reg_off = HHI_SYS_CPU_CLK_CNTL0,
401370294e2SNeil Armstrong 			.shift = 4,
402370294e2SNeil Armstrong 			.width = 6,
403370294e2SNeil Armstrong 		},
404ffae8475SNeil Armstrong 		.dyn = {
405ffae8475SNeil Armstrong 			.reg_off = HHI_SYS_CPU_CLK_CNTL0,
406ffae8475SNeil Armstrong 			.shift = 26,
407ffae8475SNeil Armstrong 			.width = 1,
408ffae8475SNeil Armstrong 		},
409ffae8475SNeil Armstrong 	},
410370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
411370294e2SNeil Armstrong 		.name = "cpu_clk_dyn0_div",
412ffae8475SNeil Armstrong 		.ops = &meson_clk_cpu_dyndiv_ops,
41325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
41425e682a0SAlexandre Mergnat 			&g12a_cpu_clk_premux0.hw
41525e682a0SAlexandre Mergnat 		},
416370294e2SNeil Armstrong 		.num_parents = 1,
417ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
418370294e2SNeil Armstrong 	},
419370294e2SNeil Armstrong };
420370294e2SNeil Armstrong 
421370294e2SNeil Armstrong /* Datasheet names this field as "postmux0" */
422370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_postmux0 = {
423370294e2SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
424370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
425370294e2SNeil Armstrong 		.mask = 0x1,
426370294e2SNeil Armstrong 		.shift = 2,
42790b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
428370294e2SNeil Armstrong 	},
429370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
430370294e2SNeil Armstrong 		.name = "cpu_clk_dyn0",
431ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
43225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
43325e682a0SAlexandre Mergnat 			&g12a_cpu_clk_premux0.hw,
43425e682a0SAlexandre Mergnat 			&g12a_cpu_clk_mux0_div.hw,
43525e682a0SAlexandre Mergnat 		},
436370294e2SNeil Armstrong 		.num_parents = 2,
437ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
438370294e2SNeil Armstrong 	},
439370294e2SNeil Armstrong };
440370294e2SNeil Armstrong 
441370294e2SNeil Armstrong /* Datasheet names this field as "Mux1_divn_tcnt" */
442370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_mux1_div = {
443370294e2SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
444370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
445370294e2SNeil Armstrong 		.shift = 20,
446370294e2SNeil Armstrong 		.width = 6,
447370294e2SNeil Armstrong 	},
448370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
449370294e2SNeil Armstrong 		.name = "cpu_clk_dyn1_div",
450370294e2SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
45125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
45225e682a0SAlexandre Mergnat 			&g12a_cpu_clk_premux1.hw
45325e682a0SAlexandre Mergnat 		},
454370294e2SNeil Armstrong 		.num_parents = 1,
455370294e2SNeil Armstrong 	},
456370294e2SNeil Armstrong };
457370294e2SNeil Armstrong 
458370294e2SNeil Armstrong /* Datasheet names this field as "postmux1" */
459370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_postmux1 = {
460370294e2SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
461370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
462370294e2SNeil Armstrong 		.mask = 0x1,
463370294e2SNeil Armstrong 		.shift = 18,
464370294e2SNeil Armstrong 	},
465370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
466370294e2SNeil Armstrong 		.name = "cpu_clk_dyn1",
467ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
46825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
46925e682a0SAlexandre Mergnat 			&g12a_cpu_clk_premux1.hw,
47025e682a0SAlexandre Mergnat 			&g12a_cpu_clk_mux1_div.hw,
47125e682a0SAlexandre Mergnat 		},
472370294e2SNeil Armstrong 		.num_parents = 2,
473ffae8475SNeil Armstrong 		/* This sub-tree is used a parking clock */
474ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
475370294e2SNeil Armstrong 	},
476370294e2SNeil Armstrong };
477370294e2SNeil Armstrong 
478370294e2SNeil Armstrong /* Datasheet names this field as "Final_dyn_mux_sel" */
479370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_dyn = {
480370294e2SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
481370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
482370294e2SNeil Armstrong 		.mask = 0x1,
483370294e2SNeil Armstrong 		.shift = 10,
48490b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
485370294e2SNeil Armstrong 	},
486370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
487370294e2SNeil Armstrong 		.name = "cpu_clk_dyn",
488ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
48925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
49025e682a0SAlexandre Mergnat 			&g12a_cpu_clk_postmux0.hw,
49125e682a0SAlexandre Mergnat 			&g12a_cpu_clk_postmux1.hw,
49225e682a0SAlexandre Mergnat 		},
493370294e2SNeil Armstrong 		.num_parents = 2,
494ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
495370294e2SNeil Armstrong 	},
496370294e2SNeil Armstrong };
497370294e2SNeil Armstrong 
498370294e2SNeil Armstrong /* Datasheet names this field as "Final_mux_sel" */
499370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk = {
500370294e2SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
501370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
502370294e2SNeil Armstrong 		.mask = 0x1,
503370294e2SNeil Armstrong 		.shift = 11,
50490b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
505370294e2SNeil Armstrong 	},
506370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
507370294e2SNeil Armstrong 		.name = "cpu_clk",
508ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
50925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
51025e682a0SAlexandre Mergnat 			&g12a_cpu_clk_dyn.hw,
51125e682a0SAlexandre Mergnat 			&g12a_sys_pll.hw,
51225e682a0SAlexandre Mergnat 		},
513370294e2SNeil Armstrong 		.num_parents = 2,
514ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
515370294e2SNeil Armstrong 	},
516370294e2SNeil Armstrong };
517370294e2SNeil Armstrong 
518d43628e9SNeil Armstrong /* Datasheet names this field as "Final_mux_sel" */
519d43628e9SNeil Armstrong static struct clk_regmap g12b_cpu_clk = {
520d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
521d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL0,
522d43628e9SNeil Armstrong 		.mask = 0x1,
523d43628e9SNeil Armstrong 		.shift = 11,
52490b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
525d43628e9SNeil Armstrong 	},
526d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
527d43628e9SNeil Armstrong 		.name = "cpu_clk",
528ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
52925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
53025e682a0SAlexandre Mergnat 			&g12a_cpu_clk_dyn.hw,
53125e682a0SAlexandre Mergnat 			&g12b_sys1_pll.hw
53225e682a0SAlexandre Mergnat 		},
533d43628e9SNeil Armstrong 		.num_parents = 2,
534ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
535d43628e9SNeil Armstrong 	},
536d43628e9SNeil Armstrong };
537d43628e9SNeil Armstrong 
538d43628e9SNeil Armstrong /* Datasheet names this field as "premux0" */
539d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_premux0 = {
540d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
541d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
542d43628e9SNeil Armstrong 		.mask = 0x3,
543d43628e9SNeil Armstrong 		.shift = 0,
54490b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
545d43628e9SNeil Armstrong 	},
546d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
547d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn0_sel",
548ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
54925e682a0SAlexandre Mergnat 		.parent_data = (const struct clk_parent_data []) {
55025e682a0SAlexandre Mergnat 			{ .fw_name = "xtal", },
55125e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div2.hw },
55225e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div3.hw },
55325e682a0SAlexandre Mergnat 		},
554d43628e9SNeil Armstrong 		.num_parents = 3,
5554a079643SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
556d43628e9SNeil Armstrong 	},
557d43628e9SNeil Armstrong };
558d43628e9SNeil Armstrong 
559d43628e9SNeil Armstrong /* Datasheet names this field as "mux0_divn_tcnt" */
560d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_mux0_div = {
561ffae8475SNeil Armstrong 	.data = &(struct meson_clk_cpu_dyndiv_data){
562ffae8475SNeil Armstrong 		.div = {
563ffae8475SNeil Armstrong 			.reg_off = HHI_SYS_CPUB_CLK_CNTL,
564d43628e9SNeil Armstrong 			.shift = 4,
565d43628e9SNeil Armstrong 			.width = 6,
566d43628e9SNeil Armstrong 		},
567ffae8475SNeil Armstrong 		.dyn = {
568ffae8475SNeil Armstrong 			.reg_off = HHI_SYS_CPUB_CLK_CNTL,
569ffae8475SNeil Armstrong 			.shift = 26,
570ffae8475SNeil Armstrong 			.width = 1,
571ffae8475SNeil Armstrong 		},
572ffae8475SNeil Armstrong 	},
573d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
574d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn0_div",
575ffae8475SNeil Armstrong 		.ops = &meson_clk_cpu_dyndiv_ops,
57625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
57725e682a0SAlexandre Mergnat 			&g12b_cpub_clk_premux0.hw
57825e682a0SAlexandre Mergnat 		},
579d43628e9SNeil Armstrong 		.num_parents = 1,
580ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
581d43628e9SNeil Armstrong 	},
582d43628e9SNeil Armstrong };
583d43628e9SNeil Armstrong 
584d43628e9SNeil Armstrong /* Datasheet names this field as "postmux0" */
585d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_postmux0 = {
586d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
587d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
588d43628e9SNeil Armstrong 		.mask = 0x1,
589d43628e9SNeil Armstrong 		.shift = 2,
59090b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
591d43628e9SNeil Armstrong 	},
592d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
593d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn0",
594ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
59525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
59625e682a0SAlexandre Mergnat 			&g12b_cpub_clk_premux0.hw,
59725e682a0SAlexandre Mergnat 			&g12b_cpub_clk_mux0_div.hw
59825e682a0SAlexandre Mergnat 		},
599d43628e9SNeil Armstrong 		.num_parents = 2,
600ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
601d43628e9SNeil Armstrong 	},
602d43628e9SNeil Armstrong };
603d43628e9SNeil Armstrong 
604d43628e9SNeil Armstrong /* Datasheet names this field as "premux1" */
605d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_premux1 = {
606d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
607d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
608d43628e9SNeil Armstrong 		.mask = 0x3,
609d43628e9SNeil Armstrong 		.shift = 16,
610d43628e9SNeil Armstrong 	},
611d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
612d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn1_sel",
613ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
61425e682a0SAlexandre Mergnat 		.parent_data = (const struct clk_parent_data []) {
61525e682a0SAlexandre Mergnat 			{ .fw_name = "xtal", },
61625e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div2.hw },
61725e682a0SAlexandre Mergnat 			{ .hw = &g12a_fclk_div3.hw },
61825e682a0SAlexandre Mergnat 		},
619d43628e9SNeil Armstrong 		.num_parents = 3,
620ffae8475SNeil Armstrong 		/* This sub-tree is used a parking clock */
621ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
622d43628e9SNeil Armstrong 	},
623d43628e9SNeil Armstrong };
624d43628e9SNeil Armstrong 
625d43628e9SNeil Armstrong /* Datasheet names this field as "Mux1_divn_tcnt" */
626d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_mux1_div = {
627d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
628d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
629d43628e9SNeil Armstrong 		.shift = 20,
630d43628e9SNeil Armstrong 		.width = 6,
631d43628e9SNeil Armstrong 	},
632d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
633d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn1_div",
634d43628e9SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
63525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
63625e682a0SAlexandre Mergnat 			&g12b_cpub_clk_premux1.hw
63725e682a0SAlexandre Mergnat 		},
638d43628e9SNeil Armstrong 		.num_parents = 1,
639d43628e9SNeil Armstrong 	},
640d43628e9SNeil Armstrong };
641d43628e9SNeil Armstrong 
642d43628e9SNeil Armstrong /* Datasheet names this field as "postmux1" */
643d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_postmux1 = {
644d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
645d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
646d43628e9SNeil Armstrong 		.mask = 0x1,
647d43628e9SNeil Armstrong 		.shift = 18,
648d43628e9SNeil Armstrong 	},
649d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
650d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn1",
651ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
65225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
65325e682a0SAlexandre Mergnat 			&g12b_cpub_clk_premux1.hw,
65425e682a0SAlexandre Mergnat 			&g12b_cpub_clk_mux1_div.hw
65525e682a0SAlexandre Mergnat 		},
656d43628e9SNeil Armstrong 		.num_parents = 2,
657ffae8475SNeil Armstrong 		/* This sub-tree is used a parking clock */
658ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
659d43628e9SNeil Armstrong 	},
660d43628e9SNeil Armstrong };
661d43628e9SNeil Armstrong 
662d43628e9SNeil Armstrong /* Datasheet names this field as "Final_dyn_mux_sel" */
663d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_dyn = {
664d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
665d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
666d43628e9SNeil Armstrong 		.mask = 0x1,
667d43628e9SNeil Armstrong 		.shift = 10,
66890b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
669d43628e9SNeil Armstrong 	},
670d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
671d43628e9SNeil Armstrong 		.name = "cpub_clk_dyn",
672ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
67325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
67425e682a0SAlexandre Mergnat 			&g12b_cpub_clk_postmux0.hw,
67525e682a0SAlexandre Mergnat 			&g12b_cpub_clk_postmux1.hw
67625e682a0SAlexandre Mergnat 		},
677d43628e9SNeil Armstrong 		.num_parents = 2,
678ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
679d43628e9SNeil Armstrong 	},
680d43628e9SNeil Armstrong };
681d43628e9SNeil Armstrong 
682d43628e9SNeil Armstrong /* Datasheet names this field as "Final_mux_sel" */
683d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk = {
684d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
685d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL,
686d43628e9SNeil Armstrong 		.mask = 0x1,
687d43628e9SNeil Armstrong 		.shift = 11,
68890b171f6SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
689d43628e9SNeil Armstrong 	},
690d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
691d43628e9SNeil Armstrong 		.name = "cpub_clk",
692ffae8475SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
69325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
69425e682a0SAlexandre Mergnat 			&g12b_cpub_clk_dyn.hw,
69525e682a0SAlexandre Mergnat 			&g12a_sys_pll.hw
69625e682a0SAlexandre Mergnat 		},
697d43628e9SNeil Armstrong 		.num_parents = 2,
698ffae8475SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
699d43628e9SNeil Armstrong 	},
700d43628e9SNeil Armstrong };
701d43628e9SNeil Armstrong 
7022edccd31SNeil Armstrong static struct clk_regmap sm1_gp1_pll;
7032edccd31SNeil Armstrong 
7042edccd31SNeil Armstrong /* Datasheet names this field as "premux0" */
7052edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_premux0 = {
7062edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
7072edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
7082edccd31SNeil Armstrong 		.mask = 0x3,
7092edccd31SNeil Armstrong 		.shift = 0,
7102edccd31SNeil Armstrong 	},
7112edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
7122edccd31SNeil Armstrong 		.name = "dsu_clk_dyn0_sel",
7132edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
7142edccd31SNeil Armstrong 		.parent_data = (const struct clk_parent_data []) {
7152edccd31SNeil Armstrong 			{ .fw_name = "xtal", },
7162edccd31SNeil Armstrong 			{ .hw = &g12a_fclk_div2.hw },
7172edccd31SNeil Armstrong 			{ .hw = &g12a_fclk_div3.hw },
7182edccd31SNeil Armstrong 			{ .hw = &sm1_gp1_pll.hw },
7192edccd31SNeil Armstrong 		},
7202edccd31SNeil Armstrong 		.num_parents = 4,
7212edccd31SNeil Armstrong 	},
7222edccd31SNeil Armstrong };
7232edccd31SNeil Armstrong 
7242edccd31SNeil Armstrong /* Datasheet names this field as "premux1" */
7252edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_premux1 = {
7262edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
7272edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
7282edccd31SNeil Armstrong 		.mask = 0x3,
7292edccd31SNeil Armstrong 		.shift = 16,
7302edccd31SNeil Armstrong 	},
7312edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
7322edccd31SNeil Armstrong 		.name = "dsu_clk_dyn1_sel",
7332edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
7342edccd31SNeil Armstrong 		.parent_data = (const struct clk_parent_data []) {
7352edccd31SNeil Armstrong 			{ .fw_name = "xtal", },
7362edccd31SNeil Armstrong 			{ .hw = &g12a_fclk_div2.hw },
7372edccd31SNeil Armstrong 			{ .hw = &g12a_fclk_div3.hw },
7382edccd31SNeil Armstrong 			{ .hw = &sm1_gp1_pll.hw },
7392edccd31SNeil Armstrong 		},
7402edccd31SNeil Armstrong 		.num_parents = 4,
7412edccd31SNeil Armstrong 	},
7422edccd31SNeil Armstrong };
7432edccd31SNeil Armstrong 
7442edccd31SNeil Armstrong /* Datasheet names this field as "Mux0_divn_tcnt" */
7452edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_mux0_div = {
7462edccd31SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
7472edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
7482edccd31SNeil Armstrong 		.shift = 4,
7492edccd31SNeil Armstrong 		.width = 6,
7502edccd31SNeil Armstrong 	},
7512edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
7522edccd31SNeil Armstrong 		.name = "dsu_clk_dyn0_div",
7532edccd31SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
7542edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
7552edccd31SNeil Armstrong 			&sm1_dsu_clk_premux0.hw
7562edccd31SNeil Armstrong 		},
7572edccd31SNeil Armstrong 		.num_parents = 1,
7582edccd31SNeil Armstrong 	},
7592edccd31SNeil Armstrong };
7602edccd31SNeil Armstrong 
7612edccd31SNeil Armstrong /* Datasheet names this field as "postmux0" */
7622edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_postmux0 = {
7632edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
7642edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
7652edccd31SNeil Armstrong 		.mask = 0x1,
7662edccd31SNeil Armstrong 		.shift = 2,
7672edccd31SNeil Armstrong 	},
7682edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
7692edccd31SNeil Armstrong 		.name = "dsu_clk_dyn0",
7702edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
7712edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
7722edccd31SNeil Armstrong 			&sm1_dsu_clk_premux0.hw,
7732edccd31SNeil Armstrong 			&sm1_dsu_clk_mux0_div.hw,
7742edccd31SNeil Armstrong 		},
7752edccd31SNeil Armstrong 		.num_parents = 2,
7762edccd31SNeil Armstrong 	},
7772edccd31SNeil Armstrong };
7782edccd31SNeil Armstrong 
7792edccd31SNeil Armstrong /* Datasheet names this field as "Mux1_divn_tcnt" */
7802edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_mux1_div = {
7812edccd31SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
7822edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
7832edccd31SNeil Armstrong 		.shift = 20,
7842edccd31SNeil Armstrong 		.width = 6,
7852edccd31SNeil Armstrong 	},
7862edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
7872edccd31SNeil Armstrong 		.name = "dsu_clk_dyn1_div",
7882edccd31SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
7892edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
7902edccd31SNeil Armstrong 			&sm1_dsu_clk_premux1.hw
7912edccd31SNeil Armstrong 		},
7922edccd31SNeil Armstrong 		.num_parents = 1,
7932edccd31SNeil Armstrong 	},
7942edccd31SNeil Armstrong };
7952edccd31SNeil Armstrong 
7962edccd31SNeil Armstrong /* Datasheet names this field as "postmux1" */
7972edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_postmux1 = {
7982edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
7992edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
8002edccd31SNeil Armstrong 		.mask = 0x1,
8012edccd31SNeil Armstrong 		.shift = 18,
8022edccd31SNeil Armstrong 	},
8032edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
8042edccd31SNeil Armstrong 		.name = "dsu_clk_dyn1",
8052edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
8062edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
8072edccd31SNeil Armstrong 			&sm1_dsu_clk_premux1.hw,
8082edccd31SNeil Armstrong 			&sm1_dsu_clk_mux1_div.hw,
8092edccd31SNeil Armstrong 		},
8102edccd31SNeil Armstrong 		.num_parents = 2,
8112edccd31SNeil Armstrong 	},
8122edccd31SNeil Armstrong };
8132edccd31SNeil Armstrong 
8142edccd31SNeil Armstrong /* Datasheet names this field as "Final_dyn_mux_sel" */
8152edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk_dyn = {
8162edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
8172edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
8182edccd31SNeil Armstrong 		.mask = 0x1,
8192edccd31SNeil Armstrong 		.shift = 10,
8202edccd31SNeil Armstrong 	},
8212edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
8222edccd31SNeil Armstrong 		.name = "dsu_clk_dyn",
8232edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
8242edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
8252edccd31SNeil Armstrong 			&sm1_dsu_clk_postmux0.hw,
8262edccd31SNeil Armstrong 			&sm1_dsu_clk_postmux1.hw,
8272edccd31SNeil Armstrong 		},
8282edccd31SNeil Armstrong 		.num_parents = 2,
8292edccd31SNeil Armstrong 	},
8302edccd31SNeil Armstrong };
8312edccd31SNeil Armstrong 
8322edccd31SNeil Armstrong /* Datasheet names this field as "Final_mux_sel" */
8332edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_final_clk = {
8342edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
8352edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL5,
8362edccd31SNeil Armstrong 		.mask = 0x1,
8372edccd31SNeil Armstrong 		.shift = 11,
8382edccd31SNeil Armstrong 	},
8392edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
8402edccd31SNeil Armstrong 		.name = "dsu_clk_final",
8412edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
8422edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
8432edccd31SNeil Armstrong 			&sm1_dsu_clk_dyn.hw,
8442edccd31SNeil Armstrong 			&g12a_sys_pll.hw,
8452edccd31SNeil Armstrong 		},
8462edccd31SNeil Armstrong 		.num_parents = 2,
8472edccd31SNeil Armstrong 	},
8482edccd31SNeil Armstrong };
8492edccd31SNeil Armstrong 
850da3ceae4SNeil Armstrong /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
851da3ceae4SNeil Armstrong static struct clk_regmap sm1_cpu1_clk = {
852da3ceae4SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
853da3ceae4SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL6,
854da3ceae4SNeil Armstrong 		.mask = 0x1,
855da3ceae4SNeil Armstrong 		.shift = 24,
856da3ceae4SNeil Armstrong 	},
857da3ceae4SNeil Armstrong 	.hw.init = &(struct clk_init_data){
858da3ceae4SNeil Armstrong 		.name = "cpu1_clk",
859da3ceae4SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
860da3ceae4SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
861da3ceae4SNeil Armstrong 			&g12a_cpu_clk.hw,
862da3ceae4SNeil Armstrong 			/* This CPU also have a dedicated clock tree */
863da3ceae4SNeil Armstrong 		},
864da3ceae4SNeil Armstrong 		.num_parents = 1,
865da3ceae4SNeil Armstrong 	},
866da3ceae4SNeil Armstrong };
867da3ceae4SNeil Armstrong 
868da3ceae4SNeil Armstrong /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
869da3ceae4SNeil Armstrong static struct clk_regmap sm1_cpu2_clk = {
870da3ceae4SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
871da3ceae4SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL6,
872da3ceae4SNeil Armstrong 		.mask = 0x1,
873da3ceae4SNeil Armstrong 		.shift = 25,
874da3ceae4SNeil Armstrong 	},
875da3ceae4SNeil Armstrong 	.hw.init = &(struct clk_init_data){
876da3ceae4SNeil Armstrong 		.name = "cpu2_clk",
877da3ceae4SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
878da3ceae4SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
879da3ceae4SNeil Armstrong 			&g12a_cpu_clk.hw,
880da3ceae4SNeil Armstrong 			/* This CPU also have a dedicated clock tree */
881da3ceae4SNeil Armstrong 		},
882da3ceae4SNeil Armstrong 		.num_parents = 1,
883da3ceae4SNeil Armstrong 	},
884da3ceae4SNeil Armstrong };
885da3ceae4SNeil Armstrong 
886da3ceae4SNeil Armstrong /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
887da3ceae4SNeil Armstrong static struct clk_regmap sm1_cpu3_clk = {
888da3ceae4SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
889da3ceae4SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL6,
890da3ceae4SNeil Armstrong 		.mask = 0x1,
891da3ceae4SNeil Armstrong 		.shift = 26,
892da3ceae4SNeil Armstrong 	},
893da3ceae4SNeil Armstrong 	.hw.init = &(struct clk_init_data){
894da3ceae4SNeil Armstrong 		.name = "cpu3_clk",
895da3ceae4SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
896da3ceae4SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
897da3ceae4SNeil Armstrong 			&g12a_cpu_clk.hw,
898da3ceae4SNeil Armstrong 			/* This CPU also have a dedicated clock tree */
899da3ceae4SNeil Armstrong 		},
900da3ceae4SNeil Armstrong 		.num_parents = 1,
901da3ceae4SNeil Armstrong 	},
902da3ceae4SNeil Armstrong };
903da3ceae4SNeil Armstrong 
9042edccd31SNeil Armstrong /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
9052edccd31SNeil Armstrong static struct clk_regmap sm1_dsu_clk = {
9062edccd31SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
9072edccd31SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL6,
9082edccd31SNeil Armstrong 		.mask = 0x1,
9092edccd31SNeil Armstrong 		.shift = 27,
9102edccd31SNeil Armstrong 	},
9112edccd31SNeil Armstrong 	.hw.init = &(struct clk_init_data){
9122edccd31SNeil Armstrong 		.name = "dsu_clk",
9132edccd31SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
9142edccd31SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
9152edccd31SNeil Armstrong 			&g12a_cpu_clk.hw,
9162edccd31SNeil Armstrong 			&sm1_dsu_final_clk.hw,
9172edccd31SNeil Armstrong 		},
9182edccd31SNeil Armstrong 		.num_parents = 2,
9192edccd31SNeil Armstrong 	},
9202edccd31SNeil Armstrong };
9212edccd31SNeil Armstrong 
g12a_cpu_clk_mux_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)922ffae8475SNeil Armstrong static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
923ffae8475SNeil Armstrong 					unsigned long event, void *data)
924ffae8475SNeil Armstrong {
925ffae8475SNeil Armstrong 	if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
926ffae8475SNeil Armstrong 		/* Wait for clock propagation before/after changing the mux */
927ffae8475SNeil Armstrong 		udelay(100);
928ffae8475SNeil Armstrong 		return NOTIFY_OK;
929ffae8475SNeil Armstrong 	}
930ffae8475SNeil Armstrong 
931ffae8475SNeil Armstrong 	return NOTIFY_DONE;
932ffae8475SNeil Armstrong }
933ffae8475SNeil Armstrong 
934ffae8475SNeil Armstrong static struct notifier_block g12a_cpu_clk_mux_nb = {
935ffae8475SNeil Armstrong 	.notifier_call = g12a_cpu_clk_mux_notifier_cb,
936ffae8475SNeil Armstrong };
937ffae8475SNeil Armstrong 
938ffae8475SNeil Armstrong struct g12a_cpu_clk_postmux_nb_data {
939ffae8475SNeil Armstrong 	struct notifier_block nb;
940ffae8475SNeil Armstrong 	struct clk_hw *xtal;
941ffae8475SNeil Armstrong 	struct clk_hw *cpu_clk_dyn;
942ffae8475SNeil Armstrong 	struct clk_hw *cpu_clk_postmux0;
943ffae8475SNeil Armstrong 	struct clk_hw *cpu_clk_postmux1;
944ffae8475SNeil Armstrong 	struct clk_hw *cpu_clk_premux1;
945ffae8475SNeil Armstrong };
946ffae8475SNeil Armstrong 
g12a_cpu_clk_postmux_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)947ffae8475SNeil Armstrong static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
948ffae8475SNeil Armstrong 					    unsigned long event, void *data)
949ffae8475SNeil Armstrong {
950ffae8475SNeil Armstrong 	struct g12a_cpu_clk_postmux_nb_data *nb_data =
951ffae8475SNeil Armstrong 		container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
952ffae8475SNeil Armstrong 
953ffae8475SNeil Armstrong 	switch (event) {
954ffae8475SNeil Armstrong 	case PRE_RATE_CHANGE:
955ffae8475SNeil Armstrong 		/*
956ffae8475SNeil Armstrong 		 * This notifier means cpu_clk_postmux0 clock will be changed
957ffae8475SNeil Armstrong 		 * to feed cpu_clk, this is the current path :
958ffae8475SNeil Armstrong 		 * cpu_clk
959ffae8475SNeil Armstrong 		 *    \- cpu_clk_dyn
960ffae8475SNeil Armstrong 		 *          \- cpu_clk_postmux0
961ffae8475SNeil Armstrong 		 *                \- cpu_clk_muxX_div
962ffae8475SNeil Armstrong 		 *                      \- cpu_clk_premux0
963ffae8475SNeil Armstrong 		 *				\- fclk_div3 or fclk_div2
964ffae8475SNeil Armstrong 		 *		OR
965ffae8475SNeil Armstrong 		 *                \- cpu_clk_premux0
966ffae8475SNeil Armstrong 		 *			\- fclk_div3 or fclk_div2
967ffae8475SNeil Armstrong 		 */
968ffae8475SNeil Armstrong 
969ffae8475SNeil Armstrong 		/* Setup cpu_clk_premux1 to xtal */
970ffae8475SNeil Armstrong 		clk_hw_set_parent(nb_data->cpu_clk_premux1,
971ffae8475SNeil Armstrong 				  nb_data->xtal);
972ffae8475SNeil Armstrong 
973ffae8475SNeil Armstrong 		/* Setup cpu_clk_postmux1 to bypass divider */
974ffae8475SNeil Armstrong 		clk_hw_set_parent(nb_data->cpu_clk_postmux1,
975ffae8475SNeil Armstrong 				  nb_data->cpu_clk_premux1);
976ffae8475SNeil Armstrong 
977ffae8475SNeil Armstrong 		/* Switch to parking clk on cpu_clk_postmux1 */
978ffae8475SNeil Armstrong 		clk_hw_set_parent(nb_data->cpu_clk_dyn,
979ffae8475SNeil Armstrong 				  nb_data->cpu_clk_postmux1);
980ffae8475SNeil Armstrong 
981ffae8475SNeil Armstrong 		/*
982ffae8475SNeil Armstrong 		 * Now, cpu_clk is 24MHz in the current path :
983ffae8475SNeil Armstrong 		 * cpu_clk
984ffae8475SNeil Armstrong 		 *    \- cpu_clk_dyn
985ffae8475SNeil Armstrong 		 *          \- cpu_clk_postmux1
986ffae8475SNeil Armstrong 		 *                \- cpu_clk_premux1
987ffae8475SNeil Armstrong 		 *                      \- xtal
988ffae8475SNeil Armstrong 		 */
989ffae8475SNeil Armstrong 
990ffae8475SNeil Armstrong 		udelay(100);
991ffae8475SNeil Armstrong 
992ffae8475SNeil Armstrong 		return NOTIFY_OK;
993ffae8475SNeil Armstrong 
994ffae8475SNeil Armstrong 	case POST_RATE_CHANGE:
995ffae8475SNeil Armstrong 		/*
996ffae8475SNeil Armstrong 		 * The cpu_clk_postmux0 has ben updated, now switch back
997ffae8475SNeil Armstrong 		 * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
998ffae8475SNeil Armstrong 		 * in account.
999ffae8475SNeil Armstrong 		 */
1000ffae8475SNeil Armstrong 
1001ffae8475SNeil Armstrong 		/* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
1002ffae8475SNeil Armstrong 		clk_hw_set_parent(nb_data->cpu_clk_dyn,
1003ffae8475SNeil Armstrong 				  nb_data->cpu_clk_postmux0);
1004ffae8475SNeil Armstrong 
1005ffae8475SNeil Armstrong 		/*
1006ffae8475SNeil Armstrong 		 * new path :
1007ffae8475SNeil Armstrong 		 * cpu_clk
1008ffae8475SNeil Armstrong 		 *    \- cpu_clk_dyn
1009ffae8475SNeil Armstrong 		 *          \- cpu_clk_postmux0
1010ffae8475SNeil Armstrong 		 *                \- cpu_clk_muxX_div
1011ffae8475SNeil Armstrong 		 *                      \- cpu_clk_premux0
1012ffae8475SNeil Armstrong 		 *				\- fclk_div3 or fclk_div2
1013ffae8475SNeil Armstrong 		 *		OR
1014ffae8475SNeil Armstrong 		 *                \- cpu_clk_premux0
1015ffae8475SNeil Armstrong 		 *			\- fclk_div3 or fclk_div2
1016ffae8475SNeil Armstrong 		 */
1017ffae8475SNeil Armstrong 
1018ffae8475SNeil Armstrong 		udelay(100);
1019ffae8475SNeil Armstrong 
1020ffae8475SNeil Armstrong 		return NOTIFY_OK;
1021ffae8475SNeil Armstrong 
1022ffae8475SNeil Armstrong 	default:
1023ffae8475SNeil Armstrong 		return NOTIFY_DONE;
1024ffae8475SNeil Armstrong 	}
1025ffae8475SNeil Armstrong }
1026ffae8475SNeil Armstrong 
1027ffae8475SNeil Armstrong static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
1028ffae8475SNeil Armstrong 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1029ffae8475SNeil Armstrong 	.cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
1030ffae8475SNeil Armstrong 	.cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
1031ffae8475SNeil Armstrong 	.cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
1032ffae8475SNeil Armstrong 	.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1033ffae8475SNeil Armstrong };
1034ffae8475SNeil Armstrong 
1035ffae8475SNeil Armstrong static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
1036ffae8475SNeil Armstrong 	.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1037ffae8475SNeil Armstrong 	.cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
1038ffae8475SNeil Armstrong 	.cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
1039ffae8475SNeil Armstrong 	.cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
1040ffae8475SNeil Armstrong 	.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1041ffae8475SNeil Armstrong };
1042ffae8475SNeil Armstrong 
1043ffae8475SNeil Armstrong struct g12a_sys_pll_nb_data {
1044ffae8475SNeil Armstrong 	struct notifier_block nb;
1045ffae8475SNeil Armstrong 	struct clk_hw *sys_pll;
1046ffae8475SNeil Armstrong 	struct clk_hw *cpu_clk;
1047ffae8475SNeil Armstrong 	struct clk_hw *cpu_clk_dyn;
1048ffae8475SNeil Armstrong };
1049ffae8475SNeil Armstrong 
g12a_sys_pll_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)1050ffae8475SNeil Armstrong static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
1051ffae8475SNeil Armstrong 				    unsigned long event, void *data)
1052ffae8475SNeil Armstrong {
1053ffae8475SNeil Armstrong 	struct g12a_sys_pll_nb_data *nb_data =
1054ffae8475SNeil Armstrong 		container_of(nb, struct g12a_sys_pll_nb_data, nb);
1055ffae8475SNeil Armstrong 
1056ffae8475SNeil Armstrong 	switch (event) {
1057ffae8475SNeil Armstrong 	case PRE_RATE_CHANGE:
1058ffae8475SNeil Armstrong 		/*
1059ffae8475SNeil Armstrong 		 * This notifier means sys_pll clock will be changed
1060ffae8475SNeil Armstrong 		 * to feed cpu_clk, this the current path :
1061ffae8475SNeil Armstrong 		 * cpu_clk
1062ffae8475SNeil Armstrong 		 *    \- sys_pll
1063ffae8475SNeil Armstrong 		 *          \- sys_pll_dco
1064ffae8475SNeil Armstrong 		 */
1065ffae8475SNeil Armstrong 
1066ffae8475SNeil Armstrong 		/* Configure cpu_clk to use cpu_clk_dyn */
1067ffae8475SNeil Armstrong 		clk_hw_set_parent(nb_data->cpu_clk,
1068ffae8475SNeil Armstrong 				  nb_data->cpu_clk_dyn);
1069ffae8475SNeil Armstrong 
1070ffae8475SNeil Armstrong 		/*
1071ffae8475SNeil Armstrong 		 * Now, cpu_clk uses the dyn path
1072ffae8475SNeil Armstrong 		 * cpu_clk
1073ffae8475SNeil Armstrong 		 *    \- cpu_clk_dyn
1074ffae8475SNeil Armstrong 		 *          \- cpu_clk_dynX
1075ffae8475SNeil Armstrong 		 *                \- cpu_clk_dynX_sel
1076ffae8475SNeil Armstrong 		 *		     \- cpu_clk_dynX_div
1077ffae8475SNeil Armstrong 		 *                      \- xtal/fclk_div2/fclk_div3
1078ffae8475SNeil Armstrong 		 *                   \- xtal/fclk_div2/fclk_div3
1079ffae8475SNeil Armstrong 		 */
1080ffae8475SNeil Armstrong 
1081ffae8475SNeil Armstrong 		udelay(100);
1082ffae8475SNeil Armstrong 
1083ffae8475SNeil Armstrong 		return NOTIFY_OK;
1084ffae8475SNeil Armstrong 
1085ffae8475SNeil Armstrong 	case POST_RATE_CHANGE:
1086ffae8475SNeil Armstrong 		/*
1087ffae8475SNeil Armstrong 		 * The sys_pll has ben updated, now switch back cpu_clk to
1088ffae8475SNeil Armstrong 		 * sys_pll
1089ffae8475SNeil Armstrong 		 */
1090ffae8475SNeil Armstrong 
1091ffae8475SNeil Armstrong 		/* Configure cpu_clk to use sys_pll */
1092ffae8475SNeil Armstrong 		clk_hw_set_parent(nb_data->cpu_clk,
1093ffae8475SNeil Armstrong 				  nb_data->sys_pll);
1094ffae8475SNeil Armstrong 
1095ffae8475SNeil Armstrong 		udelay(100);
1096ffae8475SNeil Armstrong 
1097ffae8475SNeil Armstrong 		/* new path :
1098ffae8475SNeil Armstrong 		 * cpu_clk
1099ffae8475SNeil Armstrong 		 *    \- sys_pll
1100ffae8475SNeil Armstrong 		 *          \- sys_pll_dco
1101ffae8475SNeil Armstrong 		 */
1102ffae8475SNeil Armstrong 
1103ffae8475SNeil Armstrong 		return NOTIFY_OK;
1104ffae8475SNeil Armstrong 
1105ffae8475SNeil Armstrong 	default:
1106ffae8475SNeil Armstrong 		return NOTIFY_DONE;
1107ffae8475SNeil Armstrong 	}
1108ffae8475SNeil Armstrong }
1109ffae8475SNeil Armstrong 
1110ffae8475SNeil Armstrong static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
1111ffae8475SNeil Armstrong 	.sys_pll = &g12a_sys_pll.hw,
1112ffae8475SNeil Armstrong 	.cpu_clk = &g12a_cpu_clk.hw,
1113ffae8475SNeil Armstrong 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1114ffae8475SNeil Armstrong 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1115ffae8475SNeil Armstrong };
1116ffae8475SNeil Armstrong 
1117ffae8475SNeil Armstrong /* G12B first CPU cluster uses sys1_pll */
1118ffae8475SNeil Armstrong static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
1119ffae8475SNeil Armstrong 	.sys_pll = &g12b_sys1_pll.hw,
1120ffae8475SNeil Armstrong 	.cpu_clk = &g12b_cpu_clk.hw,
1121ffae8475SNeil Armstrong 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1122ffae8475SNeil Armstrong 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1123ffae8475SNeil Armstrong };
1124ffae8475SNeil Armstrong 
1125ffae8475SNeil Armstrong /* G12B second CPU cluster uses sys_pll */
1126ffae8475SNeil Armstrong static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
1127ffae8475SNeil Armstrong 	.sys_pll = &g12a_sys_pll.hw,
1128ffae8475SNeil Armstrong 	.cpu_clk = &g12b_cpub_clk.hw,
1129ffae8475SNeil Armstrong 	.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1130ffae8475SNeil Armstrong 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1131ffae8475SNeil Armstrong };
1132ffae8475SNeil Armstrong 
1133370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_div16_en = {
1134370294e2SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1135370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1136370294e2SNeil Armstrong 		.bit_idx = 1,
1137370294e2SNeil Armstrong 	},
1138370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1139370294e2SNeil Armstrong 		.name = "cpu_clk_div16_en",
1140370294e2SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
114125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
114225e682a0SAlexandre Mergnat 			&g12a_cpu_clk.hw
114325e682a0SAlexandre Mergnat 		},
1144370294e2SNeil Armstrong 		.num_parents = 1,
1145370294e2SNeil Armstrong 		/*
1146370294e2SNeil Armstrong 		 * This clock is used to debug the cpu_clk range
1147370294e2SNeil Armstrong 		 * Linux should not change it at runtime
1148370294e2SNeil Armstrong 		 */
1149370294e2SNeil Armstrong 	},
1150370294e2SNeil Armstrong };
1151370294e2SNeil Armstrong 
1152d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_div16_en = {
1153d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1154d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1155d43628e9SNeil Armstrong 		.bit_idx = 1,
1156d43628e9SNeil Armstrong 	},
1157d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1158d43628e9SNeil Armstrong 		.name = "cpub_clk_div16_en",
1159d43628e9SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
116025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
116125e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
116225e682a0SAlexandre Mergnat 		},
1163d43628e9SNeil Armstrong 		.num_parents = 1,
1164d43628e9SNeil Armstrong 		/*
1165d43628e9SNeil Armstrong 		 * This clock is used to debug the cpu_clk range
1166d43628e9SNeil Armstrong 		 * Linux should not change it at runtime
1167d43628e9SNeil Armstrong 		 */
1168d43628e9SNeil Armstrong 	},
1169d43628e9SNeil Armstrong };
1170d43628e9SNeil Armstrong 
1171370294e2SNeil Armstrong static struct clk_fixed_factor g12a_cpu_clk_div16 = {
1172370294e2SNeil Armstrong 	.mult = 1,
1173370294e2SNeil Armstrong 	.div = 16,
1174370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1175370294e2SNeil Armstrong 		.name = "cpu_clk_div16",
1176370294e2SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
117725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
117825e682a0SAlexandre Mergnat 			&g12a_cpu_clk_div16_en.hw
117925e682a0SAlexandre Mergnat 		},
1180370294e2SNeil Armstrong 		.num_parents = 1,
1181370294e2SNeil Armstrong 	},
1182370294e2SNeil Armstrong };
1183370294e2SNeil Armstrong 
1184d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div16 = {
1185d43628e9SNeil Armstrong 	.mult = 1,
1186d43628e9SNeil Armstrong 	.div = 16,
1187d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1188d43628e9SNeil Armstrong 		.name = "cpub_clk_div16",
1189d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
119025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
119125e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div16_en.hw
119225e682a0SAlexandre Mergnat 		},
1193d43628e9SNeil Armstrong 		.num_parents = 1,
1194d43628e9SNeil Armstrong 	},
1195d43628e9SNeil Armstrong };
1196d43628e9SNeil Armstrong 
1197370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_apb_div = {
1198370294e2SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
1199370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1200370294e2SNeil Armstrong 		.shift = 3,
1201370294e2SNeil Armstrong 		.width = 3,
1202370294e2SNeil Armstrong 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1203370294e2SNeil Armstrong 	},
1204370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1205370294e2SNeil Armstrong 		.name = "cpu_clk_apb_div",
1206370294e2SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
120725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
1208370294e2SNeil Armstrong 		.num_parents = 1,
1209370294e2SNeil Armstrong 	},
1210370294e2SNeil Armstrong };
1211370294e2SNeil Armstrong 
1212370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_apb = {
1213370294e2SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1214370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1215370294e2SNeil Armstrong 		.bit_idx = 1,
1216370294e2SNeil Armstrong 	},
1217370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1218370294e2SNeil Armstrong 		.name = "cpu_clk_apb",
1219370294e2SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
122025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
122125e682a0SAlexandre Mergnat 			&g12a_cpu_clk_apb_div.hw
122225e682a0SAlexandre Mergnat 		},
1223370294e2SNeil Armstrong 		.num_parents = 1,
1224370294e2SNeil Armstrong 		/*
1225370294e2SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1226370294e2SNeil Armstrong 		 * Linux should not change it at runtime
1227370294e2SNeil Armstrong 		 */
1228370294e2SNeil Armstrong 	},
1229370294e2SNeil Armstrong };
1230370294e2SNeil Armstrong 
1231370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_atb_div = {
1232370294e2SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
1233370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1234370294e2SNeil Armstrong 		.shift = 6,
1235370294e2SNeil Armstrong 		.width = 3,
1236370294e2SNeil Armstrong 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1237370294e2SNeil Armstrong 	},
1238370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1239370294e2SNeil Armstrong 		.name = "cpu_clk_atb_div",
1240370294e2SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
124125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
1242370294e2SNeil Armstrong 		.num_parents = 1,
1243370294e2SNeil Armstrong 	},
1244370294e2SNeil Armstrong };
1245370294e2SNeil Armstrong 
1246370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_atb = {
1247370294e2SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1248370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1249370294e2SNeil Armstrong 		.bit_idx = 17,
1250370294e2SNeil Armstrong 	},
1251370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1252370294e2SNeil Armstrong 		.name = "cpu_clk_atb",
1253370294e2SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
125425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
125525e682a0SAlexandre Mergnat 			&g12a_cpu_clk_atb_div.hw
125625e682a0SAlexandre Mergnat 		},
1257370294e2SNeil Armstrong 		.num_parents = 1,
1258370294e2SNeil Armstrong 		/*
1259370294e2SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1260370294e2SNeil Armstrong 		 * Linux should not change it at runtime
1261370294e2SNeil Armstrong 		 */
1262370294e2SNeil Armstrong 	},
1263370294e2SNeil Armstrong };
1264370294e2SNeil Armstrong 
1265370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_axi_div = {
1266370294e2SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
1267370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1268370294e2SNeil Armstrong 		.shift = 9,
1269370294e2SNeil Armstrong 		.width = 3,
1270370294e2SNeil Armstrong 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1271370294e2SNeil Armstrong 	},
1272370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1273370294e2SNeil Armstrong 		.name = "cpu_clk_axi_div",
1274370294e2SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
127525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
1276370294e2SNeil Armstrong 		.num_parents = 1,
1277370294e2SNeil Armstrong 	},
1278370294e2SNeil Armstrong };
1279370294e2SNeil Armstrong 
1280370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_axi = {
1281370294e2SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1282370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1283370294e2SNeil Armstrong 		.bit_idx = 18,
1284370294e2SNeil Armstrong 	},
1285370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1286370294e2SNeil Armstrong 		.name = "cpu_clk_axi",
1287370294e2SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
128825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
128925e682a0SAlexandre Mergnat 			&g12a_cpu_clk_axi_div.hw
129025e682a0SAlexandre Mergnat 		},
1291370294e2SNeil Armstrong 		.num_parents = 1,
1292370294e2SNeil Armstrong 		/*
1293370294e2SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1294370294e2SNeil Armstrong 		 * Linux should not change it at runtime
1295370294e2SNeil Armstrong 		 */
1296370294e2SNeil Armstrong 	},
1297370294e2SNeil Armstrong };
1298370294e2SNeil Armstrong 
1299370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_trace_div = {
1300370294e2SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
1301370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1302370294e2SNeil Armstrong 		.shift = 20,
1303370294e2SNeil Armstrong 		.width = 3,
1304370294e2SNeil Armstrong 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1305370294e2SNeil Armstrong 	},
1306370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1307370294e2SNeil Armstrong 		.name = "cpu_clk_trace_div",
1308370294e2SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
130925e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
131025e682a0SAlexandre Mergnat 			/*
131125e682a0SAlexandre Mergnat 			 * Note:
131225e682a0SAlexandre Mergnat 			 * G12A and G12B have different cpu_clks (with
131325e682a0SAlexandre Mergnat 			 * different struct clk_hw). We fallback to the global
131425e682a0SAlexandre Mergnat 			 * naming string mechanism so cpu_clk_trace_div picks
131525e682a0SAlexandre Mergnat 			 * up the appropriate one.
131625e682a0SAlexandre Mergnat 			 */
131725e682a0SAlexandre Mergnat 			.name = "cpu_clk",
131825e682a0SAlexandre Mergnat 			.index = -1,
131925e682a0SAlexandre Mergnat 		},
1320370294e2SNeil Armstrong 		.num_parents = 1,
1321370294e2SNeil Armstrong 	},
1322370294e2SNeil Armstrong };
1323370294e2SNeil Armstrong 
1324370294e2SNeil Armstrong static struct clk_regmap g12a_cpu_clk_trace = {
1325370294e2SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1326370294e2SNeil Armstrong 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1327370294e2SNeil Armstrong 		.bit_idx = 23,
1328370294e2SNeil Armstrong 	},
1329370294e2SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1330370294e2SNeil Armstrong 		.name = "cpu_clk_trace",
1331370294e2SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
133225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
133325e682a0SAlexandre Mergnat 			&g12a_cpu_clk_trace_div.hw
133425e682a0SAlexandre Mergnat 		},
1335370294e2SNeil Armstrong 		.num_parents = 1,
1336370294e2SNeil Armstrong 		/*
1337370294e2SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1338370294e2SNeil Armstrong 		 * Linux should not change it at runtime
1339370294e2SNeil Armstrong 		 */
1340370294e2SNeil Armstrong 	},
1341370294e2SNeil Armstrong };
1342370294e2SNeil Armstrong 
1343d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div2 = {
1344d43628e9SNeil Armstrong 	.mult = 1,
1345d43628e9SNeil Armstrong 	.div = 2,
1346d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1347d43628e9SNeil Armstrong 		.name = "cpub_clk_div2",
1348d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
134925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
135025e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
135125e682a0SAlexandre Mergnat 		},
1352d43628e9SNeil Armstrong 		.num_parents = 1,
1353d43628e9SNeil Armstrong 	},
1354d43628e9SNeil Armstrong };
1355d43628e9SNeil Armstrong 
1356d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div3 = {
1357d43628e9SNeil Armstrong 	.mult = 1,
1358d43628e9SNeil Armstrong 	.div = 3,
1359d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1360d43628e9SNeil Armstrong 		.name = "cpub_clk_div3",
1361d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
136225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
136325e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
136425e682a0SAlexandre Mergnat 		},
1365d43628e9SNeil Armstrong 		.num_parents = 1,
1366d43628e9SNeil Armstrong 	},
1367d43628e9SNeil Armstrong };
1368d43628e9SNeil Armstrong 
1369d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div4 = {
1370d43628e9SNeil Armstrong 	.mult = 1,
1371d43628e9SNeil Armstrong 	.div = 4,
1372d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1373d43628e9SNeil Armstrong 		.name = "cpub_clk_div4",
1374d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
137525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
137625e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
137725e682a0SAlexandre Mergnat 		},
1378d43628e9SNeil Armstrong 		.num_parents = 1,
1379d43628e9SNeil Armstrong 	},
1380d43628e9SNeil Armstrong };
1381d43628e9SNeil Armstrong 
1382d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div5 = {
1383d43628e9SNeil Armstrong 	.mult = 1,
1384d43628e9SNeil Armstrong 	.div = 5,
1385d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1386d43628e9SNeil Armstrong 		.name = "cpub_clk_div5",
1387d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
138825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
138925e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
139025e682a0SAlexandre Mergnat 		},
1391d43628e9SNeil Armstrong 		.num_parents = 1,
1392d43628e9SNeil Armstrong 	},
1393d43628e9SNeil Armstrong };
1394d43628e9SNeil Armstrong 
1395d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div6 = {
1396d43628e9SNeil Armstrong 	.mult = 1,
1397d43628e9SNeil Armstrong 	.div = 6,
1398d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1399d43628e9SNeil Armstrong 		.name = "cpub_clk_div6",
1400d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
140125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
140225e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
140325e682a0SAlexandre Mergnat 		},
1404d43628e9SNeil Armstrong 		.num_parents = 1,
1405d43628e9SNeil Armstrong 	},
1406d43628e9SNeil Armstrong };
1407d43628e9SNeil Armstrong 
1408d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div7 = {
1409d43628e9SNeil Armstrong 	.mult = 1,
1410d43628e9SNeil Armstrong 	.div = 7,
1411d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1412d43628e9SNeil Armstrong 		.name = "cpub_clk_div7",
1413d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
141425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
141525e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
141625e682a0SAlexandre Mergnat 		},
1417d43628e9SNeil Armstrong 		.num_parents = 1,
1418d43628e9SNeil Armstrong 	},
1419d43628e9SNeil Armstrong };
1420d43628e9SNeil Armstrong 
1421d43628e9SNeil Armstrong static struct clk_fixed_factor g12b_cpub_clk_div8 = {
1422d43628e9SNeil Armstrong 	.mult = 1,
1423d43628e9SNeil Armstrong 	.div = 8,
1424d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1425d43628e9SNeil Armstrong 		.name = "cpub_clk_div8",
1426d43628e9SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
142725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
142825e682a0SAlexandre Mergnat 			&g12b_cpub_clk.hw
142925e682a0SAlexandre Mergnat 		},
1430d43628e9SNeil Armstrong 		.num_parents = 1,
1431d43628e9SNeil Armstrong 	},
1432d43628e9SNeil Armstrong };
1433d43628e9SNeil Armstrong 
1434d43628e9SNeil Armstrong static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
1435d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_apb_sel = {
1436d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
1437d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1438d43628e9SNeil Armstrong 		.mask = 7,
1439d43628e9SNeil Armstrong 		.shift = 3,
1440d43628e9SNeil Armstrong 		.table = mux_table_cpub,
1441d43628e9SNeil Armstrong 	},
1442d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1443d43628e9SNeil Armstrong 		.name = "cpub_clk_apb_sel",
1444d43628e9SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
144525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
144625e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div2.hw,
144725e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div3.hw,
144825e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div4.hw,
144925e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div5.hw,
145025e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div6.hw,
145125e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div7.hw,
145225e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div8.hw
145325e682a0SAlexandre Mergnat 		},
1454d43628e9SNeil Armstrong 		.num_parents = 7,
1455d43628e9SNeil Armstrong 	},
1456d43628e9SNeil Armstrong };
1457d43628e9SNeil Armstrong 
1458d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_apb = {
1459d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1460d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1461d43628e9SNeil Armstrong 		.bit_idx = 16,
1462d43628e9SNeil Armstrong 		.flags = CLK_GATE_SET_TO_DISABLE,
1463d43628e9SNeil Armstrong 	},
1464d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1465d43628e9SNeil Armstrong 		.name = "cpub_clk_apb",
1466d43628e9SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
146725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
146825e682a0SAlexandre Mergnat 			&g12b_cpub_clk_apb_sel.hw
146925e682a0SAlexandre Mergnat 		},
1470d43628e9SNeil Armstrong 		.num_parents = 1,
1471d43628e9SNeil Armstrong 		/*
1472d43628e9SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1473d43628e9SNeil Armstrong 		 * Linux should not change it at runtime
1474d43628e9SNeil Armstrong 		 */
1475d43628e9SNeil Armstrong 	},
1476d43628e9SNeil Armstrong };
1477d43628e9SNeil Armstrong 
1478d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_atb_sel = {
1479d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
1480d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1481d43628e9SNeil Armstrong 		.mask = 7,
1482d43628e9SNeil Armstrong 		.shift = 6,
1483d43628e9SNeil Armstrong 		.table = mux_table_cpub,
1484d43628e9SNeil Armstrong 	},
1485d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1486d43628e9SNeil Armstrong 		.name = "cpub_clk_atb_sel",
1487d43628e9SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
148825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
148925e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div2.hw,
149025e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div3.hw,
149125e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div4.hw,
149225e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div5.hw,
149325e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div6.hw,
149425e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div7.hw,
149525e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div8.hw
149625e682a0SAlexandre Mergnat 		},
1497d43628e9SNeil Armstrong 		.num_parents = 7,
1498d43628e9SNeil Armstrong 	},
1499d43628e9SNeil Armstrong };
1500d43628e9SNeil Armstrong 
1501d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_atb = {
1502d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1503d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1504d43628e9SNeil Armstrong 		.bit_idx = 17,
1505d43628e9SNeil Armstrong 		.flags = CLK_GATE_SET_TO_DISABLE,
1506d43628e9SNeil Armstrong 	},
1507d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1508d43628e9SNeil Armstrong 		.name = "cpub_clk_atb",
1509d43628e9SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
151025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
151125e682a0SAlexandre Mergnat 			&g12b_cpub_clk_atb_sel.hw
151225e682a0SAlexandre Mergnat 		},
1513d43628e9SNeil Armstrong 		.num_parents = 1,
1514d43628e9SNeil Armstrong 		/*
1515d43628e9SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1516d43628e9SNeil Armstrong 		 * Linux should not change it at runtime
1517d43628e9SNeil Armstrong 		 */
1518d43628e9SNeil Armstrong 	},
1519d43628e9SNeil Armstrong };
1520d43628e9SNeil Armstrong 
1521d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_axi_sel = {
1522d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
1523d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1524d43628e9SNeil Armstrong 		.mask = 7,
1525d43628e9SNeil Armstrong 		.shift = 9,
1526d43628e9SNeil Armstrong 		.table = mux_table_cpub,
1527d43628e9SNeil Armstrong 	},
1528d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1529d43628e9SNeil Armstrong 		.name = "cpub_clk_axi_sel",
1530d43628e9SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
153125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
153225e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div2.hw,
153325e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div3.hw,
153425e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div4.hw,
153525e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div5.hw,
153625e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div6.hw,
153725e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div7.hw,
153825e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div8.hw
153925e682a0SAlexandre Mergnat 		},
1540d43628e9SNeil Armstrong 		.num_parents = 7,
1541d43628e9SNeil Armstrong 	},
1542d43628e9SNeil Armstrong };
1543d43628e9SNeil Armstrong 
1544d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_axi = {
1545d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1546d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1547d43628e9SNeil Armstrong 		.bit_idx = 18,
1548d43628e9SNeil Armstrong 		.flags = CLK_GATE_SET_TO_DISABLE,
1549d43628e9SNeil Armstrong 	},
1550d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1551d43628e9SNeil Armstrong 		.name = "cpub_clk_axi",
1552d43628e9SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
155325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
155425e682a0SAlexandre Mergnat 			&g12b_cpub_clk_axi_sel.hw
155525e682a0SAlexandre Mergnat 		},
1556d43628e9SNeil Armstrong 		.num_parents = 1,
1557d43628e9SNeil Armstrong 		/*
1558d43628e9SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1559d43628e9SNeil Armstrong 		 * Linux should not change it at runtime
1560d43628e9SNeil Armstrong 		 */
1561d43628e9SNeil Armstrong 	},
1562d43628e9SNeil Armstrong };
1563d43628e9SNeil Armstrong 
1564d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_trace_sel = {
1565d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
1566d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1567d43628e9SNeil Armstrong 		.mask = 7,
1568d43628e9SNeil Armstrong 		.shift = 20,
1569d43628e9SNeil Armstrong 		.table = mux_table_cpub,
1570d43628e9SNeil Armstrong 	},
1571d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data){
1572d43628e9SNeil Armstrong 		.name = "cpub_clk_trace_sel",
1573d43628e9SNeil Armstrong 		.ops = &clk_regmap_mux_ro_ops,
157425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
157525e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div2.hw,
157625e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div3.hw,
157725e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div4.hw,
157825e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div5.hw,
157925e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div6.hw,
158025e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div7.hw,
158125e682a0SAlexandre Mergnat 			&g12b_cpub_clk_div8.hw
158225e682a0SAlexandre Mergnat 		},
1583d43628e9SNeil Armstrong 		.num_parents = 7,
1584d43628e9SNeil Armstrong 	},
1585d43628e9SNeil Armstrong };
1586d43628e9SNeil Armstrong 
1587d43628e9SNeil Armstrong static struct clk_regmap g12b_cpub_clk_trace = {
1588d43628e9SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
1589d43628e9SNeil Armstrong 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1590d43628e9SNeil Armstrong 		.bit_idx = 23,
1591d43628e9SNeil Armstrong 		.flags = CLK_GATE_SET_TO_DISABLE,
1592d43628e9SNeil Armstrong 	},
1593d43628e9SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
1594d43628e9SNeil Armstrong 		.name = "cpub_clk_trace",
1595d43628e9SNeil Armstrong 		.ops = &clk_regmap_gate_ro_ops,
159625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
159725e682a0SAlexandre Mergnat 			&g12b_cpub_clk_trace_sel.hw
159825e682a0SAlexandre Mergnat 		},
1599d43628e9SNeil Armstrong 		.num_parents = 1,
1600d43628e9SNeil Armstrong 		/*
1601d43628e9SNeil Armstrong 		 * This clock is set by the ROM monitor code,
1602d43628e9SNeil Armstrong 		 * Linux should not change it at runtime
1603d43628e9SNeil Armstrong 		 */
1604d43628e9SNeil Armstrong 	},
1605d43628e9SNeil Armstrong };
1606d43628e9SNeil Armstrong 
1607085a4ea9SJian Hu static const struct pll_mult_range g12a_gp0_pll_mult_range = {
1608bc794f8cSJerome Brunet 	.min = 125,
1609085a4ea9SJian Hu 	.max = 255,
1610085a4ea9SJian Hu };
1611085a4ea9SJian Hu 
1612085a4ea9SJian Hu /*
1613085a4ea9SJian Hu  * Internal gp0 pll emulation configuration parameters
1614085a4ea9SJian Hu  */
1615085a4ea9SJian Hu static const struct reg_sequence g12a_gp0_init_regs[] = {
1616085a4ea9SJian Hu 	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0x00000000 },
1617085a4ea9SJian Hu 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0x00000000 },
1618085a4ea9SJian Hu 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x48681c00 },
1619085a4ea9SJian Hu 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0x33771290 },
1620085a4ea9SJian Hu 	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x39272000 },
1621085a4ea9SJian Hu 	{ .reg = HHI_GP0_PLL_CNTL6,	.def = 0x56540000 },
1622085a4ea9SJian Hu };
1623085a4ea9SJian Hu 
1624085a4ea9SJian Hu static struct clk_regmap g12a_gp0_pll_dco = {
1625085a4ea9SJian Hu 	.data = &(struct meson_clk_pll_data){
1626085a4ea9SJian Hu 		.en = {
1627085a4ea9SJian Hu 			.reg_off = HHI_GP0_PLL_CNTL0,
1628085a4ea9SJian Hu 			.shift   = 28,
1629085a4ea9SJian Hu 			.width   = 1,
1630085a4ea9SJian Hu 		},
1631085a4ea9SJian Hu 		.m = {
1632085a4ea9SJian Hu 			.reg_off = HHI_GP0_PLL_CNTL0,
1633085a4ea9SJian Hu 			.shift   = 0,
1634085a4ea9SJian Hu 			.width   = 8,
1635085a4ea9SJian Hu 		},
1636085a4ea9SJian Hu 		.n = {
1637085a4ea9SJian Hu 			.reg_off = HHI_GP0_PLL_CNTL0,
1638085a4ea9SJian Hu 			.shift   = 10,
1639085a4ea9SJian Hu 			.width   = 5,
1640085a4ea9SJian Hu 		},
1641085a4ea9SJian Hu 		.frac = {
1642085a4ea9SJian Hu 			.reg_off = HHI_GP0_PLL_CNTL1,
1643085a4ea9SJian Hu 			.shift   = 0,
1644085a4ea9SJian Hu 			.width   = 17,
1645085a4ea9SJian Hu 		},
1646085a4ea9SJian Hu 		.l = {
1647085a4ea9SJian Hu 			.reg_off = HHI_GP0_PLL_CNTL0,
1648085a4ea9SJian Hu 			.shift   = 31,
1649085a4ea9SJian Hu 			.width   = 1,
1650085a4ea9SJian Hu 		},
1651085a4ea9SJian Hu 		.rst = {
1652085a4ea9SJian Hu 			.reg_off = HHI_GP0_PLL_CNTL0,
1653085a4ea9SJian Hu 			.shift   = 29,
1654085a4ea9SJian Hu 			.width   = 1,
1655085a4ea9SJian Hu 		},
1656085a4ea9SJian Hu 		.range = &g12a_gp0_pll_mult_range,
1657085a4ea9SJian Hu 		.init_regs = g12a_gp0_init_regs,
1658085a4ea9SJian Hu 		.init_count = ARRAY_SIZE(g12a_gp0_init_regs),
1659085a4ea9SJian Hu 	},
1660085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
1661085a4ea9SJian Hu 		.name = "gp0_pll_dco",
1662085a4ea9SJian Hu 		.ops = &meson_clk_pll_ops,
166325e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
166425e682a0SAlexandre Mergnat 			.fw_name = "xtal",
166525e682a0SAlexandre Mergnat 		},
1666085a4ea9SJian Hu 		.num_parents = 1,
1667085a4ea9SJian Hu 	},
1668085a4ea9SJian Hu };
1669085a4ea9SJian Hu 
1670085a4ea9SJian Hu static struct clk_regmap g12a_gp0_pll = {
1671085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
1672085a4ea9SJian Hu 		.offset = HHI_GP0_PLL_CNTL0,
1673085a4ea9SJian Hu 		.shift = 16,
1674085a4ea9SJian Hu 		.width = 3,
1675085a4ea9SJian Hu 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1676085a4ea9SJian Hu 			  CLK_DIVIDER_ROUND_CLOSEST),
1677085a4ea9SJian Hu 	},
1678085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
1679085a4ea9SJian Hu 		.name = "gp0_pll",
1680085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
168125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
168225e682a0SAlexandre Mergnat 			&g12a_gp0_pll_dco.hw
168325e682a0SAlexandre Mergnat 		},
1684085a4ea9SJian Hu 		.num_parents = 1,
1685085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1686085a4ea9SJian Hu 	},
1687085a4ea9SJian Hu };
1688085a4ea9SJian Hu 
16893dd02b73SNeil Armstrong static struct clk_regmap sm1_gp1_pll_dco = {
16903dd02b73SNeil Armstrong 	.data = &(struct meson_clk_pll_data){
16913dd02b73SNeil Armstrong 		.en = {
16923dd02b73SNeil Armstrong 			.reg_off = HHI_GP1_PLL_CNTL0,
16933dd02b73SNeil Armstrong 			.shift   = 28,
16943dd02b73SNeil Armstrong 			.width   = 1,
16953dd02b73SNeil Armstrong 		},
16963dd02b73SNeil Armstrong 		.m = {
16973dd02b73SNeil Armstrong 			.reg_off = HHI_GP1_PLL_CNTL0,
16983dd02b73SNeil Armstrong 			.shift   = 0,
16993dd02b73SNeil Armstrong 			.width   = 8,
17003dd02b73SNeil Armstrong 		},
17013dd02b73SNeil Armstrong 		.n = {
17023dd02b73SNeil Armstrong 			.reg_off = HHI_GP1_PLL_CNTL0,
17033dd02b73SNeil Armstrong 			.shift   = 10,
17043dd02b73SNeil Armstrong 			.width   = 5,
17053dd02b73SNeil Armstrong 		},
17063dd02b73SNeil Armstrong 		.frac = {
17073dd02b73SNeil Armstrong 			.reg_off = HHI_GP1_PLL_CNTL1,
17083dd02b73SNeil Armstrong 			.shift   = 0,
17093dd02b73SNeil Armstrong 			.width   = 17,
17103dd02b73SNeil Armstrong 		},
17113dd02b73SNeil Armstrong 		.l = {
17123dd02b73SNeil Armstrong 			.reg_off = HHI_GP1_PLL_CNTL0,
17133dd02b73SNeil Armstrong 			.shift   = 31,
17143dd02b73SNeil Armstrong 			.width   = 1,
17153dd02b73SNeil Armstrong 		},
17163dd02b73SNeil Armstrong 		.rst = {
17173dd02b73SNeil Armstrong 			.reg_off = HHI_GP1_PLL_CNTL0,
17183dd02b73SNeil Armstrong 			.shift   = 29,
17193dd02b73SNeil Armstrong 			.width   = 1,
17203dd02b73SNeil Armstrong 		},
17213dd02b73SNeil Armstrong 	},
17223dd02b73SNeil Armstrong 	.hw.init = &(struct clk_init_data){
17233dd02b73SNeil Armstrong 		.name = "gp1_pll_dco",
17243dd02b73SNeil Armstrong 		.ops = &meson_clk_pll_ro_ops,
17253dd02b73SNeil Armstrong 		.parent_data = &(const struct clk_parent_data) {
17263dd02b73SNeil Armstrong 			.fw_name = "xtal",
17273dd02b73SNeil Armstrong 		},
17283dd02b73SNeil Armstrong 		.num_parents = 1,
17293dd02b73SNeil Armstrong 		/* This clock feeds the DSU, avoid disabling it */
17303dd02b73SNeil Armstrong 		.flags = CLK_IS_CRITICAL,
17313dd02b73SNeil Armstrong 	},
17323dd02b73SNeil Armstrong };
17333dd02b73SNeil Armstrong 
17343dd02b73SNeil Armstrong static struct clk_regmap sm1_gp1_pll = {
17353dd02b73SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
17363dd02b73SNeil Armstrong 		.offset = HHI_GP1_PLL_CNTL0,
17373dd02b73SNeil Armstrong 		.shift = 16,
17383dd02b73SNeil Armstrong 		.width = 3,
17393dd02b73SNeil Armstrong 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
17403dd02b73SNeil Armstrong 			  CLK_DIVIDER_ROUND_CLOSEST),
17413dd02b73SNeil Armstrong 	},
17423dd02b73SNeil Armstrong 	.hw.init = &(struct clk_init_data){
17433dd02b73SNeil Armstrong 		.name = "gp1_pll",
17443dd02b73SNeil Armstrong 		.ops = &clk_regmap_divider_ro_ops,
17453dd02b73SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
17463dd02b73SNeil Armstrong 			&sm1_gp1_pll_dco.hw
17473dd02b73SNeil Armstrong 		},
17483dd02b73SNeil Armstrong 		.num_parents = 1,
17493dd02b73SNeil Armstrong 	},
17503dd02b73SNeil Armstrong };
17513dd02b73SNeil Armstrong 
1752085a4ea9SJian Hu /*
1753085a4ea9SJian Hu  * Internal hifi pll emulation configuration parameters
1754085a4ea9SJian Hu  */
1755085a4ea9SJian Hu static const struct reg_sequence g12a_hifi_init_regs[] = {
1756085a4ea9SJian Hu 	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0x00000000 },
1757085a4ea9SJian Hu 	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0x00000000 },
1758085a4ea9SJian Hu 	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x6a285c00 },
1759085a4ea9SJian Hu 	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0x65771290 },
1760085a4ea9SJian Hu 	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x39272000 },
1761085a4ea9SJian Hu 	{ .reg = HHI_HIFI_PLL_CNTL6,	.def = 0x56540000 },
1762085a4ea9SJian Hu };
1763085a4ea9SJian Hu 
1764085a4ea9SJian Hu static struct clk_regmap g12a_hifi_pll_dco = {
1765085a4ea9SJian Hu 	.data = &(struct meson_clk_pll_data){
1766085a4ea9SJian Hu 		.en = {
1767085a4ea9SJian Hu 			.reg_off = HHI_HIFI_PLL_CNTL0,
1768085a4ea9SJian Hu 			.shift   = 28,
1769085a4ea9SJian Hu 			.width   = 1,
1770085a4ea9SJian Hu 		},
1771085a4ea9SJian Hu 		.m = {
1772085a4ea9SJian Hu 			.reg_off = HHI_HIFI_PLL_CNTL0,
1773085a4ea9SJian Hu 			.shift   = 0,
1774085a4ea9SJian Hu 			.width   = 8,
1775085a4ea9SJian Hu 		},
1776085a4ea9SJian Hu 		.n = {
1777085a4ea9SJian Hu 			.reg_off = HHI_HIFI_PLL_CNTL0,
1778085a4ea9SJian Hu 			.shift   = 10,
1779085a4ea9SJian Hu 			.width   = 5,
1780085a4ea9SJian Hu 		},
1781085a4ea9SJian Hu 		.frac = {
1782085a4ea9SJian Hu 			.reg_off = HHI_HIFI_PLL_CNTL1,
1783085a4ea9SJian Hu 			.shift   = 0,
1784085a4ea9SJian Hu 			.width   = 17,
1785085a4ea9SJian Hu 		},
1786085a4ea9SJian Hu 		.l = {
1787085a4ea9SJian Hu 			.reg_off = HHI_HIFI_PLL_CNTL0,
1788085a4ea9SJian Hu 			.shift   = 31,
1789085a4ea9SJian Hu 			.width   = 1,
1790085a4ea9SJian Hu 		},
1791085a4ea9SJian Hu 		.rst = {
1792085a4ea9SJian Hu 			.reg_off = HHI_HIFI_PLL_CNTL0,
1793085a4ea9SJian Hu 			.shift   = 29,
1794085a4ea9SJian Hu 			.width   = 1,
1795085a4ea9SJian Hu 		},
1796085a4ea9SJian Hu 		.range = &g12a_gp0_pll_mult_range,
1797085a4ea9SJian Hu 		.init_regs = g12a_hifi_init_regs,
1798085a4ea9SJian Hu 		.init_count = ARRAY_SIZE(g12a_hifi_init_regs),
1799085a4ea9SJian Hu 		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
1800085a4ea9SJian Hu 	},
1801085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
1802085a4ea9SJian Hu 		.name = "hifi_pll_dco",
1803085a4ea9SJian Hu 		.ops = &meson_clk_pll_ops,
180425e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
180525e682a0SAlexandre Mergnat 			.fw_name = "xtal",
180625e682a0SAlexandre Mergnat 		},
1807085a4ea9SJian Hu 		.num_parents = 1,
1808085a4ea9SJian Hu 	},
1809085a4ea9SJian Hu };
1810085a4ea9SJian Hu 
1811085a4ea9SJian Hu static struct clk_regmap g12a_hifi_pll = {
1812085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
1813085a4ea9SJian Hu 		.offset = HHI_HIFI_PLL_CNTL0,
1814085a4ea9SJian Hu 		.shift = 16,
1815085a4ea9SJian Hu 		.width = 2,
1816085a4ea9SJian Hu 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1817085a4ea9SJian Hu 			  CLK_DIVIDER_ROUND_CLOSEST),
1818085a4ea9SJian Hu 	},
1819085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
1820085a4ea9SJian Hu 		.name = "hifi_pll",
1821085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
182225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
182325e682a0SAlexandre Mergnat 			&g12a_hifi_pll_dco.hw
182425e682a0SAlexandre Mergnat 		},
1825085a4ea9SJian Hu 		.num_parents = 1,
1826085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
1827085a4ea9SJian Hu 	},
1828085a4ea9SJian Hu };
1829085a4ea9SJian Hu 
183034775209SNeil Armstrong /*
183134775209SNeil Armstrong  * The Meson G12A PCIE PLL is fined tuned to deliver a very precise
183234775209SNeil Armstrong  * 100MHz reference clock for the PCIe Analog PHY, and thus requires
183334775209SNeil Armstrong  * a strict register sequence to enable the PLL.
183434775209SNeil Armstrong  */
183534775209SNeil Armstrong static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
183634775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x20090496 },
183734775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x30090496 },
183834775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x00000000 },
183934775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001100 },
184034775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x10058e00 },
184134775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x000100c0 },
184234775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000048 },
184334775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000068, .delay_us = 20 },
184434775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x008100c0, .delay_us = 10 },
184534775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x34090496 },
184634775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x14090496, .delay_us = 10 },
184734775209SNeil Armstrong 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001000 },
184834775209SNeil Armstrong };
184934775209SNeil Armstrong 
185034775209SNeil Armstrong /* Keep a single entry table for recalc/round_rate() ops */
185134775209SNeil Armstrong static const struct pll_params_table g12a_pcie_pll_table[] = {
185234775209SNeil Armstrong 	PLL_PARAMS(150, 1),
185334775209SNeil Armstrong 	{0, 0},
185434775209SNeil Armstrong };
185534775209SNeil Armstrong 
185634775209SNeil Armstrong static struct clk_regmap g12a_pcie_pll_dco = {
185734775209SNeil Armstrong 	.data = &(struct meson_clk_pll_data){
185834775209SNeil Armstrong 		.en = {
185934775209SNeil Armstrong 			.reg_off = HHI_PCIE_PLL_CNTL0,
186034775209SNeil Armstrong 			.shift   = 28,
186134775209SNeil Armstrong 			.width   = 1,
186234775209SNeil Armstrong 		},
186334775209SNeil Armstrong 		.m = {
186434775209SNeil Armstrong 			.reg_off = HHI_PCIE_PLL_CNTL0,
186534775209SNeil Armstrong 			.shift   = 0,
186634775209SNeil Armstrong 			.width   = 8,
186734775209SNeil Armstrong 		},
186834775209SNeil Armstrong 		.n = {
186934775209SNeil Armstrong 			.reg_off = HHI_PCIE_PLL_CNTL0,
187034775209SNeil Armstrong 			.shift   = 10,
187134775209SNeil Armstrong 			.width   = 5,
187234775209SNeil Armstrong 		},
187334775209SNeil Armstrong 		.frac = {
187434775209SNeil Armstrong 			.reg_off = HHI_PCIE_PLL_CNTL1,
187534775209SNeil Armstrong 			.shift   = 0,
187634775209SNeil Armstrong 			.width   = 12,
187734775209SNeil Armstrong 		},
187834775209SNeil Armstrong 		.l = {
187934775209SNeil Armstrong 			.reg_off = HHI_PCIE_PLL_CNTL0,
188034775209SNeil Armstrong 			.shift   = 31,
188134775209SNeil Armstrong 			.width   = 1,
188234775209SNeil Armstrong 		},
188334775209SNeil Armstrong 		.rst = {
188434775209SNeil Armstrong 			.reg_off = HHI_PCIE_PLL_CNTL0,
188534775209SNeil Armstrong 			.shift   = 29,
188634775209SNeil Armstrong 			.width   = 1,
188734775209SNeil Armstrong 		},
188834775209SNeil Armstrong 		.table = g12a_pcie_pll_table,
188934775209SNeil Armstrong 		.init_regs = g12a_pcie_pll_init_regs,
189034775209SNeil Armstrong 		.init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
189134775209SNeil Armstrong 	},
189234775209SNeil Armstrong 	.hw.init = &(struct clk_init_data){
189334775209SNeil Armstrong 		.name = "pcie_pll_dco",
189434775209SNeil Armstrong 		.ops = &meson_clk_pcie_pll_ops,
189525e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
189625e682a0SAlexandre Mergnat 			.fw_name = "xtal",
189725e682a0SAlexandre Mergnat 		},
189834775209SNeil Armstrong 		.num_parents = 1,
189934775209SNeil Armstrong 	},
190034775209SNeil Armstrong };
190134775209SNeil Armstrong 
190234775209SNeil Armstrong static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
190334775209SNeil Armstrong 	.mult = 1,
190434775209SNeil Armstrong 	.div = 2,
190534775209SNeil Armstrong 	.hw.init = &(struct clk_init_data){
190634775209SNeil Armstrong 		.name = "pcie_pll_dco_div2",
190734775209SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
190825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
190925e682a0SAlexandre Mergnat 			&g12a_pcie_pll_dco.hw
191025e682a0SAlexandre Mergnat 		},
191134775209SNeil Armstrong 		.num_parents = 1,
191234775209SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
191334775209SNeil Armstrong 	},
191434775209SNeil Armstrong };
191534775209SNeil Armstrong 
191634775209SNeil Armstrong static struct clk_regmap g12a_pcie_pll_od = {
191734775209SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
191834775209SNeil Armstrong 		.offset = HHI_PCIE_PLL_CNTL0,
191934775209SNeil Armstrong 		.shift = 16,
192034775209SNeil Armstrong 		.width = 5,
192134775209SNeil Armstrong 		.flags = CLK_DIVIDER_ROUND_CLOSEST |
192234775209SNeil Armstrong 			 CLK_DIVIDER_ONE_BASED |
192334775209SNeil Armstrong 			 CLK_DIVIDER_ALLOW_ZERO,
192434775209SNeil Armstrong 	},
192534775209SNeil Armstrong 	.hw.init = &(struct clk_init_data){
192634775209SNeil Armstrong 		.name = "pcie_pll_od",
192734775209SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
192825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
192925e682a0SAlexandre Mergnat 			&g12a_pcie_pll_dco_div2.hw
193025e682a0SAlexandre Mergnat 		},
193134775209SNeil Armstrong 		.num_parents = 1,
193234775209SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
193334775209SNeil Armstrong 	},
193434775209SNeil Armstrong };
193534775209SNeil Armstrong 
193634775209SNeil Armstrong static struct clk_fixed_factor g12a_pcie_pll = {
193734775209SNeil Armstrong 	.mult = 1,
193834775209SNeil Armstrong 	.div = 2,
193934775209SNeil Armstrong 	.hw.init = &(struct clk_init_data){
194034775209SNeil Armstrong 		.name = "pcie_pll_pll",
194134775209SNeil Armstrong 		.ops = &clk_fixed_factor_ops,
194225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
194325e682a0SAlexandre Mergnat 			&g12a_pcie_pll_od.hw
194425e682a0SAlexandre Mergnat 		},
194534775209SNeil Armstrong 		.num_parents = 1,
194634775209SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
194734775209SNeil Armstrong 	},
194834775209SNeil Armstrong };
194934775209SNeil Armstrong 
1950085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_pll_dco = {
1951085a4ea9SJian Hu 	.data = &(struct meson_clk_pll_data){
1952085a4ea9SJian Hu 		.en = {
1953085a4ea9SJian Hu 			.reg_off = HHI_HDMI_PLL_CNTL0,
1954085a4ea9SJian Hu 			.shift   = 28,
1955085a4ea9SJian Hu 			.width   = 1,
1956085a4ea9SJian Hu 		},
1957085a4ea9SJian Hu 		.m = {
1958085a4ea9SJian Hu 			.reg_off = HHI_HDMI_PLL_CNTL0,
1959085a4ea9SJian Hu 			.shift   = 0,
1960085a4ea9SJian Hu 			.width   = 8,
1961085a4ea9SJian Hu 		},
1962085a4ea9SJian Hu 		.n = {
1963085a4ea9SJian Hu 			.reg_off = HHI_HDMI_PLL_CNTL0,
1964085a4ea9SJian Hu 			.shift   = 10,
1965085a4ea9SJian Hu 			.width   = 5,
1966085a4ea9SJian Hu 		},
1967085a4ea9SJian Hu 		.frac = {
1968085a4ea9SJian Hu 			.reg_off = HHI_HDMI_PLL_CNTL1,
1969085a4ea9SJian Hu 			.shift   = 0,
1970085a4ea9SJian Hu 			.width   = 16,
1971085a4ea9SJian Hu 		},
1972085a4ea9SJian Hu 		.l = {
1973085a4ea9SJian Hu 			.reg_off = HHI_HDMI_PLL_CNTL0,
1974085a4ea9SJian Hu 			.shift   = 30,
1975085a4ea9SJian Hu 			.width   = 1,
1976085a4ea9SJian Hu 		},
1977085a4ea9SJian Hu 		.rst = {
1978085a4ea9SJian Hu 			.reg_off = HHI_HDMI_PLL_CNTL0,
1979085a4ea9SJian Hu 			.shift   = 29,
1980085a4ea9SJian Hu 			.width   = 1,
1981085a4ea9SJian Hu 		},
1982085a4ea9SJian Hu 	},
1983085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
1984085a4ea9SJian Hu 		.name = "hdmi_pll_dco",
1985085a4ea9SJian Hu 		.ops = &meson_clk_pll_ro_ops,
198625e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
198725e682a0SAlexandre Mergnat 			.fw_name = "xtal",
198825e682a0SAlexandre Mergnat 		},
1989085a4ea9SJian Hu 		.num_parents = 1,
1990085a4ea9SJian Hu 		/*
1991085a4ea9SJian Hu 		 * Display directly handle hdmi pll registers ATM, we need
1992085a4ea9SJian Hu 		 * NOCACHE to keep our view of the clock as accurate as possible
1993085a4ea9SJian Hu 		 */
1994085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE,
1995085a4ea9SJian Hu 	},
1996085a4ea9SJian Hu };
1997085a4ea9SJian Hu 
1998085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_pll_od = {
1999085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2000085a4ea9SJian Hu 		.offset = HHI_HDMI_PLL_CNTL0,
2001085a4ea9SJian Hu 		.shift = 16,
2002085a4ea9SJian Hu 		.width = 2,
2003085a4ea9SJian Hu 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2004085a4ea9SJian Hu 	},
2005085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2006085a4ea9SJian Hu 		.name = "hdmi_pll_od",
2007085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ro_ops,
200825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
200925e682a0SAlexandre Mergnat 			&g12a_hdmi_pll_dco.hw
201025e682a0SAlexandre Mergnat 		},
2011085a4ea9SJian Hu 		.num_parents = 1,
2012085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2013085a4ea9SJian Hu 	},
2014085a4ea9SJian Hu };
2015085a4ea9SJian Hu 
2016085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_pll_od2 = {
2017085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2018085a4ea9SJian Hu 		.offset = HHI_HDMI_PLL_CNTL0,
2019085a4ea9SJian Hu 		.shift = 18,
2020085a4ea9SJian Hu 		.width = 2,
2021085a4ea9SJian Hu 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2022085a4ea9SJian Hu 	},
2023085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2024085a4ea9SJian Hu 		.name = "hdmi_pll_od2",
2025085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ro_ops,
202625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
202725e682a0SAlexandre Mergnat 			&g12a_hdmi_pll_od.hw
202825e682a0SAlexandre Mergnat 		},
2029085a4ea9SJian Hu 		.num_parents = 1,
2030085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2031085a4ea9SJian Hu 	},
2032085a4ea9SJian Hu };
2033085a4ea9SJian Hu 
2034085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_pll = {
2035085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2036085a4ea9SJian Hu 		.offset = HHI_HDMI_PLL_CNTL0,
2037085a4ea9SJian Hu 		.shift = 20,
2038085a4ea9SJian Hu 		.width = 2,
2039085a4ea9SJian Hu 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2040085a4ea9SJian Hu 	},
2041085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2042085a4ea9SJian Hu 		.name = "hdmi_pll",
2043085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ro_ops,
204425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
204525e682a0SAlexandre Mergnat 			&g12a_hdmi_pll_od2.hw
204625e682a0SAlexandre Mergnat 		},
2047085a4ea9SJian Hu 		.num_parents = 1,
2048085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2049085a4ea9SJian Hu 	},
2050085a4ea9SJian Hu };
2051085a4ea9SJian Hu 
2052085a4ea9SJian Hu static struct clk_fixed_factor g12a_fclk_div4_div = {
2053085a4ea9SJian Hu 	.mult = 1,
2054085a4ea9SJian Hu 	.div = 4,
2055085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2056085a4ea9SJian Hu 		.name = "fclk_div4_div",
2057085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
205825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2059085a4ea9SJian Hu 		.num_parents = 1,
2060085a4ea9SJian Hu 	},
2061085a4ea9SJian Hu };
2062085a4ea9SJian Hu 
2063085a4ea9SJian Hu static struct clk_regmap g12a_fclk_div4 = {
2064085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2065085a4ea9SJian Hu 		.offset = HHI_FIX_PLL_CNTL1,
2066085a4ea9SJian Hu 		.bit_idx = 21,
2067085a4ea9SJian Hu 	},
2068085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2069085a4ea9SJian Hu 		.name = "fclk_div4",
2070085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
207125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
207225e682a0SAlexandre Mergnat 			&g12a_fclk_div4_div.hw
207325e682a0SAlexandre Mergnat 		},
2074085a4ea9SJian Hu 		.num_parents = 1,
2075085a4ea9SJian Hu 	},
2076085a4ea9SJian Hu };
2077085a4ea9SJian Hu 
2078085a4ea9SJian Hu static struct clk_fixed_factor g12a_fclk_div5_div = {
2079085a4ea9SJian Hu 	.mult = 1,
2080085a4ea9SJian Hu 	.div = 5,
2081085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2082085a4ea9SJian Hu 		.name = "fclk_div5_div",
2083085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
208425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2085085a4ea9SJian Hu 		.num_parents = 1,
2086085a4ea9SJian Hu 	},
2087085a4ea9SJian Hu };
2088085a4ea9SJian Hu 
2089085a4ea9SJian Hu static struct clk_regmap g12a_fclk_div5 = {
2090085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2091085a4ea9SJian Hu 		.offset = HHI_FIX_PLL_CNTL1,
2092085a4ea9SJian Hu 		.bit_idx = 22,
2093085a4ea9SJian Hu 	},
2094085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2095085a4ea9SJian Hu 		.name = "fclk_div5",
2096085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
209725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
209825e682a0SAlexandre Mergnat 			&g12a_fclk_div5_div.hw
209925e682a0SAlexandre Mergnat 		},
2100085a4ea9SJian Hu 		.num_parents = 1,
2101085a4ea9SJian Hu 	},
2102085a4ea9SJian Hu };
2103085a4ea9SJian Hu 
2104085a4ea9SJian Hu static struct clk_fixed_factor g12a_fclk_div7_div = {
2105085a4ea9SJian Hu 	.mult = 1,
2106085a4ea9SJian Hu 	.div = 7,
2107085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2108085a4ea9SJian Hu 		.name = "fclk_div7_div",
2109085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
211025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2111085a4ea9SJian Hu 		.num_parents = 1,
2112085a4ea9SJian Hu 	},
2113085a4ea9SJian Hu };
2114085a4ea9SJian Hu 
2115085a4ea9SJian Hu static struct clk_regmap g12a_fclk_div7 = {
2116085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2117085a4ea9SJian Hu 		.offset = HHI_FIX_PLL_CNTL1,
2118085a4ea9SJian Hu 		.bit_idx = 23,
2119085a4ea9SJian Hu 	},
2120085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2121085a4ea9SJian Hu 		.name = "fclk_div7",
2122085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
212325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
212425e682a0SAlexandre Mergnat 			&g12a_fclk_div7_div.hw
212525e682a0SAlexandre Mergnat 		},
2126085a4ea9SJian Hu 		.num_parents = 1,
2127085a4ea9SJian Hu 	},
2128085a4ea9SJian Hu };
2129085a4ea9SJian Hu 
2130085a4ea9SJian Hu static struct clk_fixed_factor g12a_fclk_div2p5_div = {
2131085a4ea9SJian Hu 	.mult = 1,
2132085a4ea9SJian Hu 	.div = 5,
2133085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2134085a4ea9SJian Hu 		.name = "fclk_div2p5_div",
2135085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
213625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
213725e682a0SAlexandre Mergnat 			&g12a_fixed_pll_dco.hw
213825e682a0SAlexandre Mergnat 		},
2139085a4ea9SJian Hu 		.num_parents = 1,
2140085a4ea9SJian Hu 	},
2141085a4ea9SJian Hu };
2142085a4ea9SJian Hu 
2143085a4ea9SJian Hu static struct clk_regmap g12a_fclk_div2p5 = {
2144085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2145085a4ea9SJian Hu 		.offset = HHI_FIX_PLL_CNTL1,
2146085a4ea9SJian Hu 		.bit_idx = 25,
2147085a4ea9SJian Hu 	},
2148085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2149085a4ea9SJian Hu 		.name = "fclk_div2p5",
2150085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
215125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
215225e682a0SAlexandre Mergnat 			&g12a_fclk_div2p5_div.hw
215325e682a0SAlexandre Mergnat 		},
2154085a4ea9SJian Hu 		.num_parents = 1,
2155085a4ea9SJian Hu 	},
2156085a4ea9SJian Hu };
2157085a4ea9SJian Hu 
2158085a4ea9SJian Hu static struct clk_fixed_factor g12a_mpll_50m_div = {
2159085a4ea9SJian Hu 	.mult = 1,
2160085a4ea9SJian Hu 	.div = 80,
2161085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2162085a4ea9SJian Hu 		.name = "mpll_50m_div",
2163085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
216425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
216525e682a0SAlexandre Mergnat 			&g12a_fixed_pll_dco.hw
216625e682a0SAlexandre Mergnat 		},
2167085a4ea9SJian Hu 		.num_parents = 1,
2168085a4ea9SJian Hu 	},
2169085a4ea9SJian Hu };
2170085a4ea9SJian Hu 
2171085a4ea9SJian Hu static struct clk_regmap g12a_mpll_50m = {
2172085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
2173085a4ea9SJian Hu 		.offset = HHI_FIX_PLL_CNTL3,
2174085a4ea9SJian Hu 		.mask = 0x1,
2175085a4ea9SJian Hu 		.shift = 5,
2176085a4ea9SJian Hu 	},
2177085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2178085a4ea9SJian Hu 		.name = "mpll_50m",
2179085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ro_ops,
218025e682a0SAlexandre Mergnat 		.parent_data = (const struct clk_parent_data []) {
218125e682a0SAlexandre Mergnat 			{ .fw_name = "xtal", },
218225e682a0SAlexandre Mergnat 			{ .hw = &g12a_mpll_50m_div.hw },
218325e682a0SAlexandre Mergnat 		},
2184085a4ea9SJian Hu 		.num_parents = 2,
2185085a4ea9SJian Hu 	},
2186085a4ea9SJian Hu };
2187085a4ea9SJian Hu 
2188085a4ea9SJian Hu static struct clk_fixed_factor g12a_mpll_prediv = {
2189085a4ea9SJian Hu 	.mult = 1,
2190085a4ea9SJian Hu 	.div = 2,
2191085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2192085a4ea9SJian Hu 		.name = "mpll_prediv",
2193085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
219425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
219525e682a0SAlexandre Mergnat 			&g12a_fixed_pll_dco.hw
219625e682a0SAlexandre Mergnat 		},
2197085a4ea9SJian Hu 		.num_parents = 1,
2198085a4ea9SJian Hu 	},
2199085a4ea9SJian Hu };
2200085a4ea9SJian Hu 
220176d3fc38SJerome Brunet static const struct reg_sequence g12a_mpll0_init_regs[] = {
220276d3fc38SJerome Brunet 	{ .reg = HHI_MPLL_CNTL2,	.def = 0x40000033 },
220376d3fc38SJerome Brunet };
220476d3fc38SJerome Brunet 
2205085a4ea9SJian Hu static struct clk_regmap g12a_mpll0_div = {
2206085a4ea9SJian Hu 	.data = &(struct meson_clk_mpll_data){
2207085a4ea9SJian Hu 		.sdm = {
2208085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL1,
2209085a4ea9SJian Hu 			.shift   = 0,
2210085a4ea9SJian Hu 			.width   = 14,
2211085a4ea9SJian Hu 		},
2212085a4ea9SJian Hu 		.sdm_en = {
2213085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL1,
2214085a4ea9SJian Hu 			.shift   = 30,
2215085a4ea9SJian Hu 			.width	 = 1,
2216085a4ea9SJian Hu 		},
2217085a4ea9SJian Hu 		.n2 = {
2218085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL1,
2219085a4ea9SJian Hu 			.shift   = 20,
2220085a4ea9SJian Hu 			.width   = 9,
2221085a4ea9SJian Hu 		},
2222085a4ea9SJian Hu 		.ssen = {
2223085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL1,
2224085a4ea9SJian Hu 			.shift   = 29,
2225085a4ea9SJian Hu 			.width	 = 1,
2226085a4ea9SJian Hu 		},
2227085a4ea9SJian Hu 		.lock = &meson_clk_lock,
222876d3fc38SJerome Brunet 		.init_regs = g12a_mpll0_init_regs,
222976d3fc38SJerome Brunet 		.init_count = ARRAY_SIZE(g12a_mpll0_init_regs),
2230085a4ea9SJian Hu 	},
2231085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2232085a4ea9SJian Hu 		.name = "mpll0_div",
2233085a4ea9SJian Hu 		.ops = &meson_clk_mpll_ops,
223425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
223525e682a0SAlexandre Mergnat 			&g12a_mpll_prediv.hw
223625e682a0SAlexandre Mergnat 		},
2237085a4ea9SJian Hu 		.num_parents = 1,
2238085a4ea9SJian Hu 	},
2239085a4ea9SJian Hu };
2240085a4ea9SJian Hu 
2241085a4ea9SJian Hu static struct clk_regmap g12a_mpll0 = {
2242085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2243085a4ea9SJian Hu 		.offset = HHI_MPLL_CNTL1,
2244085a4ea9SJian Hu 		.bit_idx = 31,
2245085a4ea9SJian Hu 	},
2246085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2247085a4ea9SJian Hu 		.name = "mpll0",
2248085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
224925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw },
2250085a4ea9SJian Hu 		.num_parents = 1,
2251085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2252085a4ea9SJian Hu 	},
2253085a4ea9SJian Hu };
2254085a4ea9SJian Hu 
225576d3fc38SJerome Brunet static const struct reg_sequence g12a_mpll1_init_regs[] = {
225676d3fc38SJerome Brunet 	{ .reg = HHI_MPLL_CNTL4,	.def = 0x40000033 },
225776d3fc38SJerome Brunet };
225876d3fc38SJerome Brunet 
2259085a4ea9SJian Hu static struct clk_regmap g12a_mpll1_div = {
2260085a4ea9SJian Hu 	.data = &(struct meson_clk_mpll_data){
2261085a4ea9SJian Hu 		.sdm = {
2262085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL3,
2263085a4ea9SJian Hu 			.shift   = 0,
2264085a4ea9SJian Hu 			.width   = 14,
2265085a4ea9SJian Hu 		},
2266085a4ea9SJian Hu 		.sdm_en = {
2267085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL3,
2268085a4ea9SJian Hu 			.shift   = 30,
2269085a4ea9SJian Hu 			.width	 = 1,
2270085a4ea9SJian Hu 		},
2271085a4ea9SJian Hu 		.n2 = {
2272085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL3,
2273085a4ea9SJian Hu 			.shift   = 20,
2274085a4ea9SJian Hu 			.width   = 9,
2275085a4ea9SJian Hu 		},
2276085a4ea9SJian Hu 		.ssen = {
2277085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL3,
2278085a4ea9SJian Hu 			.shift   = 29,
2279085a4ea9SJian Hu 			.width	 = 1,
2280085a4ea9SJian Hu 		},
2281085a4ea9SJian Hu 		.lock = &meson_clk_lock,
228276d3fc38SJerome Brunet 		.init_regs = g12a_mpll1_init_regs,
228376d3fc38SJerome Brunet 		.init_count = ARRAY_SIZE(g12a_mpll1_init_regs),
2284085a4ea9SJian Hu 	},
2285085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2286085a4ea9SJian Hu 		.name = "mpll1_div",
2287085a4ea9SJian Hu 		.ops = &meson_clk_mpll_ops,
228825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
228925e682a0SAlexandre Mergnat 			&g12a_mpll_prediv.hw
229025e682a0SAlexandre Mergnat 		},
2291085a4ea9SJian Hu 		.num_parents = 1,
2292085a4ea9SJian Hu 	},
2293085a4ea9SJian Hu };
2294085a4ea9SJian Hu 
2295085a4ea9SJian Hu static struct clk_regmap g12a_mpll1 = {
2296085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2297085a4ea9SJian Hu 		.offset = HHI_MPLL_CNTL3,
2298085a4ea9SJian Hu 		.bit_idx = 31,
2299085a4ea9SJian Hu 	},
2300085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2301085a4ea9SJian Hu 		.name = "mpll1",
2302085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
230325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw },
2304085a4ea9SJian Hu 		.num_parents = 1,
2305085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2306085a4ea9SJian Hu 	},
2307085a4ea9SJian Hu };
2308085a4ea9SJian Hu 
230976d3fc38SJerome Brunet static const struct reg_sequence g12a_mpll2_init_regs[] = {
231076d3fc38SJerome Brunet 	{ .reg = HHI_MPLL_CNTL6,	.def = 0x40000033 },
231176d3fc38SJerome Brunet };
231276d3fc38SJerome Brunet 
2313085a4ea9SJian Hu static struct clk_regmap g12a_mpll2_div = {
2314085a4ea9SJian Hu 	.data = &(struct meson_clk_mpll_data){
2315085a4ea9SJian Hu 		.sdm = {
2316085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL5,
2317085a4ea9SJian Hu 			.shift   = 0,
2318085a4ea9SJian Hu 			.width   = 14,
2319085a4ea9SJian Hu 		},
2320085a4ea9SJian Hu 		.sdm_en = {
2321085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL5,
2322085a4ea9SJian Hu 			.shift   = 30,
2323085a4ea9SJian Hu 			.width	 = 1,
2324085a4ea9SJian Hu 		},
2325085a4ea9SJian Hu 		.n2 = {
2326085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL5,
2327085a4ea9SJian Hu 			.shift   = 20,
2328085a4ea9SJian Hu 			.width   = 9,
2329085a4ea9SJian Hu 		},
2330085a4ea9SJian Hu 		.ssen = {
2331085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL5,
2332085a4ea9SJian Hu 			.shift   = 29,
2333085a4ea9SJian Hu 			.width	 = 1,
2334085a4ea9SJian Hu 		},
2335085a4ea9SJian Hu 		.lock = &meson_clk_lock,
233676d3fc38SJerome Brunet 		.init_regs = g12a_mpll2_init_regs,
233776d3fc38SJerome Brunet 		.init_count = ARRAY_SIZE(g12a_mpll2_init_regs),
2338085a4ea9SJian Hu 	},
2339085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2340085a4ea9SJian Hu 		.name = "mpll2_div",
2341085a4ea9SJian Hu 		.ops = &meson_clk_mpll_ops,
234225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
234325e682a0SAlexandre Mergnat 			&g12a_mpll_prediv.hw
234425e682a0SAlexandre Mergnat 		},
2345085a4ea9SJian Hu 		.num_parents = 1,
2346085a4ea9SJian Hu 	},
2347085a4ea9SJian Hu };
2348085a4ea9SJian Hu 
2349085a4ea9SJian Hu static struct clk_regmap g12a_mpll2 = {
2350085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2351085a4ea9SJian Hu 		.offset = HHI_MPLL_CNTL5,
2352085a4ea9SJian Hu 		.bit_idx = 31,
2353085a4ea9SJian Hu 	},
2354085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2355085a4ea9SJian Hu 		.name = "mpll2",
2356085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
235725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw },
2358085a4ea9SJian Hu 		.num_parents = 1,
2359085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2360085a4ea9SJian Hu 	},
2361085a4ea9SJian Hu };
2362085a4ea9SJian Hu 
236376d3fc38SJerome Brunet static const struct reg_sequence g12a_mpll3_init_regs[] = {
236476d3fc38SJerome Brunet 	{ .reg = HHI_MPLL_CNTL8,	.def = 0x40000033 },
236576d3fc38SJerome Brunet };
236676d3fc38SJerome Brunet 
2367085a4ea9SJian Hu static struct clk_regmap g12a_mpll3_div = {
2368085a4ea9SJian Hu 	.data = &(struct meson_clk_mpll_data){
2369085a4ea9SJian Hu 		.sdm = {
2370085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL7,
2371085a4ea9SJian Hu 			.shift   = 0,
2372085a4ea9SJian Hu 			.width   = 14,
2373085a4ea9SJian Hu 		},
2374085a4ea9SJian Hu 		.sdm_en = {
2375085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL7,
2376085a4ea9SJian Hu 			.shift   = 30,
2377085a4ea9SJian Hu 			.width	 = 1,
2378085a4ea9SJian Hu 		},
2379085a4ea9SJian Hu 		.n2 = {
2380085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL7,
2381085a4ea9SJian Hu 			.shift   = 20,
2382085a4ea9SJian Hu 			.width   = 9,
2383085a4ea9SJian Hu 		},
2384085a4ea9SJian Hu 		.ssen = {
2385085a4ea9SJian Hu 			.reg_off = HHI_MPLL_CNTL7,
2386085a4ea9SJian Hu 			.shift   = 29,
2387085a4ea9SJian Hu 			.width	 = 1,
2388085a4ea9SJian Hu 		},
2389085a4ea9SJian Hu 		.lock = &meson_clk_lock,
239076d3fc38SJerome Brunet 		.init_regs = g12a_mpll3_init_regs,
239176d3fc38SJerome Brunet 		.init_count = ARRAY_SIZE(g12a_mpll3_init_regs),
2392085a4ea9SJian Hu 	},
2393085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2394085a4ea9SJian Hu 		.name = "mpll3_div",
2395085a4ea9SJian Hu 		.ops = &meson_clk_mpll_ops,
239625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
239725e682a0SAlexandre Mergnat 			&g12a_mpll_prediv.hw
239825e682a0SAlexandre Mergnat 		},
2399085a4ea9SJian Hu 		.num_parents = 1,
2400085a4ea9SJian Hu 	},
2401085a4ea9SJian Hu };
2402085a4ea9SJian Hu 
2403085a4ea9SJian Hu static struct clk_regmap g12a_mpll3 = {
2404085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2405085a4ea9SJian Hu 		.offset = HHI_MPLL_CNTL7,
2406085a4ea9SJian Hu 		.bit_idx = 31,
2407085a4ea9SJian Hu 	},
2408085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2409085a4ea9SJian Hu 		.name = "mpll3",
2410085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
241125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw },
2412085a4ea9SJian Hu 		.num_parents = 1,
2413085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2414085a4ea9SJian Hu 	},
2415085a4ea9SJian Hu };
2416085a4ea9SJian Hu 
2417085a4ea9SJian Hu static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
241825e682a0SAlexandre Mergnat static const struct clk_parent_data clk81_parent_data[] = {
241925e682a0SAlexandre Mergnat 	{ .fw_name = "xtal", },
242025e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div7.hw },
242125e682a0SAlexandre Mergnat 	{ .hw = &g12a_mpll1.hw },
242225e682a0SAlexandre Mergnat 	{ .hw = &g12a_mpll2.hw },
242325e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div4.hw },
242425e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div3.hw },
242525e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div5.hw },
2426085a4ea9SJian Hu };
2427085a4ea9SJian Hu 
2428085a4ea9SJian Hu static struct clk_regmap g12a_mpeg_clk_sel = {
2429085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
2430085a4ea9SJian Hu 		.offset = HHI_MPEG_CLK_CNTL,
2431085a4ea9SJian Hu 		.mask = 0x7,
2432085a4ea9SJian Hu 		.shift = 12,
2433085a4ea9SJian Hu 		.table = mux_table_clk81,
2434085a4ea9SJian Hu 	},
2435085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2436085a4ea9SJian Hu 		.name = "mpeg_clk_sel",
2437085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ro_ops,
243825e682a0SAlexandre Mergnat 		.parent_data = clk81_parent_data,
243925e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(clk81_parent_data),
2440085a4ea9SJian Hu 	},
2441085a4ea9SJian Hu };
2442085a4ea9SJian Hu 
2443085a4ea9SJian Hu static struct clk_regmap g12a_mpeg_clk_div = {
2444085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2445085a4ea9SJian Hu 		.offset = HHI_MPEG_CLK_CNTL,
2446085a4ea9SJian Hu 		.shift = 0,
2447085a4ea9SJian Hu 		.width = 7,
2448085a4ea9SJian Hu 	},
2449085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2450085a4ea9SJian Hu 		.name = "mpeg_clk_div",
2451085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
245225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
245325e682a0SAlexandre Mergnat 			&g12a_mpeg_clk_sel.hw
245425e682a0SAlexandre Mergnat 		},
2455085a4ea9SJian Hu 		.num_parents = 1,
2456085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2457085a4ea9SJian Hu 	},
2458085a4ea9SJian Hu };
2459085a4ea9SJian Hu 
2460085a4ea9SJian Hu static struct clk_regmap g12a_clk81 = {
2461085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2462085a4ea9SJian Hu 		.offset = HHI_MPEG_CLK_CNTL,
2463085a4ea9SJian Hu 		.bit_idx = 7,
2464085a4ea9SJian Hu 	},
2465085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2466085a4ea9SJian Hu 		.name = "clk81",
2467085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
246825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
246925e682a0SAlexandre Mergnat 			&g12a_mpeg_clk_div.hw
247025e682a0SAlexandre Mergnat 		},
2471085a4ea9SJian Hu 		.num_parents = 1,
2472085a4ea9SJian Hu 		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
2473085a4ea9SJian Hu 	},
2474085a4ea9SJian Hu };
2475085a4ea9SJian Hu 
247625e682a0SAlexandre Mergnat static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = {
247725e682a0SAlexandre Mergnat 	{ .fw_name = "xtal", },
247825e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div2.hw },
247925e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div3.hw },
248025e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div5.hw },
248125e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div7.hw },
2482085a4ea9SJian Hu 	/*
2483085a4ea9SJian Hu 	 * Following these parent clocks, we should also have had mpll2, mpll3
2484085a4ea9SJian Hu 	 * and gp0_pll but these clocks are too precious to be used here. All
2485085a4ea9SJian Hu 	 * the necessary rates for MMC and NAND operation can be acheived using
2486085a4ea9SJian Hu 	 * g12a_ee_core or fclk_div clocks
2487085a4ea9SJian Hu 	 */
2488085a4ea9SJian Hu };
2489085a4ea9SJian Hu 
2490085a4ea9SJian Hu /* SDIO clock */
2491085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
2492085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
2493085a4ea9SJian Hu 		.offset = HHI_SD_EMMC_CLK_CNTL,
2494085a4ea9SJian Hu 		.mask = 0x7,
2495085a4ea9SJian Hu 		.shift = 9,
2496085a4ea9SJian Hu 	},
2497085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2498085a4ea9SJian Hu 		.name = "sd_emmc_a_clk0_sel",
2499085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
250025e682a0SAlexandre Mergnat 		.parent_data = g12a_sd_emmc_clk0_parent_data,
250125e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2502085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2503085a4ea9SJian Hu 	},
2504085a4ea9SJian Hu };
2505085a4ea9SJian Hu 
2506085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
2507085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2508085a4ea9SJian Hu 		.offset = HHI_SD_EMMC_CLK_CNTL,
2509085a4ea9SJian Hu 		.shift = 0,
2510085a4ea9SJian Hu 		.width = 7,
2511085a4ea9SJian Hu 	},
2512085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2513085a4ea9SJian Hu 		.name = "sd_emmc_a_clk0_div",
2514085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
251525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
251625e682a0SAlexandre Mergnat 			&g12a_sd_emmc_a_clk0_sel.hw
251725e682a0SAlexandre Mergnat 		},
2518085a4ea9SJian Hu 		.num_parents = 1,
2519085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2520085a4ea9SJian Hu 	},
2521085a4ea9SJian Hu };
2522085a4ea9SJian Hu 
2523085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_a_clk0 = {
2524085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2525085a4ea9SJian Hu 		.offset = HHI_SD_EMMC_CLK_CNTL,
2526085a4ea9SJian Hu 		.bit_idx = 7,
2527085a4ea9SJian Hu 	},
2528085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2529085a4ea9SJian Hu 		.name = "sd_emmc_a_clk0",
2530085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
253125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
253225e682a0SAlexandre Mergnat 			&g12a_sd_emmc_a_clk0_div.hw
253325e682a0SAlexandre Mergnat 		},
2534085a4ea9SJian Hu 		.num_parents = 1,
2535085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2536085a4ea9SJian Hu 	},
2537085a4ea9SJian Hu };
2538085a4ea9SJian Hu 
2539085a4ea9SJian Hu /* SDcard clock */
2540085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
2541085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
2542085a4ea9SJian Hu 		.offset = HHI_SD_EMMC_CLK_CNTL,
2543085a4ea9SJian Hu 		.mask = 0x7,
2544085a4ea9SJian Hu 		.shift = 25,
2545085a4ea9SJian Hu 	},
2546085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2547085a4ea9SJian Hu 		.name = "sd_emmc_b_clk0_sel",
2548085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
254925e682a0SAlexandre Mergnat 		.parent_data = g12a_sd_emmc_clk0_parent_data,
255025e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2551085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2552085a4ea9SJian Hu 	},
2553085a4ea9SJian Hu };
2554085a4ea9SJian Hu 
2555085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
2556085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2557085a4ea9SJian Hu 		.offset = HHI_SD_EMMC_CLK_CNTL,
2558085a4ea9SJian Hu 		.shift = 16,
2559085a4ea9SJian Hu 		.width = 7,
2560085a4ea9SJian Hu 	},
2561085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2562085a4ea9SJian Hu 		.name = "sd_emmc_b_clk0_div",
2563085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
256425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
256525e682a0SAlexandre Mergnat 			&g12a_sd_emmc_b_clk0_sel.hw
256625e682a0SAlexandre Mergnat 		},
2567085a4ea9SJian Hu 		.num_parents = 1,
2568085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2569085a4ea9SJian Hu 	},
2570085a4ea9SJian Hu };
2571085a4ea9SJian Hu 
2572085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_b_clk0 = {
2573085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2574085a4ea9SJian Hu 		.offset = HHI_SD_EMMC_CLK_CNTL,
2575085a4ea9SJian Hu 		.bit_idx = 23,
2576085a4ea9SJian Hu 	},
2577085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2578085a4ea9SJian Hu 		.name = "sd_emmc_b_clk0",
2579085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
258025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
258125e682a0SAlexandre Mergnat 			&g12a_sd_emmc_b_clk0_div.hw
258225e682a0SAlexandre Mergnat 		},
2583085a4ea9SJian Hu 		.num_parents = 1,
2584085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2585085a4ea9SJian Hu 	},
2586085a4ea9SJian Hu };
2587085a4ea9SJian Hu 
2588085a4ea9SJian Hu /* EMMC/NAND clock */
2589085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
2590085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
2591085a4ea9SJian Hu 		.offset = HHI_NAND_CLK_CNTL,
2592085a4ea9SJian Hu 		.mask = 0x7,
2593085a4ea9SJian Hu 		.shift = 9,
2594085a4ea9SJian Hu 	},
2595085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2596085a4ea9SJian Hu 		.name = "sd_emmc_c_clk0_sel",
2597085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
259825e682a0SAlexandre Mergnat 		.parent_data = g12a_sd_emmc_clk0_parent_data,
259925e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2600085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2601085a4ea9SJian Hu 	},
2602085a4ea9SJian Hu };
2603085a4ea9SJian Hu 
2604085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
2605085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
2606085a4ea9SJian Hu 		.offset = HHI_NAND_CLK_CNTL,
2607085a4ea9SJian Hu 		.shift = 0,
2608085a4ea9SJian Hu 		.width = 7,
2609085a4ea9SJian Hu 	},
2610085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2611085a4ea9SJian Hu 		.name = "sd_emmc_c_clk0_div",
2612085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
261325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
261425e682a0SAlexandre Mergnat 			&g12a_sd_emmc_c_clk0_sel.hw
261525e682a0SAlexandre Mergnat 		},
2616085a4ea9SJian Hu 		.num_parents = 1,
2617085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2618085a4ea9SJian Hu 	},
2619085a4ea9SJian Hu };
2620085a4ea9SJian Hu 
2621085a4ea9SJian Hu static struct clk_regmap g12a_sd_emmc_c_clk0 = {
2622085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2623085a4ea9SJian Hu 		.offset = HHI_NAND_CLK_CNTL,
2624085a4ea9SJian Hu 		.bit_idx = 7,
2625085a4ea9SJian Hu 	},
2626085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2627085a4ea9SJian Hu 		.name = "sd_emmc_c_clk0",
2628085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
262925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
263025e682a0SAlexandre Mergnat 			&g12a_sd_emmc_c_clk0_div.hw
263125e682a0SAlexandre Mergnat 		},
2632085a4ea9SJian Hu 		.num_parents = 1,
2633085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT,
2634085a4ea9SJian Hu 	},
2635085a4ea9SJian Hu };
2636085a4ea9SJian Hu 
2637085a4ea9SJian Hu /* Video Clocks */
2638085a4ea9SJian Hu 
2639085a4ea9SJian Hu static struct clk_regmap g12a_vid_pll_div = {
2640085a4ea9SJian Hu 	.data = &(struct meson_vid_pll_div_data){
2641085a4ea9SJian Hu 		.val = {
2642085a4ea9SJian Hu 			.reg_off = HHI_VID_PLL_CLK_DIV,
2643085a4ea9SJian Hu 			.shift   = 0,
2644085a4ea9SJian Hu 			.width   = 15,
2645085a4ea9SJian Hu 		},
2646085a4ea9SJian Hu 		.sel = {
2647085a4ea9SJian Hu 			.reg_off = HHI_VID_PLL_CLK_DIV,
2648085a4ea9SJian Hu 			.shift   = 16,
2649085a4ea9SJian Hu 			.width   = 2,
2650085a4ea9SJian Hu 		},
2651085a4ea9SJian Hu 	},
2652085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2653085a4ea9SJian Hu 		.name = "vid_pll_div",
2654085a4ea9SJian Hu 		.ops = &meson_vid_pll_div_ro_ops,
265525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw },
2656085a4ea9SJian Hu 		.num_parents = 1,
2657085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2658085a4ea9SJian Hu 	},
2659085a4ea9SJian Hu };
2660085a4ea9SJian Hu 
266125e682a0SAlexandre Mergnat static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
266225e682a0SAlexandre Mergnat 	&g12a_vid_pll_div.hw,
266325e682a0SAlexandre Mergnat 	&g12a_hdmi_pll.hw,
266425e682a0SAlexandre Mergnat };
2665085a4ea9SJian Hu 
2666085a4ea9SJian Hu static struct clk_regmap g12a_vid_pll_sel = {
2667085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
2668085a4ea9SJian Hu 		.offset = HHI_VID_PLL_CLK_DIV,
2669085a4ea9SJian Hu 		.mask = 0x1,
2670085a4ea9SJian Hu 		.shift = 18,
2671085a4ea9SJian Hu 	},
2672085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
2673085a4ea9SJian Hu 		.name = "vid_pll_sel",
2674085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
2675085a4ea9SJian Hu 		/*
2676085a4ea9SJian Hu 		 * bit 18 selects from 2 possible parents:
2677085a4ea9SJian Hu 		 * vid_pll_div or hdmi_pll
2678085a4ea9SJian Hu 		 */
267925e682a0SAlexandre Mergnat 		.parent_hws = g12a_vid_pll_parent_hws,
268025e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws),
2681085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2682085a4ea9SJian Hu 	},
2683085a4ea9SJian Hu };
2684085a4ea9SJian Hu 
2685085a4ea9SJian Hu static struct clk_regmap g12a_vid_pll = {
2686085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
2687085a4ea9SJian Hu 		.offset = HHI_VID_PLL_CLK_DIV,
2688085a4ea9SJian Hu 		.bit_idx = 19,
2689085a4ea9SJian Hu 	},
2690085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
2691085a4ea9SJian Hu 		.name = "vid_pll",
2692085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
269325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
269425e682a0SAlexandre Mergnat 			&g12a_vid_pll_sel.hw
269525e682a0SAlexandre Mergnat 		},
2696085a4ea9SJian Hu 		.num_parents = 1,
2697085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2698085a4ea9SJian Hu 	},
2699085a4ea9SJian Hu };
2700085a4ea9SJian Hu 
270125e682a0SAlexandre Mergnat /* VPU Clock */
270225e682a0SAlexandre Mergnat 
270325e682a0SAlexandre Mergnat static const struct clk_hw *g12a_vpu_parent_hws[] = {
270425e682a0SAlexandre Mergnat 	&g12a_fclk_div3.hw,
270525e682a0SAlexandre Mergnat 	&g12a_fclk_div4.hw,
270625e682a0SAlexandre Mergnat 	&g12a_fclk_div5.hw,
270725e682a0SAlexandre Mergnat 	&g12a_fclk_div7.hw,
270825e682a0SAlexandre Mergnat 	&g12a_mpll1.hw,
270925e682a0SAlexandre Mergnat 	&g12a_vid_pll.hw,
271025e682a0SAlexandre Mergnat 	&g12a_hifi_pll.hw,
271125e682a0SAlexandre Mergnat 	&g12a_gp0_pll.hw,
271225e682a0SAlexandre Mergnat };
271325e682a0SAlexandre Mergnat 
271425e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu_0_sel = {
271525e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
271625e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
271725e682a0SAlexandre Mergnat 		.mask = 0x7,
271825e682a0SAlexandre Mergnat 		.shift = 9,
271925e682a0SAlexandre Mergnat 	},
272025e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
272125e682a0SAlexandre Mergnat 		.name = "vpu_0_sel",
272225e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
272325e682a0SAlexandre Mergnat 		.parent_hws = g12a_vpu_parent_hws,
272425e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
272525e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_NO_REPARENT,
272625e682a0SAlexandre Mergnat 	},
272725e682a0SAlexandre Mergnat };
272825e682a0SAlexandre Mergnat 
272925e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu_0_div = {
273025e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
273125e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
273225e682a0SAlexandre Mergnat 		.shift = 0,
273325e682a0SAlexandre Mergnat 		.width = 7,
273425e682a0SAlexandre Mergnat 	},
273525e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
273625e682a0SAlexandre Mergnat 		.name = "vpu_0_div",
273725e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
273825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw },
273925e682a0SAlexandre Mergnat 		.num_parents = 1,
274025e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
274125e682a0SAlexandre Mergnat 	},
274225e682a0SAlexandre Mergnat };
274325e682a0SAlexandre Mergnat 
274425e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu_0 = {
274525e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
274625e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
274725e682a0SAlexandre Mergnat 		.bit_idx = 8,
274825e682a0SAlexandre Mergnat 	},
274925e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
275025e682a0SAlexandre Mergnat 		.name = "vpu_0",
275125e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
275225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw },
275325e682a0SAlexandre Mergnat 		.num_parents = 1,
275425e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
275525e682a0SAlexandre Mergnat 	},
275625e682a0SAlexandre Mergnat };
275725e682a0SAlexandre Mergnat 
275825e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu_1_sel = {
275925e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
276025e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
276125e682a0SAlexandre Mergnat 		.mask = 0x7,
276225e682a0SAlexandre Mergnat 		.shift = 25,
276325e682a0SAlexandre Mergnat 	},
276425e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
276525e682a0SAlexandre Mergnat 		.name = "vpu_1_sel",
276625e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
276725e682a0SAlexandre Mergnat 		.parent_hws = g12a_vpu_parent_hws,
276825e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
276925e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_NO_REPARENT,
277025e682a0SAlexandre Mergnat 	},
277125e682a0SAlexandre Mergnat };
277225e682a0SAlexandre Mergnat 
277325e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu_1_div = {
277425e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
277525e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
277625e682a0SAlexandre Mergnat 		.shift = 16,
277725e682a0SAlexandre Mergnat 		.width = 7,
277825e682a0SAlexandre Mergnat 	},
277925e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
278025e682a0SAlexandre Mergnat 		.name = "vpu_1_div",
278125e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
278225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw },
278325e682a0SAlexandre Mergnat 		.num_parents = 1,
278425e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
278525e682a0SAlexandre Mergnat 	},
278625e682a0SAlexandre Mergnat };
278725e682a0SAlexandre Mergnat 
278825e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu_1 = {
278925e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
279025e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
279125e682a0SAlexandre Mergnat 		.bit_idx = 24,
279225e682a0SAlexandre Mergnat 	},
279325e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
279425e682a0SAlexandre Mergnat 		.name = "vpu_1",
279525e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
279625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw },
279725e682a0SAlexandre Mergnat 		.num_parents = 1,
279825e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
279925e682a0SAlexandre Mergnat 	},
280025e682a0SAlexandre Mergnat };
280125e682a0SAlexandre Mergnat 
280225e682a0SAlexandre Mergnat static struct clk_regmap g12a_vpu = {
280325e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
280425e682a0SAlexandre Mergnat 		.offset = HHI_VPU_CLK_CNTL,
280525e682a0SAlexandre Mergnat 		.mask = 1,
280625e682a0SAlexandre Mergnat 		.shift = 31,
280725e682a0SAlexandre Mergnat 	},
280825e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
280925e682a0SAlexandre Mergnat 		.name = "vpu",
281025e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
281125e682a0SAlexandre Mergnat 		/*
281225e682a0SAlexandre Mergnat 		 * bit 31 selects from 2 possible parents:
281325e682a0SAlexandre Mergnat 		 * vpu_0 or vpu_1
281425e682a0SAlexandre Mergnat 		 */
281525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
281625e682a0SAlexandre Mergnat 			&g12a_vpu_0.hw,
281725e682a0SAlexandre Mergnat 			&g12a_vpu_1.hw,
281825e682a0SAlexandre Mergnat 		},
281925e682a0SAlexandre Mergnat 		.num_parents = 2,
282025e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_NO_REPARENT,
282125e682a0SAlexandre Mergnat 	},
282225e682a0SAlexandre Mergnat };
282325e682a0SAlexandre Mergnat 
282425e682a0SAlexandre Mergnat /* VDEC clocks */
282525e682a0SAlexandre Mergnat 
282625e682a0SAlexandre Mergnat static const struct clk_hw *g12a_vdec_parent_hws[] = {
282725e682a0SAlexandre Mergnat 	&g12a_fclk_div2p5.hw,
282825e682a0SAlexandre Mergnat 	&g12a_fclk_div3.hw,
282925e682a0SAlexandre Mergnat 	&g12a_fclk_div4.hw,
283025e682a0SAlexandre Mergnat 	&g12a_fclk_div5.hw,
283125e682a0SAlexandre Mergnat 	&g12a_fclk_div7.hw,
283225e682a0SAlexandre Mergnat 	&g12a_hifi_pll.hw,
283325e682a0SAlexandre Mergnat 	&g12a_gp0_pll.hw,
283425e682a0SAlexandre Mergnat };
283525e682a0SAlexandre Mergnat 
283625e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_1_sel = {
283725e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
283825e682a0SAlexandre Mergnat 		.offset = HHI_VDEC_CLK_CNTL,
283925e682a0SAlexandre Mergnat 		.mask = 0x7,
284025e682a0SAlexandre Mergnat 		.shift = 9,
284125e682a0SAlexandre Mergnat 		.flags = CLK_MUX_ROUND_CLOSEST,
284225e682a0SAlexandre Mergnat 	},
284325e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
284425e682a0SAlexandre Mergnat 		.name = "vdec_1_sel",
284525e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
284625e682a0SAlexandre Mergnat 		.parent_hws = g12a_vdec_parent_hws,
284725e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
284825e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
284925e682a0SAlexandre Mergnat 	},
285025e682a0SAlexandre Mergnat };
285125e682a0SAlexandre Mergnat 
285225e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_1_div = {
285325e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
285425e682a0SAlexandre Mergnat 		.offset = HHI_VDEC_CLK_CNTL,
285525e682a0SAlexandre Mergnat 		.shift = 0,
285625e682a0SAlexandre Mergnat 		.width = 7,
285725e682a0SAlexandre Mergnat 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
285825e682a0SAlexandre Mergnat 	},
285925e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
286025e682a0SAlexandre Mergnat 		.name = "vdec_1_div",
286125e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
286225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
286325e682a0SAlexandre Mergnat 			&g12a_vdec_1_sel.hw
286425e682a0SAlexandre Mergnat 		},
286525e682a0SAlexandre Mergnat 		.num_parents = 1,
286625e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
286725e682a0SAlexandre Mergnat 	},
286825e682a0SAlexandre Mergnat };
286925e682a0SAlexandre Mergnat 
287025e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_1 = {
287125e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
287225e682a0SAlexandre Mergnat 		.offset = HHI_VDEC_CLK_CNTL,
287325e682a0SAlexandre Mergnat 		.bit_idx = 8,
287425e682a0SAlexandre Mergnat 	},
287525e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
287625e682a0SAlexandre Mergnat 		.name = "vdec_1",
287725e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
287825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
287925e682a0SAlexandre Mergnat 			&g12a_vdec_1_div.hw
288025e682a0SAlexandre Mergnat 		},
288125e682a0SAlexandre Mergnat 		.num_parents = 1,
288225e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
288325e682a0SAlexandre Mergnat 	},
288425e682a0SAlexandre Mergnat };
288525e682a0SAlexandre Mergnat 
288625e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_hevcf_sel = {
288725e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
288825e682a0SAlexandre Mergnat 		.offset = HHI_VDEC2_CLK_CNTL,
288925e682a0SAlexandre Mergnat 		.mask = 0x7,
289025e682a0SAlexandre Mergnat 		.shift = 9,
289125e682a0SAlexandre Mergnat 		.flags = CLK_MUX_ROUND_CLOSEST,
289225e682a0SAlexandre Mergnat 	},
289325e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
289425e682a0SAlexandre Mergnat 		.name = "vdec_hevcf_sel",
289525e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
289625e682a0SAlexandre Mergnat 		.parent_hws = g12a_vdec_parent_hws,
289725e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
289825e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
289925e682a0SAlexandre Mergnat 	},
290025e682a0SAlexandre Mergnat };
290125e682a0SAlexandre Mergnat 
290225e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_hevcf_div = {
290325e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
290425e682a0SAlexandre Mergnat 		.offset = HHI_VDEC2_CLK_CNTL,
290525e682a0SAlexandre Mergnat 		.shift = 0,
290625e682a0SAlexandre Mergnat 		.width = 7,
290725e682a0SAlexandre Mergnat 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
290825e682a0SAlexandre Mergnat 	},
290925e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
291025e682a0SAlexandre Mergnat 		.name = "vdec_hevcf_div",
291125e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
291225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
291325e682a0SAlexandre Mergnat 			&g12a_vdec_hevcf_sel.hw
291425e682a0SAlexandre Mergnat 		},
291525e682a0SAlexandre Mergnat 		.num_parents = 1,
291625e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
291725e682a0SAlexandre Mergnat 	},
291825e682a0SAlexandre Mergnat };
291925e682a0SAlexandre Mergnat 
292025e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_hevcf = {
292125e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
292225e682a0SAlexandre Mergnat 		.offset = HHI_VDEC2_CLK_CNTL,
292325e682a0SAlexandre Mergnat 		.bit_idx = 8,
292425e682a0SAlexandre Mergnat 	},
292525e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
292625e682a0SAlexandre Mergnat 		.name = "vdec_hevcf",
292725e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
292825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
292925e682a0SAlexandre Mergnat 			&g12a_vdec_hevcf_div.hw
293025e682a0SAlexandre Mergnat 		},
293125e682a0SAlexandre Mergnat 		.num_parents = 1,
293225e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
293325e682a0SAlexandre Mergnat 	},
293425e682a0SAlexandre Mergnat };
293525e682a0SAlexandre Mergnat 
293625e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_hevc_sel = {
293725e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
293825e682a0SAlexandre Mergnat 		.offset = HHI_VDEC2_CLK_CNTL,
293925e682a0SAlexandre Mergnat 		.mask = 0x7,
294025e682a0SAlexandre Mergnat 		.shift = 25,
294125e682a0SAlexandre Mergnat 		.flags = CLK_MUX_ROUND_CLOSEST,
294225e682a0SAlexandre Mergnat 	},
294325e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
294425e682a0SAlexandre Mergnat 		.name = "vdec_hevc_sel",
294525e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
294625e682a0SAlexandre Mergnat 		.parent_hws = g12a_vdec_parent_hws,
294725e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
294825e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
294925e682a0SAlexandre Mergnat 	},
295025e682a0SAlexandre Mergnat };
295125e682a0SAlexandre Mergnat 
295225e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_hevc_div = {
295325e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
295425e682a0SAlexandre Mergnat 		.offset = HHI_VDEC2_CLK_CNTL,
295525e682a0SAlexandre Mergnat 		.shift = 16,
295625e682a0SAlexandre Mergnat 		.width = 7,
295725e682a0SAlexandre Mergnat 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
295825e682a0SAlexandre Mergnat 	},
295925e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
296025e682a0SAlexandre Mergnat 		.name = "vdec_hevc_div",
296125e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
296225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
296325e682a0SAlexandre Mergnat 			&g12a_vdec_hevc_sel.hw
296425e682a0SAlexandre Mergnat 		},
296525e682a0SAlexandre Mergnat 		.num_parents = 1,
296625e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
296725e682a0SAlexandre Mergnat 	},
296825e682a0SAlexandre Mergnat };
296925e682a0SAlexandre Mergnat 
297025e682a0SAlexandre Mergnat static struct clk_regmap g12a_vdec_hevc = {
297125e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
297225e682a0SAlexandre Mergnat 		.offset = HHI_VDEC2_CLK_CNTL,
297325e682a0SAlexandre Mergnat 		.bit_idx = 24,
297425e682a0SAlexandre Mergnat 	},
297525e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
297625e682a0SAlexandre Mergnat 		.name = "vdec_hevc",
297725e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
297825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
297925e682a0SAlexandre Mergnat 			&g12a_vdec_hevc_div.hw
298025e682a0SAlexandre Mergnat 		},
298125e682a0SAlexandre Mergnat 		.num_parents = 1,
298225e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
298325e682a0SAlexandre Mergnat 	},
298425e682a0SAlexandre Mergnat };
298525e682a0SAlexandre Mergnat 
298625e682a0SAlexandre Mergnat /* VAPB Clock */
298725e682a0SAlexandre Mergnat 
298825e682a0SAlexandre Mergnat static const struct clk_hw *g12a_vapb_parent_hws[] = {
298925e682a0SAlexandre Mergnat 	&g12a_fclk_div4.hw,
299025e682a0SAlexandre Mergnat 	&g12a_fclk_div3.hw,
299125e682a0SAlexandre Mergnat 	&g12a_fclk_div5.hw,
299225e682a0SAlexandre Mergnat 	&g12a_fclk_div7.hw,
299325e682a0SAlexandre Mergnat 	&g12a_mpll1.hw,
299425e682a0SAlexandre Mergnat 	&g12a_vid_pll.hw,
299525e682a0SAlexandre Mergnat 	&g12a_mpll2.hw,
299625e682a0SAlexandre Mergnat 	&g12a_fclk_div2p5.hw,
299725e682a0SAlexandre Mergnat };
299825e682a0SAlexandre Mergnat 
299925e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_0_sel = {
300025e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
300125e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
300225e682a0SAlexandre Mergnat 		.mask = 0x3,
300325e682a0SAlexandre Mergnat 		.shift = 9,
300425e682a0SAlexandre Mergnat 	},
300525e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
300625e682a0SAlexandre Mergnat 		.name = "vapb_0_sel",
300725e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
300825e682a0SAlexandre Mergnat 		.parent_hws = g12a_vapb_parent_hws,
300925e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
301025e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_NO_REPARENT,
301125e682a0SAlexandre Mergnat 	},
301225e682a0SAlexandre Mergnat };
301325e682a0SAlexandre Mergnat 
301425e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_0_div = {
301525e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
301625e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
301725e682a0SAlexandre Mergnat 		.shift = 0,
301825e682a0SAlexandre Mergnat 		.width = 7,
301925e682a0SAlexandre Mergnat 	},
302025e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
302125e682a0SAlexandre Mergnat 		.name = "vapb_0_div",
302225e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
302325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
302425e682a0SAlexandre Mergnat 			&g12a_vapb_0_sel.hw
302525e682a0SAlexandre Mergnat 		},
302625e682a0SAlexandre Mergnat 		.num_parents = 1,
302725e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
302825e682a0SAlexandre Mergnat 	},
302925e682a0SAlexandre Mergnat };
303025e682a0SAlexandre Mergnat 
303125e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_0 = {
303225e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
303325e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
303425e682a0SAlexandre Mergnat 		.bit_idx = 8,
303525e682a0SAlexandre Mergnat 	},
303625e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
303725e682a0SAlexandre Mergnat 		.name = "vapb_0",
303825e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
303925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
304025e682a0SAlexandre Mergnat 			&g12a_vapb_0_div.hw
304125e682a0SAlexandre Mergnat 		},
304225e682a0SAlexandre Mergnat 		.num_parents = 1,
304325e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
304425e682a0SAlexandre Mergnat 	},
304525e682a0SAlexandre Mergnat };
304625e682a0SAlexandre Mergnat 
304725e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_1_sel = {
304825e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
304925e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
305025e682a0SAlexandre Mergnat 		.mask = 0x3,
305125e682a0SAlexandre Mergnat 		.shift = 25,
305225e682a0SAlexandre Mergnat 	},
305325e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
305425e682a0SAlexandre Mergnat 		.name = "vapb_1_sel",
305525e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
305625e682a0SAlexandre Mergnat 		.parent_hws = g12a_vapb_parent_hws,
305725e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
305825e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_NO_REPARENT,
305925e682a0SAlexandre Mergnat 	},
306025e682a0SAlexandre Mergnat };
306125e682a0SAlexandre Mergnat 
306225e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_1_div = {
306325e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_div_data){
306425e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
306525e682a0SAlexandre Mergnat 		.shift = 16,
306625e682a0SAlexandre Mergnat 		.width = 7,
306725e682a0SAlexandre Mergnat 	},
306825e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
306925e682a0SAlexandre Mergnat 		.name = "vapb_1_div",
307025e682a0SAlexandre Mergnat 		.ops = &clk_regmap_divider_ops,
307125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
307225e682a0SAlexandre Mergnat 			&g12a_vapb_1_sel.hw
307325e682a0SAlexandre Mergnat 		},
307425e682a0SAlexandre Mergnat 		.num_parents = 1,
307525e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT,
307625e682a0SAlexandre Mergnat 	},
307725e682a0SAlexandre Mergnat };
307825e682a0SAlexandre Mergnat 
307925e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_1 = {
308025e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
308125e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
308225e682a0SAlexandre Mergnat 		.bit_idx = 24,
308325e682a0SAlexandre Mergnat 	},
308425e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
308525e682a0SAlexandre Mergnat 		.name = "vapb_1",
308625e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
308725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
308825e682a0SAlexandre Mergnat 			&g12a_vapb_1_div.hw
308925e682a0SAlexandre Mergnat 		},
309025e682a0SAlexandre Mergnat 		.num_parents = 1,
309125e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
309225e682a0SAlexandre Mergnat 	},
309325e682a0SAlexandre Mergnat };
309425e682a0SAlexandre Mergnat 
309525e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb_sel = {
309625e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_mux_data){
309725e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
309825e682a0SAlexandre Mergnat 		.mask = 1,
309925e682a0SAlexandre Mergnat 		.shift = 31,
310025e682a0SAlexandre Mergnat 	},
310125e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data){
310225e682a0SAlexandre Mergnat 		.name = "vapb_sel",
310325e682a0SAlexandre Mergnat 		.ops = &clk_regmap_mux_ops,
310425e682a0SAlexandre Mergnat 		/*
310525e682a0SAlexandre Mergnat 		 * bit 31 selects from 2 possible parents:
310625e682a0SAlexandre Mergnat 		 * vapb_0 or vapb_1
310725e682a0SAlexandre Mergnat 		 */
310825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
310925e682a0SAlexandre Mergnat 			&g12a_vapb_0.hw,
311025e682a0SAlexandre Mergnat 			&g12a_vapb_1.hw,
311125e682a0SAlexandre Mergnat 		},
311225e682a0SAlexandre Mergnat 		.num_parents = 2,
311325e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_NO_REPARENT,
311425e682a0SAlexandre Mergnat 	},
311525e682a0SAlexandre Mergnat };
311625e682a0SAlexandre Mergnat 
311725e682a0SAlexandre Mergnat static struct clk_regmap g12a_vapb = {
311825e682a0SAlexandre Mergnat 	.data = &(struct clk_regmap_gate_data){
311925e682a0SAlexandre Mergnat 		.offset = HHI_VAPBCLK_CNTL,
312025e682a0SAlexandre Mergnat 		.bit_idx = 30,
312125e682a0SAlexandre Mergnat 	},
312225e682a0SAlexandre Mergnat 	.hw.init = &(struct clk_init_data) {
312325e682a0SAlexandre Mergnat 		.name = "vapb",
312425e682a0SAlexandre Mergnat 		.ops = &clk_regmap_gate_ops,
312525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw },
312625e682a0SAlexandre Mergnat 		.num_parents = 1,
312725e682a0SAlexandre Mergnat 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
312825e682a0SAlexandre Mergnat 	},
312925e682a0SAlexandre Mergnat };
313025e682a0SAlexandre Mergnat 
313125e682a0SAlexandre Mergnat static const struct clk_hw *g12a_vclk_parent_hws[] = {
313225e682a0SAlexandre Mergnat 	&g12a_vid_pll.hw,
313325e682a0SAlexandre Mergnat 	&g12a_gp0_pll.hw,
313425e682a0SAlexandre Mergnat 	&g12a_hifi_pll.hw,
313525e682a0SAlexandre Mergnat 	&g12a_mpll1.hw,
313625e682a0SAlexandre Mergnat 	&g12a_fclk_div3.hw,
313725e682a0SAlexandre Mergnat 	&g12a_fclk_div4.hw,
313825e682a0SAlexandre Mergnat 	&g12a_fclk_div5.hw,
313925e682a0SAlexandre Mergnat 	&g12a_fclk_div7.hw,
3140085a4ea9SJian Hu };
3141085a4ea9SJian Hu 
3142085a4ea9SJian Hu static struct clk_regmap g12a_vclk_sel = {
3143085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3144085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3145085a4ea9SJian Hu 		.mask = 0x7,
3146085a4ea9SJian Hu 		.shift = 16,
3147085a4ea9SJian Hu 	},
3148085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3149085a4ea9SJian Hu 		.name = "vclk_sel",
3150085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
315125e682a0SAlexandre Mergnat 		.parent_hws = g12a_vclk_parent_hws,
315225e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3153085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3154085a4ea9SJian Hu 	},
3155085a4ea9SJian Hu };
3156085a4ea9SJian Hu 
3157085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_sel = {
3158085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3159085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3160085a4ea9SJian Hu 		.mask = 0x7,
3161085a4ea9SJian Hu 		.shift = 16,
3162085a4ea9SJian Hu 	},
3163085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3164085a4ea9SJian Hu 		.name = "vclk2_sel",
3165085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
316625e682a0SAlexandre Mergnat 		.parent_hws = g12a_vclk_parent_hws,
316725e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3168085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3169085a4ea9SJian Hu 	},
3170085a4ea9SJian Hu };
3171085a4ea9SJian Hu 
3172085a4ea9SJian Hu static struct clk_regmap g12a_vclk_input = {
3173085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3174085a4ea9SJian Hu 		.offset = HHI_VID_CLK_DIV,
3175085a4ea9SJian Hu 		.bit_idx = 16,
3176085a4ea9SJian Hu 	},
3177085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3178085a4ea9SJian Hu 		.name = "vclk_input",
3179085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
318025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw },
3181085a4ea9SJian Hu 		.num_parents = 1,
3182085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3183085a4ea9SJian Hu 	},
3184085a4ea9SJian Hu };
3185085a4ea9SJian Hu 
3186085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_input = {
3187085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3188085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_DIV,
3189085a4ea9SJian Hu 		.bit_idx = 16,
3190085a4ea9SJian Hu 	},
3191085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3192085a4ea9SJian Hu 		.name = "vclk2_input",
3193085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
319425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw },
3195085a4ea9SJian Hu 		.num_parents = 1,
3196085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3197085a4ea9SJian Hu 	},
3198085a4ea9SJian Hu };
3199085a4ea9SJian Hu 
3200085a4ea9SJian Hu static struct clk_regmap g12a_vclk_div = {
3201085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
3202085a4ea9SJian Hu 		.offset = HHI_VID_CLK_DIV,
3203085a4ea9SJian Hu 		.shift = 0,
3204085a4ea9SJian Hu 		.width = 8,
3205085a4ea9SJian Hu 	},
3206085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3207085a4ea9SJian Hu 		.name = "vclk_div",
3208085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
320925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
321025e682a0SAlexandre Mergnat 			&g12a_vclk_input.hw
321125e682a0SAlexandre Mergnat 		},
3212085a4ea9SJian Hu 		.num_parents = 1,
3213085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE,
3214085a4ea9SJian Hu 	},
3215085a4ea9SJian Hu };
3216085a4ea9SJian Hu 
3217085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_div = {
3218085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
3219085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_DIV,
3220085a4ea9SJian Hu 		.shift = 0,
3221085a4ea9SJian Hu 		.width = 8,
3222085a4ea9SJian Hu 	},
3223085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3224085a4ea9SJian Hu 		.name = "vclk2_div",
3225085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
322625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
322725e682a0SAlexandre Mergnat 			&g12a_vclk2_input.hw
322825e682a0SAlexandre Mergnat 		},
3229085a4ea9SJian Hu 		.num_parents = 1,
3230085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE,
3231085a4ea9SJian Hu 	},
3232085a4ea9SJian Hu };
3233085a4ea9SJian Hu 
3234085a4ea9SJian Hu static struct clk_regmap g12a_vclk = {
3235085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3236085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3237085a4ea9SJian Hu 		.bit_idx = 19,
3238085a4ea9SJian Hu 	},
3239085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3240085a4ea9SJian Hu 		.name = "vclk",
3241085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
324225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw },
3243085a4ea9SJian Hu 		.num_parents = 1,
3244085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3245085a4ea9SJian Hu 	},
3246085a4ea9SJian Hu };
3247085a4ea9SJian Hu 
3248085a4ea9SJian Hu static struct clk_regmap g12a_vclk2 = {
3249085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3250085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3251085a4ea9SJian Hu 		.bit_idx = 19,
3252085a4ea9SJian Hu 	},
3253085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3254085a4ea9SJian Hu 		.name = "vclk2",
3255085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
325625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw },
3257085a4ea9SJian Hu 		.num_parents = 1,
3258085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3259085a4ea9SJian Hu 	},
3260085a4ea9SJian Hu };
3261085a4ea9SJian Hu 
3262085a4ea9SJian Hu static struct clk_regmap g12a_vclk_div1 = {
3263085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3264085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3265085a4ea9SJian Hu 		.bit_idx = 0,
3266085a4ea9SJian Hu 	},
3267085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3268085a4ea9SJian Hu 		.name = "vclk_div1",
3269085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
327025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3271085a4ea9SJian Hu 		.num_parents = 1,
3272085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3273085a4ea9SJian Hu 	},
3274085a4ea9SJian Hu };
3275085a4ea9SJian Hu 
3276085a4ea9SJian Hu static struct clk_regmap g12a_vclk_div2_en = {
3277085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3278085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3279085a4ea9SJian Hu 		.bit_idx = 1,
3280085a4ea9SJian Hu 	},
3281085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3282085a4ea9SJian Hu 		.name = "vclk_div2_en",
3283085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
328425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3285085a4ea9SJian Hu 		.num_parents = 1,
3286085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3287085a4ea9SJian Hu 	},
3288085a4ea9SJian Hu };
3289085a4ea9SJian Hu 
3290085a4ea9SJian Hu static struct clk_regmap g12a_vclk_div4_en = {
3291085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3292085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3293085a4ea9SJian Hu 		.bit_idx = 2,
3294085a4ea9SJian Hu 	},
3295085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3296085a4ea9SJian Hu 		.name = "vclk_div4_en",
3297085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
329825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3299085a4ea9SJian Hu 		.num_parents = 1,
3300085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3301085a4ea9SJian Hu 	},
3302085a4ea9SJian Hu };
3303085a4ea9SJian Hu 
3304085a4ea9SJian Hu static struct clk_regmap g12a_vclk_div6_en = {
3305085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3306085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3307085a4ea9SJian Hu 		.bit_idx = 3,
3308085a4ea9SJian Hu 	},
3309085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3310085a4ea9SJian Hu 		.name = "vclk_div6_en",
3311085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
331225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3313085a4ea9SJian Hu 		.num_parents = 1,
3314085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3315085a4ea9SJian Hu 	},
3316085a4ea9SJian Hu };
3317085a4ea9SJian Hu 
3318085a4ea9SJian Hu static struct clk_regmap g12a_vclk_div12_en = {
3319085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3320085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL,
3321085a4ea9SJian Hu 		.bit_idx = 4,
3322085a4ea9SJian Hu 	},
3323085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3324085a4ea9SJian Hu 		.name = "vclk_div12_en",
3325085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
332625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3327085a4ea9SJian Hu 		.num_parents = 1,
3328085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3329085a4ea9SJian Hu 	},
3330085a4ea9SJian Hu };
3331085a4ea9SJian Hu 
3332085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_div1 = {
3333085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3334085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3335085a4ea9SJian Hu 		.bit_idx = 0,
3336085a4ea9SJian Hu 	},
3337085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3338085a4ea9SJian Hu 		.name = "vclk2_div1",
3339085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
334025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3341085a4ea9SJian Hu 		.num_parents = 1,
3342085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3343085a4ea9SJian Hu 	},
3344085a4ea9SJian Hu };
3345085a4ea9SJian Hu 
3346085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_div2_en = {
3347085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3348085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3349085a4ea9SJian Hu 		.bit_idx = 1,
3350085a4ea9SJian Hu 	},
3351085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3352085a4ea9SJian Hu 		.name = "vclk2_div2_en",
3353085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
335425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3355085a4ea9SJian Hu 		.num_parents = 1,
3356085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3357085a4ea9SJian Hu 	},
3358085a4ea9SJian Hu };
3359085a4ea9SJian Hu 
3360085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_div4_en = {
3361085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3362085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3363085a4ea9SJian Hu 		.bit_idx = 2,
3364085a4ea9SJian Hu 	},
3365085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3366085a4ea9SJian Hu 		.name = "vclk2_div4_en",
3367085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
336825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3369085a4ea9SJian Hu 		.num_parents = 1,
3370085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3371085a4ea9SJian Hu 	},
3372085a4ea9SJian Hu };
3373085a4ea9SJian Hu 
3374085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_div6_en = {
3375085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3376085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3377085a4ea9SJian Hu 		.bit_idx = 3,
3378085a4ea9SJian Hu 	},
3379085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3380085a4ea9SJian Hu 		.name = "vclk2_div6_en",
3381085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
338225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3383085a4ea9SJian Hu 		.num_parents = 1,
3384085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3385085a4ea9SJian Hu 	},
3386085a4ea9SJian Hu };
3387085a4ea9SJian Hu 
3388085a4ea9SJian Hu static struct clk_regmap g12a_vclk2_div12_en = {
3389085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3390085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_CNTL,
3391085a4ea9SJian Hu 		.bit_idx = 4,
3392085a4ea9SJian Hu 	},
3393085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3394085a4ea9SJian Hu 		.name = "vclk2_div12_en",
3395085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
339625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3397085a4ea9SJian Hu 		.num_parents = 1,
3398085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3399085a4ea9SJian Hu 	},
3400085a4ea9SJian Hu };
3401085a4ea9SJian Hu 
3402085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk_div2 = {
3403085a4ea9SJian Hu 	.mult = 1,
3404085a4ea9SJian Hu 	.div = 2,
3405085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3406085a4ea9SJian Hu 		.name = "vclk_div2",
3407085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
340825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
340925e682a0SAlexandre Mergnat 			&g12a_vclk_div2_en.hw
341025e682a0SAlexandre Mergnat 		},
3411085a4ea9SJian Hu 		.num_parents = 1,
3412085a4ea9SJian Hu 	},
3413085a4ea9SJian Hu };
3414085a4ea9SJian Hu 
3415085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk_div4 = {
3416085a4ea9SJian Hu 	.mult = 1,
3417085a4ea9SJian Hu 	.div = 4,
3418085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3419085a4ea9SJian Hu 		.name = "vclk_div4",
3420085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
342125e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
342225e682a0SAlexandre Mergnat 			&g12a_vclk_div4_en.hw
342325e682a0SAlexandre Mergnat 		},
3424085a4ea9SJian Hu 		.num_parents = 1,
3425085a4ea9SJian Hu 	},
3426085a4ea9SJian Hu };
3427085a4ea9SJian Hu 
3428085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk_div6 = {
3429085a4ea9SJian Hu 	.mult = 1,
3430085a4ea9SJian Hu 	.div = 6,
3431085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3432085a4ea9SJian Hu 		.name = "vclk_div6",
3433085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
343425e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
343525e682a0SAlexandre Mergnat 			&g12a_vclk_div6_en.hw
343625e682a0SAlexandre Mergnat 		},
3437085a4ea9SJian Hu 		.num_parents = 1,
3438085a4ea9SJian Hu 	},
3439085a4ea9SJian Hu };
3440085a4ea9SJian Hu 
3441085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk_div12 = {
3442085a4ea9SJian Hu 	.mult = 1,
3443085a4ea9SJian Hu 	.div = 12,
3444085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3445085a4ea9SJian Hu 		.name = "vclk_div12",
3446085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
344725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
344825e682a0SAlexandre Mergnat 			&g12a_vclk_div12_en.hw
344925e682a0SAlexandre Mergnat 		},
3450085a4ea9SJian Hu 		.num_parents = 1,
3451085a4ea9SJian Hu 	},
3452085a4ea9SJian Hu };
3453085a4ea9SJian Hu 
3454085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk2_div2 = {
3455085a4ea9SJian Hu 	.mult = 1,
3456085a4ea9SJian Hu 	.div = 2,
3457085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3458085a4ea9SJian Hu 		.name = "vclk2_div2",
3459085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
346025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
346125e682a0SAlexandre Mergnat 			&g12a_vclk2_div2_en.hw
346225e682a0SAlexandre Mergnat 		},
3463085a4ea9SJian Hu 		.num_parents = 1,
3464085a4ea9SJian Hu 	},
3465085a4ea9SJian Hu };
3466085a4ea9SJian Hu 
3467085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk2_div4 = {
3468085a4ea9SJian Hu 	.mult = 1,
3469085a4ea9SJian Hu 	.div = 4,
3470085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3471085a4ea9SJian Hu 		.name = "vclk2_div4",
3472085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
347325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
347425e682a0SAlexandre Mergnat 			&g12a_vclk2_div4_en.hw
347525e682a0SAlexandre Mergnat 		},
3476085a4ea9SJian Hu 		.num_parents = 1,
3477085a4ea9SJian Hu 	},
3478085a4ea9SJian Hu };
3479085a4ea9SJian Hu 
3480085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk2_div6 = {
3481085a4ea9SJian Hu 	.mult = 1,
3482085a4ea9SJian Hu 	.div = 6,
3483085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3484085a4ea9SJian Hu 		.name = "vclk2_div6",
3485085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
348625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
348725e682a0SAlexandre Mergnat 			&g12a_vclk2_div6_en.hw
348825e682a0SAlexandre Mergnat 		},
3489085a4ea9SJian Hu 		.num_parents = 1,
3490085a4ea9SJian Hu 	},
3491085a4ea9SJian Hu };
3492085a4ea9SJian Hu 
3493085a4ea9SJian Hu static struct clk_fixed_factor g12a_vclk2_div12 = {
3494085a4ea9SJian Hu 	.mult = 1,
3495085a4ea9SJian Hu 	.div = 12,
3496085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3497085a4ea9SJian Hu 		.name = "vclk2_div12",
3498085a4ea9SJian Hu 		.ops = &clk_fixed_factor_ops,
349925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
350025e682a0SAlexandre Mergnat 			&g12a_vclk2_div12_en.hw
350125e682a0SAlexandre Mergnat 		},
3502085a4ea9SJian Hu 		.num_parents = 1,
3503085a4ea9SJian Hu 	},
3504085a4ea9SJian Hu };
3505085a4ea9SJian Hu 
3506085a4ea9SJian Hu static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
350725e682a0SAlexandre Mergnat static const struct clk_hw *g12a_cts_parent_hws[] = {
350825e682a0SAlexandre Mergnat 	&g12a_vclk_div1.hw,
350925e682a0SAlexandre Mergnat 	&g12a_vclk_div2.hw,
351025e682a0SAlexandre Mergnat 	&g12a_vclk_div4.hw,
351125e682a0SAlexandre Mergnat 	&g12a_vclk_div6.hw,
351225e682a0SAlexandre Mergnat 	&g12a_vclk_div12.hw,
351325e682a0SAlexandre Mergnat 	&g12a_vclk2_div1.hw,
351425e682a0SAlexandre Mergnat 	&g12a_vclk2_div2.hw,
351525e682a0SAlexandre Mergnat 	&g12a_vclk2_div4.hw,
351625e682a0SAlexandre Mergnat 	&g12a_vclk2_div6.hw,
351725e682a0SAlexandre Mergnat 	&g12a_vclk2_div12.hw,
3518085a4ea9SJian Hu };
3519085a4ea9SJian Hu 
3520085a4ea9SJian Hu static struct clk_regmap g12a_cts_enci_sel = {
3521085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3522085a4ea9SJian Hu 		.offset = HHI_VID_CLK_DIV,
3523085a4ea9SJian Hu 		.mask = 0xf,
3524085a4ea9SJian Hu 		.shift = 28,
3525085a4ea9SJian Hu 		.table = mux_table_cts_sel,
3526085a4ea9SJian Hu 	},
3527085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3528085a4ea9SJian Hu 		.name = "cts_enci_sel",
3529085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
353025e682a0SAlexandre Mergnat 		.parent_hws = g12a_cts_parent_hws,
353125e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3532085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3533085a4ea9SJian Hu 	},
3534085a4ea9SJian Hu };
3535085a4ea9SJian Hu 
3536085a4ea9SJian Hu static struct clk_regmap g12a_cts_encp_sel = {
3537085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3538085a4ea9SJian Hu 		.offset = HHI_VID_CLK_DIV,
3539085a4ea9SJian Hu 		.mask = 0xf,
3540085a4ea9SJian Hu 		.shift = 20,
3541085a4ea9SJian Hu 		.table = mux_table_cts_sel,
3542085a4ea9SJian Hu 	},
3543085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3544085a4ea9SJian Hu 		.name = "cts_encp_sel",
3545085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
354625e682a0SAlexandre Mergnat 		.parent_hws = g12a_cts_parent_hws,
354725e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3548085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3549085a4ea9SJian Hu 	},
3550085a4ea9SJian Hu };
3551085a4ea9SJian Hu 
3552085a4ea9SJian Hu static struct clk_regmap g12a_cts_vdac_sel = {
3553085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3554085a4ea9SJian Hu 		.offset = HHI_VIID_CLK_DIV,
3555085a4ea9SJian Hu 		.mask = 0xf,
3556085a4ea9SJian Hu 		.shift = 28,
3557085a4ea9SJian Hu 		.table = mux_table_cts_sel,
3558085a4ea9SJian Hu 	},
3559085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3560085a4ea9SJian Hu 		.name = "cts_vdac_sel",
3561085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
356225e682a0SAlexandre Mergnat 		.parent_hws = g12a_cts_parent_hws,
356325e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3564085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3565085a4ea9SJian Hu 	},
3566085a4ea9SJian Hu };
3567085a4ea9SJian Hu 
3568085a4ea9SJian Hu /* TOFIX: add support for cts_tcon */
3569085a4ea9SJian Hu static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
357025e682a0SAlexandre Mergnat static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = {
357125e682a0SAlexandre Mergnat 	&g12a_vclk_div1.hw,
357225e682a0SAlexandre Mergnat 	&g12a_vclk_div2.hw,
357325e682a0SAlexandre Mergnat 	&g12a_vclk_div4.hw,
357425e682a0SAlexandre Mergnat 	&g12a_vclk_div6.hw,
357525e682a0SAlexandre Mergnat 	&g12a_vclk_div12.hw,
357625e682a0SAlexandre Mergnat 	&g12a_vclk2_div1.hw,
357725e682a0SAlexandre Mergnat 	&g12a_vclk2_div2.hw,
357825e682a0SAlexandre Mergnat 	&g12a_vclk2_div4.hw,
357925e682a0SAlexandre Mergnat 	&g12a_vclk2_div6.hw,
358025e682a0SAlexandre Mergnat 	&g12a_vclk2_div12.hw,
3581085a4ea9SJian Hu };
3582085a4ea9SJian Hu 
3583085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_tx_sel = {
3584085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3585085a4ea9SJian Hu 		.offset = HHI_HDMI_CLK_CNTL,
3586085a4ea9SJian Hu 		.mask = 0xf,
3587085a4ea9SJian Hu 		.shift = 16,
3588085a4ea9SJian Hu 		.table = mux_table_hdmi_tx_sel,
3589085a4ea9SJian Hu 	},
3590085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3591085a4ea9SJian Hu 		.name = "hdmi_tx_sel",
3592085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
359325e682a0SAlexandre Mergnat 		.parent_hws = g12a_cts_hdmi_tx_parent_hws,
359425e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws),
3595085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3596085a4ea9SJian Hu 	},
3597085a4ea9SJian Hu };
3598085a4ea9SJian Hu 
3599085a4ea9SJian Hu static struct clk_regmap g12a_cts_enci = {
3600085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3601085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL2,
3602085a4ea9SJian Hu 		.bit_idx = 0,
3603085a4ea9SJian Hu 	},
3604085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3605085a4ea9SJian Hu 		.name = "cts_enci",
3606085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
360725e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
360825e682a0SAlexandre Mergnat 			&g12a_cts_enci_sel.hw
360925e682a0SAlexandre Mergnat 		},
3610085a4ea9SJian Hu 		.num_parents = 1,
3611085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3612085a4ea9SJian Hu 	},
3613085a4ea9SJian Hu };
3614085a4ea9SJian Hu 
3615085a4ea9SJian Hu static struct clk_regmap g12a_cts_encp = {
3616085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3617085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL2,
3618085a4ea9SJian Hu 		.bit_idx = 2,
3619085a4ea9SJian Hu 	},
3620085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3621085a4ea9SJian Hu 		.name = "cts_encp",
3622085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
362325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
362425e682a0SAlexandre Mergnat 			&g12a_cts_encp_sel.hw
362525e682a0SAlexandre Mergnat 		},
3626085a4ea9SJian Hu 		.num_parents = 1,
3627085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3628085a4ea9SJian Hu 	},
3629085a4ea9SJian Hu };
3630085a4ea9SJian Hu 
3631085a4ea9SJian Hu static struct clk_regmap g12a_cts_vdac = {
3632085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3633085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL2,
3634085a4ea9SJian Hu 		.bit_idx = 4,
3635085a4ea9SJian Hu 	},
3636085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3637085a4ea9SJian Hu 		.name = "cts_vdac",
3638085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
363925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
364025e682a0SAlexandre Mergnat 			&g12a_cts_vdac_sel.hw
364125e682a0SAlexandre Mergnat 		},
3642085a4ea9SJian Hu 		.num_parents = 1,
3643085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3644085a4ea9SJian Hu 	},
3645085a4ea9SJian Hu };
3646085a4ea9SJian Hu 
3647085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_tx = {
3648085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3649085a4ea9SJian Hu 		.offset = HHI_VID_CLK_CNTL2,
3650085a4ea9SJian Hu 		.bit_idx = 5,
3651085a4ea9SJian Hu 	},
3652085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3653085a4ea9SJian Hu 		.name = "hdmi_tx",
3654085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
365525e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
365625e682a0SAlexandre Mergnat 			&g12a_hdmi_tx_sel.hw
365725e682a0SAlexandre Mergnat 		},
3658085a4ea9SJian Hu 		.num_parents = 1,
3659085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3660085a4ea9SJian Hu 	},
3661085a4ea9SJian Hu };
3662085a4ea9SJian Hu 
366388b9ae60SNeil Armstrong /* MIPI DSI Host Clocks */
366488b9ae60SNeil Armstrong 
366588b9ae60SNeil Armstrong static const struct clk_hw *g12a_mipi_dsi_pxclk_parent_hws[] = {
366688b9ae60SNeil Armstrong 	&g12a_vid_pll.hw,
366788b9ae60SNeil Armstrong 	&g12a_gp0_pll.hw,
366888b9ae60SNeil Armstrong 	&g12a_hifi_pll.hw,
366988b9ae60SNeil Armstrong 	&g12a_mpll1.hw,
367088b9ae60SNeil Armstrong 	&g12a_fclk_div2.hw,
367188b9ae60SNeil Armstrong 	&g12a_fclk_div2p5.hw,
367288b9ae60SNeil Armstrong 	&g12a_fclk_div3.hw,
367388b9ae60SNeil Armstrong 	&g12a_fclk_div7.hw,
367488b9ae60SNeil Armstrong };
367588b9ae60SNeil Armstrong 
367688b9ae60SNeil Armstrong static struct clk_regmap g12a_mipi_dsi_pxclk_sel = {
367788b9ae60SNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
367888b9ae60SNeil Armstrong 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
367988b9ae60SNeil Armstrong 		.mask = 0x7,
368088b9ae60SNeil Armstrong 		.shift = 12,
368188b9ae60SNeil Armstrong 		.flags = CLK_MUX_ROUND_CLOSEST,
368288b9ae60SNeil Armstrong 	},
368388b9ae60SNeil Armstrong 	.hw.init = &(struct clk_init_data){
368488b9ae60SNeil Armstrong 		.name = "mipi_dsi_pxclk_sel",
368588b9ae60SNeil Armstrong 		.ops = &clk_regmap_mux_ops,
368688b9ae60SNeil Armstrong 		.parent_hws = g12a_mipi_dsi_pxclk_parent_hws,
368788b9ae60SNeil Armstrong 		.num_parents = ARRAY_SIZE(g12a_mipi_dsi_pxclk_parent_hws),
368888b9ae60SNeil Armstrong 		.flags = CLK_SET_RATE_NO_REPARENT,
368988b9ae60SNeil Armstrong 	},
369088b9ae60SNeil Armstrong };
369188b9ae60SNeil Armstrong 
369288b9ae60SNeil Armstrong static struct clk_regmap g12a_mipi_dsi_pxclk_div = {
369388b9ae60SNeil Armstrong 	.data = &(struct clk_regmap_div_data){
369488b9ae60SNeil Armstrong 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
369588b9ae60SNeil Armstrong 		.shift = 0,
369688b9ae60SNeil Armstrong 		.width = 7,
369788b9ae60SNeil Armstrong 	},
369888b9ae60SNeil Armstrong 	.hw.init = &(struct clk_init_data){
369988b9ae60SNeil Armstrong 		.name = "mipi_dsi_pxclk_div",
370088b9ae60SNeil Armstrong 		.ops = &clk_regmap_divider_ops,
370188b9ae60SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
370288b9ae60SNeil Armstrong 			&g12a_mipi_dsi_pxclk_sel.hw
370388b9ae60SNeil Armstrong 		},
370488b9ae60SNeil Armstrong 		.num_parents = 1,
370588b9ae60SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
370688b9ae60SNeil Armstrong 	},
370788b9ae60SNeil Armstrong };
370888b9ae60SNeil Armstrong 
370988b9ae60SNeil Armstrong static struct clk_regmap g12a_mipi_dsi_pxclk = {
371088b9ae60SNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
371188b9ae60SNeil Armstrong 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
371288b9ae60SNeil Armstrong 		.bit_idx = 8,
371388b9ae60SNeil Armstrong 	},
371488b9ae60SNeil Armstrong 	.hw.init = &(struct clk_init_data) {
371588b9ae60SNeil Armstrong 		.name = "mipi_dsi_pxclk",
371688b9ae60SNeil Armstrong 		.ops = &clk_regmap_gate_ops,
371788b9ae60SNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
371888b9ae60SNeil Armstrong 			&g12a_mipi_dsi_pxclk_div.hw
371988b9ae60SNeil Armstrong 		},
372088b9ae60SNeil Armstrong 		.num_parents = 1,
372188b9ae60SNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
372288b9ae60SNeil Armstrong 	},
372388b9ae60SNeil Armstrong };
372488b9ae60SNeil Armstrong 
3725085a4ea9SJian Hu /* HDMI Clocks */
3726085a4ea9SJian Hu 
372725e682a0SAlexandre Mergnat static const struct clk_parent_data g12a_hdmi_parent_data[] = {
372825e682a0SAlexandre Mergnat 	{ .fw_name = "xtal", },
372925e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div4.hw },
373025e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div3.hw },
373125e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div5.hw },
3732085a4ea9SJian Hu };
3733085a4ea9SJian Hu 
3734085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_sel = {
3735085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3736085a4ea9SJian Hu 		.offset = HHI_HDMI_CLK_CNTL,
3737085a4ea9SJian Hu 		.mask = 0x3,
3738085a4ea9SJian Hu 		.shift = 9,
3739085a4ea9SJian Hu 		.flags = CLK_MUX_ROUND_CLOSEST,
3740085a4ea9SJian Hu 	},
3741085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3742085a4ea9SJian Hu 		.name = "hdmi_sel",
3743085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
374425e682a0SAlexandre Mergnat 		.parent_data = g12a_hdmi_parent_data,
374525e682a0SAlexandre Mergnat 		.num_parents = ARRAY_SIZE(g12a_hdmi_parent_data),
3746085a4ea9SJian Hu 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3747085a4ea9SJian Hu 	},
3748085a4ea9SJian Hu };
3749085a4ea9SJian Hu 
3750085a4ea9SJian Hu static struct clk_regmap g12a_hdmi_div = {
3751085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
3752085a4ea9SJian Hu 		.offset = HHI_HDMI_CLK_CNTL,
3753085a4ea9SJian Hu 		.shift = 0,
3754085a4ea9SJian Hu 		.width = 7,
3755085a4ea9SJian Hu 	},
3756085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3757085a4ea9SJian Hu 		.name = "hdmi_div",
3758085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
375925e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw },
3760085a4ea9SJian Hu 		.num_parents = 1,
3761085a4ea9SJian Hu 		.flags = CLK_GET_RATE_NOCACHE,
3762085a4ea9SJian Hu 	},
3763085a4ea9SJian Hu };
3764085a4ea9SJian Hu 
3765085a4ea9SJian Hu static struct clk_regmap g12a_hdmi = {
3766085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3767085a4ea9SJian Hu 		.offset = HHI_HDMI_CLK_CNTL,
3768085a4ea9SJian Hu 		.bit_idx = 8,
3769085a4ea9SJian Hu 	},
3770085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data) {
3771085a4ea9SJian Hu 		.name = "hdmi",
3772085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
377325e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw },
3774085a4ea9SJian Hu 		.num_parents = 1,
3775085a4ea9SJian Hu 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3776085a4ea9SJian Hu 	},
3777085a4ea9SJian Hu };
3778085a4ea9SJian Hu 
3779085a4ea9SJian Hu /*
3780085a4ea9SJian Hu  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
37816dde0ae3SMartin Blumenstingl  * muxed by a glitch-free switch. The CCF can manage this glitch-free
37826dde0ae3SMartin Blumenstingl  * mux because it does top-to-bottom updates the each clock tree and
37836dde0ae3SMartin Blumenstingl  * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
3784085a4ea9SJian Hu  */
378525e682a0SAlexandre Mergnat static const struct clk_parent_data g12a_mali_0_1_parent_data[] = {
378625e682a0SAlexandre Mergnat 	{ .fw_name = "xtal", },
378725e682a0SAlexandre Mergnat 	{ .hw = &g12a_gp0_pll.hw },
378825e682a0SAlexandre Mergnat 	{ .hw = &g12a_hifi_pll.hw },
378925e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div2p5.hw },
379025e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div3.hw },
379125e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div4.hw },
379225e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div5.hw },
379325e682a0SAlexandre Mergnat 	{ .hw = &g12a_fclk_div7.hw },
3794085a4ea9SJian Hu };
3795085a4ea9SJian Hu 
3796085a4ea9SJian Hu static struct clk_regmap g12a_mali_0_sel = {
3797085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3798085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3799085a4ea9SJian Hu 		.mask = 0x7,
3800085a4ea9SJian Hu 		.shift = 9,
3801085a4ea9SJian Hu 	},
3802085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3803085a4ea9SJian Hu 		.name = "mali_0_sel",
3804085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
380525e682a0SAlexandre Mergnat 		.parent_data = g12a_mali_0_1_parent_data,
3806085a4ea9SJian Hu 		.num_parents = 8,
38076dde0ae3SMartin Blumenstingl 		/*
38086dde0ae3SMartin Blumenstingl 		 * Don't request the parent to change the rate because
38096dde0ae3SMartin Blumenstingl 		 * all GPU frequencies can be derived from the fclk_*
38106dde0ae3SMartin Blumenstingl 		 * clocks and one special GP0_PLL setting. This is
38116dde0ae3SMartin Blumenstingl 		 * important because we need the MPLL clocks for audio.
38126dde0ae3SMartin Blumenstingl 		 */
38136dde0ae3SMartin Blumenstingl 		.flags = 0,
3814085a4ea9SJian Hu 	},
3815085a4ea9SJian Hu };
3816085a4ea9SJian Hu 
3817085a4ea9SJian Hu static struct clk_regmap g12a_mali_0_div = {
3818085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
3819085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3820085a4ea9SJian Hu 		.shift = 0,
3821085a4ea9SJian Hu 		.width = 7,
3822085a4ea9SJian Hu 	},
3823085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3824085a4ea9SJian Hu 		.name = "mali_0_div",
3825085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
382625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
382725e682a0SAlexandre Mergnat 			&g12a_mali_0_sel.hw
382825e682a0SAlexandre Mergnat 		},
3829085a4ea9SJian Hu 		.num_parents = 1,
38306dde0ae3SMartin Blumenstingl 		.flags = CLK_SET_RATE_PARENT,
3831085a4ea9SJian Hu 	},
3832085a4ea9SJian Hu };
3833085a4ea9SJian Hu 
3834085a4ea9SJian Hu static struct clk_regmap g12a_mali_0 = {
3835085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3836085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3837085a4ea9SJian Hu 		.bit_idx = 8,
3838085a4ea9SJian Hu 	},
3839085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3840085a4ea9SJian Hu 		.name = "mali_0",
3841085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
384225e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
384325e682a0SAlexandre Mergnat 			&g12a_mali_0_div.hw
384425e682a0SAlexandre Mergnat 		},
3845085a4ea9SJian Hu 		.num_parents = 1,
38466dde0ae3SMartin Blumenstingl 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
3847085a4ea9SJian Hu 	},
3848085a4ea9SJian Hu };
3849085a4ea9SJian Hu 
3850085a4ea9SJian Hu static struct clk_regmap g12a_mali_1_sel = {
3851085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3852085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3853085a4ea9SJian Hu 		.mask = 0x7,
3854085a4ea9SJian Hu 		.shift = 25,
3855085a4ea9SJian Hu 	},
3856085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3857085a4ea9SJian Hu 		.name = "mali_1_sel",
3858085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
385925e682a0SAlexandre Mergnat 		.parent_data = g12a_mali_0_1_parent_data,
3860085a4ea9SJian Hu 		.num_parents = 8,
38616dde0ae3SMartin Blumenstingl 		/*
38626dde0ae3SMartin Blumenstingl 		 * Don't request the parent to change the rate because
38636dde0ae3SMartin Blumenstingl 		 * all GPU frequencies can be derived from the fclk_*
38646dde0ae3SMartin Blumenstingl 		 * clocks and one special GP0_PLL setting. This is
38656dde0ae3SMartin Blumenstingl 		 * important because we need the MPLL clocks for audio.
38666dde0ae3SMartin Blumenstingl 		 */
38676dde0ae3SMartin Blumenstingl 		.flags = 0,
3868085a4ea9SJian Hu 	},
3869085a4ea9SJian Hu };
3870085a4ea9SJian Hu 
3871085a4ea9SJian Hu static struct clk_regmap g12a_mali_1_div = {
3872085a4ea9SJian Hu 	.data = &(struct clk_regmap_div_data){
3873085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3874085a4ea9SJian Hu 		.shift = 16,
3875085a4ea9SJian Hu 		.width = 7,
3876085a4ea9SJian Hu 	},
3877085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3878085a4ea9SJian Hu 		.name = "mali_1_div",
3879085a4ea9SJian Hu 		.ops = &clk_regmap_divider_ops,
388025e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
388125e682a0SAlexandre Mergnat 			&g12a_mali_1_sel.hw
388225e682a0SAlexandre Mergnat 		},
3883085a4ea9SJian Hu 		.num_parents = 1,
38846dde0ae3SMartin Blumenstingl 		.flags = CLK_SET_RATE_PARENT,
3885085a4ea9SJian Hu 	},
3886085a4ea9SJian Hu };
3887085a4ea9SJian Hu 
3888085a4ea9SJian Hu static struct clk_regmap g12a_mali_1 = {
3889085a4ea9SJian Hu 	.data = &(struct clk_regmap_gate_data){
3890085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3891085a4ea9SJian Hu 		.bit_idx = 24,
3892085a4ea9SJian Hu 	},
3893085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3894085a4ea9SJian Hu 		.name = "mali_1",
3895085a4ea9SJian Hu 		.ops = &clk_regmap_gate_ops,
389625e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
389725e682a0SAlexandre Mergnat 			&g12a_mali_1_div.hw
389825e682a0SAlexandre Mergnat 		},
3899085a4ea9SJian Hu 		.num_parents = 1,
39006dde0ae3SMartin Blumenstingl 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
3901085a4ea9SJian Hu 	},
3902085a4ea9SJian Hu };
3903085a4ea9SJian Hu 
390425e682a0SAlexandre Mergnat static const struct clk_hw *g12a_mali_parent_hws[] = {
390525e682a0SAlexandre Mergnat 	&g12a_mali_0.hw,
390625e682a0SAlexandre Mergnat 	&g12a_mali_1.hw,
3907085a4ea9SJian Hu };
3908085a4ea9SJian Hu 
3909085a4ea9SJian Hu static struct clk_regmap g12a_mali = {
3910085a4ea9SJian Hu 	.data = &(struct clk_regmap_mux_data){
3911085a4ea9SJian Hu 		.offset = HHI_MALI_CLK_CNTL,
3912085a4ea9SJian Hu 		.mask = 1,
3913085a4ea9SJian Hu 		.shift = 31,
3914085a4ea9SJian Hu 	},
3915085a4ea9SJian Hu 	.hw.init = &(struct clk_init_data){
3916085a4ea9SJian Hu 		.name = "mali",
3917085a4ea9SJian Hu 		.ops = &clk_regmap_mux_ops,
391825e682a0SAlexandre Mergnat 		.parent_hws = g12a_mali_parent_hws,
3919085a4ea9SJian Hu 		.num_parents = 2,
39206dde0ae3SMartin Blumenstingl 		.flags = CLK_SET_RATE_PARENT,
3921085a4ea9SJian Hu 	},
3922085a4ea9SJian Hu };
3923085a4ea9SJian Hu 
3924ad517d52SGuillaume La Roque static struct clk_regmap g12a_ts_div = {
3925ad517d52SGuillaume La Roque 	.data = &(struct clk_regmap_div_data){
3926ad517d52SGuillaume La Roque 		.offset = HHI_TS_CLK_CNTL,
3927ad517d52SGuillaume La Roque 		.shift = 0,
3928ad517d52SGuillaume La Roque 		.width = 8,
3929ad517d52SGuillaume La Roque 	},
3930ad517d52SGuillaume La Roque 	.hw.init = &(struct clk_init_data){
3931ad517d52SGuillaume La Roque 		.name = "ts_div",
3932ad517d52SGuillaume La Roque 		.ops = &clk_regmap_divider_ro_ops,
393325e682a0SAlexandre Mergnat 		.parent_data = &(const struct clk_parent_data) {
393425e682a0SAlexandre Mergnat 			.fw_name = "xtal",
393525e682a0SAlexandre Mergnat 		},
3936ad517d52SGuillaume La Roque 		.num_parents = 1,
3937ad517d52SGuillaume La Roque 	},
3938ad517d52SGuillaume La Roque };
3939ad517d52SGuillaume La Roque 
3940ad517d52SGuillaume La Roque static struct clk_regmap g12a_ts = {
3941ad517d52SGuillaume La Roque 	.data = &(struct clk_regmap_gate_data){
3942ad517d52SGuillaume La Roque 		.offset = HHI_TS_CLK_CNTL,
3943ad517d52SGuillaume La Roque 		.bit_idx = 8,
3944ad517d52SGuillaume La Roque 	},
3945ad517d52SGuillaume La Roque 	.hw.init = &(struct clk_init_data){
3946ad517d52SGuillaume La Roque 		.name = "ts",
3947ad517d52SGuillaume La Roque 		.ops = &clk_regmap_gate_ops,
394825e682a0SAlexandre Mergnat 		.parent_hws = (const struct clk_hw *[]) {
394925e682a0SAlexandre Mergnat 			&g12a_ts_div.hw
395025e682a0SAlexandre Mergnat 		},
3951ad517d52SGuillaume La Roque 		.num_parents = 1,
3952ad517d52SGuillaume La Roque 	},
3953ad517d52SGuillaume La Roque };
3954ad517d52SGuillaume La Roque 
3955a18c8e0bSNeil Armstrong /* SPICC SCLK source clock */
3956a18c8e0bSNeil Armstrong 
3957a18c8e0bSNeil Armstrong static const struct clk_parent_data spicc_sclk_parent_data[] = {
3958a18c8e0bSNeil Armstrong 	{ .fw_name = "xtal", },
3959a18c8e0bSNeil Armstrong 	{ .hw = &g12a_clk81.hw },
3960a18c8e0bSNeil Armstrong 	{ .hw = &g12a_fclk_div4.hw },
3961a18c8e0bSNeil Armstrong 	{ .hw = &g12a_fclk_div3.hw },
3962a18c8e0bSNeil Armstrong 	{ .hw = &g12a_fclk_div5.hw },
3963a18c8e0bSNeil Armstrong 	{ .hw = &g12a_fclk_div7.hw },
3964a18c8e0bSNeil Armstrong };
3965a18c8e0bSNeil Armstrong 
3966a18c8e0bSNeil Armstrong static struct clk_regmap g12a_spicc0_sclk_sel = {
3967a18c8e0bSNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
3968a18c8e0bSNeil Armstrong 		.offset = HHI_SPICC_CLK_CNTL,
3969a18c8e0bSNeil Armstrong 		.mask = 7,
3970a18c8e0bSNeil Armstrong 		.shift = 7,
3971a18c8e0bSNeil Armstrong 	},
3972a18c8e0bSNeil Armstrong 	.hw.init = &(struct clk_init_data){
3973a18c8e0bSNeil Armstrong 		.name = "spicc0_sclk_sel",
3974a18c8e0bSNeil Armstrong 		.ops = &clk_regmap_mux_ops,
3975a18c8e0bSNeil Armstrong 		.parent_data = spicc_sclk_parent_data,
3976a18c8e0bSNeil Armstrong 		.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
3977a18c8e0bSNeil Armstrong 	},
3978a18c8e0bSNeil Armstrong };
3979a18c8e0bSNeil Armstrong 
3980a18c8e0bSNeil Armstrong static struct clk_regmap g12a_spicc0_sclk_div = {
3981a18c8e0bSNeil Armstrong 	.data = &(struct clk_regmap_div_data){
3982a18c8e0bSNeil Armstrong 		.offset = HHI_SPICC_CLK_CNTL,
3983a18c8e0bSNeil Armstrong 		.shift = 0,
3984a18c8e0bSNeil Armstrong 		.width = 6,
3985a18c8e0bSNeil Armstrong 	},
3986a18c8e0bSNeil Armstrong 	.hw.init = &(struct clk_init_data){
3987a18c8e0bSNeil Armstrong 		.name = "spicc0_sclk_div",
3988a18c8e0bSNeil Armstrong 		.ops = &clk_regmap_divider_ops,
3989a18c8e0bSNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
3990a18c8e0bSNeil Armstrong 			&g12a_spicc0_sclk_sel.hw
3991a18c8e0bSNeil Armstrong 		},
3992a18c8e0bSNeil Armstrong 		.num_parents = 1,
3993a18c8e0bSNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
3994a18c8e0bSNeil Armstrong 	},
3995a18c8e0bSNeil Armstrong };
3996a18c8e0bSNeil Armstrong 
3997a18c8e0bSNeil Armstrong static struct clk_regmap g12a_spicc0_sclk = {
3998a18c8e0bSNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
3999a18c8e0bSNeil Armstrong 		.offset = HHI_SPICC_CLK_CNTL,
4000a18c8e0bSNeil Armstrong 		.bit_idx = 6,
4001a18c8e0bSNeil Armstrong 	},
4002a18c8e0bSNeil Armstrong 	.hw.init = &(struct clk_init_data){
4003a18c8e0bSNeil Armstrong 		.name = "spicc0_sclk",
4004a18c8e0bSNeil Armstrong 		.ops = &clk_regmap_gate_ops,
4005a18c8e0bSNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
4006a18c8e0bSNeil Armstrong 			&g12a_spicc0_sclk_div.hw
4007a18c8e0bSNeil Armstrong 		},
4008a18c8e0bSNeil Armstrong 		.num_parents = 1,
4009a18c8e0bSNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
4010a18c8e0bSNeil Armstrong 	},
4011a18c8e0bSNeil Armstrong };
4012a18c8e0bSNeil Armstrong 
4013a18c8e0bSNeil Armstrong static struct clk_regmap g12a_spicc1_sclk_sel = {
4014a18c8e0bSNeil Armstrong 	.data = &(struct clk_regmap_mux_data){
4015a18c8e0bSNeil Armstrong 		.offset = HHI_SPICC_CLK_CNTL,
4016a18c8e0bSNeil Armstrong 		.mask = 7,
4017a18c8e0bSNeil Armstrong 		.shift = 23,
4018a18c8e0bSNeil Armstrong 	},
4019a18c8e0bSNeil Armstrong 	.hw.init = &(struct clk_init_data){
4020a18c8e0bSNeil Armstrong 		.name = "spicc1_sclk_sel",
4021a18c8e0bSNeil Armstrong 		.ops = &clk_regmap_mux_ops,
4022a18c8e0bSNeil Armstrong 		.parent_data = spicc_sclk_parent_data,
4023a18c8e0bSNeil Armstrong 		.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
4024a18c8e0bSNeil Armstrong 	},
4025a18c8e0bSNeil Armstrong };
4026a18c8e0bSNeil Armstrong 
4027a18c8e0bSNeil Armstrong static struct clk_regmap g12a_spicc1_sclk_div = {
4028a18c8e0bSNeil Armstrong 	.data = &(struct clk_regmap_div_data){
4029a18c8e0bSNeil Armstrong 		.offset = HHI_SPICC_CLK_CNTL,
4030a18c8e0bSNeil Armstrong 		.shift = 16,
4031a18c8e0bSNeil Armstrong 		.width = 6,
4032a18c8e0bSNeil Armstrong 	},
4033a18c8e0bSNeil Armstrong 	.hw.init = &(struct clk_init_data){
4034a18c8e0bSNeil Armstrong 		.name = "spicc1_sclk_div",
4035a18c8e0bSNeil Armstrong 		.ops = &clk_regmap_divider_ops,
4036a18c8e0bSNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
4037a18c8e0bSNeil Armstrong 			&g12a_spicc1_sclk_sel.hw
4038a18c8e0bSNeil Armstrong 		},
4039a18c8e0bSNeil Armstrong 		.num_parents = 1,
4040a18c8e0bSNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
4041a18c8e0bSNeil Armstrong 	},
4042a18c8e0bSNeil Armstrong };
4043a18c8e0bSNeil Armstrong 
4044a18c8e0bSNeil Armstrong static struct clk_regmap g12a_spicc1_sclk = {
4045a18c8e0bSNeil Armstrong 	.data = &(struct clk_regmap_gate_data){
4046a18c8e0bSNeil Armstrong 		.offset = HHI_SPICC_CLK_CNTL,
4047a18c8e0bSNeil Armstrong 		.bit_idx = 22,
4048a18c8e0bSNeil Armstrong 	},
4049a18c8e0bSNeil Armstrong 	.hw.init = &(struct clk_init_data){
4050a18c8e0bSNeil Armstrong 		.name = "spicc1_sclk",
4051a18c8e0bSNeil Armstrong 		.ops = &clk_regmap_gate_ops,
4052a18c8e0bSNeil Armstrong 		.parent_hws = (const struct clk_hw *[]) {
4053a18c8e0bSNeil Armstrong 			&g12a_spicc1_sclk_div.hw
4054a18c8e0bSNeil Armstrong 		},
4055a18c8e0bSNeil Armstrong 		.num_parents = 1,
4056a18c8e0bSNeil Armstrong 		.flags = CLK_SET_RATE_PARENT,
4057a18c8e0bSNeil Armstrong 	},
4058a18c8e0bSNeil Armstrong };
4059a18c8e0bSNeil Armstrong 
40602f1efa53SDmitry Shmidt /* Neural Network Accelerator source clock */
40612f1efa53SDmitry Shmidt 
40622f1efa53SDmitry Shmidt static const struct clk_parent_data nna_clk_parent_data[] = {
40632f1efa53SDmitry Shmidt 	{ .fw_name = "xtal", },
40642f1efa53SDmitry Shmidt 	{ .hw = &g12a_gp0_pll.hw, },
40652f1efa53SDmitry Shmidt 	{ .hw = &g12a_hifi_pll.hw, },
40662f1efa53SDmitry Shmidt 	{ .hw = &g12a_fclk_div2p5.hw, },
40672f1efa53SDmitry Shmidt 	{ .hw = &g12a_fclk_div3.hw, },
40682f1efa53SDmitry Shmidt 	{ .hw = &g12a_fclk_div4.hw, },
40692f1efa53SDmitry Shmidt 	{ .hw = &g12a_fclk_div5.hw, },
40702f1efa53SDmitry Shmidt 	{ .hw = &g12a_fclk_div7.hw },
40712f1efa53SDmitry Shmidt };
40722f1efa53SDmitry Shmidt 
40732f1efa53SDmitry Shmidt static struct clk_regmap sm1_nna_axi_clk_sel = {
40742f1efa53SDmitry Shmidt 	.data = &(struct clk_regmap_mux_data){
40752f1efa53SDmitry Shmidt 		.offset = HHI_NNA_CLK_CNTL,
40762f1efa53SDmitry Shmidt 		.mask = 7,
40772f1efa53SDmitry Shmidt 		.shift = 9,
40782f1efa53SDmitry Shmidt 	},
40792f1efa53SDmitry Shmidt 	.hw.init = &(struct clk_init_data){
40802f1efa53SDmitry Shmidt 		.name = "nna_axi_clk_sel",
40812f1efa53SDmitry Shmidt 		.ops = &clk_regmap_mux_ops,
40822f1efa53SDmitry Shmidt 		.parent_data = nna_clk_parent_data,
40832f1efa53SDmitry Shmidt 		.num_parents = ARRAY_SIZE(nna_clk_parent_data),
40842f1efa53SDmitry Shmidt 	},
40852f1efa53SDmitry Shmidt };
40862f1efa53SDmitry Shmidt 
40872f1efa53SDmitry Shmidt static struct clk_regmap sm1_nna_axi_clk_div = {
40882f1efa53SDmitry Shmidt 	.data = &(struct clk_regmap_div_data){
40892f1efa53SDmitry Shmidt 		.offset = HHI_NNA_CLK_CNTL,
40902f1efa53SDmitry Shmidt 		.shift = 0,
40912f1efa53SDmitry Shmidt 		.width = 7,
40922f1efa53SDmitry Shmidt 	},
40932f1efa53SDmitry Shmidt 	.hw.init = &(struct clk_init_data){
40942f1efa53SDmitry Shmidt 		.name = "nna_axi_clk_div",
40952f1efa53SDmitry Shmidt 		.ops = &clk_regmap_divider_ops,
40962f1efa53SDmitry Shmidt 		.parent_hws = (const struct clk_hw *[]) {
40972f1efa53SDmitry Shmidt 			&sm1_nna_axi_clk_sel.hw
40982f1efa53SDmitry Shmidt 		},
40992f1efa53SDmitry Shmidt 		.num_parents = 1,
41002f1efa53SDmitry Shmidt 		.flags = CLK_SET_RATE_PARENT,
41012f1efa53SDmitry Shmidt 	},
41022f1efa53SDmitry Shmidt };
41032f1efa53SDmitry Shmidt 
41042f1efa53SDmitry Shmidt static struct clk_regmap sm1_nna_axi_clk = {
41052f1efa53SDmitry Shmidt 	.data = &(struct clk_regmap_gate_data){
41062f1efa53SDmitry Shmidt 		.offset = HHI_NNA_CLK_CNTL,
41072f1efa53SDmitry Shmidt 		.bit_idx = 8,
41082f1efa53SDmitry Shmidt 	},
41092f1efa53SDmitry Shmidt 	.hw.init = &(struct clk_init_data){
41102f1efa53SDmitry Shmidt 		.name = "nna_axi_clk",
41112f1efa53SDmitry Shmidt 		.ops = &clk_regmap_gate_ops,
41122f1efa53SDmitry Shmidt 		.parent_hws = (const struct clk_hw *[]) {
41132f1efa53SDmitry Shmidt 			&sm1_nna_axi_clk_div.hw
41142f1efa53SDmitry Shmidt 		},
41152f1efa53SDmitry Shmidt 		.num_parents = 1,
41162f1efa53SDmitry Shmidt 		.flags = CLK_SET_RATE_PARENT,
41172f1efa53SDmitry Shmidt 	},
41182f1efa53SDmitry Shmidt };
41192f1efa53SDmitry Shmidt 
41202f1efa53SDmitry Shmidt static struct clk_regmap sm1_nna_core_clk_sel = {
41212f1efa53SDmitry Shmidt 	.data = &(struct clk_regmap_mux_data){
41222f1efa53SDmitry Shmidt 		.offset = HHI_NNA_CLK_CNTL,
41232f1efa53SDmitry Shmidt 		.mask = 7,
41242f1efa53SDmitry Shmidt 		.shift = 25,
41252f1efa53SDmitry Shmidt 	},
41262f1efa53SDmitry Shmidt 	.hw.init = &(struct clk_init_data){
41272f1efa53SDmitry Shmidt 		.name = "nna_core_clk_sel",
41282f1efa53SDmitry Shmidt 		.ops = &clk_regmap_mux_ops,
41292f1efa53SDmitry Shmidt 		.parent_data = nna_clk_parent_data,
41302f1efa53SDmitry Shmidt 		.num_parents = ARRAY_SIZE(nna_clk_parent_data),
41312f1efa53SDmitry Shmidt 	},
41322f1efa53SDmitry Shmidt };
41332f1efa53SDmitry Shmidt 
41342f1efa53SDmitry Shmidt static struct clk_regmap sm1_nna_core_clk_div = {
41352f1efa53SDmitry Shmidt 	.data = &(struct clk_regmap_div_data){
41362f1efa53SDmitry Shmidt 		.offset = HHI_NNA_CLK_CNTL,
41372f1efa53SDmitry Shmidt 		.shift = 16,
41382f1efa53SDmitry Shmidt 		.width = 7,
41392f1efa53SDmitry Shmidt 	},
41402f1efa53SDmitry Shmidt 	.hw.init = &(struct clk_init_data){
41412f1efa53SDmitry Shmidt 		.name = "nna_core_clk_div",
41422f1efa53SDmitry Shmidt 		.ops = &clk_regmap_divider_ops,
41432f1efa53SDmitry Shmidt 		.parent_hws = (const struct clk_hw *[]) {
41442f1efa53SDmitry Shmidt 			&sm1_nna_core_clk_sel.hw
41452f1efa53SDmitry Shmidt 		},
41462f1efa53SDmitry Shmidt 		.num_parents = 1,
41472f1efa53SDmitry Shmidt 		.flags = CLK_SET_RATE_PARENT,
41482f1efa53SDmitry Shmidt 	},
41492f1efa53SDmitry Shmidt };
41502f1efa53SDmitry Shmidt 
41512f1efa53SDmitry Shmidt static struct clk_regmap sm1_nna_core_clk = {
41522f1efa53SDmitry Shmidt 	.data = &(struct clk_regmap_gate_data){
41532f1efa53SDmitry Shmidt 		.offset = HHI_NNA_CLK_CNTL,
41542f1efa53SDmitry Shmidt 		.bit_idx = 24,
41552f1efa53SDmitry Shmidt 	},
41562f1efa53SDmitry Shmidt 	.hw.init = &(struct clk_init_data){
41572f1efa53SDmitry Shmidt 		.name = "nna_core_clk",
41582f1efa53SDmitry Shmidt 		.ops = &clk_regmap_gate_ops,
41592f1efa53SDmitry Shmidt 		.parent_hws = (const struct clk_hw *[]) {
41602f1efa53SDmitry Shmidt 			&sm1_nna_core_clk_div.hw
41612f1efa53SDmitry Shmidt 		},
41622f1efa53SDmitry Shmidt 		.num_parents = 1,
41632f1efa53SDmitry Shmidt 		.flags = CLK_SET_RATE_PARENT,
41642f1efa53SDmitry Shmidt 	},
41652f1efa53SDmitry Shmidt };
41662f1efa53SDmitry Shmidt 
41673a36044eSAlexandre Mergnat #define MESON_GATE(_name, _reg, _bit) \
41683a36044eSAlexandre Mergnat 	MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
41693a36044eSAlexandre Mergnat 
41703a36044eSAlexandre Mergnat #define MESON_GATE_RO(_name, _reg, _bit) \
41713a36044eSAlexandre Mergnat 	MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
41723a36044eSAlexandre Mergnat 
4173085a4ea9SJian Hu /* Everything Else (EE) domain gates */
4174085a4ea9SJian Hu static MESON_GATE(g12a_ddr,			HHI_GCLK_MPEG0,	0);
4175085a4ea9SJian Hu static MESON_GATE(g12a_dos,			HHI_GCLK_MPEG0,	1);
4176085a4ea9SJian Hu static MESON_GATE(g12a_audio_locker,		HHI_GCLK_MPEG0,	2);
4177085a4ea9SJian Hu static MESON_GATE(g12a_mipi_dsi_host,		HHI_GCLK_MPEG0,	3);
4178085a4ea9SJian Hu static MESON_GATE(g12a_eth_phy,			HHI_GCLK_MPEG0,	4);
4179085a4ea9SJian Hu static MESON_GATE(g12a_isa,			HHI_GCLK_MPEG0,	5);
4180085a4ea9SJian Hu static MESON_GATE(g12a_pl301,			HHI_GCLK_MPEG0,	6);
4181085a4ea9SJian Hu static MESON_GATE(g12a_periphs,			HHI_GCLK_MPEG0,	7);
4182085a4ea9SJian Hu static MESON_GATE(g12a_spicc_0,			HHI_GCLK_MPEG0,	8);
4183085a4ea9SJian Hu static MESON_GATE(g12a_i2c,			HHI_GCLK_MPEG0,	9);
4184085a4ea9SJian Hu static MESON_GATE(g12a_sana,			HHI_GCLK_MPEG0,	10);
4185085a4ea9SJian Hu static MESON_GATE(g12a_sd,			HHI_GCLK_MPEG0,	11);
4186085a4ea9SJian Hu static MESON_GATE(g12a_rng0,			HHI_GCLK_MPEG0,	12);
4187085a4ea9SJian Hu static MESON_GATE(g12a_uart0,			HHI_GCLK_MPEG0,	13);
4188085a4ea9SJian Hu static MESON_GATE(g12a_spicc_1,			HHI_GCLK_MPEG0,	14);
4189085a4ea9SJian Hu static MESON_GATE(g12a_hiu_reg,			HHI_GCLK_MPEG0,	19);
4190085a4ea9SJian Hu static MESON_GATE(g12a_mipi_dsi_phy,		HHI_GCLK_MPEG0,	20);
4191085a4ea9SJian Hu static MESON_GATE(g12a_assist_misc,		HHI_GCLK_MPEG0,	23);
4192085a4ea9SJian Hu static MESON_GATE(g12a_emmc_a,			HHI_GCLK_MPEG0,	4);
4193085a4ea9SJian Hu static MESON_GATE(g12a_emmc_b,			HHI_GCLK_MPEG0,	25);
4194085a4ea9SJian Hu static MESON_GATE(g12a_emmc_c,			HHI_GCLK_MPEG0,	26);
4195085a4ea9SJian Hu static MESON_GATE(g12a_audio_codec,		HHI_GCLK_MPEG0,	28);
4196085a4ea9SJian Hu 
4197085a4ea9SJian Hu static MESON_GATE(g12a_audio,			HHI_GCLK_MPEG1,	0);
4198085a4ea9SJian Hu static MESON_GATE(g12a_eth_core,		HHI_GCLK_MPEG1,	3);
4199085a4ea9SJian Hu static MESON_GATE(g12a_demux,			HHI_GCLK_MPEG1,	4);
4200085a4ea9SJian Hu static MESON_GATE(g12a_audio_ififo,		HHI_GCLK_MPEG1,	11);
4201085a4ea9SJian Hu static MESON_GATE(g12a_adc,			HHI_GCLK_MPEG1,	13);
4202085a4ea9SJian Hu static MESON_GATE(g12a_uart1,			HHI_GCLK_MPEG1,	16);
4203085a4ea9SJian Hu static MESON_GATE(g12a_g2d,			HHI_GCLK_MPEG1,	20);
4204085a4ea9SJian Hu static MESON_GATE(g12a_reset,			HHI_GCLK_MPEG1,	23);
4205085a4ea9SJian Hu static MESON_GATE(g12a_pcie_comb,		HHI_GCLK_MPEG1,	24);
4206085a4ea9SJian Hu static MESON_GATE(g12a_parser,			HHI_GCLK_MPEG1,	25);
4207085a4ea9SJian Hu static MESON_GATE(g12a_usb_general,		HHI_GCLK_MPEG1,	26);
4208085a4ea9SJian Hu static MESON_GATE(g12a_pcie_phy,		HHI_GCLK_MPEG1,	27);
4209085a4ea9SJian Hu static MESON_GATE(g12a_ahb_arb0,		HHI_GCLK_MPEG1,	29);
4210085a4ea9SJian Hu 
4211085a4ea9SJian Hu static MESON_GATE(g12a_ahb_data_bus,		HHI_GCLK_MPEG2,	1);
4212085a4ea9SJian Hu static MESON_GATE(g12a_ahb_ctrl_bus,		HHI_GCLK_MPEG2,	2);
4213085a4ea9SJian Hu static MESON_GATE(g12a_htx_hdcp22,		HHI_GCLK_MPEG2,	3);
4214085a4ea9SJian Hu static MESON_GATE(g12a_htx_pclk,		HHI_GCLK_MPEG2,	4);
4215085a4ea9SJian Hu static MESON_GATE(g12a_bt656,			HHI_GCLK_MPEG2,	6);
4216085a4ea9SJian Hu static MESON_GATE(g12a_usb1_to_ddr,		HHI_GCLK_MPEG2,	8);
4217085a4ea9SJian Hu static MESON_GATE(g12a_mmc_pclk,		HHI_GCLK_MPEG2,	11);
4218085a4ea9SJian Hu static MESON_GATE(g12a_uart2,			HHI_GCLK_MPEG2,	15);
4219085a4ea9SJian Hu static MESON_GATE(g12a_vpu_intr,		HHI_GCLK_MPEG2,	25);
4220085a4ea9SJian Hu static MESON_GATE(g12a_gic,			HHI_GCLK_MPEG2,	30);
4221085a4ea9SJian Hu 
4222085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_venci0,		HHI_GCLK_OTHER,	1);
4223085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_venci1,		HHI_GCLK_OTHER,	2);
4224085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_vencp0,		HHI_GCLK_OTHER,	3);
4225085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_vencp1,		HHI_GCLK_OTHER,	4);
4226085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_venct0,		HHI_GCLK_OTHER,	5);
4227085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_venct1,		HHI_GCLK_OTHER,	6);
4228085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_other,		HHI_GCLK_OTHER,	7);
4229085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_enci,		HHI_GCLK_OTHER,	8);
4230085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_encp,		HHI_GCLK_OTHER,	9);
4231085a4ea9SJian Hu static MESON_GATE(g12a_dac_clk,			HHI_GCLK_OTHER,	10);
4232085a4ea9SJian Hu static MESON_GATE(g12a_aoclk_gate,		HHI_GCLK_OTHER,	14);
4233085a4ea9SJian Hu static MESON_GATE(g12a_iec958_gate,		HHI_GCLK_OTHER,	16);
4234085a4ea9SJian Hu static MESON_GATE(g12a_enc480p,			HHI_GCLK_OTHER,	20);
4235085a4ea9SJian Hu static MESON_GATE(g12a_rng1,			HHI_GCLK_OTHER,	21);
4236085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_enct,		HHI_GCLK_OTHER,	22);
4237085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_encl,		HHI_GCLK_OTHER,	23);
4238085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_venclmmc,		HHI_GCLK_OTHER,	24);
4239085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_vencl,		HHI_GCLK_OTHER,	25);
4240085a4ea9SJian Hu static MESON_GATE(g12a_vclk2_other1,		HHI_GCLK_OTHER,	26);
4241085a4ea9SJian Hu 
4242085a4ea9SJian Hu static MESON_GATE_RO(g12a_dma,			HHI_GCLK_OTHER2, 0);
4243085a4ea9SJian Hu static MESON_GATE_RO(g12a_efuse,		HHI_GCLK_OTHER2, 1);
4244085a4ea9SJian Hu static MESON_GATE_RO(g12a_rom_boot,		HHI_GCLK_OTHER2, 2);
4245085a4ea9SJian Hu static MESON_GATE_RO(g12a_reset_sec,		HHI_GCLK_OTHER2, 3);
4246085a4ea9SJian Hu static MESON_GATE_RO(g12a_sec_ahb_apb3,		HHI_GCLK_OTHER2, 4);
4247085a4ea9SJian Hu 
4248085a4ea9SJian Hu /* Array of all clocks provided by this provider */
4249141fbc27SNeil Armstrong static struct clk_hw *g12a_hw_clks[] = {
4250085a4ea9SJian Hu 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4251085a4ea9SJian Hu 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4252085a4ea9SJian Hu 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4253085a4ea9SJian Hu 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4254085a4ea9SJian Hu 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4255085a4ea9SJian Hu 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4256085a4ea9SJian Hu 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4257085a4ea9SJian Hu 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4258085a4ea9SJian Hu 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4259085a4ea9SJian Hu 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4260085a4ea9SJian Hu 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4261085a4ea9SJian Hu 	[CLKID_CLK81]			= &g12a_clk81.hw,
4262085a4ea9SJian Hu 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4263085a4ea9SJian Hu 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4264085a4ea9SJian Hu 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4265085a4ea9SJian Hu 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4266085a4ea9SJian Hu 	[CLKID_DDR]			= &g12a_ddr.hw,
4267085a4ea9SJian Hu 	[CLKID_DOS]			= &g12a_dos.hw,
4268085a4ea9SJian Hu 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4269085a4ea9SJian Hu 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4270085a4ea9SJian Hu 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4271085a4ea9SJian Hu 	[CLKID_ISA]			= &g12a_isa.hw,
4272085a4ea9SJian Hu 	[CLKID_PL301]			= &g12a_pl301.hw,
4273085a4ea9SJian Hu 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4274085a4ea9SJian Hu 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4275085a4ea9SJian Hu 	[CLKID_I2C]			= &g12a_i2c.hw,
4276085a4ea9SJian Hu 	[CLKID_SANA]			= &g12a_sana.hw,
4277085a4ea9SJian Hu 	[CLKID_SD]			= &g12a_sd.hw,
4278085a4ea9SJian Hu 	[CLKID_RNG0]			= &g12a_rng0.hw,
4279085a4ea9SJian Hu 	[CLKID_UART0]			= &g12a_uart0.hw,
4280085a4ea9SJian Hu 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4281085a4ea9SJian Hu 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4282085a4ea9SJian Hu 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4283085a4ea9SJian Hu 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4284085a4ea9SJian Hu 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4285085a4ea9SJian Hu 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4286085a4ea9SJian Hu 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4287085a4ea9SJian Hu 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4288085a4ea9SJian Hu 	[CLKID_AUDIO]			= &g12a_audio.hw,
4289085a4ea9SJian Hu 	[CLKID_ETH]			= &g12a_eth_core.hw,
4290085a4ea9SJian Hu 	[CLKID_DEMUX]			= &g12a_demux.hw,
4291085a4ea9SJian Hu 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4292085a4ea9SJian Hu 	[CLKID_ADC]			= &g12a_adc.hw,
4293085a4ea9SJian Hu 	[CLKID_UART1]			= &g12a_uart1.hw,
4294085a4ea9SJian Hu 	[CLKID_G2D]			= &g12a_g2d.hw,
4295085a4ea9SJian Hu 	[CLKID_RESET]			= &g12a_reset.hw,
4296085a4ea9SJian Hu 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4297085a4ea9SJian Hu 	[CLKID_PARSER]			= &g12a_parser.hw,
4298085a4ea9SJian Hu 	[CLKID_USB]			= &g12a_usb_general.hw,
4299085a4ea9SJian Hu 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4300085a4ea9SJian Hu 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4301085a4ea9SJian Hu 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4302085a4ea9SJian Hu 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4303085a4ea9SJian Hu 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4304085a4ea9SJian Hu 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4305085a4ea9SJian Hu 	[CLKID_BT656]			= &g12a_bt656.hw,
4306085a4ea9SJian Hu 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4307085a4ea9SJian Hu 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4308085a4ea9SJian Hu 	[CLKID_UART2]			= &g12a_uart2.hw,
4309085a4ea9SJian Hu 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4310085a4ea9SJian Hu 	[CLKID_GIC]			= &g12a_gic.hw,
4311085a4ea9SJian Hu 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4312085a4ea9SJian Hu 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4313085a4ea9SJian Hu 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4314085a4ea9SJian Hu 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4315085a4ea9SJian Hu 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4316085a4ea9SJian Hu 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4317085a4ea9SJian Hu 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4318085a4ea9SJian Hu 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4319085a4ea9SJian Hu 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4320085a4ea9SJian Hu 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4321085a4ea9SJian Hu 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4322085a4ea9SJian Hu 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4323085a4ea9SJian Hu 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4324085a4ea9SJian Hu 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4325085a4ea9SJian Hu 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4326085a4ea9SJian Hu 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4327085a4ea9SJian Hu 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4328085a4ea9SJian Hu 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4329085a4ea9SJian Hu 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4330085a4ea9SJian Hu 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4331085a4ea9SJian Hu 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4332085a4ea9SJian Hu 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4333085a4ea9SJian Hu 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4334085a4ea9SJian Hu 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4335085a4ea9SJian Hu 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4336085a4ea9SJian Hu 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4337085a4ea9SJian Hu 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4338085a4ea9SJian Hu 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4339085a4ea9SJian Hu 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4340085a4ea9SJian Hu 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4341085a4ea9SJian Hu 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4342085a4ea9SJian Hu 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4343085a4ea9SJian Hu 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4344085a4ea9SJian Hu 	[CLKID_RNG1]			= &g12a_rng1.hw,
4345085a4ea9SJian Hu 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4346085a4ea9SJian Hu 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4347085a4ea9SJian Hu 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4348085a4ea9SJian Hu 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4349085a4ea9SJian Hu 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4350085a4ea9SJian Hu 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4351085a4ea9SJian Hu 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4352085a4ea9SJian Hu 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4353085a4ea9SJian Hu 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4354085a4ea9SJian Hu 	[CLKID_DMA]			= &g12a_dma.hw,
4355085a4ea9SJian Hu 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4356085a4ea9SJian Hu 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4357085a4ea9SJian Hu 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4358085a4ea9SJian Hu 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4359085a4ea9SJian Hu 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4360085a4ea9SJian Hu 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4361085a4ea9SJian Hu 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4362085a4ea9SJian Hu 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4363085a4ea9SJian Hu 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4364085a4ea9SJian Hu 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4365085a4ea9SJian Hu 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4366085a4ea9SJian Hu 	[CLKID_VPU]			= &g12a_vpu.hw,
4367085a4ea9SJian Hu 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
4368085a4ea9SJian Hu 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
4369085a4ea9SJian Hu 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
4370085a4ea9SJian Hu 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
4371085a4ea9SJian Hu 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
4372085a4ea9SJian Hu 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
4373085a4ea9SJian Hu 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
4374085a4ea9SJian Hu 	[CLKID_VAPB]			= &g12a_vapb.hw,
4375085a4ea9SJian Hu 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
4376085a4ea9SJian Hu 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
4377085a4ea9SJian Hu 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
4378085a4ea9SJian Hu 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
4379085a4ea9SJian Hu 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
4380085a4ea9SJian Hu 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
4381085a4ea9SJian Hu 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
4382085a4ea9SJian Hu 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
4383085a4ea9SJian Hu 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
4384085a4ea9SJian Hu 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
4385085a4ea9SJian Hu 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
4386085a4ea9SJian Hu 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
4387085a4ea9SJian Hu 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
4388085a4ea9SJian Hu 	[CLKID_VCLK]			= &g12a_vclk.hw,
4389085a4ea9SJian Hu 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
4390085a4ea9SJian Hu 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
4391085a4ea9SJian Hu 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
4392085a4ea9SJian Hu 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
4393085a4ea9SJian Hu 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
4394085a4ea9SJian Hu 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
4395085a4ea9SJian Hu 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
4396085a4ea9SJian Hu 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
4397085a4ea9SJian Hu 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
4398085a4ea9SJian Hu 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
4399085a4ea9SJian Hu 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
4400085a4ea9SJian Hu 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
4401085a4ea9SJian Hu 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
4402085a4ea9SJian Hu 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
4403085a4ea9SJian Hu 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
4404085a4ea9SJian Hu 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
4405085a4ea9SJian Hu 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
4406085a4ea9SJian Hu 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
4407085a4ea9SJian Hu 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
4408085a4ea9SJian Hu 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
4409085a4ea9SJian Hu 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
4410085a4ea9SJian Hu 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
4411085a4ea9SJian Hu 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
4412085a4ea9SJian Hu 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
4413085a4ea9SJian Hu 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
4414085a4ea9SJian Hu 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
4415085a4ea9SJian Hu 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
4416085a4ea9SJian Hu 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
4417085a4ea9SJian Hu 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
4418085a4ea9SJian Hu 	[CLKID_HDMI]			= &g12a_hdmi.hw,
4419085a4ea9SJian Hu 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
4420085a4ea9SJian Hu 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
4421085a4ea9SJian Hu 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
4422085a4ea9SJian Hu 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
4423085a4ea9SJian Hu 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
4424085a4ea9SJian Hu 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
4425085a4ea9SJian Hu 	[CLKID_MALI]			= &g12a_mali.hw,
4426e63b063eSJerome Brunet 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
4427e63b063eSJerome Brunet 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
4428370294e2SNeil Armstrong 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
4429370294e2SNeil Armstrong 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
4430370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
4431370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
4432370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
4433370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
4434370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
4435370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
4436370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
4437370294e2SNeil Armstrong 	[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
4438370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
4439370294e2SNeil Armstrong 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
4440370294e2SNeil Armstrong 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
4441370294e2SNeil Armstrong 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
4442370294e2SNeil Armstrong 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
4443370294e2SNeil Armstrong 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
4444370294e2SNeil Armstrong 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
4445370294e2SNeil Armstrong 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
4446370294e2SNeil Armstrong 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
4447370294e2SNeil Armstrong 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
444834775209SNeil Armstrong 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
444934775209SNeil Armstrong 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
445034775209SNeil Armstrong 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
445134775209SNeil Armstrong 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
44524b0f7305SMaxime Jourdan 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
44534b0f7305SMaxime Jourdan 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
44544b0f7305SMaxime Jourdan 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
44554b0f7305SMaxime Jourdan 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
44564b0f7305SMaxime Jourdan 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
44574b0f7305SMaxime Jourdan 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
44584b0f7305SMaxime Jourdan 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
44594b0f7305SMaxime Jourdan 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
44604b0f7305SMaxime Jourdan 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
4461ad517d52SGuillaume La Roque 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
4462ad517d52SGuillaume La Roque 	[CLKID_TS]			= &g12a_ts.hw,
4463a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4464a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4465a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4466a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4467a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4468a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
446988b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
447088b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
447188b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
4472085a4ea9SJian Hu };
4473085a4ea9SJian Hu 
4474141fbc27SNeil Armstrong static struct clk_hw *g12b_hw_clks[] = {
4475d43628e9SNeil Armstrong 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4476d43628e9SNeil Armstrong 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4477d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4478d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4479d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4480d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4481d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4482d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4483d43628e9SNeil Armstrong 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4484d43628e9SNeil Armstrong 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4485d43628e9SNeil Armstrong 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4486d43628e9SNeil Armstrong 	[CLKID_CLK81]			= &g12a_clk81.hw,
4487d43628e9SNeil Armstrong 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4488d43628e9SNeil Armstrong 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4489d43628e9SNeil Armstrong 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4490d43628e9SNeil Armstrong 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4491d43628e9SNeil Armstrong 	[CLKID_DDR]			= &g12a_ddr.hw,
4492d43628e9SNeil Armstrong 	[CLKID_DOS]			= &g12a_dos.hw,
4493d43628e9SNeil Armstrong 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4494d43628e9SNeil Armstrong 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4495d43628e9SNeil Armstrong 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4496d43628e9SNeil Armstrong 	[CLKID_ISA]			= &g12a_isa.hw,
4497d43628e9SNeil Armstrong 	[CLKID_PL301]			= &g12a_pl301.hw,
4498d43628e9SNeil Armstrong 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4499d43628e9SNeil Armstrong 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4500d43628e9SNeil Armstrong 	[CLKID_I2C]			= &g12a_i2c.hw,
4501d43628e9SNeil Armstrong 	[CLKID_SANA]			= &g12a_sana.hw,
4502d43628e9SNeil Armstrong 	[CLKID_SD]			= &g12a_sd.hw,
4503d43628e9SNeil Armstrong 	[CLKID_RNG0]			= &g12a_rng0.hw,
4504d43628e9SNeil Armstrong 	[CLKID_UART0]			= &g12a_uart0.hw,
4505d43628e9SNeil Armstrong 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4506d43628e9SNeil Armstrong 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4507d43628e9SNeil Armstrong 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4508d43628e9SNeil Armstrong 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4509d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4510d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4511d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4512d43628e9SNeil Armstrong 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4513d43628e9SNeil Armstrong 	[CLKID_AUDIO]			= &g12a_audio.hw,
4514d43628e9SNeil Armstrong 	[CLKID_ETH]			= &g12a_eth_core.hw,
4515d43628e9SNeil Armstrong 	[CLKID_DEMUX]			= &g12a_demux.hw,
4516d43628e9SNeil Armstrong 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4517d43628e9SNeil Armstrong 	[CLKID_ADC]			= &g12a_adc.hw,
4518d43628e9SNeil Armstrong 	[CLKID_UART1]			= &g12a_uart1.hw,
4519d43628e9SNeil Armstrong 	[CLKID_G2D]			= &g12a_g2d.hw,
4520d43628e9SNeil Armstrong 	[CLKID_RESET]			= &g12a_reset.hw,
4521d43628e9SNeil Armstrong 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4522d43628e9SNeil Armstrong 	[CLKID_PARSER]			= &g12a_parser.hw,
4523d43628e9SNeil Armstrong 	[CLKID_USB]			= &g12a_usb_general.hw,
4524d43628e9SNeil Armstrong 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4525d43628e9SNeil Armstrong 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4526d43628e9SNeil Armstrong 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4527d43628e9SNeil Armstrong 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4528d43628e9SNeil Armstrong 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4529d43628e9SNeil Armstrong 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4530d43628e9SNeil Armstrong 	[CLKID_BT656]			= &g12a_bt656.hw,
4531d43628e9SNeil Armstrong 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4532d43628e9SNeil Armstrong 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4533d43628e9SNeil Armstrong 	[CLKID_UART2]			= &g12a_uart2.hw,
4534d43628e9SNeil Armstrong 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4535d43628e9SNeil Armstrong 	[CLKID_GIC]			= &g12a_gic.hw,
4536d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4537d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4538d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4539d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4540d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4541d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4542d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4543d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4544d43628e9SNeil Armstrong 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4545d43628e9SNeil Armstrong 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4546d43628e9SNeil Armstrong 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4547d43628e9SNeil Armstrong 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4548d43628e9SNeil Armstrong 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4549d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4550d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4551d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4552d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4553d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4554d43628e9SNeil Armstrong 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4555d43628e9SNeil Armstrong 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4556d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4557d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4558d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4559d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4560d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4561d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4562d43628e9SNeil Armstrong 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4563d43628e9SNeil Armstrong 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4564d43628e9SNeil Armstrong 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4565d43628e9SNeil Armstrong 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4566d43628e9SNeil Armstrong 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4567d43628e9SNeil Armstrong 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4568d43628e9SNeil Armstrong 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4569d43628e9SNeil Armstrong 	[CLKID_RNG1]			= &g12a_rng1.hw,
4570d43628e9SNeil Armstrong 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4571d43628e9SNeil Armstrong 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4572d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4573d43628e9SNeil Armstrong 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4574d43628e9SNeil Armstrong 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4575d43628e9SNeil Armstrong 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4576d43628e9SNeil Armstrong 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4577d43628e9SNeil Armstrong 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4578d43628e9SNeil Armstrong 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4579d43628e9SNeil Armstrong 	[CLKID_DMA]			= &g12a_dma.hw,
4580d43628e9SNeil Armstrong 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4581d43628e9SNeil Armstrong 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4582d43628e9SNeil Armstrong 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4583d43628e9SNeil Armstrong 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4584d43628e9SNeil Armstrong 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4585d43628e9SNeil Armstrong 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4586d43628e9SNeil Armstrong 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4587d43628e9SNeil Armstrong 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4588d43628e9SNeil Armstrong 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4589d43628e9SNeil Armstrong 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4590d43628e9SNeil Armstrong 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4591d43628e9SNeil Armstrong 	[CLKID_VPU]			= &g12a_vpu.hw,
4592d43628e9SNeil Armstrong 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
4593d43628e9SNeil Armstrong 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
4594d43628e9SNeil Armstrong 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
4595d43628e9SNeil Armstrong 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
4596d43628e9SNeil Armstrong 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
4597d43628e9SNeil Armstrong 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
4598d43628e9SNeil Armstrong 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
4599d43628e9SNeil Armstrong 	[CLKID_VAPB]			= &g12a_vapb.hw,
4600d43628e9SNeil Armstrong 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
4601d43628e9SNeil Armstrong 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
4602d43628e9SNeil Armstrong 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
4603d43628e9SNeil Armstrong 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
4604d43628e9SNeil Armstrong 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
4605d43628e9SNeil Armstrong 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
4606d43628e9SNeil Armstrong 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
4607d43628e9SNeil Armstrong 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
4608d43628e9SNeil Armstrong 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
4609d43628e9SNeil Armstrong 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
4610d43628e9SNeil Armstrong 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
4611d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
4612d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
4613d43628e9SNeil Armstrong 	[CLKID_VCLK]			= &g12a_vclk.hw,
4614d43628e9SNeil Armstrong 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
4615d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
4616d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
4617d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
4618d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
4619d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
4620d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
4621d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
4622d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
4623d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
4624d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
4625d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
4626d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
4627d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
4628d43628e9SNeil Armstrong 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
4629d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
4630d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
4631d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
4632d43628e9SNeil Armstrong 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
4633d43628e9SNeil Armstrong 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
4634d43628e9SNeil Armstrong 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
4635d43628e9SNeil Armstrong 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
4636d43628e9SNeil Armstrong 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
4637d43628e9SNeil Armstrong 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
4638d43628e9SNeil Armstrong 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
4639d43628e9SNeil Armstrong 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
4640d43628e9SNeil Armstrong 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
4641d43628e9SNeil Armstrong 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
4642d43628e9SNeil Armstrong 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
4643d43628e9SNeil Armstrong 	[CLKID_HDMI]			= &g12a_hdmi.hw,
4644d43628e9SNeil Armstrong 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
4645d43628e9SNeil Armstrong 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
4646d43628e9SNeil Armstrong 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
4647d43628e9SNeil Armstrong 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
4648d43628e9SNeil Armstrong 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
4649d43628e9SNeil Armstrong 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
4650d43628e9SNeil Armstrong 	[CLKID_MALI]			= &g12a_mali.hw,
4651d43628e9SNeil Armstrong 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
4652d43628e9SNeil Armstrong 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
4653d43628e9SNeil Armstrong 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
4654d43628e9SNeil Armstrong 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
4655d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
4656d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
4657d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
4658d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
4659d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
4660d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
4661d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
4662d43628e9SNeil Armstrong 	[CLKID_CPU_CLK]			= &g12b_cpu_clk.hw,
4663d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
4664d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
4665d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
4666d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
4667d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
4668d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
4669d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
4670d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
4671d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
4672d43628e9SNeil Armstrong 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
4673d43628e9SNeil Armstrong 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
4674d43628e9SNeil Armstrong 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
4675d43628e9SNeil Armstrong 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
4676d43628e9SNeil Armstrong 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
4677d43628e9SNeil Armstrong 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
4678d43628e9SNeil Armstrong 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
4679d43628e9SNeil Armstrong 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
4680d43628e9SNeil Armstrong 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
4681d43628e9SNeil Armstrong 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
4682d43628e9SNeil Armstrong 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
4683d43628e9SNeil Armstrong 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
4684d43628e9SNeil Armstrong 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
4685d43628e9SNeil Armstrong 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
4686d43628e9SNeil Armstrong 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
4687d43628e9SNeil Armstrong 	[CLKID_TS]			= &g12a_ts.hw,
4688d43628e9SNeil Armstrong 	[CLKID_SYS1_PLL_DCO]		= &g12b_sys1_pll_dco.hw,
4689d43628e9SNeil Armstrong 	[CLKID_SYS1_PLL]		= &g12b_sys1_pll.hw,
4690d43628e9SNeil Armstrong 	[CLKID_SYS1_PLL_DIV16_EN]	= &g12b_sys1_pll_div16_en.hw,
4691d43628e9SNeil Armstrong 	[CLKID_SYS1_PLL_DIV16]		= &g12b_sys1_pll_div16.hw,
4692d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN0_SEL]	= &g12b_cpub_clk_premux0.hw,
4693d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN0_DIV]	= &g12b_cpub_clk_mux0_div.hw,
4694d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN0]		= &g12b_cpub_clk_postmux0.hw,
4695d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN1_SEL]	= &g12b_cpub_clk_premux1.hw,
4696d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN1_DIV]	= &g12b_cpub_clk_mux1_div.hw,
4697d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN1]		= &g12b_cpub_clk_postmux1.hw,
4698d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DYN]		= &g12b_cpub_clk_dyn.hw,
4699d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK]		= &g12b_cpub_clk.hw,
4700d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV16_EN]	= &g12b_cpub_clk_div16_en.hw,
4701d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV16]		= &g12b_cpub_clk_div16.hw,
4702d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV2]		= &g12b_cpub_clk_div2.hw,
4703d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV3]		= &g12b_cpub_clk_div3.hw,
4704d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV4]		= &g12b_cpub_clk_div4.hw,
4705d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV5]		= &g12b_cpub_clk_div5.hw,
4706d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV6]		= &g12b_cpub_clk_div6.hw,
4707d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV7]		= &g12b_cpub_clk_div7.hw,
4708d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_DIV8]		= &g12b_cpub_clk_div8.hw,
4709d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_APB_SEL]	= &g12b_cpub_clk_apb_sel.hw,
4710d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_APB]		= &g12b_cpub_clk_apb.hw,
4711d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_ATB_SEL]	= &g12b_cpub_clk_atb_sel.hw,
4712d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_ATB]		= &g12b_cpub_clk_atb.hw,
4713d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_AXI_SEL]	= &g12b_cpub_clk_axi_sel.hw,
4714d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_AXI]		= &g12b_cpub_clk_axi.hw,
4715d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_TRACE_SEL]	= &g12b_cpub_clk_trace_sel.hw,
4716d43628e9SNeil Armstrong 	[CLKID_CPUB_CLK_TRACE]		= &g12b_cpub_clk_trace.hw,
4717a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4718a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4719a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4720a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4721a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4722a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
47238271813eSNick Xie 	[CLKID_NNA_AXI_CLK_SEL]		= &sm1_nna_axi_clk_sel.hw,
47248271813eSNick Xie 	[CLKID_NNA_AXI_CLK_DIV]		= &sm1_nna_axi_clk_div.hw,
47258271813eSNick Xie 	[CLKID_NNA_AXI_CLK]		= &sm1_nna_axi_clk.hw,
47268271813eSNick Xie 	[CLKID_NNA_CORE_CLK_SEL]	= &sm1_nna_core_clk_sel.hw,
47278271813eSNick Xie 	[CLKID_NNA_CORE_CLK_DIV]	= &sm1_nna_core_clk_div.hw,
47288271813eSNick Xie 	[CLKID_NNA_CORE_CLK]		= &sm1_nna_core_clk.hw,
472988b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
473088b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
473188b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
4732d43628e9SNeil Armstrong };
4733d43628e9SNeil Armstrong 
4734141fbc27SNeil Armstrong static struct clk_hw *sm1_hw_clks[] = {
47353dd02b73SNeil Armstrong 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
47363dd02b73SNeil Armstrong 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
47373dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
47383dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
47393dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
47403dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
47413dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
47423dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
47433dd02b73SNeil Armstrong 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
47443dd02b73SNeil Armstrong 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
47453dd02b73SNeil Armstrong 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
47463dd02b73SNeil Armstrong 	[CLKID_CLK81]			= &g12a_clk81.hw,
47473dd02b73SNeil Armstrong 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
47483dd02b73SNeil Armstrong 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
47493dd02b73SNeil Armstrong 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
47503dd02b73SNeil Armstrong 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
47513dd02b73SNeil Armstrong 	[CLKID_DDR]			= &g12a_ddr.hw,
47523dd02b73SNeil Armstrong 	[CLKID_DOS]			= &g12a_dos.hw,
47533dd02b73SNeil Armstrong 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
47543dd02b73SNeil Armstrong 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
47553dd02b73SNeil Armstrong 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
47563dd02b73SNeil Armstrong 	[CLKID_ISA]			= &g12a_isa.hw,
47573dd02b73SNeil Armstrong 	[CLKID_PL301]			= &g12a_pl301.hw,
47583dd02b73SNeil Armstrong 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
47593dd02b73SNeil Armstrong 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
47603dd02b73SNeil Armstrong 	[CLKID_I2C]			= &g12a_i2c.hw,
47613dd02b73SNeil Armstrong 	[CLKID_SANA]			= &g12a_sana.hw,
47623dd02b73SNeil Armstrong 	[CLKID_SD]			= &g12a_sd.hw,
47633dd02b73SNeil Armstrong 	[CLKID_RNG0]			= &g12a_rng0.hw,
47643dd02b73SNeil Armstrong 	[CLKID_UART0]			= &g12a_uart0.hw,
47653dd02b73SNeil Armstrong 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
47663dd02b73SNeil Armstrong 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
47673dd02b73SNeil Armstrong 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
47683dd02b73SNeil Armstrong 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
47693dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
47703dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
47713dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
47723dd02b73SNeil Armstrong 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
47733dd02b73SNeil Armstrong 	[CLKID_AUDIO]			= &g12a_audio.hw,
47743dd02b73SNeil Armstrong 	[CLKID_ETH]			= &g12a_eth_core.hw,
47753dd02b73SNeil Armstrong 	[CLKID_DEMUX]			= &g12a_demux.hw,
47763dd02b73SNeil Armstrong 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
47773dd02b73SNeil Armstrong 	[CLKID_ADC]			= &g12a_adc.hw,
47783dd02b73SNeil Armstrong 	[CLKID_UART1]			= &g12a_uart1.hw,
47793dd02b73SNeil Armstrong 	[CLKID_G2D]			= &g12a_g2d.hw,
47803dd02b73SNeil Armstrong 	[CLKID_RESET]			= &g12a_reset.hw,
47813dd02b73SNeil Armstrong 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
47823dd02b73SNeil Armstrong 	[CLKID_PARSER]			= &g12a_parser.hw,
47833dd02b73SNeil Armstrong 	[CLKID_USB]			= &g12a_usb_general.hw,
47843dd02b73SNeil Armstrong 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
47853dd02b73SNeil Armstrong 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
47863dd02b73SNeil Armstrong 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
47873dd02b73SNeil Armstrong 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
47883dd02b73SNeil Armstrong 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
47893dd02b73SNeil Armstrong 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
47903dd02b73SNeil Armstrong 	[CLKID_BT656]			= &g12a_bt656.hw,
47913dd02b73SNeil Armstrong 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
47923dd02b73SNeil Armstrong 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
47933dd02b73SNeil Armstrong 	[CLKID_UART2]			= &g12a_uart2.hw,
47943dd02b73SNeil Armstrong 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
47953dd02b73SNeil Armstrong 	[CLKID_GIC]			= &g12a_gic.hw,
47963dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
47973dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
47983dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
47993dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
48003dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
48013dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
48023dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
48033dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
48043dd02b73SNeil Armstrong 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
48053dd02b73SNeil Armstrong 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
48063dd02b73SNeil Armstrong 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
48073dd02b73SNeil Armstrong 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
48083dd02b73SNeil Armstrong 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
48093dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
48103dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
48113dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
48123dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
48133dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
48143dd02b73SNeil Armstrong 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
48153dd02b73SNeil Armstrong 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
48163dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
48173dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
48183dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
48193dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
48203dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
48213dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
48223dd02b73SNeil Armstrong 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
48233dd02b73SNeil Armstrong 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
48243dd02b73SNeil Armstrong 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
48253dd02b73SNeil Armstrong 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
48263dd02b73SNeil Armstrong 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
48273dd02b73SNeil Armstrong 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
48283dd02b73SNeil Armstrong 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
48293dd02b73SNeil Armstrong 	[CLKID_RNG1]			= &g12a_rng1.hw,
48303dd02b73SNeil Armstrong 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
48313dd02b73SNeil Armstrong 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
48323dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
48333dd02b73SNeil Armstrong 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
48343dd02b73SNeil Armstrong 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
48353dd02b73SNeil Armstrong 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
48363dd02b73SNeil Armstrong 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
48373dd02b73SNeil Armstrong 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
48383dd02b73SNeil Armstrong 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
48393dd02b73SNeil Armstrong 	[CLKID_DMA]			= &g12a_dma.hw,
48403dd02b73SNeil Armstrong 	[CLKID_EFUSE]			= &g12a_efuse.hw,
48413dd02b73SNeil Armstrong 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
48423dd02b73SNeil Armstrong 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
48433dd02b73SNeil Armstrong 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
48443dd02b73SNeil Armstrong 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
48453dd02b73SNeil Armstrong 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
48463dd02b73SNeil Armstrong 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
48473dd02b73SNeil Armstrong 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
48483dd02b73SNeil Armstrong 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
48493dd02b73SNeil Armstrong 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
48503dd02b73SNeil Armstrong 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
48513dd02b73SNeil Armstrong 	[CLKID_VPU]			= &g12a_vpu.hw,
48523dd02b73SNeil Armstrong 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
48533dd02b73SNeil Armstrong 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
48543dd02b73SNeil Armstrong 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
48553dd02b73SNeil Armstrong 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
48563dd02b73SNeil Armstrong 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
48573dd02b73SNeil Armstrong 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
48583dd02b73SNeil Armstrong 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
48593dd02b73SNeil Armstrong 	[CLKID_VAPB]			= &g12a_vapb.hw,
48603dd02b73SNeil Armstrong 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
48613dd02b73SNeil Armstrong 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
48623dd02b73SNeil Armstrong 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
48633dd02b73SNeil Armstrong 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
48643dd02b73SNeil Armstrong 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
48653dd02b73SNeil Armstrong 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
48663dd02b73SNeil Armstrong 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
48673dd02b73SNeil Armstrong 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
48683dd02b73SNeil Armstrong 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
48693dd02b73SNeil Armstrong 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
48703dd02b73SNeil Armstrong 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
48713dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
48723dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
48733dd02b73SNeil Armstrong 	[CLKID_VCLK]			= &g12a_vclk.hw,
48743dd02b73SNeil Armstrong 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
48753dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
48763dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
48773dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
48783dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
48793dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
48803dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
48813dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
48823dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
48833dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
48843dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
48853dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
48863dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
48873dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
48883dd02b73SNeil Armstrong 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
48893dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
48903dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
48913dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
48923dd02b73SNeil Armstrong 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
48933dd02b73SNeil Armstrong 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
48943dd02b73SNeil Armstrong 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
48953dd02b73SNeil Armstrong 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
48963dd02b73SNeil Armstrong 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
48973dd02b73SNeil Armstrong 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
48983dd02b73SNeil Armstrong 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
48993dd02b73SNeil Armstrong 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
49003dd02b73SNeil Armstrong 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
49013dd02b73SNeil Armstrong 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
49023dd02b73SNeil Armstrong 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
49033dd02b73SNeil Armstrong 	[CLKID_HDMI]			= &g12a_hdmi.hw,
49043dd02b73SNeil Armstrong 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
49053dd02b73SNeil Armstrong 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
49063dd02b73SNeil Armstrong 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
49073dd02b73SNeil Armstrong 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
49083dd02b73SNeil Armstrong 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
49093dd02b73SNeil Armstrong 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
49103dd02b73SNeil Armstrong 	[CLKID_MALI]			= &g12a_mali.hw,
49113dd02b73SNeil Armstrong 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
49123dd02b73SNeil Armstrong 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
49133dd02b73SNeil Armstrong 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
49143dd02b73SNeil Armstrong 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
49153dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
49163dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
49173dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
49183dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
49193dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
49203dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
49213dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
49223dd02b73SNeil Armstrong 	[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
49233dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
49243dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
49253dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
49263dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
49273dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
49283dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
49293dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
49303dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
49313dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
49323dd02b73SNeil Armstrong 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
49333dd02b73SNeil Armstrong 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
49343dd02b73SNeil Armstrong 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
49353dd02b73SNeil Armstrong 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
49363dd02b73SNeil Armstrong 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
49373dd02b73SNeil Armstrong 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
49383dd02b73SNeil Armstrong 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
49393dd02b73SNeil Armstrong 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
49403dd02b73SNeil Armstrong 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
49413dd02b73SNeil Armstrong 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
49423dd02b73SNeil Armstrong 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
49433dd02b73SNeil Armstrong 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
49443dd02b73SNeil Armstrong 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
49453dd02b73SNeil Armstrong 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
49463dd02b73SNeil Armstrong 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
49473dd02b73SNeil Armstrong 	[CLKID_TS]			= &g12a_ts.hw,
49483dd02b73SNeil Armstrong 	[CLKID_GP1_PLL_DCO]		= &sm1_gp1_pll_dco.hw,
49493dd02b73SNeil Armstrong 	[CLKID_GP1_PLL]			= &sm1_gp1_pll.hw,
49502edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN0_SEL]	= &sm1_dsu_clk_premux0.hw,
49512edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN0_DIV]	= &sm1_dsu_clk_premux1.hw,
49522edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN0]		= &sm1_dsu_clk_mux0_div.hw,
49532edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN1_SEL]	= &sm1_dsu_clk_postmux0.hw,
49542edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN1_DIV]	= &sm1_dsu_clk_mux1_div.hw,
49552edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN1]		= &sm1_dsu_clk_postmux1.hw,
49562edccd31SNeil Armstrong 	[CLKID_DSU_CLK_DYN]		= &sm1_dsu_clk_dyn.hw,
49572edccd31SNeil Armstrong 	[CLKID_DSU_CLK_FINAL]		= &sm1_dsu_final_clk.hw,
49582edccd31SNeil Armstrong 	[CLKID_DSU_CLK]			= &sm1_dsu_clk.hw,
4959da3ceae4SNeil Armstrong 	[CLKID_CPU1_CLK]		= &sm1_cpu1_clk.hw,
4960da3ceae4SNeil Armstrong 	[CLKID_CPU2_CLK]		= &sm1_cpu2_clk.hw,
4961da3ceae4SNeil Armstrong 	[CLKID_CPU3_CLK]		= &sm1_cpu3_clk.hw,
4962a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4963a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4964a18c8e0bSNeil Armstrong 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4965a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4966a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4967a18c8e0bSNeil Armstrong 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
49682f1efa53SDmitry Shmidt 	[CLKID_NNA_AXI_CLK_SEL]		= &sm1_nna_axi_clk_sel.hw,
49692f1efa53SDmitry Shmidt 	[CLKID_NNA_AXI_CLK_DIV]		= &sm1_nna_axi_clk_div.hw,
49702f1efa53SDmitry Shmidt 	[CLKID_NNA_AXI_CLK]		= &sm1_nna_axi_clk.hw,
49712f1efa53SDmitry Shmidt 	[CLKID_NNA_CORE_CLK_SEL]	= &sm1_nna_core_clk_sel.hw,
49722f1efa53SDmitry Shmidt 	[CLKID_NNA_CORE_CLK_DIV]	= &sm1_nna_core_clk_div.hw,
49732f1efa53SDmitry Shmidt 	[CLKID_NNA_CORE_CLK]		= &sm1_nna_core_clk.hw,
497488b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
497588b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
497688b9ae60SNeil Armstrong 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
49773dd02b73SNeil Armstrong };
49783dd02b73SNeil Armstrong 
4979085a4ea9SJian Hu /* Convenience table to populate regmap in .probe */
4980085a4ea9SJian Hu static struct clk_regmap *const g12a_clk_regmaps[] = {
4981085a4ea9SJian Hu 	&g12a_clk81,
4982085a4ea9SJian Hu 	&g12a_dos,
4983085a4ea9SJian Hu 	&g12a_ddr,
4984085a4ea9SJian Hu 	&g12a_audio_locker,
4985085a4ea9SJian Hu 	&g12a_mipi_dsi_host,
4986085a4ea9SJian Hu 	&g12a_eth_phy,
4987085a4ea9SJian Hu 	&g12a_isa,
4988085a4ea9SJian Hu 	&g12a_pl301,
4989085a4ea9SJian Hu 	&g12a_periphs,
4990085a4ea9SJian Hu 	&g12a_spicc_0,
4991085a4ea9SJian Hu 	&g12a_i2c,
4992085a4ea9SJian Hu 	&g12a_sana,
4993085a4ea9SJian Hu 	&g12a_sd,
4994085a4ea9SJian Hu 	&g12a_rng0,
4995085a4ea9SJian Hu 	&g12a_uart0,
4996085a4ea9SJian Hu 	&g12a_spicc_1,
4997085a4ea9SJian Hu 	&g12a_hiu_reg,
4998085a4ea9SJian Hu 	&g12a_mipi_dsi_phy,
4999085a4ea9SJian Hu 	&g12a_assist_misc,
5000085a4ea9SJian Hu 	&g12a_emmc_a,
5001085a4ea9SJian Hu 	&g12a_emmc_b,
5002085a4ea9SJian Hu 	&g12a_emmc_c,
5003085a4ea9SJian Hu 	&g12a_audio_codec,
5004085a4ea9SJian Hu 	&g12a_audio,
5005085a4ea9SJian Hu 	&g12a_eth_core,
5006085a4ea9SJian Hu 	&g12a_demux,
5007085a4ea9SJian Hu 	&g12a_audio_ififo,
5008085a4ea9SJian Hu 	&g12a_adc,
5009085a4ea9SJian Hu 	&g12a_uart1,
5010085a4ea9SJian Hu 	&g12a_g2d,
5011085a4ea9SJian Hu 	&g12a_reset,
5012085a4ea9SJian Hu 	&g12a_pcie_comb,
5013085a4ea9SJian Hu 	&g12a_parser,
5014085a4ea9SJian Hu 	&g12a_usb_general,
5015085a4ea9SJian Hu 	&g12a_pcie_phy,
5016085a4ea9SJian Hu 	&g12a_ahb_arb0,
5017085a4ea9SJian Hu 	&g12a_ahb_data_bus,
5018085a4ea9SJian Hu 	&g12a_ahb_ctrl_bus,
5019085a4ea9SJian Hu 	&g12a_htx_hdcp22,
5020085a4ea9SJian Hu 	&g12a_htx_pclk,
5021085a4ea9SJian Hu 	&g12a_bt656,
5022085a4ea9SJian Hu 	&g12a_usb1_to_ddr,
5023085a4ea9SJian Hu 	&g12a_mmc_pclk,
5024b1b3f062SJerome Brunet 	&g12a_uart2,
5025085a4ea9SJian Hu 	&g12a_vpu_intr,
5026085a4ea9SJian Hu 	&g12a_gic,
5027085a4ea9SJian Hu 	&g12a_sd_emmc_a_clk0,
5028085a4ea9SJian Hu 	&g12a_sd_emmc_b_clk0,
5029085a4ea9SJian Hu 	&g12a_sd_emmc_c_clk0,
5030085a4ea9SJian Hu 	&g12a_mpeg_clk_div,
5031085a4ea9SJian Hu 	&g12a_sd_emmc_a_clk0_div,
5032085a4ea9SJian Hu 	&g12a_sd_emmc_b_clk0_div,
5033085a4ea9SJian Hu 	&g12a_sd_emmc_c_clk0_div,
5034085a4ea9SJian Hu 	&g12a_mpeg_clk_sel,
5035085a4ea9SJian Hu 	&g12a_sd_emmc_a_clk0_sel,
5036085a4ea9SJian Hu 	&g12a_sd_emmc_b_clk0_sel,
5037085a4ea9SJian Hu 	&g12a_sd_emmc_c_clk0_sel,
5038085a4ea9SJian Hu 	&g12a_mpll0,
5039085a4ea9SJian Hu 	&g12a_mpll1,
5040085a4ea9SJian Hu 	&g12a_mpll2,
5041085a4ea9SJian Hu 	&g12a_mpll3,
5042085a4ea9SJian Hu 	&g12a_mpll0_div,
5043085a4ea9SJian Hu 	&g12a_mpll1_div,
5044085a4ea9SJian Hu 	&g12a_mpll2_div,
5045085a4ea9SJian Hu 	&g12a_mpll3_div,
5046085a4ea9SJian Hu 	&g12a_fixed_pll,
5047085a4ea9SJian Hu 	&g12a_sys_pll,
5048085a4ea9SJian Hu 	&g12a_gp0_pll,
5049085a4ea9SJian Hu 	&g12a_hifi_pll,
5050085a4ea9SJian Hu 	&g12a_vclk2_venci0,
5051085a4ea9SJian Hu 	&g12a_vclk2_venci1,
5052085a4ea9SJian Hu 	&g12a_vclk2_vencp0,
5053085a4ea9SJian Hu 	&g12a_vclk2_vencp1,
5054085a4ea9SJian Hu 	&g12a_vclk2_venct0,
5055085a4ea9SJian Hu 	&g12a_vclk2_venct1,
5056085a4ea9SJian Hu 	&g12a_vclk2_other,
5057085a4ea9SJian Hu 	&g12a_vclk2_enci,
5058085a4ea9SJian Hu 	&g12a_vclk2_encp,
5059085a4ea9SJian Hu 	&g12a_dac_clk,
5060085a4ea9SJian Hu 	&g12a_aoclk_gate,
5061085a4ea9SJian Hu 	&g12a_iec958_gate,
5062085a4ea9SJian Hu 	&g12a_enc480p,
5063085a4ea9SJian Hu 	&g12a_rng1,
5064085a4ea9SJian Hu 	&g12a_vclk2_enct,
5065085a4ea9SJian Hu 	&g12a_vclk2_encl,
5066085a4ea9SJian Hu 	&g12a_vclk2_venclmmc,
5067085a4ea9SJian Hu 	&g12a_vclk2_vencl,
5068085a4ea9SJian Hu 	&g12a_vclk2_other1,
5069085a4ea9SJian Hu 	&g12a_fixed_pll_dco,
5070085a4ea9SJian Hu 	&g12a_sys_pll_dco,
5071085a4ea9SJian Hu 	&g12a_gp0_pll_dco,
5072085a4ea9SJian Hu 	&g12a_hifi_pll_dco,
5073085a4ea9SJian Hu 	&g12a_fclk_div2,
5074085a4ea9SJian Hu 	&g12a_fclk_div3,
5075085a4ea9SJian Hu 	&g12a_fclk_div4,
5076085a4ea9SJian Hu 	&g12a_fclk_div5,
5077085a4ea9SJian Hu 	&g12a_fclk_div7,
5078085a4ea9SJian Hu 	&g12a_fclk_div2p5,
5079085a4ea9SJian Hu 	&g12a_dma,
5080085a4ea9SJian Hu 	&g12a_efuse,
5081085a4ea9SJian Hu 	&g12a_rom_boot,
5082085a4ea9SJian Hu 	&g12a_reset_sec,
5083085a4ea9SJian Hu 	&g12a_sec_ahb_apb3,
5084085a4ea9SJian Hu 	&g12a_vpu_0_sel,
5085085a4ea9SJian Hu 	&g12a_vpu_0_div,
5086085a4ea9SJian Hu 	&g12a_vpu_0,
5087085a4ea9SJian Hu 	&g12a_vpu_1_sel,
5088085a4ea9SJian Hu 	&g12a_vpu_1_div,
5089085a4ea9SJian Hu 	&g12a_vpu_1,
5090085a4ea9SJian Hu 	&g12a_vpu,
5091085a4ea9SJian Hu 	&g12a_vapb_0_sel,
5092085a4ea9SJian Hu 	&g12a_vapb_0_div,
5093085a4ea9SJian Hu 	&g12a_vapb_0,
5094085a4ea9SJian Hu 	&g12a_vapb_1_sel,
5095085a4ea9SJian Hu 	&g12a_vapb_1_div,
5096085a4ea9SJian Hu 	&g12a_vapb_1,
5097085a4ea9SJian Hu 	&g12a_vapb_sel,
5098085a4ea9SJian Hu 	&g12a_vapb,
5099085a4ea9SJian Hu 	&g12a_hdmi_pll_dco,
5100085a4ea9SJian Hu 	&g12a_hdmi_pll_od,
5101085a4ea9SJian Hu 	&g12a_hdmi_pll_od2,
5102085a4ea9SJian Hu 	&g12a_hdmi_pll,
5103085a4ea9SJian Hu 	&g12a_vid_pll_div,
5104085a4ea9SJian Hu 	&g12a_vid_pll_sel,
5105085a4ea9SJian Hu 	&g12a_vid_pll,
5106085a4ea9SJian Hu 	&g12a_vclk_sel,
5107085a4ea9SJian Hu 	&g12a_vclk2_sel,
5108085a4ea9SJian Hu 	&g12a_vclk_input,
5109085a4ea9SJian Hu 	&g12a_vclk2_input,
5110085a4ea9SJian Hu 	&g12a_vclk_div,
5111085a4ea9SJian Hu 	&g12a_vclk2_div,
5112085a4ea9SJian Hu 	&g12a_vclk,
5113085a4ea9SJian Hu 	&g12a_vclk2,
5114085a4ea9SJian Hu 	&g12a_vclk_div1,
5115085a4ea9SJian Hu 	&g12a_vclk_div2_en,
5116085a4ea9SJian Hu 	&g12a_vclk_div4_en,
5117085a4ea9SJian Hu 	&g12a_vclk_div6_en,
5118085a4ea9SJian Hu 	&g12a_vclk_div12_en,
5119085a4ea9SJian Hu 	&g12a_vclk2_div1,
5120085a4ea9SJian Hu 	&g12a_vclk2_div2_en,
5121085a4ea9SJian Hu 	&g12a_vclk2_div4_en,
5122085a4ea9SJian Hu 	&g12a_vclk2_div6_en,
5123085a4ea9SJian Hu 	&g12a_vclk2_div12_en,
5124085a4ea9SJian Hu 	&g12a_cts_enci_sel,
5125085a4ea9SJian Hu 	&g12a_cts_encp_sel,
5126085a4ea9SJian Hu 	&g12a_cts_vdac_sel,
5127085a4ea9SJian Hu 	&g12a_hdmi_tx_sel,
5128085a4ea9SJian Hu 	&g12a_cts_enci,
5129085a4ea9SJian Hu 	&g12a_cts_encp,
5130085a4ea9SJian Hu 	&g12a_cts_vdac,
5131085a4ea9SJian Hu 	&g12a_hdmi_tx,
5132085a4ea9SJian Hu 	&g12a_hdmi_sel,
5133085a4ea9SJian Hu 	&g12a_hdmi_div,
5134085a4ea9SJian Hu 	&g12a_hdmi,
5135085a4ea9SJian Hu 	&g12a_mali_0_sel,
5136085a4ea9SJian Hu 	&g12a_mali_0_div,
5137085a4ea9SJian Hu 	&g12a_mali_0,
5138085a4ea9SJian Hu 	&g12a_mali_1_sel,
5139085a4ea9SJian Hu 	&g12a_mali_1_div,
5140085a4ea9SJian Hu 	&g12a_mali_1,
5141085a4ea9SJian Hu 	&g12a_mali,
5142085a4ea9SJian Hu 	&g12a_mpll_50m,
5143370294e2SNeil Armstrong 	&g12a_sys_pll_div16_en,
5144370294e2SNeil Armstrong 	&g12a_cpu_clk_premux0,
5145370294e2SNeil Armstrong 	&g12a_cpu_clk_mux0_div,
5146370294e2SNeil Armstrong 	&g12a_cpu_clk_postmux0,
5147370294e2SNeil Armstrong 	&g12a_cpu_clk_premux1,
5148370294e2SNeil Armstrong 	&g12a_cpu_clk_mux1_div,
5149370294e2SNeil Armstrong 	&g12a_cpu_clk_postmux1,
5150370294e2SNeil Armstrong 	&g12a_cpu_clk_dyn,
5151370294e2SNeil Armstrong 	&g12a_cpu_clk,
5152370294e2SNeil Armstrong 	&g12a_cpu_clk_div16_en,
5153370294e2SNeil Armstrong 	&g12a_cpu_clk_apb_div,
5154370294e2SNeil Armstrong 	&g12a_cpu_clk_apb,
5155370294e2SNeil Armstrong 	&g12a_cpu_clk_atb_div,
5156370294e2SNeil Armstrong 	&g12a_cpu_clk_atb,
5157370294e2SNeil Armstrong 	&g12a_cpu_clk_axi_div,
5158370294e2SNeil Armstrong 	&g12a_cpu_clk_axi,
5159370294e2SNeil Armstrong 	&g12a_cpu_clk_trace_div,
5160370294e2SNeil Armstrong 	&g12a_cpu_clk_trace,
516134775209SNeil Armstrong 	&g12a_pcie_pll_od,
516234775209SNeil Armstrong 	&g12a_pcie_pll_dco,
51634b0f7305SMaxime Jourdan 	&g12a_vdec_1_sel,
51644b0f7305SMaxime Jourdan 	&g12a_vdec_1_div,
51654b0f7305SMaxime Jourdan 	&g12a_vdec_1,
51664b0f7305SMaxime Jourdan 	&g12a_vdec_hevc_sel,
51674b0f7305SMaxime Jourdan 	&g12a_vdec_hevc_div,
51684b0f7305SMaxime Jourdan 	&g12a_vdec_hevc,
51694b0f7305SMaxime Jourdan 	&g12a_vdec_hevcf_sel,
51704b0f7305SMaxime Jourdan 	&g12a_vdec_hevcf_div,
51714b0f7305SMaxime Jourdan 	&g12a_vdec_hevcf,
5172ad517d52SGuillaume La Roque 	&g12a_ts_div,
5173ad517d52SGuillaume La Roque 	&g12a_ts,
5174d43628e9SNeil Armstrong 	&g12b_cpu_clk,
5175d43628e9SNeil Armstrong 	&g12b_sys1_pll_dco,
5176d43628e9SNeil Armstrong 	&g12b_sys1_pll,
5177d43628e9SNeil Armstrong 	&g12b_sys1_pll_div16_en,
5178d43628e9SNeil Armstrong 	&g12b_cpub_clk_premux0,
5179d43628e9SNeil Armstrong 	&g12b_cpub_clk_mux0_div,
5180d43628e9SNeil Armstrong 	&g12b_cpub_clk_postmux0,
5181d43628e9SNeil Armstrong 	&g12b_cpub_clk_premux1,
5182d43628e9SNeil Armstrong 	&g12b_cpub_clk_mux1_div,
5183d43628e9SNeil Armstrong 	&g12b_cpub_clk_postmux1,
5184d43628e9SNeil Armstrong 	&g12b_cpub_clk_dyn,
5185d43628e9SNeil Armstrong 	&g12b_cpub_clk,
5186d43628e9SNeil Armstrong 	&g12b_cpub_clk_div16_en,
5187d43628e9SNeil Armstrong 	&g12b_cpub_clk_apb_sel,
5188d43628e9SNeil Armstrong 	&g12b_cpub_clk_apb,
5189d43628e9SNeil Armstrong 	&g12b_cpub_clk_atb_sel,
5190d43628e9SNeil Armstrong 	&g12b_cpub_clk_atb,
5191d43628e9SNeil Armstrong 	&g12b_cpub_clk_axi_sel,
5192d43628e9SNeil Armstrong 	&g12b_cpub_clk_axi,
5193d43628e9SNeil Armstrong 	&g12b_cpub_clk_trace_sel,
5194d43628e9SNeil Armstrong 	&g12b_cpub_clk_trace,
51953dd02b73SNeil Armstrong 	&sm1_gp1_pll_dco,
51963dd02b73SNeil Armstrong 	&sm1_gp1_pll,
51972edccd31SNeil Armstrong 	&sm1_dsu_clk_premux0,
51982edccd31SNeil Armstrong 	&sm1_dsu_clk_premux1,
51992edccd31SNeil Armstrong 	&sm1_dsu_clk_mux0_div,
52002edccd31SNeil Armstrong 	&sm1_dsu_clk_postmux0,
52012edccd31SNeil Armstrong 	&sm1_dsu_clk_mux1_div,
52022edccd31SNeil Armstrong 	&sm1_dsu_clk_postmux1,
52032edccd31SNeil Armstrong 	&sm1_dsu_clk_dyn,
52042edccd31SNeil Armstrong 	&sm1_dsu_final_clk,
52052edccd31SNeil Armstrong 	&sm1_dsu_clk,
5206da3ceae4SNeil Armstrong 	&sm1_cpu1_clk,
5207da3ceae4SNeil Armstrong 	&sm1_cpu2_clk,
5208da3ceae4SNeil Armstrong 	&sm1_cpu3_clk,
5209a18c8e0bSNeil Armstrong 	&g12a_spicc0_sclk_sel,
5210a18c8e0bSNeil Armstrong 	&g12a_spicc0_sclk_div,
5211a18c8e0bSNeil Armstrong 	&g12a_spicc0_sclk,
5212a18c8e0bSNeil Armstrong 	&g12a_spicc1_sclk_sel,
5213a18c8e0bSNeil Armstrong 	&g12a_spicc1_sclk_div,
5214a18c8e0bSNeil Armstrong 	&g12a_spicc1_sclk,
52152f1efa53SDmitry Shmidt 	&sm1_nna_axi_clk_sel,
52162f1efa53SDmitry Shmidt 	&sm1_nna_axi_clk_div,
52172f1efa53SDmitry Shmidt 	&sm1_nna_axi_clk,
52182f1efa53SDmitry Shmidt 	&sm1_nna_core_clk_sel,
52192f1efa53SDmitry Shmidt 	&sm1_nna_core_clk_div,
52202f1efa53SDmitry Shmidt 	&sm1_nna_core_clk,
522188b9ae60SNeil Armstrong 	&g12a_mipi_dsi_pxclk_sel,
522288b9ae60SNeil Armstrong 	&g12a_mipi_dsi_pxclk_div,
522388b9ae60SNeil Armstrong 	&g12a_mipi_dsi_pxclk,
5224085a4ea9SJian Hu };
5225085a4ea9SJian Hu 
5226a9f7b199SJerome Brunet static const struct reg_sequence g12a_init_regs[] = {
5227a9f7b199SJerome Brunet 	{ .reg = HHI_MPLL_CNTL0,	.def = 0x00000543 },
5228a9f7b199SJerome Brunet };
5229a9f7b199SJerome Brunet 
52308e677e7fSJerome Brunet #define DVFS_CON_ID "dvfs"
52318e677e7fSJerome Brunet 
meson_g12a_dvfs_setup_common(struct device * dev,struct clk_hw ** hws)52328e677e7fSJerome Brunet static int meson_g12a_dvfs_setup_common(struct device *dev,
5233ffae8475SNeil Armstrong 					struct clk_hw **hws)
5234ffae8475SNeil Armstrong {
5235ffae8475SNeil Armstrong 	struct clk *notifier_clk;
5236ffae8475SNeil Armstrong 	struct clk_hw *xtal;
5237ffae8475SNeil Armstrong 	int ret;
5238ffae8475SNeil Armstrong 
5239ffae8475SNeil Armstrong 	xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
5240ffae8475SNeil Armstrong 
5241ffae8475SNeil Armstrong 	/* Setup clock notifier for cpu_clk_postmux0 */
5242ffae8475SNeil Armstrong 	g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
52438e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw,
52448e677e7fSJerome Brunet 					   DVFS_CON_ID);
5245e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5246ffae8475SNeil Armstrong 					 &g12a_cpu_clk_postmux0_nb_data.nb);
5247ffae8475SNeil Armstrong 	if (ret) {
52488e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n");
5249ffae8475SNeil Armstrong 		return ret;
5250ffae8475SNeil Armstrong 	}
5251ffae8475SNeil Armstrong 
5252ffae8475SNeil Armstrong 	/* Setup clock notifier for cpu_clk_dyn mux */
52538e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw,
52548e677e7fSJerome Brunet 					   DVFS_CON_ID);
5255e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5256e6fb7aeeSJerome Brunet 					 &g12a_cpu_clk_mux_nb);
5257ffae8475SNeil Armstrong 	if (ret) {
52588e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpu_clk_dyn notifier\n");
5259ffae8475SNeil Armstrong 		return ret;
5260ffae8475SNeil Armstrong 	}
5261ffae8475SNeil Armstrong 
5262ffae8475SNeil Armstrong 	return 0;
5263ffae8475SNeil Armstrong }
5264ffae8475SNeil Armstrong 
meson_g12b_dvfs_setup(struct platform_device * pdev)5265ffae8475SNeil Armstrong static int meson_g12b_dvfs_setup(struct platform_device *pdev)
5266ffae8475SNeil Armstrong {
5267141fbc27SNeil Armstrong 	struct clk_hw **hws = g12b_hw_clks;
52688e677e7fSJerome Brunet 	struct device *dev = &pdev->dev;
5269ffae8475SNeil Armstrong 	struct clk *notifier_clk;
5270ffae8475SNeil Armstrong 	struct clk_hw *xtal;
5271ffae8475SNeil Armstrong 	int ret;
5272ffae8475SNeil Armstrong 
52738e677e7fSJerome Brunet 	ret = meson_g12a_dvfs_setup_common(dev, hws);
5274ffae8475SNeil Armstrong 	if (ret)
5275ffae8475SNeil Armstrong 		return ret;
5276ffae8475SNeil Armstrong 
5277ffae8475SNeil Armstrong 	xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
5278ffae8475SNeil Armstrong 
5279ffae8475SNeil Armstrong 	/* Setup clock notifier for cpu_clk mux */
52808e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw,
52818e677e7fSJerome Brunet 					   DVFS_CON_ID);
5282e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5283e6fb7aeeSJerome Brunet 					 &g12a_cpu_clk_mux_nb);
5284ffae8475SNeil Armstrong 	if (ret) {
52858e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpu_clk notifier\n");
5286ffae8475SNeil Armstrong 		return ret;
5287ffae8475SNeil Armstrong 	}
5288ffae8475SNeil Armstrong 
5289ffae8475SNeil Armstrong 	/* Setup clock notifier for sys1_pll */
52908e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw,
52918e677e7fSJerome Brunet 					   DVFS_CON_ID);
5292e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5293ffae8475SNeil Armstrong 					 &g12b_cpu_clk_sys1_pll_nb_data.nb);
5294ffae8475SNeil Armstrong 	if (ret) {
52958e677e7fSJerome Brunet 		dev_err(dev, "failed to register the sys1_pll notifier\n");
5296ffae8475SNeil Armstrong 		return ret;
5297ffae8475SNeil Armstrong 	}
5298ffae8475SNeil Armstrong 
5299ffae8475SNeil Armstrong 	/* Add notifiers for the second CPU cluster */
5300ffae8475SNeil Armstrong 
5301ffae8475SNeil Armstrong 	/* Setup clock notifier for cpub_clk_postmux0 */
5302ffae8475SNeil Armstrong 	g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
53038e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw,
53048e677e7fSJerome Brunet 					   DVFS_CON_ID);
5305e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5306ffae8475SNeil Armstrong 					 &g12b_cpub_clk_postmux0_nb_data.nb);
5307ffae8475SNeil Armstrong 	if (ret) {
53088e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n");
5309ffae8475SNeil Armstrong 		return ret;
5310ffae8475SNeil Armstrong 	}
5311ffae8475SNeil Armstrong 
5312ffae8475SNeil Armstrong 	/* Setup clock notifier for cpub_clk_dyn mux */
53138e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs");
5314e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5315e6fb7aeeSJerome Brunet 					 &g12a_cpu_clk_mux_nb);
5316ffae8475SNeil Armstrong 	if (ret) {
53178e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpub_clk_dyn notifier\n");
5318ffae8475SNeil Armstrong 		return ret;
5319ffae8475SNeil Armstrong 	}
5320ffae8475SNeil Armstrong 
5321ffae8475SNeil Armstrong 	/* Setup clock notifier for cpub_clk mux */
53228e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID);
5323e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5324e6fb7aeeSJerome Brunet 					 &g12a_cpu_clk_mux_nb);
5325ffae8475SNeil Armstrong 	if (ret) {
53268e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpub_clk notifier\n");
5327ffae8475SNeil Armstrong 		return ret;
5328ffae8475SNeil Armstrong 	}
5329ffae8475SNeil Armstrong 
5330ffae8475SNeil Armstrong 	/* Setup clock notifier for sys_pll */
53318e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
5332e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5333ffae8475SNeil Armstrong 					 &g12b_cpub_clk_sys_pll_nb_data.nb);
5334ffae8475SNeil Armstrong 	if (ret) {
53358e677e7fSJerome Brunet 		dev_err(dev, "failed to register the sys_pll notifier\n");
5336ffae8475SNeil Armstrong 		return ret;
5337ffae8475SNeil Armstrong 	}
5338ffae8475SNeil Armstrong 
5339ffae8475SNeil Armstrong 	return 0;
5340ffae8475SNeil Armstrong }
5341ffae8475SNeil Armstrong 
meson_g12a_dvfs_setup(struct platform_device * pdev)5342ffae8475SNeil Armstrong static int meson_g12a_dvfs_setup(struct platform_device *pdev)
5343ffae8475SNeil Armstrong {
5344141fbc27SNeil Armstrong 	struct clk_hw **hws = g12a_hw_clks;
53458e677e7fSJerome Brunet 	struct device *dev = &pdev->dev;
5346ffae8475SNeil Armstrong 	struct clk *notifier_clk;
5347ffae8475SNeil Armstrong 	int ret;
5348ffae8475SNeil Armstrong 
53498e677e7fSJerome Brunet 	ret = meson_g12a_dvfs_setup_common(dev, hws);
5350ffae8475SNeil Armstrong 	if (ret)
5351ffae8475SNeil Armstrong 		return ret;
5352ffae8475SNeil Armstrong 
5353ffae8475SNeil Armstrong 	/* Setup clock notifier for cpu_clk mux */
53548e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID);
5355e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5356e6fb7aeeSJerome Brunet 				    &g12a_cpu_clk_mux_nb);
5357ffae8475SNeil Armstrong 	if (ret) {
53588e677e7fSJerome Brunet 		dev_err(dev, "failed to register the cpu_clk notifier\n");
5359ffae8475SNeil Armstrong 		return ret;
5360ffae8475SNeil Armstrong 	}
5361ffae8475SNeil Armstrong 
5362ffae8475SNeil Armstrong 	/* Setup clock notifier for sys_pll */
53638e677e7fSJerome Brunet 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
5364e6fb7aeeSJerome Brunet 	ret = devm_clk_notifier_register(dev, notifier_clk,
5365e6fb7aeeSJerome Brunet 					 &g12a_sys_pll_nb_data.nb);
5366ffae8475SNeil Armstrong 	if (ret) {
53678e677e7fSJerome Brunet 		dev_err(dev, "failed to register the sys_pll notifier\n");
5368ffae8475SNeil Armstrong 		return ret;
5369ffae8475SNeil Armstrong 	}
5370ffae8475SNeil Armstrong 
5371ffae8475SNeil Armstrong 	return 0;
5372ffae8475SNeil Armstrong }
5373ffae8475SNeil Armstrong 
5374ffae8475SNeil Armstrong struct meson_g12a_data {
5375ffae8475SNeil Armstrong 	const struct meson_eeclkc_data eeclkc_data;
5376ffae8475SNeil Armstrong 	int (*dvfs_setup)(struct platform_device *pdev);
5377ffae8475SNeil Armstrong };
5378ffae8475SNeil Armstrong 
meson_g12a_probe(struct platform_device * pdev)5379ffae8475SNeil Armstrong static int meson_g12a_probe(struct platform_device *pdev)
5380ffae8475SNeil Armstrong {
5381ffae8475SNeil Armstrong 	const struct meson_eeclkc_data *eeclkc_data;
5382ffae8475SNeil Armstrong 	const struct meson_g12a_data *g12a_data;
5383ffae8475SNeil Armstrong 	int ret;
5384ffae8475SNeil Armstrong 
5385ffae8475SNeil Armstrong 	eeclkc_data = of_device_get_match_data(&pdev->dev);
5386ffae8475SNeil Armstrong 	if (!eeclkc_data)
5387ffae8475SNeil Armstrong 		return -EINVAL;
5388ffae8475SNeil Armstrong 
5389ffae8475SNeil Armstrong 	ret = meson_eeclkc_probe(pdev);
5390ffae8475SNeil Armstrong 	if (ret)
5391ffae8475SNeil Armstrong 		return ret;
5392ffae8475SNeil Armstrong 
5393ffae8475SNeil Armstrong 	g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
5394ffae8475SNeil Armstrong 				 eeclkc_data);
5395ffae8475SNeil Armstrong 
5396ffae8475SNeil Armstrong 	if (g12a_data->dvfs_setup)
5397ffae8475SNeil Armstrong 		return g12a_data->dvfs_setup(pdev);
5398ffae8475SNeil Armstrong 
5399ffae8475SNeil Armstrong 	return 0;
5400ffae8475SNeil Armstrong }
5401ffae8475SNeil Armstrong 
5402ffae8475SNeil Armstrong static const struct meson_g12a_data g12a_clkc_data = {
5403ffae8475SNeil Armstrong 	.eeclkc_data = {
54046682bd4dSJerome Brunet 		.regmap_clks = g12a_clk_regmaps,
54056682bd4dSJerome Brunet 		.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5406141fbc27SNeil Armstrong 		.hw_clks = {
5407141fbc27SNeil Armstrong 			.hws = g12a_hw_clks,
5408141fbc27SNeil Armstrong 			.num = ARRAY_SIZE(g12a_hw_clks),
5409141fbc27SNeil Armstrong 		},
5410a9f7b199SJerome Brunet 		.init_regs = g12a_init_regs,
5411a9f7b199SJerome Brunet 		.init_count = ARRAY_SIZE(g12a_init_regs),
5412ffae8475SNeil Armstrong 	},
5413ffae8475SNeil Armstrong 	.dvfs_setup = meson_g12a_dvfs_setup,
54146682bd4dSJerome Brunet };
54156682bd4dSJerome Brunet 
5416ffae8475SNeil Armstrong static const struct meson_g12a_data g12b_clkc_data = {
5417ffae8475SNeil Armstrong 	.eeclkc_data = {
5418d43628e9SNeil Armstrong 		.regmap_clks = g12a_clk_regmaps,
5419d43628e9SNeil Armstrong 		.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5420141fbc27SNeil Armstrong 		.hw_clks = {
5421141fbc27SNeil Armstrong 			.hws = g12b_hw_clks,
5422141fbc27SNeil Armstrong 			.num = ARRAY_SIZE(g12b_hw_clks),
5423141fbc27SNeil Armstrong 		},
5424ffae8475SNeil Armstrong 	},
5425ffae8475SNeil Armstrong 	.dvfs_setup = meson_g12b_dvfs_setup,
5426d43628e9SNeil Armstrong };
5427d43628e9SNeil Armstrong 
54283dd02b73SNeil Armstrong static const struct meson_g12a_data sm1_clkc_data = {
54293dd02b73SNeil Armstrong 	.eeclkc_data = {
54303dd02b73SNeil Armstrong 		.regmap_clks = g12a_clk_regmaps,
54313dd02b73SNeil Armstrong 		.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
5432141fbc27SNeil Armstrong 		.hw_clks = {
5433141fbc27SNeil Armstrong 			.hws = sm1_hw_clks,
5434141fbc27SNeil Armstrong 			.num = ARRAY_SIZE(sm1_hw_clks),
5435141fbc27SNeil Armstrong 		},
54363dd02b73SNeil Armstrong 	},
54373dd02b73SNeil Armstrong 	.dvfs_setup = meson_g12a_dvfs_setup,
54383dd02b73SNeil Armstrong };
54393dd02b73SNeil Armstrong 
5440085a4ea9SJian Hu static const struct of_device_id clkc_match_table[] = {
5441ffae8475SNeil Armstrong 	{
5442ffae8475SNeil Armstrong 		.compatible = "amlogic,g12a-clkc",
5443ffae8475SNeil Armstrong 		.data = &g12a_clkc_data.eeclkc_data
5444ffae8475SNeil Armstrong 	},
5445ffae8475SNeil Armstrong 	{
5446ffae8475SNeil Armstrong 		.compatible = "amlogic,g12b-clkc",
5447ffae8475SNeil Armstrong 		.data = &g12b_clkc_data.eeclkc_data
5448ffae8475SNeil Armstrong 	},
54493dd02b73SNeil Armstrong 	{
54503dd02b73SNeil Armstrong 		.compatible = "amlogic,sm1-clkc",
54513dd02b73SNeil Armstrong 		.data = &sm1_clkc_data.eeclkc_data
54523dd02b73SNeil Armstrong 	},
5453085a4ea9SJian Hu 	{}
5454085a4ea9SJian Hu };
545520425f63SKevin Hilman MODULE_DEVICE_TABLE(of, clkc_match_table);
5456085a4ea9SJian Hu 
5457085a4ea9SJian Hu static struct platform_driver g12a_driver = {
5458ffae8475SNeil Armstrong 	.probe		= meson_g12a_probe,
5459085a4ea9SJian Hu 	.driver		= {
5460085a4ea9SJian Hu 		.name	= "g12a-clkc",
5461085a4ea9SJian Hu 		.of_match_table = clkc_match_table,
5462085a4ea9SJian Hu 	},
5463085a4ea9SJian Hu };
5464085a4ea9SJian Hu 
546520425f63SKevin Hilman module_platform_driver(g12a_driver);
546620425f63SKevin Hilman MODULE_LICENSE("GPL v2");
5467