1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/kernel.h>
15#include <linux/bitops.h>
16#include <linux/err.h>
17#include <linux/platform_device.h>
18#include <linux/module.h>
19#include <linux/of.h>
20#include <linux/of_device.h>
21#include <linux/clk-provider.h>
22#include <linux/regmap.h>
23#include <linux/reset-controller.h>
24
25#include <dt-bindings/clock/qcom,gcc-ipq806x.h>
26#include <dt-bindings/reset/qcom,gcc-ipq806x.h>
27
28#include "common.h"
29#include "clk-regmap.h"
30#include "clk-pll.h"
31#include "clk-rcg.h"
32#include "clk-branch.h"
33#include "reset.h"
34
35static struct clk_pll pll0 = {
36 .l_reg = 0x30c4,
37 .m_reg = 0x30c8,
38 .n_reg = 0x30cc,
39 .config_reg = 0x30d4,
40 .mode_reg = 0x30c0,
41 .status_reg = 0x30d8,
42 .status_bit = 16,
43 .clkr.hw.init = &(struct clk_init_data){
44 .name = "pll0",
45 .parent_names = (const char *[]){ "pxo" },
46 .num_parents = 1,
47 .ops = &clk_pll_ops,
48 },
49};
50
51static struct clk_regmap pll0_vote = {
52 .enable_reg = 0x34c0,
53 .enable_mask = BIT(0),
54 .hw.init = &(struct clk_init_data){
55 .name = "pll0_vote",
56 .parent_names = (const char *[]){ "pll0" },
57 .num_parents = 1,
58 .ops = &clk_pll_vote_ops,
59 },
60};
61
62static struct clk_pll pll3 = {
63 .l_reg = 0x3164,
64 .m_reg = 0x3168,
65 .n_reg = 0x316c,
66 .config_reg = 0x3174,
67 .mode_reg = 0x3160,
68 .status_reg = 0x3178,
69 .status_bit = 16,
70 .clkr.hw.init = &(struct clk_init_data){
71 .name = "pll3",
72 .parent_names = (const char *[]){ "pxo" },
73 .num_parents = 1,
74 .ops = &clk_pll_ops,
75 },
76};
77
78static struct clk_regmap pll4_vote = {
79 .enable_reg = 0x34c0,
80 .enable_mask = BIT(4),
81 .hw.init = &(struct clk_init_data){
82 .name = "pll4_vote",
83 .parent_names = (const char *[]){ "pll4" },
84 .num_parents = 1,
85 .ops = &clk_pll_vote_ops,
86 },
87};
88
89static struct clk_pll pll8 = {
90 .l_reg = 0x3144,
91 .m_reg = 0x3148,
92 .n_reg = 0x314c,
93 .config_reg = 0x3154,
94 .mode_reg = 0x3140,
95 .status_reg = 0x3158,
96 .status_bit = 16,
97 .clkr.hw.init = &(struct clk_init_data){
98 .name = "pll8",
99 .parent_names = (const char *[]){ "pxo" },
100 .num_parents = 1,
101 .ops = &clk_pll_ops,
102 },
103};
104
105static struct clk_regmap pll8_vote = {
106 .enable_reg = 0x34c0,
107 .enable_mask = BIT(8),
108 .hw.init = &(struct clk_init_data){
109 .name = "pll8_vote",
110 .parent_names = (const char *[]){ "pll8" },
111 .num_parents = 1,
112 .ops = &clk_pll_vote_ops,
113 },
114};
115
116static struct clk_pll pll14 = {
117 .l_reg = 0x31c4,
118 .m_reg = 0x31c8,
119 .n_reg = 0x31cc,
120 .config_reg = 0x31d4,
121 .mode_reg = 0x31c0,
122 .status_reg = 0x31d8,
123 .status_bit = 16,
124 .clkr.hw.init = &(struct clk_init_data){
125 .name = "pll14",
126 .parent_names = (const char *[]){ "pxo" },
127 .num_parents = 1,
128 .ops = &clk_pll_ops,
129 },
130};
131
132static struct clk_regmap pll14_vote = {
133 .enable_reg = 0x34c0,
134 .enable_mask = BIT(14),
135 .hw.init = &(struct clk_init_data){
136 .name = "pll14_vote",
137 .parent_names = (const char *[]){ "pll14" },
138 .num_parents = 1,
139 .ops = &clk_pll_vote_ops,
140 },
141};
142
143#define NSS_PLL_RATE(f, _l, _m, _n, i) \
144 { \
145 .freq = f, \
146 .l = _l, \
147 .m = _m, \
148 .n = _n, \
149 .ibits = i, \
150 }
151
152static struct pll_freq_tbl pll18_freq_tbl[] = {
153 NSS_PLL_RATE(550000000, 44, 0, 1, 0x01495625),
154 NSS_PLL_RATE(733000000, 58, 16, 25, 0x014b5625),
155};
156
157static struct clk_pll pll18 = {
158 .l_reg = 0x31a4,
159 .m_reg = 0x31a8,
160 .n_reg = 0x31ac,
161 .config_reg = 0x31b4,
162 .mode_reg = 0x31a0,
163 .status_reg = 0x31b8,
164 .status_bit = 16,
165 .post_div_shift = 16,
166 .post_div_width = 1,
167 .freq_tbl = pll18_freq_tbl,
168 .clkr.hw.init = &(struct clk_init_data){
169 .name = "pll18",
170 .parent_names = (const char *[]){ "pxo" },
171 .num_parents = 1,
172 .ops = &clk_pll_ops,
173 },
174};
175
176enum {
177 P_PXO,
178 P_PLL8,
179 P_PLL3,
180 P_PLL0,
181 P_CXO,
182 P_PLL14,
183 P_PLL18,
184};
185
186static const struct parent_map gcc_pxo_pll8_map[] = {
187 { P_PXO, 0 },
188 { P_PLL8, 3 }
189};
190
191static const char * const gcc_pxo_pll8[] = {
192 "pxo",
193 "pll8_vote",
194};
195
196static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
197 { P_PXO, 0 },
198 { P_PLL8, 3 },
199 { P_CXO, 5 }
200};
201
202static const char * const gcc_pxo_pll8_cxo[] = {
203 "pxo",
204 "pll8_vote",
205 "cxo",
206};
207
208static const struct parent_map gcc_pxo_pll3_map[] = {
209 { P_PXO, 0 },
210 { P_PLL3, 1 }
211};
212
213static const struct parent_map gcc_pxo_pll3_sata_map[] = {
214 { P_PXO, 0 },
215 { P_PLL3, 6 }
216};
217
218static const char * const gcc_pxo_pll3[] = {
219 "pxo",
220 "pll3",
221};
222
223static const struct parent_map gcc_pxo_pll8_pll0[] = {
224 { P_PXO, 0 },
225 { P_PLL8, 3 },
226 { P_PLL0, 2 }
227};
228
229static const char * const gcc_pxo_pll8_pll0_map[] = {
230 "pxo",
231 "pll8_vote",
232 "pll0_vote",
233};
234
235static const struct parent_map gcc_pxo_pll8_pll14_pll18_pll0_map[] = {
236 { P_PXO, 0 },
237 { P_PLL8, 4 },
238 { P_PLL0, 2 },
239 { P_PLL14, 5 },
240 { P_PLL18, 1 }
241};
242
243static const char * const gcc_pxo_pll8_pll14_pll18_pll0[] = {
244 "pxo",
245 "pll8_vote",
246 "pll0_vote",
247 "pll14",
248 "pll18",
249};
250
251static struct freq_tbl clk_tbl_gsbi_uart[] = {
252 { 1843200, P_PLL8, 2, 6, 625 },
253 { 3686400, P_PLL8, 2, 12, 625 },
254 { 7372800, P_PLL8, 2, 24, 625 },
255 { 14745600, P_PLL8, 2, 48, 625 },
256 { 16000000, P_PLL8, 4, 1, 6 },
257 { 24000000, P_PLL8, 4, 1, 4 },
258 { 32000000, P_PLL8, 4, 1, 3 },
259 { 40000000, P_PLL8, 1, 5, 48 },
260 { 46400000, P_PLL8, 1, 29, 240 },
261 { 48000000, P_PLL8, 4, 1, 2 },
262 { 51200000, P_PLL8, 1, 2, 15 },
263 { 56000000, P_PLL8, 1, 7, 48 },
264 { 58982400, P_PLL8, 1, 96, 625 },
265 { 64000000, P_PLL8, 2, 1, 3 },
266 { }
267};
268
269static struct clk_rcg gsbi1_uart_src = {
270 .ns_reg = 0x29d4,
271 .md_reg = 0x29d0,
272 .mn = {
273 .mnctr_en_bit = 8,
274 .mnctr_reset_bit = 7,
275 .mnctr_mode_shift = 5,
276 .n_val_shift = 16,
277 .m_val_shift = 16,
278 .width = 16,
279 },
280 .p = {
281 .pre_div_shift = 3,
282 .pre_div_width = 2,
283 },
284 .s = {
285 .src_sel_shift = 0,
286 .parent_map = gcc_pxo_pll8_map,
287 },
288 .freq_tbl = clk_tbl_gsbi_uart,
289 .clkr = {
290 .enable_reg = 0x29d4,
291 .enable_mask = BIT(11),
292 .hw.init = &(struct clk_init_data){
293 .name = "gsbi1_uart_src",
294 .parent_names = gcc_pxo_pll8,
295 .num_parents = 2,
296 .ops = &clk_rcg_ops,
297 .flags = CLK_SET_PARENT_GATE,
298 },
299 },
300};
301
302static struct clk_branch gsbi1_uart_clk = {
303 .halt_reg = 0x2fcc,
304 .halt_bit = 12,
305 .clkr = {
306 .enable_reg = 0x29d4,
307 .enable_mask = BIT(9),
308 .hw.init = &(struct clk_init_data){
309 .name = "gsbi1_uart_clk",
310 .parent_names = (const char *[]){
311 "gsbi1_uart_src",
312 },
313 .num_parents = 1,
314 .ops = &clk_branch_ops,
315 .flags = CLK_SET_RATE_PARENT,
316 },
317 },
318};
319
320static struct clk_rcg gsbi2_uart_src = {
321 .ns_reg = 0x29f4,
322 .md_reg = 0x29f0,
323 .mn = {
324 .mnctr_en_bit = 8,
325 .mnctr_reset_bit = 7,
326 .mnctr_mode_shift = 5,
327 .n_val_shift = 16,
328 .m_val_shift = 16,
329 .width = 16,
330 },
331 .p = {
332 .pre_div_shift = 3,
333 .pre_div_width = 2,
334 },
335 .s = {
336 .src_sel_shift = 0,
337 .parent_map = gcc_pxo_pll8_map,
338 },
339 .freq_tbl = clk_tbl_gsbi_uart,
340 .clkr = {
341 .enable_reg = 0x29f4,
342 .enable_mask = BIT(11),
343 .hw.init = &(struct clk_init_data){
344 .name = "gsbi2_uart_src",
345 .parent_names = gcc_pxo_pll8,
346 .num_parents = 2,
347 .ops = &clk_rcg_ops,
348 .flags = CLK_SET_PARENT_GATE,
349 },
350 },
351};
352
353static struct clk_branch gsbi2_uart_clk = {
354 .halt_reg = 0x2fcc,
355 .halt_bit = 8,
356 .clkr = {
357 .enable_reg = 0x29f4,
358 .enable_mask = BIT(9),
359 .hw.init = &(struct clk_init_data){
360 .name = "gsbi2_uart_clk",
361 .parent_names = (const char *[]){
362 "gsbi2_uart_src",
363 },
364 .num_parents = 1,
365 .ops = &clk_branch_ops,
366 .flags = CLK_SET_RATE_PARENT,
367 },
368 },
369};
370
371static struct clk_rcg gsbi4_uart_src = {
372 .ns_reg = 0x2a34,
373 .md_reg = 0x2a30,
374 .mn = {
375 .mnctr_en_bit = 8,
376 .mnctr_reset_bit = 7,
377 .mnctr_mode_shift = 5,
378 .n_val_shift = 16,
379 .m_val_shift = 16,
380 .width = 16,
381 },
382 .p = {
383 .pre_div_shift = 3,
384 .pre_div_width = 2,
385 },
386 .s = {
387 .src_sel_shift = 0,
388 .parent_map = gcc_pxo_pll8_map,
389 },
390 .freq_tbl = clk_tbl_gsbi_uart,
391 .clkr = {
392 .enable_reg = 0x2a34,
393 .enable_mask = BIT(11),
394 .hw.init = &(struct clk_init_data){
395 .name = "gsbi4_uart_src",
396 .parent_names = gcc_pxo_pll8,
397 .num_parents = 2,
398 .ops = &clk_rcg_ops,
399 .flags = CLK_SET_PARENT_GATE,
400 },
401 },
402};
403
404static struct clk_branch gsbi4_uart_clk = {
405 .halt_reg = 0x2fd0,
406 .halt_bit = 26,
407 .clkr = {
408 .enable_reg = 0x2a34,
409 .enable_mask = BIT(9),
410 .hw.init = &(struct clk_init_data){
411 .name = "gsbi4_uart_clk",
412 .parent_names = (const char *[]){
413 "gsbi4_uart_src",
414 },
415 .num_parents = 1,
416 .ops = &clk_branch_ops,
417 .flags = CLK_SET_RATE_PARENT,
418 },
419 },
420};
421
422static struct clk_rcg gsbi5_uart_src = {
423 .ns_reg = 0x2a54,
424 .md_reg = 0x2a50,
425 .mn = {
426 .mnctr_en_bit = 8,
427 .mnctr_reset_bit = 7,
428 .mnctr_mode_shift = 5,
429 .n_val_shift = 16,
430 .m_val_shift = 16,
431 .width = 16,
432 },
433 .p = {
434 .pre_div_shift = 3,
435 .pre_div_width = 2,
436 },
437 .s = {
438 .src_sel_shift = 0,
439 .parent_map = gcc_pxo_pll8_map,
440 },
441 .freq_tbl = clk_tbl_gsbi_uart,
442 .clkr = {
443 .enable_reg = 0x2a54,
444 .enable_mask = BIT(11),
445 .hw.init = &(struct clk_init_data){
446 .name = "gsbi5_uart_src",
447 .parent_names = gcc_pxo_pll8,
448 .num_parents = 2,
449 .ops = &clk_rcg_ops,
450 .flags = CLK_SET_PARENT_GATE,
451 },
452 },
453};
454
455static struct clk_branch gsbi5_uart_clk = {
456 .halt_reg = 0x2fd0,
457 .halt_bit = 22,
458 .clkr = {
459 .enable_reg = 0x2a54,
460 .enable_mask = BIT(9),
461 .hw.init = &(struct clk_init_data){
462 .name = "gsbi5_uart_clk",
463 .parent_names = (const char *[]){
464 "gsbi5_uart_src",
465 },
466 .num_parents = 1,
467 .ops = &clk_branch_ops,
468 .flags = CLK_SET_RATE_PARENT,
469 },
470 },
471};
472
473static struct clk_rcg gsbi6_uart_src = {
474 .ns_reg = 0x2a74,
475 .md_reg = 0x2a70,
476 .mn = {
477 .mnctr_en_bit = 8,
478 .mnctr_reset_bit = 7,
479 .mnctr_mode_shift = 5,
480 .n_val_shift = 16,
481 .m_val_shift = 16,
482 .width = 16,
483 },
484 .p = {
485 .pre_div_shift = 3,
486 .pre_div_width = 2,
487 },
488 .s = {
489 .src_sel_shift = 0,
490 .parent_map = gcc_pxo_pll8_map,
491 },
492 .freq_tbl = clk_tbl_gsbi_uart,
493 .clkr = {
494 .enable_reg = 0x2a74,
495 .enable_mask = BIT(11),
496 .hw.init = &(struct clk_init_data){
497 .name = "gsbi6_uart_src",
498 .parent_names = gcc_pxo_pll8,
499 .num_parents = 2,
500 .ops = &clk_rcg_ops,
501 .flags = CLK_SET_PARENT_GATE,
502 },
503 },
504};
505
506static struct clk_branch gsbi6_uart_clk = {
507 .halt_reg = 0x2fd0,
508 .halt_bit = 18,
509 .clkr = {
510 .enable_reg = 0x2a74,
511 .enable_mask = BIT(9),
512 .hw.init = &(struct clk_init_data){
513 .name = "gsbi6_uart_clk",
514 .parent_names = (const char *[]){
515 "gsbi6_uart_src",
516 },
517 .num_parents = 1,
518 .ops = &clk_branch_ops,
519 .flags = CLK_SET_RATE_PARENT,
520 },
521 },
522};
523
524static struct clk_rcg gsbi7_uart_src = {
525 .ns_reg = 0x2a94,
526 .md_reg = 0x2a90,
527 .mn = {
528 .mnctr_en_bit = 8,
529 .mnctr_reset_bit = 7,
530 .mnctr_mode_shift = 5,
531 .n_val_shift = 16,
532 .m_val_shift = 16,
533 .width = 16,
534 },
535 .p = {
536 .pre_div_shift = 3,
537 .pre_div_width = 2,
538 },
539 .s = {
540 .src_sel_shift = 0,
541 .parent_map = gcc_pxo_pll8_map,
542 },
543 .freq_tbl = clk_tbl_gsbi_uart,
544 .clkr = {
545 .enable_reg = 0x2a94,
546 .enable_mask = BIT(11),
547 .hw.init = &(struct clk_init_data){
548 .name = "gsbi7_uart_src",
549 .parent_names = gcc_pxo_pll8,
550 .num_parents = 2,
551 .ops = &clk_rcg_ops,
552 .flags = CLK_SET_PARENT_GATE,
553 },
554 },
555};
556
557static struct clk_branch gsbi7_uart_clk = {
558 .halt_reg = 0x2fd0,
559 .halt_bit = 14,
560 .clkr = {
561 .enable_reg = 0x2a94,
562 .enable_mask = BIT(9),
563 .hw.init = &(struct clk_init_data){
564 .name = "gsbi7_uart_clk",
565 .parent_names = (const char *[]){
566 "gsbi7_uart_src",
567 },
568 .num_parents = 1,
569 .ops = &clk_branch_ops,
570 .flags = CLK_SET_RATE_PARENT,
571 },
572 },
573};
574
575static struct freq_tbl clk_tbl_gsbi_qup[] = {
576 { 1100000, P_PXO, 1, 2, 49 },
577 { 5400000, P_PXO, 1, 1, 5 },
578 { 10800000, P_PXO, 1, 2, 5 },
579 { 15060000, P_PLL8, 1, 2, 51 },
580 { 24000000, P_PLL8, 4, 1, 4 },
581 { 25000000, P_PXO, 1, 0, 0 },
582 { 25600000, P_PLL8, 1, 1, 15 },
583 { 48000000, P_PLL8, 4, 1, 2 },
584 { 51200000, P_PLL8, 1, 2, 15 },
585 { }
586};
587
588static struct clk_rcg gsbi1_qup_src = {
589 .ns_reg = 0x29cc,
590 .md_reg = 0x29c8,
591 .mn = {
592 .mnctr_en_bit = 8,
593 .mnctr_reset_bit = 7,
594 .mnctr_mode_shift = 5,
595 .n_val_shift = 16,
596 .m_val_shift = 16,
597 .width = 8,
598 },
599 .p = {
600 .pre_div_shift = 3,
601 .pre_div_width = 2,
602 },
603 .s = {
604 .src_sel_shift = 0,
605 .parent_map = gcc_pxo_pll8_map,
606 },
607 .freq_tbl = clk_tbl_gsbi_qup,
608 .clkr = {
609 .enable_reg = 0x29cc,
610 .enable_mask = BIT(11),
611 .hw.init = &(struct clk_init_data){
612 .name = "gsbi1_qup_src",
613 .parent_names = gcc_pxo_pll8,
614 .num_parents = 2,
615 .ops = &clk_rcg_ops,
616 .flags = CLK_SET_PARENT_GATE,
617 },
618 },
619};
620
621static struct clk_branch gsbi1_qup_clk = {
622 .halt_reg = 0x2fcc,
623 .halt_bit = 11,
624 .clkr = {
625 .enable_reg = 0x29cc,
626 .enable_mask = BIT(9),
627 .hw.init = &(struct clk_init_data){
628 .name = "gsbi1_qup_clk",
629 .parent_names = (const char *[]){ "gsbi1_qup_src" },
630 .num_parents = 1,
631 .ops = &clk_branch_ops,
632 .flags = CLK_SET_RATE_PARENT,
633 },
634 },
635};
636
637static struct clk_rcg gsbi2_qup_src = {
638 .ns_reg = 0x29ec,
639 .md_reg = 0x29e8,
640 .mn = {
641 .mnctr_en_bit = 8,
642 .mnctr_reset_bit = 7,
643 .mnctr_mode_shift = 5,
644 .n_val_shift = 16,
645 .m_val_shift = 16,
646 .width = 8,
647 },
648 .p = {
649 .pre_div_shift = 3,
650 .pre_div_width = 2,
651 },
652 .s = {
653 .src_sel_shift = 0,
654 .parent_map = gcc_pxo_pll8_map,
655 },
656 .freq_tbl = clk_tbl_gsbi_qup,
657 .clkr = {
658 .enable_reg = 0x29ec,
659 .enable_mask = BIT(11),
660 .hw.init = &(struct clk_init_data){
661 .name = "gsbi2_qup_src",
662 .parent_names = gcc_pxo_pll8,
663 .num_parents = 2,
664 .ops = &clk_rcg_ops,
665 .flags = CLK_SET_PARENT_GATE,
666 },
667 },
668};
669
670static struct clk_branch gsbi2_qup_clk = {
671 .halt_reg = 0x2fcc,
672 .halt_bit = 6,
673 .clkr = {
674 .enable_reg = 0x29ec,
675 .enable_mask = BIT(9),
676 .hw.init = &(struct clk_init_data){
677 .name = "gsbi2_qup_clk",
678 .parent_names = (const char *[]){ "gsbi2_qup_src" },
679 .num_parents = 1,
680 .ops = &clk_branch_ops,
681 .flags = CLK_SET_RATE_PARENT,
682 },
683 },
684};
685
686static struct clk_rcg gsbi4_qup_src = {
687 .ns_reg = 0x2a2c,
688 .md_reg = 0x2a28,
689 .mn = {
690 .mnctr_en_bit = 8,
691 .mnctr_reset_bit = 7,
692 .mnctr_mode_shift = 5,
693 .n_val_shift = 16,
694 .m_val_shift = 16,
695 .width = 8,
696 },
697 .p = {
698 .pre_div_shift = 3,
699 .pre_div_width = 2,
700 },
701 .s = {
702 .src_sel_shift = 0,
703 .parent_map = gcc_pxo_pll8_map,
704 },
705 .freq_tbl = clk_tbl_gsbi_qup,
706 .clkr = {
707 .enable_reg = 0x2a2c,
708 .enable_mask = BIT(11),
709 .hw.init = &(struct clk_init_data){
710 .name = "gsbi4_qup_src",
711 .parent_names = gcc_pxo_pll8,
712 .num_parents = 2,
713 .ops = &clk_rcg_ops,
714 .flags = CLK_SET_PARENT_GATE,
715 },
716 },
717};
718
719static struct clk_branch gsbi4_qup_clk = {
720 .halt_reg = 0x2fd0,
721 .halt_bit = 24,
722 .clkr = {
723 .enable_reg = 0x2a2c,
724 .enable_mask = BIT(9),
725 .hw.init = &(struct clk_init_data){
726 .name = "gsbi4_qup_clk",
727 .parent_names = (const char *[]){ "gsbi4_qup_src" },
728 .num_parents = 1,
729 .ops = &clk_branch_ops,
730 .flags = CLK_SET_RATE_PARENT,
731 },
732 },
733};
734
735static struct clk_rcg gsbi5_qup_src = {
736 .ns_reg = 0x2a4c,
737 .md_reg = 0x2a48,
738 .mn = {
739 .mnctr_en_bit = 8,
740 .mnctr_reset_bit = 7,
741 .mnctr_mode_shift = 5,
742 .n_val_shift = 16,
743 .m_val_shift = 16,
744 .width = 8,
745 },
746 .p = {
747 .pre_div_shift = 3,
748 .pre_div_width = 2,
749 },
750 .s = {
751 .src_sel_shift = 0,
752 .parent_map = gcc_pxo_pll8_map,
753 },
754 .freq_tbl = clk_tbl_gsbi_qup,
755 .clkr = {
756 .enable_reg = 0x2a4c,
757 .enable_mask = BIT(11),
758 .hw.init = &(struct clk_init_data){
759 .name = "gsbi5_qup_src",
760 .parent_names = gcc_pxo_pll8,
761 .num_parents = 2,
762 .ops = &clk_rcg_ops,
763 .flags = CLK_SET_PARENT_GATE,
764 },
765 },
766};
767
768static struct clk_branch gsbi5_qup_clk = {
769 .halt_reg = 0x2fd0,
770 .halt_bit = 20,
771 .clkr = {
772 .enable_reg = 0x2a4c,
773 .enable_mask = BIT(9),
774 .hw.init = &(struct clk_init_data){
775 .name = "gsbi5_qup_clk",
776 .parent_names = (const char *[]){ "gsbi5_qup_src" },
777 .num_parents = 1,
778 .ops = &clk_branch_ops,
779 .flags = CLK_SET_RATE_PARENT,
780 },
781 },
782};
783
784static struct clk_rcg gsbi6_qup_src = {
785 .ns_reg = 0x2a6c,
786 .md_reg = 0x2a68,
787 .mn = {
788 .mnctr_en_bit = 8,
789 .mnctr_reset_bit = 7,
790 .mnctr_mode_shift = 5,
791 .n_val_shift = 16,
792 .m_val_shift = 16,
793 .width = 8,
794 },
795 .p = {
796 .pre_div_shift = 3,
797 .pre_div_width = 2,
798 },
799 .s = {
800 .src_sel_shift = 0,
801 .parent_map = gcc_pxo_pll8_map,
802 },
803 .freq_tbl = clk_tbl_gsbi_qup,
804 .clkr = {
805 .enable_reg = 0x2a6c,
806 .enable_mask = BIT(11),
807 .hw.init = &(struct clk_init_data){
808 .name = "gsbi6_qup_src",
809 .parent_names = gcc_pxo_pll8,
810 .num_parents = 2,
811 .ops = &clk_rcg_ops,
812 .flags = CLK_SET_PARENT_GATE,
813 },
814 },
815};
816
817static struct clk_branch gsbi6_qup_clk = {
818 .halt_reg = 0x2fd0,
819 .halt_bit = 16,
820 .clkr = {
821 .enable_reg = 0x2a6c,
822 .enable_mask = BIT(9),
823 .hw.init = &(struct clk_init_data){
824 .name = "gsbi6_qup_clk",
825 .parent_names = (const char *[]){ "gsbi6_qup_src" },
826 .num_parents = 1,
827 .ops = &clk_branch_ops,
828 .flags = CLK_SET_RATE_PARENT,
829 },
830 },
831};
832
833static struct clk_rcg gsbi7_qup_src = {
834 .ns_reg = 0x2a8c,
835 .md_reg = 0x2a88,
836 .mn = {
837 .mnctr_en_bit = 8,
838 .mnctr_reset_bit = 7,
839 .mnctr_mode_shift = 5,
840 .n_val_shift = 16,
841 .m_val_shift = 16,
842 .width = 8,
843 },
844 .p = {
845 .pre_div_shift = 3,
846 .pre_div_width = 2,
847 },
848 .s = {
849 .src_sel_shift = 0,
850 .parent_map = gcc_pxo_pll8_map,
851 },
852 .freq_tbl = clk_tbl_gsbi_qup,
853 .clkr = {
854 .enable_reg = 0x2a8c,
855 .enable_mask = BIT(11),
856 .hw.init = &(struct clk_init_data){
857 .name = "gsbi7_qup_src",
858 .parent_names = gcc_pxo_pll8,
859 .num_parents = 2,
860 .ops = &clk_rcg_ops,
861 .flags = CLK_SET_PARENT_GATE,
862 },
863 },
864};
865
866static struct clk_branch gsbi7_qup_clk = {
867 .halt_reg = 0x2fd0,
868 .halt_bit = 12,
869 .clkr = {
870 .enable_reg = 0x2a8c,
871 .enable_mask = BIT(9),
872 .hw.init = &(struct clk_init_data){
873 .name = "gsbi7_qup_clk",
874 .parent_names = (const char *[]){ "gsbi7_qup_src" },
875 .num_parents = 1,
876 .ops = &clk_branch_ops,
877 .flags = CLK_SET_RATE_PARENT,
878 },
879 },
880};
881
882static struct clk_branch gsbi1_h_clk = {
883 .hwcg_reg = 0x29c0,
884 .hwcg_bit = 6,
885 .halt_reg = 0x2fcc,
886 .halt_bit = 13,
887 .clkr = {
888 .enable_reg = 0x29c0,
889 .enable_mask = BIT(4),
890 .hw.init = &(struct clk_init_data){
891 .name = "gsbi1_h_clk",
892 .ops = &clk_branch_ops,
893 },
894 },
895};
896
897static struct clk_branch gsbi2_h_clk = {
898 .hwcg_reg = 0x29e0,
899 .hwcg_bit = 6,
900 .halt_reg = 0x2fcc,
901 .halt_bit = 9,
902 .clkr = {
903 .enable_reg = 0x29e0,
904 .enable_mask = BIT(4),
905 .hw.init = &(struct clk_init_data){
906 .name = "gsbi2_h_clk",
907 .ops = &clk_branch_ops,
908 },
909 },
910};
911
912static struct clk_branch gsbi4_h_clk = {
913 .hwcg_reg = 0x2a20,
914 .hwcg_bit = 6,
915 .halt_reg = 0x2fd0,
916 .halt_bit = 27,
917 .clkr = {
918 .enable_reg = 0x2a20,
919 .enable_mask = BIT(4),
920 .hw.init = &(struct clk_init_data){
921 .name = "gsbi4_h_clk",
922 .ops = &clk_branch_ops,
923 },
924 },
925};
926
927static struct clk_branch gsbi5_h_clk = {
928 .hwcg_reg = 0x2a40,
929 .hwcg_bit = 6,
930 .halt_reg = 0x2fd0,
931 .halt_bit = 23,
932 .clkr = {
933 .enable_reg = 0x2a40,
934 .enable_mask = BIT(4),
935 .hw.init = &(struct clk_init_data){
936 .name = "gsbi5_h_clk",
937 .ops = &clk_branch_ops,
938 },
939 },
940};
941
942static struct clk_branch gsbi6_h_clk = {
943 .hwcg_reg = 0x2a60,
944 .hwcg_bit = 6,
945 .halt_reg = 0x2fd0,
946 .halt_bit = 19,
947 .clkr = {
948 .enable_reg = 0x2a60,
949 .enable_mask = BIT(4),
950 .hw.init = &(struct clk_init_data){
951 .name = "gsbi6_h_clk",
952 .ops = &clk_branch_ops,
953 },
954 },
955};
956
957static struct clk_branch gsbi7_h_clk = {
958 .hwcg_reg = 0x2a80,
959 .hwcg_bit = 6,
960 .halt_reg = 0x2fd0,
961 .halt_bit = 15,
962 .clkr = {
963 .enable_reg = 0x2a80,
964 .enable_mask = BIT(4),
965 .hw.init = &(struct clk_init_data){
966 .name = "gsbi7_h_clk",
967 .ops = &clk_branch_ops,
968 },
969 },
970};
971
972static const struct freq_tbl clk_tbl_gp[] = {
973 { 12500000, P_PXO, 2, 0, 0 },
974 { 25000000, P_PXO, 1, 0, 0 },
975 { 64000000, P_PLL8, 2, 1, 3 },
976 { 76800000, P_PLL8, 1, 1, 5 },
977 { 96000000, P_PLL8, 4, 0, 0 },
978 { 128000000, P_PLL8, 3, 0, 0 },
979 { 192000000, P_PLL8, 2, 0, 0 },
980 { }
981};
982
983static struct clk_rcg gp0_src = {
984 .ns_reg = 0x2d24,
985 .md_reg = 0x2d00,
986 .mn = {
987 .mnctr_en_bit = 8,
988 .mnctr_reset_bit = 7,
989 .mnctr_mode_shift = 5,
990 .n_val_shift = 16,
991 .m_val_shift = 16,
992 .width = 8,
993 },
994 .p = {
995 .pre_div_shift = 3,
996 .pre_div_width = 2,
997 },
998 .s = {
999 .src_sel_shift = 0,
1000 .parent_map = gcc_pxo_pll8_cxo_map,
1001 },
1002 .freq_tbl = clk_tbl_gp,
1003 .clkr = {
1004 .enable_reg = 0x2d24,
1005 .enable_mask = BIT(11),
1006 .hw.init = &(struct clk_init_data){
1007 .name = "gp0_src",
1008 .parent_names = gcc_pxo_pll8_cxo,
1009 .num_parents = 3,
1010 .ops = &clk_rcg_ops,
1011 .flags = CLK_SET_PARENT_GATE,
1012 },
1013 }
1014};
1015
1016static struct clk_branch gp0_clk = {
1017 .halt_reg = 0x2fd8,
1018 .halt_bit = 7,
1019 .clkr = {
1020 .enable_reg = 0x2d24,
1021 .enable_mask = BIT(9),
1022 .hw.init = &(struct clk_init_data){
1023 .name = "gp0_clk",
1024 .parent_names = (const char *[]){ "gp0_src" },
1025 .num_parents = 1,
1026 .ops = &clk_branch_ops,
1027 .flags = CLK_SET_RATE_PARENT,
1028 },
1029 },
1030};
1031
1032static struct clk_rcg gp1_src = {
1033 .ns_reg = 0x2d44,
1034 .md_reg = 0x2d40,
1035 .mn = {
1036 .mnctr_en_bit = 8,
1037 .mnctr_reset_bit = 7,
1038 .mnctr_mode_shift = 5,
1039 .n_val_shift = 16,
1040 .m_val_shift = 16,
1041 .width = 8,
1042 },
1043 .p = {
1044 .pre_div_shift = 3,
1045 .pre_div_width = 2,
1046 },
1047 .s = {
1048 .src_sel_shift = 0,
1049 .parent_map = gcc_pxo_pll8_cxo_map,
1050 },
1051 .freq_tbl = clk_tbl_gp,
1052 .clkr = {
1053 .enable_reg = 0x2d44,
1054 .enable_mask = BIT(11),
1055 .hw.init = &(struct clk_init_data){
1056 .name = "gp1_src",
1057 .parent_names = gcc_pxo_pll8_cxo,
1058 .num_parents = 3,
1059 .ops = &clk_rcg_ops,
1060 .flags = CLK_SET_RATE_GATE,
1061 },
1062 }
1063};
1064
1065static struct clk_branch gp1_clk = {
1066 .halt_reg = 0x2fd8,
1067 .halt_bit = 6,
1068 .clkr = {
1069 .enable_reg = 0x2d44,
1070 .enable_mask = BIT(9),
1071 .hw.init = &(struct clk_init_data){
1072 .name = "gp1_clk",
1073 .parent_names = (const char *[]){ "gp1_src" },
1074 .num_parents = 1,
1075 .ops = &clk_branch_ops,
1076 .flags = CLK_SET_RATE_PARENT,
1077 },
1078 },
1079};
1080
1081static struct clk_rcg gp2_src = {
1082 .ns_reg = 0x2d64,
1083 .md_reg = 0x2d60,
1084 .mn = {
1085 .mnctr_en_bit = 8,
1086 .mnctr_reset_bit = 7,
1087 .mnctr_mode_shift = 5,
1088 .n_val_shift = 16,
1089 .m_val_shift = 16,
1090 .width = 8,
1091 },
1092 .p = {
1093 .pre_div_shift = 3,
1094 .pre_div_width = 2,
1095 },
1096 .s = {
1097 .src_sel_shift = 0,
1098 .parent_map = gcc_pxo_pll8_cxo_map,
1099 },
1100 .freq_tbl = clk_tbl_gp,
1101 .clkr = {
1102 .enable_reg = 0x2d64,
1103 .enable_mask = BIT(11),
1104 .hw.init = &(struct clk_init_data){
1105 .name = "gp2_src",
1106 .parent_names = gcc_pxo_pll8_cxo,
1107 .num_parents = 3,
1108 .ops = &clk_rcg_ops,
1109 .flags = CLK_SET_RATE_GATE,
1110 },
1111 }
1112};
1113
1114static struct clk_branch gp2_clk = {
1115 .halt_reg = 0x2fd8,
1116 .halt_bit = 5,
1117 .clkr = {
1118 .enable_reg = 0x2d64,
1119 .enable_mask = BIT(9),
1120 .hw.init = &(struct clk_init_data){
1121 .name = "gp2_clk",
1122 .parent_names = (const char *[]){ "gp2_src" },
1123 .num_parents = 1,
1124 .ops = &clk_branch_ops,
1125 .flags = CLK_SET_RATE_PARENT,
1126 },
1127 },
1128};
1129
1130static struct clk_branch pmem_clk = {
1131 .hwcg_reg = 0x25a0,
1132 .hwcg_bit = 6,
1133 .halt_reg = 0x2fc8,
1134 .halt_bit = 20,
1135 .clkr = {
1136 .enable_reg = 0x25a0,
1137 .enable_mask = BIT(4),
1138 .hw.init = &(struct clk_init_data){
1139 .name = "pmem_clk",
1140 .ops = &clk_branch_ops,
1141 },
1142 },
1143};
1144
1145static struct clk_rcg prng_src = {
1146 .ns_reg = 0x2e80,
1147 .p = {
1148 .pre_div_shift = 3,
1149 .pre_div_width = 4,
1150 },
1151 .s = {
1152 .src_sel_shift = 0,
1153 .parent_map = gcc_pxo_pll8_map,
1154 },
1155 .clkr = {
1156 .hw.init = &(struct clk_init_data){
1157 .name = "prng_src",
1158 .parent_names = gcc_pxo_pll8,
1159 .num_parents = 2,
1160 .ops = &clk_rcg_ops,
1161 },
1162 },
1163};
1164
1165static struct clk_branch prng_clk = {
1166 .halt_reg = 0x2fd8,
1167 .halt_check = BRANCH_HALT_VOTED,
1168 .halt_bit = 10,
1169 .clkr = {
1170 .enable_reg = 0x3080,
1171 .enable_mask = BIT(10),
1172 .hw.init = &(struct clk_init_data){
1173 .name = "prng_clk",
1174 .parent_names = (const char *[]){ "prng_src" },
1175 .num_parents = 1,
1176 .ops = &clk_branch_ops,
1177 },
1178 },
1179};
1180
1181static const struct freq_tbl clk_tbl_sdc[] = {
1182 { 200000, P_PXO, 2, 2, 125 },
1183 { 400000, P_PLL8, 4, 1, 240 },
1184 { 16000000, P_PLL8, 4, 1, 6 },
1185 { 17070000, P_PLL8, 1, 2, 45 },
1186 { 20210000, P_PLL8, 1, 1, 19 },
1187 { 24000000, P_PLL8, 4, 1, 4 },
1188 { 48000000, P_PLL8, 4, 1, 2 },
1189 { 64000000, P_PLL8, 3, 1, 2 },
1190 { 96000000, P_PLL8, 4, 0, 0 },
1191 { 192000000, P_PLL8, 2, 0, 0 },
1192 { }
1193};
1194
1195static struct clk_rcg sdc1_src = {
1196 .ns_reg = 0x282c,
1197 .md_reg = 0x2828,
1198 .mn = {
1199 .mnctr_en_bit = 8,
1200 .mnctr_reset_bit = 7,
1201 .mnctr_mode_shift = 5,
1202 .n_val_shift = 16,
1203 .m_val_shift = 16,
1204 .width = 8,
1205 },
1206 .p = {
1207 .pre_div_shift = 3,
1208 .pre_div_width = 2,
1209 },
1210 .s = {
1211 .src_sel_shift = 0,
1212 .parent_map = gcc_pxo_pll8_map,
1213 },
1214 .freq_tbl = clk_tbl_sdc,
1215 .clkr = {
1216 .enable_reg = 0x282c,
1217 .enable_mask = BIT(11),
1218 .hw.init = &(struct clk_init_data){
1219 .name = "sdc1_src",
1220 .parent_names = gcc_pxo_pll8,
1221 .num_parents = 2,
1222 .ops = &clk_rcg_ops,
1223 .flags = CLK_SET_RATE_GATE,
1224 },
1225 }
1226};
1227
1228static struct clk_branch sdc1_clk = {
1229 .halt_reg = 0x2fc8,
1230 .halt_bit = 6,
1231 .clkr = {
1232 .enable_reg = 0x282c,
1233 .enable_mask = BIT(9),
1234 .hw.init = &(struct clk_init_data){
1235 .name = "sdc1_clk",
1236 .parent_names = (const char *[]){ "sdc1_src" },
1237 .num_parents = 1,
1238 .ops = &clk_branch_ops,
1239 .flags = CLK_SET_RATE_PARENT,
1240 },
1241 },
1242};
1243
1244static struct clk_rcg sdc3_src = {
1245 .ns_reg = 0x286c,
1246 .md_reg = 0x2868,
1247 .mn = {
1248 .mnctr_en_bit = 8,
1249 .mnctr_reset_bit = 7,
1250 .mnctr_mode_shift = 5,
1251 .n_val_shift = 16,
1252 .m_val_shift = 16,
1253 .width = 8,
1254 },
1255 .p = {
1256 .pre_div_shift = 3,
1257 .pre_div_width = 2,
1258 },
1259 .s = {
1260 .src_sel_shift = 0,
1261 .parent_map = gcc_pxo_pll8_map,
1262 },
1263 .freq_tbl = clk_tbl_sdc,
1264 .clkr = {
1265 .enable_reg = 0x286c,
1266 .enable_mask = BIT(11),
1267 .hw.init = &(struct clk_init_data){
1268 .name = "sdc3_src",
1269 .parent_names = gcc_pxo_pll8,
1270 .num_parents = 2,
1271 .ops = &clk_rcg_ops,
1272 .flags = CLK_SET_RATE_GATE,
1273 },
1274 }
1275};
1276
1277static struct clk_branch sdc3_clk = {
1278 .halt_reg = 0x2fc8,
1279 .halt_bit = 4,
1280 .clkr = {
1281 .enable_reg = 0x286c,
1282 .enable_mask = BIT(9),
1283 .hw.init = &(struct clk_init_data){
1284 .name = "sdc3_clk",
1285 .parent_names = (const char *[]){ "sdc3_src" },
1286 .num_parents = 1,
1287 .ops = &clk_branch_ops,
1288 .flags = CLK_SET_RATE_PARENT,
1289 },
1290 },
1291};
1292
1293static struct clk_branch sdc1_h_clk = {
1294 .hwcg_reg = 0x2820,
1295 .hwcg_bit = 6,
1296 .halt_reg = 0x2fc8,
1297 .halt_bit = 11,
1298 .clkr = {
1299 .enable_reg = 0x2820,
1300 .enable_mask = BIT(4),
1301 .hw.init = &(struct clk_init_data){
1302 .name = "sdc1_h_clk",
1303 .ops = &clk_branch_ops,
1304 },
1305 },
1306};
1307
1308static struct clk_branch sdc3_h_clk = {
1309 .hwcg_reg = 0x2860,
1310 .hwcg_bit = 6,
1311 .halt_reg = 0x2fc8,
1312 .halt_bit = 9,
1313 .clkr = {
1314 .enable_reg = 0x2860,
1315 .enable_mask = BIT(4),
1316 .hw.init = &(struct clk_init_data){
1317 .name = "sdc3_h_clk",
1318 .ops = &clk_branch_ops,
1319 },
1320 },
1321};
1322
1323static const struct freq_tbl clk_tbl_tsif_ref[] = {
1324 { 105000, P_PXO, 1, 1, 256 },
1325 { }
1326};
1327
1328static struct clk_rcg tsif_ref_src = {
1329 .ns_reg = 0x2710,
1330 .md_reg = 0x270c,
1331 .mn = {
1332 .mnctr_en_bit = 8,
1333 .mnctr_reset_bit = 7,
1334 .mnctr_mode_shift = 5,
1335 .n_val_shift = 16,
1336 .m_val_shift = 16,
1337 .width = 16,
1338 },
1339 .p = {
1340 .pre_div_shift = 3,
1341 .pre_div_width = 2,
1342 },
1343 .s = {
1344 .src_sel_shift = 0,
1345 .parent_map = gcc_pxo_pll8_map,
1346 },
1347 .freq_tbl = clk_tbl_tsif_ref,
1348 .clkr = {
1349 .enable_reg = 0x2710,
1350 .enable_mask = BIT(11),
1351 .hw.init = &(struct clk_init_data){
1352 .name = "tsif_ref_src",
1353 .parent_names = gcc_pxo_pll8,
1354 .num_parents = 2,
1355 .ops = &clk_rcg_ops,
1356 .flags = CLK_SET_RATE_GATE,
1357 },
1358 }
1359};
1360
1361static struct clk_branch tsif_ref_clk = {
1362 .halt_reg = 0x2fd4,
1363 .halt_bit = 5,
1364 .clkr = {
1365 .enable_reg = 0x2710,
1366 .enable_mask = BIT(9),
1367 .hw.init = &(struct clk_init_data){
1368 .name = "tsif_ref_clk",
1369 .parent_names = (const char *[]){ "tsif_ref_src" },
1370 .num_parents = 1,
1371 .ops = &clk_branch_ops,
1372 .flags = CLK_SET_RATE_PARENT,
1373 },
1374 },
1375};
1376
1377static struct clk_branch tsif_h_clk = {
1378 .hwcg_reg = 0x2700,
1379 .hwcg_bit = 6,
1380 .halt_reg = 0x2fd4,
1381 .halt_bit = 7,
1382 .clkr = {
1383 .enable_reg = 0x2700,
1384 .enable_mask = BIT(4),
1385 .hw.init = &(struct clk_init_data){
1386 .name = "tsif_h_clk",
1387 .ops = &clk_branch_ops,
1388 },
1389 },
1390};
1391
1392static struct clk_branch dma_bam_h_clk = {
1393 .hwcg_reg = 0x25c0,
1394 .hwcg_bit = 6,
1395 .halt_reg = 0x2fc8,
1396 .halt_bit = 12,
1397 .clkr = {
1398 .enable_reg = 0x25c0,
1399 .enable_mask = BIT(4),
1400 .hw.init = &(struct clk_init_data){
1401 .name = "dma_bam_h_clk",
1402 .ops = &clk_branch_ops,
1403 },
1404 },
1405};
1406
1407static struct clk_branch adm0_clk = {
1408 .halt_reg = 0x2fdc,
1409 .halt_check = BRANCH_HALT_VOTED,
1410 .halt_bit = 12,
1411 .clkr = {
1412 .enable_reg = 0x3080,
1413 .enable_mask = BIT(2),
1414 .hw.init = &(struct clk_init_data){
1415 .name = "adm0_clk",
1416 .ops = &clk_branch_ops,
1417 },
1418 },
1419};
1420
1421static struct clk_branch adm0_pbus_clk = {
1422 .hwcg_reg = 0x2208,
1423 .hwcg_bit = 6,
1424 .halt_reg = 0x2fdc,
1425 .halt_check = BRANCH_HALT_VOTED,
1426 .halt_bit = 11,
1427 .clkr = {
1428 .enable_reg = 0x3080,
1429 .enable_mask = BIT(3),
1430 .hw.init = &(struct clk_init_data){
1431 .name = "adm0_pbus_clk",
1432 .ops = &clk_branch_ops,
1433 },
1434 },
1435};
1436
1437static struct clk_branch pmic_arb0_h_clk = {
1438 .halt_reg = 0x2fd8,
1439 .halt_check = BRANCH_HALT_VOTED,
1440 .halt_bit = 22,
1441 .clkr = {
1442 .enable_reg = 0x3080,
1443 .enable_mask = BIT(8),
1444 .hw.init = &(struct clk_init_data){
1445 .name = "pmic_arb0_h_clk",
1446 .ops = &clk_branch_ops,
1447 },
1448 },
1449};
1450
1451static struct clk_branch pmic_arb1_h_clk = {
1452 .halt_reg = 0x2fd8,
1453 .halt_check = BRANCH_HALT_VOTED,
1454 .halt_bit = 21,
1455 .clkr = {
1456 .enable_reg = 0x3080,
1457 .enable_mask = BIT(9),
1458 .hw.init = &(struct clk_init_data){
1459 .name = "pmic_arb1_h_clk",
1460 .ops = &clk_branch_ops,
1461 },
1462 },
1463};
1464
1465static struct clk_branch pmic_ssbi2_clk = {
1466 .halt_reg = 0x2fd8,
1467 .halt_check = BRANCH_HALT_VOTED,
1468 .halt_bit = 23,
1469 .clkr = {
1470 .enable_reg = 0x3080,
1471 .enable_mask = BIT(7),
1472 .hw.init = &(struct clk_init_data){
1473 .name = "pmic_ssbi2_clk",
1474 .ops = &clk_branch_ops,
1475 },
1476 },
1477};
1478
1479static struct clk_branch rpm_msg_ram_h_clk = {
1480 .hwcg_reg = 0x27e0,
1481 .hwcg_bit = 6,
1482 .halt_reg = 0x2fd8,
1483 .halt_check = BRANCH_HALT_VOTED,
1484 .halt_bit = 12,
1485 .clkr = {
1486 .enable_reg = 0x3080,
1487 .enable_mask = BIT(6),
1488 .hw.init = &(struct clk_init_data){
1489 .name = "rpm_msg_ram_h_clk",
1490 .ops = &clk_branch_ops,
1491 },
1492 },
1493};
1494
1495static const struct freq_tbl clk_tbl_pcie_ref[] = {
1496 { 100000000, P_PLL3, 12, 0, 0 },
1497 { }
1498};
1499
1500static struct clk_rcg pcie_ref_src = {
1501 .ns_reg = 0x3860,
1502 .p = {
1503 .pre_div_shift = 3,
1504 .pre_div_width = 4,
1505 },
1506 .s = {
1507 .src_sel_shift = 0,
1508 .parent_map = gcc_pxo_pll3_map,
1509 },
1510 .freq_tbl = clk_tbl_pcie_ref,
1511 .clkr = {
1512 .enable_reg = 0x3860,
1513 .enable_mask = BIT(11),
1514 .hw.init = &(struct clk_init_data){
1515 .name = "pcie_ref_src",
1516 .parent_names = gcc_pxo_pll3,
1517 .num_parents = 2,
1518 .ops = &clk_rcg_ops,
1519 .flags = CLK_SET_RATE_GATE,
1520 },
1521 },
1522};
1523
1524static struct clk_branch pcie_ref_src_clk = {
1525 .halt_reg = 0x2fdc,
1526 .halt_bit = 30,
1527 .clkr = {
1528 .enable_reg = 0x3860,
1529 .enable_mask = BIT(9),
1530 .hw.init = &(struct clk_init_data){
1531 .name = "pcie_ref_src_clk",
1532 .parent_names = (const char *[]){ "pcie_ref_src" },
1533 .num_parents = 1,
1534 .ops = &clk_branch_ops,
1535 .flags = CLK_SET_RATE_PARENT,
1536 },
1537 },
1538};
1539
1540static struct clk_branch pcie_a_clk = {
1541 .halt_reg = 0x2fc0,
1542 .halt_bit = 13,
1543 .clkr = {
1544 .enable_reg = 0x22c0,
1545 .enable_mask = BIT(4),
1546 .hw.init = &(struct clk_init_data){
1547 .name = "pcie_a_clk",
1548 .ops = &clk_branch_ops,
1549 },
1550 },
1551};
1552
1553static struct clk_branch pcie_aux_clk = {
1554 .halt_reg = 0x2fdc,
1555 .halt_bit = 31,
1556 .clkr = {
1557 .enable_reg = 0x22c8,
1558 .enable_mask = BIT(4),
1559 .hw.init = &(struct clk_init_data){
1560 .name = "pcie_aux_clk",
1561 .ops = &clk_branch_ops,
1562 },
1563 },
1564};
1565
1566static struct clk_branch pcie_h_clk = {
1567 .halt_reg = 0x2fd4,
1568 .halt_bit = 8,
1569 .clkr = {
1570 .enable_reg = 0x22cc,
1571 .enable_mask = BIT(4),
1572 .hw.init = &(struct clk_init_data){
1573 .name = "pcie_h_clk",
1574 .ops = &clk_branch_ops,
1575 },
1576 },
1577};
1578
1579static struct clk_branch pcie_phy_clk = {
1580 .halt_reg = 0x2fdc,
1581 .halt_bit = 29,
1582 .clkr = {
1583 .enable_reg = 0x22d0,
1584 .enable_mask = BIT(4),
1585 .hw.init = &(struct clk_init_data){
1586 .name = "pcie_phy_clk",
1587 .ops = &clk_branch_ops,
1588 },
1589 },
1590};
1591
1592static struct clk_rcg pcie1_ref_src = {
1593 .ns_reg = 0x3aa0,
1594 .p = {
1595 .pre_div_shift = 3,
1596 .pre_div_width = 4,
1597 },
1598 .s = {
1599 .src_sel_shift = 0,
1600 .parent_map = gcc_pxo_pll3_map,
1601 },
1602 .freq_tbl = clk_tbl_pcie_ref,
1603 .clkr = {
1604 .enable_reg = 0x3aa0,
1605 .enable_mask = BIT(11),
1606 .hw.init = &(struct clk_init_data){
1607 .name = "pcie1_ref_src",
1608 .parent_names = gcc_pxo_pll3,
1609 .num_parents = 2,
1610 .ops = &clk_rcg_ops,
1611 .flags = CLK_SET_RATE_GATE,
1612 },
1613 },
1614};
1615
1616static struct clk_branch pcie1_ref_src_clk = {
1617 .halt_reg = 0x2fdc,
1618 .halt_bit = 27,
1619 .clkr = {
1620 .enable_reg = 0x3aa0,
1621 .enable_mask = BIT(9),
1622 .hw.init = &(struct clk_init_data){
1623 .name = "pcie1_ref_src_clk",
1624 .parent_names = (const char *[]){ "pcie1_ref_src" },
1625 .num_parents = 1,
1626 .ops = &clk_branch_ops,
1627 .flags = CLK_SET_RATE_PARENT,
1628 },
1629 },
1630};
1631
1632static struct clk_branch pcie1_a_clk = {
1633 .halt_reg = 0x2fc0,
1634 .halt_bit = 10,
1635 .clkr = {
1636 .enable_reg = 0x3a80,
1637 .enable_mask = BIT(4),
1638 .hw.init = &(struct clk_init_data){
1639 .name = "pcie1_a_clk",
1640 .ops = &clk_branch_ops,
1641 },
1642 },
1643};
1644
1645static struct clk_branch pcie1_aux_clk = {
1646 .halt_reg = 0x2fdc,
1647 .halt_bit = 28,
1648 .clkr = {
1649 .enable_reg = 0x3a88,
1650 .enable_mask = BIT(4),
1651 .hw.init = &(struct clk_init_data){
1652 .name = "pcie1_aux_clk",
1653 .ops = &clk_branch_ops,
1654 },
1655 },
1656};
1657
1658static struct clk_branch pcie1_h_clk = {
1659 .halt_reg = 0x2fd4,
1660 .halt_bit = 9,
1661 .clkr = {
1662 .enable_reg = 0x3a8c,
1663 .enable_mask = BIT(4),
1664 .hw.init = &(struct clk_init_data){
1665 .name = "pcie1_h_clk",
1666 .ops = &clk_branch_ops,
1667 },
1668 },
1669};
1670
1671static struct clk_branch pcie1_phy_clk = {
1672 .halt_reg = 0x2fdc,
1673 .halt_bit = 26,
1674 .clkr = {
1675 .enable_reg = 0x3a90,
1676 .enable_mask = BIT(4),
1677 .hw.init = &(struct clk_init_data){
1678 .name = "pcie1_phy_clk",
1679 .ops = &clk_branch_ops,
1680 },
1681 },
1682};
1683
1684static struct clk_rcg pcie2_ref_src = {
1685 .ns_reg = 0x3ae0,
1686 .p = {
1687 .pre_div_shift = 3,
1688 .pre_div_width = 4,
1689 },
1690 .s = {
1691 .src_sel_shift = 0,
1692 .parent_map = gcc_pxo_pll3_map,
1693 },
1694 .freq_tbl = clk_tbl_pcie_ref,
1695 .clkr = {
1696 .enable_reg = 0x3ae0,
1697 .enable_mask = BIT(11),
1698 .hw.init = &(struct clk_init_data){
1699 .name = "pcie2_ref_src",
1700 .parent_names = gcc_pxo_pll3,
1701 .num_parents = 2,
1702 .ops = &clk_rcg_ops,
1703 .flags = CLK_SET_RATE_GATE,
1704 },
1705 },
1706};
1707
1708static struct clk_branch pcie2_ref_src_clk = {
1709 .halt_reg = 0x2fdc,
1710 .halt_bit = 24,
1711 .clkr = {
1712 .enable_reg = 0x3ae0,
1713 .enable_mask = BIT(9),
1714 .hw.init = &(struct clk_init_data){
1715 .name = "pcie2_ref_src_clk",
1716 .parent_names = (const char *[]){ "pcie2_ref_src" },
1717 .num_parents = 1,
1718 .ops = &clk_branch_ops,
1719 .flags = CLK_SET_RATE_PARENT,
1720 },
1721 },
1722};
1723
1724static struct clk_branch pcie2_a_clk = {
1725 .halt_reg = 0x2fc0,
1726 .halt_bit = 9,
1727 .clkr = {
1728 .enable_reg = 0x3ac0,
1729 .enable_mask = BIT(4),
1730 .hw.init = &(struct clk_init_data){
1731 .name = "pcie2_a_clk",
1732 .ops = &clk_branch_ops,
1733 },
1734 },
1735};
1736
1737static struct clk_branch pcie2_aux_clk = {
1738 .halt_reg = 0x2fdc,
1739 .halt_bit = 25,
1740 .clkr = {
1741 .enable_reg = 0x3ac8,
1742 .enable_mask = BIT(4),
1743 .hw.init = &(struct clk_init_data){
1744 .name = "pcie2_aux_clk",
1745 .ops = &clk_branch_ops,
1746 },
1747 },
1748};
1749
1750static struct clk_branch pcie2_h_clk = {
1751 .halt_reg = 0x2fd4,
1752 .halt_bit = 10,
1753 .clkr = {
1754 .enable_reg = 0x3acc,
1755 .enable_mask = BIT(4),
1756 .hw.init = &(struct clk_init_data){
1757 .name = "pcie2_h_clk",
1758 .ops = &clk_branch_ops,
1759 },
1760 },
1761};
1762
1763static struct clk_branch pcie2_phy_clk = {
1764 .halt_reg = 0x2fdc,
1765 .halt_bit = 23,
1766 .clkr = {
1767 .enable_reg = 0x3ad0,
1768 .enable_mask = BIT(4),
1769 .hw.init = &(struct clk_init_data){
1770 .name = "pcie2_phy_clk",
1771 .ops = &clk_branch_ops,
1772 },
1773 },
1774};
1775
1776static const struct freq_tbl clk_tbl_sata_ref[] = {
1777 { 100000000, P_PLL3, 12, 0, 0 },
1778 { }
1779};
1780
1781static struct clk_rcg sata_ref_src = {
1782 .ns_reg = 0x2c08,
1783 .p = {
1784 .pre_div_shift = 3,
1785 .pre_div_width = 4,
1786 },
1787 .s = {
1788 .src_sel_shift = 0,
1789 .parent_map = gcc_pxo_pll3_sata_map,
1790 },
1791 .freq_tbl = clk_tbl_sata_ref,
1792 .clkr = {
1793 .enable_reg = 0x2c08,
1794 .enable_mask = BIT(7),
1795 .hw.init = &(struct clk_init_data){
1796 .name = "sata_ref_src",
1797 .parent_names = gcc_pxo_pll3,
1798 .num_parents = 2,
1799 .ops = &clk_rcg_ops,
1800 .flags = CLK_SET_RATE_GATE,
1801 },
1802 },
1803};
1804
1805static struct clk_branch sata_rxoob_clk = {
1806 .halt_reg = 0x2fdc,
1807 .halt_bit = 20,
1808 .clkr = {
1809 .enable_reg = 0x2c0c,
1810 .enable_mask = BIT(4),
1811 .hw.init = &(struct clk_init_data){
1812 .name = "sata_rxoob_clk",
1813 .parent_names = (const char *[]){ "sata_ref_src" },
1814 .num_parents = 1,
1815 .ops = &clk_branch_ops,
1816 .flags = CLK_SET_RATE_PARENT,
1817 },
1818 },
1819};
1820
1821static struct clk_branch sata_pmalive_clk = {
1822 .halt_reg = 0x2fdc,
1823 .halt_bit = 19,
1824 .clkr = {
1825 .enable_reg = 0x2c10,
1826 .enable_mask = BIT(4),
1827 .hw.init = &(struct clk_init_data){
1828 .name = "sata_pmalive_clk",
1829 .parent_names = (const char *[]){ "sata_ref_src" },
1830 .num_parents = 1,
1831 .ops = &clk_branch_ops,
1832 .flags = CLK_SET_RATE_PARENT,
1833 },
1834 },
1835};
1836
1837static struct clk_branch sata_phy_ref_clk = {
1838 .halt_reg = 0x2fdc,
1839 .halt_bit = 18,
1840 .clkr = {
1841 .enable_reg = 0x2c14,
1842 .enable_mask = BIT(4),
1843 .hw.init = &(struct clk_init_data){
1844 .name = "sata_phy_ref_clk",
1845 .parent_names = (const char *[]){ "pxo" },
1846 .num_parents = 1,
1847 .ops = &clk_branch_ops,
1848 },
1849 },
1850};
1851
1852static struct clk_branch sata_a_clk = {
1853 .halt_reg = 0x2fc0,
1854 .halt_bit = 12,
1855 .clkr = {
1856 .enable_reg = 0x2c20,
1857 .enable_mask = BIT(4),
1858 .hw.init = &(struct clk_init_data){
1859 .name = "sata_a_clk",
1860 .ops = &clk_branch_ops,
1861 },
1862 },
1863};
1864
1865static struct clk_branch sata_h_clk = {
1866 .halt_reg = 0x2fdc,
1867 .halt_bit = 21,
1868 .clkr = {
1869 .enable_reg = 0x2c00,
1870 .enable_mask = BIT(4),
1871 .hw.init = &(struct clk_init_data){
1872 .name = "sata_h_clk",
1873 .ops = &clk_branch_ops,
1874 },
1875 },
1876};
1877
1878static struct clk_branch sfab_sata_s_h_clk = {
1879 .halt_reg = 0x2fc4,
1880 .halt_bit = 14,
1881 .clkr = {
1882 .enable_reg = 0x2480,
1883 .enable_mask = BIT(4),
1884 .hw.init = &(struct clk_init_data){
1885 .name = "sfab_sata_s_h_clk",
1886 .ops = &clk_branch_ops,
1887 },
1888 },
1889};
1890
1891static struct clk_branch sata_phy_cfg_clk = {
1892 .halt_reg = 0x2fcc,
1893 .halt_bit = 14,
1894 .clkr = {
1895 .enable_reg = 0x2c40,
1896 .enable_mask = BIT(4),
1897 .hw.init = &(struct clk_init_data){
1898 .name = "sata_phy_cfg_clk",
1899 .ops = &clk_branch_ops,
1900 },
1901 },
1902};
1903
1904static const struct freq_tbl clk_tbl_usb30_master[] = {
1905 { 125000000, P_PLL0, 1, 5, 32 },
1906 { }
1907};
1908
1909static struct clk_rcg usb30_master_clk_src = {
1910 .ns_reg = 0x3b2c,
1911 .md_reg = 0x3b28,
1912 .mn = {
1913 .mnctr_en_bit = 8,
1914 .mnctr_reset_bit = 7,
1915 .mnctr_mode_shift = 5,
1916 .n_val_shift = 16,
1917 .m_val_shift = 16,
1918 .width = 8,
1919 },
1920 .p = {
1921 .pre_div_shift = 3,
1922 .pre_div_width = 2,
1923 },
1924 .s = {
1925 .src_sel_shift = 0,
1926 .parent_map = gcc_pxo_pll8_pll0,
1927 },
1928 .freq_tbl = clk_tbl_usb30_master,
1929 .clkr = {
1930 .enable_reg = 0x3b2c,
1931 .enable_mask = BIT(11),
1932 .hw.init = &(struct clk_init_data){
1933 .name = "usb30_master_ref_src",
1934 .parent_names = gcc_pxo_pll8_pll0_map,
1935 .num_parents = 3,
1936 .ops = &clk_rcg_ops,
1937 .flags = CLK_SET_RATE_GATE,
1938 },
1939 },
1940};
1941
1942static struct clk_branch usb30_0_branch_clk = {
1943 .halt_reg = 0x2fc4,
1944 .halt_bit = 22,
1945 .clkr = {
1946 .enable_reg = 0x3b24,
1947 .enable_mask = BIT(4),
1948 .hw.init = &(struct clk_init_data){
1949 .name = "usb30_0_branch_clk",
1950 .parent_names = (const char *[]){ "usb30_master_ref_src", },
1951 .num_parents = 1,
1952 .ops = &clk_branch_ops,
1953 .flags = CLK_SET_RATE_PARENT,
1954 },
1955 },
1956};
1957
1958static struct clk_branch usb30_1_branch_clk = {
1959 .halt_reg = 0x2fc4,
1960 .halt_bit = 17,
1961 .clkr = {
1962 .enable_reg = 0x3b34,
1963 .enable_mask = BIT(4),
1964 .hw.init = &(struct clk_init_data){
1965 .name = "usb30_1_branch_clk",
1966 .parent_names = (const char *[]){ "usb30_master_ref_src", },
1967 .num_parents = 1,
1968 .ops = &clk_branch_ops,
1969 .flags = CLK_SET_RATE_PARENT,
1970 },
1971 },
1972};
1973
1974static const struct freq_tbl clk_tbl_usb30_utmi[] = {
1975 { 60000000, P_PLL8, 1, 5, 32 },
1976 { }
1977};
1978
1979static struct clk_rcg usb30_utmi_clk = {
1980 .ns_reg = 0x3b44,
1981 .md_reg = 0x3b40,
1982 .mn = {
1983 .mnctr_en_bit = 8,
1984 .mnctr_reset_bit = 7,
1985 .mnctr_mode_shift = 5,
1986 .n_val_shift = 16,
1987 .m_val_shift = 16,
1988 .width = 8,
1989 },
1990 .p = {
1991 .pre_div_shift = 3,
1992 .pre_div_width = 2,
1993 },
1994 .s = {
1995 .src_sel_shift = 0,
1996 .parent_map = gcc_pxo_pll8_pll0,
1997 },
1998 .freq_tbl = clk_tbl_usb30_utmi,
1999 .clkr = {
2000 .enable_reg = 0x3b44,
2001 .enable_mask = BIT(11),
2002 .hw.init = &(struct clk_init_data){
2003 .name = "usb30_utmi_clk",
2004 .parent_names = gcc_pxo_pll8_pll0_map,
2005 .num_parents = 3,
2006 .ops = &clk_rcg_ops,
2007 .flags = CLK_SET_RATE_GATE,
2008 },
2009 },
2010};
2011
2012static struct clk_branch usb30_0_utmi_clk_ctl = {
2013 .halt_reg = 0x2fc4,
2014 .halt_bit = 21,
2015 .clkr = {
2016 .enable_reg = 0x3b48,
2017 .enable_mask = BIT(4),
2018 .hw.init = &(struct clk_init_data){
2019 .name = "usb30_0_utmi_clk_ctl",
2020 .parent_names = (const char *[]){ "usb30_utmi_clk", },
2021 .num_parents = 1,
2022 .ops = &clk_branch_ops,
2023 .flags = CLK_SET_RATE_PARENT,
2024 },
2025 },
2026};
2027
2028static struct clk_branch usb30_1_utmi_clk_ctl = {
2029 .halt_reg = 0x2fc4,
2030 .halt_bit = 15,
2031 .clkr = {
2032 .enable_reg = 0x3b4c,
2033 .enable_mask = BIT(4),
2034 .hw.init = &(struct clk_init_data){
2035 .name = "usb30_1_utmi_clk_ctl",
2036 .parent_names = (const char *[]){ "usb30_utmi_clk", },
2037 .num_parents = 1,
2038 .ops = &clk_branch_ops,
2039 .flags = CLK_SET_RATE_PARENT,
2040 },
2041 },
2042};
2043
2044static const struct freq_tbl clk_tbl_usb[] = {
2045 { 60000000, P_PLL8, 1, 5, 32 },
2046 { }
2047};
2048
2049static struct clk_rcg usb_hs1_xcvr_clk_src = {
2050 .ns_reg = 0x290C,
2051 .md_reg = 0x2908,
2052 .mn = {
2053 .mnctr_en_bit = 8,
2054 .mnctr_reset_bit = 7,
2055 .mnctr_mode_shift = 5,
2056 .n_val_shift = 16,
2057 .m_val_shift = 16,
2058 .width = 8,
2059 },
2060 .p = {
2061 .pre_div_shift = 3,
2062 .pre_div_width = 2,
2063 },
2064 .s = {
2065 .src_sel_shift = 0,
2066 .parent_map = gcc_pxo_pll8_pll0,
2067 },
2068 .freq_tbl = clk_tbl_usb,
2069 .clkr = {
2070 .enable_reg = 0x2968,
2071 .enable_mask = BIT(11),
2072 .hw.init = &(struct clk_init_data){
2073 .name = "usb_hs1_xcvr_src",
2074 .parent_names = gcc_pxo_pll8_pll0_map,
2075 .num_parents = 3,
2076 .ops = &clk_rcg_ops,
2077 .flags = CLK_SET_RATE_GATE,
2078 },
2079 },
2080};
2081
2082static struct clk_branch usb_hs1_xcvr_clk = {
2083 .halt_reg = 0x2fcc,
2084 .halt_bit = 17,
2085 .clkr = {
2086 .enable_reg = 0x290c,
2087 .enable_mask = BIT(9),
2088 .hw.init = &(struct clk_init_data){
2089 .name = "usb_hs1_xcvr_clk",
2090 .parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
2091 .num_parents = 1,
2092 .ops = &clk_branch_ops,
2093 .flags = CLK_SET_RATE_PARENT,
2094 },
2095 },
2096};
2097
2098static struct clk_branch usb_hs1_h_clk = {
2099 .hwcg_reg = 0x2900,
2100 .hwcg_bit = 6,
2101 .halt_reg = 0x2fc8,
2102 .halt_bit = 1,
2103 .clkr = {
2104 .enable_reg = 0x2900,
2105 .enable_mask = BIT(4),
2106 .hw.init = &(struct clk_init_data){
2107 .name = "usb_hs1_h_clk",
2108 .ops = &clk_branch_ops,
2109 },
2110 },
2111};
2112
2113static struct clk_rcg usb_fs1_xcvr_clk_src = {
2114 .ns_reg = 0x2968,
2115 .md_reg = 0x2964,
2116 .mn = {
2117 .mnctr_en_bit = 8,
2118 .mnctr_reset_bit = 7,
2119 .mnctr_mode_shift = 5,
2120 .n_val_shift = 16,
2121 .m_val_shift = 16,
2122 .width = 8,
2123 },
2124 .p = {
2125 .pre_div_shift = 3,
2126 .pre_div_width = 2,
2127 },
2128 .s = {
2129 .src_sel_shift = 0,
2130 .parent_map = gcc_pxo_pll8_pll0,
2131 },
2132 .freq_tbl = clk_tbl_usb,
2133 .clkr = {
2134 .enable_reg = 0x2968,
2135 .enable_mask = BIT(11),
2136 .hw.init = &(struct clk_init_data){
2137 .name = "usb_fs1_xcvr_src",
2138 .parent_names = gcc_pxo_pll8_pll0_map,
2139 .num_parents = 3,
2140 .ops = &clk_rcg_ops,
2141 .flags = CLK_SET_RATE_GATE,
2142 },
2143 },
2144};
2145
2146static struct clk_branch usb_fs1_xcvr_clk = {
2147 .halt_reg = 0x2fcc,
2148 .halt_bit = 17,
2149 .clkr = {
2150 .enable_reg = 0x2968,
2151 .enable_mask = BIT(9),
2152 .hw.init = &(struct clk_init_data){
2153 .name = "usb_fs1_xcvr_clk",
2154 .parent_names = (const char *[]){ "usb_fs1_xcvr_src", },
2155 .num_parents = 1,
2156 .ops = &clk_branch_ops,
2157 .flags = CLK_SET_RATE_PARENT,
2158 },
2159 },
2160};
2161
2162static struct clk_branch usb_fs1_sys_clk = {
2163 .halt_reg = 0x2fcc,
2164 .halt_bit = 18,
2165 .clkr = {
2166 .enable_reg = 0x296c,
2167 .enable_mask = BIT(4),
2168 .hw.init = &(struct clk_init_data){
2169 .name = "usb_fs1_sys_clk",
2170 .parent_names = (const char *[]){ "usb_fs1_xcvr_src", },
2171 .num_parents = 1,
2172 .ops = &clk_branch_ops,
2173 .flags = CLK_SET_RATE_PARENT,
2174 },
2175 },
2176};
2177
2178static struct clk_branch usb_fs1_h_clk = {
2179 .halt_reg = 0x2fcc,
2180 .halt_bit = 19,
2181 .clkr = {
2182 .enable_reg = 0x2960,
2183 .enable_mask = BIT(4),
2184 .hw.init = &(struct clk_init_data){
2185 .name = "usb_fs1_h_clk",
2186 .ops = &clk_branch_ops,
2187 },
2188 },
2189};
2190
2191static struct clk_branch ebi2_clk = {
2192 .hwcg_reg = 0x3b00,
2193 .hwcg_bit = 6,
2194 .halt_reg = 0x2fcc,
2195 .halt_bit = 1,
2196 .clkr = {
2197 .enable_reg = 0x3b00,
2198 .enable_mask = BIT(4),
2199 .hw.init = &(struct clk_init_data){
2200 .name = "ebi2_clk",
2201 .ops = &clk_branch_ops,
2202 },
2203 },
2204};
2205
2206static struct clk_branch ebi2_aon_clk = {
2207 .halt_reg = 0x2fcc,
2208 .halt_bit = 0,
2209 .clkr = {
2210 .enable_reg = 0x3b00,
2211 .enable_mask = BIT(8),
2212 .hw.init = &(struct clk_init_data){
2213 .name = "ebi2_always_on_clk",
2214 .ops = &clk_branch_ops,
2215 },
2216 },
2217};
2218
2219static const struct freq_tbl clk_tbl_gmac[] = {
2220 { 133000000, P_PLL0, 1, 50, 301 },
2221 { 266000000, P_PLL0, 1, 127, 382 },
2222 { }
2223};
2224
2225static struct clk_dyn_rcg gmac_core1_src = {
2226 .ns_reg[0] = 0x3cac,
2227 .ns_reg[1] = 0x3cb0,
2228 .md_reg[0] = 0x3ca4,
2229 .md_reg[1] = 0x3ca8,
2230 .bank_reg = 0x3ca0,
2231 .mn[0] = {
2232 .mnctr_en_bit = 8,
2233 .mnctr_reset_bit = 7,
2234 .mnctr_mode_shift = 5,
2235 .n_val_shift = 16,
2236 .m_val_shift = 16,
2237 .width = 8,
2238 },
2239 .mn[1] = {
2240 .mnctr_en_bit = 8,
2241 .mnctr_reset_bit = 7,
2242 .mnctr_mode_shift = 5,
2243 .n_val_shift = 16,
2244 .m_val_shift = 16,
2245 .width = 8,
2246 },
2247 .s[0] = {
2248 .src_sel_shift = 0,
2249 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2250 },
2251 .s[1] = {
2252 .src_sel_shift = 0,
2253 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2254 },
2255 .p[0] = {
2256 .pre_div_shift = 3,
2257 .pre_div_width = 2,
2258 },
2259 .p[1] = {
2260 .pre_div_shift = 3,
2261 .pre_div_width = 2,
2262 },
2263 .mux_sel_bit = 0,
2264 .freq_tbl = clk_tbl_gmac,
2265 .clkr = {
2266 .enable_reg = 0x3ca0,
2267 .enable_mask = BIT(1),
2268 .hw.init = &(struct clk_init_data){
2269 .name = "gmac_core1_src",
2270 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2271 .num_parents = 5,
2272 .ops = &clk_dyn_rcg_ops,
2273 },
2274 },
2275};
2276
2277static struct clk_branch gmac_core1_clk = {
2278 .halt_reg = 0x3c20,
2279 .halt_bit = 4,
2280 .hwcg_reg = 0x3cb4,
2281 .hwcg_bit = 6,
2282 .clkr = {
2283 .enable_reg = 0x3cb4,
2284 .enable_mask = BIT(4),
2285 .hw.init = &(struct clk_init_data){
2286 .name = "gmac_core1_clk",
2287 .parent_names = (const char *[]){
2288 "gmac_core1_src",
2289 },
2290 .num_parents = 1,
2291 .ops = &clk_branch_ops,
2292 .flags = CLK_SET_RATE_PARENT,
2293 },
2294 },
2295};
2296
2297static struct clk_dyn_rcg gmac_core2_src = {
2298 .ns_reg[0] = 0x3ccc,
2299 .ns_reg[1] = 0x3cd0,
2300 .md_reg[0] = 0x3cc4,
2301 .md_reg[1] = 0x3cc8,
2302 .bank_reg = 0x3ca0,
2303 .mn[0] = {
2304 .mnctr_en_bit = 8,
2305 .mnctr_reset_bit = 7,
2306 .mnctr_mode_shift = 5,
2307 .n_val_shift = 16,
2308 .m_val_shift = 16,
2309 .width = 8,
2310 },
2311 .mn[1] = {
2312 .mnctr_en_bit = 8,
2313 .mnctr_reset_bit = 7,
2314 .mnctr_mode_shift = 5,
2315 .n_val_shift = 16,
2316 .m_val_shift = 16,
2317 .width = 8,
2318 },
2319 .s[0] = {
2320 .src_sel_shift = 0,
2321 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2322 },
2323 .s[1] = {
2324 .src_sel_shift = 0,
2325 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2326 },
2327 .p[0] = {
2328 .pre_div_shift = 3,
2329 .pre_div_width = 2,
2330 },
2331 .p[1] = {
2332 .pre_div_shift = 3,
2333 .pre_div_width = 2,
2334 },
2335 .mux_sel_bit = 0,
2336 .freq_tbl = clk_tbl_gmac,
2337 .clkr = {
2338 .enable_reg = 0x3cc0,
2339 .enable_mask = BIT(1),
2340 .hw.init = &(struct clk_init_data){
2341 .name = "gmac_core2_src",
2342 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2343 .num_parents = 5,
2344 .ops = &clk_dyn_rcg_ops,
2345 },
2346 },
2347};
2348
2349static struct clk_branch gmac_core2_clk = {
2350 .halt_reg = 0x3c20,
2351 .halt_bit = 5,
2352 .hwcg_reg = 0x3cd4,
2353 .hwcg_bit = 6,
2354 .clkr = {
2355 .enable_reg = 0x3cd4,
2356 .enable_mask = BIT(4),
2357 .hw.init = &(struct clk_init_data){
2358 .name = "gmac_core2_clk",
2359 .parent_names = (const char *[]){
2360 "gmac_core2_src",
2361 },
2362 .num_parents = 1,
2363 .ops = &clk_branch_ops,
2364 .flags = CLK_SET_RATE_PARENT,
2365 },
2366 },
2367};
2368
2369static struct clk_dyn_rcg gmac_core3_src = {
2370 .ns_reg[0] = 0x3cec,
2371 .ns_reg[1] = 0x3cf0,
2372 .md_reg[0] = 0x3ce4,
2373 .md_reg[1] = 0x3ce8,
2374 .bank_reg = 0x3ce0,
2375 .mn[0] = {
2376 .mnctr_en_bit = 8,
2377 .mnctr_reset_bit = 7,
2378 .mnctr_mode_shift = 5,
2379 .n_val_shift = 16,
2380 .m_val_shift = 16,
2381 .width = 8,
2382 },
2383 .mn[1] = {
2384 .mnctr_en_bit = 8,
2385 .mnctr_reset_bit = 7,
2386 .mnctr_mode_shift = 5,
2387 .n_val_shift = 16,
2388 .m_val_shift = 16,
2389 .width = 8,
2390 },
2391 .s[0] = {
2392 .src_sel_shift = 0,
2393 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2394 },
2395 .s[1] = {
2396 .src_sel_shift = 0,
2397 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2398 },
2399 .p[0] = {
2400 .pre_div_shift = 3,
2401 .pre_div_width = 2,
2402 },
2403 .p[1] = {
2404 .pre_div_shift = 3,
2405 .pre_div_width = 2,
2406 },
2407 .mux_sel_bit = 0,
2408 .freq_tbl = clk_tbl_gmac,
2409 .clkr = {
2410 .enable_reg = 0x3ce0,
2411 .enable_mask = BIT(1),
2412 .hw.init = &(struct clk_init_data){
2413 .name = "gmac_core3_src",
2414 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2415 .num_parents = 5,
2416 .ops = &clk_dyn_rcg_ops,
2417 },
2418 },
2419};
2420
2421static struct clk_branch gmac_core3_clk = {
2422 .halt_reg = 0x3c20,
2423 .halt_bit = 6,
2424 .hwcg_reg = 0x3cf4,
2425 .hwcg_bit = 6,
2426 .clkr = {
2427 .enable_reg = 0x3cf4,
2428 .enable_mask = BIT(4),
2429 .hw.init = &(struct clk_init_data){
2430 .name = "gmac_core3_clk",
2431 .parent_names = (const char *[]){
2432 "gmac_core3_src",
2433 },
2434 .num_parents = 1,
2435 .ops = &clk_branch_ops,
2436 .flags = CLK_SET_RATE_PARENT,
2437 },
2438 },
2439};
2440
2441static struct clk_dyn_rcg gmac_core4_src = {
2442 .ns_reg[0] = 0x3d0c,
2443 .ns_reg[1] = 0x3d10,
2444 .md_reg[0] = 0x3d04,
2445 .md_reg[1] = 0x3d08,
2446 .bank_reg = 0x3d00,
2447 .mn[0] = {
2448 .mnctr_en_bit = 8,
2449 .mnctr_reset_bit = 7,
2450 .mnctr_mode_shift = 5,
2451 .n_val_shift = 16,
2452 .m_val_shift = 16,
2453 .width = 8,
2454 },
2455 .mn[1] = {
2456 .mnctr_en_bit = 8,
2457 .mnctr_reset_bit = 7,
2458 .mnctr_mode_shift = 5,
2459 .n_val_shift = 16,
2460 .m_val_shift = 16,
2461 .width = 8,
2462 },
2463 .s[0] = {
2464 .src_sel_shift = 0,
2465 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2466 },
2467 .s[1] = {
2468 .src_sel_shift = 0,
2469 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2470 },
2471 .p[0] = {
2472 .pre_div_shift = 3,
2473 .pre_div_width = 2,
2474 },
2475 .p[1] = {
2476 .pre_div_shift = 3,
2477 .pre_div_width = 2,
2478 },
2479 .mux_sel_bit = 0,
2480 .freq_tbl = clk_tbl_gmac,
2481 .clkr = {
2482 .enable_reg = 0x3d00,
2483 .enable_mask = BIT(1),
2484 .hw.init = &(struct clk_init_data){
2485 .name = "gmac_core4_src",
2486 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2487 .num_parents = 5,
2488 .ops = &clk_dyn_rcg_ops,
2489 },
2490 },
2491};
2492
2493static struct clk_branch gmac_core4_clk = {
2494 .halt_reg = 0x3c20,
2495 .halt_bit = 7,
2496 .hwcg_reg = 0x3d14,
2497 .hwcg_bit = 6,
2498 .clkr = {
2499 .enable_reg = 0x3d14,
2500 .enable_mask = BIT(4),
2501 .hw.init = &(struct clk_init_data){
2502 .name = "gmac_core4_clk",
2503 .parent_names = (const char *[]){
2504 "gmac_core4_src",
2505 },
2506 .num_parents = 1,
2507 .ops = &clk_branch_ops,
2508 .flags = CLK_SET_RATE_PARENT,
2509 },
2510 },
2511};
2512
2513static const struct freq_tbl clk_tbl_nss_tcm[] = {
2514 { 266000000, P_PLL0, 3, 0, 0 },
2515 { 400000000, P_PLL0, 2, 0, 0 },
2516 { }
2517};
2518
2519static struct clk_dyn_rcg nss_tcm_src = {
2520 .ns_reg[0] = 0x3dc4,
2521 .ns_reg[1] = 0x3dc8,
2522 .bank_reg = 0x3dc0,
2523 .s[0] = {
2524 .src_sel_shift = 0,
2525 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2526 },
2527 .s[1] = {
2528 .src_sel_shift = 0,
2529 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2530 },
2531 .p[0] = {
2532 .pre_div_shift = 3,
2533 .pre_div_width = 4,
2534 },
2535 .p[1] = {
2536 .pre_div_shift = 3,
2537 .pre_div_width = 4,
2538 },
2539 .mux_sel_bit = 0,
2540 .freq_tbl = clk_tbl_nss_tcm,
2541 .clkr = {
2542 .enable_reg = 0x3dc0,
2543 .enable_mask = BIT(1),
2544 .hw.init = &(struct clk_init_data){
2545 .name = "nss_tcm_src",
2546 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2547 .num_parents = 5,
2548 .ops = &clk_dyn_rcg_ops,
2549 },
2550 },
2551};
2552
2553static struct clk_branch nss_tcm_clk = {
2554 .halt_reg = 0x3c20,
2555 .halt_bit = 14,
2556 .clkr = {
2557 .enable_reg = 0x3dd0,
2558 .enable_mask = BIT(6) | BIT(4),
2559 .hw.init = &(struct clk_init_data){
2560 .name = "nss_tcm_clk",
2561 .parent_names = (const char *[]){
2562 "nss_tcm_src",
2563 },
2564 .num_parents = 1,
2565 .ops = &clk_branch_ops,
2566 .flags = CLK_SET_RATE_PARENT,
2567 },
2568 },
2569};
2570
2571static const struct freq_tbl clk_tbl_nss[] = {
2572 { 110000000, P_PLL18, 1, 1, 5 },
2573 { 275000000, P_PLL18, 2, 0, 0 },
2574 { 550000000, P_PLL18, 1, 0, 0 },
2575 { 733000000, P_PLL18, 1, 0, 0 },
2576 { }
2577};
2578
2579static struct clk_dyn_rcg ubi32_core1_src_clk = {
2580 .ns_reg[0] = 0x3d2c,
2581 .ns_reg[1] = 0x3d30,
2582 .md_reg[0] = 0x3d24,
2583 .md_reg[1] = 0x3d28,
2584 .bank_reg = 0x3d20,
2585 .mn[0] = {
2586 .mnctr_en_bit = 8,
2587 .mnctr_reset_bit = 7,
2588 .mnctr_mode_shift = 5,
2589 .n_val_shift = 16,
2590 .m_val_shift = 16,
2591 .width = 8,
2592 },
2593 .mn[1] = {
2594 .mnctr_en_bit = 8,
2595 .mnctr_reset_bit = 7,
2596 .mnctr_mode_shift = 5,
2597 .n_val_shift = 16,
2598 .m_val_shift = 16,
2599 .width = 8,
2600 },
2601 .s[0] = {
2602 .src_sel_shift = 0,
2603 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2604 },
2605 .s[1] = {
2606 .src_sel_shift = 0,
2607 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2608 },
2609 .p[0] = {
2610 .pre_div_shift = 3,
2611 .pre_div_width = 2,
2612 },
2613 .p[1] = {
2614 .pre_div_shift = 3,
2615 .pre_div_width = 2,
2616 },
2617 .mux_sel_bit = 0,
2618 .freq_tbl = clk_tbl_nss,
2619 .clkr = {
2620 .enable_reg = 0x3d20,
2621 .enable_mask = BIT(1),
2622 .hw.init = &(struct clk_init_data){
2623 .name = "ubi32_core1_src_clk",
2624 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2625 .num_parents = 5,
2626 .ops = &clk_dyn_rcg_ops,
2627 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2628 },
2629 },
2630};
2631
2632static struct clk_dyn_rcg ubi32_core2_src_clk = {
2633 .ns_reg[0] = 0x3d4c,
2634 .ns_reg[1] = 0x3d50,
2635 .md_reg[0] = 0x3d44,
2636 .md_reg[1] = 0x3d48,
2637 .bank_reg = 0x3d40,
2638 .mn[0] = {
2639 .mnctr_en_bit = 8,
2640 .mnctr_reset_bit = 7,
2641 .mnctr_mode_shift = 5,
2642 .n_val_shift = 16,
2643 .m_val_shift = 16,
2644 .width = 8,
2645 },
2646 .mn[1] = {
2647 .mnctr_en_bit = 8,
2648 .mnctr_reset_bit = 7,
2649 .mnctr_mode_shift = 5,
2650 .n_val_shift = 16,
2651 .m_val_shift = 16,
2652 .width = 8,
2653 },
2654 .s[0] = {
2655 .src_sel_shift = 0,
2656 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2657 },
2658 .s[1] = {
2659 .src_sel_shift = 0,
2660 .parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2661 },
2662 .p[0] = {
2663 .pre_div_shift = 3,
2664 .pre_div_width = 2,
2665 },
2666 .p[1] = {
2667 .pre_div_shift = 3,
2668 .pre_div_width = 2,
2669 },
2670 .mux_sel_bit = 0,
2671 .freq_tbl = clk_tbl_nss,
2672 .clkr = {
2673 .enable_reg = 0x3d40,
2674 .enable_mask = BIT(1),
2675 .hw.init = &(struct clk_init_data){
2676 .name = "ubi32_core2_src_clk",
2677 .parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
2678 .num_parents = 5,
2679 .ops = &clk_dyn_rcg_ops,
2680 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2681 },
2682 },
2683};
2684
2685static struct clk_regmap *gcc_ipq806x_clks[] = {
2686 [PLL0] = &pll0.clkr,
2687 [PLL0_VOTE] = &pll0_vote,
2688 [PLL3] = &pll3.clkr,
2689 [PLL4_VOTE] = &pll4_vote,
2690 [PLL8] = &pll8.clkr,
2691 [PLL8_VOTE] = &pll8_vote,
2692 [PLL14] = &pll14.clkr,
2693 [PLL14_VOTE] = &pll14_vote,
2694 [PLL18] = &pll18.clkr,
2695 [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
2696 [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
2697 [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
2698 [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
2699 [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
2700 [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
2701 [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
2702 [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
2703 [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr,
2704 [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr,
2705 [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr,
2706 [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr,
2707 [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
2708 [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
2709 [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
2710 [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
2711 [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
2712 [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
2713 [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
2714 [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
2715 [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr,
2716 [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr,
2717 [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr,
2718 [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr,
2719 [GP0_SRC] = &gp0_src.clkr,
2720 [GP0_CLK] = &gp0_clk.clkr,
2721 [GP1_SRC] = &gp1_src.clkr,
2722 [GP1_CLK] = &gp1_clk.clkr,
2723 [GP2_SRC] = &gp2_src.clkr,
2724 [GP2_CLK] = &gp2_clk.clkr,
2725 [PMEM_A_CLK] = &pmem_clk.clkr,
2726 [PRNG_SRC] = &prng_src.clkr,
2727 [PRNG_CLK] = &prng_clk.clkr,
2728 [SDC1_SRC] = &sdc1_src.clkr,
2729 [SDC1_CLK] = &sdc1_clk.clkr,
2730 [SDC3_SRC] = &sdc3_src.clkr,
2731 [SDC3_CLK] = &sdc3_clk.clkr,
2732 [TSIF_REF_SRC] = &tsif_ref_src.clkr,
2733 [TSIF_REF_CLK] = &tsif_ref_clk.clkr,
2734 [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
2735 [GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
2736 [GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
2737 [GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
2738 [GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
2739 [GSBI6_H_CLK] = &gsbi6_h_clk.clkr,
2740 [GSBI7_H_CLK] = &gsbi7_h_clk.clkr,
2741 [TSIF_H_CLK] = &tsif_h_clk.clkr,
2742 [SDC1_H_CLK] = &sdc1_h_clk.clkr,
2743 [SDC3_H_CLK] = &sdc3_h_clk.clkr,
2744 [ADM0_CLK] = &adm0_clk.clkr,
2745 [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
2746 [PCIE_A_CLK] = &pcie_a_clk.clkr,
2747 [PCIE_AUX_CLK] = &pcie_aux_clk.clkr,
2748 [PCIE_H_CLK] = &pcie_h_clk.clkr,
2749 [PCIE_PHY_CLK] = &pcie_phy_clk.clkr,
2750 [SFAB_SATA_S_H_CLK] = &sfab_sata_s_h_clk.clkr,
2751 [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
2752 [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
2753 [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
2754 [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
2755 [SATA_H_CLK] = &sata_h_clk.clkr,
2756 [SATA_CLK_SRC] = &sata_ref_src.clkr,
2757 [SATA_RXOOB_CLK] = &sata_rxoob_clk.clkr,
2758 [SATA_PMALIVE_CLK] = &sata_pmalive_clk.clkr,
2759 [SATA_PHY_REF_CLK] = &sata_phy_ref_clk.clkr,
2760 [SATA_A_CLK] = &sata_a_clk.clkr,
2761 [SATA_PHY_CFG_CLK] = &sata_phy_cfg_clk.clkr,
2762 [PCIE_ALT_REF_SRC] = &pcie_ref_src.clkr,
2763 [PCIE_ALT_REF_CLK] = &pcie_ref_src_clk.clkr,
2764 [PCIE_1_A_CLK] = &pcie1_a_clk.clkr,
2765 [PCIE_1_AUX_CLK] = &pcie1_aux_clk.clkr,
2766 [PCIE_1_H_CLK] = &pcie1_h_clk.clkr,
2767 [PCIE_1_PHY_CLK] = &pcie1_phy_clk.clkr,
2768 [PCIE_1_ALT_REF_SRC] = &pcie1_ref_src.clkr,
2769 [PCIE_1_ALT_REF_CLK] = &pcie1_ref_src_clk.clkr,
2770 [PCIE_2_A_CLK] = &pcie2_a_clk.clkr,
2771 [PCIE_2_AUX_CLK] = &pcie2_aux_clk.clkr,
2772 [PCIE_2_H_CLK] = &pcie2_h_clk.clkr,
2773 [PCIE_2_PHY_CLK] = &pcie2_phy_clk.clkr,
2774 [PCIE_2_ALT_REF_SRC] = &pcie2_ref_src.clkr,
2775 [PCIE_2_ALT_REF_CLK] = &pcie2_ref_src_clk.clkr,
2776 [USB30_MASTER_SRC] = &usb30_master_clk_src.clkr,
2777 [USB30_0_MASTER_CLK] = &usb30_0_branch_clk.clkr,
2778 [USB30_1_MASTER_CLK] = &usb30_1_branch_clk.clkr,
2779 [USB30_UTMI_SRC] = &usb30_utmi_clk.clkr,
2780 [USB30_0_UTMI_CLK] = &usb30_0_utmi_clk_ctl.clkr,
2781 [USB30_1_UTMI_CLK] = &usb30_1_utmi_clk_ctl.clkr,
2782 [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
2783 [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_clk_src.clkr,
2784 [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
2785 [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr,
2786 [USB_FS1_XCVR_SRC] = &usb_fs1_xcvr_clk_src.clkr,
2787 [USB_FS1_XCVR_CLK] = &usb_fs1_xcvr_clk.clkr,
2788 [USB_FS1_SYSTEM_CLK] = &usb_fs1_sys_clk.clkr,
2789 [EBI2_CLK] = &ebi2_clk.clkr,
2790 [EBI2_AON_CLK] = &ebi2_aon_clk.clkr,
2791 [GMAC_CORE1_CLK_SRC] = &gmac_core1_src.clkr,
2792 [GMAC_CORE1_CLK] = &gmac_core1_clk.clkr,
2793 [GMAC_CORE2_CLK_SRC] = &gmac_core2_src.clkr,
2794 [GMAC_CORE2_CLK] = &gmac_core2_clk.clkr,
2795 [GMAC_CORE3_CLK_SRC] = &gmac_core3_src.clkr,
2796 [GMAC_CORE3_CLK] = &gmac_core3_clk.clkr,
2797 [GMAC_CORE4_CLK_SRC] = &gmac_core4_src.clkr,
2798 [GMAC_CORE4_CLK] = &gmac_core4_clk.clkr,
2799 [UBI32_CORE1_CLK_SRC] = &ubi32_core1_src_clk.clkr,
2800 [UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr,
2801 [NSSTCM_CLK_SRC] = &nss_tcm_src.clkr,
2802 [NSSTCM_CLK] = &nss_tcm_clk.clkr,
2803};
2804
2805static const struct qcom_reset_map gcc_ipq806x_resets[] = {
2806 [QDSS_STM_RESET] = { 0x2060, 6 },
2807 [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 },
2808 [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 },
2809 [AFAB_SMPSS_M0_RESET] = { 0x20b8, 0 },
2810 [AFAB_EBI1_CH0_RESET] = { 0x20c0, 7 },
2811 [AFAB_EBI1_CH1_RESET] = { 0x20c4, 7 },
2812 [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 },
2813 [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 },
2814 [SFAB_ADM0_M2_RESET] = { 0x21e8, 7 },
2815 [ADM0_C2_RESET] = { 0x220c, 4 },
2816 [ADM0_C1_RESET] = { 0x220c, 3 },
2817 [ADM0_C0_RESET] = { 0x220c, 2 },
2818 [ADM0_PBUS_RESET] = { 0x220c, 1 },
2819 [ADM0_RESET] = { 0x220c, 0 },
2820 [QDSS_CLKS_SW_RESET] = { 0x2260, 5 },
2821 [QDSS_POR_RESET] = { 0x2260, 4 },
2822 [QDSS_TSCTR_RESET] = { 0x2260, 3 },
2823 [QDSS_HRESET_RESET] = { 0x2260, 2 },
2824 [QDSS_AXI_RESET] = { 0x2260, 1 },
2825 [QDSS_DBG_RESET] = { 0x2260, 0 },
2826 [SFAB_PCIE_M_RESET] = { 0x22d8, 1 },
2827 [SFAB_PCIE_S_RESET] = { 0x22d8, 0 },
2828 [PCIE_EXT_RESET] = { 0x22dc, 6 },
2829 [PCIE_PHY_RESET] = { 0x22dc, 5 },
2830 [PCIE_PCI_RESET] = { 0x22dc, 4 },
2831 [PCIE_POR_RESET] = { 0x22dc, 3 },
2832 [PCIE_HCLK_RESET] = { 0x22dc, 2 },
2833 [PCIE_ACLK_RESET] = { 0x22dc, 0 },
2834 [SFAB_LPASS_RESET] = { 0x23a0, 7 },
2835 [SFAB_AFAB_M_RESET] = { 0x23e0, 7 },
2836 [AFAB_SFAB_M0_RESET] = { 0x2420, 7 },
2837 [AFAB_SFAB_M1_RESET] = { 0x2424, 7 },
2838 [SFAB_SATA_S_RESET] = { 0x2480, 7 },
2839 [SFAB_DFAB_M_RESET] = { 0x2500, 7 },
2840 [DFAB_SFAB_M_RESET] = { 0x2520, 7 },
2841 [DFAB_SWAY0_RESET] = { 0x2540, 7 },
2842 [DFAB_SWAY1_RESET] = { 0x2544, 7 },
2843 [DFAB_ARB0_RESET] = { 0x2560, 7 },
2844 [DFAB_ARB1_RESET] = { 0x2564, 7 },
2845 [PPSS_PROC_RESET] = { 0x2594, 1 },
2846 [PPSS_RESET] = { 0x2594, 0 },
2847 [DMA_BAM_RESET] = { 0x25c0, 7 },
2848 [SPS_TIC_H_RESET] = { 0x2600, 7 },
2849 [SFAB_CFPB_M_RESET] = { 0x2680, 7 },
2850 [SFAB_CFPB_S_RESET] = { 0x26c0, 7 },
2851 [TSIF_H_RESET] = { 0x2700, 7 },
2852 [CE1_H_RESET] = { 0x2720, 7 },
2853 [CE1_CORE_RESET] = { 0x2724, 7 },
2854 [CE1_SLEEP_RESET] = { 0x2728, 7 },
2855 [CE2_H_RESET] = { 0x2740, 7 },
2856 [CE2_CORE_RESET] = { 0x2744, 7 },
2857 [SFAB_SFPB_M_RESET] = { 0x2780, 7 },
2858 [SFAB_SFPB_S_RESET] = { 0x27a0, 7 },
2859 [RPM_PROC_RESET] = { 0x27c0, 7 },
2860 [PMIC_SSBI2_RESET] = { 0x280c, 12 },
2861 [SDC1_RESET] = { 0x2830, 0 },
2862 [SDC2_RESET] = { 0x2850, 0 },
2863 [SDC3_RESET] = { 0x2870, 0 },
2864 [SDC4_RESET] = { 0x2890, 0 },
2865 [USB_HS1_RESET] = { 0x2910, 0 },
2866 [USB_HSIC_RESET] = { 0x2934, 0 },
2867 [USB_FS1_XCVR_RESET] = { 0x2974, 1 },
2868 [USB_FS1_RESET] = { 0x2974, 0 },
2869 [GSBI1_RESET] = { 0x29dc, 0 },
2870 [GSBI2_RESET] = { 0x29fc, 0 },
2871 [GSBI3_RESET] = { 0x2a1c, 0 },
2872 [GSBI4_RESET] = { 0x2a3c, 0 },
2873 [GSBI5_RESET] = { 0x2a5c, 0 },
2874 [GSBI6_RESET] = { 0x2a7c, 0 },
2875 [GSBI7_RESET] = { 0x2a9c, 0 },
2876 [SPDM_RESET] = { 0x2b6c, 0 },
2877 [SEC_CTRL_RESET] = { 0x2b80, 7 },
2878 [TLMM_H_RESET] = { 0x2ba0, 7 },
2879 [SFAB_SATA_M_RESET] = { 0x2c18, 0 },
2880 [SATA_RESET] = { 0x2c1c, 0 },
2881 [TSSC_RESET] = { 0x2ca0, 7 },
2882 [PDM_RESET] = { 0x2cc0, 12 },
2883 [MPM_H_RESET] = { 0x2da0, 7 },
2884 [MPM_RESET] = { 0x2da4, 0 },
2885 [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 },
2886 [PRNG_RESET] = { 0x2e80, 12 },
2887 [SFAB_CE3_M_RESET] = { 0x36c8, 1 },
2888 [SFAB_CE3_S_RESET] = { 0x36c8, 0 },
2889 [CE3_SLEEP_RESET] = { 0x36d0, 7 },
2890 [PCIE_1_M_RESET] = { 0x3a98, 1 },
2891 [PCIE_1_S_RESET] = { 0x3a98, 0 },
2892 [PCIE_1_EXT_RESET] = { 0x3a9c, 6 },
2893 [PCIE_1_PHY_RESET] = { 0x3a9c, 5 },
2894 [PCIE_1_PCI_RESET] = { 0x3a9c, 4 },
2895 [PCIE_1_POR_RESET] = { 0x3a9c, 3 },
2896 [PCIE_1_HCLK_RESET] = { 0x3a9c, 2 },
2897 [PCIE_1_ACLK_RESET] = { 0x3a9c, 0 },
2898 [PCIE_2_M_RESET] = { 0x3ad8, 1 },
2899 [PCIE_2_S_RESET] = { 0x3ad8, 0 },
2900 [PCIE_2_EXT_RESET] = { 0x3adc, 6 },
2901 [PCIE_2_PHY_RESET] = { 0x3adc, 5 },
2902 [PCIE_2_PCI_RESET] = { 0x3adc, 4 },
2903 [PCIE_2_POR_RESET] = { 0x3adc, 3 },
2904 [PCIE_2_HCLK_RESET] = { 0x3adc, 2 },
2905 [PCIE_2_ACLK_RESET] = { 0x3adc, 0 },
2906 [SFAB_USB30_S_RESET] = { 0x3b54, 1 },
2907 [SFAB_USB30_M_RESET] = { 0x3b54, 0 },
2908 [USB30_0_PORT2_HS_PHY_RESET] = { 0x3b50, 5 },
2909 [USB30_0_MASTER_RESET] = { 0x3b50, 4 },
2910 [USB30_0_SLEEP_RESET] = { 0x3b50, 3 },
2911 [USB30_0_UTMI_PHY_RESET] = { 0x3b50, 2 },
2912 [USB30_0_POWERON_RESET] = { 0x3b50, 1 },
2913 [USB30_0_PHY_RESET] = { 0x3b50, 0 },
2914 [USB30_1_MASTER_RESET] = { 0x3b58, 4 },
2915 [USB30_1_SLEEP_RESET] = { 0x3b58, 3 },
2916 [USB30_1_UTMI_PHY_RESET] = { 0x3b58, 2 },
2917 [USB30_1_POWERON_RESET] = { 0x3b58, 1 },
2918 [USB30_1_PHY_RESET] = { 0x3b58, 0 },
2919 [NSSFB0_RESET] = { 0x3b60, 6 },
2920 [NSSFB1_RESET] = { 0x3b60, 7 },
2921 [UBI32_CORE1_CLKRST_CLAMP_RESET] = { 0x3d3c, 3},
2922 [UBI32_CORE1_CLAMP_RESET] = { 0x3d3c, 2 },
2923 [UBI32_CORE1_AHB_RESET] = { 0x3d3c, 1 },
2924 [UBI32_CORE1_AXI_RESET] = { 0x3d3c, 0 },
2925 [UBI32_CORE2_CLKRST_CLAMP_RESET] = { 0x3d5c, 3 },
2926 [UBI32_CORE2_CLAMP_RESET] = { 0x3d5c, 2 },
2927 [UBI32_CORE2_AHB_RESET] = { 0x3d5c, 1 },
2928 [UBI32_CORE2_AXI_RESET] = { 0x3d5c, 0 },
2929 [GMAC_CORE1_RESET] = { 0x3cbc, 0 },
2930 [GMAC_CORE2_RESET] = { 0x3cdc, 0 },
2931 [GMAC_CORE3_RESET] = { 0x3cfc, 0 },
2932 [GMAC_CORE4_RESET] = { 0x3d1c, 0 },
2933 [GMAC_AHB_RESET] = { 0x3e24, 0 },
2934 [NSS_CH0_RST_RX_CLK_N_RESET] = { 0x3b60, 0 },
2935 [NSS_CH0_RST_TX_CLK_N_RESET] = { 0x3b60, 1 },
2936 [NSS_CH0_RST_RX_125M_N_RESET] = { 0x3b60, 2 },
2937 [NSS_CH0_HW_RST_RX_125M_N_RESET] = { 0x3b60, 3 },
2938 [NSS_CH0_RST_TX_125M_N_RESET] = { 0x3b60, 4 },
2939 [NSS_CH1_RST_RX_CLK_N_RESET] = { 0x3b60, 5 },
2940 [NSS_CH1_RST_TX_CLK_N_RESET] = { 0x3b60, 6 },
2941 [NSS_CH1_RST_RX_125M_N_RESET] = { 0x3b60, 7 },
2942 [NSS_CH1_HW_RST_RX_125M_N_RESET] = { 0x3b60, 8 },
2943 [NSS_CH1_RST_TX_125M_N_RESET] = { 0x3b60, 9 },
2944 [NSS_CH2_RST_RX_CLK_N_RESET] = { 0x3b60, 10 },
2945 [NSS_CH2_RST_TX_CLK_N_RESET] = { 0x3b60, 11 },
2946 [NSS_CH2_RST_RX_125M_N_RESET] = { 0x3b60, 12 },
2947 [NSS_CH2_HW_RST_RX_125M_N_RESET] = { 0x3b60, 13 },
2948 [NSS_CH2_RST_TX_125M_N_RESET] = { 0x3b60, 14 },
2949 [NSS_CH3_RST_RX_CLK_N_RESET] = { 0x3b60, 15 },
2950 [NSS_CH3_RST_TX_CLK_N_RESET] = { 0x3b60, 16 },
2951 [NSS_CH3_RST_RX_125M_N_RESET] = { 0x3b60, 17 },
2952 [NSS_CH3_HW_RST_RX_125M_N_RESET] = { 0x3b60, 18 },
2953 [NSS_CH3_RST_TX_125M_N_RESET] = { 0x3b60, 19 },
2954 [NSS_RST_RX_250M_125M_N_RESET] = { 0x3b60, 20 },
2955 [NSS_RST_TX_250M_125M_N_RESET] = { 0x3b60, 21 },
2956 [NSS_QSGMII_TXPI_RST_N_RESET] = { 0x3b60, 22 },
2957 [NSS_QSGMII_CDR_RST_N_RESET] = { 0x3b60, 23 },
2958 [NSS_SGMII2_CDR_RST_N_RESET] = { 0x3b60, 24 },
2959 [NSS_SGMII3_CDR_RST_N_RESET] = { 0x3b60, 25 },
2960 [NSS_CAL_PRBS_RST_N_RESET] = { 0x3b60, 26 },
2961 [NSS_LCKDT_RST_N_RESET] = { 0x3b60, 27 },
2962 [NSS_SRDS_N_RESET] = { 0x3b60, 28 },
2963};
2964
2965static const struct regmap_config gcc_ipq806x_regmap_config = {
2966 .reg_bits = 32,
2967 .reg_stride = 4,
2968 .val_bits = 32,
2969 .max_register = 0x3e40,
2970 .fast_io = true,
2971};
2972
2973static const struct qcom_cc_desc gcc_ipq806x_desc = {
2974 .config = &gcc_ipq806x_regmap_config,
2975 .clks = gcc_ipq806x_clks,
2976 .num_clks = ARRAY_SIZE(gcc_ipq806x_clks),
2977 .resets = gcc_ipq806x_resets,
2978 .num_resets = ARRAY_SIZE(gcc_ipq806x_resets),
2979};
2980
2981static const struct of_device_id gcc_ipq806x_match_table[] = {
2982 { .compatible = "qcom,gcc-ipq8064" },
2983 { }
2984};
2985MODULE_DEVICE_TABLE(of, gcc_ipq806x_match_table);
2986
2987static int gcc_ipq806x_probe(struct platform_device *pdev)
2988{
2989 struct device *dev = &pdev->dev;
2990 struct regmap *regmap;
2991 int ret;
2992
2993 ret = qcom_cc_register_board_clk(dev, "cxo_board", "cxo", 19200000);
2994 if (ret)
2995 return ret;
2996
2997 ret = qcom_cc_register_board_clk(dev, "pxo_board", "pxo", 27000000);
2998 if (ret)
2999 return ret;
3000
3001 ret = qcom_cc_probe(pdev, &gcc_ipq806x_desc);
3002 if (ret)
3003 return ret;
3004
3005 regmap = dev_get_regmap(dev, NULL);
3006 if (!regmap)
3007 return -ENODEV;
3008
3009
3010 regmap_update_bits(regmap, 0x31a4, 0xffffffc0, 0x40000400);
3011 regmap_write(regmap, 0x31b0, 0x3080);
3012
3013
3014 regmap_write(regmap, 0x3cb8, 8);
3015 regmap_write(regmap, 0x3cd8, 8);
3016 regmap_write(regmap, 0x3cf8, 8);
3017 regmap_write(regmap, 0x3d18, 8);
3018
3019 return 0;
3020}
3021
3022static struct platform_driver gcc_ipq806x_driver = {
3023 .probe = gcc_ipq806x_probe,
3024 .driver = {
3025 .name = "gcc-ipq806x",
3026 .of_match_table = gcc_ipq806x_match_table,
3027 },
3028};
3029
3030static int __init gcc_ipq806x_init(void)
3031{
3032 return platform_driver_register(&gcc_ipq806x_driver);
3033}
3034core_initcall(gcc_ipq806x_init);
3035
3036static void __exit gcc_ipq806x_exit(void)
3037{
3038 platform_driver_unregister(&gcc_ipq806x_driver);
3039}
3040module_exit(gcc_ipq806x_exit);
3041
3042MODULE_DESCRIPTION("QCOM GCC IPQ806x Driver");
3043MODULE_LICENSE("GPL v2");
3044MODULE_ALIAS("platform:gcc-ipq806x");
3045