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