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