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