1 // SPDX-License-Identifier: (GPL-2.0-only OR MIT)
2 /*
3 * Amlogic S4 Peripherals Clock Controller Driver
4 *
5 * Copyright (c) 2022-2023 Amlogic, inc. All rights reserved
6 * Author: Yu Tu <yu.tu@amlogic.com>
7 */
8
9 #include <linux/clk-provider.h>
10 #include <linux/of_device.h>
11 #include <linux/platform_device.h>
12
13 #include "clk-regmap.h"
14 #include "vid-pll-div.h"
15 #include "clk-dualdiv.h"
16 #include "s4-peripherals.h"
17 #include "meson-clkc-utils.h"
18 #include <dt-bindings/clock/amlogic,s4-peripherals-clkc.h>
19
20 static struct clk_regmap s4_rtc_32k_by_oscin_clkin = {
21 .data = &(struct clk_regmap_gate_data){
22 .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
23 .bit_idx = 31,
24 },
25 .hw.init = &(struct clk_init_data) {
26 .name = "rtc_32k_by_oscin_clkin",
27 .ops = &clk_regmap_gate_ops,
28 .parent_data = (const struct clk_parent_data []) {
29 { .fw_name = "xtal", }
30 },
31 .num_parents = 1,
32 },
33 };
34
35 static const struct meson_clk_dualdiv_param s4_32k_div_table[] = {
36 {
37 .dual = 1,
38 .n1 = 733,
39 .m1 = 8,
40 .n2 = 732,
41 .m2 = 11,
42 },
43 {}
44 };
45
46 static struct clk_regmap s4_rtc_32k_by_oscin_div = {
47 .data = &(struct meson_clk_dualdiv_data){
48 .n1 = {
49 .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
50 .shift = 0,
51 .width = 12,
52 },
53 .n2 = {
54 .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
55 .shift = 12,
56 .width = 12,
57 },
58 .m1 = {
59 .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
60 .shift = 0,
61 .width = 12,
62 },
63 .m2 = {
64 .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
65 .shift = 12,
66 .width = 12,
67 },
68 .dual = {
69 .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
70 .shift = 28,
71 .width = 1,
72 },
73 .table = s4_32k_div_table,
74 },
75 .hw.init = &(struct clk_init_data){
76 .name = "rtc_32k_by_oscin_div",
77 .ops = &meson_clk_dualdiv_ops,
78 .parent_hws = (const struct clk_hw *[]) {
79 &s4_rtc_32k_by_oscin_clkin.hw
80 },
81 .num_parents = 1,
82 },
83 };
84
85 static struct clk_regmap s4_rtc_32k_by_oscin_sel = {
86 .data = &(struct clk_regmap_mux_data) {
87 .offset = CLKCTRL_RTC_BY_OSCIN_CTRL1,
88 .mask = 0x1,
89 .shift = 24,
90 .flags = CLK_MUX_ROUND_CLOSEST,
91 },
92 .hw.init = &(struct clk_init_data){
93 .name = "rtc_32k_by_oscin_sel",
94 .ops = &clk_regmap_mux_ops,
95 .parent_hws = (const struct clk_hw *[]) {
96 &s4_rtc_32k_by_oscin_div.hw,
97 &s4_rtc_32k_by_oscin_clkin.hw,
98 },
99 .num_parents = 2,
100 .flags = CLK_SET_RATE_PARENT,
101 },
102 };
103
104 static struct clk_regmap s4_rtc_32k_by_oscin = {
105 .data = &(struct clk_regmap_gate_data){
106 .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
107 .bit_idx = 30,
108 },
109 .hw.init = &(struct clk_init_data) {
110 .name = "rtc_32k_by_oscin",
111 .ops = &clk_regmap_gate_ops,
112 .parent_hws = (const struct clk_hw *[]) {
113 &s4_rtc_32k_by_oscin_sel.hw
114 },
115 .num_parents = 1,
116 .flags = CLK_SET_RATE_PARENT,
117 },
118 };
119
120 static struct clk_regmap s4_rtc_clk = {
121 .data = &(struct clk_regmap_mux_data) {
122 .offset = CLKCTRL_RTC_CTRL,
123 .mask = 0x3,
124 .shift = 0,
125 .flags = CLK_MUX_ROUND_CLOSEST,
126 },
127 .hw.init = &(struct clk_init_data){
128 .name = "rtc_clk_sel",
129 .ops = &clk_regmap_mux_ops,
130 .parent_hws = (const struct clk_hw *[]) {
131 &s4_rtc_32k_by_oscin.hw,
132 &s4_rtc_32k_by_oscin_div.hw,
133 },
134 .num_parents = 2,
135 .flags = CLK_SET_RATE_PARENT,
136 },
137 };
138
139 /* The index 5 is AXI_CLK, which is dedicated to AXI. So skip it. */
140 static u32 mux_table_sys_ab_clk_sel[] = { 0, 1, 2, 3, 4, 6, 7 };
141 static const struct clk_parent_data sys_ab_clk_parent_data[] = {
142 { .fw_name = "xtal" },
143 { .fw_name = "fclk_div2" },
144 { .fw_name = "fclk_div3" },
145 { .fw_name = "fclk_div4" },
146 { .fw_name = "fclk_div5" },
147 { .fw_name = "fclk_div7" },
148 { .hw = &s4_rtc_clk.hw }
149 };
150
151 /*
152 * This clock is initialized by ROMcode.
153 * The chip was changed SYS CLK for security reasons. SYS CLK registers are not writable
154 * in the kernel phase. Write of SYS related register will cause the system to crash.
155 * Meanwhile, these clock won't ever change at runtime.
156 * For the above reasons, we can only use ro_ops for SYS related clocks.
157 */
158 static struct clk_regmap s4_sysclk_b_sel = {
159 .data = &(struct clk_regmap_mux_data){
160 .offset = CLKCTRL_SYS_CLK_CTRL0,
161 .mask = 0x7,
162 .shift = 26,
163 .table = mux_table_sys_ab_clk_sel,
164 },
165 .hw.init = &(struct clk_init_data){
166 .name = "sysclk_b_sel",
167 .ops = &clk_regmap_mux_ro_ops,
168 .parent_data = sys_ab_clk_parent_data,
169 .num_parents = ARRAY_SIZE(sys_ab_clk_parent_data),
170 },
171 };
172
173 static struct clk_regmap s4_sysclk_b_div = {
174 .data = &(struct clk_regmap_div_data){
175 .offset = CLKCTRL_SYS_CLK_CTRL0,
176 .shift = 16,
177 .width = 10,
178 },
179 .hw.init = &(struct clk_init_data){
180 .name = "sysclk_b_div",
181 .ops = &clk_regmap_divider_ro_ops,
182 .parent_hws = (const struct clk_hw *[]) {
183 &s4_sysclk_b_sel.hw
184 },
185 .num_parents = 1,
186 },
187 };
188
189 static struct clk_regmap s4_sysclk_b = {
190 .data = &(struct clk_regmap_gate_data){
191 .offset = CLKCTRL_SYS_CLK_CTRL0,
192 .bit_idx = 29,
193 },
194 .hw.init = &(struct clk_init_data) {
195 .name = "sysclk_b",
196 .ops = &clk_regmap_gate_ro_ops,
197 .parent_hws = (const struct clk_hw *[]) {
198 &s4_sysclk_b_div.hw
199 },
200 .num_parents = 1,
201 },
202 };
203
204 static struct clk_regmap s4_sysclk_a_sel = {
205 .data = &(struct clk_regmap_mux_data){
206 .offset = CLKCTRL_SYS_CLK_CTRL0,
207 .mask = 0x7,
208 .shift = 10,
209 .table = mux_table_sys_ab_clk_sel,
210 },
211 .hw.init = &(struct clk_init_data){
212 .name = "sysclk_a_sel",
213 .ops = &clk_regmap_mux_ro_ops,
214 .parent_data = sys_ab_clk_parent_data,
215 .num_parents = ARRAY_SIZE(sys_ab_clk_parent_data),
216 },
217 };
218
219 static struct clk_regmap s4_sysclk_a_div = {
220 .data = &(struct clk_regmap_div_data){
221 .offset = CLKCTRL_SYS_CLK_CTRL0,
222 .shift = 0,
223 .width = 10,
224 },
225 .hw.init = &(struct clk_init_data){
226 .name = "sysclk_a_div",
227 .ops = &clk_regmap_divider_ro_ops,
228 .parent_hws = (const struct clk_hw *[]) {
229 &s4_sysclk_a_sel.hw
230 },
231 .num_parents = 1,
232 },
233 };
234
235 static struct clk_regmap s4_sysclk_a = {
236 .data = &(struct clk_regmap_gate_data){
237 .offset = CLKCTRL_SYS_CLK_CTRL0,
238 .bit_idx = 13,
239 },
240 .hw.init = &(struct clk_init_data) {
241 .name = "sysclk_a",
242 .ops = &clk_regmap_gate_ro_ops,
243 .parent_hws = (const struct clk_hw *[]) {
244 &s4_sysclk_a_div.hw
245 },
246 .num_parents = 1,
247 },
248 };
249
250 static struct clk_regmap s4_sys_clk = {
251 .data = &(struct clk_regmap_mux_data){
252 .offset = CLKCTRL_SYS_CLK_CTRL0,
253 .mask = 0x1,
254 .shift = 31,
255 },
256 .hw.init = &(struct clk_init_data){
257 .name = "sys_clk",
258 .ops = &clk_regmap_mux_ro_ops,
259 .parent_hws = (const struct clk_hw *[]) {
260 &s4_sysclk_a.hw,
261 &s4_sysclk_b.hw
262 },
263 .num_parents = 2,
264 },
265 };
266
267 static struct clk_regmap s4_ceca_32k_clkin = {
268 .data = &(struct clk_regmap_gate_data){
269 .offset = CLKCTRL_CECA_CTRL0,
270 .bit_idx = 31,
271 },
272 .hw.init = &(struct clk_init_data) {
273 .name = "ceca_32k_clkin",
274 .ops = &clk_regmap_gate_ops,
275 .parent_data = (const struct clk_parent_data []) {
276 { .fw_name = "xtal", }
277 },
278 .num_parents = 1,
279 },
280 };
281
282 static struct clk_regmap s4_ceca_32k_div = {
283 .data = &(struct meson_clk_dualdiv_data){
284 .n1 = {
285 .reg_off = CLKCTRL_CECA_CTRL0,
286 .shift = 0,
287 .width = 12,
288 },
289 .n2 = {
290 .reg_off = CLKCTRL_CECA_CTRL0,
291 .shift = 12,
292 .width = 12,
293 },
294 .m1 = {
295 .reg_off = CLKCTRL_CECA_CTRL1,
296 .shift = 0,
297 .width = 12,
298 },
299 .m2 = {
300 .reg_off = CLKCTRL_CECA_CTRL1,
301 .shift = 12,
302 .width = 12,
303 },
304 .dual = {
305 .reg_off = CLKCTRL_CECA_CTRL0,
306 .shift = 28,
307 .width = 1,
308 },
309 .table = s4_32k_div_table,
310 },
311 .hw.init = &(struct clk_init_data){
312 .name = "ceca_32k_div",
313 .ops = &meson_clk_dualdiv_ops,
314 .parent_hws = (const struct clk_hw *[]) {
315 &s4_ceca_32k_clkin.hw
316 },
317 .num_parents = 1,
318 },
319 };
320
321 static struct clk_regmap s4_ceca_32k_sel_pre = {
322 .data = &(struct clk_regmap_mux_data) {
323 .offset = CLKCTRL_CECA_CTRL1,
324 .mask = 0x1,
325 .shift = 24,
326 .flags = CLK_MUX_ROUND_CLOSEST,
327 },
328 .hw.init = &(struct clk_init_data){
329 .name = "ceca_32k_sel_pre",
330 .ops = &clk_regmap_mux_ops,
331 .parent_hws = (const struct clk_hw *[]) {
332 &s4_ceca_32k_div.hw,
333 &s4_ceca_32k_clkin.hw
334 },
335 .num_parents = 2,
336 .flags = CLK_SET_RATE_PARENT,
337 },
338 };
339
340 static struct clk_regmap s4_ceca_32k_sel = {
341 .data = &(struct clk_regmap_mux_data) {
342 .offset = CLKCTRL_CECA_CTRL1,
343 .mask = 0x1,
344 .shift = 31,
345 .flags = CLK_MUX_ROUND_CLOSEST,
346 },
347 .hw.init = &(struct clk_init_data){
348 .name = "ceca_32k_sel",
349 .ops = &clk_regmap_mux_ops,
350 .parent_hws = (const struct clk_hw *[]) {
351 &s4_ceca_32k_sel_pre.hw,
352 &s4_rtc_clk.hw
353 },
354 .num_parents = 2,
355 },
356 };
357
358 static struct clk_regmap s4_ceca_32k_clkout = {
359 .data = &(struct clk_regmap_gate_data){
360 .offset = CLKCTRL_CECA_CTRL0,
361 .bit_idx = 30,
362 },
363 .hw.init = &(struct clk_init_data){
364 .name = "ceca_32k_clkout",
365 .ops = &clk_regmap_gate_ops,
366 .parent_hws = (const struct clk_hw *[]) {
367 &s4_ceca_32k_sel.hw
368 },
369 .num_parents = 1,
370 .flags = CLK_SET_RATE_PARENT,
371 },
372 };
373
374 static struct clk_regmap s4_cecb_32k_clkin = {
375 .data = &(struct clk_regmap_gate_data){
376 .offset = CLKCTRL_CECB_CTRL0,
377 .bit_idx = 31,
378 },
379 .hw.init = &(struct clk_init_data) {
380 .name = "cecb_32k_clkin",
381 .ops = &clk_regmap_gate_ops,
382 .parent_data = (const struct clk_parent_data []) {
383 { .fw_name = "xtal", }
384 },
385 .num_parents = 1,
386 },
387 };
388
389 static struct clk_regmap s4_cecb_32k_div = {
390 .data = &(struct meson_clk_dualdiv_data){
391 .n1 = {
392 .reg_off = CLKCTRL_CECB_CTRL0,
393 .shift = 0,
394 .width = 12,
395 },
396 .n2 = {
397 .reg_off = CLKCTRL_CECB_CTRL0,
398 .shift = 12,
399 .width = 12,
400 },
401 .m1 = {
402 .reg_off = CLKCTRL_CECB_CTRL1,
403 .shift = 0,
404 .width = 12,
405 },
406 .m2 = {
407 .reg_off = CLKCTRL_CECB_CTRL1,
408 .shift = 12,
409 .width = 12,
410 },
411 .dual = {
412 .reg_off = CLKCTRL_CECB_CTRL0,
413 .shift = 28,
414 .width = 1,
415 },
416 .table = s4_32k_div_table,
417 },
418 .hw.init = &(struct clk_init_data){
419 .name = "cecb_32k_div",
420 .ops = &meson_clk_dualdiv_ops,
421 .parent_hws = (const struct clk_hw *[]) {
422 &s4_cecb_32k_clkin.hw
423 },
424 .num_parents = 1,
425 },
426 };
427
428 static struct clk_regmap s4_cecb_32k_sel_pre = {
429 .data = &(struct clk_regmap_mux_data) {
430 .offset = CLKCTRL_CECB_CTRL1,
431 .mask = 0x1,
432 .shift = 24,
433 .flags = CLK_MUX_ROUND_CLOSEST,
434 },
435 .hw.init = &(struct clk_init_data){
436 .name = "cecb_32k_sel_pre",
437 .ops = &clk_regmap_mux_ops,
438 .parent_hws = (const struct clk_hw *[]) {
439 &s4_cecb_32k_div.hw,
440 &s4_cecb_32k_clkin.hw
441 },
442 .num_parents = 2,
443 .flags = CLK_SET_RATE_PARENT,
444 },
445 };
446
447 static struct clk_regmap s4_cecb_32k_sel = {
448 .data = &(struct clk_regmap_mux_data) {
449 .offset = CLKCTRL_CECB_CTRL1,
450 .mask = 0x1,
451 .shift = 31,
452 .flags = CLK_MUX_ROUND_CLOSEST,
453 },
454 .hw.init = &(struct clk_init_data){
455 .name = "cecb_32k_sel",
456 .ops = &clk_regmap_mux_ops,
457 .parent_hws = (const struct clk_hw *[]) {
458 &s4_cecb_32k_sel_pre.hw,
459 &s4_rtc_clk.hw
460 },
461 .num_parents = 2,
462 },
463 };
464
465 static struct clk_regmap s4_cecb_32k_clkout = {
466 .data = &(struct clk_regmap_gate_data){
467 .offset = CLKCTRL_CECB_CTRL0,
468 .bit_idx = 30,
469 },
470 .hw.init = &(struct clk_init_data){
471 .name = "cecb_32k_clkout",
472 .ops = &clk_regmap_gate_ops,
473 .parent_hws = (const struct clk_hw *[]) {
474 &s4_cecb_32k_sel.hw
475 },
476 .num_parents = 1,
477 .flags = CLK_SET_RATE_PARENT,
478 },
479 };
480
481 static const struct clk_parent_data s4_sc_parent_data[] = {
482 { .fw_name = "fclk_div4" },
483 { .fw_name = "fclk_div3" },
484 { .fw_name = "fclk_div5" },
485 { .fw_name = "xtal", }
486 };
487
488 static struct clk_regmap s4_sc_clk_mux = {
489 .data = &(struct clk_regmap_mux_data){
490 .offset = CLKCTRL_SC_CLK_CTRL,
491 .mask = 0x3,
492 .shift = 9,
493 },
494 .hw.init = &(struct clk_init_data) {
495 .name = "sc_clk_mux",
496 .ops = &clk_regmap_mux_ops,
497 .parent_data = s4_sc_parent_data,
498 .num_parents = ARRAY_SIZE(s4_sc_parent_data),
499 .flags = CLK_SET_RATE_PARENT,
500 },
501 };
502
503 static struct clk_regmap s4_sc_clk_div = {
504 .data = &(struct clk_regmap_div_data){
505 .offset = CLKCTRL_SC_CLK_CTRL,
506 .shift = 0,
507 .width = 8,
508 },
509 .hw.init = &(struct clk_init_data) {
510 .name = "sc_clk_div",
511 .ops = &clk_regmap_divider_ops,
512 .parent_hws = (const struct clk_hw *[]) {
513 &s4_sc_clk_mux.hw
514 },
515 .num_parents = 1,
516 .flags = CLK_SET_RATE_PARENT,
517 },
518 };
519
520 static struct clk_regmap s4_sc_clk_gate = {
521 .data = &(struct clk_regmap_gate_data){
522 .offset = CLKCTRL_SC_CLK_CTRL,
523 .bit_idx = 8,
524 },
525 .hw.init = &(struct clk_init_data){
526 .name = "sc_clk_gate",
527 .ops = &clk_regmap_gate_ops,
528 .parent_hws = (const struct clk_hw *[]) {
529 &s4_sc_clk_div.hw
530 },
531 .num_parents = 1,
532 .flags = CLK_SET_RATE_PARENT,
533 },
534 };
535
536 static struct clk_regmap s4_12_24M_clk_gate = {
537 .data = &(struct clk_regmap_gate_data){
538 .offset = CLKCTRL_CLK12_24_CTRL,
539 .bit_idx = 11,
540 },
541 .hw.init = &(struct clk_init_data) {
542 .name = "12_24m_gate",
543 .ops = &clk_regmap_gate_ops,
544 .parent_data = (const struct clk_parent_data []) {
545 { .fw_name = "xtal", }
546 },
547 .num_parents = 1,
548 },
549 };
550
551 static struct clk_fixed_factor s4_12M_clk_div = {
552 .mult = 1,
553 .div = 2,
554 .hw.init = &(struct clk_init_data){
555 .name = "12M",
556 .ops = &clk_fixed_factor_ops,
557 .parent_hws = (const struct clk_hw *[]) {
558 &s4_12_24M_clk_gate.hw
559 },
560 .num_parents = 1,
561 .flags = CLK_SET_RATE_PARENT,
562 },
563 };
564
565 static struct clk_regmap s4_12_24M_clk = {
566 .data = &(struct clk_regmap_mux_data){
567 .offset = CLKCTRL_CLK12_24_CTRL,
568 .mask = 0x1,
569 .shift = 10,
570 },
571 .hw.init = &(struct clk_init_data) {
572 .name = "12_24m",
573 .ops = &clk_regmap_mux_ops,
574 .parent_hws = (const struct clk_hw *[]) {
575 &s4_12_24M_clk_gate.hw,
576 &s4_12M_clk_div.hw,
577 },
578 .num_parents = 2,
579 .flags = CLK_SET_RATE_PARENT,
580 },
581 };
582
583 /* Video Clocks */
584 static struct clk_regmap s4_vid_pll_div = {
585 .data = &(struct meson_vid_pll_div_data){
586 .val = {
587 .reg_off = CLKCTRL_VID_PLL_CLK_DIV,
588 .shift = 0,
589 .width = 15,
590 },
591 .sel = {
592 .reg_off = CLKCTRL_VID_PLL_CLK_DIV,
593 .shift = 16,
594 .width = 2,
595 },
596 },
597 .hw.init = &(struct clk_init_data) {
598 .name = "vid_pll_div",
599 /*
600 * TODO meson_vid_pll_div_ro_ops to meson_vid_pll_div_ops
601 */
602 .ops = &meson_vid_pll_div_ro_ops,
603 .parent_data = (const struct clk_parent_data []) {
604 { .fw_name = "hdmi_pll", }
605 },
606 .num_parents = 1,
607 .flags = CLK_SET_RATE_PARENT,
608 },
609 };
610
611 static struct clk_regmap s4_vid_pll_sel = {
612 .data = &(struct clk_regmap_mux_data){
613 .offset = CLKCTRL_VID_PLL_CLK_DIV,
614 .mask = 0x1,
615 .shift = 18,
616 },
617 .hw.init = &(struct clk_init_data){
618 .name = "vid_pll_sel",
619 .ops = &clk_regmap_mux_ops,
620 .parent_data = (const struct clk_parent_data []) {
621 { .hw = &s4_vid_pll_div.hw },
622 { .fw_name = "hdmi_pll", }
623 },
624 .num_parents = 2,
625 .flags = CLK_SET_RATE_PARENT,
626 },
627 };
628
629 static struct clk_regmap s4_vid_pll = {
630 .data = &(struct clk_regmap_gate_data){
631 .offset = CLKCTRL_VID_PLL_CLK_DIV,
632 .bit_idx = 19,
633 },
634 .hw.init = &(struct clk_init_data) {
635 .name = "vid_pll",
636 .ops = &clk_regmap_gate_ops,
637 .parent_hws = (const struct clk_hw *[]) {
638 &s4_vid_pll_sel.hw
639 },
640 .num_parents = 1,
641 .flags = CLK_SET_RATE_PARENT,
642 },
643 };
644
645 static const struct clk_parent_data s4_vclk_parent_data[] = {
646 { .hw = &s4_vid_pll.hw },
647 { .fw_name = "gp0_pll", },
648 { .fw_name = "hifi_pll", },
649 { .fw_name = "mpll1", },
650 { .fw_name = "fclk_div3", },
651 { .fw_name = "fclk_div4", },
652 { .fw_name = "fclk_div5", },
653 { .fw_name = "fclk_div7", },
654 };
655
656 static struct clk_regmap s4_vclk_sel = {
657 .data = &(struct clk_regmap_mux_data){
658 .offset = CLKCTRL_VID_CLK_CTRL,
659 .mask = 0x7,
660 .shift = 16,
661 },
662 .hw.init = &(struct clk_init_data){
663 .name = "vclk_sel",
664 .ops = &clk_regmap_mux_ops,
665 .parent_data = s4_vclk_parent_data,
666 .num_parents = ARRAY_SIZE(s4_vclk_parent_data),
667 .flags = 0,
668 },
669 };
670
671 static struct clk_regmap s4_vclk2_sel = {
672 .data = &(struct clk_regmap_mux_data){
673 .offset = CLKCTRL_VIID_CLK_CTRL,
674 .mask = 0x7,
675 .shift = 16,
676 },
677 .hw.init = &(struct clk_init_data){
678 .name = "vclk2_sel",
679 .ops = &clk_regmap_mux_ops,
680 .parent_data = s4_vclk_parent_data,
681 .num_parents = ARRAY_SIZE(s4_vclk_parent_data),
682 .flags = 0,
683 },
684 };
685
686 static struct clk_regmap s4_vclk_input = {
687 .data = &(struct clk_regmap_gate_data){
688 .offset = CLKCTRL_VID_CLK_DIV,
689 .bit_idx = 16,
690 },
691 .hw.init = &(struct clk_init_data) {
692 .name = "vclk_input",
693 .ops = &clk_regmap_gate_ops,
694 .parent_hws = (const struct clk_hw *[]) { &s4_vclk_sel.hw },
695 .num_parents = 1,
696 .flags = CLK_SET_RATE_PARENT,
697 },
698 };
699
700 static struct clk_regmap s4_vclk2_input = {
701 .data = &(struct clk_regmap_gate_data){
702 .offset = CLKCTRL_VIID_CLK_DIV,
703 .bit_idx = 16,
704 },
705 .hw.init = &(struct clk_init_data) {
706 .name = "vclk2_input",
707 .ops = &clk_regmap_gate_ops,
708 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2_sel.hw },
709 .num_parents = 1,
710 .flags = CLK_SET_RATE_PARENT,
711 },
712 };
713
714 static struct clk_regmap s4_vclk_div = {
715 .data = &(struct clk_regmap_div_data){
716 .offset = CLKCTRL_VID_CLK_DIV,
717 .shift = 0,
718 .width = 8,
719 },
720 .hw.init = &(struct clk_init_data){
721 .name = "vclk_div",
722 .ops = &clk_regmap_divider_ops,
723 .parent_hws = (const struct clk_hw *[]) {
724 &s4_vclk_input.hw
725 },
726 .num_parents = 1,
727 .flags = CLK_SET_RATE_PARENT,
728 },
729 };
730
731 static struct clk_regmap s4_vclk2_div = {
732 .data = &(struct clk_regmap_div_data){
733 .offset = CLKCTRL_VIID_CLK_DIV,
734 .shift = 0,
735 .width = 8,
736 },
737 .hw.init = &(struct clk_init_data){
738 .name = "vclk2_div",
739 .ops = &clk_regmap_divider_ops,
740 .parent_hws = (const struct clk_hw *[]) {
741 &s4_vclk2_input.hw
742 },
743 .num_parents = 1,
744 .flags = CLK_SET_RATE_PARENT,
745 },
746 };
747
748 static struct clk_regmap s4_vclk = {
749 .data = &(struct clk_regmap_gate_data){
750 .offset = CLKCTRL_VID_CLK_CTRL,
751 .bit_idx = 19,
752 },
753 .hw.init = &(struct clk_init_data) {
754 .name = "vclk",
755 .ops = &clk_regmap_gate_ops,
756 .parent_hws = (const struct clk_hw *[]) { &s4_vclk_div.hw },
757 .num_parents = 1,
758 .flags = CLK_SET_RATE_PARENT,
759 },
760 };
761
762 static struct clk_regmap s4_vclk2 = {
763 .data = &(struct clk_regmap_gate_data){
764 .offset = CLKCTRL_VIID_CLK_CTRL,
765 .bit_idx = 19,
766 },
767 .hw.init = &(struct clk_init_data) {
768 .name = "vclk2",
769 .ops = &clk_regmap_gate_ops,
770 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2_div.hw },
771 .num_parents = 1,
772 .flags = CLK_SET_RATE_PARENT,
773 },
774 };
775
776 static struct clk_regmap s4_vclk_div1 = {
777 .data = &(struct clk_regmap_gate_data){
778 .offset = CLKCTRL_VID_CLK_CTRL,
779 .bit_idx = 0,
780 },
781 .hw.init = &(struct clk_init_data) {
782 .name = "vclk_div1",
783 .ops = &clk_regmap_gate_ops,
784 .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
785 .num_parents = 1,
786 .flags = CLK_SET_RATE_PARENT,
787 },
788 };
789
790 static struct clk_regmap s4_vclk_div2_en = {
791 .data = &(struct clk_regmap_gate_data){
792 .offset = CLKCTRL_VID_CLK_CTRL,
793 .bit_idx = 1,
794 },
795 .hw.init = &(struct clk_init_data) {
796 .name = "vclk_div2_en",
797 .ops = &clk_regmap_gate_ops,
798 .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
799 .num_parents = 1,
800 .flags = CLK_SET_RATE_PARENT,
801 },
802 };
803
804 static struct clk_regmap s4_vclk_div4_en = {
805 .data = &(struct clk_regmap_gate_data){
806 .offset = CLKCTRL_VID_CLK_CTRL,
807 .bit_idx = 2,
808 },
809 .hw.init = &(struct clk_init_data) {
810 .name = "vclk_div4_en",
811 .ops = &clk_regmap_gate_ops,
812 .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
813 .num_parents = 1,
814 .flags = CLK_SET_RATE_PARENT,
815 },
816 };
817
818 static struct clk_regmap s4_vclk_div6_en = {
819 .data = &(struct clk_regmap_gate_data){
820 .offset = CLKCTRL_VID_CLK_CTRL,
821 .bit_idx = 3,
822 },
823 .hw.init = &(struct clk_init_data) {
824 .name = "vclk_div6_en",
825 .ops = &clk_regmap_gate_ops,
826 .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
827 .num_parents = 1,
828 .flags = CLK_SET_RATE_PARENT,
829 },
830 };
831
832 static struct clk_regmap s4_vclk_div12_en = {
833 .data = &(struct clk_regmap_gate_data){
834 .offset = CLKCTRL_VID_CLK_CTRL,
835 .bit_idx = 4,
836 },
837 .hw.init = &(struct clk_init_data) {
838 .name = "vclk_div12_en",
839 .ops = &clk_regmap_gate_ops,
840 .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw },
841 .num_parents = 1,
842 .flags = CLK_SET_RATE_PARENT,
843 },
844 };
845
846 static struct clk_regmap s4_vclk2_div1 = {
847 .data = &(struct clk_regmap_gate_data){
848 .offset = CLKCTRL_VIID_CLK_CTRL,
849 .bit_idx = 0,
850 },
851 .hw.init = &(struct clk_init_data) {
852 .name = "vclk2_div1",
853 .ops = &clk_regmap_gate_ops,
854 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
855 .num_parents = 1,
856 .flags = CLK_SET_RATE_PARENT,
857 },
858 };
859
860 static struct clk_regmap s4_vclk2_div2_en = {
861 .data = &(struct clk_regmap_gate_data){
862 .offset = CLKCTRL_VIID_CLK_CTRL,
863 .bit_idx = 1,
864 },
865 .hw.init = &(struct clk_init_data) {
866 .name = "vclk2_div2_en",
867 .ops = &clk_regmap_gate_ops,
868 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
869 .num_parents = 1,
870 .flags = CLK_SET_RATE_PARENT,
871 },
872 };
873
874 static struct clk_regmap s4_vclk2_div4_en = {
875 .data = &(struct clk_regmap_gate_data){
876 .offset = CLKCTRL_VIID_CLK_CTRL,
877 .bit_idx = 2,
878 },
879 .hw.init = &(struct clk_init_data) {
880 .name = "vclk2_div4_en",
881 .ops = &clk_regmap_gate_ops,
882 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
883 .num_parents = 1,
884 .flags = CLK_SET_RATE_PARENT,
885 },
886 };
887
888 static struct clk_regmap s4_vclk2_div6_en = {
889 .data = &(struct clk_regmap_gate_data){
890 .offset = CLKCTRL_VIID_CLK_CTRL,
891 .bit_idx = 3,
892 },
893 .hw.init = &(struct clk_init_data) {
894 .name = "vclk2_div6_en",
895 .ops = &clk_regmap_gate_ops,
896 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
897 .num_parents = 1,
898 .flags = CLK_SET_RATE_PARENT,
899 },
900 };
901
902 static struct clk_regmap s4_vclk2_div12_en = {
903 .data = &(struct clk_regmap_gate_data){
904 .offset = CLKCTRL_VIID_CLK_CTRL,
905 .bit_idx = 4,
906 },
907 .hw.init = &(struct clk_init_data) {
908 .name = "vclk2_div12_en",
909 .ops = &clk_regmap_gate_ops,
910 .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw },
911 .num_parents = 1,
912 .flags = CLK_SET_RATE_PARENT,
913 },
914 };
915
916 static struct clk_fixed_factor s4_vclk_div2 = {
917 .mult = 1,
918 .div = 2,
919 .hw.init = &(struct clk_init_data){
920 .name = "vclk_div2",
921 .ops = &clk_fixed_factor_ops,
922 .parent_hws = (const struct clk_hw *[]) {
923 &s4_vclk_div2_en.hw
924 },
925 .num_parents = 1,
926 .flags = CLK_SET_RATE_PARENT,
927 },
928 };
929
930 static struct clk_fixed_factor s4_vclk_div4 = {
931 .mult = 1,
932 .div = 4,
933 .hw.init = &(struct clk_init_data){
934 .name = "vclk_div4",
935 .ops = &clk_fixed_factor_ops,
936 .parent_hws = (const struct clk_hw *[]) {
937 &s4_vclk_div4_en.hw
938 },
939 .num_parents = 1,
940 .flags = CLK_SET_RATE_PARENT,
941 },
942 };
943
944 static struct clk_fixed_factor s4_vclk_div6 = {
945 .mult = 1,
946 .div = 6,
947 .hw.init = &(struct clk_init_data){
948 .name = "vclk_div6",
949 .ops = &clk_fixed_factor_ops,
950 .parent_hws = (const struct clk_hw *[]) {
951 &s4_vclk_div6_en.hw
952 },
953 .num_parents = 1,
954 .flags = CLK_SET_RATE_PARENT,
955 },
956 };
957
958 static struct clk_fixed_factor s4_vclk_div12 = {
959 .mult = 1,
960 .div = 12,
961 .hw.init = &(struct clk_init_data){
962 .name = "vclk_div12",
963 .ops = &clk_fixed_factor_ops,
964 .parent_hws = (const struct clk_hw *[]) {
965 &s4_vclk_div12_en.hw
966 },
967 .num_parents = 1,
968 .flags = CLK_SET_RATE_PARENT,
969 },
970 };
971
972 static struct clk_fixed_factor s4_vclk2_div2 = {
973 .mult = 1,
974 .div = 2,
975 .hw.init = &(struct clk_init_data){
976 .name = "vclk2_div2",
977 .ops = &clk_fixed_factor_ops,
978 .parent_hws = (const struct clk_hw *[]) {
979 &s4_vclk2_div2_en.hw
980 },
981 .num_parents = 1,
982 .flags = CLK_SET_RATE_PARENT,
983 },
984 };
985
986 static struct clk_fixed_factor s4_vclk2_div4 = {
987 .mult = 1,
988 .div = 4,
989 .hw.init = &(struct clk_init_data){
990 .name = "vclk2_div4",
991 .ops = &clk_fixed_factor_ops,
992 .parent_hws = (const struct clk_hw *[]) {
993 &s4_vclk2_div4_en.hw
994 },
995 .num_parents = 1,
996 .flags = CLK_SET_RATE_PARENT,
997 },
998 };
999
1000 static struct clk_fixed_factor s4_vclk2_div6 = {
1001 .mult = 1,
1002 .div = 6,
1003 .hw.init = &(struct clk_init_data){
1004 .name = "vclk2_div6",
1005 .ops = &clk_fixed_factor_ops,
1006 .parent_hws = (const struct clk_hw *[]) {
1007 &s4_vclk2_div6_en.hw
1008 },
1009 .num_parents = 1,
1010 .flags = CLK_SET_RATE_PARENT,
1011 },
1012 };
1013
1014 static struct clk_fixed_factor s4_vclk2_div12 = {
1015 .mult = 1,
1016 .div = 12,
1017 .hw.init = &(struct clk_init_data){
1018 .name = "vclk2_div12",
1019 .ops = &clk_fixed_factor_ops,
1020 .parent_hws = (const struct clk_hw *[]) {
1021 &s4_vclk2_div12_en.hw
1022 },
1023 .num_parents = 1,
1024 .flags = CLK_SET_RATE_PARENT,
1025 },
1026 };
1027
1028 /* The 5,6,7 indexes corresponds to no real clock, so there are not used. */
1029 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
1030 static const struct clk_hw *s4_cts_parent_hws[] = {
1031 &s4_vclk_div1.hw,
1032 &s4_vclk_div2.hw,
1033 &s4_vclk_div4.hw,
1034 &s4_vclk_div6.hw,
1035 &s4_vclk_div12.hw,
1036 &s4_vclk2_div1.hw,
1037 &s4_vclk2_div2.hw,
1038 &s4_vclk2_div4.hw,
1039 &s4_vclk2_div6.hw,
1040 &s4_vclk2_div12.hw
1041 };
1042
1043 static struct clk_regmap s4_cts_enci_sel = {
1044 .data = &(struct clk_regmap_mux_data){
1045 .offset = CLKCTRL_VID_CLK_DIV,
1046 .mask = 0xf,
1047 .shift = 28,
1048 .table = mux_table_cts_sel,
1049 },
1050 .hw.init = &(struct clk_init_data){
1051 .name = "cts_enci_sel",
1052 .ops = &clk_regmap_mux_ops,
1053 .parent_hws = s4_cts_parent_hws,
1054 .num_parents = ARRAY_SIZE(s4_cts_parent_hws),
1055 .flags = CLK_SET_RATE_PARENT,
1056 },
1057 };
1058
1059 static struct clk_regmap s4_cts_encp_sel = {
1060 .data = &(struct clk_regmap_mux_data){
1061 .offset = CLKCTRL_VID_CLK_DIV,
1062 .mask = 0xf,
1063 .shift = 20,
1064 .table = mux_table_cts_sel,
1065 },
1066 .hw.init = &(struct clk_init_data){
1067 .name = "cts_encp_sel",
1068 .ops = &clk_regmap_mux_ops,
1069 .parent_hws = s4_cts_parent_hws,
1070 .num_parents = ARRAY_SIZE(s4_cts_parent_hws),
1071 .flags = CLK_SET_RATE_PARENT,
1072 },
1073 };
1074
1075 static struct clk_regmap s4_cts_vdac_sel = {
1076 .data = &(struct clk_regmap_mux_data){
1077 .offset = CLKCTRL_VIID_CLK_DIV,
1078 .mask = 0xf,
1079 .shift = 28,
1080 .table = mux_table_cts_sel,
1081 },
1082 .hw.init = &(struct clk_init_data){
1083 .name = "cts_vdac_sel",
1084 .ops = &clk_regmap_mux_ops,
1085 .parent_hws = s4_cts_parent_hws,
1086 .num_parents = ARRAY_SIZE(s4_cts_parent_hws),
1087 .flags = CLK_SET_RATE_PARENT,
1088 },
1089 };
1090
1091 /* The 5,6,7 indexes corresponds to no real clock, so there are not used. */
1092 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
1093 static const struct clk_hw *s4_cts_hdmi_tx_parent_hws[] = {
1094 &s4_vclk_div1.hw,
1095 &s4_vclk_div2.hw,
1096 &s4_vclk_div4.hw,
1097 &s4_vclk_div6.hw,
1098 &s4_vclk_div12.hw,
1099 &s4_vclk2_div1.hw,
1100 &s4_vclk2_div2.hw,
1101 &s4_vclk2_div4.hw,
1102 &s4_vclk2_div6.hw,
1103 &s4_vclk2_div12.hw
1104 };
1105
1106 static struct clk_regmap s4_hdmi_tx_sel = {
1107 .data = &(struct clk_regmap_mux_data){
1108 .offset = CLKCTRL_HDMI_CLK_CTRL,
1109 .mask = 0xf,
1110 .shift = 16,
1111 .table = mux_table_hdmi_tx_sel,
1112 },
1113 .hw.init = &(struct clk_init_data){
1114 .name = "hdmi_tx_sel",
1115 .ops = &clk_regmap_mux_ops,
1116 .parent_hws = s4_cts_hdmi_tx_parent_hws,
1117 .num_parents = ARRAY_SIZE(s4_cts_hdmi_tx_parent_hws),
1118 .flags = CLK_SET_RATE_PARENT,
1119 },
1120 };
1121
1122 static struct clk_regmap s4_cts_enci = {
1123 .data = &(struct clk_regmap_gate_data){
1124 .offset = CLKCTRL_VID_CLK_CTRL2,
1125 .bit_idx = 0,
1126 },
1127 .hw.init = &(struct clk_init_data) {
1128 .name = "cts_enci",
1129 .ops = &clk_regmap_gate_ops,
1130 .parent_hws = (const struct clk_hw *[]) {
1131 &s4_cts_enci_sel.hw
1132 },
1133 .num_parents = 1,
1134 .flags = CLK_SET_RATE_PARENT,
1135 },
1136 };
1137
1138 static struct clk_regmap s4_cts_encp = {
1139 .data = &(struct clk_regmap_gate_data){
1140 .offset = CLKCTRL_VID_CLK_CTRL2,
1141 .bit_idx = 2,
1142 },
1143 .hw.init = &(struct clk_init_data) {
1144 .name = "cts_encp",
1145 .ops = &clk_regmap_gate_ops,
1146 .parent_hws = (const struct clk_hw *[]) {
1147 &s4_cts_encp_sel.hw
1148 },
1149 .num_parents = 1,
1150 .flags = CLK_SET_RATE_PARENT,
1151 },
1152 };
1153
1154 static struct clk_regmap s4_cts_vdac = {
1155 .data = &(struct clk_regmap_gate_data){
1156 .offset = CLKCTRL_VID_CLK_CTRL2,
1157 .bit_idx = 4,
1158 },
1159 .hw.init = &(struct clk_init_data) {
1160 .name = "cts_vdac",
1161 .ops = &clk_regmap_gate_ops,
1162 .parent_hws = (const struct clk_hw *[]) {
1163 &s4_cts_vdac_sel.hw
1164 },
1165 .num_parents = 1,
1166 .flags = CLK_SET_RATE_PARENT,
1167 },
1168 };
1169
1170 static struct clk_regmap s4_hdmi_tx = {
1171 .data = &(struct clk_regmap_gate_data){
1172 .offset = CLKCTRL_VID_CLK_CTRL2,
1173 .bit_idx = 5,
1174 },
1175 .hw.init = &(struct clk_init_data) {
1176 .name = "hdmi_tx",
1177 .ops = &clk_regmap_gate_ops,
1178 .parent_hws = (const struct clk_hw *[]) {
1179 &s4_hdmi_tx_sel.hw
1180 },
1181 .num_parents = 1,
1182 .flags = CLK_SET_RATE_PARENT,
1183 },
1184 };
1185
1186 /* HDMI Clocks */
1187 static const struct clk_parent_data s4_hdmi_parent_data[] = {
1188 { .fw_name = "xtal", },
1189 { .fw_name = "fclk_div4", },
1190 { .fw_name = "fclk_div3", },
1191 { .fw_name = "fclk_div5", }
1192 };
1193
1194 static struct clk_regmap s4_hdmi_sel = {
1195 .data = &(struct clk_regmap_mux_data){
1196 .offset = CLKCTRL_HDMI_CLK_CTRL,
1197 .mask = 0x3,
1198 .shift = 9,
1199 .flags = CLK_MUX_ROUND_CLOSEST,
1200 },
1201 .hw.init = &(struct clk_init_data){
1202 .name = "hdmi_sel",
1203 .ops = &clk_regmap_mux_ops,
1204 .parent_data = s4_hdmi_parent_data,
1205 .num_parents = ARRAY_SIZE(s4_hdmi_parent_data),
1206 .flags = CLK_SET_RATE_PARENT,
1207 },
1208 };
1209
1210 static struct clk_regmap s4_hdmi_div = {
1211 .data = &(struct clk_regmap_div_data){
1212 .offset = CLKCTRL_HDMI_CLK_CTRL,
1213 .shift = 0,
1214 .width = 7,
1215 },
1216 .hw.init = &(struct clk_init_data){
1217 .name = "hdmi_div",
1218 .ops = &clk_regmap_divider_ops,
1219 .parent_hws = (const struct clk_hw *[]) { &s4_hdmi_sel.hw },
1220 .num_parents = 1,
1221 .flags = CLK_SET_RATE_PARENT,
1222 },
1223 };
1224
1225 static struct clk_regmap s4_hdmi = {
1226 .data = &(struct clk_regmap_gate_data){
1227 .offset = CLKCTRL_HDMI_CLK_CTRL,
1228 .bit_idx = 8,
1229 },
1230 .hw.init = &(struct clk_init_data) {
1231 .name = "hdmi",
1232 .ops = &clk_regmap_gate_ops,
1233 .parent_hws = (const struct clk_hw *[]) { &s4_hdmi_div.hw },
1234 .num_parents = 1,
1235 .flags = CLK_SET_RATE_PARENT,
1236 },
1237 };
1238
1239 static struct clk_regmap s4_ts_clk_div = {
1240 .data = &(struct clk_regmap_div_data){
1241 .offset = CLKCTRL_TS_CLK_CTRL,
1242 .shift = 0,
1243 .width = 8,
1244 },
1245 .hw.init = &(struct clk_init_data){
1246 .name = "ts_clk_div",
1247 .ops = &clk_regmap_divider_ops,
1248 .parent_data = &(const struct clk_parent_data) {
1249 .fw_name = "xtal",
1250 },
1251 .num_parents = 1,
1252 .flags = CLK_SET_RATE_PARENT,
1253 },
1254 };
1255
1256 static struct clk_regmap s4_ts_clk_gate = {
1257 .data = &(struct clk_regmap_gate_data){
1258 .offset = CLKCTRL_TS_CLK_CTRL,
1259 .bit_idx = 8,
1260 },
1261 .hw.init = &(struct clk_init_data){
1262 .name = "ts_clk",
1263 .ops = &clk_regmap_gate_ops,
1264 .parent_hws = (const struct clk_hw *[]) {
1265 &s4_ts_clk_div.hw
1266 },
1267 .num_parents = 1,
1268 .flags = CLK_SET_RATE_PARENT,
1269 },
1270 };
1271
1272 /*
1273 * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
1274 * muxed by a glitch-free switch. The CCF can manage this glitch-free
1275 * mux because it does top-to-bottom updates the each clock tree and
1276 * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
1277 */
1278 static const struct clk_parent_data s4_mali_0_1_parent_data[] = {
1279 { .fw_name = "xtal", },
1280 { .fw_name = "gp0_pll", },
1281 { .fw_name = "hifi_pll", },
1282 { .fw_name = "fclk_div2p5", },
1283 { .fw_name = "fclk_div3", },
1284 { .fw_name = "fclk_div4", },
1285 { .fw_name = "fclk_div5", },
1286 { .fw_name = "fclk_div7", }
1287 };
1288
1289 static struct clk_regmap s4_mali_0_sel = {
1290 .data = &(struct clk_regmap_mux_data){
1291 .offset = CLKCTRL_MALI_CLK_CTRL,
1292 .mask = 0x7,
1293 .shift = 9,
1294 },
1295 .hw.init = &(struct clk_init_data){
1296 .name = "mali_0_sel",
1297 .ops = &clk_regmap_mux_ops,
1298 .parent_data = s4_mali_0_1_parent_data,
1299 .num_parents = ARRAY_SIZE(s4_mali_0_1_parent_data),
1300 /*
1301 * Don't request the parent to change the rate because
1302 * all GPU frequencies can be derived from the fclk_*
1303 * clocks and one special GP0_PLL setting. This is
1304 * important because we need the HIFI PLL clock for audio.
1305 */
1306 .flags = 0,
1307 },
1308 };
1309
1310 static struct clk_regmap s4_mali_0_div = {
1311 .data = &(struct clk_regmap_div_data){
1312 .offset = CLKCTRL_MALI_CLK_CTRL,
1313 .shift = 0,
1314 .width = 7,
1315 },
1316 .hw.init = &(struct clk_init_data){
1317 .name = "mali_0_div",
1318 .ops = &clk_regmap_divider_ops,
1319 .parent_hws = (const struct clk_hw *[]) {
1320 &s4_mali_0_sel.hw
1321 },
1322 .num_parents = 1,
1323 .flags = CLK_SET_RATE_PARENT,
1324 },
1325 };
1326
1327 static struct clk_regmap s4_mali_0 = {
1328 .data = &(struct clk_regmap_gate_data){
1329 .offset = CLKCTRL_MALI_CLK_CTRL,
1330 .bit_idx = 8,
1331 },
1332 .hw.init = &(struct clk_init_data){
1333 .name = "mali_0",
1334 .ops = &clk_regmap_gate_ops,
1335 .parent_hws = (const struct clk_hw *[]) {
1336 &s4_mali_0_div.hw
1337 },
1338 .num_parents = 1,
1339 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
1340 },
1341 };
1342
1343 static struct clk_regmap s4_mali_1_sel = {
1344 .data = &(struct clk_regmap_mux_data){
1345 .offset = CLKCTRL_MALI_CLK_CTRL,
1346 .mask = 0x7,
1347 .shift = 25,
1348 },
1349 .hw.init = &(struct clk_init_data){
1350 .name = "mali_1_sel",
1351 .ops = &clk_regmap_mux_ops,
1352 .parent_data = s4_mali_0_1_parent_data,
1353 .num_parents = ARRAY_SIZE(s4_mali_0_1_parent_data),
1354 .flags = 0,
1355 },
1356 };
1357
1358 static struct clk_regmap s4_mali_1_div = {
1359 .data = &(struct clk_regmap_div_data){
1360 .offset = CLKCTRL_MALI_CLK_CTRL,
1361 .shift = 16,
1362 .width = 7,
1363 },
1364 .hw.init = &(struct clk_init_data){
1365 .name = "mali_1_div",
1366 .ops = &clk_regmap_divider_ops,
1367 .parent_hws = (const struct clk_hw *[]) {
1368 &s4_mali_1_sel.hw
1369 },
1370 .num_parents = 1,
1371 .flags = CLK_SET_RATE_PARENT,
1372 },
1373 };
1374
1375 static struct clk_regmap s4_mali_1 = {
1376 .data = &(struct clk_regmap_gate_data){
1377 .offset = CLKCTRL_MALI_CLK_CTRL,
1378 .bit_idx = 24,
1379 },
1380 .hw.init = &(struct clk_init_data){
1381 .name = "mali_1",
1382 .ops = &clk_regmap_gate_ops,
1383 .parent_hws = (const struct clk_hw *[]) {
1384 &s4_mali_1_div.hw
1385 },
1386 .num_parents = 1,
1387 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
1388 },
1389 };
1390
1391 static const struct clk_hw *s4_mali_parent_hws[] = {
1392 &s4_mali_0.hw,
1393 &s4_mali_1.hw
1394 };
1395
1396 static struct clk_regmap s4_mali_mux = {
1397 .data = &(struct clk_regmap_mux_data){
1398 .offset = CLKCTRL_MALI_CLK_CTRL,
1399 .mask = 1,
1400 .shift = 31,
1401 },
1402 .hw.init = &(struct clk_init_data){
1403 .name = "mali",
1404 .ops = &clk_regmap_mux_ops,
1405 .parent_hws = s4_mali_parent_hws,
1406 .num_parents = 2,
1407 .flags = CLK_SET_RATE_PARENT,
1408 },
1409 };
1410
1411 /* VDEC clocks */
1412 static const struct clk_parent_data s4_dec_parent_data[] = {
1413 { .fw_name = "fclk_div2p5", },
1414 { .fw_name = "fclk_div3", },
1415 { .fw_name = "fclk_div4", },
1416 { .fw_name = "fclk_div5", },
1417 { .fw_name = "fclk_div7", },
1418 { .fw_name = "hifi_pll", },
1419 { .fw_name = "gp0_pll", },
1420 { .fw_name = "xtal", }
1421 };
1422
1423 static struct clk_regmap s4_vdec_p0_mux = {
1424 .data = &(struct clk_regmap_mux_data){
1425 .offset = CLKCTRL_VDEC_CLK_CTRL,
1426 .mask = 0x7,
1427 .shift = 9,
1428 .flags = CLK_MUX_ROUND_CLOSEST,
1429 },
1430 .hw.init = &(struct clk_init_data) {
1431 .name = "vdec_p0_mux",
1432 .ops = &clk_regmap_mux_ops,
1433 .parent_data = s4_dec_parent_data,
1434 .num_parents = ARRAY_SIZE(s4_dec_parent_data),
1435 .flags = 0,
1436 },
1437 };
1438
1439 static struct clk_regmap s4_vdec_p0_div = {
1440 .data = &(struct clk_regmap_div_data){
1441 .offset = CLKCTRL_VDEC_CLK_CTRL,
1442 .shift = 0,
1443 .width = 7,
1444 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1445 },
1446 .hw.init = &(struct clk_init_data) {
1447 .name = "vdec_p0_div",
1448 .ops = &clk_regmap_divider_ops,
1449 .parent_hws = (const struct clk_hw *[]) {
1450 &s4_vdec_p0_mux.hw
1451 },
1452 .num_parents = 1,
1453 .flags = CLK_SET_RATE_PARENT,
1454 },
1455 };
1456
1457 static struct clk_regmap s4_vdec_p0 = {
1458 .data = &(struct clk_regmap_gate_data){
1459 .offset = CLKCTRL_VDEC_CLK_CTRL,
1460 .bit_idx = 8,
1461 },
1462 .hw.init = &(struct clk_init_data){
1463 .name = "vdec_p0",
1464 .ops = &clk_regmap_gate_ops,
1465 .parent_hws = (const struct clk_hw *[]) {
1466 &s4_vdec_p0_div.hw
1467 },
1468 .num_parents = 1,
1469 .flags = CLK_SET_RATE_PARENT,
1470 },
1471 };
1472
1473 static struct clk_regmap s4_vdec_p1_mux = {
1474 .data = &(struct clk_regmap_mux_data){
1475 .offset = CLKCTRL_VDEC3_CLK_CTRL,
1476 .mask = 0x7,
1477 .shift = 9,
1478 .flags = CLK_MUX_ROUND_CLOSEST,
1479 },
1480 .hw.init = &(struct clk_init_data) {
1481 .name = "vdec_p1_mux",
1482 .ops = &clk_regmap_mux_ops,
1483 .parent_data = s4_dec_parent_data,
1484 .num_parents = ARRAY_SIZE(s4_dec_parent_data),
1485 .flags = 0,
1486 },
1487 };
1488
1489 static struct clk_regmap s4_vdec_p1_div = {
1490 .data = &(struct clk_regmap_div_data){
1491 .offset = CLKCTRL_VDEC3_CLK_CTRL,
1492 .shift = 0,
1493 .width = 7,
1494 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1495 },
1496 .hw.init = &(struct clk_init_data) {
1497 .name = "vdec_p1_div",
1498 .ops = &clk_regmap_divider_ops,
1499 .parent_hws = (const struct clk_hw *[]) {
1500 &s4_vdec_p1_mux.hw
1501 },
1502 .num_parents = 1,
1503 .flags = CLK_SET_RATE_PARENT,
1504 },
1505 };
1506
1507 static struct clk_regmap s4_vdec_p1 = {
1508 .data = &(struct clk_regmap_gate_data){
1509 .offset = CLKCTRL_VDEC3_CLK_CTRL,
1510 .bit_idx = 8,
1511 },
1512 .hw.init = &(struct clk_init_data){
1513 .name = "vdec_p1",
1514 .ops = &clk_regmap_gate_ops,
1515 .parent_hws = (const struct clk_hw *[]) {
1516 &s4_vdec_p1_div.hw
1517 },
1518 .num_parents = 1,
1519 .flags = CLK_SET_RATE_PARENT,
1520 },
1521 };
1522
1523 static const struct clk_hw *s4_vdec_mux_parent_hws[] = {
1524 &s4_vdec_p0.hw,
1525 &s4_vdec_p1.hw
1526 };
1527
1528 static struct clk_regmap s4_vdec_mux = {
1529 .data = &(struct clk_regmap_mux_data){
1530 .offset = CLKCTRL_VDEC3_CLK_CTRL,
1531 .mask = 0x1,
1532 .shift = 15,
1533 },
1534 .hw.init = &(struct clk_init_data) {
1535 .name = "vdec_mux",
1536 .ops = &clk_regmap_mux_ops,
1537 .parent_hws = s4_vdec_mux_parent_hws,
1538 .num_parents = ARRAY_SIZE(s4_vdec_mux_parent_hws),
1539 .flags = CLK_SET_RATE_PARENT,
1540 },
1541 };
1542
1543 static struct clk_regmap s4_hevcf_p0_mux = {
1544 .data = &(struct clk_regmap_mux_data){
1545 .offset = CLKCTRL_VDEC2_CLK_CTRL,
1546 .mask = 0x7,
1547 .shift = 9,
1548 .flags = CLK_MUX_ROUND_CLOSEST,
1549 },
1550 .hw.init = &(struct clk_init_data) {
1551 .name = "hevcf_p0_mux",
1552 .ops = &clk_regmap_mux_ops,
1553 .parent_data = s4_dec_parent_data,
1554 .num_parents = ARRAY_SIZE(s4_dec_parent_data),
1555 .flags = 0,
1556 },
1557 };
1558
1559 static struct clk_regmap s4_hevcf_p0_div = {
1560 .data = &(struct clk_regmap_div_data){
1561 .offset = CLKCTRL_VDEC2_CLK_CTRL,
1562 .shift = 0,
1563 .width = 7,
1564 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1565 },
1566 .hw.init = &(struct clk_init_data) {
1567 .name = "hevcf_p0_div",
1568 .ops = &clk_regmap_divider_ops,
1569 .parent_hws = (const struct clk_hw *[]) {
1570 &s4_hevcf_p0_mux.hw
1571 },
1572 .num_parents = 1,
1573 .flags = CLK_SET_RATE_PARENT,
1574 },
1575 };
1576
1577 static struct clk_regmap s4_hevcf_p0 = {
1578 .data = &(struct clk_regmap_gate_data){
1579 .offset = CLKCTRL_VDEC2_CLK_CTRL,
1580 .bit_idx = 8,
1581 },
1582 .hw.init = &(struct clk_init_data){
1583 .name = "hevcf_p0_gate",
1584 .ops = &clk_regmap_gate_ops,
1585 .parent_hws = (const struct clk_hw *[]) {
1586 &s4_hevcf_p0_div.hw
1587 },
1588 .num_parents = 1,
1589 .flags = CLK_SET_RATE_PARENT,
1590 },
1591 };
1592
1593 static struct clk_regmap s4_hevcf_p1_mux = {
1594 .data = &(struct clk_regmap_mux_data){
1595 .offset = CLKCTRL_VDEC4_CLK_CTRL,
1596 .mask = 0x7,
1597 .shift = 9,
1598 .flags = CLK_MUX_ROUND_CLOSEST,
1599 },
1600 .hw.init = &(struct clk_init_data) {
1601 .name = "hevcf_p1_mux",
1602 .ops = &clk_regmap_mux_ops,
1603 .parent_data = s4_dec_parent_data,
1604 .num_parents = ARRAY_SIZE(s4_dec_parent_data),
1605 .flags = 0,
1606 },
1607 };
1608
1609 static struct clk_regmap s4_hevcf_p1_div = {
1610 .data = &(struct clk_regmap_div_data){
1611 .offset = CLKCTRL_VDEC4_CLK_CTRL,
1612 .shift = 0,
1613 .width = 7,
1614 .flags = CLK_DIVIDER_ROUND_CLOSEST,
1615 },
1616 .hw.init = &(struct clk_init_data) {
1617 .name = "hevcf_p1_div",
1618 .ops = &clk_regmap_divider_ops,
1619 .parent_hws = (const struct clk_hw *[]) {
1620 &s4_hevcf_p1_mux.hw
1621 },
1622 .num_parents = 1,
1623 .flags = CLK_SET_RATE_PARENT,
1624 },
1625 };
1626
1627 static struct clk_regmap s4_hevcf_p1 = {
1628 .data = &(struct clk_regmap_gate_data){
1629 .offset = CLKCTRL_VDEC4_CLK_CTRL,
1630 .bit_idx = 8,
1631 },
1632 .hw.init = &(struct clk_init_data){
1633 .name = "hevcf_p1",
1634 .ops = &clk_regmap_gate_ops,
1635 .parent_hws = (const struct clk_hw *[]) {
1636 &s4_hevcf_p1_div.hw
1637 },
1638 .num_parents = 1,
1639 .flags = CLK_SET_RATE_PARENT,
1640 },
1641 };
1642
1643 static const struct clk_hw *s4_hevcf_mux_parent_hws[] = {
1644 &s4_hevcf_p0.hw,
1645 &s4_hevcf_p1.hw
1646 };
1647
1648 static struct clk_regmap s4_hevcf_mux = {
1649 .data = &(struct clk_regmap_mux_data){
1650 .offset = CLKCTRL_VDEC4_CLK_CTRL,
1651 .mask = 0x1,
1652 .shift = 15,
1653 },
1654 .hw.init = &(struct clk_init_data) {
1655 .name = "hevcf",
1656 .ops = &clk_regmap_mux_ops,
1657 .parent_hws = s4_hevcf_mux_parent_hws,
1658 .num_parents = ARRAY_SIZE(s4_hevcf_mux_parent_hws),
1659 .flags = CLK_SET_RATE_PARENT,
1660 },
1661 };
1662
1663 /* VPU Clock */
1664 static const struct clk_parent_data s4_vpu_parent_data[] = {
1665 { .fw_name = "fclk_div3", },
1666 { .fw_name = "fclk_div4", },
1667 { .fw_name = "fclk_div5", },
1668 { .fw_name = "fclk_div7", },
1669 { .fw_name = "mpll1", },
1670 { .hw = &s4_vid_pll.hw },
1671 { .fw_name = "hifi_pll", },
1672 { .fw_name = "gp0_pll", },
1673 };
1674
1675 static struct clk_regmap s4_vpu_0_sel = {
1676 .data = &(struct clk_regmap_mux_data){
1677 .offset = CLKCTRL_VPU_CLK_CTRL,
1678 .mask = 0x7,
1679 .shift = 9,
1680 },
1681 .hw.init = &(struct clk_init_data){
1682 .name = "vpu_0_sel",
1683 .ops = &clk_regmap_mux_ops,
1684 .parent_data = s4_vpu_parent_data,
1685 .num_parents = ARRAY_SIZE(s4_vpu_parent_data),
1686 .flags = 0,
1687 },
1688 };
1689
1690 static struct clk_regmap s4_vpu_0_div = {
1691 .data = &(struct clk_regmap_div_data){
1692 .offset = CLKCTRL_VPU_CLK_CTRL,
1693 .shift = 0,
1694 .width = 7,
1695 },
1696 .hw.init = &(struct clk_init_data){
1697 .name = "vpu_0_div",
1698 .ops = &clk_regmap_divider_ops,
1699 .parent_hws = (const struct clk_hw *[]) { &s4_vpu_0_sel.hw },
1700 .num_parents = 1,
1701 .flags = CLK_SET_RATE_PARENT,
1702 },
1703 };
1704
1705 static struct clk_regmap s4_vpu_0 = {
1706 .data = &(struct clk_regmap_gate_data){
1707 .offset = CLKCTRL_VPU_CLK_CTRL,
1708 .bit_idx = 8,
1709 },
1710 .hw.init = &(struct clk_init_data) {
1711 .name = "vpu_0",
1712 .ops = &clk_regmap_gate_ops,
1713 .parent_hws = (const struct clk_hw *[]) { &s4_vpu_0_div.hw },
1714 .num_parents = 1,
1715 .flags = CLK_SET_RATE_PARENT,
1716 },
1717 };
1718
1719 static struct clk_regmap s4_vpu_1_sel = {
1720 .data = &(struct clk_regmap_mux_data){
1721 .offset = CLKCTRL_VPU_CLK_CTRL,
1722 .mask = 0x7,
1723 .shift = 25,
1724 },
1725 .hw.init = &(struct clk_init_data){
1726 .name = "vpu_1_sel",
1727 .ops = &clk_regmap_mux_ops,
1728 .parent_data = s4_vpu_parent_data,
1729 .num_parents = ARRAY_SIZE(s4_vpu_parent_data),
1730 .flags = 0,
1731 },
1732 };
1733
1734 static struct clk_regmap s4_vpu_1_div = {
1735 .data = &(struct clk_regmap_div_data){
1736 .offset = CLKCTRL_VPU_CLK_CTRL,
1737 .shift = 16,
1738 .width = 7,
1739 },
1740 .hw.init = &(struct clk_init_data){
1741 .name = "vpu_1_div",
1742 .ops = &clk_regmap_divider_ops,
1743 .parent_hws = (const struct clk_hw *[]) { &s4_vpu_1_sel.hw },
1744 .num_parents = 1,
1745 .flags = CLK_SET_RATE_PARENT,
1746 },
1747 };
1748
1749 static struct clk_regmap s4_vpu_1 = {
1750 .data = &(struct clk_regmap_gate_data){
1751 .offset = CLKCTRL_VPU_CLK_CTRL,
1752 .bit_idx = 24,
1753 },
1754 .hw.init = &(struct clk_init_data) {
1755 .name = "vpu_1",
1756 .ops = &clk_regmap_gate_ops,
1757 .parent_hws = (const struct clk_hw *[]) { &s4_vpu_1_div.hw },
1758 .num_parents = 1,
1759 .flags = CLK_SET_RATE_PARENT,
1760 },
1761 };
1762
1763 static struct clk_regmap s4_vpu = {
1764 .data = &(struct clk_regmap_mux_data){
1765 .offset = CLKCTRL_VPU_CLK_CTRL,
1766 .mask = 1,
1767 .shift = 31,
1768 },
1769 .hw.init = &(struct clk_init_data){
1770 .name = "vpu",
1771 .ops = &clk_regmap_mux_ops,
1772 .parent_hws = (const struct clk_hw *[]) {
1773 &s4_vpu_0.hw,
1774 &s4_vpu_1.hw,
1775 },
1776 .num_parents = 2,
1777 .flags = CLK_SET_RATE_PARENT,
1778 },
1779 };
1780
1781 static const struct clk_parent_data vpu_clkb_tmp_parent_data[] = {
1782 { .hw = &s4_vpu.hw },
1783 { .fw_name = "fclk_div4", },
1784 { .fw_name = "fclk_div5", },
1785 { .fw_name = "fclk_div7", }
1786 };
1787
1788 static struct clk_regmap s4_vpu_clkb_tmp_mux = {
1789 .data = &(struct clk_regmap_mux_data){
1790 .offset = CLKCTRL_VPU_CLKB_CTRL,
1791 .mask = 0x3,
1792 .shift = 20,
1793 },
1794 .hw.init = &(struct clk_init_data) {
1795 .name = "vpu_clkb_tmp_mux",
1796 .ops = &clk_regmap_mux_ops,
1797 .parent_data = vpu_clkb_tmp_parent_data,
1798 .num_parents = ARRAY_SIZE(vpu_clkb_tmp_parent_data),
1799 .flags = CLK_SET_RATE_PARENT,
1800 },
1801 };
1802
1803 static struct clk_regmap s4_vpu_clkb_tmp_div = {
1804 .data = &(struct clk_regmap_div_data){
1805 .offset = CLKCTRL_VPU_CLKB_CTRL,
1806 .shift = 16,
1807 .width = 4,
1808 },
1809 .hw.init = &(struct clk_init_data) {
1810 .name = "vpu_clkb_tmp_div",
1811 .ops = &clk_regmap_divider_ops,
1812 .parent_hws = (const struct clk_hw *[]) {
1813 &s4_vpu_clkb_tmp_mux.hw
1814 },
1815 .num_parents = 1,
1816 .flags = CLK_SET_RATE_PARENT,
1817 },
1818 };
1819
1820 static struct clk_regmap s4_vpu_clkb_tmp = {
1821 .data = &(struct clk_regmap_gate_data){
1822 .offset = CLKCTRL_VPU_CLKB_CTRL,
1823 .bit_idx = 24,
1824 },
1825 .hw.init = &(struct clk_init_data){
1826 .name = "vpu_clkb_tmp",
1827 .ops = &clk_regmap_gate_ops,
1828 .parent_hws = (const struct clk_hw *[]) {
1829 &s4_vpu_clkb_tmp_div.hw
1830 },
1831 .num_parents = 1,
1832 .flags = CLK_SET_RATE_PARENT,
1833 },
1834 };
1835
1836 static struct clk_regmap s4_vpu_clkb_div = {
1837 .data = &(struct clk_regmap_div_data){
1838 .offset = CLKCTRL_VPU_CLKB_CTRL,
1839 .shift = 0,
1840 .width = 8,
1841 },
1842 .hw.init = &(struct clk_init_data) {
1843 .name = "vpu_clkb_div",
1844 .ops = &clk_regmap_divider_ops,
1845 .parent_hws = (const struct clk_hw *[]) {
1846 &s4_vpu_clkb_tmp.hw
1847 },
1848 .num_parents = 1,
1849 .flags = CLK_SET_RATE_PARENT,
1850 },
1851 };
1852
1853 static struct clk_regmap s4_vpu_clkb = {
1854 .data = &(struct clk_regmap_gate_data){
1855 .offset = CLKCTRL_VPU_CLKB_CTRL,
1856 .bit_idx = 8,
1857 },
1858 .hw.init = &(struct clk_init_data){
1859 .name = "vpu_clkb",
1860 .ops = &clk_regmap_gate_ops,
1861 .parent_hws = (const struct clk_hw *[]) {
1862 &s4_vpu_clkb_div.hw
1863 },
1864 .num_parents = 1,
1865 .flags = CLK_SET_RATE_PARENT,
1866 },
1867 };
1868
1869 static const struct clk_parent_data s4_vpu_clkc_parent_data[] = {
1870 { .fw_name = "fclk_div4", },
1871 { .fw_name = "fclk_div3", },
1872 { .fw_name = "fclk_div5", },
1873 { .fw_name = "fclk_div7", },
1874 { .fw_name = "mpll1", },
1875 { .hw = &s4_vid_pll.hw },
1876 { .fw_name = "mpll2", },
1877 { .fw_name = "gp0_pll", },
1878 };
1879
1880 static struct clk_regmap s4_vpu_clkc_p0_mux = {
1881 .data = &(struct clk_regmap_mux_data){
1882 .offset = CLKCTRL_VPU_CLKC_CTRL,
1883 .mask = 0x7,
1884 .shift = 9,
1885 },
1886 .hw.init = &(struct clk_init_data) {
1887 .name = "vpu_clkc_p0_mux",
1888 .ops = &clk_regmap_mux_ops,
1889 .parent_data = s4_vpu_clkc_parent_data,
1890 .num_parents = ARRAY_SIZE(s4_vpu_clkc_parent_data),
1891 .flags = 0,
1892 },
1893 };
1894
1895 static struct clk_regmap s4_vpu_clkc_p0_div = {
1896 .data = &(struct clk_regmap_div_data){
1897 .offset = CLKCTRL_VPU_CLKC_CTRL,
1898 .shift = 0,
1899 .width = 7,
1900 },
1901 .hw.init = &(struct clk_init_data) {
1902 .name = "vpu_clkc_p0_div",
1903 .ops = &clk_regmap_divider_ops,
1904 .parent_hws = (const struct clk_hw *[]) {
1905 &s4_vpu_clkc_p0_mux.hw
1906 },
1907 .num_parents = 1,
1908 .flags = CLK_SET_RATE_PARENT,
1909 },
1910 };
1911
1912 static struct clk_regmap s4_vpu_clkc_p0 = {
1913 .data = &(struct clk_regmap_gate_data){
1914 .offset = CLKCTRL_VPU_CLKC_CTRL,
1915 .bit_idx = 8,
1916 },
1917 .hw.init = &(struct clk_init_data){
1918 .name = "vpu_clkc_p0",
1919 .ops = &clk_regmap_gate_ops,
1920 .parent_hws = (const struct clk_hw *[]) {
1921 &s4_vpu_clkc_p0_div.hw
1922 },
1923 .num_parents = 1,
1924 .flags = CLK_SET_RATE_PARENT,
1925 },
1926 };
1927
1928 static struct clk_regmap s4_vpu_clkc_p1_mux = {
1929 .data = &(struct clk_regmap_mux_data){
1930 .offset = CLKCTRL_VPU_CLKC_CTRL,
1931 .mask = 0x7,
1932 .shift = 25,
1933 },
1934 .hw.init = &(struct clk_init_data) {
1935 .name = "vpu_clkc_p1_mux",
1936 .ops = &clk_regmap_mux_ops,
1937 .parent_data = s4_vpu_clkc_parent_data,
1938 .num_parents = ARRAY_SIZE(s4_vpu_clkc_parent_data),
1939 .flags = 0,
1940 },
1941 };
1942
1943 static struct clk_regmap s4_vpu_clkc_p1_div = {
1944 .data = &(struct clk_regmap_div_data){
1945 .offset = CLKCTRL_VPU_CLKC_CTRL,
1946 .shift = 16,
1947 .width = 7,
1948 },
1949 .hw.init = &(struct clk_init_data) {
1950 .name = "vpu_clkc_p1_div",
1951 .ops = &clk_regmap_divider_ops,
1952 .parent_hws = (const struct clk_hw *[]) {
1953 &s4_vpu_clkc_p1_mux.hw
1954 },
1955 .num_parents = 1,
1956 .flags = CLK_SET_RATE_PARENT,
1957 },
1958 };
1959
1960 static struct clk_regmap s4_vpu_clkc_p1 = {
1961 .data = &(struct clk_regmap_gate_data){
1962 .offset = CLKCTRL_VPU_CLKC_CTRL,
1963 .bit_idx = 24,
1964 },
1965 .hw.init = &(struct clk_init_data){
1966 .name = "vpu_clkc_p1",
1967 .ops = &clk_regmap_gate_ops,
1968 .parent_hws = (const struct clk_hw *[]) {
1969 &s4_vpu_clkc_p1_div.hw
1970 },
1971 .num_parents = 1,
1972 .flags = CLK_SET_RATE_PARENT,
1973 },
1974 };
1975
1976 static const struct clk_hw *s4_vpu_mux_parent_hws[] = {
1977 &s4_vpu_clkc_p0.hw,
1978 &s4_vpu_clkc_p1.hw
1979 };
1980
1981 static struct clk_regmap s4_vpu_clkc_mux = {
1982 .data = &(struct clk_regmap_mux_data){
1983 .offset = CLKCTRL_VPU_CLKC_CTRL,
1984 .mask = 0x1,
1985 .shift = 31,
1986 },
1987 .hw.init = &(struct clk_init_data) {
1988 .name = "vpu_clkc_mux",
1989 .ops = &clk_regmap_mux_ops,
1990 .parent_hws = s4_vpu_mux_parent_hws,
1991 .num_parents = ARRAY_SIZE(s4_vpu_mux_parent_hws),
1992 .flags = CLK_SET_RATE_PARENT,
1993 },
1994 };
1995
1996 /* VAPB Clock */
1997 static const struct clk_parent_data s4_vapb_parent_data[] = {
1998 { .fw_name = "fclk_div4", },
1999 { .fw_name = "fclk_div3", },
2000 { .fw_name = "fclk_div5", },
2001 { .fw_name = "fclk_div7", },
2002 { .fw_name = "mpll1", },
2003 { .hw = &s4_vid_pll.hw },
2004 { .fw_name = "mpll2", },
2005 { .fw_name = "fclk_div2p5", },
2006 };
2007
2008 static struct clk_regmap s4_vapb_0_sel = {
2009 .data = &(struct clk_regmap_mux_data){
2010 .offset = CLKCTRL_VAPBCLK_CTRL,
2011 .mask = 0x7,
2012 .shift = 9,
2013 },
2014 .hw.init = &(struct clk_init_data){
2015 .name = "vapb_0_sel",
2016 .ops = &clk_regmap_mux_ops,
2017 .parent_data = s4_vapb_parent_data,
2018 .num_parents = ARRAY_SIZE(s4_vapb_parent_data),
2019 .flags = 0,
2020 },
2021 };
2022
2023 static struct clk_regmap s4_vapb_0_div = {
2024 .data = &(struct clk_regmap_div_data){
2025 .offset = CLKCTRL_VAPBCLK_CTRL,
2026 .shift = 0,
2027 .width = 7,
2028 },
2029 .hw.init = &(struct clk_init_data){
2030 .name = "vapb_0_div",
2031 .ops = &clk_regmap_divider_ops,
2032 .parent_hws = (const struct clk_hw *[]) {
2033 &s4_vapb_0_sel.hw
2034 },
2035 .num_parents = 1,
2036 .flags = CLK_SET_RATE_PARENT,
2037 },
2038 };
2039
2040 static struct clk_regmap s4_vapb_0 = {
2041 .data = &(struct clk_regmap_gate_data){
2042 .offset = CLKCTRL_VAPBCLK_CTRL,
2043 .bit_idx = 8,
2044 },
2045 .hw.init = &(struct clk_init_data) {
2046 .name = "vapb_0",
2047 .ops = &clk_regmap_gate_ops,
2048 .parent_hws = (const struct clk_hw *[]) {
2049 &s4_vapb_0_div.hw
2050 },
2051 .num_parents = 1,
2052 .flags = CLK_SET_RATE_PARENT,
2053 },
2054 };
2055
2056 static struct clk_regmap s4_vapb_1_sel = {
2057 .data = &(struct clk_regmap_mux_data){
2058 .offset = CLKCTRL_VAPBCLK_CTRL,
2059 .mask = 0x7,
2060 .shift = 25,
2061 },
2062 .hw.init = &(struct clk_init_data){
2063 .name = "vapb_1_sel",
2064 .ops = &clk_regmap_mux_ops,
2065 .parent_data = s4_vapb_parent_data,
2066 .num_parents = ARRAY_SIZE(s4_vapb_parent_data),
2067 .flags = 0,
2068 },
2069 };
2070
2071 static struct clk_regmap s4_vapb_1_div = {
2072 .data = &(struct clk_regmap_div_data){
2073 .offset = CLKCTRL_VAPBCLK_CTRL,
2074 .shift = 16,
2075 .width = 7,
2076 },
2077 .hw.init = &(struct clk_init_data){
2078 .name = "vapb_1_div",
2079 .ops = &clk_regmap_divider_ops,
2080 .parent_hws = (const struct clk_hw *[]) {
2081 &s4_vapb_1_sel.hw
2082 },
2083 .num_parents = 1,
2084 .flags = CLK_SET_RATE_PARENT,
2085 },
2086 };
2087
2088 static struct clk_regmap s4_vapb_1 = {
2089 .data = &(struct clk_regmap_gate_data){
2090 .offset = CLKCTRL_VAPBCLK_CTRL,
2091 .bit_idx = 24,
2092 },
2093 .hw.init = &(struct clk_init_data) {
2094 .name = "vapb_1",
2095 .ops = &clk_regmap_gate_ops,
2096 .parent_hws = (const struct clk_hw *[]) {
2097 &s4_vapb_1_div.hw
2098 },
2099 .num_parents = 1,
2100 .flags = CLK_SET_RATE_PARENT,
2101 },
2102 };
2103
2104 static struct clk_regmap s4_vapb = {
2105 .data = &(struct clk_regmap_mux_data){
2106 .offset = CLKCTRL_VAPBCLK_CTRL,
2107 .mask = 1,
2108 .shift = 31,
2109 },
2110 .hw.init = &(struct clk_init_data){
2111 .name = "vapb_sel",
2112 .ops = &clk_regmap_mux_ops,
2113 .parent_hws = (const struct clk_hw *[]) {
2114 &s4_vapb_0.hw,
2115 &s4_vapb_1.hw
2116 },
2117 .num_parents = 2,
2118 .flags = CLK_SET_RATE_PARENT,
2119 },
2120 };
2121
2122 static struct clk_regmap s4_ge2d_gate = {
2123 .data = &(struct clk_regmap_gate_data){
2124 .offset = CLKCTRL_VAPBCLK_CTRL,
2125 .bit_idx = 30,
2126 },
2127 .hw.init = &(struct clk_init_data) {
2128 .name = "ge2d_clk",
2129 .ops = &clk_regmap_gate_ops,
2130 .parent_hws = (const struct clk_hw *[]) { &s4_vapb.hw },
2131 .num_parents = 1,
2132 .flags = CLK_SET_RATE_PARENT,
2133 },
2134 };
2135
2136 static const struct clk_parent_data s4_esmclk_parent_data[] = {
2137 { .fw_name = "fclk_div7", },
2138 { .fw_name = "fclk_div4", },
2139 { .fw_name = "fclk_div3", },
2140 { .fw_name = "fclk_div5", },
2141 };
2142
2143 static struct clk_regmap s4_hdcp22_esmclk_mux = {
2144 .data = &(struct clk_regmap_mux_data){
2145 .offset = CLKCTRL_HDCP22_CTRL,
2146 .mask = 0x3,
2147 .shift = 9,
2148 },
2149 .hw.init = &(struct clk_init_data) {
2150 .name = "hdcp22_esmclk_mux",
2151 .ops = &clk_regmap_mux_ops,
2152 .parent_data = s4_esmclk_parent_data,
2153 .num_parents = ARRAY_SIZE(s4_esmclk_parent_data),
2154 .flags = CLK_SET_RATE_PARENT,
2155 },
2156 };
2157
2158 static struct clk_regmap s4_hdcp22_esmclk_div = {
2159 .data = &(struct clk_regmap_div_data){
2160 .offset = CLKCTRL_HDCP22_CTRL,
2161 .shift = 0,
2162 .width = 7,
2163 },
2164 .hw.init = &(struct clk_init_data) {
2165 .name = "hdcp22_esmclk_div",
2166 .ops = &clk_regmap_divider_ops,
2167 .parent_hws = (const struct clk_hw *[]) {
2168 &s4_hdcp22_esmclk_mux.hw
2169 },
2170 .num_parents = 1,
2171 .flags = CLK_SET_RATE_PARENT,
2172 },
2173 };
2174
2175 static struct clk_regmap s4_hdcp22_esmclk_gate = {
2176 .data = &(struct clk_regmap_gate_data){
2177 .offset = CLKCTRL_HDCP22_CTRL,
2178 .bit_idx = 8,
2179 },
2180 .hw.init = &(struct clk_init_data){
2181 .name = "hdcp22_esmclk_gate",
2182 .ops = &clk_regmap_gate_ops,
2183 .parent_hws = (const struct clk_hw *[]) {
2184 &s4_hdcp22_esmclk_div.hw
2185 },
2186 .num_parents = 1,
2187 .flags = CLK_SET_RATE_PARENT,
2188 },
2189 };
2190
2191 static const struct clk_parent_data s4_skpclk_parent_data[] = {
2192 { .fw_name = "xtal", },
2193 { .fw_name = "fclk_div4", },
2194 { .fw_name = "fclk_div3", },
2195 { .fw_name = "fclk_div5", },
2196 };
2197
2198 static struct clk_regmap s4_hdcp22_skpclk_mux = {
2199 .data = &(struct clk_regmap_mux_data){
2200 .offset = CLKCTRL_HDCP22_CTRL,
2201 .mask = 0x3,
2202 .shift = 25,
2203 },
2204 .hw.init = &(struct clk_init_data) {
2205 .name = "hdcp22_skpclk_mux",
2206 .ops = &clk_regmap_mux_ops,
2207 .parent_data = s4_skpclk_parent_data,
2208 .num_parents = ARRAY_SIZE(s4_skpclk_parent_data),
2209 .flags = CLK_SET_RATE_PARENT,
2210 },
2211 };
2212
2213 static struct clk_regmap s4_hdcp22_skpclk_div = {
2214 .data = &(struct clk_regmap_div_data){
2215 .offset = CLKCTRL_HDCP22_CTRL,
2216 .shift = 16,
2217 .width = 7,
2218 },
2219 .hw.init = &(struct clk_init_data) {
2220 .name = "hdcp22_skpclk_div",
2221 .ops = &clk_regmap_divider_ops,
2222 .parent_hws = (const struct clk_hw *[]) {
2223 &s4_hdcp22_skpclk_mux.hw
2224 },
2225 .num_parents = 1,
2226 .flags = CLK_SET_RATE_PARENT,
2227 },
2228 };
2229
2230 static struct clk_regmap s4_hdcp22_skpclk_gate = {
2231 .data = &(struct clk_regmap_gate_data){
2232 .offset = CLKCTRL_HDCP22_CTRL,
2233 .bit_idx = 24,
2234 },
2235 .hw.init = &(struct clk_init_data){
2236 .name = "hdcp22_skpclk_gate",
2237 .ops = &clk_regmap_gate_ops,
2238 .parent_hws = (const struct clk_hw *[]) {
2239 &s4_hdcp22_skpclk_div.hw
2240 },
2241 .num_parents = 1,
2242 .flags = CLK_SET_RATE_PARENT,
2243 },
2244 };
2245
2246 static const struct clk_parent_data s4_vdin_parent_data[] = {
2247 { .fw_name = "xtal", },
2248 { .fw_name = "fclk_div4", },
2249 { .fw_name = "fclk_div3", },
2250 { .fw_name = "fclk_div5", },
2251 { .hw = &s4_vid_pll.hw }
2252 };
2253
2254 static struct clk_regmap s4_vdin_meas_mux = {
2255 .data = &(struct clk_regmap_mux_data){
2256 .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
2257 .mask = 0x7,
2258 .shift = 9,
2259 },
2260 .hw.init = &(struct clk_init_data) {
2261 .name = "vdin_meas_mux",
2262 .ops = &clk_regmap_mux_ops,
2263 .parent_data = s4_vdin_parent_data,
2264 .num_parents = ARRAY_SIZE(s4_vdin_parent_data),
2265 .flags = CLK_SET_RATE_PARENT,
2266 },
2267 };
2268
2269 static struct clk_regmap s4_vdin_meas_div = {
2270 .data = &(struct clk_regmap_div_data){
2271 .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
2272 .shift = 0,
2273 .width = 7,
2274 },
2275 .hw.init = &(struct clk_init_data) {
2276 .name = "vdin_meas_div",
2277 .ops = &clk_regmap_divider_ops,
2278 .parent_hws = (const struct clk_hw *[]) {
2279 &s4_vdin_meas_mux.hw
2280 },
2281 .num_parents = 1,
2282 .flags = CLK_SET_RATE_PARENT,
2283 },
2284 };
2285
2286 static struct clk_regmap s4_vdin_meas_gate = {
2287 .data = &(struct clk_regmap_gate_data){
2288 .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
2289 .bit_idx = 8,
2290 },
2291 .hw.init = &(struct clk_init_data){
2292 .name = "vdin_meas_gate",
2293 .ops = &clk_regmap_gate_ops,
2294 .parent_hws = (const struct clk_hw *[]) {
2295 &s4_vdin_meas_div.hw
2296 },
2297 .num_parents = 1,
2298 .flags = CLK_SET_RATE_PARENT,
2299 },
2300 };
2301
2302 /* EMMC/NAND clock */
2303 static const struct clk_parent_data s4_sd_emmc_clk0_parent_data[] = {
2304 { .fw_name = "xtal", },
2305 { .fw_name = "fclk_div2", },
2306 { .fw_name = "fclk_div3", },
2307 { .fw_name = "hifi_pll", },
2308 { .fw_name = "fclk_div2p5", },
2309 { .fw_name = "mpll2", },
2310 { .fw_name = "mpll3", },
2311 { .fw_name = "gp0_pll", },
2312 };
2313
2314 static struct clk_regmap s4_sd_emmc_c_clk0_sel = {
2315 .data = &(struct clk_regmap_mux_data){
2316 .offset = CLKCTRL_NAND_CLK_CTRL,
2317 .mask = 0x7,
2318 .shift = 9,
2319 },
2320 .hw.init = &(struct clk_init_data) {
2321 .name = "sd_emmc_c_clk0_sel",
2322 .ops = &clk_regmap_mux_ops,
2323 .parent_data = s4_sd_emmc_clk0_parent_data,
2324 .num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data),
2325 .flags = 0,
2326 },
2327 };
2328
2329 static struct clk_regmap s4_sd_emmc_c_clk0_div = {
2330 .data = &(struct clk_regmap_div_data){
2331 .offset = CLKCTRL_NAND_CLK_CTRL,
2332 .shift = 0,
2333 .width = 7,
2334 },
2335 .hw.init = &(struct clk_init_data) {
2336 .name = "sd_emmc_c_clk0_div",
2337 .ops = &clk_regmap_divider_ops,
2338 .parent_hws = (const struct clk_hw *[]) {
2339 &s4_sd_emmc_c_clk0_sel.hw
2340 },
2341 .num_parents = 1,
2342 .flags = CLK_SET_RATE_PARENT,
2343 },
2344 };
2345
2346 static struct clk_regmap s4_sd_emmc_c_clk0 = {
2347 .data = &(struct clk_regmap_gate_data){
2348 .offset = CLKCTRL_NAND_CLK_CTRL,
2349 .bit_idx = 7,
2350 },
2351 .hw.init = &(struct clk_init_data){
2352 .name = "sd_emmc_c_clk0",
2353 .ops = &clk_regmap_gate_ops,
2354 .parent_hws = (const struct clk_hw *[]) {
2355 &s4_sd_emmc_c_clk0_div.hw
2356 },
2357 .num_parents = 1,
2358 .flags = CLK_SET_RATE_PARENT,
2359 },
2360 };
2361
2362 static struct clk_regmap s4_sd_emmc_a_clk0_sel = {
2363 .data = &(struct clk_regmap_mux_data){
2364 .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
2365 .mask = 0x7,
2366 .shift = 9,
2367 },
2368 .hw.init = &(struct clk_init_data) {
2369 .name = "sd_emmc_a_clk0_sel",
2370 .ops = &clk_regmap_mux_ops,
2371 .parent_data = s4_sd_emmc_clk0_parent_data,
2372 .num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data),
2373 .flags = 0,
2374 },
2375 };
2376
2377 static struct clk_regmap s4_sd_emmc_a_clk0_div = {
2378 .data = &(struct clk_regmap_div_data){
2379 .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
2380 .shift = 0,
2381 .width = 7,
2382 },
2383 .hw.init = &(struct clk_init_data) {
2384 .name = "sd_emmc_a_clk0_div",
2385 .ops = &clk_regmap_divider_ops,
2386 .parent_hws = (const struct clk_hw *[]) {
2387 &s4_sd_emmc_a_clk0_sel.hw
2388 },
2389 .num_parents = 1,
2390 .flags = CLK_SET_RATE_PARENT,
2391 },
2392 };
2393
2394 static struct clk_regmap s4_sd_emmc_a_clk0 = {
2395 .data = &(struct clk_regmap_gate_data){
2396 .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
2397 .bit_idx = 7,
2398 },
2399 .hw.init = &(struct clk_init_data){
2400 .name = "sd_emmc_a_clk0",
2401 .ops = &clk_regmap_gate_ops,
2402 .parent_hws = (const struct clk_hw *[]) {
2403 &s4_sd_emmc_a_clk0_div.hw
2404 },
2405 .num_parents = 1,
2406 .flags = CLK_SET_RATE_PARENT,
2407 },
2408 };
2409
2410 static struct clk_regmap s4_sd_emmc_b_clk0_sel = {
2411 .data = &(struct clk_regmap_mux_data){
2412 .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
2413 .mask = 0x7,
2414 .shift = 25,
2415 },
2416 .hw.init = &(struct clk_init_data) {
2417 .name = "sd_emmc_b_clk0_sel",
2418 .ops = &clk_regmap_mux_ops,
2419 .parent_data = s4_sd_emmc_clk0_parent_data,
2420 .num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data),
2421 .flags = 0,
2422 },
2423 };
2424
2425 static struct clk_regmap s4_sd_emmc_b_clk0_div = {
2426 .data = &(struct clk_regmap_div_data){
2427 .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
2428 .shift = 16,
2429 .width = 7,
2430 },
2431 .hw.init = &(struct clk_init_data) {
2432 .name = "sd_emmc_b_clk0_div",
2433 .ops = &clk_regmap_divider_ops,
2434 .parent_hws = (const struct clk_hw *[]) {
2435 &s4_sd_emmc_b_clk0_sel.hw
2436 },
2437 .num_parents = 1,
2438 .flags = CLK_SET_RATE_PARENT,
2439 },
2440 };
2441
2442 static struct clk_regmap s4_sd_emmc_b_clk0 = {
2443 .data = &(struct clk_regmap_gate_data){
2444 .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
2445 .bit_idx = 23,
2446 },
2447 .hw.init = &(struct clk_init_data){
2448 .name = "sd_emmc_b_clk0",
2449 .ops = &clk_regmap_gate_ops,
2450 .parent_hws = (const struct clk_hw *[]) {
2451 &s4_sd_emmc_b_clk0_div.hw
2452 },
2453 .num_parents = 1,
2454 .flags = CLK_SET_RATE_PARENT,
2455 },
2456 };
2457
2458 /* SPICC Clock */
2459 static const struct clk_parent_data s4_spicc_parent_data[] = {
2460 { .fw_name = "xtal", },
2461 { .hw = &s4_sys_clk.hw },
2462 { .fw_name = "fclk_div4", },
2463 { .fw_name = "fclk_div3", },
2464 { .fw_name = "fclk_div2", },
2465 { .fw_name = "fclk_div5", },
2466 { .fw_name = "fclk_div7", },
2467 };
2468
2469 static struct clk_regmap s4_spicc0_mux = {
2470 .data = &(struct clk_regmap_mux_data){
2471 .offset = CLKCTRL_SPICC_CLK_CTRL,
2472 .mask = 0x7,
2473 .shift = 7,
2474 },
2475 .hw.init = &(struct clk_init_data) {
2476 .name = "spicc0_mux",
2477 .ops = &clk_regmap_mux_ops,
2478 .parent_data = s4_spicc_parent_data,
2479 .num_parents = ARRAY_SIZE(s4_spicc_parent_data),
2480 .flags = CLK_SET_RATE_PARENT,
2481 },
2482 };
2483
2484 static struct clk_regmap s4_spicc0_div = {
2485 .data = &(struct clk_regmap_div_data){
2486 .offset = CLKCTRL_SPICC_CLK_CTRL,
2487 .shift = 0,
2488 .width = 6,
2489 },
2490 .hw.init = &(struct clk_init_data) {
2491 .name = "spicc0_div",
2492 .ops = &clk_regmap_divider_ops,
2493 .parent_hws = (const struct clk_hw *[]) {
2494 &s4_spicc0_mux.hw
2495 },
2496 .num_parents = 1,
2497 .flags = CLK_SET_RATE_PARENT,
2498 },
2499 };
2500
2501 static struct clk_regmap s4_spicc0_gate = {
2502 .data = &(struct clk_regmap_gate_data){
2503 .offset = CLKCTRL_SPICC_CLK_CTRL,
2504 .bit_idx = 6,
2505 },
2506 .hw.init = &(struct clk_init_data){
2507 .name = "spicc0",
2508 .ops = &clk_regmap_gate_ops,
2509 .parent_hws = (const struct clk_hw *[]) {
2510 &s4_spicc0_div.hw
2511 },
2512 .num_parents = 1,
2513 .flags = CLK_SET_RATE_PARENT,
2514 },
2515 };
2516
2517 /* PWM Clock */
2518 static const struct clk_parent_data s4_pwm_parent_data[] = {
2519 { .fw_name = "xtal", },
2520 { .hw = &s4_vid_pll.hw },
2521 { .fw_name = "fclk_div4", },
2522 { .fw_name = "fclk_div3", },
2523 };
2524
2525 static struct clk_regmap s4_pwm_a_mux = {
2526 .data = &(struct clk_regmap_mux_data) {
2527 .offset = CLKCTRL_PWM_CLK_AB_CTRL,
2528 .mask = 0x3,
2529 .shift = 9,
2530 },
2531 .hw.init = &(struct clk_init_data){
2532 .name = "pwm_a_mux",
2533 .ops = &clk_regmap_mux_ops,
2534 .parent_data = s4_pwm_parent_data,
2535 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2536 .flags = 0,
2537 },
2538 };
2539
2540 static struct clk_regmap s4_pwm_a_div = {
2541 .data = &(struct clk_regmap_div_data) {
2542 .offset = CLKCTRL_PWM_CLK_AB_CTRL,
2543 .shift = 0,
2544 .width = 8,
2545 },
2546 .hw.init = &(struct clk_init_data){
2547 .name = "pwm_a_div",
2548 .ops = &clk_regmap_divider_ops,
2549 .parent_hws = (const struct clk_hw *[]) {
2550 &s4_pwm_a_mux.hw
2551 },
2552 .num_parents = 1,
2553 .flags = CLK_SET_RATE_PARENT,
2554 },
2555 };
2556
2557 static struct clk_regmap s4_pwm_a_gate = {
2558 .data = &(struct clk_regmap_gate_data) {
2559 .offset = CLKCTRL_PWM_CLK_AB_CTRL,
2560 .bit_idx = 8,
2561 },
2562 .hw.init = &(struct clk_init_data){
2563 .name = "pwm_a_gate",
2564 .ops = &clk_regmap_gate_ops,
2565 .parent_hws = (const struct clk_hw *[]) {
2566 &s4_pwm_a_div.hw
2567 },
2568 .num_parents = 1,
2569 .flags = CLK_SET_RATE_PARENT,
2570 },
2571 };
2572
2573 static struct clk_regmap s4_pwm_b_mux = {
2574 .data = &(struct clk_regmap_mux_data) {
2575 .offset = CLKCTRL_PWM_CLK_AB_CTRL,
2576 .mask = 0x3,
2577 .shift = 25,
2578 },
2579 .hw.init = &(struct clk_init_data){
2580 .name = "pwm_b_mux",
2581 .ops = &clk_regmap_mux_ops,
2582 .parent_data = s4_pwm_parent_data,
2583 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2584 .flags = 0,
2585 },
2586 };
2587
2588 static struct clk_regmap s4_pwm_b_div = {
2589 .data = &(struct clk_regmap_div_data) {
2590 .offset = CLKCTRL_PWM_CLK_AB_CTRL,
2591 .shift = 16,
2592 .width = 8,
2593 },
2594 .hw.init = &(struct clk_init_data){
2595 .name = "pwm_b_div",
2596 .ops = &clk_regmap_divider_ops,
2597 .parent_hws = (const struct clk_hw *[]) {
2598 &s4_pwm_b_mux.hw
2599 },
2600 .num_parents = 1,
2601 .flags = CLK_SET_RATE_PARENT,
2602 },
2603 };
2604
2605 static struct clk_regmap s4_pwm_b_gate = {
2606 .data = &(struct clk_regmap_gate_data) {
2607 .offset = CLKCTRL_PWM_CLK_AB_CTRL,
2608 .bit_idx = 24,
2609 },
2610 .hw.init = &(struct clk_init_data){
2611 .name = "pwm_b_gate",
2612 .ops = &clk_regmap_gate_ops,
2613 .parent_hws = (const struct clk_hw *[]) {
2614 &s4_pwm_b_div.hw
2615 },
2616 .num_parents = 1,
2617 .flags = CLK_SET_RATE_PARENT,
2618 },
2619 };
2620
2621 static struct clk_regmap s4_pwm_c_mux = {
2622 .data = &(struct clk_regmap_mux_data) {
2623 .offset = CLKCTRL_PWM_CLK_CD_CTRL,
2624 .mask = 0x3,
2625 .shift = 9,
2626 },
2627 .hw.init = &(struct clk_init_data){
2628 .name = "pwm_c_mux",
2629 .ops = &clk_regmap_mux_ops,
2630 .parent_data = s4_pwm_parent_data,
2631 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2632 .flags = 0,
2633 },
2634 };
2635
2636 static struct clk_regmap s4_pwm_c_div = {
2637 .data = &(struct clk_regmap_div_data) {
2638 .offset = CLKCTRL_PWM_CLK_CD_CTRL,
2639 .shift = 0,
2640 .width = 8,
2641 },
2642 .hw.init = &(struct clk_init_data){
2643 .name = "pwm_c_div",
2644 .ops = &clk_regmap_divider_ops,
2645 .parent_hws = (const struct clk_hw *[]) {
2646 &s4_pwm_c_mux.hw
2647 },
2648 .num_parents = 1,
2649 },
2650 };
2651
2652 static struct clk_regmap s4_pwm_c_gate = {
2653 .data = &(struct clk_regmap_gate_data) {
2654 .offset = CLKCTRL_PWM_CLK_CD_CTRL,
2655 .bit_idx = 8,
2656 },
2657 .hw.init = &(struct clk_init_data){
2658 .name = "pwm_c_gate",
2659 .ops = &clk_regmap_gate_ops,
2660 .parent_hws = (const struct clk_hw *[]) {
2661 &s4_pwm_c_div.hw
2662 },
2663 .num_parents = 1,
2664 .flags = CLK_SET_RATE_PARENT,
2665 },
2666 };
2667
2668 static struct clk_regmap s4_pwm_d_mux = {
2669 .data = &(struct clk_regmap_mux_data) {
2670 .offset = CLKCTRL_PWM_CLK_CD_CTRL,
2671 .mask = 0x3,
2672 .shift = 25,
2673 },
2674 .hw.init = &(struct clk_init_data){
2675 .name = "pwm_d_mux",
2676 .ops = &clk_regmap_mux_ops,
2677 .parent_data = s4_pwm_parent_data,
2678 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2679 .flags = 0,
2680 },
2681 };
2682
2683 static struct clk_regmap s4_pwm_d_div = {
2684 .data = &(struct clk_regmap_div_data) {
2685 .offset = CLKCTRL_PWM_CLK_CD_CTRL,
2686 .shift = 16,
2687 .width = 8,
2688 },
2689 .hw.init = &(struct clk_init_data){
2690 .name = "pwm_d_div",
2691 .ops = &clk_regmap_divider_ops,
2692 .parent_hws = (const struct clk_hw *[]) {
2693 &s4_pwm_d_mux.hw
2694 },
2695 .num_parents = 1,
2696 .flags = CLK_SET_RATE_PARENT,
2697 },
2698 };
2699
2700 static struct clk_regmap s4_pwm_d_gate = {
2701 .data = &(struct clk_regmap_gate_data) {
2702 .offset = CLKCTRL_PWM_CLK_CD_CTRL,
2703 .bit_idx = 24,
2704 },
2705 .hw.init = &(struct clk_init_data){
2706 .name = "pwm_d_gate",
2707 .ops = &clk_regmap_gate_ops,
2708 .parent_hws = (const struct clk_hw *[]) {
2709 &s4_pwm_d_div.hw
2710 },
2711 .num_parents = 1,
2712 .flags = CLK_SET_RATE_PARENT,
2713 },
2714 };
2715
2716 static struct clk_regmap s4_pwm_e_mux = {
2717 .data = &(struct clk_regmap_mux_data) {
2718 .offset = CLKCTRL_PWM_CLK_EF_CTRL,
2719 .mask = 0x3,
2720 .shift = 9,
2721 },
2722 .hw.init = &(struct clk_init_data){
2723 .name = "pwm_e_mux",
2724 .ops = &clk_regmap_mux_ops,
2725 .parent_data = s4_pwm_parent_data,
2726 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2727 .flags = 0,
2728 },
2729 };
2730
2731 static struct clk_regmap s4_pwm_e_div = {
2732 .data = &(struct clk_regmap_div_data) {
2733 .offset = CLKCTRL_PWM_CLK_EF_CTRL,
2734 .shift = 0,
2735 .width = 8,
2736 },
2737 .hw.init = &(struct clk_init_data){
2738 .name = "pwm_e_div",
2739 .ops = &clk_regmap_divider_ops,
2740 .parent_hws = (const struct clk_hw *[]) {
2741 &s4_pwm_e_mux.hw
2742 },
2743 .num_parents = 1,
2744 .flags = CLK_SET_RATE_PARENT,
2745 },
2746 };
2747
2748 static struct clk_regmap s4_pwm_e_gate = {
2749 .data = &(struct clk_regmap_gate_data) {
2750 .offset = CLKCTRL_PWM_CLK_EF_CTRL,
2751 .bit_idx = 8,
2752 },
2753 .hw.init = &(struct clk_init_data){
2754 .name = "pwm_e_gate",
2755 .ops = &clk_regmap_gate_ops,
2756 .parent_hws = (const struct clk_hw *[]) {
2757 &s4_pwm_e_div.hw
2758 },
2759 .num_parents = 1,
2760 .flags = CLK_SET_RATE_PARENT,
2761 },
2762 };
2763
2764 static struct clk_regmap s4_pwm_f_mux = {
2765 .data = &(struct clk_regmap_mux_data) {
2766 .offset = CLKCTRL_PWM_CLK_EF_CTRL,
2767 .mask = 0x3,
2768 .shift = 25,
2769 },
2770 .hw.init = &(struct clk_init_data){
2771 .name = "pwm_f_mux",
2772 .ops = &clk_regmap_mux_ops,
2773 .parent_data = s4_pwm_parent_data,
2774 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2775 .flags = 0,
2776 },
2777 };
2778
2779 static struct clk_regmap s4_pwm_f_div = {
2780 .data = &(struct clk_regmap_div_data) {
2781 .offset = CLKCTRL_PWM_CLK_EF_CTRL,
2782 .shift = 16,
2783 .width = 8,
2784 },
2785 .hw.init = &(struct clk_init_data){
2786 .name = "pwm_f_div",
2787 .ops = &clk_regmap_divider_ops,
2788 .parent_hws = (const struct clk_hw *[]) {
2789 &s4_pwm_f_mux.hw
2790 },
2791 .num_parents = 1,
2792 .flags = CLK_SET_RATE_PARENT,
2793 },
2794 };
2795
2796 static struct clk_regmap s4_pwm_f_gate = {
2797 .data = &(struct clk_regmap_gate_data) {
2798 .offset = CLKCTRL_PWM_CLK_EF_CTRL,
2799 .bit_idx = 24,
2800 },
2801 .hw.init = &(struct clk_init_data){
2802 .name = "pwm_f_gate",
2803 .ops = &clk_regmap_gate_ops,
2804 .parent_hws = (const struct clk_hw *[]) {
2805 &s4_pwm_f_div.hw
2806 },
2807 .num_parents = 1,
2808 .flags = CLK_SET_RATE_PARENT,
2809 },
2810 };
2811
2812 static struct clk_regmap s4_pwm_g_mux = {
2813 .data = &(struct clk_regmap_mux_data) {
2814 .offset = CLKCTRL_PWM_CLK_GH_CTRL,
2815 .mask = 0x3,
2816 .shift = 9,
2817 },
2818 .hw.init = &(struct clk_init_data){
2819 .name = "pwm_g_mux",
2820 .ops = &clk_regmap_mux_ops,
2821 .parent_data = s4_pwm_parent_data,
2822 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2823 .flags = 0,
2824 },
2825 };
2826
2827 static struct clk_regmap s4_pwm_g_div = {
2828 .data = &(struct clk_regmap_div_data) {
2829 .offset = CLKCTRL_PWM_CLK_GH_CTRL,
2830 .shift = 0,
2831 .width = 8,
2832 },
2833 .hw.init = &(struct clk_init_data){
2834 .name = "pwm_g_div",
2835 .ops = &clk_regmap_divider_ops,
2836 .parent_hws = (const struct clk_hw *[]) {
2837 &s4_pwm_g_mux.hw
2838 },
2839 .num_parents = 1,
2840 .flags = CLK_SET_RATE_PARENT,
2841 },
2842 };
2843
2844 static struct clk_regmap s4_pwm_g_gate = {
2845 .data = &(struct clk_regmap_gate_data) {
2846 .offset = CLKCTRL_PWM_CLK_GH_CTRL,
2847 .bit_idx = 8,
2848 },
2849 .hw.init = &(struct clk_init_data){
2850 .name = "pwm_g_gate",
2851 .ops = &clk_regmap_gate_ops,
2852 .parent_hws = (const struct clk_hw *[]) {
2853 &s4_pwm_g_div.hw
2854 },
2855 .num_parents = 1,
2856 .flags = CLK_SET_RATE_PARENT,
2857 },
2858 };
2859
2860 static struct clk_regmap s4_pwm_h_mux = {
2861 .data = &(struct clk_regmap_mux_data) {
2862 .offset = CLKCTRL_PWM_CLK_GH_CTRL,
2863 .mask = 0x3,
2864 .shift = 25,
2865 },
2866 .hw.init = &(struct clk_init_data){
2867 .name = "pwm_h_mux",
2868 .ops = &clk_regmap_mux_ops,
2869 .parent_data = s4_pwm_parent_data,
2870 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2871 .flags = 0,
2872 },
2873 };
2874
2875 static struct clk_regmap s4_pwm_h_div = {
2876 .data = &(struct clk_regmap_div_data) {
2877 .offset = CLKCTRL_PWM_CLK_GH_CTRL,
2878 .shift = 16,
2879 .width = 8,
2880 },
2881 .hw.init = &(struct clk_init_data){
2882 .name = "pwm_h_div",
2883 .ops = &clk_regmap_divider_ops,
2884 .parent_hws = (const struct clk_hw *[]) {
2885 &s4_pwm_h_mux.hw
2886 },
2887 .num_parents = 1,
2888 .flags = CLK_SET_RATE_PARENT,
2889 },
2890 };
2891
2892 static struct clk_regmap s4_pwm_h_gate = {
2893 .data = &(struct clk_regmap_gate_data) {
2894 .offset = CLKCTRL_PWM_CLK_GH_CTRL,
2895 .bit_idx = 24,
2896 },
2897 .hw.init = &(struct clk_init_data){
2898 .name = "pwm_h_gate",
2899 .ops = &clk_regmap_gate_ops,
2900 .parent_hws = (const struct clk_hw *[]) {
2901 &s4_pwm_h_div.hw
2902 },
2903 .num_parents = 1,
2904 .flags = CLK_SET_RATE_PARENT,
2905 },
2906 };
2907
2908 static struct clk_regmap s4_pwm_i_mux = {
2909 .data = &(struct clk_regmap_mux_data) {
2910 .offset = CLKCTRL_PWM_CLK_IJ_CTRL,
2911 .mask = 0x3,
2912 .shift = 9,
2913 },
2914 .hw.init = &(struct clk_init_data){
2915 .name = "pwm_i_mux",
2916 .ops = &clk_regmap_mux_ops,
2917 .parent_data = s4_pwm_parent_data,
2918 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2919 .flags = 0,
2920 },
2921 };
2922
2923 static struct clk_regmap s4_pwm_i_div = {
2924 .data = &(struct clk_regmap_div_data) {
2925 .offset = CLKCTRL_PWM_CLK_IJ_CTRL,
2926 .shift = 0,
2927 .width = 8,
2928 },
2929 .hw.init = &(struct clk_init_data){
2930 .name = "pwm_i_div",
2931 .ops = &clk_regmap_divider_ops,
2932 .parent_hws = (const struct clk_hw *[]) {
2933 &s4_pwm_i_mux.hw
2934 },
2935 .num_parents = 1,
2936 .flags = CLK_SET_RATE_PARENT,
2937 },
2938 };
2939
2940 static struct clk_regmap s4_pwm_i_gate = {
2941 .data = &(struct clk_regmap_gate_data) {
2942 .offset = CLKCTRL_PWM_CLK_IJ_CTRL,
2943 .bit_idx = 8,
2944 },
2945 .hw.init = &(struct clk_init_data){
2946 .name = "pwm_i_gate",
2947 .ops = &clk_regmap_gate_ops,
2948 .parent_hws = (const struct clk_hw *[]) {
2949 &s4_pwm_i_div.hw
2950 },
2951 .num_parents = 1,
2952 .flags = CLK_SET_RATE_PARENT,
2953 },
2954 };
2955
2956 static struct clk_regmap s4_pwm_j_mux = {
2957 .data = &(struct clk_regmap_mux_data) {
2958 .offset = CLKCTRL_PWM_CLK_IJ_CTRL,
2959 .mask = 0x3,
2960 .shift = 25,
2961 },
2962 .hw.init = &(struct clk_init_data){
2963 .name = "pwm_j_mux",
2964 .ops = &clk_regmap_mux_ops,
2965 .parent_data = s4_pwm_parent_data,
2966 .num_parents = ARRAY_SIZE(s4_pwm_parent_data),
2967 .flags = 0,
2968 },
2969 };
2970
2971 static struct clk_regmap s4_pwm_j_div = {
2972 .data = &(struct clk_regmap_div_data) {
2973 .offset = CLKCTRL_PWM_CLK_IJ_CTRL,
2974 .shift = 16,
2975 .width = 8,
2976 },
2977 .hw.init = &(struct clk_init_data){
2978 .name = "pwm_j_div",
2979 .ops = &clk_regmap_divider_ops,
2980 .parent_hws = (const struct clk_hw *[]) {
2981 &s4_pwm_j_mux.hw
2982 },
2983 .num_parents = 1,
2984 .flags = CLK_SET_RATE_PARENT,
2985 },
2986 };
2987
2988 static struct clk_regmap s4_pwm_j_gate = {
2989 .data = &(struct clk_regmap_gate_data) {
2990 .offset = CLKCTRL_PWM_CLK_IJ_CTRL,
2991 .bit_idx = 24,
2992 },
2993 .hw.init = &(struct clk_init_data){
2994 .name = "pwm_j_gate",
2995 .ops = &clk_regmap_gate_ops,
2996 .parent_hws = (const struct clk_hw *[]) {
2997 &s4_pwm_j_div.hw
2998 },
2999 .num_parents = 1,
3000 .flags = CLK_SET_RATE_PARENT,
3001 },
3002 };
3003
3004 static struct clk_regmap s4_saradc_mux = {
3005 .data = &(struct clk_regmap_mux_data) {
3006 .offset = CLKCTRL_SAR_CLK_CTRL,
3007 .mask = 0x3,
3008 .shift = 9,
3009 },
3010 .hw.init = &(struct clk_init_data){
3011 .name = "saradc_mux",
3012 .ops = &clk_regmap_mux_ops,
3013 .parent_data = (const struct clk_parent_data []) {
3014 { .fw_name = "xtal", },
3015 { .hw = &s4_sys_clk.hw },
3016 },
3017 .num_parents = 2,
3018 .flags = CLK_SET_RATE_PARENT,
3019 },
3020 };
3021
3022 static struct clk_regmap s4_saradc_div = {
3023 .data = &(struct clk_regmap_div_data) {
3024 .offset = CLKCTRL_SAR_CLK_CTRL,
3025 .shift = 0,
3026 .width = 8,
3027 },
3028 .hw.init = &(struct clk_init_data){
3029 .name = "saradc_div",
3030 .ops = &clk_regmap_divider_ops,
3031 .parent_hws = (const struct clk_hw *[]) {
3032 &s4_saradc_mux.hw
3033 },
3034 .num_parents = 1,
3035 .flags = CLK_SET_RATE_PARENT,
3036 },
3037 };
3038
3039 static struct clk_regmap s4_saradc_gate = {
3040 .data = &(struct clk_regmap_gate_data) {
3041 .offset = CLKCTRL_SAR_CLK_CTRL,
3042 .bit_idx = 8,
3043 },
3044 .hw.init = &(struct clk_init_data){
3045 .name = "saradc_clk",
3046 .ops = &clk_regmap_gate_ops,
3047 .parent_hws = (const struct clk_hw *[]) {
3048 &s4_saradc_div.hw
3049 },
3050 .num_parents = 1,
3051 .flags = CLK_SET_RATE_PARENT,
3052 },
3053 };
3054
3055 /*
3056 * gen clk is designed for debug/monitor some internal clock quality. Some of the
3057 * corresponding clock sources are not described in the clock tree and internal clock
3058 * for debug, so they are skipped.
3059 */
3060 static u32 s4_gen_clk_mux_table[] = { 0, 4, 5, 7, 19, 21, 22,
3061 23, 24, 25, 26, 27, 28 };
3062 static const struct clk_parent_data s4_gen_clk_parent_data[] = {
3063 { .fw_name = "xtal", },
3064 { .hw = &s4_vid_pll.hw },
3065 { .fw_name = "gp0_pll", },
3066 { .fw_name = "hifi_pll", },
3067 { .fw_name = "fclk_div2", },
3068 { .fw_name = "fclk_div3", },
3069 { .fw_name = "fclk_div4", },
3070 { .fw_name = "fclk_div5", },
3071 { .fw_name = "fclk_div7", },
3072 { .fw_name = "mpll0", },
3073 { .fw_name = "mpll1", },
3074 { .fw_name = "mpll2", },
3075 { .fw_name = "mpll3", },
3076 };
3077
3078 static struct clk_regmap s4_gen_clk_sel = {
3079 .data = &(struct clk_regmap_mux_data){
3080 .offset = CLKCTRL_GEN_CLK_CTRL,
3081 .mask = 0x1f,
3082 .shift = 12,
3083 .table = s4_gen_clk_mux_table,
3084 },
3085 .hw.init = &(struct clk_init_data){
3086 .name = "gen_clk_sel",
3087 .ops = &clk_regmap_mux_ops,
3088 .parent_data = s4_gen_clk_parent_data,
3089 .num_parents = ARRAY_SIZE(s4_gen_clk_parent_data),
3090 /*
3091 * Because the GEN clock can be connected to an external pad
3092 * and may be set up directly from the device tree. Don't
3093 * really want to automatically reparent.
3094 */
3095 .flags = CLK_SET_RATE_NO_REPARENT,
3096 },
3097 };
3098
3099 static struct clk_regmap s4_gen_clk_div = {
3100 .data = &(struct clk_regmap_div_data){
3101 .offset = CLKCTRL_GEN_CLK_CTRL,
3102 .shift = 0,
3103 .width = 11,
3104 },
3105 .hw.init = &(struct clk_init_data){
3106 .name = "gen_clk_div",
3107 .ops = &clk_regmap_divider_ops,
3108 .parent_hws = (const struct clk_hw *[]) {
3109 &s4_gen_clk_sel.hw
3110 },
3111 .num_parents = 1,
3112 .flags = CLK_SET_RATE_PARENT,
3113 },
3114 };
3115
3116 static struct clk_regmap s4_gen_clk = {
3117 .data = &(struct clk_regmap_gate_data){
3118 .offset = CLKCTRL_GEN_CLK_CTRL,
3119 .bit_idx = 11,
3120 },
3121 .hw.init = &(struct clk_init_data) {
3122 .name = "gen_clk",
3123 .ops = &clk_regmap_gate_ops,
3124 .parent_hws = (const struct clk_hw *[]) {
3125 &s4_gen_clk_div.hw
3126 },
3127 .num_parents = 1,
3128 .flags = CLK_SET_RATE_PARENT,
3129 },
3130 };
3131
3132 static const struct clk_parent_data s4_adc_extclk_in_parent_data[] = {
3133 { .fw_name = "xtal", },
3134 { .fw_name = "fclk_div4", },
3135 { .fw_name = "fclk_div3", },
3136 { .fw_name = "fclk_div5", },
3137 { .fw_name = "fclk_div7", },
3138 { .fw_name = "mpll2", },
3139 { .fw_name = "gp0_pll", },
3140 { .fw_name = "hifi_pll", },
3141 };
3142
3143 static struct clk_regmap s4_adc_extclk_in_mux = {
3144 .data = &(struct clk_regmap_mux_data) {
3145 .offset = CLKCTRL_DEMOD_CLK_CTRL,
3146 .mask = 0x7,
3147 .shift = 25,
3148 },
3149 .hw.init = &(struct clk_init_data){
3150 .name = "adc_extclk_in_mux",
3151 .ops = &clk_regmap_mux_ops,
3152 .parent_data = s4_adc_extclk_in_parent_data,
3153 .num_parents = ARRAY_SIZE(s4_adc_extclk_in_parent_data),
3154 .flags = 0,
3155 },
3156 };
3157
3158 static struct clk_regmap s4_adc_extclk_in_div = {
3159 .data = &(struct clk_regmap_div_data) {
3160 .offset = CLKCTRL_DEMOD_CLK_CTRL,
3161 .shift = 16,
3162 .width = 7,
3163 },
3164 .hw.init = &(struct clk_init_data){
3165 .name = "adc_extclk_in_div",
3166 .ops = &clk_regmap_divider_ops,
3167 .parent_hws = (const struct clk_hw *[]) {
3168 &s4_adc_extclk_in_mux.hw
3169 },
3170 .num_parents = 1,
3171 .flags = CLK_SET_RATE_PARENT,
3172 },
3173 };
3174
3175 static struct clk_regmap s4_adc_extclk_in_gate = {
3176 .data = &(struct clk_regmap_gate_data) {
3177 .offset = CLKCTRL_DEMOD_CLK_CTRL,
3178 .bit_idx = 24,
3179 },
3180 .hw.init = &(struct clk_init_data){
3181 .name = "adc_extclk_in",
3182 .ops = &clk_regmap_gate_ops,
3183 .parent_hws = (const struct clk_hw *[]) {
3184 &s4_adc_extclk_in_div.hw
3185 },
3186 .num_parents = 1,
3187 .flags = CLK_SET_RATE_PARENT,
3188 },
3189 };
3190
3191 static struct clk_regmap s4_demod_core_clk_mux = {
3192 .data = &(struct clk_regmap_mux_data) {
3193 .offset = CLKCTRL_DEMOD_CLK_CTRL,
3194 .mask = 0x3,
3195 .shift = 9,
3196 },
3197 .hw.init = &(struct clk_init_data){
3198 .name = "demod_core_clk_mux",
3199 .ops = &clk_regmap_mux_ops,
3200 .parent_data = (const struct clk_parent_data []) {
3201 { .fw_name = "xtal", },
3202 { .fw_name = "fclk_div7", },
3203 { .fw_name = "fclk_div4", },
3204 { .hw = &s4_adc_extclk_in_gate.hw }
3205 },
3206 .num_parents = 4,
3207 .flags = CLK_SET_RATE_PARENT,
3208 },
3209 };
3210
3211 static struct clk_regmap s4_demod_core_clk_div = {
3212 .data = &(struct clk_regmap_div_data) {
3213 .offset = CLKCTRL_DEMOD_CLK_CTRL,
3214 .shift = 0,
3215 .width = 7,
3216 },
3217 .hw.init = &(struct clk_init_data){
3218 .name = "demod_core_clk_div",
3219 .ops = &clk_regmap_divider_ops,
3220 .parent_hws = (const struct clk_hw *[]) {
3221 &s4_demod_core_clk_mux.hw
3222 },
3223 .num_parents = 1,
3224 .flags = CLK_SET_RATE_PARENT,
3225 },
3226 };
3227
3228 static struct clk_regmap s4_demod_core_clk_gate = {
3229 .data = &(struct clk_regmap_gate_data) {
3230 .offset = CLKCTRL_DEMOD_CLK_CTRL,
3231 .bit_idx = 8,
3232 },
3233 .hw.init = &(struct clk_init_data){
3234 .name = "demod_core_clk",
3235 .ops = &clk_regmap_gate_ops,
3236 .parent_hws = (const struct clk_hw *[]) {
3237 &s4_demod_core_clk_div.hw
3238 },
3239 .num_parents = 1,
3240 .flags = CLK_SET_RATE_PARENT,
3241 },
3242 };
3243
3244 #define MESON_GATE(_name, _reg, _bit) \
3245 MESON_PCLK(_name, _reg, _bit, &s4_sys_clk.hw)
3246
3247 static MESON_GATE(s4_ddr, CLKCTRL_SYS_CLK_EN0_REG0, 0);
3248 static MESON_GATE(s4_dos, CLKCTRL_SYS_CLK_EN0_REG0, 1);
3249 static MESON_GATE(s4_ethphy, CLKCTRL_SYS_CLK_EN0_REG0, 4);
3250 static MESON_GATE(s4_mali, CLKCTRL_SYS_CLK_EN0_REG0, 6);
3251 static MESON_GATE(s4_aocpu, CLKCTRL_SYS_CLK_EN0_REG0, 13);
3252 static MESON_GATE(s4_aucpu, CLKCTRL_SYS_CLK_EN0_REG0, 14);
3253 static MESON_GATE(s4_cec, CLKCTRL_SYS_CLK_EN0_REG0, 16);
3254 static MESON_GATE(s4_sdemmca, CLKCTRL_SYS_CLK_EN0_REG0, 24);
3255 static MESON_GATE(s4_sdemmcb, CLKCTRL_SYS_CLK_EN0_REG0, 25);
3256 static MESON_GATE(s4_nand, CLKCTRL_SYS_CLK_EN0_REG0, 26);
3257 static MESON_GATE(s4_smartcard, CLKCTRL_SYS_CLK_EN0_REG0, 27);
3258 static MESON_GATE(s4_acodec, CLKCTRL_SYS_CLK_EN0_REG0, 28);
3259 static MESON_GATE(s4_spifc, CLKCTRL_SYS_CLK_EN0_REG0, 29);
3260 static MESON_GATE(s4_msr_clk, CLKCTRL_SYS_CLK_EN0_REG0, 30);
3261 static MESON_GATE(s4_ir_ctrl, CLKCTRL_SYS_CLK_EN0_REG0, 31);
3262 static MESON_GATE(s4_audio, CLKCTRL_SYS_CLK_EN0_REG1, 0);
3263 static MESON_GATE(s4_eth, CLKCTRL_SYS_CLK_EN0_REG1, 3);
3264 static MESON_GATE(s4_uart_a, CLKCTRL_SYS_CLK_EN0_REG1, 5);
3265 static MESON_GATE(s4_uart_b, CLKCTRL_SYS_CLK_EN0_REG1, 6);
3266 static MESON_GATE(s4_uart_c, CLKCTRL_SYS_CLK_EN0_REG1, 7);
3267 static MESON_GATE(s4_uart_d, CLKCTRL_SYS_CLK_EN0_REG1, 8);
3268 static MESON_GATE(s4_uart_e, CLKCTRL_SYS_CLK_EN0_REG1, 9);
3269 static MESON_GATE(s4_aififo, CLKCTRL_SYS_CLK_EN0_REG1, 11);
3270 static MESON_GATE(s4_ts_ddr, CLKCTRL_SYS_CLK_EN0_REG1, 15);
3271 static MESON_GATE(s4_ts_pll, CLKCTRL_SYS_CLK_EN0_REG1, 16);
3272 static MESON_GATE(s4_g2d, CLKCTRL_SYS_CLK_EN0_REG1, 20);
3273 static MESON_GATE(s4_spicc0, CLKCTRL_SYS_CLK_EN0_REG1, 21);
3274 static MESON_GATE(s4_usb, CLKCTRL_SYS_CLK_EN0_REG1, 26);
3275 static MESON_GATE(s4_i2c_m_a, CLKCTRL_SYS_CLK_EN0_REG1, 30);
3276 static MESON_GATE(s4_i2c_m_b, CLKCTRL_SYS_CLK_EN0_REG1, 31);
3277 static MESON_GATE(s4_i2c_m_c, CLKCTRL_SYS_CLK_EN0_REG2, 0);
3278 static MESON_GATE(s4_i2c_m_d, CLKCTRL_SYS_CLK_EN0_REG2, 1);
3279 static MESON_GATE(s4_i2c_m_e, CLKCTRL_SYS_CLK_EN0_REG2, 2);
3280 static MESON_GATE(s4_hdmitx_apb, CLKCTRL_SYS_CLK_EN0_REG2, 4);
3281 static MESON_GATE(s4_i2c_s_a, CLKCTRL_SYS_CLK_EN0_REG2, 5);
3282 static MESON_GATE(s4_usb1_to_ddr, CLKCTRL_SYS_CLK_EN0_REG2, 8);
3283 static MESON_GATE(s4_hdcp22, CLKCTRL_SYS_CLK_EN0_REG2, 10);
3284 static MESON_GATE(s4_mmc_apb, CLKCTRL_SYS_CLK_EN0_REG2, 11);
3285 static MESON_GATE(s4_rsa, CLKCTRL_SYS_CLK_EN0_REG2, 18);
3286 static MESON_GATE(s4_cpu_debug, CLKCTRL_SYS_CLK_EN0_REG2, 19);
3287 static MESON_GATE(s4_vpu_intr, CLKCTRL_SYS_CLK_EN0_REG2, 25);
3288 static MESON_GATE(s4_demod, CLKCTRL_SYS_CLK_EN0_REG2, 27);
3289 static MESON_GATE(s4_sar_adc, CLKCTRL_SYS_CLK_EN0_REG2, 28);
3290 static MESON_GATE(s4_gic, CLKCTRL_SYS_CLK_EN0_REG2, 30);
3291 static MESON_GATE(s4_pwm_ab, CLKCTRL_SYS_CLK_EN0_REG3, 7);
3292 static MESON_GATE(s4_pwm_cd, CLKCTRL_SYS_CLK_EN0_REG3, 8);
3293 static MESON_GATE(s4_pwm_ef, CLKCTRL_SYS_CLK_EN0_REG3, 9);
3294 static MESON_GATE(s4_pwm_gh, CLKCTRL_SYS_CLK_EN0_REG3, 10);
3295 static MESON_GATE(s4_pwm_ij, CLKCTRL_SYS_CLK_EN0_REG3, 11);
3296
3297 /* Array of all clocks provided by this provider */
3298 static struct clk_hw *s4_periphs_hw_clks[] = {
3299 [CLKID_RTC_32K_CLKIN] = &s4_rtc_32k_by_oscin_clkin.hw,
3300 [CLKID_RTC_32K_DIV] = &s4_rtc_32k_by_oscin_div.hw,
3301 [CLKID_RTC_32K_SEL] = &s4_rtc_32k_by_oscin_sel.hw,
3302 [CLKID_RTC_32K_XATL] = &s4_rtc_32k_by_oscin.hw,
3303 [CLKID_RTC] = &s4_rtc_clk.hw,
3304 [CLKID_SYS_CLK_B_SEL] = &s4_sysclk_b_sel.hw,
3305 [CLKID_SYS_CLK_B_DIV] = &s4_sysclk_b_div.hw,
3306 [CLKID_SYS_CLK_B] = &s4_sysclk_b.hw,
3307 [CLKID_SYS_CLK_A_SEL] = &s4_sysclk_a_sel.hw,
3308 [CLKID_SYS_CLK_A_DIV] = &s4_sysclk_a_div.hw,
3309 [CLKID_SYS_CLK_A] = &s4_sysclk_a.hw,
3310 [CLKID_SYS] = &s4_sys_clk.hw,
3311 [CLKID_CECA_32K_CLKIN] = &s4_ceca_32k_clkin.hw,
3312 [CLKID_CECA_32K_DIV] = &s4_ceca_32k_div.hw,
3313 [CLKID_CECA_32K_SEL_PRE] = &s4_ceca_32k_sel_pre.hw,
3314 [CLKID_CECA_32K_SEL] = &s4_ceca_32k_sel.hw,
3315 [CLKID_CECA_32K_CLKOUT] = &s4_ceca_32k_clkout.hw,
3316 [CLKID_CECB_32K_CLKIN] = &s4_cecb_32k_clkin.hw,
3317 [CLKID_CECB_32K_DIV] = &s4_cecb_32k_div.hw,
3318 [CLKID_CECB_32K_SEL_PRE] = &s4_cecb_32k_sel_pre.hw,
3319 [CLKID_CECB_32K_SEL] = &s4_cecb_32k_sel.hw,
3320 [CLKID_CECB_32K_CLKOUT] = &s4_cecb_32k_clkout.hw,
3321 [CLKID_SC_CLK_SEL] = &s4_sc_clk_mux.hw,
3322 [CLKID_SC_CLK_DIV] = &s4_sc_clk_div.hw,
3323 [CLKID_SC] = &s4_sc_clk_gate.hw,
3324 [CLKID_12_24M] = &s4_12_24M_clk_gate.hw,
3325 [CLKID_12M_CLK_DIV] = &s4_12M_clk_div.hw,
3326 [CLKID_12_24M_CLK_SEL] = &s4_12_24M_clk.hw,
3327 [CLKID_VID_PLL_DIV] = &s4_vid_pll_div.hw,
3328 [CLKID_VID_PLL_SEL] = &s4_vid_pll_sel.hw,
3329 [CLKID_VID_PLL] = &s4_vid_pll.hw,
3330 [CLKID_VCLK_SEL] = &s4_vclk_sel.hw,
3331 [CLKID_VCLK2_SEL] = &s4_vclk2_sel.hw,
3332 [CLKID_VCLK_INPUT] = &s4_vclk_input.hw,
3333 [CLKID_VCLK2_INPUT] = &s4_vclk2_input.hw,
3334 [CLKID_VCLK_DIV] = &s4_vclk_div.hw,
3335 [CLKID_VCLK2_DIV] = &s4_vclk2_div.hw,
3336 [CLKID_VCLK] = &s4_vclk.hw,
3337 [CLKID_VCLK2] = &s4_vclk2.hw,
3338 [CLKID_VCLK_DIV1] = &s4_vclk_div1.hw,
3339 [CLKID_VCLK_DIV2_EN] = &s4_vclk_div2_en.hw,
3340 [CLKID_VCLK_DIV4_EN] = &s4_vclk_div4_en.hw,
3341 [CLKID_VCLK_DIV6_EN] = &s4_vclk_div6_en.hw,
3342 [CLKID_VCLK_DIV12_EN] = &s4_vclk_div12_en.hw,
3343 [CLKID_VCLK2_DIV1] = &s4_vclk2_div1.hw,
3344 [CLKID_VCLK2_DIV2_EN] = &s4_vclk2_div2_en.hw,
3345 [CLKID_VCLK2_DIV4_EN] = &s4_vclk2_div4_en.hw,
3346 [CLKID_VCLK2_DIV6_EN] = &s4_vclk2_div6_en.hw,
3347 [CLKID_VCLK2_DIV12_EN] = &s4_vclk2_div12_en.hw,
3348 [CLKID_VCLK_DIV2] = &s4_vclk_div2.hw,
3349 [CLKID_VCLK_DIV4] = &s4_vclk_div4.hw,
3350 [CLKID_VCLK_DIV6] = &s4_vclk_div6.hw,
3351 [CLKID_VCLK_DIV12] = &s4_vclk_div12.hw,
3352 [CLKID_VCLK2_DIV2] = &s4_vclk2_div2.hw,
3353 [CLKID_VCLK2_DIV4] = &s4_vclk2_div4.hw,
3354 [CLKID_VCLK2_DIV6] = &s4_vclk2_div6.hw,
3355 [CLKID_VCLK2_DIV12] = &s4_vclk2_div12.hw,
3356 [CLKID_CTS_ENCI_SEL] = &s4_cts_enci_sel.hw,
3357 [CLKID_CTS_ENCP_SEL] = &s4_cts_encp_sel.hw,
3358 [CLKID_CTS_VDAC_SEL] = &s4_cts_vdac_sel.hw,
3359 [CLKID_HDMI_TX_SEL] = &s4_hdmi_tx_sel.hw,
3360 [CLKID_CTS_ENCI] = &s4_cts_enci.hw,
3361 [CLKID_CTS_ENCP] = &s4_cts_encp.hw,
3362 [CLKID_CTS_VDAC] = &s4_cts_vdac.hw,
3363 [CLKID_HDMI_TX] = &s4_hdmi_tx.hw,
3364 [CLKID_HDMI_SEL] = &s4_hdmi_sel.hw,
3365 [CLKID_HDMI_DIV] = &s4_hdmi_div.hw,
3366 [CLKID_HDMI] = &s4_hdmi.hw,
3367 [CLKID_TS_CLK_DIV] = &s4_ts_clk_div.hw,
3368 [CLKID_TS] = &s4_ts_clk_gate.hw,
3369 [CLKID_MALI_0_SEL] = &s4_mali_0_sel.hw,
3370 [CLKID_MALI_0_DIV] = &s4_mali_0_div.hw,
3371 [CLKID_MALI_0] = &s4_mali_0.hw,
3372 [CLKID_MALI_1_SEL] = &s4_mali_1_sel.hw,
3373 [CLKID_MALI_1_DIV] = &s4_mali_1_div.hw,
3374 [CLKID_MALI_1] = &s4_mali_1.hw,
3375 [CLKID_MALI_SEL] = &s4_mali_mux.hw,
3376 [CLKID_VDEC_P0_SEL] = &s4_vdec_p0_mux.hw,
3377 [CLKID_VDEC_P0_DIV] = &s4_vdec_p0_div.hw,
3378 [CLKID_VDEC_P0] = &s4_vdec_p0.hw,
3379 [CLKID_VDEC_P1_SEL] = &s4_vdec_p1_mux.hw,
3380 [CLKID_VDEC_P1_DIV] = &s4_vdec_p1_div.hw,
3381 [CLKID_VDEC_P1] = &s4_vdec_p1.hw,
3382 [CLKID_VDEC_SEL] = &s4_vdec_mux.hw,
3383 [CLKID_HEVCF_P0_SEL] = &s4_hevcf_p0_mux.hw,
3384 [CLKID_HEVCF_P0_DIV] = &s4_hevcf_p0_div.hw,
3385 [CLKID_HEVCF_P0] = &s4_hevcf_p0.hw,
3386 [CLKID_HEVCF_P1_SEL] = &s4_hevcf_p1_mux.hw,
3387 [CLKID_HEVCF_P1_DIV] = &s4_hevcf_p1_div.hw,
3388 [CLKID_HEVCF_P1] = &s4_hevcf_p1.hw,
3389 [CLKID_HEVCF_SEL] = &s4_hevcf_mux.hw,
3390 [CLKID_VPU_0_SEL] = &s4_vpu_0_sel.hw,
3391 [CLKID_VPU_0_DIV] = &s4_vpu_0_div.hw,
3392 [CLKID_VPU_0] = &s4_vpu_0.hw,
3393 [CLKID_VPU_1_SEL] = &s4_vpu_1_sel.hw,
3394 [CLKID_VPU_1_DIV] = &s4_vpu_1_div.hw,
3395 [CLKID_VPU_1] = &s4_vpu_1.hw,
3396 [CLKID_VPU] = &s4_vpu.hw,
3397 [CLKID_VPU_CLKB_TMP_SEL] = &s4_vpu_clkb_tmp_mux.hw,
3398 [CLKID_VPU_CLKB_TMP_DIV] = &s4_vpu_clkb_tmp_div.hw,
3399 [CLKID_VPU_CLKB_TMP] = &s4_vpu_clkb_tmp.hw,
3400 [CLKID_VPU_CLKB_DIV] = &s4_vpu_clkb_div.hw,
3401 [CLKID_VPU_CLKB] = &s4_vpu_clkb.hw,
3402 [CLKID_VPU_CLKC_P0_SEL] = &s4_vpu_clkc_p0_mux.hw,
3403 [CLKID_VPU_CLKC_P0_DIV] = &s4_vpu_clkc_p0_div.hw,
3404 [CLKID_VPU_CLKC_P0] = &s4_vpu_clkc_p0.hw,
3405 [CLKID_VPU_CLKC_P1_SEL] = &s4_vpu_clkc_p1_mux.hw,
3406 [CLKID_VPU_CLKC_P1_DIV] = &s4_vpu_clkc_p1_div.hw,
3407 [CLKID_VPU_CLKC_P1] = &s4_vpu_clkc_p1.hw,
3408 [CLKID_VPU_CLKC_SEL] = &s4_vpu_clkc_mux.hw,
3409 [CLKID_VAPB_0_SEL] = &s4_vapb_0_sel.hw,
3410 [CLKID_VAPB_0_DIV] = &s4_vapb_0_div.hw,
3411 [CLKID_VAPB_0] = &s4_vapb_0.hw,
3412 [CLKID_VAPB_1_SEL] = &s4_vapb_1_sel.hw,
3413 [CLKID_VAPB_1_DIV] = &s4_vapb_1_div.hw,
3414 [CLKID_VAPB_1] = &s4_vapb_1.hw,
3415 [CLKID_VAPB] = &s4_vapb.hw,
3416 [CLKID_GE2D] = &s4_ge2d_gate.hw,
3417 [CLKID_VDIN_MEAS_SEL] = &s4_vdin_meas_mux.hw,
3418 [CLKID_VDIN_MEAS_DIV] = &s4_vdin_meas_div.hw,
3419 [CLKID_VDIN_MEAS] = &s4_vdin_meas_gate.hw,
3420 [CLKID_SD_EMMC_C_CLK_SEL] = &s4_sd_emmc_c_clk0_sel.hw,
3421 [CLKID_SD_EMMC_C_CLK_DIV] = &s4_sd_emmc_c_clk0_div.hw,
3422 [CLKID_SD_EMMC_C] = &s4_sd_emmc_c_clk0.hw,
3423 [CLKID_SD_EMMC_A_CLK_SEL] = &s4_sd_emmc_a_clk0_sel.hw,
3424 [CLKID_SD_EMMC_A_CLK_DIV] = &s4_sd_emmc_a_clk0_div.hw,
3425 [CLKID_SD_EMMC_A] = &s4_sd_emmc_a_clk0.hw,
3426 [CLKID_SD_EMMC_B_CLK_SEL] = &s4_sd_emmc_b_clk0_sel.hw,
3427 [CLKID_SD_EMMC_B_CLK_DIV] = &s4_sd_emmc_b_clk0_div.hw,
3428 [CLKID_SD_EMMC_B] = &s4_sd_emmc_b_clk0.hw,
3429 [CLKID_SPICC0_SEL] = &s4_spicc0_mux.hw,
3430 [CLKID_SPICC0_DIV] = &s4_spicc0_div.hw,
3431 [CLKID_SPICC0_EN] = &s4_spicc0_gate.hw,
3432 [CLKID_PWM_A_SEL] = &s4_pwm_a_mux.hw,
3433 [CLKID_PWM_A_DIV] = &s4_pwm_a_div.hw,
3434 [CLKID_PWM_A] = &s4_pwm_a_gate.hw,
3435 [CLKID_PWM_B_SEL] = &s4_pwm_b_mux.hw,
3436 [CLKID_PWM_B_DIV] = &s4_pwm_b_div.hw,
3437 [CLKID_PWM_B] = &s4_pwm_b_gate.hw,
3438 [CLKID_PWM_C_SEL] = &s4_pwm_c_mux.hw,
3439 [CLKID_PWM_C_DIV] = &s4_pwm_c_div.hw,
3440 [CLKID_PWM_C] = &s4_pwm_c_gate.hw,
3441 [CLKID_PWM_D_SEL] = &s4_pwm_d_mux.hw,
3442 [CLKID_PWM_D_DIV] = &s4_pwm_d_div.hw,
3443 [CLKID_PWM_D] = &s4_pwm_d_gate.hw,
3444 [CLKID_PWM_E_SEL] = &s4_pwm_e_mux.hw,
3445 [CLKID_PWM_E_DIV] = &s4_pwm_e_div.hw,
3446 [CLKID_PWM_E] = &s4_pwm_e_gate.hw,
3447 [CLKID_PWM_F_SEL] = &s4_pwm_f_mux.hw,
3448 [CLKID_PWM_F_DIV] = &s4_pwm_f_div.hw,
3449 [CLKID_PWM_F] = &s4_pwm_f_gate.hw,
3450 [CLKID_PWM_G_SEL] = &s4_pwm_g_mux.hw,
3451 [CLKID_PWM_G_DIV] = &s4_pwm_g_div.hw,
3452 [CLKID_PWM_G] = &s4_pwm_g_gate.hw,
3453 [CLKID_PWM_H_SEL] = &s4_pwm_h_mux.hw,
3454 [CLKID_PWM_H_DIV] = &s4_pwm_h_div.hw,
3455 [CLKID_PWM_H] = &s4_pwm_h_gate.hw,
3456 [CLKID_PWM_I_SEL] = &s4_pwm_i_mux.hw,
3457 [CLKID_PWM_I_DIV] = &s4_pwm_i_div.hw,
3458 [CLKID_PWM_I] = &s4_pwm_i_gate.hw,
3459 [CLKID_PWM_J_SEL] = &s4_pwm_j_mux.hw,
3460 [CLKID_PWM_J_DIV] = &s4_pwm_j_div.hw,
3461 [CLKID_PWM_J] = &s4_pwm_j_gate.hw,
3462 [CLKID_SARADC_SEL] = &s4_saradc_mux.hw,
3463 [CLKID_SARADC_DIV] = &s4_saradc_div.hw,
3464 [CLKID_SARADC] = &s4_saradc_gate.hw,
3465 [CLKID_GEN_SEL] = &s4_gen_clk_sel.hw,
3466 [CLKID_GEN_DIV] = &s4_gen_clk_div.hw,
3467 [CLKID_GEN] = &s4_gen_clk.hw,
3468 [CLKID_DDR] = &s4_ddr.hw,
3469 [CLKID_DOS] = &s4_dos.hw,
3470 [CLKID_ETHPHY] = &s4_ethphy.hw,
3471 [CLKID_MALI] = &s4_mali.hw,
3472 [CLKID_AOCPU] = &s4_aocpu.hw,
3473 [CLKID_AUCPU] = &s4_aucpu.hw,
3474 [CLKID_CEC] = &s4_cec.hw,
3475 [CLKID_SDEMMC_A] = &s4_sdemmca.hw,
3476 [CLKID_SDEMMC_B] = &s4_sdemmcb.hw,
3477 [CLKID_NAND] = &s4_nand.hw,
3478 [CLKID_SMARTCARD] = &s4_smartcard.hw,
3479 [CLKID_ACODEC] = &s4_acodec.hw,
3480 [CLKID_SPIFC] = &s4_spifc.hw,
3481 [CLKID_MSR] = &s4_msr_clk.hw,
3482 [CLKID_IR_CTRL] = &s4_ir_ctrl.hw,
3483 [CLKID_AUDIO] = &s4_audio.hw,
3484 [CLKID_ETH] = &s4_eth.hw,
3485 [CLKID_UART_A] = &s4_uart_a.hw,
3486 [CLKID_UART_B] = &s4_uart_b.hw,
3487 [CLKID_UART_C] = &s4_uart_c.hw,
3488 [CLKID_UART_D] = &s4_uart_d.hw,
3489 [CLKID_UART_E] = &s4_uart_e.hw,
3490 [CLKID_AIFIFO] = &s4_aififo.hw,
3491 [CLKID_TS_DDR] = &s4_ts_ddr.hw,
3492 [CLKID_TS_PLL] = &s4_ts_pll.hw,
3493 [CLKID_G2D] = &s4_g2d.hw,
3494 [CLKID_SPICC0] = &s4_spicc0.hw,
3495 [CLKID_USB] = &s4_usb.hw,
3496 [CLKID_I2C_M_A] = &s4_i2c_m_a.hw,
3497 [CLKID_I2C_M_B] = &s4_i2c_m_b.hw,
3498 [CLKID_I2C_M_C] = &s4_i2c_m_c.hw,
3499 [CLKID_I2C_M_D] = &s4_i2c_m_d.hw,
3500 [CLKID_I2C_M_E] = &s4_i2c_m_e.hw,
3501 [CLKID_HDMITX_APB] = &s4_hdmitx_apb.hw,
3502 [CLKID_I2C_S_A] = &s4_i2c_s_a.hw,
3503 [CLKID_USB1_TO_DDR] = &s4_usb1_to_ddr.hw,
3504 [CLKID_HDCP22] = &s4_hdcp22.hw,
3505 [CLKID_MMC_APB] = &s4_mmc_apb.hw,
3506 [CLKID_RSA] = &s4_rsa.hw,
3507 [CLKID_CPU_DEBUG] = &s4_cpu_debug.hw,
3508 [CLKID_VPU_INTR] = &s4_vpu_intr.hw,
3509 [CLKID_DEMOD] = &s4_demod.hw,
3510 [CLKID_SAR_ADC] = &s4_sar_adc.hw,
3511 [CLKID_GIC] = &s4_gic.hw,
3512 [CLKID_PWM_AB] = &s4_pwm_ab.hw,
3513 [CLKID_PWM_CD] = &s4_pwm_cd.hw,
3514 [CLKID_PWM_EF] = &s4_pwm_ef.hw,
3515 [CLKID_PWM_GH] = &s4_pwm_gh.hw,
3516 [CLKID_PWM_IJ] = &s4_pwm_ij.hw,
3517 [CLKID_HDCP22_ESMCLK_SEL] = &s4_hdcp22_esmclk_mux.hw,
3518 [CLKID_HDCP22_ESMCLK_DIV] = &s4_hdcp22_esmclk_div.hw,
3519 [CLKID_HDCP22_ESMCLK] = &s4_hdcp22_esmclk_gate.hw,
3520 [CLKID_HDCP22_SKPCLK_SEL] = &s4_hdcp22_skpclk_mux.hw,
3521 [CLKID_HDCP22_SKPCLK_DIV] = &s4_hdcp22_skpclk_div.hw,
3522 [CLKID_HDCP22_SKPCLK] = &s4_hdcp22_skpclk_gate.hw,
3523 };
3524
3525 /* Convenience table to populate regmap in .probe */
3526 static struct clk_regmap *const s4_periphs_clk_regmaps[] = {
3527 &s4_rtc_32k_by_oscin_clkin,
3528 &s4_rtc_32k_by_oscin_div,
3529 &s4_rtc_32k_by_oscin_sel,
3530 &s4_rtc_32k_by_oscin,
3531 &s4_rtc_clk,
3532 &s4_sysclk_b_sel,
3533 &s4_sysclk_b_div,
3534 &s4_sysclk_b,
3535 &s4_sysclk_a_sel,
3536 &s4_sysclk_a_div,
3537 &s4_sysclk_a,
3538 &s4_sys_clk,
3539 &s4_ceca_32k_clkin,
3540 &s4_ceca_32k_div,
3541 &s4_ceca_32k_sel_pre,
3542 &s4_ceca_32k_sel,
3543 &s4_ceca_32k_clkout,
3544 &s4_cecb_32k_clkin,
3545 &s4_cecb_32k_div,
3546 &s4_cecb_32k_sel_pre,
3547 &s4_cecb_32k_sel,
3548 &s4_cecb_32k_clkout,
3549 &s4_sc_clk_mux,
3550 &s4_sc_clk_div,
3551 &s4_sc_clk_gate,
3552 &s4_12_24M_clk_gate,
3553 &s4_12_24M_clk,
3554 &s4_vid_pll_div,
3555 &s4_vid_pll_sel,
3556 &s4_vid_pll,
3557 &s4_vclk_sel,
3558 &s4_vclk2_sel,
3559 &s4_vclk_input,
3560 &s4_vclk2_input,
3561 &s4_vclk_div,
3562 &s4_vclk2_div,
3563 &s4_vclk,
3564 &s4_vclk2,
3565 &s4_vclk_div1,
3566 &s4_vclk_div2_en,
3567 &s4_vclk_div4_en,
3568 &s4_vclk_div6_en,
3569 &s4_vclk_div12_en,
3570 &s4_vclk2_div1,
3571 &s4_vclk2_div2_en,
3572 &s4_vclk2_div4_en,
3573 &s4_vclk2_div6_en,
3574 &s4_vclk2_div12_en,
3575 &s4_cts_enci_sel,
3576 &s4_cts_encp_sel,
3577 &s4_cts_vdac_sel,
3578 &s4_hdmi_tx_sel,
3579 &s4_cts_enci,
3580 &s4_cts_encp,
3581 &s4_cts_vdac,
3582 &s4_hdmi_tx,
3583 &s4_hdmi_sel,
3584 &s4_hdmi_div,
3585 &s4_hdmi,
3586 &s4_ts_clk_div,
3587 &s4_ts_clk_gate,
3588 &s4_mali_0_sel,
3589 &s4_mali_0_div,
3590 &s4_mali_0,
3591 &s4_mali_1_sel,
3592 &s4_mali_1_div,
3593 &s4_mali_1,
3594 &s4_mali_mux,
3595 &s4_vdec_p0_mux,
3596 &s4_vdec_p0_div,
3597 &s4_vdec_p0,
3598 &s4_vdec_p1_mux,
3599 &s4_vdec_p1_div,
3600 &s4_vdec_p1,
3601 &s4_vdec_mux,
3602 &s4_hevcf_p0_mux,
3603 &s4_hevcf_p0_div,
3604 &s4_hevcf_p0,
3605 &s4_hevcf_p1_mux,
3606 &s4_hevcf_p1_div,
3607 &s4_hevcf_p1,
3608 &s4_hevcf_mux,
3609 &s4_vpu_0_sel,
3610 &s4_vpu_0_div,
3611 &s4_vpu_0,
3612 &s4_vpu_1_sel,
3613 &s4_vpu_1_div,
3614 &s4_vpu_1,
3615 &s4_vpu,
3616 &s4_vpu_clkb_tmp_mux,
3617 &s4_vpu_clkb_tmp_div,
3618 &s4_vpu_clkb_tmp,
3619 &s4_vpu_clkb_div,
3620 &s4_vpu_clkb,
3621 &s4_vpu_clkc_p0_mux,
3622 &s4_vpu_clkc_p0_div,
3623 &s4_vpu_clkc_p0,
3624 &s4_vpu_clkc_p1_mux,
3625 &s4_vpu_clkc_p1_div,
3626 &s4_vpu_clkc_p1,
3627 &s4_vpu_clkc_mux,
3628 &s4_vapb_0_sel,
3629 &s4_vapb_0_div,
3630 &s4_vapb_0,
3631 &s4_vapb_1_sel,
3632 &s4_vapb_1_div,
3633 &s4_vapb_1,
3634 &s4_vapb,
3635 &s4_ge2d_gate,
3636 &s4_hdcp22_esmclk_mux,
3637 &s4_hdcp22_esmclk_div,
3638 &s4_hdcp22_esmclk_gate,
3639 &s4_hdcp22_skpclk_mux,
3640 &s4_hdcp22_skpclk_div,
3641 &s4_hdcp22_skpclk_gate,
3642 &s4_vdin_meas_mux,
3643 &s4_vdin_meas_div,
3644 &s4_vdin_meas_gate,
3645 &s4_sd_emmc_c_clk0_sel,
3646 &s4_sd_emmc_c_clk0_div,
3647 &s4_sd_emmc_c_clk0,
3648 &s4_sd_emmc_a_clk0_sel,
3649 &s4_sd_emmc_a_clk0_div,
3650 &s4_sd_emmc_a_clk0,
3651 &s4_sd_emmc_b_clk0_sel,
3652 &s4_sd_emmc_b_clk0_div,
3653 &s4_sd_emmc_b_clk0,
3654 &s4_spicc0_mux,
3655 &s4_spicc0_div,
3656 &s4_spicc0_gate,
3657 &s4_pwm_a_mux,
3658 &s4_pwm_a_div,
3659 &s4_pwm_a_gate,
3660 &s4_pwm_b_mux,
3661 &s4_pwm_b_div,
3662 &s4_pwm_b_gate,
3663 &s4_pwm_c_mux,
3664 &s4_pwm_c_div,
3665 &s4_pwm_c_gate,
3666 &s4_pwm_d_mux,
3667 &s4_pwm_d_div,
3668 &s4_pwm_d_gate,
3669 &s4_pwm_e_mux,
3670 &s4_pwm_e_div,
3671 &s4_pwm_e_gate,
3672 &s4_pwm_f_mux,
3673 &s4_pwm_f_div,
3674 &s4_pwm_f_gate,
3675 &s4_pwm_g_mux,
3676 &s4_pwm_g_div,
3677 &s4_pwm_g_gate,
3678 &s4_pwm_h_mux,
3679 &s4_pwm_h_div,
3680 &s4_pwm_h_gate,
3681 &s4_pwm_i_mux,
3682 &s4_pwm_i_div,
3683 &s4_pwm_i_gate,
3684 &s4_pwm_j_mux,
3685 &s4_pwm_j_div,
3686 &s4_pwm_j_gate,
3687 &s4_saradc_mux,
3688 &s4_saradc_div,
3689 &s4_saradc_gate,
3690 &s4_gen_clk_sel,
3691 &s4_gen_clk_div,
3692 &s4_gen_clk,
3693 &s4_ddr,
3694 &s4_dos,
3695 &s4_ethphy,
3696 &s4_mali,
3697 &s4_aocpu,
3698 &s4_aucpu,
3699 &s4_cec,
3700 &s4_sdemmca,
3701 &s4_sdemmcb,
3702 &s4_nand,
3703 &s4_smartcard,
3704 &s4_acodec,
3705 &s4_spifc,
3706 &s4_msr_clk,
3707 &s4_ir_ctrl,
3708 &s4_audio,
3709 &s4_eth,
3710 &s4_uart_a,
3711 &s4_uart_b,
3712 &s4_uart_c,
3713 &s4_uart_d,
3714 &s4_uart_e,
3715 &s4_aififo,
3716 &s4_ts_ddr,
3717 &s4_ts_pll,
3718 &s4_g2d,
3719 &s4_spicc0,
3720 &s4_usb,
3721 &s4_i2c_m_a,
3722 &s4_i2c_m_b,
3723 &s4_i2c_m_c,
3724 &s4_i2c_m_d,
3725 &s4_i2c_m_e,
3726 &s4_hdmitx_apb,
3727 &s4_i2c_s_a,
3728 &s4_usb1_to_ddr,
3729 &s4_hdcp22,
3730 &s4_mmc_apb,
3731 &s4_rsa,
3732 &s4_cpu_debug,
3733 &s4_vpu_intr,
3734 &s4_demod,
3735 &s4_sar_adc,
3736 &s4_gic,
3737 &s4_pwm_ab,
3738 &s4_pwm_cd,
3739 &s4_pwm_ef,
3740 &s4_pwm_gh,
3741 &s4_pwm_ij,
3742 &s4_demod_core_clk_mux,
3743 &s4_demod_core_clk_div,
3744 &s4_demod_core_clk_gate,
3745 &s4_adc_extclk_in_mux,
3746 &s4_adc_extclk_in_div,
3747 &s4_adc_extclk_in_gate,
3748 };
3749
3750 static const struct regmap_config clkc_regmap_config = {
3751 .reg_bits = 32,
3752 .val_bits = 32,
3753 .reg_stride = 4,
3754 .max_register = CLKCTRL_DEMOD_CLK_CTRL,
3755 };
3756
3757 static struct meson_clk_hw_data s4_periphs_clks = {
3758 .hws = s4_periphs_hw_clks,
3759 .num = ARRAY_SIZE(s4_periphs_hw_clks),
3760 };
3761
meson_s4_periphs_probe(struct platform_device * pdev)3762 static int meson_s4_periphs_probe(struct platform_device *pdev)
3763 {
3764 struct device *dev = &pdev->dev;
3765 struct regmap *regmap;
3766 void __iomem *base;
3767 int ret, i;
3768
3769 base = devm_platform_ioremap_resource(pdev, 0);
3770 if (IS_ERR(base))
3771 return dev_err_probe(dev, PTR_ERR(base),
3772 "can't ioremap resource\n");
3773
3774 regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config);
3775 if (IS_ERR(regmap))
3776 return dev_err_probe(dev, PTR_ERR(regmap),
3777 "can't init regmap mmio region\n");
3778
3779 /* Populate regmap for the regmap backed clocks */
3780 for (i = 0; i < ARRAY_SIZE(s4_periphs_clk_regmaps); i++)
3781 s4_periphs_clk_regmaps[i]->map = regmap;
3782
3783 for (i = 0; i < s4_periphs_clks.num; i++) {
3784 /* array might be sparse */
3785 if (!s4_periphs_clks.hws[i])
3786 continue;
3787
3788 ret = devm_clk_hw_register(dev, s4_periphs_clks.hws[i]);
3789 if (ret)
3790 return dev_err_probe(dev, ret,
3791 "clock[%d] registration failed\n", i);
3792 }
3793
3794 return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &s4_periphs_clks);
3795 }
3796
3797 static const struct of_device_id clkc_match_table[] = {
3798 {
3799 .compatible = "amlogic,s4-peripherals-clkc",
3800 },
3801 {}
3802 };
3803 MODULE_DEVICE_TABLE(of, clkc_match_table);
3804
3805 static struct platform_driver s4_driver = {
3806 .probe = meson_s4_periphs_probe,
3807 .driver = {
3808 .name = "s4-periphs-clkc",
3809 .of_match_table = clkc_match_table,
3810 },
3811 };
3812 module_platform_driver(s4_driver);
3813
3814 MODULE_DESCRIPTION("Amlogic S4 Peripherals Clock Controller driver");
3815 MODULE_AUTHOR("Yu Tu <yu.tu@amlogic.com>");
3816 MODULE_LICENSE("GPL");
3817 MODULE_IMPORT_NS("CLK_MESON");
3818