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