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