xref: /openbmc/linux/drivers/clk/qcom/gcc-sdx65.c (revision 20e8ef5c)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2021, Qualcomm Innovation Center, Inc. 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_device.h>
11 #include <linux/of.h>
12 #include <linux/regmap.h>
13 
14 #include <dt-bindings/clock/qcom,gcc-sdx65.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 "clk-regmap-divider.h"
21 #include "clk-regmap-mux.h"
22 #include "common.h"
23 #include "gdsc.h"
24 #include "reset.h"
25 
26 enum {
27 	P_BI_TCXO,
28 	P_GPLL0_OUT_EVEN,
29 	P_GPLL0_OUT_MAIN,
30 	P_PCIE_PIPE_CLK,
31 	P_SLEEP_CLK,
32 	P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK,
33 };
34 
35 static struct clk_alpha_pll gpll0 = {
36 	.offset = 0x0,
37 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
38 	.clkr = {
39 		.enable_reg = 0x6d000,
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 			},
46 			.num_parents = 1,
47 			.ops = &clk_alpha_pll_fixed_lucid_evo_ops,
48 		},
49 	},
50 };
51 
52 static const struct clk_div_table post_div_table_gpll0_out_even[] = {
53 	{ 0x1, 2 },
54 	{ }
55 };
56 
57 static struct clk_alpha_pll_postdiv gpll0_out_even = {
58 	.offset = 0x0,
59 	.post_div_shift = 10,
60 	.post_div_table = post_div_table_gpll0_out_even,
61 	.num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even),
62 	.width = 4,
63 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
64 	.clkr.hw.init = &(struct clk_init_data){
65 		.name = "gpll0_out_even",
66 		.parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
67 		.num_parents = 1,
68 		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
69 	},
70 };
71 
72 static const struct parent_map gcc_parent_map_0[] = {
73 	{ P_BI_TCXO, 0 },
74 	{ P_GPLL0_OUT_MAIN, 1 },
75 	{ P_GPLL0_OUT_EVEN, 6 },
76 };
77 
78 static const struct clk_parent_data gcc_parent_data_0[] = {
79 	{ .fw_name = "bi_tcxo" },
80 	{ .hw = &gpll0.clkr.hw },
81 	{ .hw = &gpll0_out_even.clkr.hw },
82 };
83 
84 static const struct clk_parent_data gcc_parent_data_0_ao[] = {
85 	{ .fw_name = "bi_tcxo_ao" },
86 	{ .hw = &gpll0.clkr.hw },
87 	{ .hw = &gpll0_out_even.clkr.hw },
88 };
89 
90 static const struct parent_map gcc_parent_map_2[] = {
91 	{ P_BI_TCXO, 0 },
92 	{ P_GPLL0_OUT_MAIN, 1 },
93 	{ P_SLEEP_CLK, 5 },
94 	{ P_GPLL0_OUT_EVEN, 6 },
95 };
96 
97 static const struct clk_parent_data gcc_parent_data_2[] = {
98 	{ .fw_name = "bi_tcxo" },
99 	{ .hw = &gpll0.clkr.hw },
100 	{ .fw_name = "sleep_clk" },
101 	{ .hw = &gpll0_out_even.clkr.hw },
102 };
103 
104 static const struct parent_map gcc_parent_map_3[] = {
105 	{ P_BI_TCXO, 0 },
106 	{ P_SLEEP_CLK, 5 },
107 };
108 
109 static const struct clk_parent_data gcc_parent_data_3[] = {
110 	{ .fw_name = "bi_tcxo" },
111 	{ .fw_name = "sleep_clk" },
112 };
113 
114 static const struct parent_map gcc_parent_map_4[] = {
115 	{ P_BI_TCXO, 2 },
116 };
117 
118 static const struct parent_map gcc_parent_map_5[] = {
119 	{ P_PCIE_PIPE_CLK, 0 },
120 	{ P_BI_TCXO, 2 },
121 };
122 
123 static const struct clk_parent_data gcc_parent_data_5[] = {
124 	{ .fw_name = "pcie_pipe_clk"},
125 	{ .fw_name = "bi_tcxo"},
126 };
127 
128 static const struct parent_map gcc_parent_map_6[] = {
129 	{ P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 0 },
130 	{ P_BI_TCXO, 2 },
131 };
132 
133 static const struct clk_parent_data gcc_parent_data_6[] = {
134 	{ .fw_name = "usb3_phy_wrapper_gcc_usb30_pipe_clk"},
135 	{ .fw_name = "bi_tcxo"},
136 };
137 
138 static struct clk_regmap_mux gcc_pcie_aux_clk_src = {
139 	.reg = 0x43060,
140 	.shift = 0,
141 	.width = 2,
142 	.parent_map = gcc_parent_map_4,
143 	.clkr = {
144 		.hw.init = &(struct clk_init_data){
145 			.name = "gcc_pcie_aux_clk_src",
146 			.parent_data = &(const struct clk_parent_data){
147 				.fw_name = "bi_tcxo",
148 			},
149 			.num_parents = 1,
150 			.ops = &clk_regmap_mux_closest_ops,
151 		},
152 	},
153 };
154 
155 static struct clk_regmap_mux gcc_pcie_pipe_clk_src = {
156 	.reg = 0x43044,
157 	.shift = 0,
158 	.width = 2,
159 	.parent_map = gcc_parent_map_5,
160 	.clkr = {
161 		.hw.init = &(struct clk_init_data){
162 			.name = "gcc_pcie_pipe_clk_src",
163 			.parent_data = gcc_parent_data_5,
164 			.num_parents = 2,
165 			.ops = &clk_regmap_mux_closest_ops,
166 		},
167 	},
168 };
169 
170 static struct clk_regmap_mux gcc_usb3_phy_pipe_clk_src = {
171 	.reg = 0x1706c,
172 	.shift = 0,
173 	.width = 2,
174 	.parent_map = gcc_parent_map_6,
175 	.clkr = {
176 		.hw.init = &(struct clk_init_data){
177 			.name = "gcc_usb3_phy_pipe_clk_src",
178 			.parent_data = gcc_parent_data_6,
179 			.num_parents = 2,
180 			.ops = &clk_regmap_mux_closest_ops,
181 		},
182 	},
183 };
184 
185 static const struct freq_tbl ftbl_gcc_blsp1_qup1_i2c_apps_clk_src[] = {
186 	F(9600000, P_BI_TCXO, 2, 0, 0),
187 	F(19200000, P_BI_TCXO, 1, 0, 0),
188 	F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
189 	{ }
190 };
191 
192 static struct clk_rcg2 gcc_blsp1_qup1_i2c_apps_clk_src = {
193 	.cmd_rcgr = 0x1c024,
194 	.mnd_width = 8,
195 	.hid_width = 5,
196 	.parent_map = gcc_parent_map_0,
197 	.freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
198 	.clkr.hw.init = &(struct clk_init_data){
199 		.name = "gcc_blsp1_qup1_i2c_apps_clk_src",
200 		.parent_data = gcc_parent_data_0,
201 		.num_parents = 3,
202 		.flags = CLK_SET_RATE_PARENT,
203 		.ops = &clk_rcg2_ops,
204 	},
205 };
206 
207 static const struct freq_tbl ftbl_gcc_blsp1_qup1_spi_apps_clk_src[] = {
208 	F(960000, P_BI_TCXO, 10, 1, 2),
209 	F(4800000, P_BI_TCXO, 4, 0, 0),
210 	F(9600000, P_BI_TCXO, 2, 0, 0),
211 	F(15000000, P_GPLL0_OUT_EVEN, 5, 1, 4),
212 	F(19200000, P_BI_TCXO, 1, 0, 0),
213 	F(24000000, P_GPLL0_OUT_MAIN, 12.5, 1, 2),
214 	F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2),
215 	F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
216 	{ }
217 };
218 
219 static struct clk_rcg2 gcc_blsp1_qup1_spi_apps_clk_src = {
220 	.cmd_rcgr = 0x1c00c,
221 	.mnd_width = 8,
222 	.hid_width = 5,
223 	.parent_map = gcc_parent_map_0,
224 	.freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
225 	.clkr.hw.init = &(struct clk_init_data){
226 		.name = "gcc_blsp1_qup1_spi_apps_clk_src",
227 		.parent_data = gcc_parent_data_0,
228 		.num_parents = 3,
229 		.flags = CLK_SET_RATE_PARENT,
230 		.ops = &clk_rcg2_ops,
231 	},
232 };
233 
234 static struct clk_rcg2 gcc_blsp1_qup2_i2c_apps_clk_src = {
235 	.cmd_rcgr = 0x1e024,
236 	.mnd_width = 8,
237 	.hid_width = 5,
238 	.parent_map = gcc_parent_map_0,
239 	.freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
240 	.clkr.hw.init = &(struct clk_init_data){
241 		.name = "gcc_blsp1_qup2_i2c_apps_clk_src",
242 		.parent_data = gcc_parent_data_0,
243 		.num_parents = 3,
244 		.flags = CLK_SET_RATE_PARENT,
245 		.ops = &clk_rcg2_ops,
246 	},
247 };
248 
249 static struct clk_rcg2 gcc_blsp1_qup2_spi_apps_clk_src = {
250 	.cmd_rcgr = 0x1e00c,
251 	.mnd_width = 8,
252 	.hid_width = 5,
253 	.parent_map = gcc_parent_map_0,
254 	.freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
255 	.clkr.hw.init = &(struct clk_init_data){
256 		.name = "gcc_blsp1_qup2_spi_apps_clk_src",
257 		.parent_data = gcc_parent_data_0,
258 		.num_parents = 3,
259 		.flags = CLK_SET_RATE_PARENT,
260 		.ops = &clk_rcg2_ops,
261 	},
262 };
263 
264 static struct clk_rcg2 gcc_blsp1_qup3_i2c_apps_clk_src = {
265 	.cmd_rcgr = 0x20024,
266 	.mnd_width = 8,
267 	.hid_width = 5,
268 	.parent_map = gcc_parent_map_0,
269 	.freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
270 	.clkr.hw.init = &(struct clk_init_data){
271 		.name = "gcc_blsp1_qup3_i2c_apps_clk_src",
272 		.parent_data = gcc_parent_data_0,
273 		.num_parents = 3,
274 		.flags = CLK_SET_RATE_PARENT,
275 		.ops = &clk_rcg2_ops,
276 	},
277 };
278 
279 static struct clk_rcg2 gcc_blsp1_qup3_spi_apps_clk_src = {
280 	.cmd_rcgr = 0x2000c,
281 	.mnd_width = 8,
282 	.hid_width = 5,
283 	.parent_map = gcc_parent_map_0,
284 	.freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
285 	.clkr.hw.init = &(struct clk_init_data){
286 		.name = "gcc_blsp1_qup3_spi_apps_clk_src",
287 		.parent_data = gcc_parent_data_0,
288 		.num_parents = 3,
289 		.flags = CLK_SET_RATE_PARENT,
290 		.ops = &clk_rcg2_ops,
291 	},
292 };
293 
294 static struct clk_rcg2 gcc_blsp1_qup4_i2c_apps_clk_src = {
295 	.cmd_rcgr = 0x22024,
296 	.mnd_width = 8,
297 	.hid_width = 5,
298 	.parent_map = gcc_parent_map_0,
299 	.freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
300 	.clkr.hw.init = &(struct clk_init_data){
301 		.name = "gcc_blsp1_qup4_i2c_apps_clk_src",
302 		.parent_data = gcc_parent_data_0,
303 		.num_parents = 3,
304 		.flags = CLK_SET_RATE_PARENT,
305 		.ops = &clk_rcg2_ops,
306 	},
307 };
308 
309 static struct clk_rcg2 gcc_blsp1_qup4_spi_apps_clk_src = {
310 	.cmd_rcgr = 0x2200c,
311 	.mnd_width = 8,
312 	.hid_width = 5,
313 	.parent_map = gcc_parent_map_0,
314 	.freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
315 	.clkr.hw.init = &(struct clk_init_data){
316 		.name = "gcc_blsp1_qup4_spi_apps_clk_src",
317 		.parent_data = gcc_parent_data_0,
318 		.num_parents = 3,
319 		.flags = CLK_SET_RATE_PARENT,
320 		.ops = &clk_rcg2_ops,
321 	},
322 };
323 
324 static const struct freq_tbl ftbl_gcc_blsp1_uart1_apps_clk_src[] = {
325 	F(3686400, P_GPLL0_OUT_EVEN, 1, 192, 15625),
326 	F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625),
327 	F(9600000, P_BI_TCXO, 2, 0, 0),
328 	F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625),
329 	F(16000000, P_GPLL0_OUT_EVEN, 1, 4, 75),
330 	F(19200000, P_BI_TCXO, 1, 0, 0),
331 	F(19354839, P_GPLL0_OUT_MAIN, 15.5, 1, 2),
332 	F(20000000, P_GPLL0_OUT_MAIN, 15, 1, 2),
333 	F(20689655, P_GPLL0_OUT_MAIN, 14.5, 1, 2),
334 	F(21428571, P_GPLL0_OUT_MAIN, 14, 1, 2),
335 	F(22222222, P_GPLL0_OUT_MAIN, 13.5, 1, 2),
336 	F(23076923, P_GPLL0_OUT_MAIN, 13, 1, 2),
337 	F(24000000, P_GPLL0_OUT_MAIN, 5, 1, 5),
338 	F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2),
339 	F(26086957, P_GPLL0_OUT_MAIN, 11.5, 1, 2),
340 	F(27272727, P_GPLL0_OUT_MAIN, 11, 1, 2),
341 	F(28571429, P_GPLL0_OUT_MAIN, 10.5, 1, 2),
342 	F(32000000, P_GPLL0_OUT_MAIN, 1, 4, 75),
343 	F(40000000, P_GPLL0_OUT_MAIN, 15, 0, 0),
344 	F(46400000, P_GPLL0_OUT_MAIN, 1, 29, 375),
345 	F(48000000, P_GPLL0_OUT_MAIN, 12.5, 0, 0),
346 	F(51200000, P_GPLL0_OUT_MAIN, 1, 32, 375),
347 	F(56000000, P_GPLL0_OUT_MAIN, 1, 7, 75),
348 	F(58982400, P_GPLL0_OUT_MAIN, 1, 1536, 15625),
349 	F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
350 	F(63157895, P_GPLL0_OUT_MAIN, 9.5, 0, 0),
351 	{ }
352 };
353 
354 static struct clk_rcg2 gcc_blsp1_uart1_apps_clk_src = {
355 	.cmd_rcgr = 0x1d00c,
356 	.mnd_width = 16,
357 	.hid_width = 5,
358 	.parent_map = gcc_parent_map_0,
359 	.freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
360 	.clkr.hw.init = &(struct clk_init_data){
361 		.name = "gcc_blsp1_uart1_apps_clk_src",
362 		.parent_data = gcc_parent_data_0,
363 		.num_parents = 3,
364 		.flags = CLK_SET_RATE_PARENT,
365 		.ops = &clk_rcg2_ops,
366 	},
367 };
368 
369 static struct clk_rcg2 gcc_blsp1_uart2_apps_clk_src = {
370 	.cmd_rcgr = 0x1f00c,
371 	.mnd_width = 16,
372 	.hid_width = 5,
373 	.parent_map = gcc_parent_map_0,
374 	.freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
375 	.clkr.hw.init = &(struct clk_init_data){
376 		.name = "gcc_blsp1_uart2_apps_clk_src",
377 		.parent_data = gcc_parent_data_0,
378 		.num_parents = 3,
379 		.flags = CLK_SET_RATE_PARENT,
380 		.ops = &clk_rcg2_ops,
381 	},
382 };
383 
384 static struct clk_rcg2 gcc_blsp1_uart3_apps_clk_src = {
385 	.cmd_rcgr = 0x2100c,
386 	.mnd_width = 16,
387 	.hid_width = 5,
388 	.parent_map = gcc_parent_map_0,
389 	.freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
390 	.clkr.hw.init = &(struct clk_init_data){
391 		.name = "gcc_blsp1_uart3_apps_clk_src",
392 		.parent_data = gcc_parent_data_0,
393 		.num_parents = 3,
394 		.flags = CLK_SET_RATE_PARENT,
395 		.ops = &clk_rcg2_ops,
396 	},
397 };
398 
399 static struct clk_rcg2 gcc_blsp1_uart4_apps_clk_src = {
400 	.cmd_rcgr = 0x2300c,
401 	.mnd_width = 16,
402 	.hid_width = 5,
403 	.parent_map = gcc_parent_map_0,
404 	.freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
405 	.clkr.hw.init = &(struct clk_init_data){
406 		.name = "gcc_blsp1_uart4_apps_clk_src",
407 		.parent_data = gcc_parent_data_0,
408 		.num_parents = 3,
409 		.flags = CLK_SET_RATE_PARENT,
410 		.ops = &clk_rcg2_ops,
411 	},
412 };
413 
414 static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
415 	F(19200000, P_BI_TCXO, 1, 0, 0),
416 	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
417 	F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
418 	F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
419 	{ }
420 };
421 
422 static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
423 	.cmd_rcgr = 0x3000c,
424 	.mnd_width = 0,
425 	.hid_width = 5,
426 	.parent_map = gcc_parent_map_0,
427 	.freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
428 	.clkr.hw.init = &(struct clk_init_data){
429 		.name = "gcc_cpuss_ahb_clk_src",
430 		.parent_data = gcc_parent_data_0_ao,
431 		.num_parents = 3,
432 		.flags = CLK_SET_RATE_PARENT,
433 		.ops = &clk_rcg2_ops,
434 	},
435 };
436 
437 static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
438 	F(19200000, P_BI_TCXO, 1, 0, 0),
439 	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
440 	F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
441 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
442 	{ }
443 };
444 
445 static struct clk_rcg2 gcc_gp1_clk_src = {
446 	.cmd_rcgr = 0x37004,
447 	.mnd_width = 16,
448 	.hid_width = 5,
449 	.parent_map = gcc_parent_map_2,
450 	.freq_tbl = ftbl_gcc_gp1_clk_src,
451 	.clkr.hw.init = &(struct clk_init_data){
452 		.name = "gcc_gp1_clk_src",
453 		.parent_data = gcc_parent_data_2,
454 		.num_parents = 4,
455 		.flags = CLK_SET_RATE_PARENT,
456 		.ops = &clk_rcg2_ops,
457 	},
458 };
459 
460 static struct clk_rcg2 gcc_gp2_clk_src = {
461 	.cmd_rcgr = 0x38004,
462 	.mnd_width = 16,
463 	.hid_width = 5,
464 	.parent_map = gcc_parent_map_2,
465 	.freq_tbl = ftbl_gcc_gp1_clk_src,
466 	.clkr.hw.init = &(struct clk_init_data){
467 		.name = "gcc_gp2_clk_src",
468 		.parent_data = gcc_parent_data_2,
469 		.num_parents = 4,
470 		.flags = CLK_SET_RATE_PARENT,
471 		.ops = &clk_rcg2_ops,
472 	},
473 };
474 
475 static struct clk_rcg2 gcc_gp3_clk_src = {
476 	.cmd_rcgr = 0x39004,
477 	.mnd_width = 16,
478 	.hid_width = 5,
479 	.parent_map = gcc_parent_map_2,
480 	.freq_tbl = ftbl_gcc_gp1_clk_src,
481 	.clkr.hw.init = &(struct clk_init_data){
482 		.name = "gcc_gp3_clk_src",
483 		.parent_data = gcc_parent_data_2,
484 		.num_parents = 4,
485 		.flags = CLK_SET_RATE_PARENT,
486 		.ops = &clk_rcg2_ops,
487 	},
488 };
489 
490 static const struct freq_tbl ftbl_gcc_pcie_aux_phy_clk_src[] = {
491 	F(19200000, P_BI_TCXO, 1, 0, 0),
492 	{ }
493 };
494 
495 static struct clk_rcg2 gcc_pcie_aux_phy_clk_src = {
496 	.cmd_rcgr = 0x43048,
497 	.mnd_width = 16,
498 	.hid_width = 5,
499 	.parent_map = gcc_parent_map_3,
500 	.freq_tbl = ftbl_gcc_pcie_aux_phy_clk_src,
501 	.clkr.hw.init = &(struct clk_init_data){
502 		.name = "gcc_pcie_aux_phy_clk_src",
503 		.parent_data = gcc_parent_data_3,
504 		.num_parents = 2,
505 		.flags = CLK_SET_RATE_PARENT,
506 		.ops = &clk_rcg2_ops,
507 	},
508 };
509 
510 static const struct freq_tbl ftbl_gcc_pcie_rchng_phy_clk_src[] = {
511 	F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
512 	{ }
513 };
514 
515 static struct clk_rcg2 gcc_pcie_rchng_phy_clk_src = {
516 	.cmd_rcgr = 0x43064,
517 	.mnd_width = 0,
518 	.hid_width = 5,
519 	.parent_map = gcc_parent_map_2,
520 	.freq_tbl = ftbl_gcc_pcie_rchng_phy_clk_src,
521 	.clkr.hw.init = &(struct clk_init_data){
522 		.name = "gcc_pcie_rchng_phy_clk_src",
523 		.parent_data = gcc_parent_data_2,
524 		.num_parents = 4,
525 		.flags = CLK_SET_RATE_PARENT,
526 		.ops = &clk_rcg2_ops,
527 	},
528 };
529 
530 static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
531 	F(19200000, P_BI_TCXO, 1, 0, 0),
532 	F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
533 	{ }
534 };
535 
536 static struct clk_rcg2 gcc_pdm2_clk_src = {
537 	.cmd_rcgr = 0x24010,
538 	.mnd_width = 0,
539 	.hid_width = 5,
540 	.parent_map = gcc_parent_map_0,
541 	.freq_tbl = ftbl_gcc_pdm2_clk_src,
542 	.clkr.hw.init = &(struct clk_init_data){
543 		.name = "gcc_pdm2_clk_src",
544 		.parent_data = gcc_parent_data_0,
545 		.num_parents = 3,
546 		.flags = CLK_SET_RATE_PARENT,
547 		.ops = &clk_rcg2_ops,
548 	},
549 };
550 
551 static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
552 	F(400000, P_BI_TCXO, 12, 1, 4),
553 	F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
554 	F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
555 	F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
556 	F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
557 	{ }
558 };
559 
560 static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
561 	.cmd_rcgr = 0x1a010,
562 	.mnd_width = 8,
563 	.hid_width = 5,
564 	.parent_map = gcc_parent_map_0,
565 	.freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
566 	.clkr.hw.init = &(struct clk_init_data){
567 		.name = "gcc_sdcc1_apps_clk_src",
568 		.parent_data = gcc_parent_data_0,
569 		.num_parents = 3,
570 		.flags = CLK_SET_RATE_PARENT,
571 		.ops = &clk_rcg2_ops,
572 	},
573 };
574 
575 static const struct freq_tbl ftbl_gcc_usb30_master_clk_src[] = {
576 	F(200000000, P_GPLL0_OUT_EVEN, 1.5, 0, 0),
577 	{ }
578 };
579 
580 static struct clk_rcg2 gcc_usb30_master_clk_src = {
581 	.cmd_rcgr = 0x17030,
582 	.mnd_width = 8,
583 	.hid_width = 5,
584 	.parent_map = gcc_parent_map_0,
585 	.freq_tbl = ftbl_gcc_usb30_master_clk_src,
586 	.clkr.hw.init = &(struct clk_init_data){
587 		.name = "gcc_usb30_master_clk_src",
588 		.parent_data = gcc_parent_data_0,
589 		.num_parents = 3,
590 		.flags = CLK_SET_RATE_PARENT,
591 		.ops = &clk_rcg2_ops,
592 	},
593 };
594 
595 static struct clk_rcg2 gcc_usb30_mock_utmi_clk_src = {
596 	.cmd_rcgr = 0x17048,
597 	.mnd_width = 0,
598 	.hid_width = 5,
599 	.parent_map = gcc_parent_map_0,
600 	.freq_tbl = ftbl_gcc_pcie_aux_phy_clk_src,
601 	.clkr.hw.init = &(struct clk_init_data){
602 		.name = "gcc_usb30_mock_utmi_clk_src",
603 		.parent_data = gcc_parent_data_0,
604 		.num_parents = 3,
605 		.flags = CLK_SET_RATE_PARENT,
606 		.ops = &clk_rcg2_ops,
607 	},
608 };
609 
610 static const struct freq_tbl ftbl_gcc_usb3_phy_aux_clk_src[] = {
611 	F(1000000, P_BI_TCXO, 1, 5, 96),
612 	F(19200000, P_BI_TCXO, 1, 0, 0),
613 	{ }
614 };
615 
616 static struct clk_rcg2 gcc_usb3_phy_aux_clk_src = {
617 	.cmd_rcgr = 0x17070,
618 	.mnd_width = 16,
619 	.hid_width = 5,
620 	.parent_map = gcc_parent_map_3,
621 	.freq_tbl = ftbl_gcc_usb3_phy_aux_clk_src,
622 	.clkr.hw.init = &(struct clk_init_data){
623 		.name = "gcc_usb3_phy_aux_clk_src",
624 		.parent_data = gcc_parent_data_3,
625 		.num_parents = 2,
626 		.flags = CLK_SET_RATE_PARENT,
627 		.ops = &clk_rcg2_ops,
628 	},
629 };
630 
631 static struct clk_regmap_div gcc_cpuss_ahb_postdiv_clk_src = {
632 	.reg = 0x30024,
633 	.shift = 0,
634 	.width = 4,
635 	.clkr.hw.init = &(struct clk_init_data) {
636 		.name = "gcc_cpuss_ahb_postdiv_clk_src",
637 		.parent_data = &(const struct clk_parent_data){
638 			.hw = &gcc_cpuss_ahb_clk_src.clkr.hw,
639 		},
640 		.num_parents = 1,
641 		.flags = CLK_SET_RATE_PARENT,
642 		.ops = &clk_regmap_div_ro_ops,
643 	},
644 };
645 
646 static struct clk_regmap_div gcc_usb30_mock_utmi_postdiv_clk_src = {
647 	.reg = 0x17060,
648 	.shift = 0,
649 	.width = 4,
650 	.clkr.hw.init = &(struct clk_init_data) {
651 		.name = "gcc_usb30_mock_utmi_postdiv_clk_src",
652 		.parent_data = &(const struct clk_parent_data){
653 			.hw = &gcc_usb30_mock_utmi_clk_src.clkr.hw,
654 		},
655 		.num_parents = 1,
656 		.flags = CLK_SET_RATE_PARENT,
657 		.ops = &clk_regmap_div_ro_ops,
658 	},
659 };
660 
661 static struct clk_branch gcc_ahb_pcie_link_clk = {
662 	.halt_reg = 0x2e004,
663 	.halt_check = BRANCH_HALT,
664 	.clkr = {
665 		.enable_reg = 0x2e004,
666 		.enable_mask = BIT(0),
667 		.hw.init = &(struct clk_init_data){
668 			.name = "gcc_ahb_pcie_link_clk",
669 			.ops = &clk_branch2_ops,
670 		},
671 	},
672 };
673 
674 static struct clk_branch gcc_blsp1_ahb_clk = {
675 	.halt_reg = 0x1b004,
676 	.halt_check = BRANCH_HALT_VOTED,
677 	.clkr = {
678 		.enable_reg = 0x6d008,
679 		.enable_mask = BIT(14),
680 		.hw.init = &(struct clk_init_data){
681 			.name = "gcc_blsp1_ahb_clk",
682 			.ops = &clk_branch2_ops,
683 		},
684 	},
685 };
686 
687 static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
688 	.halt_reg = 0x1c008,
689 	.halt_check = BRANCH_HALT,
690 	.clkr = {
691 		.enable_reg = 0x1c008,
692 		.enable_mask = BIT(0),
693 		.hw.init = &(struct clk_init_data){
694 			.name = "gcc_blsp1_qup1_i2c_apps_clk",
695 			.parent_data = &(const struct clk_parent_data){
696 				.hw = &gcc_blsp1_qup1_i2c_apps_clk_src.clkr.hw,
697 			},
698 			.num_parents = 1,
699 			.flags = CLK_SET_RATE_PARENT,
700 			.ops = &clk_branch2_ops,
701 		},
702 	},
703 };
704 
705 static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
706 	.halt_reg = 0x1c004,
707 	.halt_check = BRANCH_HALT,
708 	.clkr = {
709 		.enable_reg = 0x1c004,
710 		.enable_mask = BIT(0),
711 		.hw.init = &(struct clk_init_data){
712 			.name = "gcc_blsp1_qup1_spi_apps_clk",
713 			.parent_data = &(const struct clk_parent_data){
714 				.hw = &gcc_blsp1_qup1_spi_apps_clk_src.clkr.hw,
715 			},
716 			.num_parents = 1,
717 			.flags = CLK_SET_RATE_PARENT,
718 			.ops = &clk_branch2_ops,
719 		},
720 	},
721 };
722 
723 static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
724 	.halt_reg = 0x1e008,
725 	.halt_check = BRANCH_HALT,
726 	.clkr = {
727 		.enable_reg = 0x1e008,
728 		.enable_mask = BIT(0),
729 		.hw.init = &(struct clk_init_data){
730 			.name = "gcc_blsp1_qup2_i2c_apps_clk",
731 			.parent_data = &(const struct clk_parent_data){
732 				.hw = &gcc_blsp1_qup2_i2c_apps_clk_src.clkr.hw,
733 			},
734 			.num_parents = 1,
735 			.flags = CLK_SET_RATE_PARENT,
736 			.ops = &clk_branch2_ops,
737 		},
738 	},
739 };
740 
741 static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
742 	.halt_reg = 0x1e004,
743 	.halt_check = BRANCH_HALT,
744 	.clkr = {
745 		.enable_reg = 0x1e004,
746 		.enable_mask = BIT(0),
747 		.hw.init = &(struct clk_init_data){
748 			.name = "gcc_blsp1_qup2_spi_apps_clk",
749 			.parent_data = &(const struct clk_parent_data){
750 				.hw = &gcc_blsp1_qup2_spi_apps_clk_src.clkr.hw,
751 			},
752 			.num_parents = 1,
753 			.flags = CLK_SET_RATE_PARENT,
754 			.ops = &clk_branch2_ops,
755 		},
756 	},
757 };
758 
759 static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
760 	.halt_reg = 0x20008,
761 	.halt_check = BRANCH_HALT,
762 	.clkr = {
763 		.enable_reg = 0x20008,
764 		.enable_mask = BIT(0),
765 		.hw.init = &(struct clk_init_data){
766 			.name = "gcc_blsp1_qup3_i2c_apps_clk",
767 			.parent_data = &(const struct clk_parent_data){
768 				.hw = &gcc_blsp1_qup3_i2c_apps_clk_src.clkr.hw,
769 			},
770 			.num_parents = 1,
771 			.flags = CLK_SET_RATE_PARENT,
772 			.ops = &clk_branch2_ops,
773 		},
774 	},
775 };
776 
777 static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
778 	.halt_reg = 0x20004,
779 	.halt_check = BRANCH_HALT,
780 	.clkr = {
781 		.enable_reg = 0x20004,
782 		.enable_mask = BIT(0),
783 		.hw.init = &(struct clk_init_data){
784 			.name = "gcc_blsp1_qup3_spi_apps_clk",
785 			.parent_data = &(const struct clk_parent_data){
786 				.hw = &gcc_blsp1_qup3_spi_apps_clk_src.clkr.hw,
787 			},
788 			.num_parents = 1,
789 			.flags = CLK_SET_RATE_PARENT,
790 			.ops = &clk_branch2_ops,
791 		},
792 	},
793 };
794 
795 static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
796 	.halt_reg = 0x22008,
797 	.halt_check = BRANCH_HALT,
798 	.clkr = {
799 		.enable_reg = 0x22008,
800 		.enable_mask = BIT(0),
801 		.hw.init = &(struct clk_init_data){
802 			.name = "gcc_blsp1_qup4_i2c_apps_clk",
803 			.parent_data = &(const struct clk_parent_data){
804 				.hw = &gcc_blsp1_qup4_i2c_apps_clk_src.clkr.hw,
805 			},
806 			.num_parents = 1,
807 			.flags = CLK_SET_RATE_PARENT,
808 			.ops = &clk_branch2_ops,
809 		},
810 	},
811 };
812 
813 static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
814 	.halt_reg = 0x22004,
815 	.halt_check = BRANCH_HALT,
816 	.clkr = {
817 		.enable_reg = 0x22004,
818 		.enable_mask = BIT(0),
819 		.hw.init = &(struct clk_init_data){
820 			.name = "gcc_blsp1_qup4_spi_apps_clk",
821 			.parent_data = &(const struct clk_parent_data){
822 				.hw = &gcc_blsp1_qup4_spi_apps_clk_src.clkr.hw,
823 			},
824 			.num_parents = 1,
825 			.flags = CLK_SET_RATE_PARENT,
826 			.ops = &clk_branch2_ops,
827 		},
828 	},
829 };
830 
831 static struct clk_branch gcc_blsp1_sleep_clk = {
832 	.halt_reg = 0x1b00c,
833 	.halt_check = BRANCH_HALT_VOTED,
834 	.clkr = {
835 		.enable_reg = 0x6d008,
836 		.enable_mask = BIT(15),
837 		.hw.init = &(struct clk_init_data){
838 			.name = "gcc_blsp1_sleep_clk",
839 			.ops = &clk_branch2_ops,
840 		},
841 	},
842 };
843 
844 static struct clk_branch gcc_blsp1_uart1_apps_clk = {
845 	.halt_reg = 0x1d004,
846 	.halt_check = BRANCH_HALT,
847 	.clkr = {
848 		.enable_reg = 0x1d004,
849 		.enable_mask = BIT(0),
850 		.hw.init = &(struct clk_init_data){
851 			.name = "gcc_blsp1_uart1_apps_clk",
852 			.parent_data = &(const struct clk_parent_data){
853 				.hw = &gcc_blsp1_uart1_apps_clk_src.clkr.hw,
854 			},
855 			.num_parents = 1,
856 			.flags = CLK_SET_RATE_PARENT,
857 			.ops = &clk_branch2_ops,
858 		},
859 	},
860 };
861 
862 static struct clk_branch gcc_blsp1_uart2_apps_clk = {
863 	.halt_reg = 0x1f004,
864 	.halt_check = BRANCH_HALT,
865 	.clkr = {
866 		.enable_reg = 0x1f004,
867 		.enable_mask = BIT(0),
868 		.hw.init = &(struct clk_init_data){
869 			.name = "gcc_blsp1_uart2_apps_clk",
870 			.parent_data = &(const struct clk_parent_data){
871 				.hw = &gcc_blsp1_uart2_apps_clk_src.clkr.hw,
872 			},
873 			.num_parents = 1,
874 			.flags = CLK_SET_RATE_PARENT,
875 			.ops = &clk_branch2_ops,
876 		},
877 	},
878 };
879 
880 static struct clk_branch gcc_blsp1_uart3_apps_clk = {
881 	.halt_reg = 0x21004,
882 	.halt_check = BRANCH_HALT,
883 	.clkr = {
884 		.enable_reg = 0x21004,
885 		.enable_mask = BIT(0),
886 		.hw.init = &(struct clk_init_data){
887 			.name = "gcc_blsp1_uart3_apps_clk",
888 			.parent_data = &(const struct clk_parent_data){
889 				.hw = &gcc_blsp1_uart3_apps_clk_src.clkr.hw,
890 			},
891 			.num_parents = 1,
892 			.flags = CLK_SET_RATE_PARENT,
893 			.ops = &clk_branch2_ops,
894 		},
895 	},
896 };
897 
898 static struct clk_branch gcc_blsp1_uart4_apps_clk = {
899 	.halt_reg = 0x23004,
900 	.halt_check = BRANCH_HALT,
901 	.clkr = {
902 		.enable_reg = 0x23004,
903 		.enable_mask = BIT(0),
904 		.hw.init = &(struct clk_init_data){
905 			.name = "gcc_blsp1_uart4_apps_clk",
906 			.parent_data = &(const struct clk_parent_data){
907 				.hw = &gcc_blsp1_uart4_apps_clk_src.clkr.hw,
908 			},
909 			.num_parents = 1,
910 			.flags = CLK_SET_RATE_PARENT,
911 			.ops = &clk_branch2_ops,
912 		},
913 	},
914 };
915 
916 static struct clk_branch gcc_boot_rom_ahb_clk = {
917 	.halt_reg = 0x27004,
918 	.halt_check = BRANCH_HALT_VOTED,
919 	.hwcg_reg = 0x27004,
920 	.hwcg_bit = 1,
921 	.clkr = {
922 		.enable_reg = 0x6d008,
923 		.enable_mask = BIT(10),
924 		.hw.init = &(struct clk_init_data){
925 			.name = "gcc_boot_rom_ahb_clk",
926 			.ops = &clk_branch2_ops,
927 		},
928 	},
929 };
930 
931 static struct clk_branch gcc_gp1_clk = {
932 	.halt_reg = 0x37000,
933 	.halt_check = BRANCH_HALT,
934 	.clkr = {
935 		.enable_reg = 0x37000,
936 		.enable_mask = BIT(0),
937 		.hw.init = &(struct clk_init_data){
938 			.name = "gcc_gp1_clk",
939 			.parent_data = &(const struct clk_parent_data){
940 				.hw = &gcc_gp1_clk_src.clkr.hw,
941 			},
942 			.num_parents = 1,
943 			.flags = CLK_SET_RATE_PARENT,
944 			.ops = &clk_branch2_ops,
945 		},
946 	},
947 };
948 
949 static struct clk_branch gcc_gp2_clk = {
950 	.halt_reg = 0x38000,
951 	.halt_check = BRANCH_HALT,
952 	.clkr = {
953 		.enable_reg = 0x38000,
954 		.enable_mask = BIT(0),
955 		.hw.init = &(struct clk_init_data){
956 			.name = "gcc_gp2_clk",
957 			.parent_data = &(const struct clk_parent_data){
958 				.hw = &gcc_gp2_clk_src.clkr.hw,
959 			},
960 			.num_parents = 1,
961 			.flags = CLK_SET_RATE_PARENT,
962 			.ops = &clk_branch2_ops,
963 		},
964 	},
965 };
966 
967 static struct clk_branch gcc_gp3_clk = {
968 	.halt_reg = 0x39000,
969 	.halt_check = BRANCH_HALT,
970 	.clkr = {
971 		.enable_reg = 0x39000,
972 		.enable_mask = BIT(0),
973 		.hw.init = &(struct clk_init_data){
974 			.name = "gcc_gp3_clk",
975 			.parent_data = &(const struct clk_parent_data){
976 				.hw = &gcc_gp3_clk_src.clkr.hw,
977 			},
978 			.num_parents = 1,
979 			.flags = CLK_SET_RATE_PARENT,
980 			.ops = &clk_branch2_ops,
981 		},
982 	},
983 };
984 
985 static struct clk_branch gcc_pcie_0_clkref_en = {
986 	.halt_reg = 0x88004,
987 	/*
988 	 * The clock controller does not handle the status bit for
989 	 * the clocks with gdscs(powerdomains) in hw controlled mode
990 	 * and hence avoid checking for the status bit of those clocks
991 	 * by setting the BRANCH_HALT_DELAY flag
992 	 */
993 	.halt_check = BRANCH_HALT_DELAY,
994 	.clkr = {
995 		.enable_reg = 0x88004,
996 		.enable_mask = BIT(0),
997 		.hw.init = &(struct clk_init_data){
998 			.name = "gcc_pcie_0_clkref_en",
999 			.ops = &clk_branch2_ops,
1000 		},
1001 	},
1002 };
1003 
1004 static struct clk_branch gcc_pcie_aux_clk = {
1005 	.halt_reg = 0x43034,
1006 	/*
1007 	 * The clock controller does not handle the status bit for
1008 	 * the clocks with gdscs(powerdomains) in hw controlled mode
1009 	 * and hence avoid checking for the status bit of those clocks
1010 	 * by setting the BRANCH_HALT_DELAY flag
1011 	 */
1012 	.halt_check = BRANCH_HALT_DELAY,
1013 	.hwcg_reg = 0x43034,
1014 	.hwcg_bit = 1,
1015 	.clkr = {
1016 		.enable_reg = 0x6d010,
1017 		.enable_mask = BIT(3),
1018 		.hw.init = &(struct clk_init_data){
1019 			.name = "gcc_pcie_aux_clk",
1020 			.parent_data = &(const struct clk_parent_data){
1021 				.hw = &gcc_pcie_aux_clk_src.clkr.hw,
1022 			},
1023 			.num_parents = 1,
1024 			.flags = CLK_SET_RATE_PARENT,
1025 			.ops = &clk_branch2_ops,
1026 		},
1027 	},
1028 };
1029 
1030 static struct clk_branch gcc_pcie_cfg_ahb_clk = {
1031 	.halt_reg = 0x4302c,
1032 	.halt_check = BRANCH_HALT_VOTED,
1033 	.hwcg_reg = 0x4302c,
1034 	.hwcg_bit = 1,
1035 	.clkr = {
1036 		.enable_reg = 0x6d010,
1037 		.enable_mask = BIT(2),
1038 		.hw.init = &(struct clk_init_data){
1039 			.name = "gcc_pcie_cfg_ahb_clk",
1040 			.ops = &clk_branch2_ops,
1041 		},
1042 	},
1043 };
1044 
1045 static struct clk_branch gcc_pcie_mstr_axi_clk = {
1046 	.halt_reg = 0x43024,
1047 	.halt_check = BRANCH_HALT_VOTED,
1048 	.hwcg_reg = 0x43024,
1049 	.hwcg_bit = 1,
1050 	.clkr = {
1051 		.enable_reg = 0x6d010,
1052 		.enable_mask = BIT(1),
1053 		.hw.init = &(struct clk_init_data){
1054 			.name = "gcc_pcie_mstr_axi_clk",
1055 			.ops = &clk_branch2_ops,
1056 		},
1057 	},
1058 };
1059 
1060 static struct clk_branch gcc_pcie_pipe_clk = {
1061 	.halt_reg = 0x4303c,
1062 	/*
1063 	 * The clock controller does not handle the status bit for
1064 	 * the clocks with gdscs(powerdomains) in hw controlled mode
1065 	 * and hence avoid checking for the status bit of those clocks
1066 	 * by setting the BRANCH_HALT_DELAY flag
1067 	 */
1068 	.halt_check = BRANCH_HALT_DELAY,
1069 	.hwcg_reg = 0x4303c,
1070 	.hwcg_bit = 1,
1071 	.clkr = {
1072 		.enable_reg = 0x6d010,
1073 		.enable_mask = BIT(4),
1074 		.hw.init = &(struct clk_init_data){
1075 			.name = "gcc_pcie_pipe_clk",
1076 			.parent_data = &(const struct clk_parent_data){
1077 				.hw = &gcc_pcie_pipe_clk_src.clkr.hw,
1078 			},
1079 			.num_parents = 1,
1080 			.flags = CLK_SET_RATE_PARENT,
1081 			.ops = &clk_branch2_ops,
1082 		},
1083 	},
1084 };
1085 
1086 static struct clk_branch gcc_pcie_rchng_phy_clk = {
1087 	.halt_reg = 0x43030,
1088 	.halt_check = BRANCH_HALT_VOTED,
1089 	.hwcg_reg = 0x43030,
1090 	.hwcg_bit = 1,
1091 	.clkr = {
1092 		.enable_reg = 0x6d010,
1093 		.enable_mask = BIT(7),
1094 		.hw.init = &(struct clk_init_data){
1095 			.name = "gcc_pcie_rchng_phy_clk",
1096 			.parent_data = &(const struct clk_parent_data){
1097 				.hw = &gcc_pcie_rchng_phy_clk_src.clkr.hw,
1098 			},
1099 			.num_parents = 1,
1100 			.flags = CLK_SET_RATE_PARENT,
1101 			.ops = &clk_branch2_ops,
1102 		},
1103 	},
1104 };
1105 
1106 static struct clk_branch gcc_pcie_sleep_clk = {
1107 	.halt_reg = 0x43038,
1108 	.halt_check = BRANCH_HALT_VOTED,
1109 	.hwcg_reg = 0x43038,
1110 	.hwcg_bit = 1,
1111 	.clkr = {
1112 		.enable_reg = 0x6d010,
1113 		.enable_mask = BIT(6),
1114 		.hw.init = &(struct clk_init_data){
1115 			.name = "gcc_pcie_sleep_clk",
1116 			.parent_data = &(const struct clk_parent_data){
1117 				.hw = &gcc_pcie_aux_phy_clk_src.clkr.hw,
1118 			},
1119 			.num_parents = 1,
1120 			.flags = CLK_SET_RATE_PARENT,
1121 			.ops = &clk_branch2_ops,
1122 		},
1123 	},
1124 };
1125 
1126 static struct clk_branch gcc_pcie_slv_axi_clk = {
1127 	.halt_reg = 0x4301c,
1128 	.halt_check = BRANCH_HALT_VOTED,
1129 	.hwcg_reg = 0x4301c,
1130 	.hwcg_bit = 1,
1131 	.clkr = {
1132 		.enable_reg = 0x6d010,
1133 		.enable_mask = BIT(0),
1134 		.hw.init = &(struct clk_init_data){
1135 			.name = "gcc_pcie_slv_axi_clk",
1136 			.ops = &clk_branch2_ops,
1137 		},
1138 	},
1139 };
1140 
1141 static struct clk_branch gcc_pcie_slv_q2a_axi_clk = {
1142 	.halt_reg = 0x43018,
1143 	.halt_check = BRANCH_HALT_VOTED,
1144 	.hwcg_reg = 0x43018,
1145 	.hwcg_bit = 1,
1146 	.clkr = {
1147 		.enable_reg = 0x6d010,
1148 		.enable_mask = BIT(5),
1149 		.hw.init = &(struct clk_init_data){
1150 			.name = "gcc_pcie_slv_q2a_axi_clk",
1151 			.ops = &clk_branch2_ops,
1152 		},
1153 	},
1154 };
1155 
1156 static struct clk_branch gcc_pdm2_clk = {
1157 	.halt_reg = 0x2400c,
1158 	.halt_check = BRANCH_HALT,
1159 	.clkr = {
1160 		.enable_reg = 0x2400c,
1161 		.enable_mask = BIT(0),
1162 		.hw.init = &(struct clk_init_data){
1163 			.name = "gcc_pdm2_clk",
1164 			.parent_data = &(const struct clk_parent_data){
1165 				.hw = &gcc_pdm2_clk_src.clkr.hw,
1166 			},
1167 			.num_parents = 1,
1168 			.flags = CLK_SET_RATE_PARENT,
1169 			.ops = &clk_branch2_ops,
1170 		},
1171 	},
1172 };
1173 
1174 static struct clk_branch gcc_pdm_ahb_clk = {
1175 	.halt_reg = 0x24004,
1176 	.halt_check = BRANCH_HALT,
1177 	.hwcg_reg = 0x24004,
1178 	.hwcg_bit = 1,
1179 	.clkr = {
1180 		.enable_reg = 0x24004,
1181 		.enable_mask = BIT(0),
1182 		.hw.init = &(struct clk_init_data){
1183 			.name = "gcc_pdm_ahb_clk",
1184 			.ops = &clk_branch2_ops,
1185 		},
1186 	},
1187 };
1188 
1189 static struct clk_branch gcc_pdm_xo4_clk = {
1190 	.halt_reg = 0x24008,
1191 	.halt_check = BRANCH_HALT,
1192 	.clkr = {
1193 		.enable_reg = 0x24008,
1194 		.enable_mask = BIT(0),
1195 		.hw.init = &(struct clk_init_data){
1196 			.name = "gcc_pdm_xo4_clk",
1197 			.ops = &clk_branch2_ops,
1198 		},
1199 	},
1200 };
1201 
1202 static struct clk_branch gcc_rx1_usb2_clkref_en = {
1203 	.halt_reg = 0x88008,
1204 	.halt_check = BRANCH_HALT,
1205 	.clkr = {
1206 		.enable_reg = 0x88008,
1207 		.enable_mask = BIT(0),
1208 		.hw.init = &(struct clk_init_data){
1209 			.name = "gcc_rx1_usb2_clkref_en",
1210 			.ops = &clk_branch2_ops,
1211 		},
1212 	},
1213 };
1214 
1215 static struct clk_branch gcc_sdcc1_ahb_clk = {
1216 	.halt_reg = 0x1a00c,
1217 	.halt_check = BRANCH_HALT,
1218 	.clkr = {
1219 		.enable_reg = 0x1a00c,
1220 		.enable_mask = BIT(0),
1221 		.hw.init = &(struct clk_init_data){
1222 			.name = "gcc_sdcc1_ahb_clk",
1223 			.ops = &clk_branch2_ops,
1224 		},
1225 	},
1226 };
1227 
1228 static struct clk_branch gcc_sdcc1_apps_clk = {
1229 	.halt_reg = 0x1a004,
1230 	.halt_check = BRANCH_HALT,
1231 	.clkr = {
1232 		.enable_reg = 0x1a004,
1233 		.enable_mask = BIT(0),
1234 		.hw.init = &(struct clk_init_data){
1235 			.name = "gcc_sdcc1_apps_clk",
1236 			.parent_data = &(const struct clk_parent_data){
1237 				.hw = &gcc_sdcc1_apps_clk_src.clkr.hw,
1238 			},
1239 			.num_parents = 1,
1240 			.flags = CLK_SET_RATE_PARENT,
1241 			.ops = &clk_branch2_ops,
1242 		},
1243 	},
1244 };
1245 
1246 static struct clk_branch gcc_usb30_master_clk = {
1247 	.halt_reg = 0x17018,
1248 	.halt_check = BRANCH_HALT,
1249 	.clkr = {
1250 		.enable_reg = 0x17018,
1251 		.enable_mask = BIT(0),
1252 		.hw.init = &(struct clk_init_data){
1253 			.name = "gcc_usb30_master_clk",
1254 			.parent_data = &(const struct clk_parent_data){
1255 				.hw = &gcc_usb30_master_clk_src.clkr.hw,
1256 			},
1257 			.num_parents = 1,
1258 			.flags = CLK_SET_RATE_PARENT,
1259 			.ops = &clk_branch2_ops,
1260 		},
1261 	},
1262 };
1263 
1264 static struct clk_branch gcc_usb30_mock_utmi_clk = {
1265 	.halt_reg = 0x1702c,
1266 	.halt_check = BRANCH_HALT,
1267 	.clkr = {
1268 		.enable_reg = 0x1702c,
1269 		.enable_mask = BIT(0),
1270 		.hw.init = &(struct clk_init_data){
1271 			.name = "gcc_usb30_mock_utmi_clk",
1272 			.parent_data = &(const struct clk_parent_data){
1273 				.hw =
1274 					&gcc_usb30_mock_utmi_postdiv_clk_src.clkr.hw,
1275 			},
1276 			.num_parents = 1,
1277 			.flags = CLK_SET_RATE_PARENT,
1278 			.ops = &clk_branch2_ops,
1279 		},
1280 	},
1281 };
1282 
1283 static struct clk_branch gcc_usb30_mstr_axi_clk = {
1284 	.halt_reg = 0x17020,
1285 	.halt_check = BRANCH_HALT,
1286 	.clkr = {
1287 		.enable_reg = 0x17020,
1288 		.enable_mask = BIT(0),
1289 		.hw.init = &(struct clk_init_data){
1290 			.name = "gcc_usb30_mstr_axi_clk",
1291 			.ops = &clk_branch2_ops,
1292 		},
1293 	},
1294 };
1295 
1296 static struct clk_branch gcc_usb30_sleep_clk = {
1297 	.halt_reg = 0x17028,
1298 	.halt_check = BRANCH_HALT,
1299 	.clkr = {
1300 		.enable_reg = 0x17028,
1301 		.enable_mask = BIT(0),
1302 		.hw.init = &(struct clk_init_data){
1303 			.name = "gcc_usb30_sleep_clk",
1304 			.ops = &clk_branch2_ops,
1305 		},
1306 	},
1307 };
1308 
1309 static struct clk_branch gcc_usb30_slv_ahb_clk = {
1310 	.halt_reg = 0x17024,
1311 	.halt_check = BRANCH_HALT,
1312 	.clkr = {
1313 		.enable_reg = 0x17024,
1314 		.enable_mask = BIT(0),
1315 		.hw.init = &(struct clk_init_data){
1316 			.name = "gcc_usb30_slv_ahb_clk",
1317 			.ops = &clk_branch2_ops,
1318 		},
1319 	},
1320 };
1321 
1322 static struct clk_branch gcc_usb3_phy_aux_clk = {
1323 	.halt_reg = 0x17064,
1324 	.halt_check = BRANCH_HALT,
1325 	.clkr = {
1326 		.enable_reg = 0x17064,
1327 		.enable_mask = BIT(0),
1328 		.hw.init = &(struct clk_init_data){
1329 			.name = "gcc_usb3_phy_aux_clk",
1330 			.parent_data = &(const struct clk_parent_data){
1331 				.hw = &gcc_usb3_phy_aux_clk_src.clkr.hw,
1332 			},
1333 			.num_parents = 1,
1334 			.flags = CLK_SET_RATE_PARENT,
1335 			.ops = &clk_branch2_ops,
1336 		},
1337 	},
1338 };
1339 
1340 static struct gdsc usb30_gdsc = {
1341 	.gdscr = 0x17004,
1342 	.pd = {
1343 		.name = "usb30_gdsc",
1344 	},
1345 	.pwrsts = PWRSTS_OFF_ON,
1346 };
1347 
1348 static struct gdsc pcie_gdsc = {
1349 	.gdscr = 0x43004,
1350 	.pd = {
1351 		.name = "pcie_gdsc",
1352 	},
1353 	.pwrsts = PWRSTS_OFF_ON,
1354 };
1355 
1356 static struct clk_branch gcc_usb3_phy_pipe_clk = {
1357 	.halt_reg = 0x17068,
1358 	/*
1359 	 * The clock controller does not handle the status bit for
1360 	 * the clocks with gdscs(powerdomains) in hw controlled mode
1361 	 * and hence avoid checking for the status bit of those clocks
1362 	 * by setting the BRANCH_HALT_DELAY flag
1363 	 */
1364 	.halt_check = BRANCH_HALT_DELAY,
1365 	.hwcg_reg = 0x17068,
1366 	.hwcg_bit = 1,
1367 	.clkr = {
1368 		.enable_reg = 0x17068,
1369 		.enable_mask = BIT(0),
1370 		.hw.init = &(struct clk_init_data){
1371 			.name = "gcc_usb3_phy_pipe_clk",
1372 			.parent_data = &(const struct clk_parent_data){
1373 				.hw = &gcc_usb3_phy_pipe_clk_src.clkr.hw,
1374 			},
1375 			.num_parents = 1,
1376 			.flags = CLK_SET_RATE_PARENT,
1377 			.ops = &clk_branch2_ops,
1378 		},
1379 	},
1380 };
1381 
1382 static struct clk_branch gcc_usb3_prim_clkref_en = {
1383 	.halt_reg = 0x88000,
1384 	.halt_check = BRANCH_HALT,
1385 	.clkr = {
1386 		.enable_reg = 0x88000,
1387 		.enable_mask = BIT(0),
1388 		.hw.init = &(struct clk_init_data){
1389 			.name = "gcc_usb3_prim_clkref_en",
1390 			.ops = &clk_branch2_ops,
1391 		},
1392 	},
1393 };
1394 
1395 static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
1396 	.halt_reg = 0x19008,
1397 	.halt_check = BRANCH_HALT,
1398 	.hwcg_reg = 0x19008,
1399 	.hwcg_bit = 1,
1400 	.clkr = {
1401 		.enable_reg = 0x19008,
1402 		.enable_mask = BIT(0),
1403 		.hw.init = &(struct clk_init_data){
1404 			.name = "gcc_usb_phy_cfg_ahb2phy_clk",
1405 			.ops = &clk_branch2_ops,
1406 		},
1407 	},
1408 };
1409 
1410 static struct clk_branch gcc_xo_div4_clk = {
1411 	.halt_reg = 0x2e010,
1412 	.halt_check = BRANCH_HALT,
1413 	.clkr = {
1414 		.enable_reg = 0x2e010,
1415 		.enable_mask = BIT(0),
1416 		.hw.init = &(struct clk_init_data){
1417 			.name = "gcc_xo_div4_clk",
1418 			.ops = &clk_branch2_ops,
1419 		},
1420 	},
1421 };
1422 
1423 static struct clk_branch gcc_xo_pcie_link_clk = {
1424 	.halt_reg = 0x2e008,
1425 	.halt_check = BRANCH_HALT,
1426 	.hwcg_reg = 0x2e008,
1427 	.hwcg_bit = 1,
1428 	.clkr = {
1429 		.enable_reg = 0x2e008,
1430 		.enable_mask = BIT(0),
1431 		.hw.init = &(struct clk_init_data){
1432 			.name = "gcc_xo_pcie_link_clk",
1433 			.ops = &clk_branch2_ops,
1434 		},
1435 	},
1436 };
1437 
1438 static struct clk_regmap *gcc_sdx65_clocks[] = {
1439 	[GCC_AHB_PCIE_LINK_CLK] = &gcc_ahb_pcie_link_clk.clkr,
1440 	[GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
1441 	[GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
1442 	[GCC_BLSP1_QUP1_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup1_i2c_apps_clk_src.clkr,
1443 	[GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
1444 	[GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup1_spi_apps_clk_src.clkr,
1445 	[GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
1446 	[GCC_BLSP1_QUP2_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup2_i2c_apps_clk_src.clkr,
1447 	[GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
1448 	[GCC_BLSP1_QUP2_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup2_spi_apps_clk_src.clkr,
1449 	[GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
1450 	[GCC_BLSP1_QUP3_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup3_i2c_apps_clk_src.clkr,
1451 	[GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
1452 	[GCC_BLSP1_QUP3_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup3_spi_apps_clk_src.clkr,
1453 	[GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
1454 	[GCC_BLSP1_QUP4_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup4_i2c_apps_clk_src.clkr,
1455 	[GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
1456 	[GCC_BLSP1_QUP4_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup4_spi_apps_clk_src.clkr,
1457 	[GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr,
1458 	[GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
1459 	[GCC_BLSP1_UART1_APPS_CLK_SRC] = &gcc_blsp1_uart1_apps_clk_src.clkr,
1460 	[GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
1461 	[GCC_BLSP1_UART2_APPS_CLK_SRC] = &gcc_blsp1_uart2_apps_clk_src.clkr,
1462 	[GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr,
1463 	[GCC_BLSP1_UART3_APPS_CLK_SRC] = &gcc_blsp1_uart3_apps_clk_src.clkr,
1464 	[GCC_BLSP1_UART4_APPS_CLK] = &gcc_blsp1_uart4_apps_clk.clkr,
1465 	[GCC_BLSP1_UART4_APPS_CLK_SRC] = &gcc_blsp1_uart4_apps_clk_src.clkr,
1466 	[GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
1467 	[GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr,
1468 	[GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.clkr,
1469 	[GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
1470 	[GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
1471 	[GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
1472 	[GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr,
1473 	[GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
1474 	[GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr,
1475 	[GCC_PCIE_0_CLKREF_EN] = &gcc_pcie_0_clkref_en.clkr,
1476 	[GCC_PCIE_AUX_CLK] = &gcc_pcie_aux_clk.clkr,
1477 	[GCC_PCIE_AUX_CLK_SRC] = &gcc_pcie_aux_clk_src.clkr,
1478 	[GCC_PCIE_AUX_PHY_CLK_SRC] = &gcc_pcie_aux_phy_clk_src.clkr,
1479 	[GCC_PCIE_CFG_AHB_CLK] = &gcc_pcie_cfg_ahb_clk.clkr,
1480 	[GCC_PCIE_MSTR_AXI_CLK] = &gcc_pcie_mstr_axi_clk.clkr,
1481 	[GCC_PCIE_PIPE_CLK] = &gcc_pcie_pipe_clk.clkr,
1482 	[GCC_PCIE_PIPE_CLK_SRC] = &gcc_pcie_pipe_clk_src.clkr,
1483 	[GCC_PCIE_RCHNG_PHY_CLK] = &gcc_pcie_rchng_phy_clk.clkr,
1484 	[GCC_PCIE_RCHNG_PHY_CLK_SRC] = &gcc_pcie_rchng_phy_clk_src.clkr,
1485 	[GCC_PCIE_SLEEP_CLK] = &gcc_pcie_sleep_clk.clkr,
1486 	[GCC_PCIE_SLV_AXI_CLK] = &gcc_pcie_slv_axi_clk.clkr,
1487 	[GCC_PCIE_SLV_Q2A_AXI_CLK] = &gcc_pcie_slv_q2a_axi_clk.clkr,
1488 	[GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
1489 	[GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
1490 	[GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
1491 	[GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
1492 	[GCC_RX1_USB2_CLKREF_EN] = &gcc_rx1_usb2_clkref_en.clkr,
1493 	[GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
1494 	[GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
1495 	[GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr,
1496 	[GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr,
1497 	[GCC_USB30_MASTER_CLK_SRC] = &gcc_usb30_master_clk_src.clkr,
1498 	[GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr,
1499 	[GCC_USB30_MOCK_UTMI_CLK_SRC] = &gcc_usb30_mock_utmi_clk_src.clkr,
1500 	[GCC_USB30_MOCK_UTMI_POSTDIV_CLK_SRC] =	&gcc_usb30_mock_utmi_postdiv_clk_src.clkr,
1501 	[GCC_USB30_MSTR_AXI_CLK] = &gcc_usb30_mstr_axi_clk.clkr,
1502 	[GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr,
1503 	[GCC_USB30_SLV_AHB_CLK] = &gcc_usb30_slv_ahb_clk.clkr,
1504 	[GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr,
1505 	[GCC_USB3_PHY_AUX_CLK_SRC] = &gcc_usb3_phy_aux_clk_src.clkr,
1506 	[GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr,
1507 	[GCC_USB3_PHY_PIPE_CLK_SRC] = &gcc_usb3_phy_pipe_clk_src.clkr,
1508 	[GCC_USB3_PRIM_CLKREF_EN] = &gcc_usb3_prim_clkref_en.clkr,
1509 	[GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
1510 	[GCC_XO_DIV4_CLK] = &gcc_xo_div4_clk.clkr,
1511 	[GCC_XO_PCIE_LINK_CLK] = &gcc_xo_pcie_link_clk.clkr,
1512 	[GPLL0] = &gpll0.clkr,
1513 	[GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
1514 };
1515 
1516 static const struct qcom_reset_map gcc_sdx65_resets[] = {
1517 	[GCC_BLSP1_QUP1_BCR] = { 0x1c000 },
1518 	[GCC_BLSP1_QUP2_BCR] = { 0x1e000 },
1519 	[GCC_BLSP1_QUP3_BCR] = { 0x20000 },
1520 	[GCC_BLSP1_QUP4_BCR] = { 0x22000 },
1521 	[GCC_BLSP1_UART1_BCR] = { 0x1d000 },
1522 	[GCC_BLSP1_UART2_BCR] = { 0x1f000 },
1523 	[GCC_BLSP1_UART3_BCR] = { 0x21000 },
1524 	[GCC_BLSP1_UART4_BCR] = { 0x23000 },
1525 	[GCC_PCIE_BCR] = { 0x43000 },
1526 	[GCC_PCIE_LINK_DOWN_BCR] = { 0x77000 },
1527 	[GCC_PCIE_NOCSR_COM_PHY_BCR] = { 0x78008 },
1528 	[GCC_PCIE_PHY_BCR] = { 0x44000 },
1529 	[GCC_PCIE_PHY_CFG_AHB_BCR] = { 0x78000 },
1530 	[GCC_PCIE_PHY_COM_BCR] = { 0x78004 },
1531 	[GCC_PCIE_PHY_NOCSR_COM_PHY_BCR] = { 0x7800c },
1532 	[GCC_PDM_BCR] = { 0x24000 },
1533 	[GCC_QUSB2PHY_BCR] = { 0x19000 },
1534 	[GCC_SDCC1_BCR] = { 0x1a000 },
1535 	[GCC_TCSR_PCIE_BCR] = { 0x57000 },
1536 	[GCC_USB30_BCR] = { 0x17000 },
1537 	[GCC_USB3_PHY_BCR] = { 0x18000 },
1538 	[GCC_USB3PHY_PHY_BCR] = { 0x18004 },
1539 	[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x19004 },
1540 };
1541 
1542 static struct gdsc *gcc_sdx65_gdscs[] = {
1543 	[USB30_GDSC] = &usb30_gdsc,
1544 	[PCIE_GDSC] = &pcie_gdsc,
1545 };
1546 
1547 static const struct regmap_config gcc_sdx65_regmap_config = {
1548 	.reg_bits = 32,
1549 	.reg_stride = 4,
1550 	.val_bits = 32,
1551 	.max_register = 0x1f101c,
1552 	.fast_io = true,
1553 };
1554 
1555 static const struct qcom_cc_desc gcc_sdx65_desc = {
1556 	.config = &gcc_sdx65_regmap_config,
1557 	.clks = gcc_sdx65_clocks,
1558 	.num_clks = ARRAY_SIZE(gcc_sdx65_clocks),
1559 	.resets = gcc_sdx65_resets,
1560 	.num_resets = ARRAY_SIZE(gcc_sdx65_resets),
1561 	.gdscs = gcc_sdx65_gdscs,
1562 	.num_gdscs = ARRAY_SIZE(gcc_sdx65_gdscs),
1563 };
1564 
1565 static const struct of_device_id gcc_sdx65_match_table[] = {
1566 	{ .compatible = "qcom,gcc-sdx65" },
1567 	{ }
1568 };
1569 MODULE_DEVICE_TABLE(of, gcc_sdx65_match_table);
1570 
1571 static int gcc_sdx65_probe(struct platform_device *pdev)
1572 {
1573 	struct regmap *regmap;
1574 
1575 	regmap = qcom_cc_map(pdev, &gcc_sdx65_desc);
1576 	if (IS_ERR(regmap))
1577 		return PTR_ERR(regmap);
1578 	/*
1579 	 * Keep the clocks always-ON as they are critical to the functioning
1580 	 * of the system:
1581 	 * GCC_SYS_NOC_CPUSS_AHB_CLK, GCC_CPUSS_AHB_CLK, GCC_CPUSS_GNOC_CLK
1582 	 */
1583 	regmap_update_bits(regmap, 0x6d008, BIT(0), BIT(0));
1584 	regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21));
1585 	regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22));
1586 
1587 	return qcom_cc_really_probe(pdev, &gcc_sdx65_desc, regmap);
1588 }
1589 
1590 static struct platform_driver gcc_sdx65_driver = {
1591 	.probe = gcc_sdx65_probe,
1592 	.driver = {
1593 		.name = "gcc-sdx65",
1594 		.of_match_table = gcc_sdx65_match_table,
1595 	},
1596 };
1597 
1598 static int __init gcc_sdx65_init(void)
1599 {
1600 	return platform_driver_register(&gcc_sdx65_driver);
1601 }
1602 subsys_initcall(gcc_sdx65_init);
1603 
1604 static void __exit gcc_sdx65_exit(void)
1605 {
1606 	platform_driver_unregister(&gcc_sdx65_driver);
1607 }
1608 module_exit(gcc_sdx65_exit);
1609 
1610 MODULE_DESCRIPTION("QTI GCC SDX65 Driver");
1611 MODULE_LICENSE("GPL v2");
1612