1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
4 * Copyright (c) BayLibre, SAS.
5 * Author : Neil Armstrong <narmstrong@baylibre.com>
6 */
7
8#include <linux/kernel.h>
9#include <linux/bitops.h>
10#include <linux/err.h>
11#include <linux/platform_device.h>
12#include <linux/module.h>
13#include <linux/of.h>
14#include <linux/clk-provider.h>
15#include <linux/regmap.h>
16#include <linux/reset-controller.h>
17
18#include <dt-bindings/clock/qcom,gcc-mdm9615.h>
19#include <dt-bindings/reset/qcom,gcc-mdm9615.h>
20
21#include "common.h"
22#include "clk-regmap.h"
23#include "clk-pll.h"
24#include "clk-rcg.h"
25#include "clk-branch.h"
26#include "reset.h"
27
28enum {
29 DT_CXO,
30 DT_PLL4,
31};
32
33enum {
34 P_CXO,
35 P_PLL8,
36 P_PLL14,
37};
38
39static const struct parent_map gcc_cxo_map[] = {
40 { P_CXO, 0 },
41};
42
43static const struct clk_parent_data gcc_cxo[] = {
44 { .index = DT_CXO, .name = "cxo_board" },
45};
46
47static struct clk_pll pll0 = {
48 .l_reg = 0x30c4,
49 .m_reg = 0x30c8,
50 .n_reg = 0x30cc,
51 .config_reg = 0x30d4,
52 .mode_reg = 0x30c0,
53 .status_reg = 0x30d8,
54 .status_bit = 16,
55 .clkr.hw.init = &(struct clk_init_data){
56 .name = "pll0",
57 .parent_data = gcc_cxo,
58 .num_parents = ARRAY_SIZE(gcc_cxo),
59 .ops = &clk_pll_ops,
60 },
61};
62
63static struct clk_regmap pll0_vote = {
64 .enable_reg = 0x34c0,
65 .enable_mask = BIT(0),
66 .hw.init = &(struct clk_init_data){
67 .name = "pll0_vote",
68 .parent_hws = (const struct clk_hw*[]) {
69 &pll0.clkr.hw,
70 },
71 .num_parents = 1,
72 .ops = &clk_pll_vote_ops,
73 },
74};
75
76static struct clk_regmap pll4_vote = {
77 .enable_reg = 0x34c0,
78 .enable_mask = BIT(4),
79 .hw.init = &(struct clk_init_data){
80 .name = "pll4_vote",
81 .parent_data = &(const struct clk_parent_data) {
82 .index = DT_PLL4, .name = "pll4",
83 },
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_data = gcc_cxo,
100 .num_parents = ARRAY_SIZE(gcc_cxo),
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_hws = (const struct clk_hw*[]) {
111 &pll8.clkr.hw,
112 },
113 .num_parents = 1,
114 .ops = &clk_pll_vote_ops,
115 },
116};
117
118static struct clk_pll pll14 = {
119 .l_reg = 0x31c4,
120 .m_reg = 0x31c8,
121 .n_reg = 0x31cc,
122 .config_reg = 0x31d4,
123 .mode_reg = 0x31c0,
124 .status_reg = 0x31d8,
125 .status_bit = 16,
126 .clkr.hw.init = &(struct clk_init_data){
127 .name = "pll14",
128 .parent_data = gcc_cxo,
129 .num_parents = ARRAY_SIZE(gcc_cxo),
130 .ops = &clk_pll_ops,
131 },
132};
133
134static struct clk_regmap pll14_vote = {
135 .enable_reg = 0x34c0,
136 .enable_mask = BIT(11),
137 .hw.init = &(struct clk_init_data){
138 .name = "pll14_vote",
139 .parent_hws = (const struct clk_hw*[]) {
140 &pll14.clkr.hw,
141 },
142 .num_parents = 1,
143 .ops = &clk_pll_vote_ops,
144 },
145};
146
147static const struct parent_map gcc_cxo_pll8_map[] = {
148 { P_CXO, 0 },
149 { P_PLL8, 3 }
150};
151
152static const struct clk_parent_data gcc_cxo_pll8[] = {
153 { .index = DT_CXO, .name = "cxo_board" },
154 { .hw = &pll8_vote.hw },
155};
156
157static const struct parent_map gcc_cxo_pll14_map[] = {
158 { P_CXO, 0 },
159 { P_PLL14, 4 }
160};
161
162static const struct clk_parent_data gcc_cxo_pll14[] = {
163 { .index = DT_CXO, .name = "cxo_board" },
164 { .hw = &pll14_vote.hw },
165};
166
167static struct freq_tbl clk_tbl_gsbi_uart[] = {
168 { 1843200, P_PLL8, 2, 6, 625 },
169 { 3686400, P_PLL8, 2, 12, 625 },
170 { 7372800, P_PLL8, 2, 24, 625 },
171 { 14745600, P_PLL8, 2, 48, 625 },
172 { 16000000, P_PLL8, 4, 1, 6 },
173 { 24000000, P_PLL8, 4, 1, 4 },
174 { 32000000, P_PLL8, 4, 1, 3 },
175 { 40000000, P_PLL8, 1, 5, 48 },
176 { 46400000, P_PLL8, 1, 29, 240 },
177 { 48000000, P_PLL8, 4, 1, 2 },
178 { 51200000, P_PLL8, 1, 2, 15 },
179 { 56000000, P_PLL8, 1, 7, 48 },
180 { 58982400, P_PLL8, 1, 96, 625 },
181 { 64000000, P_PLL8, 2, 1, 3 },
182 { }
183};
184
185static struct clk_rcg gsbi1_uart_src = {
186 .ns_reg = 0x29d4,
187 .md_reg = 0x29d0,
188 .mn = {
189 .mnctr_en_bit = 8,
190 .mnctr_reset_bit = 7,
191 .mnctr_mode_shift = 5,
192 .n_val_shift = 16,
193 .m_val_shift = 16,
194 .width = 16,
195 },
196 .p = {
197 .pre_div_shift = 3,
198 .pre_div_width = 2,
199 },
200 .s = {
201 .src_sel_shift = 0,
202 .parent_map = gcc_cxo_pll8_map,
203 },
204 .freq_tbl = clk_tbl_gsbi_uart,
205 .clkr = {
206 .enable_reg = 0x29d4,
207 .enable_mask = BIT(11),
208 .hw.init = &(struct clk_init_data){
209 .name = "gsbi1_uart_src",
210 .parent_data = gcc_cxo_pll8,
211 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
212 .ops = &clk_rcg_ops,
213 .flags = CLK_SET_PARENT_GATE,
214 },
215 },
216};
217
218static struct clk_branch gsbi1_uart_clk = {
219 .halt_reg = 0x2fcc,
220 .halt_bit = 10,
221 .clkr = {
222 .enable_reg = 0x29d4,
223 .enable_mask = BIT(9),
224 .hw.init = &(struct clk_init_data){
225 .name = "gsbi1_uart_clk",
226 .parent_hws = (const struct clk_hw*[]) {
227 &gsbi1_uart_src.clkr.hw,
228 },
229 .num_parents = 1,
230 .ops = &clk_branch_ops,
231 .flags = CLK_SET_RATE_PARENT,
232 },
233 },
234};
235
236static struct clk_rcg gsbi2_uart_src = {
237 .ns_reg = 0x29f4,
238 .md_reg = 0x29f0,
239 .mn = {
240 .mnctr_en_bit = 8,
241 .mnctr_reset_bit = 7,
242 .mnctr_mode_shift = 5,
243 .n_val_shift = 16,
244 .m_val_shift = 16,
245 .width = 16,
246 },
247 .p = {
248 .pre_div_shift = 3,
249 .pre_div_width = 2,
250 },
251 .s = {
252 .src_sel_shift = 0,
253 .parent_map = gcc_cxo_pll8_map,
254 },
255 .freq_tbl = clk_tbl_gsbi_uart,
256 .clkr = {
257 .enable_reg = 0x29f4,
258 .enable_mask = BIT(11),
259 .hw.init = &(struct clk_init_data){
260 .name = "gsbi2_uart_src",
261 .parent_data = gcc_cxo_pll8,
262 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
263 .ops = &clk_rcg_ops,
264 .flags = CLK_SET_PARENT_GATE,
265 },
266 },
267};
268
269static struct clk_branch gsbi2_uart_clk = {
270 .halt_reg = 0x2fcc,
271 .halt_bit = 6,
272 .clkr = {
273 .enable_reg = 0x29f4,
274 .enable_mask = BIT(9),
275 .hw.init = &(struct clk_init_data){
276 .name = "gsbi2_uart_clk",
277 .parent_hws = (const struct clk_hw*[]) {
278 &gsbi2_uart_src.clkr.hw,
279 },
280 .num_parents = 1,
281 .ops = &clk_branch_ops,
282 .flags = CLK_SET_RATE_PARENT,
283 },
284 },
285};
286
287static struct clk_rcg gsbi3_uart_src = {
288 .ns_reg = 0x2a14,
289 .md_reg = 0x2a10,
290 .mn = {
291 .mnctr_en_bit = 8,
292 .mnctr_reset_bit = 7,
293 .mnctr_mode_shift = 5,
294 .n_val_shift = 16,
295 .m_val_shift = 16,
296 .width = 16,
297 },
298 .p = {
299 .pre_div_shift = 3,
300 .pre_div_width = 2,
301 },
302 .s = {
303 .src_sel_shift = 0,
304 .parent_map = gcc_cxo_pll8_map,
305 },
306 .freq_tbl = clk_tbl_gsbi_uart,
307 .clkr = {
308 .enable_reg = 0x2a14,
309 .enable_mask = BIT(11),
310 .hw.init = &(struct clk_init_data){
311 .name = "gsbi3_uart_src",
312 .parent_data = gcc_cxo_pll8,
313 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
314 .ops = &clk_rcg_ops,
315 .flags = CLK_SET_PARENT_GATE,
316 },
317 },
318};
319
320static struct clk_branch gsbi3_uart_clk = {
321 .halt_reg = 0x2fcc,
322 .halt_bit = 2,
323 .clkr = {
324 .enable_reg = 0x2a14,
325 .enable_mask = BIT(9),
326 .hw.init = &(struct clk_init_data){
327 .name = "gsbi3_uart_clk",
328 .parent_hws = (const struct clk_hw*[]) {
329 &gsbi3_uart_src.clkr.hw,
330 },
331 .num_parents = 1,
332 .ops = &clk_branch_ops,
333 .flags = CLK_SET_RATE_PARENT,
334 },
335 },
336};
337
338static struct clk_rcg gsbi4_uart_src = {
339 .ns_reg = 0x2a34,
340 .md_reg = 0x2a30,
341 .mn = {
342 .mnctr_en_bit = 8,
343 .mnctr_reset_bit = 7,
344 .mnctr_mode_shift = 5,
345 .n_val_shift = 16,
346 .m_val_shift = 16,
347 .width = 16,
348 },
349 .p = {
350 .pre_div_shift = 3,
351 .pre_div_width = 2,
352 },
353 .s = {
354 .src_sel_shift = 0,
355 .parent_map = gcc_cxo_pll8_map,
356 },
357 .freq_tbl = clk_tbl_gsbi_uart,
358 .clkr = {
359 .enable_reg = 0x2a34,
360 .enable_mask = BIT(11),
361 .hw.init = &(struct clk_init_data){
362 .name = "gsbi4_uart_src",
363 .parent_data = gcc_cxo_pll8,
364 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
365 .ops = &clk_rcg_ops,
366 .flags = CLK_SET_PARENT_GATE,
367 },
368 },
369};
370
371static struct clk_branch gsbi4_uart_clk = {
372 .halt_reg = 0x2fd0,
373 .halt_bit = 26,
374 .clkr = {
375 .enable_reg = 0x2a34,
376 .enable_mask = BIT(9),
377 .hw.init = &(struct clk_init_data){
378 .name = "gsbi4_uart_clk",
379 .parent_hws = (const struct clk_hw*[]) {
380 &gsbi4_uart_src.clkr.hw,
381 },
382 .num_parents = 1,
383 .ops = &clk_branch_ops,
384 .flags = CLK_SET_RATE_PARENT,
385 },
386 },
387};
388
389static struct clk_rcg gsbi5_uart_src = {
390 .ns_reg = 0x2a54,
391 .md_reg = 0x2a50,
392 .mn = {
393 .mnctr_en_bit = 8,
394 .mnctr_reset_bit = 7,
395 .mnctr_mode_shift = 5,
396 .n_val_shift = 16,
397 .m_val_shift = 16,
398 .width = 16,
399 },
400 .p = {
401 .pre_div_shift = 3,
402 .pre_div_width = 2,
403 },
404 .s = {
405 .src_sel_shift = 0,
406 .parent_map = gcc_cxo_pll8_map,
407 },
408 .freq_tbl = clk_tbl_gsbi_uart,
409 .clkr = {
410 .enable_reg = 0x2a54,
411 .enable_mask = BIT(11),
412 .hw.init = &(struct clk_init_data){
413 .name = "gsbi5_uart_src",
414 .parent_data = gcc_cxo_pll8,
415 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
416 .ops = &clk_rcg_ops,
417 .flags = CLK_SET_PARENT_GATE,
418 },
419 },
420};
421
422static struct clk_branch gsbi5_uart_clk = {
423 .halt_reg = 0x2fd0,
424 .halt_bit = 22,
425 .clkr = {
426 .enable_reg = 0x2a54,
427 .enable_mask = BIT(9),
428 .hw.init = &(struct clk_init_data){
429 .name = "gsbi5_uart_clk",
430 .parent_hws = (const struct clk_hw*[]) {
431 &gsbi5_uart_src.clkr.hw,
432 },
433 .num_parents = 1,
434 .ops = &clk_branch_ops,
435 .flags = CLK_SET_RATE_PARENT,
436 },
437 },
438};
439
440static struct freq_tbl clk_tbl_gsbi_qup[] = {
441 { 960000, P_CXO, 4, 1, 5 },
442 { 4800000, P_CXO, 4, 0, 1 },
443 { 9600000, P_CXO, 2, 0, 1 },
444 { 15060000, P_PLL8, 1, 2, 51 },
445 { 24000000, P_PLL8, 4, 1, 4 },
446 { 25600000, P_PLL8, 1, 1, 15 },
447 { 48000000, P_PLL8, 4, 1, 2 },
448 { 51200000, P_PLL8, 1, 2, 15 },
449 { }
450};
451
452static struct clk_rcg gsbi1_qup_src = {
453 .ns_reg = 0x29cc,
454 .md_reg = 0x29c8,
455 .mn = {
456 .mnctr_en_bit = 8,
457 .mnctr_reset_bit = 7,
458 .mnctr_mode_shift = 5,
459 .n_val_shift = 16,
460 .m_val_shift = 16,
461 .width = 8,
462 },
463 .p = {
464 .pre_div_shift = 3,
465 .pre_div_width = 2,
466 },
467 .s = {
468 .src_sel_shift = 0,
469 .parent_map = gcc_cxo_pll8_map,
470 },
471 .freq_tbl = clk_tbl_gsbi_qup,
472 .clkr = {
473 .enable_reg = 0x29cc,
474 .enable_mask = BIT(11),
475 .hw.init = &(struct clk_init_data){
476 .name = "gsbi1_qup_src",
477 .parent_data = gcc_cxo_pll8,
478 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
479 .ops = &clk_rcg_ops,
480 .flags = CLK_SET_PARENT_GATE,
481 },
482 },
483};
484
485static struct clk_branch gsbi1_qup_clk = {
486 .halt_reg = 0x2fcc,
487 .halt_bit = 9,
488 .clkr = {
489 .enable_reg = 0x29cc,
490 .enable_mask = BIT(9),
491 .hw.init = &(struct clk_init_data){
492 .name = "gsbi1_qup_clk",
493 .parent_hws = (const struct clk_hw*[]) {
494 &gsbi1_qup_src.clkr.hw,
495 },
496 .num_parents = 1,
497 .ops = &clk_branch_ops,
498 .flags = CLK_SET_RATE_PARENT,
499 },
500 },
501};
502
503static struct clk_rcg gsbi2_qup_src = {
504 .ns_reg = 0x29ec,
505 .md_reg = 0x29e8,
506 .mn = {
507 .mnctr_en_bit = 8,
508 .mnctr_reset_bit = 7,
509 .mnctr_mode_shift = 5,
510 .n_val_shift = 16,
511 .m_val_shift = 16,
512 .width = 8,
513 },
514 .p = {
515 .pre_div_shift = 3,
516 .pre_div_width = 2,
517 },
518 .s = {
519 .src_sel_shift = 0,
520 .parent_map = gcc_cxo_pll8_map,
521 },
522 .freq_tbl = clk_tbl_gsbi_qup,
523 .clkr = {
524 .enable_reg = 0x29ec,
525 .enable_mask = BIT(11),
526 .hw.init = &(struct clk_init_data){
527 .name = "gsbi2_qup_src",
528 .parent_data = gcc_cxo_pll8,
529 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
530 .ops = &clk_rcg_ops,
531 .flags = CLK_SET_PARENT_GATE,
532 },
533 },
534};
535
536static struct clk_branch gsbi2_qup_clk = {
537 .halt_reg = 0x2fcc,
538 .halt_bit = 4,
539 .clkr = {
540 .enable_reg = 0x29ec,
541 .enable_mask = BIT(9),
542 .hw.init = &(struct clk_init_data){
543 .name = "gsbi2_qup_clk",
544 .parent_hws = (const struct clk_hw*[]) {
545 &gsbi2_qup_src.clkr.hw,
546 },
547 .num_parents = 1,
548 .ops = &clk_branch_ops,
549 .flags = CLK_SET_RATE_PARENT,
550 },
551 },
552};
553
554static struct clk_rcg gsbi3_qup_src = {
555 .ns_reg = 0x2a0c,
556 .md_reg = 0x2a08,
557 .mn = {
558 .mnctr_en_bit = 8,
559 .mnctr_reset_bit = 7,
560 .mnctr_mode_shift = 5,
561 .n_val_shift = 16,
562 .m_val_shift = 16,
563 .width = 8,
564 },
565 .p = {
566 .pre_div_shift = 3,
567 .pre_div_width = 2,
568 },
569 .s = {
570 .src_sel_shift = 0,
571 .parent_map = gcc_cxo_pll8_map,
572 },
573 .freq_tbl = clk_tbl_gsbi_qup,
574 .clkr = {
575 .enable_reg = 0x2a0c,
576 .enable_mask = BIT(11),
577 .hw.init = &(struct clk_init_data){
578 .name = "gsbi3_qup_src",
579 .parent_data = gcc_cxo_pll8,
580 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
581 .ops = &clk_rcg_ops,
582 .flags = CLK_SET_PARENT_GATE,
583 },
584 },
585};
586
587static struct clk_branch gsbi3_qup_clk = {
588 .halt_reg = 0x2fcc,
589 .halt_bit = 0,
590 .clkr = {
591 .enable_reg = 0x2a0c,
592 .enable_mask = BIT(9),
593 .hw.init = &(struct clk_init_data){
594 .name = "gsbi3_qup_clk",
595 .parent_hws = (const struct clk_hw*[]) {
596 &gsbi3_qup_src.clkr.hw,
597 },
598 .num_parents = 1,
599 .ops = &clk_branch_ops,
600 .flags = CLK_SET_RATE_PARENT,
601 },
602 },
603};
604
605static struct clk_rcg gsbi4_qup_src = {
606 .ns_reg = 0x2a2c,
607 .md_reg = 0x2a28,
608 .mn = {
609 .mnctr_en_bit = 8,
610 .mnctr_reset_bit = 7,
611 .mnctr_mode_shift = 5,
612 .n_val_shift = 16,
613 .m_val_shift = 16,
614 .width = 8,
615 },
616 .p = {
617 .pre_div_shift = 3,
618 .pre_div_width = 2,
619 },
620 .s = {
621 .src_sel_shift = 0,
622 .parent_map = gcc_cxo_pll8_map,
623 },
624 .freq_tbl = clk_tbl_gsbi_qup,
625 .clkr = {
626 .enable_reg = 0x2a2c,
627 .enable_mask = BIT(11),
628 .hw.init = &(struct clk_init_data){
629 .name = "gsbi4_qup_src",
630 .parent_data = gcc_cxo_pll8,
631 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
632 .ops = &clk_rcg_ops,
633 .flags = CLK_SET_PARENT_GATE,
634 },
635 },
636};
637
638static struct clk_branch gsbi4_qup_clk = {
639 .halt_reg = 0x2fd0,
640 .halt_bit = 24,
641 .clkr = {
642 .enable_reg = 0x2a2c,
643 .enable_mask = BIT(9),
644 .hw.init = &(struct clk_init_data){
645 .name = "gsbi4_qup_clk",
646 .parent_hws = (const struct clk_hw*[]) {
647 &gsbi4_qup_src.clkr.hw,
648 },
649 .num_parents = 1,
650 .ops = &clk_branch_ops,
651 .flags = CLK_SET_RATE_PARENT,
652 },
653 },
654};
655
656static struct clk_rcg gsbi5_qup_src = {
657 .ns_reg = 0x2a4c,
658 .md_reg = 0x2a48,
659 .mn = {
660 .mnctr_en_bit = 8,
661 .mnctr_reset_bit = 7,
662 .mnctr_mode_shift = 5,
663 .n_val_shift = 16,
664 .m_val_shift = 16,
665 .width = 8,
666 },
667 .p = {
668 .pre_div_shift = 3,
669 .pre_div_width = 2,
670 },
671 .s = {
672 .src_sel_shift = 0,
673 .parent_map = gcc_cxo_pll8_map,
674 },
675 .freq_tbl = clk_tbl_gsbi_qup,
676 .clkr = {
677 .enable_reg = 0x2a4c,
678 .enable_mask = BIT(11),
679 .hw.init = &(struct clk_init_data){
680 .name = "gsbi5_qup_src",
681 .parent_data = gcc_cxo_pll8,
682 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
683 .ops = &clk_rcg_ops,
684 .flags = CLK_SET_PARENT_GATE,
685 },
686 },
687};
688
689static struct clk_branch gsbi5_qup_clk = {
690 .halt_reg = 0x2fd0,
691 .halt_bit = 20,
692 .clkr = {
693 .enable_reg = 0x2a4c,
694 .enable_mask = BIT(9),
695 .hw.init = &(struct clk_init_data){
696 .name = "gsbi5_qup_clk",
697 .parent_hws = (const struct clk_hw*[]) {
698 &gsbi5_qup_src.clkr.hw,
699 },
700 .num_parents = 1,
701 .ops = &clk_branch_ops,
702 .flags = CLK_SET_RATE_PARENT,
703 },
704 },
705};
706
707static const struct freq_tbl clk_tbl_gp[] = {
708 { 9600000, P_CXO, 2, 0, 0 },
709 { 19200000, P_CXO, 1, 0, 0 },
710 { }
711};
712
713static struct clk_rcg gp0_src = {
714 .ns_reg = 0x2d24,
715 .md_reg = 0x2d00,
716 .mn = {
717 .mnctr_en_bit = 8,
718 .mnctr_reset_bit = 7,
719 .mnctr_mode_shift = 5,
720 .n_val_shift = 16,
721 .m_val_shift = 16,
722 .width = 8,
723 },
724 .p = {
725 .pre_div_shift = 3,
726 .pre_div_width = 2,
727 },
728 .s = {
729 .src_sel_shift = 0,
730 .parent_map = gcc_cxo_map,
731 },
732 .freq_tbl = clk_tbl_gp,
733 .clkr = {
734 .enable_reg = 0x2d24,
735 .enable_mask = BIT(11),
736 .hw.init = &(struct clk_init_data){
737 .name = "gp0_src",
738 .parent_data = gcc_cxo,
739 .num_parents = ARRAY_SIZE(gcc_cxo),
740 .ops = &clk_rcg_ops,
741 .flags = CLK_SET_PARENT_GATE,
742 },
743 }
744};
745
746static struct clk_branch gp0_clk = {
747 .halt_reg = 0x2fd8,
748 .halt_bit = 7,
749 .clkr = {
750 .enable_reg = 0x2d24,
751 .enable_mask = BIT(9),
752 .hw.init = &(struct clk_init_data){
753 .name = "gp0_clk",
754 .parent_hws = (const struct clk_hw*[]) {
755 &gp0_src.clkr.hw,
756 },
757 .num_parents = 1,
758 .ops = &clk_branch_ops,
759 .flags = CLK_SET_RATE_PARENT,
760 },
761 },
762};
763
764static struct clk_rcg gp1_src = {
765 .ns_reg = 0x2d44,
766 .md_reg = 0x2d40,
767 .mn = {
768 .mnctr_en_bit = 8,
769 .mnctr_reset_bit = 7,
770 .mnctr_mode_shift = 5,
771 .n_val_shift = 16,
772 .m_val_shift = 16,
773 .width = 8,
774 },
775 .p = {
776 .pre_div_shift = 3,
777 .pre_div_width = 2,
778 },
779 .s = {
780 .src_sel_shift = 0,
781 .parent_map = gcc_cxo_map,
782 },
783 .freq_tbl = clk_tbl_gp,
784 .clkr = {
785 .enable_reg = 0x2d44,
786 .enable_mask = BIT(11),
787 .hw.init = &(struct clk_init_data){
788 .name = "gp1_src",
789 .parent_data = gcc_cxo,
790 .num_parents = ARRAY_SIZE(gcc_cxo),
791 .ops = &clk_rcg_ops,
792 .flags = CLK_SET_RATE_GATE,
793 },
794 }
795};
796
797static struct clk_branch gp1_clk = {
798 .halt_reg = 0x2fd8,
799 .halt_bit = 6,
800 .clkr = {
801 .enable_reg = 0x2d44,
802 .enable_mask = BIT(9),
803 .hw.init = &(struct clk_init_data){
804 .name = "gp1_clk",
805 .parent_hws = (const struct clk_hw*[]) {
806 &gp1_src.clkr.hw,
807 },
808 .num_parents = 1,
809 .ops = &clk_branch_ops,
810 .flags = CLK_SET_RATE_PARENT,
811 },
812 },
813};
814
815static struct clk_rcg gp2_src = {
816 .ns_reg = 0x2d64,
817 .md_reg = 0x2d60,
818 .mn = {
819 .mnctr_en_bit = 8,
820 .mnctr_reset_bit = 7,
821 .mnctr_mode_shift = 5,
822 .n_val_shift = 16,
823 .m_val_shift = 16,
824 .width = 8,
825 },
826 .p = {
827 .pre_div_shift = 3,
828 .pre_div_width = 2,
829 },
830 .s = {
831 .src_sel_shift = 0,
832 .parent_map = gcc_cxo_map,
833 },
834 .freq_tbl = clk_tbl_gp,
835 .clkr = {
836 .enable_reg = 0x2d64,
837 .enable_mask = BIT(11),
838 .hw.init = &(struct clk_init_data){
839 .name = "gp2_src",
840 .parent_data = gcc_cxo,
841 .num_parents = ARRAY_SIZE(gcc_cxo),
842 .ops = &clk_rcg_ops,
843 .flags = CLK_SET_RATE_GATE,
844 },
845 }
846};
847
848static struct clk_branch gp2_clk = {
849 .halt_reg = 0x2fd8,
850 .halt_bit = 5,
851 .clkr = {
852 .enable_reg = 0x2d64,
853 .enable_mask = BIT(9),
854 .hw.init = &(struct clk_init_data){
855 .name = "gp2_clk",
856 .parent_hws = (const struct clk_hw*[]) {
857 &gp2_src.clkr.hw,
858 },
859 .num_parents = 1,
860 .ops = &clk_branch_ops,
861 .flags = CLK_SET_RATE_PARENT,
862 },
863 },
864};
865
866static struct clk_branch pmem_clk = {
867 .hwcg_reg = 0x25a0,
868 .hwcg_bit = 6,
869 .halt_reg = 0x2fc8,
870 .halt_bit = 20,
871 .clkr = {
872 .enable_reg = 0x25a0,
873 .enable_mask = BIT(4),
874 .hw.init = &(struct clk_init_data){
875 .name = "pmem_clk",
876 .ops = &clk_branch_ops,
877 },
878 },
879};
880
881static struct clk_rcg prng_src = {
882 .ns_reg = 0x2e80,
883 .p = {
884 .pre_div_shift = 3,
885 .pre_div_width = 4,
886 },
887 .s = {
888 .src_sel_shift = 0,
889 .parent_map = gcc_cxo_pll8_map,
890 },
891 .clkr = {
892 .hw.init = &(struct clk_init_data){
893 .name = "prng_src",
894 .parent_data = gcc_cxo_pll8,
895 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
896 .ops = &clk_rcg_ops,
897 },
898 },
899};
900
901static struct clk_branch prng_clk = {
902 .halt_reg = 0x2fd8,
903 .halt_check = BRANCH_HALT_VOTED,
904 .halt_bit = 10,
905 .clkr = {
906 .enable_reg = 0x3080,
907 .enable_mask = BIT(10),
908 .hw.init = &(struct clk_init_data){
909 .name = "prng_clk",
910 .parent_hws = (const struct clk_hw*[]) {
911 &prng_src.clkr.hw,
912 },
913 .num_parents = 1,
914 .ops = &clk_branch_ops,
915 },
916 },
917};
918
919static const struct freq_tbl clk_tbl_sdc[] = {
920 { 144000, P_CXO, 1, 1, 133 },
921 { 400000, P_PLL8, 4, 1, 240 },
922 { 16000000, P_PLL8, 4, 1, 6 },
923 { 17070000, P_PLL8, 1, 2, 45 },
924 { 20210000, P_PLL8, 1, 1, 19 },
925 { 24000000, P_PLL8, 4, 1, 4 },
926 { 38400000, P_PLL8, 2, 1, 5 },
927 { 48000000, P_PLL8, 4, 1, 2 },
928 { 64000000, P_PLL8, 3, 1, 2 },
929 { 76800000, P_PLL8, 1, 1, 5 },
930 { }
931};
932
933static struct clk_rcg sdc1_src = {
934 .ns_reg = 0x282c,
935 .md_reg = 0x2828,
936 .mn = {
937 .mnctr_en_bit = 8,
938 .mnctr_reset_bit = 7,
939 .mnctr_mode_shift = 5,
940 .n_val_shift = 16,
941 .m_val_shift = 16,
942 .width = 8,
943 },
944 .p = {
945 .pre_div_shift = 3,
946 .pre_div_width = 2,
947 },
948 .s = {
949 .src_sel_shift = 0,
950 .parent_map = gcc_cxo_pll8_map,
951 },
952 .freq_tbl = clk_tbl_sdc,
953 .clkr = {
954 .enable_reg = 0x282c,
955 .enable_mask = BIT(11),
956 .hw.init = &(struct clk_init_data){
957 .name = "sdc1_src",
958 .parent_data = gcc_cxo_pll8,
959 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
960 .ops = &clk_rcg_ops,
961 },
962 }
963};
964
965static struct clk_branch sdc1_clk = {
966 .halt_reg = 0x2fc8,
967 .halt_bit = 6,
968 .clkr = {
969 .enable_reg = 0x282c,
970 .enable_mask = BIT(9),
971 .hw.init = &(struct clk_init_data){
972 .name = "sdc1_clk",
973 .parent_hws = (const struct clk_hw*[]) {
974 &sdc1_src.clkr.hw,
975 },
976 .num_parents = 1,
977 .ops = &clk_branch_ops,
978 .flags = CLK_SET_RATE_PARENT,
979 },
980 },
981};
982
983static struct clk_rcg sdc2_src = {
984 .ns_reg = 0x284c,
985 .md_reg = 0x2848,
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_cxo_pll8_map,
1001 },
1002 .freq_tbl = clk_tbl_sdc,
1003 .clkr = {
1004 .enable_reg = 0x284c,
1005 .enable_mask = BIT(11),
1006 .hw.init = &(struct clk_init_data){
1007 .name = "sdc2_src",
1008 .parent_data = gcc_cxo_pll8,
1009 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1010 .ops = &clk_rcg_ops,
1011 },
1012 }
1013};
1014
1015static struct clk_branch sdc2_clk = {
1016 .halt_reg = 0x2fc8,
1017 .halt_bit = 5,
1018 .clkr = {
1019 .enable_reg = 0x284c,
1020 .enable_mask = BIT(9),
1021 .hw.init = &(struct clk_init_data){
1022 .name = "sdc2_clk",
1023 .parent_hws = (const struct clk_hw*[]) {
1024 &sdc2_src.clkr.hw,
1025 },
1026 .num_parents = 1,
1027 .ops = &clk_branch_ops,
1028 .flags = CLK_SET_RATE_PARENT,
1029 },
1030 },
1031};
1032
1033static const struct freq_tbl clk_tbl_usb[] = {
1034 { 60000000, P_PLL8, 1, 5, 32 },
1035 { }
1036};
1037
1038static struct clk_rcg usb_hs1_xcvr_src = {
1039 .ns_reg = 0x290c,
1040 .md_reg = 0x2908,
1041 .mn = {
1042 .mnctr_en_bit = 8,
1043 .mnctr_reset_bit = 7,
1044 .mnctr_mode_shift = 5,
1045 .n_val_shift = 16,
1046 .m_val_shift = 16,
1047 .width = 8,
1048 },
1049 .p = {
1050 .pre_div_shift = 3,
1051 .pre_div_width = 2,
1052 },
1053 .s = {
1054 .src_sel_shift = 0,
1055 .parent_map = gcc_cxo_pll8_map,
1056 },
1057 .freq_tbl = clk_tbl_usb,
1058 .clkr = {
1059 .enable_reg = 0x290c,
1060 .enable_mask = BIT(11),
1061 .hw.init = &(struct clk_init_data){
1062 .name = "usb_hs1_xcvr_src",
1063 .parent_data = gcc_cxo_pll8,
1064 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1065 .ops = &clk_rcg_ops,
1066 .flags = CLK_SET_RATE_GATE,
1067 },
1068 }
1069};
1070
1071static struct clk_branch usb_hs1_xcvr_clk = {
1072 .halt_reg = 0x2fc8,
1073 .halt_bit = 0,
1074 .clkr = {
1075 .enable_reg = 0x290c,
1076 .enable_mask = BIT(9),
1077 .hw.init = &(struct clk_init_data){
1078 .name = "usb_hs1_xcvr_clk",
1079 .parent_hws = (const struct clk_hw*[]) {
1080 &usb_hs1_xcvr_src.clkr.hw,
1081 },
1082 .num_parents = 1,
1083 .ops = &clk_branch_ops,
1084 .flags = CLK_SET_RATE_PARENT,
1085 },
1086 },
1087};
1088
1089static struct clk_rcg usb_hsic_xcvr_fs_src = {
1090 .ns_reg = 0x2928,
1091 .md_reg = 0x2924,
1092 .mn = {
1093 .mnctr_en_bit = 8,
1094 .mnctr_reset_bit = 7,
1095 .mnctr_mode_shift = 5,
1096 .n_val_shift = 16,
1097 .m_val_shift = 16,
1098 .width = 8,
1099 },
1100 .p = {
1101 .pre_div_shift = 3,
1102 .pre_div_width = 2,
1103 },
1104 .s = {
1105 .src_sel_shift = 0,
1106 .parent_map = gcc_cxo_pll8_map,
1107 },
1108 .freq_tbl = clk_tbl_usb,
1109 .clkr = {
1110 .enable_reg = 0x2928,
1111 .enable_mask = BIT(11),
1112 .hw.init = &(struct clk_init_data){
1113 .name = "usb_hsic_xcvr_fs_src",
1114 .parent_data = gcc_cxo_pll8,
1115 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1116 .ops = &clk_rcg_ops,
1117 .flags = CLK_SET_RATE_GATE,
1118 },
1119 }
1120};
1121
1122static struct clk_branch usb_hsic_xcvr_fs_clk = {
1123 .halt_reg = 0x2fc8,
1124 .halt_bit = 9,
1125 .clkr = {
1126 .enable_reg = 0x2928,
1127 .enable_mask = BIT(9),
1128 .hw.init = &(struct clk_init_data){
1129 .name = "usb_hsic_xcvr_fs_clk",
1130 .parent_hws = (const struct clk_hw*[]) {
1131 &usb_hsic_xcvr_fs_src.clkr.hw,
1132 },
1133 .num_parents = 1,
1134 .ops = &clk_branch_ops,
1135 .flags = CLK_SET_RATE_PARENT,
1136 },
1137 },
1138};
1139
1140static const struct freq_tbl clk_tbl_usb_hs1_system[] = {
1141 { 60000000, P_PLL8, 1, 5, 32 },
1142 { }
1143};
1144
1145static struct clk_rcg usb_hs1_system_src = {
1146 .ns_reg = 0x36a4,
1147 .md_reg = 0x36a0,
1148 .mn = {
1149 .mnctr_en_bit = 8,
1150 .mnctr_reset_bit = 7,
1151 .mnctr_mode_shift = 5,
1152 .n_val_shift = 16,
1153 .m_val_shift = 16,
1154 .width = 8,
1155 },
1156 .p = {
1157 .pre_div_shift = 3,
1158 .pre_div_width = 2,
1159 },
1160 .s = {
1161 .src_sel_shift = 0,
1162 .parent_map = gcc_cxo_pll8_map,
1163 },
1164 .freq_tbl = clk_tbl_usb_hs1_system,
1165 .clkr = {
1166 .enable_reg = 0x36a4,
1167 .enable_mask = BIT(11),
1168 .hw.init = &(struct clk_init_data){
1169 .name = "usb_hs1_system_src",
1170 .parent_data = gcc_cxo_pll8,
1171 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1172 .ops = &clk_rcg_ops,
1173 .flags = CLK_SET_RATE_GATE,
1174 },
1175 }
1176};
1177
1178static struct clk_branch usb_hs1_system_clk = {
1179 .halt_reg = 0x2fc8,
1180 .halt_bit = 4,
1181 .clkr = {
1182 .enable_reg = 0x36a4,
1183 .enable_mask = BIT(9),
1184 .hw.init = &(struct clk_init_data){
1185 .parent_hws = (const struct clk_hw*[]) {
1186 &usb_hs1_system_src.clkr.hw,
1187 },
1188 .num_parents = 1,
1189 .name = "usb_hs1_system_clk",
1190 .ops = &clk_branch_ops,
1191 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1192 },
1193 },
1194};
1195
1196static const struct freq_tbl clk_tbl_usb_hsic_system[] = {
1197 { 64000000, P_PLL8, 1, 1, 6 },
1198 { }
1199};
1200
1201static struct clk_rcg usb_hsic_system_src = {
1202 .ns_reg = 0x2b58,
1203 .md_reg = 0x2b54,
1204 .mn = {
1205 .mnctr_en_bit = 8,
1206 .mnctr_reset_bit = 7,
1207 .mnctr_mode_shift = 5,
1208 .n_val_shift = 16,
1209 .m_val_shift = 16,
1210 .width = 8,
1211 },
1212 .p = {
1213 .pre_div_shift = 3,
1214 .pre_div_width = 2,
1215 },
1216 .s = {
1217 .src_sel_shift = 0,
1218 .parent_map = gcc_cxo_pll8_map,
1219 },
1220 .freq_tbl = clk_tbl_usb_hsic_system,
1221 .clkr = {
1222 .enable_reg = 0x2b58,
1223 .enable_mask = BIT(11),
1224 .hw.init = &(struct clk_init_data){
1225 .name = "usb_hsic_system_src",
1226 .parent_data = gcc_cxo_pll8,
1227 .num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1228 .ops = &clk_rcg_ops,
1229 .flags = CLK_SET_RATE_GATE,
1230 },
1231 }
1232};
1233
1234static struct clk_branch usb_hsic_system_clk = {
1235 .halt_reg = 0x2fc8,
1236 .halt_bit = 7,
1237 .clkr = {
1238 .enable_reg = 0x2b58,
1239 .enable_mask = BIT(9),
1240 .hw.init = &(struct clk_init_data){
1241 .parent_hws = (const struct clk_hw*[]) {
1242 &usb_hsic_system_src.clkr.hw,
1243 },
1244 .num_parents = 1,
1245 .name = "usb_hsic_system_clk",
1246 .ops = &clk_branch_ops,
1247 .flags = CLK_SET_RATE_PARENT,
1248 },
1249 },
1250};
1251
1252static const struct freq_tbl clk_tbl_usb_hsic_hsic[] = {
1253 { 48000000, P_PLL14, 1, 0, 0 },
1254 { }
1255};
1256
1257static struct clk_rcg usb_hsic_hsic_src = {
1258 .ns_reg = 0x2b50,
1259 .md_reg = 0x2b4c,
1260 .mn = {
1261 .mnctr_en_bit = 8,
1262 .mnctr_reset_bit = 7,
1263 .mnctr_mode_shift = 5,
1264 .n_val_shift = 16,
1265 .m_val_shift = 16,
1266 .width = 8,
1267 },
1268 .p = {
1269 .pre_div_shift = 3,
1270 .pre_div_width = 2,
1271 },
1272 .s = {
1273 .src_sel_shift = 0,
1274 .parent_map = gcc_cxo_pll14_map,
1275 },
1276 .freq_tbl = clk_tbl_usb_hsic_hsic,
1277 .clkr = {
1278 .enable_reg = 0x2b50,
1279 .enable_mask = BIT(11),
1280 .hw.init = &(struct clk_init_data){
1281 .name = "usb_hsic_hsic_src",
1282 .parent_data = gcc_cxo_pll14,
1283 .num_parents = ARRAY_SIZE(gcc_cxo_pll14),
1284 .ops = &clk_rcg_ops,
1285 .flags = CLK_SET_RATE_GATE,
1286 },
1287 }
1288};
1289
1290static struct clk_branch usb_hsic_hsic_clk = {
1291 .halt_check = BRANCH_HALT_DELAY,
1292 .clkr = {
1293 .enable_reg = 0x2b50,
1294 .enable_mask = BIT(9),
1295 .hw.init = &(struct clk_init_data){
1296 .parent_hws = (const struct clk_hw*[]) {
1297 &usb_hsic_hsic_src.clkr.hw,
1298 },
1299 .num_parents = 1,
1300 .name = "usb_hsic_hsic_clk",
1301 .ops = &clk_branch_ops,
1302 .flags = CLK_SET_RATE_PARENT,
1303 },
1304 },
1305};
1306
1307static struct clk_branch usb_hsic_hsio_cal_clk = {
1308 .halt_reg = 0x2fc8,
1309 .halt_bit = 8,
1310 .clkr = {
1311 .enable_reg = 0x2b48,
1312 .enable_mask = BIT(0),
1313 .hw.init = &(struct clk_init_data){
1314 .parent_data = gcc_cxo,
1315 .num_parents = ARRAY_SIZE(gcc_cxo),
1316 .name = "usb_hsic_hsio_cal_clk",
1317 .ops = &clk_branch_ops,
1318 },
1319 },
1320};
1321
1322static struct clk_branch ce1_core_clk = {
1323 .hwcg_reg = 0x2724,
1324 .hwcg_bit = 6,
1325 .halt_reg = 0x2fd4,
1326 .halt_bit = 27,
1327 .clkr = {
1328 .enable_reg = 0x2724,
1329 .enable_mask = BIT(4),
1330 .hw.init = &(struct clk_init_data){
1331 .name = "ce1_core_clk",
1332 .ops = &clk_branch_ops,
1333 },
1334 },
1335};
1336
1337static struct clk_branch ce1_h_clk = {
1338 .halt_reg = 0x2fd4,
1339 .halt_bit = 1,
1340 .clkr = {
1341 .enable_reg = 0x2720,
1342 .enable_mask = BIT(4),
1343 .hw.init = &(struct clk_init_data){
1344 .name = "ce1_h_clk",
1345 .ops = &clk_branch_ops,
1346 },
1347 },
1348};
1349
1350static struct clk_branch dma_bam_h_clk = {
1351 .hwcg_reg = 0x25c0,
1352 .hwcg_bit = 6,
1353 .halt_reg = 0x2fc8,
1354 .halt_bit = 12,
1355 .clkr = {
1356 .enable_reg = 0x25c0,
1357 .enable_mask = BIT(4),
1358 .hw.init = &(struct clk_init_data){
1359 .name = "dma_bam_h_clk",
1360 .ops = &clk_branch_ops,
1361 },
1362 },
1363};
1364
1365static struct clk_branch gsbi1_h_clk = {
1366 .hwcg_reg = 0x29c0,
1367 .hwcg_bit = 6,
1368 .halt_reg = 0x2fcc,
1369 .halt_bit = 11,
1370 .clkr = {
1371 .enable_reg = 0x29c0,
1372 .enable_mask = BIT(4),
1373 .hw.init = &(struct clk_init_data){
1374 .name = "gsbi1_h_clk",
1375 .ops = &clk_branch_ops,
1376 },
1377 },
1378};
1379
1380static struct clk_branch gsbi2_h_clk = {
1381 .hwcg_reg = 0x29e0,
1382 .hwcg_bit = 6,
1383 .halt_reg = 0x2fcc,
1384 .halt_bit = 7,
1385 .clkr = {
1386 .enable_reg = 0x29e0,
1387 .enable_mask = BIT(4),
1388 .hw.init = &(struct clk_init_data){
1389 .name = "gsbi2_h_clk",
1390 .ops = &clk_branch_ops,
1391 },
1392 },
1393};
1394
1395static struct clk_branch gsbi3_h_clk = {
1396 .hwcg_reg = 0x2a00,
1397 .hwcg_bit = 6,
1398 .halt_reg = 0x2fcc,
1399 .halt_bit = 3,
1400 .clkr = {
1401 .enable_reg = 0x2a00,
1402 .enable_mask = BIT(4),
1403 .hw.init = &(struct clk_init_data){
1404 .name = "gsbi3_h_clk",
1405 .ops = &clk_branch_ops,
1406 },
1407 },
1408};
1409
1410static struct clk_branch gsbi4_h_clk = {
1411 .hwcg_reg = 0x2a20,
1412 .hwcg_bit = 6,
1413 .halt_reg = 0x2fd0,
1414 .halt_bit = 27,
1415 .clkr = {
1416 .enable_reg = 0x2a20,
1417 .enable_mask = BIT(4),
1418 .hw.init = &(struct clk_init_data){
1419 .name = "gsbi4_h_clk",
1420 .ops = &clk_branch_ops,
1421 },
1422 },
1423};
1424
1425static struct clk_branch gsbi5_h_clk = {
1426 .hwcg_reg = 0x2a40,
1427 .hwcg_bit = 6,
1428 .halt_reg = 0x2fd0,
1429 .halt_bit = 23,
1430 .clkr = {
1431 .enable_reg = 0x2a40,
1432 .enable_mask = BIT(4),
1433 .hw.init = &(struct clk_init_data){
1434 .name = "gsbi5_h_clk",
1435 .ops = &clk_branch_ops,
1436 },
1437 },
1438};
1439
1440static struct clk_branch usb_hs1_h_clk = {
1441 .hwcg_reg = 0x2900,
1442 .hwcg_bit = 6,
1443 .halt_reg = 0x2fc8,
1444 .halt_bit = 1,
1445 .clkr = {
1446 .enable_reg = 0x2900,
1447 .enable_mask = BIT(4),
1448 .hw.init = &(struct clk_init_data){
1449 .name = "usb_hs1_h_clk",
1450 .ops = &clk_branch_ops,
1451 },
1452 },
1453};
1454
1455static struct clk_branch usb_hsic_h_clk = {
1456 .halt_reg = 0x2fcc,
1457 .halt_bit = 28,
1458 .clkr = {
1459 .enable_reg = 0x2920,
1460 .enable_mask = BIT(4),
1461 .hw.init = &(struct clk_init_data){
1462 .name = "usb_hsic_h_clk",
1463 .ops = &clk_branch_ops,
1464 },
1465 },
1466};
1467
1468static struct clk_branch sdc1_h_clk = {
1469 .hwcg_reg = 0x2820,
1470 .hwcg_bit = 6,
1471 .halt_reg = 0x2fc8,
1472 .halt_bit = 11,
1473 .clkr = {
1474 .enable_reg = 0x2820,
1475 .enable_mask = BIT(4),
1476 .hw.init = &(struct clk_init_data){
1477 .name = "sdc1_h_clk",
1478 .ops = &clk_branch_ops,
1479 },
1480 },
1481};
1482
1483static struct clk_branch sdc2_h_clk = {
1484 .hwcg_reg = 0x2840,
1485 .hwcg_bit = 6,
1486 .halt_reg = 0x2fc8,
1487 .halt_bit = 10,
1488 .clkr = {
1489 .enable_reg = 0x2840,
1490 .enable_mask = BIT(4),
1491 .hw.init = &(struct clk_init_data){
1492 .name = "sdc2_h_clk",
1493 .ops = &clk_branch_ops,
1494 },
1495 },
1496};
1497
1498static struct clk_branch adm0_clk = {
1499 .halt_reg = 0x2fdc,
1500 .halt_check = BRANCH_HALT_VOTED,
1501 .halt_bit = 14,
1502 .clkr = {
1503 .enable_reg = 0x3080,
1504 .enable_mask = BIT(2),
1505 .hw.init = &(struct clk_init_data){
1506 .name = "adm0_clk",
1507 .ops = &clk_branch_ops,
1508 },
1509 },
1510};
1511
1512static struct clk_branch adm0_pbus_clk = {
1513 .hwcg_reg = 0x2208,
1514 .hwcg_bit = 6,
1515 .halt_reg = 0x2fdc,
1516 .halt_check = BRANCH_HALT_VOTED,
1517 .halt_bit = 13,
1518 .clkr = {
1519 .enable_reg = 0x3080,
1520 .enable_mask = BIT(3),
1521 .hw.init = &(struct clk_init_data){
1522 .name = "adm0_pbus_clk",
1523 .ops = &clk_branch_ops,
1524 },
1525 },
1526};
1527
1528static struct clk_branch pmic_arb0_h_clk = {
1529 .halt_reg = 0x2fd8,
1530 .halt_check = BRANCH_HALT_VOTED,
1531 .halt_bit = 22,
1532 .clkr = {
1533 .enable_reg = 0x3080,
1534 .enable_mask = BIT(8),
1535 .hw.init = &(struct clk_init_data){
1536 .name = "pmic_arb0_h_clk",
1537 .ops = &clk_branch_ops,
1538 },
1539 },
1540};
1541
1542static struct clk_branch pmic_arb1_h_clk = {
1543 .halt_reg = 0x2fd8,
1544 .halt_check = BRANCH_HALT_VOTED,
1545 .halt_bit = 21,
1546 .clkr = {
1547 .enable_reg = 0x3080,
1548 .enable_mask = BIT(9),
1549 .hw.init = &(struct clk_init_data){
1550 .name = "pmic_arb1_h_clk",
1551 .ops = &clk_branch_ops,
1552 },
1553 },
1554};
1555
1556static struct clk_branch pmic_ssbi2_clk = {
1557 .halt_reg = 0x2fd8,
1558 .halt_check = BRANCH_HALT_VOTED,
1559 .halt_bit = 23,
1560 .clkr = {
1561 .enable_reg = 0x3080,
1562 .enable_mask = BIT(7),
1563 .hw.init = &(struct clk_init_data){
1564 .name = "pmic_ssbi2_clk",
1565 .ops = &clk_branch_ops,
1566 },
1567 },
1568};
1569
1570static struct clk_branch rpm_msg_ram_h_clk = {
1571 .hwcg_reg = 0x27e0,
1572 .hwcg_bit = 6,
1573 .halt_reg = 0x2fd8,
1574 .halt_check = BRANCH_HALT_VOTED,
1575 .halt_bit = 12,
1576 .clkr = {
1577 .enable_reg = 0x3080,
1578 .enable_mask = BIT(6),
1579 .hw.init = &(struct clk_init_data){
1580 .name = "rpm_msg_ram_h_clk",
1581 .ops = &clk_branch_ops,
1582 },
1583 },
1584};
1585
1586static struct clk_branch ebi2_clk = {
1587 .hwcg_reg = 0x2664,
1588 .hwcg_bit = 6,
1589 .halt_reg = 0x2fcc,
1590 .halt_bit = 24,
1591 .clkr = {
1592 .enable_reg = 0x2664,
1593 .enable_mask = BIT(6) | BIT(4),
1594 .hw.init = &(struct clk_init_data){
1595 .name = "ebi2_clk",
1596 .ops = &clk_branch_ops,
1597 },
1598 },
1599};
1600
1601static struct clk_branch ebi2_aon_clk = {
1602 .halt_reg = 0x2fcc,
1603 .halt_bit = 23,
1604 .clkr = {
1605 .enable_reg = 0x2664,
1606 .enable_mask = BIT(8),
1607 .hw.init = &(struct clk_init_data){
1608 .name = "ebi2_aon_clk",
1609 .ops = &clk_branch_ops,
1610 },
1611 },
1612};
1613
1614static struct clk_regmap *gcc_mdm9615_clks[] = {
1615 [PLL0] = &pll0.clkr,
1616 [PLL0_VOTE] = &pll0_vote,
1617 [PLL4_VOTE] = &pll4_vote,
1618 [PLL8] = &pll8.clkr,
1619 [PLL8_VOTE] = &pll8_vote,
1620 [PLL14] = &pll14.clkr,
1621 [PLL14_VOTE] = &pll14_vote,
1622 [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
1623 [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
1624 [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
1625 [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
1626 [GSBI3_UART_SRC] = &gsbi3_uart_src.clkr,
1627 [GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr,
1628 [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
1629 [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
1630 [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
1631 [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
1632 [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
1633 [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
1634 [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
1635 [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
1636 [GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr,
1637 [GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr,
1638 [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
1639 [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
1640 [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
1641 [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
1642 [GP0_SRC] = &gp0_src.clkr,
1643 [GP0_CLK] = &gp0_clk.clkr,
1644 [GP1_SRC] = &gp1_src.clkr,
1645 [GP1_CLK] = &gp1_clk.clkr,
1646 [GP2_SRC] = &gp2_src.clkr,
1647 [GP2_CLK] = &gp2_clk.clkr,
1648 [PMEM_A_CLK] = &pmem_clk.clkr,
1649 [PRNG_SRC] = &prng_src.clkr,
1650 [PRNG_CLK] = &prng_clk.clkr,
1651 [SDC1_SRC] = &sdc1_src.clkr,
1652 [SDC1_CLK] = &sdc1_clk.clkr,
1653 [SDC2_SRC] = &sdc2_src.clkr,
1654 [SDC2_CLK] = &sdc2_clk.clkr,
1655 [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr,
1656 [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
1657 [USB_HS1_SYSTEM_CLK_SRC] = &usb_hs1_system_src.clkr,
1658 [USB_HS1_SYSTEM_CLK] = &usb_hs1_system_clk.clkr,
1659 [USB_HSIC_XCVR_FS_SRC] = &usb_hsic_xcvr_fs_src.clkr,
1660 [USB_HSIC_XCVR_FS_CLK] = &usb_hsic_xcvr_fs_clk.clkr,
1661 [USB_HSIC_SYSTEM_CLK_SRC] = &usb_hsic_system_src.clkr,
1662 [USB_HSIC_SYSTEM_CLK] = &usb_hsic_system_clk.clkr,
1663 [USB_HSIC_HSIC_CLK_SRC] = &usb_hsic_hsic_src.clkr,
1664 [USB_HSIC_HSIC_CLK] = &usb_hsic_hsic_clk.clkr,
1665 [USB_HSIC_HSIO_CAL_CLK] = &usb_hsic_hsio_cal_clk.clkr,
1666 [CE1_CORE_CLK] = &ce1_core_clk.clkr,
1667 [CE1_H_CLK] = &ce1_h_clk.clkr,
1668 [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
1669 [GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
1670 [GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
1671 [GSBI3_H_CLK] = &gsbi3_h_clk.clkr,
1672 [GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
1673 [GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
1674 [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
1675 [USB_HSIC_H_CLK] = &usb_hsic_h_clk.clkr,
1676 [SDC1_H_CLK] = &sdc1_h_clk.clkr,
1677 [SDC2_H_CLK] = &sdc2_h_clk.clkr,
1678 [ADM0_CLK] = &adm0_clk.clkr,
1679 [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
1680 [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
1681 [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
1682 [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
1683 [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
1684 [EBI2_CLK] = &ebi2_clk.clkr,
1685 [EBI2_AON_CLK] = &ebi2_aon_clk.clkr,
1686};
1687
1688static const struct qcom_reset_map gcc_mdm9615_resets[] = {
1689 [DMA_BAM_RESET] = { 0x25c0, 7 },
1690 [CE1_H_RESET] = { 0x2720, 7 },
1691 [CE1_CORE_RESET] = { 0x2724, 7 },
1692 [SDC1_RESET] = { 0x2830 },
1693 [SDC2_RESET] = { 0x2850 },
1694 [ADM0_C2_RESET] = { 0x220c, 4 },
1695 [ADM0_C1_RESET] = { 0x220c, 3 },
1696 [ADM0_C0_RESET] = { 0x220c, 2 },
1697 [ADM0_PBUS_RESET] = { 0x220c, 1 },
1698 [ADM0_RESET] = { 0x220c },
1699 [USB_HS1_RESET] = { 0x2910 },
1700 [USB_HSIC_RESET] = { 0x2934 },
1701 [GSBI1_RESET] = { 0x29dc },
1702 [GSBI2_RESET] = { 0x29fc },
1703 [GSBI3_RESET] = { 0x2a1c },
1704 [GSBI4_RESET] = { 0x2a3c },
1705 [GSBI5_RESET] = { 0x2a5c },
1706 [PDM_RESET] = { 0x2CC0, 12 },
1707};
1708
1709static const struct regmap_config gcc_mdm9615_regmap_config = {
1710 .reg_bits = 32,
1711 .reg_stride = 4,
1712 .val_bits = 32,
1713 .max_register = 0x3660,
1714 .fast_io = true,
1715};
1716
1717static const struct qcom_cc_desc gcc_mdm9615_desc = {
1718 .config = &gcc_mdm9615_regmap_config,
1719 .clks = gcc_mdm9615_clks,
1720 .num_clks = ARRAY_SIZE(gcc_mdm9615_clks),
1721 .resets = gcc_mdm9615_resets,
1722 .num_resets = ARRAY_SIZE(gcc_mdm9615_resets),
1723};
1724
1725static const struct of_device_id gcc_mdm9615_match_table[] = {
1726 { .compatible = "qcom,gcc-mdm9615" },
1727 { }
1728};
1729MODULE_DEVICE_TABLE(of, gcc_mdm9615_match_table);
1730
1731static int gcc_mdm9615_probe(struct platform_device *pdev)
1732{
1733 struct regmap *regmap;
1734
1735 regmap = qcom_cc_map(pdev, desc: &gcc_mdm9615_desc);
1736 if (IS_ERR(ptr: regmap))
1737 return PTR_ERR(ptr: regmap);
1738
1739 return qcom_cc_really_probe(pdev, desc: &gcc_mdm9615_desc, regmap);
1740}
1741
1742static struct platform_driver gcc_mdm9615_driver = {
1743 .probe = gcc_mdm9615_probe,
1744 .driver = {
1745 .name = "gcc-mdm9615",
1746 .of_match_table = gcc_mdm9615_match_table,
1747 },
1748};
1749
1750static int __init gcc_mdm9615_init(void)
1751{
1752 return platform_driver_register(&gcc_mdm9615_driver);
1753}
1754core_initcall(gcc_mdm9615_init);
1755
1756static void __exit gcc_mdm9615_exit(void)
1757{
1758 platform_driver_unregister(&gcc_mdm9615_driver);
1759}
1760module_exit(gcc_mdm9615_exit);
1761
1762MODULE_DESCRIPTION("QCOM GCC MDM9615 Driver");
1763MODULE_LICENSE("GPL v2");
1764MODULE_ALIAS("platform:gcc-mdm9615");
1765

source code of linux/drivers/clk/qcom/gcc-mdm9615.c