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