xref: /linux/drivers/clk/qcom/gcc-ipq806x.c (revision db10cb9b)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2014, The Linux Foundation. All rights reserved.
4  */
5 
6 #include <linux/kernel.h>
7 #include <linux/bitops.h>
8 #include <linux/err.h>
9 #include <linux/platform_device.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/of_platform.h>
13 #include <linux/clk-provider.h>
14 #include <linux/regmap.h>
15 #include <linux/reset-controller.h>
16 
17 #include <dt-bindings/clock/qcom,gcc-ipq806x.h>
18 #include <dt-bindings/reset/qcom,gcc-ipq806x.h>
19 
20 #include "common.h"
21 #include "clk-regmap.h"
22 #include "clk-pll.h"
23 #include "clk-rcg.h"
24 #include "clk-branch.h"
25 #include "clk-hfpll.h"
26 #include "reset.h"
27 
28 static const struct clk_parent_data gcc_pxo[] = {
29 	{ .fw_name = "pxo", .name = "pxo" },
30 };
31 
32 static struct clk_pll pll0 = {
33 	.l_reg = 0x30c4,
34 	.m_reg = 0x30c8,
35 	.n_reg = 0x30cc,
36 	.config_reg = 0x30d4,
37 	.mode_reg = 0x30c0,
38 	.status_reg = 0x30d8,
39 	.status_bit = 16,
40 	.clkr.hw.init = &(struct clk_init_data){
41 		.name = "pll0",
42 		.parent_data = gcc_pxo,
43 		.num_parents = 1,
44 		.ops = &clk_pll_ops,
45 	},
46 };
47 
48 static struct clk_regmap pll0_vote = {
49 	.enable_reg = 0x34c0,
50 	.enable_mask = BIT(0),
51 	.hw.init = &(struct clk_init_data){
52 		.name = "pll0_vote",
53 		.parent_hws = (const struct clk_hw*[]){
54 			&pll0.clkr.hw,
55 		},
56 		.num_parents = 1,
57 		.ops = &clk_pll_vote_ops,
58 	},
59 };
60 
61 static struct clk_pll pll3 = {
62 	.l_reg = 0x3164,
63 	.m_reg = 0x3168,
64 	.n_reg = 0x316c,
65 	.config_reg = 0x3174,
66 	.mode_reg = 0x3160,
67 	.status_reg = 0x3178,
68 	.status_bit = 16,
69 	.clkr.hw.init = &(struct clk_init_data){
70 		.name = "pll3",
71 		.parent_data = gcc_pxo,
72 		.num_parents = 1,
73 		.ops = &clk_pll_ops,
74 	},
75 };
76 
77 static struct clk_regmap pll4_vote = {
78 	.enable_reg = 0x34c0,
79 	.enable_mask = BIT(4),
80 	.hw.init = &(struct clk_init_data){
81 		.name = "pll4_vote",
82 		.parent_data = &(const struct clk_parent_data){
83 			.fw_name = "pll4", .name = "pll4",
84 		},
85 		.num_parents = 1,
86 		.ops = &clk_pll_vote_ops,
87 	},
88 };
89 
90 static struct clk_pll pll8 = {
91 	.l_reg = 0x3144,
92 	.m_reg = 0x3148,
93 	.n_reg = 0x314c,
94 	.config_reg = 0x3154,
95 	.mode_reg = 0x3140,
96 	.status_reg = 0x3158,
97 	.status_bit = 16,
98 	.clkr.hw.init = &(struct clk_init_data){
99 		.name = "pll8",
100 		.parent_data = gcc_pxo,
101 		.num_parents = 1,
102 		.ops = &clk_pll_ops,
103 	},
104 };
105 
106 static struct clk_regmap pll8_vote = {
107 	.enable_reg = 0x34c0,
108 	.enable_mask = BIT(8),
109 	.hw.init = &(struct clk_init_data){
110 		.name = "pll8_vote",
111 		.parent_hws = (const struct clk_hw*[]){
112 			&pll8.clkr.hw,
113 		},
114 		.num_parents = 1,
115 		.ops = &clk_pll_vote_ops,
116 	},
117 };
118 
119 static struct hfpll_data hfpll0_data = {
120 	.mode_reg = 0x3200,
121 	.l_reg = 0x3208,
122 	.m_reg = 0x320c,
123 	.n_reg = 0x3210,
124 	.config_reg = 0x3204,
125 	.status_reg = 0x321c,
126 	.config_val = 0x7845c665,
127 	.droop_reg = 0x3214,
128 	.droop_val = 0x0108c000,
129 	.min_rate = 600000000UL,
130 	.max_rate = 1800000000UL,
131 };
132 
133 static struct clk_hfpll hfpll0 = {
134 	.d = &hfpll0_data,
135 	.clkr.hw.init = &(struct clk_init_data){
136 		.parent_data = gcc_pxo,
137 		.num_parents = 1,
138 		.name = "hfpll0",
139 		.ops = &clk_ops_hfpll,
140 		.flags = CLK_IGNORE_UNUSED,
141 	},
142 	.lock = __SPIN_LOCK_UNLOCKED(hfpll0.lock),
143 };
144 
145 static struct hfpll_data hfpll1_data = {
146 	.mode_reg = 0x3240,
147 	.l_reg = 0x3248,
148 	.m_reg = 0x324c,
149 	.n_reg = 0x3250,
150 	.config_reg = 0x3244,
151 	.status_reg = 0x325c,
152 	.config_val = 0x7845c665,
153 	.droop_reg = 0x3314,
154 	.droop_val = 0x0108c000,
155 	.min_rate = 600000000UL,
156 	.max_rate = 1800000000UL,
157 };
158 
159 static struct clk_hfpll hfpll1 = {
160 	.d = &hfpll1_data,
161 	.clkr.hw.init = &(struct clk_init_data){
162 		.parent_data = gcc_pxo,
163 		.num_parents = 1,
164 		.name = "hfpll1",
165 		.ops = &clk_ops_hfpll,
166 		.flags = CLK_IGNORE_UNUSED,
167 	},
168 	.lock = __SPIN_LOCK_UNLOCKED(hfpll1.lock),
169 };
170 
171 static struct hfpll_data hfpll_l2_data = {
172 	.mode_reg = 0x3300,
173 	.l_reg = 0x3308,
174 	.m_reg = 0x330c,
175 	.n_reg = 0x3310,
176 	.config_reg = 0x3304,
177 	.status_reg = 0x331c,
178 	.config_val = 0x7845c665,
179 	.droop_reg = 0x3314,
180 	.droop_val = 0x0108c000,
181 	.min_rate = 600000000UL,
182 	.max_rate = 1800000000UL,
183 };
184 
185 static struct clk_hfpll hfpll_l2 = {
186 	.d = &hfpll_l2_data,
187 	.clkr.hw.init = &(struct clk_init_data){
188 		.parent_data = gcc_pxo,
189 		.num_parents = 1,
190 		.name = "hfpll_l2",
191 		.ops = &clk_ops_hfpll,
192 		.flags = CLK_IGNORE_UNUSED,
193 	},
194 	.lock = __SPIN_LOCK_UNLOCKED(hfpll_l2.lock),
195 };
196 
197 static struct clk_pll pll14 = {
198 	.l_reg = 0x31c4,
199 	.m_reg = 0x31c8,
200 	.n_reg = 0x31cc,
201 	.config_reg = 0x31d4,
202 	.mode_reg = 0x31c0,
203 	.status_reg = 0x31d8,
204 	.status_bit = 16,
205 	.clkr.hw.init = &(struct clk_init_data){
206 		.name = "pll14",
207 		.parent_data = gcc_pxo,
208 		.num_parents = 1,
209 		.ops = &clk_pll_ops,
210 	},
211 };
212 
213 static struct clk_regmap pll14_vote = {
214 	.enable_reg = 0x34c0,
215 	.enable_mask = BIT(14),
216 	.hw.init = &(struct clk_init_data){
217 		.name = "pll14_vote",
218 		.parent_hws = (const struct clk_hw*[]){
219 			&pll14.clkr.hw,
220 		},
221 		.num_parents = 1,
222 		.ops = &clk_pll_vote_ops,
223 	},
224 };
225 
226 #define NSS_PLL_RATE(f, _l, _m, _n, i) \
227 	{  \
228 		.freq = f,  \
229 		.l = _l, \
230 		.m = _m, \
231 		.n = _n, \
232 		.ibits = i, \
233 	}
234 
235 static struct pll_freq_tbl pll18_freq_tbl[] = {
236 	NSS_PLL_RATE(550000000, 44, 0, 1, 0x01495625),
237 	NSS_PLL_RATE(600000000, 48, 0, 1, 0x01495625),
238 	NSS_PLL_RATE(733000000, 58, 16, 25, 0x014b5625),
239 	NSS_PLL_RATE(800000000, 64, 0, 1, 0x01495625),
240 };
241 
242 static struct clk_pll pll18 = {
243 	.l_reg = 0x31a4,
244 	.m_reg = 0x31a8,
245 	.n_reg = 0x31ac,
246 	.config_reg = 0x31b4,
247 	.mode_reg = 0x31a0,
248 	.status_reg = 0x31b8,
249 	.status_bit = 16,
250 	.post_div_shift = 16,
251 	.post_div_width = 1,
252 	.freq_tbl = pll18_freq_tbl,
253 	.clkr.hw.init = &(struct clk_init_data){
254 		.name = "pll18",
255 		.parent_data = gcc_pxo,
256 		.num_parents = 1,
257 		.ops = &clk_pll_ops,
258 	},
259 };
260 
261 static struct clk_pll pll11 = {
262 	.l_reg = 0x3184,
263 	.m_reg = 0x3188,
264 	.n_reg = 0x318c,
265 	.config_reg = 0x3194,
266 	.mode_reg = 0x3180,
267 	.status_reg = 0x3198,
268 	.status_bit = 16,
269 	.clkr.hw.init = &(struct clk_init_data){
270 		.name = "pll11",
271 		.parent_data = &(const struct clk_parent_data){
272 			.fw_name = "pxo",
273 		},
274 		.num_parents = 1,
275 		.ops = &clk_pll_ops,
276 	},
277 };
278 
279 enum {
280 	P_PXO,
281 	P_PLL8,
282 	P_PLL3,
283 	P_PLL0,
284 	P_CXO,
285 	P_PLL14,
286 	P_PLL18,
287 	P_PLL11,
288 };
289 
290 static const struct parent_map gcc_pxo_pll8_map[] = {
291 	{ P_PXO, 0 },
292 	{ P_PLL8, 3 }
293 };
294 
295 static const struct clk_parent_data gcc_pxo_pll8[] = {
296 	{ .fw_name = "pxo", .name = "pxo" },
297 	{ .hw = &pll8_vote.hw },
298 };
299 
300 static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
301 	{ P_PXO, 0 },
302 	{ P_PLL8, 3 },
303 	{ P_CXO, 5 }
304 };
305 
306 static const struct clk_parent_data gcc_pxo_pll8_cxo[] = {
307 	{ .fw_name = "pxo", .name = "pxo" },
308 	{ .hw = &pll8_vote.hw },
309 	{ .fw_name = "cxo", .name = "cxo" },
310 };
311 
312 static const struct parent_map gcc_pxo_pll3_map[] = {
313 	{ P_PXO, 0 },
314 	{ P_PLL3, 1 }
315 };
316 
317 static const struct parent_map gcc_pxo_pll3_sata_map[] = {
318 	{ P_PXO, 0 },
319 	{ P_PLL3, 6 }
320 };
321 
322 static const struct clk_parent_data gcc_pxo_pll3[] = {
323 	{ .fw_name = "pxo", .name = "pxo" },
324 	{ .hw = &pll3.clkr.hw },
325 };
326 
327 static const struct parent_map gcc_pxo_pll8_pll0_map[] = {
328 	{ P_PXO, 0 },
329 	{ P_PLL8, 3 },
330 	{ P_PLL0, 2 }
331 };
332 
333 static const struct clk_parent_data gcc_pxo_pll8_pll0[] = {
334 	{ .fw_name = "pxo", .name = "pxo" },
335 	{ .hw = &pll8_vote.hw },
336 	{ .hw = &pll0_vote.hw },
337 };
338 
339 static const struct parent_map gcc_pxo_pll8_pll14_pll18_pll0_map[] = {
340 	{ P_PXO, 0 },
341 	{ P_PLL8, 4 },
342 	{ P_PLL0, 2 },
343 	{ P_PLL14, 5 },
344 	{ P_PLL18, 1 }
345 };
346 
347 static const struct clk_parent_data gcc_pxo_pll8_pll14_pll18_pll0[] = {
348 	{ .fw_name = "pxo", .name = "pxo" },
349 	{ .hw = &pll8_vote.hw },
350 	{ .hw = &pll0_vote.hw },
351 	{ .hw = &pll14.clkr.hw },
352 	{ .hw = &pll18.clkr.hw },
353 };
354 
355 static const struct parent_map gcc_pxo_pll8_pll0_pll14_pll18_pll11_map[] = {
356 	{ P_PXO, 0 },
357 	{ P_PLL8, 4 },
358 	{ P_PLL0, 2 },
359 	{ P_PLL14, 5 },
360 	{ P_PLL18, 1 },
361 	{ P_PLL11, 3 },
362 };
363 
364 static const struct clk_parent_data gcc_pxo_pll8_pll0_pll14_pll18_pll11[] = {
365 	{ .fw_name = "pxo" },
366 	{ .hw = &pll8_vote.hw },
367 	{ .hw = &pll0_vote.hw },
368 	{ .hw = &pll14.clkr.hw },
369 	{ .hw = &pll18.clkr.hw },
370 	{ .hw = &pll11.clkr.hw },
371 
372 };
373 
374 static const struct parent_map gcc_pxo_pll3_pll0_pll14_pll18_pll11_map[] = {
375 	{ P_PXO, 0 },
376 	{ P_PLL3, 6 },
377 	{ P_PLL0, 2 },
378 	{ P_PLL14, 5 },
379 	{ P_PLL18, 1 },
380 	{ P_PLL11, 3 },
381 };
382 
383 static const struct clk_parent_data gcc_pxo_pll3_pll0_pll14_pll18_pll11[] = {
384 	{ .fw_name = "pxo" },
385 	{ .hw = &pll3.clkr.hw },
386 	{ .hw = &pll0_vote.hw },
387 	{ .hw = &pll14.clkr.hw },
388 	{ .hw = &pll18.clkr.hw },
389 	{ .hw = &pll11.clkr.hw },
390 
391 };
392 
393 static struct freq_tbl clk_tbl_gsbi_uart[] = {
394 	{  1843200, P_PLL8, 2,  6, 625 },
395 	{  3686400, P_PLL8, 2, 12, 625 },
396 	{  7372800, P_PLL8, 2, 24, 625 },
397 	{ 14745600, P_PLL8, 2, 48, 625 },
398 	{ 16000000, P_PLL8, 4,  1,   6 },
399 	{ 24000000, P_PLL8, 4,  1,   4 },
400 	{ 32000000, P_PLL8, 4,  1,   3 },
401 	{ 40000000, P_PLL8, 1,  5,  48 },
402 	{ 46400000, P_PLL8, 1, 29, 240 },
403 	{ 48000000, P_PLL8, 4,  1,   2 },
404 	{ 51200000, P_PLL8, 1,  2,  15 },
405 	{ 56000000, P_PLL8, 1,  7,  48 },
406 	{ 58982400, P_PLL8, 1, 96, 625 },
407 	{ 64000000, P_PLL8, 2,  1,   3 },
408 	{ }
409 };
410 
411 static struct clk_rcg gsbi1_uart_src = {
412 	.ns_reg = 0x29d4,
413 	.md_reg = 0x29d0,
414 	.mn = {
415 		.mnctr_en_bit = 8,
416 		.mnctr_reset_bit = 7,
417 		.mnctr_mode_shift = 5,
418 		.n_val_shift = 16,
419 		.m_val_shift = 16,
420 		.width = 16,
421 	},
422 	.p = {
423 		.pre_div_shift = 3,
424 		.pre_div_width = 2,
425 	},
426 	.s = {
427 		.src_sel_shift = 0,
428 		.parent_map = gcc_pxo_pll8_map,
429 	},
430 	.freq_tbl = clk_tbl_gsbi_uart,
431 	.clkr = {
432 		.enable_reg = 0x29d4,
433 		.enable_mask = BIT(11),
434 		.hw.init = &(struct clk_init_data){
435 			.name = "gsbi1_uart_src",
436 			.parent_data = gcc_pxo_pll8,
437 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
438 			.ops = &clk_rcg_ops,
439 			.flags = CLK_SET_PARENT_GATE,
440 		},
441 	},
442 };
443 
444 static struct clk_branch gsbi1_uart_clk = {
445 	.halt_reg = 0x2fcc,
446 	.halt_bit = 12,
447 	.clkr = {
448 		.enable_reg = 0x29d4,
449 		.enable_mask = BIT(9),
450 		.hw.init = &(struct clk_init_data){
451 			.name = "gsbi1_uart_clk",
452 			.parent_hws = (const struct clk_hw*[]){
453 				&gsbi1_uart_src.clkr.hw,
454 			},
455 			.num_parents = 1,
456 			.ops = &clk_branch_ops,
457 			.flags = CLK_SET_RATE_PARENT,
458 		},
459 	},
460 };
461 
462 static struct clk_rcg gsbi2_uart_src = {
463 	.ns_reg = 0x29f4,
464 	.md_reg = 0x29f0,
465 	.mn = {
466 		.mnctr_en_bit = 8,
467 		.mnctr_reset_bit = 7,
468 		.mnctr_mode_shift = 5,
469 		.n_val_shift = 16,
470 		.m_val_shift = 16,
471 		.width = 16,
472 	},
473 	.p = {
474 		.pre_div_shift = 3,
475 		.pre_div_width = 2,
476 	},
477 	.s = {
478 		.src_sel_shift = 0,
479 		.parent_map = gcc_pxo_pll8_map,
480 	},
481 	.freq_tbl = clk_tbl_gsbi_uart,
482 	.clkr = {
483 		.enable_reg = 0x29f4,
484 		.enable_mask = BIT(11),
485 		.hw.init = &(struct clk_init_data){
486 			.name = "gsbi2_uart_src",
487 			.parent_data = gcc_pxo_pll8,
488 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
489 			.ops = &clk_rcg_ops,
490 			.flags = CLK_SET_PARENT_GATE,
491 		},
492 	},
493 };
494 
495 static struct clk_branch gsbi2_uart_clk = {
496 	.halt_reg = 0x2fcc,
497 	.halt_bit = 8,
498 	.clkr = {
499 		.enable_reg = 0x29f4,
500 		.enable_mask = BIT(9),
501 		.hw.init = &(struct clk_init_data){
502 			.name = "gsbi2_uart_clk",
503 			.parent_hws = (const struct clk_hw*[]){
504 				&gsbi2_uart_src.clkr.hw,
505 			},
506 			.num_parents = 1,
507 			.ops = &clk_branch_ops,
508 			.flags = CLK_SET_RATE_PARENT,
509 		},
510 	},
511 };
512 
513 static struct clk_rcg gsbi4_uart_src = {
514 	.ns_reg = 0x2a34,
515 	.md_reg = 0x2a30,
516 	.mn = {
517 		.mnctr_en_bit = 8,
518 		.mnctr_reset_bit = 7,
519 		.mnctr_mode_shift = 5,
520 		.n_val_shift = 16,
521 		.m_val_shift = 16,
522 		.width = 16,
523 	},
524 	.p = {
525 		.pre_div_shift = 3,
526 		.pre_div_width = 2,
527 	},
528 	.s = {
529 		.src_sel_shift = 0,
530 		.parent_map = gcc_pxo_pll8_map,
531 	},
532 	.freq_tbl = clk_tbl_gsbi_uart,
533 	.clkr = {
534 		.enable_reg = 0x2a34,
535 		.enable_mask = BIT(11),
536 		.hw.init = &(struct clk_init_data){
537 			.name = "gsbi4_uart_src",
538 			.parent_data = gcc_pxo_pll8,
539 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
540 			.ops = &clk_rcg_ops,
541 			.flags = CLK_SET_PARENT_GATE,
542 		},
543 	},
544 };
545 
546 static struct clk_branch gsbi4_uart_clk = {
547 	.halt_reg = 0x2fd0,
548 	.halt_bit = 26,
549 	.clkr = {
550 		.enable_reg = 0x2a34,
551 		.enable_mask = BIT(9),
552 		.hw.init = &(struct clk_init_data){
553 			.name = "gsbi4_uart_clk",
554 			.parent_hws = (const struct clk_hw*[]){
555 				&gsbi4_uart_src.clkr.hw,
556 			},
557 			.num_parents = 1,
558 			.ops = &clk_branch_ops,
559 			.flags = CLK_SET_RATE_PARENT,
560 		},
561 	},
562 };
563 
564 static struct clk_rcg gsbi5_uart_src = {
565 	.ns_reg = 0x2a54,
566 	.md_reg = 0x2a50,
567 	.mn = {
568 		.mnctr_en_bit = 8,
569 		.mnctr_reset_bit = 7,
570 		.mnctr_mode_shift = 5,
571 		.n_val_shift = 16,
572 		.m_val_shift = 16,
573 		.width = 16,
574 	},
575 	.p = {
576 		.pre_div_shift = 3,
577 		.pre_div_width = 2,
578 	},
579 	.s = {
580 		.src_sel_shift = 0,
581 		.parent_map = gcc_pxo_pll8_map,
582 	},
583 	.freq_tbl = clk_tbl_gsbi_uart,
584 	.clkr = {
585 		.enable_reg = 0x2a54,
586 		.enable_mask = BIT(11),
587 		.hw.init = &(struct clk_init_data){
588 			.name = "gsbi5_uart_src",
589 			.parent_data = gcc_pxo_pll8,
590 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
591 			.ops = &clk_rcg_ops,
592 			.flags = CLK_SET_PARENT_GATE,
593 		},
594 	},
595 };
596 
597 static struct clk_branch gsbi5_uart_clk = {
598 	.halt_reg = 0x2fd0,
599 	.halt_bit = 22,
600 	.clkr = {
601 		.enable_reg = 0x2a54,
602 		.enable_mask = BIT(9),
603 		.hw.init = &(struct clk_init_data){
604 			.name = "gsbi5_uart_clk",
605 			.parent_hws = (const struct clk_hw*[]){
606 				&gsbi5_uart_src.clkr.hw,
607 			},
608 			.num_parents = 1,
609 			.ops = &clk_branch_ops,
610 			.flags = CLK_SET_RATE_PARENT,
611 		},
612 	},
613 };
614 
615 static struct clk_rcg gsbi6_uart_src = {
616 	.ns_reg = 0x2a74,
617 	.md_reg = 0x2a70,
618 	.mn = {
619 		.mnctr_en_bit = 8,
620 		.mnctr_reset_bit = 7,
621 		.mnctr_mode_shift = 5,
622 		.n_val_shift = 16,
623 		.m_val_shift = 16,
624 		.width = 16,
625 	},
626 	.p = {
627 		.pre_div_shift = 3,
628 		.pre_div_width = 2,
629 	},
630 	.s = {
631 		.src_sel_shift = 0,
632 		.parent_map = gcc_pxo_pll8_map,
633 	},
634 	.freq_tbl = clk_tbl_gsbi_uart,
635 	.clkr = {
636 		.enable_reg = 0x2a74,
637 		.enable_mask = BIT(11),
638 		.hw.init = &(struct clk_init_data){
639 			.name = "gsbi6_uart_src",
640 			.parent_data = gcc_pxo_pll8,
641 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
642 			.ops = &clk_rcg_ops,
643 			.flags = CLK_SET_PARENT_GATE,
644 		},
645 	},
646 };
647 
648 static struct clk_branch gsbi6_uart_clk = {
649 	.halt_reg = 0x2fd0,
650 	.halt_bit = 18,
651 	.clkr = {
652 		.enable_reg = 0x2a74,
653 		.enable_mask = BIT(9),
654 		.hw.init = &(struct clk_init_data){
655 			.name = "gsbi6_uart_clk",
656 			.parent_hws = (const struct clk_hw*[]){
657 				&gsbi6_uart_src.clkr.hw,
658 			},
659 			.num_parents = 1,
660 			.ops = &clk_branch_ops,
661 			.flags = CLK_SET_RATE_PARENT,
662 		},
663 	},
664 };
665 
666 static struct clk_rcg gsbi7_uart_src = {
667 	.ns_reg = 0x2a94,
668 	.md_reg = 0x2a90,
669 	.mn = {
670 		.mnctr_en_bit = 8,
671 		.mnctr_reset_bit = 7,
672 		.mnctr_mode_shift = 5,
673 		.n_val_shift = 16,
674 		.m_val_shift = 16,
675 		.width = 16,
676 	},
677 	.p = {
678 		.pre_div_shift = 3,
679 		.pre_div_width = 2,
680 	},
681 	.s = {
682 		.src_sel_shift = 0,
683 		.parent_map = gcc_pxo_pll8_map,
684 	},
685 	.freq_tbl = clk_tbl_gsbi_uart,
686 	.clkr = {
687 		.enable_reg = 0x2a94,
688 		.enable_mask = BIT(11),
689 		.hw.init = &(struct clk_init_data){
690 			.name = "gsbi7_uart_src",
691 			.parent_data = gcc_pxo_pll8,
692 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
693 			.ops = &clk_rcg_ops,
694 			.flags = CLK_SET_PARENT_GATE,
695 		},
696 	},
697 };
698 
699 static struct clk_branch gsbi7_uart_clk = {
700 	.halt_reg = 0x2fd0,
701 	.halt_bit = 14,
702 	.clkr = {
703 		.enable_reg = 0x2a94,
704 		.enable_mask = BIT(9),
705 		.hw.init = &(struct clk_init_data){
706 			.name = "gsbi7_uart_clk",
707 			.parent_hws = (const struct clk_hw*[]){
708 				&gsbi7_uart_src.clkr.hw,
709 			},
710 			.num_parents = 1,
711 			.ops = &clk_branch_ops,
712 			.flags = CLK_SET_RATE_PARENT,
713 		},
714 	},
715 };
716 
717 static struct freq_tbl clk_tbl_gsbi_qup[] = {
718 	{  1100000, P_PXO,  1, 2, 49 },
719 	{  5400000, P_PXO,  1, 1,  5 },
720 	{ 10800000, P_PXO,  1, 2,  5 },
721 	{ 15060000, P_PLL8, 1, 2, 51 },
722 	{ 24000000, P_PLL8, 4, 1,  4 },
723 	{ 25000000, P_PXO,  1, 0,  0 },
724 	{ 25600000, P_PLL8, 1, 1, 15 },
725 	{ 48000000, P_PLL8, 4, 1,  2 },
726 	{ 51200000, P_PLL8, 1, 2, 15 },
727 	{ }
728 };
729 
730 static struct clk_rcg gsbi1_qup_src = {
731 	.ns_reg = 0x29cc,
732 	.md_reg = 0x29c8,
733 	.mn = {
734 		.mnctr_en_bit = 8,
735 		.mnctr_reset_bit = 7,
736 		.mnctr_mode_shift = 5,
737 		.n_val_shift = 16,
738 		.m_val_shift = 16,
739 		.width = 8,
740 	},
741 	.p = {
742 		.pre_div_shift = 3,
743 		.pre_div_width = 2,
744 	},
745 	.s = {
746 		.src_sel_shift = 0,
747 		.parent_map = gcc_pxo_pll8_map,
748 	},
749 	.freq_tbl = clk_tbl_gsbi_qup,
750 	.clkr = {
751 		.enable_reg = 0x29cc,
752 		.enable_mask = BIT(11),
753 		.hw.init = &(struct clk_init_data){
754 			.name = "gsbi1_qup_src",
755 			.parent_data = gcc_pxo_pll8,
756 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
757 			.ops = &clk_rcg_ops,
758 			.flags = CLK_SET_PARENT_GATE,
759 		},
760 	},
761 };
762 
763 static struct clk_branch gsbi1_qup_clk = {
764 	.halt_reg = 0x2fcc,
765 	.halt_bit = 11,
766 	.clkr = {
767 		.enable_reg = 0x29cc,
768 		.enable_mask = BIT(9),
769 		.hw.init = &(struct clk_init_data){
770 			.name = "gsbi1_qup_clk",
771 			.parent_hws = (const struct clk_hw*[]){
772 				&gsbi1_qup_src.clkr.hw,
773 			},
774 			.num_parents = 1,
775 			.ops = &clk_branch_ops,
776 			.flags = CLK_SET_RATE_PARENT,
777 		},
778 	},
779 };
780 
781 static struct clk_rcg gsbi2_qup_src = {
782 	.ns_reg = 0x29ec,
783 	.md_reg = 0x29e8,
784 	.mn = {
785 		.mnctr_en_bit = 8,
786 		.mnctr_reset_bit = 7,
787 		.mnctr_mode_shift = 5,
788 		.n_val_shift = 16,
789 		.m_val_shift = 16,
790 		.width = 8,
791 	},
792 	.p = {
793 		.pre_div_shift = 3,
794 		.pre_div_width = 2,
795 	},
796 	.s = {
797 		.src_sel_shift = 0,
798 		.parent_map = gcc_pxo_pll8_map,
799 	},
800 	.freq_tbl = clk_tbl_gsbi_qup,
801 	.clkr = {
802 		.enable_reg = 0x29ec,
803 		.enable_mask = BIT(11),
804 		.hw.init = &(struct clk_init_data){
805 			.name = "gsbi2_qup_src",
806 			.parent_data = gcc_pxo_pll8,
807 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
808 			.ops = &clk_rcg_ops,
809 			.flags = CLK_SET_PARENT_GATE,
810 		},
811 	},
812 };
813 
814 static struct clk_branch gsbi2_qup_clk = {
815 	.halt_reg = 0x2fcc,
816 	.halt_bit = 6,
817 	.clkr = {
818 		.enable_reg = 0x29ec,
819 		.enable_mask = BIT(9),
820 		.hw.init = &(struct clk_init_data){
821 			.name = "gsbi2_qup_clk",
822 			.parent_hws = (const struct clk_hw*[]){
823 				&gsbi2_qup_src.clkr.hw,
824 			},
825 			.num_parents = 1,
826 			.ops = &clk_branch_ops,
827 			.flags = CLK_SET_RATE_PARENT,
828 		},
829 	},
830 };
831 
832 static struct clk_rcg gsbi4_qup_src = {
833 	.ns_reg = 0x2a2c,
834 	.md_reg = 0x2a28,
835 	.mn = {
836 		.mnctr_en_bit = 8,
837 		.mnctr_reset_bit = 7,
838 		.mnctr_mode_shift = 5,
839 		.n_val_shift = 16,
840 		.m_val_shift = 16,
841 		.width = 8,
842 	},
843 	.p = {
844 		.pre_div_shift = 3,
845 		.pre_div_width = 2,
846 	},
847 	.s = {
848 		.src_sel_shift = 0,
849 		.parent_map = gcc_pxo_pll8_map,
850 	},
851 	.freq_tbl = clk_tbl_gsbi_qup,
852 	.clkr = {
853 		.enable_reg = 0x2a2c,
854 		.enable_mask = BIT(11),
855 		.hw.init = &(struct clk_init_data){
856 			.name = "gsbi4_qup_src",
857 			.parent_data = gcc_pxo_pll8,
858 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
859 			.ops = &clk_rcg_ops,
860 			.flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED,
861 		},
862 	},
863 };
864 
865 static struct clk_branch gsbi4_qup_clk = {
866 	.halt_reg = 0x2fd0,
867 	.halt_bit = 24,
868 	.clkr = {
869 		.enable_reg = 0x2a2c,
870 		.enable_mask = BIT(9),
871 		.hw.init = &(struct clk_init_data){
872 			.name = "gsbi4_qup_clk",
873 			.parent_hws = (const struct clk_hw*[]){
874 				&gsbi4_qup_src.clkr.hw,
875 			},
876 			.num_parents = 1,
877 			.ops = &clk_branch_ops,
878 			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
879 		},
880 	},
881 };
882 
883 static struct clk_rcg gsbi5_qup_src = {
884 	.ns_reg = 0x2a4c,
885 	.md_reg = 0x2a48,
886 	.mn = {
887 		.mnctr_en_bit = 8,
888 		.mnctr_reset_bit = 7,
889 		.mnctr_mode_shift = 5,
890 		.n_val_shift = 16,
891 		.m_val_shift = 16,
892 		.width = 8,
893 	},
894 	.p = {
895 		.pre_div_shift = 3,
896 		.pre_div_width = 2,
897 	},
898 	.s = {
899 		.src_sel_shift = 0,
900 		.parent_map = gcc_pxo_pll8_map,
901 	},
902 	.freq_tbl = clk_tbl_gsbi_qup,
903 	.clkr = {
904 		.enable_reg = 0x2a4c,
905 		.enable_mask = BIT(11),
906 		.hw.init = &(struct clk_init_data){
907 			.name = "gsbi5_qup_src",
908 			.parent_data = gcc_pxo_pll8,
909 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
910 			.ops = &clk_rcg_ops,
911 			.flags = CLK_SET_PARENT_GATE,
912 		},
913 	},
914 };
915 
916 static struct clk_branch gsbi5_qup_clk = {
917 	.halt_reg = 0x2fd0,
918 	.halt_bit = 20,
919 	.clkr = {
920 		.enable_reg = 0x2a4c,
921 		.enable_mask = BIT(9),
922 		.hw.init = &(struct clk_init_data){
923 			.name = "gsbi5_qup_clk",
924 			.parent_hws = (const struct clk_hw*[]){
925 				&gsbi5_qup_src.clkr.hw,
926 			},
927 			.num_parents = 1,
928 			.ops = &clk_branch_ops,
929 			.flags = CLK_SET_RATE_PARENT,
930 		},
931 	},
932 };
933 
934 static struct clk_rcg gsbi6_qup_src = {
935 	.ns_reg = 0x2a6c,
936 	.md_reg = 0x2a68,
937 	.mn = {
938 		.mnctr_en_bit = 8,
939 		.mnctr_reset_bit = 7,
940 		.mnctr_mode_shift = 5,
941 		.n_val_shift = 16,
942 		.m_val_shift = 16,
943 		.width = 8,
944 	},
945 	.p = {
946 		.pre_div_shift = 3,
947 		.pre_div_width = 2,
948 	},
949 	.s = {
950 		.src_sel_shift = 0,
951 		.parent_map = gcc_pxo_pll8_map,
952 	},
953 	.freq_tbl = clk_tbl_gsbi_qup,
954 	.clkr = {
955 		.enable_reg = 0x2a6c,
956 		.enable_mask = BIT(11),
957 		.hw.init = &(struct clk_init_data){
958 			.name = "gsbi6_qup_src",
959 			.parent_data = gcc_pxo_pll8,
960 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
961 			.ops = &clk_rcg_ops,
962 			.flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED,
963 		},
964 	},
965 };
966 
967 static struct clk_branch gsbi6_qup_clk = {
968 	.halt_reg = 0x2fd0,
969 	.halt_bit = 16,
970 	.clkr = {
971 		.enable_reg = 0x2a6c,
972 		.enable_mask = BIT(9),
973 		.hw.init = &(struct clk_init_data){
974 			.name = "gsbi6_qup_clk",
975 			.parent_hws = (const struct clk_hw*[]){
976 				&gsbi6_qup_src.clkr.hw,
977 			},
978 			.num_parents = 1,
979 			.ops = &clk_branch_ops,
980 			.flags = CLK_SET_RATE_PARENT,
981 		},
982 	},
983 };
984 
985 static struct clk_rcg gsbi7_qup_src = {
986 	.ns_reg = 0x2a8c,
987 	.md_reg = 0x2a88,
988 	.mn = {
989 		.mnctr_en_bit = 8,
990 		.mnctr_reset_bit = 7,
991 		.mnctr_mode_shift = 5,
992 		.n_val_shift = 16,
993 		.m_val_shift = 16,
994 		.width = 8,
995 	},
996 	.p = {
997 		.pre_div_shift = 3,
998 		.pre_div_width = 2,
999 	},
1000 	.s = {
1001 		.src_sel_shift = 0,
1002 		.parent_map = gcc_pxo_pll8_map,
1003 	},
1004 	.freq_tbl = clk_tbl_gsbi_qup,
1005 	.clkr = {
1006 		.enable_reg = 0x2a8c,
1007 		.enable_mask = BIT(11),
1008 		.hw.init = &(struct clk_init_data){
1009 			.name = "gsbi7_qup_src",
1010 			.parent_data = gcc_pxo_pll8,
1011 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1012 			.ops = &clk_rcg_ops,
1013 			.flags = CLK_SET_PARENT_GATE,
1014 		},
1015 	},
1016 };
1017 
1018 static struct clk_branch gsbi7_qup_clk = {
1019 	.halt_reg = 0x2fd0,
1020 	.halt_bit = 12,
1021 	.clkr = {
1022 		.enable_reg = 0x2a8c,
1023 		.enable_mask = BIT(9),
1024 		.hw.init = &(struct clk_init_data){
1025 			.name = "gsbi7_qup_clk",
1026 			.parent_hws = (const struct clk_hw*[]){
1027 				&gsbi7_qup_src.clkr.hw,
1028 			},
1029 			.num_parents = 1,
1030 			.ops = &clk_branch_ops,
1031 			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1032 		},
1033 	},
1034 };
1035 
1036 static struct clk_branch gsbi1_h_clk = {
1037 	.hwcg_reg = 0x29c0,
1038 	.hwcg_bit = 6,
1039 	.halt_reg = 0x2fcc,
1040 	.halt_bit = 13,
1041 	.clkr = {
1042 		.enable_reg = 0x29c0,
1043 		.enable_mask = BIT(4),
1044 		.hw.init = &(struct clk_init_data){
1045 			.name = "gsbi1_h_clk",
1046 			.ops = &clk_branch_ops,
1047 		},
1048 	},
1049 };
1050 
1051 static struct clk_branch gsbi2_h_clk = {
1052 	.hwcg_reg = 0x29e0,
1053 	.hwcg_bit = 6,
1054 	.halt_reg = 0x2fcc,
1055 	.halt_bit = 9,
1056 	.clkr = {
1057 		.enable_reg = 0x29e0,
1058 		.enable_mask = BIT(4),
1059 		.hw.init = &(struct clk_init_data){
1060 			.name = "gsbi2_h_clk",
1061 			.ops = &clk_branch_ops,
1062 		},
1063 	},
1064 };
1065 
1066 static struct clk_branch gsbi4_h_clk = {
1067 	.hwcg_reg = 0x2a20,
1068 	.hwcg_bit = 6,
1069 	.halt_reg = 0x2fd0,
1070 	.halt_bit = 27,
1071 	.clkr = {
1072 		.enable_reg = 0x2a20,
1073 		.enable_mask = BIT(4),
1074 		.hw.init = &(struct clk_init_data){
1075 			.name = "gsbi4_h_clk",
1076 			.ops = &clk_branch_ops,
1077 			.flags = CLK_IGNORE_UNUSED,
1078 		},
1079 	},
1080 };
1081 
1082 static struct clk_branch gsbi5_h_clk = {
1083 	.hwcg_reg = 0x2a40,
1084 	.hwcg_bit = 6,
1085 	.halt_reg = 0x2fd0,
1086 	.halt_bit = 23,
1087 	.clkr = {
1088 		.enable_reg = 0x2a40,
1089 		.enable_mask = BIT(4),
1090 		.hw.init = &(struct clk_init_data){
1091 			.name = "gsbi5_h_clk",
1092 			.ops = &clk_branch_ops,
1093 		},
1094 	},
1095 };
1096 
1097 static struct clk_branch gsbi6_h_clk = {
1098 	.hwcg_reg = 0x2a60,
1099 	.hwcg_bit = 6,
1100 	.halt_reg = 0x2fd0,
1101 	.halt_bit = 19,
1102 	.clkr = {
1103 		.enable_reg = 0x2a60,
1104 		.enable_mask = BIT(4),
1105 		.hw.init = &(struct clk_init_data){
1106 			.name = "gsbi6_h_clk",
1107 			.ops = &clk_branch_ops,
1108 		},
1109 	},
1110 };
1111 
1112 static struct clk_branch gsbi7_h_clk = {
1113 	.hwcg_reg = 0x2a80,
1114 	.hwcg_bit = 6,
1115 	.halt_reg = 0x2fd0,
1116 	.halt_bit = 15,
1117 	.clkr = {
1118 		.enable_reg = 0x2a80,
1119 		.enable_mask = BIT(4),
1120 		.hw.init = &(struct clk_init_data){
1121 			.name = "gsbi7_h_clk",
1122 			.ops = &clk_branch_ops,
1123 		},
1124 	},
1125 };
1126 
1127 static const struct freq_tbl clk_tbl_gp[] = {
1128 	{ 12500000, P_PXO,  2, 0, 0 },
1129 	{ 25000000, P_PXO,  1, 0, 0 },
1130 	{ 64000000, P_PLL8, 2, 1, 3 },
1131 	{ 76800000, P_PLL8, 1, 1, 5 },
1132 	{ 96000000, P_PLL8, 4, 0, 0 },
1133 	{ 128000000, P_PLL8, 3, 0, 0 },
1134 	{ 192000000, P_PLL8, 2, 0, 0 },
1135 	{ }
1136 };
1137 
1138 static struct clk_rcg gp0_src = {
1139 	.ns_reg = 0x2d24,
1140 	.md_reg = 0x2d00,
1141 	.mn = {
1142 		.mnctr_en_bit = 8,
1143 		.mnctr_reset_bit = 7,
1144 		.mnctr_mode_shift = 5,
1145 		.n_val_shift = 16,
1146 		.m_val_shift = 16,
1147 		.width = 8,
1148 	},
1149 	.p = {
1150 		.pre_div_shift = 3,
1151 		.pre_div_width = 2,
1152 	},
1153 	.s = {
1154 		.src_sel_shift = 0,
1155 		.parent_map = gcc_pxo_pll8_cxo_map,
1156 	},
1157 	.freq_tbl = clk_tbl_gp,
1158 	.clkr = {
1159 		.enable_reg = 0x2d24,
1160 		.enable_mask = BIT(11),
1161 		.hw.init = &(struct clk_init_data){
1162 			.name = "gp0_src",
1163 			.parent_data = gcc_pxo_pll8_cxo,
1164 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
1165 			.ops = &clk_rcg_ops,
1166 			.flags = CLK_SET_PARENT_GATE,
1167 		},
1168 	}
1169 };
1170 
1171 static struct clk_branch gp0_clk = {
1172 	.halt_reg = 0x2fd8,
1173 	.halt_bit = 7,
1174 	.clkr = {
1175 		.enable_reg = 0x2d24,
1176 		.enable_mask = BIT(9),
1177 		.hw.init = &(struct clk_init_data){
1178 			.name = "gp0_clk",
1179 			.parent_hws = (const struct clk_hw*[]){
1180 				&gp0_src.clkr.hw,
1181 			},
1182 			.num_parents = 1,
1183 			.ops = &clk_branch_ops,
1184 			.flags = CLK_SET_RATE_PARENT,
1185 		},
1186 	},
1187 };
1188 
1189 static struct clk_rcg gp1_src = {
1190 	.ns_reg = 0x2d44,
1191 	.md_reg = 0x2d40,
1192 	.mn = {
1193 		.mnctr_en_bit = 8,
1194 		.mnctr_reset_bit = 7,
1195 		.mnctr_mode_shift = 5,
1196 		.n_val_shift = 16,
1197 		.m_val_shift = 16,
1198 		.width = 8,
1199 	},
1200 	.p = {
1201 		.pre_div_shift = 3,
1202 		.pre_div_width = 2,
1203 	},
1204 	.s = {
1205 		.src_sel_shift = 0,
1206 		.parent_map = gcc_pxo_pll8_cxo_map,
1207 	},
1208 	.freq_tbl = clk_tbl_gp,
1209 	.clkr = {
1210 		.enable_reg = 0x2d44,
1211 		.enable_mask = BIT(11),
1212 		.hw.init = &(struct clk_init_data){
1213 			.name = "gp1_src",
1214 			.parent_data = gcc_pxo_pll8_cxo,
1215 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
1216 			.ops = &clk_rcg_ops,
1217 			.flags = CLK_SET_RATE_GATE,
1218 		},
1219 	}
1220 };
1221 
1222 static struct clk_branch gp1_clk = {
1223 	.halt_reg = 0x2fd8,
1224 	.halt_bit = 6,
1225 	.clkr = {
1226 		.enable_reg = 0x2d44,
1227 		.enable_mask = BIT(9),
1228 		.hw.init = &(struct clk_init_data){
1229 			.name = "gp1_clk",
1230 			.parent_hws = (const struct clk_hw*[]){
1231 				&gp1_src.clkr.hw,
1232 			},
1233 			.num_parents = 1,
1234 			.ops = &clk_branch_ops,
1235 			.flags = CLK_SET_RATE_PARENT,
1236 		},
1237 	},
1238 };
1239 
1240 static struct clk_rcg gp2_src = {
1241 	.ns_reg = 0x2d64,
1242 	.md_reg = 0x2d60,
1243 	.mn = {
1244 		.mnctr_en_bit = 8,
1245 		.mnctr_reset_bit = 7,
1246 		.mnctr_mode_shift = 5,
1247 		.n_val_shift = 16,
1248 		.m_val_shift = 16,
1249 		.width = 8,
1250 	},
1251 	.p = {
1252 		.pre_div_shift = 3,
1253 		.pre_div_width = 2,
1254 	},
1255 	.s = {
1256 		.src_sel_shift = 0,
1257 		.parent_map = gcc_pxo_pll8_cxo_map,
1258 	},
1259 	.freq_tbl = clk_tbl_gp,
1260 	.clkr = {
1261 		.enable_reg = 0x2d64,
1262 		.enable_mask = BIT(11),
1263 		.hw.init = &(struct clk_init_data){
1264 			.name = "gp2_src",
1265 			.parent_data = gcc_pxo_pll8_cxo,
1266 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
1267 			.ops = &clk_rcg_ops,
1268 			.flags = CLK_SET_RATE_GATE,
1269 		},
1270 	}
1271 };
1272 
1273 static struct clk_branch gp2_clk = {
1274 	.halt_reg = 0x2fd8,
1275 	.halt_bit = 5,
1276 	.clkr = {
1277 		.enable_reg = 0x2d64,
1278 		.enable_mask = BIT(9),
1279 		.hw.init = &(struct clk_init_data){
1280 			.name = "gp2_clk",
1281 			.parent_hws = (const struct clk_hw*[]){
1282 				&gp2_src.clkr.hw,
1283 			},
1284 			.num_parents = 1,
1285 			.ops = &clk_branch_ops,
1286 			.flags = CLK_SET_RATE_PARENT,
1287 		},
1288 	},
1289 };
1290 
1291 static struct clk_branch pmem_clk = {
1292 	.hwcg_reg = 0x25a0,
1293 	.hwcg_bit = 6,
1294 	.halt_reg = 0x2fc8,
1295 	.halt_bit = 20,
1296 	.clkr = {
1297 		.enable_reg = 0x25a0,
1298 		.enable_mask = BIT(4),
1299 		.hw.init = &(struct clk_init_data){
1300 			.name = "pmem_clk",
1301 			.ops = &clk_branch_ops,
1302 		},
1303 	},
1304 };
1305 
1306 static struct clk_rcg prng_src = {
1307 	.ns_reg = 0x2e80,
1308 	.p = {
1309 		.pre_div_shift = 3,
1310 		.pre_div_width = 4,
1311 	},
1312 	.s = {
1313 		.src_sel_shift = 0,
1314 		.parent_map = gcc_pxo_pll8_map,
1315 	},
1316 	.clkr = {
1317 		.enable_reg = 0x2e80,
1318 		.enable_mask = BIT(11),
1319 		.hw.init = &(struct clk_init_data){
1320 			.name = "prng_src",
1321 			.parent_data = gcc_pxo_pll8,
1322 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1323 			.ops = &clk_rcg_ops,
1324 		},
1325 	},
1326 };
1327 
1328 static struct clk_branch prng_clk = {
1329 	.halt_reg = 0x2fd8,
1330 	.halt_check = BRANCH_HALT_VOTED,
1331 	.halt_bit = 10,
1332 	.clkr = {
1333 		.enable_reg = 0x3080,
1334 		.enable_mask = BIT(10),
1335 		.hw.init = &(struct clk_init_data){
1336 			.name = "prng_clk",
1337 			.parent_hws = (const struct clk_hw*[]){
1338 				&prng_src.clkr.hw,
1339 			},
1340 			.num_parents = 1,
1341 			.ops = &clk_branch_ops,
1342 		},
1343 	},
1344 };
1345 
1346 static const struct freq_tbl clk_tbl_sdc[] = {
1347 	{    200000, P_PXO,   2, 2, 125 },
1348 	{    400000, P_PLL8,  4, 1, 240 },
1349 	{  16000000, P_PLL8,  4, 1,   6 },
1350 	{  17070000, P_PLL8,  1, 2,  45 },
1351 	{  20210000, P_PLL8,  1, 1,  19 },
1352 	{  24000000, P_PLL8,  4, 1,   4 },
1353 	{  48000000, P_PLL8,  4, 1,   2 },
1354 	{  51200000, P_PLL8,  1, 2,  15 },
1355 	{  64000000, P_PLL8,  3, 1,   2 },
1356 	{  96000000, P_PLL8,  4, 0,   0 },
1357 	{ 192000000, P_PLL8,  2, 0,   0 },
1358 	{ }
1359 };
1360 
1361 static struct clk_rcg sdc1_src = {
1362 	.ns_reg = 0x282c,
1363 	.md_reg = 0x2828,
1364 	.mn = {
1365 		.mnctr_en_bit = 8,
1366 		.mnctr_reset_bit = 7,
1367 		.mnctr_mode_shift = 5,
1368 		.n_val_shift = 16,
1369 		.m_val_shift = 16,
1370 		.width = 8,
1371 	},
1372 	.p = {
1373 		.pre_div_shift = 3,
1374 		.pre_div_width = 2,
1375 	},
1376 	.s = {
1377 		.src_sel_shift = 0,
1378 		.parent_map = gcc_pxo_pll8_map,
1379 	},
1380 	.freq_tbl = clk_tbl_sdc,
1381 	.clkr = {
1382 		.enable_reg = 0x282c,
1383 		.enable_mask = BIT(11),
1384 		.hw.init = &(struct clk_init_data){
1385 			.name = "sdc1_src",
1386 			.parent_data = gcc_pxo_pll8,
1387 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1388 			.ops = &clk_rcg_floor_ops,
1389 		},
1390 	}
1391 };
1392 
1393 static struct clk_branch sdc1_clk = {
1394 	.halt_reg = 0x2fc8,
1395 	.halt_bit = 6,
1396 	.clkr = {
1397 		.enable_reg = 0x282c,
1398 		.enable_mask = BIT(9),
1399 		.hw.init = &(struct clk_init_data){
1400 			.name = "sdc1_clk",
1401 			.parent_hws = (const struct clk_hw*[]){
1402 				&sdc1_src.clkr.hw,
1403 			},
1404 			.num_parents = 1,
1405 			.ops = &clk_branch_ops,
1406 			.flags = CLK_SET_RATE_PARENT,
1407 		},
1408 	},
1409 };
1410 
1411 static struct clk_rcg sdc3_src = {
1412 	.ns_reg = 0x286c,
1413 	.md_reg = 0x2868,
1414 	.mn = {
1415 		.mnctr_en_bit = 8,
1416 		.mnctr_reset_bit = 7,
1417 		.mnctr_mode_shift = 5,
1418 		.n_val_shift = 16,
1419 		.m_val_shift = 16,
1420 		.width = 8,
1421 	},
1422 	.p = {
1423 		.pre_div_shift = 3,
1424 		.pre_div_width = 2,
1425 	},
1426 	.s = {
1427 		.src_sel_shift = 0,
1428 		.parent_map = gcc_pxo_pll8_map,
1429 	},
1430 	.freq_tbl = clk_tbl_sdc,
1431 	.clkr = {
1432 		.enable_reg = 0x286c,
1433 		.enable_mask = BIT(11),
1434 		.hw.init = &(struct clk_init_data){
1435 			.name = "sdc3_src",
1436 			.parent_data = gcc_pxo_pll8,
1437 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1438 			.ops = &clk_rcg_ops,
1439 		},
1440 	}
1441 };
1442 
1443 static struct clk_branch sdc3_clk = {
1444 	.halt_reg = 0x2fc8,
1445 	.halt_bit = 4,
1446 	.clkr = {
1447 		.enable_reg = 0x286c,
1448 		.enable_mask = BIT(9),
1449 		.hw.init = &(struct clk_init_data){
1450 			.name = "sdc3_clk",
1451 			.parent_hws = (const struct clk_hw*[]){
1452 				&sdc3_src.clkr.hw,
1453 			},
1454 			.num_parents = 1,
1455 			.ops = &clk_branch_ops,
1456 			.flags = CLK_SET_RATE_PARENT,
1457 		},
1458 	},
1459 };
1460 
1461 static struct clk_branch sdc1_h_clk = {
1462 	.hwcg_reg = 0x2820,
1463 	.hwcg_bit = 6,
1464 	.halt_reg = 0x2fc8,
1465 	.halt_bit = 11,
1466 	.clkr = {
1467 		.enable_reg = 0x2820,
1468 		.enable_mask = BIT(4),
1469 		.hw.init = &(struct clk_init_data){
1470 			.name = "sdc1_h_clk",
1471 			.ops = &clk_branch_ops,
1472 		},
1473 	},
1474 };
1475 
1476 static struct clk_branch sdc3_h_clk = {
1477 	.hwcg_reg = 0x2860,
1478 	.hwcg_bit = 6,
1479 	.halt_reg = 0x2fc8,
1480 	.halt_bit = 9,
1481 	.clkr = {
1482 		.enable_reg = 0x2860,
1483 		.enable_mask = BIT(4),
1484 		.hw.init = &(struct clk_init_data){
1485 			.name = "sdc3_h_clk",
1486 			.ops = &clk_branch_ops,
1487 		},
1488 	},
1489 };
1490 
1491 static const struct freq_tbl clk_tbl_tsif_ref[] = {
1492 	{ 105000, P_PXO,  1, 1, 256 },
1493 	{ }
1494 };
1495 
1496 static struct clk_rcg tsif_ref_src = {
1497 	.ns_reg = 0x2710,
1498 	.md_reg = 0x270c,
1499 	.mn = {
1500 		.mnctr_en_bit = 8,
1501 		.mnctr_reset_bit = 7,
1502 		.mnctr_mode_shift = 5,
1503 		.n_val_shift = 16,
1504 		.m_val_shift = 16,
1505 		.width = 16,
1506 	},
1507 	.p = {
1508 		.pre_div_shift = 3,
1509 		.pre_div_width = 2,
1510 	},
1511 	.s = {
1512 		.src_sel_shift = 0,
1513 		.parent_map = gcc_pxo_pll8_map,
1514 	},
1515 	.freq_tbl = clk_tbl_tsif_ref,
1516 	.clkr = {
1517 		.enable_reg = 0x2710,
1518 		.enable_mask = BIT(11),
1519 		.hw.init = &(struct clk_init_data){
1520 			.name = "tsif_ref_src",
1521 			.parent_data = gcc_pxo_pll8,
1522 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8),
1523 			.ops = &clk_rcg_ops,
1524 		},
1525 	}
1526 };
1527 
1528 static struct clk_branch tsif_ref_clk = {
1529 	.halt_reg = 0x2fd4,
1530 	.halt_bit = 5,
1531 	.clkr = {
1532 		.enable_reg = 0x2710,
1533 		.enable_mask = BIT(9),
1534 		.hw.init = &(struct clk_init_data){
1535 			.name = "tsif_ref_clk",
1536 			.parent_hws = (const struct clk_hw*[]){
1537 				&tsif_ref_src.clkr.hw,
1538 			},
1539 			.num_parents = 1,
1540 			.ops = &clk_branch_ops,
1541 			.flags = CLK_SET_RATE_PARENT,
1542 		},
1543 	},
1544 };
1545 
1546 static struct clk_branch tsif_h_clk = {
1547 	.hwcg_reg = 0x2700,
1548 	.hwcg_bit = 6,
1549 	.halt_reg = 0x2fd4,
1550 	.halt_bit = 7,
1551 	.clkr = {
1552 		.enable_reg = 0x2700,
1553 		.enable_mask = BIT(4),
1554 		.hw.init = &(struct clk_init_data){
1555 			.name = "tsif_h_clk",
1556 			.ops = &clk_branch_ops,
1557 		},
1558 	},
1559 };
1560 
1561 static struct clk_branch dma_bam_h_clk = {
1562 	.hwcg_reg = 0x25c0,
1563 	.hwcg_bit = 6,
1564 	.halt_reg = 0x2fc8,
1565 	.halt_bit = 12,
1566 	.clkr = {
1567 		.enable_reg = 0x25c0,
1568 		.enable_mask = BIT(4),
1569 		.hw.init = &(struct clk_init_data){
1570 			.name = "dma_bam_h_clk",
1571 			.ops = &clk_branch_ops,
1572 		},
1573 	},
1574 };
1575 
1576 static struct clk_branch adm0_clk = {
1577 	.halt_reg = 0x2fdc,
1578 	.halt_check = BRANCH_HALT_VOTED,
1579 	.halt_bit = 12,
1580 	.clkr = {
1581 		.enable_reg = 0x3080,
1582 		.enable_mask = BIT(2),
1583 		.hw.init = &(struct clk_init_data){
1584 			.name = "adm0_clk",
1585 			.ops = &clk_branch_ops,
1586 		},
1587 	},
1588 };
1589 
1590 static struct clk_branch adm0_pbus_clk = {
1591 	.hwcg_reg = 0x2208,
1592 	.hwcg_bit = 6,
1593 	.halt_reg = 0x2fdc,
1594 	.halt_check = BRANCH_HALT_VOTED,
1595 	.halt_bit = 11,
1596 	.clkr = {
1597 		.enable_reg = 0x3080,
1598 		.enable_mask = BIT(3),
1599 		.hw.init = &(struct clk_init_data){
1600 			.name = "adm0_pbus_clk",
1601 			.ops = &clk_branch_ops,
1602 		},
1603 	},
1604 };
1605 
1606 static struct clk_branch pmic_arb0_h_clk = {
1607 	.halt_reg = 0x2fd8,
1608 	.halt_check = BRANCH_HALT_VOTED,
1609 	.halt_bit = 22,
1610 	.clkr = {
1611 		.enable_reg = 0x3080,
1612 		.enable_mask = BIT(8),
1613 		.hw.init = &(struct clk_init_data){
1614 			.name = "pmic_arb0_h_clk",
1615 			.ops = &clk_branch_ops,
1616 		},
1617 	},
1618 };
1619 
1620 static struct clk_branch pmic_arb1_h_clk = {
1621 	.halt_reg = 0x2fd8,
1622 	.halt_check = BRANCH_HALT_VOTED,
1623 	.halt_bit = 21,
1624 	.clkr = {
1625 		.enable_reg = 0x3080,
1626 		.enable_mask = BIT(9),
1627 		.hw.init = &(struct clk_init_data){
1628 			.name = "pmic_arb1_h_clk",
1629 			.ops = &clk_branch_ops,
1630 		},
1631 	},
1632 };
1633 
1634 static struct clk_branch pmic_ssbi2_clk = {
1635 	.halt_reg = 0x2fd8,
1636 	.halt_check = BRANCH_HALT_VOTED,
1637 	.halt_bit = 23,
1638 	.clkr = {
1639 		.enable_reg = 0x3080,
1640 		.enable_mask = BIT(7),
1641 		.hw.init = &(struct clk_init_data){
1642 			.name = "pmic_ssbi2_clk",
1643 			.ops = &clk_branch_ops,
1644 		},
1645 	},
1646 };
1647 
1648 static struct clk_branch rpm_msg_ram_h_clk = {
1649 	.hwcg_reg = 0x27e0,
1650 	.hwcg_bit = 6,
1651 	.halt_reg = 0x2fd8,
1652 	.halt_check = BRANCH_HALT_VOTED,
1653 	.halt_bit = 12,
1654 	.clkr = {
1655 		.enable_reg = 0x3080,
1656 		.enable_mask = BIT(6),
1657 		.hw.init = &(struct clk_init_data){
1658 			.name = "rpm_msg_ram_h_clk",
1659 			.ops = &clk_branch_ops,
1660 		},
1661 	},
1662 };
1663 
1664 static const struct freq_tbl clk_tbl_pcie_ref[] = {
1665 	{ 100000000, P_PLL3,  12, 0, 0 },
1666 	{ }
1667 };
1668 
1669 static struct clk_rcg pcie_ref_src = {
1670 	.ns_reg = 0x3860,
1671 	.p = {
1672 		.pre_div_shift = 3,
1673 		.pre_div_width = 4,
1674 	},
1675 	.s = {
1676 		.src_sel_shift = 0,
1677 		.parent_map = gcc_pxo_pll3_map,
1678 	},
1679 	.freq_tbl = clk_tbl_pcie_ref,
1680 	.clkr = {
1681 		.enable_reg = 0x3860,
1682 		.enable_mask = BIT(11),
1683 		.hw.init = &(struct clk_init_data){
1684 			.name = "pcie_ref_src",
1685 			.parent_data = gcc_pxo_pll3,
1686 			.num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1687 			.ops = &clk_rcg_ops,
1688 			.flags = CLK_SET_RATE_GATE,
1689 		},
1690 	},
1691 };
1692 
1693 static struct clk_branch pcie_ref_src_clk = {
1694 	.halt_reg = 0x2fdc,
1695 	.halt_bit = 30,
1696 	.clkr = {
1697 		.enable_reg = 0x3860,
1698 		.enable_mask = BIT(9),
1699 		.hw.init = &(struct clk_init_data){
1700 			.name = "pcie_ref_src_clk",
1701 			.parent_hws = (const struct clk_hw*[]){
1702 				&pcie_ref_src.clkr.hw,
1703 			},
1704 			.num_parents = 1,
1705 			.ops = &clk_branch_ops,
1706 			.flags = CLK_SET_RATE_PARENT,
1707 		},
1708 	},
1709 };
1710 
1711 static struct clk_branch pcie_a_clk = {
1712 	.halt_reg = 0x2fc0,
1713 	.halt_bit = 13,
1714 	.clkr = {
1715 		.enable_reg = 0x22c0,
1716 		.enable_mask = BIT(4),
1717 		.hw.init = &(struct clk_init_data){
1718 			.name = "pcie_a_clk",
1719 			.ops = &clk_branch_ops,
1720 		},
1721 	},
1722 };
1723 
1724 static struct clk_branch pcie_aux_clk = {
1725 	.halt_reg = 0x2fdc,
1726 	.halt_bit = 31,
1727 	.clkr = {
1728 		.enable_reg = 0x22c8,
1729 		.enable_mask = BIT(4),
1730 		.hw.init = &(struct clk_init_data){
1731 			.name = "pcie_aux_clk",
1732 			.ops = &clk_branch_ops,
1733 		},
1734 	},
1735 };
1736 
1737 static struct clk_branch pcie_h_clk = {
1738 	.halt_reg = 0x2fd4,
1739 	.halt_bit = 8,
1740 	.clkr = {
1741 		.enable_reg = 0x22cc,
1742 		.enable_mask = BIT(4),
1743 		.hw.init = &(struct clk_init_data){
1744 			.name = "pcie_h_clk",
1745 			.ops = &clk_branch_ops,
1746 		},
1747 	},
1748 };
1749 
1750 static struct clk_branch pcie_phy_clk = {
1751 	.halt_reg = 0x2fdc,
1752 	.halt_bit = 29,
1753 	.clkr = {
1754 		.enable_reg = 0x22d0,
1755 		.enable_mask = BIT(4),
1756 		.hw.init = &(struct clk_init_data){
1757 			.name = "pcie_phy_clk",
1758 			.ops = &clk_branch_ops,
1759 		},
1760 	},
1761 };
1762 
1763 static struct clk_rcg pcie1_ref_src = {
1764 	.ns_reg = 0x3aa0,
1765 	.p = {
1766 		.pre_div_shift = 3,
1767 		.pre_div_width = 4,
1768 	},
1769 	.s = {
1770 		.src_sel_shift = 0,
1771 		.parent_map = gcc_pxo_pll3_map,
1772 	},
1773 	.freq_tbl = clk_tbl_pcie_ref,
1774 	.clkr = {
1775 		.enable_reg = 0x3aa0,
1776 		.enable_mask = BIT(11),
1777 		.hw.init = &(struct clk_init_data){
1778 			.name = "pcie1_ref_src",
1779 			.parent_data = gcc_pxo_pll3,
1780 			.num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1781 			.ops = &clk_rcg_ops,
1782 			.flags = CLK_SET_RATE_GATE,
1783 		},
1784 	},
1785 };
1786 
1787 static struct clk_branch pcie1_ref_src_clk = {
1788 	.halt_reg = 0x2fdc,
1789 	.halt_bit = 27,
1790 	.clkr = {
1791 		.enable_reg = 0x3aa0,
1792 		.enable_mask = BIT(9),
1793 		.hw.init = &(struct clk_init_data){
1794 			.name = "pcie1_ref_src_clk",
1795 			.parent_hws = (const struct clk_hw*[]){
1796 				&pcie1_ref_src.clkr.hw,
1797 			},
1798 			.num_parents = 1,
1799 			.ops = &clk_branch_ops,
1800 			.flags = CLK_SET_RATE_PARENT,
1801 		},
1802 	},
1803 };
1804 
1805 static struct clk_branch pcie1_a_clk = {
1806 	.halt_reg = 0x2fc0,
1807 	.halt_bit = 10,
1808 	.clkr = {
1809 		.enable_reg = 0x3a80,
1810 		.enable_mask = BIT(4),
1811 		.hw.init = &(struct clk_init_data){
1812 			.name = "pcie1_a_clk",
1813 			.ops = &clk_branch_ops,
1814 		},
1815 	},
1816 };
1817 
1818 static struct clk_branch pcie1_aux_clk = {
1819 	.halt_reg = 0x2fdc,
1820 	.halt_bit = 28,
1821 	.clkr = {
1822 		.enable_reg = 0x3a88,
1823 		.enable_mask = BIT(4),
1824 		.hw.init = &(struct clk_init_data){
1825 			.name = "pcie1_aux_clk",
1826 			.ops = &clk_branch_ops,
1827 		},
1828 	},
1829 };
1830 
1831 static struct clk_branch pcie1_h_clk = {
1832 	.halt_reg = 0x2fd4,
1833 	.halt_bit = 9,
1834 	.clkr = {
1835 		.enable_reg = 0x3a8c,
1836 		.enable_mask = BIT(4),
1837 		.hw.init = &(struct clk_init_data){
1838 			.name = "pcie1_h_clk",
1839 			.ops = &clk_branch_ops,
1840 		},
1841 	},
1842 };
1843 
1844 static struct clk_branch pcie1_phy_clk = {
1845 	.halt_reg = 0x2fdc,
1846 	.halt_bit = 26,
1847 	.clkr = {
1848 		.enable_reg = 0x3a90,
1849 		.enable_mask = BIT(4),
1850 		.hw.init = &(struct clk_init_data){
1851 			.name = "pcie1_phy_clk",
1852 			.ops = &clk_branch_ops,
1853 		},
1854 	},
1855 };
1856 
1857 static struct clk_rcg pcie2_ref_src = {
1858 	.ns_reg = 0x3ae0,
1859 	.p = {
1860 		.pre_div_shift = 3,
1861 		.pre_div_width = 4,
1862 	},
1863 	.s = {
1864 		.src_sel_shift = 0,
1865 		.parent_map = gcc_pxo_pll3_map,
1866 	},
1867 	.freq_tbl = clk_tbl_pcie_ref,
1868 	.clkr = {
1869 		.enable_reg = 0x3ae0,
1870 		.enable_mask = BIT(11),
1871 		.hw.init = &(struct clk_init_data){
1872 			.name = "pcie2_ref_src",
1873 			.parent_data = gcc_pxo_pll3,
1874 			.num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1875 			.ops = &clk_rcg_ops,
1876 			.flags = CLK_SET_RATE_GATE,
1877 		},
1878 	},
1879 };
1880 
1881 static struct clk_branch pcie2_ref_src_clk = {
1882 	.halt_reg = 0x2fdc,
1883 	.halt_bit = 24,
1884 	.clkr = {
1885 		.enable_reg = 0x3ae0,
1886 		.enable_mask = BIT(9),
1887 		.hw.init = &(struct clk_init_data){
1888 			.name = "pcie2_ref_src_clk",
1889 			.parent_hws = (const struct clk_hw*[]){
1890 				&pcie2_ref_src.clkr.hw,
1891 			},
1892 			.num_parents = 1,
1893 			.ops = &clk_branch_ops,
1894 			.flags = CLK_SET_RATE_PARENT,
1895 		},
1896 	},
1897 };
1898 
1899 static struct clk_branch pcie2_a_clk = {
1900 	.halt_reg = 0x2fc0,
1901 	.halt_bit = 9,
1902 	.clkr = {
1903 		.enable_reg = 0x3ac0,
1904 		.enable_mask = BIT(4),
1905 		.hw.init = &(struct clk_init_data){
1906 			.name = "pcie2_a_clk",
1907 			.ops = &clk_branch_ops,
1908 		},
1909 	},
1910 };
1911 
1912 static struct clk_branch pcie2_aux_clk = {
1913 	.halt_reg = 0x2fdc,
1914 	.halt_bit = 25,
1915 	.clkr = {
1916 		.enable_reg = 0x3ac8,
1917 		.enable_mask = BIT(4),
1918 		.hw.init = &(struct clk_init_data){
1919 			.name = "pcie2_aux_clk",
1920 			.ops = &clk_branch_ops,
1921 		},
1922 	},
1923 };
1924 
1925 static struct clk_branch pcie2_h_clk = {
1926 	.halt_reg = 0x2fd4,
1927 	.halt_bit = 10,
1928 	.clkr = {
1929 		.enable_reg = 0x3acc,
1930 		.enable_mask = BIT(4),
1931 		.hw.init = &(struct clk_init_data){
1932 			.name = "pcie2_h_clk",
1933 			.ops = &clk_branch_ops,
1934 		},
1935 	},
1936 };
1937 
1938 static struct clk_branch pcie2_phy_clk = {
1939 	.halt_reg = 0x2fdc,
1940 	.halt_bit = 23,
1941 	.clkr = {
1942 		.enable_reg = 0x3ad0,
1943 		.enable_mask = BIT(4),
1944 		.hw.init = &(struct clk_init_data){
1945 			.name = "pcie2_phy_clk",
1946 			.ops = &clk_branch_ops,
1947 		},
1948 	},
1949 };
1950 
1951 static const struct freq_tbl clk_tbl_sata_ref[] = {
1952 	{ 100000000, P_PLL3,  12, 0, 0 },
1953 	{ }
1954 };
1955 
1956 static struct clk_rcg sata_ref_src = {
1957 	.ns_reg = 0x2c08,
1958 	.p = {
1959 		.pre_div_shift = 3,
1960 		.pre_div_width = 4,
1961 	},
1962 	.s = {
1963 		.src_sel_shift = 0,
1964 		.parent_map = gcc_pxo_pll3_sata_map,
1965 	},
1966 	.freq_tbl = clk_tbl_sata_ref,
1967 	.clkr = {
1968 		.enable_reg = 0x2c08,
1969 		.enable_mask = BIT(7),
1970 		.hw.init = &(struct clk_init_data){
1971 			.name = "sata_ref_src",
1972 			.parent_data = gcc_pxo_pll3,
1973 			.num_parents = ARRAY_SIZE(gcc_pxo_pll3),
1974 			.ops = &clk_rcg_ops,
1975 			.flags = CLK_SET_RATE_GATE,
1976 		},
1977 	},
1978 };
1979 
1980 static struct clk_branch sata_rxoob_clk = {
1981 	.halt_reg = 0x2fdc,
1982 	.halt_bit = 20,
1983 	.clkr = {
1984 		.enable_reg = 0x2c0c,
1985 		.enable_mask = BIT(4),
1986 		.hw.init = &(struct clk_init_data){
1987 			.name = "sata_rxoob_clk",
1988 			.parent_hws = (const struct clk_hw*[]){
1989 				&sata_ref_src.clkr.hw,
1990 			},
1991 			.num_parents = 1,
1992 			.ops = &clk_branch_ops,
1993 			.flags = CLK_SET_RATE_PARENT,
1994 		},
1995 	},
1996 };
1997 
1998 static struct clk_branch sata_pmalive_clk = {
1999 	.halt_reg = 0x2fdc,
2000 	.halt_bit = 19,
2001 	.clkr = {
2002 		.enable_reg = 0x2c10,
2003 		.enable_mask = BIT(4),
2004 		.hw.init = &(struct clk_init_data){
2005 			.name = "sata_pmalive_clk",
2006 			.parent_hws = (const struct clk_hw*[]){
2007 				&sata_ref_src.clkr.hw,
2008 			},
2009 			.num_parents = 1,
2010 			.ops = &clk_branch_ops,
2011 			.flags = CLK_SET_RATE_PARENT,
2012 		},
2013 	},
2014 };
2015 
2016 static struct clk_branch sata_phy_ref_clk = {
2017 	.halt_reg = 0x2fdc,
2018 	.halt_bit = 18,
2019 	.clkr = {
2020 		.enable_reg = 0x2c14,
2021 		.enable_mask = BIT(4),
2022 		.hw.init = &(struct clk_init_data){
2023 			.name = "sata_phy_ref_clk",
2024 			.parent_data = gcc_pxo,
2025 			.num_parents = 1,
2026 			.ops = &clk_branch_ops,
2027 		},
2028 	},
2029 };
2030 
2031 static struct clk_branch sata_a_clk = {
2032 	.halt_reg = 0x2fc0,
2033 	.halt_bit = 12,
2034 	.clkr = {
2035 		.enable_reg = 0x2c20,
2036 		.enable_mask = BIT(4),
2037 		.hw.init = &(struct clk_init_data){
2038 			.name = "sata_a_clk",
2039 			.ops = &clk_branch_ops,
2040 		},
2041 	},
2042 };
2043 
2044 static struct clk_branch sata_h_clk = {
2045 	.halt_reg = 0x2fdc,
2046 	.halt_bit = 21,
2047 	.clkr = {
2048 		.enable_reg = 0x2c00,
2049 		.enable_mask = BIT(4),
2050 		.hw.init = &(struct clk_init_data){
2051 			.name = "sata_h_clk",
2052 			.ops = &clk_branch_ops,
2053 		},
2054 	},
2055 };
2056 
2057 static struct clk_branch sfab_sata_s_h_clk = {
2058 	.halt_reg = 0x2fc4,
2059 	.halt_bit = 14,
2060 	.clkr = {
2061 		.enable_reg = 0x2480,
2062 		.enable_mask = BIT(4),
2063 		.hw.init = &(struct clk_init_data){
2064 			.name = "sfab_sata_s_h_clk",
2065 			.ops = &clk_branch_ops,
2066 		},
2067 	},
2068 };
2069 
2070 static struct clk_branch sata_phy_cfg_clk = {
2071 	.halt_reg = 0x2fcc,
2072 	.halt_bit = 14,
2073 	.clkr = {
2074 		.enable_reg = 0x2c40,
2075 		.enable_mask = BIT(4),
2076 		.hw.init = &(struct clk_init_data){
2077 			.name = "sata_phy_cfg_clk",
2078 			.ops = &clk_branch_ops,
2079 		},
2080 	},
2081 };
2082 
2083 static const struct freq_tbl clk_tbl_usb30_master[] = {
2084 	{ 125000000, P_PLL0,  1, 5, 32 },
2085 	{ }
2086 };
2087 
2088 static struct clk_rcg usb30_master_clk_src = {
2089 	.ns_reg = 0x3b2c,
2090 	.md_reg = 0x3b28,
2091 	.mn = {
2092 		.mnctr_en_bit = 8,
2093 		.mnctr_reset_bit = 7,
2094 		.mnctr_mode_shift = 5,
2095 		.n_val_shift = 16,
2096 		.m_val_shift = 16,
2097 		.width = 8,
2098 	},
2099 	.p = {
2100 		.pre_div_shift = 3,
2101 		.pre_div_width = 2,
2102 	},
2103 	.s = {
2104 		.src_sel_shift = 0,
2105 		.parent_map = gcc_pxo_pll8_pll0_map,
2106 	},
2107 	.freq_tbl = clk_tbl_usb30_master,
2108 	.clkr = {
2109 		.enable_reg = 0x3b2c,
2110 		.enable_mask = BIT(11),
2111 		.hw.init = &(struct clk_init_data){
2112 			.name = "usb30_master_ref_src",
2113 			.parent_data = gcc_pxo_pll8_pll0,
2114 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2115 			.ops = &clk_rcg_ops,
2116 			.flags = CLK_SET_RATE_GATE,
2117 		},
2118 	},
2119 };
2120 
2121 static struct clk_branch usb30_0_branch_clk = {
2122 	.halt_reg = 0x2fc4,
2123 	.halt_bit = 22,
2124 	.clkr = {
2125 		.enable_reg = 0x3b24,
2126 		.enable_mask = BIT(4),
2127 		.hw.init = &(struct clk_init_data){
2128 			.name = "usb30_0_branch_clk",
2129 			.parent_hws = (const struct clk_hw*[]){
2130 				&usb30_master_clk_src.clkr.hw,
2131 			},
2132 			.num_parents = 1,
2133 			.ops = &clk_branch_ops,
2134 			.flags = CLK_SET_RATE_PARENT,
2135 		},
2136 	},
2137 };
2138 
2139 static struct clk_branch usb30_1_branch_clk = {
2140 	.halt_reg = 0x2fc4,
2141 	.halt_bit = 17,
2142 	.clkr = {
2143 		.enable_reg = 0x3b34,
2144 		.enable_mask = BIT(4),
2145 		.hw.init = &(struct clk_init_data){
2146 			.name = "usb30_1_branch_clk",
2147 			.parent_hws = (const struct clk_hw*[]){
2148 				&usb30_master_clk_src.clkr.hw,
2149 			},
2150 			.num_parents = 1,
2151 			.ops = &clk_branch_ops,
2152 			.flags = CLK_SET_RATE_PARENT,
2153 		},
2154 	},
2155 };
2156 
2157 static const struct freq_tbl clk_tbl_usb30_utmi[] = {
2158 	{ 60000000, P_PLL8,  1, 5, 32 },
2159 	{ }
2160 };
2161 
2162 static struct clk_rcg usb30_utmi_clk = {
2163 	.ns_reg = 0x3b44,
2164 	.md_reg = 0x3b40,
2165 	.mn = {
2166 		.mnctr_en_bit = 8,
2167 		.mnctr_reset_bit = 7,
2168 		.mnctr_mode_shift = 5,
2169 		.n_val_shift = 16,
2170 		.m_val_shift = 16,
2171 		.width = 8,
2172 	},
2173 	.p = {
2174 		.pre_div_shift = 3,
2175 		.pre_div_width = 2,
2176 	},
2177 	.s = {
2178 		.src_sel_shift = 0,
2179 		.parent_map = gcc_pxo_pll8_pll0_map,
2180 	},
2181 	.freq_tbl = clk_tbl_usb30_utmi,
2182 	.clkr = {
2183 		.enable_reg = 0x3b44,
2184 		.enable_mask = BIT(11),
2185 		.hw.init = &(struct clk_init_data){
2186 			.name = "usb30_utmi_clk",
2187 			.parent_data = gcc_pxo_pll8_pll0,
2188 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2189 			.ops = &clk_rcg_ops,
2190 			.flags = CLK_SET_RATE_GATE,
2191 		},
2192 	},
2193 };
2194 
2195 static struct clk_branch usb30_0_utmi_clk_ctl = {
2196 	.halt_reg = 0x2fc4,
2197 	.halt_bit = 21,
2198 	.clkr = {
2199 		.enable_reg = 0x3b48,
2200 		.enable_mask = BIT(4),
2201 		.hw.init = &(struct clk_init_data){
2202 			.name = "usb30_0_utmi_clk_ctl",
2203 			.parent_hws = (const struct clk_hw*[]){
2204 				&usb30_utmi_clk.clkr.hw,
2205 			},
2206 			.num_parents = 1,
2207 			.ops = &clk_branch_ops,
2208 			.flags = CLK_SET_RATE_PARENT,
2209 		},
2210 	},
2211 };
2212 
2213 static struct clk_branch usb30_1_utmi_clk_ctl = {
2214 	.halt_reg = 0x2fc4,
2215 	.halt_bit = 15,
2216 	.clkr = {
2217 		.enable_reg = 0x3b4c,
2218 		.enable_mask = BIT(4),
2219 		.hw.init = &(struct clk_init_data){
2220 			.name = "usb30_1_utmi_clk_ctl",
2221 			.parent_hws = (const struct clk_hw*[]){
2222 				&usb30_utmi_clk.clkr.hw,
2223 			},
2224 			.num_parents = 1,
2225 			.ops = &clk_branch_ops,
2226 			.flags = CLK_SET_RATE_PARENT,
2227 		},
2228 	},
2229 };
2230 
2231 static const struct freq_tbl clk_tbl_usb[] = {
2232 	{ 60000000, P_PLL8,  1, 5, 32 },
2233 	{ }
2234 };
2235 
2236 static struct clk_rcg usb_hs1_xcvr_clk_src = {
2237 	.ns_reg = 0x290C,
2238 	.md_reg = 0x2908,
2239 	.mn = {
2240 		.mnctr_en_bit = 8,
2241 		.mnctr_reset_bit = 7,
2242 		.mnctr_mode_shift = 5,
2243 		.n_val_shift = 16,
2244 		.m_val_shift = 16,
2245 		.width = 8,
2246 	},
2247 	.p = {
2248 		.pre_div_shift = 3,
2249 		.pre_div_width = 2,
2250 	},
2251 	.s = {
2252 		.src_sel_shift = 0,
2253 		.parent_map = gcc_pxo_pll8_pll0_map,
2254 	},
2255 	.freq_tbl = clk_tbl_usb,
2256 	.clkr = {
2257 		.enable_reg = 0x2968,
2258 		.enable_mask = BIT(11),
2259 		.hw.init = &(struct clk_init_data){
2260 			.name = "usb_hs1_xcvr_src",
2261 			.parent_data = gcc_pxo_pll8_pll0,
2262 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2263 			.ops = &clk_rcg_ops,
2264 			.flags = CLK_SET_RATE_GATE,
2265 		},
2266 	},
2267 };
2268 
2269 static struct clk_branch usb_hs1_xcvr_clk = {
2270 	.halt_reg = 0x2fcc,
2271 	.halt_bit = 17,
2272 	.clkr = {
2273 		.enable_reg = 0x290c,
2274 		.enable_mask = BIT(9),
2275 		.hw.init = &(struct clk_init_data){
2276 			.name = "usb_hs1_xcvr_clk",
2277 			.parent_hws = (const struct clk_hw*[]){
2278 				&usb_hs1_xcvr_clk_src.clkr.hw,
2279 			},
2280 			.num_parents = 1,
2281 			.ops = &clk_branch_ops,
2282 			.flags = CLK_SET_RATE_PARENT,
2283 		},
2284 	},
2285 };
2286 
2287 static struct clk_branch usb_hs1_h_clk = {
2288 	.hwcg_reg = 0x2900,
2289 	.hwcg_bit = 6,
2290 	.halt_reg = 0x2fc8,
2291 	.halt_bit = 1,
2292 	.clkr = {
2293 		.enable_reg = 0x2900,
2294 		.enable_mask = BIT(4),
2295 		.hw.init = &(struct clk_init_data){
2296 			.name = "usb_hs1_h_clk",
2297 			.ops = &clk_branch_ops,
2298 		},
2299 	},
2300 };
2301 
2302 static struct clk_rcg usb_fs1_xcvr_clk_src = {
2303 	.ns_reg = 0x2968,
2304 	.md_reg = 0x2964,
2305 	.mn = {
2306 		.mnctr_en_bit = 8,
2307 		.mnctr_reset_bit = 7,
2308 		.mnctr_mode_shift = 5,
2309 		.n_val_shift = 16,
2310 		.m_val_shift = 16,
2311 		.width = 8,
2312 	},
2313 	.p = {
2314 		.pre_div_shift = 3,
2315 		.pre_div_width = 2,
2316 	},
2317 	.s = {
2318 		.src_sel_shift = 0,
2319 		.parent_map = gcc_pxo_pll8_pll0_map,
2320 	},
2321 	.freq_tbl = clk_tbl_usb,
2322 	.clkr = {
2323 		.enable_reg = 0x2968,
2324 		.enable_mask = BIT(11),
2325 		.hw.init = &(struct clk_init_data){
2326 			.name = "usb_fs1_xcvr_src",
2327 			.parent_data = gcc_pxo_pll8_pll0,
2328 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0),
2329 			.ops = &clk_rcg_ops,
2330 			.flags = CLK_SET_RATE_GATE,
2331 		},
2332 	},
2333 };
2334 
2335 static struct clk_branch usb_fs1_xcvr_clk = {
2336 	.halt_reg = 0x2fcc,
2337 	.halt_bit = 17,
2338 	.clkr = {
2339 		.enable_reg = 0x2968,
2340 		.enable_mask = BIT(9),
2341 		.hw.init = &(struct clk_init_data){
2342 			.name = "usb_fs1_xcvr_clk",
2343 			.parent_hws = (const struct clk_hw*[]){
2344 				&usb_fs1_xcvr_clk_src.clkr.hw,
2345 			},
2346 			.num_parents = 1,
2347 			.ops = &clk_branch_ops,
2348 			.flags = CLK_SET_RATE_PARENT,
2349 		},
2350 	},
2351 };
2352 
2353 static struct clk_branch usb_fs1_sys_clk = {
2354 	.halt_reg = 0x2fcc,
2355 	.halt_bit = 18,
2356 	.clkr = {
2357 		.enable_reg = 0x296c,
2358 		.enable_mask = BIT(4),
2359 		.hw.init = &(struct clk_init_data){
2360 			.name = "usb_fs1_sys_clk",
2361 			.parent_hws = (const struct clk_hw*[]){
2362 				&usb_fs1_xcvr_clk_src.clkr.hw,
2363 			},
2364 			.num_parents = 1,
2365 			.ops = &clk_branch_ops,
2366 			.flags = CLK_SET_RATE_PARENT,
2367 		},
2368 	},
2369 };
2370 
2371 static struct clk_branch usb_fs1_h_clk = {
2372 	.halt_reg = 0x2fcc,
2373 	.halt_bit = 19,
2374 	.clkr = {
2375 		.enable_reg = 0x2960,
2376 		.enable_mask = BIT(4),
2377 		.hw.init = &(struct clk_init_data){
2378 			.name = "usb_fs1_h_clk",
2379 			.ops = &clk_branch_ops,
2380 		},
2381 	},
2382 };
2383 
2384 static struct clk_branch ebi2_clk = {
2385 	.hwcg_reg = 0x3b00,
2386 	.hwcg_bit = 6,
2387 	.halt_reg = 0x2fcc,
2388 	.halt_bit = 1,
2389 	.clkr = {
2390 		.enable_reg = 0x3b00,
2391 		.enable_mask = BIT(4),
2392 		.hw.init = &(struct clk_init_data){
2393 			.name = "ebi2_clk",
2394 			.ops = &clk_branch_ops,
2395 		},
2396 	},
2397 };
2398 
2399 static struct clk_branch ebi2_aon_clk = {
2400 	.halt_reg = 0x2fcc,
2401 	.halt_bit = 0,
2402 	.clkr = {
2403 		.enable_reg = 0x3b00,
2404 		.enable_mask = BIT(8),
2405 		.hw.init = &(struct clk_init_data){
2406 			.name = "ebi2_always_on_clk",
2407 			.ops = &clk_branch_ops,
2408 		},
2409 	},
2410 };
2411 
2412 static const struct freq_tbl clk_tbl_gmac[] = {
2413 	{ 133000000, P_PLL0, 1,  50, 301 },
2414 	{ 266000000, P_PLL0, 1, 127, 382 },
2415 	{ }
2416 };
2417 
2418 static struct clk_dyn_rcg gmac_core1_src = {
2419 	.ns_reg[0] = 0x3cac,
2420 	.ns_reg[1] = 0x3cb0,
2421 	.md_reg[0] = 0x3ca4,
2422 	.md_reg[1] = 0x3ca8,
2423 	.bank_reg = 0x3ca0,
2424 	.mn[0] = {
2425 		.mnctr_en_bit = 8,
2426 		.mnctr_reset_bit = 7,
2427 		.mnctr_mode_shift = 5,
2428 		.n_val_shift = 16,
2429 		.m_val_shift = 16,
2430 		.width = 8,
2431 	},
2432 	.mn[1] = {
2433 		.mnctr_en_bit = 8,
2434 		.mnctr_reset_bit = 7,
2435 		.mnctr_mode_shift = 5,
2436 		.n_val_shift = 16,
2437 		.m_val_shift = 16,
2438 		.width = 8,
2439 	},
2440 	.s[0] = {
2441 		.src_sel_shift = 0,
2442 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2443 	},
2444 	.s[1] = {
2445 		.src_sel_shift = 0,
2446 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2447 	},
2448 	.p[0] = {
2449 		.pre_div_shift = 3,
2450 		.pre_div_width = 2,
2451 	},
2452 	.p[1] = {
2453 		.pre_div_shift = 3,
2454 		.pre_div_width = 2,
2455 	},
2456 	.mux_sel_bit = 0,
2457 	.freq_tbl = clk_tbl_gmac,
2458 	.clkr = {
2459 		.enable_reg = 0x3ca0,
2460 		.enable_mask = BIT(1),
2461 		.hw.init = &(struct clk_init_data){
2462 			.name = "gmac_core1_src",
2463 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2464 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2465 			.ops = &clk_dyn_rcg_ops,
2466 		},
2467 	},
2468 };
2469 
2470 static struct clk_branch gmac_core1_clk = {
2471 	.halt_reg = 0x3c20,
2472 	.halt_bit = 4,
2473 	.hwcg_reg = 0x3cb4,
2474 	.hwcg_bit = 6,
2475 	.clkr = {
2476 		.enable_reg = 0x3cb4,
2477 		.enable_mask = BIT(4),
2478 		.hw.init = &(struct clk_init_data){
2479 			.name = "gmac_core1_clk",
2480 			.parent_hws = (const struct clk_hw*[]){
2481 				&gmac_core1_src.clkr.hw,
2482 			},
2483 			.num_parents = 1,
2484 			.ops = &clk_branch_ops,
2485 			.flags = CLK_SET_RATE_PARENT,
2486 		},
2487 	},
2488 };
2489 
2490 static struct clk_dyn_rcg gmac_core2_src = {
2491 	.ns_reg[0] = 0x3ccc,
2492 	.ns_reg[1] = 0x3cd0,
2493 	.md_reg[0] = 0x3cc4,
2494 	.md_reg[1] = 0x3cc8,
2495 	.bank_reg = 0x3ca0,
2496 	.mn[0] = {
2497 		.mnctr_en_bit = 8,
2498 		.mnctr_reset_bit = 7,
2499 		.mnctr_mode_shift = 5,
2500 		.n_val_shift = 16,
2501 		.m_val_shift = 16,
2502 		.width = 8,
2503 	},
2504 	.mn[1] = {
2505 		.mnctr_en_bit = 8,
2506 		.mnctr_reset_bit = 7,
2507 		.mnctr_mode_shift = 5,
2508 		.n_val_shift = 16,
2509 		.m_val_shift = 16,
2510 		.width = 8,
2511 	},
2512 	.s[0] = {
2513 		.src_sel_shift = 0,
2514 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2515 	},
2516 	.s[1] = {
2517 		.src_sel_shift = 0,
2518 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2519 	},
2520 	.p[0] = {
2521 		.pre_div_shift = 3,
2522 		.pre_div_width = 2,
2523 	},
2524 	.p[1] = {
2525 		.pre_div_shift = 3,
2526 		.pre_div_width = 2,
2527 	},
2528 	.mux_sel_bit = 0,
2529 	.freq_tbl = clk_tbl_gmac,
2530 	.clkr = {
2531 		.enable_reg = 0x3cc0,
2532 		.enable_mask = BIT(1),
2533 		.hw.init = &(struct clk_init_data){
2534 			.name = "gmac_core2_src",
2535 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2536 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2537 			.ops = &clk_dyn_rcg_ops,
2538 		},
2539 	},
2540 };
2541 
2542 static struct clk_branch gmac_core2_clk = {
2543 	.halt_reg = 0x3c20,
2544 	.halt_bit = 5,
2545 	.hwcg_reg = 0x3cd4,
2546 	.hwcg_bit = 6,
2547 	.clkr = {
2548 		.enable_reg = 0x3cd4,
2549 		.enable_mask = BIT(4),
2550 		.hw.init = &(struct clk_init_data){
2551 			.name = "gmac_core2_clk",
2552 			.parent_hws = (const struct clk_hw*[]){
2553 				&gmac_core2_src.clkr.hw,
2554 			},
2555 			.num_parents = 1,
2556 			.ops = &clk_branch_ops,
2557 			.flags = CLK_SET_RATE_PARENT,
2558 		},
2559 	},
2560 };
2561 
2562 static struct clk_dyn_rcg gmac_core3_src = {
2563 	.ns_reg[0] = 0x3cec,
2564 	.ns_reg[1] = 0x3cf0,
2565 	.md_reg[0] = 0x3ce4,
2566 	.md_reg[1] = 0x3ce8,
2567 	.bank_reg = 0x3ce0,
2568 	.mn[0] = {
2569 		.mnctr_en_bit = 8,
2570 		.mnctr_reset_bit = 7,
2571 		.mnctr_mode_shift = 5,
2572 		.n_val_shift = 16,
2573 		.m_val_shift = 16,
2574 		.width = 8,
2575 	},
2576 	.mn[1] = {
2577 		.mnctr_en_bit = 8,
2578 		.mnctr_reset_bit = 7,
2579 		.mnctr_mode_shift = 5,
2580 		.n_val_shift = 16,
2581 		.m_val_shift = 16,
2582 		.width = 8,
2583 	},
2584 	.s[0] = {
2585 		.src_sel_shift = 0,
2586 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2587 	},
2588 	.s[1] = {
2589 		.src_sel_shift = 0,
2590 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2591 	},
2592 	.p[0] = {
2593 		.pre_div_shift = 3,
2594 		.pre_div_width = 2,
2595 	},
2596 	.p[1] = {
2597 		.pre_div_shift = 3,
2598 		.pre_div_width = 2,
2599 	},
2600 	.mux_sel_bit = 0,
2601 	.freq_tbl = clk_tbl_gmac,
2602 	.clkr = {
2603 		.enable_reg = 0x3ce0,
2604 		.enable_mask = BIT(1),
2605 		.hw.init = &(struct clk_init_data){
2606 			.name = "gmac_core3_src",
2607 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2608 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2609 			.ops = &clk_dyn_rcg_ops,
2610 		},
2611 	},
2612 };
2613 
2614 static struct clk_branch gmac_core3_clk = {
2615 	.halt_reg = 0x3c20,
2616 	.halt_bit = 6,
2617 	.hwcg_reg = 0x3cf4,
2618 	.hwcg_bit = 6,
2619 	.clkr = {
2620 		.enable_reg = 0x3cf4,
2621 		.enable_mask = BIT(4),
2622 		.hw.init = &(struct clk_init_data){
2623 			.name = "gmac_core3_clk",
2624 			.parent_hws = (const struct clk_hw*[]){
2625 				&gmac_core3_src.clkr.hw,
2626 			},
2627 			.num_parents = 1,
2628 			.ops = &clk_branch_ops,
2629 			.flags = CLK_SET_RATE_PARENT,
2630 		},
2631 	},
2632 };
2633 
2634 static struct clk_dyn_rcg gmac_core4_src = {
2635 	.ns_reg[0] = 0x3d0c,
2636 	.ns_reg[1] = 0x3d10,
2637 	.md_reg[0] = 0x3d04,
2638 	.md_reg[1] = 0x3d08,
2639 	.bank_reg = 0x3d00,
2640 	.mn[0] = {
2641 		.mnctr_en_bit = 8,
2642 		.mnctr_reset_bit = 7,
2643 		.mnctr_mode_shift = 5,
2644 		.n_val_shift = 16,
2645 		.m_val_shift = 16,
2646 		.width = 8,
2647 	},
2648 	.mn[1] = {
2649 		.mnctr_en_bit = 8,
2650 		.mnctr_reset_bit = 7,
2651 		.mnctr_mode_shift = 5,
2652 		.n_val_shift = 16,
2653 		.m_val_shift = 16,
2654 		.width = 8,
2655 	},
2656 	.s[0] = {
2657 		.src_sel_shift = 0,
2658 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2659 	},
2660 	.s[1] = {
2661 		.src_sel_shift = 0,
2662 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2663 	},
2664 	.p[0] = {
2665 		.pre_div_shift = 3,
2666 		.pre_div_width = 2,
2667 	},
2668 	.p[1] = {
2669 		.pre_div_shift = 3,
2670 		.pre_div_width = 2,
2671 	},
2672 	.mux_sel_bit = 0,
2673 	.freq_tbl = clk_tbl_gmac,
2674 	.clkr = {
2675 		.enable_reg = 0x3d00,
2676 		.enable_mask = BIT(1),
2677 		.hw.init = &(struct clk_init_data){
2678 			.name = "gmac_core4_src",
2679 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2680 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2681 			.ops = &clk_dyn_rcg_ops,
2682 		},
2683 	},
2684 };
2685 
2686 static struct clk_branch gmac_core4_clk = {
2687 	.halt_reg = 0x3c20,
2688 	.halt_bit = 7,
2689 	.hwcg_reg = 0x3d14,
2690 	.hwcg_bit = 6,
2691 	.clkr = {
2692 		.enable_reg = 0x3d14,
2693 		.enable_mask = BIT(4),
2694 		.hw.init = &(struct clk_init_data){
2695 			.name = "gmac_core4_clk",
2696 			.parent_hws = (const struct clk_hw*[]){
2697 				&gmac_core4_src.clkr.hw,
2698 			},
2699 			.num_parents = 1,
2700 			.ops = &clk_branch_ops,
2701 			.flags = CLK_SET_RATE_PARENT,
2702 		},
2703 	},
2704 };
2705 
2706 static const struct freq_tbl clk_tbl_nss_tcm[] = {
2707 	{ 266000000, P_PLL0, 3, 0, 0 },
2708 	{ 400000000, P_PLL0, 2, 0, 0 },
2709 	{ }
2710 };
2711 
2712 static struct clk_dyn_rcg nss_tcm_src = {
2713 	.ns_reg[0] = 0x3dc4,
2714 	.ns_reg[1] = 0x3dc8,
2715 	.bank_reg = 0x3dc0,
2716 	.s[0] = {
2717 		.src_sel_shift = 0,
2718 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2719 	},
2720 	.s[1] = {
2721 		.src_sel_shift = 0,
2722 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2723 	},
2724 	.p[0] = {
2725 		.pre_div_shift = 3,
2726 		.pre_div_width = 4,
2727 	},
2728 	.p[1] = {
2729 		.pre_div_shift = 3,
2730 		.pre_div_width = 4,
2731 	},
2732 	.mux_sel_bit = 0,
2733 	.freq_tbl = clk_tbl_nss_tcm,
2734 	.clkr = {
2735 		.enable_reg = 0x3dc0,
2736 		.enable_mask = BIT(1),
2737 		.hw.init = &(struct clk_init_data){
2738 			.name = "nss_tcm_src",
2739 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2740 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2741 			.ops = &clk_dyn_rcg_ops,
2742 		},
2743 	},
2744 };
2745 
2746 static struct clk_branch nss_tcm_clk = {
2747 	.halt_reg = 0x3c20,
2748 	.halt_bit = 14,
2749 	.clkr = {
2750 		.enable_reg = 0x3dd0,
2751 		.enable_mask = BIT(6) | BIT(4),
2752 		.hw.init = &(struct clk_init_data){
2753 			.name = "nss_tcm_clk",
2754 			.parent_hws = (const struct clk_hw*[]){
2755 				&nss_tcm_src.clkr.hw,
2756 			},
2757 			.num_parents = 1,
2758 			.ops = &clk_branch_ops,
2759 			.flags = CLK_SET_RATE_PARENT,
2760 		},
2761 	},
2762 };
2763 
2764 static const struct freq_tbl clk_tbl_nss_ipq8064[] = {
2765 	{ 110000000, P_PLL18, 1, 1, 5 },
2766 	{ 275000000, P_PLL18, 2, 0, 0 },
2767 	{ 550000000, P_PLL18, 1, 0, 0 },
2768 	{ 733000000, P_PLL18, 1, 0, 0 },
2769 	{ }
2770 };
2771 
2772 static const struct freq_tbl clk_tbl_nss_ipq8065[] = {
2773 	{ 110000000, P_PLL18, 1, 1, 5 },
2774 	{ 275000000, P_PLL18, 2, 0, 0 },
2775 	{ 600000000, P_PLL18, 1, 0, 0 },
2776 	{ 800000000, P_PLL18, 1, 0, 0 },
2777 	{ }
2778 };
2779 
2780 static struct clk_dyn_rcg ubi32_core1_src_clk = {
2781 	.ns_reg[0] = 0x3d2c,
2782 	.ns_reg[1] = 0x3d30,
2783 	.md_reg[0] = 0x3d24,
2784 	.md_reg[1] = 0x3d28,
2785 	.bank_reg = 0x3d20,
2786 	.mn[0] = {
2787 		.mnctr_en_bit = 8,
2788 		.mnctr_reset_bit = 7,
2789 		.mnctr_mode_shift = 5,
2790 		.n_val_shift = 16,
2791 		.m_val_shift = 16,
2792 		.width = 8,
2793 	},
2794 	.mn[1] = {
2795 		.mnctr_en_bit = 8,
2796 		.mnctr_reset_bit = 7,
2797 		.mnctr_mode_shift = 5,
2798 		.n_val_shift = 16,
2799 		.m_val_shift = 16,
2800 		.width = 8,
2801 	},
2802 	.s[0] = {
2803 		.src_sel_shift = 0,
2804 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2805 	},
2806 	.s[1] = {
2807 		.src_sel_shift = 0,
2808 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2809 	},
2810 	.p[0] = {
2811 		.pre_div_shift = 3,
2812 		.pre_div_width = 2,
2813 	},
2814 	.p[1] = {
2815 		.pre_div_shift = 3,
2816 		.pre_div_width = 2,
2817 	},
2818 	.mux_sel_bit = 0,
2819 	/* nss freq table is selected based on the SoC compatible */
2820 	.clkr = {
2821 		.enable_reg = 0x3d20,
2822 		.enable_mask = BIT(1),
2823 		.hw.init = &(struct clk_init_data){
2824 			.name = "ubi32_core1_src_clk",
2825 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2826 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2827 			.ops = &clk_dyn_rcg_ops,
2828 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2829 		},
2830 	},
2831 };
2832 
2833 static struct clk_dyn_rcg ubi32_core2_src_clk = {
2834 	.ns_reg[0] = 0x3d4c,
2835 	.ns_reg[1] = 0x3d50,
2836 	.md_reg[0] = 0x3d44,
2837 	.md_reg[1] = 0x3d48,
2838 	.bank_reg = 0x3d40,
2839 	.mn[0] = {
2840 		.mnctr_en_bit = 8,
2841 		.mnctr_reset_bit = 7,
2842 		.mnctr_mode_shift = 5,
2843 		.n_val_shift = 16,
2844 		.m_val_shift = 16,
2845 		.width = 8,
2846 	},
2847 	.mn[1] = {
2848 		.mnctr_en_bit = 8,
2849 		.mnctr_reset_bit = 7,
2850 		.mnctr_mode_shift = 5,
2851 		.n_val_shift = 16,
2852 		.m_val_shift = 16,
2853 		.width = 8,
2854 	},
2855 	.s[0] = {
2856 		.src_sel_shift = 0,
2857 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2858 	},
2859 	.s[1] = {
2860 		.src_sel_shift = 0,
2861 		.parent_map = gcc_pxo_pll8_pll14_pll18_pll0_map,
2862 	},
2863 	.p[0] = {
2864 		.pre_div_shift = 3,
2865 		.pre_div_width = 2,
2866 	},
2867 	.p[1] = {
2868 		.pre_div_shift = 3,
2869 		.pre_div_width = 2,
2870 	},
2871 	.mux_sel_bit = 0,
2872 	/* nss freq table is selected based on the SoC compatible */
2873 	.clkr = {
2874 		.enable_reg = 0x3d40,
2875 		.enable_mask = BIT(1),
2876 		.hw.init = &(struct clk_init_data){
2877 			.name = "ubi32_core2_src_clk",
2878 			.parent_data = gcc_pxo_pll8_pll14_pll18_pll0,
2879 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll14_pll18_pll0),
2880 			.ops = &clk_dyn_rcg_ops,
2881 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2882 		},
2883 	},
2884 };
2885 
2886 static const struct freq_tbl clk_tbl_ce5_core[] = {
2887 	{ 150000000, P_PLL3, 8, 1, 1 },
2888 	{ 213200000, P_PLL11, 5, 1, 1 },
2889 	{ }
2890 };
2891 
2892 static struct clk_dyn_rcg ce5_core_src = {
2893 	.ns_reg[0] = 0x36C4,
2894 	.ns_reg[1] = 0x36C8,
2895 	.bank_reg = 0x36C0,
2896 	.s[0] = {
2897 		.src_sel_shift = 0,
2898 		.parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map,
2899 	},
2900 	.s[1] = {
2901 		.src_sel_shift = 0,
2902 		.parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map,
2903 	},
2904 	.p[0] = {
2905 		.pre_div_shift = 3,
2906 		.pre_div_width = 4,
2907 	},
2908 	.p[1] = {
2909 		.pre_div_shift = 3,
2910 		.pre_div_width = 4,
2911 	},
2912 	.mux_sel_bit = 0,
2913 	.freq_tbl = clk_tbl_ce5_core,
2914 	.clkr = {
2915 		.enable_reg = 0x36C0,
2916 		.enable_mask = BIT(1),
2917 		.hw.init = &(struct clk_init_data){
2918 			.name = "ce5_core_src",
2919 			.parent_data = gcc_pxo_pll3_pll0_pll14_pll18_pll11,
2920 			.num_parents = ARRAY_SIZE(gcc_pxo_pll3_pll0_pll14_pll18_pll11),
2921 			.ops = &clk_dyn_rcg_ops,
2922 		},
2923 	},
2924 };
2925 
2926 static struct clk_branch ce5_core_clk = {
2927 	.halt_reg = 0x2FDC,
2928 	.halt_bit = 5,
2929 	.hwcg_reg = 0x36CC,
2930 	.hwcg_bit = 6,
2931 	.clkr = {
2932 		.enable_reg = 0x36CC,
2933 		.enable_mask = BIT(4),
2934 		.hw.init = &(struct clk_init_data){
2935 			.name = "ce5_core_clk",
2936 			.parent_hws = (const struct clk_hw*[]){
2937 				&ce5_core_src.clkr.hw,
2938 			},
2939 			.num_parents = 1,
2940 			.ops = &clk_branch_ops,
2941 			.flags = CLK_SET_RATE_PARENT,
2942 		},
2943 	},
2944 };
2945 
2946 static const struct freq_tbl clk_tbl_ce5_a_clk[] = {
2947 	{ 160000000, P_PLL0, 5, 1, 1 },
2948 	{ 213200000, P_PLL11, 5, 1, 1 },
2949 	{ }
2950 };
2951 
2952 static struct clk_dyn_rcg ce5_a_clk_src = {
2953 	.ns_reg[0] = 0x3d84,
2954 	.ns_reg[1] = 0x3d88,
2955 	.bank_reg = 0x3d80,
2956 	.s[0] = {
2957 		.src_sel_shift = 0,
2958 		.parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
2959 	},
2960 	.s[1] = {
2961 		.src_sel_shift = 0,
2962 		.parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
2963 	},
2964 	.p[0] = {
2965 		.pre_div_shift = 3,
2966 		.pre_div_width = 4,
2967 	},
2968 	.p[1] = {
2969 		.pre_div_shift = 3,
2970 		.pre_div_width = 4,
2971 	},
2972 	.mux_sel_bit = 0,
2973 	.freq_tbl = clk_tbl_ce5_a_clk,
2974 	.clkr = {
2975 		.enable_reg = 0x3d80,
2976 		.enable_mask = BIT(1),
2977 		.hw.init = &(struct clk_init_data){
2978 			.name = "ce5_a_clk_src",
2979 			.parent_data = gcc_pxo_pll8_pll0_pll14_pll18_pll11,
2980 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0_pll14_pll18_pll11),
2981 			.ops = &clk_dyn_rcg_ops,
2982 		},
2983 	},
2984 };
2985 
2986 static struct clk_branch ce5_a_clk = {
2987 	.halt_reg = 0x3c20,
2988 	.halt_bit = 12,
2989 	.hwcg_reg = 0x3d8c,
2990 	.hwcg_bit = 6,
2991 	.clkr = {
2992 		.enable_reg = 0x3d8c,
2993 		.enable_mask = BIT(4),
2994 		.hw.init = &(struct clk_init_data){
2995 			.name = "ce5_a_clk",
2996 			.parent_hws = (const struct clk_hw*[]){
2997 				&ce5_a_clk_src.clkr.hw,
2998 			},
2999 			.num_parents = 1,
3000 			.ops = &clk_branch_ops,
3001 			.flags = CLK_SET_RATE_PARENT,
3002 		},
3003 	},
3004 };
3005 
3006 static const struct freq_tbl clk_tbl_ce5_h_clk[] = {
3007 	{ 160000000, P_PLL0, 5, 1, 1 },
3008 	{ 213200000, P_PLL11, 5, 1, 1 },
3009 	{ }
3010 };
3011 
3012 static struct clk_dyn_rcg ce5_h_clk_src = {
3013 	.ns_reg[0] = 0x3c64,
3014 	.ns_reg[1] = 0x3c68,
3015 	.bank_reg = 0x3c60,
3016 	.s[0] = {
3017 		.src_sel_shift = 0,
3018 		.parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
3019 	},
3020 	.s[1] = {
3021 		.src_sel_shift = 0,
3022 		.parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
3023 	},
3024 	.p[0] = {
3025 		.pre_div_shift = 3,
3026 		.pre_div_width = 4,
3027 	},
3028 	.p[1] = {
3029 		.pre_div_shift = 3,
3030 		.pre_div_width = 4,
3031 	},
3032 	.mux_sel_bit = 0,
3033 	.freq_tbl = clk_tbl_ce5_h_clk,
3034 	.clkr = {
3035 		.enable_reg = 0x3c60,
3036 		.enable_mask = BIT(1),
3037 		.hw.init = &(struct clk_init_data){
3038 			.name = "ce5_h_clk_src",
3039 			.parent_data = gcc_pxo_pll8_pll0_pll14_pll18_pll11,
3040 			.num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll0_pll14_pll18_pll11),
3041 			.ops = &clk_dyn_rcg_ops,
3042 		},
3043 	},
3044 };
3045 
3046 static struct clk_branch ce5_h_clk = {
3047 	.halt_reg = 0x3c20,
3048 	.halt_bit = 11,
3049 	.hwcg_reg = 0x3c6c,
3050 	.hwcg_bit = 6,
3051 	.clkr = {
3052 		.enable_reg = 0x3c6c,
3053 		.enable_mask = BIT(4),
3054 		.hw.init = &(struct clk_init_data){
3055 			.name = "ce5_h_clk",
3056 			.parent_hws = (const struct clk_hw*[]){
3057 				&ce5_h_clk_src.clkr.hw,
3058 			},
3059 			.num_parents = 1,
3060 			.ops = &clk_branch_ops,
3061 			.flags = CLK_SET_RATE_PARENT,
3062 		},
3063 	},
3064 };
3065 
3066 static struct clk_regmap *gcc_ipq806x_clks[] = {
3067 	[PLL0] = &pll0.clkr,
3068 	[PLL0_VOTE] = &pll0_vote,
3069 	[PLL3] = &pll3.clkr,
3070 	[PLL4_VOTE] = &pll4_vote,
3071 	[PLL8] = &pll8.clkr,
3072 	[PLL8_VOTE] = &pll8_vote,
3073 	[PLL11] = &pll11.clkr,
3074 	[PLL14] = &pll14.clkr,
3075 	[PLL14_VOTE] = &pll14_vote,
3076 	[PLL18] = &pll18.clkr,
3077 	[GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
3078 	[GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
3079 	[GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
3080 	[GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
3081 	[GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
3082 	[GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
3083 	[GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
3084 	[GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
3085 	[GSBI6_UART_SRC] = &gsbi6_uart_src.clkr,
3086 	[GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr,
3087 	[GSBI7_UART_SRC] = &gsbi7_uart_src.clkr,
3088 	[GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr,
3089 	[GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
3090 	[GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
3091 	[GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
3092 	[GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
3093 	[GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
3094 	[GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
3095 	[GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
3096 	[GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
3097 	[GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr,
3098 	[GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr,
3099 	[GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr,
3100 	[GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr,
3101 	[GP0_SRC] = &gp0_src.clkr,
3102 	[GP0_CLK] = &gp0_clk.clkr,
3103 	[GP1_SRC] = &gp1_src.clkr,
3104 	[GP1_CLK] = &gp1_clk.clkr,
3105 	[GP2_SRC] = &gp2_src.clkr,
3106 	[GP2_CLK] = &gp2_clk.clkr,
3107 	[PMEM_A_CLK] = &pmem_clk.clkr,
3108 	[PRNG_SRC] = &prng_src.clkr,
3109 	[PRNG_CLK] = &prng_clk.clkr,
3110 	[SDC1_SRC] = &sdc1_src.clkr,
3111 	[SDC1_CLK] = &sdc1_clk.clkr,
3112 	[SDC3_SRC] = &sdc3_src.clkr,
3113 	[SDC3_CLK] = &sdc3_clk.clkr,
3114 	[TSIF_REF_SRC] = &tsif_ref_src.clkr,
3115 	[TSIF_REF_CLK] = &tsif_ref_clk.clkr,
3116 	[DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
3117 	[GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
3118 	[GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
3119 	[GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
3120 	[GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
3121 	[GSBI6_H_CLK] = &gsbi6_h_clk.clkr,
3122 	[GSBI7_H_CLK] = &gsbi7_h_clk.clkr,
3123 	[TSIF_H_CLK] = &tsif_h_clk.clkr,
3124 	[SDC1_H_CLK] = &sdc1_h_clk.clkr,
3125 	[SDC3_H_CLK] = &sdc3_h_clk.clkr,
3126 	[ADM0_CLK] = &adm0_clk.clkr,
3127 	[ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
3128 	[PCIE_A_CLK] = &pcie_a_clk.clkr,
3129 	[PCIE_AUX_CLK] = &pcie_aux_clk.clkr,
3130 	[PCIE_H_CLK] = &pcie_h_clk.clkr,
3131 	[PCIE_PHY_CLK] = &pcie_phy_clk.clkr,
3132 	[SFAB_SATA_S_H_CLK] = &sfab_sata_s_h_clk.clkr,
3133 	[PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
3134 	[PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
3135 	[PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
3136 	[RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
3137 	[SATA_H_CLK] = &sata_h_clk.clkr,
3138 	[SATA_CLK_SRC] = &sata_ref_src.clkr,
3139 	[SATA_RXOOB_CLK] = &sata_rxoob_clk.clkr,
3140 	[SATA_PMALIVE_CLK] = &sata_pmalive_clk.clkr,
3141 	[SATA_PHY_REF_CLK] = &sata_phy_ref_clk.clkr,
3142 	[SATA_A_CLK] = &sata_a_clk.clkr,
3143 	[SATA_PHY_CFG_CLK] = &sata_phy_cfg_clk.clkr,
3144 	[PCIE_ALT_REF_SRC] = &pcie_ref_src.clkr,
3145 	[PCIE_ALT_REF_CLK] = &pcie_ref_src_clk.clkr,
3146 	[PCIE_1_A_CLK] = &pcie1_a_clk.clkr,
3147 	[PCIE_1_AUX_CLK] = &pcie1_aux_clk.clkr,
3148 	[PCIE_1_H_CLK] = &pcie1_h_clk.clkr,
3149 	[PCIE_1_PHY_CLK] = &pcie1_phy_clk.clkr,
3150 	[PCIE_1_ALT_REF_SRC] = &pcie1_ref_src.clkr,
3151 	[PCIE_1_ALT_REF_CLK] = &pcie1_ref_src_clk.clkr,
3152 	[PCIE_2_A_CLK] = &pcie2_a_clk.clkr,
3153 	[PCIE_2_AUX_CLK] = &pcie2_aux_clk.clkr,
3154 	[PCIE_2_H_CLK] = &pcie2_h_clk.clkr,
3155 	[PCIE_2_PHY_CLK] = &pcie2_phy_clk.clkr,
3156 	[PCIE_2_ALT_REF_SRC] = &pcie2_ref_src.clkr,
3157 	[PCIE_2_ALT_REF_CLK] = &pcie2_ref_src_clk.clkr,
3158 	[USB30_MASTER_SRC] = &usb30_master_clk_src.clkr,
3159 	[USB30_0_MASTER_CLK] = &usb30_0_branch_clk.clkr,
3160 	[USB30_1_MASTER_CLK] = &usb30_1_branch_clk.clkr,
3161 	[USB30_UTMI_SRC] = &usb30_utmi_clk.clkr,
3162 	[USB30_0_UTMI_CLK] = &usb30_0_utmi_clk_ctl.clkr,
3163 	[USB30_1_UTMI_CLK] = &usb30_1_utmi_clk_ctl.clkr,
3164 	[USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
3165 	[USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_clk_src.clkr,
3166 	[USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
3167 	[USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr,
3168 	[USB_FS1_XCVR_SRC] = &usb_fs1_xcvr_clk_src.clkr,
3169 	[USB_FS1_XCVR_CLK] = &usb_fs1_xcvr_clk.clkr,
3170 	[USB_FS1_SYSTEM_CLK] = &usb_fs1_sys_clk.clkr,
3171 	[EBI2_CLK] = &ebi2_clk.clkr,
3172 	[EBI2_AON_CLK] = &ebi2_aon_clk.clkr,
3173 	[GMAC_CORE1_CLK_SRC] = &gmac_core1_src.clkr,
3174 	[GMAC_CORE1_CLK] = &gmac_core1_clk.clkr,
3175 	[GMAC_CORE2_CLK_SRC] = &gmac_core2_src.clkr,
3176 	[GMAC_CORE2_CLK] = &gmac_core2_clk.clkr,
3177 	[GMAC_CORE3_CLK_SRC] = &gmac_core3_src.clkr,
3178 	[GMAC_CORE3_CLK] = &gmac_core3_clk.clkr,
3179 	[GMAC_CORE4_CLK_SRC] = &gmac_core4_src.clkr,
3180 	[GMAC_CORE4_CLK] = &gmac_core4_clk.clkr,
3181 	[UBI32_CORE1_CLK_SRC] = &ubi32_core1_src_clk.clkr,
3182 	[UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr,
3183 	[NSSTCM_CLK_SRC] = &nss_tcm_src.clkr,
3184 	[NSSTCM_CLK] = &nss_tcm_clk.clkr,
3185 	[PLL9] = &hfpll0.clkr,
3186 	[PLL10] = &hfpll1.clkr,
3187 	[PLL12] = &hfpll_l2.clkr,
3188 	[CE5_A_CLK_SRC] = &ce5_a_clk_src.clkr,
3189 	[CE5_A_CLK] = &ce5_a_clk.clkr,
3190 	[CE5_H_CLK_SRC] = &ce5_h_clk_src.clkr,
3191 	[CE5_H_CLK] = &ce5_h_clk.clkr,
3192 	[CE5_CORE_CLK_SRC] = &ce5_core_src.clkr,
3193 	[CE5_CORE_CLK] = &ce5_core_clk.clkr,
3194 };
3195 
3196 static const struct qcom_reset_map gcc_ipq806x_resets[] = {
3197 	[QDSS_STM_RESET] = { 0x2060, 6 },
3198 	[AFAB_SMPSS_S_RESET] = { 0x20b8, 2 },
3199 	[AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 },
3200 	[AFAB_SMPSS_M0_RESET] = { 0x20b8, 0 },
3201 	[AFAB_EBI1_CH0_RESET] = { 0x20c0, 7 },
3202 	[AFAB_EBI1_CH1_RESET] = { 0x20c4, 7 },
3203 	[SFAB_ADM0_M0_RESET] = { 0x21e0, 7 },
3204 	[SFAB_ADM0_M1_RESET] = { 0x21e4, 7 },
3205 	[SFAB_ADM0_M2_RESET] = { 0x21e8, 7 },
3206 	[ADM0_C2_RESET] = { 0x220c, 4 },
3207 	[ADM0_C1_RESET] = { 0x220c, 3 },
3208 	[ADM0_C0_RESET] = { 0x220c, 2 },
3209 	[ADM0_PBUS_RESET] = { 0x220c, 1 },
3210 	[ADM0_RESET] = { 0x220c, 0 },
3211 	[QDSS_CLKS_SW_RESET] = { 0x2260, 5 },
3212 	[QDSS_POR_RESET] = { 0x2260, 4 },
3213 	[QDSS_TSCTR_RESET] = { 0x2260, 3 },
3214 	[QDSS_HRESET_RESET] = { 0x2260, 2 },
3215 	[QDSS_AXI_RESET] = { 0x2260, 1 },
3216 	[QDSS_DBG_RESET] = { 0x2260, 0 },
3217 	[SFAB_PCIE_M_RESET] = { 0x22d8, 1 },
3218 	[SFAB_PCIE_S_RESET] = { 0x22d8, 0 },
3219 	[PCIE_EXT_RESET] = { 0x22dc, 6 },
3220 	[PCIE_PHY_RESET] = { 0x22dc, 5 },
3221 	[PCIE_PCI_RESET] = { 0x22dc, 4 },
3222 	[PCIE_POR_RESET] = { 0x22dc, 3 },
3223 	[PCIE_HCLK_RESET] = { 0x22dc, 2 },
3224 	[PCIE_ACLK_RESET] = { 0x22dc, 0 },
3225 	[SFAB_LPASS_RESET] = { 0x23a0, 7 },
3226 	[SFAB_AFAB_M_RESET] = { 0x23e0, 7 },
3227 	[AFAB_SFAB_M0_RESET] = { 0x2420, 7 },
3228 	[AFAB_SFAB_M1_RESET] = { 0x2424, 7 },
3229 	[SFAB_SATA_S_RESET] = { 0x2480, 7 },
3230 	[SFAB_DFAB_M_RESET] = { 0x2500, 7 },
3231 	[DFAB_SFAB_M_RESET] = { 0x2520, 7 },
3232 	[DFAB_SWAY0_RESET] = { 0x2540, 7 },
3233 	[DFAB_SWAY1_RESET] = { 0x2544, 7 },
3234 	[DFAB_ARB0_RESET] = { 0x2560, 7 },
3235 	[DFAB_ARB1_RESET] = { 0x2564, 7 },
3236 	[PPSS_PROC_RESET] = { 0x2594, 1 },
3237 	[PPSS_RESET] = { 0x2594, 0 },
3238 	[DMA_BAM_RESET] = { 0x25c0, 7 },
3239 	[SPS_TIC_H_RESET] = { 0x2600, 7 },
3240 	[SFAB_CFPB_M_RESET] = { 0x2680, 7 },
3241 	[SFAB_CFPB_S_RESET] = { 0x26c0, 7 },
3242 	[TSIF_H_RESET] = { 0x2700, 7 },
3243 	[CE1_H_RESET] = { 0x2720, 7 },
3244 	[CE1_CORE_RESET] = { 0x2724, 7 },
3245 	[CE1_SLEEP_RESET] = { 0x2728, 7 },
3246 	[CE2_H_RESET] = { 0x2740, 7 },
3247 	[CE2_CORE_RESET] = { 0x2744, 7 },
3248 	[SFAB_SFPB_M_RESET] = { 0x2780, 7 },
3249 	[SFAB_SFPB_S_RESET] = { 0x27a0, 7 },
3250 	[RPM_PROC_RESET] = { 0x27c0, 7 },
3251 	[PMIC_SSBI2_RESET] = { 0x280c, 12 },
3252 	[SDC1_RESET] = { 0x2830, 0 },
3253 	[SDC2_RESET] = { 0x2850, 0 },
3254 	[SDC3_RESET] = { 0x2870, 0 },
3255 	[SDC4_RESET] = { 0x2890, 0 },
3256 	[USB_HS1_RESET] = { 0x2910, 0 },
3257 	[USB_HSIC_RESET] = { 0x2934, 0 },
3258 	[USB_FS1_XCVR_RESET] = { 0x2974, 1 },
3259 	[USB_FS1_RESET] = { 0x2974, 0 },
3260 	[GSBI1_RESET] = { 0x29dc, 0 },
3261 	[GSBI2_RESET] = { 0x29fc, 0 },
3262 	[GSBI3_RESET] = { 0x2a1c, 0 },
3263 	[GSBI4_RESET] = { 0x2a3c, 0 },
3264 	[GSBI5_RESET] = { 0x2a5c, 0 },
3265 	[GSBI6_RESET] = { 0x2a7c, 0 },
3266 	[GSBI7_RESET] = { 0x2a9c, 0 },
3267 	[SPDM_RESET] = { 0x2b6c, 0 },
3268 	[SEC_CTRL_RESET] = { 0x2b80, 7 },
3269 	[TLMM_H_RESET] = { 0x2ba0, 7 },
3270 	[SFAB_SATA_M_RESET] = { 0x2c18, 0 },
3271 	[SATA_RESET] = { 0x2c1c, 0 },
3272 	[TSSC_RESET] = { 0x2ca0, 7 },
3273 	[PDM_RESET] = { 0x2cc0, 12 },
3274 	[MPM_H_RESET] = { 0x2da0, 7 },
3275 	[MPM_RESET] = { 0x2da4, 0 },
3276 	[SFAB_SMPSS_S_RESET] = { 0x2e00, 7 },
3277 	[PRNG_RESET] = { 0x2e80, 12 },
3278 	[SFAB_CE3_M_RESET] = { 0x36c8, 1 },
3279 	[SFAB_CE3_S_RESET] = { 0x36c8, 0 },
3280 	[CE3_SLEEP_RESET] = { 0x36d0, 7 },
3281 	[PCIE_1_M_RESET] = { 0x3a98, 1 },
3282 	[PCIE_1_S_RESET] = { 0x3a98, 0 },
3283 	[PCIE_1_EXT_RESET] = { 0x3a9c, 6 },
3284 	[PCIE_1_PHY_RESET] = { 0x3a9c, 5 },
3285 	[PCIE_1_PCI_RESET] = { 0x3a9c, 4 },
3286 	[PCIE_1_POR_RESET] = { 0x3a9c, 3 },
3287 	[PCIE_1_HCLK_RESET] = { 0x3a9c, 2 },
3288 	[PCIE_1_ACLK_RESET] = { 0x3a9c, 0 },
3289 	[PCIE_2_M_RESET] = { 0x3ad8, 1 },
3290 	[PCIE_2_S_RESET] = { 0x3ad8, 0 },
3291 	[PCIE_2_EXT_RESET] = { 0x3adc, 6 },
3292 	[PCIE_2_PHY_RESET] = { 0x3adc, 5 },
3293 	[PCIE_2_PCI_RESET] = { 0x3adc, 4 },
3294 	[PCIE_2_POR_RESET] = { 0x3adc, 3 },
3295 	[PCIE_2_HCLK_RESET] = { 0x3adc, 2 },
3296 	[PCIE_2_ACLK_RESET] = { 0x3adc, 0 },
3297 	[SFAB_USB30_S_RESET] = { 0x3b54, 1 },
3298 	[SFAB_USB30_M_RESET] = { 0x3b54, 0 },
3299 	[USB30_0_PORT2_HS_PHY_RESET] = { 0x3b50, 5 },
3300 	[USB30_0_MASTER_RESET] = { 0x3b50, 4 },
3301 	[USB30_0_SLEEP_RESET] = { 0x3b50, 3 },
3302 	[USB30_0_UTMI_PHY_RESET] = { 0x3b50, 2 },
3303 	[USB30_0_POWERON_RESET] = { 0x3b50, 1 },
3304 	[USB30_0_PHY_RESET] = { 0x3b50, 0 },
3305 	[USB30_1_MASTER_RESET] = { 0x3b58, 4 },
3306 	[USB30_1_SLEEP_RESET] = { 0x3b58, 3 },
3307 	[USB30_1_UTMI_PHY_RESET] = { 0x3b58, 2 },
3308 	[USB30_1_POWERON_RESET] = { 0x3b58, 1 },
3309 	[USB30_1_PHY_RESET] = { 0x3b58, 0 },
3310 	[NSSFB0_RESET] = { 0x3b60, 6 },
3311 	[NSSFB1_RESET] = { 0x3b60, 7 },
3312 	[UBI32_CORE1_CLKRST_CLAMP_RESET] = { 0x3d3c, 3},
3313 	[UBI32_CORE1_CLAMP_RESET] = { 0x3d3c, 2 },
3314 	[UBI32_CORE1_AHB_RESET] = { 0x3d3c, 1 },
3315 	[UBI32_CORE1_AXI_RESET] = { 0x3d3c, 0 },
3316 	[UBI32_CORE2_CLKRST_CLAMP_RESET] = { 0x3d5c, 3 },
3317 	[UBI32_CORE2_CLAMP_RESET] = { 0x3d5c, 2 },
3318 	[UBI32_CORE2_AHB_RESET] = { 0x3d5c, 1 },
3319 	[UBI32_CORE2_AXI_RESET] = { 0x3d5c, 0 },
3320 	[GMAC_CORE1_RESET] = { 0x3cbc, 0 },
3321 	[GMAC_CORE2_RESET] = { 0x3cdc, 0 },
3322 	[GMAC_CORE3_RESET] = { 0x3cfc, 0 },
3323 	[GMAC_CORE4_RESET] = { 0x3d1c, 0 },
3324 	[GMAC_AHB_RESET] = { 0x3e24, 0 },
3325 	[CRYPTO_ENG1_RESET] = { 0x3e00, 0},
3326 	[CRYPTO_ENG2_RESET] = { 0x3e04, 0},
3327 	[CRYPTO_ENG3_RESET] = { 0x3e08, 0},
3328 	[CRYPTO_ENG4_RESET] = { 0x3e0c, 0},
3329 	[CRYPTO_AHB_RESET] = { 0x3e10, 0},
3330 	[NSS_CH0_RST_RX_CLK_N_RESET] = { 0x3b60, 0 },
3331 	[NSS_CH0_RST_TX_CLK_N_RESET] = { 0x3b60, 1 },
3332 	[NSS_CH0_RST_RX_125M_N_RESET] = { 0x3b60, 2 },
3333 	[NSS_CH0_HW_RST_RX_125M_N_RESET] = { 0x3b60, 3 },
3334 	[NSS_CH0_RST_TX_125M_N_RESET] = { 0x3b60, 4 },
3335 	[NSS_CH1_RST_RX_CLK_N_RESET] = { 0x3b60, 5 },
3336 	[NSS_CH1_RST_TX_CLK_N_RESET] = { 0x3b60, 6 },
3337 	[NSS_CH1_RST_RX_125M_N_RESET] = { 0x3b60, 7 },
3338 	[NSS_CH1_HW_RST_RX_125M_N_RESET] = { 0x3b60, 8 },
3339 	[NSS_CH1_RST_TX_125M_N_RESET] = { 0x3b60, 9 },
3340 	[NSS_CH2_RST_RX_CLK_N_RESET] = { 0x3b60, 10 },
3341 	[NSS_CH2_RST_TX_CLK_N_RESET] = { 0x3b60, 11 },
3342 	[NSS_CH2_RST_RX_125M_N_RESET] = { 0x3b60, 12 },
3343 	[NSS_CH2_HW_RST_RX_125M_N_RESET] = { 0x3b60, 13 },
3344 	[NSS_CH2_RST_TX_125M_N_RESET] = { 0x3b60, 14 },
3345 	[NSS_CH3_RST_RX_CLK_N_RESET] = { 0x3b60, 15 },
3346 	[NSS_CH3_RST_TX_CLK_N_RESET] = { 0x3b60, 16 },
3347 	[NSS_CH3_RST_RX_125M_N_RESET] = { 0x3b60, 17 },
3348 	[NSS_CH3_HW_RST_RX_125M_N_RESET] = { 0x3b60, 18 },
3349 	[NSS_CH3_RST_TX_125M_N_RESET] = { 0x3b60, 19 },
3350 	[NSS_RST_RX_250M_125M_N_RESET] = { 0x3b60, 20 },
3351 	[NSS_RST_TX_250M_125M_N_RESET] = { 0x3b60, 21 },
3352 	[NSS_QSGMII_TXPI_RST_N_RESET] = { 0x3b60, 22 },
3353 	[NSS_QSGMII_CDR_RST_N_RESET] = { 0x3b60, 23 },
3354 	[NSS_SGMII2_CDR_RST_N_RESET] = { 0x3b60, 24 },
3355 	[NSS_SGMII3_CDR_RST_N_RESET] = { 0x3b60, 25 },
3356 	[NSS_CAL_PRBS_RST_N_RESET] = { 0x3b60, 26 },
3357 	[NSS_LCKDT_RST_N_RESET] = { 0x3b60, 27 },
3358 	[NSS_SRDS_N_RESET] = { 0x3b60, 28 },
3359 };
3360 
3361 static const struct regmap_config gcc_ipq806x_regmap_config = {
3362 	.reg_bits	= 32,
3363 	.reg_stride	= 4,
3364 	.val_bits	= 32,
3365 	.max_register	= 0x3e40,
3366 	.fast_io	= true,
3367 };
3368 
3369 static const struct qcom_cc_desc gcc_ipq806x_desc = {
3370 	.config = &gcc_ipq806x_regmap_config,
3371 	.clks = gcc_ipq806x_clks,
3372 	.num_clks = ARRAY_SIZE(gcc_ipq806x_clks),
3373 	.resets = gcc_ipq806x_resets,
3374 	.num_resets = ARRAY_SIZE(gcc_ipq806x_resets),
3375 };
3376 
3377 static const struct of_device_id gcc_ipq806x_match_table[] = {
3378 	{ .compatible = "qcom,gcc-ipq8064" },
3379 	{ }
3380 };
3381 MODULE_DEVICE_TABLE(of, gcc_ipq806x_match_table);
3382 
3383 static int gcc_ipq806x_probe(struct platform_device *pdev)
3384 {
3385 	struct device *dev = &pdev->dev;
3386 	struct regmap *regmap;
3387 	int ret;
3388 
3389 	ret = qcom_cc_register_board_clk(dev, "cxo_board", "cxo", 25000000);
3390 	if (ret)
3391 		return ret;
3392 
3393 	ret = qcom_cc_register_board_clk(dev, "pxo_board", "pxo", 25000000);
3394 	if (ret)
3395 		return ret;
3396 
3397 	if (of_machine_is_compatible("qcom,ipq8065")) {
3398 		ubi32_core1_src_clk.freq_tbl = clk_tbl_nss_ipq8065;
3399 		ubi32_core2_src_clk.freq_tbl = clk_tbl_nss_ipq8065;
3400 	} else {
3401 		ubi32_core1_src_clk.freq_tbl = clk_tbl_nss_ipq8064;
3402 		ubi32_core2_src_clk.freq_tbl = clk_tbl_nss_ipq8064;
3403 	}
3404 
3405 	ret = qcom_cc_probe(pdev, &gcc_ipq806x_desc);
3406 	if (ret)
3407 		return ret;
3408 
3409 	regmap = dev_get_regmap(dev, NULL);
3410 	if (!regmap)
3411 		return -ENODEV;
3412 
3413 	/* Setup PLL18 static bits */
3414 	regmap_update_bits(regmap, 0x31a4, 0xffffffc0, 0x40000400);
3415 	regmap_write(regmap, 0x31b0, 0x3080);
3416 
3417 	/* Set GMAC footswitch sleep/wakeup values */
3418 	regmap_write(regmap, 0x3cb8, 8);
3419 	regmap_write(regmap, 0x3cd8, 8);
3420 	regmap_write(regmap, 0x3cf8, 8);
3421 	regmap_write(regmap, 0x3d18, 8);
3422 
3423 	return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
3424 }
3425 
3426 static struct platform_driver gcc_ipq806x_driver = {
3427 	.probe		= gcc_ipq806x_probe,
3428 	.driver		= {
3429 		.name	= "gcc-ipq806x",
3430 		.of_match_table = gcc_ipq806x_match_table,
3431 	},
3432 };
3433 
3434 static int __init gcc_ipq806x_init(void)
3435 {
3436 	return platform_driver_register(&gcc_ipq806x_driver);
3437 }
3438 core_initcall(gcc_ipq806x_init);
3439 
3440 static void __exit gcc_ipq806x_exit(void)
3441 {
3442 	platform_driver_unregister(&gcc_ipq806x_driver);
3443 }
3444 module_exit(gcc_ipq806x_exit);
3445 
3446 MODULE_DESCRIPTION("QCOM GCC IPQ806x Driver");
3447 MODULE_LICENSE("GPL v2");
3448 MODULE_ALIAS("platform:gcc-ipq806x");
3449