ARM: dts: add 'dr_mode' property to hsotg devices for exynos boards
[linux/fpc-iii.git] / drivers / clk / qcom / gcc-msm8660.c
blobf366e68f73163137aa974d1cfaf8f7592f7bdaaa
1 /*
2 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
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.
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.
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>
25 #include <dt-bindings/clock/qcom,gcc-msm8660.h>
26 #include <dt-bindings/reset/qcom,gcc-msm8660.h>
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"
35 static struct clk_pll pll8 = {
36 .l_reg = 0x3144,
37 .m_reg = 0x3148,
38 .n_reg = 0x314c,
39 .config_reg = 0x3154,
40 .mode_reg = 0x3140,
41 .status_reg = 0x3158,
42 .status_bit = 16,
43 .clkr.hw.init = &(struct clk_init_data){
44 .name = "pll8",
45 .parent_names = (const char *[]){ "pxo" },
46 .num_parents = 1,
47 .ops = &clk_pll_ops,
51 static struct clk_regmap pll8_vote = {
52 .enable_reg = 0x34c0,
53 .enable_mask = BIT(8),
54 .hw.init = &(struct clk_init_data){
55 .name = "pll8_vote",
56 .parent_names = (const char *[]){ "pll8" },
57 .num_parents = 1,
58 .ops = &clk_pll_vote_ops,
62 #define P_PXO 0
63 #define P_PLL8 1
64 #define P_CXO 2
66 static const u8 gcc_pxo_pll8_map[] = {
67 [P_PXO] = 0,
68 [P_PLL8] = 3,
71 static const char *gcc_pxo_pll8[] = {
72 "pxo",
73 "pll8_vote",
76 static const u8 gcc_pxo_pll8_cxo_map[] = {
77 [P_PXO] = 0,
78 [P_PLL8] = 3,
79 [P_CXO] = 5,
82 static const char *gcc_pxo_pll8_cxo[] = {
83 "pxo",
84 "pll8_vote",
85 "cxo",
88 static struct freq_tbl clk_tbl_gsbi_uart[] = {
89 { 1843200, P_PLL8, 2, 6, 625 },
90 { 3686400, P_PLL8, 2, 12, 625 },
91 { 7372800, P_PLL8, 2, 24, 625 },
92 { 14745600, P_PLL8, 2, 48, 625 },
93 { 16000000, P_PLL8, 4, 1, 6 },
94 { 24000000, P_PLL8, 4, 1, 4 },
95 { 32000000, P_PLL8, 4, 1, 3 },
96 { 40000000, P_PLL8, 1, 5, 48 },
97 { 46400000, P_PLL8, 1, 29, 240 },
98 { 48000000, P_PLL8, 4, 1, 2 },
99 { 51200000, P_PLL8, 1, 2, 15 },
100 { 56000000, P_PLL8, 1, 7, 48 },
101 { 58982400, P_PLL8, 1, 96, 625 },
102 { 64000000, P_PLL8, 2, 1, 3 },
106 static struct clk_rcg gsbi1_uart_src = {
107 .ns_reg = 0x29d4,
108 .md_reg = 0x29d0,
109 .mn = {
110 .mnctr_en_bit = 8,
111 .mnctr_reset_bit = 7,
112 .mnctr_mode_shift = 5,
113 .n_val_shift = 16,
114 .m_val_shift = 16,
115 .width = 16,
117 .p = {
118 .pre_div_shift = 3,
119 .pre_div_width = 2,
121 .s = {
122 .src_sel_shift = 0,
123 .parent_map = gcc_pxo_pll8_map,
125 .freq_tbl = clk_tbl_gsbi_uart,
126 .clkr = {
127 .enable_reg = 0x29d4,
128 .enable_mask = BIT(11),
129 .hw.init = &(struct clk_init_data){
130 .name = "gsbi1_uart_src",
131 .parent_names = gcc_pxo_pll8,
132 .num_parents = 2,
133 .ops = &clk_rcg_ops,
134 .flags = CLK_SET_PARENT_GATE,
139 static struct clk_branch gsbi1_uart_clk = {
140 .halt_reg = 0x2fcc,
141 .halt_bit = 10,
142 .clkr = {
143 .enable_reg = 0x29d4,
144 .enable_mask = BIT(9),
145 .hw.init = &(struct clk_init_data){
146 .name = "gsbi1_uart_clk",
147 .parent_names = (const char *[]){
148 "gsbi1_uart_src",
150 .num_parents = 1,
151 .ops = &clk_branch_ops,
152 .flags = CLK_SET_RATE_PARENT,
157 static struct clk_rcg gsbi2_uart_src = {
158 .ns_reg = 0x29f4,
159 .md_reg = 0x29f0,
160 .mn = {
161 .mnctr_en_bit = 8,
162 .mnctr_reset_bit = 7,
163 .mnctr_mode_shift = 5,
164 .n_val_shift = 16,
165 .m_val_shift = 16,
166 .width = 16,
168 .p = {
169 .pre_div_shift = 3,
170 .pre_div_width = 2,
172 .s = {
173 .src_sel_shift = 0,
174 .parent_map = gcc_pxo_pll8_map,
176 .freq_tbl = clk_tbl_gsbi_uart,
177 .clkr = {
178 .enable_reg = 0x29f4,
179 .enable_mask = BIT(11),
180 .hw.init = &(struct clk_init_data){
181 .name = "gsbi2_uart_src",
182 .parent_names = gcc_pxo_pll8,
183 .num_parents = 2,
184 .ops = &clk_rcg_ops,
185 .flags = CLK_SET_PARENT_GATE,
190 static struct clk_branch gsbi2_uart_clk = {
191 .halt_reg = 0x2fcc,
192 .halt_bit = 6,
193 .clkr = {
194 .enable_reg = 0x29f4,
195 .enable_mask = BIT(9),
196 .hw.init = &(struct clk_init_data){
197 .name = "gsbi2_uart_clk",
198 .parent_names = (const char *[]){
199 "gsbi2_uart_src",
201 .num_parents = 1,
202 .ops = &clk_branch_ops,
203 .flags = CLK_SET_RATE_PARENT,
208 static struct clk_rcg gsbi3_uart_src = {
209 .ns_reg = 0x2a14,
210 .md_reg = 0x2a10,
211 .mn = {
212 .mnctr_en_bit = 8,
213 .mnctr_reset_bit = 7,
214 .mnctr_mode_shift = 5,
215 .n_val_shift = 16,
216 .m_val_shift = 16,
217 .width = 16,
219 .p = {
220 .pre_div_shift = 3,
221 .pre_div_width = 2,
223 .s = {
224 .src_sel_shift = 0,
225 .parent_map = gcc_pxo_pll8_map,
227 .freq_tbl = clk_tbl_gsbi_uart,
228 .clkr = {
229 .enable_reg = 0x2a14,
230 .enable_mask = BIT(11),
231 .hw.init = &(struct clk_init_data){
232 .name = "gsbi3_uart_src",
233 .parent_names = gcc_pxo_pll8,
234 .num_parents = 2,
235 .ops = &clk_rcg_ops,
236 .flags = CLK_SET_PARENT_GATE,
241 static struct clk_branch gsbi3_uart_clk = {
242 .halt_reg = 0x2fcc,
243 .halt_bit = 2,
244 .clkr = {
245 .enable_reg = 0x2a14,
246 .enable_mask = BIT(9),
247 .hw.init = &(struct clk_init_data){
248 .name = "gsbi3_uart_clk",
249 .parent_names = (const char *[]){
250 "gsbi3_uart_src",
252 .num_parents = 1,
253 .ops = &clk_branch_ops,
254 .flags = CLK_SET_RATE_PARENT,
259 static struct clk_rcg gsbi4_uart_src = {
260 .ns_reg = 0x2a34,
261 .md_reg = 0x2a30,
262 .mn = {
263 .mnctr_en_bit = 8,
264 .mnctr_reset_bit = 7,
265 .mnctr_mode_shift = 5,
266 .n_val_shift = 16,
267 .m_val_shift = 16,
268 .width = 16,
270 .p = {
271 .pre_div_shift = 3,
272 .pre_div_width = 2,
274 .s = {
275 .src_sel_shift = 0,
276 .parent_map = gcc_pxo_pll8_map,
278 .freq_tbl = clk_tbl_gsbi_uart,
279 .clkr = {
280 .enable_reg = 0x2a34,
281 .enable_mask = BIT(11),
282 .hw.init = &(struct clk_init_data){
283 .name = "gsbi4_uart_src",
284 .parent_names = gcc_pxo_pll8,
285 .num_parents = 2,
286 .ops = &clk_rcg_ops,
287 .flags = CLK_SET_PARENT_GATE,
292 static struct clk_branch gsbi4_uart_clk = {
293 .halt_reg = 0x2fd0,
294 .halt_bit = 26,
295 .clkr = {
296 .enable_reg = 0x2a34,
297 .enable_mask = BIT(9),
298 .hw.init = &(struct clk_init_data){
299 .name = "gsbi4_uart_clk",
300 .parent_names = (const char *[]){
301 "gsbi4_uart_src",
303 .num_parents = 1,
304 .ops = &clk_branch_ops,
305 .flags = CLK_SET_RATE_PARENT,
310 static struct clk_rcg gsbi5_uart_src = {
311 .ns_reg = 0x2a54,
312 .md_reg = 0x2a50,
313 .mn = {
314 .mnctr_en_bit = 8,
315 .mnctr_reset_bit = 7,
316 .mnctr_mode_shift = 5,
317 .n_val_shift = 16,
318 .m_val_shift = 16,
319 .width = 16,
321 .p = {
322 .pre_div_shift = 3,
323 .pre_div_width = 2,
325 .s = {
326 .src_sel_shift = 0,
327 .parent_map = gcc_pxo_pll8_map,
329 .freq_tbl = clk_tbl_gsbi_uart,
330 .clkr = {
331 .enable_reg = 0x2a54,
332 .enable_mask = BIT(11),
333 .hw.init = &(struct clk_init_data){
334 .name = "gsbi5_uart_src",
335 .parent_names = gcc_pxo_pll8,
336 .num_parents = 2,
337 .ops = &clk_rcg_ops,
338 .flags = CLK_SET_PARENT_GATE,
343 static struct clk_branch gsbi5_uart_clk = {
344 .halt_reg = 0x2fd0,
345 .halt_bit = 22,
346 .clkr = {
347 .enable_reg = 0x2a54,
348 .enable_mask = BIT(9),
349 .hw.init = &(struct clk_init_data){
350 .name = "gsbi5_uart_clk",
351 .parent_names = (const char *[]){
352 "gsbi5_uart_src",
354 .num_parents = 1,
355 .ops = &clk_branch_ops,
356 .flags = CLK_SET_RATE_PARENT,
361 static struct clk_rcg gsbi6_uart_src = {
362 .ns_reg = 0x2a74,
363 .md_reg = 0x2a70,
364 .mn = {
365 .mnctr_en_bit = 8,
366 .mnctr_reset_bit = 7,
367 .mnctr_mode_shift = 5,
368 .n_val_shift = 16,
369 .m_val_shift = 16,
370 .width = 16,
372 .p = {
373 .pre_div_shift = 3,
374 .pre_div_width = 2,
376 .s = {
377 .src_sel_shift = 0,
378 .parent_map = gcc_pxo_pll8_map,
380 .freq_tbl = clk_tbl_gsbi_uart,
381 .clkr = {
382 .enable_reg = 0x2a74,
383 .enable_mask = BIT(11),
384 .hw.init = &(struct clk_init_data){
385 .name = "gsbi6_uart_src",
386 .parent_names = gcc_pxo_pll8,
387 .num_parents = 2,
388 .ops = &clk_rcg_ops,
389 .flags = CLK_SET_PARENT_GATE,
394 static struct clk_branch gsbi6_uart_clk = {
395 .halt_reg = 0x2fd0,
396 .halt_bit = 18,
397 .clkr = {
398 .enable_reg = 0x2a74,
399 .enable_mask = BIT(9),
400 .hw.init = &(struct clk_init_data){
401 .name = "gsbi6_uart_clk",
402 .parent_names = (const char *[]){
403 "gsbi6_uart_src",
405 .num_parents = 1,
406 .ops = &clk_branch_ops,
407 .flags = CLK_SET_RATE_PARENT,
412 static struct clk_rcg gsbi7_uart_src = {
413 .ns_reg = 0x2a94,
414 .md_reg = 0x2a90,
415 .mn = {
416 .mnctr_en_bit = 8,
417 .mnctr_reset_bit = 7,
418 .mnctr_mode_shift = 5,
419 .n_val_shift = 16,
420 .m_val_shift = 16,
421 .width = 16,
423 .p = {
424 .pre_div_shift = 3,
425 .pre_div_width = 2,
427 .s = {
428 .src_sel_shift = 0,
429 .parent_map = gcc_pxo_pll8_map,
431 .freq_tbl = clk_tbl_gsbi_uart,
432 .clkr = {
433 .enable_reg = 0x2a94,
434 .enable_mask = BIT(11),
435 .hw.init = &(struct clk_init_data){
436 .name = "gsbi7_uart_src",
437 .parent_names = gcc_pxo_pll8,
438 .num_parents = 2,
439 .ops = &clk_rcg_ops,
440 .flags = CLK_SET_PARENT_GATE,
445 static struct clk_branch gsbi7_uart_clk = {
446 .halt_reg = 0x2fd0,
447 .halt_bit = 14,
448 .clkr = {
449 .enable_reg = 0x2a94,
450 .enable_mask = BIT(9),
451 .hw.init = &(struct clk_init_data){
452 .name = "gsbi7_uart_clk",
453 .parent_names = (const char *[]){
454 "gsbi7_uart_src",
456 .num_parents = 1,
457 .ops = &clk_branch_ops,
458 .flags = CLK_SET_RATE_PARENT,
463 static struct clk_rcg gsbi8_uart_src = {
464 .ns_reg = 0x2ab4,
465 .md_reg = 0x2ab0,
466 .mn = {
467 .mnctr_en_bit = 8,
468 .mnctr_reset_bit = 7,
469 .mnctr_mode_shift = 5,
470 .n_val_shift = 16,
471 .m_val_shift = 16,
472 .width = 16,
474 .p = {
475 .pre_div_shift = 3,
476 .pre_div_width = 2,
478 .s = {
479 .src_sel_shift = 0,
480 .parent_map = gcc_pxo_pll8_map,
482 .freq_tbl = clk_tbl_gsbi_uart,
483 .clkr = {
484 .enable_reg = 0x2ab4,
485 .enable_mask = BIT(11),
486 .hw.init = &(struct clk_init_data){
487 .name = "gsbi8_uart_src",
488 .parent_names = gcc_pxo_pll8,
489 .num_parents = 2,
490 .ops = &clk_rcg_ops,
491 .flags = CLK_SET_PARENT_GATE,
496 static struct clk_branch gsbi8_uart_clk = {
497 .halt_reg = 0x2fd0,
498 .halt_bit = 10,
499 .clkr = {
500 .enable_reg = 0x2ab4,
501 .enable_mask = BIT(9),
502 .hw.init = &(struct clk_init_data){
503 .name = "gsbi8_uart_clk",
504 .parent_names = (const char *[]){ "gsbi8_uart_src" },
505 .num_parents = 1,
506 .ops = &clk_branch_ops,
507 .flags = CLK_SET_RATE_PARENT,
512 static struct clk_rcg gsbi9_uart_src = {
513 .ns_reg = 0x2ad4,
514 .md_reg = 0x2ad0,
515 .mn = {
516 .mnctr_en_bit = 8,
517 .mnctr_reset_bit = 7,
518 .mnctr_mode_shift = 5,
519 .n_val_shift = 16,
520 .m_val_shift = 16,
521 .width = 16,
523 .p = {
524 .pre_div_shift = 3,
525 .pre_div_width = 2,
527 .s = {
528 .src_sel_shift = 0,
529 .parent_map = gcc_pxo_pll8_map,
531 .freq_tbl = clk_tbl_gsbi_uart,
532 .clkr = {
533 .enable_reg = 0x2ad4,
534 .enable_mask = BIT(11),
535 .hw.init = &(struct clk_init_data){
536 .name = "gsbi9_uart_src",
537 .parent_names = gcc_pxo_pll8,
538 .num_parents = 2,
539 .ops = &clk_rcg_ops,
540 .flags = CLK_SET_PARENT_GATE,
545 static struct clk_branch gsbi9_uart_clk = {
546 .halt_reg = 0x2fd0,
547 .halt_bit = 6,
548 .clkr = {
549 .enable_reg = 0x2ad4,
550 .enable_mask = BIT(9),
551 .hw.init = &(struct clk_init_data){
552 .name = "gsbi9_uart_clk",
553 .parent_names = (const char *[]){ "gsbi9_uart_src" },
554 .num_parents = 1,
555 .ops = &clk_branch_ops,
556 .flags = CLK_SET_RATE_PARENT,
561 static struct clk_rcg gsbi10_uart_src = {
562 .ns_reg = 0x2af4,
563 .md_reg = 0x2af0,
564 .mn = {
565 .mnctr_en_bit = 8,
566 .mnctr_reset_bit = 7,
567 .mnctr_mode_shift = 5,
568 .n_val_shift = 16,
569 .m_val_shift = 16,
570 .width = 16,
572 .p = {
573 .pre_div_shift = 3,
574 .pre_div_width = 2,
576 .s = {
577 .src_sel_shift = 0,
578 .parent_map = gcc_pxo_pll8_map,
580 .freq_tbl = clk_tbl_gsbi_uart,
581 .clkr = {
582 .enable_reg = 0x2af4,
583 .enable_mask = BIT(11),
584 .hw.init = &(struct clk_init_data){
585 .name = "gsbi10_uart_src",
586 .parent_names = gcc_pxo_pll8,
587 .num_parents = 2,
588 .ops = &clk_rcg_ops,
589 .flags = CLK_SET_PARENT_GATE,
594 static struct clk_branch gsbi10_uart_clk = {
595 .halt_reg = 0x2fd0,
596 .halt_bit = 2,
597 .clkr = {
598 .enable_reg = 0x2af4,
599 .enable_mask = BIT(9),
600 .hw.init = &(struct clk_init_data){
601 .name = "gsbi10_uart_clk",
602 .parent_names = (const char *[]){ "gsbi10_uart_src" },
603 .num_parents = 1,
604 .ops = &clk_branch_ops,
605 .flags = CLK_SET_RATE_PARENT,
610 static struct clk_rcg gsbi11_uart_src = {
611 .ns_reg = 0x2b14,
612 .md_reg = 0x2b10,
613 .mn = {
614 .mnctr_en_bit = 8,
615 .mnctr_reset_bit = 7,
616 .mnctr_mode_shift = 5,
617 .n_val_shift = 16,
618 .m_val_shift = 16,
619 .width = 16,
621 .p = {
622 .pre_div_shift = 3,
623 .pre_div_width = 2,
625 .s = {
626 .src_sel_shift = 0,
627 .parent_map = gcc_pxo_pll8_map,
629 .freq_tbl = clk_tbl_gsbi_uart,
630 .clkr = {
631 .enable_reg = 0x2b14,
632 .enable_mask = BIT(11),
633 .hw.init = &(struct clk_init_data){
634 .name = "gsbi11_uart_src",
635 .parent_names = gcc_pxo_pll8,
636 .num_parents = 2,
637 .ops = &clk_rcg_ops,
638 .flags = CLK_SET_PARENT_GATE,
643 static struct clk_branch gsbi11_uart_clk = {
644 .halt_reg = 0x2fd4,
645 .halt_bit = 17,
646 .clkr = {
647 .enable_reg = 0x2b14,
648 .enable_mask = BIT(9),
649 .hw.init = &(struct clk_init_data){
650 .name = "gsbi11_uart_clk",
651 .parent_names = (const char *[]){ "gsbi11_uart_src" },
652 .num_parents = 1,
653 .ops = &clk_branch_ops,
654 .flags = CLK_SET_RATE_PARENT,
659 static struct clk_rcg gsbi12_uart_src = {
660 .ns_reg = 0x2b34,
661 .md_reg = 0x2b30,
662 .mn = {
663 .mnctr_en_bit = 8,
664 .mnctr_reset_bit = 7,
665 .mnctr_mode_shift = 5,
666 .n_val_shift = 16,
667 .m_val_shift = 16,
668 .width = 16,
670 .p = {
671 .pre_div_shift = 3,
672 .pre_div_width = 2,
674 .s = {
675 .src_sel_shift = 0,
676 .parent_map = gcc_pxo_pll8_map,
678 .freq_tbl = clk_tbl_gsbi_uart,
679 .clkr = {
680 .enable_reg = 0x2b34,
681 .enable_mask = BIT(11),
682 .hw.init = &(struct clk_init_data){
683 .name = "gsbi12_uart_src",
684 .parent_names = gcc_pxo_pll8,
685 .num_parents = 2,
686 .ops = &clk_rcg_ops,
687 .flags = CLK_SET_PARENT_GATE,
692 static struct clk_branch gsbi12_uart_clk = {
693 .halt_reg = 0x2fd4,
694 .halt_bit = 13,
695 .clkr = {
696 .enable_reg = 0x2b34,
697 .enable_mask = BIT(9),
698 .hw.init = &(struct clk_init_data){
699 .name = "gsbi12_uart_clk",
700 .parent_names = (const char *[]){ "gsbi12_uart_src" },
701 .num_parents = 1,
702 .ops = &clk_branch_ops,
703 .flags = CLK_SET_RATE_PARENT,
708 static struct freq_tbl clk_tbl_gsbi_qup[] = {
709 { 1100000, P_PXO, 1, 2, 49 },
710 { 5400000, P_PXO, 1, 1, 5 },
711 { 10800000, P_PXO, 1, 2, 5 },
712 { 15060000, P_PLL8, 1, 2, 51 },
713 { 24000000, P_PLL8, 4, 1, 4 },
714 { 25600000, P_PLL8, 1, 1, 15 },
715 { 27000000, P_PXO, 1, 0, 0 },
716 { 48000000, P_PLL8, 4, 1, 2 },
717 { 51200000, P_PLL8, 1, 2, 15 },
721 static struct clk_rcg gsbi1_qup_src = {
722 .ns_reg = 0x29cc,
723 .md_reg = 0x29c8,
724 .mn = {
725 .mnctr_en_bit = 8,
726 .mnctr_reset_bit = 7,
727 .mnctr_mode_shift = 5,
728 .n_val_shift = 16,
729 .m_val_shift = 16,
730 .width = 8,
732 .p = {
733 .pre_div_shift = 3,
734 .pre_div_width = 2,
736 .s = {
737 .src_sel_shift = 0,
738 .parent_map = gcc_pxo_pll8_map,
740 .freq_tbl = clk_tbl_gsbi_qup,
741 .clkr = {
742 .enable_reg = 0x29cc,
743 .enable_mask = BIT(11),
744 .hw.init = &(struct clk_init_data){
745 .name = "gsbi1_qup_src",
746 .parent_names = gcc_pxo_pll8,
747 .num_parents = 2,
748 .ops = &clk_rcg_ops,
749 .flags = CLK_SET_PARENT_GATE,
754 static struct clk_branch gsbi1_qup_clk = {
755 .halt_reg = 0x2fcc,
756 .halt_bit = 9,
757 .clkr = {
758 .enable_reg = 0x29cc,
759 .enable_mask = BIT(9),
760 .hw.init = &(struct clk_init_data){
761 .name = "gsbi1_qup_clk",
762 .parent_names = (const char *[]){ "gsbi1_qup_src" },
763 .num_parents = 1,
764 .ops = &clk_branch_ops,
765 .flags = CLK_SET_RATE_PARENT,
770 static struct clk_rcg gsbi2_qup_src = {
771 .ns_reg = 0x29ec,
772 .md_reg = 0x29e8,
773 .mn = {
774 .mnctr_en_bit = 8,
775 .mnctr_reset_bit = 7,
776 .mnctr_mode_shift = 5,
777 .n_val_shift = 16,
778 .m_val_shift = 16,
779 .width = 8,
781 .p = {
782 .pre_div_shift = 3,
783 .pre_div_width = 2,
785 .s = {
786 .src_sel_shift = 0,
787 .parent_map = gcc_pxo_pll8_map,
789 .freq_tbl = clk_tbl_gsbi_qup,
790 .clkr = {
791 .enable_reg = 0x29ec,
792 .enable_mask = BIT(11),
793 .hw.init = &(struct clk_init_data){
794 .name = "gsbi2_qup_src",
795 .parent_names = gcc_pxo_pll8,
796 .num_parents = 2,
797 .ops = &clk_rcg_ops,
798 .flags = CLK_SET_PARENT_GATE,
803 static struct clk_branch gsbi2_qup_clk = {
804 .halt_reg = 0x2fcc,
805 .halt_bit = 4,
806 .clkr = {
807 .enable_reg = 0x29ec,
808 .enable_mask = BIT(9),
809 .hw.init = &(struct clk_init_data){
810 .name = "gsbi2_qup_clk",
811 .parent_names = (const char *[]){ "gsbi2_qup_src" },
812 .num_parents = 1,
813 .ops = &clk_branch_ops,
814 .flags = CLK_SET_RATE_PARENT,
819 static struct clk_rcg gsbi3_qup_src = {
820 .ns_reg = 0x2a0c,
821 .md_reg = 0x2a08,
822 .mn = {
823 .mnctr_en_bit = 8,
824 .mnctr_reset_bit = 7,
825 .mnctr_mode_shift = 5,
826 .n_val_shift = 16,
827 .m_val_shift = 16,
828 .width = 8,
830 .p = {
831 .pre_div_shift = 3,
832 .pre_div_width = 2,
834 .s = {
835 .src_sel_shift = 0,
836 .parent_map = gcc_pxo_pll8_map,
838 .freq_tbl = clk_tbl_gsbi_qup,
839 .clkr = {
840 .enable_reg = 0x2a0c,
841 .enable_mask = BIT(11),
842 .hw.init = &(struct clk_init_data){
843 .name = "gsbi3_qup_src",
844 .parent_names = gcc_pxo_pll8,
845 .num_parents = 2,
846 .ops = &clk_rcg_ops,
847 .flags = CLK_SET_PARENT_GATE,
852 static struct clk_branch gsbi3_qup_clk = {
853 .halt_reg = 0x2fcc,
854 .halt_bit = 0,
855 .clkr = {
856 .enable_reg = 0x2a0c,
857 .enable_mask = BIT(9),
858 .hw.init = &(struct clk_init_data){
859 .name = "gsbi3_qup_clk",
860 .parent_names = (const char *[]){ "gsbi3_qup_src" },
861 .num_parents = 1,
862 .ops = &clk_branch_ops,
863 .flags = CLK_SET_RATE_PARENT,
868 static struct clk_rcg gsbi4_qup_src = {
869 .ns_reg = 0x2a2c,
870 .md_reg = 0x2a28,
871 .mn = {
872 .mnctr_en_bit = 8,
873 .mnctr_reset_bit = 7,
874 .mnctr_mode_shift = 5,
875 .n_val_shift = 16,
876 .m_val_shift = 16,
877 .width = 8,
879 .p = {
880 .pre_div_shift = 3,
881 .pre_div_width = 2,
883 .s = {
884 .src_sel_shift = 0,
885 .parent_map = gcc_pxo_pll8_map,
887 .freq_tbl = clk_tbl_gsbi_qup,
888 .clkr = {
889 .enable_reg = 0x2a2c,
890 .enable_mask = BIT(11),
891 .hw.init = &(struct clk_init_data){
892 .name = "gsbi4_qup_src",
893 .parent_names = gcc_pxo_pll8,
894 .num_parents = 2,
895 .ops = &clk_rcg_ops,
896 .flags = CLK_SET_PARENT_GATE,
901 static struct clk_branch gsbi4_qup_clk = {
902 .halt_reg = 0x2fd0,
903 .halt_bit = 24,
904 .clkr = {
905 .enable_reg = 0x2a2c,
906 .enable_mask = BIT(9),
907 .hw.init = &(struct clk_init_data){
908 .name = "gsbi4_qup_clk",
909 .parent_names = (const char *[]){ "gsbi4_qup_src" },
910 .num_parents = 1,
911 .ops = &clk_branch_ops,
912 .flags = CLK_SET_RATE_PARENT,
917 static struct clk_rcg gsbi5_qup_src = {
918 .ns_reg = 0x2a4c,
919 .md_reg = 0x2a48,
920 .mn = {
921 .mnctr_en_bit = 8,
922 .mnctr_reset_bit = 7,
923 .mnctr_mode_shift = 5,
924 .n_val_shift = 16,
925 .m_val_shift = 16,
926 .width = 8,
928 .p = {
929 .pre_div_shift = 3,
930 .pre_div_width = 2,
932 .s = {
933 .src_sel_shift = 0,
934 .parent_map = gcc_pxo_pll8_map,
936 .freq_tbl = clk_tbl_gsbi_qup,
937 .clkr = {
938 .enable_reg = 0x2a4c,
939 .enable_mask = BIT(11),
940 .hw.init = &(struct clk_init_data){
941 .name = "gsbi5_qup_src",
942 .parent_names = gcc_pxo_pll8,
943 .num_parents = 2,
944 .ops = &clk_rcg_ops,
945 .flags = CLK_SET_PARENT_GATE,
950 static struct clk_branch gsbi5_qup_clk = {
951 .halt_reg = 0x2fd0,
952 .halt_bit = 20,
953 .clkr = {
954 .enable_reg = 0x2a4c,
955 .enable_mask = BIT(9),
956 .hw.init = &(struct clk_init_data){
957 .name = "gsbi5_qup_clk",
958 .parent_names = (const char *[]){ "gsbi5_qup_src" },
959 .num_parents = 1,
960 .ops = &clk_branch_ops,
961 .flags = CLK_SET_RATE_PARENT,
966 static struct clk_rcg gsbi6_qup_src = {
967 .ns_reg = 0x2a6c,
968 .md_reg = 0x2a68,
969 .mn = {
970 .mnctr_en_bit = 8,
971 .mnctr_reset_bit = 7,
972 .mnctr_mode_shift = 5,
973 .n_val_shift = 16,
974 .m_val_shift = 16,
975 .width = 8,
977 .p = {
978 .pre_div_shift = 3,
979 .pre_div_width = 2,
981 .s = {
982 .src_sel_shift = 0,
983 .parent_map = gcc_pxo_pll8_map,
985 .freq_tbl = clk_tbl_gsbi_qup,
986 .clkr = {
987 .enable_reg = 0x2a6c,
988 .enable_mask = BIT(11),
989 .hw.init = &(struct clk_init_data){
990 .name = "gsbi6_qup_src",
991 .parent_names = gcc_pxo_pll8,
992 .num_parents = 2,
993 .ops = &clk_rcg_ops,
994 .flags = CLK_SET_PARENT_GATE,
999 static struct clk_branch gsbi6_qup_clk = {
1000 .halt_reg = 0x2fd0,
1001 .halt_bit = 16,
1002 .clkr = {
1003 .enable_reg = 0x2a6c,
1004 .enable_mask = BIT(9),
1005 .hw.init = &(struct clk_init_data){
1006 .name = "gsbi6_qup_clk",
1007 .parent_names = (const char *[]){ "gsbi6_qup_src" },
1008 .num_parents = 1,
1009 .ops = &clk_branch_ops,
1010 .flags = CLK_SET_RATE_PARENT,
1015 static struct clk_rcg gsbi7_qup_src = {
1016 .ns_reg = 0x2a8c,
1017 .md_reg = 0x2a88,
1018 .mn = {
1019 .mnctr_en_bit = 8,
1020 .mnctr_reset_bit = 7,
1021 .mnctr_mode_shift = 5,
1022 .n_val_shift = 16,
1023 .m_val_shift = 16,
1024 .width = 8,
1026 .p = {
1027 .pre_div_shift = 3,
1028 .pre_div_width = 2,
1030 .s = {
1031 .src_sel_shift = 0,
1032 .parent_map = gcc_pxo_pll8_map,
1034 .freq_tbl = clk_tbl_gsbi_qup,
1035 .clkr = {
1036 .enable_reg = 0x2a8c,
1037 .enable_mask = BIT(11),
1038 .hw.init = &(struct clk_init_data){
1039 .name = "gsbi7_qup_src",
1040 .parent_names = gcc_pxo_pll8,
1041 .num_parents = 2,
1042 .ops = &clk_rcg_ops,
1043 .flags = CLK_SET_PARENT_GATE,
1048 static struct clk_branch gsbi7_qup_clk = {
1049 .halt_reg = 0x2fd0,
1050 .halt_bit = 12,
1051 .clkr = {
1052 .enable_reg = 0x2a8c,
1053 .enable_mask = BIT(9),
1054 .hw.init = &(struct clk_init_data){
1055 .name = "gsbi7_qup_clk",
1056 .parent_names = (const char *[]){ "gsbi7_qup_src" },
1057 .num_parents = 1,
1058 .ops = &clk_branch_ops,
1059 .flags = CLK_SET_RATE_PARENT,
1064 static struct clk_rcg gsbi8_qup_src = {
1065 .ns_reg = 0x2aac,
1066 .md_reg = 0x2aa8,
1067 .mn = {
1068 .mnctr_en_bit = 8,
1069 .mnctr_reset_bit = 7,
1070 .mnctr_mode_shift = 5,
1071 .n_val_shift = 16,
1072 .m_val_shift = 16,
1073 .width = 8,
1075 .p = {
1076 .pre_div_shift = 3,
1077 .pre_div_width = 2,
1079 .s = {
1080 .src_sel_shift = 0,
1081 .parent_map = gcc_pxo_pll8_map,
1083 .freq_tbl = clk_tbl_gsbi_qup,
1084 .clkr = {
1085 .enable_reg = 0x2aac,
1086 .enable_mask = BIT(11),
1087 .hw.init = &(struct clk_init_data){
1088 .name = "gsbi8_qup_src",
1089 .parent_names = gcc_pxo_pll8,
1090 .num_parents = 2,
1091 .ops = &clk_rcg_ops,
1092 .flags = CLK_SET_PARENT_GATE,
1097 static struct clk_branch gsbi8_qup_clk = {
1098 .halt_reg = 0x2fd0,
1099 .halt_bit = 8,
1100 .clkr = {
1101 .enable_reg = 0x2aac,
1102 .enable_mask = BIT(9),
1103 .hw.init = &(struct clk_init_data){
1104 .name = "gsbi8_qup_clk",
1105 .parent_names = (const char *[]){ "gsbi8_qup_src" },
1106 .num_parents = 1,
1107 .ops = &clk_branch_ops,
1108 .flags = CLK_SET_RATE_PARENT,
1113 static struct clk_rcg gsbi9_qup_src = {
1114 .ns_reg = 0x2acc,
1115 .md_reg = 0x2ac8,
1116 .mn = {
1117 .mnctr_en_bit = 8,
1118 .mnctr_reset_bit = 7,
1119 .mnctr_mode_shift = 5,
1120 .n_val_shift = 16,
1121 .m_val_shift = 16,
1122 .width = 8,
1124 .p = {
1125 .pre_div_shift = 3,
1126 .pre_div_width = 2,
1128 .s = {
1129 .src_sel_shift = 0,
1130 .parent_map = gcc_pxo_pll8_map,
1132 .freq_tbl = clk_tbl_gsbi_qup,
1133 .clkr = {
1134 .enable_reg = 0x2acc,
1135 .enable_mask = BIT(11),
1136 .hw.init = &(struct clk_init_data){
1137 .name = "gsbi9_qup_src",
1138 .parent_names = gcc_pxo_pll8,
1139 .num_parents = 2,
1140 .ops = &clk_rcg_ops,
1141 .flags = CLK_SET_PARENT_GATE,
1146 static struct clk_branch gsbi9_qup_clk = {
1147 .halt_reg = 0x2fd0,
1148 .halt_bit = 4,
1149 .clkr = {
1150 .enable_reg = 0x2acc,
1151 .enable_mask = BIT(9),
1152 .hw.init = &(struct clk_init_data){
1153 .name = "gsbi9_qup_clk",
1154 .parent_names = (const char *[]){ "gsbi9_qup_src" },
1155 .num_parents = 1,
1156 .ops = &clk_branch_ops,
1157 .flags = CLK_SET_RATE_PARENT,
1162 static struct clk_rcg gsbi10_qup_src = {
1163 .ns_reg = 0x2aec,
1164 .md_reg = 0x2ae8,
1165 .mn = {
1166 .mnctr_en_bit = 8,
1167 .mnctr_reset_bit = 7,
1168 .mnctr_mode_shift = 5,
1169 .n_val_shift = 16,
1170 .m_val_shift = 16,
1171 .width = 8,
1173 .p = {
1174 .pre_div_shift = 3,
1175 .pre_div_width = 2,
1177 .s = {
1178 .src_sel_shift = 0,
1179 .parent_map = gcc_pxo_pll8_map,
1181 .freq_tbl = clk_tbl_gsbi_qup,
1182 .clkr = {
1183 .enable_reg = 0x2aec,
1184 .enable_mask = BIT(11),
1185 .hw.init = &(struct clk_init_data){
1186 .name = "gsbi10_qup_src",
1187 .parent_names = gcc_pxo_pll8,
1188 .num_parents = 2,
1189 .ops = &clk_rcg_ops,
1190 .flags = CLK_SET_PARENT_GATE,
1195 static struct clk_branch gsbi10_qup_clk = {
1196 .halt_reg = 0x2fd0,
1197 .halt_bit = 0,
1198 .clkr = {
1199 .enable_reg = 0x2aec,
1200 .enable_mask = BIT(9),
1201 .hw.init = &(struct clk_init_data){
1202 .name = "gsbi10_qup_clk",
1203 .parent_names = (const char *[]){ "gsbi10_qup_src" },
1204 .num_parents = 1,
1205 .ops = &clk_branch_ops,
1206 .flags = CLK_SET_RATE_PARENT,
1211 static struct clk_rcg gsbi11_qup_src = {
1212 .ns_reg = 0x2b0c,
1213 .md_reg = 0x2b08,
1214 .mn = {
1215 .mnctr_en_bit = 8,
1216 .mnctr_reset_bit = 7,
1217 .mnctr_mode_shift = 5,
1218 .n_val_shift = 16,
1219 .m_val_shift = 16,
1220 .width = 8,
1222 .p = {
1223 .pre_div_shift = 3,
1224 .pre_div_width = 2,
1226 .s = {
1227 .src_sel_shift = 0,
1228 .parent_map = gcc_pxo_pll8_map,
1230 .freq_tbl = clk_tbl_gsbi_qup,
1231 .clkr = {
1232 .enable_reg = 0x2b0c,
1233 .enable_mask = BIT(11),
1234 .hw.init = &(struct clk_init_data){
1235 .name = "gsbi11_qup_src",
1236 .parent_names = gcc_pxo_pll8,
1237 .num_parents = 2,
1238 .ops = &clk_rcg_ops,
1239 .flags = CLK_SET_PARENT_GATE,
1244 static struct clk_branch gsbi11_qup_clk = {
1245 .halt_reg = 0x2fd4,
1246 .halt_bit = 15,
1247 .clkr = {
1248 .enable_reg = 0x2b0c,
1249 .enable_mask = BIT(9),
1250 .hw.init = &(struct clk_init_data){
1251 .name = "gsbi11_qup_clk",
1252 .parent_names = (const char *[]){ "gsbi11_qup_src" },
1253 .num_parents = 1,
1254 .ops = &clk_branch_ops,
1255 .flags = CLK_SET_RATE_PARENT,
1260 static struct clk_rcg gsbi12_qup_src = {
1261 .ns_reg = 0x2b2c,
1262 .md_reg = 0x2b28,
1263 .mn = {
1264 .mnctr_en_bit = 8,
1265 .mnctr_reset_bit = 7,
1266 .mnctr_mode_shift = 5,
1267 .n_val_shift = 16,
1268 .m_val_shift = 16,
1269 .width = 8,
1271 .p = {
1272 .pre_div_shift = 3,
1273 .pre_div_width = 2,
1275 .s = {
1276 .src_sel_shift = 0,
1277 .parent_map = gcc_pxo_pll8_map,
1279 .freq_tbl = clk_tbl_gsbi_qup,
1280 .clkr = {
1281 .enable_reg = 0x2b2c,
1282 .enable_mask = BIT(11),
1283 .hw.init = &(struct clk_init_data){
1284 .name = "gsbi12_qup_src",
1285 .parent_names = gcc_pxo_pll8,
1286 .num_parents = 2,
1287 .ops = &clk_rcg_ops,
1288 .flags = CLK_SET_PARENT_GATE,
1293 static struct clk_branch gsbi12_qup_clk = {
1294 .halt_reg = 0x2fd4,
1295 .halt_bit = 11,
1296 .clkr = {
1297 .enable_reg = 0x2b2c,
1298 .enable_mask = BIT(9),
1299 .hw.init = &(struct clk_init_data){
1300 .name = "gsbi12_qup_clk",
1301 .parent_names = (const char *[]){ "gsbi12_qup_src" },
1302 .num_parents = 1,
1303 .ops = &clk_branch_ops,
1304 .flags = CLK_SET_RATE_PARENT,
1309 static const struct freq_tbl clk_tbl_gp[] = {
1310 { 9600000, P_CXO, 2, 0, 0 },
1311 { 13500000, P_PXO, 2, 0, 0 },
1312 { 19200000, P_CXO, 1, 0, 0 },
1313 { 27000000, P_PXO, 1, 0, 0 },
1314 { 64000000, P_PLL8, 2, 1, 3 },
1315 { 76800000, P_PLL8, 1, 1, 5 },
1316 { 96000000, P_PLL8, 4, 0, 0 },
1317 { 128000000, P_PLL8, 3, 0, 0 },
1318 { 192000000, P_PLL8, 2, 0, 0 },
1322 static struct clk_rcg gp0_src = {
1323 .ns_reg = 0x2d24,
1324 .md_reg = 0x2d00,
1325 .mn = {
1326 .mnctr_en_bit = 8,
1327 .mnctr_reset_bit = 7,
1328 .mnctr_mode_shift = 5,
1329 .n_val_shift = 16,
1330 .m_val_shift = 16,
1331 .width = 8,
1333 .p = {
1334 .pre_div_shift = 3,
1335 .pre_div_width = 2,
1337 .s = {
1338 .src_sel_shift = 0,
1339 .parent_map = gcc_pxo_pll8_cxo_map,
1341 .freq_tbl = clk_tbl_gp,
1342 .clkr = {
1343 .enable_reg = 0x2d24,
1344 .enable_mask = BIT(11),
1345 .hw.init = &(struct clk_init_data){
1346 .name = "gp0_src",
1347 .parent_names = gcc_pxo_pll8_cxo,
1348 .num_parents = 3,
1349 .ops = &clk_rcg_ops,
1350 .flags = CLK_SET_PARENT_GATE,
1355 static struct clk_branch gp0_clk = {
1356 .halt_reg = 0x2fd8,
1357 .halt_bit = 7,
1358 .clkr = {
1359 .enable_reg = 0x2d24,
1360 .enable_mask = BIT(9),
1361 .hw.init = &(struct clk_init_data){
1362 .name = "gp0_clk",
1363 .parent_names = (const char *[]){ "gp0_src" },
1364 .num_parents = 1,
1365 .ops = &clk_branch_ops,
1366 .flags = CLK_SET_RATE_PARENT,
1371 static struct clk_rcg gp1_src = {
1372 .ns_reg = 0x2d44,
1373 .md_reg = 0x2d40,
1374 .mn = {
1375 .mnctr_en_bit = 8,
1376 .mnctr_reset_bit = 7,
1377 .mnctr_mode_shift = 5,
1378 .n_val_shift = 16,
1379 .m_val_shift = 16,
1380 .width = 8,
1382 .p = {
1383 .pre_div_shift = 3,
1384 .pre_div_width = 2,
1386 .s = {
1387 .src_sel_shift = 0,
1388 .parent_map = gcc_pxo_pll8_cxo_map,
1390 .freq_tbl = clk_tbl_gp,
1391 .clkr = {
1392 .enable_reg = 0x2d44,
1393 .enable_mask = BIT(11),
1394 .hw.init = &(struct clk_init_data){
1395 .name = "gp1_src",
1396 .parent_names = gcc_pxo_pll8_cxo,
1397 .num_parents = 3,
1398 .ops = &clk_rcg_ops,
1399 .flags = CLK_SET_RATE_GATE,
1404 static struct clk_branch gp1_clk = {
1405 .halt_reg = 0x2fd8,
1406 .halt_bit = 6,
1407 .clkr = {
1408 .enable_reg = 0x2d44,
1409 .enable_mask = BIT(9),
1410 .hw.init = &(struct clk_init_data){
1411 .name = "gp1_clk",
1412 .parent_names = (const char *[]){ "gp1_src" },
1413 .num_parents = 1,
1414 .ops = &clk_branch_ops,
1415 .flags = CLK_SET_RATE_PARENT,
1420 static struct clk_rcg gp2_src = {
1421 .ns_reg = 0x2d64,
1422 .md_reg = 0x2d60,
1423 .mn = {
1424 .mnctr_en_bit = 8,
1425 .mnctr_reset_bit = 7,
1426 .mnctr_mode_shift = 5,
1427 .n_val_shift = 16,
1428 .m_val_shift = 16,
1429 .width = 8,
1431 .p = {
1432 .pre_div_shift = 3,
1433 .pre_div_width = 2,
1435 .s = {
1436 .src_sel_shift = 0,
1437 .parent_map = gcc_pxo_pll8_cxo_map,
1439 .freq_tbl = clk_tbl_gp,
1440 .clkr = {
1441 .enable_reg = 0x2d64,
1442 .enable_mask = BIT(11),
1443 .hw.init = &(struct clk_init_data){
1444 .name = "gp2_src",
1445 .parent_names = gcc_pxo_pll8_cxo,
1446 .num_parents = 3,
1447 .ops = &clk_rcg_ops,
1448 .flags = CLK_SET_RATE_GATE,
1453 static struct clk_branch gp2_clk = {
1454 .halt_reg = 0x2fd8,
1455 .halt_bit = 5,
1456 .clkr = {
1457 .enable_reg = 0x2d64,
1458 .enable_mask = BIT(9),
1459 .hw.init = &(struct clk_init_data){
1460 .name = "gp2_clk",
1461 .parent_names = (const char *[]){ "gp2_src" },
1462 .num_parents = 1,
1463 .ops = &clk_branch_ops,
1464 .flags = CLK_SET_RATE_PARENT,
1469 static struct clk_branch pmem_clk = {
1470 .hwcg_reg = 0x25a0,
1471 .hwcg_bit = 6,
1472 .halt_reg = 0x2fc8,
1473 .halt_bit = 20,
1474 .clkr = {
1475 .enable_reg = 0x25a0,
1476 .enable_mask = BIT(4),
1477 .hw.init = &(struct clk_init_data){
1478 .name = "pmem_clk",
1479 .ops = &clk_branch_ops,
1480 .flags = CLK_IS_ROOT,
1485 static struct clk_rcg prng_src = {
1486 .ns_reg = 0x2e80,
1487 .p = {
1488 .pre_div_shift = 3,
1489 .pre_div_width = 4,
1491 .s = {
1492 .src_sel_shift = 0,
1493 .parent_map = gcc_pxo_pll8_map,
1495 .clkr.hw = {
1496 .init = &(struct clk_init_data){
1497 .name = "prng_src",
1498 .parent_names = gcc_pxo_pll8,
1499 .num_parents = 2,
1500 .ops = &clk_rcg_ops,
1505 static struct clk_branch prng_clk = {
1506 .halt_reg = 0x2fd8,
1507 .halt_check = BRANCH_HALT_VOTED,
1508 .halt_bit = 10,
1509 .clkr = {
1510 .enable_reg = 0x3080,
1511 .enable_mask = BIT(10),
1512 .hw.init = &(struct clk_init_data){
1513 .name = "prng_clk",
1514 .parent_names = (const char *[]){ "prng_src" },
1515 .num_parents = 1,
1516 .ops = &clk_branch_ops,
1521 static const struct freq_tbl clk_tbl_sdc[] = {
1522 { 144000, P_PXO, 3, 2, 125 },
1523 { 400000, P_PLL8, 4, 1, 240 },
1524 { 16000000, P_PLL8, 4, 1, 6 },
1525 { 17070000, P_PLL8, 1, 2, 45 },
1526 { 20210000, P_PLL8, 1, 1, 19 },
1527 { 24000000, P_PLL8, 4, 1, 4 },
1528 { 48000000, P_PLL8, 4, 1, 2 },
1532 static struct clk_rcg sdc1_src = {
1533 .ns_reg = 0x282c,
1534 .md_reg = 0x2828,
1535 .mn = {
1536 .mnctr_en_bit = 8,
1537 .mnctr_reset_bit = 7,
1538 .mnctr_mode_shift = 5,
1539 .n_val_shift = 16,
1540 .m_val_shift = 16,
1541 .width = 8,
1543 .p = {
1544 .pre_div_shift = 3,
1545 .pre_div_width = 2,
1547 .s = {
1548 .src_sel_shift = 0,
1549 .parent_map = gcc_pxo_pll8_map,
1551 .freq_tbl = clk_tbl_sdc,
1552 .clkr = {
1553 .enable_reg = 0x282c,
1554 .enable_mask = BIT(11),
1555 .hw.init = &(struct clk_init_data){
1556 .name = "sdc1_src",
1557 .parent_names = gcc_pxo_pll8,
1558 .num_parents = 2,
1559 .ops = &clk_rcg_ops,
1560 .flags = CLK_SET_RATE_GATE,
1565 static struct clk_branch sdc1_clk = {
1566 .halt_reg = 0x2fc8,
1567 .halt_bit = 6,
1568 .clkr = {
1569 .enable_reg = 0x282c,
1570 .enable_mask = BIT(9),
1571 .hw.init = &(struct clk_init_data){
1572 .name = "sdc1_clk",
1573 .parent_names = (const char *[]){ "sdc1_src" },
1574 .num_parents = 1,
1575 .ops = &clk_branch_ops,
1576 .flags = CLK_SET_RATE_PARENT,
1581 static struct clk_rcg sdc2_src = {
1582 .ns_reg = 0x284c,
1583 .md_reg = 0x2848,
1584 .mn = {
1585 .mnctr_en_bit = 8,
1586 .mnctr_reset_bit = 7,
1587 .mnctr_mode_shift = 5,
1588 .n_val_shift = 16,
1589 .m_val_shift = 16,
1590 .width = 8,
1592 .p = {
1593 .pre_div_shift = 3,
1594 .pre_div_width = 2,
1596 .s = {
1597 .src_sel_shift = 0,
1598 .parent_map = gcc_pxo_pll8_map,
1600 .freq_tbl = clk_tbl_sdc,
1601 .clkr = {
1602 .enable_reg = 0x284c,
1603 .enable_mask = BIT(11),
1604 .hw.init = &(struct clk_init_data){
1605 .name = "sdc2_src",
1606 .parent_names = gcc_pxo_pll8,
1607 .num_parents = 2,
1608 .ops = &clk_rcg_ops,
1609 .flags = CLK_SET_RATE_GATE,
1614 static struct clk_branch sdc2_clk = {
1615 .halt_reg = 0x2fc8,
1616 .halt_bit = 5,
1617 .clkr = {
1618 .enable_reg = 0x284c,
1619 .enable_mask = BIT(9),
1620 .hw.init = &(struct clk_init_data){
1621 .name = "sdc2_clk",
1622 .parent_names = (const char *[]){ "sdc2_src" },
1623 .num_parents = 1,
1624 .ops = &clk_branch_ops,
1625 .flags = CLK_SET_RATE_PARENT,
1630 static struct clk_rcg sdc3_src = {
1631 .ns_reg = 0x286c,
1632 .md_reg = 0x2868,
1633 .mn = {
1634 .mnctr_en_bit = 8,
1635 .mnctr_reset_bit = 7,
1636 .mnctr_mode_shift = 5,
1637 .n_val_shift = 16,
1638 .m_val_shift = 16,
1639 .width = 8,
1641 .p = {
1642 .pre_div_shift = 3,
1643 .pre_div_width = 2,
1645 .s = {
1646 .src_sel_shift = 0,
1647 .parent_map = gcc_pxo_pll8_map,
1649 .freq_tbl = clk_tbl_sdc,
1650 .clkr = {
1651 .enable_reg = 0x286c,
1652 .enable_mask = BIT(11),
1653 .hw.init = &(struct clk_init_data){
1654 .name = "sdc3_src",
1655 .parent_names = gcc_pxo_pll8,
1656 .num_parents = 2,
1657 .ops = &clk_rcg_ops,
1658 .flags = CLK_SET_RATE_GATE,
1663 static struct clk_branch sdc3_clk = {
1664 .halt_reg = 0x2fc8,
1665 .halt_bit = 4,
1666 .clkr = {
1667 .enable_reg = 0x286c,
1668 .enable_mask = BIT(9),
1669 .hw.init = &(struct clk_init_data){
1670 .name = "sdc3_clk",
1671 .parent_names = (const char *[]){ "sdc3_src" },
1672 .num_parents = 1,
1673 .ops = &clk_branch_ops,
1674 .flags = CLK_SET_RATE_PARENT,
1679 static struct clk_rcg sdc4_src = {
1680 .ns_reg = 0x288c,
1681 .md_reg = 0x2888,
1682 .mn = {
1683 .mnctr_en_bit = 8,
1684 .mnctr_reset_bit = 7,
1685 .mnctr_mode_shift = 5,
1686 .n_val_shift = 16,
1687 .m_val_shift = 16,
1688 .width = 8,
1690 .p = {
1691 .pre_div_shift = 3,
1692 .pre_div_width = 2,
1694 .s = {
1695 .src_sel_shift = 0,
1696 .parent_map = gcc_pxo_pll8_map,
1698 .freq_tbl = clk_tbl_sdc,
1699 .clkr = {
1700 .enable_reg = 0x288c,
1701 .enable_mask = BIT(11),
1702 .hw.init = &(struct clk_init_data){
1703 .name = "sdc4_src",
1704 .parent_names = gcc_pxo_pll8,
1705 .num_parents = 2,
1706 .ops = &clk_rcg_ops,
1707 .flags = CLK_SET_RATE_GATE,
1712 static struct clk_branch sdc4_clk = {
1713 .halt_reg = 0x2fc8,
1714 .halt_bit = 3,
1715 .clkr = {
1716 .enable_reg = 0x288c,
1717 .enable_mask = BIT(9),
1718 .hw.init = &(struct clk_init_data){
1719 .name = "sdc4_clk",
1720 .parent_names = (const char *[]){ "sdc4_src" },
1721 .num_parents = 1,
1722 .ops = &clk_branch_ops,
1723 .flags = CLK_SET_RATE_PARENT,
1728 static struct clk_rcg sdc5_src = {
1729 .ns_reg = 0x28ac,
1730 .md_reg = 0x28a8,
1731 .mn = {
1732 .mnctr_en_bit = 8,
1733 .mnctr_reset_bit = 7,
1734 .mnctr_mode_shift = 5,
1735 .n_val_shift = 16,
1736 .m_val_shift = 16,
1737 .width = 8,
1739 .p = {
1740 .pre_div_shift = 3,
1741 .pre_div_width = 2,
1743 .s = {
1744 .src_sel_shift = 0,
1745 .parent_map = gcc_pxo_pll8_map,
1747 .freq_tbl = clk_tbl_sdc,
1748 .clkr = {
1749 .enable_reg = 0x28ac,
1750 .enable_mask = BIT(11),
1751 .hw.init = &(struct clk_init_data){
1752 .name = "sdc5_src",
1753 .parent_names = gcc_pxo_pll8,
1754 .num_parents = 2,
1755 .ops = &clk_rcg_ops,
1756 .flags = CLK_SET_RATE_GATE,
1761 static struct clk_branch sdc5_clk = {
1762 .halt_reg = 0x2fc8,
1763 .halt_bit = 2,
1764 .clkr = {
1765 .enable_reg = 0x28ac,
1766 .enable_mask = BIT(9),
1767 .hw.init = &(struct clk_init_data){
1768 .name = "sdc5_clk",
1769 .parent_names = (const char *[]){ "sdc5_src" },
1770 .num_parents = 1,
1771 .ops = &clk_branch_ops,
1772 .flags = CLK_SET_RATE_PARENT,
1777 static const struct freq_tbl clk_tbl_tsif_ref[] = {
1778 { 105000, P_PXO, 1, 1, 256 },
1782 static struct clk_rcg tsif_ref_src = {
1783 .ns_reg = 0x2710,
1784 .md_reg = 0x270c,
1785 .mn = {
1786 .mnctr_en_bit = 8,
1787 .mnctr_reset_bit = 7,
1788 .mnctr_mode_shift = 5,
1789 .n_val_shift = 16,
1790 .m_val_shift = 16,
1791 .width = 16,
1793 .p = {
1794 .pre_div_shift = 3,
1795 .pre_div_width = 2,
1797 .s = {
1798 .src_sel_shift = 0,
1799 .parent_map = gcc_pxo_pll8_map,
1801 .freq_tbl = clk_tbl_tsif_ref,
1802 .clkr = {
1803 .enable_reg = 0x2710,
1804 .enable_mask = BIT(11),
1805 .hw.init = &(struct clk_init_data){
1806 .name = "tsif_ref_src",
1807 .parent_names = gcc_pxo_pll8,
1808 .num_parents = 2,
1809 .ops = &clk_rcg_ops,
1810 .flags = CLK_SET_RATE_GATE,
1815 static struct clk_branch tsif_ref_clk = {
1816 .halt_reg = 0x2fd4,
1817 .halt_bit = 5,
1818 .clkr = {
1819 .enable_reg = 0x2710,
1820 .enable_mask = BIT(9),
1821 .hw.init = &(struct clk_init_data){
1822 .name = "tsif_ref_clk",
1823 .parent_names = (const char *[]){ "tsif_ref_src" },
1824 .num_parents = 1,
1825 .ops = &clk_branch_ops,
1826 .flags = CLK_SET_RATE_PARENT,
1831 static const struct freq_tbl clk_tbl_usb[] = {
1832 { 60000000, P_PLL8, 1, 5, 32 },
1836 static struct clk_rcg usb_hs1_xcvr_src = {
1837 .ns_reg = 0x290c,
1838 .md_reg = 0x2908,
1839 .mn = {
1840 .mnctr_en_bit = 8,
1841 .mnctr_reset_bit = 7,
1842 .mnctr_mode_shift = 5,
1843 .n_val_shift = 16,
1844 .m_val_shift = 16,
1845 .width = 8,
1847 .p = {
1848 .pre_div_shift = 3,
1849 .pre_div_width = 2,
1851 .s = {
1852 .src_sel_shift = 0,
1853 .parent_map = gcc_pxo_pll8_map,
1855 .freq_tbl = clk_tbl_usb,
1856 .clkr = {
1857 .enable_reg = 0x290c,
1858 .enable_mask = BIT(11),
1859 .hw.init = &(struct clk_init_data){
1860 .name = "usb_hs1_xcvr_src",
1861 .parent_names = gcc_pxo_pll8,
1862 .num_parents = 2,
1863 .ops = &clk_rcg_ops,
1864 .flags = CLK_SET_RATE_GATE,
1869 static struct clk_branch usb_hs1_xcvr_clk = {
1870 .halt_reg = 0x2fc8,
1871 .halt_bit = 0,
1872 .clkr = {
1873 .enable_reg = 0x290c,
1874 .enable_mask = BIT(9),
1875 .hw.init = &(struct clk_init_data){
1876 .name = "usb_hs1_xcvr_clk",
1877 .parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
1878 .num_parents = 1,
1879 .ops = &clk_branch_ops,
1880 .flags = CLK_SET_RATE_PARENT,
1885 static struct clk_rcg usb_fs1_xcvr_fs_src = {
1886 .ns_reg = 0x2968,
1887 .md_reg = 0x2964,
1888 .mn = {
1889 .mnctr_en_bit = 8,
1890 .mnctr_reset_bit = 7,
1891 .mnctr_mode_shift = 5,
1892 .n_val_shift = 16,
1893 .m_val_shift = 16,
1894 .width = 8,
1896 .p = {
1897 .pre_div_shift = 3,
1898 .pre_div_width = 2,
1900 .s = {
1901 .src_sel_shift = 0,
1902 .parent_map = gcc_pxo_pll8_map,
1904 .freq_tbl = clk_tbl_usb,
1905 .clkr = {
1906 .enable_reg = 0x2968,
1907 .enable_mask = BIT(11),
1908 .hw.init = &(struct clk_init_data){
1909 .name = "usb_fs1_xcvr_fs_src",
1910 .parent_names = gcc_pxo_pll8,
1911 .num_parents = 2,
1912 .ops = &clk_rcg_ops,
1913 .flags = CLK_SET_RATE_GATE,
1918 static const char *usb_fs1_xcvr_fs_src_p[] = { "usb_fs1_xcvr_fs_src" };
1920 static struct clk_branch usb_fs1_xcvr_fs_clk = {
1921 .halt_reg = 0x2fcc,
1922 .halt_bit = 15,
1923 .clkr = {
1924 .enable_reg = 0x2968,
1925 .enable_mask = BIT(9),
1926 .hw.init = &(struct clk_init_data){
1927 .name = "usb_fs1_xcvr_fs_clk",
1928 .parent_names = usb_fs1_xcvr_fs_src_p,
1929 .num_parents = 1,
1930 .ops = &clk_branch_ops,
1931 .flags = CLK_SET_RATE_PARENT,
1936 static struct clk_branch usb_fs1_system_clk = {
1937 .halt_reg = 0x2fcc,
1938 .halt_bit = 16,
1939 .clkr = {
1940 .enable_reg = 0x296c,
1941 .enable_mask = BIT(4),
1942 .hw.init = &(struct clk_init_data){
1943 .parent_names = usb_fs1_xcvr_fs_src_p,
1944 .num_parents = 1,
1945 .name = "usb_fs1_system_clk",
1946 .ops = &clk_branch_ops,
1947 .flags = CLK_SET_RATE_PARENT,
1952 static struct clk_rcg usb_fs2_xcvr_fs_src = {
1953 .ns_reg = 0x2988,
1954 .md_reg = 0x2984,
1955 .mn = {
1956 .mnctr_en_bit = 8,
1957 .mnctr_reset_bit = 7,
1958 .mnctr_mode_shift = 5,
1959 .n_val_shift = 16,
1960 .m_val_shift = 16,
1961 .width = 8,
1963 .p = {
1964 .pre_div_shift = 3,
1965 .pre_div_width = 2,
1967 .s = {
1968 .src_sel_shift = 0,
1969 .parent_map = gcc_pxo_pll8_map,
1971 .freq_tbl = clk_tbl_usb,
1972 .clkr = {
1973 .enable_reg = 0x2988,
1974 .enable_mask = BIT(11),
1975 .hw.init = &(struct clk_init_data){
1976 .name = "usb_fs2_xcvr_fs_src",
1977 .parent_names = gcc_pxo_pll8,
1978 .num_parents = 2,
1979 .ops = &clk_rcg_ops,
1980 .flags = CLK_SET_RATE_GATE,
1985 static const char *usb_fs2_xcvr_fs_src_p[] = { "usb_fs2_xcvr_fs_src" };
1987 static struct clk_branch usb_fs2_xcvr_fs_clk = {
1988 .halt_reg = 0x2fcc,
1989 .halt_bit = 12,
1990 .clkr = {
1991 .enable_reg = 0x2988,
1992 .enable_mask = BIT(9),
1993 .hw.init = &(struct clk_init_data){
1994 .name = "usb_fs2_xcvr_fs_clk",
1995 .parent_names = usb_fs2_xcvr_fs_src_p,
1996 .num_parents = 1,
1997 .ops = &clk_branch_ops,
1998 .flags = CLK_SET_RATE_PARENT,
2003 static struct clk_branch usb_fs2_system_clk = {
2004 .halt_reg = 0x2fcc,
2005 .halt_bit = 13,
2006 .clkr = {
2007 .enable_reg = 0x298c,
2008 .enable_mask = BIT(4),
2009 .hw.init = &(struct clk_init_data){
2010 .name = "usb_fs2_system_clk",
2011 .parent_names = usb_fs2_xcvr_fs_src_p,
2012 .num_parents = 1,
2013 .ops = &clk_branch_ops,
2014 .flags = CLK_SET_RATE_PARENT,
2019 static struct clk_branch gsbi1_h_clk = {
2020 .halt_reg = 0x2fcc,
2021 .halt_bit = 11,
2022 .clkr = {
2023 .enable_reg = 0x29c0,
2024 .enable_mask = BIT(4),
2025 .hw.init = &(struct clk_init_data){
2026 .name = "gsbi1_h_clk",
2027 .ops = &clk_branch_ops,
2028 .flags = CLK_IS_ROOT,
2033 static struct clk_branch gsbi2_h_clk = {
2034 .halt_reg = 0x2fcc,
2035 .halt_bit = 7,
2036 .clkr = {
2037 .enable_reg = 0x29e0,
2038 .enable_mask = BIT(4),
2039 .hw.init = &(struct clk_init_data){
2040 .name = "gsbi2_h_clk",
2041 .ops = &clk_branch_ops,
2042 .flags = CLK_IS_ROOT,
2047 static struct clk_branch gsbi3_h_clk = {
2048 .halt_reg = 0x2fcc,
2049 .halt_bit = 3,
2050 .clkr = {
2051 .enable_reg = 0x2a00,
2052 .enable_mask = BIT(4),
2053 .hw.init = &(struct clk_init_data){
2054 .name = "gsbi3_h_clk",
2055 .ops = &clk_branch_ops,
2056 .flags = CLK_IS_ROOT,
2061 static struct clk_branch gsbi4_h_clk = {
2062 .halt_reg = 0x2fd0,
2063 .halt_bit = 27,
2064 .clkr = {
2065 .enable_reg = 0x2a20,
2066 .enable_mask = BIT(4),
2067 .hw.init = &(struct clk_init_data){
2068 .name = "gsbi4_h_clk",
2069 .ops = &clk_branch_ops,
2070 .flags = CLK_IS_ROOT,
2075 static struct clk_branch gsbi5_h_clk = {
2076 .halt_reg = 0x2fd0,
2077 .halt_bit = 23,
2078 .clkr = {
2079 .enable_reg = 0x2a40,
2080 .enable_mask = BIT(4),
2081 .hw.init = &(struct clk_init_data){
2082 .name = "gsbi5_h_clk",
2083 .ops = &clk_branch_ops,
2084 .flags = CLK_IS_ROOT,
2089 static struct clk_branch gsbi6_h_clk = {
2090 .halt_reg = 0x2fd0,
2091 .halt_bit = 19,
2092 .clkr = {
2093 .enable_reg = 0x2a60,
2094 .enable_mask = BIT(4),
2095 .hw.init = &(struct clk_init_data){
2096 .name = "gsbi6_h_clk",
2097 .ops = &clk_branch_ops,
2098 .flags = CLK_IS_ROOT,
2103 static struct clk_branch gsbi7_h_clk = {
2104 .halt_reg = 0x2fd0,
2105 .halt_bit = 15,
2106 .clkr = {
2107 .enable_reg = 0x2a80,
2108 .enable_mask = BIT(4),
2109 .hw.init = &(struct clk_init_data){
2110 .name = "gsbi7_h_clk",
2111 .ops = &clk_branch_ops,
2112 .flags = CLK_IS_ROOT,
2117 static struct clk_branch gsbi8_h_clk = {
2118 .halt_reg = 0x2fd0,
2119 .halt_bit = 11,
2120 .clkr = {
2121 .enable_reg = 0x2aa0,
2122 .enable_mask = BIT(4),
2123 .hw.init = &(struct clk_init_data){
2124 .name = "gsbi8_h_clk",
2125 .ops = &clk_branch_ops,
2126 .flags = CLK_IS_ROOT,
2131 static struct clk_branch gsbi9_h_clk = {
2132 .halt_reg = 0x2fd0,
2133 .halt_bit = 7,
2134 .clkr = {
2135 .enable_reg = 0x2ac0,
2136 .enable_mask = BIT(4),
2137 .hw.init = &(struct clk_init_data){
2138 .name = "gsbi9_h_clk",
2139 .ops = &clk_branch_ops,
2140 .flags = CLK_IS_ROOT,
2145 static struct clk_branch gsbi10_h_clk = {
2146 .halt_reg = 0x2fd0,
2147 .halt_bit = 3,
2148 .clkr = {
2149 .enable_reg = 0x2ae0,
2150 .enable_mask = BIT(4),
2151 .hw.init = &(struct clk_init_data){
2152 .name = "gsbi10_h_clk",
2153 .ops = &clk_branch_ops,
2154 .flags = CLK_IS_ROOT,
2159 static struct clk_branch gsbi11_h_clk = {
2160 .halt_reg = 0x2fd4,
2161 .halt_bit = 18,
2162 .clkr = {
2163 .enable_reg = 0x2b00,
2164 .enable_mask = BIT(4),
2165 .hw.init = &(struct clk_init_data){
2166 .name = "gsbi11_h_clk",
2167 .ops = &clk_branch_ops,
2168 .flags = CLK_IS_ROOT,
2173 static struct clk_branch gsbi12_h_clk = {
2174 .halt_reg = 0x2fd4,
2175 .halt_bit = 14,
2176 .clkr = {
2177 .enable_reg = 0x2b20,
2178 .enable_mask = BIT(4),
2179 .hw.init = &(struct clk_init_data){
2180 .name = "gsbi12_h_clk",
2181 .ops = &clk_branch_ops,
2182 .flags = CLK_IS_ROOT,
2187 static struct clk_branch tsif_h_clk = {
2188 .halt_reg = 0x2fd4,
2189 .halt_bit = 7,
2190 .clkr = {
2191 .enable_reg = 0x2700,
2192 .enable_mask = BIT(4),
2193 .hw.init = &(struct clk_init_data){
2194 .name = "tsif_h_clk",
2195 .ops = &clk_branch_ops,
2196 .flags = CLK_IS_ROOT,
2201 static struct clk_branch usb_fs1_h_clk = {
2202 .halt_reg = 0x2fcc,
2203 .halt_bit = 17,
2204 .clkr = {
2205 .enable_reg = 0x2960,
2206 .enable_mask = BIT(4),
2207 .hw.init = &(struct clk_init_data){
2208 .name = "usb_fs1_h_clk",
2209 .ops = &clk_branch_ops,
2210 .flags = CLK_IS_ROOT,
2215 static struct clk_branch usb_fs2_h_clk = {
2216 .halt_reg = 0x2fcc,
2217 .halt_bit = 14,
2218 .clkr = {
2219 .enable_reg = 0x2980,
2220 .enable_mask = BIT(4),
2221 .hw.init = &(struct clk_init_data){
2222 .name = "usb_fs2_h_clk",
2223 .ops = &clk_branch_ops,
2224 .flags = CLK_IS_ROOT,
2229 static struct clk_branch usb_hs1_h_clk = {
2230 .halt_reg = 0x2fc8,
2231 .halt_bit = 1,
2232 .clkr = {
2233 .enable_reg = 0x2900,
2234 .enable_mask = BIT(4),
2235 .hw.init = &(struct clk_init_data){
2236 .name = "usb_hs1_h_clk",
2237 .ops = &clk_branch_ops,
2238 .flags = CLK_IS_ROOT,
2243 static struct clk_branch sdc1_h_clk = {
2244 .halt_reg = 0x2fc8,
2245 .halt_bit = 11,
2246 .clkr = {
2247 .enable_reg = 0x2820,
2248 .enable_mask = BIT(4),
2249 .hw.init = &(struct clk_init_data){
2250 .name = "sdc1_h_clk",
2251 .ops = &clk_branch_ops,
2252 .flags = CLK_IS_ROOT,
2257 static struct clk_branch sdc2_h_clk = {
2258 .halt_reg = 0x2fc8,
2259 .halt_bit = 10,
2260 .clkr = {
2261 .enable_reg = 0x2840,
2262 .enable_mask = BIT(4),
2263 .hw.init = &(struct clk_init_data){
2264 .name = "sdc2_h_clk",
2265 .ops = &clk_branch_ops,
2266 .flags = CLK_IS_ROOT,
2271 static struct clk_branch sdc3_h_clk = {
2272 .halt_reg = 0x2fc8,
2273 .halt_bit = 9,
2274 .clkr = {
2275 .enable_reg = 0x2860,
2276 .enable_mask = BIT(4),
2277 .hw.init = &(struct clk_init_data){
2278 .name = "sdc3_h_clk",
2279 .ops = &clk_branch_ops,
2280 .flags = CLK_IS_ROOT,
2285 static struct clk_branch sdc4_h_clk = {
2286 .halt_reg = 0x2fc8,
2287 .halt_bit = 8,
2288 .clkr = {
2289 .enable_reg = 0x2880,
2290 .enable_mask = BIT(4),
2291 .hw.init = &(struct clk_init_data){
2292 .name = "sdc4_h_clk",
2293 .ops = &clk_branch_ops,
2294 .flags = CLK_IS_ROOT,
2299 static struct clk_branch sdc5_h_clk = {
2300 .halt_reg = 0x2fc8,
2301 .halt_bit = 7,
2302 .clkr = {
2303 .enable_reg = 0x28a0,
2304 .enable_mask = BIT(4),
2305 .hw.init = &(struct clk_init_data){
2306 .name = "sdc5_h_clk",
2307 .ops = &clk_branch_ops,
2308 .flags = CLK_IS_ROOT,
2313 static struct clk_branch adm0_clk = {
2314 .halt_reg = 0x2fdc,
2315 .halt_check = BRANCH_HALT_VOTED,
2316 .halt_bit = 14,
2317 .clkr = {
2318 .enable_reg = 0x3080,
2319 .enable_mask = BIT(2),
2320 .hw.init = &(struct clk_init_data){
2321 .name = "adm0_clk",
2322 .ops = &clk_branch_ops,
2323 .flags = CLK_IS_ROOT,
2328 static struct clk_branch adm0_pbus_clk = {
2329 .halt_reg = 0x2fdc,
2330 .halt_check = BRANCH_HALT_VOTED,
2331 .halt_bit = 13,
2332 .clkr = {
2333 .enable_reg = 0x3080,
2334 .enable_mask = BIT(3),
2335 .hw.init = &(struct clk_init_data){
2336 .name = "adm0_pbus_clk",
2337 .ops = &clk_branch_ops,
2338 .flags = CLK_IS_ROOT,
2343 static struct clk_branch adm1_clk = {
2344 .halt_reg = 0x2fdc,
2345 .halt_bit = 12,
2346 .halt_check = BRANCH_HALT_VOTED,
2347 .clkr = {
2348 .enable_reg = 0x3080,
2349 .enable_mask = BIT(4),
2350 .hw.init = &(struct clk_init_data){
2351 .name = "adm1_clk",
2352 .ops = &clk_branch_ops,
2353 .flags = CLK_IS_ROOT,
2358 static struct clk_branch adm1_pbus_clk = {
2359 .halt_reg = 0x2fdc,
2360 .halt_bit = 11,
2361 .halt_check = BRANCH_HALT_VOTED,
2362 .clkr = {
2363 .enable_reg = 0x3080,
2364 .enable_mask = BIT(5),
2365 .hw.init = &(struct clk_init_data){
2366 .name = "adm1_pbus_clk",
2367 .ops = &clk_branch_ops,
2368 .flags = CLK_IS_ROOT,
2373 static struct clk_branch modem_ahb1_h_clk = {
2374 .halt_reg = 0x2fdc,
2375 .halt_bit = 8,
2376 .halt_check = BRANCH_HALT_VOTED,
2377 .clkr = {
2378 .enable_reg = 0x3080,
2379 .enable_mask = BIT(0),
2380 .hw.init = &(struct clk_init_data){
2381 .name = "modem_ahb1_h_clk",
2382 .ops = &clk_branch_ops,
2383 .flags = CLK_IS_ROOT,
2388 static struct clk_branch modem_ahb2_h_clk = {
2389 .halt_reg = 0x2fdc,
2390 .halt_bit = 7,
2391 .halt_check = BRANCH_HALT_VOTED,
2392 .clkr = {
2393 .enable_reg = 0x3080,
2394 .enable_mask = BIT(1),
2395 .hw.init = &(struct clk_init_data){
2396 .name = "modem_ahb2_h_clk",
2397 .ops = &clk_branch_ops,
2398 .flags = CLK_IS_ROOT,
2403 static struct clk_branch pmic_arb0_h_clk = {
2404 .halt_reg = 0x2fd8,
2405 .halt_check = BRANCH_HALT_VOTED,
2406 .halt_bit = 22,
2407 .clkr = {
2408 .enable_reg = 0x3080,
2409 .enable_mask = BIT(8),
2410 .hw.init = &(struct clk_init_data){
2411 .name = "pmic_arb0_h_clk",
2412 .ops = &clk_branch_ops,
2413 .flags = CLK_IS_ROOT,
2418 static struct clk_branch pmic_arb1_h_clk = {
2419 .halt_reg = 0x2fd8,
2420 .halt_check = BRANCH_HALT_VOTED,
2421 .halt_bit = 21,
2422 .clkr = {
2423 .enable_reg = 0x3080,
2424 .enable_mask = BIT(9),
2425 .hw.init = &(struct clk_init_data){
2426 .name = "pmic_arb1_h_clk",
2427 .ops = &clk_branch_ops,
2428 .flags = CLK_IS_ROOT,
2433 static struct clk_branch pmic_ssbi2_clk = {
2434 .halt_reg = 0x2fd8,
2435 .halt_check = BRANCH_HALT_VOTED,
2436 .halt_bit = 23,
2437 .clkr = {
2438 .enable_reg = 0x3080,
2439 .enable_mask = BIT(7),
2440 .hw.init = &(struct clk_init_data){
2441 .name = "pmic_ssbi2_clk",
2442 .ops = &clk_branch_ops,
2443 .flags = CLK_IS_ROOT,
2448 static struct clk_branch rpm_msg_ram_h_clk = {
2449 .hwcg_reg = 0x27e0,
2450 .hwcg_bit = 6,
2451 .halt_reg = 0x2fd8,
2452 .halt_check = BRANCH_HALT_VOTED,
2453 .halt_bit = 12,
2454 .clkr = {
2455 .enable_reg = 0x3080,
2456 .enable_mask = BIT(6),
2457 .hw.init = &(struct clk_init_data){
2458 .name = "rpm_msg_ram_h_clk",
2459 .ops = &clk_branch_ops,
2460 .flags = CLK_IS_ROOT,
2465 static struct clk_regmap *gcc_msm8660_clks[] = {
2466 [PLL8] = &pll8.clkr,
2467 [PLL8_VOTE] = &pll8_vote,
2468 [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
2469 [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
2470 [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
2471 [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
2472 [GSBI3_UART_SRC] = &gsbi3_uart_src.clkr,
2473 [GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr,
2474 [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
2475 [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
2476 [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
2477 [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
2478 [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr,
2479 [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr,
2480 [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr,
2481 [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr,
2482 [GSBI8_UART_SRC] = &gsbi8_uart_src.clkr,
2483 [GSBI8_UART_CLK] = &gsbi8_uart_clk.clkr,
2484 [GSBI9_UART_SRC] = &gsbi9_uart_src.clkr,
2485 [GSBI9_UART_CLK] = &gsbi9_uart_clk.clkr,
2486 [GSBI10_UART_SRC] = &gsbi10_uart_src.clkr,
2487 [GSBI10_UART_CLK] = &gsbi10_uart_clk.clkr,
2488 [GSBI11_UART_SRC] = &gsbi11_uart_src.clkr,
2489 [GSBI11_UART_CLK] = &gsbi11_uart_clk.clkr,
2490 [GSBI12_UART_SRC] = &gsbi12_uart_src.clkr,
2491 [GSBI12_UART_CLK] = &gsbi12_uart_clk.clkr,
2492 [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
2493 [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
2494 [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
2495 [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
2496 [GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr,
2497 [GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr,
2498 [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
2499 [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
2500 [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
2501 [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
2502 [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr,
2503 [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr,
2504 [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr,
2505 [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr,
2506 [GSBI8_QUP_SRC] = &gsbi8_qup_src.clkr,
2507 [GSBI8_QUP_CLK] = &gsbi8_qup_clk.clkr,
2508 [GSBI9_QUP_SRC] = &gsbi9_qup_src.clkr,
2509 [GSBI9_QUP_CLK] = &gsbi9_qup_clk.clkr,
2510 [GSBI10_QUP_SRC] = &gsbi10_qup_src.clkr,
2511 [GSBI10_QUP_CLK] = &gsbi10_qup_clk.clkr,
2512 [GSBI11_QUP_SRC] = &gsbi11_qup_src.clkr,
2513 [GSBI11_QUP_CLK] = &gsbi11_qup_clk.clkr,
2514 [GSBI12_QUP_SRC] = &gsbi12_qup_src.clkr,
2515 [GSBI12_QUP_CLK] = &gsbi12_qup_clk.clkr,
2516 [GP0_SRC] = &gp0_src.clkr,
2517 [GP0_CLK] = &gp0_clk.clkr,
2518 [GP1_SRC] = &gp1_src.clkr,
2519 [GP1_CLK] = &gp1_clk.clkr,
2520 [GP2_SRC] = &gp2_src.clkr,
2521 [GP2_CLK] = &gp2_clk.clkr,
2522 [PMEM_CLK] = &pmem_clk.clkr,
2523 [PRNG_SRC] = &prng_src.clkr,
2524 [PRNG_CLK] = &prng_clk.clkr,
2525 [SDC1_SRC] = &sdc1_src.clkr,
2526 [SDC1_CLK] = &sdc1_clk.clkr,
2527 [SDC2_SRC] = &sdc2_src.clkr,
2528 [SDC2_CLK] = &sdc2_clk.clkr,
2529 [SDC3_SRC] = &sdc3_src.clkr,
2530 [SDC3_CLK] = &sdc3_clk.clkr,
2531 [SDC4_SRC] = &sdc4_src.clkr,
2532 [SDC4_CLK] = &sdc4_clk.clkr,
2533 [SDC5_SRC] = &sdc5_src.clkr,
2534 [SDC5_CLK] = &sdc5_clk.clkr,
2535 [TSIF_REF_SRC] = &tsif_ref_src.clkr,
2536 [TSIF_REF_CLK] = &tsif_ref_clk.clkr,
2537 [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr,
2538 [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
2539 [USB_FS1_XCVR_FS_SRC] = &usb_fs1_xcvr_fs_src.clkr,
2540 [USB_FS1_XCVR_FS_CLK] = &usb_fs1_xcvr_fs_clk.clkr,
2541 [USB_FS1_SYSTEM_CLK] = &usb_fs1_system_clk.clkr,
2542 [USB_FS2_XCVR_FS_SRC] = &usb_fs2_xcvr_fs_src.clkr,
2543 [USB_FS2_XCVR_FS_CLK] = &usb_fs2_xcvr_fs_clk.clkr,
2544 [USB_FS2_SYSTEM_CLK] = &usb_fs2_system_clk.clkr,
2545 [GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
2546 [GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
2547 [GSBI3_H_CLK] = &gsbi3_h_clk.clkr,
2548 [GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
2549 [GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
2550 [GSBI6_H_CLK] = &gsbi6_h_clk.clkr,
2551 [GSBI7_H_CLK] = &gsbi7_h_clk.clkr,
2552 [GSBI8_H_CLK] = &gsbi8_h_clk.clkr,
2553 [GSBI9_H_CLK] = &gsbi9_h_clk.clkr,
2554 [GSBI10_H_CLK] = &gsbi10_h_clk.clkr,
2555 [GSBI11_H_CLK] = &gsbi11_h_clk.clkr,
2556 [GSBI12_H_CLK] = &gsbi12_h_clk.clkr,
2557 [TSIF_H_CLK] = &tsif_h_clk.clkr,
2558 [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr,
2559 [USB_FS2_H_CLK] = &usb_fs2_h_clk.clkr,
2560 [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
2561 [SDC1_H_CLK] = &sdc1_h_clk.clkr,
2562 [SDC2_H_CLK] = &sdc2_h_clk.clkr,
2563 [SDC3_H_CLK] = &sdc3_h_clk.clkr,
2564 [SDC4_H_CLK] = &sdc4_h_clk.clkr,
2565 [SDC5_H_CLK] = &sdc5_h_clk.clkr,
2566 [ADM0_CLK] = &adm0_clk.clkr,
2567 [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
2568 [ADM1_CLK] = &adm1_clk.clkr,
2569 [ADM1_PBUS_CLK] = &adm1_pbus_clk.clkr,
2570 [MODEM_AHB1_H_CLK] = &modem_ahb1_h_clk.clkr,
2571 [MODEM_AHB2_H_CLK] = &modem_ahb2_h_clk.clkr,
2572 [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
2573 [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
2574 [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
2575 [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
2578 static const struct qcom_reset_map gcc_msm8660_resets[] = {
2579 [AFAB_CORE_RESET] = { 0x2080, 7 },
2580 [SCSS_SYS_RESET] = { 0x20b4, 1 },
2581 [SCSS_SYS_POR_RESET] = { 0x20b4 },
2582 [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 },
2583 [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 },
2584 [AFAB_SMPSS_M0_RESET] = { 0x20b8 },
2585 [AFAB_EBI1_S_RESET] = { 0x20c0, 7 },
2586 [SFAB_CORE_RESET] = { 0x2120, 7 },
2587 [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 },
2588 [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 },
2589 [SFAB_ADM0_M2_RESET] = { 0x21e4, 7 },
2590 [ADM0_C2_RESET] = { 0x220c, 4 },
2591 [ADM0_C1_RESET] = { 0x220c, 3 },
2592 [ADM0_C0_RESET] = { 0x220c, 2 },
2593 [ADM0_PBUS_RESET] = { 0x220c, 1 },
2594 [ADM0_RESET] = { 0x220c },
2595 [SFAB_ADM1_M0_RESET] = { 0x2220, 7 },
2596 [SFAB_ADM1_M1_RESET] = { 0x2224, 7 },
2597 [SFAB_ADM1_M2_RESET] = { 0x2228, 7 },
2598 [MMFAB_ADM1_M3_RESET] = { 0x2240, 7 },
2599 [ADM1_C3_RESET] = { 0x226c, 5 },
2600 [ADM1_C2_RESET] = { 0x226c, 4 },
2601 [ADM1_C1_RESET] = { 0x226c, 3 },
2602 [ADM1_C0_RESET] = { 0x226c, 2 },
2603 [ADM1_PBUS_RESET] = { 0x226c, 1 },
2604 [ADM1_RESET] = { 0x226c },
2605 [IMEM0_RESET] = { 0x2280, 7 },
2606 [SFAB_LPASS_Q6_RESET] = { 0x23a0, 7 },
2607 [SFAB_AFAB_M_RESET] = { 0x23e0, 7 },
2608 [AFAB_SFAB_M0_RESET] = { 0x2420, 7 },
2609 [AFAB_SFAB_M1_RESET] = { 0x2424, 7 },
2610 [DFAB_CORE_RESET] = { 0x24ac, 7 },
2611 [SFAB_DFAB_M_RESET] = { 0x2500, 7 },
2612 [DFAB_SFAB_M_RESET] = { 0x2520, 7 },
2613 [DFAB_SWAY0_RESET] = { 0x2540, 7 },
2614 [DFAB_SWAY1_RESET] = { 0x2544, 7 },
2615 [DFAB_ARB0_RESET] = { 0x2560, 7 },
2616 [DFAB_ARB1_RESET] = { 0x2564, 7 },
2617 [PPSS_PROC_RESET] = { 0x2594, 1 },
2618 [PPSS_RESET] = { 0x2594 },
2619 [PMEM_RESET] = { 0x25a0, 7 },
2620 [DMA_BAM_RESET] = { 0x25c0, 7 },
2621 [SIC_RESET] = { 0x25e0, 7 },
2622 [SPS_TIC_RESET] = { 0x2600, 7 },
2623 [CFBP0_RESET] = { 0x2650, 7 },
2624 [CFBP1_RESET] = { 0x2654, 7 },
2625 [CFBP2_RESET] = { 0x2658, 7 },
2626 [EBI2_RESET] = { 0x2664, 7 },
2627 [SFAB_CFPB_M_RESET] = { 0x2680, 7 },
2628 [CFPB_MASTER_RESET] = { 0x26a0, 7 },
2629 [SFAB_CFPB_S_RESET] = { 0x26c0, 7 },
2630 [CFPB_SPLITTER_RESET] = { 0x26e0, 7 },
2631 [TSIF_RESET] = { 0x2700, 7 },
2632 [CE1_RESET] = { 0x2720, 7 },
2633 [CE2_RESET] = { 0x2740, 7 },
2634 [SFAB_SFPB_M_RESET] = { 0x2780, 7 },
2635 [SFAB_SFPB_S_RESET] = { 0x27a0, 7 },
2636 [RPM_PROC_RESET] = { 0x27c0, 7 },
2637 [RPM_BUS_RESET] = { 0x27c4, 7 },
2638 [RPM_MSG_RAM_RESET] = { 0x27e0, 7 },
2639 [PMIC_ARB0_RESET] = { 0x2800, 7 },
2640 [PMIC_ARB1_RESET] = { 0x2804, 7 },
2641 [PMIC_SSBI2_RESET] = { 0x280c, 12 },
2642 [SDC1_RESET] = { 0x2830 },
2643 [SDC2_RESET] = { 0x2850 },
2644 [SDC3_RESET] = { 0x2870 },
2645 [SDC4_RESET] = { 0x2890 },
2646 [SDC5_RESET] = { 0x28b0 },
2647 [USB_HS1_RESET] = { 0x2910 },
2648 [USB_HS2_XCVR_RESET] = { 0x2934, 1 },
2649 [USB_HS2_RESET] = { 0x2934 },
2650 [USB_FS1_XCVR_RESET] = { 0x2974, 1 },
2651 [USB_FS1_RESET] = { 0x2974 },
2652 [USB_FS2_XCVR_RESET] = { 0x2994, 1 },
2653 [USB_FS2_RESET] = { 0x2994 },
2654 [GSBI1_RESET] = { 0x29dc },
2655 [GSBI2_RESET] = { 0x29fc },
2656 [GSBI3_RESET] = { 0x2a1c },
2657 [GSBI4_RESET] = { 0x2a3c },
2658 [GSBI5_RESET] = { 0x2a5c },
2659 [GSBI6_RESET] = { 0x2a7c },
2660 [GSBI7_RESET] = { 0x2a9c },
2661 [GSBI8_RESET] = { 0x2abc },
2662 [GSBI9_RESET] = { 0x2adc },
2663 [GSBI10_RESET] = { 0x2afc },
2664 [GSBI11_RESET] = { 0x2b1c },
2665 [GSBI12_RESET] = { 0x2b3c },
2666 [SPDM_RESET] = { 0x2b6c },
2667 [SEC_CTRL_RESET] = { 0x2b80, 7 },
2668 [TLMM_H_RESET] = { 0x2ba0, 7 },
2669 [TLMM_RESET] = { 0x2ba4, 7 },
2670 [MARRM_PWRON_RESET] = { 0x2bd4, 1 },
2671 [MARM_RESET] = { 0x2bd4 },
2672 [MAHB1_RESET] = { 0x2be4, 7 },
2673 [SFAB_MSS_S_RESET] = { 0x2c00, 7 },
2674 [MAHB2_RESET] = { 0x2c20, 7 },
2675 [MODEM_SW_AHB_RESET] = { 0x2c48, 1 },
2676 [MODEM_RESET] = { 0x2c48 },
2677 [SFAB_MSS_MDM1_RESET] = { 0x2c4c, 1 },
2678 [SFAB_MSS_MDM0_RESET] = { 0x2c4c },
2679 [MSS_SLP_RESET] = { 0x2c60, 7 },
2680 [MSS_MARM_SAW_RESET] = { 0x2c68, 1 },
2681 [MSS_WDOG_RESET] = { 0x2c68 },
2682 [TSSC_RESET] = { 0x2ca0, 7 },
2683 [PDM_RESET] = { 0x2cc0, 12 },
2684 [SCSS_CORE0_RESET] = { 0x2d60, 1 },
2685 [SCSS_CORE0_POR_RESET] = { 0x2d60 },
2686 [SCSS_CORE1_RESET] = { 0x2d80, 1 },
2687 [SCSS_CORE1_POR_RESET] = { 0x2d80 },
2688 [MPM_RESET] = { 0x2da4, 1 },
2689 [EBI1_1X_DIV_RESET] = { 0x2dec, 9 },
2690 [EBI1_RESET] = { 0x2dec, 7 },
2691 [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 },
2692 [USB_PHY0_RESET] = { 0x2e20 },
2693 [USB_PHY1_RESET] = { 0x2e40 },
2694 [PRNG_RESET] = { 0x2e80, 12 },
2697 static const struct regmap_config gcc_msm8660_regmap_config = {
2698 .reg_bits = 32,
2699 .reg_stride = 4,
2700 .val_bits = 32,
2701 .max_register = 0x363c,
2702 .fast_io = true,
2705 static const struct qcom_cc_desc gcc_msm8660_desc = {
2706 .config = &gcc_msm8660_regmap_config,
2707 .clks = gcc_msm8660_clks,
2708 .num_clks = ARRAY_SIZE(gcc_msm8660_clks),
2709 .resets = gcc_msm8660_resets,
2710 .num_resets = ARRAY_SIZE(gcc_msm8660_resets),
2713 static const struct of_device_id gcc_msm8660_match_table[] = {
2714 { .compatible = "qcom,gcc-msm8660" },
2717 MODULE_DEVICE_TABLE(of, gcc_msm8660_match_table);
2719 static int gcc_msm8660_probe(struct platform_device *pdev)
2721 struct clk *clk;
2722 struct device *dev = &pdev->dev;
2724 /* Temporary until RPM clocks supported */
2725 clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
2726 if (IS_ERR(clk))
2727 return PTR_ERR(clk);
2729 clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 27000000);
2730 if (IS_ERR(clk))
2731 return PTR_ERR(clk);
2733 return qcom_cc_probe(pdev, &gcc_msm8660_desc);
2736 static int gcc_msm8660_remove(struct platform_device *pdev)
2738 qcom_cc_remove(pdev);
2739 return 0;
2742 static struct platform_driver gcc_msm8660_driver = {
2743 .probe = gcc_msm8660_probe,
2744 .remove = gcc_msm8660_remove,
2745 .driver = {
2746 .name = "gcc-msm8660",
2747 .of_match_table = gcc_msm8660_match_table,
2751 static int __init gcc_msm8660_init(void)
2753 return platform_driver_register(&gcc_msm8660_driver);
2755 core_initcall(gcc_msm8660_init);
2757 static void __exit gcc_msm8660_exit(void)
2759 platform_driver_unregister(&gcc_msm8660_driver);
2761 module_exit(gcc_msm8660_exit);
2763 MODULE_DESCRIPTION("GCC MSM 8660 Driver");
2764 MODULE_LICENSE("GPL v2");
2765 MODULE_ALIAS("platform:gcc-msm8660");