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