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