1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2018, Craig Tatlor.
5 */
6
7#include <linux/kernel.h>
8#include <linux/bitops.h>
9#include <linux/err.h>
10#include <linux/platform_device.h>
11#include <linux/module.h>
12#include <linux/of.h>
13#include <linux/of_device.h>
14#include <linux/clk-provider.h>
15#include <linux/regmap.h>
16#include <linux/reset-controller.h>
17
18#include <dt-bindings/clock/qcom,gcc-sdm660.h>
19
20#include "common.h"
21#include "clk-regmap.h"
22#include "clk-alpha-pll.h"
23#include "clk-rcg.h"
24#include "clk-branch.h"
25#include "reset.h"
26#include "gdsc.h"
27
28#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
29
30enum {
31	P_XO,
32	P_SLEEP_CLK,
33	P_GPLL0,
34	P_GPLL1,
35	P_GPLL4,
36	P_GPLL0_EARLY_DIV,
37	P_GPLL1_EARLY_DIV,
38};
39
40static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div[] = {
41	{ P_XO, 0 },
42	{ P_GPLL0, 1 },
43	{ P_GPLL0_EARLY_DIV, 6 },
44};
45
46static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div[] = {
47	"xo",
48	"gpll0",
49	"gpll0_early_div",
50};
51
52static const struct parent_map gcc_parent_map_xo_gpll0[] = {
53	{ P_XO, 0 },
54	{ P_GPLL0, 1 },
55};
56
57static const char * const gcc_parent_names_xo_gpll0[] = {
58	"xo",
59	"gpll0",
60};
61
62static const struct parent_map gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div[] = {
63	{ P_XO, 0 },
64	{ P_GPLL0, 1 },
65	{ P_SLEEP_CLK, 5 },
66	{ P_GPLL0_EARLY_DIV, 6 },
67};
68
69static const char * const gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div[] = {
70	"xo",
71	"gpll0",
72	"sleep_clk",
73	"gpll0_early_div",
74};
75
76static const struct parent_map gcc_parent_map_xo_sleep_clk[] = {
77	{ P_XO, 0 },
78	{ P_SLEEP_CLK, 5 },
79};
80
81static const char * const gcc_parent_names_xo_sleep_clk[] = {
82	"xo",
83	"sleep_clk",
84};
85
86static const struct parent_map gcc_parent_map_xo_gpll4[] = {
87	{ P_XO, 0 },
88	{ P_GPLL4, 5 },
89};
90
91static const char * const gcc_parent_names_xo_gpll4[] = {
92	"xo",
93	"gpll4",
94};
95
96static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
97	{ P_XO, 0 },
98	{ P_GPLL0, 1 },
99	{ P_GPLL0_EARLY_DIV, 3 },
100	{ P_GPLL1, 4 },
101	{ P_GPLL4, 5 },
102	{ P_GPLL1_EARLY_DIV, 6 },
103};
104
105static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
106	"xo",
107	"gpll0",
108	"gpll0_early_div",
109	"gpll1",
110	"gpll4",
111	"gpll1_early_div",
112};
113
114static const struct parent_map gcc_parent_map_xo_gpll0_gpll4_gpll0_early_div[] = {
115	{ P_XO, 0 },
116	{ P_GPLL0, 1 },
117	{ P_GPLL4, 5 },
118	{ P_GPLL0_EARLY_DIV, 6 },
119};
120
121static const char * const gcc_parent_names_xo_gpll0_gpll4_gpll0_early_div[] = {
122	"xo",
123	"gpll0",
124	"gpll4",
125	"gpll0_early_div",
126};
127
128static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll4[] = {
129	{ P_XO, 0 },
130	{ P_GPLL0, 1 },
131	{ P_GPLL0_EARLY_DIV, 2 },
132	{ P_GPLL4, 5 },
133};
134
135static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div_gpll4[] = {
136	"xo",
137	"gpll0",
138	"gpll0_early_div",
139	"gpll4",
140};
141
142static struct clk_fixed_factor xo = {
143	.mult = 1,
144	.div = 1,
145	.hw.init = &(struct clk_init_data){
146		.name = "xo",
147		.parent_names = (const char *[]){ "xo_board" },
148		.num_parents = 1,
149		.ops = &clk_fixed_factor_ops,
150	},
151};
152
153static struct clk_alpha_pll gpll0_early = {
154	.offset = 0x0,
155	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
156	.clkr = {
157		.enable_reg = 0x52000,
158		.enable_mask = BIT(0),
159		.hw.init = &(struct clk_init_data){
160			.name = "gpll0_early",
161			.parent_names = (const char *[]){ "xo" },
162			.num_parents = 1,
163			.ops = &clk_alpha_pll_ops,
164		},
165	},
166};
167
168static struct clk_fixed_factor gpll0_early_div = {
169	.mult = 1,
170	.div = 2,
171	.hw.init = &(struct clk_init_data){
172		.name = "gpll0_early_div",
173		.parent_names = (const char *[]){ "gpll0_early" },
174		.num_parents = 1,
175		.ops = &clk_fixed_factor_ops,
176	},
177};
178
179static struct clk_alpha_pll_postdiv gpll0 = {
180	.offset = 0x00000,
181	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
182	.clkr.hw.init = &(struct clk_init_data){
183		.name = "gpll0",
184		.parent_names = (const char *[]){ "gpll0_early" },
185		.num_parents = 1,
186		.ops = &clk_alpha_pll_postdiv_ops,
187	},
188};
189
190static struct clk_alpha_pll gpll1_early = {
191	.offset = 0x1000,
192	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
193	.clkr = {
194		.enable_reg = 0x52000,
195		.enable_mask = BIT(1),
196		.hw.init = &(struct clk_init_data){
197			.name = "gpll1_early",
198			.parent_names = (const char *[]){ "xo" },
199			.num_parents = 1,
200			.ops = &clk_alpha_pll_ops,
201		},
202	},
203};
204
205static struct clk_fixed_factor gpll1_early_div = {
206	.mult = 1,
207	.div = 2,
208	.hw.init = &(struct clk_init_data){
209		.name = "gpll1_early_div",
210		.parent_names = (const char *[]){ "gpll1_early" },
211		.num_parents = 1,
212		.ops = &clk_fixed_factor_ops,
213	},
214};
215
216static struct clk_alpha_pll_postdiv gpll1 = {
217	.offset = 0x1000,
218	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
219	.clkr.hw.init = &(struct clk_init_data){
220		.name = "gpll1",
221		.parent_names = (const char *[]){ "gpll1_early" },
222		.num_parents = 1,
223		.ops = &clk_alpha_pll_postdiv_ops,
224	},
225};
226
227static struct clk_alpha_pll gpll4_early = {
228	.offset = 0x77000,
229	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
230	.clkr = {
231		.enable_reg = 0x52000,
232		.enable_mask = BIT(4),
233		.hw.init = &(struct clk_init_data){
234			.name = "gpll4_early",
235			.parent_names = (const char *[]){ "xo" },
236			.num_parents = 1,
237			.ops = &clk_alpha_pll_ops,
238		},
239	},
240};
241
242static struct clk_alpha_pll_postdiv gpll4 = {
243	.offset = 0x77000,
244	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
245	.clkr.hw.init = &(struct clk_init_data)
246	{
247		.name = "gpll4",
248		.parent_names = (const char *[]) { "gpll4_early" },
249		.num_parents = 1,
250		.ops = &clk_alpha_pll_postdiv_ops,
251	},
252};
253
254static const struct freq_tbl ftbl_blsp1_qup1_i2c_apps_clk_src[] = {
255	F(19200000, P_XO, 1, 0, 0),
256	F(50000000, P_GPLL0, 12, 0, 0),
257	{ }
258};
259
260static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
261	.cmd_rcgr = 0x19020,
262	.mnd_width = 0,
263	.hid_width = 5,
264	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
265	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
266	.clkr.hw.init = &(struct clk_init_data){
267		.name = "blsp1_qup1_i2c_apps_clk_src",
268		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
269		.num_parents = 3,
270		.ops = &clk_rcg2_ops,
271	},
272};
273
274static const struct freq_tbl ftbl_blsp1_qup1_spi_apps_clk_src[] = {
275	F(960000, P_XO, 10, 1, 2),
276	F(4800000, P_XO, 4, 0, 0),
277	F(9600000, P_XO, 2, 0, 0),
278	F(15000000, P_GPLL0, 10, 1, 4),
279	F(19200000, P_XO, 1, 0, 0),
280	F(25000000, P_GPLL0, 12, 1, 2),
281	F(50000000, P_GPLL0, 12, 0, 0),
282	{ }
283};
284
285static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
286	.cmd_rcgr = 0x1900c,
287	.mnd_width = 8,
288	.hid_width = 5,
289	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
290	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
291	.clkr.hw.init = &(struct clk_init_data){
292		.name = "blsp1_qup1_spi_apps_clk_src",
293		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
294		.num_parents = 3,
295		.ops = &clk_rcg2_ops,
296	},
297};
298
299static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
300	.cmd_rcgr = 0x1b020,
301	.mnd_width = 0,
302	.hid_width = 5,
303	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
304	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
305	.clkr.hw.init = &(struct clk_init_data){
306		.name = "blsp1_qup2_i2c_apps_clk_src",
307		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
308		.num_parents = 3,
309		.ops = &clk_rcg2_ops,
310	},
311};
312
313static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
314	.cmd_rcgr = 0x1b00c,
315	.mnd_width = 8,
316	.hid_width = 5,
317	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
318	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
319	.clkr.hw.init = &(struct clk_init_data){
320		.name = "blsp1_qup2_spi_apps_clk_src",
321		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
322		.num_parents = 3,
323		.ops = &clk_rcg2_ops,
324	},
325};
326
327static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
328	.cmd_rcgr = 0x1d020,
329	.mnd_width = 0,
330	.hid_width = 5,
331	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
332	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
333	.clkr.hw.init = &(struct clk_init_data){
334		.name = "blsp1_qup3_i2c_apps_clk_src",
335		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
336		.num_parents = 3,
337		.ops = &clk_rcg2_ops,
338	},
339};
340
341static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
342	.cmd_rcgr = 0x1d00c,
343	.mnd_width = 8,
344	.hid_width = 5,
345	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
346	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
347	.clkr.hw.init = &(struct clk_init_data){
348		.name = "blsp1_qup3_spi_apps_clk_src",
349		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
350		.num_parents = 3,
351		.ops = &clk_rcg2_ops,
352	},
353};
354
355static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
356	.cmd_rcgr = 0x1f020,
357	.mnd_width = 0,
358	.hid_width = 5,
359	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
360	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
361	.clkr.hw.init = &(struct clk_init_data){
362		.name = "blsp1_qup4_i2c_apps_clk_src",
363		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
364		.num_parents = 3,
365		.ops = &clk_rcg2_ops,
366	},
367};
368
369static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
370	.cmd_rcgr = 0x1f00c,
371	.mnd_width = 8,
372	.hid_width = 5,
373	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
374	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
375	.clkr.hw.init = &(struct clk_init_data){
376		.name = "blsp1_qup4_spi_apps_clk_src",
377		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
378		.num_parents = 3,
379		.ops = &clk_rcg2_ops,
380	},
381};
382
383static const struct freq_tbl ftbl_blsp1_uart1_apps_clk_src[] = {
384	F(3686400, P_GPLL0, 1, 96, 15625),
385	F(7372800, P_GPLL0, 1, 192, 15625),
386	F(14745600, P_GPLL0, 1, 384, 15625),
387	F(16000000, P_GPLL0, 5, 2, 15),
388	F(19200000, P_XO, 1, 0, 0),
389	F(24000000, P_GPLL0, 5, 1, 5),
390	F(32000000, P_GPLL0, 1, 4, 75),
391	F(40000000, P_GPLL0, 15, 0, 0),
392	F(46400000, P_GPLL0, 1, 29, 375),
393	F(48000000, P_GPLL0, 12.5, 0, 0),
394	F(51200000, P_GPLL0, 1, 32, 375),
395	F(56000000, P_GPLL0, 1, 7, 75),
396	F(58982400, P_GPLL0, 1, 1536, 15625),
397	F(60000000, P_GPLL0, 10, 0, 0),
398	F(63157895, P_GPLL0, 9.5, 0, 0),
399	{ }
400};
401
402static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
403	.cmd_rcgr = 0x1a00c,
404	.mnd_width = 16,
405	.hid_width = 5,
406	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
407	.freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
408	.clkr.hw.init = &(struct clk_init_data){
409		.name = "blsp1_uart1_apps_clk_src",
410		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
411		.num_parents = 3,
412		.ops = &clk_rcg2_ops,
413	},
414};
415
416static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
417	.cmd_rcgr = 0x1c00c,
418	.mnd_width = 16,
419	.hid_width = 5,
420	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
421	.freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
422	.clkr.hw.init = &(struct clk_init_data){
423		.name = "blsp1_uart2_apps_clk_src",
424		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
425		.num_parents = 3,
426		.ops = &clk_rcg2_ops,
427	},
428};
429
430static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = {
431	.cmd_rcgr = 0x26020,
432	.mnd_width = 0,
433	.hid_width = 5,
434	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
435	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
436	.clkr.hw.init = &(struct clk_init_data){
437		.name = "blsp2_qup1_i2c_apps_clk_src",
438		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
439		.num_parents = 3,
440		.ops = &clk_rcg2_ops,
441	},
442};
443
444static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = {
445	.cmd_rcgr = 0x2600c,
446	.mnd_width = 8,
447	.hid_width = 5,
448	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
449	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
450	.clkr.hw.init = &(struct clk_init_data){
451		.name = "blsp2_qup1_spi_apps_clk_src",
452		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
453		.num_parents = 3,
454		.ops = &clk_rcg2_ops,
455	},
456};
457
458static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = {
459	.cmd_rcgr = 0x28020,
460	.mnd_width = 0,
461	.hid_width = 5,
462	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
463	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
464	.clkr.hw.init = &(struct clk_init_data){
465		.name = "blsp2_qup2_i2c_apps_clk_src",
466		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
467		.num_parents = 3,
468		.ops = &clk_rcg2_ops,
469	},
470};
471
472static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = {
473	.cmd_rcgr = 0x2800c,
474	.mnd_width = 8,
475	.hid_width = 5,
476	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
477	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
478	.clkr.hw.init = &(struct clk_init_data){
479		.name = "blsp2_qup2_spi_apps_clk_src",
480		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
481		.num_parents = 3,
482		.ops = &clk_rcg2_ops,
483	},
484};
485
486static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = {
487	.cmd_rcgr = 0x2a020,
488	.mnd_width = 0,
489	.hid_width = 5,
490	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
491	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
492	.clkr.hw.init = &(struct clk_init_data){
493		.name = "blsp2_qup3_i2c_apps_clk_src",
494		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
495		.num_parents = 3,
496		.ops = &clk_rcg2_ops,
497	},
498};
499
500static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = {
501	.cmd_rcgr = 0x2a00c,
502	.mnd_width = 8,
503	.hid_width = 5,
504	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
505	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
506	.clkr.hw.init = &(struct clk_init_data){
507		.name = "blsp2_qup3_spi_apps_clk_src",
508		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
509		.num_parents = 3,
510		.ops = &clk_rcg2_ops,
511	},
512};
513
514static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = {
515	.cmd_rcgr = 0x2c020,
516	.mnd_width = 0,
517	.hid_width = 5,
518	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
519	.freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
520	.clkr.hw.init = &(struct clk_init_data){
521		.name = "blsp2_qup4_i2c_apps_clk_src",
522		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
523		.num_parents = 3,
524		.ops = &clk_rcg2_ops,
525	},
526};
527
528static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = {
529	.cmd_rcgr = 0x2c00c,
530	.mnd_width = 8,
531	.hid_width = 5,
532	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
533	.freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
534	.clkr.hw.init = &(struct clk_init_data){
535		.name = "blsp2_qup4_spi_apps_clk_src",
536		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
537		.num_parents = 3,
538		.ops = &clk_rcg2_ops,
539	},
540};
541
542static struct clk_rcg2 blsp2_uart1_apps_clk_src = {
543	.cmd_rcgr = 0x2700c,
544	.mnd_width = 16,
545	.hid_width = 5,
546	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
547	.freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
548	.clkr.hw.init = &(struct clk_init_data){
549		.name = "blsp2_uart1_apps_clk_src",
550		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
551		.num_parents = 3,
552		.ops = &clk_rcg2_ops,
553	},
554};
555
556static struct clk_rcg2 blsp2_uart2_apps_clk_src = {
557	.cmd_rcgr = 0x2900c,
558	.mnd_width = 16,
559	.hid_width = 5,
560	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
561	.freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
562	.clkr.hw.init = &(struct clk_init_data){
563		.name = "blsp2_uart2_apps_clk_src",
564		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
565		.num_parents = 3,
566		.ops = &clk_rcg2_ops,
567	},
568};
569
570static const struct freq_tbl ftbl_gp1_clk_src[] = {
571	F(19200000, P_XO, 1, 0, 0),
572	F(100000000, P_GPLL0, 6, 0, 0),
573	F(200000000, P_GPLL0, 3, 0, 0),
574	{ }
575};
576
577static struct clk_rcg2 gp1_clk_src = {
578	.cmd_rcgr = 0x64004,
579	.mnd_width = 8,
580	.hid_width = 5,
581	.parent_map = gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div,
582	.freq_tbl = ftbl_gp1_clk_src,
583	.clkr.hw.init = &(struct clk_init_data){
584		.name = "gp1_clk_src",
585		.parent_names = gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div,
586		.num_parents = 4,
587		.ops = &clk_rcg2_ops,
588	},
589};
590
591static struct clk_rcg2 gp2_clk_src = {
592	.cmd_rcgr = 0x65004,
593	.mnd_width = 8,
594	.hid_width = 5,
595	.parent_map = gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div,
596	.freq_tbl = ftbl_gp1_clk_src,
597	.clkr.hw.init = &(struct clk_init_data){
598		.name = "gp2_clk_src",
599		.parent_names = gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div,
600		.num_parents = 4,
601		.ops = &clk_rcg2_ops,
602	},
603};
604
605static struct clk_rcg2 gp3_clk_src = {
606	.cmd_rcgr = 0x66004,
607	.mnd_width = 8,
608	.hid_width = 5,
609	.parent_map = gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div,
610	.freq_tbl = ftbl_gp1_clk_src,
611	.clkr.hw.init = &(struct clk_init_data){
612		.name = "gp3_clk_src",
613		.parent_names = gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div,
614		.num_parents = 4,
615		.ops = &clk_rcg2_ops,
616	},
617};
618
619static const struct freq_tbl ftbl_hmss_gpll0_clk_src[] = {
620	F(300000000, P_GPLL0, 2, 0, 0),
621	F(600000000, P_GPLL0, 1, 0, 0),
622	{ }
623};
624
625static struct clk_rcg2 hmss_gpll0_clk_src = {
626	.cmd_rcgr = 0x4805c,
627	.mnd_width = 0,
628	.hid_width = 5,
629	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
630	.freq_tbl = ftbl_hmss_gpll0_clk_src,
631	.clkr.hw.init = &(struct clk_init_data){
632		.name = "hmss_gpll0_clk_src",
633		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
634		.num_parents = 3,
635		.ops = &clk_rcg2_ops,
636	},
637};
638
639static const struct freq_tbl ftbl_hmss_gpll4_clk_src[] = {
640	F(384000000, P_GPLL4, 4, 0, 0),
641	F(768000000, P_GPLL4, 2, 0, 0),
642	F(1536000000, P_GPLL4, 1, 0, 0),
643	{ }
644};
645
646static struct clk_rcg2 hmss_gpll4_clk_src = {
647	.cmd_rcgr = 0x48074,
648	.mnd_width = 0,
649	.hid_width = 5,
650	.parent_map = gcc_parent_map_xo_gpll4,
651	.freq_tbl = ftbl_hmss_gpll4_clk_src,
652	.clkr.hw.init = &(struct clk_init_data){
653		.name = "hmss_gpll4_clk_src",
654		.parent_names = gcc_parent_names_xo_gpll4,
655		.num_parents = 2,
656		.ops = &clk_rcg2_ops,
657	},
658};
659
660static const struct freq_tbl ftbl_hmss_rbcpr_clk_src[] = {
661	F(19200000, P_XO, 1, 0, 0),
662	{ }
663};
664
665static struct clk_rcg2 hmss_rbcpr_clk_src = {
666	.cmd_rcgr = 0x48044,
667	.mnd_width = 0,
668	.hid_width = 5,
669	.parent_map = gcc_parent_map_xo_gpll0,
670	.freq_tbl = ftbl_hmss_rbcpr_clk_src,
671	.clkr.hw.init = &(struct clk_init_data){
672		.name = "hmss_rbcpr_clk_src",
673		.parent_names = gcc_parent_names_xo_gpll0,
674		.num_parents = 2,
675		.ops = &clk_rcg2_ops,
676	},
677};
678
679static const struct freq_tbl ftbl_pdm2_clk_src[] = {
680	F(60000000, P_GPLL0, 10, 0, 0),
681	{ }
682};
683
684static struct clk_rcg2 pdm2_clk_src = {
685	.cmd_rcgr = 0x33010,
686	.mnd_width = 0,
687	.hid_width = 5,
688	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
689	.freq_tbl = ftbl_pdm2_clk_src,
690	.clkr.hw.init = &(struct clk_init_data){
691		.name = "pdm2_clk_src",
692		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
693		.num_parents = 3,
694		.ops = &clk_rcg2_ops,
695	},
696};
697
698static const struct freq_tbl ftbl_qspi_ser_clk_src[] = {
699	F(19200000, P_XO, 1, 0, 0),
700	F(80200000, P_GPLL1_EARLY_DIV, 5, 0, 0),
701	F(160400000, P_GPLL1, 5, 0, 0),
702	F(267333333, P_GPLL1, 3, 0, 0),
703	{ }
704};
705
706static struct clk_rcg2 qspi_ser_clk_src = {
707	.cmd_rcgr = 0x4d00c,
708	.mnd_width = 0,
709	.hid_width = 5,
710	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
711	.freq_tbl = ftbl_qspi_ser_clk_src,
712	.clkr.hw.init = &(struct clk_init_data){
713		.name = "qspi_ser_clk_src",
714		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
715		.num_parents = 6,
716		.ops = &clk_rcg2_ops,
717	},
718};
719
720static const struct freq_tbl ftbl_sdcc1_apps_clk_src[] = {
721	F(144000, P_XO, 16, 3, 25),
722	F(400000, P_XO, 12, 1, 4),
723	F(20000000, P_GPLL0_EARLY_DIV, 5, 1, 3),
724	F(25000000, P_GPLL0_EARLY_DIV, 6, 1, 2),
725	F(50000000, P_GPLL0_EARLY_DIV, 6, 0, 0),
726	F(100000000, P_GPLL0, 6, 0, 0),
727	F(192000000, P_GPLL4, 8, 0, 0),
728	F(384000000, P_GPLL4, 4, 0, 0),
729	{ }
730};
731
732static struct clk_rcg2 sdcc1_apps_clk_src = {
733	.cmd_rcgr = 0x1602c,
734	.mnd_width = 8,
735	.hid_width = 5,
736	.parent_map = gcc_parent_map_xo_gpll0_gpll4_gpll0_early_div,
737	.freq_tbl = ftbl_sdcc1_apps_clk_src,
738	.clkr.hw.init = &(struct clk_init_data){
739		.name = "sdcc1_apps_clk_src",
740		.parent_names = gcc_parent_names_xo_gpll0_gpll4_gpll0_early_div,
741		.num_parents = 4,
742		.ops = &clk_rcg2_ops,
743	},
744};
745
746static const struct freq_tbl ftbl_sdcc1_ice_core_clk_src[] = {
747	F(75000000, P_GPLL0_EARLY_DIV, 4, 0, 0),
748	F(150000000, P_GPLL0, 4, 0, 0),
749	F(200000000, P_GPLL0, 3, 0, 0),
750	F(300000000, P_GPLL0, 2, 0, 0),
751	{ }
752};
753
754static struct clk_rcg2 sdcc1_ice_core_clk_src = {
755	.cmd_rcgr = 0x16010,
756	.mnd_width = 0,
757	.hid_width = 5,
758	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
759	.freq_tbl = ftbl_sdcc1_ice_core_clk_src,
760	.clkr.hw.init = &(struct clk_init_data){
761		.name = "sdcc1_ice_core_clk_src",
762		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
763		.num_parents = 3,
764		.ops = &clk_rcg2_ops,
765	},
766};
767
768static const struct freq_tbl ftbl_sdcc2_apps_clk_src[] = {
769	F(144000, P_XO, 16, 3, 25),
770	F(400000, P_XO, 12, 1, 4),
771	F(20000000, P_GPLL0_EARLY_DIV, 5, 1, 3),
772	F(25000000, P_GPLL0_EARLY_DIV, 6, 1, 2),
773	F(50000000, P_GPLL0_EARLY_DIV, 6, 0, 0),
774	F(100000000, P_GPLL0, 6, 0, 0),
775	F(192000000, P_GPLL4, 8, 0, 0),
776	F(200000000, P_GPLL0, 3, 0, 0),
777	{ }
778};
779
780static struct clk_rcg2 sdcc2_apps_clk_src = {
781	.cmd_rcgr = 0x14010,
782	.mnd_width = 8,
783	.hid_width = 5,
784	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div_gpll4,
785	.freq_tbl = ftbl_sdcc2_apps_clk_src,
786	.clkr.hw.init = &(struct clk_init_data){
787		.name = "sdcc2_apps_clk_src",
788		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div_gpll4,
789		.num_parents = 4,
790		.ops = &clk_rcg2_floor_ops,
791	},
792};
793
794static const struct freq_tbl ftbl_ufs_axi_clk_src[] = {
795	F(50000000, P_GPLL0_EARLY_DIV, 6, 0, 0),
796	F(100000000, P_GPLL0, 6, 0, 0),
797	F(150000000, P_GPLL0, 4, 0, 0),
798	F(200000000, P_GPLL0, 3, 0, 0),
799	F(240000000, P_GPLL0, 2.5, 0, 0),
800	{ }
801};
802
803static struct clk_rcg2 ufs_axi_clk_src = {
804	.cmd_rcgr = 0x75018,
805	.mnd_width = 8,
806	.hid_width = 5,
807	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
808	.freq_tbl = ftbl_ufs_axi_clk_src,
809	.clkr.hw.init = &(struct clk_init_data){
810		.name = "ufs_axi_clk_src",
811		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
812		.num_parents = 3,
813		.ops = &clk_rcg2_ops,
814	},
815};
816
817static const struct freq_tbl ftbl_ufs_ice_core_clk_src[] = {
818	F(75000000, P_GPLL0_EARLY_DIV, 4, 0, 0),
819	F(150000000, P_GPLL0, 4, 0, 0),
820	F(300000000, P_GPLL0, 2, 0, 0),
821	{ }
822};
823
824static struct clk_rcg2 ufs_ice_core_clk_src = {
825	.cmd_rcgr = 0x76010,
826	.mnd_width = 0,
827	.hid_width = 5,
828	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
829	.freq_tbl = ftbl_ufs_ice_core_clk_src,
830	.clkr.hw.init = &(struct clk_init_data){
831		.name = "ufs_ice_core_clk_src",
832		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
833		.num_parents = 3,
834		.ops = &clk_rcg2_ops,
835	},
836};
837
838static struct clk_rcg2 ufs_phy_aux_clk_src = {
839	.cmd_rcgr = 0x76044,
840	.mnd_width = 0,
841	.hid_width = 5,
842	.parent_map = gcc_parent_map_xo_sleep_clk,
843	.freq_tbl = ftbl_hmss_rbcpr_clk_src,
844	.clkr.hw.init = &(struct clk_init_data){
845		.name = "ufs_phy_aux_clk_src",
846		.parent_names = gcc_parent_names_xo_sleep_clk,
847		.num_parents = 2,
848		.ops = &clk_rcg2_ops,
849	},
850};
851
852static const struct freq_tbl ftbl_ufs_unipro_core_clk_src[] = {
853	F(37500000, P_GPLL0_EARLY_DIV, 8, 0, 0),
854	F(75000000, P_GPLL0, 8, 0, 0),
855	F(150000000, P_GPLL0, 4, 0, 0),
856	{ }
857};
858
859static struct clk_rcg2 ufs_unipro_core_clk_src = {
860	.cmd_rcgr = 0x76028,
861	.mnd_width = 0,
862	.hid_width = 5,
863	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
864	.freq_tbl = ftbl_ufs_unipro_core_clk_src,
865	.clkr.hw.init = &(struct clk_init_data){
866		.name = "ufs_unipro_core_clk_src",
867		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
868		.num_parents = 3,
869		.ops = &clk_rcg2_ops,
870	},
871};
872
873static const struct freq_tbl ftbl_usb20_master_clk_src[] = {
874	F(19200000, P_XO, 1, 0, 0),
875	F(60000000, P_GPLL0, 10, 0, 0),
876	F(120000000, P_GPLL0, 5, 0, 0),
877	{ }
878};
879
880static struct clk_rcg2 usb20_master_clk_src = {
881	.cmd_rcgr = 0x2f010,
882	.mnd_width = 8,
883	.hid_width = 5,
884	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
885	.freq_tbl = ftbl_usb20_master_clk_src,
886	.clkr.hw.init = &(struct clk_init_data){
887		.name = "usb20_master_clk_src",
888		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
889		.num_parents = 3,
890		.ops = &clk_rcg2_ops,
891	},
892};
893
894static const struct freq_tbl ftbl_usb20_mock_utmi_clk_src[] = {
895	F(19200000, P_XO, 1, 0, 0),
896	F(60000000, P_GPLL0, 10, 0, 0),
897	{ }
898};
899
900static struct clk_rcg2 usb20_mock_utmi_clk_src = {
901	.cmd_rcgr = 0x2f024,
902	.mnd_width = 0,
903	.hid_width = 5,
904	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
905	.freq_tbl = ftbl_usb20_mock_utmi_clk_src,
906	.clkr.hw.init = &(struct clk_init_data){
907		.name = "usb20_mock_utmi_clk_src",
908		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
909		.num_parents = 3,
910		.ops = &clk_rcg2_ops,
911	},
912};
913
914static const struct freq_tbl ftbl_usb30_master_clk_src[] = {
915	F(19200000, P_XO, 1, 0, 0),
916	F(66666667, P_GPLL0_EARLY_DIV, 4.5, 0, 0),
917	F(120000000, P_GPLL0, 5, 0, 0),
918	F(133333333, P_GPLL0, 4.5, 0, 0),
919	F(150000000, P_GPLL0, 4, 0, 0),
920	F(200000000, P_GPLL0, 3, 0, 0),
921	F(240000000, P_GPLL0, 2.5, 0, 0),
922	{ }
923};
924
925static struct clk_rcg2 usb30_master_clk_src = {
926	.cmd_rcgr = 0xf014,
927	.mnd_width = 8,
928	.hid_width = 5,
929	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
930	.freq_tbl = ftbl_usb30_master_clk_src,
931	.clkr.hw.init = &(struct clk_init_data){
932		.name = "usb30_master_clk_src",
933		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
934		.num_parents = 3,
935		.ops = &clk_rcg2_ops,
936	},
937};
938
939static const struct freq_tbl ftbl_usb30_mock_utmi_clk_src[] = {
940	F(19200000, P_XO, 1, 0, 0),
941	F(40000000, P_GPLL0_EARLY_DIV, 7.5, 0, 0),
942	F(60000000, P_GPLL0, 10, 0, 0),
943	{ }
944};
945
946static struct clk_rcg2 usb30_mock_utmi_clk_src = {
947	.cmd_rcgr = 0xf028,
948	.mnd_width = 0,
949	.hid_width = 5,
950	.parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
951	.freq_tbl = ftbl_usb30_mock_utmi_clk_src,
952	.clkr.hw.init = &(struct clk_init_data){
953		.name = "usb30_mock_utmi_clk_src",
954		.parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
955		.num_parents = 3,
956		.ops = &clk_rcg2_ops,
957	},
958};
959
960static const struct freq_tbl ftbl_usb3_phy_aux_clk_src[] = {
961	F(1200000, P_XO, 16, 0, 0),
962	F(19200000, P_XO, 1, 0, 0),
963	{ }
964};
965
966static struct clk_rcg2 usb3_phy_aux_clk_src = {
967	.cmd_rcgr = 0x5000c,
968	.mnd_width = 0,
969	.hid_width = 5,
970	.parent_map = gcc_parent_map_xo_sleep_clk,
971	.freq_tbl = ftbl_usb3_phy_aux_clk_src,
972	.clkr.hw.init = &(struct clk_init_data){
973		.name = "usb3_phy_aux_clk_src",
974		.parent_names = gcc_parent_names_xo_sleep_clk,
975		.num_parents = 2,
976		.ops = &clk_rcg2_ops,
977	},
978};
979
980static struct clk_branch gcc_aggre2_ufs_axi_clk = {
981	.halt_reg = 0x75034,
982	.halt_check = BRANCH_HALT,
983	.clkr = {
984		.enable_reg = 0x75034,
985		.enable_mask = BIT(0),
986		.hw.init = &(struct clk_init_data){
987			.name = "gcc_aggre2_ufs_axi_clk",
988			.parent_names = (const char *[]){
989				"ufs_axi_clk_src",
990			},
991			.num_parents = 1,
992			.ops = &clk_branch2_ops,
993		},
994	},
995};
996
997static struct clk_branch gcc_aggre2_usb3_axi_clk = {
998	.halt_reg = 0xf03c,
999	.halt_check = BRANCH_HALT,
1000	.clkr = {
1001		.enable_reg = 0xf03c,
1002		.enable_mask = BIT(0),
1003		.hw.init = &(struct clk_init_data){
1004			.name = "gcc_aggre2_usb3_axi_clk",
1005			.parent_names = (const char *[]){
1006				"usb30_master_clk_src",
1007			},
1008			.num_parents = 1,
1009			.ops = &clk_branch2_ops,
1010		},
1011	},
1012};
1013
1014static struct clk_branch gcc_bimc_gfx_clk = {
1015	.halt_reg = 0x7106c,
1016	.halt_check = BRANCH_VOTED,
1017	.clkr = {
1018		.enable_reg = 0x7106c,
1019		.enable_mask = BIT(0),
1020		.hw.init = &(struct clk_init_data){
1021			.name = "gcc_bimc_gfx_clk",
1022			.ops = &clk_branch2_ops,
1023		},
1024	},
1025};
1026
1027static struct clk_branch gcc_bimc_hmss_axi_clk = {
1028	.halt_reg = 0x48004,
1029	.halt_check = BRANCH_HALT_VOTED,
1030	.clkr = {
1031		.enable_reg = 0x52004,
1032		.enable_mask = BIT(22),
1033		.hw.init = &(struct clk_init_data){
1034			.name = "gcc_bimc_hmss_axi_clk",
1035			.ops = &clk_branch2_ops,
1036		},
1037	},
1038};
1039
1040static struct clk_branch gcc_bimc_mss_q6_axi_clk = {
1041	.halt_reg = 0x4401c,
1042	.halt_check = BRANCH_HALT,
1043	.clkr = {
1044		.enable_reg = 0x4401c,
1045		.enable_mask = BIT(0),
1046		.hw.init = &(struct clk_init_data){
1047			.name = "gcc_bimc_mss_q6_axi_clk",
1048			.ops = &clk_branch2_ops,
1049		},
1050	},
1051};
1052
1053static struct clk_branch gcc_blsp1_ahb_clk = {
1054	.halt_reg = 0x17004,
1055	.halt_check = BRANCH_HALT_VOTED,
1056	.clkr = {
1057		.enable_reg = 0x52004,
1058		.enable_mask = BIT(17),
1059		.hw.init = &(struct clk_init_data){
1060			.name = "gcc_blsp1_ahb_clk",
1061			.ops = &clk_branch2_ops,
1062		},
1063	},
1064};
1065
1066static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
1067	.halt_reg = 0x19008,
1068	.halt_check = BRANCH_HALT,
1069	.clkr = {
1070		.enable_reg = 0x19008,
1071		.enable_mask = BIT(0),
1072		.hw.init = &(struct clk_init_data){
1073			.name = "gcc_blsp1_qup1_i2c_apps_clk",
1074			.parent_names = (const char *[]){
1075				"blsp1_qup1_i2c_apps_clk_src",
1076			},
1077			.num_parents = 1,
1078			.flags = CLK_SET_RATE_PARENT,
1079			.ops = &clk_branch2_ops,
1080		},
1081	},
1082};
1083
1084static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
1085	.halt_reg = 0x19004,
1086	.halt_check = BRANCH_HALT,
1087	.clkr = {
1088		.enable_reg = 0x19004,
1089		.enable_mask = BIT(0),
1090		.hw.init = &(struct clk_init_data){
1091			.name = "gcc_blsp1_qup1_spi_apps_clk",
1092			.parent_names = (const char *[]){
1093				"blsp1_qup1_spi_apps_clk_src",
1094			},
1095			.num_parents = 1,
1096			.flags = CLK_SET_RATE_PARENT,
1097			.ops = &clk_branch2_ops,
1098		},
1099	},
1100};
1101
1102static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
1103	.halt_reg = 0x1b008,
1104	.halt_check = BRANCH_HALT,
1105	.clkr = {
1106		.enable_reg = 0x1b008,
1107		.enable_mask = BIT(0),
1108		.hw.init = &(struct clk_init_data){
1109			.name = "gcc_blsp1_qup2_i2c_apps_clk",
1110			.parent_names = (const char *[]){
1111				"blsp1_qup2_i2c_apps_clk_src",
1112			},
1113			.num_parents = 1,
1114			.flags = CLK_SET_RATE_PARENT,
1115			.ops = &clk_branch2_ops,
1116		},
1117	},
1118};
1119
1120static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
1121	.halt_reg = 0x1b004,
1122	.halt_check = BRANCH_HALT,
1123	.clkr = {
1124		.enable_reg = 0x1b004,
1125		.enable_mask = BIT(0),
1126		.hw.init = &(struct clk_init_data){
1127			.name = "gcc_blsp1_qup2_spi_apps_clk",
1128			.parent_names = (const char *[]){
1129				"blsp1_qup2_spi_apps_clk_src",
1130			},
1131			.num_parents = 1,
1132			.flags = CLK_SET_RATE_PARENT,
1133			.ops = &clk_branch2_ops,
1134		},
1135	},
1136};
1137
1138static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
1139	.halt_reg = 0x1d008,
1140	.halt_check = BRANCH_HALT,
1141	.clkr = {
1142		.enable_reg = 0x1d008,
1143		.enable_mask = BIT(0),
1144		.hw.init = &(struct clk_init_data){
1145			.name = "gcc_blsp1_qup3_i2c_apps_clk",
1146			.parent_names = (const char *[]){
1147				"blsp1_qup3_i2c_apps_clk_src",
1148			},
1149			.num_parents = 1,
1150			.flags = CLK_SET_RATE_PARENT,
1151			.ops = &clk_branch2_ops,
1152		},
1153	},
1154};
1155
1156static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
1157	.halt_reg = 0x1d004,
1158	.halt_check = BRANCH_HALT,
1159	.clkr = {
1160		.enable_reg = 0x1d004,
1161		.enable_mask = BIT(0),
1162		.hw.init = &(struct clk_init_data){
1163			.name = "gcc_blsp1_qup3_spi_apps_clk",
1164			.parent_names = (const char *[]){
1165				"blsp1_qup3_spi_apps_clk_src",
1166			},
1167			.num_parents = 1,
1168			.flags = CLK_SET_RATE_PARENT,
1169			.ops = &clk_branch2_ops,
1170		},
1171	},
1172};
1173
1174static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
1175	.halt_reg = 0x1f008,
1176	.halt_check = BRANCH_HALT,
1177	.clkr = {
1178		.enable_reg = 0x1f008,
1179		.enable_mask = BIT(0),
1180		.hw.init = &(struct clk_init_data){
1181			.name = "gcc_blsp1_qup4_i2c_apps_clk",
1182			.parent_names = (const char *[]){
1183				"blsp1_qup4_i2c_apps_clk_src",
1184			},
1185			.num_parents = 1,
1186			.flags = CLK_SET_RATE_PARENT,
1187			.ops = &clk_branch2_ops,
1188		},
1189	},
1190};
1191
1192static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
1193	.halt_reg = 0x1f004,
1194	.halt_check = BRANCH_HALT,
1195	.clkr = {
1196		.enable_reg = 0x1f004,
1197		.enable_mask = BIT(0),
1198		.hw.init = &(struct clk_init_data){
1199			.name = "gcc_blsp1_qup4_spi_apps_clk",
1200			.parent_names = (const char *[]){
1201				"blsp1_qup4_spi_apps_clk_src",
1202			},
1203			.num_parents = 1,
1204			.flags = CLK_SET_RATE_PARENT,
1205			.ops = &clk_branch2_ops,
1206		},
1207	},
1208};
1209
1210static struct clk_branch gcc_blsp1_uart1_apps_clk = {
1211	.halt_reg = 0x1a004,
1212	.halt_check = BRANCH_HALT,
1213	.clkr = {
1214		.enable_reg = 0x1a004,
1215		.enable_mask = BIT(0),
1216		.hw.init = &(struct clk_init_data){
1217			.name = "gcc_blsp1_uart1_apps_clk",
1218			.parent_names = (const char *[]){
1219				"blsp1_uart1_apps_clk_src",
1220			},
1221			.num_parents = 1,
1222			.flags = CLK_SET_RATE_PARENT,
1223			.ops = &clk_branch2_ops,
1224		},
1225	},
1226};
1227
1228static struct clk_branch gcc_blsp1_uart2_apps_clk = {
1229	.halt_reg = 0x1c004,
1230	.halt_check = BRANCH_HALT,
1231	.clkr = {
1232		.enable_reg = 0x1c004,
1233		.enable_mask = BIT(0),
1234		.hw.init = &(struct clk_init_data){
1235			.name = "gcc_blsp1_uart2_apps_clk",
1236			.parent_names = (const char *[]){
1237				"blsp1_uart2_apps_clk_src",
1238			},
1239			.num_parents = 1,
1240			.flags = CLK_SET_RATE_PARENT,
1241			.ops = &clk_branch2_ops,
1242		},
1243	},
1244};
1245
1246static struct clk_branch gcc_blsp2_ahb_clk = {
1247	.halt_reg = 0x25004,
1248	.halt_check = BRANCH_HALT_VOTED,
1249	.clkr = {
1250		.enable_reg = 0x52004,
1251		.enable_mask = BIT(15),
1252		.hw.init = &(struct clk_init_data){
1253			.name = "gcc_blsp2_ahb_clk",
1254			.ops = &clk_branch2_ops,
1255		},
1256	},
1257};
1258
1259static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = {
1260	.halt_reg = 0x26008,
1261	.halt_check = BRANCH_HALT,
1262	.clkr = {
1263		.enable_reg = 0x26008,
1264		.enable_mask = BIT(0),
1265		.hw.init = &(struct clk_init_data){
1266			.name = "gcc_blsp2_qup1_i2c_apps_clk",
1267			.parent_names = (const char *[]){
1268				"blsp2_qup1_i2c_apps_clk_src",
1269			},
1270			.num_parents = 1,
1271			.flags = CLK_SET_RATE_PARENT,
1272			.ops = &clk_branch2_ops,
1273		},
1274	},
1275};
1276
1277static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = {
1278	.halt_reg = 0x26004,
1279	.halt_check = BRANCH_HALT,
1280	.clkr = {
1281		.enable_reg = 0x26004,
1282		.enable_mask = BIT(0),
1283		.hw.init = &(struct clk_init_data){
1284			.name = "gcc_blsp2_qup1_spi_apps_clk",
1285			.parent_names = (const char *[]){
1286				"blsp2_qup1_spi_apps_clk_src",
1287			},
1288			.num_parents = 1,
1289			.flags = CLK_SET_RATE_PARENT,
1290			.ops = &clk_branch2_ops,
1291		},
1292	},
1293};
1294
1295static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = {
1296	.halt_reg = 0x28008,
1297	.halt_check = BRANCH_HALT,
1298	.clkr = {
1299		.enable_reg = 0x28008,
1300		.enable_mask = BIT(0),
1301		.hw.init = &(struct clk_init_data){
1302			.name = "gcc_blsp2_qup2_i2c_apps_clk",
1303			.parent_names = (const char *[]){
1304				"blsp2_qup2_i2c_apps_clk_src",
1305			},
1306			.num_parents = 1,
1307			.flags = CLK_SET_RATE_PARENT,
1308			.ops = &clk_branch2_ops,
1309		},
1310	},
1311};
1312
1313static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = {
1314	.halt_reg = 0x28004,
1315	.halt_check = BRANCH_HALT,
1316	.clkr = {
1317		.enable_reg = 0x28004,
1318		.enable_mask = BIT(0),
1319		.hw.init = &(struct clk_init_data){
1320			.name = "gcc_blsp2_qup2_spi_apps_clk",
1321			.parent_names = (const char *[]){
1322				"blsp2_qup2_spi_apps_clk_src",
1323			},
1324			.num_parents = 1,
1325			.flags = CLK_SET_RATE_PARENT,
1326			.ops = &clk_branch2_ops,
1327		},
1328	},
1329};
1330
1331static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = {
1332	.halt_reg = 0x2a008,
1333	.halt_check = BRANCH_HALT,
1334	.clkr = {
1335		.enable_reg = 0x2a008,
1336		.enable_mask = BIT(0),
1337		.hw.init = &(struct clk_init_data){
1338			.name = "gcc_blsp2_qup3_i2c_apps_clk",
1339			.parent_names = (const char *[]){
1340				"blsp2_qup3_i2c_apps_clk_src",
1341			},
1342			.num_parents = 1,
1343			.flags = CLK_SET_RATE_PARENT,
1344			.ops = &clk_branch2_ops,
1345		},
1346	},
1347};
1348
1349static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = {
1350	.halt_reg = 0x2a004,
1351	.halt_check = BRANCH_HALT,
1352	.clkr = {
1353		.enable_reg = 0x2a004,
1354		.enable_mask = BIT(0),
1355		.hw.init = &(struct clk_init_data){
1356			.name = "gcc_blsp2_qup3_spi_apps_clk",
1357			.parent_names = (const char *[]){
1358				"blsp2_qup3_spi_apps_clk_src",
1359			},
1360			.num_parents = 1,
1361			.flags = CLK_SET_RATE_PARENT,
1362			.ops = &clk_branch2_ops,
1363		},
1364	},
1365};
1366
1367static struct clk_branch gcc_blsp2_qup4_i2c_apps_clk = {
1368	.halt_reg = 0x2c008,
1369	.halt_check = BRANCH_HALT,
1370	.clkr = {
1371		.enable_reg = 0x2c008,
1372		.enable_mask = BIT(0),
1373		.hw.init = &(struct clk_init_data){
1374			.name = "gcc_blsp2_qup4_i2c_apps_clk",
1375			.parent_names = (const char *[]){
1376				"blsp2_qup4_i2c_apps_clk_src",
1377			},
1378			.num_parents = 1,
1379			.flags = CLK_SET_RATE_PARENT,
1380			.ops = &clk_branch2_ops,
1381		},
1382	},
1383};
1384
1385static struct clk_branch gcc_blsp2_qup4_spi_apps_clk = {
1386	.halt_reg = 0x2c004,
1387	.halt_check = BRANCH_HALT,
1388	.clkr = {
1389		.enable_reg = 0x2c004,
1390		.enable_mask = BIT(0),
1391		.hw.init = &(struct clk_init_data){
1392			.name = "gcc_blsp2_qup4_spi_apps_clk",
1393			.parent_names = (const char *[]){
1394				"blsp2_qup4_spi_apps_clk_src",
1395			},
1396			.num_parents = 1,
1397			.flags = CLK_SET_RATE_PARENT,
1398			.ops = &clk_branch2_ops,
1399		},
1400	},
1401};
1402
1403static struct clk_branch gcc_blsp2_uart1_apps_clk = {
1404	.halt_reg = 0x27004,
1405	.halt_check = BRANCH_HALT,
1406	.clkr = {
1407		.enable_reg = 0x27004,
1408		.enable_mask = BIT(0),
1409		.hw.init = &(struct clk_init_data){
1410			.name = "gcc_blsp2_uart1_apps_clk",
1411			.parent_names = (const char *[]){
1412				"blsp2_uart1_apps_clk_src",
1413			},
1414			.num_parents = 1,
1415			.flags = CLK_SET_RATE_PARENT,
1416			.ops = &clk_branch2_ops,
1417		},
1418	},
1419};
1420
1421static struct clk_branch gcc_blsp2_uart2_apps_clk = {
1422	.halt_reg = 0x29004,
1423	.halt_check = BRANCH_HALT,
1424	.clkr = {
1425		.enable_reg = 0x29004,
1426		.enable_mask = BIT(0),
1427		.hw.init = &(struct clk_init_data){
1428			.name = "gcc_blsp2_uart2_apps_clk",
1429			.parent_names = (const char *[]){
1430				"blsp2_uart2_apps_clk_src",
1431			},
1432			.num_parents = 1,
1433			.flags = CLK_SET_RATE_PARENT,
1434			.ops = &clk_branch2_ops,
1435		},
1436	},
1437};
1438
1439static struct clk_branch gcc_boot_rom_ahb_clk = {
1440	.halt_reg = 0x38004,
1441	.halt_check = BRANCH_HALT_VOTED,
1442	.clkr = {
1443		.enable_reg = 0x52004,
1444		.enable_mask = BIT(10),
1445		.hw.init = &(struct clk_init_data){
1446			.name = "gcc_boot_rom_ahb_clk",
1447			.ops = &clk_branch2_ops,
1448		},
1449	},
1450};
1451
1452static struct clk_branch gcc_cfg_noc_usb2_axi_clk = {
1453	.halt_reg = 0x5058,
1454	.halt_check = BRANCH_HALT,
1455	.clkr = {
1456		.enable_reg = 0x5058,
1457		.enable_mask = BIT(0),
1458		.hw.init = &(struct clk_init_data){
1459			.name = "gcc_cfg_noc_usb2_axi_clk",
1460			.parent_names = (const char *[]){
1461				"usb20_master_clk_src",
1462			},
1463			.num_parents = 1,
1464			.ops = &clk_branch2_ops,
1465		},
1466	},
1467};
1468
1469static struct clk_branch gcc_cfg_noc_usb3_axi_clk = {
1470	.halt_reg = 0x5018,
1471	.halt_check = BRANCH_HALT,
1472	.clkr = {
1473		.enable_reg = 0x5018,
1474		.enable_mask = BIT(0),
1475		.hw.init = &(struct clk_init_data){
1476			.name = "gcc_cfg_noc_usb3_axi_clk",
1477			.parent_names = (const char *[]){
1478				"usb30_master_clk_src",
1479			},
1480			.num_parents = 1,
1481			.ops = &clk_branch2_ops,
1482		},
1483	},
1484};
1485
1486static struct clk_branch gcc_dcc_ahb_clk = {
1487	.halt_reg = 0x84004,
1488	.clkr = {
1489		.enable_reg = 0x84004,
1490		.enable_mask = BIT(0),
1491		.hw.init = &(struct clk_init_data){
1492			.name = "gcc_dcc_ahb_clk",
1493			.ops = &clk_branch2_ops,
1494		},
1495	},
1496};
1497
1498static struct clk_branch gcc_gp1_clk = {
1499	.halt_reg = 0x64000,
1500	.halt_check = BRANCH_HALT,
1501	.clkr = {
1502		.enable_reg = 0x64000,
1503		.enable_mask = BIT(0),
1504		.hw.init = &(struct clk_init_data){
1505			.name = "gcc_gp1_clk",
1506			.parent_names = (const char *[]){
1507				"gp1_clk_src",
1508			},
1509			.num_parents = 1,
1510			.flags = CLK_SET_RATE_PARENT,
1511			.ops = &clk_branch2_ops,
1512		},
1513	},
1514};
1515
1516static struct clk_branch gcc_gp2_clk = {
1517	.halt_reg = 0x65000,
1518	.halt_check = BRANCH_HALT,
1519	.clkr = {
1520		.enable_reg = 0x65000,
1521		.enable_mask = BIT(0),
1522		.hw.init = &(struct clk_init_data){
1523			.name = "gcc_gp2_clk",
1524			.parent_names = (const char *[]){
1525				"gp2_clk_src",
1526			},
1527			.num_parents = 1,
1528			.flags = CLK_SET_RATE_PARENT,
1529			.ops = &clk_branch2_ops,
1530		},
1531	},
1532};
1533
1534static struct clk_branch gcc_gp3_clk = {
1535	.halt_reg = 0x66000,
1536	.halt_check = BRANCH_HALT,
1537	.clkr = {
1538		.enable_reg = 0x66000,
1539		.enable_mask = BIT(0),
1540		.hw.init = &(struct clk_init_data){
1541			.name = "gcc_gp3_clk",
1542			.parent_names = (const char *[]){
1543				"gp3_clk_src",
1544			},
1545			.num_parents = 1,
1546			.flags = CLK_SET_RATE_PARENT,
1547			.ops = &clk_branch2_ops,
1548		},
1549	},
1550};
1551
1552static struct clk_branch gcc_gpu_bimc_gfx_clk = {
1553	.halt_reg = 0x71010,
1554	.halt_check = BRANCH_VOTED,
1555	.clkr = {
1556		.enable_reg = 0x71010,
1557		.enable_mask = BIT(0),
1558		.hw.init = &(struct clk_init_data){
1559			.name = "gcc_gpu_bimc_gfx_clk",
1560			.ops = &clk_branch2_ops,
1561		},
1562	},
1563};
1564
1565static struct clk_branch gcc_gpu_cfg_ahb_clk = {
1566	.halt_reg = 0x71004,
1567	.halt_check = BRANCH_VOTED,
1568	.clkr = {
1569		.enable_reg = 0x71004,
1570		.enable_mask = BIT(0),
1571		.hw.init = &(struct clk_init_data){
1572			.name = "gcc_gpu_cfg_ahb_clk",
1573			.ops = &clk_branch2_ops,
1574		},
1575	},
1576};
1577
1578static struct clk_branch gcc_gpu_gpll0_clk = {
1579	.halt_reg = 0x5200c,
1580	.halt_check = BRANCH_HALT_DELAY,
1581	.clkr = {
1582		.enable_reg = 0x5200c,
1583		.enable_mask = BIT(4),
1584		.hw.init = &(struct clk_init_data){
1585			.name = "gcc_gpu_gpll0_clk",
1586			.parent_names = (const char *[]){
1587				"gpll0",
1588			},
1589			.num_parents = 1,
1590			.ops = &clk_branch2_ops,
1591		},
1592	},
1593};
1594
1595static struct clk_branch gcc_gpu_gpll0_div_clk = {
1596	.halt_reg = 0x5200c,
1597	.halt_check = BRANCH_HALT_DELAY,
1598	.clkr = {
1599		.enable_reg = 0x5200c,
1600		.enable_mask = BIT(3),
1601		.hw.init = &(struct clk_init_data){
1602			.name = "gcc_gpu_gpll0_div_clk",
1603			.parent_names = (const char *[]){
1604				"gpll0_early_div",
1605			},
1606			.num_parents = 1,
1607			.ops = &clk_branch2_ops,
1608		},
1609	},
1610};
1611
1612static struct clk_branch gcc_hmss_dvm_bus_clk = {
1613	.halt_reg = 0x4808c,
1614	.halt_check = BRANCH_HALT,
1615	.clkr = {
1616		.enable_reg = 0x4808c,
1617		.enable_mask = BIT(0),
1618		.hw.init = &(struct clk_init_data){
1619			.name = "gcc_hmss_dvm_bus_clk",
1620			.ops = &clk_branch2_ops,
1621			.flags = CLK_IGNORE_UNUSED,
1622		},
1623	},
1624};
1625
1626static struct clk_branch gcc_hmss_rbcpr_clk = {
1627	.halt_reg = 0x48008,
1628	.halt_check = BRANCH_HALT,
1629	.clkr = {
1630		.enable_reg = 0x48008,
1631		.enable_mask = BIT(0),
1632		.hw.init = &(struct clk_init_data){
1633			.name = "gcc_hmss_rbcpr_clk",
1634			.parent_names = (const char *[]){
1635				"hmss_rbcpr_clk_src",
1636			},
1637			.num_parents = 1,
1638			.flags = CLK_SET_RATE_PARENT,
1639			.ops = &clk_branch2_ops,
1640		},
1641	},
1642};
1643
1644static struct clk_branch gcc_mmss_gpll0_clk = {
1645	.halt_reg = 0x5200c,
1646	.halt_check = BRANCH_HALT_DELAY,
1647	.clkr = {
1648		.enable_reg = 0x5200c,
1649		.enable_mask = BIT(1),
1650		.hw.init = &(struct clk_init_data){
1651			.name = "gcc_mmss_gpll0_clk",
1652			.parent_names = (const char *[]){
1653				"gpll0",
1654			},
1655			.num_parents = 1,
1656			.ops = &clk_branch2_ops,
1657		},
1658	},
1659};
1660
1661static struct clk_branch gcc_mmss_gpll0_div_clk = {
1662	.halt_reg = 0x5200c,
1663	.halt_check = BRANCH_HALT_DELAY,
1664	.clkr = {
1665		.enable_reg = 0x5200c,
1666		.enable_mask = BIT(0),
1667		.hw.init = &(struct clk_init_data){
1668			.name = "gcc_mmss_gpll0_div_clk",
1669			.parent_names = (const char *[]){
1670				"gpll0_early_div",
1671			},
1672			.num_parents = 1,
1673			.ops = &clk_branch2_ops,
1674		},
1675	},
1676};
1677
1678static struct clk_branch gcc_mmss_noc_cfg_ahb_clk = {
1679	.halt_reg = 0x9004,
1680	.halt_check = BRANCH_HALT,
1681	.clkr = {
1682		.enable_reg = 0x9004,
1683		.enable_mask = BIT(0),
1684		.hw.init = &(struct clk_init_data){
1685			.name = "gcc_mmss_noc_cfg_ahb_clk",
1686			.ops = &clk_branch2_ops,
1687		},
1688	},
1689};
1690
1691static struct clk_branch gcc_mmss_sys_noc_axi_clk = {
1692	.halt_reg = 0x9000,
1693	.halt_check = BRANCH_HALT,
1694	.clkr = {
1695		.enable_reg = 0x9000,
1696		.enable_mask = BIT(0),
1697		.hw.init = &(struct clk_init_data){
1698			.name = "gcc_mmss_sys_noc_axi_clk",
1699			.ops = &clk_branch2_ops,
1700		},
1701	},
1702};
1703
1704static struct clk_branch gcc_mss_cfg_ahb_clk = {
1705	.halt_reg = 0x8a000,
1706	.clkr = {
1707		.enable_reg = 0x8a000,
1708		.enable_mask = BIT(0),
1709		.hw.init = &(struct clk_init_data){
1710			.name = "gcc_mss_cfg_ahb_clk",
1711			.ops = &clk_branch2_ops,
1712		},
1713	},
1714};
1715
1716static struct clk_branch gcc_mss_mnoc_bimc_axi_clk = {
1717	.halt_reg = 0x8a004,
1718	.halt_check = BRANCH_HALT,
1719	.hwcg_reg = 0x8a004,
1720	.hwcg_bit = 1,
1721	.clkr = {
1722		.enable_reg = 0x8a004,
1723		.enable_mask = BIT(0),
1724		.hw.init = &(struct clk_init_data){
1725			.name = "gcc_mss_mnoc_bimc_axi_clk",
1726			.ops = &clk_branch2_ops,
1727		},
1728	},
1729};
1730
1731static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
1732	.halt_reg = 0x8a040,
1733	.clkr = {
1734		.enable_reg = 0x8a040,
1735		.enable_mask = BIT(0),
1736		.hw.init = &(struct clk_init_data){
1737			.name = "gcc_mss_q6_bimc_axi_clk",
1738			.ops = &clk_branch2_ops,
1739		},
1740	},
1741};
1742
1743static struct clk_branch gcc_mss_snoc_axi_clk = {
1744	.halt_reg = 0x8a03c,
1745	.clkr = {
1746		.enable_reg = 0x8a03c,
1747		.enable_mask = BIT(0),
1748		.hw.init = &(struct clk_init_data){
1749			.name = "gcc_mss_snoc_axi_clk",
1750			.ops = &clk_branch2_ops,
1751		},
1752	},
1753};
1754
1755static struct clk_branch gcc_pdm2_clk = {
1756	.halt_reg = 0x3300c,
1757	.halt_check = BRANCH_HALT,
1758	.clkr = {
1759		.enable_reg = 0x3300c,
1760		.enable_mask = BIT(0),
1761		.hw.init = &(struct clk_init_data){
1762			.name = "gcc_pdm2_clk",
1763			.parent_names = (const char *[]){
1764				"pdm2_clk_src",
1765			},
1766			.num_parents = 1,
1767			.flags = CLK_SET_RATE_PARENT,
1768			.ops = &clk_branch2_ops,
1769		},
1770	},
1771};
1772
1773static struct clk_branch gcc_pdm_ahb_clk = {
1774	.halt_reg = 0x33004,
1775	.halt_check = BRANCH_HALT,
1776	.clkr = {
1777		.enable_reg = 0x33004,
1778		.enable_mask = BIT(0),
1779		.hw.init = &(struct clk_init_data){
1780			.name = "gcc_pdm_ahb_clk",
1781			.ops = &clk_branch2_ops,
1782		},
1783	},
1784};
1785
1786static struct clk_branch gcc_prng_ahb_clk = {
1787	.halt_reg = 0x34004,
1788	.halt_check = BRANCH_HALT_VOTED,
1789	.clkr = {
1790		.enable_reg = 0x52004,
1791		.enable_mask = BIT(13),
1792		.hw.init = &(struct clk_init_data){
1793			.name = "gcc_prng_ahb_clk",
1794			.ops = &clk_branch2_ops,
1795		},
1796	},
1797};
1798
1799static struct clk_branch gcc_qspi_ahb_clk = {
1800	.halt_reg = 0x4d004,
1801	.halt_check = BRANCH_HALT,
1802	.clkr = {
1803		.enable_reg = 0x4d004,
1804		.enable_mask = BIT(0),
1805		.hw.init = &(struct clk_init_data){
1806			.name = "gcc_qspi_ahb_clk",
1807			.ops = &clk_branch2_ops,
1808		},
1809	},
1810};
1811
1812static struct clk_branch gcc_qspi_ser_clk = {
1813	.halt_reg = 0x4d008,
1814	.halt_check = BRANCH_HALT,
1815	.clkr = {
1816		.enable_reg = 0x4d008,
1817		.enable_mask = BIT(0),
1818		.hw.init = &(struct clk_init_data){
1819			.name = "gcc_qspi_ser_clk",
1820			.parent_names = (const char *[]){
1821				"qspi_ser_clk_src",
1822			},
1823			.num_parents = 1,
1824			.flags = CLK_SET_RATE_PARENT,
1825			.ops = &clk_branch2_ops,
1826		},
1827	},
1828};
1829
1830static struct clk_branch gcc_rx0_usb2_clkref_clk = {
1831	.halt_reg = 0x88018,
1832	.halt_check = BRANCH_HALT_VOTED,
1833	.clkr = {
1834		.enable_reg = 0x88018,
1835		.enable_mask = BIT(0),
1836		.hw.init = &(struct clk_init_data){
1837			.name = "gcc_rx0_usb2_clkref_clk",
1838			.ops = &clk_branch2_ops,
1839		},
1840	},
1841};
1842
1843static struct clk_branch gcc_rx1_usb2_clkref_clk = {
1844	.halt_reg = 0x88014,
1845	.halt_check = BRANCH_HALT_VOTED,
1846	.clkr = {
1847		.enable_reg = 0x88014,
1848		.enable_mask = BIT(0),
1849		.hw.init = &(struct clk_init_data){
1850			.name = "gcc_rx1_usb2_clkref_clk",
1851			.ops = &clk_branch2_ops,
1852		},
1853	},
1854};
1855
1856static struct clk_branch gcc_sdcc1_ahb_clk = {
1857	.halt_reg = 0x16008,
1858	.halt_check = BRANCH_HALT,
1859	.clkr = {
1860		.enable_reg = 0x16008,
1861		.enable_mask = BIT(0),
1862		.hw.init = &(struct clk_init_data){
1863			.name = "gcc_sdcc1_ahb_clk",
1864			.ops = &clk_branch2_ops,
1865		},
1866	},
1867};
1868
1869static struct clk_branch gcc_sdcc1_apps_clk = {
1870	.halt_reg = 0x16004,
1871	.halt_check = BRANCH_HALT,
1872	.clkr = {
1873		.enable_reg = 0x16004,
1874		.enable_mask = BIT(0),
1875		.hw.init = &(struct clk_init_data){
1876			.name = "gcc_sdcc1_apps_clk",
1877			.parent_names = (const char *[]){
1878				"sdcc1_apps_clk_src",
1879			},
1880			.num_parents = 1,
1881			.flags = CLK_SET_RATE_PARENT,
1882			.ops = &clk_branch2_ops,
1883		},
1884	},
1885};
1886
1887static struct clk_branch gcc_sdcc1_ice_core_clk = {
1888	.halt_reg = 0x1600c,
1889	.halt_check = BRANCH_HALT,
1890	.clkr = {
1891		.enable_reg = 0x1600c,
1892		.enable_mask = BIT(0),
1893		.hw.init = &(struct clk_init_data){
1894			.name = "gcc_sdcc1_ice_core_clk",
1895			.parent_names = (const char *[]){
1896				"sdcc1_ice_core_clk_src",
1897			},
1898			.num_parents = 1,
1899			.flags = CLK_SET_RATE_PARENT,
1900			.ops = &clk_branch2_ops,
1901		},
1902	},
1903};
1904
1905static struct clk_branch gcc_sdcc2_ahb_clk = {
1906	.halt_reg = 0x14008,
1907	.halt_check = BRANCH_HALT,
1908	.clkr = {
1909		.enable_reg = 0x14008,
1910		.enable_mask = BIT(0),
1911		.hw.init = &(struct clk_init_data){
1912			.name = "gcc_sdcc2_ahb_clk",
1913			.ops = &clk_branch2_ops,
1914		},
1915	},
1916};
1917
1918static struct clk_branch gcc_sdcc2_apps_clk = {
1919	.halt_reg = 0x14004,
1920	.halt_check = BRANCH_HALT,
1921	.clkr = {
1922		.enable_reg = 0x14004,
1923		.enable_mask = BIT(0),
1924		.hw.init = &(struct clk_init_data){
1925			.name = "gcc_sdcc2_apps_clk",
1926			.parent_names = (const char *[]){
1927				"sdcc2_apps_clk_src",
1928			},
1929			.num_parents = 1,
1930			.flags = CLK_SET_RATE_PARENT,
1931			.ops = &clk_branch2_ops,
1932		},
1933	},
1934};
1935
1936static struct clk_branch gcc_ufs_ahb_clk = {
1937	.halt_reg = 0x7500c,
1938	.halt_check = BRANCH_HALT,
1939	.clkr = {
1940		.enable_reg = 0x7500c,
1941		.enable_mask = BIT(0),
1942		.hw.init = &(struct clk_init_data){
1943			.name = "gcc_ufs_ahb_clk",
1944			.ops = &clk_branch2_ops,
1945		},
1946	},
1947};
1948
1949static struct clk_branch gcc_ufs_axi_clk = {
1950	.halt_reg = 0x75008,
1951	.halt_check = BRANCH_HALT,
1952	.clkr = {
1953		.enable_reg = 0x75008,
1954		.enable_mask = BIT(0),
1955		.hw.init = &(struct clk_init_data){
1956			.name = "gcc_ufs_axi_clk",
1957			.parent_names = (const char *[]){
1958				"ufs_axi_clk_src",
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_ufs_clkref_clk = {
1968	.halt_reg = 0x88008,
1969	.halt_check = BRANCH_HALT,
1970	.clkr = {
1971		.enable_reg = 0x88008,
1972		.enable_mask = BIT(0),
1973		.hw.init = &(struct clk_init_data){
1974			.name = "gcc_ufs_clkref_clk",
1975			.ops = &clk_branch2_ops,
1976		},
1977	},
1978};
1979
1980static struct clk_branch gcc_ufs_ice_core_clk = {
1981	.halt_reg = 0x7600c,
1982	.halt_check = BRANCH_HALT,
1983	.clkr = {
1984		.enable_reg = 0x7600c,
1985		.enable_mask = BIT(0),
1986		.hw.init = &(struct clk_init_data){
1987			.name = "gcc_ufs_ice_core_clk",
1988			.parent_names = (const char *[]){
1989				"ufs_ice_core_clk_src",
1990			},
1991			.num_parents = 1,
1992			.flags = CLK_SET_RATE_PARENT,
1993			.ops = &clk_branch2_ops,
1994		},
1995	},
1996};
1997
1998static struct clk_branch gcc_ufs_phy_aux_clk = {
1999	.halt_reg = 0x76040,
2000	.halt_check = BRANCH_HALT,
2001	.clkr = {
2002		.enable_reg = 0x76040,
2003		.enable_mask = BIT(0),
2004		.hw.init = &(struct clk_init_data){
2005			.name = "gcc_ufs_phy_aux_clk",
2006			.parent_names = (const char *[]){
2007				"ufs_phy_aux_clk_src",
2008			},
2009			.num_parents = 1,
2010			.flags = CLK_SET_RATE_PARENT,
2011			.ops = &clk_branch2_ops,
2012		},
2013	},
2014};
2015
2016static struct clk_branch gcc_ufs_rx_symbol_0_clk = {
2017	.halt_reg = 0x75014,
2018	.halt_check = BRANCH_HALT_SKIP,
2019	.clkr = {
2020		.enable_reg = 0x75014,
2021		.enable_mask = BIT(0),
2022		.hw.init = &(struct clk_init_data){
2023			.name = "gcc_ufs_rx_symbol_0_clk",
2024			.ops = &clk_branch2_ops,
2025		},
2026	},
2027};
2028
2029static struct clk_branch gcc_ufs_rx_symbol_1_clk = {
2030	.halt_reg = 0x7605c,
2031	.halt_check = BRANCH_HALT_SKIP,
2032	.clkr = {
2033		.enable_reg = 0x7605c,
2034		.enable_mask = BIT(0),
2035		.hw.init = &(struct clk_init_data){
2036			.name = "gcc_ufs_rx_symbol_1_clk",
2037			.ops = &clk_branch2_ops,
2038		},
2039	},
2040};
2041
2042static struct clk_branch gcc_ufs_tx_symbol_0_clk = {
2043	.halt_reg = 0x75010,
2044	.halt_check = BRANCH_HALT_SKIP,
2045	.clkr = {
2046		.enable_reg = 0x75010,
2047		.enable_mask = BIT(0),
2048		.hw.init = &(struct clk_init_data){
2049			.name = "gcc_ufs_tx_symbol_0_clk",
2050			.ops = &clk_branch2_ops,
2051		},
2052	},
2053};
2054
2055static struct clk_branch gcc_ufs_unipro_core_clk = {
2056	.halt_reg = 0x76008,
2057	.halt_check = BRANCH_HALT,
2058	.clkr = {
2059		.enable_reg = 0x76008,
2060		.enable_mask = BIT(0),
2061		.hw.init = &(struct clk_init_data){
2062			.name = "gcc_ufs_unipro_core_clk",
2063			.parent_names = (const char *[]){
2064				"ufs_unipro_core_clk_src",
2065			},
2066			.flags = CLK_SET_RATE_PARENT,
2067			.num_parents = 1,
2068			.ops = &clk_branch2_ops,
2069		},
2070	},
2071};
2072
2073static struct clk_branch gcc_usb20_master_clk = {
2074	.halt_reg = 0x2f004,
2075	.halt_check = BRANCH_HALT,
2076	.clkr = {
2077		.enable_reg = 0x2f004,
2078		.enable_mask = BIT(0),
2079		.hw.init = &(struct clk_init_data){
2080			.name = "gcc_usb20_master_clk",
2081			.parent_names = (const char *[]){
2082				"usb20_master_clk_src"
2083			},
2084			.flags = CLK_SET_RATE_PARENT,
2085			.num_parents = 1,
2086			.ops = &clk_branch2_ops,
2087		},
2088	},
2089};
2090
2091static struct clk_branch gcc_usb20_mock_utmi_clk = {
2092	.halt_reg = 0x2f00c,
2093	.halt_check = BRANCH_HALT,
2094	.clkr = {
2095		.enable_reg = 0x2f00c,
2096		.enable_mask = BIT(0),
2097		.hw.init = &(struct clk_init_data){
2098			.name = "gcc_usb20_mock_utmi_clk",
2099			.parent_names = (const char *[]){
2100				"usb20_mock_utmi_clk_src",
2101			},
2102			.num_parents = 1,
2103			.flags = CLK_SET_RATE_PARENT,
2104			.ops = &clk_branch2_ops,
2105		},
2106	},
2107};
2108
2109static struct clk_branch gcc_usb20_sleep_clk = {
2110	.halt_reg = 0x2f008,
2111	.halt_check = BRANCH_HALT,
2112	.clkr = {
2113		.enable_reg = 0x2f008,
2114		.enable_mask = BIT(0),
2115		.hw.init = &(struct clk_init_data){
2116			.name = "gcc_usb20_sleep_clk",
2117			.ops = &clk_branch2_ops,
2118		},
2119	},
2120};
2121
2122static struct clk_branch gcc_usb30_master_clk = {
2123	.halt_reg = 0xf008,
2124	.halt_check = BRANCH_HALT,
2125	.clkr = {
2126		.enable_reg = 0xf008,
2127		.enable_mask = BIT(0),
2128		.hw.init = &(struct clk_init_data){
2129			.name = "gcc_usb30_master_clk",
2130			.parent_names = (const char *[]){
2131				"usb30_master_clk_src",
2132			},
2133			.num_parents = 1,
2134			.flags = CLK_SET_RATE_PARENT,
2135			.ops = &clk_branch2_ops,
2136		},
2137	},
2138};
2139
2140static struct clk_branch gcc_usb30_mock_utmi_clk = {
2141	.halt_reg = 0xf010,
2142	.halt_check = BRANCH_HALT,
2143	.clkr = {
2144		.enable_reg = 0xf010,
2145		.enable_mask = BIT(0),
2146		.hw.init = &(struct clk_init_data){
2147			.name = "gcc_usb30_mock_utmi_clk",
2148			.parent_names = (const char *[]){
2149				"usb30_mock_utmi_clk_src",
2150			},
2151			.num_parents = 1,
2152			.flags = CLK_SET_RATE_PARENT,
2153			.ops = &clk_branch2_ops,
2154		},
2155	},
2156};
2157
2158static struct clk_branch gcc_usb30_sleep_clk = {
2159	.halt_reg = 0xf00c,
2160	.halt_check = BRANCH_HALT,
2161	.clkr = {
2162		.enable_reg = 0xf00c,
2163		.enable_mask = BIT(0),
2164		.hw.init = &(struct clk_init_data){
2165			.name = "gcc_usb30_sleep_clk",
2166			.ops = &clk_branch2_ops,
2167		},
2168	},
2169};
2170
2171static struct clk_branch gcc_usb3_clkref_clk = {
2172	.halt_reg = 0x8800c,
2173	.halt_check = BRANCH_HALT,
2174	.clkr = {
2175		.enable_reg = 0x8800c,
2176		.enable_mask = BIT(0),
2177		.hw.init = &(struct clk_init_data){
2178			.name = "gcc_usb3_clkref_clk",
2179			.ops = &clk_branch2_ops,
2180		},
2181	},
2182};
2183
2184static struct clk_branch gcc_usb3_phy_aux_clk = {
2185	.halt_reg = 0x50000,
2186	.halt_check = BRANCH_HALT,
2187	.clkr = {
2188		.enable_reg = 0x50000,
2189		.enable_mask = BIT(0),
2190		.hw.init = &(struct clk_init_data){
2191			.name = "gcc_usb3_phy_aux_clk",
2192			.parent_names = (const char *[]){
2193				"usb3_phy_aux_clk_src",
2194			},
2195			.num_parents = 1,
2196			.flags = CLK_SET_RATE_PARENT,
2197			.ops = &clk_branch2_ops,
2198		},
2199	},
2200};
2201
2202static struct clk_branch gcc_usb3_phy_pipe_clk = {
2203	.halt_reg = 0x50004,
2204	.halt_check = BRANCH_HALT_DELAY,
2205	.clkr = {
2206		.enable_reg = 0x50004,
2207		.enable_mask = BIT(0),
2208		.hw.init = &(struct clk_init_data){
2209			.name = "gcc_usb3_phy_pipe_clk",
2210			.ops = &clk_branch2_ops,
2211		},
2212	},
2213};
2214
2215static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
2216	.halt_reg = 0x6a004,
2217	.halt_check = BRANCH_HALT,
2218	.clkr = {
2219		.enable_reg = 0x6a004,
2220		.enable_mask = BIT(0),
2221		.hw.init = &(struct clk_init_data){
2222			.name = "gcc_usb_phy_cfg_ahb2phy_clk",
2223			.ops = &clk_branch2_ops,
2224		},
2225	},
2226};
2227
2228static struct gdsc ufs_gdsc = {
2229	.gdscr = 0x75004,
2230	.gds_hw_ctrl = 0x0,
2231	.pd = {
2232		.name = "ufs_gdsc",
2233	},
2234	.pwrsts = PWRSTS_OFF_ON,
2235	.flags = VOTABLE,
2236};
2237
2238static struct gdsc usb_30_gdsc = {
2239	.gdscr = 0xf004,
2240	.gds_hw_ctrl = 0x0,
2241	.pd = {
2242		.name = "usb_30_gdsc",
2243	},
2244	.pwrsts = PWRSTS_OFF_ON,
2245	.flags = VOTABLE,
2246};
2247
2248static struct gdsc pcie_0_gdsc = {
2249	.gdscr = 0x6b004,
2250	.gds_hw_ctrl = 0x0,
2251	.pd = {
2252		.name = "pcie_0_gdsc",
2253	},
2254	.pwrsts = PWRSTS_OFF_ON,
2255	.flags = VOTABLE,
2256};
2257
2258static struct clk_hw *gcc_sdm660_hws[] = {
2259	&xo.hw,
2260	&gpll0_early_div.hw,
2261	&gpll1_early_div.hw,
2262};
2263
2264static struct clk_regmap *gcc_sdm660_clocks[] = {
2265	[BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
2266	[BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
2267	[BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
2268	[BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
2269	[BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
2270	[BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
2271	[BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
2272	[BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
2273	[BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
2274	[BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
2275	[BLSP2_QUP1_I2C_APPS_CLK_SRC] = &blsp2_qup1_i2c_apps_clk_src.clkr,
2276	[BLSP2_QUP1_SPI_APPS_CLK_SRC] = &blsp2_qup1_spi_apps_clk_src.clkr,
2277	[BLSP2_QUP2_I2C_APPS_CLK_SRC] = &blsp2_qup2_i2c_apps_clk_src.clkr,
2278	[BLSP2_QUP2_SPI_APPS_CLK_SRC] = &blsp2_qup2_spi_apps_clk_src.clkr,
2279	[BLSP2_QUP3_I2C_APPS_CLK_SRC] = &blsp2_qup3_i2c_apps_clk_src.clkr,
2280	[BLSP2_QUP3_SPI_APPS_CLK_SRC] = &blsp2_qup3_spi_apps_clk_src.clkr,
2281	[BLSP2_QUP4_I2C_APPS_CLK_SRC] = &blsp2_qup4_i2c_apps_clk_src.clkr,
2282	[BLSP2_QUP4_SPI_APPS_CLK_SRC] = &blsp2_qup4_spi_apps_clk_src.clkr,
2283	[BLSP2_UART1_APPS_CLK_SRC] = &blsp2_uart1_apps_clk_src.clkr,
2284	[BLSP2_UART2_APPS_CLK_SRC] = &blsp2_uart2_apps_clk_src.clkr,
2285	[GCC_AGGRE2_UFS_AXI_CLK] = &gcc_aggre2_ufs_axi_clk.clkr,
2286	[GCC_AGGRE2_USB3_AXI_CLK] = &gcc_aggre2_usb3_axi_clk.clkr,
2287	[GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
2288	[GCC_BIMC_HMSS_AXI_CLK] = &gcc_bimc_hmss_axi_clk.clkr,
2289	[GCC_BIMC_MSS_Q6_AXI_CLK] = &gcc_bimc_mss_q6_axi_clk.clkr,
2290	[GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
2291	[GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
2292	[GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
2293	[GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
2294	[GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
2295	[GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
2296	[GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
2297	[GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
2298	[GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
2299	[GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
2300	[GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
2301	[GCC_BLSP2_AHB_CLK] = &gcc_blsp2_ahb_clk.clkr,
2302	[GCC_BLSP2_QUP1_I2C_APPS_CLK] = &gcc_blsp2_qup1_i2c_apps_clk.clkr,
2303	[GCC_BLSP2_QUP1_SPI_APPS_CLK] = &gcc_blsp2_qup1_spi_apps_clk.clkr,
2304	[GCC_BLSP2_QUP2_I2C_APPS_CLK] = &gcc_blsp2_qup2_i2c_apps_clk.clkr,
2305	[GCC_BLSP2_QUP2_SPI_APPS_CLK] = &gcc_blsp2_qup2_spi_apps_clk.clkr,
2306	[GCC_BLSP2_QUP3_I2C_APPS_CLK] = &gcc_blsp2_qup3_i2c_apps_clk.clkr,
2307	[GCC_BLSP2_QUP3_SPI_APPS_CLK] = &gcc_blsp2_qup3_spi_apps_clk.clkr,
2308	[GCC_BLSP2_QUP4_I2C_APPS_CLK] = &gcc_blsp2_qup4_i2c_apps_clk.clkr,
2309	[GCC_BLSP2_QUP4_SPI_APPS_CLK] = &gcc_blsp2_qup4_spi_apps_clk.clkr,
2310	[GCC_BLSP2_UART1_APPS_CLK] = &gcc_blsp2_uart1_apps_clk.clkr,
2311	[GCC_BLSP2_UART2_APPS_CLK] = &gcc_blsp2_uart2_apps_clk.clkr,
2312	[GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
2313	[GCC_CFG_NOC_USB2_AXI_CLK] = &gcc_cfg_noc_usb2_axi_clk.clkr,
2314	[GCC_CFG_NOC_USB3_AXI_CLK] = &gcc_cfg_noc_usb3_axi_clk.clkr,
2315	[GCC_DCC_AHB_CLK] = &gcc_dcc_ahb_clk.clkr,
2316	[GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
2317	[GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
2318	[GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
2319	[GCC_GPU_BIMC_GFX_CLK] = &gcc_gpu_bimc_gfx_clk.clkr,
2320	[GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr,
2321	[GCC_GPU_GPLL0_CLK] = &gcc_gpu_gpll0_clk.clkr,
2322	[GCC_GPU_GPLL0_DIV_CLK] = &gcc_gpu_gpll0_div_clk.clkr,
2323	[GCC_HMSS_DVM_BUS_CLK] = &gcc_hmss_dvm_bus_clk.clkr,
2324	[GCC_HMSS_RBCPR_CLK] = &gcc_hmss_rbcpr_clk.clkr,
2325	[GCC_MMSS_GPLL0_CLK] = &gcc_mmss_gpll0_clk.clkr,
2326	[GCC_MMSS_GPLL0_DIV_CLK] = &gcc_mmss_gpll0_div_clk.clkr,
2327	[GCC_MMSS_NOC_CFG_AHB_CLK] = &gcc_mmss_noc_cfg_ahb_clk.clkr,
2328	[GCC_MMSS_SYS_NOC_AXI_CLK] = &gcc_mmss_sys_noc_axi_clk.clkr,
2329	[GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
2330	[GCC_MSS_MNOC_BIMC_AXI_CLK] = &gcc_mss_mnoc_bimc_axi_clk.clkr,
2331	[GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
2332	[GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr,
2333	[GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
2334	[GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
2335	[GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
2336	[GCC_QSPI_AHB_CLK] = &gcc_qspi_ahb_clk.clkr,
2337	[GCC_QSPI_SER_CLK] = &gcc_qspi_ser_clk.clkr,
2338	[GCC_RX0_USB2_CLKREF_CLK] = &gcc_rx0_usb2_clkref_clk.clkr,
2339	[GCC_RX1_USB2_CLKREF_CLK] = &gcc_rx1_usb2_clkref_clk.clkr,
2340	[GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
2341	[GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
2342	[GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
2343	[GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
2344	[GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
2345	[GCC_UFS_AHB_CLK] = &gcc_ufs_ahb_clk.clkr,
2346	[GCC_UFS_AXI_CLK] = &gcc_ufs_axi_clk.clkr,
2347	[GCC_UFS_CLKREF_CLK] = &gcc_ufs_clkref_clk.clkr,
2348	[GCC_UFS_ICE_CORE_CLK] = &gcc_ufs_ice_core_clk.clkr,
2349	[GCC_UFS_PHY_AUX_CLK] = &gcc_ufs_phy_aux_clk.clkr,
2350	[GCC_UFS_RX_SYMBOL_0_CLK] = &gcc_ufs_rx_symbol_0_clk.clkr,
2351	[GCC_UFS_RX_SYMBOL_1_CLK] = &gcc_ufs_rx_symbol_1_clk.clkr,
2352	[GCC_UFS_TX_SYMBOL_0_CLK] = &gcc_ufs_tx_symbol_0_clk.clkr,
2353	[GCC_UFS_UNIPRO_CORE_CLK] = &gcc_ufs_unipro_core_clk.clkr,
2354	[GCC_USB20_MASTER_CLK] = &gcc_usb20_master_clk.clkr,
2355	[GCC_USB20_MOCK_UTMI_CLK] = &gcc_usb20_mock_utmi_clk.clkr,
2356	[GCC_USB20_SLEEP_CLK] = &gcc_usb20_sleep_clk.clkr,
2357	[GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr,
2358	[GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr,
2359	[GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr,
2360	[GCC_USB3_CLKREF_CLK] = &gcc_usb3_clkref_clk.clkr,
2361	[GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr,
2362	[GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr,
2363	[GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
2364	[GP1_CLK_SRC] = &gp1_clk_src.clkr,
2365	[GP2_CLK_SRC] = &gp2_clk_src.clkr,
2366	[GP3_CLK_SRC] = &gp3_clk_src.clkr,
2367	[GPLL0] = &gpll0.clkr,
2368	[GPLL0_EARLY] = &gpll0_early.clkr,
2369	[GPLL1] = &gpll1.clkr,
2370	[GPLL1_EARLY] = &gpll1_early.clkr,
2371	[GPLL4] = &gpll4.clkr,
2372	[GPLL4_EARLY] = &gpll4_early.clkr,
2373	[HMSS_GPLL0_CLK_SRC] = &hmss_gpll0_clk_src.clkr,
2374	[HMSS_GPLL4_CLK_SRC] = &hmss_gpll4_clk_src.clkr,
2375	[HMSS_RBCPR_CLK_SRC] = &hmss_rbcpr_clk_src.clkr,
2376	[PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
2377	[QSPI_SER_CLK_SRC] = &qspi_ser_clk_src.clkr,
2378	[SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
2379	[SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr,
2380	[SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
2381	[UFS_AXI_CLK_SRC] = &ufs_axi_clk_src.clkr,
2382	[UFS_ICE_CORE_CLK_SRC] = &ufs_ice_core_clk_src.clkr,
2383	[UFS_PHY_AUX_CLK_SRC] = &ufs_phy_aux_clk_src.clkr,
2384	[UFS_UNIPRO_CORE_CLK_SRC] = &ufs_unipro_core_clk_src.clkr,
2385	[USB20_MASTER_CLK_SRC] = &usb20_master_clk_src.clkr,
2386	[USB20_MOCK_UTMI_CLK_SRC] = &usb20_mock_utmi_clk_src.clkr,
2387	[USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr,
2388	[USB30_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr,
2389	[USB3_PHY_AUX_CLK_SRC] = &usb3_phy_aux_clk_src.clkr,
2390};
2391
2392static struct gdsc *gcc_sdm660_gdscs[] = {
2393	[UFS_GDSC] = &ufs_gdsc,
2394	[USB_30_GDSC] = &usb_30_gdsc,
2395	[PCIE_0_GDSC] = &pcie_0_gdsc,
2396};
2397
2398static const struct qcom_reset_map gcc_sdm660_resets[] = {
2399	[GCC_QUSB2PHY_PRIM_BCR] = { 0x12000 },
2400	[GCC_QUSB2PHY_SEC_BCR] = { 0x12004 },
2401	[GCC_UFS_BCR] = { 0x75000 },
2402	[GCC_USB3_DP_PHY_BCR] = { 0x50028 },
2403	[GCC_USB3_PHY_BCR] = { 0x50020 },
2404	[GCC_USB3PHY_PHY_BCR] = { 0x50024 },
2405	[GCC_USB_20_BCR] = { 0x2f000 },
2406	[GCC_USB_30_BCR] = { 0xf000 },
2407	[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
2408	[GCC_MSS_RESTART] = { 0x79000 },
2409};
2410
2411static const struct regmap_config gcc_sdm660_regmap_config = {
2412	.reg_bits	= 32,
2413	.reg_stride	= 4,
2414	.val_bits	= 32,
2415	.max_register	= 0x94000,
2416	.fast_io	= true,
2417};
2418
2419static const struct qcom_cc_desc gcc_sdm660_desc = {
2420	.config = &gcc_sdm660_regmap_config,
2421	.clks = gcc_sdm660_clocks,
2422	.num_clks = ARRAY_SIZE(gcc_sdm660_clocks),
2423	.resets = gcc_sdm660_resets,
2424	.num_resets = ARRAY_SIZE(gcc_sdm660_resets),
2425	.gdscs = gcc_sdm660_gdscs,
2426	.num_gdscs = ARRAY_SIZE(gcc_sdm660_gdscs),
2427	.clk_hws = gcc_sdm660_hws,
2428	.num_clk_hws = ARRAY_SIZE(gcc_sdm660_hws),
2429};
2430
2431static const struct of_device_id gcc_sdm660_match_table[] = {
2432	{ .compatible = "qcom,gcc-sdm630" },
2433	{ .compatible = "qcom,gcc-sdm660" },
2434	{ }
2435};
2436MODULE_DEVICE_TABLE(of, gcc_sdm660_match_table);
2437
2438static int gcc_sdm660_probe(struct platform_device *pdev)
2439{
2440	int ret;
2441	struct regmap *regmap;
2442
2443	regmap = qcom_cc_map(pdev, &gcc_sdm660_desc);
2444	if (IS_ERR(regmap))
2445		return PTR_ERR(regmap);
2446
2447	/*
2448	 * Set the HMSS_AHB_CLK_SLEEP_ENA bit to allow the hmss_ahb_clk to be
2449	 * turned off by hardware during certain apps low power modes.
2450	 */
2451	ret = regmap_update_bits(regmap, 0x52008, BIT(21), BIT(21));
2452	if (ret)
2453		return ret;
2454
2455	return qcom_cc_really_probe(pdev, &gcc_sdm660_desc, regmap);
2456}
2457
2458static struct platform_driver gcc_sdm660_driver = {
2459	.probe		= gcc_sdm660_probe,
2460	.driver		= {
2461		.name	= "gcc-sdm660",
2462		.of_match_table = gcc_sdm660_match_table,
2463	},
2464};
2465
2466static int __init gcc_sdm660_init(void)
2467{
2468	return platform_driver_register(&gcc_sdm660_driver);
2469}
2470core_initcall_sync(gcc_sdm660_init);
2471
2472static void __exit gcc_sdm660_exit(void)
2473{
2474	platform_driver_unregister(&gcc_sdm660_driver);
2475}
2476module_exit(gcc_sdm660_exit);
2477
2478MODULE_LICENSE("GPL v2");
2479MODULE_DESCRIPTION("QCOM GCC sdm660 Driver");
2480