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