xref: /linux/drivers/clk/meson/g12a.c (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Amlogic Meson-G12A Clock Controller Driver
4  *
5  * Copyright (c) 2016 Baylibre SAS.
6  * Author: Michael Turquette <mturquette@baylibre.com>
7  *
8  * Copyright (c) 2018 Amlogic, inc.
9  * Author: Qiufang Dai <qiufang.dai@amlogic.com>
10  * Author: Jian Hu <jian.hu@amlogic.com>
11  */
12 
13 #include <linux/clk-provider.h>
14 #include <linux/init.h>
15 #include <linux/of.h>
16 #include <linux/platform_device.h>
17 #include <linux/clk.h>
18 #include <linux/module.h>
19 
20 #include "clk-mpll.h"
21 #include "clk-pll.h"
22 #include "clk-regmap.h"
23 #include "clk-cpu-dyndiv.h"
24 #include "vid-pll-div.h"
25 #include "vclk.h"
26 #include "meson-eeclk.h"
27 
28 #include <dt-bindings/clock/g12a-clkc.h>
29 
30 #define HHI_MIPI_CNTL0			0x000
31 #define HHI_MIPI_CNTL1			0x004
32 #define HHI_MIPI_CNTL2			0x008
33 #define HHI_MIPI_STS			0x00c
34 #define HHI_GP0_PLL_CNTL0		0x040
35 #define HHI_GP0_PLL_CNTL1		0x044
36 #define HHI_GP0_PLL_CNTL2		0x048
37 #define HHI_GP0_PLL_CNTL3		0x04c
38 #define HHI_GP0_PLL_CNTL4		0x050
39 #define HHI_GP0_PLL_CNTL5		0x054
40 #define HHI_GP0_PLL_CNTL6		0x058
41 #define HHI_GP0_PLL_STS			0x05c
42 #define HHI_GP1_PLL_CNTL0		0x060
43 #define HHI_GP1_PLL_CNTL1		0x064
44 #define HHI_GP1_PLL_CNTL2		0x068
45 #define HHI_GP1_PLL_CNTL3		0x06c
46 #define HHI_GP1_PLL_CNTL4		0x070
47 #define HHI_GP1_PLL_CNTL5		0x074
48 #define HHI_GP1_PLL_CNTL6		0x078
49 #define HHI_GP1_PLL_STS			0x07c
50 #define HHI_PCIE_PLL_CNTL0		0x098
51 #define HHI_PCIE_PLL_CNTL1		0x09c
52 #define HHI_PCIE_PLL_CNTL2		0x0a0
53 #define HHI_PCIE_PLL_CNTL3		0x0a4
54 #define HHI_PCIE_PLL_CNTL4		0x0a8
55 #define HHI_PCIE_PLL_CNTL5		0x0ac
56 #define HHI_PCIE_PLL_STS		0x0b8
57 #define HHI_HIFI_PLL_CNTL0		0x0d8
58 #define HHI_HIFI_PLL_CNTL1		0x0dc
59 #define HHI_HIFI_PLL_CNTL2		0x0e0
60 #define HHI_HIFI_PLL_CNTL3		0x0e4
61 #define HHI_HIFI_PLL_CNTL4		0x0e8
62 #define HHI_HIFI_PLL_CNTL5		0x0ec
63 #define HHI_HIFI_PLL_CNTL6		0x0f0
64 #define HHI_VIID_CLK_DIV		0x128
65 #define HHI_VIID_CLK_CNTL		0x12c
66 #define HHI_GCLK_MPEG0			0x140
67 #define HHI_GCLK_MPEG1			0x144
68 #define HHI_GCLK_MPEG2			0x148
69 #define HHI_GCLK_OTHER			0x150
70 #define HHI_GCLK_OTHER2			0x154
71 #define HHI_SYS_CPU_CLK_CNTL1		0x15c
72 #define HHI_VID_CLK_DIV			0x164
73 #define HHI_MPEG_CLK_CNTL		0x174
74 #define HHI_AUD_CLK_CNTL		0x178
75 #define HHI_VID_CLK_CNTL		0x17c
76 #define HHI_TS_CLK_CNTL			0x190
77 #define HHI_VID_CLK_CNTL2		0x194
78 #define HHI_SYS_CPU_CLK_CNTL0		0x19c
79 #define HHI_VID_PLL_CLK_DIV		0x1a0
80 #define HHI_MALI_CLK_CNTL		0x1b0
81 #define HHI_VPU_CLKC_CNTL		0x1b4
82 #define HHI_VPU_CLK_CNTL		0x1bc
83 #define HHI_ISP_CLK_CNTL		0x1c0
84 #define HHI_NNA_CLK_CNTL		0x1c8
85 #define HHI_HDMI_CLK_CNTL		0x1cc
86 #define HHI_VDEC_CLK_CNTL		0x1e0
87 #define HHI_VDEC2_CLK_CNTL		0x1e4
88 #define HHI_VDEC3_CLK_CNTL		0x1e8
89 #define HHI_VDEC4_CLK_CNTL		0x1ec
90 #define HHI_HDCP22_CLK_CNTL		0x1f0
91 #define HHI_VAPBCLK_CNTL		0x1f4
92 #define HHI_SYS_CPUB_CLK_CNTL1		0x200
93 #define HHI_SYS_CPUB_CLK_CNTL		0x208
94 #define HHI_VPU_CLKB_CNTL		0x20c
95 #define HHI_SYS_CPU_CLK_CNTL2		0x210
96 #define HHI_SYS_CPU_CLK_CNTL3		0x214
97 #define HHI_SYS_CPU_CLK_CNTL4		0x218
98 #define HHI_SYS_CPU_CLK_CNTL5		0x21c
99 #define HHI_SYS_CPU_CLK_CNTL6		0x220
100 #define HHI_GEN_CLK_CNTL		0x228
101 #define HHI_VDIN_MEAS_CLK_CNTL		0x250
102 #define HHI_MIPIDSI_PHY_CLK_CNTL	0x254
103 #define HHI_NAND_CLK_CNTL		0x25c
104 #define HHI_SD_EMMC_CLK_CNTL		0x264
105 #define HHI_MPLL_CNTL0			0x278
106 #define HHI_MPLL_CNTL1			0x27c
107 #define HHI_MPLL_CNTL2			0x280
108 #define HHI_MPLL_CNTL3			0x284
109 #define HHI_MPLL_CNTL4			0x288
110 #define HHI_MPLL_CNTL5			0x28c
111 #define HHI_MPLL_CNTL6			0x290
112 #define HHI_MPLL_CNTL7			0x294
113 #define HHI_MPLL_CNTL8			0x298
114 #define HHI_FIX_PLL_CNTL0		0x2a0
115 #define HHI_FIX_PLL_CNTL1		0x2a4
116 #define HHI_FIX_PLL_CNTL3		0x2ac
117 #define HHI_SYS_PLL_CNTL0		0x2f4
118 #define HHI_SYS_PLL_CNTL1		0x2f8
119 #define HHI_SYS_PLL_CNTL2		0x2fc
120 #define HHI_SYS_PLL_CNTL3		0x300
121 #define HHI_SYS_PLL_CNTL4		0x304
122 #define HHI_SYS_PLL_CNTL5		0x308
123 #define HHI_SYS_PLL_CNTL6		0x30c
124 #define HHI_HDMI_PLL_CNTL0		0x320
125 #define HHI_HDMI_PLL_CNTL1		0x324
126 #define HHI_HDMI_PLL_CNTL2		0x328
127 #define HHI_HDMI_PLL_CNTL3		0x32c
128 #define HHI_HDMI_PLL_CNTL4		0x330
129 #define HHI_HDMI_PLL_CNTL5		0x334
130 #define HHI_HDMI_PLL_CNTL6		0x338
131 #define HHI_SPICC_CLK_CNTL		0x3dc
132 #define HHI_SYS1_PLL_CNTL0		0x380
133 #define HHI_SYS1_PLL_CNTL1		0x384
134 #define HHI_SYS1_PLL_CNTL2		0x388
135 #define HHI_SYS1_PLL_CNTL3		0x38c
136 #define HHI_SYS1_PLL_CNTL4		0x390
137 #define HHI_SYS1_PLL_CNTL5		0x394
138 #define HHI_SYS1_PLL_CNTL6		0x398
139 
140 static struct clk_regmap g12a_fixed_pll_dco = {
141 	.data = &(struct meson_clk_pll_data){
142 		.en = {
143 			.reg_off = HHI_FIX_PLL_CNTL0,
144 			.shift   = 28,
145 			.width   = 1,
146 		},
147 		.m = {
148 			.reg_off = HHI_FIX_PLL_CNTL0,
149 			.shift   = 0,
150 			.width   = 8,
151 		},
152 		.n = {
153 			.reg_off = HHI_FIX_PLL_CNTL0,
154 			.shift   = 10,
155 			.width   = 5,
156 		},
157 		.frac = {
158 			.reg_off = HHI_FIX_PLL_CNTL1,
159 			.shift   = 0,
160 			.width   = 17,
161 		},
162 		.l = {
163 			.reg_off = HHI_FIX_PLL_CNTL0,
164 			.shift   = 31,
165 			.width   = 1,
166 		},
167 		.rst = {
168 			.reg_off = HHI_FIX_PLL_CNTL0,
169 			.shift   = 29,
170 			.width   = 1,
171 		},
172 	},
173 	.hw.init = &(struct clk_init_data){
174 		.name = "fixed_pll_dco",
175 		.ops = &meson_clk_pll_ro_ops,
176 		.parent_data = &(const struct clk_parent_data) {
177 			.fw_name = "xtal",
178 		},
179 		.num_parents = 1,
180 	},
181 };
182 
183 static struct clk_regmap g12a_fixed_pll = {
184 	.data = &(struct clk_regmap_div_data){
185 		.offset = HHI_FIX_PLL_CNTL0,
186 		.shift = 16,
187 		.width = 2,
188 		.flags = CLK_DIVIDER_POWER_OF_TWO,
189 	},
190 	.hw.init = &(struct clk_init_data){
191 		.name = "fixed_pll",
192 		.ops = &clk_regmap_divider_ro_ops,
193 		.parent_hws = (const struct clk_hw *[]) {
194 			&g12a_fixed_pll_dco.hw
195 		},
196 		.num_parents = 1,
197 		/*
198 		 * This clock won't ever change at runtime so
199 		 * CLK_SET_RATE_PARENT is not required
200 		 */
201 	},
202 };
203 
204 static const struct pll_mult_range g12a_sys_pll_mult_range = {
205 	.min = 128,
206 	.max = 250,
207 };
208 
209 static struct clk_regmap g12a_sys_pll_dco = {
210 	.data = &(struct meson_clk_pll_data){
211 		.en = {
212 			.reg_off = HHI_SYS_PLL_CNTL0,
213 			.shift   = 28,
214 			.width   = 1,
215 		},
216 		.m = {
217 			.reg_off = HHI_SYS_PLL_CNTL0,
218 			.shift   = 0,
219 			.width   = 8,
220 		},
221 		.n = {
222 			.reg_off = HHI_SYS_PLL_CNTL0,
223 			.shift   = 10,
224 			.width   = 5,
225 		},
226 		.l = {
227 			.reg_off = HHI_SYS_PLL_CNTL0,
228 			.shift   = 31,
229 			.width   = 1,
230 		},
231 		.rst = {
232 			.reg_off = HHI_SYS_PLL_CNTL0,
233 			.shift   = 29,
234 			.width   = 1,
235 		},
236 		.range = &g12a_sys_pll_mult_range,
237 	},
238 	.hw.init = &(struct clk_init_data){
239 		.name = "sys_pll_dco",
240 		.ops = &meson_clk_pll_ops,
241 		.parent_data = &(const struct clk_parent_data) {
242 			.fw_name = "xtal",
243 		},
244 		.num_parents = 1,
245 		/* This clock feeds the CPU, avoid disabling it */
246 		.flags = CLK_IS_CRITICAL,
247 	},
248 };
249 
250 static struct clk_regmap g12a_sys_pll = {
251 	.data = &(struct clk_regmap_div_data){
252 		.offset = HHI_SYS_PLL_CNTL0,
253 		.shift = 16,
254 		.width = 3,
255 		.flags = CLK_DIVIDER_POWER_OF_TWO,
256 	},
257 	.hw.init = &(struct clk_init_data){
258 		.name = "sys_pll",
259 		.ops = &clk_regmap_divider_ops,
260 		.parent_hws = (const struct clk_hw *[]) {
261 			&g12a_sys_pll_dco.hw
262 		},
263 		.num_parents = 1,
264 		.flags = CLK_SET_RATE_PARENT,
265 	},
266 };
267 
268 static struct clk_regmap g12b_sys1_pll_dco = {
269 	.data = &(struct meson_clk_pll_data){
270 		.en = {
271 			.reg_off = HHI_SYS1_PLL_CNTL0,
272 			.shift   = 28,
273 			.width   = 1,
274 		},
275 		.m = {
276 			.reg_off = HHI_SYS1_PLL_CNTL0,
277 			.shift   = 0,
278 			.width   = 8,
279 		},
280 		.n = {
281 			.reg_off = HHI_SYS1_PLL_CNTL0,
282 			.shift   = 10,
283 			.width   = 5,
284 		},
285 		.l = {
286 			.reg_off = HHI_SYS1_PLL_CNTL0,
287 			.shift   = 31,
288 			.width   = 1,
289 		},
290 		.rst = {
291 			.reg_off = HHI_SYS1_PLL_CNTL0,
292 			.shift   = 29,
293 			.width   = 1,
294 		},
295 		.range = &g12a_sys_pll_mult_range,
296 	},
297 	.hw.init = &(struct clk_init_data){
298 		.name = "sys1_pll_dco",
299 		.ops = &meson_clk_pll_ops,
300 		.parent_data = &(const struct clk_parent_data) {
301 			.fw_name = "xtal",
302 		},
303 		.num_parents = 1,
304 		/* This clock feeds the CPU, avoid disabling it */
305 		.flags = CLK_IS_CRITICAL,
306 	},
307 };
308 
309 static struct clk_regmap g12b_sys1_pll = {
310 	.data = &(struct clk_regmap_div_data){
311 		.offset = HHI_SYS1_PLL_CNTL0,
312 		.shift = 16,
313 		.width = 3,
314 		.flags = CLK_DIVIDER_POWER_OF_TWO,
315 	},
316 	.hw.init = &(struct clk_init_data){
317 		.name = "sys1_pll",
318 		.ops = &clk_regmap_divider_ops,
319 		.parent_hws = (const struct clk_hw *[]) {
320 			&g12b_sys1_pll_dco.hw
321 		},
322 		.num_parents = 1,
323 		.flags = CLK_SET_RATE_PARENT,
324 	},
325 };
326 
327 static struct clk_regmap g12a_sys_pll_div16_en = {
328 	.data = &(struct clk_regmap_gate_data){
329 		.offset = HHI_SYS_CPU_CLK_CNTL1,
330 		.bit_idx = 24,
331 	},
332 	.hw.init = &(struct clk_init_data) {
333 		.name = "sys_pll_div16_en",
334 		.ops = &clk_regmap_gate_ro_ops,
335 		.parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
336 		.num_parents = 1,
337 		/*
338 		 * This clock is used to debug the sys_pll range
339 		 * Linux should not change it at runtime
340 		 */
341 	},
342 };
343 
344 static struct clk_regmap g12b_sys1_pll_div16_en = {
345 	.data = &(struct clk_regmap_gate_data){
346 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
347 		.bit_idx = 24,
348 	},
349 	.hw.init = &(struct clk_init_data) {
350 		.name = "sys1_pll_div16_en",
351 		.ops = &clk_regmap_gate_ro_ops,
352 		.parent_hws = (const struct clk_hw *[]) {
353 			&g12b_sys1_pll.hw
354 		},
355 		.num_parents = 1,
356 		/*
357 		 * This clock is used to debug the sys_pll range
358 		 * Linux should not change it at runtime
359 		 */
360 	},
361 };
362 
363 static struct clk_fixed_factor g12a_sys_pll_div16 = {
364 	.mult = 1,
365 	.div = 16,
366 	.hw.init = &(struct clk_init_data){
367 		.name = "sys_pll_div16",
368 		.ops = &clk_fixed_factor_ops,
369 		.parent_hws = (const struct clk_hw *[]) {
370 			&g12a_sys_pll_div16_en.hw
371 		},
372 		.num_parents = 1,
373 	},
374 };
375 
376 static struct clk_fixed_factor g12b_sys1_pll_div16 = {
377 	.mult = 1,
378 	.div = 16,
379 	.hw.init = &(struct clk_init_data){
380 		.name = "sys1_pll_div16",
381 		.ops = &clk_fixed_factor_ops,
382 		.parent_hws = (const struct clk_hw *[]) {
383 			&g12b_sys1_pll_div16_en.hw
384 		},
385 		.num_parents = 1,
386 	},
387 };
388 
389 static struct clk_fixed_factor g12a_fclk_div2_div = {
390 	.mult = 1,
391 	.div = 2,
392 	.hw.init = &(struct clk_init_data){
393 		.name = "fclk_div2_div",
394 		.ops = &clk_fixed_factor_ops,
395 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
396 		.num_parents = 1,
397 	},
398 };
399 
400 static struct clk_regmap g12a_fclk_div2 = {
401 	.data = &(struct clk_regmap_gate_data){
402 		.offset = HHI_FIX_PLL_CNTL1,
403 		.bit_idx = 24,
404 	},
405 	.hw.init = &(struct clk_init_data){
406 		.name = "fclk_div2",
407 		.ops = &clk_regmap_gate_ops,
408 		.parent_hws = (const struct clk_hw *[]) {
409 			&g12a_fclk_div2_div.hw
410 		},
411 		.num_parents = 1,
412 		/*
413 		 * Similar to fclk_div3, it seems that this clock is used by
414 		 * the resident firmware and is required by the platform to
415 		 * operate correctly.
416 		 * Until the following condition are met, we need this clock to
417 		 * be marked as critical:
418 		 * a) Mark the clock used by a firmware resource, if possible
419 		 * b) CCF has a clock hand-off mechanism to make the sure the
420 		 *    clock stays on until the proper driver comes along
421 		 */
422 		.flags = CLK_IS_CRITICAL,
423 	},
424 };
425 
426 static struct clk_fixed_factor g12a_fclk_div3_div = {
427 	.mult = 1,
428 	.div = 3,
429 	.hw.init = &(struct clk_init_data){
430 		.name = "fclk_div3_div",
431 		.ops = &clk_fixed_factor_ops,
432 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
433 		.num_parents = 1,
434 	},
435 };
436 
437 static struct clk_regmap g12a_fclk_div3 = {
438 	.data = &(struct clk_regmap_gate_data){
439 		.offset = HHI_FIX_PLL_CNTL1,
440 		.bit_idx = 20,
441 	},
442 	.hw.init = &(struct clk_init_data){
443 		.name = "fclk_div3",
444 		.ops = &clk_regmap_gate_ops,
445 		.parent_hws = (const struct clk_hw *[]) {
446 			&g12a_fclk_div3_div.hw
447 		},
448 		.num_parents = 1,
449 		/*
450 		 * This clock is used by the resident firmware and is required
451 		 * by the platform to operate correctly.
452 		 * Until the following condition are met, we need this clock to
453 		 * be marked as critical:
454 		 * a) Mark the clock used by a firmware resource, if possible
455 		 * b) CCF has a clock hand-off mechanism to make the sure the
456 		 *    clock stays on until the proper driver comes along
457 		 */
458 		.flags = CLK_IS_CRITICAL,
459 	},
460 };
461 
462 /* Datasheet names this field as "premux0" */
463 static struct clk_regmap g12a_cpu_clk_premux0 = {
464 	.data = &(struct clk_regmap_mux_data){
465 		.offset = HHI_SYS_CPU_CLK_CNTL0,
466 		.mask = 0x3,
467 		.shift = 0,
468 		.flags = CLK_MUX_ROUND_CLOSEST,
469 	},
470 	.hw.init = &(struct clk_init_data){
471 		.name = "cpu_clk_dyn0_sel",
472 		.ops = &clk_regmap_mux_ops,
473 		.parent_data = (const struct clk_parent_data []) {
474 			{ .fw_name = "xtal", },
475 			{ .hw = &g12a_fclk_div2.hw },
476 			{ .hw = &g12a_fclk_div3.hw },
477 		},
478 		.num_parents = 3,
479 		.flags = CLK_SET_RATE_PARENT,
480 	},
481 };
482 
483 /* Datasheet names this field as "premux1" */
484 static struct clk_regmap g12a_cpu_clk_premux1 = {
485 	.data = &(struct clk_regmap_mux_data){
486 		.offset = HHI_SYS_CPU_CLK_CNTL0,
487 		.mask = 0x3,
488 		.shift = 16,
489 	},
490 	.hw.init = &(struct clk_init_data){
491 		.name = "cpu_clk_dyn1_sel",
492 		.ops = &clk_regmap_mux_ops,
493 		.parent_data = (const struct clk_parent_data []) {
494 			{ .fw_name = "xtal", },
495 			{ .hw = &g12a_fclk_div2.hw },
496 			{ .hw = &g12a_fclk_div3.hw },
497 		},
498 		.num_parents = 3,
499 		/* This sub-tree is used a parking clock */
500 		.flags = CLK_SET_RATE_NO_REPARENT
501 	},
502 };
503 
504 /* Datasheet names this field as "mux0_divn_tcnt" */
505 static struct clk_regmap g12a_cpu_clk_mux0_div = {
506 	.data = &(struct meson_clk_cpu_dyndiv_data){
507 		.div = {
508 			.reg_off = HHI_SYS_CPU_CLK_CNTL0,
509 			.shift = 4,
510 			.width = 6,
511 		},
512 		.dyn = {
513 			.reg_off = HHI_SYS_CPU_CLK_CNTL0,
514 			.shift = 26,
515 			.width = 1,
516 		},
517 	},
518 	.hw.init = &(struct clk_init_data){
519 		.name = "cpu_clk_dyn0_div",
520 		.ops = &meson_clk_cpu_dyndiv_ops,
521 		.parent_hws = (const struct clk_hw *[]) {
522 			&g12a_cpu_clk_premux0.hw
523 		},
524 		.num_parents = 1,
525 		.flags = CLK_SET_RATE_PARENT,
526 	},
527 };
528 
529 /* Datasheet names this field as "postmux0" */
530 static struct clk_regmap g12a_cpu_clk_postmux0 = {
531 	.data = &(struct clk_regmap_mux_data){
532 		.offset = HHI_SYS_CPU_CLK_CNTL0,
533 		.mask = 0x1,
534 		.shift = 2,
535 		.flags = CLK_MUX_ROUND_CLOSEST,
536 	},
537 	.hw.init = &(struct clk_init_data){
538 		.name = "cpu_clk_dyn0",
539 		.ops = &clk_regmap_mux_ops,
540 		.parent_hws = (const struct clk_hw *[]) {
541 			&g12a_cpu_clk_premux0.hw,
542 			&g12a_cpu_clk_mux0_div.hw,
543 		},
544 		.num_parents = 2,
545 		.flags = CLK_SET_RATE_PARENT,
546 	},
547 };
548 
549 /* Datasheet names this field as "Mux1_divn_tcnt" */
550 static struct clk_regmap g12a_cpu_clk_mux1_div = {
551 	.data = &(struct clk_regmap_div_data){
552 		.offset = HHI_SYS_CPU_CLK_CNTL0,
553 		.shift = 20,
554 		.width = 6,
555 	},
556 	.hw.init = &(struct clk_init_data){
557 		.name = "cpu_clk_dyn1_div",
558 		.ops = &clk_regmap_divider_ro_ops,
559 		.parent_hws = (const struct clk_hw *[]) {
560 			&g12a_cpu_clk_premux1.hw
561 		},
562 		.num_parents = 1,
563 	},
564 };
565 
566 /* Datasheet names this field as "postmux1" */
567 static struct clk_regmap g12a_cpu_clk_postmux1 = {
568 	.data = &(struct clk_regmap_mux_data){
569 		.offset = HHI_SYS_CPU_CLK_CNTL0,
570 		.mask = 0x1,
571 		.shift = 18,
572 	},
573 	.hw.init = &(struct clk_init_data){
574 		.name = "cpu_clk_dyn1",
575 		.ops = &clk_regmap_mux_ops,
576 		.parent_hws = (const struct clk_hw *[]) {
577 			&g12a_cpu_clk_premux1.hw,
578 			&g12a_cpu_clk_mux1_div.hw,
579 		},
580 		.num_parents = 2,
581 		/* This sub-tree is used a parking clock */
582 		.flags = CLK_SET_RATE_NO_REPARENT,
583 	},
584 };
585 
586 /* Datasheet names this field as "Final_dyn_mux_sel" */
587 static struct clk_regmap g12a_cpu_clk_dyn = {
588 	.data = &(struct clk_regmap_mux_data){
589 		.offset = HHI_SYS_CPU_CLK_CNTL0,
590 		.mask = 0x1,
591 		.shift = 10,
592 		.flags = CLK_MUX_ROUND_CLOSEST,
593 	},
594 	.hw.init = &(struct clk_init_data){
595 		.name = "cpu_clk_dyn",
596 		.ops = &clk_regmap_mux_ops,
597 		.parent_hws = (const struct clk_hw *[]) {
598 			&g12a_cpu_clk_postmux0.hw,
599 			&g12a_cpu_clk_postmux1.hw,
600 		},
601 		.num_parents = 2,
602 		.flags = CLK_SET_RATE_PARENT,
603 	},
604 };
605 
606 /* Datasheet names this field as "Final_mux_sel" */
607 static struct clk_regmap g12a_cpu_clk = {
608 	.data = &(struct clk_regmap_mux_data){
609 		.offset = HHI_SYS_CPU_CLK_CNTL0,
610 		.mask = 0x1,
611 		.shift = 11,
612 		.flags = CLK_MUX_ROUND_CLOSEST,
613 	},
614 	.hw.init = &(struct clk_init_data){
615 		.name = "cpu_clk",
616 		.ops = &clk_regmap_mux_ops,
617 		.parent_hws = (const struct clk_hw *[]) {
618 			&g12a_cpu_clk_dyn.hw,
619 			&g12a_sys_pll.hw,
620 		},
621 		.num_parents = 2,
622 		.flags = CLK_SET_RATE_PARENT,
623 	},
624 };
625 
626 /* Datasheet names this field as "Final_mux_sel" */
627 static struct clk_regmap g12b_cpu_clk = {
628 	.data = &(struct clk_regmap_mux_data){
629 		.offset = HHI_SYS_CPU_CLK_CNTL0,
630 		.mask = 0x1,
631 		.shift = 11,
632 		.flags = CLK_MUX_ROUND_CLOSEST,
633 	},
634 	.hw.init = &(struct clk_init_data){
635 		.name = "cpu_clk",
636 		.ops = &clk_regmap_mux_ops,
637 		.parent_hws = (const struct clk_hw *[]) {
638 			&g12a_cpu_clk_dyn.hw,
639 			&g12b_sys1_pll.hw
640 		},
641 		.num_parents = 2,
642 		.flags = CLK_SET_RATE_PARENT,
643 	},
644 };
645 
646 /* Datasheet names this field as "premux0" */
647 static struct clk_regmap g12b_cpub_clk_premux0 = {
648 	.data = &(struct clk_regmap_mux_data){
649 		.offset = HHI_SYS_CPUB_CLK_CNTL,
650 		.mask = 0x3,
651 		.shift = 0,
652 		.flags = CLK_MUX_ROUND_CLOSEST,
653 	},
654 	.hw.init = &(struct clk_init_data){
655 		.name = "cpub_clk_dyn0_sel",
656 		.ops = &clk_regmap_mux_ops,
657 		.parent_data = (const struct clk_parent_data []) {
658 			{ .fw_name = "xtal", },
659 			{ .hw = &g12a_fclk_div2.hw },
660 			{ .hw = &g12a_fclk_div3.hw },
661 		},
662 		.num_parents = 3,
663 		.flags = CLK_SET_RATE_PARENT,
664 	},
665 };
666 
667 /* Datasheet names this field as "mux0_divn_tcnt" */
668 static struct clk_regmap g12b_cpub_clk_mux0_div = {
669 	.data = &(struct meson_clk_cpu_dyndiv_data){
670 		.div = {
671 			.reg_off = HHI_SYS_CPUB_CLK_CNTL,
672 			.shift = 4,
673 			.width = 6,
674 		},
675 		.dyn = {
676 			.reg_off = HHI_SYS_CPUB_CLK_CNTL,
677 			.shift = 26,
678 			.width = 1,
679 		},
680 	},
681 	.hw.init = &(struct clk_init_data){
682 		.name = "cpub_clk_dyn0_div",
683 		.ops = &meson_clk_cpu_dyndiv_ops,
684 		.parent_hws = (const struct clk_hw *[]) {
685 			&g12b_cpub_clk_premux0.hw
686 		},
687 		.num_parents = 1,
688 		.flags = CLK_SET_RATE_PARENT,
689 	},
690 };
691 
692 /* Datasheet names this field as "postmux0" */
693 static struct clk_regmap g12b_cpub_clk_postmux0 = {
694 	.data = &(struct clk_regmap_mux_data){
695 		.offset = HHI_SYS_CPUB_CLK_CNTL,
696 		.mask = 0x1,
697 		.shift = 2,
698 		.flags = CLK_MUX_ROUND_CLOSEST,
699 	},
700 	.hw.init = &(struct clk_init_data){
701 		.name = "cpub_clk_dyn0",
702 		.ops = &clk_regmap_mux_ops,
703 		.parent_hws = (const struct clk_hw *[]) {
704 			&g12b_cpub_clk_premux0.hw,
705 			&g12b_cpub_clk_mux0_div.hw
706 		},
707 		.num_parents = 2,
708 		.flags = CLK_SET_RATE_PARENT,
709 	},
710 };
711 
712 /* Datasheet names this field as "premux1" */
713 static struct clk_regmap g12b_cpub_clk_premux1 = {
714 	.data = &(struct clk_regmap_mux_data){
715 		.offset = HHI_SYS_CPUB_CLK_CNTL,
716 		.mask = 0x3,
717 		.shift = 16,
718 	},
719 	.hw.init = &(struct clk_init_data){
720 		.name = "cpub_clk_dyn1_sel",
721 		.ops = &clk_regmap_mux_ops,
722 		.parent_data = (const struct clk_parent_data []) {
723 			{ .fw_name = "xtal", },
724 			{ .hw = &g12a_fclk_div2.hw },
725 			{ .hw = &g12a_fclk_div3.hw },
726 		},
727 		.num_parents = 3,
728 		/* This sub-tree is used a parking clock */
729 		.flags = CLK_SET_RATE_NO_REPARENT,
730 	},
731 };
732 
733 /* Datasheet names this field as "Mux1_divn_tcnt" */
734 static struct clk_regmap g12b_cpub_clk_mux1_div = {
735 	.data = &(struct clk_regmap_div_data){
736 		.offset = HHI_SYS_CPUB_CLK_CNTL,
737 		.shift = 20,
738 		.width = 6,
739 	},
740 	.hw.init = &(struct clk_init_data){
741 		.name = "cpub_clk_dyn1_div",
742 		.ops = &clk_regmap_divider_ro_ops,
743 		.parent_hws = (const struct clk_hw *[]) {
744 			&g12b_cpub_clk_premux1.hw
745 		},
746 		.num_parents = 1,
747 	},
748 };
749 
750 /* Datasheet names this field as "postmux1" */
751 static struct clk_regmap g12b_cpub_clk_postmux1 = {
752 	.data = &(struct clk_regmap_mux_data){
753 		.offset = HHI_SYS_CPUB_CLK_CNTL,
754 		.mask = 0x1,
755 		.shift = 18,
756 	},
757 	.hw.init = &(struct clk_init_data){
758 		.name = "cpub_clk_dyn1",
759 		.ops = &clk_regmap_mux_ops,
760 		.parent_hws = (const struct clk_hw *[]) {
761 			&g12b_cpub_clk_premux1.hw,
762 			&g12b_cpub_clk_mux1_div.hw
763 		},
764 		.num_parents = 2,
765 		/* This sub-tree is used a parking clock */
766 		.flags = CLK_SET_RATE_NO_REPARENT,
767 	},
768 };
769 
770 /* Datasheet names this field as "Final_dyn_mux_sel" */
771 static struct clk_regmap g12b_cpub_clk_dyn = {
772 	.data = &(struct clk_regmap_mux_data){
773 		.offset = HHI_SYS_CPUB_CLK_CNTL,
774 		.mask = 0x1,
775 		.shift = 10,
776 		.flags = CLK_MUX_ROUND_CLOSEST,
777 	},
778 	.hw.init = &(struct clk_init_data){
779 		.name = "cpub_clk_dyn",
780 		.ops = &clk_regmap_mux_ops,
781 		.parent_hws = (const struct clk_hw *[]) {
782 			&g12b_cpub_clk_postmux0.hw,
783 			&g12b_cpub_clk_postmux1.hw
784 		},
785 		.num_parents = 2,
786 		.flags = CLK_SET_RATE_PARENT,
787 	},
788 };
789 
790 /* Datasheet names this field as "Final_mux_sel" */
791 static struct clk_regmap g12b_cpub_clk = {
792 	.data = &(struct clk_regmap_mux_data){
793 		.offset = HHI_SYS_CPUB_CLK_CNTL,
794 		.mask = 0x1,
795 		.shift = 11,
796 		.flags = CLK_MUX_ROUND_CLOSEST,
797 	},
798 	.hw.init = &(struct clk_init_data){
799 		.name = "cpub_clk",
800 		.ops = &clk_regmap_mux_ops,
801 		.parent_hws = (const struct clk_hw *[]) {
802 			&g12b_cpub_clk_dyn.hw,
803 			&g12a_sys_pll.hw
804 		},
805 		.num_parents = 2,
806 		.flags = CLK_SET_RATE_PARENT,
807 	},
808 };
809 
810 static struct clk_regmap sm1_gp1_pll;
811 
812 /* Datasheet names this field as "premux0" */
813 static struct clk_regmap sm1_dsu_clk_premux0 = {
814 	.data = &(struct clk_regmap_mux_data){
815 		.offset = HHI_SYS_CPU_CLK_CNTL5,
816 		.mask = 0x3,
817 		.shift = 0,
818 	},
819 	.hw.init = &(struct clk_init_data){
820 		.name = "dsu_clk_dyn0_sel",
821 		.ops = &clk_regmap_mux_ro_ops,
822 		.parent_data = (const struct clk_parent_data []) {
823 			{ .fw_name = "xtal", },
824 			{ .hw = &g12a_fclk_div2.hw },
825 			{ .hw = &g12a_fclk_div3.hw },
826 			{ .hw = &sm1_gp1_pll.hw },
827 		},
828 		.num_parents = 4,
829 	},
830 };
831 
832 /* Datasheet names this field as "premux1" */
833 static struct clk_regmap sm1_dsu_clk_premux1 = {
834 	.data = &(struct clk_regmap_mux_data){
835 		.offset = HHI_SYS_CPU_CLK_CNTL5,
836 		.mask = 0x3,
837 		.shift = 16,
838 	},
839 	.hw.init = &(struct clk_init_data){
840 		.name = "dsu_clk_dyn1_sel",
841 		.ops = &clk_regmap_mux_ro_ops,
842 		.parent_data = (const struct clk_parent_data []) {
843 			{ .fw_name = "xtal", },
844 			{ .hw = &g12a_fclk_div2.hw },
845 			{ .hw = &g12a_fclk_div3.hw },
846 			{ .hw = &sm1_gp1_pll.hw },
847 		},
848 		.num_parents = 4,
849 	},
850 };
851 
852 /* Datasheet names this field as "Mux0_divn_tcnt" */
853 static struct clk_regmap sm1_dsu_clk_mux0_div = {
854 	.data = &(struct clk_regmap_div_data){
855 		.offset = HHI_SYS_CPU_CLK_CNTL5,
856 		.shift = 4,
857 		.width = 6,
858 	},
859 	.hw.init = &(struct clk_init_data){
860 		.name = "dsu_clk_dyn0_div",
861 		.ops = &clk_regmap_divider_ro_ops,
862 		.parent_hws = (const struct clk_hw *[]) {
863 			&sm1_dsu_clk_premux0.hw
864 		},
865 		.num_parents = 1,
866 	},
867 };
868 
869 /* Datasheet names this field as "postmux0" */
870 static struct clk_regmap sm1_dsu_clk_postmux0 = {
871 	.data = &(struct clk_regmap_mux_data){
872 		.offset = HHI_SYS_CPU_CLK_CNTL5,
873 		.mask = 0x1,
874 		.shift = 2,
875 	},
876 	.hw.init = &(struct clk_init_data){
877 		.name = "dsu_clk_dyn0",
878 		.ops = &clk_regmap_mux_ro_ops,
879 		.parent_hws = (const struct clk_hw *[]) {
880 			&sm1_dsu_clk_premux0.hw,
881 			&sm1_dsu_clk_mux0_div.hw,
882 		},
883 		.num_parents = 2,
884 	},
885 };
886 
887 /* Datasheet names this field as "Mux1_divn_tcnt" */
888 static struct clk_regmap sm1_dsu_clk_mux1_div = {
889 	.data = &(struct clk_regmap_div_data){
890 		.offset = HHI_SYS_CPU_CLK_CNTL5,
891 		.shift = 20,
892 		.width = 6,
893 	},
894 	.hw.init = &(struct clk_init_data){
895 		.name = "dsu_clk_dyn1_div",
896 		.ops = &clk_regmap_divider_ro_ops,
897 		.parent_hws = (const struct clk_hw *[]) {
898 			&sm1_dsu_clk_premux1.hw
899 		},
900 		.num_parents = 1,
901 	},
902 };
903 
904 /* Datasheet names this field as "postmux1" */
905 static struct clk_regmap sm1_dsu_clk_postmux1 = {
906 	.data = &(struct clk_regmap_mux_data){
907 		.offset = HHI_SYS_CPU_CLK_CNTL5,
908 		.mask = 0x1,
909 		.shift = 18,
910 	},
911 	.hw.init = &(struct clk_init_data){
912 		.name = "dsu_clk_dyn1",
913 		.ops = &clk_regmap_mux_ro_ops,
914 		.parent_hws = (const struct clk_hw *[]) {
915 			&sm1_dsu_clk_premux1.hw,
916 			&sm1_dsu_clk_mux1_div.hw,
917 		},
918 		.num_parents = 2,
919 	},
920 };
921 
922 /* Datasheet names this field as "Final_dyn_mux_sel" */
923 static struct clk_regmap sm1_dsu_clk_dyn = {
924 	.data = &(struct clk_regmap_mux_data){
925 		.offset = HHI_SYS_CPU_CLK_CNTL5,
926 		.mask = 0x1,
927 		.shift = 10,
928 	},
929 	.hw.init = &(struct clk_init_data){
930 		.name = "dsu_clk_dyn",
931 		.ops = &clk_regmap_mux_ro_ops,
932 		.parent_hws = (const struct clk_hw *[]) {
933 			&sm1_dsu_clk_postmux0.hw,
934 			&sm1_dsu_clk_postmux1.hw,
935 		},
936 		.num_parents = 2,
937 	},
938 };
939 
940 /* Datasheet names this field as "Final_mux_sel" */
941 static struct clk_regmap sm1_dsu_final_clk = {
942 	.data = &(struct clk_regmap_mux_data){
943 		.offset = HHI_SYS_CPU_CLK_CNTL5,
944 		.mask = 0x1,
945 		.shift = 11,
946 	},
947 	.hw.init = &(struct clk_init_data){
948 		.name = "dsu_clk_final",
949 		.ops = &clk_regmap_mux_ro_ops,
950 		.parent_hws = (const struct clk_hw *[]) {
951 			&sm1_dsu_clk_dyn.hw,
952 			&g12a_sys_pll.hw,
953 		},
954 		.num_parents = 2,
955 	},
956 };
957 
958 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
959 static struct clk_regmap sm1_cpu1_clk = {
960 	.data = &(struct clk_regmap_mux_data){
961 		.offset = HHI_SYS_CPU_CLK_CNTL6,
962 		.mask = 0x1,
963 		.shift = 24,
964 	},
965 	.hw.init = &(struct clk_init_data){
966 		.name = "cpu1_clk",
967 		.ops = &clk_regmap_mux_ro_ops,
968 		.parent_hws = (const struct clk_hw *[]) {
969 			&g12a_cpu_clk.hw,
970 			/* This CPU also have a dedicated clock tree */
971 		},
972 		.num_parents = 1,
973 	},
974 };
975 
976 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
977 static struct clk_regmap sm1_cpu2_clk = {
978 	.data = &(struct clk_regmap_mux_data){
979 		.offset = HHI_SYS_CPU_CLK_CNTL6,
980 		.mask = 0x1,
981 		.shift = 25,
982 	},
983 	.hw.init = &(struct clk_init_data){
984 		.name = "cpu2_clk",
985 		.ops = &clk_regmap_mux_ro_ops,
986 		.parent_hws = (const struct clk_hw *[]) {
987 			&g12a_cpu_clk.hw,
988 			/* This CPU also have a dedicated clock tree */
989 		},
990 		.num_parents = 1,
991 	},
992 };
993 
994 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
995 static struct clk_regmap sm1_cpu3_clk = {
996 	.data = &(struct clk_regmap_mux_data){
997 		.offset = HHI_SYS_CPU_CLK_CNTL6,
998 		.mask = 0x1,
999 		.shift = 26,
1000 	},
1001 	.hw.init = &(struct clk_init_data){
1002 		.name = "cpu3_clk",
1003 		.ops = &clk_regmap_mux_ro_ops,
1004 		.parent_hws = (const struct clk_hw *[]) {
1005 			&g12a_cpu_clk.hw,
1006 			/* This CPU also have a dedicated clock tree */
1007 		},
1008 		.num_parents = 1,
1009 	},
1010 };
1011 
1012 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
1013 static struct clk_regmap sm1_dsu_clk = {
1014 	.data = &(struct clk_regmap_mux_data){
1015 		.offset = HHI_SYS_CPU_CLK_CNTL6,
1016 		.mask = 0x1,
1017 		.shift = 27,
1018 	},
1019 	.hw.init = &(struct clk_init_data){
1020 		.name = "dsu_clk",
1021 		.ops = &clk_regmap_mux_ro_ops,
1022 		.parent_hws = (const struct clk_hw *[]) {
1023 			&g12a_cpu_clk.hw,
1024 			&sm1_dsu_final_clk.hw,
1025 		},
1026 		.num_parents = 2,
1027 	},
1028 };
1029 
g12a_cpu_clk_mux_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)1030 static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
1031 					unsigned long event, void *data)
1032 {
1033 	if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
1034 		/* Wait for clock propagation before/after changing the mux */
1035 		udelay(100);
1036 		return NOTIFY_OK;
1037 	}
1038 
1039 	return NOTIFY_DONE;
1040 }
1041 
1042 static struct notifier_block g12a_cpu_clk_mux_nb = {
1043 	.notifier_call = g12a_cpu_clk_mux_notifier_cb,
1044 };
1045 
1046 struct g12a_cpu_clk_postmux_nb_data {
1047 	struct notifier_block nb;
1048 	struct clk_hw *xtal;
1049 	struct clk_hw *cpu_clk_dyn;
1050 	struct clk_hw *cpu_clk_postmux0;
1051 	struct clk_hw *cpu_clk_postmux1;
1052 	struct clk_hw *cpu_clk_premux1;
1053 };
1054 
g12a_cpu_clk_postmux_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)1055 static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
1056 					    unsigned long event, void *data)
1057 {
1058 	struct g12a_cpu_clk_postmux_nb_data *nb_data =
1059 		container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
1060 
1061 	switch (event) {
1062 	case PRE_RATE_CHANGE:
1063 		/*
1064 		 * This notifier means cpu_clk_postmux0 clock will be changed
1065 		 * to feed cpu_clk, this is the current path :
1066 		 * cpu_clk
1067 		 *    \- cpu_clk_dyn
1068 		 *          \- cpu_clk_postmux0
1069 		 *                \- cpu_clk_muxX_div
1070 		 *                      \- cpu_clk_premux0
1071 		 *				\- fclk_div3 or fclk_div2
1072 		 *		OR
1073 		 *                \- cpu_clk_premux0
1074 		 *			\- fclk_div3 or fclk_div2
1075 		 */
1076 
1077 		/* Setup cpu_clk_premux1 to xtal */
1078 		clk_hw_set_parent(nb_data->cpu_clk_premux1,
1079 				  nb_data->xtal);
1080 
1081 		/* Setup cpu_clk_postmux1 to bypass divider */
1082 		clk_hw_set_parent(nb_data->cpu_clk_postmux1,
1083 				  nb_data->cpu_clk_premux1);
1084 
1085 		/* Switch to parking clk on cpu_clk_postmux1 */
1086 		clk_hw_set_parent(nb_data->cpu_clk_dyn,
1087 				  nb_data->cpu_clk_postmux1);
1088 
1089 		/*
1090 		 * Now, cpu_clk is 24MHz in the current path :
1091 		 * cpu_clk
1092 		 *    \- cpu_clk_dyn
1093 		 *          \- cpu_clk_postmux1
1094 		 *                \- cpu_clk_premux1
1095 		 *                      \- xtal
1096 		 */
1097 
1098 		udelay(100);
1099 
1100 		return NOTIFY_OK;
1101 
1102 	case POST_RATE_CHANGE:
1103 		/*
1104 		 * The cpu_clk_postmux0 has ben updated, now switch back
1105 		 * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
1106 		 * in account.
1107 		 */
1108 
1109 		/* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
1110 		clk_hw_set_parent(nb_data->cpu_clk_dyn,
1111 				  nb_data->cpu_clk_postmux0);
1112 
1113 		/*
1114 		 * new path :
1115 		 * cpu_clk
1116 		 *    \- cpu_clk_dyn
1117 		 *          \- cpu_clk_postmux0
1118 		 *                \- cpu_clk_muxX_div
1119 		 *                      \- cpu_clk_premux0
1120 		 *				\- fclk_div3 or fclk_div2
1121 		 *		OR
1122 		 *                \- cpu_clk_premux0
1123 		 *			\- fclk_div3 or fclk_div2
1124 		 */
1125 
1126 		udelay(100);
1127 
1128 		return NOTIFY_OK;
1129 
1130 	default:
1131 		return NOTIFY_DONE;
1132 	}
1133 }
1134 
1135 static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
1136 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1137 	.cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
1138 	.cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
1139 	.cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
1140 	.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1141 };
1142 
1143 static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
1144 	.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1145 	.cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
1146 	.cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
1147 	.cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
1148 	.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
1149 };
1150 
1151 struct g12a_sys_pll_nb_data {
1152 	struct notifier_block nb;
1153 	struct clk_hw *sys_pll;
1154 	struct clk_hw *cpu_clk;
1155 	struct clk_hw *cpu_clk_dyn;
1156 };
1157 
g12a_sys_pll_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)1158 static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
1159 				    unsigned long event, void *data)
1160 {
1161 	struct g12a_sys_pll_nb_data *nb_data =
1162 		container_of(nb, struct g12a_sys_pll_nb_data, nb);
1163 
1164 	switch (event) {
1165 	case PRE_RATE_CHANGE:
1166 		/*
1167 		 * This notifier means sys_pll clock will be changed
1168 		 * to feed cpu_clk, this the current path :
1169 		 * cpu_clk
1170 		 *    \- sys_pll
1171 		 *          \- sys_pll_dco
1172 		 */
1173 
1174 		/* Configure cpu_clk to use cpu_clk_dyn */
1175 		clk_hw_set_parent(nb_data->cpu_clk,
1176 				  nb_data->cpu_clk_dyn);
1177 
1178 		/*
1179 		 * Now, cpu_clk uses the dyn path
1180 		 * cpu_clk
1181 		 *    \- cpu_clk_dyn
1182 		 *          \- cpu_clk_dynX
1183 		 *                \- cpu_clk_dynX_sel
1184 		 *		     \- cpu_clk_dynX_div
1185 		 *                      \- xtal/fclk_div2/fclk_div3
1186 		 *                   \- xtal/fclk_div2/fclk_div3
1187 		 */
1188 
1189 		udelay(100);
1190 
1191 		return NOTIFY_OK;
1192 
1193 	case POST_RATE_CHANGE:
1194 		/*
1195 		 * The sys_pll has ben updated, now switch back cpu_clk to
1196 		 * sys_pll
1197 		 */
1198 
1199 		/* Configure cpu_clk to use sys_pll */
1200 		clk_hw_set_parent(nb_data->cpu_clk,
1201 				  nb_data->sys_pll);
1202 
1203 		udelay(100);
1204 
1205 		/* new path :
1206 		 * cpu_clk
1207 		 *    \- sys_pll
1208 		 *          \- sys_pll_dco
1209 		 */
1210 
1211 		return NOTIFY_OK;
1212 
1213 	default:
1214 		return NOTIFY_DONE;
1215 	}
1216 }
1217 
1218 static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
1219 	.sys_pll = &g12a_sys_pll.hw,
1220 	.cpu_clk = &g12a_cpu_clk.hw,
1221 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1222 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1223 };
1224 
1225 /* G12B first CPU cluster uses sys1_pll */
1226 static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
1227 	.sys_pll = &g12b_sys1_pll.hw,
1228 	.cpu_clk = &g12b_cpu_clk.hw,
1229 	.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
1230 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1231 };
1232 
1233 /* G12B second CPU cluster uses sys_pll */
1234 static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
1235 	.sys_pll = &g12a_sys_pll.hw,
1236 	.cpu_clk = &g12b_cpub_clk.hw,
1237 	.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
1238 	.nb.notifier_call = g12a_sys_pll_notifier_cb,
1239 };
1240 
1241 static struct clk_regmap g12a_cpu_clk_div16_en = {
1242 	.data = &(struct clk_regmap_gate_data){
1243 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1244 		.bit_idx = 1,
1245 	},
1246 	.hw.init = &(struct clk_init_data) {
1247 		.name = "cpu_clk_div16_en",
1248 		.ops = &clk_regmap_gate_ro_ops,
1249 		.parent_data = &(const struct clk_parent_data) {
1250 			/*
1251 			 * Note:
1252 			 * G12A and G12B have different cpu clocks (with
1253 			 * different struct clk_hw). We fallback to the global
1254 			 * naming string mechanism so this clock picks
1255 			 * up the appropriate one. Same goes for the other
1256 			 * clock using cpu cluster A clock output and present
1257 			 * on both G12 variant.
1258 			 */
1259 			.name = "cpu_clk",
1260 			.index = -1,
1261 		},
1262 		.num_parents = 1,
1263 		/*
1264 		 * This clock is used to debug the cpu_clk range
1265 		 * Linux should not change it at runtime
1266 		 */
1267 	},
1268 };
1269 
1270 static struct clk_regmap g12b_cpub_clk_div16_en = {
1271 	.data = &(struct clk_regmap_gate_data){
1272 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1273 		.bit_idx = 1,
1274 	},
1275 	.hw.init = &(struct clk_init_data) {
1276 		.name = "cpub_clk_div16_en",
1277 		.ops = &clk_regmap_gate_ro_ops,
1278 		.parent_hws = (const struct clk_hw *[]) {
1279 			&g12b_cpub_clk.hw
1280 		},
1281 		.num_parents = 1,
1282 		/*
1283 		 * This clock is used to debug the cpu_clk range
1284 		 * Linux should not change it at runtime
1285 		 */
1286 	},
1287 };
1288 
1289 static struct clk_fixed_factor g12a_cpu_clk_div16 = {
1290 	.mult = 1,
1291 	.div = 16,
1292 	.hw.init = &(struct clk_init_data){
1293 		.name = "cpu_clk_div16",
1294 		.ops = &clk_fixed_factor_ops,
1295 		.parent_hws = (const struct clk_hw *[]) {
1296 			&g12a_cpu_clk_div16_en.hw
1297 		},
1298 		.num_parents = 1,
1299 	},
1300 };
1301 
1302 static struct clk_fixed_factor g12b_cpub_clk_div16 = {
1303 	.mult = 1,
1304 	.div = 16,
1305 	.hw.init = &(struct clk_init_data){
1306 		.name = "cpub_clk_div16",
1307 		.ops = &clk_fixed_factor_ops,
1308 		.parent_hws = (const struct clk_hw *[]) {
1309 			&g12b_cpub_clk_div16_en.hw
1310 		},
1311 		.num_parents = 1,
1312 	},
1313 };
1314 
1315 static struct clk_regmap g12a_cpu_clk_apb_div = {
1316 	.data = &(struct clk_regmap_div_data){
1317 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1318 		.shift = 3,
1319 		.width = 3,
1320 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1321 	},
1322 	.hw.init = &(struct clk_init_data){
1323 		.name = "cpu_clk_apb_div",
1324 		.ops = &clk_regmap_divider_ro_ops,
1325 		.parent_data = &(const struct clk_parent_data) {
1326 			.name = "cpu_clk",
1327 			.index = -1,
1328 		},
1329 		.num_parents = 1,
1330 	},
1331 };
1332 
1333 static struct clk_regmap g12a_cpu_clk_apb = {
1334 	.data = &(struct clk_regmap_gate_data){
1335 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1336 		.bit_idx = 1,
1337 	},
1338 	.hw.init = &(struct clk_init_data) {
1339 		.name = "cpu_clk_apb",
1340 		.ops = &clk_regmap_gate_ro_ops,
1341 		.parent_hws = (const struct clk_hw *[]) {
1342 			&g12a_cpu_clk_apb_div.hw
1343 		},
1344 		.num_parents = 1,
1345 		/*
1346 		 * This clock is set by the ROM monitor code,
1347 		 * Linux should not change it at runtime
1348 		 */
1349 	},
1350 };
1351 
1352 static struct clk_regmap g12a_cpu_clk_atb_div = {
1353 	.data = &(struct clk_regmap_div_data){
1354 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1355 		.shift = 6,
1356 		.width = 3,
1357 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1358 	},
1359 	.hw.init = &(struct clk_init_data){
1360 		.name = "cpu_clk_atb_div",
1361 		.ops = &clk_regmap_divider_ro_ops,
1362 		.parent_data = &(const struct clk_parent_data) {
1363 			.name = "cpu_clk",
1364 			.index = -1,
1365 		},
1366 		.num_parents = 1,
1367 	},
1368 };
1369 
1370 static struct clk_regmap g12a_cpu_clk_atb = {
1371 	.data = &(struct clk_regmap_gate_data){
1372 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1373 		.bit_idx = 17,
1374 	},
1375 	.hw.init = &(struct clk_init_data) {
1376 		.name = "cpu_clk_atb",
1377 		.ops = &clk_regmap_gate_ro_ops,
1378 		.parent_hws = (const struct clk_hw *[]) {
1379 			&g12a_cpu_clk_atb_div.hw
1380 		},
1381 		.num_parents = 1,
1382 		/*
1383 		 * This clock is set by the ROM monitor code,
1384 		 * Linux should not change it at runtime
1385 		 */
1386 	},
1387 };
1388 
1389 static struct clk_regmap g12a_cpu_clk_axi_div = {
1390 	.data = &(struct clk_regmap_div_data){
1391 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1392 		.shift = 9,
1393 		.width = 3,
1394 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1395 	},
1396 	.hw.init = &(struct clk_init_data){
1397 		.name = "cpu_clk_axi_div",
1398 		.ops = &clk_regmap_divider_ro_ops,
1399 		.parent_data = &(const struct clk_parent_data) {
1400 			.name = "cpu_clk",
1401 			.index = -1,
1402 		},
1403 		.num_parents = 1,
1404 	},
1405 };
1406 
1407 static struct clk_regmap g12a_cpu_clk_axi = {
1408 	.data = &(struct clk_regmap_gate_data){
1409 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1410 		.bit_idx = 18,
1411 	},
1412 	.hw.init = &(struct clk_init_data) {
1413 		.name = "cpu_clk_axi",
1414 		.ops = &clk_regmap_gate_ro_ops,
1415 		.parent_hws = (const struct clk_hw *[]) {
1416 			&g12a_cpu_clk_axi_div.hw
1417 		},
1418 		.num_parents = 1,
1419 		/*
1420 		 * This clock is set by the ROM monitor code,
1421 		 * Linux should not change it at runtime
1422 		 */
1423 	},
1424 };
1425 
1426 static struct clk_regmap g12a_cpu_clk_trace_div = {
1427 	.data = &(struct clk_regmap_div_data){
1428 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1429 		.shift = 20,
1430 		.width = 3,
1431 		.flags = CLK_DIVIDER_POWER_OF_TWO,
1432 	},
1433 	.hw.init = &(struct clk_init_data){
1434 		.name = "cpu_clk_trace_div",
1435 		.ops = &clk_regmap_divider_ro_ops,
1436 		.parent_data = &(const struct clk_parent_data) {
1437 			.name = "cpu_clk",
1438 			.index = -1,
1439 		},
1440 		.num_parents = 1,
1441 	},
1442 };
1443 
1444 static struct clk_regmap g12a_cpu_clk_trace = {
1445 	.data = &(struct clk_regmap_gate_data){
1446 		.offset = HHI_SYS_CPU_CLK_CNTL1,
1447 		.bit_idx = 23,
1448 	},
1449 	.hw.init = &(struct clk_init_data) {
1450 		.name = "cpu_clk_trace",
1451 		.ops = &clk_regmap_gate_ro_ops,
1452 		.parent_hws = (const struct clk_hw *[]) {
1453 			&g12a_cpu_clk_trace_div.hw
1454 		},
1455 		.num_parents = 1,
1456 		/*
1457 		 * This clock is set by the ROM monitor code,
1458 		 * Linux should not change it at runtime
1459 		 */
1460 	},
1461 };
1462 
1463 static struct clk_fixed_factor g12b_cpub_clk_div2 = {
1464 	.mult = 1,
1465 	.div = 2,
1466 	.hw.init = &(struct clk_init_data){
1467 		.name = "cpub_clk_div2",
1468 		.ops = &clk_fixed_factor_ops,
1469 		.parent_hws = (const struct clk_hw *[]) {
1470 			&g12b_cpub_clk.hw
1471 		},
1472 		.num_parents = 1,
1473 	},
1474 };
1475 
1476 static struct clk_fixed_factor g12b_cpub_clk_div3 = {
1477 	.mult = 1,
1478 	.div = 3,
1479 	.hw.init = &(struct clk_init_data){
1480 		.name = "cpub_clk_div3",
1481 		.ops = &clk_fixed_factor_ops,
1482 		.parent_hws = (const struct clk_hw *[]) {
1483 			&g12b_cpub_clk.hw
1484 		},
1485 		.num_parents = 1,
1486 	},
1487 };
1488 
1489 static struct clk_fixed_factor g12b_cpub_clk_div4 = {
1490 	.mult = 1,
1491 	.div = 4,
1492 	.hw.init = &(struct clk_init_data){
1493 		.name = "cpub_clk_div4",
1494 		.ops = &clk_fixed_factor_ops,
1495 		.parent_hws = (const struct clk_hw *[]) {
1496 			&g12b_cpub_clk.hw
1497 		},
1498 		.num_parents = 1,
1499 	},
1500 };
1501 
1502 static struct clk_fixed_factor g12b_cpub_clk_div5 = {
1503 	.mult = 1,
1504 	.div = 5,
1505 	.hw.init = &(struct clk_init_data){
1506 		.name = "cpub_clk_div5",
1507 		.ops = &clk_fixed_factor_ops,
1508 		.parent_hws = (const struct clk_hw *[]) {
1509 			&g12b_cpub_clk.hw
1510 		},
1511 		.num_parents = 1,
1512 	},
1513 };
1514 
1515 static struct clk_fixed_factor g12b_cpub_clk_div6 = {
1516 	.mult = 1,
1517 	.div = 6,
1518 	.hw.init = &(struct clk_init_data){
1519 		.name = "cpub_clk_div6",
1520 		.ops = &clk_fixed_factor_ops,
1521 		.parent_hws = (const struct clk_hw *[]) {
1522 			&g12b_cpub_clk.hw
1523 		},
1524 		.num_parents = 1,
1525 	},
1526 };
1527 
1528 static struct clk_fixed_factor g12b_cpub_clk_div7 = {
1529 	.mult = 1,
1530 	.div = 7,
1531 	.hw.init = &(struct clk_init_data){
1532 		.name = "cpub_clk_div7",
1533 		.ops = &clk_fixed_factor_ops,
1534 		.parent_hws = (const struct clk_hw *[]) {
1535 			&g12b_cpub_clk.hw
1536 		},
1537 		.num_parents = 1,
1538 	},
1539 };
1540 
1541 static struct clk_fixed_factor g12b_cpub_clk_div8 = {
1542 	.mult = 1,
1543 	.div = 8,
1544 	.hw.init = &(struct clk_init_data){
1545 		.name = "cpub_clk_div8",
1546 		.ops = &clk_fixed_factor_ops,
1547 		.parent_hws = (const struct clk_hw *[]) {
1548 			&g12b_cpub_clk.hw
1549 		},
1550 		.num_parents = 1,
1551 	},
1552 };
1553 
1554 static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
1555 static struct clk_regmap g12b_cpub_clk_apb_sel = {
1556 	.data = &(struct clk_regmap_mux_data){
1557 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1558 		.mask = 7,
1559 		.shift = 3,
1560 		.table = mux_table_cpub,
1561 	},
1562 	.hw.init = &(struct clk_init_data){
1563 		.name = "cpub_clk_apb_sel",
1564 		.ops = &clk_regmap_mux_ro_ops,
1565 		.parent_hws = (const struct clk_hw *[]) {
1566 			&g12b_cpub_clk_div2.hw,
1567 			&g12b_cpub_clk_div3.hw,
1568 			&g12b_cpub_clk_div4.hw,
1569 			&g12b_cpub_clk_div5.hw,
1570 			&g12b_cpub_clk_div6.hw,
1571 			&g12b_cpub_clk_div7.hw,
1572 			&g12b_cpub_clk_div8.hw
1573 		},
1574 		.num_parents = 7,
1575 	},
1576 };
1577 
1578 static struct clk_regmap g12b_cpub_clk_apb = {
1579 	.data = &(struct clk_regmap_gate_data){
1580 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1581 		.bit_idx = 16,
1582 		.flags = CLK_GATE_SET_TO_DISABLE,
1583 	},
1584 	.hw.init = &(struct clk_init_data) {
1585 		.name = "cpub_clk_apb",
1586 		.ops = &clk_regmap_gate_ro_ops,
1587 		.parent_hws = (const struct clk_hw *[]) {
1588 			&g12b_cpub_clk_apb_sel.hw
1589 		},
1590 		.num_parents = 1,
1591 		/*
1592 		 * This clock is set by the ROM monitor code,
1593 		 * Linux should not change it at runtime
1594 		 */
1595 	},
1596 };
1597 
1598 static struct clk_regmap g12b_cpub_clk_atb_sel = {
1599 	.data = &(struct clk_regmap_mux_data){
1600 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1601 		.mask = 7,
1602 		.shift = 6,
1603 		.table = mux_table_cpub,
1604 	},
1605 	.hw.init = &(struct clk_init_data){
1606 		.name = "cpub_clk_atb_sel",
1607 		.ops = &clk_regmap_mux_ro_ops,
1608 		.parent_hws = (const struct clk_hw *[]) {
1609 			&g12b_cpub_clk_div2.hw,
1610 			&g12b_cpub_clk_div3.hw,
1611 			&g12b_cpub_clk_div4.hw,
1612 			&g12b_cpub_clk_div5.hw,
1613 			&g12b_cpub_clk_div6.hw,
1614 			&g12b_cpub_clk_div7.hw,
1615 			&g12b_cpub_clk_div8.hw
1616 		},
1617 		.num_parents = 7,
1618 	},
1619 };
1620 
1621 static struct clk_regmap g12b_cpub_clk_atb = {
1622 	.data = &(struct clk_regmap_gate_data){
1623 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1624 		.bit_idx = 17,
1625 		.flags = CLK_GATE_SET_TO_DISABLE,
1626 	},
1627 	.hw.init = &(struct clk_init_data) {
1628 		.name = "cpub_clk_atb",
1629 		.ops = &clk_regmap_gate_ro_ops,
1630 		.parent_hws = (const struct clk_hw *[]) {
1631 			&g12b_cpub_clk_atb_sel.hw
1632 		},
1633 		.num_parents = 1,
1634 		/*
1635 		 * This clock is set by the ROM monitor code,
1636 		 * Linux should not change it at runtime
1637 		 */
1638 	},
1639 };
1640 
1641 static struct clk_regmap g12b_cpub_clk_axi_sel = {
1642 	.data = &(struct clk_regmap_mux_data){
1643 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1644 		.mask = 7,
1645 		.shift = 9,
1646 		.table = mux_table_cpub,
1647 	},
1648 	.hw.init = &(struct clk_init_data){
1649 		.name = "cpub_clk_axi_sel",
1650 		.ops = &clk_regmap_mux_ro_ops,
1651 		.parent_hws = (const struct clk_hw *[]) {
1652 			&g12b_cpub_clk_div2.hw,
1653 			&g12b_cpub_clk_div3.hw,
1654 			&g12b_cpub_clk_div4.hw,
1655 			&g12b_cpub_clk_div5.hw,
1656 			&g12b_cpub_clk_div6.hw,
1657 			&g12b_cpub_clk_div7.hw,
1658 			&g12b_cpub_clk_div8.hw
1659 		},
1660 		.num_parents = 7,
1661 	},
1662 };
1663 
1664 static struct clk_regmap g12b_cpub_clk_axi = {
1665 	.data = &(struct clk_regmap_gate_data){
1666 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1667 		.bit_idx = 18,
1668 		.flags = CLK_GATE_SET_TO_DISABLE,
1669 	},
1670 	.hw.init = &(struct clk_init_data) {
1671 		.name = "cpub_clk_axi",
1672 		.ops = &clk_regmap_gate_ro_ops,
1673 		.parent_hws = (const struct clk_hw *[]) {
1674 			&g12b_cpub_clk_axi_sel.hw
1675 		},
1676 		.num_parents = 1,
1677 		/*
1678 		 * This clock is set by the ROM monitor code,
1679 		 * Linux should not change it at runtime
1680 		 */
1681 	},
1682 };
1683 
1684 static struct clk_regmap g12b_cpub_clk_trace_sel = {
1685 	.data = &(struct clk_regmap_mux_data){
1686 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1687 		.mask = 7,
1688 		.shift = 20,
1689 		.table = mux_table_cpub,
1690 	},
1691 	.hw.init = &(struct clk_init_data){
1692 		.name = "cpub_clk_trace_sel",
1693 		.ops = &clk_regmap_mux_ro_ops,
1694 		.parent_hws = (const struct clk_hw *[]) {
1695 			&g12b_cpub_clk_div2.hw,
1696 			&g12b_cpub_clk_div3.hw,
1697 			&g12b_cpub_clk_div4.hw,
1698 			&g12b_cpub_clk_div5.hw,
1699 			&g12b_cpub_clk_div6.hw,
1700 			&g12b_cpub_clk_div7.hw,
1701 			&g12b_cpub_clk_div8.hw
1702 		},
1703 		.num_parents = 7,
1704 	},
1705 };
1706 
1707 static struct clk_regmap g12b_cpub_clk_trace = {
1708 	.data = &(struct clk_regmap_gate_data){
1709 		.offset = HHI_SYS_CPUB_CLK_CNTL1,
1710 		.bit_idx = 23,
1711 		.flags = CLK_GATE_SET_TO_DISABLE,
1712 	},
1713 	.hw.init = &(struct clk_init_data) {
1714 		.name = "cpub_clk_trace",
1715 		.ops = &clk_regmap_gate_ro_ops,
1716 		.parent_hws = (const struct clk_hw *[]) {
1717 			&g12b_cpub_clk_trace_sel.hw
1718 		},
1719 		.num_parents = 1,
1720 		/*
1721 		 * This clock is set by the ROM monitor code,
1722 		 * Linux should not change it at runtime
1723 		 */
1724 	},
1725 };
1726 
1727 static const struct pll_mult_range g12a_gp0_pll_mult_range = {
1728 	.min = 125,
1729 	.max = 255,
1730 };
1731 
1732 /*
1733  * Internal gp0 pll emulation configuration parameters
1734  */
1735 static const struct reg_sequence g12a_gp0_init_regs[] = {
1736 	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0x00000000 },
1737 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0x00000000 },
1738 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x48681c00 },
1739 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0x33771290 },
1740 	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x39272000 },
1741 	{ .reg = HHI_GP0_PLL_CNTL6,	.def = 0x56540000 },
1742 };
1743 
1744 static struct clk_regmap g12a_gp0_pll_dco = {
1745 	.data = &(struct meson_clk_pll_data){
1746 		.en = {
1747 			.reg_off = HHI_GP0_PLL_CNTL0,
1748 			.shift   = 28,
1749 			.width   = 1,
1750 		},
1751 		.m = {
1752 			.reg_off = HHI_GP0_PLL_CNTL0,
1753 			.shift   = 0,
1754 			.width   = 8,
1755 		},
1756 		.n = {
1757 			.reg_off = HHI_GP0_PLL_CNTL0,
1758 			.shift   = 10,
1759 			.width   = 5,
1760 		},
1761 		.frac = {
1762 			.reg_off = HHI_GP0_PLL_CNTL1,
1763 			.shift   = 0,
1764 			.width   = 17,
1765 		},
1766 		.l = {
1767 			.reg_off = HHI_GP0_PLL_CNTL0,
1768 			.shift   = 31,
1769 			.width   = 1,
1770 		},
1771 		.rst = {
1772 			.reg_off = HHI_GP0_PLL_CNTL0,
1773 			.shift   = 29,
1774 			.width   = 1,
1775 		},
1776 		.range = &g12a_gp0_pll_mult_range,
1777 		.init_regs = g12a_gp0_init_regs,
1778 		.init_count = ARRAY_SIZE(g12a_gp0_init_regs),
1779 	},
1780 	.hw.init = &(struct clk_init_data){
1781 		.name = "gp0_pll_dco",
1782 		.ops = &meson_clk_pll_ops,
1783 		.parent_data = &(const struct clk_parent_data) {
1784 			.fw_name = "xtal",
1785 		},
1786 		.num_parents = 1,
1787 	},
1788 };
1789 
1790 static struct clk_regmap g12a_gp0_pll = {
1791 	.data = &(struct clk_regmap_div_data){
1792 		.offset = HHI_GP0_PLL_CNTL0,
1793 		.shift = 16,
1794 		.width = 3,
1795 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1796 			  CLK_DIVIDER_ROUND_CLOSEST),
1797 	},
1798 	.hw.init = &(struct clk_init_data){
1799 		.name = "gp0_pll",
1800 		.ops = &clk_regmap_divider_ops,
1801 		.parent_hws = (const struct clk_hw *[]) {
1802 			&g12a_gp0_pll_dco.hw
1803 		},
1804 		.num_parents = 1,
1805 		.flags = CLK_SET_RATE_PARENT,
1806 	},
1807 };
1808 
1809 static struct clk_regmap sm1_gp1_pll_dco = {
1810 	.data = &(struct meson_clk_pll_data){
1811 		.en = {
1812 			.reg_off = HHI_GP1_PLL_CNTL0,
1813 			.shift   = 28,
1814 			.width   = 1,
1815 		},
1816 		.m = {
1817 			.reg_off = HHI_GP1_PLL_CNTL0,
1818 			.shift   = 0,
1819 			.width   = 8,
1820 		},
1821 		.n = {
1822 			.reg_off = HHI_GP1_PLL_CNTL0,
1823 			.shift   = 10,
1824 			.width   = 5,
1825 		},
1826 		.frac = {
1827 			.reg_off = HHI_GP1_PLL_CNTL1,
1828 			.shift   = 0,
1829 			.width   = 17,
1830 		},
1831 		.l = {
1832 			.reg_off = HHI_GP1_PLL_CNTL0,
1833 			.shift   = 31,
1834 			.width   = 1,
1835 		},
1836 		.rst = {
1837 			.reg_off = HHI_GP1_PLL_CNTL0,
1838 			.shift   = 29,
1839 			.width   = 1,
1840 		},
1841 	},
1842 	.hw.init = &(struct clk_init_data){
1843 		.name = "gp1_pll_dco",
1844 		.ops = &meson_clk_pll_ro_ops,
1845 		.parent_data = &(const struct clk_parent_data) {
1846 			.fw_name = "xtal",
1847 		},
1848 		.num_parents = 1,
1849 		/* This clock feeds the DSU, avoid disabling it */
1850 		.flags = CLK_IS_CRITICAL,
1851 	},
1852 };
1853 
1854 static struct clk_regmap sm1_gp1_pll = {
1855 	.data = &(struct clk_regmap_div_data){
1856 		.offset = HHI_GP1_PLL_CNTL0,
1857 		.shift = 16,
1858 		.width = 3,
1859 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1860 			  CLK_DIVIDER_ROUND_CLOSEST),
1861 	},
1862 	.hw.init = &(struct clk_init_data){
1863 		.name = "gp1_pll",
1864 		.ops = &clk_regmap_divider_ro_ops,
1865 		.parent_hws = (const struct clk_hw *[]) {
1866 			&sm1_gp1_pll_dco.hw
1867 		},
1868 		.num_parents = 1,
1869 	},
1870 };
1871 
1872 /*
1873  * Internal hifi pll emulation configuration parameters
1874  */
1875 static const struct reg_sequence g12a_hifi_init_regs[] = {
1876 	{ .reg = HHI_HIFI_PLL_CNTL1,	.def = 0x00000000 },
1877 	{ .reg = HHI_HIFI_PLL_CNTL2,	.def = 0x00000000 },
1878 	{ .reg = HHI_HIFI_PLL_CNTL3,	.def = 0x6a285c00 },
1879 	{ .reg = HHI_HIFI_PLL_CNTL4,	.def = 0x65771290 },
1880 	{ .reg = HHI_HIFI_PLL_CNTL5,	.def = 0x39272000 },
1881 	{ .reg = HHI_HIFI_PLL_CNTL6,	.def = 0x56540000 },
1882 };
1883 
1884 static struct clk_regmap g12a_hifi_pll_dco = {
1885 	.data = &(struct meson_clk_pll_data){
1886 		.en = {
1887 			.reg_off = HHI_HIFI_PLL_CNTL0,
1888 			.shift   = 28,
1889 			.width   = 1,
1890 		},
1891 		.m = {
1892 			.reg_off = HHI_HIFI_PLL_CNTL0,
1893 			.shift   = 0,
1894 			.width   = 8,
1895 		},
1896 		.n = {
1897 			.reg_off = HHI_HIFI_PLL_CNTL0,
1898 			.shift   = 10,
1899 			.width   = 5,
1900 		},
1901 		.frac = {
1902 			.reg_off = HHI_HIFI_PLL_CNTL1,
1903 			.shift   = 0,
1904 			.width   = 17,
1905 		},
1906 		.l = {
1907 			.reg_off = HHI_HIFI_PLL_CNTL0,
1908 			.shift   = 31,
1909 			.width   = 1,
1910 		},
1911 		.rst = {
1912 			.reg_off = HHI_HIFI_PLL_CNTL0,
1913 			.shift   = 29,
1914 			.width   = 1,
1915 		},
1916 		.range = &g12a_gp0_pll_mult_range,
1917 		.init_regs = g12a_hifi_init_regs,
1918 		.init_count = ARRAY_SIZE(g12a_hifi_init_regs),
1919 		.flags = CLK_MESON_PLL_ROUND_CLOSEST,
1920 	},
1921 	.hw.init = &(struct clk_init_data){
1922 		.name = "hifi_pll_dco",
1923 		.ops = &meson_clk_pll_ops,
1924 		.parent_data = &(const struct clk_parent_data) {
1925 			.fw_name = "xtal",
1926 		},
1927 		.num_parents = 1,
1928 	},
1929 };
1930 
1931 static struct clk_regmap g12a_hifi_pll = {
1932 	.data = &(struct clk_regmap_div_data){
1933 		.offset = HHI_HIFI_PLL_CNTL0,
1934 		.shift = 16,
1935 		.width = 2,
1936 		.flags = (CLK_DIVIDER_POWER_OF_TWO |
1937 			  CLK_DIVIDER_ROUND_CLOSEST),
1938 	},
1939 	.hw.init = &(struct clk_init_data){
1940 		.name = "hifi_pll",
1941 		.ops = &clk_regmap_divider_ops,
1942 		.parent_hws = (const struct clk_hw *[]) {
1943 			&g12a_hifi_pll_dco.hw
1944 		},
1945 		.num_parents = 1,
1946 		.flags = CLK_SET_RATE_PARENT,
1947 	},
1948 };
1949 
1950 /*
1951  * The Meson G12A PCIE PLL is fined tuned to deliver a very precise
1952  * 100MHz reference clock for the PCIe Analog PHY, and thus requires
1953  * a strict register sequence to enable the PLL.
1954  */
1955 static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
1956 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x20090496 },
1957 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x30090496 },
1958 	{ .reg = HHI_PCIE_PLL_CNTL1,	.def = 0x00000000 },
1959 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001100 },
1960 	{ .reg = HHI_PCIE_PLL_CNTL3,	.def = 0x10058e00 },
1961 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x000100c0 },
1962 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000048 },
1963 	{ .reg = HHI_PCIE_PLL_CNTL5,	.def = 0x68000068, .delay_us = 20 },
1964 	{ .reg = HHI_PCIE_PLL_CNTL4,	.def = 0x008100c0, .delay_us = 10 },
1965 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x34090496 },
1966 	{ .reg = HHI_PCIE_PLL_CNTL0,	.def = 0x14090496, .delay_us = 10 },
1967 	{ .reg = HHI_PCIE_PLL_CNTL2,	.def = 0x00001000 },
1968 };
1969 
1970 /* Keep a single entry table for recalc/round_rate() ops */
1971 static const struct pll_params_table g12a_pcie_pll_table[] = {
1972 	PLL_PARAMS(150, 1),
1973 	{0, 0},
1974 };
1975 
1976 static struct clk_regmap g12a_pcie_pll_dco = {
1977 	.data = &(struct meson_clk_pll_data){
1978 		.en = {
1979 			.reg_off = HHI_PCIE_PLL_CNTL0,
1980 			.shift   = 28,
1981 			.width   = 1,
1982 		},
1983 		.m = {
1984 			.reg_off = HHI_PCIE_PLL_CNTL0,
1985 			.shift   = 0,
1986 			.width   = 8,
1987 		},
1988 		.n = {
1989 			.reg_off = HHI_PCIE_PLL_CNTL0,
1990 			.shift   = 10,
1991 			.width   = 5,
1992 		},
1993 		.frac = {
1994 			.reg_off = HHI_PCIE_PLL_CNTL1,
1995 			.shift   = 0,
1996 			.width   = 12,
1997 		},
1998 		.l = {
1999 			.reg_off = HHI_PCIE_PLL_CNTL0,
2000 			.shift   = 31,
2001 			.width   = 1,
2002 		},
2003 		.rst = {
2004 			.reg_off = HHI_PCIE_PLL_CNTL0,
2005 			.shift   = 29,
2006 			.width   = 1,
2007 		},
2008 		.table = g12a_pcie_pll_table,
2009 		.init_regs = g12a_pcie_pll_init_regs,
2010 		.init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
2011 	},
2012 	.hw.init = &(struct clk_init_data){
2013 		.name = "pcie_pll_dco",
2014 		.ops = &meson_clk_pcie_pll_ops,
2015 		.parent_data = &(const struct clk_parent_data) {
2016 			.fw_name = "xtal",
2017 		},
2018 		.num_parents = 1,
2019 	},
2020 };
2021 
2022 static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
2023 	.mult = 1,
2024 	.div = 2,
2025 	.hw.init = &(struct clk_init_data){
2026 		.name = "pcie_pll_dco_div2",
2027 		.ops = &clk_fixed_factor_ops,
2028 		.parent_hws = (const struct clk_hw *[]) {
2029 			&g12a_pcie_pll_dco.hw
2030 		},
2031 		.num_parents = 1,
2032 		.flags = CLK_SET_RATE_PARENT,
2033 	},
2034 };
2035 
2036 static struct clk_regmap g12a_pcie_pll_od = {
2037 	.data = &(struct clk_regmap_div_data){
2038 		.offset = HHI_PCIE_PLL_CNTL0,
2039 		.shift = 16,
2040 		.width = 5,
2041 		.flags = CLK_DIVIDER_ROUND_CLOSEST |
2042 			 CLK_DIVIDER_ONE_BASED |
2043 			 CLK_DIVIDER_ALLOW_ZERO,
2044 	},
2045 	.hw.init = &(struct clk_init_data){
2046 		.name = "pcie_pll_od",
2047 		.ops = &clk_regmap_divider_ops,
2048 		.parent_hws = (const struct clk_hw *[]) {
2049 			&g12a_pcie_pll_dco_div2.hw
2050 		},
2051 		.num_parents = 1,
2052 		.flags = CLK_SET_RATE_PARENT,
2053 	},
2054 };
2055 
2056 static struct clk_fixed_factor g12a_pcie_pll = {
2057 	.mult = 1,
2058 	.div = 2,
2059 	.hw.init = &(struct clk_init_data){
2060 		.name = "pcie_pll_pll",
2061 		.ops = &clk_fixed_factor_ops,
2062 		.parent_hws = (const struct clk_hw *[]) {
2063 			&g12a_pcie_pll_od.hw
2064 		},
2065 		.num_parents = 1,
2066 		.flags = CLK_SET_RATE_PARENT,
2067 	},
2068 };
2069 
2070 static struct clk_regmap g12a_hdmi_pll_dco = {
2071 	.data = &(struct meson_clk_pll_data){
2072 		.en = {
2073 			.reg_off = HHI_HDMI_PLL_CNTL0,
2074 			.shift   = 28,
2075 			.width   = 1,
2076 		},
2077 		.m = {
2078 			.reg_off = HHI_HDMI_PLL_CNTL0,
2079 			.shift   = 0,
2080 			.width   = 8,
2081 		},
2082 		.n = {
2083 			.reg_off = HHI_HDMI_PLL_CNTL0,
2084 			.shift   = 10,
2085 			.width   = 5,
2086 		},
2087 		.frac = {
2088 			.reg_off = HHI_HDMI_PLL_CNTL1,
2089 			.shift   = 0,
2090 			.width   = 16,
2091 		},
2092 		.l = {
2093 			.reg_off = HHI_HDMI_PLL_CNTL0,
2094 			.shift   = 30,
2095 			.width   = 1,
2096 		},
2097 		.rst = {
2098 			.reg_off = HHI_HDMI_PLL_CNTL0,
2099 			.shift   = 29,
2100 			.width   = 1,
2101 		},
2102 	},
2103 	.hw.init = &(struct clk_init_data){
2104 		.name = "hdmi_pll_dco",
2105 		.ops = &meson_clk_pll_ro_ops,
2106 		.parent_data = &(const struct clk_parent_data) {
2107 			.fw_name = "xtal",
2108 		},
2109 		.num_parents = 1,
2110 		/*
2111 		 * Display directly handle hdmi pll registers ATM, we need
2112 		 * NOCACHE to keep our view of the clock as accurate as possible
2113 		 */
2114 		.flags = CLK_GET_RATE_NOCACHE,
2115 	},
2116 };
2117 
2118 static struct clk_regmap g12a_hdmi_pll_od = {
2119 	.data = &(struct clk_regmap_div_data){
2120 		.offset = HHI_HDMI_PLL_CNTL0,
2121 		.shift = 16,
2122 		.width = 2,
2123 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2124 	},
2125 	.hw.init = &(struct clk_init_data){
2126 		.name = "hdmi_pll_od",
2127 		.ops = &clk_regmap_divider_ro_ops,
2128 		.parent_hws = (const struct clk_hw *[]) {
2129 			&g12a_hdmi_pll_dco.hw
2130 		},
2131 		.num_parents = 1,
2132 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2133 	},
2134 };
2135 
2136 static struct clk_regmap g12a_hdmi_pll_od2 = {
2137 	.data = &(struct clk_regmap_div_data){
2138 		.offset = HHI_HDMI_PLL_CNTL0,
2139 		.shift = 18,
2140 		.width = 2,
2141 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2142 	},
2143 	.hw.init = &(struct clk_init_data){
2144 		.name = "hdmi_pll_od2",
2145 		.ops = &clk_regmap_divider_ro_ops,
2146 		.parent_hws = (const struct clk_hw *[]) {
2147 			&g12a_hdmi_pll_od.hw
2148 		},
2149 		.num_parents = 1,
2150 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2151 	},
2152 };
2153 
2154 static struct clk_regmap g12a_hdmi_pll = {
2155 	.data = &(struct clk_regmap_div_data){
2156 		.offset = HHI_HDMI_PLL_CNTL0,
2157 		.shift = 20,
2158 		.width = 2,
2159 		.flags = CLK_DIVIDER_POWER_OF_TWO,
2160 	},
2161 	.hw.init = &(struct clk_init_data){
2162 		.name = "hdmi_pll",
2163 		.ops = &clk_regmap_divider_ro_ops,
2164 		.parent_hws = (const struct clk_hw *[]) {
2165 			&g12a_hdmi_pll_od2.hw
2166 		},
2167 		.num_parents = 1,
2168 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2169 	},
2170 };
2171 
2172 static struct clk_fixed_factor g12a_fclk_div4_div = {
2173 	.mult = 1,
2174 	.div = 4,
2175 	.hw.init = &(struct clk_init_data){
2176 		.name = "fclk_div4_div",
2177 		.ops = &clk_fixed_factor_ops,
2178 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2179 		.num_parents = 1,
2180 	},
2181 };
2182 
2183 static struct clk_regmap g12a_fclk_div4 = {
2184 	.data = &(struct clk_regmap_gate_data){
2185 		.offset = HHI_FIX_PLL_CNTL1,
2186 		.bit_idx = 21,
2187 	},
2188 	.hw.init = &(struct clk_init_data){
2189 		.name = "fclk_div4",
2190 		.ops = &clk_regmap_gate_ops,
2191 		.parent_hws = (const struct clk_hw *[]) {
2192 			&g12a_fclk_div4_div.hw
2193 		},
2194 		.num_parents = 1,
2195 	},
2196 };
2197 
2198 static struct clk_fixed_factor g12a_fclk_div5_div = {
2199 	.mult = 1,
2200 	.div = 5,
2201 	.hw.init = &(struct clk_init_data){
2202 		.name = "fclk_div5_div",
2203 		.ops = &clk_fixed_factor_ops,
2204 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2205 		.num_parents = 1,
2206 	},
2207 };
2208 
2209 static struct clk_regmap g12a_fclk_div5 = {
2210 	.data = &(struct clk_regmap_gate_data){
2211 		.offset = HHI_FIX_PLL_CNTL1,
2212 		.bit_idx = 22,
2213 	},
2214 	.hw.init = &(struct clk_init_data){
2215 		.name = "fclk_div5",
2216 		.ops = &clk_regmap_gate_ops,
2217 		.parent_hws = (const struct clk_hw *[]) {
2218 			&g12a_fclk_div5_div.hw
2219 		},
2220 		.num_parents = 1,
2221 	},
2222 };
2223 
2224 static struct clk_fixed_factor g12a_fclk_div7_div = {
2225 	.mult = 1,
2226 	.div = 7,
2227 	.hw.init = &(struct clk_init_data){
2228 		.name = "fclk_div7_div",
2229 		.ops = &clk_fixed_factor_ops,
2230 		.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
2231 		.num_parents = 1,
2232 	},
2233 };
2234 
2235 static struct clk_regmap g12a_fclk_div7 = {
2236 	.data = &(struct clk_regmap_gate_data){
2237 		.offset = HHI_FIX_PLL_CNTL1,
2238 		.bit_idx = 23,
2239 	},
2240 	.hw.init = &(struct clk_init_data){
2241 		.name = "fclk_div7",
2242 		.ops = &clk_regmap_gate_ops,
2243 		.parent_hws = (const struct clk_hw *[]) {
2244 			&g12a_fclk_div7_div.hw
2245 		},
2246 		.num_parents = 1,
2247 	},
2248 };
2249 
2250 static struct clk_fixed_factor g12a_fclk_div2p5_div = {
2251 	.mult = 1,
2252 	.div = 5,
2253 	.hw.init = &(struct clk_init_data){
2254 		.name = "fclk_div2p5_div",
2255 		.ops = &clk_fixed_factor_ops,
2256 		.parent_hws = (const struct clk_hw *[]) {
2257 			&g12a_fixed_pll_dco.hw
2258 		},
2259 		.num_parents = 1,
2260 	},
2261 };
2262 
2263 static struct clk_regmap g12a_fclk_div2p5 = {
2264 	.data = &(struct clk_regmap_gate_data){
2265 		.offset = HHI_FIX_PLL_CNTL1,
2266 		.bit_idx = 25,
2267 	},
2268 	.hw.init = &(struct clk_init_data){
2269 		.name = "fclk_div2p5",
2270 		.ops = &clk_regmap_gate_ops,
2271 		.parent_hws = (const struct clk_hw *[]) {
2272 			&g12a_fclk_div2p5_div.hw
2273 		},
2274 		.num_parents = 1,
2275 	},
2276 };
2277 
2278 static struct clk_fixed_factor g12a_mpll_50m_div = {
2279 	.mult = 1,
2280 	.div = 80,
2281 	.hw.init = &(struct clk_init_data){
2282 		.name = "mpll_50m_div",
2283 		.ops = &clk_fixed_factor_ops,
2284 		.parent_hws = (const struct clk_hw *[]) {
2285 			&g12a_fixed_pll_dco.hw
2286 		},
2287 		.num_parents = 1,
2288 	},
2289 };
2290 
2291 static struct clk_regmap g12a_mpll_50m = {
2292 	.data = &(struct clk_regmap_mux_data){
2293 		.offset = HHI_FIX_PLL_CNTL3,
2294 		.mask = 0x1,
2295 		.shift = 5,
2296 	},
2297 	.hw.init = &(struct clk_init_data){
2298 		.name = "mpll_50m",
2299 		.ops = &clk_regmap_mux_ro_ops,
2300 		.parent_data = (const struct clk_parent_data []) {
2301 			{ .fw_name = "xtal", },
2302 			{ .hw = &g12a_mpll_50m_div.hw },
2303 		},
2304 		.num_parents = 2,
2305 	},
2306 };
2307 
2308 static struct clk_fixed_factor g12a_mpll_prediv = {
2309 	.mult = 1,
2310 	.div = 2,
2311 	.hw.init = &(struct clk_init_data){
2312 		.name = "mpll_prediv",
2313 		.ops = &clk_fixed_factor_ops,
2314 		.parent_hws = (const struct clk_hw *[]) {
2315 			&g12a_fixed_pll_dco.hw
2316 		},
2317 		.num_parents = 1,
2318 	},
2319 };
2320 
2321 static const struct reg_sequence g12a_mpll0_init_regs[] = {
2322 	{ .reg = HHI_MPLL_CNTL2,	.def = 0x40000033 },
2323 };
2324 
2325 static struct clk_regmap g12a_mpll0_div = {
2326 	.data = &(struct meson_clk_mpll_data){
2327 		.sdm = {
2328 			.reg_off = HHI_MPLL_CNTL1,
2329 			.shift   = 0,
2330 			.width   = 14,
2331 		},
2332 		.sdm_en = {
2333 			.reg_off = HHI_MPLL_CNTL1,
2334 			.shift   = 30,
2335 			.width	 = 1,
2336 		},
2337 		.n2 = {
2338 			.reg_off = HHI_MPLL_CNTL1,
2339 			.shift   = 20,
2340 			.width   = 9,
2341 		},
2342 		.ssen = {
2343 			.reg_off = HHI_MPLL_CNTL1,
2344 			.shift   = 29,
2345 			.width	 = 1,
2346 		},
2347 		.init_regs = g12a_mpll0_init_regs,
2348 		.init_count = ARRAY_SIZE(g12a_mpll0_init_regs),
2349 	},
2350 	.hw.init = &(struct clk_init_data){
2351 		.name = "mpll0_div",
2352 		.ops = &meson_clk_mpll_ops,
2353 		.parent_hws = (const struct clk_hw *[]) {
2354 			&g12a_mpll_prediv.hw
2355 		},
2356 		.num_parents = 1,
2357 	},
2358 };
2359 
2360 static struct clk_regmap g12a_mpll0 = {
2361 	.data = &(struct clk_regmap_gate_data){
2362 		.offset = HHI_MPLL_CNTL1,
2363 		.bit_idx = 31,
2364 	},
2365 	.hw.init = &(struct clk_init_data){
2366 		.name = "mpll0",
2367 		.ops = &clk_regmap_gate_ops,
2368 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw },
2369 		.num_parents = 1,
2370 		.flags = CLK_SET_RATE_PARENT,
2371 	},
2372 };
2373 
2374 static const struct reg_sequence g12a_mpll1_init_regs[] = {
2375 	{ .reg = HHI_MPLL_CNTL4,	.def = 0x40000033 },
2376 };
2377 
2378 static struct clk_regmap g12a_mpll1_div = {
2379 	.data = &(struct meson_clk_mpll_data){
2380 		.sdm = {
2381 			.reg_off = HHI_MPLL_CNTL3,
2382 			.shift   = 0,
2383 			.width   = 14,
2384 		},
2385 		.sdm_en = {
2386 			.reg_off = HHI_MPLL_CNTL3,
2387 			.shift   = 30,
2388 			.width	 = 1,
2389 		},
2390 		.n2 = {
2391 			.reg_off = HHI_MPLL_CNTL3,
2392 			.shift   = 20,
2393 			.width   = 9,
2394 		},
2395 		.ssen = {
2396 			.reg_off = HHI_MPLL_CNTL3,
2397 			.shift   = 29,
2398 			.width	 = 1,
2399 		},
2400 		.init_regs = g12a_mpll1_init_regs,
2401 		.init_count = ARRAY_SIZE(g12a_mpll1_init_regs),
2402 	},
2403 	.hw.init = &(struct clk_init_data){
2404 		.name = "mpll1_div",
2405 		.ops = &meson_clk_mpll_ops,
2406 		.parent_hws = (const struct clk_hw *[]) {
2407 			&g12a_mpll_prediv.hw
2408 		},
2409 		.num_parents = 1,
2410 	},
2411 };
2412 
2413 static struct clk_regmap g12a_mpll1 = {
2414 	.data = &(struct clk_regmap_gate_data){
2415 		.offset = HHI_MPLL_CNTL3,
2416 		.bit_idx = 31,
2417 	},
2418 	.hw.init = &(struct clk_init_data){
2419 		.name = "mpll1",
2420 		.ops = &clk_regmap_gate_ops,
2421 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw },
2422 		.num_parents = 1,
2423 		.flags = CLK_SET_RATE_PARENT,
2424 	},
2425 };
2426 
2427 static const struct reg_sequence g12a_mpll2_init_regs[] = {
2428 	{ .reg = HHI_MPLL_CNTL6,	.def = 0x40000033 },
2429 };
2430 
2431 static struct clk_regmap g12a_mpll2_div = {
2432 	.data = &(struct meson_clk_mpll_data){
2433 		.sdm = {
2434 			.reg_off = HHI_MPLL_CNTL5,
2435 			.shift   = 0,
2436 			.width   = 14,
2437 		},
2438 		.sdm_en = {
2439 			.reg_off = HHI_MPLL_CNTL5,
2440 			.shift   = 30,
2441 			.width	 = 1,
2442 		},
2443 		.n2 = {
2444 			.reg_off = HHI_MPLL_CNTL5,
2445 			.shift   = 20,
2446 			.width   = 9,
2447 		},
2448 		.ssen = {
2449 			.reg_off = HHI_MPLL_CNTL5,
2450 			.shift   = 29,
2451 			.width	 = 1,
2452 		},
2453 		.init_regs = g12a_mpll2_init_regs,
2454 		.init_count = ARRAY_SIZE(g12a_mpll2_init_regs),
2455 	},
2456 	.hw.init = &(struct clk_init_data){
2457 		.name = "mpll2_div",
2458 		.ops = &meson_clk_mpll_ops,
2459 		.parent_hws = (const struct clk_hw *[]) {
2460 			&g12a_mpll_prediv.hw
2461 		},
2462 		.num_parents = 1,
2463 	},
2464 };
2465 
2466 static struct clk_regmap g12a_mpll2 = {
2467 	.data = &(struct clk_regmap_gate_data){
2468 		.offset = HHI_MPLL_CNTL5,
2469 		.bit_idx = 31,
2470 	},
2471 	.hw.init = &(struct clk_init_data){
2472 		.name = "mpll2",
2473 		.ops = &clk_regmap_gate_ops,
2474 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw },
2475 		.num_parents = 1,
2476 		.flags = CLK_SET_RATE_PARENT,
2477 	},
2478 };
2479 
2480 static const struct reg_sequence g12a_mpll3_init_regs[] = {
2481 	{ .reg = HHI_MPLL_CNTL8,	.def = 0x40000033 },
2482 };
2483 
2484 static struct clk_regmap g12a_mpll3_div = {
2485 	.data = &(struct meson_clk_mpll_data){
2486 		.sdm = {
2487 			.reg_off = HHI_MPLL_CNTL7,
2488 			.shift   = 0,
2489 			.width   = 14,
2490 		},
2491 		.sdm_en = {
2492 			.reg_off = HHI_MPLL_CNTL7,
2493 			.shift   = 30,
2494 			.width	 = 1,
2495 		},
2496 		.n2 = {
2497 			.reg_off = HHI_MPLL_CNTL7,
2498 			.shift   = 20,
2499 			.width   = 9,
2500 		},
2501 		.ssen = {
2502 			.reg_off = HHI_MPLL_CNTL7,
2503 			.shift   = 29,
2504 			.width	 = 1,
2505 		},
2506 		.init_regs = g12a_mpll3_init_regs,
2507 		.init_count = ARRAY_SIZE(g12a_mpll3_init_regs),
2508 	},
2509 	.hw.init = &(struct clk_init_data){
2510 		.name = "mpll3_div",
2511 		.ops = &meson_clk_mpll_ops,
2512 		.parent_hws = (const struct clk_hw *[]) {
2513 			&g12a_mpll_prediv.hw
2514 		},
2515 		.num_parents = 1,
2516 	},
2517 };
2518 
2519 static struct clk_regmap g12a_mpll3 = {
2520 	.data = &(struct clk_regmap_gate_data){
2521 		.offset = HHI_MPLL_CNTL7,
2522 		.bit_idx = 31,
2523 	},
2524 	.hw.init = &(struct clk_init_data){
2525 		.name = "mpll3",
2526 		.ops = &clk_regmap_gate_ops,
2527 		.parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw },
2528 		.num_parents = 1,
2529 		.flags = CLK_SET_RATE_PARENT,
2530 	},
2531 };
2532 
2533 static u32 mux_table_clk81[]	= { 0, 2, 3, 4, 5, 6, 7 };
2534 static const struct clk_parent_data clk81_parent_data[] = {
2535 	{ .fw_name = "xtal", },
2536 	{ .hw = &g12a_fclk_div7.hw },
2537 	{ .hw = &g12a_mpll1.hw },
2538 	{ .hw = &g12a_mpll2.hw },
2539 	{ .hw = &g12a_fclk_div4.hw },
2540 	{ .hw = &g12a_fclk_div3.hw },
2541 	{ .hw = &g12a_fclk_div5.hw },
2542 };
2543 
2544 static struct clk_regmap g12a_mpeg_clk_sel = {
2545 	.data = &(struct clk_regmap_mux_data){
2546 		.offset = HHI_MPEG_CLK_CNTL,
2547 		.mask = 0x7,
2548 		.shift = 12,
2549 		.table = mux_table_clk81,
2550 	},
2551 	.hw.init = &(struct clk_init_data){
2552 		.name = "mpeg_clk_sel",
2553 		.ops = &clk_regmap_mux_ro_ops,
2554 		.parent_data = clk81_parent_data,
2555 		.num_parents = ARRAY_SIZE(clk81_parent_data),
2556 	},
2557 };
2558 
2559 static struct clk_regmap g12a_mpeg_clk_div = {
2560 	.data = &(struct clk_regmap_div_data){
2561 		.offset = HHI_MPEG_CLK_CNTL,
2562 		.shift = 0,
2563 		.width = 7,
2564 	},
2565 	.hw.init = &(struct clk_init_data){
2566 		.name = "mpeg_clk_div",
2567 		.ops = &clk_regmap_divider_ops,
2568 		.parent_hws = (const struct clk_hw *[]) {
2569 			&g12a_mpeg_clk_sel.hw
2570 		},
2571 		.num_parents = 1,
2572 		.flags = CLK_SET_RATE_PARENT,
2573 	},
2574 };
2575 
2576 static struct clk_regmap g12a_clk81 = {
2577 	.data = &(struct clk_regmap_gate_data){
2578 		.offset = HHI_MPEG_CLK_CNTL,
2579 		.bit_idx = 7,
2580 	},
2581 	.hw.init = &(struct clk_init_data){
2582 		.name = "clk81",
2583 		.ops = &clk_regmap_gate_ops,
2584 		.parent_hws = (const struct clk_hw *[]) {
2585 			&g12a_mpeg_clk_div.hw
2586 		},
2587 		.num_parents = 1,
2588 		.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
2589 	},
2590 };
2591 
2592 static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = {
2593 	{ .fw_name = "xtal", },
2594 	{ .hw = &g12a_fclk_div2.hw },
2595 	{ .hw = &g12a_fclk_div3.hw },
2596 	{ .hw = &g12a_fclk_div5.hw },
2597 	{ .hw = &g12a_fclk_div7.hw },
2598 	/*
2599 	 * Following these parent clocks, we should also have had mpll2, mpll3
2600 	 * and gp0_pll but these clocks are too precious to be used here. All
2601 	 * the necessary rates for MMC and NAND operation can be achieved using
2602 	 * g12a_ee_core or fclk_div clocks
2603 	 */
2604 };
2605 
2606 /* SDIO clock */
2607 static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
2608 	.data = &(struct clk_regmap_mux_data){
2609 		.offset = HHI_SD_EMMC_CLK_CNTL,
2610 		.mask = 0x7,
2611 		.shift = 9,
2612 	},
2613 	.hw.init = &(struct clk_init_data) {
2614 		.name = "sd_emmc_a_clk0_sel",
2615 		.ops = &clk_regmap_mux_ops,
2616 		.parent_data = g12a_sd_emmc_clk0_parent_data,
2617 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2618 		.flags = CLK_SET_RATE_PARENT,
2619 	},
2620 };
2621 
2622 static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
2623 	.data = &(struct clk_regmap_div_data){
2624 		.offset = HHI_SD_EMMC_CLK_CNTL,
2625 		.shift = 0,
2626 		.width = 7,
2627 	},
2628 	.hw.init = &(struct clk_init_data) {
2629 		.name = "sd_emmc_a_clk0_div",
2630 		.ops = &clk_regmap_divider_ops,
2631 		.parent_hws = (const struct clk_hw *[]) {
2632 			&g12a_sd_emmc_a_clk0_sel.hw
2633 		},
2634 		.num_parents = 1,
2635 		.flags = CLK_SET_RATE_PARENT,
2636 	},
2637 };
2638 
2639 static struct clk_regmap g12a_sd_emmc_a_clk0 = {
2640 	.data = &(struct clk_regmap_gate_data){
2641 		.offset = HHI_SD_EMMC_CLK_CNTL,
2642 		.bit_idx = 7,
2643 	},
2644 	.hw.init = &(struct clk_init_data){
2645 		.name = "sd_emmc_a_clk0",
2646 		.ops = &clk_regmap_gate_ops,
2647 		.parent_hws = (const struct clk_hw *[]) {
2648 			&g12a_sd_emmc_a_clk0_div.hw
2649 		},
2650 		.num_parents = 1,
2651 		.flags = CLK_SET_RATE_PARENT,
2652 	},
2653 };
2654 
2655 /* SDcard clock */
2656 static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
2657 	.data = &(struct clk_regmap_mux_data){
2658 		.offset = HHI_SD_EMMC_CLK_CNTL,
2659 		.mask = 0x7,
2660 		.shift = 25,
2661 	},
2662 	.hw.init = &(struct clk_init_data) {
2663 		.name = "sd_emmc_b_clk0_sel",
2664 		.ops = &clk_regmap_mux_ops,
2665 		.parent_data = g12a_sd_emmc_clk0_parent_data,
2666 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2667 		.flags = CLK_SET_RATE_PARENT,
2668 	},
2669 };
2670 
2671 static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
2672 	.data = &(struct clk_regmap_div_data){
2673 		.offset = HHI_SD_EMMC_CLK_CNTL,
2674 		.shift = 16,
2675 		.width = 7,
2676 	},
2677 	.hw.init = &(struct clk_init_data) {
2678 		.name = "sd_emmc_b_clk0_div",
2679 		.ops = &clk_regmap_divider_ops,
2680 		.parent_hws = (const struct clk_hw *[]) {
2681 			&g12a_sd_emmc_b_clk0_sel.hw
2682 		},
2683 		.num_parents = 1,
2684 		.flags = CLK_SET_RATE_PARENT,
2685 	},
2686 };
2687 
2688 static struct clk_regmap g12a_sd_emmc_b_clk0 = {
2689 	.data = &(struct clk_regmap_gate_data){
2690 		.offset = HHI_SD_EMMC_CLK_CNTL,
2691 		.bit_idx = 23,
2692 	},
2693 	.hw.init = &(struct clk_init_data){
2694 		.name = "sd_emmc_b_clk0",
2695 		.ops = &clk_regmap_gate_ops,
2696 		.parent_hws = (const struct clk_hw *[]) {
2697 			&g12a_sd_emmc_b_clk0_div.hw
2698 		},
2699 		.num_parents = 1,
2700 		.flags = CLK_SET_RATE_PARENT,
2701 	},
2702 };
2703 
2704 /* EMMC/NAND clock */
2705 static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
2706 	.data = &(struct clk_regmap_mux_data){
2707 		.offset = HHI_NAND_CLK_CNTL,
2708 		.mask = 0x7,
2709 		.shift = 9,
2710 	},
2711 	.hw.init = &(struct clk_init_data) {
2712 		.name = "sd_emmc_c_clk0_sel",
2713 		.ops = &clk_regmap_mux_ops,
2714 		.parent_data = g12a_sd_emmc_clk0_parent_data,
2715 		.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
2716 		.flags = CLK_SET_RATE_PARENT,
2717 	},
2718 };
2719 
2720 static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
2721 	.data = &(struct clk_regmap_div_data){
2722 		.offset = HHI_NAND_CLK_CNTL,
2723 		.shift = 0,
2724 		.width = 7,
2725 	},
2726 	.hw.init = &(struct clk_init_data) {
2727 		.name = "sd_emmc_c_clk0_div",
2728 		.ops = &clk_regmap_divider_ops,
2729 		.parent_hws = (const struct clk_hw *[]) {
2730 			&g12a_sd_emmc_c_clk0_sel.hw
2731 		},
2732 		.num_parents = 1,
2733 		.flags = CLK_SET_RATE_PARENT,
2734 	},
2735 };
2736 
2737 static struct clk_regmap g12a_sd_emmc_c_clk0 = {
2738 	.data = &(struct clk_regmap_gate_data){
2739 		.offset = HHI_NAND_CLK_CNTL,
2740 		.bit_idx = 7,
2741 	},
2742 	.hw.init = &(struct clk_init_data){
2743 		.name = "sd_emmc_c_clk0",
2744 		.ops = &clk_regmap_gate_ops,
2745 		.parent_hws = (const struct clk_hw *[]) {
2746 			&g12a_sd_emmc_c_clk0_div.hw
2747 		},
2748 		.num_parents = 1,
2749 		.flags = CLK_SET_RATE_PARENT,
2750 	},
2751 };
2752 
2753 /* Video Clocks */
2754 
2755 static struct clk_regmap g12a_vid_pll_div = {
2756 	.data = &(struct meson_vid_pll_div_data){
2757 		.val = {
2758 			.reg_off = HHI_VID_PLL_CLK_DIV,
2759 			.shift   = 0,
2760 			.width   = 15,
2761 		},
2762 		.sel = {
2763 			.reg_off = HHI_VID_PLL_CLK_DIV,
2764 			.shift   = 16,
2765 			.width   = 2,
2766 		},
2767 	},
2768 	.hw.init = &(struct clk_init_data) {
2769 		.name = "vid_pll_div",
2770 		.ops = &meson_vid_pll_div_ro_ops,
2771 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw },
2772 		.num_parents = 1,
2773 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2774 	},
2775 };
2776 
2777 static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
2778 	&g12a_vid_pll_div.hw,
2779 	&g12a_hdmi_pll.hw,
2780 };
2781 
2782 static struct clk_regmap g12a_vid_pll_sel = {
2783 	.data = &(struct clk_regmap_mux_data){
2784 		.offset = HHI_VID_PLL_CLK_DIV,
2785 		.mask = 0x1,
2786 		.shift = 18,
2787 	},
2788 	.hw.init = &(struct clk_init_data){
2789 		.name = "vid_pll_sel",
2790 		.ops = &clk_regmap_mux_ops,
2791 		/*
2792 		 * bit 18 selects from 2 possible parents:
2793 		 * vid_pll_div or hdmi_pll
2794 		 */
2795 		.parent_hws = g12a_vid_pll_parent_hws,
2796 		.num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws),
2797 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2798 	},
2799 };
2800 
2801 static struct clk_regmap g12a_vid_pll = {
2802 	.data = &(struct clk_regmap_gate_data){
2803 		.offset = HHI_VID_PLL_CLK_DIV,
2804 		.bit_idx = 19,
2805 	},
2806 	.hw.init = &(struct clk_init_data) {
2807 		.name = "vid_pll",
2808 		.ops = &clk_regmap_gate_ops,
2809 		.parent_hws = (const struct clk_hw *[]) {
2810 			&g12a_vid_pll_sel.hw
2811 		},
2812 		.num_parents = 1,
2813 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2814 	},
2815 };
2816 
2817 /* VPU Clock */
2818 
2819 static const struct clk_hw *g12a_vpu_parent_hws[] = {
2820 	&g12a_fclk_div3.hw,
2821 	&g12a_fclk_div4.hw,
2822 	&g12a_fclk_div5.hw,
2823 	&g12a_fclk_div7.hw,
2824 	&g12a_mpll1.hw,
2825 	&g12a_vid_pll.hw,
2826 	&g12a_hifi_pll.hw,
2827 	&g12a_gp0_pll.hw,
2828 };
2829 
2830 static struct clk_regmap g12a_vpu_0_sel = {
2831 	.data = &(struct clk_regmap_mux_data){
2832 		.offset = HHI_VPU_CLK_CNTL,
2833 		.mask = 0x7,
2834 		.shift = 9,
2835 	},
2836 	.hw.init = &(struct clk_init_data){
2837 		.name = "vpu_0_sel",
2838 		.ops = &clk_regmap_mux_ops,
2839 		.parent_hws = g12a_vpu_parent_hws,
2840 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
2841 		.flags = CLK_SET_RATE_NO_REPARENT,
2842 	},
2843 };
2844 
2845 static struct clk_regmap g12a_vpu_0_div = {
2846 	.data = &(struct clk_regmap_div_data){
2847 		.offset = HHI_VPU_CLK_CNTL,
2848 		.shift = 0,
2849 		.width = 7,
2850 	},
2851 	.hw.init = &(struct clk_init_data){
2852 		.name = "vpu_0_div",
2853 		.ops = &clk_regmap_divider_ops,
2854 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw },
2855 		.num_parents = 1,
2856 		.flags = CLK_SET_RATE_PARENT,
2857 	},
2858 };
2859 
2860 static struct clk_regmap g12a_vpu_0 = {
2861 	.data = &(struct clk_regmap_gate_data){
2862 		.offset = HHI_VPU_CLK_CNTL,
2863 		.bit_idx = 8,
2864 	},
2865 	.hw.init = &(struct clk_init_data) {
2866 		.name = "vpu_0",
2867 		.ops = &clk_regmap_gate_ops,
2868 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw },
2869 		.num_parents = 1,
2870 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2871 	},
2872 };
2873 
2874 static struct clk_regmap g12a_vpu_1_sel = {
2875 	.data = &(struct clk_regmap_mux_data){
2876 		.offset = HHI_VPU_CLK_CNTL,
2877 		.mask = 0x7,
2878 		.shift = 25,
2879 	},
2880 	.hw.init = &(struct clk_init_data){
2881 		.name = "vpu_1_sel",
2882 		.ops = &clk_regmap_mux_ops,
2883 		.parent_hws = g12a_vpu_parent_hws,
2884 		.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
2885 		.flags = CLK_SET_RATE_NO_REPARENT,
2886 	},
2887 };
2888 
2889 static struct clk_regmap g12a_vpu_1_div = {
2890 	.data = &(struct clk_regmap_div_data){
2891 		.offset = HHI_VPU_CLK_CNTL,
2892 		.shift = 16,
2893 		.width = 7,
2894 	},
2895 	.hw.init = &(struct clk_init_data){
2896 		.name = "vpu_1_div",
2897 		.ops = &clk_regmap_divider_ops,
2898 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw },
2899 		.num_parents = 1,
2900 		.flags = CLK_SET_RATE_PARENT,
2901 	},
2902 };
2903 
2904 static struct clk_regmap g12a_vpu_1 = {
2905 	.data = &(struct clk_regmap_gate_data){
2906 		.offset = HHI_VPU_CLK_CNTL,
2907 		.bit_idx = 24,
2908 	},
2909 	.hw.init = &(struct clk_init_data) {
2910 		.name = "vpu_1",
2911 		.ops = &clk_regmap_gate_ops,
2912 		.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw },
2913 		.num_parents = 1,
2914 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2915 	},
2916 };
2917 
2918 static struct clk_regmap g12a_vpu = {
2919 	.data = &(struct clk_regmap_mux_data){
2920 		.offset = HHI_VPU_CLK_CNTL,
2921 		.mask = 1,
2922 		.shift = 31,
2923 	},
2924 	.hw.init = &(struct clk_init_data){
2925 		.name = "vpu",
2926 		.ops = &clk_regmap_mux_ops,
2927 		/*
2928 		 * bit 31 selects from 2 possible parents:
2929 		 * vpu_0 or vpu_1
2930 		 */
2931 		.parent_hws = (const struct clk_hw *[]) {
2932 			&g12a_vpu_0.hw,
2933 			&g12a_vpu_1.hw,
2934 		},
2935 		.num_parents = 2,
2936 		.flags = CLK_SET_RATE_NO_REPARENT,
2937 	},
2938 };
2939 
2940 /* VDEC clocks */
2941 
2942 static const struct clk_hw *g12a_vdec_parent_hws[] = {
2943 	&g12a_fclk_div2p5.hw,
2944 	&g12a_fclk_div3.hw,
2945 	&g12a_fclk_div4.hw,
2946 	&g12a_fclk_div5.hw,
2947 	&g12a_fclk_div7.hw,
2948 	&g12a_hifi_pll.hw,
2949 	&g12a_gp0_pll.hw,
2950 };
2951 
2952 static struct clk_regmap g12a_vdec_1_sel = {
2953 	.data = &(struct clk_regmap_mux_data){
2954 		.offset = HHI_VDEC_CLK_CNTL,
2955 		.mask = 0x7,
2956 		.shift = 9,
2957 		.flags = CLK_MUX_ROUND_CLOSEST,
2958 	},
2959 	.hw.init = &(struct clk_init_data){
2960 		.name = "vdec_1_sel",
2961 		.ops = &clk_regmap_mux_ops,
2962 		.parent_hws = g12a_vdec_parent_hws,
2963 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
2964 		.flags = CLK_SET_RATE_PARENT,
2965 	},
2966 };
2967 
2968 static struct clk_regmap g12a_vdec_1_div = {
2969 	.data = &(struct clk_regmap_div_data){
2970 		.offset = HHI_VDEC_CLK_CNTL,
2971 		.shift = 0,
2972 		.width = 7,
2973 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
2974 	},
2975 	.hw.init = &(struct clk_init_data){
2976 		.name = "vdec_1_div",
2977 		.ops = &clk_regmap_divider_ops,
2978 		.parent_hws = (const struct clk_hw *[]) {
2979 			&g12a_vdec_1_sel.hw
2980 		},
2981 		.num_parents = 1,
2982 		.flags = CLK_SET_RATE_PARENT,
2983 	},
2984 };
2985 
2986 static struct clk_regmap g12a_vdec_1 = {
2987 	.data = &(struct clk_regmap_gate_data){
2988 		.offset = HHI_VDEC_CLK_CNTL,
2989 		.bit_idx = 8,
2990 	},
2991 	.hw.init = &(struct clk_init_data) {
2992 		.name = "vdec_1",
2993 		.ops = &clk_regmap_gate_ops,
2994 		.parent_hws = (const struct clk_hw *[]) {
2995 			&g12a_vdec_1_div.hw
2996 		},
2997 		.num_parents = 1,
2998 		.flags = CLK_SET_RATE_PARENT,
2999 	},
3000 };
3001 
3002 static struct clk_regmap g12a_vdec_hevcf_sel = {
3003 	.data = &(struct clk_regmap_mux_data){
3004 		.offset = HHI_VDEC2_CLK_CNTL,
3005 		.mask = 0x7,
3006 		.shift = 9,
3007 		.flags = CLK_MUX_ROUND_CLOSEST,
3008 	},
3009 	.hw.init = &(struct clk_init_data){
3010 		.name = "vdec_hevcf_sel",
3011 		.ops = &clk_regmap_mux_ops,
3012 		.parent_hws = g12a_vdec_parent_hws,
3013 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
3014 		.flags = CLK_SET_RATE_PARENT,
3015 	},
3016 };
3017 
3018 static struct clk_regmap g12a_vdec_hevcf_div = {
3019 	.data = &(struct clk_regmap_div_data){
3020 		.offset = HHI_VDEC2_CLK_CNTL,
3021 		.shift = 0,
3022 		.width = 7,
3023 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
3024 	},
3025 	.hw.init = &(struct clk_init_data){
3026 		.name = "vdec_hevcf_div",
3027 		.ops = &clk_regmap_divider_ops,
3028 		.parent_hws = (const struct clk_hw *[]) {
3029 			&g12a_vdec_hevcf_sel.hw
3030 		},
3031 		.num_parents = 1,
3032 		.flags = CLK_SET_RATE_PARENT,
3033 	},
3034 };
3035 
3036 static struct clk_regmap g12a_vdec_hevcf = {
3037 	.data = &(struct clk_regmap_gate_data){
3038 		.offset = HHI_VDEC2_CLK_CNTL,
3039 		.bit_idx = 8,
3040 	},
3041 	.hw.init = &(struct clk_init_data) {
3042 		.name = "vdec_hevcf",
3043 		.ops = &clk_regmap_gate_ops,
3044 		.parent_hws = (const struct clk_hw *[]) {
3045 			&g12a_vdec_hevcf_div.hw
3046 		},
3047 		.num_parents = 1,
3048 		.flags = CLK_SET_RATE_PARENT,
3049 	},
3050 };
3051 
3052 static struct clk_regmap g12a_vdec_hevc_sel = {
3053 	.data = &(struct clk_regmap_mux_data){
3054 		.offset = HHI_VDEC2_CLK_CNTL,
3055 		.mask = 0x7,
3056 		.shift = 25,
3057 		.flags = CLK_MUX_ROUND_CLOSEST,
3058 	},
3059 	.hw.init = &(struct clk_init_data){
3060 		.name = "vdec_hevc_sel",
3061 		.ops = &clk_regmap_mux_ops,
3062 		.parent_hws = g12a_vdec_parent_hws,
3063 		.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
3064 		.flags = CLK_SET_RATE_PARENT,
3065 	},
3066 };
3067 
3068 static struct clk_regmap g12a_vdec_hevc_div = {
3069 	.data = &(struct clk_regmap_div_data){
3070 		.offset = HHI_VDEC2_CLK_CNTL,
3071 		.shift = 16,
3072 		.width = 7,
3073 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
3074 	},
3075 	.hw.init = &(struct clk_init_data){
3076 		.name = "vdec_hevc_div",
3077 		.ops = &clk_regmap_divider_ops,
3078 		.parent_hws = (const struct clk_hw *[]) {
3079 			&g12a_vdec_hevc_sel.hw
3080 		},
3081 		.num_parents = 1,
3082 		.flags = CLK_SET_RATE_PARENT,
3083 	},
3084 };
3085 
3086 static struct clk_regmap g12a_vdec_hevc = {
3087 	.data = &(struct clk_regmap_gate_data){
3088 		.offset = HHI_VDEC2_CLK_CNTL,
3089 		.bit_idx = 24,
3090 	},
3091 	.hw.init = &(struct clk_init_data) {
3092 		.name = "vdec_hevc",
3093 		.ops = &clk_regmap_gate_ops,
3094 		.parent_hws = (const struct clk_hw *[]) {
3095 			&g12a_vdec_hevc_div.hw
3096 		},
3097 		.num_parents = 1,
3098 		.flags = CLK_SET_RATE_PARENT,
3099 	},
3100 };
3101 
3102 /* VAPB Clock */
3103 
3104 static const struct clk_hw *g12a_vapb_parent_hws[] = {
3105 	&g12a_fclk_div4.hw,
3106 	&g12a_fclk_div3.hw,
3107 	&g12a_fclk_div5.hw,
3108 	&g12a_fclk_div7.hw,
3109 	&g12a_mpll1.hw,
3110 	&g12a_vid_pll.hw,
3111 	&g12a_mpll2.hw,
3112 	&g12a_fclk_div2p5.hw,
3113 };
3114 
3115 static struct clk_regmap g12a_vapb_0_sel = {
3116 	.data = &(struct clk_regmap_mux_data){
3117 		.offset = HHI_VAPBCLK_CNTL,
3118 		.mask = 0x3,
3119 		.shift = 9,
3120 	},
3121 	.hw.init = &(struct clk_init_data){
3122 		.name = "vapb_0_sel",
3123 		.ops = &clk_regmap_mux_ops,
3124 		.parent_hws = g12a_vapb_parent_hws,
3125 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
3126 		.flags = CLK_SET_RATE_NO_REPARENT,
3127 	},
3128 };
3129 
3130 static struct clk_regmap g12a_vapb_0_div = {
3131 	.data = &(struct clk_regmap_div_data){
3132 		.offset = HHI_VAPBCLK_CNTL,
3133 		.shift = 0,
3134 		.width = 7,
3135 	},
3136 	.hw.init = &(struct clk_init_data){
3137 		.name = "vapb_0_div",
3138 		.ops = &clk_regmap_divider_ops,
3139 		.parent_hws = (const struct clk_hw *[]) {
3140 			&g12a_vapb_0_sel.hw
3141 		},
3142 		.num_parents = 1,
3143 		.flags = CLK_SET_RATE_PARENT,
3144 	},
3145 };
3146 
3147 static struct clk_regmap g12a_vapb_0 = {
3148 	.data = &(struct clk_regmap_gate_data){
3149 		.offset = HHI_VAPBCLK_CNTL,
3150 		.bit_idx = 8,
3151 	},
3152 	.hw.init = &(struct clk_init_data) {
3153 		.name = "vapb_0",
3154 		.ops = &clk_regmap_gate_ops,
3155 		.parent_hws = (const struct clk_hw *[]) {
3156 			&g12a_vapb_0_div.hw
3157 		},
3158 		.num_parents = 1,
3159 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3160 	},
3161 };
3162 
3163 static struct clk_regmap g12a_vapb_1_sel = {
3164 	.data = &(struct clk_regmap_mux_data){
3165 		.offset = HHI_VAPBCLK_CNTL,
3166 		.mask = 0x3,
3167 		.shift = 25,
3168 	},
3169 	.hw.init = &(struct clk_init_data){
3170 		.name = "vapb_1_sel",
3171 		.ops = &clk_regmap_mux_ops,
3172 		.parent_hws = g12a_vapb_parent_hws,
3173 		.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
3174 		.flags = CLK_SET_RATE_NO_REPARENT,
3175 	},
3176 };
3177 
3178 static struct clk_regmap g12a_vapb_1_div = {
3179 	.data = &(struct clk_regmap_div_data){
3180 		.offset = HHI_VAPBCLK_CNTL,
3181 		.shift = 16,
3182 		.width = 7,
3183 	},
3184 	.hw.init = &(struct clk_init_data){
3185 		.name = "vapb_1_div",
3186 		.ops = &clk_regmap_divider_ops,
3187 		.parent_hws = (const struct clk_hw *[]) {
3188 			&g12a_vapb_1_sel.hw
3189 		},
3190 		.num_parents = 1,
3191 		.flags = CLK_SET_RATE_PARENT,
3192 	},
3193 };
3194 
3195 static struct clk_regmap g12a_vapb_1 = {
3196 	.data = &(struct clk_regmap_gate_data){
3197 		.offset = HHI_VAPBCLK_CNTL,
3198 		.bit_idx = 24,
3199 	},
3200 	.hw.init = &(struct clk_init_data) {
3201 		.name = "vapb_1",
3202 		.ops = &clk_regmap_gate_ops,
3203 		.parent_hws = (const struct clk_hw *[]) {
3204 			&g12a_vapb_1_div.hw
3205 		},
3206 		.num_parents = 1,
3207 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3208 	},
3209 };
3210 
3211 static struct clk_regmap g12a_vapb_sel = {
3212 	.data = &(struct clk_regmap_mux_data){
3213 		.offset = HHI_VAPBCLK_CNTL,
3214 		.mask = 1,
3215 		.shift = 31,
3216 	},
3217 	.hw.init = &(struct clk_init_data){
3218 		.name = "vapb_sel",
3219 		.ops = &clk_regmap_mux_ops,
3220 		/*
3221 		 * bit 31 selects from 2 possible parents:
3222 		 * vapb_0 or vapb_1
3223 		 */
3224 		.parent_hws = (const struct clk_hw *[]) {
3225 			&g12a_vapb_0.hw,
3226 			&g12a_vapb_1.hw,
3227 		},
3228 		.num_parents = 2,
3229 		.flags = CLK_SET_RATE_NO_REPARENT,
3230 	},
3231 };
3232 
3233 static struct clk_regmap g12a_vapb = {
3234 	.data = &(struct clk_regmap_gate_data){
3235 		.offset = HHI_VAPBCLK_CNTL,
3236 		.bit_idx = 30,
3237 	},
3238 	.hw.init = &(struct clk_init_data) {
3239 		.name = "vapb",
3240 		.ops = &clk_regmap_gate_ops,
3241 		.parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw },
3242 		.num_parents = 1,
3243 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3244 	},
3245 };
3246 
3247 static const struct clk_hw *g12a_vclk_parent_hws[] = {
3248 	&g12a_vid_pll.hw,
3249 	&g12a_gp0_pll.hw,
3250 	&g12a_hifi_pll.hw,
3251 	&g12a_mpll1.hw,
3252 	&g12a_fclk_div3.hw,
3253 	&g12a_fclk_div4.hw,
3254 	&g12a_fclk_div5.hw,
3255 	&g12a_fclk_div7.hw,
3256 };
3257 
3258 static struct clk_regmap g12a_vclk_sel = {
3259 	.data = &(struct clk_regmap_mux_data){
3260 		.offset = HHI_VID_CLK_CNTL,
3261 		.mask = 0x7,
3262 		.shift = 16,
3263 	},
3264 	.hw.init = &(struct clk_init_data){
3265 		.name = "vclk_sel",
3266 		.ops = &clk_regmap_mux_ops,
3267 		.parent_hws = g12a_vclk_parent_hws,
3268 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3269 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3270 	},
3271 };
3272 
3273 static struct clk_regmap g12a_vclk2_sel = {
3274 	.data = &(struct clk_regmap_mux_data){
3275 		.offset = HHI_VIID_CLK_CNTL,
3276 		.mask = 0x7,
3277 		.shift = 16,
3278 	},
3279 	.hw.init = &(struct clk_init_data){
3280 		.name = "vclk2_sel",
3281 		.ops = &clk_regmap_mux_ops,
3282 		.parent_hws = g12a_vclk_parent_hws,
3283 		.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
3284 		.flags = CLK_SET_RATE_NO_REPARENT,
3285 	},
3286 };
3287 
3288 static struct clk_regmap g12a_vclk_input = {
3289 	.data = &(struct clk_regmap_gate_data){
3290 		.offset = HHI_VID_CLK_DIV,
3291 		.bit_idx = 16,
3292 	},
3293 	.hw.init = &(struct clk_init_data) {
3294 		.name = "vclk_input",
3295 		.ops = &clk_regmap_gate_ops,
3296 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw },
3297 		.num_parents = 1,
3298 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3299 	},
3300 };
3301 
3302 static struct clk_regmap g12a_vclk2_input = {
3303 	.data = &(struct clk_regmap_gate_data){
3304 		.offset = HHI_VIID_CLK_DIV,
3305 		.bit_idx = 16,
3306 	},
3307 	.hw.init = &(struct clk_init_data) {
3308 		.name = "vclk2_input",
3309 		.ops = &clk_regmap_gate_ops,
3310 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw },
3311 		.num_parents = 1,
3312 	},
3313 };
3314 
3315 static struct clk_regmap g12a_vclk_div = {
3316 	.data = &(struct clk_regmap_div_data){
3317 		.offset = HHI_VID_CLK_DIV,
3318 		.shift = 0,
3319 		.width = 8,
3320 	},
3321 	.hw.init = &(struct clk_init_data){
3322 		.name = "vclk_div",
3323 		.ops = &clk_regmap_divider_ops,
3324 		.parent_hws = (const struct clk_hw *[]) {
3325 			&g12a_vclk_input.hw
3326 		},
3327 		.num_parents = 1,
3328 		.flags = CLK_GET_RATE_NOCACHE,
3329 	},
3330 };
3331 
3332 static struct clk_regmap g12a_vclk2_div = {
3333 	.data = &(struct meson_vclk_div_data){
3334 		.div = {
3335 			.reg_off = HHI_VIID_CLK_DIV,
3336 			.shift   = 0,
3337 			.width   = 8,
3338 		},
3339 		.enable = {
3340 			.reg_off = HHI_VIID_CLK_DIV,
3341 			.shift   = 16,
3342 			.width   = 1,
3343 		},
3344 		.reset = {
3345 			.reg_off = HHI_VIID_CLK_DIV,
3346 			.shift   = 17,
3347 			.width   = 1,
3348 		},
3349 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
3350 	},
3351 	.hw.init = &(struct clk_init_data){
3352 		.name = "vclk2_div",
3353 		.ops = &meson_vclk_div_ops,
3354 		.parent_hws = (const struct clk_hw *[]) {
3355 			&g12a_vclk2_input.hw
3356 		},
3357 		.num_parents = 1,
3358 		.flags = CLK_SET_RATE_GATE,
3359 	},
3360 };
3361 
3362 static struct clk_regmap g12a_vclk = {
3363 	.data = &(struct clk_regmap_gate_data){
3364 		.offset = HHI_VID_CLK_CNTL,
3365 		.bit_idx = 19,
3366 	},
3367 	.hw.init = &(struct clk_init_data) {
3368 		.name = "vclk",
3369 		.ops = &clk_regmap_gate_ops,
3370 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw },
3371 		.num_parents = 1,
3372 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3373 	},
3374 };
3375 
3376 static struct clk_regmap g12a_vclk2 = {
3377 	.data = &(struct meson_vclk_gate_data){
3378 		.enable = {
3379 			.reg_off = HHI_VIID_CLK_CNTL,
3380 			.shift   = 19,
3381 			.width   = 1,
3382 		},
3383 		.reset = {
3384 			.reg_off = HHI_VIID_CLK_CNTL,
3385 			.shift   = 15,
3386 			.width   = 1,
3387 		},
3388 	},
3389 	.hw.init = &(struct clk_init_data) {
3390 		.name = "vclk2",
3391 		.ops = &meson_vclk_gate_ops,
3392 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw },
3393 		.num_parents = 1,
3394 		.flags = CLK_SET_RATE_PARENT,
3395 	},
3396 };
3397 
3398 static struct clk_regmap g12a_vclk_div1 = {
3399 	.data = &(struct clk_regmap_gate_data){
3400 		.offset = HHI_VID_CLK_CNTL,
3401 		.bit_idx = 0,
3402 	},
3403 	.hw.init = &(struct clk_init_data) {
3404 		.name = "vclk_div1",
3405 		.ops = &clk_regmap_gate_ops,
3406 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3407 		.num_parents = 1,
3408 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3409 	},
3410 };
3411 
3412 static struct clk_regmap g12a_vclk_div2_en = {
3413 	.data = &(struct clk_regmap_gate_data){
3414 		.offset = HHI_VID_CLK_CNTL,
3415 		.bit_idx = 1,
3416 	},
3417 	.hw.init = &(struct clk_init_data) {
3418 		.name = "vclk_div2_en",
3419 		.ops = &clk_regmap_gate_ops,
3420 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3421 		.num_parents = 1,
3422 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3423 	},
3424 };
3425 
3426 static struct clk_regmap g12a_vclk_div4_en = {
3427 	.data = &(struct clk_regmap_gate_data){
3428 		.offset = HHI_VID_CLK_CNTL,
3429 		.bit_idx = 2,
3430 	},
3431 	.hw.init = &(struct clk_init_data) {
3432 		.name = "vclk_div4_en",
3433 		.ops = &clk_regmap_gate_ops,
3434 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3435 		.num_parents = 1,
3436 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3437 	},
3438 };
3439 
3440 static struct clk_regmap g12a_vclk_div6_en = {
3441 	.data = &(struct clk_regmap_gate_data){
3442 		.offset = HHI_VID_CLK_CNTL,
3443 		.bit_idx = 3,
3444 	},
3445 	.hw.init = &(struct clk_init_data) {
3446 		.name = "vclk_div6_en",
3447 		.ops = &clk_regmap_gate_ops,
3448 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3449 		.num_parents = 1,
3450 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3451 	},
3452 };
3453 
3454 static struct clk_regmap g12a_vclk_div12_en = {
3455 	.data = &(struct clk_regmap_gate_data){
3456 		.offset = HHI_VID_CLK_CNTL,
3457 		.bit_idx = 4,
3458 	},
3459 	.hw.init = &(struct clk_init_data) {
3460 		.name = "vclk_div12_en",
3461 		.ops = &clk_regmap_gate_ops,
3462 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
3463 		.num_parents = 1,
3464 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3465 	},
3466 };
3467 
3468 static struct clk_regmap g12a_vclk2_div1 = {
3469 	.data = &(struct clk_regmap_gate_data){
3470 		.offset = HHI_VIID_CLK_CNTL,
3471 		.bit_idx = 0,
3472 	},
3473 	.hw.init = &(struct clk_init_data) {
3474 		.name = "vclk2_div1",
3475 		.ops = &clk_regmap_gate_ops,
3476 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3477 		.num_parents = 1,
3478 		.flags = CLK_SET_RATE_PARENT,
3479 	},
3480 };
3481 
3482 static struct clk_regmap g12a_vclk2_div2_en = {
3483 	.data = &(struct clk_regmap_gate_data){
3484 		.offset = HHI_VIID_CLK_CNTL,
3485 		.bit_idx = 1,
3486 	},
3487 	.hw.init = &(struct clk_init_data) {
3488 		.name = "vclk2_div2_en",
3489 		.ops = &clk_regmap_gate_ops,
3490 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3491 		.num_parents = 1,
3492 		.flags = CLK_SET_RATE_PARENT,
3493 	},
3494 };
3495 
3496 static struct clk_regmap g12a_vclk2_div4_en = {
3497 	.data = &(struct clk_regmap_gate_data){
3498 		.offset = HHI_VIID_CLK_CNTL,
3499 		.bit_idx = 2,
3500 	},
3501 	.hw.init = &(struct clk_init_data) {
3502 		.name = "vclk2_div4_en",
3503 		.ops = &clk_regmap_gate_ops,
3504 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3505 		.num_parents = 1,
3506 		.flags = CLK_SET_RATE_PARENT,
3507 	},
3508 };
3509 
3510 static struct clk_regmap g12a_vclk2_div6_en = {
3511 	.data = &(struct clk_regmap_gate_data){
3512 		.offset = HHI_VIID_CLK_CNTL,
3513 		.bit_idx = 3,
3514 	},
3515 	.hw.init = &(struct clk_init_data) {
3516 		.name = "vclk2_div6_en",
3517 		.ops = &clk_regmap_gate_ops,
3518 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3519 		.num_parents = 1,
3520 		.flags = CLK_SET_RATE_PARENT,
3521 	},
3522 };
3523 
3524 static struct clk_regmap g12a_vclk2_div12_en = {
3525 	.data = &(struct clk_regmap_gate_data){
3526 		.offset = HHI_VIID_CLK_CNTL,
3527 		.bit_idx = 4,
3528 	},
3529 	.hw.init = &(struct clk_init_data) {
3530 		.name = "vclk2_div12_en",
3531 		.ops = &clk_regmap_gate_ops,
3532 		.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
3533 		.num_parents = 1,
3534 		.flags = CLK_SET_RATE_PARENT,
3535 	},
3536 };
3537 
3538 static struct clk_fixed_factor g12a_vclk_div2 = {
3539 	.mult = 1,
3540 	.div = 2,
3541 	.hw.init = &(struct clk_init_data){
3542 		.name = "vclk_div2",
3543 		.ops = &clk_fixed_factor_ops,
3544 		.parent_hws = (const struct clk_hw *[]) {
3545 			&g12a_vclk_div2_en.hw
3546 		},
3547 		.num_parents = 1,
3548 	},
3549 };
3550 
3551 static struct clk_fixed_factor g12a_vclk_div4 = {
3552 	.mult = 1,
3553 	.div = 4,
3554 	.hw.init = &(struct clk_init_data){
3555 		.name = "vclk_div4",
3556 		.ops = &clk_fixed_factor_ops,
3557 		.parent_hws = (const struct clk_hw *[]) {
3558 			&g12a_vclk_div4_en.hw
3559 		},
3560 		.num_parents = 1,
3561 	},
3562 };
3563 
3564 static struct clk_fixed_factor g12a_vclk_div6 = {
3565 	.mult = 1,
3566 	.div = 6,
3567 	.hw.init = &(struct clk_init_data){
3568 		.name = "vclk_div6",
3569 		.ops = &clk_fixed_factor_ops,
3570 		.parent_hws = (const struct clk_hw *[]) {
3571 			&g12a_vclk_div6_en.hw
3572 		},
3573 		.num_parents = 1,
3574 	},
3575 };
3576 
3577 static struct clk_fixed_factor g12a_vclk_div12 = {
3578 	.mult = 1,
3579 	.div = 12,
3580 	.hw.init = &(struct clk_init_data){
3581 		.name = "vclk_div12",
3582 		.ops = &clk_fixed_factor_ops,
3583 		.parent_hws = (const struct clk_hw *[]) {
3584 			&g12a_vclk_div12_en.hw
3585 		},
3586 		.num_parents = 1,
3587 	},
3588 };
3589 
3590 static struct clk_fixed_factor g12a_vclk2_div2 = {
3591 	.mult = 1,
3592 	.div = 2,
3593 	.hw.init = &(struct clk_init_data){
3594 		.name = "vclk2_div2",
3595 		.ops = &clk_fixed_factor_ops,
3596 		.parent_hws = (const struct clk_hw *[]) {
3597 			&g12a_vclk2_div2_en.hw
3598 		},
3599 		.num_parents = 1,
3600 		.flags = CLK_SET_RATE_PARENT,
3601 	},
3602 };
3603 
3604 static struct clk_fixed_factor g12a_vclk2_div4 = {
3605 	.mult = 1,
3606 	.div = 4,
3607 	.hw.init = &(struct clk_init_data){
3608 		.name = "vclk2_div4",
3609 		.ops = &clk_fixed_factor_ops,
3610 		.parent_hws = (const struct clk_hw *[]) {
3611 			&g12a_vclk2_div4_en.hw
3612 		},
3613 		.num_parents = 1,
3614 		.flags = CLK_SET_RATE_PARENT,
3615 	},
3616 };
3617 
3618 static struct clk_fixed_factor g12a_vclk2_div6 = {
3619 	.mult = 1,
3620 	.div = 6,
3621 	.hw.init = &(struct clk_init_data){
3622 		.name = "vclk2_div6",
3623 		.ops = &clk_fixed_factor_ops,
3624 		.parent_hws = (const struct clk_hw *[]) {
3625 			&g12a_vclk2_div6_en.hw
3626 		},
3627 		.num_parents = 1,
3628 		.flags = CLK_SET_RATE_PARENT,
3629 	},
3630 };
3631 
3632 static struct clk_fixed_factor g12a_vclk2_div12 = {
3633 	.mult = 1,
3634 	.div = 12,
3635 	.hw.init = &(struct clk_init_data){
3636 		.name = "vclk2_div12",
3637 		.ops = &clk_fixed_factor_ops,
3638 		.parent_hws = (const struct clk_hw *[]) {
3639 			&g12a_vclk2_div12_en.hw
3640 		},
3641 		.num_parents = 1,
3642 		.flags = CLK_SET_RATE_PARENT,
3643 	},
3644 };
3645 
3646 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3647 static const struct clk_hw *g12a_cts_parent_hws[] = {
3648 	&g12a_vclk_div1.hw,
3649 	&g12a_vclk_div2.hw,
3650 	&g12a_vclk_div4.hw,
3651 	&g12a_vclk_div6.hw,
3652 	&g12a_vclk_div12.hw,
3653 	&g12a_vclk2_div1.hw,
3654 	&g12a_vclk2_div2.hw,
3655 	&g12a_vclk2_div4.hw,
3656 	&g12a_vclk2_div6.hw,
3657 	&g12a_vclk2_div12.hw,
3658 };
3659 
3660 static struct clk_regmap g12a_cts_enci_sel = {
3661 	.data = &(struct clk_regmap_mux_data){
3662 		.offset = HHI_VID_CLK_DIV,
3663 		.mask = 0xf,
3664 		.shift = 28,
3665 		.table = mux_table_cts_sel,
3666 	},
3667 	.hw.init = &(struct clk_init_data){
3668 		.name = "cts_enci_sel",
3669 		.ops = &clk_regmap_mux_ops,
3670 		.parent_hws = g12a_cts_parent_hws,
3671 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3672 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3673 	},
3674 };
3675 
3676 static struct clk_regmap g12a_cts_encp_sel = {
3677 	.data = &(struct clk_regmap_mux_data){
3678 		.offset = HHI_VID_CLK_DIV,
3679 		.mask = 0xf,
3680 		.shift = 20,
3681 		.table = mux_table_cts_sel,
3682 	},
3683 	.hw.init = &(struct clk_init_data){
3684 		.name = "cts_encp_sel",
3685 		.ops = &clk_regmap_mux_ops,
3686 		.parent_hws = g12a_cts_parent_hws,
3687 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3688 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3689 	},
3690 };
3691 
3692 static struct clk_regmap g12a_cts_encl_sel = {
3693 	.data = &(struct clk_regmap_mux_data){
3694 		.offset = HHI_VIID_CLK_DIV,
3695 		.mask = 0xf,
3696 		.shift = 12,
3697 		.table = mux_table_cts_sel,
3698 	},
3699 	.hw.init = &(struct clk_init_data){
3700 		.name = "cts_encl_sel",
3701 		.ops = &clk_regmap_mux_ops,
3702 		.parent_hws = g12a_cts_parent_hws,
3703 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3704 		.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
3705 	},
3706 };
3707 
3708 static struct clk_regmap g12a_cts_vdac_sel = {
3709 	.data = &(struct clk_regmap_mux_data){
3710 		.offset = HHI_VIID_CLK_DIV,
3711 		.mask = 0xf,
3712 		.shift = 28,
3713 		.table = mux_table_cts_sel,
3714 	},
3715 	.hw.init = &(struct clk_init_data){
3716 		.name = "cts_vdac_sel",
3717 		.ops = &clk_regmap_mux_ops,
3718 		.parent_hws = g12a_cts_parent_hws,
3719 		.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
3720 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3721 	},
3722 };
3723 
3724 /* TOFIX: add support for cts_tcon */
3725 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
3726 static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = {
3727 	&g12a_vclk_div1.hw,
3728 	&g12a_vclk_div2.hw,
3729 	&g12a_vclk_div4.hw,
3730 	&g12a_vclk_div6.hw,
3731 	&g12a_vclk_div12.hw,
3732 	&g12a_vclk2_div1.hw,
3733 	&g12a_vclk2_div2.hw,
3734 	&g12a_vclk2_div4.hw,
3735 	&g12a_vclk2_div6.hw,
3736 	&g12a_vclk2_div12.hw,
3737 };
3738 
3739 static struct clk_regmap g12a_hdmi_tx_sel = {
3740 	.data = &(struct clk_regmap_mux_data){
3741 		.offset = HHI_HDMI_CLK_CNTL,
3742 		.mask = 0xf,
3743 		.shift = 16,
3744 		.table = mux_table_hdmi_tx_sel,
3745 	},
3746 	.hw.init = &(struct clk_init_data){
3747 		.name = "hdmi_tx_sel",
3748 		.ops = &clk_regmap_mux_ops,
3749 		.parent_hws = g12a_cts_hdmi_tx_parent_hws,
3750 		.num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws),
3751 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3752 	},
3753 };
3754 
3755 static struct clk_regmap g12a_cts_enci = {
3756 	.data = &(struct clk_regmap_gate_data){
3757 		.offset = HHI_VID_CLK_CNTL2,
3758 		.bit_idx = 0,
3759 	},
3760 	.hw.init = &(struct clk_init_data) {
3761 		.name = "cts_enci",
3762 		.ops = &clk_regmap_gate_ops,
3763 		.parent_hws = (const struct clk_hw *[]) {
3764 			&g12a_cts_enci_sel.hw
3765 		},
3766 		.num_parents = 1,
3767 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3768 	},
3769 };
3770 
3771 static struct clk_regmap g12a_cts_encp = {
3772 	.data = &(struct clk_regmap_gate_data){
3773 		.offset = HHI_VID_CLK_CNTL2,
3774 		.bit_idx = 2,
3775 	},
3776 	.hw.init = &(struct clk_init_data) {
3777 		.name = "cts_encp",
3778 		.ops = &clk_regmap_gate_ops,
3779 		.parent_hws = (const struct clk_hw *[]) {
3780 			&g12a_cts_encp_sel.hw
3781 		},
3782 		.num_parents = 1,
3783 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3784 	},
3785 };
3786 
3787 static struct clk_regmap g12a_cts_encl = {
3788 	.data = &(struct clk_regmap_gate_data){
3789 		.offset = HHI_VID_CLK_CNTL2,
3790 		.bit_idx = 3,
3791 	},
3792 	.hw.init = &(struct clk_init_data) {
3793 		.name = "cts_encl",
3794 		.ops = &clk_regmap_gate_ops,
3795 		.parent_hws = (const struct clk_hw *[]) {
3796 			&g12a_cts_encl_sel.hw
3797 		},
3798 		.num_parents = 1,
3799 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3800 	},
3801 };
3802 
3803 static struct clk_regmap g12a_cts_vdac = {
3804 	.data = &(struct clk_regmap_gate_data){
3805 		.offset = HHI_VID_CLK_CNTL2,
3806 		.bit_idx = 4,
3807 	},
3808 	.hw.init = &(struct clk_init_data) {
3809 		.name = "cts_vdac",
3810 		.ops = &clk_regmap_gate_ops,
3811 		.parent_hws = (const struct clk_hw *[]) {
3812 			&g12a_cts_vdac_sel.hw
3813 		},
3814 		.num_parents = 1,
3815 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3816 	},
3817 };
3818 
3819 static struct clk_regmap g12a_hdmi_tx = {
3820 	.data = &(struct clk_regmap_gate_data){
3821 		.offset = HHI_VID_CLK_CNTL2,
3822 		.bit_idx = 5,
3823 	},
3824 	.hw.init = &(struct clk_init_data) {
3825 		.name = "hdmi_tx",
3826 		.ops = &clk_regmap_gate_ops,
3827 		.parent_hws = (const struct clk_hw *[]) {
3828 			&g12a_hdmi_tx_sel.hw
3829 		},
3830 		.num_parents = 1,
3831 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
3832 	},
3833 };
3834 
3835 /* MIPI DSI Host Clocks */
3836 
3837 static const struct clk_hw *g12a_mipi_dsi_pxclk_parent_hws[] = {
3838 	&g12a_vid_pll.hw,
3839 	&g12a_gp0_pll.hw,
3840 	&g12a_hifi_pll.hw,
3841 	&g12a_mpll1.hw,
3842 	&g12a_fclk_div2.hw,
3843 	&g12a_fclk_div2p5.hw,
3844 	&g12a_fclk_div3.hw,
3845 	&g12a_fclk_div7.hw,
3846 };
3847 
3848 static struct clk_regmap g12a_mipi_dsi_pxclk_sel = {
3849 	.data = &(struct clk_regmap_mux_data){
3850 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
3851 		.mask = 0x7,
3852 		.shift = 12,
3853 		.flags = CLK_MUX_ROUND_CLOSEST,
3854 	},
3855 	.hw.init = &(struct clk_init_data){
3856 		.name = "mipi_dsi_pxclk_sel",
3857 		.ops = &clk_regmap_mux_ops,
3858 		.parent_hws = g12a_mipi_dsi_pxclk_parent_hws,
3859 		.num_parents = ARRAY_SIZE(g12a_mipi_dsi_pxclk_parent_hws),
3860 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
3861 	},
3862 };
3863 
3864 /*
3865  * FIXME: Force as bypass by forcing a single /1 table entry, and doesn't on boot value
3866  * when setting a clock with this node in the clock path, but doesn't guarantee the divider
3867  * is at /1 at boot until a rate is set.
3868  */
3869 static const struct clk_div_table g12a_mipi_dsi_pxclk_div_table[] = {
3870 	{ .val = 0, .div = 1 },
3871 	{ /* sentinel */ },
3872 };
3873 
3874 static struct clk_regmap g12a_mipi_dsi_pxclk_div = {
3875 	.data = &(struct clk_regmap_div_data){
3876 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
3877 		.shift = 0,
3878 		.width = 7,
3879 		.table = g12a_mipi_dsi_pxclk_div_table,
3880 	},
3881 	.hw.init = &(struct clk_init_data){
3882 		.name = "mipi_dsi_pxclk_div",
3883 		.ops = &clk_regmap_divider_ops,
3884 		.parent_hws = (const struct clk_hw *[]) {
3885 			&g12a_mipi_dsi_pxclk_sel.hw
3886 		},
3887 		.num_parents = 1,
3888 		.flags = CLK_SET_RATE_PARENT,
3889 	},
3890 };
3891 
3892 static struct clk_regmap g12a_mipi_dsi_pxclk = {
3893 	.data = &(struct clk_regmap_gate_data){
3894 		.offset = HHI_MIPIDSI_PHY_CLK_CNTL,
3895 		.bit_idx = 8,
3896 	},
3897 	.hw.init = &(struct clk_init_data) {
3898 		.name = "mipi_dsi_pxclk",
3899 		.ops = &clk_regmap_gate_ops,
3900 		.parent_hws = (const struct clk_hw *[]) {
3901 			&g12a_mipi_dsi_pxclk_div.hw
3902 		},
3903 		.num_parents = 1,
3904 		.flags = CLK_SET_RATE_PARENT,
3905 	},
3906 };
3907 
3908 /* MIPI ISP Clocks */
3909 
3910 static const struct clk_parent_data g12b_mipi_isp_parent_data[] = {
3911 	{ .fw_name = "xtal", },
3912 	{ .hw = &g12a_gp0_pll.hw },
3913 	{ .hw = &g12a_hifi_pll.hw },
3914 	{ .hw = &g12a_fclk_div2p5.hw },
3915 	{ .hw = &g12a_fclk_div3.hw },
3916 	{ .hw = &g12a_fclk_div4.hw },
3917 	{ .hw = &g12a_fclk_div5.hw },
3918 	{ .hw = &g12a_fclk_div7.hw },
3919 };
3920 
3921 static struct clk_regmap g12b_mipi_isp_sel = {
3922 	.data = &(struct clk_regmap_mux_data){
3923 		.offset = HHI_ISP_CLK_CNTL,
3924 		.mask = 7,
3925 		.shift = 9,
3926 	},
3927 	.hw.init = &(struct clk_init_data){
3928 		.name = "mipi_isp_sel",
3929 		.ops = &clk_regmap_mux_ops,
3930 		.parent_data = g12b_mipi_isp_parent_data,
3931 		.num_parents = ARRAY_SIZE(g12b_mipi_isp_parent_data),
3932 	},
3933 };
3934 
3935 static struct clk_regmap g12b_mipi_isp_div = {
3936 	.data = &(struct clk_regmap_div_data){
3937 		.offset = HHI_ISP_CLK_CNTL,
3938 		.shift = 0,
3939 		.width = 7,
3940 	},
3941 	.hw.init = &(struct clk_init_data){
3942 		.name = "mipi_isp_div",
3943 		.ops = &clk_regmap_divider_ops,
3944 		.parent_hws = (const struct clk_hw *[]) {
3945 			&g12b_mipi_isp_sel.hw
3946 		},
3947 		.num_parents = 1,
3948 		.flags = CLK_SET_RATE_PARENT,
3949 	},
3950 };
3951 
3952 static struct clk_regmap g12b_mipi_isp = {
3953 	.data = &(struct clk_regmap_gate_data){
3954 		.offset = HHI_ISP_CLK_CNTL,
3955 		.bit_idx = 8,
3956 	},
3957 	.hw.init = &(struct clk_init_data) {
3958 		.name = "mipi_isp",
3959 		.ops = &clk_regmap_gate_ops,
3960 		.parent_hws = (const struct clk_hw *[]) {
3961 			&g12b_mipi_isp_div.hw
3962 		},
3963 		.num_parents = 1,
3964 		.flags = CLK_SET_RATE_PARENT,
3965 	},
3966 };
3967 
3968 /* HDMI Clocks */
3969 
3970 static const struct clk_parent_data g12a_hdmi_parent_data[] = {
3971 	{ .fw_name = "xtal", },
3972 	{ .hw = &g12a_fclk_div4.hw },
3973 	{ .hw = &g12a_fclk_div3.hw },
3974 	{ .hw = &g12a_fclk_div5.hw },
3975 };
3976 
3977 static struct clk_regmap g12a_hdmi_sel = {
3978 	.data = &(struct clk_regmap_mux_data){
3979 		.offset = HHI_HDMI_CLK_CNTL,
3980 		.mask = 0x3,
3981 		.shift = 9,
3982 		.flags = CLK_MUX_ROUND_CLOSEST,
3983 	},
3984 	.hw.init = &(struct clk_init_data){
3985 		.name = "hdmi_sel",
3986 		.ops = &clk_regmap_mux_ops,
3987 		.parent_data = g12a_hdmi_parent_data,
3988 		.num_parents = ARRAY_SIZE(g12a_hdmi_parent_data),
3989 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
3990 	},
3991 };
3992 
3993 static struct clk_regmap g12a_hdmi_div = {
3994 	.data = &(struct clk_regmap_div_data){
3995 		.offset = HHI_HDMI_CLK_CNTL,
3996 		.shift = 0,
3997 		.width = 7,
3998 	},
3999 	.hw.init = &(struct clk_init_data){
4000 		.name = "hdmi_div",
4001 		.ops = &clk_regmap_divider_ops,
4002 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw },
4003 		.num_parents = 1,
4004 		.flags = CLK_GET_RATE_NOCACHE,
4005 	},
4006 };
4007 
4008 static struct clk_regmap g12a_hdmi = {
4009 	.data = &(struct clk_regmap_gate_data){
4010 		.offset = HHI_HDMI_CLK_CNTL,
4011 		.bit_idx = 8,
4012 	},
4013 	.hw.init = &(struct clk_init_data) {
4014 		.name = "hdmi",
4015 		.ops = &clk_regmap_gate_ops,
4016 		.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw },
4017 		.num_parents = 1,
4018 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
4019 	},
4020 };
4021 
4022 /*
4023  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
4024  * muxed by a glitch-free switch. The CCF can manage this glitch-free
4025  * mux because it does top-to-bottom updates the each clock tree and
4026  * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
4027  */
4028 static const struct clk_parent_data g12a_mali_0_1_parent_data[] = {
4029 	{ .fw_name = "xtal", },
4030 	{ .hw = &g12a_gp0_pll.hw },
4031 	{ .hw = &g12a_hifi_pll.hw },
4032 	{ .hw = &g12a_fclk_div2p5.hw },
4033 	{ .hw = &g12a_fclk_div3.hw },
4034 	{ .hw = &g12a_fclk_div4.hw },
4035 	{ .hw = &g12a_fclk_div5.hw },
4036 	{ .hw = &g12a_fclk_div7.hw },
4037 };
4038 
4039 static struct clk_regmap g12a_mali_0_sel = {
4040 	.data = &(struct clk_regmap_mux_data){
4041 		.offset = HHI_MALI_CLK_CNTL,
4042 		.mask = 0x7,
4043 		.shift = 9,
4044 	},
4045 	.hw.init = &(struct clk_init_data){
4046 		.name = "mali_0_sel",
4047 		.ops = &clk_regmap_mux_ops,
4048 		.parent_data = g12a_mali_0_1_parent_data,
4049 		.num_parents = 8,
4050 		/*
4051 		 * Don't request the parent to change the rate because
4052 		 * all GPU frequencies can be derived from the fclk_*
4053 		 * clocks and one special GP0_PLL setting. This is
4054 		 * important because we need the MPLL clocks for audio.
4055 		 */
4056 		.flags = 0,
4057 	},
4058 };
4059 
4060 static struct clk_regmap g12a_mali_0_div = {
4061 	.data = &(struct clk_regmap_div_data){
4062 		.offset = HHI_MALI_CLK_CNTL,
4063 		.shift = 0,
4064 		.width = 7,
4065 	},
4066 	.hw.init = &(struct clk_init_data){
4067 		.name = "mali_0_div",
4068 		.ops = &clk_regmap_divider_ops,
4069 		.parent_hws = (const struct clk_hw *[]) {
4070 			&g12a_mali_0_sel.hw
4071 		},
4072 		.num_parents = 1,
4073 		.flags = CLK_SET_RATE_PARENT,
4074 	},
4075 };
4076 
4077 static struct clk_regmap g12a_mali_0 = {
4078 	.data = &(struct clk_regmap_gate_data){
4079 		.offset = HHI_MALI_CLK_CNTL,
4080 		.bit_idx = 8,
4081 	},
4082 	.hw.init = &(struct clk_init_data){
4083 		.name = "mali_0",
4084 		.ops = &clk_regmap_gate_ops,
4085 		.parent_hws = (const struct clk_hw *[]) {
4086 			&g12a_mali_0_div.hw
4087 		},
4088 		.num_parents = 1,
4089 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
4090 	},
4091 };
4092 
4093 static struct clk_regmap g12a_mali_1_sel = {
4094 	.data = &(struct clk_regmap_mux_data){
4095 		.offset = HHI_MALI_CLK_CNTL,
4096 		.mask = 0x7,
4097 		.shift = 25,
4098 	},
4099 	.hw.init = &(struct clk_init_data){
4100 		.name = "mali_1_sel",
4101 		.ops = &clk_regmap_mux_ops,
4102 		.parent_data = g12a_mali_0_1_parent_data,
4103 		.num_parents = 8,
4104 		/*
4105 		 * Don't request the parent to change the rate because
4106 		 * all GPU frequencies can be derived from the fclk_*
4107 		 * clocks and one special GP0_PLL setting. This is
4108 		 * important because we need the MPLL clocks for audio.
4109 		 */
4110 		.flags = 0,
4111 	},
4112 };
4113 
4114 static struct clk_regmap g12a_mali_1_div = {
4115 	.data = &(struct clk_regmap_div_data){
4116 		.offset = HHI_MALI_CLK_CNTL,
4117 		.shift = 16,
4118 		.width = 7,
4119 	},
4120 	.hw.init = &(struct clk_init_data){
4121 		.name = "mali_1_div",
4122 		.ops = &clk_regmap_divider_ops,
4123 		.parent_hws = (const struct clk_hw *[]) {
4124 			&g12a_mali_1_sel.hw
4125 		},
4126 		.num_parents = 1,
4127 		.flags = CLK_SET_RATE_PARENT,
4128 	},
4129 };
4130 
4131 static struct clk_regmap g12a_mali_1 = {
4132 	.data = &(struct clk_regmap_gate_data){
4133 		.offset = HHI_MALI_CLK_CNTL,
4134 		.bit_idx = 24,
4135 	},
4136 	.hw.init = &(struct clk_init_data){
4137 		.name = "mali_1",
4138 		.ops = &clk_regmap_gate_ops,
4139 		.parent_hws = (const struct clk_hw *[]) {
4140 			&g12a_mali_1_div.hw
4141 		},
4142 		.num_parents = 1,
4143 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
4144 	},
4145 };
4146 
4147 static const struct clk_hw *g12a_mali_parent_hws[] = {
4148 	&g12a_mali_0.hw,
4149 	&g12a_mali_1.hw,
4150 };
4151 
4152 static struct clk_regmap g12a_mali = {
4153 	.data = &(struct clk_regmap_mux_data){
4154 		.offset = HHI_MALI_CLK_CNTL,
4155 		.mask = 1,
4156 		.shift = 31,
4157 	},
4158 	.hw.init = &(struct clk_init_data){
4159 		.name = "mali",
4160 		.ops = &clk_regmap_mux_ops,
4161 		.parent_hws = g12a_mali_parent_hws,
4162 		.num_parents = 2,
4163 		.flags = CLK_SET_RATE_PARENT,
4164 	},
4165 };
4166 
4167 static struct clk_regmap g12a_ts_div = {
4168 	.data = &(struct clk_regmap_div_data){
4169 		.offset = HHI_TS_CLK_CNTL,
4170 		.shift = 0,
4171 		.width = 8,
4172 	},
4173 	.hw.init = &(struct clk_init_data){
4174 		.name = "ts_div",
4175 		.ops = &clk_regmap_divider_ro_ops,
4176 		.parent_data = &(const struct clk_parent_data) {
4177 			.fw_name = "xtal",
4178 		},
4179 		.num_parents = 1,
4180 	},
4181 };
4182 
4183 static struct clk_regmap g12a_ts = {
4184 	.data = &(struct clk_regmap_gate_data){
4185 		.offset = HHI_TS_CLK_CNTL,
4186 		.bit_idx = 8,
4187 	},
4188 	.hw.init = &(struct clk_init_data){
4189 		.name = "ts",
4190 		.ops = &clk_regmap_gate_ops,
4191 		.parent_hws = (const struct clk_hw *[]) {
4192 			&g12a_ts_div.hw
4193 		},
4194 		.num_parents = 1,
4195 	},
4196 };
4197 
4198 /* SPICC SCLK source clock */
4199 
4200 static const struct clk_parent_data spicc_sclk_parent_data[] = {
4201 	{ .fw_name = "xtal", },
4202 	{ .hw = &g12a_clk81.hw },
4203 	{ .hw = &g12a_fclk_div4.hw },
4204 	{ .hw = &g12a_fclk_div3.hw },
4205 	{ .hw = &g12a_fclk_div2.hw },
4206 	{ .hw = &g12a_fclk_div5.hw },
4207 	{ .hw = &g12a_fclk_div7.hw },
4208 };
4209 
4210 static struct clk_regmap g12a_spicc0_sclk_sel = {
4211 	.data = &(struct clk_regmap_mux_data){
4212 		.offset = HHI_SPICC_CLK_CNTL,
4213 		.mask = 7,
4214 		.shift = 7,
4215 	},
4216 	.hw.init = &(struct clk_init_data){
4217 		.name = "spicc0_sclk_sel",
4218 		.ops = &clk_regmap_mux_ops,
4219 		.parent_data = spicc_sclk_parent_data,
4220 		.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
4221 	},
4222 };
4223 
4224 static struct clk_regmap g12a_spicc0_sclk_div = {
4225 	.data = &(struct clk_regmap_div_data){
4226 		.offset = HHI_SPICC_CLK_CNTL,
4227 		.shift = 0,
4228 		.width = 6,
4229 	},
4230 	.hw.init = &(struct clk_init_data){
4231 		.name = "spicc0_sclk_div",
4232 		.ops = &clk_regmap_divider_ops,
4233 		.parent_hws = (const struct clk_hw *[]) {
4234 			&g12a_spicc0_sclk_sel.hw
4235 		},
4236 		.num_parents = 1,
4237 		.flags = CLK_SET_RATE_PARENT,
4238 	},
4239 };
4240 
4241 static struct clk_regmap g12a_spicc0_sclk = {
4242 	.data = &(struct clk_regmap_gate_data){
4243 		.offset = HHI_SPICC_CLK_CNTL,
4244 		.bit_idx = 6,
4245 	},
4246 	.hw.init = &(struct clk_init_data){
4247 		.name = "spicc0_sclk",
4248 		.ops = &clk_regmap_gate_ops,
4249 		.parent_hws = (const struct clk_hw *[]) {
4250 			&g12a_spicc0_sclk_div.hw
4251 		},
4252 		.num_parents = 1,
4253 		.flags = CLK_SET_RATE_PARENT,
4254 	},
4255 };
4256 
4257 static struct clk_regmap g12a_spicc1_sclk_sel = {
4258 	.data = &(struct clk_regmap_mux_data){
4259 		.offset = HHI_SPICC_CLK_CNTL,
4260 		.mask = 7,
4261 		.shift = 23,
4262 	},
4263 	.hw.init = &(struct clk_init_data){
4264 		.name = "spicc1_sclk_sel",
4265 		.ops = &clk_regmap_mux_ops,
4266 		.parent_data = spicc_sclk_parent_data,
4267 		.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
4268 	},
4269 };
4270 
4271 static struct clk_regmap g12a_spicc1_sclk_div = {
4272 	.data = &(struct clk_regmap_div_data){
4273 		.offset = HHI_SPICC_CLK_CNTL,
4274 		.shift = 16,
4275 		.width = 6,
4276 	},
4277 	.hw.init = &(struct clk_init_data){
4278 		.name = "spicc1_sclk_div",
4279 		.ops = &clk_regmap_divider_ops,
4280 		.parent_hws = (const struct clk_hw *[]) {
4281 			&g12a_spicc1_sclk_sel.hw
4282 		},
4283 		.num_parents = 1,
4284 		.flags = CLK_SET_RATE_PARENT,
4285 	},
4286 };
4287 
4288 static struct clk_regmap g12a_spicc1_sclk = {
4289 	.data = &(struct clk_regmap_gate_data){
4290 		.offset = HHI_SPICC_CLK_CNTL,
4291 		.bit_idx = 22,
4292 	},
4293 	.hw.init = &(struct clk_init_data){
4294 		.name = "spicc1_sclk",
4295 		.ops = &clk_regmap_gate_ops,
4296 		.parent_hws = (const struct clk_hw *[]) {
4297 			&g12a_spicc1_sclk_div.hw
4298 		},
4299 		.num_parents = 1,
4300 		.flags = CLK_SET_RATE_PARENT,
4301 	},
4302 };
4303 
4304 /* Neural Network Accelerator source clock */
4305 
4306 static const struct clk_parent_data nna_clk_parent_data[] = {
4307 	{ .fw_name = "xtal", },
4308 	{ .hw = &g12a_gp0_pll.hw, },
4309 	{ .hw = &g12a_hifi_pll.hw, },
4310 	{ .hw = &g12a_fclk_div2p5.hw, },
4311 	{ .hw = &g12a_fclk_div3.hw, },
4312 	{ .hw = &g12a_fclk_div4.hw, },
4313 	{ .hw = &g12a_fclk_div5.hw, },
4314 	{ .hw = &g12a_fclk_div7.hw },
4315 };
4316 
4317 static struct clk_regmap sm1_nna_axi_clk_sel = {
4318 	.data = &(struct clk_regmap_mux_data){
4319 		.offset = HHI_NNA_CLK_CNTL,
4320 		.mask = 7,
4321 		.shift = 9,
4322 	},
4323 	.hw.init = &(struct clk_init_data){
4324 		.name = "nna_axi_clk_sel",
4325 		.ops = &clk_regmap_mux_ops,
4326 		.parent_data = nna_clk_parent_data,
4327 		.num_parents = ARRAY_SIZE(nna_clk_parent_data),
4328 	},
4329 };
4330 
4331 static struct clk_regmap sm1_nna_axi_clk_div = {
4332 	.data = &(struct clk_regmap_div_data){
4333 		.offset = HHI_NNA_CLK_CNTL,
4334 		.shift = 0,
4335 		.width = 7,
4336 	},
4337 	.hw.init = &(struct clk_init_data){
4338 		.name = "nna_axi_clk_div",
4339 		.ops = &clk_regmap_divider_ops,
4340 		.parent_hws = (const struct clk_hw *[]) {
4341 			&sm1_nna_axi_clk_sel.hw
4342 		},
4343 		.num_parents = 1,
4344 		.flags = CLK_SET_RATE_PARENT,
4345 	},
4346 };
4347 
4348 static struct clk_regmap sm1_nna_axi_clk = {
4349 	.data = &(struct clk_regmap_gate_data){
4350 		.offset = HHI_NNA_CLK_CNTL,
4351 		.bit_idx = 8,
4352 	},
4353 	.hw.init = &(struct clk_init_data){
4354 		.name = "nna_axi_clk",
4355 		.ops = &clk_regmap_gate_ops,
4356 		.parent_hws = (const struct clk_hw *[]) {
4357 			&sm1_nna_axi_clk_div.hw
4358 		},
4359 		.num_parents = 1,
4360 		.flags = CLK_SET_RATE_PARENT,
4361 	},
4362 };
4363 
4364 static struct clk_regmap sm1_nna_core_clk_sel = {
4365 	.data = &(struct clk_regmap_mux_data){
4366 		.offset = HHI_NNA_CLK_CNTL,
4367 		.mask = 7,
4368 		.shift = 25,
4369 	},
4370 	.hw.init = &(struct clk_init_data){
4371 		.name = "nna_core_clk_sel",
4372 		.ops = &clk_regmap_mux_ops,
4373 		.parent_data = nna_clk_parent_data,
4374 		.num_parents = ARRAY_SIZE(nna_clk_parent_data),
4375 	},
4376 };
4377 
4378 static struct clk_regmap sm1_nna_core_clk_div = {
4379 	.data = &(struct clk_regmap_div_data){
4380 		.offset = HHI_NNA_CLK_CNTL,
4381 		.shift = 16,
4382 		.width = 7,
4383 	},
4384 	.hw.init = &(struct clk_init_data){
4385 		.name = "nna_core_clk_div",
4386 		.ops = &clk_regmap_divider_ops,
4387 		.parent_hws = (const struct clk_hw *[]) {
4388 			&sm1_nna_core_clk_sel.hw
4389 		},
4390 		.num_parents = 1,
4391 		.flags = CLK_SET_RATE_PARENT,
4392 	},
4393 };
4394 
4395 static struct clk_regmap sm1_nna_core_clk = {
4396 	.data = &(struct clk_regmap_gate_data){
4397 		.offset = HHI_NNA_CLK_CNTL,
4398 		.bit_idx = 24,
4399 	},
4400 	.hw.init = &(struct clk_init_data){
4401 		.name = "nna_core_clk",
4402 		.ops = &clk_regmap_gate_ops,
4403 		.parent_hws = (const struct clk_hw *[]) {
4404 			&sm1_nna_core_clk_div.hw
4405 		},
4406 		.num_parents = 1,
4407 		.flags = CLK_SET_RATE_PARENT,
4408 	},
4409 };
4410 
4411 #define MESON_GATE(_name, _reg, _bit) \
4412 	MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
4413 
4414 #define MESON_GATE_RO(_name, _reg, _bit) \
4415 	MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
4416 
4417 /* Everything Else (EE) domain gates */
4418 static MESON_GATE(g12a_ddr,			HHI_GCLK_MPEG0,	0);
4419 static MESON_GATE(g12a_dos,			HHI_GCLK_MPEG0,	1);
4420 static MESON_GATE(g12a_audio_locker,		HHI_GCLK_MPEG0,	2);
4421 static MESON_GATE(g12a_mipi_dsi_host,		HHI_GCLK_MPEG0,	3);
4422 static MESON_GATE(g12a_eth_phy,			HHI_GCLK_MPEG0,	4);
4423 static MESON_GATE(g12a_isa,			HHI_GCLK_MPEG0,	5);
4424 static MESON_GATE(g12a_pl301,			HHI_GCLK_MPEG0,	6);
4425 static MESON_GATE(g12a_periphs,			HHI_GCLK_MPEG0,	7);
4426 static MESON_GATE(g12a_spicc_0,			HHI_GCLK_MPEG0,	8);
4427 static MESON_GATE(g12a_i2c,			HHI_GCLK_MPEG0,	9);
4428 static MESON_GATE(g12a_sana,			HHI_GCLK_MPEG0,	10);
4429 static MESON_GATE(g12a_sd,			HHI_GCLK_MPEG0,	11);
4430 static MESON_GATE(g12a_rng0,			HHI_GCLK_MPEG0,	12);
4431 static MESON_GATE(g12a_uart0,			HHI_GCLK_MPEG0,	13);
4432 static MESON_GATE(g12a_spicc_1,			HHI_GCLK_MPEG0,	14);
4433 static MESON_GATE(g12a_hiu_reg,			HHI_GCLK_MPEG0,	19);
4434 static MESON_GATE(g12a_mipi_dsi_phy,		HHI_GCLK_MPEG0,	20);
4435 static MESON_GATE(g12a_assist_misc,		HHI_GCLK_MPEG0,	23);
4436 static MESON_GATE(g12a_emmc_a,			HHI_GCLK_MPEG0,	24);
4437 static MESON_GATE(g12a_emmc_b,			HHI_GCLK_MPEG0,	25);
4438 static MESON_GATE(g12a_emmc_c,			HHI_GCLK_MPEG0,	26);
4439 static MESON_GATE(g12a_audio_codec,		HHI_GCLK_MPEG0,	28);
4440 
4441 static MESON_GATE(g12a_audio,			HHI_GCLK_MPEG1,	0);
4442 static MESON_GATE(g12a_eth_core,		HHI_GCLK_MPEG1,	3);
4443 static MESON_GATE(g12a_demux,			HHI_GCLK_MPEG1,	4);
4444 static MESON_GATE(g12a_audio_ififo,		HHI_GCLK_MPEG1,	11);
4445 static MESON_GATE(g12a_adc,			HHI_GCLK_MPEG1,	13);
4446 static MESON_GATE(g12a_uart1,			HHI_GCLK_MPEG1,	16);
4447 static MESON_GATE(g12a_g2d,			HHI_GCLK_MPEG1,	20);
4448 static MESON_GATE(g12a_reset,			HHI_GCLK_MPEG1,	23);
4449 static MESON_GATE(g12a_pcie_comb,		HHI_GCLK_MPEG1,	24);
4450 static MESON_GATE(g12a_parser,			HHI_GCLK_MPEG1,	25);
4451 static MESON_GATE(g12a_usb_general,		HHI_GCLK_MPEG1,	26);
4452 static MESON_GATE(g12a_pcie_phy,		HHI_GCLK_MPEG1,	27);
4453 static MESON_GATE(g12a_ahb_arb0,		HHI_GCLK_MPEG1,	29);
4454 
4455 static MESON_GATE(g12a_ahb_data_bus,		HHI_GCLK_MPEG2,	1);
4456 static MESON_GATE(g12a_ahb_ctrl_bus,		HHI_GCLK_MPEG2,	2);
4457 static MESON_GATE(g12a_htx_hdcp22,		HHI_GCLK_MPEG2,	3);
4458 static MESON_GATE(g12a_htx_pclk,		HHI_GCLK_MPEG2,	4);
4459 static MESON_GATE(g12a_bt656,			HHI_GCLK_MPEG2,	6);
4460 static MESON_GATE(g12a_usb1_to_ddr,		HHI_GCLK_MPEG2,	8);
4461 static MESON_GATE(g12b_mipi_isp_gate,		HHI_GCLK_MPEG2,	17);
4462 static MESON_GATE(g12a_mmc_pclk,		HHI_GCLK_MPEG2,	11);
4463 static MESON_GATE(g12a_uart2,			HHI_GCLK_MPEG2,	15);
4464 static MESON_GATE(g12a_vpu_intr,		HHI_GCLK_MPEG2,	25);
4465 static MESON_GATE(g12b_csi_phy1,		HHI_GCLK_MPEG2,	28);
4466 static MESON_GATE(g12b_csi_phy0,		HHI_GCLK_MPEG2,	29);
4467 static MESON_GATE(g12a_gic,			HHI_GCLK_MPEG2,	30);
4468 
4469 static MESON_GATE(g12a_vclk2_venci0,		HHI_GCLK_OTHER,	1);
4470 static MESON_GATE(g12a_vclk2_venci1,		HHI_GCLK_OTHER,	2);
4471 static MESON_GATE(g12a_vclk2_vencp0,		HHI_GCLK_OTHER,	3);
4472 static MESON_GATE(g12a_vclk2_vencp1,		HHI_GCLK_OTHER,	4);
4473 static MESON_GATE(g12a_vclk2_venct0,		HHI_GCLK_OTHER,	5);
4474 static MESON_GATE(g12a_vclk2_venct1,		HHI_GCLK_OTHER,	6);
4475 static MESON_GATE(g12a_vclk2_other,		HHI_GCLK_OTHER,	7);
4476 static MESON_GATE(g12a_vclk2_enci,		HHI_GCLK_OTHER,	8);
4477 static MESON_GATE(g12a_vclk2_encp,		HHI_GCLK_OTHER,	9);
4478 static MESON_GATE(g12a_dac_clk,			HHI_GCLK_OTHER,	10);
4479 static MESON_GATE(g12a_aoclk_gate,		HHI_GCLK_OTHER,	14);
4480 static MESON_GATE(g12a_iec958_gate,		HHI_GCLK_OTHER,	16);
4481 static MESON_GATE(g12a_enc480p,			HHI_GCLK_OTHER,	20);
4482 static MESON_GATE(g12a_rng1,			HHI_GCLK_OTHER,	21);
4483 static MESON_GATE(g12a_vclk2_enct,		HHI_GCLK_OTHER,	22);
4484 static MESON_GATE(g12a_vclk2_encl,		HHI_GCLK_OTHER,	23);
4485 static MESON_GATE(g12a_vclk2_venclmmc,		HHI_GCLK_OTHER,	24);
4486 static MESON_GATE(g12a_vclk2_vencl,		HHI_GCLK_OTHER,	25);
4487 static MESON_GATE(g12a_vclk2_other1,		HHI_GCLK_OTHER,	26);
4488 
4489 static MESON_GATE_RO(g12a_dma,			HHI_GCLK_OTHER2, 0);
4490 static MESON_GATE_RO(g12a_efuse,		HHI_GCLK_OTHER2, 1);
4491 static MESON_GATE_RO(g12a_rom_boot,		HHI_GCLK_OTHER2, 2);
4492 static MESON_GATE_RO(g12a_reset_sec,		HHI_GCLK_OTHER2, 3);
4493 static MESON_GATE_RO(g12a_sec_ahb_apb3,		HHI_GCLK_OTHER2, 4);
4494 
4495 /* Array of all clocks provided by this provider */
4496 static struct clk_hw *g12a_hw_clks[] = {
4497 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4498 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4499 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4500 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4501 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4502 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4503 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4504 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4505 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4506 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4507 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4508 	[CLKID_CLK81]			= &g12a_clk81.hw,
4509 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4510 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4511 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4512 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4513 	[CLKID_DDR]			= &g12a_ddr.hw,
4514 	[CLKID_DOS]			= &g12a_dos.hw,
4515 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4516 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4517 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4518 	[CLKID_ISA]			= &g12a_isa.hw,
4519 	[CLKID_PL301]			= &g12a_pl301.hw,
4520 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4521 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4522 	[CLKID_I2C]			= &g12a_i2c.hw,
4523 	[CLKID_SANA]			= &g12a_sana.hw,
4524 	[CLKID_SD]			= &g12a_sd.hw,
4525 	[CLKID_RNG0]			= &g12a_rng0.hw,
4526 	[CLKID_UART0]			= &g12a_uart0.hw,
4527 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4528 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4529 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4530 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4531 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4532 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4533 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4534 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4535 	[CLKID_AUDIO]			= &g12a_audio.hw,
4536 	[CLKID_ETH]			= &g12a_eth_core.hw,
4537 	[CLKID_DEMUX]			= &g12a_demux.hw,
4538 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4539 	[CLKID_ADC]			= &g12a_adc.hw,
4540 	[CLKID_UART1]			= &g12a_uart1.hw,
4541 	[CLKID_G2D]			= &g12a_g2d.hw,
4542 	[CLKID_RESET]			= &g12a_reset.hw,
4543 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4544 	[CLKID_PARSER]			= &g12a_parser.hw,
4545 	[CLKID_USB]			= &g12a_usb_general.hw,
4546 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4547 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4548 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4549 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4550 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4551 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4552 	[CLKID_BT656]			= &g12a_bt656.hw,
4553 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4554 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4555 	[CLKID_UART2]			= &g12a_uart2.hw,
4556 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4557 	[CLKID_GIC]			= &g12a_gic.hw,
4558 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4559 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4560 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4561 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4562 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4563 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4564 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4565 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4566 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4567 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4568 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4569 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4570 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4571 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4572 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4573 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4574 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4575 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4576 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4577 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4578 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4579 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4580 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4581 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4582 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4583 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4584 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4585 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4586 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4587 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4588 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4589 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4590 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4591 	[CLKID_RNG1]			= &g12a_rng1.hw,
4592 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4593 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4594 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4595 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4596 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4597 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4598 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4599 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4600 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4601 	[CLKID_DMA]			= &g12a_dma.hw,
4602 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4603 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4604 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4605 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4606 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4607 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4608 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4609 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4610 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4611 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4612 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4613 	[CLKID_VPU]			= &g12a_vpu.hw,
4614 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
4615 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
4616 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
4617 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
4618 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
4619 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
4620 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
4621 	[CLKID_VAPB]			= &g12a_vapb.hw,
4622 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
4623 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
4624 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
4625 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
4626 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
4627 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
4628 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
4629 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
4630 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
4631 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
4632 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
4633 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
4634 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
4635 	[CLKID_VCLK]			= &g12a_vclk.hw,
4636 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
4637 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
4638 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
4639 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
4640 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
4641 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
4642 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
4643 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
4644 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
4645 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
4646 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
4647 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
4648 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
4649 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
4650 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
4651 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
4652 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
4653 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
4654 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
4655 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
4656 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
4657 	[CLKID_CTS_ENCL_SEL]		= &g12a_cts_encl_sel.hw,
4658 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
4659 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
4660 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
4661 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
4662 	[CLKID_CTS_ENCL]		= &g12a_cts_encl.hw,
4663 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
4664 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
4665 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
4666 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
4667 	[CLKID_HDMI]			= &g12a_hdmi.hw,
4668 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
4669 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
4670 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
4671 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
4672 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
4673 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
4674 	[CLKID_MALI]			= &g12a_mali.hw,
4675 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
4676 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
4677 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
4678 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
4679 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
4680 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
4681 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
4682 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
4683 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
4684 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
4685 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
4686 	[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
4687 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
4688 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
4689 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
4690 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
4691 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
4692 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
4693 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
4694 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
4695 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
4696 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
4697 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
4698 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
4699 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
4700 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
4701 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
4702 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
4703 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
4704 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
4705 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
4706 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
4707 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
4708 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
4709 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
4710 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
4711 	[CLKID_TS]			= &g12a_ts.hw,
4712 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4713 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4714 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4715 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4716 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4717 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
4718 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
4719 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
4720 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
4721 };
4722 
4723 static struct clk_hw *g12b_hw_clks[] = {
4724 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4725 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4726 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4727 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4728 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4729 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4730 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4731 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
4732 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
4733 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
4734 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
4735 	[CLKID_CLK81]			= &g12a_clk81.hw,
4736 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
4737 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
4738 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
4739 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
4740 	[CLKID_DDR]			= &g12a_ddr.hw,
4741 	[CLKID_DOS]			= &g12a_dos.hw,
4742 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
4743 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
4744 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
4745 	[CLKID_ISA]			= &g12a_isa.hw,
4746 	[CLKID_PL301]			= &g12a_pl301.hw,
4747 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
4748 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
4749 	[CLKID_I2C]			= &g12a_i2c.hw,
4750 	[CLKID_SANA]			= &g12a_sana.hw,
4751 	[CLKID_SD]			= &g12a_sd.hw,
4752 	[CLKID_RNG0]			= &g12a_rng0.hw,
4753 	[CLKID_UART0]			= &g12a_uart0.hw,
4754 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
4755 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
4756 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
4757 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
4758 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
4759 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
4760 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
4761 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
4762 	[CLKID_AUDIO]			= &g12a_audio.hw,
4763 	[CLKID_ETH]			= &g12a_eth_core.hw,
4764 	[CLKID_DEMUX]			= &g12a_demux.hw,
4765 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
4766 	[CLKID_ADC]			= &g12a_adc.hw,
4767 	[CLKID_UART1]			= &g12a_uart1.hw,
4768 	[CLKID_G2D]			= &g12a_g2d.hw,
4769 	[CLKID_RESET]			= &g12a_reset.hw,
4770 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
4771 	[CLKID_PARSER]			= &g12a_parser.hw,
4772 	[CLKID_USB]			= &g12a_usb_general.hw,
4773 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
4774 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
4775 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
4776 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
4777 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
4778 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
4779 	[CLKID_BT656]			= &g12a_bt656.hw,
4780 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
4781 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
4782 	[CLKID_UART2]			= &g12a_uart2.hw,
4783 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
4784 	[CLKID_GIC]			= &g12a_gic.hw,
4785 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
4786 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
4787 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
4788 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
4789 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
4790 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
4791 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
4792 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
4793 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
4794 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
4795 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
4796 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
4797 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
4798 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
4799 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
4800 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
4801 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
4802 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
4803 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
4804 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
4805 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
4806 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
4807 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
4808 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
4809 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
4810 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
4811 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
4812 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
4813 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
4814 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
4815 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
4816 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
4817 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
4818 	[CLKID_RNG1]			= &g12a_rng1.hw,
4819 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
4820 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
4821 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
4822 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
4823 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
4824 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
4825 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
4826 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
4827 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
4828 	[CLKID_DMA]			= &g12a_dma.hw,
4829 	[CLKID_EFUSE]			= &g12a_efuse.hw,
4830 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
4831 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
4832 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
4833 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
4834 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
4835 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
4836 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
4837 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
4838 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
4839 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
4840 	[CLKID_VPU]			= &g12a_vpu.hw,
4841 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
4842 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
4843 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
4844 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
4845 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
4846 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
4847 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
4848 	[CLKID_VAPB]			= &g12a_vapb.hw,
4849 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
4850 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
4851 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
4852 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
4853 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
4854 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
4855 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
4856 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
4857 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
4858 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
4859 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
4860 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
4861 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
4862 	[CLKID_VCLK]			= &g12a_vclk.hw,
4863 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
4864 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
4865 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
4866 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
4867 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
4868 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
4869 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
4870 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
4871 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
4872 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
4873 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
4874 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
4875 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
4876 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
4877 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
4878 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
4879 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
4880 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
4881 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
4882 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
4883 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
4884 	[CLKID_CTS_ENCL_SEL]		= &g12a_cts_encl_sel.hw,
4885 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
4886 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
4887 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
4888 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
4889 	[CLKID_CTS_ENCL]		= &g12a_cts_encl.hw,
4890 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
4891 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
4892 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
4893 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
4894 	[CLKID_HDMI]			= &g12a_hdmi.hw,
4895 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
4896 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
4897 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
4898 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
4899 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
4900 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
4901 	[CLKID_MALI]			= &g12a_mali.hw,
4902 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
4903 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
4904 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
4905 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
4906 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
4907 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
4908 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
4909 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
4910 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
4911 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
4912 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
4913 	[CLKID_CPU_CLK]			= &g12b_cpu_clk.hw,
4914 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
4915 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
4916 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
4917 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
4918 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
4919 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
4920 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
4921 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
4922 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
4923 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
4924 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
4925 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
4926 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
4927 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
4928 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
4929 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
4930 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
4931 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
4932 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
4933 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
4934 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
4935 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
4936 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
4937 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
4938 	[CLKID_TS]			= &g12a_ts.hw,
4939 	[CLKID_SYS1_PLL_DCO]		= &g12b_sys1_pll_dco.hw,
4940 	[CLKID_SYS1_PLL]		= &g12b_sys1_pll.hw,
4941 	[CLKID_SYS1_PLL_DIV16_EN]	= &g12b_sys1_pll_div16_en.hw,
4942 	[CLKID_SYS1_PLL_DIV16]		= &g12b_sys1_pll_div16.hw,
4943 	[CLKID_CPUB_CLK_DYN0_SEL]	= &g12b_cpub_clk_premux0.hw,
4944 	[CLKID_CPUB_CLK_DYN0_DIV]	= &g12b_cpub_clk_mux0_div.hw,
4945 	[CLKID_CPUB_CLK_DYN0]		= &g12b_cpub_clk_postmux0.hw,
4946 	[CLKID_CPUB_CLK_DYN1_SEL]	= &g12b_cpub_clk_premux1.hw,
4947 	[CLKID_CPUB_CLK_DYN1_DIV]	= &g12b_cpub_clk_mux1_div.hw,
4948 	[CLKID_CPUB_CLK_DYN1]		= &g12b_cpub_clk_postmux1.hw,
4949 	[CLKID_CPUB_CLK_DYN]		= &g12b_cpub_clk_dyn.hw,
4950 	[CLKID_CPUB_CLK]		= &g12b_cpub_clk.hw,
4951 	[CLKID_CPUB_CLK_DIV16_EN]	= &g12b_cpub_clk_div16_en.hw,
4952 	[CLKID_CPUB_CLK_DIV16]		= &g12b_cpub_clk_div16.hw,
4953 	[CLKID_CPUB_CLK_DIV2]		= &g12b_cpub_clk_div2.hw,
4954 	[CLKID_CPUB_CLK_DIV3]		= &g12b_cpub_clk_div3.hw,
4955 	[CLKID_CPUB_CLK_DIV4]		= &g12b_cpub_clk_div4.hw,
4956 	[CLKID_CPUB_CLK_DIV5]		= &g12b_cpub_clk_div5.hw,
4957 	[CLKID_CPUB_CLK_DIV6]		= &g12b_cpub_clk_div6.hw,
4958 	[CLKID_CPUB_CLK_DIV7]		= &g12b_cpub_clk_div7.hw,
4959 	[CLKID_CPUB_CLK_DIV8]		= &g12b_cpub_clk_div8.hw,
4960 	[CLKID_CPUB_CLK_APB_SEL]	= &g12b_cpub_clk_apb_sel.hw,
4961 	[CLKID_CPUB_CLK_APB]		= &g12b_cpub_clk_apb.hw,
4962 	[CLKID_CPUB_CLK_ATB_SEL]	= &g12b_cpub_clk_atb_sel.hw,
4963 	[CLKID_CPUB_CLK_ATB]		= &g12b_cpub_clk_atb.hw,
4964 	[CLKID_CPUB_CLK_AXI_SEL]	= &g12b_cpub_clk_axi_sel.hw,
4965 	[CLKID_CPUB_CLK_AXI]		= &g12b_cpub_clk_axi.hw,
4966 	[CLKID_CPUB_CLK_TRACE_SEL]	= &g12b_cpub_clk_trace_sel.hw,
4967 	[CLKID_CPUB_CLK_TRACE]		= &g12b_cpub_clk_trace.hw,
4968 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
4969 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
4970 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
4971 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
4972 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
4973 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
4974 	[CLKID_NNA_AXI_CLK_SEL]		= &sm1_nna_axi_clk_sel.hw,
4975 	[CLKID_NNA_AXI_CLK_DIV]		= &sm1_nna_axi_clk_div.hw,
4976 	[CLKID_NNA_AXI_CLK]		= &sm1_nna_axi_clk.hw,
4977 	[CLKID_NNA_CORE_CLK_SEL]	= &sm1_nna_core_clk_sel.hw,
4978 	[CLKID_NNA_CORE_CLK_DIV]	= &sm1_nna_core_clk_div.hw,
4979 	[CLKID_NNA_CORE_CLK]		= &sm1_nna_core_clk.hw,
4980 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
4981 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
4982 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
4983 	[CLKID_MIPI_ISP_SEL]		= &g12b_mipi_isp_sel.hw,
4984 	[CLKID_MIPI_ISP_DIV]		= &g12b_mipi_isp_div.hw,
4985 	[CLKID_MIPI_ISP]		= &g12b_mipi_isp.hw,
4986 	[CLKID_MIPI_ISP_GATE]		= &g12b_mipi_isp_gate.hw,
4987 	[CLKID_MIPI_ISP_CSI_PHY0]	= &g12b_csi_phy0.hw,
4988 	[CLKID_MIPI_ISP_CSI_PHY1]	= &g12b_csi_phy1.hw,
4989 };
4990 
4991 static struct clk_hw *sm1_hw_clks[] = {
4992 	[CLKID_SYS_PLL]			= &g12a_sys_pll.hw,
4993 	[CLKID_FIXED_PLL]		= &g12a_fixed_pll.hw,
4994 	[CLKID_FCLK_DIV2]		= &g12a_fclk_div2.hw,
4995 	[CLKID_FCLK_DIV3]		= &g12a_fclk_div3.hw,
4996 	[CLKID_FCLK_DIV4]		= &g12a_fclk_div4.hw,
4997 	[CLKID_FCLK_DIV5]		= &g12a_fclk_div5.hw,
4998 	[CLKID_FCLK_DIV7]		= &g12a_fclk_div7.hw,
4999 	[CLKID_FCLK_DIV2P5]		= &g12a_fclk_div2p5.hw,
5000 	[CLKID_GP0_PLL]			= &g12a_gp0_pll.hw,
5001 	[CLKID_MPEG_SEL]		= &g12a_mpeg_clk_sel.hw,
5002 	[CLKID_MPEG_DIV]		= &g12a_mpeg_clk_div.hw,
5003 	[CLKID_CLK81]			= &g12a_clk81.hw,
5004 	[CLKID_MPLL0]			= &g12a_mpll0.hw,
5005 	[CLKID_MPLL1]			= &g12a_mpll1.hw,
5006 	[CLKID_MPLL2]			= &g12a_mpll2.hw,
5007 	[CLKID_MPLL3]			= &g12a_mpll3.hw,
5008 	[CLKID_DDR]			= &g12a_ddr.hw,
5009 	[CLKID_DOS]			= &g12a_dos.hw,
5010 	[CLKID_AUDIO_LOCKER]		= &g12a_audio_locker.hw,
5011 	[CLKID_MIPI_DSI_HOST]		= &g12a_mipi_dsi_host.hw,
5012 	[CLKID_ETH_PHY]			= &g12a_eth_phy.hw,
5013 	[CLKID_ISA]			= &g12a_isa.hw,
5014 	[CLKID_PL301]			= &g12a_pl301.hw,
5015 	[CLKID_PERIPHS]			= &g12a_periphs.hw,
5016 	[CLKID_SPICC0]			= &g12a_spicc_0.hw,
5017 	[CLKID_I2C]			= &g12a_i2c.hw,
5018 	[CLKID_SANA]			= &g12a_sana.hw,
5019 	[CLKID_SD]			= &g12a_sd.hw,
5020 	[CLKID_RNG0]			= &g12a_rng0.hw,
5021 	[CLKID_UART0]			= &g12a_uart0.hw,
5022 	[CLKID_SPICC1]			= &g12a_spicc_1.hw,
5023 	[CLKID_HIU_IFACE]		= &g12a_hiu_reg.hw,
5024 	[CLKID_MIPI_DSI_PHY]		= &g12a_mipi_dsi_phy.hw,
5025 	[CLKID_ASSIST_MISC]		= &g12a_assist_misc.hw,
5026 	[CLKID_SD_EMMC_A]		= &g12a_emmc_a.hw,
5027 	[CLKID_SD_EMMC_B]		= &g12a_emmc_b.hw,
5028 	[CLKID_SD_EMMC_C]		= &g12a_emmc_c.hw,
5029 	[CLKID_AUDIO_CODEC]		= &g12a_audio_codec.hw,
5030 	[CLKID_AUDIO]			= &g12a_audio.hw,
5031 	[CLKID_ETH]			= &g12a_eth_core.hw,
5032 	[CLKID_DEMUX]			= &g12a_demux.hw,
5033 	[CLKID_AUDIO_IFIFO]		= &g12a_audio_ififo.hw,
5034 	[CLKID_ADC]			= &g12a_adc.hw,
5035 	[CLKID_UART1]			= &g12a_uart1.hw,
5036 	[CLKID_G2D]			= &g12a_g2d.hw,
5037 	[CLKID_RESET]			= &g12a_reset.hw,
5038 	[CLKID_PCIE_COMB]		= &g12a_pcie_comb.hw,
5039 	[CLKID_PARSER]			= &g12a_parser.hw,
5040 	[CLKID_USB]			= &g12a_usb_general.hw,
5041 	[CLKID_PCIE_PHY]		= &g12a_pcie_phy.hw,
5042 	[CLKID_AHB_ARB0]		= &g12a_ahb_arb0.hw,
5043 	[CLKID_AHB_DATA_BUS]		= &g12a_ahb_data_bus.hw,
5044 	[CLKID_AHB_CTRL_BUS]		= &g12a_ahb_ctrl_bus.hw,
5045 	[CLKID_HTX_HDCP22]		= &g12a_htx_hdcp22.hw,
5046 	[CLKID_HTX_PCLK]		= &g12a_htx_pclk.hw,
5047 	[CLKID_BT656]			= &g12a_bt656.hw,
5048 	[CLKID_USB1_DDR_BRIDGE]		= &g12a_usb1_to_ddr.hw,
5049 	[CLKID_MMC_PCLK]		= &g12a_mmc_pclk.hw,
5050 	[CLKID_UART2]			= &g12a_uart2.hw,
5051 	[CLKID_VPU_INTR]		= &g12a_vpu_intr.hw,
5052 	[CLKID_GIC]			= &g12a_gic.hw,
5053 	[CLKID_SD_EMMC_A_CLK0_SEL]	= &g12a_sd_emmc_a_clk0_sel.hw,
5054 	[CLKID_SD_EMMC_A_CLK0_DIV]	= &g12a_sd_emmc_a_clk0_div.hw,
5055 	[CLKID_SD_EMMC_A_CLK0]		= &g12a_sd_emmc_a_clk0.hw,
5056 	[CLKID_SD_EMMC_B_CLK0_SEL]	= &g12a_sd_emmc_b_clk0_sel.hw,
5057 	[CLKID_SD_EMMC_B_CLK0_DIV]	= &g12a_sd_emmc_b_clk0_div.hw,
5058 	[CLKID_SD_EMMC_B_CLK0]		= &g12a_sd_emmc_b_clk0.hw,
5059 	[CLKID_SD_EMMC_C_CLK0_SEL]	= &g12a_sd_emmc_c_clk0_sel.hw,
5060 	[CLKID_SD_EMMC_C_CLK0_DIV]	= &g12a_sd_emmc_c_clk0_div.hw,
5061 	[CLKID_SD_EMMC_C_CLK0]		= &g12a_sd_emmc_c_clk0.hw,
5062 	[CLKID_MPLL0_DIV]		= &g12a_mpll0_div.hw,
5063 	[CLKID_MPLL1_DIV]		= &g12a_mpll1_div.hw,
5064 	[CLKID_MPLL2_DIV]		= &g12a_mpll2_div.hw,
5065 	[CLKID_MPLL3_DIV]		= &g12a_mpll3_div.hw,
5066 	[CLKID_FCLK_DIV2_DIV]		= &g12a_fclk_div2_div.hw,
5067 	[CLKID_FCLK_DIV3_DIV]		= &g12a_fclk_div3_div.hw,
5068 	[CLKID_FCLK_DIV4_DIV]		= &g12a_fclk_div4_div.hw,
5069 	[CLKID_FCLK_DIV5_DIV]		= &g12a_fclk_div5_div.hw,
5070 	[CLKID_FCLK_DIV7_DIV]		= &g12a_fclk_div7_div.hw,
5071 	[CLKID_FCLK_DIV2P5_DIV]		= &g12a_fclk_div2p5_div.hw,
5072 	[CLKID_HIFI_PLL]		= &g12a_hifi_pll.hw,
5073 	[CLKID_VCLK2_VENCI0]		= &g12a_vclk2_venci0.hw,
5074 	[CLKID_VCLK2_VENCI1]		= &g12a_vclk2_venci1.hw,
5075 	[CLKID_VCLK2_VENCP0]		= &g12a_vclk2_vencp0.hw,
5076 	[CLKID_VCLK2_VENCP1]		= &g12a_vclk2_vencp1.hw,
5077 	[CLKID_VCLK2_VENCT0]		= &g12a_vclk2_venct0.hw,
5078 	[CLKID_VCLK2_VENCT1]		= &g12a_vclk2_venct1.hw,
5079 	[CLKID_VCLK2_OTHER]		= &g12a_vclk2_other.hw,
5080 	[CLKID_VCLK2_ENCI]		= &g12a_vclk2_enci.hw,
5081 	[CLKID_VCLK2_ENCP]		= &g12a_vclk2_encp.hw,
5082 	[CLKID_DAC_CLK]			= &g12a_dac_clk.hw,
5083 	[CLKID_AOCLK]			= &g12a_aoclk_gate.hw,
5084 	[CLKID_IEC958]			= &g12a_iec958_gate.hw,
5085 	[CLKID_ENC480P]			= &g12a_enc480p.hw,
5086 	[CLKID_RNG1]			= &g12a_rng1.hw,
5087 	[CLKID_VCLK2_ENCT]		= &g12a_vclk2_enct.hw,
5088 	[CLKID_VCLK2_ENCL]		= &g12a_vclk2_encl.hw,
5089 	[CLKID_VCLK2_VENCLMMC]		= &g12a_vclk2_venclmmc.hw,
5090 	[CLKID_VCLK2_VENCL]		= &g12a_vclk2_vencl.hw,
5091 	[CLKID_VCLK2_OTHER1]		= &g12a_vclk2_other1.hw,
5092 	[CLKID_FIXED_PLL_DCO]		= &g12a_fixed_pll_dco.hw,
5093 	[CLKID_SYS_PLL_DCO]		= &g12a_sys_pll_dco.hw,
5094 	[CLKID_GP0_PLL_DCO]		= &g12a_gp0_pll_dco.hw,
5095 	[CLKID_HIFI_PLL_DCO]		= &g12a_hifi_pll_dco.hw,
5096 	[CLKID_DMA]			= &g12a_dma.hw,
5097 	[CLKID_EFUSE]			= &g12a_efuse.hw,
5098 	[CLKID_ROM_BOOT]		= &g12a_rom_boot.hw,
5099 	[CLKID_RESET_SEC]		= &g12a_reset_sec.hw,
5100 	[CLKID_SEC_AHB_APB3]		= &g12a_sec_ahb_apb3.hw,
5101 	[CLKID_MPLL_PREDIV]		= &g12a_mpll_prediv.hw,
5102 	[CLKID_VPU_0_SEL]		= &g12a_vpu_0_sel.hw,
5103 	[CLKID_VPU_0_DIV]		= &g12a_vpu_0_div.hw,
5104 	[CLKID_VPU_0]			= &g12a_vpu_0.hw,
5105 	[CLKID_VPU_1_SEL]		= &g12a_vpu_1_sel.hw,
5106 	[CLKID_VPU_1_DIV]		= &g12a_vpu_1_div.hw,
5107 	[CLKID_VPU_1]			= &g12a_vpu_1.hw,
5108 	[CLKID_VPU]			= &g12a_vpu.hw,
5109 	[CLKID_VAPB_0_SEL]		= &g12a_vapb_0_sel.hw,
5110 	[CLKID_VAPB_0_DIV]		= &g12a_vapb_0_div.hw,
5111 	[CLKID_VAPB_0]			= &g12a_vapb_0.hw,
5112 	[CLKID_VAPB_1_SEL]		= &g12a_vapb_1_sel.hw,
5113 	[CLKID_VAPB_1_DIV]		= &g12a_vapb_1_div.hw,
5114 	[CLKID_VAPB_1]			= &g12a_vapb_1.hw,
5115 	[CLKID_VAPB_SEL]		= &g12a_vapb_sel.hw,
5116 	[CLKID_VAPB]			= &g12a_vapb.hw,
5117 	[CLKID_HDMI_PLL_DCO]		= &g12a_hdmi_pll_dco.hw,
5118 	[CLKID_HDMI_PLL_OD]		= &g12a_hdmi_pll_od.hw,
5119 	[CLKID_HDMI_PLL_OD2]		= &g12a_hdmi_pll_od2.hw,
5120 	[CLKID_HDMI_PLL]		= &g12a_hdmi_pll.hw,
5121 	[CLKID_VID_PLL]			= &g12a_vid_pll_div.hw,
5122 	[CLKID_VID_PLL_SEL]		= &g12a_vid_pll_sel.hw,
5123 	[CLKID_VID_PLL_DIV]		= &g12a_vid_pll.hw,
5124 	[CLKID_VCLK_SEL]		= &g12a_vclk_sel.hw,
5125 	[CLKID_VCLK2_SEL]		= &g12a_vclk2_sel.hw,
5126 	[CLKID_VCLK_INPUT]		= &g12a_vclk_input.hw,
5127 	[CLKID_VCLK2_INPUT]		= &g12a_vclk2_input.hw,
5128 	[CLKID_VCLK_DIV]		= &g12a_vclk_div.hw,
5129 	[CLKID_VCLK2_DIV]		= &g12a_vclk2_div.hw,
5130 	[CLKID_VCLK]			= &g12a_vclk.hw,
5131 	[CLKID_VCLK2]			= &g12a_vclk2.hw,
5132 	[CLKID_VCLK_DIV1]		= &g12a_vclk_div1.hw,
5133 	[CLKID_VCLK_DIV2_EN]		= &g12a_vclk_div2_en.hw,
5134 	[CLKID_VCLK_DIV4_EN]		= &g12a_vclk_div4_en.hw,
5135 	[CLKID_VCLK_DIV6_EN]		= &g12a_vclk_div6_en.hw,
5136 	[CLKID_VCLK_DIV12_EN]		= &g12a_vclk_div12_en.hw,
5137 	[CLKID_VCLK2_DIV1]		= &g12a_vclk2_div1.hw,
5138 	[CLKID_VCLK2_DIV2_EN]		= &g12a_vclk2_div2_en.hw,
5139 	[CLKID_VCLK2_DIV4_EN]		= &g12a_vclk2_div4_en.hw,
5140 	[CLKID_VCLK2_DIV6_EN]		= &g12a_vclk2_div6_en.hw,
5141 	[CLKID_VCLK2_DIV12_EN]		= &g12a_vclk2_div12_en.hw,
5142 	[CLKID_VCLK_DIV2]		= &g12a_vclk_div2.hw,
5143 	[CLKID_VCLK_DIV4]		= &g12a_vclk_div4.hw,
5144 	[CLKID_VCLK_DIV6]		= &g12a_vclk_div6.hw,
5145 	[CLKID_VCLK_DIV12]		= &g12a_vclk_div12.hw,
5146 	[CLKID_VCLK2_DIV2]		= &g12a_vclk2_div2.hw,
5147 	[CLKID_VCLK2_DIV4]		= &g12a_vclk2_div4.hw,
5148 	[CLKID_VCLK2_DIV6]		= &g12a_vclk2_div6.hw,
5149 	[CLKID_VCLK2_DIV12]		= &g12a_vclk2_div12.hw,
5150 	[CLKID_CTS_ENCI_SEL]		= &g12a_cts_enci_sel.hw,
5151 	[CLKID_CTS_ENCP_SEL]		= &g12a_cts_encp_sel.hw,
5152 	[CLKID_CTS_ENCL_SEL]		= &g12a_cts_encl_sel.hw,
5153 	[CLKID_CTS_VDAC_SEL]		= &g12a_cts_vdac_sel.hw,
5154 	[CLKID_HDMI_TX_SEL]		= &g12a_hdmi_tx_sel.hw,
5155 	[CLKID_CTS_ENCI]		= &g12a_cts_enci.hw,
5156 	[CLKID_CTS_ENCP]		= &g12a_cts_encp.hw,
5157 	[CLKID_CTS_ENCL]		= &g12a_cts_encl.hw,
5158 	[CLKID_CTS_VDAC]		= &g12a_cts_vdac.hw,
5159 	[CLKID_HDMI_TX]			= &g12a_hdmi_tx.hw,
5160 	[CLKID_HDMI_SEL]		= &g12a_hdmi_sel.hw,
5161 	[CLKID_HDMI_DIV]		= &g12a_hdmi_div.hw,
5162 	[CLKID_HDMI]			= &g12a_hdmi.hw,
5163 	[CLKID_MALI_0_SEL]		= &g12a_mali_0_sel.hw,
5164 	[CLKID_MALI_0_DIV]		= &g12a_mali_0_div.hw,
5165 	[CLKID_MALI_0]			= &g12a_mali_0.hw,
5166 	[CLKID_MALI_1_SEL]		= &g12a_mali_1_sel.hw,
5167 	[CLKID_MALI_1_DIV]		= &g12a_mali_1_div.hw,
5168 	[CLKID_MALI_1]			= &g12a_mali_1.hw,
5169 	[CLKID_MALI]			= &g12a_mali.hw,
5170 	[CLKID_MPLL_50M_DIV]		= &g12a_mpll_50m_div.hw,
5171 	[CLKID_MPLL_50M]		= &g12a_mpll_50m.hw,
5172 	[CLKID_SYS_PLL_DIV16_EN]	= &g12a_sys_pll_div16_en.hw,
5173 	[CLKID_SYS_PLL_DIV16]		= &g12a_sys_pll_div16.hw,
5174 	[CLKID_CPU_CLK_DYN0_SEL]	= &g12a_cpu_clk_premux0.hw,
5175 	[CLKID_CPU_CLK_DYN0_DIV]	= &g12a_cpu_clk_mux0_div.hw,
5176 	[CLKID_CPU_CLK_DYN0]		= &g12a_cpu_clk_postmux0.hw,
5177 	[CLKID_CPU_CLK_DYN1_SEL]	= &g12a_cpu_clk_premux1.hw,
5178 	[CLKID_CPU_CLK_DYN1_DIV]	= &g12a_cpu_clk_mux1_div.hw,
5179 	[CLKID_CPU_CLK_DYN1]		= &g12a_cpu_clk_postmux1.hw,
5180 	[CLKID_CPU_CLK_DYN]		= &g12a_cpu_clk_dyn.hw,
5181 	[CLKID_CPU_CLK]			= &g12a_cpu_clk.hw,
5182 	[CLKID_CPU_CLK_DIV16_EN]	= &g12a_cpu_clk_div16_en.hw,
5183 	[CLKID_CPU_CLK_DIV16]		= &g12a_cpu_clk_div16.hw,
5184 	[CLKID_CPU_CLK_APB_DIV]		= &g12a_cpu_clk_apb_div.hw,
5185 	[CLKID_CPU_CLK_APB]		= &g12a_cpu_clk_apb.hw,
5186 	[CLKID_CPU_CLK_ATB_DIV]		= &g12a_cpu_clk_atb_div.hw,
5187 	[CLKID_CPU_CLK_ATB]		= &g12a_cpu_clk_atb.hw,
5188 	[CLKID_CPU_CLK_AXI_DIV]		= &g12a_cpu_clk_axi_div.hw,
5189 	[CLKID_CPU_CLK_AXI]		= &g12a_cpu_clk_axi.hw,
5190 	[CLKID_CPU_CLK_TRACE_DIV]	= &g12a_cpu_clk_trace_div.hw,
5191 	[CLKID_CPU_CLK_TRACE]		= &g12a_cpu_clk_trace.hw,
5192 	[CLKID_PCIE_PLL_DCO]		= &g12a_pcie_pll_dco.hw,
5193 	[CLKID_PCIE_PLL_DCO_DIV2]	= &g12a_pcie_pll_dco_div2.hw,
5194 	[CLKID_PCIE_PLL_OD]		= &g12a_pcie_pll_od.hw,
5195 	[CLKID_PCIE_PLL]		= &g12a_pcie_pll.hw,
5196 	[CLKID_VDEC_1_SEL]		= &g12a_vdec_1_sel.hw,
5197 	[CLKID_VDEC_1_DIV]		= &g12a_vdec_1_div.hw,
5198 	[CLKID_VDEC_1]			= &g12a_vdec_1.hw,
5199 	[CLKID_VDEC_HEVC_SEL]		= &g12a_vdec_hevc_sel.hw,
5200 	[CLKID_VDEC_HEVC_DIV]		= &g12a_vdec_hevc_div.hw,
5201 	[CLKID_VDEC_HEVC]		= &g12a_vdec_hevc.hw,
5202 	[CLKID_VDEC_HEVCF_SEL]		= &g12a_vdec_hevcf_sel.hw,
5203 	[CLKID_VDEC_HEVCF_DIV]		= &g12a_vdec_hevcf_div.hw,
5204 	[CLKID_VDEC_HEVCF]		= &g12a_vdec_hevcf.hw,
5205 	[CLKID_TS_DIV]			= &g12a_ts_div.hw,
5206 	[CLKID_TS]			= &g12a_ts.hw,
5207 	[CLKID_GP1_PLL_DCO]		= &sm1_gp1_pll_dco.hw,
5208 	[CLKID_GP1_PLL]			= &sm1_gp1_pll.hw,
5209 	[CLKID_DSU_CLK_DYN0_SEL]	= &sm1_dsu_clk_premux0.hw,
5210 	[CLKID_DSU_CLK_DYN0_DIV]	= &sm1_dsu_clk_premux1.hw,
5211 	[CLKID_DSU_CLK_DYN0]		= &sm1_dsu_clk_mux0_div.hw,
5212 	[CLKID_DSU_CLK_DYN1_SEL]	= &sm1_dsu_clk_postmux0.hw,
5213 	[CLKID_DSU_CLK_DYN1_DIV]	= &sm1_dsu_clk_mux1_div.hw,
5214 	[CLKID_DSU_CLK_DYN1]		= &sm1_dsu_clk_postmux1.hw,
5215 	[CLKID_DSU_CLK_DYN]		= &sm1_dsu_clk_dyn.hw,
5216 	[CLKID_DSU_CLK_FINAL]		= &sm1_dsu_final_clk.hw,
5217 	[CLKID_DSU_CLK]			= &sm1_dsu_clk.hw,
5218 	[CLKID_CPU1_CLK]		= &sm1_cpu1_clk.hw,
5219 	[CLKID_CPU2_CLK]		= &sm1_cpu2_clk.hw,
5220 	[CLKID_CPU3_CLK]		= &sm1_cpu3_clk.hw,
5221 	[CLKID_SPICC0_SCLK_SEL]		= &g12a_spicc0_sclk_sel.hw,
5222 	[CLKID_SPICC0_SCLK_DIV]		= &g12a_spicc0_sclk_div.hw,
5223 	[CLKID_SPICC0_SCLK]		= &g12a_spicc0_sclk.hw,
5224 	[CLKID_SPICC1_SCLK_SEL]		= &g12a_spicc1_sclk_sel.hw,
5225 	[CLKID_SPICC1_SCLK_DIV]		= &g12a_spicc1_sclk_div.hw,
5226 	[CLKID_SPICC1_SCLK]		= &g12a_spicc1_sclk.hw,
5227 	[CLKID_NNA_AXI_CLK_SEL]		= &sm1_nna_axi_clk_sel.hw,
5228 	[CLKID_NNA_AXI_CLK_DIV]		= &sm1_nna_axi_clk_div.hw,
5229 	[CLKID_NNA_AXI_CLK]		= &sm1_nna_axi_clk.hw,
5230 	[CLKID_NNA_CORE_CLK_SEL]	= &sm1_nna_core_clk_sel.hw,
5231 	[CLKID_NNA_CORE_CLK_DIV]	= &sm1_nna_core_clk_div.hw,
5232 	[CLKID_NNA_CORE_CLK]		= &sm1_nna_core_clk.hw,
5233 	[CLKID_MIPI_DSI_PXCLK_SEL]	= &g12a_mipi_dsi_pxclk_sel.hw,
5234 	[CLKID_MIPI_DSI_PXCLK_DIV]	= &g12a_mipi_dsi_pxclk_div.hw,
5235 	[CLKID_MIPI_DSI_PXCLK]		= &g12a_mipi_dsi_pxclk.hw,
5236 };
5237 
5238 static const struct reg_sequence g12a_init_regs[] = {
5239 	{ .reg = HHI_MPLL_CNTL0,	.def = 0x00000543 },
5240 };
5241 
5242 #define DVFS_CON_ID "dvfs"
5243 
meson_g12a_dvfs_setup_common(struct device * dev,struct clk_hw ** hws)5244 static int meson_g12a_dvfs_setup_common(struct device *dev,
5245 					struct clk_hw **hws)
5246 {
5247 	struct clk *notifier_clk;
5248 	struct clk_hw *xtal;
5249 	int ret;
5250 
5251 	xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
5252 
5253 	/* Setup clock notifier for cpu_clk_postmux0 */
5254 	g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
5255 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw,
5256 					   DVFS_CON_ID);
5257 	ret = devm_clk_notifier_register(dev, notifier_clk,
5258 					 &g12a_cpu_clk_postmux0_nb_data.nb);
5259 	if (ret) {
5260 		dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n");
5261 		return ret;
5262 	}
5263 
5264 	/* Setup clock notifier for cpu_clk_dyn mux */
5265 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw,
5266 					   DVFS_CON_ID);
5267 	ret = devm_clk_notifier_register(dev, notifier_clk,
5268 					 &g12a_cpu_clk_mux_nb);
5269 	if (ret) {
5270 		dev_err(dev, "failed to register the cpu_clk_dyn notifier\n");
5271 		return ret;
5272 	}
5273 
5274 	return 0;
5275 }
5276 
meson_g12b_dvfs_setup(struct platform_device * pdev)5277 static int meson_g12b_dvfs_setup(struct platform_device *pdev)
5278 {
5279 	struct clk_hw **hws = g12b_hw_clks;
5280 	struct device *dev = &pdev->dev;
5281 	struct clk *notifier_clk;
5282 	struct clk_hw *xtal;
5283 	int ret;
5284 
5285 	ret = meson_g12a_dvfs_setup_common(dev, hws);
5286 	if (ret)
5287 		return ret;
5288 
5289 	xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
5290 
5291 	/* Setup clock notifier for cpu_clk mux */
5292 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw,
5293 					   DVFS_CON_ID);
5294 	ret = devm_clk_notifier_register(dev, notifier_clk,
5295 					 &g12a_cpu_clk_mux_nb);
5296 	if (ret) {
5297 		dev_err(dev, "failed to register the cpu_clk notifier\n");
5298 		return ret;
5299 	}
5300 
5301 	/* Setup clock notifier for sys1_pll */
5302 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw,
5303 					   DVFS_CON_ID);
5304 	ret = devm_clk_notifier_register(dev, notifier_clk,
5305 					 &g12b_cpu_clk_sys1_pll_nb_data.nb);
5306 	if (ret) {
5307 		dev_err(dev, "failed to register the sys1_pll notifier\n");
5308 		return ret;
5309 	}
5310 
5311 	/* Add notifiers for the second CPU cluster */
5312 
5313 	/* Setup clock notifier for cpub_clk_postmux0 */
5314 	g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
5315 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw,
5316 					   DVFS_CON_ID);
5317 	ret = devm_clk_notifier_register(dev, notifier_clk,
5318 					 &g12b_cpub_clk_postmux0_nb_data.nb);
5319 	if (ret) {
5320 		dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n");
5321 		return ret;
5322 	}
5323 
5324 	/* Setup clock notifier for cpub_clk_dyn mux */
5325 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs");
5326 	ret = devm_clk_notifier_register(dev, notifier_clk,
5327 					 &g12a_cpu_clk_mux_nb);
5328 	if (ret) {
5329 		dev_err(dev, "failed to register the cpub_clk_dyn notifier\n");
5330 		return ret;
5331 	}
5332 
5333 	/* Setup clock notifier for cpub_clk mux */
5334 	notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID);
5335 	ret = devm_clk_notifier_register(dev, notifier_clk,
5336 					 &g12a_cpu_clk_mux_nb);
5337 	if (ret) {
5338 		dev_err(dev, "failed to register the cpub_clk notifier\n");
5339 		return ret;
5340 	}
5341 
5342 	/* Setup clock notifier for sys_pll */
5343 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
5344 	ret = devm_clk_notifier_register(dev, notifier_clk,
5345 					 &g12b_cpub_clk_sys_pll_nb_data.nb);
5346 	if (ret) {
5347 		dev_err(dev, "failed to register the sys_pll notifier\n");
5348 		return ret;
5349 	}
5350 
5351 	return 0;
5352 }
5353 
meson_g12a_dvfs_setup(struct platform_device * pdev)5354 static int meson_g12a_dvfs_setup(struct platform_device *pdev)
5355 {
5356 	struct clk_hw **hws = g12a_hw_clks;
5357 	struct device *dev = &pdev->dev;
5358 	struct clk *notifier_clk;
5359 	int ret;
5360 
5361 	ret = meson_g12a_dvfs_setup_common(dev, hws);
5362 	if (ret)
5363 		return ret;
5364 
5365 	/* Setup clock notifier for cpu_clk mux */
5366 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID);
5367 	ret = devm_clk_notifier_register(dev, notifier_clk,
5368 				    &g12a_cpu_clk_mux_nb);
5369 	if (ret) {
5370 		dev_err(dev, "failed to register the cpu_clk notifier\n");
5371 		return ret;
5372 	}
5373 
5374 	/* Setup clock notifier for sys_pll */
5375 	notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
5376 	ret = devm_clk_notifier_register(dev, notifier_clk,
5377 					 &g12a_sys_pll_nb_data.nb);
5378 	if (ret) {
5379 		dev_err(dev, "failed to register the sys_pll notifier\n");
5380 		return ret;
5381 	}
5382 
5383 	return 0;
5384 }
5385 
5386 struct meson_g12a_data {
5387 	const struct meson_eeclkc_data eeclkc_data;
5388 	int (*dvfs_setup)(struct platform_device *pdev);
5389 };
5390 
meson_g12a_probe(struct platform_device * pdev)5391 static int meson_g12a_probe(struct platform_device *pdev)
5392 {
5393 	const struct meson_eeclkc_data *eeclkc_data;
5394 	const struct meson_g12a_data *g12a_data;
5395 	int ret;
5396 
5397 	eeclkc_data = of_device_get_match_data(&pdev->dev);
5398 	if (!eeclkc_data)
5399 		return -EINVAL;
5400 
5401 	ret = meson_eeclkc_probe(pdev);
5402 	if (ret)
5403 		return ret;
5404 
5405 	g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
5406 				 eeclkc_data);
5407 
5408 	if (g12a_data->dvfs_setup)
5409 		return g12a_data->dvfs_setup(pdev);
5410 
5411 	return 0;
5412 }
5413 
5414 static const struct meson_g12a_data g12a_clkc_data = {
5415 	.eeclkc_data = {
5416 		.hw_clks = {
5417 			.hws = g12a_hw_clks,
5418 			.num = ARRAY_SIZE(g12a_hw_clks),
5419 		},
5420 		.init_regs = g12a_init_regs,
5421 		.init_count = ARRAY_SIZE(g12a_init_regs),
5422 	},
5423 	.dvfs_setup = meson_g12a_dvfs_setup,
5424 };
5425 
5426 static const struct meson_g12a_data g12b_clkc_data = {
5427 	.eeclkc_data = {
5428 		.hw_clks = {
5429 			.hws = g12b_hw_clks,
5430 			.num = ARRAY_SIZE(g12b_hw_clks),
5431 		},
5432 	},
5433 	.dvfs_setup = meson_g12b_dvfs_setup,
5434 };
5435 
5436 static const struct meson_g12a_data sm1_clkc_data = {
5437 	.eeclkc_data = {
5438 		.hw_clks = {
5439 			.hws = sm1_hw_clks,
5440 			.num = ARRAY_SIZE(sm1_hw_clks),
5441 		},
5442 	},
5443 	.dvfs_setup = meson_g12a_dvfs_setup,
5444 };
5445 
5446 static const struct of_device_id clkc_match_table[] = {
5447 	{
5448 		.compatible = "amlogic,g12a-clkc",
5449 		.data = &g12a_clkc_data.eeclkc_data
5450 	},
5451 	{
5452 		.compatible = "amlogic,g12b-clkc",
5453 		.data = &g12b_clkc_data.eeclkc_data
5454 	},
5455 	{
5456 		.compatible = "amlogic,sm1-clkc",
5457 		.data = &sm1_clkc_data.eeclkc_data
5458 	},
5459 	{}
5460 };
5461 MODULE_DEVICE_TABLE(of, clkc_match_table);
5462 
5463 static struct platform_driver g12a_driver = {
5464 	.probe		= meson_g12a_probe,
5465 	.driver		= {
5466 		.name	= "g12a-clkc",
5467 		.of_match_table = clkc_match_table,
5468 	},
5469 };
5470 module_platform_driver(g12a_driver);
5471 
5472 MODULE_DESCRIPTION("Amlogic G12/SM1 Main Clock Controller driver");
5473 MODULE_LICENSE("GPL");
5474 MODULE_IMPORT_NS("CLK_MESON");
5475