1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
4 */
5
6#include <linux/clk-provider.h>
7#include <linux/err.h>
8#include <linux/kernel.h>
9#include <linux/module.h>
10#include <linux/of.h>
11#include <linux/platform_device.h>
12#include <linux/regmap.h>
13
14#include <dt-bindings/clock/qcom,gcc-sc7180.h>
15
16#include "clk-alpha-pll.h"
17#include "clk-branch.h"
18#include "clk-rcg.h"
19#include "clk-regmap.h"
20#include "common.h"
21#include "gdsc.h"
22#include "reset.h"
23
24enum {
25	P_BI_TCXO,
26	P_GPLL0_OUT_EVEN,
27	P_GPLL0_OUT_MAIN,
28	P_GPLL1_OUT_MAIN,
29	P_GPLL4_OUT_MAIN,
30	P_GPLL6_OUT_MAIN,
31	P_GPLL7_OUT_MAIN,
32	P_SLEEP_CLK,
33};
34
35static struct clk_alpha_pll gpll0 = {
36	.offset = 0x0,
37	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
38	.clkr = {
39		.enable_reg = 0x52010,
40		.enable_mask = BIT(0),
41		.hw.init = &(struct clk_init_data){
42			.name = "gpll0",
43			.parent_data = &(const struct clk_parent_data){
44				.fw_name = "bi_tcxo",
45				.name = "bi_tcxo",
46			},
47			.num_parents = 1,
48			.ops = &clk_alpha_pll_fixed_fabia_ops,
49		},
50	},
51};
52
53static const struct clk_div_table post_div_table_gpll0_out_even[] = {
54	{ 0x1, 2 },
55	{ }
56};
57
58static struct clk_alpha_pll_postdiv gpll0_out_even = {
59	.offset = 0x0,
60	.post_div_shift = 8,
61	.post_div_table = post_div_table_gpll0_out_even,
62	.num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even),
63	.width = 4,
64	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
65	.clkr.hw.init = &(struct clk_init_data){
66		.name = "gpll0_out_even",
67		.parent_hws = (const struct clk_hw*[]){
68			&gpll0.clkr.hw,
69		},
70		.num_parents = 1,
71		.ops = &clk_alpha_pll_postdiv_fabia_ops,
72	},
73};
74
75static struct clk_fixed_factor gcc_pll0_main_div_cdiv = {
76	.mult = 1,
77	.div = 2,
78	.hw.init = &(struct clk_init_data){
79		.name = "gcc_pll0_main_div_cdiv",
80		.parent_hws = (const struct clk_hw*[]){
81			&gpll0.clkr.hw,
82		},
83		.num_parents = 1,
84		.ops = &clk_fixed_factor_ops,
85	},
86};
87
88static struct clk_alpha_pll gpll1 = {
89	.offset = 0x01000,
90	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
91	.clkr = {
92		.enable_reg = 0x52010,
93		.enable_mask = BIT(1),
94		.hw.init = &(struct clk_init_data){
95			.name = "gpll1",
96			.parent_data = &(const struct clk_parent_data){
97				.fw_name = "bi_tcxo",
98				.name = "bi_tcxo",
99			},
100			.num_parents = 1,
101			.ops = &clk_alpha_pll_fixed_fabia_ops,
102		},
103	},
104};
105
106static struct clk_alpha_pll gpll4 = {
107	.offset = 0x76000,
108	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
109	.clkr = {
110		.enable_reg = 0x52010,
111		.enable_mask = BIT(4),
112		.hw.init = &(struct clk_init_data){
113			.name = "gpll4",
114			.parent_data = &(const struct clk_parent_data){
115				.fw_name = "bi_tcxo",
116				.name = "bi_tcxo",
117			},
118			.num_parents = 1,
119			.ops = &clk_alpha_pll_fixed_fabia_ops,
120		},
121	},
122};
123
124static struct clk_alpha_pll gpll6 = {
125	.offset = 0x13000,
126	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
127	.clkr = {
128		.enable_reg = 0x52010,
129		.enable_mask = BIT(6),
130		.hw.init = &(struct clk_init_data){
131			.name = "gpll6",
132			.parent_data = &(const struct clk_parent_data){
133				.fw_name = "bi_tcxo",
134				.name = "bi_tcxo",
135			},
136			.num_parents = 1,
137			.ops = &clk_alpha_pll_fixed_fabia_ops,
138		},
139	},
140};
141
142static struct clk_alpha_pll gpll7 = {
143	.offset = 0x27000,
144	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
145	.clkr = {
146		.enable_reg = 0x52010,
147		.enable_mask = BIT(7),
148		.hw.init = &(struct clk_init_data){
149			.name = "gpll7",
150			.parent_data = &(const struct clk_parent_data){
151				.fw_name = "bi_tcxo",
152				.name = "bi_tcxo",
153			},
154			.num_parents = 1,
155			.ops = &clk_alpha_pll_fixed_fabia_ops,
156		},
157	},
158};
159
160static const struct parent_map gcc_parent_map_0[] = {
161	{ P_BI_TCXO, 0 },
162	{ P_GPLL0_OUT_MAIN, 1 },
163	{ P_GPLL0_OUT_EVEN, 6 },
164};
165
166static const struct clk_parent_data gcc_parent_data_0[] = {
167	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
168	{ .hw = &gpll0.clkr.hw },
169	{ .hw = &gpll0_out_even.clkr.hw },
170};
171
172static const struct clk_parent_data gcc_parent_data_0_ao[] = {
173	{ .fw_name = "bi_tcxo_ao", .name = "bi_tcxo_ao" },
174	{ .hw = &gpll0.clkr.hw },
175	{ .hw = &gpll0_out_even.clkr.hw },
176};
177
178static const struct parent_map gcc_parent_map_1[] = {
179	{ P_BI_TCXO, 0 },
180	{ P_GPLL0_OUT_MAIN, 1 },
181	{ P_GPLL6_OUT_MAIN, 2 },
182	{ P_GPLL0_OUT_EVEN, 6 },
183};
184
185static const struct clk_parent_data gcc_parent_data_1[] = {
186	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
187	{ .hw = &gpll0.clkr.hw },
188	{ .hw = &gpll6.clkr.hw },
189	{ .hw = &gpll0_out_even.clkr.hw },
190};
191
192static const struct parent_map gcc_parent_map_2[] = {
193	{ P_BI_TCXO, 0 },
194	{ P_GPLL0_OUT_MAIN, 1 },
195	{ P_GPLL1_OUT_MAIN, 4 },
196	{ P_GPLL4_OUT_MAIN, 5 },
197	{ P_GPLL0_OUT_EVEN, 6 },
198};
199
200static const struct clk_parent_data gcc_parent_data_2[] = {
201	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
202	{ .hw = &gpll0.clkr.hw },
203	{ .hw = &gpll1.clkr.hw },
204	{ .hw = &gpll4.clkr.hw },
205	{ .hw = &gpll0_out_even.clkr.hw },
206};
207
208static const struct parent_map gcc_parent_map_3[] = {
209	{ P_BI_TCXO, 0 },
210	{ P_GPLL0_OUT_MAIN, 1 },
211};
212
213static const struct clk_parent_data gcc_parent_data_3[] = {
214	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
215	{ .hw = &gpll0.clkr.hw },
216};
217
218static const struct parent_map gcc_parent_map_4[] = {
219	{ P_BI_TCXO, 0 },
220	{ P_GPLL0_OUT_MAIN, 1 },
221	{ P_SLEEP_CLK, 5 },
222	{ P_GPLL0_OUT_EVEN, 6 },
223};
224
225static const struct clk_parent_data gcc_parent_data_4[] = {
226	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
227	{ .hw = &gpll0.clkr.hw },
228	{ .fw_name = "sleep_clk", .name = "sleep_clk" },
229	{ .hw = &gpll0_out_even.clkr.hw },
230};
231
232static const struct parent_map gcc_parent_map_5[] = {
233	{ P_BI_TCXO, 0 },
234	{ P_GPLL0_OUT_MAIN, 1 },
235	{ P_GPLL7_OUT_MAIN, 3 },
236	{ P_GPLL0_OUT_EVEN, 6 },
237};
238
239static const struct clk_parent_data gcc_parent_data_5[] = {
240	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
241	{ .hw = &gpll0.clkr.hw },
242	{ .hw = &gpll7.clkr.hw },
243	{ .hw = &gpll0_out_even.clkr.hw },
244};
245
246static const struct parent_map gcc_parent_map_6[] = {
247	{ P_BI_TCXO, 0 },
248	{ P_GPLL0_OUT_MAIN, 1 },
249	{ P_SLEEP_CLK, 5 },
250};
251
252static const struct clk_parent_data gcc_parent_data_6[] = {
253	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
254	{ .hw = &gpll0.clkr.hw },
255	{ .fw_name = "sleep_clk", .name = "sleep_clk" },
256};
257
258static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
259	F(19200000, P_BI_TCXO, 1, 0, 0),
260	{ }
261};
262
263static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
264	.cmd_rcgr = 0x48014,
265	.mnd_width = 0,
266	.hid_width = 5,
267	.parent_map = gcc_parent_map_0,
268	.freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
269	.clkr.hw.init = &(struct clk_init_data){
270		.name = "gcc_cpuss_ahb_clk_src",
271		.parent_data = gcc_parent_data_0_ao,
272		.num_parents = ARRAY_SIZE(gcc_parent_data_0_ao),
273		.flags = CLK_SET_RATE_PARENT,
274		.ops = &clk_rcg2_ops,
275		},
276};
277
278static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
279	F(19200000, P_BI_TCXO, 1, 0, 0),
280	F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
281	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
282	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
283	F(200000000, P_GPLL0_OUT_EVEN, 1.5, 0, 0),
284	{ }
285};
286
287static struct clk_rcg2 gcc_gp1_clk_src = {
288	.cmd_rcgr = 0x64004,
289	.mnd_width = 8,
290	.hid_width = 5,
291	.parent_map = gcc_parent_map_4,
292	.freq_tbl = ftbl_gcc_gp1_clk_src,
293	.clkr.hw.init = &(struct clk_init_data){
294		.name = "gcc_gp1_clk_src",
295		.parent_data = gcc_parent_data_4,
296		.num_parents = ARRAY_SIZE(gcc_parent_data_4),
297		.ops = &clk_rcg2_ops,
298	},
299};
300
301static struct clk_rcg2 gcc_gp2_clk_src = {
302	.cmd_rcgr = 0x65004,
303	.mnd_width = 8,
304	.hid_width = 5,
305	.parent_map = gcc_parent_map_4,
306	.freq_tbl = ftbl_gcc_gp1_clk_src,
307	.clkr.hw.init = &(struct clk_init_data){
308		.name = "gcc_gp2_clk_src",
309		.parent_data = gcc_parent_data_4,
310		.num_parents = ARRAY_SIZE(gcc_parent_data_4),
311		.ops = &clk_rcg2_ops,
312	},
313};
314
315static struct clk_rcg2 gcc_gp3_clk_src = {
316	.cmd_rcgr = 0x66004,
317	.mnd_width = 8,
318	.hid_width = 5,
319	.parent_map = gcc_parent_map_4,
320	.freq_tbl = ftbl_gcc_gp1_clk_src,
321	.clkr.hw.init = &(struct clk_init_data){
322		.name = "gcc_gp3_clk_src",
323		.parent_data = gcc_parent_data_4,
324		.num_parents = ARRAY_SIZE(gcc_parent_data_4),
325		.ops = &clk_rcg2_ops,
326	},
327};
328
329static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
330	F(19200000, P_BI_TCXO, 1, 0, 0),
331	F(60000000, P_GPLL0_OUT_EVEN, 5, 0, 0),
332	{ }
333};
334
335static struct clk_rcg2 gcc_pdm2_clk_src = {
336	.cmd_rcgr = 0x33010,
337	.mnd_width = 0,
338	.hid_width = 5,
339	.parent_map = gcc_parent_map_0,
340	.freq_tbl = ftbl_gcc_pdm2_clk_src,
341	.clkr.hw.init = &(struct clk_init_data){
342		.name = "gcc_pdm2_clk_src",
343		.parent_data = gcc_parent_data_0,
344		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
345		.ops = &clk_rcg2_ops,
346	},
347};
348
349static const struct freq_tbl ftbl_gcc_qspi_core_clk_src[] = {
350	F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
351	F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
352	F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
353	{ }
354};
355
356static struct clk_rcg2 gcc_qspi_core_clk_src = {
357	.cmd_rcgr = 0x4b00c,
358	.mnd_width = 0,
359	.hid_width = 5,
360	.parent_map = gcc_parent_map_2,
361	.freq_tbl = ftbl_gcc_qspi_core_clk_src,
362	.clkr.hw.init = &(struct clk_init_data){
363		.name = "gcc_qspi_core_clk_src",
364		.parent_data = gcc_parent_data_2,
365		.num_parents = ARRAY_SIZE(gcc_parent_data_2),
366		.ops = &clk_rcg2_ops,
367	},
368};
369
370static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
371	F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625),
372	F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625),
373	F(19200000, P_BI_TCXO, 1, 0, 0),
374	F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625),
375	F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75),
376	F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25),
377	F(51200000, P_GPLL6_OUT_MAIN, 7.5, 0, 0),
378	F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75),
379	F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
380	F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15),
381	F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25),
382	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
383	F(102400000, P_GPLL0_OUT_EVEN, 1, 128, 375),
384	F(112000000, P_GPLL0_OUT_EVEN, 1, 28, 75),
385	F(117964800, P_GPLL0_OUT_EVEN, 1, 6144, 15625),
386	F(120000000, P_GPLL0_OUT_EVEN, 2.5, 0, 0),
387	F(128000000, P_GPLL6_OUT_MAIN, 3, 0, 0),
388	{ }
389};
390
391static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = {
392	.name = "gcc_qupv3_wrap0_s0_clk_src",
393	.parent_data = gcc_parent_data_1,
394	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
395	.ops = &clk_rcg2_ops,
396};
397
398static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
399	.cmd_rcgr = 0x17034,
400	.mnd_width = 16,
401	.hid_width = 5,
402	.parent_map = gcc_parent_map_1,
403	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
404	.clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init,
405};
406
407static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
408	.name = "gcc_qupv3_wrap0_s1_clk_src",
409	.parent_data = gcc_parent_data_1,
410	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
411	.ops = &clk_rcg2_ops,
412};
413
414static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
415	.cmd_rcgr = 0x17164,
416	.mnd_width = 16,
417	.hid_width = 5,
418	.parent_map = gcc_parent_map_1,
419	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
420	.clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init,
421};
422
423static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
424	.name = "gcc_qupv3_wrap0_s2_clk_src",
425	.parent_data = gcc_parent_data_1,
426	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
427	.ops = &clk_rcg2_ops,
428};
429
430static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
431	.cmd_rcgr = 0x17294,
432	.mnd_width = 16,
433	.hid_width = 5,
434	.parent_map = gcc_parent_map_1,
435	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
436	.clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init,
437};
438
439static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
440	.name = "gcc_qupv3_wrap0_s3_clk_src",
441	.parent_data = gcc_parent_data_1,
442	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
443	.ops = &clk_rcg2_ops,
444};
445
446static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
447	.cmd_rcgr = 0x173c4,
448	.mnd_width = 16,
449	.hid_width = 5,
450	.parent_map = gcc_parent_map_1,
451	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
452	.clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init,
453};
454
455static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
456	.name = "gcc_qupv3_wrap0_s4_clk_src",
457	.parent_data = gcc_parent_data_1,
458	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
459	.ops = &clk_rcg2_ops,
460};
461
462static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
463	.cmd_rcgr = 0x174f4,
464	.mnd_width = 16,
465	.hid_width = 5,
466	.parent_map = gcc_parent_map_1,
467	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
468	.clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init,
469};
470
471static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
472	.name = "gcc_qupv3_wrap0_s5_clk_src",
473	.parent_data = gcc_parent_data_1,
474	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
475	.ops = &clk_rcg2_ops,
476};
477
478static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
479	.cmd_rcgr = 0x17624,
480	.mnd_width = 16,
481	.hid_width = 5,
482	.parent_map = gcc_parent_map_1,
483	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
484	.clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
485};
486
487static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
488	.name = "gcc_qupv3_wrap1_s0_clk_src",
489	.parent_data = gcc_parent_data_1,
490	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
491	.ops = &clk_rcg2_ops,
492};
493
494static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
495	.cmd_rcgr = 0x18018,
496	.mnd_width = 16,
497	.hid_width = 5,
498	.parent_map = gcc_parent_map_1,
499	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
500	.clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init,
501};
502
503static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
504	.name = "gcc_qupv3_wrap1_s1_clk_src",
505	.parent_data = gcc_parent_data_1,
506	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
507	.ops = &clk_rcg2_ops,
508};
509
510static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
511	.cmd_rcgr = 0x18148,
512	.mnd_width = 16,
513	.hid_width = 5,
514	.parent_map = gcc_parent_map_1,
515	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
516	.clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init,
517};
518
519static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
520	.name = "gcc_qupv3_wrap1_s2_clk_src",
521	.parent_data = gcc_parent_data_1,
522	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
523	.ops = &clk_rcg2_ops,
524};
525
526static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
527	.cmd_rcgr = 0x18278,
528	.mnd_width = 16,
529	.hid_width = 5,
530	.parent_map = gcc_parent_map_1,
531	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
532	.clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init,
533};
534
535static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
536	.name = "gcc_qupv3_wrap1_s3_clk_src",
537	.parent_data = gcc_parent_data_1,
538	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
539	.ops = &clk_rcg2_ops,
540};
541
542static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
543	.cmd_rcgr = 0x183a8,
544	.mnd_width = 16,
545	.hid_width = 5,
546	.parent_map = gcc_parent_map_1,
547	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
548	.clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init,
549};
550
551static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
552	.name = "gcc_qupv3_wrap1_s4_clk_src",
553	.parent_data = gcc_parent_data_1,
554	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
555	.ops = &clk_rcg2_ops,
556};
557
558static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
559	.cmd_rcgr = 0x184d8,
560	.mnd_width = 16,
561	.hid_width = 5,
562	.parent_map = gcc_parent_map_1,
563	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
564	.clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init,
565};
566
567static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
568	.name = "gcc_qupv3_wrap1_s5_clk_src",
569	.parent_data = gcc_parent_data_1,
570	.num_parents = ARRAY_SIZE(gcc_parent_data_1),
571	.ops = &clk_rcg2_ops,
572};
573
574static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
575	.cmd_rcgr = 0x18608,
576	.mnd_width = 16,
577	.hid_width = 5,
578	.parent_map = gcc_parent_map_1,
579	.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
580	.clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init,
581};
582
583
584static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
585	F(144000, P_BI_TCXO, 16, 3, 25),
586	F(400000, P_BI_TCXO, 12, 1, 4),
587	F(19200000, P_BI_TCXO, 1, 0, 0),
588	F(20000000, P_GPLL0_OUT_EVEN, 5, 1, 3),
589	F(25000000, P_GPLL0_OUT_EVEN, 6, 1, 2),
590	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
591	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
592	F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
593	F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
594	{ }
595};
596
597static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
598	.cmd_rcgr = 0x12028,
599	.mnd_width = 8,
600	.hid_width = 5,
601	.parent_map = gcc_parent_map_1,
602	.freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
603	.clkr.hw.init = &(struct clk_init_data){
604		.name = "gcc_sdcc1_apps_clk_src",
605		.parent_data = gcc_parent_data_1,
606		.num_parents = ARRAY_SIZE(gcc_parent_data_1),
607		.ops = &clk_rcg2_floor_ops,
608	},
609};
610
611static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
612	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
613	F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
614	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
615	F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
616	{ }
617};
618
619static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
620	.cmd_rcgr = 0x12010,
621	.mnd_width = 0,
622	.hid_width = 5,
623	.parent_map = gcc_parent_map_0,
624	.freq_tbl = ftbl_gcc_sdcc1_ice_core_clk_src,
625	.clkr.hw.init = &(struct clk_init_data){
626		.name = "gcc_sdcc1_ice_core_clk_src",
627		.parent_data = gcc_parent_data_0,
628		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
629		.ops = &clk_rcg2_ops,
630	},
631};
632
633static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
634	F(400000, P_BI_TCXO, 12, 1, 4),
635	F(9600000, P_BI_TCXO, 2, 0, 0),
636	F(19200000, P_BI_TCXO, 1, 0, 0),
637	F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
638	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
639	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
640	F(202000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
641	{ }
642};
643
644static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
645	.cmd_rcgr = 0x1400c,
646	.mnd_width = 8,
647	.hid_width = 5,
648	.parent_map = gcc_parent_map_5,
649	.freq_tbl = ftbl_gcc_sdcc2_apps_clk_src,
650	.clkr.hw.init = &(struct clk_init_data){
651		.name = "gcc_sdcc2_apps_clk_src",
652		.parent_data = gcc_parent_data_5,
653		.num_parents = ARRAY_SIZE(gcc_parent_data_5),
654		.flags = CLK_OPS_PARENT_ENABLE,
655		.ops = &clk_rcg2_floor_ops,
656	},
657};
658
659static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
660	F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
661	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
662	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
663	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
664	F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
665	{ }
666};
667
668static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
669	.cmd_rcgr = 0x77020,
670	.mnd_width = 8,
671	.hid_width = 5,
672	.parent_map = gcc_parent_map_0,
673	.freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src,
674	.clkr.hw.init = &(struct clk_init_data){
675		.name = "gcc_ufs_phy_axi_clk_src",
676		.parent_data = gcc_parent_data_0,
677		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
678		.ops = &clk_rcg2_ops,
679	},
680};
681
682static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = {
683	F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
684	F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
685	F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
686	F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
687	{ }
688};
689
690static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
691	.cmd_rcgr = 0x77048,
692	.mnd_width = 0,
693	.hid_width = 5,
694	.parent_map = gcc_parent_map_0,
695	.freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src,
696	.clkr.hw.init = &(struct clk_init_data){
697		.name = "gcc_ufs_phy_ice_core_clk_src",
698		.parent_data = gcc_parent_data_0,
699		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
700		.ops = &clk_rcg2_ops,
701	},
702};
703
704static const struct freq_tbl ftbl_gcc_ufs_phy_phy_aux_clk_src[] = {
705	F(9600000, P_BI_TCXO, 2, 0, 0),
706	F(19200000, P_BI_TCXO, 1, 0, 0),
707	{ }
708};
709
710static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
711	.cmd_rcgr = 0x77098,
712	.mnd_width = 0,
713	.hid_width = 5,
714	.parent_map = gcc_parent_map_3,
715	.freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src,
716	.clkr.hw.init = &(struct clk_init_data){
717		.name = "gcc_ufs_phy_phy_aux_clk_src",
718		.parent_data = gcc_parent_data_3,
719		.num_parents = ARRAY_SIZE(gcc_parent_data_3),
720		.ops = &clk_rcg2_ops,
721	},
722};
723
724static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = {
725	F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
726	F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
727	F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
728	{ }
729};
730
731static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
732	.cmd_rcgr = 0x77060,
733	.mnd_width = 0,
734	.hid_width = 5,
735	.parent_map = gcc_parent_map_0,
736	.freq_tbl = ftbl_gcc_ufs_phy_unipro_core_clk_src,
737	.clkr.hw.init = &(struct clk_init_data){
738		.name = "gcc_ufs_phy_unipro_core_clk_src",
739		.parent_data = gcc_parent_data_0,
740		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
741		.ops = &clk_rcg2_ops,
742	},
743};
744
745static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
746	F(66666667, P_GPLL0_OUT_EVEN, 4.5, 0, 0),
747	F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
748	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
749	F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
750	{ }
751};
752
753static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
754	.cmd_rcgr = 0xf01c,
755	.mnd_width = 8,
756	.hid_width = 5,
757	.parent_map = gcc_parent_map_0,
758	.freq_tbl = ftbl_gcc_usb30_prim_master_clk_src,
759	.clkr.hw.init = &(struct clk_init_data){
760		.name = "gcc_usb30_prim_master_clk_src",
761		.parent_data = gcc_parent_data_0,
762		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
763		.ops = &clk_rcg2_ops,
764	},
765};
766
767static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = {
768	F(19200000, P_BI_TCXO, 1, 0, 0),
769	F(20000000, P_GPLL0_OUT_EVEN, 15, 0, 0),
770	{ }
771};
772
773static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
774	.cmd_rcgr = 0xf034,
775	.mnd_width = 0,
776	.hid_width = 5,
777	.parent_map = gcc_parent_map_0,
778	.freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
779	.clkr.hw.init = &(struct clk_init_data){
780		.name = "gcc_usb30_prim_mock_utmi_clk_src",
781		.parent_data = gcc_parent_data_0,
782		.num_parents = ARRAY_SIZE(gcc_parent_data_0),
783		.ops = &clk_rcg2_ops,
784	},
785};
786
787static const struct freq_tbl ftbl_gcc_usb3_prim_phy_aux_clk_src[] = {
788	F(19200000, P_BI_TCXO, 1, 0, 0),
789	{ }
790};
791
792static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
793	.cmd_rcgr = 0xf060,
794	.mnd_width = 0,
795	.hid_width = 5,
796	.parent_map = gcc_parent_map_6,
797	.freq_tbl = ftbl_gcc_usb3_prim_phy_aux_clk_src,
798	.clkr.hw.init = &(struct clk_init_data){
799		.name = "gcc_usb3_prim_phy_aux_clk_src",
800		.parent_data = gcc_parent_data_6,
801		.num_parents = ARRAY_SIZE(gcc_parent_data_6),
802		.ops = &clk_rcg2_ops,
803	},
804};
805
806static const struct freq_tbl ftbl_gcc_sec_ctrl_clk_src[] = {
807	F(4800000, P_BI_TCXO, 4, 0, 0),
808	F(19200000, P_BI_TCXO, 1, 0, 0),
809	{ }
810};
811
812static struct clk_rcg2 gcc_sec_ctrl_clk_src = {
813	.cmd_rcgr = 0x3d030,
814	.mnd_width = 0,
815	.hid_width = 5,
816	.parent_map = gcc_parent_map_3,
817	.freq_tbl = ftbl_gcc_sec_ctrl_clk_src,
818	.clkr.hw.init = &(struct clk_init_data){
819		.name = "gcc_sec_ctrl_clk_src",
820		.parent_data = gcc_parent_data_3,
821		.num_parents = ARRAY_SIZE(gcc_parent_data_3),
822		.ops = &clk_rcg2_ops,
823	},
824};
825
826static struct clk_branch gcc_aggre_ufs_phy_axi_clk = {
827	.halt_reg = 0x82024,
828	.halt_check = BRANCH_HALT_DELAY,
829	.hwcg_reg = 0x82024,
830	.hwcg_bit = 1,
831	.clkr = {
832		.enable_reg = 0x82024,
833		.enable_mask = BIT(0),
834		.hw.init = &(struct clk_init_data){
835			.name = "gcc_aggre_ufs_phy_axi_clk",
836			.parent_hws = (const struct clk_hw*[]){
837				&gcc_ufs_phy_axi_clk_src.clkr.hw,
838			},
839			.num_parents = 1,
840			.flags = CLK_SET_RATE_PARENT,
841			.ops = &clk_branch2_ops,
842		},
843	},
844};
845
846static struct clk_branch gcc_aggre_usb3_prim_axi_clk = {
847	.halt_reg = 0x8201c,
848	.halt_check = BRANCH_HALT,
849	.clkr = {
850		.enable_reg = 0x8201c,
851		.enable_mask = BIT(0),
852		.hw.init = &(struct clk_init_data){
853			.name = "gcc_aggre_usb3_prim_axi_clk",
854			.parent_hws = (const struct clk_hw*[]){
855				&gcc_usb30_prim_master_clk_src.clkr.hw,
856			},
857			.num_parents = 1,
858			.flags = CLK_SET_RATE_PARENT,
859			.ops = &clk_branch2_ops,
860		},
861	},
862};
863
864static struct clk_branch gcc_boot_rom_ahb_clk = {
865	.halt_reg = 0x38004,
866	.halt_check = BRANCH_HALT_VOTED,
867	.hwcg_reg = 0x38004,
868	.hwcg_bit = 1,
869	.clkr = {
870		.enable_reg = 0x52000,
871		.enable_mask = BIT(10),
872		.hw.init = &(struct clk_init_data){
873			.name = "gcc_boot_rom_ahb_clk",
874			.ops = &clk_branch2_ops,
875		},
876	},
877};
878
879static struct clk_branch gcc_camera_hf_axi_clk = {
880	.halt_reg = 0xb020,
881	.halt_check = BRANCH_HALT,
882	.clkr = {
883		.enable_reg = 0xb020,
884		.enable_mask = BIT(0),
885		.hw.init = &(struct clk_init_data){
886			.name = "gcc_camera_hf_axi_clk",
887			.ops = &clk_branch2_ops,
888		},
889	},
890};
891
892static struct clk_branch gcc_camera_throttle_hf_axi_clk = {
893	.halt_reg = 0xb080,
894	.halt_check = BRANCH_HALT,
895	.hwcg_reg = 0xb080,
896	.hwcg_bit = 1,
897	.clkr = {
898		.enable_reg = 0xb080,
899		.enable_mask = BIT(0),
900		.hw.init = &(struct clk_init_data){
901			.name = "gcc_camera_throttle_hf_axi_clk",
902			.ops = &clk_branch2_ops,
903		},
904	},
905};
906
907static struct clk_branch gcc_ce1_ahb_clk = {
908	.halt_reg = 0x4100c,
909	.halt_check = BRANCH_HALT_VOTED,
910	.hwcg_reg = 0x4100c,
911	.hwcg_bit = 1,
912	.clkr = {
913		.enable_reg = 0x52000,
914		.enable_mask = BIT(3),
915		.hw.init = &(struct clk_init_data){
916			.name = "gcc_ce1_ahb_clk",
917			.ops = &clk_branch2_ops,
918		},
919	},
920};
921
922static struct clk_branch gcc_ce1_axi_clk = {
923	.halt_reg = 0x41008,
924	.halt_check = BRANCH_HALT_VOTED,
925	.clkr = {
926		.enable_reg = 0x52000,
927		.enable_mask = BIT(4),
928		.hw.init = &(struct clk_init_data){
929			.name = "gcc_ce1_axi_clk",
930			.ops = &clk_branch2_ops,
931		},
932	},
933};
934
935static struct clk_branch gcc_ce1_clk = {
936	.halt_reg = 0x41004,
937	.halt_check = BRANCH_HALT_VOTED,
938	.clkr = {
939		.enable_reg = 0x52000,
940		.enable_mask = BIT(5),
941		.hw.init = &(struct clk_init_data){
942			.name = "gcc_ce1_clk",
943			.ops = &clk_branch2_ops,
944		},
945	},
946};
947
948static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = {
949	.halt_reg = 0x502c,
950	.halt_check = BRANCH_HALT,
951	.clkr = {
952		.enable_reg = 0x502c,
953		.enable_mask = BIT(0),
954		.hw.init = &(struct clk_init_data){
955			.name = "gcc_cfg_noc_usb3_prim_axi_clk",
956			.parent_hws = (const struct clk_hw*[]){
957				&gcc_usb30_prim_master_clk_src.clkr.hw,
958			},
959			.num_parents = 1,
960			.flags = CLK_SET_RATE_PARENT,
961			.ops = &clk_branch2_ops,
962		},
963	},
964};
965
966/* For CPUSS functionality the AHB clock needs to be left enabled */
967static struct clk_branch gcc_cpuss_ahb_clk = {
968	.halt_reg = 0x48000,
969	.halt_check = BRANCH_HALT_VOTED,
970	.clkr = {
971		.enable_reg = 0x52000,
972		.enable_mask = BIT(21),
973		.hw.init = &(struct clk_init_data){
974			.name = "gcc_cpuss_ahb_clk",
975			.parent_hws = (const struct clk_hw*[]){
976				&gcc_cpuss_ahb_clk_src.clkr.hw,
977			},
978			.num_parents = 1,
979			.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
980			.ops = &clk_branch2_ops,
981		},
982	},
983};
984
985static struct clk_branch gcc_cpuss_rbcpr_clk = {
986	.halt_reg = 0x48008,
987	.halt_check = BRANCH_HALT,
988	.clkr = {
989		.enable_reg = 0x48008,
990		.enable_mask = BIT(0),
991		.hw.init = &(struct clk_init_data){
992			.name = "gcc_cpuss_rbcpr_clk",
993			.ops = &clk_branch2_ops,
994		},
995	},
996};
997
998static struct clk_branch gcc_ddrss_gpu_axi_clk = {
999	.halt_reg = 0x4452c,
1000	.halt_check = BRANCH_VOTED,
1001	.clkr = {
1002		.enable_reg = 0x4452c,
1003		.enable_mask = BIT(0),
1004		.hw.init = &(struct clk_init_data){
1005			.name = "gcc_ddrss_gpu_axi_clk",
1006			.ops = &clk_branch2_ops,
1007		},
1008	},
1009};
1010
1011static struct clk_branch gcc_disp_gpll0_clk_src = {
1012	.halt_check = BRANCH_HALT_DELAY,
1013	.clkr = {
1014		.enable_reg = 0x52000,
1015		.enable_mask = BIT(18),
1016		.hw.init = &(struct clk_init_data){
1017			.name = "gcc_disp_gpll0_clk_src",
1018			.parent_hws = (const struct clk_hw*[]){
1019				&gpll0.clkr.hw,
1020			},
1021			.num_parents = 1,
1022			.ops = &clk_branch2_aon_ops,
1023		},
1024	},
1025};
1026
1027static struct clk_branch gcc_disp_gpll0_div_clk_src = {
1028	.halt_check = BRANCH_HALT_DELAY,
1029	.clkr = {
1030		.enable_reg = 0x52000,
1031		.enable_mask = BIT(19),
1032		.hw.init = &(struct clk_init_data){
1033			.name = "gcc_disp_gpll0_div_clk_src",
1034			.parent_hws = (const struct clk_hw*[]){
1035				&gcc_pll0_main_div_cdiv.hw,
1036			},
1037			.num_parents = 1,
1038			.ops = &clk_branch2_ops,
1039		},
1040	},
1041};
1042
1043static struct clk_branch gcc_disp_hf_axi_clk = {
1044	.halt_reg = 0xb024,
1045	.halt_check = BRANCH_HALT,
1046	.clkr = {
1047		.enable_reg = 0xb024,
1048		.enable_mask = BIT(0),
1049		.hw.init = &(struct clk_init_data){
1050			.name = "gcc_disp_hf_axi_clk",
1051			.ops = &clk_branch2_ops,
1052		},
1053	},
1054};
1055
1056static struct clk_branch gcc_disp_throttle_hf_axi_clk = {
1057	.halt_reg = 0xb084,
1058	.halt_check = BRANCH_HALT,
1059	.hwcg_reg = 0xb084,
1060	.hwcg_bit = 1,
1061	.clkr = {
1062		.enable_reg = 0xb084,
1063		.enable_mask = BIT(0),
1064		.hw.init = &(struct clk_init_data){
1065			.name = "gcc_disp_throttle_hf_axi_clk",
1066			.ops = &clk_branch2_ops,
1067		},
1068	},
1069};
1070
1071static struct clk_branch gcc_gp1_clk = {
1072	.halt_reg = 0x64000,
1073	.halt_check = BRANCH_HALT,
1074	.clkr = {
1075		.enable_reg = 0x64000,
1076		.enable_mask = BIT(0),
1077		.hw.init = &(struct clk_init_data){
1078			.name = "gcc_gp1_clk",
1079			.parent_hws = (const struct clk_hw*[]){
1080				&gcc_gp1_clk_src.clkr.hw,
1081			},
1082			.num_parents = 1,
1083			.flags = CLK_SET_RATE_PARENT,
1084			.ops = &clk_branch2_ops,
1085		},
1086	},
1087};
1088
1089static struct clk_branch gcc_gp2_clk = {
1090	.halt_reg = 0x65000,
1091	.halt_check = BRANCH_HALT,
1092	.clkr = {
1093		.enable_reg = 0x65000,
1094		.enable_mask = BIT(0),
1095		.hw.init = &(struct clk_init_data){
1096			.name = "gcc_gp2_clk",
1097			.parent_hws = (const struct clk_hw*[]){
1098				&gcc_gp2_clk_src.clkr.hw,
1099			},
1100			.num_parents = 1,
1101			.flags = CLK_SET_RATE_PARENT,
1102			.ops = &clk_branch2_ops,
1103		},
1104	},
1105};
1106
1107static struct clk_branch gcc_gp3_clk = {
1108	.halt_reg = 0x66000,
1109	.halt_check = BRANCH_HALT,
1110	.clkr = {
1111		.enable_reg = 0x66000,
1112		.enable_mask = BIT(0),
1113		.hw.init = &(struct clk_init_data){
1114			.name = "gcc_gp3_clk",
1115			.parent_hws = (const struct clk_hw*[]){
1116				&gcc_gp3_clk_src.clkr.hw,
1117			},
1118			.num_parents = 1,
1119			.flags = CLK_SET_RATE_PARENT,
1120			.ops = &clk_branch2_ops,
1121		},
1122	},
1123};
1124
1125static struct clk_branch gcc_gpu_gpll0_clk_src = {
1126	.halt_check = BRANCH_HALT_DELAY,
1127	.clkr = {
1128		.enable_reg = 0x52000,
1129		.enable_mask = BIT(15),
1130		.hw.init = &(struct clk_init_data){
1131			.name = "gcc_gpu_gpll0_clk_src",
1132			.parent_hws = (const struct clk_hw*[]){
1133				&gpll0.clkr.hw,
1134			},
1135			.num_parents = 1,
1136			.ops = &clk_branch2_ops,
1137		},
1138	},
1139};
1140
1141static struct clk_branch gcc_gpu_gpll0_div_clk_src = {
1142	.halt_check = BRANCH_HALT_DELAY,
1143	.clkr = {
1144		.enable_reg = 0x52000,
1145		.enable_mask = BIT(16),
1146		.hw.init = &(struct clk_init_data){
1147			.name = "gcc_gpu_gpll0_div_clk_src",
1148			.parent_hws = (const struct clk_hw*[]){
1149				&gcc_pll0_main_div_cdiv.hw,
1150			},
1151			.num_parents = 1,
1152			.ops = &clk_branch2_ops,
1153		},
1154	},
1155};
1156
1157static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
1158	.halt_reg = 0x7100c,
1159	.halt_check = BRANCH_VOTED,
1160	.clkr = {
1161		.enable_reg = 0x7100c,
1162		.enable_mask = BIT(0),
1163		.hw.init = &(struct clk_init_data){
1164			.name = "gcc_gpu_memnoc_gfx_clk",
1165			.ops = &clk_branch2_ops,
1166		},
1167	},
1168};
1169
1170static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = {
1171	.halt_reg = 0x71018,
1172	.halt_check = BRANCH_HALT,
1173	.clkr = {
1174		.enable_reg = 0x71018,
1175		.enable_mask = BIT(0),
1176		.hw.init = &(struct clk_init_data){
1177			.name = "gcc_gpu_snoc_dvm_gfx_clk",
1178			.ops = &clk_branch2_ops,
1179		},
1180	},
1181};
1182
1183static struct clk_branch gcc_npu_axi_clk = {
1184	.halt_reg = 0x4d008,
1185	.halt_check = BRANCH_HALT,
1186	.clkr = {
1187		.enable_reg = 0x4d008,
1188		.enable_mask = BIT(0),
1189		.hw.init = &(struct clk_init_data){
1190			.name = "gcc_npu_axi_clk",
1191			.ops = &clk_branch2_ops,
1192		},
1193	},
1194};
1195
1196static struct clk_branch gcc_npu_bwmon_axi_clk = {
1197	.halt_reg = 0x73008,
1198	.halt_check = BRANCH_HALT,
1199	.clkr = {
1200		.enable_reg = 0x73008,
1201		.enable_mask = BIT(0),
1202		.hw.init = &(struct clk_init_data){
1203			.name = "gcc_npu_bwmon_axi_clk",
1204			.ops = &clk_branch2_ops,
1205		},
1206	},
1207};
1208
1209static struct clk_branch gcc_npu_bwmon_dma_cfg_ahb_clk = {
1210	.halt_reg = 0x73018,
1211	.halt_check = BRANCH_HALT,
1212	.clkr = {
1213		.enable_reg = 0x73018,
1214		.enable_mask = BIT(0),
1215		.hw.init = &(struct clk_init_data){
1216			.name = "gcc_npu_bwmon_dma_cfg_ahb_clk",
1217			.ops = &clk_branch2_ops,
1218		},
1219	},
1220};
1221
1222static struct clk_branch gcc_npu_bwmon_dsp_cfg_ahb_clk = {
1223	.halt_reg = 0x7301c,
1224	.halt_check = BRANCH_HALT,
1225	.clkr = {
1226		.enable_reg = 0x7301c,
1227		.enable_mask = BIT(0),
1228		.hw.init = &(struct clk_init_data){
1229			.name = "gcc_npu_bwmon_dsp_cfg_ahb_clk",
1230			.ops = &clk_branch2_ops,
1231		},
1232	},
1233};
1234
1235static struct clk_branch gcc_npu_cfg_ahb_clk = {
1236	.halt_reg = 0x4d004,
1237	.halt_check = BRANCH_HALT,
1238	.hwcg_reg = 0x4d004,
1239	.hwcg_bit = 1,
1240	.clkr = {
1241		.enable_reg = 0x4d004,
1242		.enable_mask = BIT(0),
1243		.hw.init = &(struct clk_init_data){
1244			.name = "gcc_npu_cfg_ahb_clk",
1245			.ops = &clk_branch2_ops,
1246		},
1247	},
1248};
1249
1250static struct clk_branch gcc_npu_dma_clk = {
1251	.halt_reg = 0x4d1a0,
1252	.halt_check = BRANCH_HALT,
1253	.hwcg_reg = 0x4d1a0,
1254	.hwcg_bit = 1,
1255	.clkr = {
1256		.enable_reg = 0x4d1a0,
1257		.enable_mask = BIT(0),
1258		.hw.init = &(struct clk_init_data){
1259			.name = "gcc_npu_dma_clk",
1260			.ops = &clk_branch2_ops,
1261		},
1262	},
1263};
1264
1265static struct clk_branch gcc_npu_gpll0_clk_src = {
1266	.halt_check = BRANCH_HALT_DELAY,
1267	.clkr = {
1268		.enable_reg = 0x52000,
1269		.enable_mask = BIT(25),
1270		.hw.init = &(struct clk_init_data){
1271			.name = "gcc_npu_gpll0_clk_src",
1272			.parent_hws = (const struct clk_hw*[]){
1273				&gpll0.clkr.hw,
1274			},
1275			.num_parents = 1,
1276			.ops = &clk_branch2_ops,
1277		},
1278	},
1279};
1280
1281static struct clk_branch gcc_npu_gpll0_div_clk_src = {
1282	.halt_check = BRANCH_HALT_DELAY,
1283	.clkr = {
1284		.enable_reg = 0x52000,
1285		.enable_mask = BIT(26),
1286		.hw.init = &(struct clk_init_data){
1287			.name = "gcc_npu_gpll0_div_clk_src",
1288			.parent_hws = (const struct clk_hw*[]){
1289				&gcc_pll0_main_div_cdiv.hw,
1290			},
1291			.num_parents = 1,
1292			.flags = CLK_SET_RATE_PARENT,
1293			.ops = &clk_branch2_ops,
1294		},
1295	},
1296};
1297
1298static struct clk_branch gcc_pdm2_clk = {
1299	.halt_reg = 0x3300c,
1300	.halt_check = BRANCH_HALT,
1301	.clkr = {
1302		.enable_reg = 0x3300c,
1303		.enable_mask = BIT(0),
1304		.hw.init = &(struct clk_init_data){
1305			.name = "gcc_pdm2_clk",
1306			.parent_hws = (const struct clk_hw*[]){
1307				&gcc_pdm2_clk_src.clkr.hw,
1308			},
1309			.num_parents = 1,
1310			.flags = CLK_SET_RATE_PARENT,
1311			.ops = &clk_branch2_ops,
1312		},
1313	},
1314};
1315
1316static struct clk_branch gcc_pdm_ahb_clk = {
1317	.halt_reg = 0x33004,
1318	.halt_check = BRANCH_HALT,
1319	.hwcg_reg = 0x33004,
1320	.hwcg_bit = 1,
1321	.clkr = {
1322		.enable_reg = 0x33004,
1323		.enable_mask = BIT(0),
1324		.hw.init = &(struct clk_init_data){
1325			.name = "gcc_pdm_ahb_clk",
1326			.ops = &clk_branch2_ops,
1327		},
1328	},
1329};
1330
1331static struct clk_branch gcc_pdm_xo4_clk = {
1332	.halt_reg = 0x33008,
1333	.halt_check = BRANCH_HALT,
1334	.clkr = {
1335		.enable_reg = 0x33008,
1336		.enable_mask = BIT(0),
1337		.hw.init = &(struct clk_init_data){
1338			.name = "gcc_pdm_xo4_clk",
1339			.ops = &clk_branch2_ops,
1340		},
1341	},
1342};
1343
1344static struct clk_branch gcc_prng_ahb_clk = {
1345	.halt_reg = 0x34004,
1346	.halt_check = BRANCH_HALT_VOTED,
1347	.hwcg_reg = 0x34004,
1348	.hwcg_bit = 1,
1349	.clkr = {
1350		.enable_reg = 0x52000,
1351		.enable_mask = BIT(13),
1352		.hw.init = &(struct clk_init_data){
1353			.name = "gcc_prng_ahb_clk",
1354			.ops = &clk_branch2_ops,
1355		},
1356	},
1357};
1358
1359static struct clk_branch gcc_qspi_cnoc_periph_ahb_clk = {
1360	.halt_reg = 0x4b004,
1361	.halt_check = BRANCH_HALT,
1362	.hwcg_reg = 0x4b004,
1363	.hwcg_bit = 1,
1364	.clkr = {
1365		.enable_reg = 0x4b004,
1366		.enable_mask = BIT(0),
1367		.hw.init = &(struct clk_init_data){
1368			.name = "gcc_qspi_cnoc_periph_ahb_clk",
1369			.ops = &clk_branch2_ops,
1370		},
1371	},
1372};
1373
1374static struct clk_branch gcc_qspi_core_clk = {
1375	.halt_reg = 0x4b008,
1376	.halt_check = BRANCH_HALT,
1377	.clkr = {
1378		.enable_reg = 0x4b008,
1379		.enable_mask = BIT(0),
1380		.hw.init = &(struct clk_init_data){
1381			.name = "gcc_qspi_core_clk",
1382			.parent_hws = (const struct clk_hw*[]){
1383				&gcc_qspi_core_clk_src.clkr.hw,
1384			},
1385			.num_parents = 1,
1386			.flags = CLK_SET_RATE_PARENT,
1387			.ops = &clk_branch2_ops,
1388		},
1389	},
1390};
1391
1392static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = {
1393	.halt_reg = 0x17014,
1394	.halt_check = BRANCH_HALT_VOTED,
1395	.clkr = {
1396		.enable_reg = 0x52008,
1397		.enable_mask = BIT(9),
1398		.hw.init = &(struct clk_init_data){
1399			.name = "gcc_qupv3_wrap0_core_2x_clk",
1400			.ops = &clk_branch2_ops,
1401		},
1402	},
1403};
1404
1405static struct clk_branch gcc_qupv3_wrap0_core_clk = {
1406	.halt_reg = 0x1700c,
1407	.halt_check = BRANCH_HALT_VOTED,
1408	.clkr = {
1409		.enable_reg = 0x52008,
1410		.enable_mask = BIT(8),
1411		.hw.init = &(struct clk_init_data){
1412			.name = "gcc_qupv3_wrap0_core_clk",
1413			.ops = &clk_branch2_ops,
1414		},
1415	},
1416};
1417
1418static struct clk_branch gcc_qupv3_wrap0_s0_clk = {
1419	.halt_reg = 0x17030,
1420	.halt_check = BRANCH_HALT_VOTED,
1421	.clkr = {
1422		.enable_reg = 0x52008,
1423		.enable_mask = BIT(10),
1424		.hw.init = &(struct clk_init_data){
1425			.name = "gcc_qupv3_wrap0_s0_clk",
1426			.parent_hws = (const struct clk_hw*[]){
1427				&gcc_qupv3_wrap0_s0_clk_src.clkr.hw,
1428			},
1429			.num_parents = 1,
1430			.flags = CLK_SET_RATE_PARENT,
1431			.ops = &clk_branch2_ops,
1432		},
1433	},
1434};
1435
1436static struct clk_branch gcc_qupv3_wrap0_s1_clk = {
1437	.halt_reg = 0x17160,
1438	.halt_check = BRANCH_HALT_VOTED,
1439	.clkr = {
1440		.enable_reg = 0x52008,
1441		.enable_mask = BIT(11),
1442		.hw.init = &(struct clk_init_data){
1443			.name = "gcc_qupv3_wrap0_s1_clk",
1444			.parent_hws = (const struct clk_hw*[]){
1445				&gcc_qupv3_wrap0_s1_clk_src.clkr.hw,
1446			},
1447			.num_parents = 1,
1448			.flags = CLK_SET_RATE_PARENT,
1449			.ops = &clk_branch2_ops,
1450		},
1451	},
1452};
1453
1454static struct clk_branch gcc_qupv3_wrap0_s2_clk = {
1455	.halt_reg = 0x17290,
1456	.halt_check = BRANCH_HALT_VOTED,
1457	.clkr = {
1458		.enable_reg = 0x52008,
1459		.enable_mask = BIT(12),
1460		.hw.init = &(struct clk_init_data){
1461			.name = "gcc_qupv3_wrap0_s2_clk",
1462			.parent_hws = (const struct clk_hw*[]){
1463				&gcc_qupv3_wrap0_s2_clk_src.clkr.hw,
1464			},
1465			.num_parents = 1,
1466			.flags = CLK_SET_RATE_PARENT,
1467			.ops = &clk_branch2_ops,
1468		},
1469	},
1470};
1471
1472static struct clk_branch gcc_qupv3_wrap0_s3_clk = {
1473	.halt_reg = 0x173c0,
1474	.halt_check = BRANCH_HALT_VOTED,
1475	.clkr = {
1476		.enable_reg = 0x52008,
1477		.enable_mask = BIT(13),
1478		.hw.init = &(struct clk_init_data){
1479			.name = "gcc_qupv3_wrap0_s3_clk",
1480			.parent_hws = (const struct clk_hw*[]){
1481				&gcc_qupv3_wrap0_s3_clk_src.clkr.hw,
1482			},
1483			.num_parents = 1,
1484			.flags = CLK_SET_RATE_PARENT,
1485			.ops = &clk_branch2_ops,
1486		},
1487	},
1488};
1489
1490static struct clk_branch gcc_qupv3_wrap0_s4_clk = {
1491	.halt_reg = 0x174f0,
1492	.halt_check = BRANCH_HALT_VOTED,
1493	.clkr = {
1494		.enable_reg = 0x52008,
1495		.enable_mask = BIT(14),
1496		.hw.init = &(struct clk_init_data){
1497			.name = "gcc_qupv3_wrap0_s4_clk",
1498			.parent_hws = (const struct clk_hw*[]){
1499				&gcc_qupv3_wrap0_s4_clk_src.clkr.hw,
1500			},
1501			.num_parents = 1,
1502			.flags = CLK_SET_RATE_PARENT,
1503			.ops = &clk_branch2_ops,
1504		},
1505	},
1506};
1507
1508static struct clk_branch gcc_qupv3_wrap0_s5_clk = {
1509	.halt_reg = 0x17620,
1510	.halt_check = BRANCH_HALT_VOTED,
1511	.clkr = {
1512		.enable_reg = 0x52008,
1513		.enable_mask = BIT(15),
1514		.hw.init = &(struct clk_init_data){
1515			.name = "gcc_qupv3_wrap0_s5_clk",
1516			.parent_hws = (const struct clk_hw*[]){
1517				&gcc_qupv3_wrap0_s5_clk_src.clkr.hw,
1518			},
1519			.num_parents = 1,
1520			.flags = CLK_SET_RATE_PARENT,
1521			.ops = &clk_branch2_ops,
1522		},
1523	},
1524};
1525
1526static struct clk_branch gcc_qupv3_wrap1_core_2x_clk = {
1527	.halt_reg = 0x18004,
1528	.halt_check = BRANCH_HALT_VOTED,
1529	.clkr = {
1530		.enable_reg = 0x52008,
1531		.enable_mask = BIT(18),
1532		.hw.init = &(struct clk_init_data){
1533			.name = "gcc_qupv3_wrap1_core_2x_clk",
1534			.ops = &clk_branch2_ops,
1535		},
1536	},
1537};
1538
1539static struct clk_branch gcc_qupv3_wrap1_core_clk = {
1540	.halt_reg = 0x18008,
1541	.halt_check = BRANCH_HALT_VOTED,
1542	.clkr = {
1543		.enable_reg = 0x52008,
1544		.enable_mask = BIT(19),
1545		.hw.init = &(struct clk_init_data){
1546			.name = "gcc_qupv3_wrap1_core_clk",
1547			.ops = &clk_branch2_ops,
1548		},
1549	},
1550};
1551
1552static struct clk_branch gcc_qupv3_wrap1_s0_clk = {
1553	.halt_reg = 0x18014,
1554	.halt_check = BRANCH_HALT_VOTED,
1555	.clkr = {
1556		.enable_reg = 0x52008,
1557		.enable_mask = BIT(22),
1558		.hw.init = &(struct clk_init_data){
1559			.name = "gcc_qupv3_wrap1_s0_clk",
1560			.parent_hws = (const struct clk_hw*[]){
1561				&gcc_qupv3_wrap1_s0_clk_src.clkr.hw,
1562			},
1563			.num_parents = 1,
1564			.flags = CLK_SET_RATE_PARENT,
1565			.ops = &clk_branch2_ops,
1566		},
1567	},
1568};
1569
1570static struct clk_branch gcc_qupv3_wrap1_s1_clk = {
1571	.halt_reg = 0x18144,
1572	.halt_check = BRANCH_HALT_VOTED,
1573	.clkr = {
1574		.enable_reg = 0x52008,
1575		.enable_mask = BIT(23),
1576		.hw.init = &(struct clk_init_data){
1577			.name = "gcc_qupv3_wrap1_s1_clk",
1578			.parent_hws = (const struct clk_hw*[]){
1579				&gcc_qupv3_wrap1_s1_clk_src.clkr.hw,
1580			},
1581			.num_parents = 1,
1582			.flags = CLK_SET_RATE_PARENT,
1583			.ops = &clk_branch2_ops,
1584		},
1585	},
1586};
1587
1588static struct clk_branch gcc_qupv3_wrap1_s2_clk = {
1589	.halt_reg = 0x18274,
1590	.halt_check = BRANCH_HALT_VOTED,
1591	.clkr = {
1592		.enable_reg = 0x52008,
1593		.enable_mask = BIT(24),
1594		.hw.init = &(struct clk_init_data){
1595			.name = "gcc_qupv3_wrap1_s2_clk",
1596			.parent_hws = (const struct clk_hw*[]){
1597				&gcc_qupv3_wrap1_s2_clk_src.clkr.hw,
1598			},
1599			.num_parents = 1,
1600			.flags = CLK_SET_RATE_PARENT,
1601			.ops = &clk_branch2_ops,
1602		},
1603	},
1604};
1605
1606static struct clk_branch gcc_qupv3_wrap1_s3_clk = {
1607	.halt_reg = 0x183a4,
1608	.halt_check = BRANCH_HALT_VOTED,
1609	.clkr = {
1610		.enable_reg = 0x52008,
1611		.enable_mask = BIT(25),
1612		.hw.init = &(struct clk_init_data){
1613			.name = "gcc_qupv3_wrap1_s3_clk",
1614			.parent_hws = (const struct clk_hw*[]){
1615				&gcc_qupv3_wrap1_s3_clk_src.clkr.hw,
1616			},
1617			.num_parents = 1,
1618			.flags = CLK_SET_RATE_PARENT,
1619			.ops = &clk_branch2_ops,
1620		},
1621	},
1622};
1623
1624static struct clk_branch gcc_qupv3_wrap1_s4_clk = {
1625	.halt_reg = 0x184d4,
1626	.halt_check = BRANCH_HALT_VOTED,
1627	.clkr = {
1628		.enable_reg = 0x52008,
1629		.enable_mask = BIT(26),
1630		.hw.init = &(struct clk_init_data){
1631			.name = "gcc_qupv3_wrap1_s4_clk",
1632			.parent_hws = (const struct clk_hw*[]){
1633				&gcc_qupv3_wrap1_s4_clk_src.clkr.hw,
1634			},
1635			.num_parents = 1,
1636			.flags = CLK_SET_RATE_PARENT,
1637			.ops = &clk_branch2_ops,
1638		},
1639	},
1640};
1641
1642static struct clk_branch gcc_qupv3_wrap1_s5_clk = {
1643	.halt_reg = 0x18604,
1644	.halt_check = BRANCH_HALT_VOTED,
1645	.clkr = {
1646		.enable_reg = 0x52008,
1647		.enable_mask = BIT(27),
1648		.hw.init = &(struct clk_init_data){
1649			.name = "gcc_qupv3_wrap1_s5_clk",
1650			.parent_hws = (const struct clk_hw*[]){
1651				&gcc_qupv3_wrap1_s5_clk_src.clkr.hw,
1652			},
1653			.num_parents = 1,
1654			.flags = CLK_SET_RATE_PARENT,
1655			.ops = &clk_branch2_ops,
1656		},
1657	},
1658};
1659
1660static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = {
1661	.halt_reg = 0x17004,
1662	.halt_check = BRANCH_HALT_VOTED,
1663	.clkr = {
1664		.enable_reg = 0x52008,
1665		.enable_mask = BIT(6),
1666		.hw.init = &(struct clk_init_data){
1667			.name = "gcc_qupv3_wrap_0_m_ahb_clk",
1668			.ops = &clk_branch2_ops,
1669		},
1670	},
1671};
1672
1673static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = {
1674	.halt_reg = 0x17008,
1675	.halt_check = BRANCH_HALT_VOTED,
1676	.hwcg_reg = 0x17008,
1677	.hwcg_bit = 1,
1678	.clkr = {
1679		.enable_reg = 0x52008,
1680		.enable_mask = BIT(7),
1681		.hw.init = &(struct clk_init_data){
1682			.name = "gcc_qupv3_wrap_0_s_ahb_clk",
1683			.ops = &clk_branch2_ops,
1684		},
1685	},
1686};
1687
1688static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = {
1689	.halt_reg = 0x1800c,
1690	.halt_check = BRANCH_HALT_VOTED,
1691	.clkr = {
1692		.enable_reg = 0x52008,
1693		.enable_mask = BIT(20),
1694		.hw.init = &(struct clk_init_data){
1695			.name = "gcc_qupv3_wrap_1_m_ahb_clk",
1696			.ops = &clk_branch2_ops,
1697		},
1698	},
1699};
1700
1701static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = {
1702	.halt_reg = 0x18010,
1703	.halt_check = BRANCH_HALT_VOTED,
1704	.hwcg_reg = 0x18010,
1705	.hwcg_bit = 1,
1706	.clkr = {
1707		.enable_reg = 0x52008,
1708		.enable_mask = BIT(21),
1709		.hw.init = &(struct clk_init_data){
1710			.name = "gcc_qupv3_wrap_1_s_ahb_clk",
1711			.ops = &clk_branch2_ops,
1712		},
1713	},
1714};
1715
1716static struct clk_branch gcc_sdcc1_ahb_clk = {
1717	.halt_reg = 0x12008,
1718	.halt_check = BRANCH_HALT,
1719	.clkr = {
1720		.enable_reg = 0x12008,
1721		.enable_mask = BIT(0),
1722		.hw.init = &(struct clk_init_data){
1723			.name = "gcc_sdcc1_ahb_clk",
1724			.ops = &clk_branch2_ops,
1725		},
1726	},
1727};
1728
1729static struct clk_branch gcc_sdcc1_apps_clk = {
1730	.halt_reg = 0x1200c,
1731	.halt_check = BRANCH_HALT,
1732	.clkr = {
1733		.enable_reg = 0x1200c,
1734		.enable_mask = BIT(0),
1735		.hw.init = &(struct clk_init_data){
1736			.name = "gcc_sdcc1_apps_clk",
1737			.parent_hws = (const struct clk_hw*[]){
1738				&gcc_sdcc1_apps_clk_src.clkr.hw,
1739			},
1740			.num_parents = 1,
1741			.flags = CLK_SET_RATE_PARENT,
1742			.ops = &clk_branch2_ops,
1743		},
1744	},
1745};
1746
1747static struct clk_branch gcc_sdcc1_ice_core_clk = {
1748	.halt_reg = 0x12040,
1749	.halt_check = BRANCH_HALT,
1750	.clkr = {
1751		.enable_reg = 0x12040,
1752		.enable_mask = BIT(0),
1753		.hw.init = &(struct clk_init_data){
1754			.name = "gcc_sdcc1_ice_core_clk",
1755			.parent_hws = (const struct clk_hw*[]){
1756				&gcc_sdcc1_ice_core_clk_src.clkr.hw,
1757			},
1758			.num_parents = 1,
1759			.flags = CLK_SET_RATE_PARENT,
1760			.ops = &clk_branch2_ops,
1761		},
1762	},
1763};
1764
1765static struct clk_branch gcc_sdcc2_ahb_clk = {
1766	.halt_reg = 0x14008,
1767	.halt_check = BRANCH_HALT,
1768	.clkr = {
1769		.enable_reg = 0x14008,
1770		.enable_mask = BIT(0),
1771		.hw.init = &(struct clk_init_data){
1772			.name = "gcc_sdcc2_ahb_clk",
1773			.ops = &clk_branch2_ops,
1774		},
1775	},
1776};
1777
1778static struct clk_branch gcc_sdcc2_apps_clk = {
1779	.halt_reg = 0x14004,
1780	.halt_check = BRANCH_HALT,
1781	.clkr = {
1782		.enable_reg = 0x14004,
1783		.enable_mask = BIT(0),
1784		.hw.init = &(struct clk_init_data){
1785			.name = "gcc_sdcc2_apps_clk",
1786			.parent_hws = (const struct clk_hw*[]){
1787				&gcc_sdcc2_apps_clk_src.clkr.hw,
1788			},
1789			.num_parents = 1,
1790			.flags = CLK_SET_RATE_PARENT,
1791			.ops = &clk_branch2_ops,
1792		},
1793	},
1794};
1795
1796/* For CPUSS functionality the SYS NOC clock needs to be left enabled */
1797static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = {
1798	.halt_reg = 0x4144,
1799	.halt_check = BRANCH_HALT_VOTED,
1800	.clkr = {
1801		.enable_reg = 0x52000,
1802		.enable_mask = BIT(0),
1803		.hw.init = &(struct clk_init_data){
1804			.name = "gcc_sys_noc_cpuss_ahb_clk",
1805			.parent_hws = (const struct clk_hw*[]){
1806				&gcc_cpuss_ahb_clk_src.clkr.hw,
1807			},
1808			.num_parents = 1,
1809			.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
1810			.ops = &clk_branch2_ops,
1811		},
1812	},
1813};
1814
1815static struct clk_branch gcc_ufs_mem_clkref_clk = {
1816	.halt_reg = 0x8c000,
1817	.halt_check = BRANCH_HALT,
1818	.clkr = {
1819		.enable_reg = 0x8c000,
1820		.enable_mask = BIT(0),
1821		.hw.init = &(struct clk_init_data){
1822			.name = "gcc_ufs_mem_clkref_clk",
1823			.ops = &clk_branch2_ops,
1824		},
1825	},
1826};
1827
1828static struct clk_branch gcc_ufs_phy_ahb_clk = {
1829	.halt_reg = 0x77014,
1830	.halt_check = BRANCH_HALT,
1831	.hwcg_reg = 0x77014,
1832	.hwcg_bit = 1,
1833	.clkr = {
1834		.enable_reg = 0x77014,
1835		.enable_mask = BIT(0),
1836		.hw.init = &(struct clk_init_data){
1837			.name = "gcc_ufs_phy_ahb_clk",
1838			.ops = &clk_branch2_ops,
1839		},
1840	},
1841};
1842
1843static struct clk_branch gcc_ufs_phy_axi_clk = {
1844	.halt_reg = 0x77038,
1845	.halt_check = BRANCH_HALT,
1846	.hwcg_reg = 0x77038,
1847	.hwcg_bit = 1,
1848	.clkr = {
1849		.enable_reg = 0x77038,
1850		.enable_mask = BIT(0),
1851		.hw.init = &(struct clk_init_data){
1852			.name = "gcc_ufs_phy_axi_clk",
1853			.parent_hws = (const struct clk_hw*[]){
1854				&gcc_ufs_phy_axi_clk_src.clkr.hw,
1855			},
1856			.num_parents = 1,
1857			.flags = CLK_SET_RATE_PARENT,
1858			.ops = &clk_branch2_ops,
1859		},
1860	},
1861};
1862
1863static struct clk_branch gcc_ufs_phy_ice_core_clk = {
1864	.halt_reg = 0x77090,
1865	.halt_check = BRANCH_HALT,
1866	.hwcg_reg = 0x77090,
1867	.hwcg_bit = 1,
1868	.clkr = {
1869		.enable_reg = 0x77090,
1870		.enable_mask = BIT(0),
1871		.hw.init = &(struct clk_init_data){
1872			.name = "gcc_ufs_phy_ice_core_clk",
1873			.parent_hws = (const struct clk_hw*[]){
1874				&gcc_ufs_phy_ice_core_clk_src.clkr.hw,
1875			},
1876			.num_parents = 1,
1877			.flags = CLK_SET_RATE_PARENT,
1878			.ops = &clk_branch2_ops,
1879		},
1880	},
1881};
1882
1883static struct clk_branch gcc_ufs_phy_phy_aux_clk = {
1884	.halt_reg = 0x77094,
1885	.halt_check = BRANCH_HALT,
1886	.hwcg_reg = 0x77094,
1887	.hwcg_bit = 1,
1888	.clkr = {
1889		.enable_reg = 0x77094,
1890		.enable_mask = BIT(0),
1891		.hw.init = &(struct clk_init_data){
1892			.name = "gcc_ufs_phy_phy_aux_clk",
1893			.parent_hws = (const struct clk_hw*[]){
1894				&gcc_ufs_phy_phy_aux_clk_src.clkr.hw,
1895			},
1896			.num_parents = 1,
1897			.flags = CLK_SET_RATE_PARENT,
1898			.ops = &clk_branch2_ops,
1899		},
1900	},
1901};
1902
1903static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = {
1904	.halt_reg = 0x7701c,
1905	.halt_check = BRANCH_HALT_SKIP,
1906	.clkr = {
1907		.enable_reg = 0x7701c,
1908		.enable_mask = BIT(0),
1909		.hw.init = &(struct clk_init_data){
1910			.name = "gcc_ufs_phy_rx_symbol_0_clk",
1911			.ops = &clk_branch2_ops,
1912		},
1913	},
1914};
1915
1916static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = {
1917	.halt_reg = 0x77018,
1918	.halt_check = BRANCH_HALT_SKIP,
1919	.clkr = {
1920		.enable_reg = 0x77018,
1921		.enable_mask = BIT(0),
1922		.hw.init = &(struct clk_init_data){
1923			.name = "gcc_ufs_phy_tx_symbol_0_clk",
1924			.ops = &clk_branch2_ops,
1925		},
1926	},
1927};
1928
1929static struct clk_branch gcc_ufs_phy_unipro_core_clk = {
1930	.halt_reg = 0x7708c,
1931	.halt_check = BRANCH_HALT,
1932	.hwcg_reg = 0x7708c,
1933	.hwcg_bit = 1,
1934	.clkr = {
1935		.enable_reg = 0x7708c,
1936		.enable_mask = BIT(0),
1937		.hw.init = &(struct clk_init_data){
1938			.name = "gcc_ufs_phy_unipro_core_clk",
1939			.parent_hws = (const struct clk_hw*[]){
1940				&gcc_ufs_phy_unipro_core_clk_src.clkr.hw,
1941			},
1942			.num_parents = 1,
1943			.flags = CLK_SET_RATE_PARENT,
1944			.ops = &clk_branch2_ops,
1945		},
1946	},
1947};
1948
1949static struct clk_branch gcc_usb30_prim_master_clk = {
1950	.halt_reg = 0xf010,
1951	.halt_check = BRANCH_HALT,
1952	.clkr = {
1953		.enable_reg = 0xf010,
1954		.enable_mask = BIT(0),
1955		.hw.init = &(struct clk_init_data){
1956			.name = "gcc_usb30_prim_master_clk",
1957			.parent_hws = (const struct clk_hw*[]){
1958				&gcc_usb30_prim_master_clk_src.clkr.hw,
1959			},
1960			.num_parents = 1,
1961			.flags = CLK_SET_RATE_PARENT,
1962			.ops = &clk_branch2_ops,
1963		},
1964	},
1965};
1966
1967static struct clk_branch gcc_usb30_prim_mock_utmi_clk = {
1968	.halt_reg = 0xf018,
1969	.halt_check = BRANCH_HALT,
1970	.clkr = {
1971		.enable_reg = 0xf018,
1972		.enable_mask = BIT(0),
1973		.hw.init = &(struct clk_init_data){
1974			.name = "gcc_usb30_prim_mock_utmi_clk",
1975			.parent_hws = (const struct clk_hw*[]) {
1976				&gcc_usb30_prim_mock_utmi_clk_src.clkr.hw,
1977			},
1978			.num_parents = 1,
1979			.flags = CLK_SET_RATE_PARENT,
1980			.ops = &clk_branch2_ops,
1981		},
1982	},
1983};
1984
1985static struct clk_branch gcc_usb30_prim_sleep_clk = {
1986	.halt_reg = 0xf014,
1987	.halt_check = BRANCH_HALT,
1988	.clkr = {
1989		.enable_reg = 0xf014,
1990		.enable_mask = BIT(0),
1991		.hw.init = &(struct clk_init_data){
1992			.name = "gcc_usb30_prim_sleep_clk",
1993			.ops = &clk_branch2_ops,
1994		},
1995	},
1996};
1997
1998static struct clk_branch gcc_usb3_prim_clkref_clk = {
1999	.halt_reg = 0x8c010,
2000	.halt_check = BRANCH_HALT,
2001	.clkr = {
2002		.enable_reg = 0x8c010,
2003		.enable_mask = BIT(0),
2004		.hw.init = &(struct clk_init_data){
2005			.name = "gcc_usb3_prim_clkref_clk",
2006			.ops = &clk_branch2_ops,
2007		},
2008	},
2009};
2010
2011static struct clk_branch gcc_usb3_prim_phy_aux_clk = {
2012	.halt_reg = 0xf050,
2013	.halt_check = BRANCH_HALT,
2014	.clkr = {
2015		.enable_reg = 0xf050,
2016		.enable_mask = BIT(0),
2017		.hw.init = &(struct clk_init_data){
2018			.name = "gcc_usb3_prim_phy_aux_clk",
2019			.parent_hws = (const struct clk_hw*[]){
2020				&gcc_usb3_prim_phy_aux_clk_src.clkr.hw,
2021			},
2022			.num_parents = 1,
2023			.flags = CLK_SET_RATE_PARENT,
2024			.ops = &clk_branch2_ops,
2025		},
2026	},
2027};
2028
2029static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = {
2030	.halt_reg = 0xf054,
2031	.halt_check = BRANCH_HALT,
2032	.clkr = {
2033		.enable_reg = 0xf054,
2034		.enable_mask = BIT(0),
2035		.hw.init = &(struct clk_init_data){
2036			.name = "gcc_usb3_prim_phy_com_aux_clk",
2037			.parent_hws = (const struct clk_hw*[]){
2038				&gcc_usb3_prim_phy_aux_clk_src.clkr.hw,
2039			},
2040			.num_parents = 1,
2041			.flags = CLK_SET_RATE_PARENT,
2042			.ops = &clk_branch2_ops,
2043		},
2044	},
2045};
2046
2047static struct clk_branch gcc_usb3_prim_phy_pipe_clk = {
2048	.halt_reg = 0xf058,
2049	.halt_check = BRANCH_HALT_SKIP,
2050	.clkr = {
2051		.enable_reg = 0xf058,
2052		.enable_mask = BIT(0),
2053		.hw.init = &(struct clk_init_data){
2054			.name = "gcc_usb3_prim_phy_pipe_clk",
2055			.ops = &clk_branch2_ops,
2056		},
2057	},
2058};
2059
2060static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
2061	.halt_reg = 0x6a004,
2062	.halt_check = BRANCH_HALT,
2063	.hwcg_reg = 0x6a004,
2064	.hwcg_bit = 1,
2065	.clkr = {
2066		.enable_reg = 0x6a004,
2067		.enable_mask = BIT(0),
2068		.hw.init = &(struct clk_init_data){
2069			.name = "gcc_usb_phy_cfg_ahb2phy_clk",
2070			.ops = &clk_branch2_ops,
2071		},
2072	},
2073};
2074
2075static struct clk_branch gcc_video_axi_clk = {
2076	.halt_reg = 0xb01c,
2077	.halt_check = BRANCH_HALT,
2078	.clkr = {
2079		.enable_reg = 0xb01c,
2080		.enable_mask = BIT(0),
2081		.hw.init = &(struct clk_init_data){
2082			.name = "gcc_video_axi_clk",
2083			.ops = &clk_branch2_ops,
2084		},
2085	},
2086};
2087
2088static struct clk_branch gcc_video_gpll0_div_clk_src = {
2089	.halt_check = BRANCH_HALT_DELAY,
2090	.clkr = {
2091		.enable_reg = 0x52000,
2092		.enable_mask = BIT(20),
2093		.hw.init = &(struct clk_init_data){
2094			.name = "gcc_video_gpll0_div_clk_src",
2095			.parent_hws = (const struct clk_hw*[]){
2096				&gcc_pll0_main_div_cdiv.hw,
2097			},
2098			.num_parents = 1,
2099			.flags = CLK_SET_RATE_PARENT,
2100			.ops = &clk_branch2_ops,
2101		},
2102	},
2103};
2104
2105static struct clk_branch gcc_video_throttle_axi_clk = {
2106	.halt_reg = 0xb07c,
2107	.halt_check = BRANCH_HALT,
2108	.hwcg_reg = 0xb07c,
2109	.hwcg_bit = 1,
2110	.clkr = {
2111		.enable_reg = 0xb07c,
2112		.enable_mask = BIT(0),
2113		.hw.init = &(struct clk_init_data){
2114			.name = "gcc_video_throttle_axi_clk",
2115			.ops = &clk_branch2_ops,
2116		},
2117	},
2118};
2119
2120static struct clk_branch gcc_mss_cfg_ahb_clk = {
2121	.halt_reg = 0x8a000,
2122	.halt_check = BRANCH_HALT,
2123	.clkr = {
2124		.enable_reg = 0x8a000,
2125		.enable_mask = BIT(0),
2126		.hw.init = &(struct clk_init_data){
2127			.name = "gcc_mss_cfg_ahb_clk",
2128			.ops = &clk_branch2_ops,
2129		},
2130	},
2131};
2132
2133static struct clk_branch gcc_mss_mfab_axis_clk = {
2134	.halt_reg = 0x8a004,
2135	.halt_check = BRANCH_HALT_VOTED,
2136	.clkr = {
2137		.enable_reg = 0x8a004,
2138		.enable_mask = BIT(0),
2139		.hw.init = &(struct clk_init_data){
2140			.name = "gcc_mss_mfab_axis_clk",
2141			.ops = &clk_branch2_ops,
2142		},
2143	},
2144};
2145
2146static struct clk_branch gcc_mss_nav_axi_clk = {
2147	.halt_reg = 0x8a00c,
2148	.halt_check = BRANCH_HALT_VOTED,
2149	.clkr = {
2150		.enable_reg = 0x8a00c,
2151		.enable_mask = BIT(0),
2152		.hw.init = &(struct clk_init_data){
2153			.name = "gcc_mss_nav_axi_clk",
2154			.ops = &clk_branch2_ops,
2155		},
2156	},
2157};
2158
2159static struct clk_branch gcc_mss_snoc_axi_clk = {
2160	.halt_reg = 0x8a150,
2161	.halt_check = BRANCH_HALT,
2162	.clkr = {
2163		.enable_reg = 0x8a150,
2164		.enable_mask = BIT(0),
2165		.hw.init = &(struct clk_init_data){
2166			.name = "gcc_mss_snoc_axi_clk",
2167			.ops = &clk_branch2_ops,
2168		},
2169	},
2170};
2171
2172static struct clk_branch gcc_mss_q6_memnoc_axi_clk = {
2173	.halt_reg = 0x8a154,
2174	.halt_check = BRANCH_HALT,
2175	.clkr = {
2176		.enable_reg = 0x8a154,
2177		.enable_mask = BIT(0),
2178		.hw.init = &(struct clk_init_data){
2179			.name = "gcc_mss_q6_memnoc_axi_clk",
2180			.ops = &clk_branch2_ops,
2181		},
2182	},
2183};
2184
2185static struct clk_branch gcc_lpass_cfg_noc_sway_clk = {
2186	.halt_reg = 0x47018,
2187	.halt_check = BRANCH_HALT_DELAY,
2188	.clkr = {
2189		.enable_reg = 0x47018,
2190		.enable_mask = BIT(0),
2191		.hw.init = &(struct clk_init_data){
2192			.name = "gcc_lpass_cfg_noc_sway_clk",
2193			.ops = &clk_branch2_ops,
2194		},
2195	},
2196};
2197
2198static struct gdsc ufs_phy_gdsc = {
2199	.gdscr = 0x77004,
2200	.pd = {
2201		.name = "ufs_phy_gdsc",
2202	},
2203	.pwrsts = PWRSTS_OFF_ON,
2204};
2205
2206static struct gdsc usb30_prim_gdsc = {
2207	.gdscr = 0x0f004,
2208	.pd = {
2209		.name = "usb30_prim_gdsc",
2210	},
2211	.pwrsts = PWRSTS_RET_ON,
2212};
2213
2214static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
2215	.gdscr = 0x7d040,
2216	.pd = {
2217		.name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc",
2218	},
2219	.pwrsts = PWRSTS_OFF_ON,
2220	.flags = VOTABLE,
2221};
2222
2223static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
2224	.gdscr = 0x7d044,
2225	.pd = {
2226		.name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc",
2227	},
2228	.pwrsts = PWRSTS_OFF_ON,
2229	.flags = VOTABLE,
2230};
2231
2232static struct gdsc *gcc_sc7180_gdscs[] = {
2233	[UFS_PHY_GDSC] = &ufs_phy_gdsc,
2234	[USB30_PRIM_GDSC] = &usb30_prim_gdsc,
2235	[HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] =
2236					&hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc,
2237	[HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] =
2238					&hlos1_vote_mmnoc_mmu_tbu_sf_gdsc,
2239};
2240
2241
2242static struct clk_hw *gcc_sc7180_hws[] = {
2243	[GCC_GPLL0_MAIN_DIV_CDIV] = &gcc_pll0_main_div_cdiv.hw,
2244};
2245
2246static struct clk_regmap *gcc_sc7180_clocks[] = {
2247	[GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr,
2248	[GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr,
2249	[GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
2250	[GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr,
2251	[GCC_CAMERA_THROTTLE_HF_AXI_CLK] = &gcc_camera_throttle_hf_axi_clk.clkr,
2252	[GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr,
2253	[GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr,
2254	[GCC_CE1_CLK] = &gcc_ce1_clk.clkr,
2255	[GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr,
2256	[GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr,
2257	[GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr,
2258	[GCC_CPUSS_RBCPR_CLK] = &gcc_cpuss_rbcpr_clk.clkr,
2259	[GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr,
2260	[GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
2261	[GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr,
2262	[GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
2263	[GCC_DISP_THROTTLE_HF_AXI_CLK] = &gcc_disp_throttle_hf_axi_clk.clkr,
2264	[GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
2265	[GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
2266	[GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
2267	[GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr,
2268	[GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
2269	[GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr,
2270	[GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr,
2271	[GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr,
2272	[GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr,
2273	[GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr,
2274	[GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr,
2275	[GCC_NPU_BWMON_AXI_CLK] = &gcc_npu_bwmon_axi_clk.clkr,
2276	[GCC_NPU_BWMON_DMA_CFG_AHB_CLK] = &gcc_npu_bwmon_dma_cfg_ahb_clk.clkr,
2277	[GCC_NPU_BWMON_DSP_CFG_AHB_CLK] = &gcc_npu_bwmon_dsp_cfg_ahb_clk.clkr,
2278	[GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr,
2279	[GCC_NPU_DMA_CLK] = &gcc_npu_dma_clk.clkr,
2280	[GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr,
2281	[GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr,
2282	[GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
2283	[GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
2284	[GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
2285	[GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
2286	[GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
2287	[GCC_QSPI_CNOC_PERIPH_AHB_CLK] = &gcc_qspi_cnoc_periph_ahb_clk.clkr,
2288	[GCC_QSPI_CORE_CLK] = &gcc_qspi_core_clk.clkr,
2289	[GCC_QSPI_CORE_CLK_SRC] = &gcc_qspi_core_clk_src.clkr,
2290	[GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr,
2291	[GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr,
2292	[GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr,
2293	[GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr,
2294	[GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr,
2295	[GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr,
2296	[GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr,
2297	[GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr,
2298	[GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr,
2299	[GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr,
2300	[GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr,
2301	[GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr,
2302	[GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr,
2303	[GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr,
2304	[GCC_QUPV3_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr,
2305	[GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr,
2306	[GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr,
2307	[GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr,
2308	[GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr,
2309	[GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr,
2310	[GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr,
2311	[GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr,
2312	[GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr,
2313	[GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr,
2314	[GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr,
2315	[GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr,
2316	[GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr,
2317	[GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr,
2318	[GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr,
2319	[GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr,
2320	[GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr,
2321	[GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr,
2322	[GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
2323	[GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
2324	[GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr,
2325	[GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
2326	[GCC_SDCC1_ICE_CORE_CLK_SRC] = &gcc_sdcc1_ice_core_clk_src.clkr,
2327	[GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
2328	[GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
2329	[GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr,
2330	[GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
2331	[GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr,
2332	[GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
2333	[GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr,
2334	[GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr,
2335	[GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr,
2336	[GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr,
2337	[GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr,
2338	[GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr,
2339	[GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr,
2340	[GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr,
2341	[GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr,
2342	[GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] =
2343		&gcc_ufs_phy_unipro_core_clk_src.clkr,
2344	[GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr,
2345	[GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr,
2346	[GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr,
2347	[GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] =
2348		&gcc_usb30_prim_mock_utmi_clk_src.clkr,
2349	[GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr,
2350	[GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr,
2351	[GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr,
2352	[GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr,
2353	[GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr,
2354	[GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr,
2355	[GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
2356	[GCC_VIDEO_AXI_CLK] = &gcc_video_axi_clk.clkr,
2357	[GCC_VIDEO_GPLL0_DIV_CLK_SRC] = &gcc_video_gpll0_div_clk_src.clkr,
2358	[GCC_VIDEO_THROTTLE_AXI_CLK] = &gcc_video_throttle_axi_clk.clkr,
2359	[GPLL0] = &gpll0.clkr,
2360	[GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
2361	[GPLL6] = &gpll6.clkr,
2362	[GPLL7] = &gpll7.clkr,
2363	[GPLL4] = &gpll4.clkr,
2364	[GPLL1] = &gpll1.clkr,
2365	[GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
2366	[GCC_MSS_MFAB_AXIS_CLK] = &gcc_mss_mfab_axis_clk.clkr,
2367	[GCC_MSS_NAV_AXI_CLK] = &gcc_mss_nav_axi_clk.clkr,
2368	[GCC_MSS_Q6_MEMNOC_AXI_CLK] = &gcc_mss_q6_memnoc_axi_clk.clkr,
2369	[GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr,
2370	[GCC_SEC_CTRL_CLK_SRC] = &gcc_sec_ctrl_clk_src.clkr,
2371	[GCC_LPASS_CFG_NOC_SWAY_CLK] = &gcc_lpass_cfg_noc_sway_clk.clkr,
2372};
2373
2374static const struct qcom_reset_map gcc_sc7180_resets[] = {
2375	[GCC_QUSB2PHY_PRIM_BCR] = { 0x26000 },
2376	[GCC_QUSB2PHY_SEC_BCR] = { 0x26004 },
2377	[GCC_UFS_PHY_BCR] = { 0x77000 },
2378	[GCC_USB30_PRIM_BCR] = { 0xf000 },
2379	[GCC_USB3_PHY_PRIM_BCR] = { 0x50000 },
2380	[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
2381	[GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
2382	[GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 },
2383	[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
2384	[GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 },
2385	[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
2386};
2387
2388static struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
2389	DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src),
2390	DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src),
2391	DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src),
2392	DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src),
2393	DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src),
2394	DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src),
2395	DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src),
2396	DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src),
2397	DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src),
2398	DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src),
2399	DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src),
2400	DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src),
2401};
2402
2403static const struct regmap_config gcc_sc7180_regmap_config = {
2404	.reg_bits = 32,
2405	.reg_stride = 4,
2406	.val_bits = 32,
2407	.max_register = 0x18208c,
2408	.fast_io = true,
2409};
2410
2411static const struct qcom_cc_desc gcc_sc7180_desc = {
2412	.config = &gcc_sc7180_regmap_config,
2413	.clk_hws = gcc_sc7180_hws,
2414	.num_clk_hws = ARRAY_SIZE(gcc_sc7180_hws),
2415	.clks = gcc_sc7180_clocks,
2416	.num_clks = ARRAY_SIZE(gcc_sc7180_clocks),
2417	.resets = gcc_sc7180_resets,
2418	.num_resets = ARRAY_SIZE(gcc_sc7180_resets),
2419	.gdscs = gcc_sc7180_gdscs,
2420	.num_gdscs = ARRAY_SIZE(gcc_sc7180_gdscs),
2421};
2422
2423static const struct of_device_id gcc_sc7180_match_table[] = {
2424	{ .compatible = "qcom,gcc-sc7180" },
2425	{ }
2426};
2427MODULE_DEVICE_TABLE(of, gcc_sc7180_match_table);
2428
2429static int gcc_sc7180_probe(struct platform_device *pdev)
2430{
2431	struct regmap *regmap;
2432	int ret;
2433
2434	regmap = qcom_cc_map(pdev, &gcc_sc7180_desc);
2435	if (IS_ERR(regmap))
2436		return PTR_ERR(regmap);
2437
2438	/*
2439	 * Disable the GPLL0 active input to MM blocks, NPU
2440	 * and GPU via MISC registers.
2441	 */
2442	regmap_update_bits(regmap, 0x09ffc, 0x3, 0x3);
2443	regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
2444	regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
2445
2446	/*
2447	 * Keep the clocks always-ON
2448	 * GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK,
2449	 * GCC_DISP_AHB_CLK, GCC_GPU_CFG_AHB_CLK
2450	 */
2451	regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
2452	regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
2453	regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
2454	regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
2455	regmap_update_bits(regmap, 0x0b02c, BIT(0), BIT(0));
2456	regmap_update_bits(regmap, 0x0b028, BIT(0), BIT(0));
2457	regmap_update_bits(regmap, 0x0b030, BIT(0), BIT(0));
2458	regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
2459
2460	ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
2461					ARRAY_SIZE(gcc_dfs_clocks));
2462	if (ret)
2463		return ret;
2464
2465	return qcom_cc_really_probe(pdev, &gcc_sc7180_desc, regmap);
2466}
2467
2468static struct platform_driver gcc_sc7180_driver = {
2469	.probe = gcc_sc7180_probe,
2470	.driver = {
2471		.name = "gcc-sc7180",
2472		.of_match_table = gcc_sc7180_match_table,
2473	},
2474};
2475
2476static int __init gcc_sc7180_init(void)
2477{
2478	return platform_driver_register(&gcc_sc7180_driver);
2479}
2480core_initcall(gcc_sc7180_init);
2481
2482static void __exit gcc_sc7180_exit(void)
2483{
2484	platform_driver_unregister(&gcc_sc7180_driver);
2485}
2486module_exit(gcc_sc7180_exit);
2487
2488MODULE_DESCRIPTION("QTI GCC SC7180 Driver");
2489MODULE_LICENSE("GPL v2");
2490