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