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