Merge tag 'xtensa-for-next-20140815' into for_next
[cascardo/linux.git] / drivers / clk / qcom / gcc-ipq806x.c
1 /*
2  * Copyright (c) 2014, The Linux Foundation. All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
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
35 static struct clk_pll pll3 = {
36         .l_reg = 0x3164,
37         .m_reg = 0x3168,
38         .n_reg = 0x316c,
39         .config_reg = 0x3174,
40         .mode_reg = 0x3160,
41         .status_reg = 0x3178,
42         .status_bit = 16,
43         .clkr.hw.init = &(struct clk_init_data){
44                 .name = "pll3",
45                 .parent_names = (const char *[]){ "pxo" },
46                 .num_parents = 1,
47                 .ops = &clk_pll_ops,
48         },
49 };
50
51 static struct clk_pll pll8 = {
52         .l_reg = 0x3144,
53         .m_reg = 0x3148,
54         .n_reg = 0x314c,
55         .config_reg = 0x3154,
56         .mode_reg = 0x3140,
57         .status_reg = 0x3158,
58         .status_bit = 16,
59         .clkr.hw.init = &(struct clk_init_data){
60                 .name = "pll8",
61                 .parent_names = (const char *[]){ "pxo" },
62                 .num_parents = 1,
63                 .ops = &clk_pll_ops,
64         },
65 };
66
67 static struct clk_regmap pll8_vote = {
68         .enable_reg = 0x34c0,
69         .enable_mask = BIT(8),
70         .hw.init = &(struct clk_init_data){
71                 .name = "pll8_vote",
72                 .parent_names = (const char *[]){ "pll8" },
73                 .num_parents = 1,
74                 .ops = &clk_pll_vote_ops,
75         },
76 };
77
78 static struct clk_pll pll14 = {
79         .l_reg = 0x31c4,
80         .m_reg = 0x31c8,
81         .n_reg = 0x31cc,
82         .config_reg = 0x31d4,
83         .mode_reg = 0x31c0,
84         .status_reg = 0x31d8,
85         .status_bit = 16,
86         .clkr.hw.init = &(struct clk_init_data){
87                 .name = "pll14",
88                 .parent_names = (const char *[]){ "pxo" },
89                 .num_parents = 1,
90                 .ops = &clk_pll_ops,
91         },
92 };
93
94 static struct clk_regmap pll14_vote = {
95         .enable_reg = 0x34c0,
96         .enable_mask = BIT(14),
97         .hw.init = &(struct clk_init_data){
98                 .name = "pll14_vote",
99                 .parent_names = (const char *[]){ "pll14" },
100                 .num_parents = 1,
101                 .ops = &clk_pll_vote_ops,
102         },
103 };
104
105 #define P_PXO   0
106 #define P_PLL8  1
107 #define P_PLL3  1
108 #define P_PLL0  2
109 #define P_CXO   2
110
111 static const u8 gcc_pxo_pll8_map[] = {
112         [P_PXO]         = 0,
113         [P_PLL8]        = 3,
114 };
115
116 static const char *gcc_pxo_pll8[] = {
117         "pxo",
118         "pll8_vote",
119 };
120
121 static const u8 gcc_pxo_pll8_cxo_map[] = {
122         [P_PXO]         = 0,
123         [P_PLL8]        = 3,
124         [P_CXO]         = 5,
125 };
126
127 static const char *gcc_pxo_pll8_cxo[] = {
128         "pxo",
129         "pll8_vote",
130         "cxo",
131 };
132
133 static const u8 gcc_pxo_pll3_map[] = {
134         [P_PXO]         = 0,
135         [P_PLL3]        = 1,
136 };
137
138 static const u8 gcc_pxo_pll3_sata_map[] = {
139         [P_PXO]         = 0,
140         [P_PLL3]        = 6,
141 };
142
143 static const char *gcc_pxo_pll3[] = {
144         "pxo",
145         "pll3",
146 };
147
148 static const u8 gcc_pxo_pll8_pll0[] = {
149         [P_PXO]         = 0,
150         [P_PLL8]        = 3,
151         [P_PLL0]        = 2,
152 };
153
154 static const char *gcc_pxo_pll8_pll0_map[] = {
155         "pxo",
156         "pll8_vote",
157         "pll0",
158 };
159
160 static struct freq_tbl clk_tbl_gsbi_uart[] = {
161         {  1843200, P_PLL8, 2,  6, 625 },
162         {  3686400, P_PLL8, 2, 12, 625 },
163         {  7372800, P_PLL8, 2, 24, 625 },
164         { 14745600, P_PLL8, 2, 48, 625 },
165         { 16000000, P_PLL8, 4,  1,   6 },
166         { 24000000, P_PLL8, 4,  1,   4 },
167         { 32000000, P_PLL8, 4,  1,   3 },
168         { 40000000, P_PLL8, 1,  5,  48 },
169         { 46400000, P_PLL8, 1, 29, 240 },
170         { 48000000, P_PLL8, 4,  1,   2 },
171         { 51200000, P_PLL8, 1,  2,  15 },
172         { 56000000, P_PLL8, 1,  7,  48 },
173         { 58982400, P_PLL8, 1, 96, 625 },
174         { 64000000, P_PLL8, 2,  1,   3 },
175         { }
176 };
177
178 static struct clk_rcg gsbi1_uart_src = {
179         .ns_reg = 0x29d4,
180         .md_reg = 0x29d0,
181         .mn = {
182                 .mnctr_en_bit = 8,
183                 .mnctr_reset_bit = 7,
184                 .mnctr_mode_shift = 5,
185                 .n_val_shift = 16,
186                 .m_val_shift = 16,
187                 .width = 16,
188         },
189         .p = {
190                 .pre_div_shift = 3,
191                 .pre_div_width = 2,
192         },
193         .s = {
194                 .src_sel_shift = 0,
195                 .parent_map = gcc_pxo_pll8_map,
196         },
197         .freq_tbl = clk_tbl_gsbi_uart,
198         .clkr = {
199                 .enable_reg = 0x29d4,
200                 .enable_mask = BIT(11),
201                 .hw.init = &(struct clk_init_data){
202                         .name = "gsbi1_uart_src",
203                         .parent_names = gcc_pxo_pll8,
204                         .num_parents = 2,
205                         .ops = &clk_rcg_ops,
206                         .flags = CLK_SET_PARENT_GATE,
207                 },
208         },
209 };
210
211 static struct clk_branch gsbi1_uart_clk = {
212         .halt_reg = 0x2fcc,
213         .halt_bit = 12,
214         .clkr = {
215                 .enable_reg = 0x29d4,
216                 .enable_mask = BIT(9),
217                 .hw.init = &(struct clk_init_data){
218                         .name = "gsbi1_uart_clk",
219                         .parent_names = (const char *[]){
220                                 "gsbi1_uart_src",
221                         },
222                         .num_parents = 1,
223                         .ops = &clk_branch_ops,
224                         .flags = CLK_SET_RATE_PARENT,
225                 },
226         },
227 };
228
229 static struct clk_rcg gsbi2_uart_src = {
230         .ns_reg = 0x29f4,
231         .md_reg = 0x29f0,
232         .mn = {
233                 .mnctr_en_bit = 8,
234                 .mnctr_reset_bit = 7,
235                 .mnctr_mode_shift = 5,
236                 .n_val_shift = 16,
237                 .m_val_shift = 16,
238                 .width = 16,
239         },
240         .p = {
241                 .pre_div_shift = 3,
242                 .pre_div_width = 2,
243         },
244         .s = {
245                 .src_sel_shift = 0,
246                 .parent_map = gcc_pxo_pll8_map,
247         },
248         .freq_tbl = clk_tbl_gsbi_uart,
249         .clkr = {
250                 .enable_reg = 0x29f4,
251                 .enable_mask = BIT(11),
252                 .hw.init = &(struct clk_init_data){
253                         .name = "gsbi2_uart_src",
254                         .parent_names = gcc_pxo_pll8,
255                         .num_parents = 2,
256                         .ops = &clk_rcg_ops,
257                         .flags = CLK_SET_PARENT_GATE,
258                 },
259         },
260 };
261
262 static struct clk_branch gsbi2_uart_clk = {
263         .halt_reg = 0x2fcc,
264         .halt_bit = 8,
265         .clkr = {
266                 .enable_reg = 0x29f4,
267                 .enable_mask = BIT(9),
268                 .hw.init = &(struct clk_init_data){
269                         .name = "gsbi2_uart_clk",
270                         .parent_names = (const char *[]){
271                                 "gsbi2_uart_src",
272                         },
273                         .num_parents = 1,
274                         .ops = &clk_branch_ops,
275                         .flags = CLK_SET_RATE_PARENT,
276                 },
277         },
278 };
279
280 static struct clk_rcg gsbi4_uart_src = {
281         .ns_reg = 0x2a34,
282         .md_reg = 0x2a30,
283         .mn = {
284                 .mnctr_en_bit = 8,
285                 .mnctr_reset_bit = 7,
286                 .mnctr_mode_shift = 5,
287                 .n_val_shift = 16,
288                 .m_val_shift = 16,
289                 .width = 16,
290         },
291         .p = {
292                 .pre_div_shift = 3,
293                 .pre_div_width = 2,
294         },
295         .s = {
296                 .src_sel_shift = 0,
297                 .parent_map = gcc_pxo_pll8_map,
298         },
299         .freq_tbl = clk_tbl_gsbi_uart,
300         .clkr = {
301                 .enable_reg = 0x2a34,
302                 .enable_mask = BIT(11),
303                 .hw.init = &(struct clk_init_data){
304                         .name = "gsbi4_uart_src",
305                         .parent_names = gcc_pxo_pll8,
306                         .num_parents = 2,
307                         .ops = &clk_rcg_ops,
308                         .flags = CLK_SET_PARENT_GATE,
309                 },
310         },
311 };
312
313 static struct clk_branch gsbi4_uart_clk = {
314         .halt_reg = 0x2fd0,
315         .halt_bit = 26,
316         .clkr = {
317                 .enable_reg = 0x2a34,
318                 .enable_mask = BIT(9),
319                 .hw.init = &(struct clk_init_data){
320                         .name = "gsbi4_uart_clk",
321                         .parent_names = (const char *[]){
322                                 "gsbi4_uart_src",
323                         },
324                         .num_parents = 1,
325                         .ops = &clk_branch_ops,
326                         .flags = CLK_SET_RATE_PARENT,
327                 },
328         },
329 };
330
331 static struct clk_rcg gsbi5_uart_src = {
332         .ns_reg = 0x2a54,
333         .md_reg = 0x2a50,
334         .mn = {
335                 .mnctr_en_bit = 8,
336                 .mnctr_reset_bit = 7,
337                 .mnctr_mode_shift = 5,
338                 .n_val_shift = 16,
339                 .m_val_shift = 16,
340                 .width = 16,
341         },
342         .p = {
343                 .pre_div_shift = 3,
344                 .pre_div_width = 2,
345         },
346         .s = {
347                 .src_sel_shift = 0,
348                 .parent_map = gcc_pxo_pll8_map,
349         },
350         .freq_tbl = clk_tbl_gsbi_uart,
351         .clkr = {
352                 .enable_reg = 0x2a54,
353                 .enable_mask = BIT(11),
354                 .hw.init = &(struct clk_init_data){
355                         .name = "gsbi5_uart_src",
356                         .parent_names = gcc_pxo_pll8,
357                         .num_parents = 2,
358                         .ops = &clk_rcg_ops,
359                         .flags = CLK_SET_PARENT_GATE,
360                 },
361         },
362 };
363
364 static struct clk_branch gsbi5_uart_clk = {
365         .halt_reg = 0x2fd0,
366         .halt_bit = 22,
367         .clkr = {
368                 .enable_reg = 0x2a54,
369                 .enable_mask = BIT(9),
370                 .hw.init = &(struct clk_init_data){
371                         .name = "gsbi5_uart_clk",
372                         .parent_names = (const char *[]){
373                                 "gsbi5_uart_src",
374                         },
375                         .num_parents = 1,
376                         .ops = &clk_branch_ops,
377                         .flags = CLK_SET_RATE_PARENT,
378                 },
379         },
380 };
381
382 static struct clk_rcg gsbi6_uart_src = {
383         .ns_reg = 0x2a74,
384         .md_reg = 0x2a70,
385         .mn = {
386                 .mnctr_en_bit = 8,
387                 .mnctr_reset_bit = 7,
388                 .mnctr_mode_shift = 5,
389                 .n_val_shift = 16,
390                 .m_val_shift = 16,
391                 .width = 16,
392         },
393         .p = {
394                 .pre_div_shift = 3,
395                 .pre_div_width = 2,
396         },
397         .s = {
398                 .src_sel_shift = 0,
399                 .parent_map = gcc_pxo_pll8_map,
400         },
401         .freq_tbl = clk_tbl_gsbi_uart,
402         .clkr = {
403                 .enable_reg = 0x2a74,
404                 .enable_mask = BIT(11),
405                 .hw.init = &(struct clk_init_data){
406                         .name = "gsbi6_uart_src",
407                         .parent_names = gcc_pxo_pll8,
408                         .num_parents = 2,
409                         .ops = &clk_rcg_ops,
410                         .flags = CLK_SET_PARENT_GATE,
411                 },
412         },
413 };
414
415 static struct clk_branch gsbi6_uart_clk = {
416         .halt_reg = 0x2fd0,
417         .halt_bit = 18,
418         .clkr = {
419                 .enable_reg = 0x2a74,
420                 .enable_mask = BIT(9),
421                 .hw.init = &(struct clk_init_data){
422                         .name = "gsbi6_uart_clk",
423                         .parent_names = (const char *[]){
424                                 "gsbi6_uart_src",
425                         },
426                         .num_parents = 1,
427                         .ops = &clk_branch_ops,
428                         .flags = CLK_SET_RATE_PARENT,
429                 },
430         },
431 };
432
433 static struct clk_rcg gsbi7_uart_src = {
434         .ns_reg = 0x2a94,
435         .md_reg = 0x2a90,
436         .mn = {
437                 .mnctr_en_bit = 8,
438                 .mnctr_reset_bit = 7,
439                 .mnctr_mode_shift = 5,
440                 .n_val_shift = 16,
441                 .m_val_shift = 16,
442                 .width = 16,
443         },
444         .p = {
445                 .pre_div_shift = 3,
446                 .pre_div_width = 2,
447         },
448         .s = {
449                 .src_sel_shift = 0,
450                 .parent_map = gcc_pxo_pll8_map,
451         },
452         .freq_tbl = clk_tbl_gsbi_uart,
453         .clkr = {
454                 .enable_reg = 0x2a94,
455                 .enable_mask = BIT(11),
456                 .hw.init = &(struct clk_init_data){
457                         .name = "gsbi7_uart_src",
458                         .parent_names = gcc_pxo_pll8,
459                         .num_parents = 2,
460                         .ops = &clk_rcg_ops,
461                         .flags = CLK_SET_PARENT_GATE,
462                 },
463         },
464 };
465
466 static struct clk_branch gsbi7_uart_clk = {
467         .halt_reg = 0x2fd0,
468         .halt_bit = 14,
469         .clkr = {
470                 .enable_reg = 0x2a94,
471                 .enable_mask = BIT(9),
472                 .hw.init = &(struct clk_init_data){
473                         .name = "gsbi7_uart_clk",
474                         .parent_names = (const char *[]){
475                                 "gsbi7_uart_src",
476                         },
477                         .num_parents = 1,
478                         .ops = &clk_branch_ops,
479                         .flags = CLK_SET_RATE_PARENT,
480                 },
481         },
482 };
483
484 static struct freq_tbl clk_tbl_gsbi_qup[] = {
485         {  1100000, P_PXO,  1, 2, 49 },
486         {  5400000, P_PXO,  1, 1,  5 },
487         { 10800000, P_PXO,  1, 2,  5 },
488         { 15060000, P_PLL8, 1, 2, 51 },
489         { 24000000, P_PLL8, 4, 1,  4 },
490         { 25600000, P_PLL8, 1, 1, 15 },
491         { 27000000, P_PXO,  1, 0,  0 },
492         { 48000000, P_PLL8, 4, 1,  2 },
493         { 51200000, P_PLL8, 1, 2, 15 },
494         { }
495 };
496
497 static struct clk_rcg gsbi1_qup_src = {
498         .ns_reg = 0x29cc,
499         .md_reg = 0x29c8,
500         .mn = {
501                 .mnctr_en_bit = 8,
502                 .mnctr_reset_bit = 7,
503                 .mnctr_mode_shift = 5,
504                 .n_val_shift = 16,
505                 .m_val_shift = 16,
506                 .width = 8,
507         },
508         .p = {
509                 .pre_div_shift = 3,
510                 .pre_div_width = 2,
511         },
512         .s = {
513                 .src_sel_shift = 0,
514                 .parent_map = gcc_pxo_pll8_map,
515         },
516         .freq_tbl = clk_tbl_gsbi_qup,
517         .clkr = {
518                 .enable_reg = 0x29cc,
519                 .enable_mask = BIT(11),
520                 .hw.init = &(struct clk_init_data){
521                         .name = "gsbi1_qup_src",
522                         .parent_names = gcc_pxo_pll8,
523                         .num_parents = 2,
524                         .ops = &clk_rcg_ops,
525                         .flags = CLK_SET_PARENT_GATE,
526                 },
527         },
528 };
529
530 static struct clk_branch gsbi1_qup_clk = {
531         .halt_reg = 0x2fcc,
532         .halt_bit = 11,
533         .clkr = {
534                 .enable_reg = 0x29cc,
535                 .enable_mask = BIT(9),
536                 .hw.init = &(struct clk_init_data){
537                         .name = "gsbi1_qup_clk",
538                         .parent_names = (const char *[]){ "gsbi1_qup_src" },
539                         .num_parents = 1,
540                         .ops = &clk_branch_ops,
541                         .flags = CLK_SET_RATE_PARENT,
542                 },
543         },
544 };
545
546 static struct clk_rcg gsbi2_qup_src = {
547         .ns_reg = 0x29ec,
548         .md_reg = 0x29e8,
549         .mn = {
550                 .mnctr_en_bit = 8,
551                 .mnctr_reset_bit = 7,
552                 .mnctr_mode_shift = 5,
553                 .n_val_shift = 16,
554                 .m_val_shift = 16,
555                 .width = 8,
556         },
557         .p = {
558                 .pre_div_shift = 3,
559                 .pre_div_width = 2,
560         },
561         .s = {
562                 .src_sel_shift = 0,
563                 .parent_map = gcc_pxo_pll8_map,
564         },
565         .freq_tbl = clk_tbl_gsbi_qup,
566         .clkr = {
567                 .enable_reg = 0x29ec,
568                 .enable_mask = BIT(11),
569                 .hw.init = &(struct clk_init_data){
570                         .name = "gsbi2_qup_src",
571                         .parent_names = gcc_pxo_pll8,
572                         .num_parents = 2,
573                         .ops = &clk_rcg_ops,
574                         .flags = CLK_SET_PARENT_GATE,
575                 },
576         },
577 };
578
579 static struct clk_branch gsbi2_qup_clk = {
580         .halt_reg = 0x2fcc,
581         .halt_bit = 6,
582         .clkr = {
583                 .enable_reg = 0x29ec,
584                 .enable_mask = BIT(9),
585                 .hw.init = &(struct clk_init_data){
586                         .name = "gsbi2_qup_clk",
587                         .parent_names = (const char *[]){ "gsbi2_qup_src" },
588                         .num_parents = 1,
589                         .ops = &clk_branch_ops,
590                         .flags = CLK_SET_RATE_PARENT,
591                 },
592         },
593 };
594
595 static struct clk_rcg gsbi4_qup_src = {
596         .ns_reg = 0x2a2c,
597         .md_reg = 0x2a28,
598         .mn = {
599                 .mnctr_en_bit = 8,
600                 .mnctr_reset_bit = 7,
601                 .mnctr_mode_shift = 5,
602                 .n_val_shift = 16,
603                 .m_val_shift = 16,
604                 .width = 8,
605         },
606         .p = {
607                 .pre_div_shift = 3,
608                 .pre_div_width = 2,
609         },
610         .s = {
611                 .src_sel_shift = 0,
612                 .parent_map = gcc_pxo_pll8_map,
613         },
614         .freq_tbl = clk_tbl_gsbi_qup,
615         .clkr = {
616                 .enable_reg = 0x2a2c,
617                 .enable_mask = BIT(11),
618                 .hw.init = &(struct clk_init_data){
619                         .name = "gsbi4_qup_src",
620                         .parent_names = gcc_pxo_pll8,
621                         .num_parents = 2,
622                         .ops = &clk_rcg_ops,
623                         .flags = CLK_SET_PARENT_GATE,
624                 },
625         },
626 };
627
628 static struct clk_branch gsbi4_qup_clk = {
629         .halt_reg = 0x2fd0,
630         .halt_bit = 24,
631         .clkr = {
632                 .enable_reg = 0x2a2c,
633                 .enable_mask = BIT(9),
634                 .hw.init = &(struct clk_init_data){
635                         .name = "gsbi4_qup_clk",
636                         .parent_names = (const char *[]){ "gsbi4_qup_src" },
637                         .num_parents = 1,
638                         .ops = &clk_branch_ops,
639                         .flags = CLK_SET_RATE_PARENT,
640                 },
641         },
642 };
643
644 static struct clk_rcg gsbi5_qup_src = {
645         .ns_reg = 0x2a4c,
646         .md_reg = 0x2a48,
647         .mn = {
648                 .mnctr_en_bit = 8,
649                 .mnctr_reset_bit = 7,
650                 .mnctr_mode_shift = 5,
651                 .n_val_shift = 16,
652                 .m_val_shift = 16,
653                 .width = 8,
654         },
655         .p = {
656                 .pre_div_shift = 3,
657                 .pre_div_width = 2,
658         },
659         .s = {
660                 .src_sel_shift = 0,
661                 .parent_map = gcc_pxo_pll8_map,
662         },
663         .freq_tbl = clk_tbl_gsbi_qup,
664         .clkr = {
665                 .enable_reg = 0x2a4c,
666                 .enable_mask = BIT(11),
667                 .hw.init = &(struct clk_init_data){
668                         .name = "gsbi5_qup_src",
669                         .parent_names = gcc_pxo_pll8,
670                         .num_parents = 2,
671                         .ops = &clk_rcg_ops,
672                         .flags = CLK_SET_PARENT_GATE,
673                 },
674         },
675 };
676
677 static struct clk_branch gsbi5_qup_clk = {
678         .halt_reg = 0x2fd0,
679         .halt_bit = 20,
680         .clkr = {
681                 .enable_reg = 0x2a4c,
682                 .enable_mask = BIT(9),
683                 .hw.init = &(struct clk_init_data){
684                         .name = "gsbi5_qup_clk",
685                         .parent_names = (const char *[]){ "gsbi5_qup_src" },
686                         .num_parents = 1,
687                         .ops = &clk_branch_ops,
688                         .flags = CLK_SET_RATE_PARENT,
689                 },
690         },
691 };
692
693 static struct clk_rcg gsbi6_qup_src = {
694         .ns_reg = 0x2a6c,
695         .md_reg = 0x2a68,
696         .mn = {
697                 .mnctr_en_bit = 8,
698                 .mnctr_reset_bit = 7,
699                 .mnctr_mode_shift = 5,
700                 .n_val_shift = 16,
701                 .m_val_shift = 16,
702                 .width = 8,
703         },
704         .p = {
705                 .pre_div_shift = 3,
706                 .pre_div_width = 2,
707         },
708         .s = {
709                 .src_sel_shift = 0,
710                 .parent_map = gcc_pxo_pll8_map,
711         },
712         .freq_tbl = clk_tbl_gsbi_qup,
713         .clkr = {
714                 .enable_reg = 0x2a6c,
715                 .enable_mask = BIT(11),
716                 .hw.init = &(struct clk_init_data){
717                         .name = "gsbi6_qup_src",
718                         .parent_names = gcc_pxo_pll8,
719                         .num_parents = 2,
720                         .ops = &clk_rcg_ops,
721                         .flags = CLK_SET_PARENT_GATE,
722                 },
723         },
724 };
725
726 static struct clk_branch gsbi6_qup_clk = {
727         .halt_reg = 0x2fd0,
728         .halt_bit = 16,
729         .clkr = {
730                 .enable_reg = 0x2a6c,
731                 .enable_mask = BIT(9),
732                 .hw.init = &(struct clk_init_data){
733                         .name = "gsbi6_qup_clk",
734                         .parent_names = (const char *[]){ "gsbi6_qup_src" },
735                         .num_parents = 1,
736                         .ops = &clk_branch_ops,
737                         .flags = CLK_SET_RATE_PARENT,
738                 },
739         },
740 };
741
742 static struct clk_rcg gsbi7_qup_src = {
743         .ns_reg = 0x2a8c,
744         .md_reg = 0x2a88,
745         .mn = {
746                 .mnctr_en_bit = 8,
747                 .mnctr_reset_bit = 7,
748                 .mnctr_mode_shift = 5,
749                 .n_val_shift = 16,
750                 .m_val_shift = 16,
751                 .width = 8,
752         },
753         .p = {
754                 .pre_div_shift = 3,
755                 .pre_div_width = 2,
756         },
757         .s = {
758                 .src_sel_shift = 0,
759                 .parent_map = gcc_pxo_pll8_map,
760         },
761         .freq_tbl = clk_tbl_gsbi_qup,
762         .clkr = {
763                 .enable_reg = 0x2a8c,
764                 .enable_mask = BIT(11),
765                 .hw.init = &(struct clk_init_data){
766                         .name = "gsbi7_qup_src",
767                         .parent_names = gcc_pxo_pll8,
768                         .num_parents = 2,
769                         .ops = &clk_rcg_ops,
770                         .flags = CLK_SET_PARENT_GATE,
771                 },
772         },
773 };
774
775 static struct clk_branch gsbi7_qup_clk = {
776         .halt_reg = 0x2fd0,
777         .halt_bit = 12,
778         .clkr = {
779                 .enable_reg = 0x2a8c,
780                 .enable_mask = BIT(9),
781                 .hw.init = &(struct clk_init_data){
782                         .name = "gsbi7_qup_clk",
783                         .parent_names = (const char *[]){ "gsbi7_qup_src" },
784                         .num_parents = 1,
785                         .ops = &clk_branch_ops,
786                         .flags = CLK_SET_RATE_PARENT,
787                 },
788         },
789 };
790
791 static struct clk_branch gsbi1_h_clk = {
792         .hwcg_reg = 0x29c0,
793         .hwcg_bit = 6,
794         .halt_reg = 0x2fcc,
795         .halt_bit = 13,
796         .clkr = {
797                 .enable_reg = 0x29c0,
798                 .enable_mask = BIT(4),
799                 .hw.init = &(struct clk_init_data){
800                         .name = "gsbi1_h_clk",
801                         .ops = &clk_branch_ops,
802                         .flags = CLK_IS_ROOT,
803                 },
804         },
805 };
806
807 static struct clk_branch gsbi2_h_clk = {
808         .hwcg_reg = 0x29e0,
809         .hwcg_bit = 6,
810         .halt_reg = 0x2fcc,
811         .halt_bit = 9,
812         .clkr = {
813                 .enable_reg = 0x29e0,
814                 .enable_mask = BIT(4),
815                 .hw.init = &(struct clk_init_data){
816                         .name = "gsbi2_h_clk",
817                         .ops = &clk_branch_ops,
818                         .flags = CLK_IS_ROOT,
819                 },
820         },
821 };
822
823 static struct clk_branch gsbi4_h_clk = {
824         .hwcg_reg = 0x2a20,
825         .hwcg_bit = 6,
826         .halt_reg = 0x2fd0,
827         .halt_bit = 27,
828         .clkr = {
829                 .enable_reg = 0x2a20,
830                 .enable_mask = BIT(4),
831                 .hw.init = &(struct clk_init_data){
832                         .name = "gsbi4_h_clk",
833                         .ops = &clk_branch_ops,
834                         .flags = CLK_IS_ROOT,
835                 },
836         },
837 };
838
839 static struct clk_branch gsbi5_h_clk = {
840         .hwcg_reg = 0x2a40,
841         .hwcg_bit = 6,
842         .halt_reg = 0x2fd0,
843         .halt_bit = 23,
844         .clkr = {
845                 .enable_reg = 0x2a40,
846                 .enable_mask = BIT(4),
847                 .hw.init = &(struct clk_init_data){
848                         .name = "gsbi5_h_clk",
849                         .ops = &clk_branch_ops,
850                         .flags = CLK_IS_ROOT,
851                 },
852         },
853 };
854
855 static struct clk_branch gsbi6_h_clk = {
856         .hwcg_reg = 0x2a60,
857         .hwcg_bit = 6,
858         .halt_reg = 0x2fd0,
859         .halt_bit = 19,
860         .clkr = {
861                 .enable_reg = 0x2a60,
862                 .enable_mask = BIT(4),
863                 .hw.init = &(struct clk_init_data){
864                         .name = "gsbi6_h_clk",
865                         .ops = &clk_branch_ops,
866                         .flags = CLK_IS_ROOT,
867                 },
868         },
869 };
870
871 static struct clk_branch gsbi7_h_clk = {
872         .hwcg_reg = 0x2a80,
873         .hwcg_bit = 6,
874         .halt_reg = 0x2fd0,
875         .halt_bit = 15,
876         .clkr = {
877                 .enable_reg = 0x2a80,
878                 .enable_mask = BIT(4),
879                 .hw.init = &(struct clk_init_data){
880                         .name = "gsbi7_h_clk",
881                         .ops = &clk_branch_ops,
882                         .flags = CLK_IS_ROOT,
883                 },
884         },
885 };
886
887 static const struct freq_tbl clk_tbl_gp[] = {
888         { 12500000, P_PXO,  2, 0, 0 },
889         { 25000000, P_PXO,  1, 0, 0 },
890         { 64000000, P_PLL8, 2, 1, 3 },
891         { 76800000, P_PLL8, 1, 1, 5 },
892         { 96000000, P_PLL8, 4, 0, 0 },
893         { 128000000, P_PLL8, 3, 0, 0 },
894         { 192000000, P_PLL8, 2, 0, 0 },
895         { }
896 };
897
898 static struct clk_rcg gp0_src = {
899         .ns_reg = 0x2d24,
900         .md_reg = 0x2d00,
901         .mn = {
902                 .mnctr_en_bit = 8,
903                 .mnctr_reset_bit = 7,
904                 .mnctr_mode_shift = 5,
905                 .n_val_shift = 16,
906                 .m_val_shift = 16,
907                 .width = 8,
908         },
909         .p = {
910                 .pre_div_shift = 3,
911                 .pre_div_width = 2,
912         },
913         .s = {
914                 .src_sel_shift = 0,
915                 .parent_map = gcc_pxo_pll8_cxo_map,
916         },
917         .freq_tbl = clk_tbl_gp,
918         .clkr = {
919                 .enable_reg = 0x2d24,
920                 .enable_mask = BIT(11),
921                 .hw.init = &(struct clk_init_data){
922                         .name = "gp0_src",
923                         .parent_names = gcc_pxo_pll8_cxo,
924                         .num_parents = 3,
925                         .ops = &clk_rcg_ops,
926                         .flags = CLK_SET_PARENT_GATE,
927                 },
928         }
929 };
930
931 static struct clk_branch gp0_clk = {
932         .halt_reg = 0x2fd8,
933         .halt_bit = 7,
934         .clkr = {
935                 .enable_reg = 0x2d24,
936                 .enable_mask = BIT(9),
937                 .hw.init = &(struct clk_init_data){
938                         .name = "gp0_clk",
939                         .parent_names = (const char *[]){ "gp0_src" },
940                         .num_parents = 1,
941                         .ops = &clk_branch_ops,
942                         .flags = CLK_SET_RATE_PARENT,
943                 },
944         },
945 };
946
947 static struct clk_rcg gp1_src = {
948         .ns_reg = 0x2d44,
949         .md_reg = 0x2d40,
950         .mn = {
951                 .mnctr_en_bit = 8,
952                 .mnctr_reset_bit = 7,
953                 .mnctr_mode_shift = 5,
954                 .n_val_shift = 16,
955                 .m_val_shift = 16,
956                 .width = 8,
957         },
958         .p = {
959                 .pre_div_shift = 3,
960                 .pre_div_width = 2,
961         },
962         .s = {
963                 .src_sel_shift = 0,
964                 .parent_map = gcc_pxo_pll8_cxo_map,
965         },
966         .freq_tbl = clk_tbl_gp,
967         .clkr = {
968                 .enable_reg = 0x2d44,
969                 .enable_mask = BIT(11),
970                 .hw.init = &(struct clk_init_data){
971                         .name = "gp1_src",
972                         .parent_names = gcc_pxo_pll8_cxo,
973                         .num_parents = 3,
974                         .ops = &clk_rcg_ops,
975                         .flags = CLK_SET_RATE_GATE,
976                 },
977         }
978 };
979
980 static struct clk_branch gp1_clk = {
981         .halt_reg = 0x2fd8,
982         .halt_bit = 6,
983         .clkr = {
984                 .enable_reg = 0x2d44,
985                 .enable_mask = BIT(9),
986                 .hw.init = &(struct clk_init_data){
987                         .name = "gp1_clk",
988                         .parent_names = (const char *[]){ "gp1_src" },
989                         .num_parents = 1,
990                         .ops = &clk_branch_ops,
991                         .flags = CLK_SET_RATE_PARENT,
992                 },
993         },
994 };
995
996 static struct clk_rcg gp2_src = {
997         .ns_reg = 0x2d64,
998         .md_reg = 0x2d60,
999         .mn = {
1000                 .mnctr_en_bit = 8,
1001                 .mnctr_reset_bit = 7,
1002                 .mnctr_mode_shift = 5,
1003                 .n_val_shift = 16,
1004                 .m_val_shift = 16,
1005                 .width = 8,
1006         },
1007         .p = {
1008                 .pre_div_shift = 3,
1009                 .pre_div_width = 2,
1010         },
1011         .s = {
1012                 .src_sel_shift = 0,
1013                 .parent_map = gcc_pxo_pll8_cxo_map,
1014         },
1015         .freq_tbl = clk_tbl_gp,
1016         .clkr = {
1017                 .enable_reg = 0x2d64,
1018                 .enable_mask = BIT(11),
1019                 .hw.init = &(struct clk_init_data){
1020                         .name = "gp2_src",
1021                         .parent_names = gcc_pxo_pll8_cxo,
1022                         .num_parents = 3,
1023                         .ops = &clk_rcg_ops,
1024                         .flags = CLK_SET_RATE_GATE,
1025                 },
1026         }
1027 };
1028
1029 static struct clk_branch gp2_clk = {
1030         .halt_reg = 0x2fd8,
1031         .halt_bit = 5,
1032         .clkr = {
1033                 .enable_reg = 0x2d64,
1034                 .enable_mask = BIT(9),
1035                 .hw.init = &(struct clk_init_data){
1036                         .name = "gp2_clk",
1037                         .parent_names = (const char *[]){ "gp2_src" },
1038                         .num_parents = 1,
1039                         .ops = &clk_branch_ops,
1040                         .flags = CLK_SET_RATE_PARENT,
1041                 },
1042         },
1043 };
1044
1045 static struct clk_branch pmem_clk = {
1046         .hwcg_reg = 0x25a0,
1047         .hwcg_bit = 6,
1048         .halt_reg = 0x2fc8,
1049         .halt_bit = 20,
1050         .clkr = {
1051                 .enable_reg = 0x25a0,
1052                 .enable_mask = BIT(4),
1053                 .hw.init = &(struct clk_init_data){
1054                         .name = "pmem_clk",
1055                         .ops = &clk_branch_ops,
1056                         .flags = CLK_IS_ROOT,
1057                 },
1058         },
1059 };
1060
1061 static struct clk_rcg prng_src = {
1062         .ns_reg = 0x2e80,
1063         .p = {
1064                 .pre_div_shift = 3,
1065                 .pre_div_width = 4,
1066         },
1067         .s = {
1068                 .src_sel_shift = 0,
1069                 .parent_map = gcc_pxo_pll8_map,
1070         },
1071         .clkr = {
1072                 .hw.init = &(struct clk_init_data){
1073                         .name = "prng_src",
1074                         .parent_names = gcc_pxo_pll8,
1075                         .num_parents = 2,
1076                         .ops = &clk_rcg_ops,
1077                 },
1078         },
1079 };
1080
1081 static struct clk_branch prng_clk = {
1082         .halt_reg = 0x2fd8,
1083         .halt_check = BRANCH_HALT_VOTED,
1084         .halt_bit = 10,
1085         .clkr = {
1086                 .enable_reg = 0x3080,
1087                 .enable_mask = BIT(10),
1088                 .hw.init = &(struct clk_init_data){
1089                         .name = "prng_clk",
1090                         .parent_names = (const char *[]){ "prng_src" },
1091                         .num_parents = 1,
1092                         .ops = &clk_branch_ops,
1093                 },
1094         },
1095 };
1096
1097 static const struct freq_tbl clk_tbl_sdc[] = {
1098         {    144000, P_PXO,   5, 18,625 },
1099         {    400000, P_PLL8,  4, 1, 240 },
1100         {  16000000, P_PLL8,  4, 1,   6 },
1101         {  17070000, P_PLL8,  1, 2,  45 },
1102         {  20210000, P_PLL8,  1, 1,  19 },
1103         {  24000000, P_PLL8,  4, 1,   4 },
1104         {  48000000, P_PLL8,  4, 1,   2 },
1105         {  64000000, P_PLL8,  3, 1,   2 },
1106         {  96000000, P_PLL8,  4, 0,   0 },
1107         { 192000000, P_PLL8,  2, 0,   0 },
1108         { }
1109 };
1110
1111 static struct clk_rcg sdc1_src = {
1112         .ns_reg = 0x282c,
1113         .md_reg = 0x2828,
1114         .mn = {
1115                 .mnctr_en_bit = 8,
1116                 .mnctr_reset_bit = 7,
1117                 .mnctr_mode_shift = 5,
1118                 .n_val_shift = 16,
1119                 .m_val_shift = 16,
1120                 .width = 8,
1121         },
1122         .p = {
1123                 .pre_div_shift = 3,
1124                 .pre_div_width = 2,
1125         },
1126         .s = {
1127                 .src_sel_shift = 0,
1128                 .parent_map = gcc_pxo_pll8_map,
1129         },
1130         .freq_tbl = clk_tbl_sdc,
1131         .clkr = {
1132                 .enable_reg = 0x282c,
1133                 .enable_mask = BIT(11),
1134                 .hw.init = &(struct clk_init_data){
1135                         .name = "sdc1_src",
1136                         .parent_names = gcc_pxo_pll8,
1137                         .num_parents = 2,
1138                         .ops = &clk_rcg_ops,
1139                         .flags = CLK_SET_RATE_GATE,
1140                 },
1141         }
1142 };
1143
1144 static struct clk_branch sdc1_clk = {
1145         .halt_reg = 0x2fc8,
1146         .halt_bit = 6,
1147         .clkr = {
1148                 .enable_reg = 0x282c,
1149                 .enable_mask = BIT(9),
1150                 .hw.init = &(struct clk_init_data){
1151                         .name = "sdc1_clk",
1152                         .parent_names = (const char *[]){ "sdc1_src" },
1153                         .num_parents = 1,
1154                         .ops = &clk_branch_ops,
1155                         .flags = CLK_SET_RATE_PARENT,
1156                 },
1157         },
1158 };
1159
1160 static struct clk_rcg sdc3_src = {
1161         .ns_reg = 0x286c,
1162         .md_reg = 0x2868,
1163         .mn = {
1164                 .mnctr_en_bit = 8,
1165                 .mnctr_reset_bit = 7,
1166                 .mnctr_mode_shift = 5,
1167                 .n_val_shift = 16,
1168                 .m_val_shift = 16,
1169                 .width = 8,
1170         },
1171         .p = {
1172                 .pre_div_shift = 3,
1173                 .pre_div_width = 2,
1174         },
1175         .s = {
1176                 .src_sel_shift = 0,
1177                 .parent_map = gcc_pxo_pll8_map,
1178         },
1179         .freq_tbl = clk_tbl_sdc,
1180         .clkr = {
1181                 .enable_reg = 0x286c,
1182                 .enable_mask = BIT(11),
1183                 .hw.init = &(struct clk_init_data){
1184                         .name = "sdc3_src",
1185                         .parent_names = gcc_pxo_pll8,
1186                         .num_parents = 2,
1187                         .ops = &clk_rcg_ops,
1188                         .flags = CLK_SET_RATE_GATE,
1189                 },
1190         }
1191 };
1192
1193 static struct clk_branch sdc3_clk = {
1194         .halt_reg = 0x2fc8,
1195         .halt_bit = 4,
1196         .clkr = {
1197                 .enable_reg = 0x286c,
1198                 .enable_mask = BIT(9),
1199                 .hw.init = &(struct clk_init_data){
1200                         .name = "sdc3_clk",
1201                         .parent_names = (const char *[]){ "sdc3_src" },
1202                         .num_parents = 1,
1203                         .ops = &clk_branch_ops,
1204                         .flags = CLK_SET_RATE_PARENT,
1205                 },
1206         },
1207 };
1208
1209 static struct clk_branch sdc1_h_clk = {
1210         .hwcg_reg = 0x2820,
1211         .hwcg_bit = 6,
1212         .halt_reg = 0x2fc8,
1213         .halt_bit = 11,
1214         .clkr = {
1215                 .enable_reg = 0x2820,
1216                 .enable_mask = BIT(4),
1217                 .hw.init = &(struct clk_init_data){
1218                         .name = "sdc1_h_clk",
1219                         .ops = &clk_branch_ops,
1220                         .flags = CLK_IS_ROOT,
1221                 },
1222         },
1223 };
1224
1225 static struct clk_branch sdc3_h_clk = {
1226         .hwcg_reg = 0x2860,
1227         .hwcg_bit = 6,
1228         .halt_reg = 0x2fc8,
1229         .halt_bit = 9,
1230         .clkr = {
1231                 .enable_reg = 0x2860,
1232                 .enable_mask = BIT(4),
1233                 .hw.init = &(struct clk_init_data){
1234                         .name = "sdc3_h_clk",
1235                         .ops = &clk_branch_ops,
1236                         .flags = CLK_IS_ROOT,
1237                 },
1238         },
1239 };
1240
1241 static const struct freq_tbl clk_tbl_tsif_ref[] = {
1242         { 105000, P_PXO,  1, 1, 256 },
1243         { }
1244 };
1245
1246 static struct clk_rcg tsif_ref_src = {
1247         .ns_reg = 0x2710,
1248         .md_reg = 0x270c,
1249         .mn = {
1250                 .mnctr_en_bit = 8,
1251                 .mnctr_reset_bit = 7,
1252                 .mnctr_mode_shift = 5,
1253                 .n_val_shift = 16,
1254                 .m_val_shift = 16,
1255                 .width = 16,
1256         },
1257         .p = {
1258                 .pre_div_shift = 3,
1259                 .pre_div_width = 2,
1260         },
1261         .s = {
1262                 .src_sel_shift = 0,
1263                 .parent_map = gcc_pxo_pll8_map,
1264         },
1265         .freq_tbl = clk_tbl_tsif_ref,
1266         .clkr = {
1267                 .enable_reg = 0x2710,
1268                 .enable_mask = BIT(11),
1269                 .hw.init = &(struct clk_init_data){
1270                         .name = "tsif_ref_src",
1271                         .parent_names = gcc_pxo_pll8,
1272                         .num_parents = 2,
1273                         .ops = &clk_rcg_ops,
1274                         .flags = CLK_SET_RATE_GATE,
1275                 },
1276         }
1277 };
1278
1279 static struct clk_branch tsif_ref_clk = {
1280         .halt_reg = 0x2fd4,
1281         .halt_bit = 5,
1282         .clkr = {
1283                 .enable_reg = 0x2710,
1284                 .enable_mask = BIT(9),
1285                 .hw.init = &(struct clk_init_data){
1286                         .name = "tsif_ref_clk",
1287                         .parent_names = (const char *[]){ "tsif_ref_src" },
1288                         .num_parents = 1,
1289                         .ops = &clk_branch_ops,
1290                         .flags = CLK_SET_RATE_PARENT,
1291                 },
1292         },
1293 };
1294
1295 static struct clk_branch tsif_h_clk = {
1296         .hwcg_reg = 0x2700,
1297         .hwcg_bit = 6,
1298         .halt_reg = 0x2fd4,
1299         .halt_bit = 7,
1300         .clkr = {
1301                 .enable_reg = 0x2700,
1302                 .enable_mask = BIT(4),
1303                 .hw.init = &(struct clk_init_data){
1304                         .name = "tsif_h_clk",
1305                         .ops = &clk_branch_ops,
1306                         .flags = CLK_IS_ROOT,
1307                 },
1308         },
1309 };
1310
1311 static struct clk_branch dma_bam_h_clk = {
1312         .hwcg_reg = 0x25c0,
1313         .hwcg_bit = 6,
1314         .halt_reg = 0x2fc8,
1315         .halt_bit = 12,
1316         .clkr = {
1317                 .enable_reg = 0x25c0,
1318                 .enable_mask = BIT(4),
1319                 .hw.init = &(struct clk_init_data){
1320                         .name = "dma_bam_h_clk",
1321                         .ops = &clk_branch_ops,
1322                         .flags = CLK_IS_ROOT,
1323                 },
1324         },
1325 };
1326
1327 static struct clk_branch adm0_clk = {
1328         .halt_reg = 0x2fdc,
1329         .halt_check = BRANCH_HALT_VOTED,
1330         .halt_bit = 12,
1331         .clkr = {
1332                 .enable_reg = 0x3080,
1333                 .enable_mask = BIT(2),
1334                 .hw.init = &(struct clk_init_data){
1335                         .name = "adm0_clk",
1336                         .ops = &clk_branch_ops,
1337                         .flags = CLK_IS_ROOT,
1338                 },
1339         },
1340 };
1341
1342 static struct clk_branch adm0_pbus_clk = {
1343         .hwcg_reg = 0x2208,
1344         .hwcg_bit = 6,
1345         .halt_reg = 0x2fdc,
1346         .halt_check = BRANCH_HALT_VOTED,
1347         .halt_bit = 11,
1348         .clkr = {
1349                 .enable_reg = 0x3080,
1350                 .enable_mask = BIT(3),
1351                 .hw.init = &(struct clk_init_data){
1352                         .name = "adm0_pbus_clk",
1353                         .ops = &clk_branch_ops,
1354                         .flags = CLK_IS_ROOT,
1355                 },
1356         },
1357 };
1358
1359 static struct clk_branch pmic_arb0_h_clk = {
1360         .halt_reg = 0x2fd8,
1361         .halt_check = BRANCH_HALT_VOTED,
1362         .halt_bit = 22,
1363         .clkr = {
1364                 .enable_reg = 0x3080,
1365                 .enable_mask = BIT(8),
1366                 .hw.init = &(struct clk_init_data){
1367                         .name = "pmic_arb0_h_clk",
1368                         .ops = &clk_branch_ops,
1369                         .flags = CLK_IS_ROOT,
1370                 },
1371         },
1372 };
1373
1374 static struct clk_branch pmic_arb1_h_clk = {
1375         .halt_reg = 0x2fd8,
1376         .halt_check = BRANCH_HALT_VOTED,
1377         .halt_bit = 21,
1378         .clkr = {
1379                 .enable_reg = 0x3080,
1380                 .enable_mask = BIT(9),
1381                 .hw.init = &(struct clk_init_data){
1382                         .name = "pmic_arb1_h_clk",
1383                         .ops = &clk_branch_ops,
1384                         .flags = CLK_IS_ROOT,
1385                 },
1386         },
1387 };
1388
1389 static struct clk_branch pmic_ssbi2_clk = {
1390         .halt_reg = 0x2fd8,
1391         .halt_check = BRANCH_HALT_VOTED,
1392         .halt_bit = 23,
1393         .clkr = {
1394                 .enable_reg = 0x3080,
1395                 .enable_mask = BIT(7),
1396                 .hw.init = &(struct clk_init_data){
1397                         .name = "pmic_ssbi2_clk",
1398                         .ops = &clk_branch_ops,
1399                         .flags = CLK_IS_ROOT,
1400                 },
1401         },
1402 };
1403
1404 static struct clk_branch rpm_msg_ram_h_clk = {
1405         .hwcg_reg = 0x27e0,
1406         .hwcg_bit = 6,
1407         .halt_reg = 0x2fd8,
1408         .halt_check = BRANCH_HALT_VOTED,
1409         .halt_bit = 12,
1410         .clkr = {
1411                 .enable_reg = 0x3080,
1412                 .enable_mask = BIT(6),
1413                 .hw.init = &(struct clk_init_data){
1414                         .name = "rpm_msg_ram_h_clk",
1415                         .ops = &clk_branch_ops,
1416                         .flags = CLK_IS_ROOT,
1417                 },
1418         },
1419 };
1420
1421 static const struct freq_tbl clk_tbl_pcie_ref[] = {
1422         { 100000000, P_PLL3,  12, 0, 0 },
1423         { }
1424 };
1425
1426 static struct clk_rcg pcie_ref_src = {
1427         .ns_reg = 0x3860,
1428         .p = {
1429                 .pre_div_shift = 3,
1430                 .pre_div_width = 4,
1431         },
1432         .s = {
1433                 .src_sel_shift = 0,
1434                 .parent_map = gcc_pxo_pll3_map,
1435         },
1436         .freq_tbl = clk_tbl_pcie_ref,
1437         .clkr = {
1438                 .enable_reg = 0x3860,
1439                 .enable_mask = BIT(11),
1440                 .hw.init = &(struct clk_init_data){
1441                         .name = "pcie_ref_src",
1442                         .parent_names = gcc_pxo_pll3,
1443                         .num_parents = 2,
1444                         .ops = &clk_rcg_ops,
1445                         .flags = CLK_SET_RATE_GATE,
1446                 },
1447         },
1448 };
1449
1450 static struct clk_branch pcie_ref_src_clk = {
1451         .halt_reg = 0x2fdc,
1452         .halt_bit = 30,
1453         .clkr = {
1454                 .enable_reg = 0x3860,
1455                 .enable_mask = BIT(9),
1456                 .hw.init = &(struct clk_init_data){
1457                         .name = "pcie_ref_src_clk",
1458                         .parent_names = (const char *[]){ "pcie_ref_src" },
1459                         .num_parents = 1,
1460                         .ops = &clk_branch_ops,
1461                         .flags = CLK_SET_RATE_PARENT,
1462                 },
1463         },
1464 };
1465
1466 static struct clk_branch pcie_a_clk = {
1467         .halt_reg = 0x2fc0,
1468         .halt_bit = 13,
1469         .clkr = {
1470                 .enable_reg = 0x22c0,
1471                 .enable_mask = BIT(4),
1472                 .hw.init = &(struct clk_init_data){
1473                         .name = "pcie_a_clk",
1474                         .ops = &clk_branch_ops,
1475                         .flags = CLK_IS_ROOT,
1476                 },
1477         },
1478 };
1479
1480 static struct clk_branch pcie_aux_clk = {
1481         .halt_reg = 0x2fdc,
1482         .halt_bit = 31,
1483         .clkr = {
1484                 .enable_reg = 0x22c8,
1485                 .enable_mask = BIT(4),
1486                 .hw.init = &(struct clk_init_data){
1487                         .name = "pcie_aux_clk",
1488                         .ops = &clk_branch_ops,
1489                         .flags = CLK_IS_ROOT,
1490                 },
1491         },
1492 };
1493
1494 static struct clk_branch pcie_h_clk = {
1495         .halt_reg = 0x2fd4,
1496         .halt_bit = 8,
1497         .clkr = {
1498                 .enable_reg = 0x22cc,
1499                 .enable_mask = BIT(4),
1500                 .hw.init = &(struct clk_init_data){
1501                         .name = "pcie_h_clk",
1502                         .ops = &clk_branch_ops,
1503                         .flags = CLK_IS_ROOT,
1504                 },
1505         },
1506 };
1507
1508 static struct clk_branch pcie_phy_clk = {
1509         .halt_reg = 0x2fdc,
1510         .halt_bit = 29,
1511         .clkr = {
1512                 .enable_reg = 0x22d0,
1513                 .enable_mask = BIT(4),
1514                 .hw.init = &(struct clk_init_data){
1515                         .name = "pcie_phy_clk",
1516                         .ops = &clk_branch_ops,
1517                         .flags = CLK_IS_ROOT,
1518                 },
1519         },
1520 };
1521
1522 static struct clk_rcg pcie1_ref_src = {
1523         .ns_reg = 0x3aa0,
1524         .p = {
1525                 .pre_div_shift = 3,
1526                 .pre_div_width = 4,
1527         },
1528         .s = {
1529                 .src_sel_shift = 0,
1530                 .parent_map = gcc_pxo_pll3_map,
1531         },
1532         .freq_tbl = clk_tbl_pcie_ref,
1533         .clkr = {
1534                 .enable_reg = 0x3aa0,
1535                 .enable_mask = BIT(11),
1536                 .hw.init = &(struct clk_init_data){
1537                         .name = "pcie1_ref_src",
1538                         .parent_names = gcc_pxo_pll3,
1539                         .num_parents = 2,
1540                         .ops = &clk_rcg_ops,
1541                         .flags = CLK_SET_RATE_GATE,
1542                 },
1543         },
1544 };
1545
1546 static struct clk_branch pcie1_ref_src_clk = {
1547         .halt_reg = 0x2fdc,
1548         .halt_bit = 27,
1549         .clkr = {
1550                 .enable_reg = 0x3aa0,
1551                 .enable_mask = BIT(9),
1552                 .hw.init = &(struct clk_init_data){
1553                         .name = "pcie1_ref_src_clk",
1554                         .parent_names = (const char *[]){ "pcie1_ref_src" },
1555                         .num_parents = 1,
1556                         .ops = &clk_branch_ops,
1557                         .flags = CLK_SET_RATE_PARENT,
1558                 },
1559         },
1560 };
1561
1562 static struct clk_branch pcie1_a_clk = {
1563         .halt_reg = 0x2fc0,
1564         .halt_bit = 10,
1565         .clkr = {
1566                 .enable_reg = 0x3a80,
1567                 .enable_mask = BIT(4),
1568                 .hw.init = &(struct clk_init_data){
1569                         .name = "pcie1_a_clk",
1570                         .ops = &clk_branch_ops,
1571                         .flags = CLK_IS_ROOT,
1572                 },
1573         },
1574 };
1575
1576 static struct clk_branch pcie1_aux_clk = {
1577         .halt_reg = 0x2fdc,
1578         .halt_bit = 28,
1579         .clkr = {
1580                 .enable_reg = 0x3a88,
1581                 .enable_mask = BIT(4),
1582                 .hw.init = &(struct clk_init_data){
1583                         .name = "pcie1_aux_clk",
1584                         .ops = &clk_branch_ops,
1585                         .flags = CLK_IS_ROOT,
1586                 },
1587         },
1588 };
1589
1590 static struct clk_branch pcie1_h_clk = {
1591         .halt_reg = 0x2fd4,
1592         .halt_bit = 9,
1593         .clkr = {
1594                 .enable_reg = 0x3a8c,
1595                 .enable_mask = BIT(4),
1596                 .hw.init = &(struct clk_init_data){
1597                         .name = "pcie1_h_clk",
1598                         .ops = &clk_branch_ops,
1599                         .flags = CLK_IS_ROOT,
1600                 },
1601         },
1602 };
1603
1604 static struct clk_branch pcie1_phy_clk = {
1605         .halt_reg = 0x2fdc,
1606         .halt_bit = 26,
1607         .clkr = {
1608                 .enable_reg = 0x3a90,
1609                 .enable_mask = BIT(4),
1610                 .hw.init = &(struct clk_init_data){
1611                         .name = "pcie1_phy_clk",
1612                         .ops = &clk_branch_ops,
1613                         .flags = CLK_IS_ROOT,
1614                 },
1615         },
1616 };
1617
1618 static struct clk_rcg pcie2_ref_src = {
1619         .ns_reg = 0x3ae0,
1620         .p = {
1621                 .pre_div_shift = 3,
1622                 .pre_div_width = 4,
1623         },
1624         .s = {
1625                 .src_sel_shift = 0,
1626                 .parent_map = gcc_pxo_pll3_map,
1627         },
1628         .freq_tbl = clk_tbl_pcie_ref,
1629         .clkr = {
1630                 .enable_reg = 0x3ae0,
1631                 .enable_mask = BIT(11),
1632                 .hw.init = &(struct clk_init_data){
1633                         .name = "pcie2_ref_src",
1634                         .parent_names = gcc_pxo_pll3,
1635                         .num_parents = 2,
1636                         .ops = &clk_rcg_ops,
1637                         .flags = CLK_SET_RATE_GATE,
1638                 },
1639         },
1640 };
1641
1642 static struct clk_branch pcie2_ref_src_clk = {
1643         .halt_reg = 0x2fdc,
1644         .halt_bit = 24,
1645         .clkr = {
1646                 .enable_reg = 0x3ae0,
1647                 .enable_mask = BIT(9),
1648                 .hw.init = &(struct clk_init_data){
1649                         .name = "pcie2_ref_src_clk",
1650                         .parent_names = (const char *[]){ "pcie2_ref_src" },
1651                         .num_parents = 1,
1652                         .ops = &clk_branch_ops,
1653                         .flags = CLK_SET_RATE_PARENT,
1654                 },
1655         },
1656 };
1657
1658 static struct clk_branch pcie2_a_clk = {
1659         .halt_reg = 0x2fc0,
1660         .halt_bit = 9,
1661         .clkr = {
1662                 .enable_reg = 0x3ac0,
1663                 .enable_mask = BIT(4),
1664                 .hw.init = &(struct clk_init_data){
1665                         .name = "pcie2_a_clk",
1666                         .ops = &clk_branch_ops,
1667                         .flags = CLK_IS_ROOT,
1668                 },
1669         },
1670 };
1671
1672 static struct clk_branch pcie2_aux_clk = {
1673         .halt_reg = 0x2fdc,
1674         .halt_bit = 25,
1675         .clkr = {
1676                 .enable_reg = 0x3ac8,
1677                 .enable_mask = BIT(4),
1678                 .hw.init = &(struct clk_init_data){
1679                         .name = "pcie2_aux_clk",
1680                         .ops = &clk_branch_ops,
1681                         .flags = CLK_IS_ROOT,
1682                 },
1683         },
1684 };
1685
1686 static struct clk_branch pcie2_h_clk = {
1687         .halt_reg = 0x2fd4,
1688         .halt_bit = 10,
1689         .clkr = {
1690                 .enable_reg = 0x3acc,
1691                 .enable_mask = BIT(4),
1692                 .hw.init = &(struct clk_init_data){
1693                         .name = "pcie2_h_clk",
1694                         .ops = &clk_branch_ops,
1695                         .flags = CLK_IS_ROOT,
1696                 },
1697         },
1698 };
1699
1700 static struct clk_branch pcie2_phy_clk = {
1701         .halt_reg = 0x2fdc,
1702         .halt_bit = 23,
1703         .clkr = {
1704                 .enable_reg = 0x3ad0,
1705                 .enable_mask = BIT(4),
1706                 .hw.init = &(struct clk_init_data){
1707                         .name = "pcie2_phy_clk",
1708                         .ops = &clk_branch_ops,
1709                         .flags = CLK_IS_ROOT,
1710                 },
1711         },
1712 };
1713
1714 static const struct freq_tbl clk_tbl_sata_ref[] = {
1715         { 100000000, P_PLL3,  12, 0, 0 },
1716         { }
1717 };
1718
1719 static struct clk_rcg sata_ref_src = {
1720         .ns_reg = 0x2c08,
1721         .p = {
1722                 .pre_div_shift = 3,
1723                 .pre_div_width = 4,
1724         },
1725         .s = {
1726                 .src_sel_shift = 0,
1727                 .parent_map = gcc_pxo_pll3_sata_map,
1728         },
1729         .freq_tbl = clk_tbl_sata_ref,
1730         .clkr = {
1731                 .enable_reg = 0x2c08,
1732                 .enable_mask = BIT(7),
1733                 .hw.init = &(struct clk_init_data){
1734                         .name = "sata_ref_src",
1735                         .parent_names = gcc_pxo_pll3,
1736                         .num_parents = 2,
1737                         .ops = &clk_rcg_ops,
1738                         .flags = CLK_SET_RATE_GATE,
1739                 },
1740         },
1741 };
1742
1743 static struct clk_branch sata_rxoob_clk = {
1744         .halt_reg = 0x2fdc,
1745         .halt_bit = 20,
1746         .clkr = {
1747                 .enable_reg = 0x2c0c,
1748                 .enable_mask = BIT(4),
1749                 .hw.init = &(struct clk_init_data){
1750                         .name = "sata_rxoob_clk",
1751                         .parent_names = (const char *[]){ "sata_ref_src" },
1752                         .num_parents = 1,
1753                         .ops = &clk_branch_ops,
1754                         .flags = CLK_SET_RATE_PARENT,
1755                 },
1756         },
1757 };
1758
1759 static struct clk_branch sata_pmalive_clk = {
1760         .halt_reg = 0x2fdc,
1761         .halt_bit = 19,
1762         .clkr = {
1763                 .enable_reg = 0x2c10,
1764                 .enable_mask = BIT(4),
1765                 .hw.init = &(struct clk_init_data){
1766                         .name = "sata_pmalive_clk",
1767                         .parent_names = (const char *[]){ "sata_ref_src" },
1768                         .num_parents = 1,
1769                         .ops = &clk_branch_ops,
1770                         .flags = CLK_SET_RATE_PARENT,
1771                 },
1772         },
1773 };
1774
1775 static struct clk_branch sata_phy_ref_clk = {
1776         .halt_reg = 0x2fdc,
1777         .halt_bit = 18,
1778         .clkr = {
1779                 .enable_reg = 0x2c14,
1780                 .enable_mask = BIT(4),
1781                 .hw.init = &(struct clk_init_data){
1782                         .name = "sata_phy_ref_clk",
1783                         .parent_names = (const char *[]){ "pxo" },
1784                         .num_parents = 1,
1785                         .ops = &clk_branch_ops,
1786                 },
1787         },
1788 };
1789
1790 static struct clk_branch sata_a_clk = {
1791         .halt_reg = 0x2fc0,
1792         .halt_bit = 12,
1793         .clkr = {
1794                 .enable_reg = 0x2c20,
1795                 .enable_mask = BIT(4),
1796                 .hw.init = &(struct clk_init_data){
1797                         .name = "sata_a_clk",
1798                         .ops = &clk_branch_ops,
1799                         .flags = CLK_IS_ROOT,
1800                 },
1801         },
1802 };
1803
1804 static struct clk_branch sata_h_clk = {
1805         .halt_reg = 0x2fdc,
1806         .halt_bit = 21,
1807         .clkr = {
1808                 .enable_reg = 0x2c00,
1809                 .enable_mask = BIT(4),
1810                 .hw.init = &(struct clk_init_data){
1811                         .name = "sata_h_clk",
1812                         .ops = &clk_branch_ops,
1813                         .flags = CLK_IS_ROOT,
1814                 },
1815         },
1816 };
1817
1818 static struct clk_branch sfab_sata_s_h_clk = {
1819         .halt_reg = 0x2fc4,
1820         .halt_bit = 14,
1821         .clkr = {
1822                 .enable_reg = 0x2480,
1823                 .enable_mask = BIT(4),
1824                 .hw.init = &(struct clk_init_data){
1825                         .name = "sfab_sata_s_h_clk",
1826                         .ops = &clk_branch_ops,
1827                         .flags = CLK_IS_ROOT,
1828                 },
1829         },
1830 };
1831
1832 static struct clk_branch sata_phy_cfg_clk = {
1833         .halt_reg = 0x2fcc,
1834         .halt_bit = 14,
1835         .clkr = {
1836                 .enable_reg = 0x2c40,
1837                 .enable_mask = BIT(4),
1838                 .hw.init = &(struct clk_init_data){
1839                         .name = "sata_phy_cfg_clk",
1840                         .ops = &clk_branch_ops,
1841                         .flags = CLK_IS_ROOT,
1842                 },
1843         },
1844 };
1845
1846 static const struct freq_tbl clk_tbl_usb30_master[] = {
1847         { 125000000, P_PLL0,  1, 5, 32 },
1848         { }
1849 };
1850
1851 static struct clk_rcg usb30_master_clk_src = {
1852         .ns_reg = 0x3b2c,
1853         .md_reg = 0x3b28,
1854         .mn = {
1855                 .mnctr_en_bit = 8,
1856                 .mnctr_reset_bit = 7,
1857                 .mnctr_mode_shift = 5,
1858                 .n_val_shift = 16,
1859                 .m_val_shift = 16,
1860                 .width = 8,
1861         },
1862         .p = {
1863                 .pre_div_shift = 3,
1864                 .pre_div_width = 2,
1865         },
1866         .s = {
1867                 .src_sel_shift = 0,
1868                 .parent_map = gcc_pxo_pll8_pll0,
1869         },
1870         .freq_tbl = clk_tbl_usb30_master,
1871         .clkr = {
1872                 .enable_reg = 0x3b2c,
1873                 .enable_mask = BIT(11),
1874                 .hw.init = &(struct clk_init_data){
1875                         .name = "usb30_master_ref_src",
1876                         .parent_names = gcc_pxo_pll8_pll0_map,
1877                         .num_parents = 3,
1878                         .ops = &clk_rcg_ops,
1879                         .flags = CLK_SET_RATE_GATE,
1880                 },
1881         },
1882 };
1883
1884 static struct clk_branch usb30_0_branch_clk = {
1885         .halt_reg = 0x2fc4,
1886         .halt_bit = 22,
1887         .clkr = {
1888                 .enable_reg = 0x3b24,
1889                 .enable_mask = BIT(4),
1890                 .hw.init = &(struct clk_init_data){
1891                         .name = "usb30_0_branch_clk",
1892                         .parent_names = (const char *[]){ "usb30_master_ref_src", },
1893                         .num_parents = 1,
1894                         .ops = &clk_branch_ops,
1895                         .flags = CLK_SET_RATE_PARENT,
1896                 },
1897         },
1898 };
1899
1900 static struct clk_branch usb30_1_branch_clk = {
1901         .halt_reg = 0x2fc4,
1902         .halt_bit = 17,
1903         .clkr = {
1904                 .enable_reg = 0x3b34,
1905                 .enable_mask = BIT(4),
1906                 .hw.init = &(struct clk_init_data){
1907                         .name = "usb30_1_branch_clk",
1908                         .parent_names = (const char *[]){ "usb30_master_ref_src", },
1909                         .num_parents = 1,
1910                         .ops = &clk_branch_ops,
1911                         .flags = CLK_SET_RATE_PARENT,
1912                 },
1913         },
1914 };
1915
1916 static const struct freq_tbl clk_tbl_usb30_utmi[] = {
1917         { 60000000, P_PLL8,  1, 5, 32 },
1918         { }
1919 };
1920
1921 static struct clk_rcg usb30_utmi_clk = {
1922         .ns_reg = 0x3b44,
1923         .md_reg = 0x3b40,
1924         .mn = {
1925                 .mnctr_en_bit = 8,
1926                 .mnctr_reset_bit = 7,
1927                 .mnctr_mode_shift = 5,
1928                 .n_val_shift = 16,
1929                 .m_val_shift = 16,
1930                 .width = 8,
1931         },
1932         .p = {
1933                 .pre_div_shift = 3,
1934                 .pre_div_width = 2,
1935         },
1936         .s = {
1937                 .src_sel_shift = 0,
1938                 .parent_map = gcc_pxo_pll8_pll0,
1939         },
1940         .freq_tbl = clk_tbl_usb30_utmi,
1941         .clkr = {
1942                 .enable_reg = 0x3b44,
1943                 .enable_mask = BIT(11),
1944                 .hw.init = &(struct clk_init_data){
1945                         .name = "usb30_utmi_clk",
1946                         .parent_names = gcc_pxo_pll8_pll0_map,
1947                         .num_parents = 3,
1948                         .ops = &clk_rcg_ops,
1949                         .flags = CLK_SET_RATE_GATE,
1950                 },
1951         },
1952 };
1953
1954 static struct clk_branch usb30_0_utmi_clk_ctl = {
1955         .halt_reg = 0x2fc4,
1956         .halt_bit = 21,
1957         .clkr = {
1958                 .enable_reg = 0x3b48,
1959                 .enable_mask = BIT(4),
1960                 .hw.init = &(struct clk_init_data){
1961                         .name = "usb30_0_utmi_clk_ctl",
1962                         .parent_names = (const char *[]){ "usb30_utmi_clk", },
1963                         .num_parents = 1,
1964                         .ops = &clk_branch_ops,
1965                         .flags = CLK_SET_RATE_PARENT,
1966                 },
1967         },
1968 };
1969
1970 static struct clk_branch usb30_1_utmi_clk_ctl = {
1971         .halt_reg = 0x2fc4,
1972         .halt_bit = 15,
1973         .clkr = {
1974                 .enable_reg = 0x3b4c,
1975                 .enable_mask = BIT(4),
1976                 .hw.init = &(struct clk_init_data){
1977                         .name = "usb30_1_utmi_clk_ctl",
1978                         .parent_names = (const char *[]){ "usb30_utmi_clk", },
1979                         .num_parents = 1,
1980                         .ops = &clk_branch_ops,
1981                         .flags = CLK_SET_RATE_PARENT,
1982                 },
1983         },
1984 };
1985
1986 static const struct freq_tbl clk_tbl_usb[] = {
1987         { 60000000, P_PLL8,  1, 5, 32 },
1988         { }
1989 };
1990
1991 static struct clk_rcg usb_hs1_xcvr_clk_src = {
1992         .ns_reg = 0x290C,
1993         .md_reg = 0x2908,
1994         .mn = {
1995                 .mnctr_en_bit = 8,
1996                 .mnctr_reset_bit = 7,
1997                 .mnctr_mode_shift = 5,
1998                 .n_val_shift = 16,
1999                 .m_val_shift = 16,
2000                 .width = 8,
2001         },
2002         .p = {
2003                 .pre_div_shift = 3,
2004                 .pre_div_width = 2,
2005         },
2006         .s = {
2007                 .src_sel_shift = 0,
2008                 .parent_map = gcc_pxo_pll8_pll0,
2009         },
2010         .freq_tbl = clk_tbl_usb,
2011         .clkr = {
2012                 .enable_reg = 0x2968,
2013                 .enable_mask = BIT(11),
2014                 .hw.init = &(struct clk_init_data){
2015                         .name = "usb_hs1_xcvr_src",
2016                         .parent_names = gcc_pxo_pll8_pll0_map,
2017                         .num_parents = 3,
2018                         .ops = &clk_rcg_ops,
2019                         .flags = CLK_SET_RATE_GATE,
2020                 },
2021         },
2022 };
2023
2024 static struct clk_branch usb_hs1_xcvr_clk = {
2025         .halt_reg = 0x2fcc,
2026         .halt_bit = 17,
2027         .clkr = {
2028                 .enable_reg = 0x290c,
2029                 .enable_mask = BIT(9),
2030                 .hw.init = &(struct clk_init_data){
2031                         .name = "usb_hs1_xcvr_clk",
2032                         .parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
2033                         .num_parents = 1,
2034                         .ops = &clk_branch_ops,
2035                         .flags = CLK_SET_RATE_PARENT,
2036                 },
2037         },
2038 };
2039
2040 static struct clk_branch usb_hs1_h_clk = {
2041         .hwcg_reg = 0x2900,
2042         .hwcg_bit = 6,
2043         .halt_reg = 0x2fc8,
2044         .halt_bit = 1,
2045         .clkr = {
2046                 .enable_reg = 0x2900,
2047                 .enable_mask = BIT(4),
2048                 .hw.init = &(struct clk_init_data){
2049                         .name = "usb_hs1_h_clk",
2050                         .ops = &clk_branch_ops,
2051                         .flags = CLK_IS_ROOT,
2052                 },
2053         },
2054 };
2055
2056 static struct clk_rcg usb_fs1_xcvr_clk_src = {
2057         .ns_reg = 0x2968,
2058         .md_reg = 0x2964,
2059         .mn = {
2060                 .mnctr_en_bit = 8,
2061                 .mnctr_reset_bit = 7,
2062                 .mnctr_mode_shift = 5,
2063                 .n_val_shift = 16,
2064                 .m_val_shift = 16,
2065                 .width = 8,
2066         },
2067         .p = {
2068                 .pre_div_shift = 3,
2069                 .pre_div_width = 2,
2070         },
2071         .s = {
2072                 .src_sel_shift = 0,
2073                 .parent_map = gcc_pxo_pll8_pll0,
2074         },
2075         .freq_tbl = clk_tbl_usb,
2076         .clkr = {
2077                 .enable_reg = 0x2968,
2078                 .enable_mask = BIT(11),
2079                 .hw.init = &(struct clk_init_data){
2080                         .name = "usb_fs1_xcvr_src",
2081                         .parent_names = gcc_pxo_pll8_pll0_map,
2082                         .num_parents = 3,
2083                         .ops = &clk_rcg_ops,
2084                         .flags = CLK_SET_RATE_GATE,
2085                 },
2086         },
2087 };
2088
2089 static struct clk_branch usb_fs1_xcvr_clk = {
2090         .halt_reg = 0x2fcc,
2091         .halt_bit = 17,
2092         .clkr = {
2093                 .enable_reg = 0x2968,
2094                 .enable_mask = BIT(9),
2095                 .hw.init = &(struct clk_init_data){
2096                         .name = "usb_fs1_xcvr_clk",
2097                         .parent_names = (const char *[]){ "usb_fs1_xcvr_src", },
2098                         .num_parents = 1,
2099                         .ops = &clk_branch_ops,
2100                         .flags = CLK_SET_RATE_PARENT,
2101                 },
2102         },
2103 };
2104
2105 static struct clk_branch usb_fs1_sys_clk = {
2106         .halt_reg = 0x2fcc,
2107         .halt_bit = 18,
2108         .clkr = {
2109                 .enable_reg = 0x296c,
2110                 .enable_mask = BIT(4),
2111                 .hw.init = &(struct clk_init_data){
2112                         .name = "usb_fs1_sys_clk",
2113                         .parent_names = (const char *[]){ "usb_fs1_xcvr_src", },
2114                         .num_parents = 1,
2115                         .ops = &clk_branch_ops,
2116                         .flags = CLK_SET_RATE_PARENT,
2117                 },
2118         },
2119 };
2120
2121 static struct clk_branch usb_fs1_h_clk = {
2122         .halt_reg = 0x2fcc,
2123         .halt_bit = 19,
2124         .clkr = {
2125                 .enable_reg = 0x2960,
2126                 .enable_mask = BIT(4),
2127                 .hw.init = &(struct clk_init_data){
2128                         .name = "usb_fs1_h_clk",
2129                         .ops = &clk_branch_ops,
2130                         .flags = CLK_IS_ROOT,
2131                 },
2132         },
2133 };
2134
2135 static struct clk_regmap *gcc_ipq806x_clks[] = {
2136         [PLL3] = &pll3.clkr,
2137         [PLL8] = &pll8.clkr,
2138         [PLL8_VOTE] = &pll8_vote,
2139         [PLL14] = &pll14.clkr,
2140         [PLL14_VOTE] = &pll14_vote,
2141         [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
2142         [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
2143         [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
2144         [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
2145         [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
2146         [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
2147         [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
2148         [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
2149         [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr,
2150         [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr,
2151         [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr,
2152         [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr,
2153         [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
2154         [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
2155         [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
2156         [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
2157         [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
2158         [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
2159         [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
2160         [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
2161         [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr,
2162         [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr,
2163         [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr,
2164         [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr,
2165         [GP0_SRC] = &gp0_src.clkr,
2166         [GP0_CLK] = &gp0_clk.clkr,
2167         [GP1_SRC] = &gp1_src.clkr,
2168         [GP1_CLK] = &gp1_clk.clkr,
2169         [GP2_SRC] = &gp2_src.clkr,
2170         [GP2_CLK] = &gp2_clk.clkr,
2171         [PMEM_A_CLK] = &pmem_clk.clkr,
2172         [PRNG_SRC] = &prng_src.clkr,
2173         [PRNG_CLK] = &prng_clk.clkr,
2174         [SDC1_SRC] = &sdc1_src.clkr,
2175         [SDC1_CLK] = &sdc1_clk.clkr,
2176         [SDC3_SRC] = &sdc3_src.clkr,
2177         [SDC3_CLK] = &sdc3_clk.clkr,
2178         [TSIF_REF_SRC] = &tsif_ref_src.clkr,
2179         [TSIF_REF_CLK] = &tsif_ref_clk.clkr,
2180         [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
2181         [GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
2182         [GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
2183         [GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
2184         [GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
2185         [GSBI6_H_CLK] = &gsbi6_h_clk.clkr,
2186         [GSBI7_H_CLK] = &gsbi7_h_clk.clkr,
2187         [TSIF_H_CLK] = &tsif_h_clk.clkr,
2188         [SDC1_H_CLK] = &sdc1_h_clk.clkr,
2189         [SDC3_H_CLK] = &sdc3_h_clk.clkr,
2190         [ADM0_CLK] = &adm0_clk.clkr,
2191         [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
2192         [PCIE_A_CLK] = &pcie_a_clk.clkr,
2193         [PCIE_AUX_CLK] = &pcie_aux_clk.clkr,
2194         [PCIE_H_CLK] = &pcie_h_clk.clkr,
2195         [PCIE_PHY_CLK] = &pcie_phy_clk.clkr,
2196         [SFAB_SATA_S_H_CLK] = &sfab_sata_s_h_clk.clkr,
2197         [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
2198         [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
2199         [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
2200         [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
2201         [SATA_H_CLK] = &sata_h_clk.clkr,
2202         [SATA_CLK_SRC] = &sata_ref_src.clkr,
2203         [SATA_RXOOB_CLK] = &sata_rxoob_clk.clkr,
2204         [SATA_PMALIVE_CLK] = &sata_pmalive_clk.clkr,
2205         [SATA_PHY_REF_CLK] = &sata_phy_ref_clk.clkr,
2206         [SATA_A_CLK] = &sata_a_clk.clkr,
2207         [SATA_PHY_CFG_CLK] = &sata_phy_cfg_clk.clkr,
2208         [PCIE_ALT_REF_SRC] = &pcie_ref_src.clkr,
2209         [PCIE_ALT_REF_CLK] = &pcie_ref_src_clk.clkr,
2210         [PCIE_1_A_CLK] = &pcie1_a_clk.clkr,
2211         [PCIE_1_AUX_CLK] = &pcie1_aux_clk.clkr,
2212         [PCIE_1_H_CLK] = &pcie1_h_clk.clkr,
2213         [PCIE_1_PHY_CLK] = &pcie1_phy_clk.clkr,
2214         [PCIE_1_ALT_REF_SRC] = &pcie1_ref_src.clkr,
2215         [PCIE_1_ALT_REF_CLK] = &pcie1_ref_src_clk.clkr,
2216         [PCIE_2_A_CLK] = &pcie2_a_clk.clkr,
2217         [PCIE_2_AUX_CLK] = &pcie2_aux_clk.clkr,
2218         [PCIE_2_H_CLK] = &pcie2_h_clk.clkr,
2219         [PCIE_2_PHY_CLK] = &pcie2_phy_clk.clkr,
2220         [PCIE_2_ALT_REF_SRC] = &pcie2_ref_src.clkr,
2221         [PCIE_2_ALT_REF_CLK] = &pcie2_ref_src_clk.clkr,
2222         [USB30_MASTER_SRC] = &usb30_master_clk_src.clkr,
2223         [USB30_0_MASTER_CLK] = &usb30_0_branch_clk.clkr,
2224         [USB30_1_MASTER_CLK] = &usb30_1_branch_clk.clkr,
2225         [USB30_UTMI_SRC] = &usb30_utmi_clk.clkr,
2226         [USB30_0_UTMI_CLK] = &usb30_0_utmi_clk_ctl.clkr,
2227         [USB30_1_UTMI_CLK] = &usb30_1_utmi_clk_ctl.clkr,
2228         [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
2229         [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_clk_src.clkr,
2230         [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
2231         [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr,
2232         [USB_FS1_XCVR_SRC] = &usb_fs1_xcvr_clk_src.clkr,
2233         [USB_FS1_XCVR_CLK] = &usb_fs1_xcvr_clk.clkr,
2234         [USB_FS1_SYSTEM_CLK] = &usb_fs1_sys_clk.clkr,
2235 };
2236
2237 static const struct qcom_reset_map gcc_ipq806x_resets[] = {
2238         [QDSS_STM_RESET] = { 0x2060, 6 },
2239         [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 },
2240         [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 },
2241         [AFAB_SMPSS_M0_RESET] = { 0x20b8, 0 },
2242         [AFAB_EBI1_CH0_RESET] = { 0x20c0, 7 },
2243         [AFAB_EBI1_CH1_RESET] = { 0x20c4, 7 },
2244         [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 },
2245         [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 },
2246         [SFAB_ADM0_M2_RESET] = { 0x21e8, 7 },
2247         [ADM0_C2_RESET] = { 0x220c, 4 },
2248         [ADM0_C1_RESET] = { 0x220c, 3 },
2249         [ADM0_C0_RESET] = { 0x220c, 2 },
2250         [ADM0_PBUS_RESET] = { 0x220c, 1 },
2251         [ADM0_RESET] = { 0x220c, 0 },
2252         [QDSS_CLKS_SW_RESET] = { 0x2260, 5 },
2253         [QDSS_POR_RESET] = { 0x2260, 4 },
2254         [QDSS_TSCTR_RESET] = { 0x2260, 3 },
2255         [QDSS_HRESET_RESET] = { 0x2260, 2 },
2256         [QDSS_AXI_RESET] = { 0x2260, 1 },
2257         [QDSS_DBG_RESET] = { 0x2260, 0 },
2258         [SFAB_PCIE_M_RESET] = { 0x22d8, 1 },
2259         [SFAB_PCIE_S_RESET] = { 0x22d8, 0 },
2260         [PCIE_EXT_RESET] = { 0x22dc, 6 },
2261         [PCIE_PHY_RESET] = { 0x22dc, 5 },
2262         [PCIE_PCI_RESET] = { 0x22dc, 4 },
2263         [PCIE_POR_RESET] = { 0x22dc, 3 },
2264         [PCIE_HCLK_RESET] = { 0x22dc, 2 },
2265         [PCIE_ACLK_RESET] = { 0x22dc, 0 },
2266         [SFAB_LPASS_RESET] = { 0x23a0, 7 },
2267         [SFAB_AFAB_M_RESET] = { 0x23e0, 7 },
2268         [AFAB_SFAB_M0_RESET] = { 0x2420, 7 },
2269         [AFAB_SFAB_M1_RESET] = { 0x2424, 7 },
2270         [SFAB_SATA_S_RESET] = { 0x2480, 7 },
2271         [SFAB_DFAB_M_RESET] = { 0x2500, 7 },
2272         [DFAB_SFAB_M_RESET] = { 0x2520, 7 },
2273         [DFAB_SWAY0_RESET] = { 0x2540, 7 },
2274         [DFAB_SWAY1_RESET] = { 0x2544, 7 },
2275         [DFAB_ARB0_RESET] = { 0x2560, 7 },
2276         [DFAB_ARB1_RESET] = { 0x2564, 7 },
2277         [PPSS_PROC_RESET] = { 0x2594, 1 },
2278         [PPSS_RESET] = { 0x2594, 0 },
2279         [DMA_BAM_RESET] = { 0x25c0, 7 },
2280         [SPS_TIC_H_RESET] = { 0x2600, 7 },
2281         [SFAB_CFPB_M_RESET] = { 0x2680, 7 },
2282         [SFAB_CFPB_S_RESET] = { 0x26c0, 7 },
2283         [TSIF_H_RESET] = { 0x2700, 7 },
2284         [CE1_H_RESET] = { 0x2720, 7 },
2285         [CE1_CORE_RESET] = { 0x2724, 7 },
2286         [CE1_SLEEP_RESET] = { 0x2728, 7 },
2287         [CE2_H_RESET] = { 0x2740, 7 },
2288         [CE2_CORE_RESET] = { 0x2744, 7 },
2289         [SFAB_SFPB_M_RESET] = { 0x2780, 7 },
2290         [SFAB_SFPB_S_RESET] = { 0x27a0, 7 },
2291         [RPM_PROC_RESET] = { 0x27c0, 7 },
2292         [PMIC_SSBI2_RESET] = { 0x280c, 12 },
2293         [SDC1_RESET] = { 0x2830, 0 },
2294         [SDC2_RESET] = { 0x2850, 0 },
2295         [SDC3_RESET] = { 0x2870, 0 },
2296         [SDC4_RESET] = { 0x2890, 0 },
2297         [USB_HS1_RESET] = { 0x2910, 0 },
2298         [USB_HSIC_RESET] = { 0x2934, 0 },
2299         [USB_FS1_XCVR_RESET] = { 0x2974, 1 },
2300         [USB_FS1_RESET] = { 0x2974, 0 },
2301         [GSBI1_RESET] = { 0x29dc, 0 },
2302         [GSBI2_RESET] = { 0x29fc, 0 },
2303         [GSBI3_RESET] = { 0x2a1c, 0 },
2304         [GSBI4_RESET] = { 0x2a3c, 0 },
2305         [GSBI5_RESET] = { 0x2a5c, 0 },
2306         [GSBI6_RESET] = { 0x2a7c, 0 },
2307         [GSBI7_RESET] = { 0x2a9c, 0 },
2308         [SPDM_RESET] = { 0x2b6c, 0 },
2309         [SEC_CTRL_RESET] = { 0x2b80, 7 },
2310         [TLMM_H_RESET] = { 0x2ba0, 7 },
2311         [SFAB_SATA_M_RESET] = { 0x2c18, 0 },
2312         [SATA_RESET] = { 0x2c1c, 0 },
2313         [TSSC_RESET] = { 0x2ca0, 7 },
2314         [PDM_RESET] = { 0x2cc0, 12 },
2315         [MPM_H_RESET] = { 0x2da0, 7 },
2316         [MPM_RESET] = { 0x2da4, 0 },
2317         [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 },
2318         [PRNG_RESET] = { 0x2e80, 12 },
2319         [SFAB_CE3_M_RESET] = { 0x36c8, 1 },
2320         [SFAB_CE3_S_RESET] = { 0x36c8, 0 },
2321         [CE3_SLEEP_RESET] = { 0x36d0, 7 },
2322         [PCIE_1_M_RESET] = { 0x3a98, 1 },
2323         [PCIE_1_S_RESET] = { 0x3a98, 0 },
2324         [PCIE_1_EXT_RESET] = { 0x3a9c, 6 },
2325         [PCIE_1_PHY_RESET] = { 0x3a9c, 5 },
2326         [PCIE_1_PCI_RESET] = { 0x3a9c, 4 },
2327         [PCIE_1_POR_RESET] = { 0x3a9c, 3 },
2328         [PCIE_1_HCLK_RESET] = { 0x3a9c, 2 },
2329         [PCIE_1_ACLK_RESET] = { 0x3a9c, 0 },
2330         [PCIE_2_M_RESET] = { 0x3ad8, 1 },
2331         [PCIE_2_S_RESET] = { 0x3ad8, 0 },
2332         [PCIE_2_EXT_RESET] = { 0x3adc, 6 },
2333         [PCIE_2_PHY_RESET] = { 0x3adc, 5 },
2334         [PCIE_2_PCI_RESET] = { 0x3adc, 4 },
2335         [PCIE_2_POR_RESET] = { 0x3adc, 3 },
2336         [PCIE_2_HCLK_RESET] = { 0x3adc, 2 },
2337         [PCIE_2_ACLK_RESET] = { 0x3adc, 0 },
2338         [SFAB_USB30_S_RESET] = { 0x3b54, 1 },
2339         [SFAB_USB30_M_RESET] = { 0x3b54, 0 },
2340         [USB30_0_PORT2_HS_PHY_RESET] = { 0x3b50, 5 },
2341         [USB30_0_MASTER_RESET] = { 0x3b50, 4 },
2342         [USB30_0_SLEEP_RESET] = { 0x3b50, 3 },
2343         [USB30_0_UTMI_PHY_RESET] = { 0x3b50, 2 },
2344         [USB30_0_POWERON_RESET] = { 0x3b50, 1 },
2345         [USB30_0_PHY_RESET] = { 0x3b50, 0 },
2346         [USB30_1_MASTER_RESET] = { 0x3b58, 4 },
2347         [USB30_1_SLEEP_RESET] = { 0x3b58, 3 },
2348         [USB30_1_UTMI_PHY_RESET] = { 0x3b58, 2 },
2349         [USB30_1_POWERON_RESET] = { 0x3b58, 1 },
2350         [USB30_1_PHY_RESET] = { 0x3b58, 0 },
2351         [NSSFB0_RESET] = { 0x3b60, 6 },
2352         [NSSFB1_RESET] = { 0x3b60, 7 },
2353 };
2354
2355 static const struct regmap_config gcc_ipq806x_regmap_config = {
2356         .reg_bits       = 32,
2357         .reg_stride     = 4,
2358         .val_bits       = 32,
2359         .max_register   = 0x3e40,
2360         .fast_io        = true,
2361 };
2362
2363 static const struct qcom_cc_desc gcc_ipq806x_desc = {
2364         .config = &gcc_ipq806x_regmap_config,
2365         .clks = gcc_ipq806x_clks,
2366         .num_clks = ARRAY_SIZE(gcc_ipq806x_clks),
2367         .resets = gcc_ipq806x_resets,
2368         .num_resets = ARRAY_SIZE(gcc_ipq806x_resets),
2369 };
2370
2371 static const struct of_device_id gcc_ipq806x_match_table[] = {
2372         { .compatible = "qcom,gcc-ipq8064" },
2373         { }
2374 };
2375 MODULE_DEVICE_TABLE(of, gcc_ipq806x_match_table);
2376
2377 static int gcc_ipq806x_probe(struct platform_device *pdev)
2378 {
2379         struct clk *clk;
2380         struct device *dev = &pdev->dev;
2381
2382         /* Temporary until RPM clocks supported */
2383         clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 25000000);
2384         if (IS_ERR(clk))
2385                 return PTR_ERR(clk);
2386
2387         clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 25000000);
2388         if (IS_ERR(clk))
2389                 return PTR_ERR(clk);
2390
2391         return qcom_cc_probe(pdev, &gcc_ipq806x_desc);
2392 }
2393
2394 static int gcc_ipq806x_remove(struct platform_device *pdev)
2395 {
2396         qcom_cc_remove(pdev);
2397         return 0;
2398 }
2399
2400 static struct platform_driver gcc_ipq806x_driver = {
2401         .probe          = gcc_ipq806x_probe,
2402         .remove         = gcc_ipq806x_remove,
2403         .driver         = {
2404                 .name   = "gcc-ipq806x",
2405                 .owner  = THIS_MODULE,
2406                 .of_match_table = gcc_ipq806x_match_table,
2407         },
2408 };
2409
2410 static int __init gcc_ipq806x_init(void)
2411 {
2412         return platform_driver_register(&gcc_ipq806x_driver);
2413 }
2414 core_initcall(gcc_ipq806x_init);
2415
2416 static void __exit gcc_ipq806x_exit(void)
2417 {
2418         platform_driver_unregister(&gcc_ipq806x_driver);
2419 }
2420 module_exit(gcc_ipq806x_exit);
2421
2422 MODULE_DESCRIPTION("QCOM GCC IPQ806x Driver");
2423 MODULE_LICENSE("GPL v2");
2424 MODULE_ALIAS("platform:gcc-ipq806x");