xref: /linux/drivers/clk/meson/gxbb.c (revision 1fd1dc41724319406b0aff221a352a400b0ddfc5)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2016 AmLogic, Inc.
4  * Michael Turquette <mturquette@baylibre.com>
5  */
6 
7 #include <linux/clk-provider.h>
8 #include <linux/init.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/platform_device.h>
11 #include <linux/module.h>
12 
13 #include "clk-regmap.h"
14 #include "clk-pll.h"
15 #include "clk-mpll.h"
16 #include "meson-clkc-utils.h"
17 #include "vid-pll-div.h"
18 
19 #include <dt-bindings/clock/gxbb-clkc.h>
20 
21 #define SCR				0x2c
22 #define TIMEOUT_VALUE			0x3c
23 
24 #define HHI_GP0_PLL_CNTL		0x40
25 #define HHI_GP0_PLL_CNTL2		0x44
26 #define HHI_GP0_PLL_CNTL3		0x48
27 #define HHI_GP0_PLL_CNTL4		0x4c
28 #define	HHI_GP0_PLL_CNTL5		0x50
29 #define	HHI_GP0_PLL_CNTL1		0x58
30 
31 #define HHI_XTAL_DIVN_CNTL		0xbc
32 #define HHI_TIMER90K			0xec
33 
34 #define HHI_MEM_PD_REG0			0x100
35 #define HHI_MEM_PD_REG1			0x104
36 #define HHI_VPU_MEM_PD_REG1		0x108
37 #define HHI_VIID_CLK_DIV		0x128
38 #define HHI_VIID_CLK_CNTL		0x12c
39 
40 #define HHI_GCLK_MPEG0			0x140
41 #define HHI_GCLK_MPEG1			0x144
42 #define HHI_GCLK_MPEG2			0x148
43 #define HHI_GCLK_OTHER			0x150
44 #define HHI_GCLK_AO			0x154
45 #define HHI_SYS_OSCIN_CNTL		0x158
46 #define HHI_SYS_CPU_CLK_CNTL1		0x15c
47 #define HHI_SYS_CPU_RESET_CNTL		0x160
48 #define HHI_VID_CLK_DIV			0x164
49 
50 #define HHI_MPEG_CLK_CNTL		0x174
51 #define HHI_AUD_CLK_CNTL		0x178
52 #define HHI_VID_CLK_CNTL		0x17c
53 #define HHI_AUD_CLK_CNTL2		0x190
54 #define HHI_VID_CLK_CNTL2		0x194
55 #define HHI_SYS_CPU_CLK_CNTL0		0x19c
56 #define HHI_VID_PLL_CLK_DIV		0x1a0
57 #define HHI_AUD_CLK_CNTL3		0x1a4
58 #define HHI_MALI_CLK_CNTL		0x1b0
59 #define HHI_VPU_CLK_CNTL		0x1bc
60 
61 #define HHI_HDMI_CLK_CNTL		0x1cc
62 #define HHI_VDEC_CLK_CNTL		0x1e0
63 #define HHI_VDEC2_CLK_CNTL		0x1e4
64 #define HHI_VDEC3_CLK_CNTL		0x1e8
65 #define HHI_VDEC4_CLK_CNTL		0x1ec
66 #define HHI_HDCP22_CLK_CNTL		0x1f0
67 #define HHI_VAPBCLK_CNTL		0x1f4
68 
69 #define HHI_VPU_CLKB_CNTL		0x20c
70 #define HHI_USB_CLK_CNTL		0x220
71 #define HHI_32K_CLK_CNTL		0x224
72 #define HHI_GEN_CLK_CNTL		0x228
73 
74 #define HHI_PCM_CLK_CNTL		0x258
75 #define HHI_NAND_CLK_CNTL		0x25c
76 #define HHI_SD_EMMC_CLK_CNTL		0x264
77 
78 #define HHI_MPLL_CNTL			0x280
79 #define HHI_MPLL_CNTL2			0x284
80 #define HHI_MPLL_CNTL3			0x288
81 #define HHI_MPLL_CNTL4			0x28c
82 #define HHI_MPLL_CNTL5			0x290
83 #define HHI_MPLL_CNTL6			0x294
84 #define HHI_MPLL_CNTL7			0x298
85 #define HHI_MPLL_CNTL8			0x29c
86 #define HHI_MPLL_CNTL9			0x2a0
87 #define HHI_MPLL_CNTL10			0x2a4
88 
89 #define HHI_MPLL3_CNTL0			0x2e0
90 #define HHI_MPLL3_CNTL1			0x2e4
91 #define HHI_VDAC_CNTL0			0x2f4
92 #define HHI_VDAC_CNTL1			0x2f8
93 
94 #define HHI_SYS_PLL_CNTL		0x300
95 #define HHI_SYS_PLL_CNTL2		0x304
96 #define HHI_SYS_PLL_CNTL3		0x308
97 #define HHI_SYS_PLL_CNTL4		0x30c
98 #define HHI_SYS_PLL_CNTL5		0x310
99 #define HHI_DPLL_TOP_I			0x318
100 #define HHI_DPLL_TOP2_I			0x31c
101 #define HHI_HDMI_PLL_CNTL		0x320
102 #define HHI_HDMI_PLL_CNTL2		0x324
103 #define HHI_HDMI_PLL_CNTL3		0x328
104 #define HHI_HDMI_PLL_CNTL4		0x32c
105 #define HHI_HDMI_PLL_CNTL5		0x330
106 #define HHI_HDMI_PLL_CNTL6		0x334
107 #define HHI_HDMI_PLL_CNTL_I		0x338
108 #define HHI_HDMI_PLL_CNTL7		0x33c
109 
110 #define HHI_HDMI_PHY_CNTL0		0x3a0
111 #define HHI_HDMI_PHY_CNTL1		0x3a4
112 #define HHI_HDMI_PHY_CNTL2		0x3a8
113 #define HHI_HDMI_PHY_CNTL3		0x3ac
114 
115 #define HHI_VID_LOCK_CLK_CNTL		0x3c8
116 #define HHI_BT656_CLK_CNTL		0x3d4
117 #define HHI_SAR_CLK_CNTL		0x3d8
118 
119 static struct clk_regmap gxbb_fixed_pll_dco = {
120 	.data = &(struct meson_clk_pll_data){
121 		.en = {
122 			.reg_off = HHI_MPLL_CNTL,
123 			.shift   = 30,
124 			.width   = 1,
125 		},
126 		.m = {
127 			.reg_off = HHI_MPLL_CNTL,
128 			.shift   = 0,
129 			.width   = 9,
130 		},
131 		.n = {
132 			.reg_off = HHI_MPLL_CNTL,
133 			.shift   = 9,
134 			.width   = 5,
135 		},
136 		.frac = {
137 			.reg_off = HHI_MPLL_CNTL2,
138 			.shift   = 0,
139 			.width   = 12,
140 		},
141 		.l = {
142 			.reg_off = HHI_MPLL_CNTL,
143 			.shift   = 31,
144 			.width   = 1,
145 		},
146 		.rst = {
147 			.reg_off = HHI_MPLL_CNTL,
148 			.shift   = 29,
149 			.width   = 1,
150 		},
151 	},
152 	.hw.init = &(struct clk_init_data){
153 		.name = "fixed_pll_dco",
154 		.ops = &meson_clk_pll_ro_ops,
155 		.parent_data = &(const struct clk_parent_data) {
156 			.fw_name = "xtal",
157 		},
158 		.num_parents = 1,
159 	},
160 };
161 
162 static struct clk_regmap gxbb_fixed_pll = {
163 	.data = &(struct clk_regmap_div_data){
164 		.offset = HHI_MPLL_CNTL,
165 		.shift = 16,
166 		.width = 2,
167 		.flags = CLK_DIVIDER_POWER_OF_TWO,
168 	},
169 	.hw.init = &(struct clk_init_data){
170 		.name = "fixed_pll",
171 		.ops = &clk_regmap_divider_ro_ops,
172 		.parent_hws = (const struct clk_hw *[]) {
173 			&gxbb_fixed_pll_dco.hw
174 		},
175 		.num_parents = 1,
176 		/*
177 		 * This clock won't ever change at runtime so
178 		 * CLK_SET_RATE_PARENT is not required
179 		 */
180 	},
181 };
182 
183 static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
184 	.mult = 2,
185 	.div = 1,
186 	.hw.init = &(struct clk_init_data){
187 		.name = "hdmi_pll_pre_mult",
188 		.ops = &clk_fixed_factor_ops,
189 		.parent_data = &(const struct clk_parent_data) {
190 			.fw_name = "xtal",
191 		},
192 		.num_parents = 1,
193 	},
194 };
195 
196 static struct clk_regmap gxbb_hdmi_pll_dco = {
197 	.data = &(struct meson_clk_pll_data){
198 		.en = {
199 			.reg_off = HHI_HDMI_PLL_CNTL,
200 			.shift   = 30,
201 			.width   = 1,
202 		},
203 		.m = {
204 			.reg_off = HHI_HDMI_PLL_CNTL,
205 			.shift   = 0,
206 			.width   = 9,
207 		},
208 		.n = {
209 			.reg_off = HHI_HDMI_PLL_CNTL,
210 			.shift   = 9,
211 			.width   = 5,
212 		},
213 		.frac = {
214 			.reg_off = HHI_HDMI_PLL_CNTL2,
215 			.shift   = 0,
216 			.width   = 12,
217 		},
218 		.l = {
219 			.reg_off = HHI_HDMI_PLL_CNTL,
220 			.shift   = 31,
221 			.width   = 1,
222 		},
223 		.rst = {
224 			.reg_off = HHI_HDMI_PLL_CNTL,
225 			.shift   = 28,
226 			.width   = 1,
227 		},
228 	},
229 	.hw.init = &(struct clk_init_data){
230 		.name = "hdmi_pll_dco",
231 		.ops = &meson_clk_pll_ro_ops,
232 		.parent_hws = (const struct clk_hw *[]) {
233 			&gxbb_hdmi_pll_pre_mult.hw
234 		},
235 		.num_parents = 1,
236 		/*
237 		 * Display directly handle hdmi pll registers ATM, we need
238 		 * NOCACHE to keep our view of the clock as accurate as possible
239 		 */
240 		.flags = CLK_GET_RATE_NOCACHE,
241 	},
242 };
243 
244 static struct clk_regmap gxl_hdmi_pll_dco = {
245 	.data = &(struct meson_clk_pll_data){
246 		.en = {
247 			.reg_off = HHI_HDMI_PLL_CNTL,
248 			.shift   = 30,
249 			.width   = 1,
250 		},
251 		.m = {
252 			.reg_off = HHI_HDMI_PLL_CNTL,
253 			.shift   = 0,
254 			.width   = 9,
255 		},
256 		.n = {
257 			.reg_off = HHI_HDMI_PLL_CNTL,
258 			.shift   = 9,
259 			.width   = 5,
260 		},
261 		/*
262 		 * On gxl, there is a register shift due to
263 		 * HHI_HDMI_PLL_CNTL1 which does not exist on gxbb,
264 		 * so we use the HHI_HDMI_PLL_CNTL2 define from GXBB
265 		 * instead which is defined at the same offset.
266 		 */
267 		.frac = {
268 			.reg_off = HHI_HDMI_PLL_CNTL2,
269 			.shift   = 0,
270 			.width   = 10,
271 		},
272 		.l = {
273 			.reg_off = HHI_HDMI_PLL_CNTL,
274 			.shift   = 31,
275 			.width   = 1,
276 		},
277 		.rst = {
278 			.reg_off = HHI_HDMI_PLL_CNTL,
279 			.shift   = 28,
280 			.width   = 1,
281 		},
282 	},
283 	.hw.init = &(struct clk_init_data){
284 		.name = "hdmi_pll_dco",
285 		.ops = &meson_clk_pll_ro_ops,
286 		.parent_data = &(const struct clk_parent_data) {
287 			.fw_name = "xtal",
288 		},
289 		.num_parents = 1,
290 		/*
291 		 * Display directly handle hdmi pll registers ATM, we need
292 		 * NOCACHE to keep our view of the clock as accurate as possible
293 		 */
294 		.flags = CLK_GET_RATE_NOCACHE,
295 	},
296 };
297 
298 static struct clk_regmap gxbb_hdmi_pll_od = {
299 	.data = &(struct clk_regmap_div_data){
300 		.offset = HHI_HDMI_PLL_CNTL2,
301 		.shift = 16,
302 		.width = 2,
303 		.flags = CLK_DIVIDER_POWER_OF_TWO,
304 	},
305 	.hw.init = &(struct clk_init_data){
306 		.name = "hdmi_pll_od",
307 		.ops = &clk_regmap_divider_ro_ops,
308 		.parent_hws = (const struct clk_hw *[]) {
309 			&gxbb_hdmi_pll_dco.hw
310 		},
311 		.num_parents = 1,
312 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
313 	},
314 };
315 
316 static struct clk_regmap gxbb_hdmi_pll_od2 = {
317 	.data = &(struct clk_regmap_div_data){
318 		.offset = HHI_HDMI_PLL_CNTL2,
319 		.shift = 22,
320 		.width = 2,
321 		.flags = CLK_DIVIDER_POWER_OF_TWO,
322 	},
323 	.hw.init = &(struct clk_init_data){
324 		.name = "hdmi_pll_od2",
325 		.ops = &clk_regmap_divider_ro_ops,
326 		.parent_hws = (const struct clk_hw *[]) {
327 			&gxbb_hdmi_pll_od.hw
328 		},
329 		.num_parents = 1,
330 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
331 	},
332 };
333 
334 static struct clk_regmap gxbb_hdmi_pll = {
335 	.data = &(struct clk_regmap_div_data){
336 		.offset = HHI_HDMI_PLL_CNTL2,
337 		.shift = 18,
338 		.width = 2,
339 		.flags = CLK_DIVIDER_POWER_OF_TWO,
340 	},
341 	.hw.init = &(struct clk_init_data){
342 		.name = "hdmi_pll",
343 		.ops = &clk_regmap_divider_ro_ops,
344 		.parent_hws = (const struct clk_hw *[]) {
345 			&gxbb_hdmi_pll_od2.hw
346 		},
347 		.num_parents = 1,
348 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
349 	},
350 };
351 
352 /*
353  * GXL hdmi OD dividers are POWER_OF_TWO dividers but limited to /4.
354  * A divider value of 3 should map to /8 but instead map /4 so ignore it.
355  */
356 static const struct clk_div_table gxl_hdmi_pll_od_div_table[] = {
357 	{ .val = 0, .div = 1 },
358 	{ .val = 1, .div = 2 },
359 	{ .val = 2, .div = 4 },
360 	{ /* sentinel */ }
361 };
362 
363 static struct clk_regmap gxl_hdmi_pll_od = {
364 	.data = &(struct clk_regmap_div_data){
365 		.offset = HHI_HDMI_PLL_CNTL3,
366 		.shift = 21,
367 		.width = 2,
368 		.table = gxl_hdmi_pll_od_div_table,
369 	},
370 	.hw.init = &(struct clk_init_data){
371 		.name = "hdmi_pll_od",
372 		.ops = &clk_regmap_divider_ro_ops,
373 		.parent_hws = (const struct clk_hw *[]) {
374 			&gxl_hdmi_pll_dco.hw
375 		},
376 		.num_parents = 1,
377 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
378 	},
379 };
380 
381 static struct clk_regmap gxl_hdmi_pll_od2 = {
382 	.data = &(struct clk_regmap_div_data){
383 		.offset = HHI_HDMI_PLL_CNTL3,
384 		.shift = 23,
385 		.width = 2,
386 		.table = gxl_hdmi_pll_od_div_table,
387 	},
388 	.hw.init = &(struct clk_init_data){
389 		.name = "hdmi_pll_od2",
390 		.ops = &clk_regmap_divider_ro_ops,
391 		.parent_hws = (const struct clk_hw *[]) {
392 			&gxl_hdmi_pll_od.hw
393 		},
394 		.num_parents = 1,
395 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
396 	},
397 };
398 
399 static struct clk_regmap gxl_hdmi_pll = {
400 	.data = &(struct clk_regmap_div_data){
401 		.offset = HHI_HDMI_PLL_CNTL3,
402 		.shift = 19,
403 		.width = 2,
404 		.table = gxl_hdmi_pll_od_div_table,
405 	},
406 	.hw.init = &(struct clk_init_data){
407 		.name = "hdmi_pll",
408 		.ops = &clk_regmap_divider_ro_ops,
409 		.parent_hws = (const struct clk_hw *[]) {
410 			&gxl_hdmi_pll_od2.hw
411 		},
412 		.num_parents = 1,
413 		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
414 	},
415 };
416 
417 static struct clk_regmap gxbb_sys_pll_dco = {
418 	.data = &(struct meson_clk_pll_data){
419 		.en = {
420 			.reg_off = HHI_SYS_PLL_CNTL,
421 			.shift   = 30,
422 			.width   = 1,
423 		},
424 		.m = {
425 			.reg_off = HHI_SYS_PLL_CNTL,
426 			.shift   = 0,
427 			.width   = 9,
428 		},
429 		.n = {
430 			.reg_off = HHI_SYS_PLL_CNTL,
431 			.shift   = 9,
432 			.width   = 5,
433 		},
434 		.l = {
435 			.reg_off = HHI_SYS_PLL_CNTL,
436 			.shift   = 31,
437 			.width   = 1,
438 		},
439 		.rst = {
440 			.reg_off = HHI_SYS_PLL_CNTL,
441 			.shift   = 29,
442 			.width   = 1,
443 		},
444 	},
445 	.hw.init = &(struct clk_init_data){
446 		.name = "sys_pll_dco",
447 		.ops = &meson_clk_pll_ro_ops,
448 		.parent_data = &(const struct clk_parent_data) {
449 			.fw_name = "xtal",
450 		},
451 		.num_parents = 1,
452 	},
453 };
454 
455 static struct clk_regmap gxbb_sys_pll = {
456 	.data = &(struct clk_regmap_div_data){
457 		.offset = HHI_SYS_PLL_CNTL,
458 		.shift = 10,
459 		.width = 2,
460 		.flags = CLK_DIVIDER_POWER_OF_TWO,
461 	},
462 	.hw.init = &(struct clk_init_data){
463 		.name = "sys_pll",
464 		.ops = &clk_regmap_divider_ro_ops,
465 		.parent_hws = (const struct clk_hw *[]) {
466 			&gxbb_sys_pll_dco.hw
467 		},
468 		.num_parents = 1,
469 		.flags = CLK_SET_RATE_PARENT,
470 	},
471 };
472 
473 static const struct pll_params_table gxbb_gp0_pll_params_table[] = {
474 	PLL_PARAMS(32, 1),
475 	PLL_PARAMS(33, 1),
476 	PLL_PARAMS(34, 1),
477 	PLL_PARAMS(35, 1),
478 	PLL_PARAMS(36, 1),
479 	PLL_PARAMS(37, 1),
480 	PLL_PARAMS(38, 1),
481 	PLL_PARAMS(39, 1),
482 	PLL_PARAMS(40, 1),
483 	PLL_PARAMS(41, 1),
484 	PLL_PARAMS(42, 1),
485 	PLL_PARAMS(43, 1),
486 	PLL_PARAMS(44, 1),
487 	PLL_PARAMS(45, 1),
488 	PLL_PARAMS(46, 1),
489 	PLL_PARAMS(47, 1),
490 	PLL_PARAMS(48, 1),
491 	PLL_PARAMS(49, 1),
492 	PLL_PARAMS(50, 1),
493 	PLL_PARAMS(51, 1),
494 	PLL_PARAMS(52, 1),
495 	PLL_PARAMS(53, 1),
496 	PLL_PARAMS(54, 1),
497 	PLL_PARAMS(55, 1),
498 	PLL_PARAMS(56, 1),
499 	PLL_PARAMS(57, 1),
500 	PLL_PARAMS(58, 1),
501 	PLL_PARAMS(59, 1),
502 	PLL_PARAMS(60, 1),
503 	PLL_PARAMS(61, 1),
504 	PLL_PARAMS(62, 1),
505 	{ /* sentinel */ },
506 };
507 
508 static const struct reg_sequence gxbb_gp0_pll_init_regs[] = {
509 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0x69c80000 },
510 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x0a5590c4 },
511 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0x0000500d },
512 };
513 
514 static struct clk_regmap gxbb_gp0_pll_dco = {
515 	.data = &(struct meson_clk_pll_data){
516 		.en = {
517 			.reg_off = HHI_GP0_PLL_CNTL,
518 			.shift   = 30,
519 			.width   = 1,
520 		},
521 		.m = {
522 			.reg_off = HHI_GP0_PLL_CNTL,
523 			.shift   = 0,
524 			.width   = 9,
525 		},
526 		.n = {
527 			.reg_off = HHI_GP0_PLL_CNTL,
528 			.shift   = 9,
529 			.width   = 5,
530 		},
531 		.l = {
532 			.reg_off = HHI_GP0_PLL_CNTL,
533 			.shift   = 31,
534 			.width   = 1,
535 		},
536 		.rst = {
537 			.reg_off = HHI_GP0_PLL_CNTL,
538 			.shift   = 29,
539 			.width   = 1,
540 		},
541 		.table = gxbb_gp0_pll_params_table,
542 		.init_regs = gxbb_gp0_pll_init_regs,
543 		.init_count = ARRAY_SIZE(gxbb_gp0_pll_init_regs),
544 	},
545 	.hw.init = &(struct clk_init_data){
546 		.name = "gp0_pll_dco",
547 		.ops = &meson_clk_pll_ops,
548 		.parent_data = &(const struct clk_parent_data) {
549 			.fw_name = "xtal",
550 		},
551 		.num_parents = 1,
552 	},
553 };
554 
555 static const struct pll_params_table gxl_gp0_pll_params_table[] = {
556 	PLL_PARAMS(42, 1),
557 	PLL_PARAMS(43, 1),
558 	PLL_PARAMS(44, 1),
559 	PLL_PARAMS(45, 1),
560 	PLL_PARAMS(46, 1),
561 	PLL_PARAMS(47, 1),
562 	PLL_PARAMS(48, 1),
563 	PLL_PARAMS(49, 1),
564 	PLL_PARAMS(50, 1),
565 	PLL_PARAMS(51, 1),
566 	PLL_PARAMS(52, 1),
567 	PLL_PARAMS(53, 1),
568 	PLL_PARAMS(54, 1),
569 	PLL_PARAMS(55, 1),
570 	PLL_PARAMS(56, 1),
571 	PLL_PARAMS(57, 1),
572 	PLL_PARAMS(58, 1),
573 	PLL_PARAMS(59, 1),
574 	PLL_PARAMS(60, 1),
575 	PLL_PARAMS(61, 1),
576 	PLL_PARAMS(62, 1),
577 	PLL_PARAMS(63, 1),
578 	PLL_PARAMS(64, 1),
579 	PLL_PARAMS(65, 1),
580 	PLL_PARAMS(66, 1),
581 	{ /* sentinel */ },
582 };
583 
584 static const struct reg_sequence gxl_gp0_pll_init_regs[] = {
585 	{ .reg = HHI_GP0_PLL_CNTL1,	.def = 0xc084b000 },
586 	{ .reg = HHI_GP0_PLL_CNTL2,	.def = 0xb75020be },
587 	{ .reg = HHI_GP0_PLL_CNTL3,	.def = 0x0a59a288 },
588 	{ .reg = HHI_GP0_PLL_CNTL4,	.def = 0xc000004d },
589 	{ .reg = HHI_GP0_PLL_CNTL5,	.def = 0x00078000 },
590 };
591 
592 static struct clk_regmap gxl_gp0_pll_dco = {
593 	.data = &(struct meson_clk_pll_data){
594 		.en = {
595 			.reg_off = HHI_GP0_PLL_CNTL,
596 			.shift   = 30,
597 			.width   = 1,
598 		},
599 		.m = {
600 			.reg_off = HHI_GP0_PLL_CNTL,
601 			.shift   = 0,
602 			.width   = 9,
603 		},
604 		.n = {
605 			.reg_off = HHI_GP0_PLL_CNTL,
606 			.shift   = 9,
607 			.width   = 5,
608 		},
609 		.frac = {
610 			.reg_off = HHI_GP0_PLL_CNTL1,
611 			.shift   = 0,
612 			.width   = 10,
613 		},
614 		.l = {
615 			.reg_off = HHI_GP0_PLL_CNTL,
616 			.shift   = 31,
617 			.width   = 1,
618 		},
619 		.rst = {
620 			.reg_off = HHI_GP0_PLL_CNTL,
621 			.shift   = 29,
622 			.width   = 1,
623 		},
624 		.table = gxl_gp0_pll_params_table,
625 		.init_regs = gxl_gp0_pll_init_regs,
626 		.init_count = ARRAY_SIZE(gxl_gp0_pll_init_regs),
627 	},
628 	.hw.init = &(struct clk_init_data){
629 		.name = "gp0_pll_dco",
630 		.ops = &meson_clk_pll_ops,
631 		.parent_data = &(const struct clk_parent_data) {
632 			.fw_name = "xtal",
633 		},
634 		.num_parents = 1,
635 	},
636 };
637 
638 static struct clk_regmap gxbb_gp0_pll = {
639 	.data = &(struct clk_regmap_div_data){
640 		.offset = HHI_GP0_PLL_CNTL,
641 		.shift = 16,
642 		.width = 2,
643 		.flags = CLK_DIVIDER_POWER_OF_TWO,
644 	},
645 	.hw.init = &(struct clk_init_data){
646 		.name = "gp0_pll",
647 		.ops = &clk_regmap_divider_ops,
648 		.parent_data = &(const struct clk_parent_data) {
649 			/*
650 			 * Note:
651 			 * GXL and GXBB have different gp0_pll_dco (with
652 			 * different struct clk_hw). We fallback to the global
653 			 * naming string mechanism so gp0_pll picks up the
654 			 * appropriate one.
655 			 */
656 			.name = "gp0_pll_dco",
657 			.index = -1,
658 		},
659 		.num_parents = 1,
660 		.flags = CLK_SET_RATE_PARENT,
661 	},
662 };
663 
664 static struct clk_fixed_factor gxbb_fclk_div2_div = {
665 	.mult = 1,
666 	.div = 2,
667 	.hw.init = &(struct clk_init_data){
668 		.name = "fclk_div2_div",
669 		.ops = &clk_fixed_factor_ops,
670 		.parent_hws = (const struct clk_hw *[]) {
671 			&gxbb_fixed_pll.hw
672 		},
673 		.num_parents = 1,
674 	},
675 };
676 
677 static struct clk_regmap gxbb_fclk_div2 = {
678 	.data = &(struct clk_regmap_gate_data){
679 		.offset = HHI_MPLL_CNTL6,
680 		.bit_idx = 27,
681 	},
682 	.hw.init = &(struct clk_init_data){
683 		.name = "fclk_div2",
684 		.ops = &clk_regmap_gate_ops,
685 		.parent_hws = (const struct clk_hw *[]) {
686 			&gxbb_fclk_div2_div.hw
687 		},
688 		.num_parents = 1,
689 		.flags = CLK_IS_CRITICAL,
690 	},
691 };
692 
693 static struct clk_fixed_factor gxbb_fclk_div3_div = {
694 	.mult = 1,
695 	.div = 3,
696 	.hw.init = &(struct clk_init_data){
697 		.name = "fclk_div3_div",
698 		.ops = &clk_fixed_factor_ops,
699 		.parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
700 		.num_parents = 1,
701 	},
702 };
703 
704 static struct clk_regmap gxbb_fclk_div3 = {
705 	.data = &(struct clk_regmap_gate_data){
706 		.offset = HHI_MPLL_CNTL6,
707 		.bit_idx = 28,
708 	},
709 	.hw.init = &(struct clk_init_data){
710 		.name = "fclk_div3",
711 		.ops = &clk_regmap_gate_ops,
712 		.parent_hws = (const struct clk_hw *[]) {
713 			&gxbb_fclk_div3_div.hw
714 		},
715 		.num_parents = 1,
716 		/*
717 		 * FIXME:
718 		 * This clock, as fdiv2, is used by the SCPI FW and is required
719 		 * by the platform to operate correctly.
720 		 * Until the following condition are met, we need this clock to
721 		 * be marked as critical:
722 		 * a) The SCPI generic driver claims and enable all the clocks
723 		 *    it needs
724 		 * b) CCF has a clock hand-off mechanism to make the sure the
725 		 *    clock stays on until the proper driver comes along
726 		 */
727 		.flags = CLK_IS_CRITICAL,
728 	},
729 };
730 
731 static struct clk_fixed_factor gxbb_fclk_div4_div = {
732 	.mult = 1,
733 	.div = 4,
734 	.hw.init = &(struct clk_init_data){
735 		.name = "fclk_div4_div",
736 		.ops = &clk_fixed_factor_ops,
737 		.parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
738 		.num_parents = 1,
739 	},
740 };
741 
742 static struct clk_regmap gxbb_fclk_div4 = {
743 	.data = &(struct clk_regmap_gate_data){
744 		.offset = HHI_MPLL_CNTL6,
745 		.bit_idx = 29,
746 	},
747 	.hw.init = &(struct clk_init_data){
748 		.name = "fclk_div4",
749 		.ops = &clk_regmap_gate_ops,
750 		.parent_hws = (const struct clk_hw *[]) {
751 			&gxbb_fclk_div4_div.hw
752 		},
753 		.num_parents = 1,
754 	},
755 };
756 
757 static struct clk_fixed_factor gxbb_fclk_div5_div = {
758 	.mult = 1,
759 	.div = 5,
760 	.hw.init = &(struct clk_init_data){
761 		.name = "fclk_div5_div",
762 		.ops = &clk_fixed_factor_ops,
763 		.parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
764 		.num_parents = 1,
765 	},
766 };
767 
768 static struct clk_regmap gxbb_fclk_div5 = {
769 	.data = &(struct clk_regmap_gate_data){
770 		.offset = HHI_MPLL_CNTL6,
771 		.bit_idx = 30,
772 	},
773 	.hw.init = &(struct clk_init_data){
774 		.name = "fclk_div5",
775 		.ops = &clk_regmap_gate_ops,
776 		.parent_hws = (const struct clk_hw *[]) {
777 			&gxbb_fclk_div5_div.hw
778 		},
779 		.num_parents = 1,
780 	},
781 };
782 
783 static struct clk_fixed_factor gxbb_fclk_div7_div = {
784 	.mult = 1,
785 	.div = 7,
786 	.hw.init = &(struct clk_init_data){
787 		.name = "fclk_div7_div",
788 		.ops = &clk_fixed_factor_ops,
789 		.parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
790 		.num_parents = 1,
791 	},
792 };
793 
794 static struct clk_regmap gxbb_fclk_div7 = {
795 	.data = &(struct clk_regmap_gate_data){
796 		.offset = HHI_MPLL_CNTL6,
797 		.bit_idx = 31,
798 	},
799 	.hw.init = &(struct clk_init_data){
800 		.name = "fclk_div7",
801 		.ops = &clk_regmap_gate_ops,
802 		.parent_hws = (const struct clk_hw *[]) {
803 			&gxbb_fclk_div7_div.hw
804 		},
805 		.num_parents = 1,
806 	},
807 };
808 
809 static struct clk_regmap gxbb_mpll_prediv = {
810 	.data = &(struct clk_regmap_div_data){
811 		.offset = HHI_MPLL_CNTL5,
812 		.shift = 12,
813 		.width = 1,
814 	},
815 	.hw.init = &(struct clk_init_data){
816 		.name = "mpll_prediv",
817 		.ops = &clk_regmap_divider_ro_ops,
818 		.parent_hws = (const struct clk_hw *[]) { &gxbb_fixed_pll.hw },
819 		.num_parents = 1,
820 	},
821 };
822 
823 static struct clk_regmap gxbb_mpll0_div = {
824 	.data = &(struct meson_clk_mpll_data){
825 		.sdm = {
826 			.reg_off = HHI_MPLL_CNTL7,
827 			.shift   = 0,
828 			.width   = 14,
829 		},
830 		.sdm_en = {
831 			.reg_off = HHI_MPLL_CNTL,
832 			.shift   = 25,
833 			.width	 = 1,
834 		},
835 		.n2 = {
836 			.reg_off = HHI_MPLL_CNTL7,
837 			.shift   = 16,
838 			.width   = 9,
839 		},
840 	},
841 	.hw.init = &(struct clk_init_data){
842 		.name = "mpll0_div",
843 		.ops = &meson_clk_mpll_ops,
844 		.parent_hws = (const struct clk_hw *[]) {
845 			&gxbb_mpll_prediv.hw
846 		},
847 		.num_parents = 1,
848 	},
849 };
850 
851 static struct clk_regmap gxl_mpll0_div = {
852 	.data = &(struct meson_clk_mpll_data){
853 		.sdm = {
854 			.reg_off = HHI_MPLL_CNTL7,
855 			.shift   = 0,
856 			.width   = 14,
857 		},
858 		.sdm_en = {
859 			.reg_off = HHI_MPLL_CNTL7,
860 			.shift   = 15,
861 			.width	 = 1,
862 		},
863 		.n2 = {
864 			.reg_off = HHI_MPLL_CNTL7,
865 			.shift   = 16,
866 			.width   = 9,
867 		},
868 	},
869 	.hw.init = &(struct clk_init_data){
870 		.name = "mpll0_div",
871 		.ops = &meson_clk_mpll_ops,
872 		.parent_hws = (const struct clk_hw *[]) {
873 			&gxbb_mpll_prediv.hw
874 		},
875 		.num_parents = 1,
876 	},
877 };
878 
879 static struct clk_regmap gxbb_mpll0 = {
880 	.data = &(struct clk_regmap_gate_data){
881 		.offset = HHI_MPLL_CNTL7,
882 		.bit_idx = 14,
883 	},
884 	.hw.init = &(struct clk_init_data){
885 		.name = "mpll0",
886 		.ops = &clk_regmap_gate_ops,
887 		.parent_data = &(const struct clk_parent_data) {
888 			/*
889 			 * Note:
890 			 * GXL and GXBB have different SDM_EN registers. We
891 			 * fallback to the global naming string mechanism so
892 			 * mpll0_div picks up the appropriate one.
893 			 */
894 			.name = "mpll0_div",
895 			.index = -1,
896 		},
897 		.num_parents = 1,
898 		.flags = CLK_SET_RATE_PARENT,
899 	},
900 };
901 
902 static struct clk_regmap gxbb_mpll1_div = {
903 	.data = &(struct meson_clk_mpll_data){
904 		.sdm = {
905 			.reg_off = HHI_MPLL_CNTL8,
906 			.shift   = 0,
907 			.width   = 14,
908 		},
909 		.sdm_en = {
910 			.reg_off = HHI_MPLL_CNTL8,
911 			.shift   = 15,
912 			.width	 = 1,
913 		},
914 		.n2 = {
915 			.reg_off = HHI_MPLL_CNTL8,
916 			.shift   = 16,
917 			.width   = 9,
918 		},
919 	},
920 	.hw.init = &(struct clk_init_data){
921 		.name = "mpll1_div",
922 		.ops = &meson_clk_mpll_ops,
923 		.parent_hws = (const struct clk_hw *[]) {
924 			&gxbb_mpll_prediv.hw
925 		},
926 		.num_parents = 1,
927 	},
928 };
929 
930 static struct clk_regmap gxbb_mpll1 = {
931 	.data = &(struct clk_regmap_gate_data){
932 		.offset = HHI_MPLL_CNTL8,
933 		.bit_idx = 14,
934 	},
935 	.hw.init = &(struct clk_init_data){
936 		.name = "mpll1",
937 		.ops = &clk_regmap_gate_ops,
938 		.parent_hws = (const struct clk_hw *[]) { &gxbb_mpll1_div.hw },
939 		.num_parents = 1,
940 		.flags = CLK_SET_RATE_PARENT,
941 	},
942 };
943 
944 static struct clk_regmap gxbb_mpll2_div = {
945 	.data = &(struct meson_clk_mpll_data){
946 		.sdm = {
947 			.reg_off = HHI_MPLL_CNTL9,
948 			.shift   = 0,
949 			.width   = 14,
950 		},
951 		.sdm_en = {
952 			.reg_off = HHI_MPLL_CNTL9,
953 			.shift   = 15,
954 			.width	 = 1,
955 		},
956 		.n2 = {
957 			.reg_off = HHI_MPLL_CNTL9,
958 			.shift   = 16,
959 			.width   = 9,
960 		},
961 	},
962 	.hw.init = &(struct clk_init_data){
963 		.name = "mpll2_div",
964 		.ops = &meson_clk_mpll_ops,
965 		.parent_hws = (const struct clk_hw *[]) {
966 			&gxbb_mpll_prediv.hw
967 		},
968 		.num_parents = 1,
969 	},
970 };
971 
972 static struct clk_regmap gxbb_mpll2 = {
973 	.data = &(struct clk_regmap_gate_data){
974 		.offset = HHI_MPLL_CNTL9,
975 		.bit_idx = 14,
976 	},
977 	.hw.init = &(struct clk_init_data){
978 		.name = "mpll2",
979 		.ops = &clk_regmap_gate_ops,
980 		.parent_hws = (const struct clk_hw *[]) { &gxbb_mpll2_div.hw },
981 		.num_parents = 1,
982 		.flags = CLK_SET_RATE_PARENT,
983 	},
984 };
985 
986 /* clk81 is often referred as "mpeg_clk" */
987 static u32 clk81_parents_val_table[] = { 0, 2, 3, 4, 5, 6, 7 };
988 static const struct clk_parent_data clk81_parents[] = {
989 	{ .fw_name = "xtal", },
990 	{ .hw = &gxbb_fclk_div7.hw },
991 	{ .hw = &gxbb_mpll1.hw },
992 	{ .hw = &gxbb_mpll2.hw },
993 	{ .hw = &gxbb_fclk_div4.hw },
994 	{ .hw = &gxbb_fclk_div3.hw },
995 	{ .hw = &gxbb_fclk_div5.hw },
996 };
997 
998 static struct clk_regmap gxbb_clk81_sel = {
999 	.data = &(struct clk_regmap_mux_data){
1000 		.offset = HHI_MPEG_CLK_CNTL,
1001 		.mask = 0x7,
1002 		.shift = 12,
1003 		.table = clk81_parents_val_table,
1004 	},
1005 	.hw.init = &(struct clk_init_data){
1006 		.name = "clk81_sel",
1007 		.ops = &clk_regmap_mux_ro_ops,
1008 		/*
1009 		 * bits 14:12 selects from 8 possible parents:
1010 		 * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2,
1011 		 * fclk_div4, fclk_div3, fclk_div5
1012 		 */
1013 		.parent_data = clk81_parents,
1014 		.num_parents = ARRAY_SIZE(clk81_parents),
1015 	},
1016 };
1017 
1018 static struct clk_regmap gxbb_clk81_div = {
1019 	.data = &(struct clk_regmap_div_data){
1020 		.offset = HHI_MPEG_CLK_CNTL,
1021 		.shift = 0,
1022 		.width = 7,
1023 	},
1024 	.hw.init = &(struct clk_init_data){
1025 		.name = "clk81_div",
1026 		.ops = &clk_regmap_divider_ro_ops,
1027 		.parent_hws = (const struct clk_hw *[]) {
1028 			&gxbb_clk81_sel.hw
1029 		},
1030 		.num_parents = 1,
1031 	},
1032 };
1033 
1034 /* the mother of dragons gates */
1035 static struct clk_regmap gxbb_clk81 = {
1036 	.data = &(struct clk_regmap_gate_data){
1037 		.offset = HHI_MPEG_CLK_CNTL,
1038 		.bit_idx = 7,
1039 	},
1040 	.hw.init = &(struct clk_init_data){
1041 		.name = "clk81",
1042 		.ops = &clk_regmap_gate_ops,
1043 		.parent_hws = (const struct clk_hw *[]) {
1044 			&gxbb_clk81_div.hw
1045 		},
1046 		.num_parents = 1,
1047 		.flags = CLK_IS_CRITICAL,
1048 	},
1049 };
1050 
1051 static struct clk_regmap gxbb_sar_adc_clk_sel = {
1052 	.data = &(struct clk_regmap_mux_data){
1053 		.offset = HHI_SAR_CLK_CNTL,
1054 		.mask = 0x3,
1055 		.shift = 9,
1056 	},
1057 	.hw.init = &(struct clk_init_data){
1058 		.name = "sar_adc_clk_sel",
1059 		.ops = &clk_regmap_mux_ops,
1060 		/* NOTE: The datasheet doesn't list the parents for bit 10 */
1061 		.parent_data = (const struct clk_parent_data []) {
1062 			{ .fw_name = "xtal", },
1063 			{ .hw = &gxbb_clk81.hw },
1064 		},
1065 		.num_parents = 2,
1066 	},
1067 };
1068 
1069 static struct clk_regmap gxbb_sar_adc_clk_div = {
1070 	.data = &(struct clk_regmap_div_data){
1071 		.offset = HHI_SAR_CLK_CNTL,
1072 		.shift = 0,
1073 		.width = 8,
1074 	},
1075 	.hw.init = &(struct clk_init_data){
1076 		.name = "sar_adc_clk_div",
1077 		.ops = &clk_regmap_divider_ops,
1078 		.parent_hws = (const struct clk_hw *[]) {
1079 			&gxbb_sar_adc_clk_sel.hw
1080 		},
1081 		.num_parents = 1,
1082 		.flags = CLK_SET_RATE_PARENT,
1083 	},
1084 };
1085 
1086 static struct clk_regmap gxbb_sar_adc_clk = {
1087 	.data = &(struct clk_regmap_gate_data){
1088 		.offset = HHI_SAR_CLK_CNTL,
1089 		.bit_idx = 8,
1090 	},
1091 	.hw.init = &(struct clk_init_data){
1092 		.name = "sar_adc_clk",
1093 		.ops = &clk_regmap_gate_ops,
1094 		.parent_hws = (const struct clk_hw *[]) {
1095 			&gxbb_sar_adc_clk_div.hw
1096 		},
1097 		.num_parents = 1,
1098 		.flags = CLK_SET_RATE_PARENT,
1099 	},
1100 };
1101 
1102 /*
1103  * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
1104  * muxed by a glitch-free switch. The CCF can manage this glitch-free
1105  * mux because it does top-to-bottom updates the each clock tree and
1106  * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
1107  */
1108 
1109 static const struct clk_parent_data gxbb_mali_parents[] = {
1110 	{ .fw_name = "xtal", },
1111 	{ .hw = &gxbb_gp0_pll.hw },
1112 	{ .hw = &gxbb_mpll2.hw },
1113 	{ .hw = &gxbb_mpll1.hw },
1114 	{ .hw = &gxbb_fclk_div7.hw },
1115 	{ .hw = &gxbb_fclk_div4.hw },
1116 	{ .hw = &gxbb_fclk_div3.hw },
1117 	{ .hw = &gxbb_fclk_div5.hw },
1118 };
1119 
1120 static struct clk_regmap gxbb_mali_0_sel = {
1121 	.data = &(struct clk_regmap_mux_data){
1122 		.offset = HHI_MALI_CLK_CNTL,
1123 		.mask = 0x7,
1124 		.shift = 9,
1125 	},
1126 	.hw.init = &(struct clk_init_data){
1127 		.name = "mali_0_sel",
1128 		.ops = &clk_regmap_mux_ops,
1129 		.parent_data = gxbb_mali_parents,
1130 		.num_parents = ARRAY_SIZE(gxbb_mali_parents),
1131 		/*
1132 		 * Don't request the parent to change the rate because
1133 		 * all GPU frequencies can be derived from the fclk_*
1134 		 * clocks and one special GP0_PLL setting. This is
1135 		 * important because we need the MPLL clocks for audio.
1136 		 */
1137 		.flags = 0,
1138 	},
1139 };
1140 
1141 static struct clk_regmap gxbb_mali_0_div = {
1142 	.data = &(struct clk_regmap_div_data){
1143 		.offset = HHI_MALI_CLK_CNTL,
1144 		.shift = 0,
1145 		.width = 7,
1146 	},
1147 	.hw.init = &(struct clk_init_data){
1148 		.name = "mali_0_div",
1149 		.ops = &clk_regmap_divider_ops,
1150 		.parent_hws = (const struct clk_hw *[]) {
1151 			&gxbb_mali_0_sel.hw
1152 		},
1153 		.num_parents = 1,
1154 		.flags = CLK_SET_RATE_PARENT,
1155 	},
1156 };
1157 
1158 static struct clk_regmap gxbb_mali_0 = {
1159 	.data = &(struct clk_regmap_gate_data){
1160 		.offset = HHI_MALI_CLK_CNTL,
1161 		.bit_idx = 8,
1162 	},
1163 	.hw.init = &(struct clk_init_data){
1164 		.name = "mali_0",
1165 		.ops = &clk_regmap_gate_ops,
1166 		.parent_hws = (const struct clk_hw *[]) {
1167 			&gxbb_mali_0_div.hw
1168 		},
1169 		.num_parents = 1,
1170 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
1171 	},
1172 };
1173 
1174 static struct clk_regmap gxbb_mali_1_sel = {
1175 	.data = &(struct clk_regmap_mux_data){
1176 		.offset = HHI_MALI_CLK_CNTL,
1177 		.mask = 0x7,
1178 		.shift = 25,
1179 	},
1180 	.hw.init = &(struct clk_init_data){
1181 		.name = "mali_1_sel",
1182 		.ops = &clk_regmap_mux_ops,
1183 		.parent_data = gxbb_mali_parents,
1184 		.num_parents = ARRAY_SIZE(gxbb_mali_parents),
1185 		/*
1186 		 * Don't request the parent to change the rate because
1187 		 * all GPU frequencies can be derived from the fclk_*
1188 		 * clocks and one special GP0_PLL setting. This is
1189 		 * important because we need the MPLL clocks for audio.
1190 		 */
1191 		.flags = 0,
1192 	},
1193 };
1194 
1195 static struct clk_regmap gxbb_mali_1_div = {
1196 	.data = &(struct clk_regmap_div_data){
1197 		.offset = HHI_MALI_CLK_CNTL,
1198 		.shift = 16,
1199 		.width = 7,
1200 	},
1201 	.hw.init = &(struct clk_init_data){
1202 		.name = "mali_1_div",
1203 		.ops = &clk_regmap_divider_ops,
1204 		.parent_hws = (const struct clk_hw *[]) {
1205 			&gxbb_mali_1_sel.hw
1206 		},
1207 		.num_parents = 1,
1208 		.flags = CLK_SET_RATE_PARENT,
1209 	},
1210 };
1211 
1212 static struct clk_regmap gxbb_mali_1 = {
1213 	.data = &(struct clk_regmap_gate_data){
1214 		.offset = HHI_MALI_CLK_CNTL,
1215 		.bit_idx = 24,
1216 	},
1217 	.hw.init = &(struct clk_init_data){
1218 		.name = "mali_1",
1219 		.ops = &clk_regmap_gate_ops,
1220 		.parent_hws = (const struct clk_hw *[]) {
1221 			&gxbb_mali_1_div.hw
1222 		},
1223 		.num_parents = 1,
1224 		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
1225 	},
1226 };
1227 
1228 static struct clk_regmap gxbb_mali = {
1229 	.data = &(struct clk_regmap_mux_data){
1230 		.offset = HHI_MALI_CLK_CNTL,
1231 		.mask = 1,
1232 		.shift = 31,
1233 	},
1234 	.hw.init = &(struct clk_init_data){
1235 		.name = "mali",
1236 		.ops = &clk_regmap_mux_ops,
1237 		.parent_hws = (const struct clk_hw *[]) {
1238 			&gxbb_mali_0.hw,
1239 			&gxbb_mali_1.hw,
1240 		},
1241 		.num_parents = 2,
1242 		.flags = CLK_SET_RATE_PARENT,
1243 	},
1244 };
1245 
1246 static u32 gxbb_cts_mclk_parents_val_table[] = { 1, 2, 3 };
1247 static const struct clk_hw *gxbb_cts_mclk_parents[] = {
1248 	&gxbb_mpll0.hw,
1249 	&gxbb_mpll1.hw,
1250 	&gxbb_mpll2.hw,
1251 };
1252 
1253 static struct clk_regmap gxbb_cts_amclk_sel = {
1254 	.data = &(struct clk_regmap_mux_data){
1255 		.offset = HHI_AUD_CLK_CNTL,
1256 		.mask = 0x3,
1257 		.shift = 9,
1258 		.table = gxbb_cts_mclk_parents_val_table,
1259 		.flags = CLK_MUX_ROUND_CLOSEST,
1260 	},
1261 	.hw.init = &(struct clk_init_data){
1262 		.name = "cts_amclk_sel",
1263 		.ops = &clk_regmap_mux_ops,
1264 		.parent_hws = gxbb_cts_mclk_parents,
1265 		.num_parents = ARRAY_SIZE(gxbb_cts_mclk_parents),
1266 	},
1267 };
1268 
1269 static struct clk_regmap gxbb_cts_amclk_div = {
1270 	.data = &(struct clk_regmap_div_data) {
1271 		.offset = HHI_AUD_CLK_CNTL,
1272 		.shift = 0,
1273 		.width = 8,
1274 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1275 	},
1276 	.hw.init = &(struct clk_init_data){
1277 		.name = "cts_amclk_div",
1278 		.ops = &clk_regmap_divider_ops,
1279 		.parent_hws = (const struct clk_hw *[]) {
1280 			&gxbb_cts_amclk_sel.hw
1281 		},
1282 		.num_parents = 1,
1283 		.flags = CLK_SET_RATE_PARENT,
1284 	},
1285 };
1286 
1287 static struct clk_regmap gxbb_cts_amclk = {
1288 	.data = &(struct clk_regmap_gate_data){
1289 		.offset = HHI_AUD_CLK_CNTL,
1290 		.bit_idx = 8,
1291 	},
1292 	.hw.init = &(struct clk_init_data){
1293 		.name = "cts_amclk",
1294 		.ops = &clk_regmap_gate_ops,
1295 		.parent_hws = (const struct clk_hw *[]) {
1296 			&gxbb_cts_amclk_div.hw
1297 		},
1298 		.num_parents = 1,
1299 		.flags = CLK_SET_RATE_PARENT,
1300 	},
1301 };
1302 
1303 static struct clk_regmap gxbb_cts_mclk_i958_sel = {
1304 	.data = &(struct clk_regmap_mux_data){
1305 		.offset = HHI_AUD_CLK_CNTL2,
1306 		.mask = 0x3,
1307 		.shift = 25,
1308 		.table = gxbb_cts_mclk_parents_val_table,
1309 		.flags = CLK_MUX_ROUND_CLOSEST,
1310 	},
1311 	.hw.init = &(struct clk_init_data) {
1312 		.name = "cts_mclk_i958_sel",
1313 		.ops = &clk_regmap_mux_ops,
1314 		.parent_hws = gxbb_cts_mclk_parents,
1315 		.num_parents = ARRAY_SIZE(gxbb_cts_mclk_parents),
1316 	},
1317 };
1318 
1319 static struct clk_regmap gxbb_cts_mclk_i958_div = {
1320 	.data = &(struct clk_regmap_div_data){
1321 		.offset = HHI_AUD_CLK_CNTL2,
1322 		.shift = 16,
1323 		.width = 8,
1324 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1325 	},
1326 	.hw.init = &(struct clk_init_data) {
1327 		.name = "cts_mclk_i958_div",
1328 		.ops = &clk_regmap_divider_ops,
1329 		.parent_hws = (const struct clk_hw *[]) {
1330 			&gxbb_cts_mclk_i958_sel.hw
1331 		},
1332 		.num_parents = 1,
1333 		.flags = CLK_SET_RATE_PARENT,
1334 	},
1335 };
1336 
1337 static struct clk_regmap gxbb_cts_mclk_i958 = {
1338 	.data = &(struct clk_regmap_gate_data){
1339 		.offset = HHI_AUD_CLK_CNTL2,
1340 		.bit_idx = 24,
1341 	},
1342 	.hw.init = &(struct clk_init_data){
1343 		.name = "cts_mclk_i958",
1344 		.ops = &clk_regmap_gate_ops,
1345 		.parent_hws = (const struct clk_hw *[]) {
1346 			&gxbb_cts_mclk_i958_div.hw
1347 		},
1348 		.num_parents = 1,
1349 		.flags = CLK_SET_RATE_PARENT,
1350 	},
1351 };
1352 
1353 static struct clk_regmap gxbb_cts_i958 = {
1354 	.data = &(struct clk_regmap_mux_data){
1355 		.offset = HHI_AUD_CLK_CNTL2,
1356 		.mask = 0x1,
1357 		.shift = 27,
1358 		},
1359 	.hw.init = &(struct clk_init_data){
1360 		.name = "cts_i958",
1361 		.ops = &clk_regmap_mux_ops,
1362 		.parent_hws = (const struct clk_hw *[]) {
1363 			&gxbb_cts_amclk.hw,
1364 			&gxbb_cts_mclk_i958.hw
1365 		},
1366 		.num_parents = 2,
1367 		/*
1368 		 *The parent is specific to origin of the audio data. Let the
1369 		 * consumer choose the appropriate parent
1370 		 */
1371 		.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
1372 	},
1373 };
1374 
1375 /*
1376  * This table skips a clock named 'cts_slow_oscin' in the documentation
1377  * This clock does not exist yet in this controller or the AO one
1378  */
1379 static u32 gxbb_32k_clk_parents_val_table[] = { 0, 2, 3 };
1380 static const struct clk_parent_data gxbb_32k_clk_parents[] = {
1381 	{ .fw_name = "xtal", },
1382 	{ .hw = &gxbb_fclk_div3.hw },
1383 	{ .hw = &gxbb_fclk_div5.hw },
1384 };
1385 
1386 static struct clk_regmap gxbb_32k_clk_sel = {
1387 	.data = &(struct clk_regmap_mux_data){
1388 		.offset = HHI_32K_CLK_CNTL,
1389 		.mask = 0x3,
1390 		.shift = 16,
1391 		.table = gxbb_32k_clk_parents_val_table,
1392 	},
1393 	.hw.init = &(struct clk_init_data){
1394 		.name = "32k_clk_sel",
1395 		.ops = &clk_regmap_mux_ops,
1396 		.parent_data = gxbb_32k_clk_parents,
1397 		.num_parents = 4,
1398 		.flags = CLK_SET_RATE_PARENT,
1399 	},
1400 };
1401 
1402 static struct clk_regmap gxbb_32k_clk_div = {
1403 	.data = &(struct clk_regmap_div_data){
1404 		.offset = HHI_32K_CLK_CNTL,
1405 		.shift = 0,
1406 		.width = 14,
1407 	},
1408 	.hw.init = &(struct clk_init_data){
1409 		.name = "32k_clk_div",
1410 		.ops = &clk_regmap_divider_ops,
1411 		.parent_hws = (const struct clk_hw *[]) {
1412 			&gxbb_32k_clk_sel.hw
1413 		},
1414 		.num_parents = 1,
1415 		.flags = CLK_SET_RATE_PARENT,
1416 	},
1417 };
1418 
1419 static struct clk_regmap gxbb_32k_clk = {
1420 	.data = &(struct clk_regmap_gate_data){
1421 		.offset = HHI_32K_CLK_CNTL,
1422 		.bit_idx = 15,
1423 	},
1424 	.hw.init = &(struct clk_init_data){
1425 		.name = "32k_clk",
1426 		.ops = &clk_regmap_gate_ops,
1427 		.parent_hws = (const struct clk_hw *[]) {
1428 			&gxbb_32k_clk_div.hw
1429 		},
1430 		.num_parents = 1,
1431 		.flags = CLK_SET_RATE_PARENT,
1432 	},
1433 };
1434 
1435 static const struct clk_parent_data gxbb_sd_emmc_clk0_parents[] = {
1436 	{ .fw_name = "xtal", },
1437 	{ .hw = &gxbb_fclk_div2.hw },
1438 	{ .hw = &gxbb_fclk_div3.hw },
1439 	{ .hw = &gxbb_fclk_div5.hw },
1440 	{ .hw = &gxbb_fclk_div7.hw },
1441 	/*
1442 	 * Following these parent clocks, we should also have had mpll2, mpll3
1443 	 * and gp0_pll but these clocks are too precious to be used here. All
1444 	 * the necessary rates for MMC and NAND operation can be achieved using
1445 	 * xtal or fclk_div clocks
1446 	 */
1447 };
1448 
1449 /* SDIO clock */
1450 static struct clk_regmap gxbb_sd_emmc_a_clk0_sel = {
1451 	.data = &(struct clk_regmap_mux_data){
1452 		.offset = HHI_SD_EMMC_CLK_CNTL,
1453 		.mask = 0x7,
1454 		.shift = 9,
1455 	},
1456 	.hw.init = &(struct clk_init_data) {
1457 		.name = "sd_emmc_a_clk0_sel",
1458 		.ops = &clk_regmap_mux_ops,
1459 		.parent_data = gxbb_sd_emmc_clk0_parents,
1460 		.num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parents),
1461 		.flags = CLK_SET_RATE_PARENT,
1462 	},
1463 };
1464 
1465 static struct clk_regmap gxbb_sd_emmc_a_clk0_div = {
1466 	.data = &(struct clk_regmap_div_data){
1467 		.offset = HHI_SD_EMMC_CLK_CNTL,
1468 		.shift = 0,
1469 		.width = 7,
1470 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1471 	},
1472 	.hw.init = &(struct clk_init_data) {
1473 		.name = "sd_emmc_a_clk0_div",
1474 		.ops = &clk_regmap_divider_ops,
1475 		.parent_hws = (const struct clk_hw *[]) {
1476 			&gxbb_sd_emmc_a_clk0_sel.hw
1477 		},
1478 		.num_parents = 1,
1479 		.flags = CLK_SET_RATE_PARENT,
1480 	},
1481 };
1482 
1483 static struct clk_regmap gxbb_sd_emmc_a_clk0 = {
1484 	.data = &(struct clk_regmap_gate_data){
1485 		.offset = HHI_SD_EMMC_CLK_CNTL,
1486 		.bit_idx = 7,
1487 	},
1488 	.hw.init = &(struct clk_init_data){
1489 		.name = "sd_emmc_a_clk0",
1490 		.ops = &clk_regmap_gate_ops,
1491 		.parent_hws = (const struct clk_hw *[]) {
1492 			&gxbb_sd_emmc_a_clk0_div.hw
1493 		},
1494 		.num_parents = 1,
1495 		.flags = CLK_SET_RATE_PARENT,
1496 	},
1497 };
1498 
1499 /* SDcard clock */
1500 static struct clk_regmap gxbb_sd_emmc_b_clk0_sel = {
1501 	.data = &(struct clk_regmap_mux_data){
1502 		.offset = HHI_SD_EMMC_CLK_CNTL,
1503 		.mask = 0x7,
1504 		.shift = 25,
1505 	},
1506 	.hw.init = &(struct clk_init_data) {
1507 		.name = "sd_emmc_b_clk0_sel",
1508 		.ops = &clk_regmap_mux_ops,
1509 		.parent_data = gxbb_sd_emmc_clk0_parents,
1510 		.num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parents),
1511 		.flags = CLK_SET_RATE_PARENT,
1512 	},
1513 };
1514 
1515 static struct clk_regmap gxbb_sd_emmc_b_clk0_div = {
1516 	.data = &(struct clk_regmap_div_data){
1517 		.offset = HHI_SD_EMMC_CLK_CNTL,
1518 		.shift = 16,
1519 		.width = 7,
1520 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1521 	},
1522 	.hw.init = &(struct clk_init_data) {
1523 		.name = "sd_emmc_b_clk0_div",
1524 		.ops = &clk_regmap_divider_ops,
1525 		.parent_hws = (const struct clk_hw *[]) {
1526 			&gxbb_sd_emmc_b_clk0_sel.hw
1527 		},
1528 		.num_parents = 1,
1529 		.flags = CLK_SET_RATE_PARENT,
1530 	},
1531 };
1532 
1533 static struct clk_regmap gxbb_sd_emmc_b_clk0 = {
1534 	.data = &(struct clk_regmap_gate_data){
1535 		.offset = HHI_SD_EMMC_CLK_CNTL,
1536 		.bit_idx = 23,
1537 	},
1538 	.hw.init = &(struct clk_init_data){
1539 		.name = "sd_emmc_b_clk0",
1540 		.ops = &clk_regmap_gate_ops,
1541 		.parent_hws = (const struct clk_hw *[]) {
1542 			&gxbb_sd_emmc_b_clk0_div.hw
1543 		},
1544 		.num_parents = 1,
1545 		.flags = CLK_SET_RATE_PARENT,
1546 	},
1547 };
1548 
1549 /* EMMC/NAND clock */
1550 static struct clk_regmap gxbb_sd_emmc_c_clk0_sel = {
1551 	.data = &(struct clk_regmap_mux_data){
1552 		.offset = HHI_NAND_CLK_CNTL,
1553 		.mask = 0x7,
1554 		.shift = 9,
1555 	},
1556 	.hw.init = &(struct clk_init_data) {
1557 		.name = "sd_emmc_c_clk0_sel",
1558 		.ops = &clk_regmap_mux_ops,
1559 		.parent_data = gxbb_sd_emmc_clk0_parents,
1560 		.num_parents = ARRAY_SIZE(gxbb_sd_emmc_clk0_parents),
1561 		.flags = CLK_SET_RATE_PARENT,
1562 	},
1563 };
1564 
1565 static struct clk_regmap gxbb_sd_emmc_c_clk0_div = {
1566 	.data = &(struct clk_regmap_div_data){
1567 		.offset = HHI_NAND_CLK_CNTL,
1568 		.shift = 0,
1569 		.width = 7,
1570 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
1571 	},
1572 	.hw.init = &(struct clk_init_data) {
1573 		.name = "sd_emmc_c_clk0_div",
1574 		.ops = &clk_regmap_divider_ops,
1575 		.parent_hws = (const struct clk_hw *[]) {
1576 			&gxbb_sd_emmc_c_clk0_sel.hw
1577 		},
1578 		.num_parents = 1,
1579 		.flags = CLK_SET_RATE_PARENT,
1580 	},
1581 };
1582 
1583 static struct clk_regmap gxbb_sd_emmc_c_clk0 = {
1584 	.data = &(struct clk_regmap_gate_data){
1585 		.offset = HHI_NAND_CLK_CNTL,
1586 		.bit_idx = 7,
1587 	},
1588 	.hw.init = &(struct clk_init_data){
1589 		.name = "sd_emmc_c_clk0",
1590 		.ops = &clk_regmap_gate_ops,
1591 		.parent_hws = (const struct clk_hw *[]) {
1592 			&gxbb_sd_emmc_c_clk0_div.hw
1593 		},
1594 		.num_parents = 1,
1595 		.flags = CLK_SET_RATE_PARENT,
1596 	},
1597 };
1598 
1599 /* VPU Clock */
1600 
1601 static const struct clk_hw *gxbb_vpu_parents[] = {
1602 	&gxbb_fclk_div4.hw,
1603 	&gxbb_fclk_div3.hw,
1604 	&gxbb_fclk_div5.hw,
1605 	&gxbb_fclk_div7.hw,
1606 };
1607 
1608 static struct clk_regmap gxbb_vpu_0_sel = {
1609 	.data = &(struct clk_regmap_mux_data){
1610 		.offset = HHI_VPU_CLK_CNTL,
1611 		.mask = 0x3,
1612 		.shift = 9,
1613 	},
1614 	.hw.init = &(struct clk_init_data){
1615 		.name = "vpu_0_sel",
1616 		.ops = &clk_regmap_mux_ops,
1617 		/*
1618 		 * bits 9:10 selects from 4 possible parents:
1619 		 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1620 		 */
1621 		.parent_hws = gxbb_vpu_parents,
1622 		.num_parents = ARRAY_SIZE(gxbb_vpu_parents),
1623 		.flags = CLK_SET_RATE_NO_REPARENT,
1624 	},
1625 };
1626 
1627 static struct clk_regmap gxbb_vpu_0_div = {
1628 	.data = &(struct clk_regmap_div_data){
1629 		.offset = HHI_VPU_CLK_CNTL,
1630 		.shift = 0,
1631 		.width = 7,
1632 	},
1633 	.hw.init = &(struct clk_init_data){
1634 		.name = "vpu_0_div",
1635 		.ops = &clk_regmap_divider_ops,
1636 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_0_sel.hw },
1637 		.num_parents = 1,
1638 		.flags = CLK_SET_RATE_PARENT,
1639 	},
1640 };
1641 
1642 static struct clk_regmap gxbb_vpu_0 = {
1643 	.data = &(struct clk_regmap_gate_data){
1644 		.offset = HHI_VPU_CLK_CNTL,
1645 		.bit_idx = 8,
1646 	},
1647 	.hw.init = &(struct clk_init_data) {
1648 		.name = "vpu_0",
1649 		.ops = &clk_regmap_gate_ops,
1650 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_0_div.hw },
1651 		.num_parents = 1,
1652 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1653 	},
1654 };
1655 
1656 static struct clk_regmap gxbb_vpu_1_sel = {
1657 	.data = &(struct clk_regmap_mux_data){
1658 		.offset = HHI_VPU_CLK_CNTL,
1659 		.mask = 0x3,
1660 		.shift = 25,
1661 	},
1662 	.hw.init = &(struct clk_init_data){
1663 		.name = "vpu_1_sel",
1664 		.ops = &clk_regmap_mux_ops,
1665 		/*
1666 		 * bits 25:26 selects from 4 possible parents:
1667 		 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1668 		 */
1669 		.parent_hws = gxbb_vpu_parents,
1670 		.num_parents = ARRAY_SIZE(gxbb_vpu_parents),
1671 		.flags = CLK_SET_RATE_NO_REPARENT,
1672 	},
1673 };
1674 
1675 static struct clk_regmap gxbb_vpu_1_div = {
1676 	.data = &(struct clk_regmap_div_data){
1677 		.offset = HHI_VPU_CLK_CNTL,
1678 		.shift = 16,
1679 		.width = 7,
1680 	},
1681 	.hw.init = &(struct clk_init_data){
1682 		.name = "vpu_1_div",
1683 		.ops = &clk_regmap_divider_ops,
1684 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_1_sel.hw },
1685 		.num_parents = 1,
1686 		.flags = CLK_SET_RATE_PARENT,
1687 	},
1688 };
1689 
1690 static struct clk_regmap gxbb_vpu_1 = {
1691 	.data = &(struct clk_regmap_gate_data){
1692 		.offset = HHI_VPU_CLK_CNTL,
1693 		.bit_idx = 24,
1694 	},
1695 	.hw.init = &(struct clk_init_data) {
1696 		.name = "vpu_1",
1697 		.ops = &clk_regmap_gate_ops,
1698 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vpu_1_div.hw },
1699 		.num_parents = 1,
1700 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1701 	},
1702 };
1703 
1704 static struct clk_regmap gxbb_vpu = {
1705 	.data = &(struct clk_regmap_mux_data){
1706 		.offset = HHI_VPU_CLK_CNTL,
1707 		.mask = 1,
1708 		.shift = 31,
1709 	},
1710 	.hw.init = &(struct clk_init_data){
1711 		.name = "vpu",
1712 		.ops = &clk_regmap_mux_ops,
1713 		/*
1714 		 * bit 31 selects from 2 possible parents:
1715 		 * vpu_0 or vpu_1
1716 		 */
1717 		.parent_hws = (const struct clk_hw *[]) {
1718 			&gxbb_vpu_0.hw,
1719 			&gxbb_vpu_1.hw
1720 		},
1721 		.num_parents = 2,
1722 		.flags = CLK_SET_RATE_NO_REPARENT,
1723 	},
1724 };
1725 
1726 /* VAPB Clock */
1727 
1728 static const struct clk_hw *gxbb_vapb_parents[] = {
1729 	&gxbb_fclk_div4.hw,
1730 	&gxbb_fclk_div3.hw,
1731 	&gxbb_fclk_div5.hw,
1732 	&gxbb_fclk_div7.hw,
1733 };
1734 
1735 static struct clk_regmap gxbb_vapb_0_sel = {
1736 	.data = &(struct clk_regmap_mux_data){
1737 		.offset = HHI_VAPBCLK_CNTL,
1738 		.mask = 0x3,
1739 		.shift = 9,
1740 	},
1741 	.hw.init = &(struct clk_init_data){
1742 		.name = "vapb_0_sel",
1743 		.ops = &clk_regmap_mux_ops,
1744 		/*
1745 		 * bits 9:10 selects from 4 possible parents:
1746 		 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1747 		 */
1748 		.parent_hws = gxbb_vapb_parents,
1749 		.num_parents = ARRAY_SIZE(gxbb_vapb_parents),
1750 		.flags = CLK_SET_RATE_NO_REPARENT,
1751 	},
1752 };
1753 
1754 static struct clk_regmap gxbb_vapb_0_div = {
1755 	.data = &(struct clk_regmap_div_data){
1756 		.offset = HHI_VAPBCLK_CNTL,
1757 		.shift = 0,
1758 		.width = 7,
1759 	},
1760 	.hw.init = &(struct clk_init_data){
1761 		.name = "vapb_0_div",
1762 		.ops = &clk_regmap_divider_ops,
1763 		.parent_hws = (const struct clk_hw *[]) {
1764 			&gxbb_vapb_0_sel.hw
1765 		},
1766 		.num_parents = 1,
1767 		.flags = CLK_SET_RATE_PARENT,
1768 	},
1769 };
1770 
1771 static struct clk_regmap gxbb_vapb_0 = {
1772 	.data = &(struct clk_regmap_gate_data){
1773 		.offset = HHI_VAPBCLK_CNTL,
1774 		.bit_idx = 8,
1775 	},
1776 	.hw.init = &(struct clk_init_data) {
1777 		.name = "vapb_0",
1778 		.ops = &clk_regmap_gate_ops,
1779 		.parent_hws = (const struct clk_hw *[]) {
1780 			&gxbb_vapb_0_div.hw
1781 		},
1782 		.num_parents = 1,
1783 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1784 	},
1785 };
1786 
1787 static struct clk_regmap gxbb_vapb_1_sel = {
1788 	.data = &(struct clk_regmap_mux_data){
1789 		.offset = HHI_VAPBCLK_CNTL,
1790 		.mask = 0x3,
1791 		.shift = 25,
1792 	},
1793 	.hw.init = &(struct clk_init_data){
1794 		.name = "vapb_1_sel",
1795 		.ops = &clk_regmap_mux_ops,
1796 		/*
1797 		 * bits 25:26 selects from 4 possible parents:
1798 		 * fclk_div4, fclk_div3, fclk_div5, fclk_div7,
1799 		 */
1800 		.parent_hws = gxbb_vapb_parents,
1801 		.num_parents = ARRAY_SIZE(gxbb_vapb_parents),
1802 		.flags = CLK_SET_RATE_NO_REPARENT,
1803 	},
1804 };
1805 
1806 static struct clk_regmap gxbb_vapb_1_div = {
1807 	.data = &(struct clk_regmap_div_data){
1808 		.offset = HHI_VAPBCLK_CNTL,
1809 		.shift = 16,
1810 		.width = 7,
1811 	},
1812 	.hw.init = &(struct clk_init_data){
1813 		.name = "vapb_1_div",
1814 		.ops = &clk_regmap_divider_ops,
1815 		.parent_hws = (const struct clk_hw *[]) {
1816 			&gxbb_vapb_1_sel.hw
1817 		},
1818 		.num_parents = 1,
1819 		.flags = CLK_SET_RATE_PARENT,
1820 	},
1821 };
1822 
1823 static struct clk_regmap gxbb_vapb_1 = {
1824 	.data = &(struct clk_regmap_gate_data){
1825 		.offset = HHI_VAPBCLK_CNTL,
1826 		.bit_idx = 24,
1827 	},
1828 	.hw.init = &(struct clk_init_data) {
1829 		.name = "vapb_1",
1830 		.ops = &clk_regmap_gate_ops,
1831 		.parent_hws = (const struct clk_hw *[]) {
1832 			&gxbb_vapb_1_div.hw
1833 		},
1834 		.num_parents = 1,
1835 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1836 	},
1837 };
1838 
1839 static struct clk_regmap gxbb_vapb_sel = {
1840 	.data = &(struct clk_regmap_mux_data){
1841 		.offset = HHI_VAPBCLK_CNTL,
1842 		.mask = 1,
1843 		.shift = 31,
1844 	},
1845 	.hw.init = &(struct clk_init_data){
1846 		.name = "vapb_sel",
1847 		.ops = &clk_regmap_mux_ops,
1848 		/*
1849 		 * bit 31 selects from 2 possible parents:
1850 		 * vapb_0 or vapb_1
1851 		 */
1852 		.parent_hws = (const struct clk_hw *[]) {
1853 			&gxbb_vapb_0.hw,
1854 			&gxbb_vapb_1.hw
1855 		},
1856 		.num_parents = 2,
1857 		.flags = CLK_SET_RATE_NO_REPARENT,
1858 	},
1859 };
1860 
1861 static struct clk_regmap gxbb_vapb = {
1862 	.data = &(struct clk_regmap_gate_data){
1863 		.offset = HHI_VAPBCLK_CNTL,
1864 		.bit_idx = 30,
1865 	},
1866 	.hw.init = &(struct clk_init_data) {
1867 		.name = "vapb",
1868 		.ops = &clk_regmap_gate_ops,
1869 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vapb_sel.hw },
1870 		.num_parents = 1,
1871 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1872 	},
1873 };
1874 
1875 /* Video Clocks */
1876 
1877 static struct clk_regmap gxbb_vid_pll_div = {
1878 	.data = &(struct meson_vid_pll_div_data){
1879 		.val = {
1880 			.reg_off = HHI_VID_PLL_CLK_DIV,
1881 			.shift   = 0,
1882 			.width   = 15,
1883 		},
1884 		.sel = {
1885 			.reg_off = HHI_VID_PLL_CLK_DIV,
1886 			.shift   = 16,
1887 			.width   = 2,
1888 		},
1889 	},
1890 	.hw.init = &(struct clk_init_data) {
1891 		.name = "vid_pll_div",
1892 		.ops = &meson_vid_pll_div_ro_ops,
1893 		.parent_data = &(const struct clk_parent_data) {
1894 			/*
1895 			 * Note:
1896 			 * GXL and GXBB have different hdmi_plls (with
1897 			 * different struct clk_hw). We fallback to the global
1898 			 * naming string mechanism so vid_pll_div picks up the
1899 			 * appropriate one.
1900 			 */
1901 			.name = "hdmi_pll",
1902 			.index = -1,
1903 		},
1904 		.num_parents = 1,
1905 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1906 	},
1907 };
1908 
1909 static const struct clk_parent_data gxbb_vid_pll_parents[] = {
1910 	{ .hw = &gxbb_vid_pll_div.hw },
1911 	/*
1912 	 * Note:
1913 	 * GXL and GXBB have different hdmi_plls (with
1914 	 * different struct clk_hw). We fallback to the global
1915 	 * naming string mechanism so vid_pll_div picks up the
1916 	 * appropriate one.
1917 	 */
1918 	{ .name = "hdmi_pll", .index = -1 },
1919 };
1920 
1921 static struct clk_regmap gxbb_vid_pll_sel = {
1922 	.data = &(struct clk_regmap_mux_data){
1923 		.offset = HHI_VID_PLL_CLK_DIV,
1924 		.mask = 0x1,
1925 		.shift = 18,
1926 	},
1927 	.hw.init = &(struct clk_init_data){
1928 		.name = "vid_pll_sel",
1929 		.ops = &clk_regmap_mux_ops,
1930 		/*
1931 		 * bit 18 selects from 2 possible parents:
1932 		 * vid_pll_div or hdmi_pll
1933 		 */
1934 		.parent_data = gxbb_vid_pll_parents,
1935 		.num_parents = ARRAY_SIZE(gxbb_vid_pll_parents),
1936 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1937 	},
1938 };
1939 
1940 static struct clk_regmap gxbb_vid_pll = {
1941 	.data = &(struct clk_regmap_gate_data){
1942 		.offset = HHI_VID_PLL_CLK_DIV,
1943 		.bit_idx = 19,
1944 	},
1945 	.hw.init = &(struct clk_init_data) {
1946 		.name = "vid_pll",
1947 		.ops = &clk_regmap_gate_ops,
1948 		.parent_hws = (const struct clk_hw *[]) {
1949 			&gxbb_vid_pll_sel.hw
1950 		},
1951 		.num_parents = 1,
1952 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1953 	},
1954 };
1955 
1956 static const struct clk_hw *gxbb_vclk_parents[] = {
1957 	&gxbb_vid_pll.hw,
1958 	&gxbb_fclk_div4.hw,
1959 	&gxbb_fclk_div3.hw,
1960 	&gxbb_fclk_div5.hw,
1961 	&gxbb_vid_pll.hw,
1962 	&gxbb_fclk_div7.hw,
1963 	&gxbb_mpll1.hw,
1964 };
1965 
1966 static struct clk_regmap gxbb_vclk_sel = {
1967 	.data = &(struct clk_regmap_mux_data){
1968 		.offset = HHI_VID_CLK_CNTL,
1969 		.mask = 0x7,
1970 		.shift = 16,
1971 	},
1972 	.hw.init = &(struct clk_init_data){
1973 		.name = "vclk_sel",
1974 		.ops = &clk_regmap_mux_ops,
1975 		/*
1976 		 * bits 16:18 selects from 8 possible parents:
1977 		 * vid_pll, fclk_div4, fclk_div3, fclk_div5,
1978 		 * vid_pll, fclk_div7, mp1
1979 		 */
1980 		.parent_hws = gxbb_vclk_parents,
1981 		.num_parents = ARRAY_SIZE(gxbb_vclk_parents),
1982 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
1983 	},
1984 };
1985 
1986 static struct clk_regmap gxbb_vclk2_sel = {
1987 	.data = &(struct clk_regmap_mux_data){
1988 		.offset = HHI_VIID_CLK_CNTL,
1989 		.mask = 0x7,
1990 		.shift = 16,
1991 	},
1992 	.hw.init = &(struct clk_init_data){
1993 		.name = "vclk2_sel",
1994 		.ops = &clk_regmap_mux_ops,
1995 		/*
1996 		 * bits 16:18 selects from 8 possible parents:
1997 		 * vid_pll, fclk_div4, fclk_div3, fclk_div5,
1998 		 * vid_pll, fclk_div7, mp1
1999 		 */
2000 		.parent_hws = gxbb_vclk_parents,
2001 		.num_parents = ARRAY_SIZE(gxbb_vclk_parents),
2002 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2003 	},
2004 };
2005 
2006 static struct clk_regmap gxbb_vclk_input = {
2007 	.data = &(struct clk_regmap_gate_data){
2008 		.offset = HHI_VID_CLK_DIV,
2009 		.bit_idx = 16,
2010 	},
2011 	.hw.init = &(struct clk_init_data) {
2012 		.name = "vclk_input",
2013 		.ops = &clk_regmap_gate_ops,
2014 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk_sel.hw },
2015 		.num_parents = 1,
2016 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2017 	},
2018 };
2019 
2020 static struct clk_regmap gxbb_vclk2_input = {
2021 	.data = &(struct clk_regmap_gate_data){
2022 		.offset = HHI_VIID_CLK_DIV,
2023 		.bit_idx = 16,
2024 	},
2025 	.hw.init = &(struct clk_init_data) {
2026 		.name = "vclk2_input",
2027 		.ops = &clk_regmap_gate_ops,
2028 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2_sel.hw },
2029 		.num_parents = 1,
2030 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2031 	},
2032 };
2033 
2034 static struct clk_regmap gxbb_vclk_div = {
2035 	.data = &(struct clk_regmap_div_data){
2036 		.offset = HHI_VID_CLK_DIV,
2037 		.shift = 0,
2038 		.width = 8,
2039 	},
2040 	.hw.init = &(struct clk_init_data){
2041 		.name = "vclk_div",
2042 		.ops = &clk_regmap_divider_ops,
2043 		.parent_hws = (const struct clk_hw *[]) {
2044 			&gxbb_vclk_input.hw
2045 		},
2046 		.num_parents = 1,
2047 		.flags = CLK_GET_RATE_NOCACHE,
2048 	},
2049 };
2050 
2051 static struct clk_regmap gxbb_vclk2_div = {
2052 	.data = &(struct clk_regmap_div_data){
2053 		.offset = HHI_VIID_CLK_DIV,
2054 		.shift = 0,
2055 		.width = 8,
2056 	},
2057 	.hw.init = &(struct clk_init_data){
2058 		.name = "vclk2_div",
2059 		.ops = &clk_regmap_divider_ops,
2060 		.parent_hws = (const struct clk_hw *[]) {
2061 			&gxbb_vclk2_input.hw
2062 		},
2063 		.num_parents = 1,
2064 		.flags = CLK_GET_RATE_NOCACHE,
2065 	},
2066 };
2067 
2068 static struct clk_regmap gxbb_vclk = {
2069 	.data = &(struct clk_regmap_gate_data){
2070 		.offset = HHI_VID_CLK_CNTL,
2071 		.bit_idx = 19,
2072 	},
2073 	.hw.init = &(struct clk_init_data) {
2074 		.name = "vclk",
2075 		.ops = &clk_regmap_gate_ops,
2076 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk_div.hw },
2077 		.num_parents = 1,
2078 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2079 	},
2080 };
2081 
2082 static struct clk_regmap gxbb_vclk2 = {
2083 	.data = &(struct clk_regmap_gate_data){
2084 		.offset = HHI_VIID_CLK_CNTL,
2085 		.bit_idx = 19,
2086 	},
2087 	.hw.init = &(struct clk_init_data) {
2088 		.name = "vclk2",
2089 		.ops = &clk_regmap_gate_ops,
2090 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2_div.hw },
2091 		.num_parents = 1,
2092 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2093 	},
2094 };
2095 
2096 static struct clk_regmap gxbb_vclk_div1 = {
2097 	.data = &(struct clk_regmap_gate_data){
2098 		.offset = HHI_VID_CLK_CNTL,
2099 		.bit_idx = 0,
2100 	},
2101 	.hw.init = &(struct clk_init_data) {
2102 		.name = "vclk_div1",
2103 		.ops = &clk_regmap_gate_ops,
2104 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2105 		.num_parents = 1,
2106 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2107 	},
2108 };
2109 
2110 static struct clk_regmap gxbb_vclk_div2_en = {
2111 	.data = &(struct clk_regmap_gate_data){
2112 		.offset = HHI_VID_CLK_CNTL,
2113 		.bit_idx = 1,
2114 	},
2115 	.hw.init = &(struct clk_init_data) {
2116 		.name = "vclk_div2_en",
2117 		.ops = &clk_regmap_gate_ops,
2118 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2119 		.num_parents = 1,
2120 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2121 	},
2122 };
2123 
2124 static struct clk_regmap gxbb_vclk_div4_en = {
2125 	.data = &(struct clk_regmap_gate_data){
2126 		.offset = HHI_VID_CLK_CNTL,
2127 		.bit_idx = 2,
2128 	},
2129 	.hw.init = &(struct clk_init_data) {
2130 		.name = "vclk_div4_en",
2131 		.ops = &clk_regmap_gate_ops,
2132 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2133 		.num_parents = 1,
2134 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2135 	},
2136 };
2137 
2138 static struct clk_regmap gxbb_vclk_div6_en = {
2139 	.data = &(struct clk_regmap_gate_data){
2140 		.offset = HHI_VID_CLK_CNTL,
2141 		.bit_idx = 3,
2142 	},
2143 	.hw.init = &(struct clk_init_data) {
2144 		.name = "vclk_div6_en",
2145 		.ops = &clk_regmap_gate_ops,
2146 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2147 		.num_parents = 1,
2148 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2149 	},
2150 };
2151 
2152 static struct clk_regmap gxbb_vclk_div12_en = {
2153 	.data = &(struct clk_regmap_gate_data){
2154 		.offset = HHI_VID_CLK_CNTL,
2155 		.bit_idx = 4,
2156 	},
2157 	.hw.init = &(struct clk_init_data) {
2158 		.name = "vclk_div12_en",
2159 		.ops = &clk_regmap_gate_ops,
2160 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk.hw },
2161 		.num_parents = 1,
2162 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2163 	},
2164 };
2165 
2166 static struct clk_regmap gxbb_vclk2_div1 = {
2167 	.data = &(struct clk_regmap_gate_data){
2168 		.offset = HHI_VIID_CLK_CNTL,
2169 		.bit_idx = 0,
2170 	},
2171 	.hw.init = &(struct clk_init_data) {
2172 		.name = "vclk2_div1",
2173 		.ops = &clk_regmap_gate_ops,
2174 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2175 		.num_parents = 1,
2176 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2177 	},
2178 };
2179 
2180 static struct clk_regmap gxbb_vclk2_div2_en = {
2181 	.data = &(struct clk_regmap_gate_data){
2182 		.offset = HHI_VIID_CLK_CNTL,
2183 		.bit_idx = 1,
2184 	},
2185 	.hw.init = &(struct clk_init_data) {
2186 		.name = "vclk2_div2_en",
2187 		.ops = &clk_regmap_gate_ops,
2188 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2189 		.num_parents = 1,
2190 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2191 	},
2192 };
2193 
2194 static struct clk_regmap gxbb_vclk2_div4_en = {
2195 	.data = &(struct clk_regmap_gate_data){
2196 		.offset = HHI_VIID_CLK_CNTL,
2197 		.bit_idx = 2,
2198 	},
2199 	.hw.init = &(struct clk_init_data) {
2200 		.name = "vclk2_div4_en",
2201 		.ops = &clk_regmap_gate_ops,
2202 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2203 		.num_parents = 1,
2204 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2205 	},
2206 };
2207 
2208 static struct clk_regmap gxbb_vclk2_div6_en = {
2209 	.data = &(struct clk_regmap_gate_data){
2210 		.offset = HHI_VIID_CLK_CNTL,
2211 		.bit_idx = 3,
2212 	},
2213 	.hw.init = &(struct clk_init_data) {
2214 		.name = "vclk2_div6_en",
2215 		.ops = &clk_regmap_gate_ops,
2216 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2217 		.num_parents = 1,
2218 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2219 	},
2220 };
2221 
2222 static struct clk_regmap gxbb_vclk2_div12_en = {
2223 	.data = &(struct clk_regmap_gate_data){
2224 		.offset = HHI_VIID_CLK_CNTL,
2225 		.bit_idx = 4,
2226 	},
2227 	.hw.init = &(struct clk_init_data) {
2228 		.name = "vclk2_div12_en",
2229 		.ops = &clk_regmap_gate_ops,
2230 		.parent_hws = (const struct clk_hw *[]) { &gxbb_vclk2.hw },
2231 		.num_parents = 1,
2232 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2233 	},
2234 };
2235 
2236 static struct clk_fixed_factor gxbb_vclk_div2 = {
2237 	.mult = 1,
2238 	.div = 2,
2239 	.hw.init = &(struct clk_init_data){
2240 		.name = "vclk_div2",
2241 		.ops = &clk_fixed_factor_ops,
2242 		.parent_hws = (const struct clk_hw *[]) {
2243 			&gxbb_vclk_div2_en.hw
2244 		},
2245 		.num_parents = 1,
2246 	},
2247 };
2248 
2249 static struct clk_fixed_factor gxbb_vclk_div4 = {
2250 	.mult = 1,
2251 	.div = 4,
2252 	.hw.init = &(struct clk_init_data){
2253 		.name = "vclk_div4",
2254 		.ops = &clk_fixed_factor_ops,
2255 		.parent_hws = (const struct clk_hw *[]) {
2256 			&gxbb_vclk_div4_en.hw
2257 		},
2258 		.num_parents = 1,
2259 	},
2260 };
2261 
2262 static struct clk_fixed_factor gxbb_vclk_div6 = {
2263 	.mult = 1,
2264 	.div = 6,
2265 	.hw.init = &(struct clk_init_data){
2266 		.name = "vclk_div6",
2267 		.ops = &clk_fixed_factor_ops,
2268 		.parent_hws = (const struct clk_hw *[]) {
2269 			&gxbb_vclk_div6_en.hw
2270 		},
2271 		.num_parents = 1,
2272 	},
2273 };
2274 
2275 static struct clk_fixed_factor gxbb_vclk_div12 = {
2276 	.mult = 1,
2277 	.div = 12,
2278 	.hw.init = &(struct clk_init_data){
2279 		.name = "vclk_div12",
2280 		.ops = &clk_fixed_factor_ops,
2281 		.parent_hws = (const struct clk_hw *[]) {
2282 			&gxbb_vclk_div12_en.hw
2283 		},
2284 		.num_parents = 1,
2285 	},
2286 };
2287 
2288 static struct clk_fixed_factor gxbb_vclk2_div2 = {
2289 	.mult = 1,
2290 	.div = 2,
2291 	.hw.init = &(struct clk_init_data){
2292 		.name = "vclk2_div2",
2293 		.ops = &clk_fixed_factor_ops,
2294 		.parent_hws = (const struct clk_hw *[]) {
2295 			&gxbb_vclk2_div2_en.hw
2296 		},
2297 		.num_parents = 1,
2298 	},
2299 };
2300 
2301 static struct clk_fixed_factor gxbb_vclk2_div4 = {
2302 	.mult = 1,
2303 	.div = 4,
2304 	.hw.init = &(struct clk_init_data){
2305 		.name = "vclk2_div4",
2306 		.ops = &clk_fixed_factor_ops,
2307 		.parent_hws = (const struct clk_hw *[]) {
2308 			&gxbb_vclk2_div4_en.hw
2309 		},
2310 		.num_parents = 1,
2311 	},
2312 };
2313 
2314 static struct clk_fixed_factor gxbb_vclk2_div6 = {
2315 	.mult = 1,
2316 	.div = 6,
2317 	.hw.init = &(struct clk_init_data){
2318 		.name = "vclk2_div6",
2319 		.ops = &clk_fixed_factor_ops,
2320 		.parent_hws = (const struct clk_hw *[]) {
2321 			&gxbb_vclk2_div6_en.hw
2322 		},
2323 		.num_parents = 1,
2324 	},
2325 };
2326 
2327 static struct clk_fixed_factor gxbb_vclk2_div12 = {
2328 	.mult = 1,
2329 	.div = 12,
2330 	.hw.init = &(struct clk_init_data){
2331 		.name = "vclk2_div12",
2332 		.ops = &clk_fixed_factor_ops,
2333 		.parent_hws = (const struct clk_hw *[]) {
2334 			&gxbb_vclk2_div12_en.hw
2335 		},
2336 		.num_parents = 1,
2337 	},
2338 };
2339 
2340 static u32 gxbb_cts_parents_val_table[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
2341 static const struct clk_hw *gxbb_cts_parents[] = {
2342 	&gxbb_vclk_div1.hw,
2343 	&gxbb_vclk_div2.hw,
2344 	&gxbb_vclk_div4.hw,
2345 	&gxbb_vclk_div6.hw,
2346 	&gxbb_vclk_div12.hw,
2347 	&gxbb_vclk2_div1.hw,
2348 	&gxbb_vclk2_div2.hw,
2349 	&gxbb_vclk2_div4.hw,
2350 	&gxbb_vclk2_div6.hw,
2351 	&gxbb_vclk2_div12.hw,
2352 };
2353 
2354 static struct clk_regmap gxbb_cts_enci_sel = {
2355 	.data = &(struct clk_regmap_mux_data){
2356 		.offset = HHI_VID_CLK_DIV,
2357 		.mask = 0xf,
2358 		.shift = 28,
2359 		.table = gxbb_cts_parents_val_table,
2360 	},
2361 	.hw.init = &(struct clk_init_data){
2362 		.name = "cts_enci_sel",
2363 		.ops = &clk_regmap_mux_ops,
2364 		.parent_hws = gxbb_cts_parents,
2365 		.num_parents = ARRAY_SIZE(gxbb_cts_parents),
2366 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2367 	},
2368 };
2369 
2370 static struct clk_regmap gxbb_cts_encp_sel = {
2371 	.data = &(struct clk_regmap_mux_data){
2372 		.offset = HHI_VID_CLK_DIV,
2373 		.mask = 0xf,
2374 		.shift = 20,
2375 		.table = gxbb_cts_parents_val_table,
2376 	},
2377 	.hw.init = &(struct clk_init_data){
2378 		.name = "cts_encp_sel",
2379 		.ops = &clk_regmap_mux_ops,
2380 		.parent_hws = gxbb_cts_parents,
2381 		.num_parents = ARRAY_SIZE(gxbb_cts_parents),
2382 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2383 	},
2384 };
2385 
2386 static struct clk_regmap gxbb_cts_vdac_sel = {
2387 	.data = &(struct clk_regmap_mux_data){
2388 		.offset = HHI_VIID_CLK_DIV,
2389 		.mask = 0xf,
2390 		.shift = 28,
2391 		.table = gxbb_cts_parents_val_table,
2392 	},
2393 	.hw.init = &(struct clk_init_data){
2394 		.name = "cts_vdac_sel",
2395 		.ops = &clk_regmap_mux_ops,
2396 		.parent_hws = gxbb_cts_parents,
2397 		.num_parents = ARRAY_SIZE(gxbb_cts_parents),
2398 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2399 	},
2400 };
2401 
2402 static struct clk_regmap gxbb_cts_enci = {
2403 	.data = &(struct clk_regmap_gate_data){
2404 		.offset = HHI_VID_CLK_CNTL2,
2405 		.bit_idx = 0,
2406 	},
2407 	.hw.init = &(struct clk_init_data) {
2408 		.name = "cts_enci",
2409 		.ops = &clk_regmap_gate_ops,
2410 		.parent_hws = (const struct clk_hw *[]) {
2411 			&gxbb_cts_enci_sel.hw
2412 		},
2413 		.num_parents = 1,
2414 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2415 	},
2416 };
2417 
2418 static struct clk_regmap gxbb_cts_encp = {
2419 	.data = &(struct clk_regmap_gate_data){
2420 		.offset = HHI_VID_CLK_CNTL2,
2421 		.bit_idx = 2,
2422 	},
2423 	.hw.init = &(struct clk_init_data) {
2424 		.name = "cts_encp",
2425 		.ops = &clk_regmap_gate_ops,
2426 		.parent_hws = (const struct clk_hw *[]) {
2427 			&gxbb_cts_encp_sel.hw
2428 		},
2429 		.num_parents = 1,
2430 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2431 	},
2432 };
2433 
2434 static struct clk_regmap gxbb_cts_vdac = {
2435 	.data = &(struct clk_regmap_gate_data){
2436 		.offset = HHI_VID_CLK_CNTL2,
2437 		.bit_idx = 4,
2438 	},
2439 	.hw.init = &(struct clk_init_data) {
2440 		.name = "cts_vdac",
2441 		.ops = &clk_regmap_gate_ops,
2442 		.parent_hws = (const struct clk_hw *[]) {
2443 			&gxbb_cts_vdac_sel.hw
2444 		},
2445 		.num_parents = 1,
2446 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2447 	},
2448 };
2449 
2450 /* TOFIX: add support for cts_tcon */
2451 static u32 gxbb_hdmi_tx_parents_val_table[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
2452 static const struct clk_hw *gxbb_hdmi_tx_parents[] = {
2453 	&gxbb_vclk_div1.hw,
2454 	&gxbb_vclk_div2.hw,
2455 	&gxbb_vclk_div4.hw,
2456 	&gxbb_vclk_div6.hw,
2457 	&gxbb_vclk_div12.hw,
2458 	&gxbb_vclk2_div1.hw,
2459 	&gxbb_vclk2_div2.hw,
2460 	&gxbb_vclk2_div4.hw,
2461 	&gxbb_vclk2_div6.hw,
2462 	&gxbb_vclk2_div12.hw,
2463 };
2464 
2465 static struct clk_regmap gxbb_hdmi_tx_sel = {
2466 	.data = &(struct clk_regmap_mux_data){
2467 		.offset = HHI_HDMI_CLK_CNTL,
2468 		.mask = 0xf,
2469 		.shift = 16,
2470 		.table = gxbb_hdmi_tx_parents_val_table,
2471 	},
2472 	.hw.init = &(struct clk_init_data){
2473 		.name = "hdmi_tx_sel",
2474 		.ops = &clk_regmap_mux_ops,
2475 		/*
2476 		 * bits 31:28 selects from 12 possible parents:
2477 		 * vclk_div1, vclk_div2, vclk_div4, vclk_div6, vclk_div12
2478 		 * vclk2_div1, vclk2_div2, vclk2_div4, vclk2_div6, vclk2_div12,
2479 		 * cts_tcon
2480 		 */
2481 		.parent_hws = gxbb_hdmi_tx_parents,
2482 		.num_parents = ARRAY_SIZE(gxbb_hdmi_tx_parents),
2483 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2484 	},
2485 };
2486 
2487 static struct clk_regmap gxbb_hdmi_tx = {
2488 	.data = &(struct clk_regmap_gate_data){
2489 		.offset = HHI_VID_CLK_CNTL2,
2490 		.bit_idx = 5,
2491 	},
2492 	.hw.init = &(struct clk_init_data) {
2493 		.name = "hdmi_tx",
2494 		.ops = &clk_regmap_gate_ops,
2495 		.parent_hws = (const struct clk_hw *[]) {
2496 			&gxbb_hdmi_tx_sel.hw
2497 		},
2498 		.num_parents = 1,
2499 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2500 	},
2501 };
2502 
2503 /* HDMI Clocks */
2504 
2505 static const struct clk_parent_data gxbb_hdmi_parents[] = {
2506 	{ .fw_name = "xtal", },
2507 	{ .hw = &gxbb_fclk_div4.hw },
2508 	{ .hw = &gxbb_fclk_div3.hw },
2509 	{ .hw = &gxbb_fclk_div5.hw },
2510 };
2511 
2512 static struct clk_regmap gxbb_hdmi_sel = {
2513 	.data = &(struct clk_regmap_mux_data){
2514 		.offset = HHI_HDMI_CLK_CNTL,
2515 		.mask = 0x3,
2516 		.shift = 9,
2517 		.flags = CLK_MUX_ROUND_CLOSEST,
2518 	},
2519 	.hw.init = &(struct clk_init_data){
2520 		.name = "hdmi_sel",
2521 		.ops = &clk_regmap_mux_ops,
2522 		.parent_data = gxbb_hdmi_parents,
2523 		.num_parents = ARRAY_SIZE(gxbb_hdmi_parents),
2524 		.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
2525 	},
2526 };
2527 
2528 static struct clk_regmap gxbb_hdmi_div = {
2529 	.data = &(struct clk_regmap_div_data){
2530 		.offset = HHI_HDMI_CLK_CNTL,
2531 		.shift = 0,
2532 		.width = 7,
2533 	},
2534 	.hw.init = &(struct clk_init_data){
2535 		.name = "hdmi_div",
2536 		.ops = &clk_regmap_divider_ops,
2537 		.parent_hws = (const struct clk_hw *[]) { &gxbb_hdmi_sel.hw },
2538 		.num_parents = 1,
2539 		.flags = CLK_GET_RATE_NOCACHE,
2540 	},
2541 };
2542 
2543 static struct clk_regmap gxbb_hdmi = {
2544 	.data = &(struct clk_regmap_gate_data){
2545 		.offset = HHI_HDMI_CLK_CNTL,
2546 		.bit_idx = 8,
2547 	},
2548 	.hw.init = &(struct clk_init_data) {
2549 		.name = "hdmi",
2550 		.ops = &clk_regmap_gate_ops,
2551 		.parent_hws = (const struct clk_hw *[]) { &gxbb_hdmi_div.hw },
2552 		.num_parents = 1,
2553 		.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2554 	},
2555 };
2556 
2557 /* VDEC clocks */
2558 
2559 static const struct clk_hw *gxbb_vdec_parents[] = {
2560 	&gxbb_fclk_div4.hw,
2561 	&gxbb_fclk_div3.hw,
2562 	&gxbb_fclk_div5.hw,
2563 	&gxbb_fclk_div7.hw,
2564 };
2565 
2566 static struct clk_regmap gxbb_vdec_1_sel = {
2567 	.data = &(struct clk_regmap_mux_data){
2568 		.offset = HHI_VDEC_CLK_CNTL,
2569 		.mask = 0x3,
2570 		.shift = 9,
2571 		.flags = CLK_MUX_ROUND_CLOSEST,
2572 	},
2573 	.hw.init = &(struct clk_init_data){
2574 		.name = "vdec_1_sel",
2575 		.ops = &clk_regmap_mux_ops,
2576 		.parent_hws = gxbb_vdec_parents,
2577 		.num_parents = ARRAY_SIZE(gxbb_vdec_parents),
2578 		.flags = CLK_SET_RATE_PARENT,
2579 	},
2580 };
2581 
2582 static struct clk_regmap gxbb_vdec_1_div = {
2583 	.data = &(struct clk_regmap_div_data){
2584 		.offset = HHI_VDEC_CLK_CNTL,
2585 		.shift = 0,
2586 		.width = 7,
2587 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
2588 	},
2589 	.hw.init = &(struct clk_init_data){
2590 		.name = "vdec_1_div",
2591 		.ops = &clk_regmap_divider_ops,
2592 		.parent_hws = (const struct clk_hw *[]) {
2593 			&gxbb_vdec_1_sel.hw
2594 		},
2595 		.num_parents = 1,
2596 		.flags = CLK_SET_RATE_PARENT,
2597 	},
2598 };
2599 
2600 static struct clk_regmap gxbb_vdec_1 = {
2601 	.data = &(struct clk_regmap_gate_data){
2602 		.offset = HHI_VDEC_CLK_CNTL,
2603 		.bit_idx = 8,
2604 	},
2605 	.hw.init = &(struct clk_init_data) {
2606 		.name = "vdec_1",
2607 		.ops = &clk_regmap_gate_ops,
2608 		.parent_hws = (const struct clk_hw *[]) {
2609 			&gxbb_vdec_1_div.hw
2610 		},
2611 		.num_parents = 1,
2612 		.flags = CLK_SET_RATE_PARENT,
2613 	},
2614 };
2615 
2616 static struct clk_regmap gxbb_vdec_hevc_sel = {
2617 	.data = &(struct clk_regmap_mux_data){
2618 		.offset = HHI_VDEC2_CLK_CNTL,
2619 		.mask = 0x3,
2620 		.shift = 25,
2621 		.flags = CLK_MUX_ROUND_CLOSEST,
2622 	},
2623 	.hw.init = &(struct clk_init_data){
2624 		.name = "vdec_hevc_sel",
2625 		.ops = &clk_regmap_mux_ops,
2626 		.parent_hws = gxbb_vdec_parents,
2627 		.num_parents = ARRAY_SIZE(gxbb_vdec_parents),
2628 		.flags = CLK_SET_RATE_PARENT,
2629 	},
2630 };
2631 
2632 static struct clk_regmap gxbb_vdec_hevc_div = {
2633 	.data = &(struct clk_regmap_div_data){
2634 		.offset = HHI_VDEC2_CLK_CNTL,
2635 		.shift = 16,
2636 		.width = 7,
2637 		.flags = CLK_DIVIDER_ROUND_CLOSEST,
2638 	},
2639 	.hw.init = &(struct clk_init_data){
2640 		.name = "vdec_hevc_div",
2641 		.ops = &clk_regmap_divider_ops,
2642 		.parent_hws = (const struct clk_hw *[]) {
2643 			&gxbb_vdec_hevc_sel.hw
2644 		},
2645 		.num_parents = 1,
2646 		.flags = CLK_SET_RATE_PARENT,
2647 	},
2648 };
2649 
2650 static struct clk_regmap gxbb_vdec_hevc = {
2651 	.data = &(struct clk_regmap_gate_data){
2652 		.offset = HHI_VDEC2_CLK_CNTL,
2653 		.bit_idx = 24,
2654 	},
2655 	.hw.init = &(struct clk_init_data) {
2656 		.name = "vdec_hevc",
2657 		.ops = &clk_regmap_gate_ops,
2658 		.parent_hws = (const struct clk_hw *[]) {
2659 			&gxbb_vdec_hevc_div.hw
2660 		},
2661 		.num_parents = 1,
2662 		.flags = CLK_SET_RATE_PARENT,
2663 	},
2664 };
2665 
2666 static u32 gxbb_gen_clk_parents_val_table[] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, };
2667 static const struct clk_parent_data gxbb_gen_clk_parents[] = {
2668 	{ .fw_name = "xtal", },
2669 	{ .hw = &gxbb_vdec_1.hw },
2670 	{ .hw = &gxbb_vdec_hevc.hw },
2671 	{ .hw = &gxbb_mpll0.hw },
2672 	{ .hw = &gxbb_mpll1.hw },
2673 	{ .hw = &gxbb_mpll2.hw },
2674 	{ .hw = &gxbb_fclk_div4.hw },
2675 	{ .hw = &gxbb_fclk_div3.hw },
2676 	{ .hw = &gxbb_fclk_div5.hw },
2677 	{ .hw = &gxbb_fclk_div7.hw },
2678 	{ .hw = &gxbb_gp0_pll.hw },
2679 };
2680 
2681 static struct clk_regmap gxbb_gen_clk_sel = {
2682 	.data = &(struct clk_regmap_mux_data){
2683 		.offset = HHI_GEN_CLK_CNTL,
2684 		.mask = 0xf,
2685 		.shift = 12,
2686 		.table = gxbb_gen_clk_parents_val_table,
2687 	},
2688 	.hw.init = &(struct clk_init_data){
2689 		.name = "gen_clk_sel",
2690 		.ops = &clk_regmap_mux_ops,
2691 		/*
2692 		 * bits 15:12 selects from 14 possible parents:
2693 		 * xtal, [rtc_oscin_i], [sys_cpu_div16], [ddr_dpll_pt],
2694 		 * vid_pll, vid2_pll (hevc), mpll0, mpll1, mpll2, fdiv4,
2695 		 * fdiv3, fdiv5, [cts_msr_clk], fdiv7, gp0_pll
2696 		 */
2697 		.parent_data = gxbb_gen_clk_parents,
2698 		.num_parents = ARRAY_SIZE(gxbb_gen_clk_parents),
2699 	},
2700 };
2701 
2702 static struct clk_regmap gxbb_gen_clk_div = {
2703 	.data = &(struct clk_regmap_div_data){
2704 		.offset = HHI_GEN_CLK_CNTL,
2705 		.shift = 0,
2706 		.width = 11,
2707 	},
2708 	.hw.init = &(struct clk_init_data){
2709 		.name = "gen_clk_div",
2710 		.ops = &clk_regmap_divider_ops,
2711 		.parent_hws = (const struct clk_hw *[]) {
2712 			&gxbb_gen_clk_sel.hw
2713 		},
2714 		.num_parents = 1,
2715 		.flags = CLK_SET_RATE_PARENT,
2716 	},
2717 };
2718 
2719 static struct clk_regmap gxbb_gen_clk = {
2720 	.data = &(struct clk_regmap_gate_data){
2721 		.offset = HHI_GEN_CLK_CNTL,
2722 		.bit_idx = 7,
2723 	},
2724 	.hw.init = &(struct clk_init_data){
2725 		.name = "gen_clk",
2726 		.ops = &clk_regmap_gate_ops,
2727 		.parent_hws = (const struct clk_hw *[]) {
2728 			&gxbb_gen_clk_div.hw
2729 		},
2730 		.num_parents = 1,
2731 		.flags = CLK_SET_RATE_PARENT,
2732 	},
2733 };
2734 
2735 static const struct clk_parent_data gxbb_pclk_parents = { .hw = &gxbb_clk81.hw };
2736 
2737 #define GXBB_PCLK(_name, _reg, _bit, _flags) \
2738 	MESON_PCLK(_name, _reg, _bit, &gxbb_pclk_parents, _flags)
2739 
2740 /*
2741  * Everything Else (EE) domain gates
2742  *
2743  * NOTE: The gates below are marked with CLK_IGNORE_UNUSED for historic reasons
2744  * Users are encouraged to test without it and submit changes to:
2745  *  - remove the flag if not necessary
2746  *  - replace the flag with something more adequate, such as CLK_IS_CRITICAL,
2747  *    if appropriate.
2748  *  - add a comment explaining why the use of CLK_IGNORE_UNUSED is desirable
2749  *    for a particular clock.
2750  */
2751 static GXBB_PCLK(gxbb_ddr,		HHI_GCLK_MPEG0,  0, CLK_IGNORE_UNUSED);
2752 static GXBB_PCLK(gxbb_dos,		HHI_GCLK_MPEG0,  1, CLK_IGNORE_UNUSED);
2753 static GXBB_PCLK(gxbb_isa,		HHI_GCLK_MPEG0,  5, CLK_IGNORE_UNUSED);
2754 static GXBB_PCLK(gxbb_pl301,		HHI_GCLK_MPEG0,  6, CLK_IGNORE_UNUSED);
2755 static GXBB_PCLK(gxbb_periphs,		HHI_GCLK_MPEG0,  7, CLK_IGNORE_UNUSED);
2756 static GXBB_PCLK(gxbb_spicc,		HHI_GCLK_MPEG0,  8, CLK_IGNORE_UNUSED);
2757 static GXBB_PCLK(gxbb_i2c,		HHI_GCLK_MPEG0,  9, CLK_IGNORE_UNUSED);
2758 static GXBB_PCLK(gxbb_sana,		HHI_GCLK_MPEG0, 10, CLK_IGNORE_UNUSED);
2759 static GXBB_PCLK(gxbb_smart_card,	HHI_GCLK_MPEG0, 11, CLK_IGNORE_UNUSED);
2760 static GXBB_PCLK(gxbb_rng0,		HHI_GCLK_MPEG0, 12, CLK_IGNORE_UNUSED);
2761 static GXBB_PCLK(gxbb_uart0,		HHI_GCLK_MPEG0, 13, CLK_IGNORE_UNUSED);
2762 static GXBB_PCLK(gxbb_sdhc,		HHI_GCLK_MPEG0, 14, CLK_IGNORE_UNUSED);
2763 static GXBB_PCLK(gxbb_stream,		HHI_GCLK_MPEG0, 15, CLK_IGNORE_UNUSED);
2764 static GXBB_PCLK(gxbb_async_fifo,	HHI_GCLK_MPEG0, 16, CLK_IGNORE_UNUSED);
2765 static GXBB_PCLK(gxbb_sdio,		HHI_GCLK_MPEG0, 17, CLK_IGNORE_UNUSED);
2766 static GXBB_PCLK(gxbb_abuf,		HHI_GCLK_MPEG0, 18, CLK_IGNORE_UNUSED);
2767 static GXBB_PCLK(gxbb_hiu_iface,	HHI_GCLK_MPEG0, 19, CLK_IGNORE_UNUSED);
2768 static GXBB_PCLK(gxbb_assist_misc,	HHI_GCLK_MPEG0, 23, CLK_IGNORE_UNUSED);
2769 static GXBB_PCLK(gxbb_emmc_a,		HHI_GCLK_MPEG0, 24, CLK_IGNORE_UNUSED);
2770 static GXBB_PCLK(gxbb_emmc_b,		HHI_GCLK_MPEG0, 25, CLK_IGNORE_UNUSED);
2771 static GXBB_PCLK(gxbb_emmc_c,		HHI_GCLK_MPEG0, 26, CLK_IGNORE_UNUSED);
2772 static GXBB_PCLK(gxl_acodec,		HHI_GCLK_MPEG0, 28, CLK_IGNORE_UNUSED);
2773 static GXBB_PCLK(gxbb_spi,		HHI_GCLK_MPEG0, 30, CLK_IGNORE_UNUSED);
2774 
2775 static GXBB_PCLK(gxbb_i2s_spdif,	HHI_GCLK_MPEG1,  2, CLK_IGNORE_UNUSED);
2776 static GXBB_PCLK(gxbb_eth,		HHI_GCLK_MPEG1,  3, CLK_IGNORE_UNUSED);
2777 static GXBB_PCLK(gxbb_demux,		HHI_GCLK_MPEG1,  4, CLK_IGNORE_UNUSED);
2778 static GXBB_PCLK(gxbb_blkmv,		HHI_GCLK_MPEG1, 14, CLK_IGNORE_UNUSED);
2779 static GXBB_PCLK(gxbb_aiu,		HHI_GCLK_MPEG1, 15, CLK_IGNORE_UNUSED);
2780 static GXBB_PCLK(gxbb_uart1,		HHI_GCLK_MPEG1, 16, CLK_IGNORE_UNUSED);
2781 static GXBB_PCLK(gxbb_g2d,		HHI_GCLK_MPEG1, 20, CLK_IGNORE_UNUSED);
2782 static GXBB_PCLK(gxbb_usb0,		HHI_GCLK_MPEG1, 21, CLK_IGNORE_UNUSED);
2783 static GXBB_PCLK(gxbb_usb1,		HHI_GCLK_MPEG1, 22, CLK_IGNORE_UNUSED);
2784 static GXBB_PCLK(gxbb_reset,		HHI_GCLK_MPEG1, 23, CLK_IGNORE_UNUSED);
2785 static GXBB_PCLK(gxbb_nand,		HHI_GCLK_MPEG1, 24, CLK_IGNORE_UNUSED);
2786 static GXBB_PCLK(gxbb_dos_parser,	HHI_GCLK_MPEG1, 25, CLK_IGNORE_UNUSED);
2787 static GXBB_PCLK(gxbb_usb,		HHI_GCLK_MPEG1, 26, CLK_IGNORE_UNUSED);
2788 static GXBB_PCLK(gxbb_vdin1,		HHI_GCLK_MPEG1, 28, CLK_IGNORE_UNUSED);
2789 static GXBB_PCLK(gxbb_ahb_arb0,		HHI_GCLK_MPEG1, 29, CLK_IGNORE_UNUSED);
2790 static GXBB_PCLK(gxbb_efuse,		HHI_GCLK_MPEG1, 30, CLK_IGNORE_UNUSED);
2791 static GXBB_PCLK(gxbb_boot_rom,		HHI_GCLK_MPEG1, 31, CLK_IGNORE_UNUSED);
2792 
2793 static GXBB_PCLK(gxbb_ahb_data_bus,	HHI_GCLK_MPEG2,  1, CLK_IGNORE_UNUSED);
2794 static GXBB_PCLK(gxbb_ahb_ctrl_bus,	HHI_GCLK_MPEG2,  2, CLK_IGNORE_UNUSED);
2795 static GXBB_PCLK(gxbb_hdmi_intr_sync,	HHI_GCLK_MPEG2,  3, CLK_IGNORE_UNUSED);
2796 static GXBB_PCLK(gxbb_hdmi_pclk,	HHI_GCLK_MPEG2,  4, CLK_IGNORE_UNUSED);
2797 static GXBB_PCLK(gxbb_usb1_ddr_bridge,	HHI_GCLK_MPEG2,  8, CLK_IGNORE_UNUSED);
2798 static GXBB_PCLK(gxbb_usb0_ddr_bridge,	HHI_GCLK_MPEG2,  9, CLK_IGNORE_UNUSED);
2799 static GXBB_PCLK(gxbb_mmc_pclk,		HHI_GCLK_MPEG2, 11, CLK_IGNORE_UNUSED);
2800 static GXBB_PCLK(gxbb_dvin,		HHI_GCLK_MPEG2, 12, CLK_IGNORE_UNUSED);
2801 static GXBB_PCLK(gxbb_uart2,		HHI_GCLK_MPEG2, 15, CLK_IGNORE_UNUSED);
2802 static GXBB_PCLK(gxbb_sar_adc,		HHI_GCLK_MPEG2, 22, CLK_IGNORE_UNUSED);
2803 static GXBB_PCLK(gxbb_vpu_intr,		HHI_GCLK_MPEG2, 25, CLK_IGNORE_UNUSED);
2804 static GXBB_PCLK(gxbb_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26, CLK_IGNORE_UNUSED);
2805 static GXBB_PCLK(gxbb_clk81_a53,	HHI_GCLK_MPEG2, 29, CLK_IGNORE_UNUSED);
2806 
2807 static GXBB_PCLK(gxbb_vclk2_venci0,	HHI_GCLK_OTHER,  1, CLK_IGNORE_UNUSED);
2808 static GXBB_PCLK(gxbb_vclk2_venci1,	HHI_GCLK_OTHER,  2, CLK_IGNORE_UNUSED);
2809 static GXBB_PCLK(gxbb_vclk2_vencp0,	HHI_GCLK_OTHER,  3, CLK_IGNORE_UNUSED);
2810 static GXBB_PCLK(gxbb_vclk2_vencp1,	HHI_GCLK_OTHER,  4, CLK_IGNORE_UNUSED);
2811 static GXBB_PCLK(gxbb_gclk_venci_int0,	HHI_GCLK_OTHER,  8, CLK_IGNORE_UNUSED);
2812 static GXBB_PCLK(gxbb_gclk_vencp_int,	HHI_GCLK_OTHER,  9, CLK_IGNORE_UNUSED);
2813 static GXBB_PCLK(gxbb_dac_clk,		HHI_GCLK_OTHER, 10, CLK_IGNORE_UNUSED);
2814 static GXBB_PCLK(gxbb_aoclk_gate,	HHI_GCLK_OTHER, 14, CLK_IGNORE_UNUSED);
2815 static GXBB_PCLK(gxbb_iec958_gate,	HHI_GCLK_OTHER, 16, CLK_IGNORE_UNUSED);
2816 static GXBB_PCLK(gxbb_enc480p,		HHI_GCLK_OTHER, 20, CLK_IGNORE_UNUSED);
2817 static GXBB_PCLK(gxbb_rng1,		HHI_GCLK_OTHER, 21, CLK_IGNORE_UNUSED);
2818 static GXBB_PCLK(gxbb_gclk_venci_int1,	HHI_GCLK_OTHER, 22, CLK_IGNORE_UNUSED);
2819 static GXBB_PCLK(gxbb_vclk2_venclmcc,	HHI_GCLK_OTHER, 24, CLK_IGNORE_UNUSED);
2820 static GXBB_PCLK(gxbb_vclk2_vencl,	HHI_GCLK_OTHER, 25, CLK_IGNORE_UNUSED);
2821 static GXBB_PCLK(gxbb_vclk_other,	HHI_GCLK_OTHER, 26, CLK_IGNORE_UNUSED);
2822 static GXBB_PCLK(gxbb_edp,		HHI_GCLK_OTHER, 31, CLK_IGNORE_UNUSED);
2823 
2824 /* Always On (AO) domain gates */
2825 
2826 static GXBB_PCLK(gxbb_ao_media_cpu,	HHI_GCLK_AO, 0, CLK_IGNORE_UNUSED);
2827 static GXBB_PCLK(gxbb_ao_ahb_sram,	HHI_GCLK_AO, 1, CLK_IGNORE_UNUSED);
2828 static GXBB_PCLK(gxbb_ao_ahb_bus,	HHI_GCLK_AO, 2, CLK_IGNORE_UNUSED);
2829 static GXBB_PCLK(gxbb_ao_iface,		HHI_GCLK_AO, 3, CLK_IGNORE_UNUSED);
2830 static GXBB_PCLK(gxbb_ao_i2c,		HHI_GCLK_AO, 4, CLK_IGNORE_UNUSED);
2831 
2832 /* AIU gates */
2833 static const struct clk_parent_data gxbb_aiu_glue_parents = { .hw = &gxbb_aiu.hw };
2834 static MESON_PCLK(gxbb_aiu_glue, HHI_GCLK_MPEG1,  6, &gxbb_aiu_glue_parents, CLK_IGNORE_UNUSED);
2835 
2836 static const struct clk_parent_data gxbb_aiu_pclk_parents = { .hw = &gxbb_aiu_glue.hw };
2837 #define GXBB_AIU_PCLK(_name, _bit, _flags) \
2838 	MESON_PCLK(_name, HHI_GCLK_MPEG1, _bit, &gxbb_aiu_pclk_parents, _flags)
2839 
2840 static GXBB_AIU_PCLK(gxbb_iec958,	 7, CLK_IGNORE_UNUSED);
2841 static GXBB_AIU_PCLK(gxbb_i2s_out,	 8, CLK_IGNORE_UNUSED);
2842 static GXBB_AIU_PCLK(gxbb_amclk,	 9, CLK_IGNORE_UNUSED);
2843 static GXBB_AIU_PCLK(gxbb_aififo2,	10, CLK_IGNORE_UNUSED);
2844 static GXBB_AIU_PCLK(gxbb_mixer,	11, CLK_IGNORE_UNUSED);
2845 static GXBB_AIU_PCLK(gxbb_mixer_iface,	12, CLK_IGNORE_UNUSED);
2846 static GXBB_AIU_PCLK(gxbb_adc,		13, CLK_IGNORE_UNUSED);
2847 
2848 /* Array of all clocks provided by this provider */
2849 
2850 static struct clk_hw *gxbb_hw_clks[] = {
2851 	[CLKID_SYS_PLL]		    = &gxbb_sys_pll.hw,
2852 	[CLKID_HDMI_PLL]	    = &gxbb_hdmi_pll.hw,
2853 	[CLKID_FIXED_PLL]	    = &gxbb_fixed_pll.hw,
2854 	[CLKID_FCLK_DIV2]	    = &gxbb_fclk_div2.hw,
2855 	[CLKID_FCLK_DIV3]	    = &gxbb_fclk_div3.hw,
2856 	[CLKID_FCLK_DIV4]	    = &gxbb_fclk_div4.hw,
2857 	[CLKID_FCLK_DIV5]	    = &gxbb_fclk_div5.hw,
2858 	[CLKID_FCLK_DIV7]	    = &gxbb_fclk_div7.hw,
2859 	[CLKID_GP0_PLL]		    = &gxbb_gp0_pll.hw,
2860 	[CLKID_MPEG_SEL]	    = &gxbb_clk81_sel.hw,
2861 	[CLKID_MPEG_DIV]	    = &gxbb_clk81_div.hw,
2862 	[CLKID_CLK81]		    = &gxbb_clk81.hw,
2863 	[CLKID_MPLL0]		    = &gxbb_mpll0.hw,
2864 	[CLKID_MPLL1]		    = &gxbb_mpll1.hw,
2865 	[CLKID_MPLL2]		    = &gxbb_mpll2.hw,
2866 	[CLKID_DDR]		    = &gxbb_ddr.hw,
2867 	[CLKID_DOS]		    = &gxbb_dos.hw,
2868 	[CLKID_ISA]		    = &gxbb_isa.hw,
2869 	[CLKID_PL301]		    = &gxbb_pl301.hw,
2870 	[CLKID_PERIPHS]		    = &gxbb_periphs.hw,
2871 	[CLKID_SPICC]		    = &gxbb_spicc.hw,
2872 	[CLKID_I2C]		    = &gxbb_i2c.hw,
2873 	[CLKID_SAR_ADC]		    = &gxbb_sar_adc.hw,
2874 	[CLKID_SMART_CARD]	    = &gxbb_smart_card.hw,
2875 	[CLKID_RNG0]		    = &gxbb_rng0.hw,
2876 	[CLKID_UART0]		    = &gxbb_uart0.hw,
2877 	[CLKID_SDHC]		    = &gxbb_sdhc.hw,
2878 	[CLKID_STREAM]		    = &gxbb_stream.hw,
2879 	[CLKID_ASYNC_FIFO]	    = &gxbb_async_fifo.hw,
2880 	[CLKID_SDIO]		    = &gxbb_sdio.hw,
2881 	[CLKID_ABUF]		    = &gxbb_abuf.hw,
2882 	[CLKID_HIU_IFACE]	    = &gxbb_hiu_iface.hw,
2883 	[CLKID_ASSIST_MISC]	    = &gxbb_assist_misc.hw,
2884 	[CLKID_SPI]		    = &gxbb_spi.hw,
2885 	[CLKID_I2S_SPDIF]	    = &gxbb_i2s_spdif.hw,
2886 	[CLKID_ETH]		    = &gxbb_eth.hw,
2887 	[CLKID_DEMUX]		    = &gxbb_demux.hw,
2888 	[CLKID_AIU_GLUE]	    = &gxbb_aiu_glue.hw,
2889 	[CLKID_IEC958]		    = &gxbb_iec958.hw,
2890 	[CLKID_I2S_OUT]		    = &gxbb_i2s_out.hw,
2891 	[CLKID_AMCLK]		    = &gxbb_amclk.hw,
2892 	[CLKID_AIFIFO2]		    = &gxbb_aififo2.hw,
2893 	[CLKID_MIXER]		    = &gxbb_mixer.hw,
2894 	[CLKID_MIXER_IFACE]	    = &gxbb_mixer_iface.hw,
2895 	[CLKID_ADC]		    = &gxbb_adc.hw,
2896 	[CLKID_BLKMV]		    = &gxbb_blkmv.hw,
2897 	[CLKID_AIU]		    = &gxbb_aiu.hw,
2898 	[CLKID_UART1]		    = &gxbb_uart1.hw,
2899 	[CLKID_G2D]		    = &gxbb_g2d.hw,
2900 	[CLKID_USB0]		    = &gxbb_usb0.hw,
2901 	[CLKID_USB1]		    = &gxbb_usb1.hw,
2902 	[CLKID_RESET]		    = &gxbb_reset.hw,
2903 	[CLKID_NAND]		    = &gxbb_nand.hw,
2904 	[CLKID_DOS_PARSER]	    = &gxbb_dos_parser.hw,
2905 	[CLKID_USB]		    = &gxbb_usb.hw,
2906 	[CLKID_VDIN1]		    = &gxbb_vdin1.hw,
2907 	[CLKID_AHB_ARB0]	    = &gxbb_ahb_arb0.hw,
2908 	[CLKID_EFUSE]		    = &gxbb_efuse.hw,
2909 	[CLKID_BOOT_ROM]	    = &gxbb_boot_rom.hw,
2910 	[CLKID_AHB_DATA_BUS]	    = &gxbb_ahb_data_bus.hw,
2911 	[CLKID_AHB_CTRL_BUS]	    = &gxbb_ahb_ctrl_bus.hw,
2912 	[CLKID_HDMI_INTR_SYNC]	    = &gxbb_hdmi_intr_sync.hw,
2913 	[CLKID_HDMI_PCLK]	    = &gxbb_hdmi_pclk.hw,
2914 	[CLKID_USB1_DDR_BRIDGE]	    = &gxbb_usb1_ddr_bridge.hw,
2915 	[CLKID_USB0_DDR_BRIDGE]	    = &gxbb_usb0_ddr_bridge.hw,
2916 	[CLKID_MMC_PCLK]	    = &gxbb_mmc_pclk.hw,
2917 	[CLKID_DVIN]		    = &gxbb_dvin.hw,
2918 	[CLKID_UART2]		    = &gxbb_uart2.hw,
2919 	[CLKID_SANA]		    = &gxbb_sana.hw,
2920 	[CLKID_VPU_INTR]	    = &gxbb_vpu_intr.hw,
2921 	[CLKID_SEC_AHB_AHB3_BRIDGE] = &gxbb_sec_ahb_ahb3_bridge.hw,
2922 	[CLKID_CLK81_A53]	    = &gxbb_clk81_a53.hw,
2923 	[CLKID_VCLK2_VENCI0]	    = &gxbb_vclk2_venci0.hw,
2924 	[CLKID_VCLK2_VENCI1]	    = &gxbb_vclk2_venci1.hw,
2925 	[CLKID_VCLK2_VENCP0]	    = &gxbb_vclk2_vencp0.hw,
2926 	[CLKID_VCLK2_VENCP1]	    = &gxbb_vclk2_vencp1.hw,
2927 	[CLKID_GCLK_VENCI_INT0]	    = &gxbb_gclk_venci_int0.hw,
2928 	[CLKID_GCLK_VENCI_INT]	    = &gxbb_gclk_vencp_int.hw,
2929 	[CLKID_DAC_CLK]		    = &gxbb_dac_clk.hw,
2930 	[CLKID_AOCLK_GATE]	    = &gxbb_aoclk_gate.hw,
2931 	[CLKID_IEC958_GATE]	    = &gxbb_iec958_gate.hw,
2932 	[CLKID_ENC480P]		    = &gxbb_enc480p.hw,
2933 	[CLKID_RNG1]		    = &gxbb_rng1.hw,
2934 	[CLKID_GCLK_VENCI_INT1]	    = &gxbb_gclk_venci_int1.hw,
2935 	[CLKID_VCLK2_VENCLMCC]	    = &gxbb_vclk2_venclmcc.hw,
2936 	[CLKID_VCLK2_VENCL]	    = &gxbb_vclk2_vencl.hw,
2937 	[CLKID_VCLK_OTHER]	    = &gxbb_vclk_other.hw,
2938 	[CLKID_EDP]		    = &gxbb_edp.hw,
2939 	[CLKID_AO_MEDIA_CPU]	    = &gxbb_ao_media_cpu.hw,
2940 	[CLKID_AO_AHB_SRAM]	    = &gxbb_ao_ahb_sram.hw,
2941 	[CLKID_AO_AHB_BUS]	    = &gxbb_ao_ahb_bus.hw,
2942 	[CLKID_AO_IFACE]	    = &gxbb_ao_iface.hw,
2943 	[CLKID_AO_I2C]		    = &gxbb_ao_i2c.hw,
2944 	[CLKID_SD_EMMC_A]	    = &gxbb_emmc_a.hw,
2945 	[CLKID_SD_EMMC_B]	    = &gxbb_emmc_b.hw,
2946 	[CLKID_SD_EMMC_C]	    = &gxbb_emmc_c.hw,
2947 	[CLKID_SAR_ADC_CLK]	    = &gxbb_sar_adc_clk.hw,
2948 	[CLKID_SAR_ADC_SEL]	    = &gxbb_sar_adc_clk_sel.hw,
2949 	[CLKID_SAR_ADC_DIV]	    = &gxbb_sar_adc_clk_div.hw,
2950 	[CLKID_MALI_0_SEL]	    = &gxbb_mali_0_sel.hw,
2951 	[CLKID_MALI_0_DIV]	    = &gxbb_mali_0_div.hw,
2952 	[CLKID_MALI_0]		    = &gxbb_mali_0.hw,
2953 	[CLKID_MALI_1_SEL]	    = &gxbb_mali_1_sel.hw,
2954 	[CLKID_MALI_1_DIV]	    = &gxbb_mali_1_div.hw,
2955 	[CLKID_MALI_1]		    = &gxbb_mali_1.hw,
2956 	[CLKID_MALI]		    = &gxbb_mali.hw,
2957 	[CLKID_CTS_AMCLK]	    = &gxbb_cts_amclk.hw,
2958 	[CLKID_CTS_AMCLK_SEL]	    = &gxbb_cts_amclk_sel.hw,
2959 	[CLKID_CTS_AMCLK_DIV]	    = &gxbb_cts_amclk_div.hw,
2960 	[CLKID_CTS_MCLK_I958]	    = &gxbb_cts_mclk_i958.hw,
2961 	[CLKID_CTS_MCLK_I958_SEL]   = &gxbb_cts_mclk_i958_sel.hw,
2962 	[CLKID_CTS_MCLK_I958_DIV]   = &gxbb_cts_mclk_i958_div.hw,
2963 	[CLKID_CTS_I958]	    = &gxbb_cts_i958.hw,
2964 	[CLKID_32K_CLK]		    = &gxbb_32k_clk.hw,
2965 	[CLKID_32K_CLK_SEL]	    = &gxbb_32k_clk_sel.hw,
2966 	[CLKID_32K_CLK_DIV]	    = &gxbb_32k_clk_div.hw,
2967 	[CLKID_SD_EMMC_A_CLK0_SEL]  = &gxbb_sd_emmc_a_clk0_sel.hw,
2968 	[CLKID_SD_EMMC_A_CLK0_DIV]  = &gxbb_sd_emmc_a_clk0_div.hw,
2969 	[CLKID_SD_EMMC_A_CLK0]	    = &gxbb_sd_emmc_a_clk0.hw,
2970 	[CLKID_SD_EMMC_B_CLK0_SEL]  = &gxbb_sd_emmc_b_clk0_sel.hw,
2971 	[CLKID_SD_EMMC_B_CLK0_DIV]  = &gxbb_sd_emmc_b_clk0_div.hw,
2972 	[CLKID_SD_EMMC_B_CLK0]	    = &gxbb_sd_emmc_b_clk0.hw,
2973 	[CLKID_SD_EMMC_C_CLK0_SEL]  = &gxbb_sd_emmc_c_clk0_sel.hw,
2974 	[CLKID_SD_EMMC_C_CLK0_DIV]  = &gxbb_sd_emmc_c_clk0_div.hw,
2975 	[CLKID_SD_EMMC_C_CLK0]	    = &gxbb_sd_emmc_c_clk0.hw,
2976 	[CLKID_VPU_0_SEL]	    = &gxbb_vpu_0_sel.hw,
2977 	[CLKID_VPU_0_DIV]	    = &gxbb_vpu_0_div.hw,
2978 	[CLKID_VPU_0]		    = &gxbb_vpu_0.hw,
2979 	[CLKID_VPU_1_SEL]	    = &gxbb_vpu_1_sel.hw,
2980 	[CLKID_VPU_1_DIV]	    = &gxbb_vpu_1_div.hw,
2981 	[CLKID_VPU_1]		    = &gxbb_vpu_1.hw,
2982 	[CLKID_VPU]		    = &gxbb_vpu.hw,
2983 	[CLKID_VAPB_0_SEL]	    = &gxbb_vapb_0_sel.hw,
2984 	[CLKID_VAPB_0_DIV]	    = &gxbb_vapb_0_div.hw,
2985 	[CLKID_VAPB_0]		    = &gxbb_vapb_0.hw,
2986 	[CLKID_VAPB_1_SEL]	    = &gxbb_vapb_1_sel.hw,
2987 	[CLKID_VAPB_1_DIV]	    = &gxbb_vapb_1_div.hw,
2988 	[CLKID_VAPB_1]		    = &gxbb_vapb_1.hw,
2989 	[CLKID_VAPB_SEL]	    = &gxbb_vapb_sel.hw,
2990 	[CLKID_VAPB]		    = &gxbb_vapb.hw,
2991 	[CLKID_HDMI_PLL_PRE_MULT]   = &gxbb_hdmi_pll_pre_mult.hw,
2992 	[CLKID_MPLL0_DIV]	    = &gxbb_mpll0_div.hw,
2993 	[CLKID_MPLL1_DIV]	    = &gxbb_mpll1_div.hw,
2994 	[CLKID_MPLL2_DIV]	    = &gxbb_mpll2_div.hw,
2995 	[CLKID_MPLL_PREDIV]	    = &gxbb_mpll_prediv.hw,
2996 	[CLKID_FCLK_DIV2_DIV]	    = &gxbb_fclk_div2_div.hw,
2997 	[CLKID_FCLK_DIV3_DIV]	    = &gxbb_fclk_div3_div.hw,
2998 	[CLKID_FCLK_DIV4_DIV]	    = &gxbb_fclk_div4_div.hw,
2999 	[CLKID_FCLK_DIV5_DIV]	    = &gxbb_fclk_div5_div.hw,
3000 	[CLKID_FCLK_DIV7_DIV]	    = &gxbb_fclk_div7_div.hw,
3001 	[CLKID_VDEC_1_SEL]	    = &gxbb_vdec_1_sel.hw,
3002 	[CLKID_VDEC_1_DIV]	    = &gxbb_vdec_1_div.hw,
3003 	[CLKID_VDEC_1]		    = &gxbb_vdec_1.hw,
3004 	[CLKID_VDEC_HEVC_SEL]	    = &gxbb_vdec_hevc_sel.hw,
3005 	[CLKID_VDEC_HEVC_DIV]	    = &gxbb_vdec_hevc_div.hw,
3006 	[CLKID_VDEC_HEVC]	    = &gxbb_vdec_hevc.hw,
3007 	[CLKID_GEN_CLK_SEL]	    = &gxbb_gen_clk_sel.hw,
3008 	[CLKID_GEN_CLK_DIV]	    = &gxbb_gen_clk_div.hw,
3009 	[CLKID_GEN_CLK]		    = &gxbb_gen_clk.hw,
3010 	[CLKID_FIXED_PLL_DCO]	    = &gxbb_fixed_pll_dco.hw,
3011 	[CLKID_HDMI_PLL_DCO]	    = &gxbb_hdmi_pll_dco.hw,
3012 	[CLKID_HDMI_PLL_OD]	    = &gxbb_hdmi_pll_od.hw,
3013 	[CLKID_HDMI_PLL_OD2]	    = &gxbb_hdmi_pll_od2.hw,
3014 	[CLKID_SYS_PLL_DCO]	    = &gxbb_sys_pll_dco.hw,
3015 	[CLKID_GP0_PLL_DCO]	    = &gxbb_gp0_pll_dco.hw,
3016 	[CLKID_VID_PLL_DIV]	    = &gxbb_vid_pll_div.hw,
3017 	[CLKID_VID_PLL_SEL]	    = &gxbb_vid_pll_sel.hw,
3018 	[CLKID_VID_PLL]		    = &gxbb_vid_pll.hw,
3019 	[CLKID_VCLK_SEL]	    = &gxbb_vclk_sel.hw,
3020 	[CLKID_VCLK2_SEL]	    = &gxbb_vclk2_sel.hw,
3021 	[CLKID_VCLK_INPUT]	    = &gxbb_vclk_input.hw,
3022 	[CLKID_VCLK2_INPUT]	    = &gxbb_vclk2_input.hw,
3023 	[CLKID_VCLK_DIV]	    = &gxbb_vclk_div.hw,
3024 	[CLKID_VCLK2_DIV]	    = &gxbb_vclk2_div.hw,
3025 	[CLKID_VCLK]		    = &gxbb_vclk.hw,
3026 	[CLKID_VCLK2]		    = &gxbb_vclk2.hw,
3027 	[CLKID_VCLK_DIV1]	    = &gxbb_vclk_div1.hw,
3028 	[CLKID_VCLK_DIV2_EN]	    = &gxbb_vclk_div2_en.hw,
3029 	[CLKID_VCLK_DIV2]	    = &gxbb_vclk_div2.hw,
3030 	[CLKID_VCLK_DIV4_EN]	    = &gxbb_vclk_div4_en.hw,
3031 	[CLKID_VCLK_DIV4]	    = &gxbb_vclk_div4.hw,
3032 	[CLKID_VCLK_DIV6_EN]	    = &gxbb_vclk_div6_en.hw,
3033 	[CLKID_VCLK_DIV6]	    = &gxbb_vclk_div6.hw,
3034 	[CLKID_VCLK_DIV12_EN]	    = &gxbb_vclk_div12_en.hw,
3035 	[CLKID_VCLK_DIV12]	    = &gxbb_vclk_div12.hw,
3036 	[CLKID_VCLK2_DIV1]	    = &gxbb_vclk2_div1.hw,
3037 	[CLKID_VCLK2_DIV2_EN]	    = &gxbb_vclk2_div2_en.hw,
3038 	[CLKID_VCLK2_DIV2]	    = &gxbb_vclk2_div2.hw,
3039 	[CLKID_VCLK2_DIV4_EN]	    = &gxbb_vclk2_div4_en.hw,
3040 	[CLKID_VCLK2_DIV4]	    = &gxbb_vclk2_div4.hw,
3041 	[CLKID_VCLK2_DIV6_EN]	    = &gxbb_vclk2_div6_en.hw,
3042 	[CLKID_VCLK2_DIV6]	    = &gxbb_vclk2_div6.hw,
3043 	[CLKID_VCLK2_DIV12_EN]	    = &gxbb_vclk2_div12_en.hw,
3044 	[CLKID_VCLK2_DIV12]	    = &gxbb_vclk2_div12.hw,
3045 	[CLKID_CTS_ENCI_SEL]	    = &gxbb_cts_enci_sel.hw,
3046 	[CLKID_CTS_ENCP_SEL]	    = &gxbb_cts_encp_sel.hw,
3047 	[CLKID_CTS_VDAC_SEL]	    = &gxbb_cts_vdac_sel.hw,
3048 	[CLKID_HDMI_TX_SEL]	    = &gxbb_hdmi_tx_sel.hw,
3049 	[CLKID_CTS_ENCI]	    = &gxbb_cts_enci.hw,
3050 	[CLKID_CTS_ENCP]	    = &gxbb_cts_encp.hw,
3051 	[CLKID_CTS_VDAC]	    = &gxbb_cts_vdac.hw,
3052 	[CLKID_HDMI_TX]		    = &gxbb_hdmi_tx.hw,
3053 	[CLKID_HDMI_SEL]	    = &gxbb_hdmi_sel.hw,
3054 	[CLKID_HDMI_DIV]	    = &gxbb_hdmi_div.hw,
3055 	[CLKID_HDMI]		    = &gxbb_hdmi.hw,
3056 };
3057 
3058 static struct clk_hw *gxl_hw_clks[] = {
3059 	[CLKID_SYS_PLL]		    = &gxbb_sys_pll.hw,
3060 	[CLKID_HDMI_PLL]	    = &gxl_hdmi_pll.hw,
3061 	[CLKID_FIXED_PLL]	    = &gxbb_fixed_pll.hw,
3062 	[CLKID_FCLK_DIV2]	    = &gxbb_fclk_div2.hw,
3063 	[CLKID_FCLK_DIV3]	    = &gxbb_fclk_div3.hw,
3064 	[CLKID_FCLK_DIV4]	    = &gxbb_fclk_div4.hw,
3065 	[CLKID_FCLK_DIV5]	    = &gxbb_fclk_div5.hw,
3066 	[CLKID_FCLK_DIV7]	    = &gxbb_fclk_div7.hw,
3067 	[CLKID_GP0_PLL]		    = &gxbb_gp0_pll.hw,
3068 	[CLKID_MPEG_SEL]	    = &gxbb_clk81_sel.hw,
3069 	[CLKID_MPEG_DIV]	    = &gxbb_clk81_div.hw,
3070 	[CLKID_CLK81]		    = &gxbb_clk81.hw,
3071 	[CLKID_MPLL0]		    = &gxbb_mpll0.hw,
3072 	[CLKID_MPLL1]		    = &gxbb_mpll1.hw,
3073 	[CLKID_MPLL2]		    = &gxbb_mpll2.hw,
3074 	[CLKID_DDR]		    = &gxbb_ddr.hw,
3075 	[CLKID_DOS]		    = &gxbb_dos.hw,
3076 	[CLKID_ISA]		    = &gxbb_isa.hw,
3077 	[CLKID_PL301]		    = &gxbb_pl301.hw,
3078 	[CLKID_PERIPHS]		    = &gxbb_periphs.hw,
3079 	[CLKID_SPICC]		    = &gxbb_spicc.hw,
3080 	[CLKID_I2C]		    = &gxbb_i2c.hw,
3081 	[CLKID_SAR_ADC]		    = &gxbb_sar_adc.hw,
3082 	[CLKID_SMART_CARD]	    = &gxbb_smart_card.hw,
3083 	[CLKID_RNG0]		    = &gxbb_rng0.hw,
3084 	[CLKID_UART0]		    = &gxbb_uart0.hw,
3085 	[CLKID_SDHC]		    = &gxbb_sdhc.hw,
3086 	[CLKID_STREAM]		    = &gxbb_stream.hw,
3087 	[CLKID_ASYNC_FIFO]	    = &gxbb_async_fifo.hw,
3088 	[CLKID_SDIO]		    = &gxbb_sdio.hw,
3089 	[CLKID_ABUF]		    = &gxbb_abuf.hw,
3090 	[CLKID_HIU_IFACE]	    = &gxbb_hiu_iface.hw,
3091 	[CLKID_ASSIST_MISC]	    = &gxbb_assist_misc.hw,
3092 	[CLKID_SPI]		    = &gxbb_spi.hw,
3093 	[CLKID_I2S_SPDIF]	    = &gxbb_i2s_spdif.hw,
3094 	[CLKID_ETH]		    = &gxbb_eth.hw,
3095 	[CLKID_DEMUX]		    = &gxbb_demux.hw,
3096 	[CLKID_AIU_GLUE]	    = &gxbb_aiu_glue.hw,
3097 	[CLKID_IEC958]		    = &gxbb_iec958.hw,
3098 	[CLKID_I2S_OUT]		    = &gxbb_i2s_out.hw,
3099 	[CLKID_AMCLK]		    = &gxbb_amclk.hw,
3100 	[CLKID_AIFIFO2]		    = &gxbb_aififo2.hw,
3101 	[CLKID_MIXER]		    = &gxbb_mixer.hw,
3102 	[CLKID_MIXER_IFACE]	    = &gxbb_mixer_iface.hw,
3103 	[CLKID_ADC]		    = &gxbb_adc.hw,
3104 	[CLKID_BLKMV]		    = &gxbb_blkmv.hw,
3105 	[CLKID_AIU]		    = &gxbb_aiu.hw,
3106 	[CLKID_UART1]		    = &gxbb_uart1.hw,
3107 	[CLKID_G2D]		    = &gxbb_g2d.hw,
3108 	[CLKID_USB0]		    = &gxbb_usb0.hw,
3109 	[CLKID_USB1]		    = &gxbb_usb1.hw,
3110 	[CLKID_RESET]		    = &gxbb_reset.hw,
3111 	[CLKID_NAND]		    = &gxbb_nand.hw,
3112 	[CLKID_DOS_PARSER]	    = &gxbb_dos_parser.hw,
3113 	[CLKID_USB]		    = &gxbb_usb.hw,
3114 	[CLKID_VDIN1]		    = &gxbb_vdin1.hw,
3115 	[CLKID_AHB_ARB0]	    = &gxbb_ahb_arb0.hw,
3116 	[CLKID_EFUSE]		    = &gxbb_efuse.hw,
3117 	[CLKID_BOOT_ROM]	    = &gxbb_boot_rom.hw,
3118 	[CLKID_AHB_DATA_BUS]	    = &gxbb_ahb_data_bus.hw,
3119 	[CLKID_AHB_CTRL_BUS]	    = &gxbb_ahb_ctrl_bus.hw,
3120 	[CLKID_HDMI_INTR_SYNC]	    = &gxbb_hdmi_intr_sync.hw,
3121 	[CLKID_HDMI_PCLK]	    = &gxbb_hdmi_pclk.hw,
3122 	[CLKID_USB1_DDR_BRIDGE]	    = &gxbb_usb1_ddr_bridge.hw,
3123 	[CLKID_USB0_DDR_BRIDGE]	    = &gxbb_usb0_ddr_bridge.hw,
3124 	[CLKID_MMC_PCLK]	    = &gxbb_mmc_pclk.hw,
3125 	[CLKID_DVIN]		    = &gxbb_dvin.hw,
3126 	[CLKID_UART2]		    = &gxbb_uart2.hw,
3127 	[CLKID_SANA]		    = &gxbb_sana.hw,
3128 	[CLKID_VPU_INTR]	    = &gxbb_vpu_intr.hw,
3129 	[CLKID_SEC_AHB_AHB3_BRIDGE] = &gxbb_sec_ahb_ahb3_bridge.hw,
3130 	[CLKID_CLK81_A53]	    = &gxbb_clk81_a53.hw,
3131 	[CLKID_VCLK2_VENCI0]	    = &gxbb_vclk2_venci0.hw,
3132 	[CLKID_VCLK2_VENCI1]	    = &gxbb_vclk2_venci1.hw,
3133 	[CLKID_VCLK2_VENCP0]	    = &gxbb_vclk2_vencp0.hw,
3134 	[CLKID_VCLK2_VENCP1]	    = &gxbb_vclk2_vencp1.hw,
3135 	[CLKID_GCLK_VENCI_INT0]	    = &gxbb_gclk_venci_int0.hw,
3136 	[CLKID_GCLK_VENCI_INT]	    = &gxbb_gclk_vencp_int.hw,
3137 	[CLKID_DAC_CLK]		    = &gxbb_dac_clk.hw,
3138 	[CLKID_AOCLK_GATE]	    = &gxbb_aoclk_gate.hw,
3139 	[CLKID_IEC958_GATE]	    = &gxbb_iec958_gate.hw,
3140 	[CLKID_ENC480P]		    = &gxbb_enc480p.hw,
3141 	[CLKID_RNG1]		    = &gxbb_rng1.hw,
3142 	[CLKID_GCLK_VENCI_INT1]	    = &gxbb_gclk_venci_int1.hw,
3143 	[CLKID_VCLK2_VENCLMCC]	    = &gxbb_vclk2_venclmcc.hw,
3144 	[CLKID_VCLK2_VENCL]	    = &gxbb_vclk2_vencl.hw,
3145 	[CLKID_VCLK_OTHER]	    = &gxbb_vclk_other.hw,
3146 	[CLKID_EDP]		    = &gxbb_edp.hw,
3147 	[CLKID_AO_MEDIA_CPU]	    = &gxbb_ao_media_cpu.hw,
3148 	[CLKID_AO_AHB_SRAM]	    = &gxbb_ao_ahb_sram.hw,
3149 	[CLKID_AO_AHB_BUS]	    = &gxbb_ao_ahb_bus.hw,
3150 	[CLKID_AO_IFACE]	    = &gxbb_ao_iface.hw,
3151 	[CLKID_AO_I2C]		    = &gxbb_ao_i2c.hw,
3152 	[CLKID_SD_EMMC_A]	    = &gxbb_emmc_a.hw,
3153 	[CLKID_SD_EMMC_B]	    = &gxbb_emmc_b.hw,
3154 	[CLKID_SD_EMMC_C]	    = &gxbb_emmc_c.hw,
3155 	[CLKID_SAR_ADC_CLK]	    = &gxbb_sar_adc_clk.hw,
3156 	[CLKID_SAR_ADC_SEL]	    = &gxbb_sar_adc_clk_sel.hw,
3157 	[CLKID_SAR_ADC_DIV]	    = &gxbb_sar_adc_clk_div.hw,
3158 	[CLKID_MALI_0_SEL]	    = &gxbb_mali_0_sel.hw,
3159 	[CLKID_MALI_0_DIV]	    = &gxbb_mali_0_div.hw,
3160 	[CLKID_MALI_0]		    = &gxbb_mali_0.hw,
3161 	[CLKID_MALI_1_SEL]	    = &gxbb_mali_1_sel.hw,
3162 	[CLKID_MALI_1_DIV]	    = &gxbb_mali_1_div.hw,
3163 	[CLKID_MALI_1]		    = &gxbb_mali_1.hw,
3164 	[CLKID_MALI]		    = &gxbb_mali.hw,
3165 	[CLKID_CTS_AMCLK]	    = &gxbb_cts_amclk.hw,
3166 	[CLKID_CTS_AMCLK_SEL]	    = &gxbb_cts_amclk_sel.hw,
3167 	[CLKID_CTS_AMCLK_DIV]	    = &gxbb_cts_amclk_div.hw,
3168 	[CLKID_CTS_MCLK_I958]	    = &gxbb_cts_mclk_i958.hw,
3169 	[CLKID_CTS_MCLK_I958_SEL]   = &gxbb_cts_mclk_i958_sel.hw,
3170 	[CLKID_CTS_MCLK_I958_DIV]   = &gxbb_cts_mclk_i958_div.hw,
3171 	[CLKID_CTS_I958]	    = &gxbb_cts_i958.hw,
3172 	[CLKID_32K_CLK]		    = &gxbb_32k_clk.hw,
3173 	[CLKID_32K_CLK_SEL]	    = &gxbb_32k_clk_sel.hw,
3174 	[CLKID_32K_CLK_DIV]	    = &gxbb_32k_clk_div.hw,
3175 	[CLKID_SD_EMMC_A_CLK0_SEL]  = &gxbb_sd_emmc_a_clk0_sel.hw,
3176 	[CLKID_SD_EMMC_A_CLK0_DIV]  = &gxbb_sd_emmc_a_clk0_div.hw,
3177 	[CLKID_SD_EMMC_A_CLK0]	    = &gxbb_sd_emmc_a_clk0.hw,
3178 	[CLKID_SD_EMMC_B_CLK0_SEL]  = &gxbb_sd_emmc_b_clk0_sel.hw,
3179 	[CLKID_SD_EMMC_B_CLK0_DIV]  = &gxbb_sd_emmc_b_clk0_div.hw,
3180 	[CLKID_SD_EMMC_B_CLK0]	    = &gxbb_sd_emmc_b_clk0.hw,
3181 	[CLKID_SD_EMMC_C_CLK0_SEL]  = &gxbb_sd_emmc_c_clk0_sel.hw,
3182 	[CLKID_SD_EMMC_C_CLK0_DIV]  = &gxbb_sd_emmc_c_clk0_div.hw,
3183 	[CLKID_SD_EMMC_C_CLK0]	    = &gxbb_sd_emmc_c_clk0.hw,
3184 	[CLKID_VPU_0_SEL]	    = &gxbb_vpu_0_sel.hw,
3185 	[CLKID_VPU_0_DIV]	    = &gxbb_vpu_0_div.hw,
3186 	[CLKID_VPU_0]		    = &gxbb_vpu_0.hw,
3187 	[CLKID_VPU_1_SEL]	    = &gxbb_vpu_1_sel.hw,
3188 	[CLKID_VPU_1_DIV]	    = &gxbb_vpu_1_div.hw,
3189 	[CLKID_VPU_1]		    = &gxbb_vpu_1.hw,
3190 	[CLKID_VPU]		    = &gxbb_vpu.hw,
3191 	[CLKID_VAPB_0_SEL]	    = &gxbb_vapb_0_sel.hw,
3192 	[CLKID_VAPB_0_DIV]	    = &gxbb_vapb_0_div.hw,
3193 	[CLKID_VAPB_0]		    = &gxbb_vapb_0.hw,
3194 	[CLKID_VAPB_1_SEL]	    = &gxbb_vapb_1_sel.hw,
3195 	[CLKID_VAPB_1_DIV]	    = &gxbb_vapb_1_div.hw,
3196 	[CLKID_VAPB_1]		    = &gxbb_vapb_1.hw,
3197 	[CLKID_VAPB_SEL]	    = &gxbb_vapb_sel.hw,
3198 	[CLKID_VAPB]		    = &gxbb_vapb.hw,
3199 	[CLKID_MPLL0_DIV]	    = &gxl_mpll0_div.hw,
3200 	[CLKID_MPLL1_DIV]	    = &gxbb_mpll1_div.hw,
3201 	[CLKID_MPLL2_DIV]	    = &gxbb_mpll2_div.hw,
3202 	[CLKID_MPLL_PREDIV]	    = &gxbb_mpll_prediv.hw,
3203 	[CLKID_FCLK_DIV2_DIV]	    = &gxbb_fclk_div2_div.hw,
3204 	[CLKID_FCLK_DIV3_DIV]	    = &gxbb_fclk_div3_div.hw,
3205 	[CLKID_FCLK_DIV4_DIV]	    = &gxbb_fclk_div4_div.hw,
3206 	[CLKID_FCLK_DIV5_DIV]	    = &gxbb_fclk_div5_div.hw,
3207 	[CLKID_FCLK_DIV7_DIV]	    = &gxbb_fclk_div7_div.hw,
3208 	[CLKID_VDEC_1_SEL]	    = &gxbb_vdec_1_sel.hw,
3209 	[CLKID_VDEC_1_DIV]	    = &gxbb_vdec_1_div.hw,
3210 	[CLKID_VDEC_1]		    = &gxbb_vdec_1.hw,
3211 	[CLKID_VDEC_HEVC_SEL]	    = &gxbb_vdec_hevc_sel.hw,
3212 	[CLKID_VDEC_HEVC_DIV]	    = &gxbb_vdec_hevc_div.hw,
3213 	[CLKID_VDEC_HEVC]	    = &gxbb_vdec_hevc.hw,
3214 	[CLKID_GEN_CLK_SEL]	    = &gxbb_gen_clk_sel.hw,
3215 	[CLKID_GEN_CLK_DIV]	    = &gxbb_gen_clk_div.hw,
3216 	[CLKID_GEN_CLK]		    = &gxbb_gen_clk.hw,
3217 	[CLKID_FIXED_PLL_DCO]	    = &gxbb_fixed_pll_dco.hw,
3218 	[CLKID_HDMI_PLL_DCO]	    = &gxl_hdmi_pll_dco.hw,
3219 	[CLKID_HDMI_PLL_OD]	    = &gxl_hdmi_pll_od.hw,
3220 	[CLKID_HDMI_PLL_OD2]	    = &gxl_hdmi_pll_od2.hw,
3221 	[CLKID_SYS_PLL_DCO]	    = &gxbb_sys_pll_dco.hw,
3222 	[CLKID_GP0_PLL_DCO]	    = &gxl_gp0_pll_dco.hw,
3223 	[CLKID_VID_PLL_DIV]	    = &gxbb_vid_pll_div.hw,
3224 	[CLKID_VID_PLL_SEL]	    = &gxbb_vid_pll_sel.hw,
3225 	[CLKID_VID_PLL]		    = &gxbb_vid_pll.hw,
3226 	[CLKID_VCLK_SEL]	    = &gxbb_vclk_sel.hw,
3227 	[CLKID_VCLK2_SEL]	    = &gxbb_vclk2_sel.hw,
3228 	[CLKID_VCLK_INPUT]	    = &gxbb_vclk_input.hw,
3229 	[CLKID_VCLK2_INPUT]	    = &gxbb_vclk2_input.hw,
3230 	[CLKID_VCLK_DIV]	    = &gxbb_vclk_div.hw,
3231 	[CLKID_VCLK2_DIV]	    = &gxbb_vclk2_div.hw,
3232 	[CLKID_VCLK]		    = &gxbb_vclk.hw,
3233 	[CLKID_VCLK2]		    = &gxbb_vclk2.hw,
3234 	[CLKID_VCLK_DIV1]	    = &gxbb_vclk_div1.hw,
3235 	[CLKID_VCLK_DIV2_EN]	    = &gxbb_vclk_div2_en.hw,
3236 	[CLKID_VCLK_DIV2]	    = &gxbb_vclk_div2.hw,
3237 	[CLKID_VCLK_DIV4_EN]	    = &gxbb_vclk_div4_en.hw,
3238 	[CLKID_VCLK_DIV4]	    = &gxbb_vclk_div4.hw,
3239 	[CLKID_VCLK_DIV6_EN]	    = &gxbb_vclk_div6_en.hw,
3240 	[CLKID_VCLK_DIV6]	    = &gxbb_vclk_div6.hw,
3241 	[CLKID_VCLK_DIV12_EN]	    = &gxbb_vclk_div12_en.hw,
3242 	[CLKID_VCLK_DIV12]	    = &gxbb_vclk_div12.hw,
3243 	[CLKID_VCLK2_DIV1]	    = &gxbb_vclk2_div1.hw,
3244 	[CLKID_VCLK2_DIV2_EN]	    = &gxbb_vclk2_div2_en.hw,
3245 	[CLKID_VCLK2_DIV2]	    = &gxbb_vclk2_div2.hw,
3246 	[CLKID_VCLK2_DIV4_EN]	    = &gxbb_vclk2_div4_en.hw,
3247 	[CLKID_VCLK2_DIV4]	    = &gxbb_vclk2_div4.hw,
3248 	[CLKID_VCLK2_DIV6_EN]	    = &gxbb_vclk2_div6_en.hw,
3249 	[CLKID_VCLK2_DIV6]	    = &gxbb_vclk2_div6.hw,
3250 	[CLKID_VCLK2_DIV12_EN]	    = &gxbb_vclk2_div12_en.hw,
3251 	[CLKID_VCLK2_DIV12]	    = &gxbb_vclk2_div12.hw,
3252 	[CLKID_CTS_ENCI_SEL]	    = &gxbb_cts_enci_sel.hw,
3253 	[CLKID_CTS_ENCP_SEL]	    = &gxbb_cts_encp_sel.hw,
3254 	[CLKID_CTS_VDAC_SEL]	    = &gxbb_cts_vdac_sel.hw,
3255 	[CLKID_HDMI_TX_SEL]	    = &gxbb_hdmi_tx_sel.hw,
3256 	[CLKID_CTS_ENCI]	    = &gxbb_cts_enci.hw,
3257 	[CLKID_CTS_ENCP]	    = &gxbb_cts_encp.hw,
3258 	[CLKID_CTS_VDAC]	    = &gxbb_cts_vdac.hw,
3259 	[CLKID_HDMI_TX]		    = &gxbb_hdmi_tx.hw,
3260 	[CLKID_HDMI_SEL]	    = &gxbb_hdmi_sel.hw,
3261 	[CLKID_HDMI_DIV]	    = &gxbb_hdmi_div.hw,
3262 	[CLKID_HDMI]		    = &gxbb_hdmi.hw,
3263 	[CLKID_ACODEC]		    = &gxl_acodec.hw,
3264 };
3265 
3266 static const struct meson_clkc_data gxbb_clkc_data = {
3267 	.hw_clks = {
3268 		.hws = gxbb_hw_clks,
3269 		.num = ARRAY_SIZE(gxbb_hw_clks),
3270 	},
3271 };
3272 
3273 static const struct meson_clkc_data gxl_clkc_data = {
3274 	.hw_clks = {
3275 		.hws = gxl_hw_clks,
3276 		.num = ARRAY_SIZE(gxl_hw_clks),
3277 	},
3278 };
3279 
3280 static const struct of_device_id gxbb_clkc_match_table[] = {
3281 	{ .compatible = "amlogic,gxbb-clkc", .data = &gxbb_clkc_data },
3282 	{ .compatible = "amlogic,gxl-clkc", .data = &gxl_clkc_data },
3283 	{},
3284 };
3285 MODULE_DEVICE_TABLE(of, gxbb_clkc_match_table);
3286 
3287 static struct platform_driver gxbb_clkc_driver = {
3288 	.probe		= meson_clkc_syscon_probe,
3289 	.driver		= {
3290 		.name	= "gxbb-clkc",
3291 		.of_match_table = gxbb_clkc_match_table,
3292 	},
3293 };
3294 module_platform_driver(gxbb_clkc_driver);
3295 
3296 MODULE_DESCRIPTION("Amlogic GXBB Main Clock Controller driver");
3297 MODULE_LICENSE("GPL");
3298 MODULE_IMPORT_NS("CLK_MESON");
3299