1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2022 Kernkonzept GmbH.
4 *
5 * Based on gcc-msm8916.c:
6 * Copyright 2015 Linaro Limited
7 * adapted with data from clock-gcc-8909.c in Qualcomm's msm-3.18 release:
8 * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
9 */
10
11 #include <linux/bitops.h>
12 #include <linux/clk-provider.h>
13 #include <linux/err.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/of.h>
17 #include <linux/of_device.h>
18 #include <linux/platform_device.h>
19 #include <linux/regmap.h>
20 #include <linux/reset-controller.h>
21
22 #include <dt-bindings/clock/qcom,gcc-msm8909.h>
23
24 #include "clk-alpha-pll.h"
25 #include "clk-branch.h"
26 #include "clk-pll.h"
27 #include "clk-rcg.h"
28 #include "clk-regmap.h"
29 #include "common.h"
30 #include "gdsc.h"
31 #include "reset.h"
32
33 /* Need to match the order of clocks in DT binding */
34 enum {
35 DT_XO,
36 DT_SLEEP_CLK,
37 DT_DSI0PLL,
38 DT_DSI0PLL_BYTE,
39 };
40
41 enum {
42 P_XO,
43 P_SLEEP_CLK,
44 P_GPLL0,
45 P_GPLL1,
46 P_GPLL2,
47 P_BIMC,
48 P_DSI0PLL,
49 P_DSI0PLL_BYTE,
50 };
51
52 static const struct parent_map gcc_xo_map[] = {
53 { P_XO, 0 },
54 };
55
56 static const struct clk_parent_data gcc_xo_data[] = {
57 { .index = DT_XO },
58 };
59
60 static const struct clk_parent_data gcc_sleep_clk_data[] = {
61 { .index = DT_SLEEP_CLK },
62 };
63
64 static struct clk_alpha_pll gpll0_early = {
65 .offset = 0x21000,
66 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
67 .clkr = {
68 .enable_reg = 0x45000,
69 .enable_mask = BIT(0),
70 .hw.init = &(struct clk_init_data) {
71 .name = "gpll0_early",
72 .parent_data = gcc_xo_data,
73 .num_parents = ARRAY_SIZE(gcc_xo_data),
74 /* Avoid rate changes for shared clock */
75 .ops = &clk_alpha_pll_fixed_ops,
76 },
77 },
78 };
79
80 static struct clk_alpha_pll_postdiv gpll0 = {
81 .offset = 0x21000,
82 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
83 .clkr.hw.init = &(struct clk_init_data) {
84 .name = "gpll0",
85 .parent_hws = (const struct clk_hw*[]) {
86 &gpll0_early.clkr.hw,
87 },
88 .num_parents = 1,
89 /* Avoid rate changes for shared clock */
90 .ops = &clk_alpha_pll_postdiv_ro_ops,
91 },
92 };
93
94 static struct clk_pll gpll1 = {
95 .l_reg = 0x20004,
96 .m_reg = 0x20008,
97 .n_reg = 0x2000c,
98 .config_reg = 0x20010,
99 .mode_reg = 0x20000,
100 .status_reg = 0x2001c,
101 .status_bit = 17,
102 .clkr.hw.init = &(struct clk_init_data) {
103 .name = "gpll1",
104 .parent_data = gcc_xo_data,
105 .num_parents = ARRAY_SIZE(gcc_xo_data),
106 .ops = &clk_pll_ops,
107 },
108 };
109
110 static struct clk_regmap gpll1_vote = {
111 .enable_reg = 0x45000,
112 .enable_mask = BIT(1),
113 .hw.init = &(struct clk_init_data) {
114 .name = "gpll1_vote",
115 .parent_hws = (const struct clk_hw*[]) {
116 &gpll1.clkr.hw,
117 },
118 .num_parents = 1,
119 .ops = &clk_pll_vote_ops,
120 },
121 };
122
123 static struct clk_alpha_pll gpll2_early = {
124 .offset = 0x25000,
125 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
126 .clkr = {
127 .enable_reg = 0x45000,
128 .enable_mask = BIT(3),
129 .hw.init = &(struct clk_init_data) {
130 .name = "gpll2_early",
131 .parent_data = gcc_xo_data,
132 .num_parents = ARRAY_SIZE(gcc_xo_data),
133 /* Avoid rate changes for shared clock */
134 .ops = &clk_alpha_pll_fixed_ops,
135 },
136 },
137 };
138
139 static struct clk_alpha_pll_postdiv gpll2 = {
140 .offset = 0x25000,
141 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
142 .clkr.hw.init = &(struct clk_init_data) {
143 .name = "gpll2",
144 .parent_hws = (const struct clk_hw*[]) {
145 &gpll2_early.clkr.hw,
146 },
147 .num_parents = 1,
148 /* Avoid rate changes for shared clock */
149 .ops = &clk_alpha_pll_postdiv_ro_ops,
150 },
151 };
152
153 static struct clk_alpha_pll bimc_pll_early = {
154 .offset = 0x23000,
155 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
156 .clkr = {
157 .enable_reg = 0x45000,
158 .enable_mask = BIT(2),
159 .hw.init = &(struct clk_init_data) {
160 .name = "bimc_pll_early",
161 .parent_data = gcc_xo_data,
162 .num_parents = ARRAY_SIZE(gcc_xo_data),
163 /* Avoid rate changes for shared clock */
164 .ops = &clk_alpha_pll_fixed_ops,
165 },
166 },
167 };
168
169 static struct clk_alpha_pll_postdiv bimc_pll = {
170 .offset = 0x23000,
171 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
172 .clkr.hw.init = &(struct clk_init_data) {
173 .name = "bimc_pll",
174 .parent_hws = (const struct clk_hw*[]) {
175 &bimc_pll_early.clkr.hw,
176 },
177 .num_parents = 1,
178 /* Avoid rate changes for shared clock */
179 .ops = &clk_alpha_pll_postdiv_ro_ops,
180 },
181 };
182
183 static const struct parent_map gcc_xo_gpll0_map[] = {
184 { P_XO, 0 },
185 { P_GPLL0, 1 },
186 };
187
188 static const struct clk_parent_data gcc_xo_gpll0_data[] = {
189 { .index = DT_XO },
190 { .hw = &gpll0.clkr.hw },
191 };
192
193 static const struct parent_map gcc_xo_gpll0_bimc_map[] = {
194 { P_XO, 0 },
195 { P_GPLL0, 1 },
196 { P_BIMC, 2 },
197 };
198
199 static const struct clk_parent_data gcc_xo_gpll0_bimc_data[] = {
200 { .index = DT_XO },
201 { .hw = &gpll0.clkr.hw },
202 { .hw = &bimc_pll.clkr.hw },
203 };
204
205 static const struct freq_tbl ftbl_apss_ahb_clk_src[] = {
206 F(19200000, P_XO, 1, 0, 0),
207 F(50000000, P_GPLL0, 16, 0, 0),
208 F(100000000, P_GPLL0, 8, 0, 0),
209 { }
210 };
211
212 static struct clk_rcg2 apss_ahb_clk_src = {
213 .cmd_rcgr = 0x46000,
214 .hid_width = 5,
215 .freq_tbl = ftbl_apss_ahb_clk_src,
216 .parent_map = gcc_xo_gpll0_map,
217 .clkr.hw.init = &(struct clk_init_data) {
218 .name = "apss_ahb_clk_src",
219 .parent_data = gcc_xo_gpll0_data,
220 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
221 .ops = &clk_rcg2_ops,
222 }
223 };
224
225 static struct clk_rcg2 bimc_ddr_clk_src = {
226 .cmd_rcgr = 0x32004,
227 .hid_width = 5,
228 .parent_map = gcc_xo_gpll0_bimc_map,
229 .clkr.hw.init = &(struct clk_init_data) {
230 .name = "bimc_ddr_clk_src",
231 .parent_data = gcc_xo_gpll0_bimc_data,
232 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
233 .ops = &clk_rcg2_ops,
234 .flags = CLK_GET_RATE_NOCACHE,
235 },
236 };
237
238 static struct clk_rcg2 bimc_gpu_clk_src = {
239 .cmd_rcgr = 0x31028,
240 .hid_width = 5,
241 .parent_map = gcc_xo_gpll0_bimc_map,
242 .clkr.hw.init = &(struct clk_init_data) {
243 .name = "bimc_gpu_clk_src",
244 .parent_data = gcc_xo_gpll0_bimc_data,
245 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
246 .ops = &clk_rcg2_ops,
247 .flags = CLK_GET_RATE_NOCACHE,
248 },
249 };
250
251 static const struct freq_tbl ftbl_blsp_i2c_apps_clk_src[] = {
252 F(19200000, P_XO, 1, 0, 0),
253 F(50000000, P_GPLL0, 16, 0, 0),
254 { }
255 };
256
257 static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
258 .cmd_rcgr = 0x0200c,
259 .hid_width = 5,
260 .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
261 .parent_map = gcc_xo_gpll0_map,
262 .clkr.hw.init = &(struct clk_init_data) {
263 .name = "blsp1_qup1_i2c_apps_clk_src",
264 .parent_data = gcc_xo_gpll0_data,
265 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
266 .ops = &clk_rcg2_ops,
267 }
268 };
269
270 static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
271 .cmd_rcgr = 0x03000,
272 .hid_width = 5,
273 .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
274 .parent_map = gcc_xo_gpll0_map,
275 .clkr.hw.init = &(struct clk_init_data) {
276 .name = "blsp1_qup2_i2c_apps_clk_src",
277 .parent_data = gcc_xo_gpll0_data,
278 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
279 .ops = &clk_rcg2_ops,
280 }
281 };
282
283 static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
284 .cmd_rcgr = 0x04000,
285 .hid_width = 5,
286 .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
287 .parent_map = gcc_xo_gpll0_map,
288 .clkr.hw.init = &(struct clk_init_data) {
289 .name = "blsp1_qup3_i2c_apps_clk_src",
290 .parent_data = gcc_xo_gpll0_data,
291 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
292 .ops = &clk_rcg2_ops,
293 }
294 };
295
296 static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
297 .cmd_rcgr = 0x05000,
298 .hid_width = 5,
299 .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
300 .parent_map = gcc_xo_gpll0_map,
301 .clkr.hw.init = &(struct clk_init_data) {
302 .name = "blsp1_qup4_i2c_apps_clk_src",
303 .parent_data = gcc_xo_gpll0_data,
304 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
305 .ops = &clk_rcg2_ops,
306 }
307 };
308
309 static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
310 .cmd_rcgr = 0x06000,
311 .hid_width = 5,
312 .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
313 .parent_map = gcc_xo_gpll0_map,
314 .clkr.hw.init = &(struct clk_init_data) {
315 .name = "blsp1_qup5_i2c_apps_clk_src",
316 .parent_data = gcc_xo_gpll0_data,
317 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
318 .ops = &clk_rcg2_ops,
319 }
320 };
321
322 static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
323 .cmd_rcgr = 0x07000,
324 .hid_width = 5,
325 .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
326 .parent_map = gcc_xo_gpll0_map,
327 .clkr.hw.init = &(struct clk_init_data) {
328 .name = "blsp1_qup6_i2c_apps_clk_src",
329 .parent_data = gcc_xo_gpll0_data,
330 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
331 .ops = &clk_rcg2_ops,
332 }
333 };
334
335 static const struct freq_tbl ftbl_blsp_spi_apps_clk_src[] = {
336 F(960000, P_XO, 10, 1, 2),
337 F(4800000, P_XO, 4, 0, 0),
338 F(9600000, P_XO, 2, 0, 0),
339 F(16000000, P_GPLL0, 10, 1, 5),
340 F(19200000, P_XO, 1, 0, 0),
341 F(25000000, P_GPLL0, 16, 1, 2),
342 F(50000000, P_GPLL0, 16, 0, 0),
343 { }
344 };
345
346 static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
347 .cmd_rcgr = 0x02024,
348 .hid_width = 5,
349 .mnd_width = 8,
350 .freq_tbl = ftbl_blsp_spi_apps_clk_src,
351 .parent_map = gcc_xo_gpll0_map,
352 .clkr.hw.init = &(struct clk_init_data) {
353 .name = "blsp1_qup1_spi_apps_clk_src",
354 .parent_data = gcc_xo_gpll0_data,
355 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
356 .ops = &clk_rcg2_ops,
357 }
358 };
359
360 static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
361 .cmd_rcgr = 0x03014,
362 .hid_width = 5,
363 .mnd_width = 8,
364 .freq_tbl = ftbl_blsp_spi_apps_clk_src,
365 .parent_map = gcc_xo_gpll0_map,
366 .clkr.hw.init = &(struct clk_init_data) {
367 .name = "blsp1_qup2_spi_apps_clk_src",
368 .parent_data = gcc_xo_gpll0_data,
369 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
370 .ops = &clk_rcg2_ops,
371 }
372 };
373
374 static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
375 .cmd_rcgr = 0x04024,
376 .hid_width = 5,
377 .mnd_width = 8,
378 .freq_tbl = ftbl_blsp_spi_apps_clk_src,
379 .parent_map = gcc_xo_gpll0_map,
380 .clkr.hw.init = &(struct clk_init_data) {
381 .name = "blsp1_qup3_spi_apps_clk_src",
382 .parent_data = gcc_xo_gpll0_data,
383 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
384 .ops = &clk_rcg2_ops,
385 }
386 };
387
388 static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
389 .cmd_rcgr = 0x05024,
390 .hid_width = 5,
391 .mnd_width = 8,
392 .freq_tbl = ftbl_blsp_spi_apps_clk_src,
393 .parent_map = gcc_xo_gpll0_map,
394 .clkr.hw.init = &(struct clk_init_data) {
395 .name = "blsp1_qup4_spi_apps_clk_src",
396 .parent_data = gcc_xo_gpll0_data,
397 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
398 .ops = &clk_rcg2_ops,
399 }
400 };
401
402 static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
403 .cmd_rcgr = 0x06024,
404 .hid_width = 5,
405 .mnd_width = 8,
406 .freq_tbl = ftbl_blsp_spi_apps_clk_src,
407 .parent_map = gcc_xo_gpll0_map,
408 .clkr.hw.init = &(struct clk_init_data) {
409 .name = "blsp1_qup5_spi_apps_clk_src",
410 .parent_data = gcc_xo_gpll0_data,
411 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
412 .ops = &clk_rcg2_ops,
413 }
414 };
415
416 static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
417 .cmd_rcgr = 0x07024,
418 .hid_width = 5,
419 .mnd_width = 8,
420 .freq_tbl = ftbl_blsp_spi_apps_clk_src,
421 .parent_map = gcc_xo_gpll0_map,
422 .clkr.hw.init = &(struct clk_init_data) {
423 .name = "blsp1_qup6_spi_apps_clk_src",
424 .parent_data = gcc_xo_gpll0_data,
425 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
426 .ops = &clk_rcg2_ops,
427 }
428 };
429
430 static const struct freq_tbl ftbl_blsp_uart_apps_clk_src[] = {
431 F(3686400, P_GPLL0, 1, 72, 15625),
432 F(7372800, P_GPLL0, 1, 144, 15625),
433 F(14745600, P_GPLL0, 1, 288, 15625),
434 F(16000000, P_GPLL0, 10, 1, 5),
435 F(19200000, P_XO, 1, 0, 0),
436 F(24000000, P_GPLL0, 1, 3, 100),
437 F(25000000, P_GPLL0, 16, 1, 2),
438 F(32000000, P_GPLL0, 1, 1, 25),
439 F(40000000, P_GPLL0, 1, 1, 20),
440 F(46400000, P_GPLL0, 1, 29, 500),
441 F(48000000, P_GPLL0, 1, 3, 50),
442 F(51200000, P_GPLL0, 1, 8, 125),
443 F(56000000, P_GPLL0, 1, 7, 100),
444 F(58982400, P_GPLL0, 1, 1152, 15625),
445 F(60000000, P_GPLL0, 1, 3, 40),
446 { }
447 };
448
449 static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
450 .cmd_rcgr = 0x02044,
451 .hid_width = 5,
452 .mnd_width = 16,
453 .freq_tbl = ftbl_blsp_uart_apps_clk_src,
454 .parent_map = gcc_xo_gpll0_map,
455 .clkr.hw.init = &(struct clk_init_data) {
456 .name = "blsp1_uart1_apps_clk_src",
457 .parent_data = gcc_xo_gpll0_data,
458 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
459 .ops = &clk_rcg2_ops,
460 }
461 };
462
463 static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
464 .cmd_rcgr = 0x03034,
465 .hid_width = 5,
466 .mnd_width = 16,
467 .freq_tbl = ftbl_blsp_uart_apps_clk_src,
468 .parent_map = gcc_xo_gpll0_map,
469 .clkr.hw.init = &(struct clk_init_data) {
470 .name = "blsp1_uart2_apps_clk_src",
471 .parent_data = gcc_xo_gpll0_data,
472 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
473 .ops = &clk_rcg2_ops,
474 }
475 };
476
477 static const struct parent_map gcc_byte0_map[] = {
478 { P_XO, 0 },
479 { P_DSI0PLL_BYTE, 1 },
480 };
481
482 static const struct clk_parent_data gcc_byte_data[] = {
483 { .index = DT_XO },
484 { .index = DT_DSI0PLL_BYTE },
485 };
486
487 static struct clk_rcg2 byte0_clk_src = {
488 .cmd_rcgr = 0x4d044,
489 .hid_width = 5,
490 .parent_map = gcc_byte0_map,
491 .clkr.hw.init = &(struct clk_init_data) {
492 .name = "byte0_clk_src",
493 .parent_data = gcc_byte_data,
494 .num_parents = ARRAY_SIZE(gcc_byte_data),
495 .ops = &clk_byte2_ops,
496 .flags = CLK_SET_RATE_PARENT,
497 }
498 };
499
500 static const struct freq_tbl ftbl_camss_gp_clk_src[] = {
501 F(100000000, P_GPLL0, 8, 0, 0),
502 F(200000000, P_GPLL0, 4, 0, 0),
503 { }
504 };
505
506 static struct clk_rcg2 camss_gp0_clk_src = {
507 .cmd_rcgr = 0x54000,
508 .hid_width = 5,
509 .mnd_width = 8,
510 .freq_tbl = ftbl_camss_gp_clk_src,
511 .parent_map = gcc_xo_gpll0_map,
512 .clkr.hw.init = &(struct clk_init_data) {
513 .name = "camss_gp0_clk_src",
514 .parent_data = gcc_xo_gpll0_data,
515 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
516 .ops = &clk_rcg2_ops,
517 }
518 };
519
520 static struct clk_rcg2 camss_gp1_clk_src = {
521 .cmd_rcgr = 0x55000,
522 .hid_width = 5,
523 .mnd_width = 8,
524 .freq_tbl = ftbl_camss_gp_clk_src,
525 .parent_map = gcc_xo_gpll0_map,
526 .clkr.hw.init = &(struct clk_init_data) {
527 .name = "camss_gp1_clk_src",
528 .parent_data = gcc_xo_gpll0_data,
529 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
530 .ops = &clk_rcg2_ops,
531 }
532 };
533
534 static const struct freq_tbl ftbl_camss_top_ahb_clk_src[] = {
535 F(40000000, P_GPLL0, 10, 1, 2),
536 F(80000000, P_GPLL0, 10, 0, 0),
537 { }
538 };
539
540 static struct clk_rcg2 camss_top_ahb_clk_src = {
541 .cmd_rcgr = 0x5a000,
542 .hid_width = 5,
543 .mnd_width = 8,
544 .freq_tbl = ftbl_camss_top_ahb_clk_src,
545 .parent_map = gcc_xo_gpll0_map,
546 .clkr.hw.init = &(struct clk_init_data) {
547 .name = "camss_top_ahb_clk_src",
548 .parent_data = gcc_xo_gpll0_data,
549 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
550 .ops = &clk_rcg2_ops,
551 }
552 };
553
554 static const struct freq_tbl ftbl_crypto_clk_src[] = {
555 F(50000000, P_GPLL0, 16, 0, 0),
556 F(80000000, P_GPLL0, 10, 0, 0),
557 F(100000000, P_GPLL0, 8, 0, 0),
558 F(160000000, P_GPLL0, 5, 0, 0),
559 { }
560 };
561
562 static struct clk_rcg2 crypto_clk_src = {
563 .cmd_rcgr = 0x16004,
564 .hid_width = 5,
565 .freq_tbl = ftbl_crypto_clk_src,
566 .parent_map = gcc_xo_gpll0_map,
567 .clkr.hw.init = &(struct clk_init_data) {
568 .name = "crypto_clk_src",
569 .parent_data = gcc_xo_gpll0_data,
570 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
571 .ops = &clk_rcg2_ops,
572 }
573 };
574
575 static const struct freq_tbl ftbl_csi_clk_src[] = {
576 F(100000000, P_GPLL0, 8, 0, 0),
577 F(200000000, P_GPLL0, 4, 0, 0),
578 { }
579 };
580
581 static struct clk_rcg2 csi0_clk_src = {
582 .cmd_rcgr = 0x4e020,
583 .hid_width = 5,
584 .freq_tbl = ftbl_csi_clk_src,
585 .parent_map = gcc_xo_gpll0_map,
586 .clkr.hw.init = &(struct clk_init_data) {
587 .name = "csi0_clk_src",
588 .parent_data = gcc_xo_gpll0_data,
589 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_map),
590 .ops = &clk_rcg2_ops,
591 }
592 };
593
594 static struct clk_rcg2 csi1_clk_src = {
595 .cmd_rcgr = 0x4f020,
596 .hid_width = 5,
597 .freq_tbl = ftbl_csi_clk_src,
598 .parent_map = gcc_xo_gpll0_map,
599 .clkr.hw.init = &(struct clk_init_data) {
600 .name = "csi1_clk_src",
601 .parent_data = gcc_xo_gpll0_data,
602 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
603 .ops = &clk_rcg2_ops,
604 }
605 };
606
607 static const struct freq_tbl ftbl_csi_phytimer_clk_src[] = {
608 F(100000000, P_GPLL0, 8, 0, 0),
609 F(200000000, P_GPLL0, 4, 0, 0),
610 { }
611 };
612
613 static struct clk_rcg2 csi0phytimer_clk_src = {
614 .cmd_rcgr = 0x4e000,
615 .hid_width = 5,
616 .freq_tbl = ftbl_csi_phytimer_clk_src,
617 .parent_map = gcc_xo_gpll0_map,
618 .clkr.hw.init = &(struct clk_init_data) {
619 .name = "csi0phytimer_clk_src",
620 .parent_data = gcc_xo_gpll0_data,
621 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
622 .ops = &clk_rcg2_ops,
623 }
624 };
625
626 static const struct freq_tbl ftbl_esc0_clk_src[] = {
627 F(19200000, P_XO, 1, 0, 0),
628 { }
629 };
630
631 static struct clk_rcg2 esc0_clk_src = {
632 .cmd_rcgr = 0x4d05c,
633 .hid_width = 5,
634 .freq_tbl = ftbl_esc0_clk_src,
635 .parent_map = gcc_xo_map,
636 .clkr.hw.init = &(struct clk_init_data) {
637 .name = "esc0_clk_src",
638 .parent_data = gcc_xo_data,
639 .num_parents = ARRAY_SIZE(gcc_xo_data),
640 .ops = &clk_rcg2_ops,
641 }
642 };
643
644 static const struct parent_map gcc_gfx3d_map[] = {
645 { P_XO, 0 },
646 { P_GPLL0, 1 },
647 { P_GPLL1, 2 },
648 };
649
650 static const struct clk_parent_data gcc_gfx3d_data[] = {
651 { .index = DT_XO },
652 { .hw = &gpll0.clkr.hw },
653 { .hw = &gpll1_vote.hw },
654 };
655
656 static const struct freq_tbl ftbl_gfx3d_clk_src[] = {
657 F(19200000, P_XO, 1, 0, 0),
658 F(50000000, P_GPLL0, 16, 0, 0),
659 F(80000000, P_GPLL0, 10, 0, 0),
660 F(100000000, P_GPLL0, 8, 0, 0),
661 F(160000000, P_GPLL0, 5, 0, 0),
662 F(177780000, P_GPLL0, 4.5, 0, 0),
663 F(200000000, P_GPLL0, 4, 0, 0),
664 F(266670000, P_GPLL0, 3, 0, 0),
665 F(307200000, P_GPLL1, 4, 0, 0),
666 F(409600000, P_GPLL1, 3, 0, 0),
667 { }
668 };
669
670 static struct clk_rcg2 gfx3d_clk_src = {
671 .cmd_rcgr = 0x59000,
672 .hid_width = 5,
673 .freq_tbl = ftbl_gfx3d_clk_src,
674 .parent_map = gcc_gfx3d_map,
675 .clkr.hw.init = &(struct clk_init_data) {
676 .name = "gfx3d_clk_src",
677 .parent_data = gcc_gfx3d_data,
678 .num_parents = ARRAY_SIZE(gcc_gfx3d_data),
679 .ops = &clk_rcg2_ops,
680 }
681 };
682
683 static const struct freq_tbl ftbl_gp_clk_src[] = {
684 F(150000, P_XO, 1, 1, 128),
685 F(19200000, P_XO, 1, 0, 0),
686 { }
687 };
688
689 static struct clk_rcg2 gp1_clk_src = {
690 .cmd_rcgr = 0x08004,
691 .hid_width = 5,
692 .mnd_width = 8,
693 .freq_tbl = ftbl_gp_clk_src,
694 .parent_map = gcc_xo_map,
695 .clkr.hw.init = &(struct clk_init_data) {
696 .name = "gp1_clk_src",
697 .parent_data = gcc_xo_data,
698 .num_parents = ARRAY_SIZE(gcc_xo_data),
699 .ops = &clk_rcg2_ops,
700 }
701 };
702
703 static struct clk_rcg2 gp2_clk_src = {
704 .cmd_rcgr = 0x09004,
705 .hid_width = 5,
706 .mnd_width = 8,
707 .freq_tbl = ftbl_gp_clk_src,
708 .parent_map = gcc_xo_map,
709 .clkr.hw.init = &(struct clk_init_data) {
710 .name = "gp2_clk_src",
711 .parent_data = gcc_xo_data,
712 .num_parents = ARRAY_SIZE(gcc_xo_data),
713 .ops = &clk_rcg2_ops,
714 }
715 };
716
717 static struct clk_rcg2 gp3_clk_src = {
718 .cmd_rcgr = 0x0a004,
719 .hid_width = 5,
720 .mnd_width = 8,
721 .freq_tbl = ftbl_gp_clk_src,
722 .parent_map = gcc_xo_map,
723 .clkr.hw.init = &(struct clk_init_data) {
724 .name = "gp3_clk_src",
725 .parent_data = gcc_xo_data,
726 .num_parents = ARRAY_SIZE(gcc_xo_data),
727 .ops = &clk_rcg2_ops,
728 }
729 };
730
731 static const struct parent_map gcc_mclk_map[] = {
732 { P_XO, 0 },
733 { P_GPLL0, 1 },
734 { P_GPLL2, 3 },
735 };
736
737 static const struct clk_parent_data gcc_mclk_data[] = {
738 { .index = DT_XO },
739 { .hw = &gpll0.clkr.hw },
740 { .hw = &gpll2.clkr.hw },
741 };
742
743 static const struct freq_tbl ftbl_mclk_clk_src[] = {
744 F(24000000, P_GPLL2, 1, 1, 33),
745 F(66667000, P_GPLL0, 12, 0, 0),
746 { }
747 };
748
749 static struct clk_rcg2 mclk0_clk_src = {
750 .cmd_rcgr = 0x52000,
751 .hid_width = 5,
752 .mnd_width = 8,
753 .freq_tbl = ftbl_mclk_clk_src,
754 .parent_map = gcc_mclk_map,
755 .clkr.hw.init = &(struct clk_init_data) {
756 .name = "mclk0_clk_src",
757 .parent_data = gcc_mclk_data,
758 .num_parents = ARRAY_SIZE(gcc_mclk_data),
759 .ops = &clk_rcg2_ops,
760 }
761 };
762
763 static struct clk_rcg2 mclk1_clk_src = {
764 .cmd_rcgr = 0x53000,
765 .hid_width = 5,
766 .mnd_width = 8,
767 .freq_tbl = ftbl_mclk_clk_src,
768 .parent_map = gcc_mclk_map,
769 .clkr.hw.init = &(struct clk_init_data) {
770 .name = "mclk1_clk_src",
771 .parent_data = gcc_mclk_data,
772 .num_parents = ARRAY_SIZE(gcc_mclk_data),
773 .ops = &clk_rcg2_ops,
774 }
775 };
776
777 static const struct parent_map gcc_mdp_map[] = {
778 { P_XO, 0 },
779 { P_GPLL0, 1 },
780 { P_GPLL1, 3 },
781 };
782
783 static const struct clk_parent_data gcc_mdp_data[] = {
784 { .index = DT_XO },
785 { .hw = &gpll0.clkr.hw },
786 { .hw = &gpll1_vote.hw },
787 };
788
789 static const struct freq_tbl ftbl_mdp_clk_src[] = {
790 F(50000000, P_GPLL0, 16, 0, 0),
791 F(80000000, P_GPLL0, 10, 0, 0),
792 F(100000000, P_GPLL0, 8, 0, 0),
793 F(160000000, P_GPLL0, 5, 0, 0),
794 F(177780000, P_GPLL0, 4.5, 0, 0),
795 F(200000000, P_GPLL0, 4, 0, 0),
796 F(266670000, P_GPLL0, 3, 0, 0),
797 F(307200000, P_GPLL1, 4, 0, 0),
798 { }
799 };
800
801 static struct clk_rcg2 mdp_clk_src = {
802 .cmd_rcgr = 0x4d014,
803 .hid_width = 5,
804 .freq_tbl = ftbl_mdp_clk_src,
805 .parent_map = gcc_mdp_map,
806 .clkr.hw.init = &(struct clk_init_data) {
807 .name = "mdp_clk_src",
808 .parent_data = gcc_mdp_data,
809 .num_parents = ARRAY_SIZE(gcc_mdp_data),
810 .ops = &clk_rcg2_ops,
811 }
812 };
813
814 static const struct parent_map gcc_pclk0_map[] = {
815 { P_XO, 0 },
816 { P_DSI0PLL, 1 },
817 };
818
819 static const struct clk_parent_data gcc_pclk_data[] = {
820 { .index = DT_XO },
821 { .index = DT_DSI0PLL },
822 };
823
824 static struct clk_rcg2 pclk0_clk_src = {
825 .cmd_rcgr = 0x4d000,
826 .hid_width = 5,
827 .mnd_width = 8,
828 .parent_map = gcc_pclk0_map,
829 .clkr.hw.init = &(struct clk_init_data) {
830 .name = "pclk0_clk_src",
831 .parent_data = gcc_pclk_data,
832 .num_parents = ARRAY_SIZE(gcc_pclk_data),
833 .ops = &clk_pixel_ops,
834 .flags = CLK_SET_RATE_PARENT,
835 }
836 };
837
838 static struct clk_rcg2 pcnoc_bfdcd_clk_src = {
839 .cmd_rcgr = 0x27000,
840 .hid_width = 5,
841 .parent_map = gcc_xo_gpll0_bimc_map,
842 .clkr.hw.init = &(struct clk_init_data) {
843 .name = "pcnoc_bfdcd_clk_src",
844 .parent_data = gcc_xo_gpll0_bimc_data,
845 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
846 .ops = &clk_rcg2_ops,
847 },
848 };
849
850 static const struct freq_tbl ftbl_pdm2_clk_src[] = {
851 F(64000000, P_GPLL0, 12.5, 0, 0),
852 { }
853 };
854
855 static struct clk_rcg2 pdm2_clk_src = {
856 .cmd_rcgr = 0x44010,
857 .hid_width = 5,
858 .freq_tbl = ftbl_pdm2_clk_src,
859 .parent_map = gcc_xo_gpll0_map,
860 .clkr.hw.init = &(struct clk_init_data) {
861 .name = "pdm2_clk_src",
862 .parent_data = gcc_xo_gpll0_data,
863 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
864 .ops = &clk_rcg2_ops,
865 }
866 };
867
868 static const struct freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] = {
869 F(144000, P_XO, 16, 3, 25),
870 F(400000, P_XO, 12, 1, 4),
871 F(20000000, P_GPLL0, 10, 1, 4),
872 F(25000000, P_GPLL0, 16, 1, 2),
873 F(50000000, P_GPLL0, 16, 0, 0),
874 F(100000000, P_GPLL0, 8, 0, 0),
875 F(177770000, P_GPLL0, 4.5, 0, 0),
876 F(200000000, P_GPLL0, 4, 0, 0),
877 { }
878 };
879
880 static struct clk_rcg2 sdcc1_apps_clk_src = {
881 .cmd_rcgr = 0x42004,
882 .hid_width = 5,
883 .mnd_width = 8,
884 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
885 .parent_map = gcc_xo_gpll0_map,
886 .clkr.hw.init = &(struct clk_init_data) {
887 .name = "sdcc1_apps_clk_src",
888 .parent_data = gcc_xo_gpll0_data,
889 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
890 .ops = &clk_rcg2_floor_ops,
891 }
892 };
893
894 static struct clk_rcg2 sdcc2_apps_clk_src = {
895 .cmd_rcgr = 0x43004,
896 .hid_width = 5,
897 .mnd_width = 8,
898 .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
899 .parent_map = gcc_xo_gpll0_map,
900 .clkr.hw.init = &(struct clk_init_data) {
901 .name = "sdcc2_apps_clk_src",
902 .parent_data = gcc_xo_gpll0_data,
903 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
904 .ops = &clk_rcg2_floor_ops,
905 }
906 };
907
908 static struct clk_rcg2 system_noc_bfdcd_clk_src = {
909 .cmd_rcgr = 0x26004,
910 .hid_width = 5,
911 .parent_map = gcc_xo_gpll0_bimc_map,
912 .clkr.hw.init = &(struct clk_init_data) {
913 .name = "system_noc_bfdcd_clk_src",
914 .parent_data = gcc_xo_gpll0_bimc_data,
915 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
916 .ops = &clk_rcg2_ops,
917 },
918 };
919
920 static const struct freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
921 F(57140000, P_GPLL0, 14, 0, 0),
922 F(80000000, P_GPLL0, 10, 0, 0),
923 F(100000000, P_GPLL0, 8, 0, 0),
924 { }
925 };
926
927 static struct clk_rcg2 usb_hs_system_clk_src = {
928 .cmd_rcgr = 0x41010,
929 .hid_width = 5,
930 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
931 .parent_map = gcc_xo_gpll0_map,
932 .clkr.hw.init = &(struct clk_init_data) {
933 .name = "usb_hs_system_clk_src",
934 .parent_data = gcc_xo_gpll0_data,
935 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
936 .ops = &clk_rcg2_ops,
937 }
938 };
939
940 static const struct parent_map gcc_vcodec0_map[] = {
941 { P_XO, 0 },
942 { P_GPLL0, 1 },
943 { P_GPLL1, 3 },
944 };
945
946 static const struct clk_parent_data gcc_vcodec0_data[] = {
947 { .index = DT_XO },
948 { .hw = &gpll0.clkr.hw },
949 { .hw = &gpll1_vote.hw },
950 };
951
952 static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
953 F(133330000, P_GPLL0, 6, 0, 0),
954 F(266670000, P_GPLL0, 3, 0, 0),
955 F(307200000, P_GPLL1, 4, 0, 0),
956 { }
957 };
958
959 static struct clk_rcg2 vcodec0_clk_src = {
960 .cmd_rcgr = 0x4c000,
961 .hid_width = 5,
962 .mnd_width = 8,
963 .freq_tbl = ftbl_vcodec0_clk_src,
964 .parent_map = gcc_vcodec0_map,
965 .clkr.hw.init = &(struct clk_init_data) {
966 .name = "vcodec0_clk_src",
967 .parent_data = gcc_vcodec0_data,
968 .num_parents = ARRAY_SIZE(gcc_vcodec0_data),
969 .ops = &clk_rcg2_ops,
970 }
971 };
972
973 static const struct freq_tbl ftbl_gcc_camss_vfe0_clk[] = {
974 F(50000000, P_GPLL0, 16, 0, 0),
975 F(80000000, P_GPLL0, 10, 0, 0),
976 F(100000000, P_GPLL0, 8, 0, 0),
977 F(133330000, P_GPLL0, 6, 0, 0),
978 F(160000000, P_GPLL0, 5, 0, 0),
979 F(177780000, P_GPLL0, 4.5, 0, 0),
980 F(200000000, P_GPLL0, 4, 0, 0),
981 F(266670000, P_GPLL0, 3, 0, 0),
982 F(320000000, P_GPLL0, 2.5, 0, 0),
983 { }
984 };
985
986 static struct clk_rcg2 vfe0_clk_src = {
987 .cmd_rcgr = 0x58000,
988 .hid_width = 5,
989 .freq_tbl = ftbl_gcc_camss_vfe0_clk,
990 .parent_map = gcc_xo_gpll0_map,
991 .clkr.hw.init = &(struct clk_init_data) {
992 .name = "vfe0_clk_src",
993 .parent_data = gcc_xo_gpll0_data,
994 .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
995 .ops = &clk_rcg2_ops,
996 }
997 };
998
999 static const struct freq_tbl ftbl_vsync_clk_src[] = {
1000 F(19200000, P_XO, 1, 0, 0),
1001 { }
1002 };
1003
1004 static struct clk_rcg2 vsync_clk_src = {
1005 .cmd_rcgr = 0x4d02c,
1006 .hid_width = 5,
1007 .freq_tbl = ftbl_vsync_clk_src,
1008 .parent_map = gcc_xo_map,
1009 .clkr.hw.init = &(struct clk_init_data) {
1010 .name = "vsync_clk_src",
1011 .parent_data = gcc_xo_data,
1012 .num_parents = ARRAY_SIZE(gcc_xo_data),
1013 .ops = &clk_rcg2_ops,
1014 }
1015 };
1016
1017 static struct clk_branch gcc_apss_tcu_clk = {
1018 .halt_reg = 0x12018,
1019 .halt_check = BRANCH_HALT_VOTED,
1020 .clkr = {
1021 .enable_reg = 0x4500c,
1022 .enable_mask = BIT(1),
1023 .hw.init = &(struct clk_init_data) {
1024 .name = "gcc_apss_tcu_clk",
1025 .parent_hws = (const struct clk_hw*[]) {
1026 &bimc_ddr_clk_src.clkr.hw,
1027 },
1028 .num_parents = 1,
1029 .ops = &clk_branch2_ops,
1030 }
1031 }
1032 };
1033
1034 static struct clk_branch gcc_blsp1_ahb_clk = {
1035 .halt_reg = 0x01008,
1036 .halt_check = BRANCH_HALT_VOTED,
1037 .clkr = {
1038 .enable_reg = 0x45004,
1039 .enable_mask = BIT(10),
1040 .hw.init = &(struct clk_init_data) {
1041 .name = "gcc_blsp1_ahb_clk",
1042 .parent_hws = (const struct clk_hw*[]) {
1043 &pcnoc_bfdcd_clk_src.clkr.hw,
1044 },
1045 .num_parents = 1,
1046 .ops = &clk_branch2_ops,
1047 }
1048 }
1049 };
1050
1051 static struct clk_branch gcc_blsp1_sleep_clk = {
1052 .halt_reg = 0x01004,
1053 .halt_check = BRANCH_HALT_VOTED,
1054 .clkr = {
1055 .enable_reg = 0x45004,
1056 .enable_mask = BIT(9),
1057 .hw.init = &(struct clk_init_data) {
1058 .name = "gcc_blsp1_sleep_clk",
1059 .parent_data = gcc_sleep_clk_data,
1060 .num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
1061 .ops = &clk_branch2_ops,
1062 }
1063 }
1064 };
1065
1066 static struct clk_branch gcc_boot_rom_ahb_clk = {
1067 .halt_reg = 0x1300c,
1068 .halt_check = BRANCH_HALT_VOTED,
1069 .clkr = {
1070 .enable_reg = 0x45004,
1071 .enable_mask = BIT(7),
1072 .hw.init = &(struct clk_init_data) {
1073 .name = "gcc_boot_rom_ahb_clk",
1074 .parent_hws = (const struct clk_hw*[]) {
1075 &pcnoc_bfdcd_clk_src.clkr.hw,
1076 },
1077 .num_parents = 1,
1078 .ops = &clk_branch2_ops,
1079 }
1080 }
1081 };
1082
1083 static struct clk_branch gcc_crypto_clk = {
1084 .halt_reg = 0x1601c,
1085 .halt_check = BRANCH_HALT_VOTED,
1086 .clkr = {
1087 .enable_reg = 0x45004,
1088 .enable_mask = BIT(2),
1089 .hw.init = &(struct clk_init_data) {
1090 .name = "gcc_crypto_clk",
1091 .parent_hws = (const struct clk_hw*[]) {
1092 &crypto_clk_src.clkr.hw,
1093 },
1094 .num_parents = 1,
1095 .ops = &clk_branch2_ops,
1096 .flags = CLK_SET_RATE_PARENT,
1097 }
1098 }
1099 };
1100
1101 static struct clk_branch gcc_crypto_ahb_clk = {
1102 .halt_reg = 0x16024,
1103 .halt_check = BRANCH_HALT_VOTED,
1104 .clkr = {
1105 .enable_reg = 0x45004,
1106 .enable_mask = BIT(0),
1107 .hw.init = &(struct clk_init_data) {
1108 .name = "gcc_crypto_ahb_clk",
1109 .parent_hws = (const struct clk_hw*[]) {
1110 &pcnoc_bfdcd_clk_src.clkr.hw,
1111 },
1112 .num_parents = 1,
1113 .ops = &clk_branch2_ops,
1114 }
1115 }
1116 };
1117
1118 static struct clk_branch gcc_crypto_axi_clk = {
1119 .halt_reg = 0x16020,
1120 .halt_check = BRANCH_HALT_VOTED,
1121 .clkr = {
1122 .enable_reg = 0x45004,
1123 .enable_mask = BIT(1),
1124 .hw.init = &(struct clk_init_data) {
1125 .name = "gcc_crypto_axi_clk",
1126 .parent_hws = (const struct clk_hw*[]) {
1127 &pcnoc_bfdcd_clk_src.clkr.hw,
1128 },
1129 .num_parents = 1,
1130 .ops = &clk_branch2_ops,
1131 }
1132 }
1133 };
1134
1135 static struct clk_branch gcc_gfx_tbu_clk = {
1136 .halt_reg = 0x12010,
1137 .halt_check = BRANCH_HALT_VOTED,
1138 .clkr = {
1139 .enable_reg = 0x4500c,
1140 .enable_mask = BIT(3),
1141 .hw.init = &(struct clk_init_data) {
1142 .name = "gcc_gfx_tbu_clk",
1143 .parent_hws = (const struct clk_hw*[]) {
1144 &bimc_ddr_clk_src.clkr.hw,
1145 },
1146 .num_parents = 1,
1147 .ops = &clk_branch2_ops,
1148 }
1149 }
1150 };
1151
1152 static struct clk_branch gcc_gfx_tcu_clk = {
1153 .halt_reg = 0x12020,
1154 .halt_check = BRANCH_HALT_VOTED,
1155 .clkr = {
1156 .enable_reg = 0x4500c,
1157 .enable_mask = BIT(2),
1158 .hw.init = &(struct clk_init_data) {
1159 .name = "gcc_gfx_tcu_clk",
1160 .parent_hws = (const struct clk_hw*[]) {
1161 &bimc_ddr_clk_src.clkr.hw,
1162 },
1163 .num_parents = 1,
1164 .ops = &clk_branch2_ops,
1165 }
1166 }
1167 };
1168
1169 static struct clk_branch gcc_gtcu_ahb_clk = {
1170 .halt_reg = 0x12044,
1171 .halt_check = BRANCH_HALT_VOTED,
1172 .clkr = {
1173 .enable_reg = 0x4500c,
1174 .enable_mask = BIT(13),
1175 .hw.init = &(struct clk_init_data) {
1176 .name = "gcc_gtcu_ahb_clk",
1177 .parent_hws = (const struct clk_hw*[]) {
1178 &pcnoc_bfdcd_clk_src.clkr.hw,
1179 },
1180 .num_parents = 1,
1181 .ops = &clk_branch2_ops,
1182 }
1183 }
1184 };
1185
1186 static struct clk_branch gcc_mdp_tbu_clk = {
1187 .halt_reg = 0x1201c,
1188 .halt_check = BRANCH_HALT_VOTED,
1189 .clkr = {
1190 .enable_reg = 0x4500c,
1191 .enable_mask = BIT(4),
1192 .hw.init = &(struct clk_init_data) {
1193 .name = "gcc_mdp_tbu_clk",
1194 .parent_hws = (const struct clk_hw*[]) {
1195 &system_noc_bfdcd_clk_src.clkr.hw,
1196 },
1197 .num_parents = 1,
1198 .ops = &clk_branch2_ops,
1199 }
1200 }
1201 };
1202
1203 static struct clk_branch gcc_prng_ahb_clk = {
1204 .halt_reg = 0x13004,
1205 .halt_check = BRANCH_HALT_VOTED,
1206 .clkr = {
1207 .enable_reg = 0x45004,
1208 .enable_mask = BIT(8),
1209 .hw.init = &(struct clk_init_data) {
1210 .name = "gcc_prng_ahb_clk",
1211 .parent_hws = (const struct clk_hw*[]) {
1212 &pcnoc_bfdcd_clk_src.clkr.hw,
1213 },
1214 .num_parents = 1,
1215 .ops = &clk_branch2_ops,
1216 }
1217 }
1218 };
1219
1220 static struct clk_branch gcc_smmu_cfg_clk = {
1221 .halt_reg = 0x12038,
1222 .halt_check = BRANCH_HALT_VOTED,
1223 .clkr = {
1224 .enable_reg = 0x4500c,
1225 .enable_mask = BIT(12),
1226 .hw.init = &(struct clk_init_data) {
1227 .name = "gcc_smmu_cfg_clk",
1228 .parent_hws = (const struct clk_hw*[]) {
1229 &pcnoc_bfdcd_clk_src.clkr.hw,
1230 },
1231 .num_parents = 1,
1232 .ops = &clk_branch2_ops,
1233 }
1234 }
1235 };
1236
1237 static struct clk_branch gcc_venus_tbu_clk = {
1238 .halt_reg = 0x12014,
1239 .halt_check = BRANCH_HALT_VOTED,
1240 .clkr = {
1241 .enable_reg = 0x4500c,
1242 .enable_mask = BIT(5),
1243 .hw.init = &(struct clk_init_data) {
1244 .name = "gcc_venus_tbu_clk",
1245 .parent_hws = (const struct clk_hw*[]) {
1246 &system_noc_bfdcd_clk_src.clkr.hw,
1247 },
1248 .num_parents = 1,
1249 .ops = &clk_branch2_ops,
1250 }
1251 }
1252 };
1253
1254 static struct clk_branch gcc_vfe_tbu_clk = {
1255 .halt_reg = 0x1203c,
1256 .halt_check = BRANCH_HALT_VOTED,
1257 .clkr = {
1258 .enable_reg = 0x4500c,
1259 .enable_mask = BIT(9),
1260 .hw.init = &(struct clk_init_data) {
1261 .name = "gcc_vfe_tbu_clk",
1262 .parent_hws = (const struct clk_hw*[]) {
1263 &system_noc_bfdcd_clk_src.clkr.hw,
1264 },
1265 .num_parents = 1,
1266 .ops = &clk_branch2_ops,
1267 }
1268 }
1269 };
1270
1271 static struct clk_branch gcc_bimc_gfx_clk = {
1272 .halt_reg = 0x31024,
1273 .halt_check = BRANCH_HALT,
1274 .clkr = {
1275 .enable_reg = 0x31024,
1276 .enable_mask = BIT(0),
1277 .hw.init = &(struct clk_init_data) {
1278 .name = "gcc_bimc_gfx_clk",
1279 .parent_hws = (const struct clk_hw*[]) {
1280 &bimc_gpu_clk_src.clkr.hw,
1281 },
1282 .num_parents = 1,
1283 .ops = &clk_branch2_ops,
1284 }
1285 }
1286 };
1287
1288 static struct clk_branch gcc_bimc_gpu_clk = {
1289 .halt_reg = 0x31040,
1290 .halt_check = BRANCH_HALT,
1291 .clkr = {
1292 .enable_reg = 0x31040,
1293 .enable_mask = BIT(0),
1294 .hw.init = &(struct clk_init_data) {
1295 .name = "gcc_bimc_gpu_clk",
1296 .parent_hws = (const struct clk_hw*[]) {
1297 &bimc_gpu_clk_src.clkr.hw,
1298 },
1299 .num_parents = 1,
1300 .ops = &clk_branch2_ops,
1301 }
1302 }
1303 };
1304
1305 static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
1306 .halt_reg = 0x02008,
1307 .halt_check = BRANCH_HALT,
1308 .clkr = {
1309 .enable_reg = 0x02008,
1310 .enable_mask = BIT(0),
1311 .hw.init = &(struct clk_init_data) {
1312 .name = "gcc_blsp1_qup1_i2c_apps_clk",
1313 .parent_hws = (const struct clk_hw*[]) {
1314 &blsp1_qup1_i2c_apps_clk_src.clkr.hw,
1315 },
1316 .num_parents = 1,
1317 .ops = &clk_branch2_ops,
1318 .flags = CLK_SET_RATE_PARENT,
1319 }
1320 }
1321 };
1322
1323 static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
1324 .halt_reg = 0x03010,
1325 .halt_check = BRANCH_HALT,
1326 .clkr = {
1327 .enable_reg = 0x03010,
1328 .enable_mask = BIT(0),
1329 .hw.init = &(struct clk_init_data) {
1330 .name = "gcc_blsp1_qup2_i2c_apps_clk",
1331 .parent_hws = (const struct clk_hw*[]) {
1332 &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
1333 },
1334 .num_parents = 1,
1335 .ops = &clk_branch2_ops,
1336 .flags = CLK_SET_RATE_PARENT,
1337 }
1338 }
1339 };
1340
1341 static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
1342 .halt_reg = 0x04020,
1343 .halt_check = BRANCH_HALT,
1344 .clkr = {
1345 .enable_reg = 0x04020,
1346 .enable_mask = BIT(0),
1347 .hw.init = &(struct clk_init_data) {
1348 .name = "gcc_blsp1_qup3_i2c_apps_clk",
1349 .parent_hws = (const struct clk_hw*[]) {
1350 &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
1351 },
1352 .num_parents = 1,
1353 .ops = &clk_branch2_ops,
1354 .flags = CLK_SET_RATE_PARENT,
1355 }
1356 }
1357 };
1358
1359 static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
1360 .halt_reg = 0x05020,
1361 .halt_check = BRANCH_HALT,
1362 .clkr = {
1363 .enable_reg = 0x05020,
1364 .enable_mask = BIT(0),
1365 .hw.init = &(struct clk_init_data) {
1366 .name = "gcc_blsp1_qup4_i2c_apps_clk",
1367 .parent_hws = (const struct clk_hw*[]) {
1368 &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
1369 },
1370 .num_parents = 1,
1371 .ops = &clk_branch2_ops,
1372 .flags = CLK_SET_RATE_PARENT,
1373 }
1374 }
1375 };
1376
1377 static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
1378 .halt_reg = 0x06020,
1379 .halt_check = BRANCH_HALT,
1380 .clkr = {
1381 .enable_reg = 0x06020,
1382 .enable_mask = BIT(0),
1383 .hw.init = &(struct clk_init_data) {
1384 .name = "gcc_blsp1_qup5_i2c_apps_clk",
1385 .parent_hws = (const struct clk_hw*[]) {
1386 &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
1387 },
1388 .num_parents = 1,
1389 .ops = &clk_branch2_ops,
1390 .flags = CLK_SET_RATE_PARENT,
1391 }
1392 }
1393 };
1394
1395 static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
1396 .halt_reg = 0x07020,
1397 .halt_check = BRANCH_HALT,
1398 .clkr = {
1399 .enable_reg = 0x07020,
1400 .enable_mask = BIT(0),
1401 .hw.init = &(struct clk_init_data) {
1402 .name = "gcc_blsp1_qup6_i2c_apps_clk",
1403 .parent_hws = (const struct clk_hw*[]) {
1404 &blsp1_qup6_i2c_apps_clk_src.clkr.hw,
1405 },
1406 .num_parents = 1,
1407 .ops = &clk_branch2_ops,
1408 .flags = CLK_SET_RATE_PARENT,
1409 }
1410 }
1411 };
1412
1413 static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
1414 .halt_reg = 0x02004,
1415 .halt_check = BRANCH_HALT,
1416 .clkr = {
1417 .enable_reg = 0x02004,
1418 .enable_mask = BIT(0),
1419 .hw.init = &(struct clk_init_data) {
1420 .name = "gcc_blsp1_qup1_spi_apps_clk",
1421 .parent_hws = (const struct clk_hw*[]) {
1422 &blsp1_qup1_spi_apps_clk_src.clkr.hw,
1423 },
1424 .num_parents = 1,
1425 .ops = &clk_branch2_ops,
1426 .flags = CLK_SET_RATE_PARENT,
1427 }
1428 }
1429 };
1430
1431 static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
1432 .halt_reg = 0x0300c,
1433 .halt_check = BRANCH_HALT,
1434 .clkr = {
1435 .enable_reg = 0x0300c,
1436 .enable_mask = BIT(0),
1437 .hw.init = &(struct clk_init_data) {
1438 .name = "gcc_blsp1_qup2_spi_apps_clk",
1439 .parent_hws = (const struct clk_hw*[]) {
1440 &blsp1_qup2_spi_apps_clk_src.clkr.hw,
1441 },
1442 .num_parents = 1,
1443 .ops = &clk_branch2_ops,
1444 .flags = CLK_SET_RATE_PARENT,
1445 }
1446 }
1447 };
1448
1449 static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
1450 .halt_reg = 0x0401c,
1451 .halt_check = BRANCH_HALT,
1452 .clkr = {
1453 .enable_reg = 0x0401c,
1454 .enable_mask = BIT(0),
1455 .hw.init = &(struct clk_init_data) {
1456 .name = "gcc_blsp1_qup3_spi_apps_clk",
1457 .parent_hws = (const struct clk_hw*[]) {
1458 &blsp1_qup3_spi_apps_clk_src.clkr.hw,
1459 },
1460 .num_parents = 1,
1461 .ops = &clk_branch2_ops,
1462 .flags = CLK_SET_RATE_PARENT,
1463 }
1464 }
1465 };
1466
1467 static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
1468 .halt_reg = 0x0501c,
1469 .halt_check = BRANCH_HALT,
1470 .clkr = {
1471 .enable_reg = 0x0501c,
1472 .enable_mask = BIT(0),
1473 .hw.init = &(struct clk_init_data) {
1474 .name = "gcc_blsp1_qup4_spi_apps_clk",
1475 .parent_hws = (const struct clk_hw*[]) {
1476 &blsp1_qup4_spi_apps_clk_src.clkr.hw,
1477 },
1478 .num_parents = 1,
1479 .ops = &clk_branch2_ops,
1480 .flags = CLK_SET_RATE_PARENT,
1481 }
1482 }
1483 };
1484
1485 static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
1486 .halt_reg = 0x0601c,
1487 .halt_check = BRANCH_HALT,
1488 .clkr = {
1489 .enable_reg = 0x0601c,
1490 .enable_mask = BIT(0),
1491 .hw.init = &(struct clk_init_data) {
1492 .name = "gcc_blsp1_qup5_spi_apps_clk",
1493 .parent_hws = (const struct clk_hw*[]) {
1494 &blsp1_qup5_spi_apps_clk_src.clkr.hw,
1495 },
1496 .num_parents = 1,
1497 .ops = &clk_branch2_ops,
1498 .flags = CLK_SET_RATE_PARENT,
1499 }
1500 }
1501 };
1502
1503 static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
1504 .halt_reg = 0x0701c,
1505 .halt_check = BRANCH_HALT,
1506 .clkr = {
1507 .enable_reg = 0x0701c,
1508 .enable_mask = BIT(0),
1509 .hw.init = &(struct clk_init_data) {
1510 .name = "gcc_blsp1_qup6_spi_apps_clk",
1511 .parent_hws = (const struct clk_hw*[]) {
1512 &blsp1_qup6_spi_apps_clk_src.clkr.hw,
1513 },
1514 .num_parents = 1,
1515 .ops = &clk_branch2_ops,
1516 .flags = CLK_SET_RATE_PARENT,
1517 }
1518 }
1519 };
1520
1521 static struct clk_branch gcc_blsp1_uart1_apps_clk = {
1522 .halt_reg = 0x0203c,
1523 .halt_check = BRANCH_HALT,
1524 .clkr = {
1525 .enable_reg = 0x0203c,
1526 .enable_mask = BIT(0),
1527 .hw.init = &(struct clk_init_data) {
1528 .name = "gcc_blsp1_uart1_apps_clk",
1529 .parent_hws = (const struct clk_hw*[]) {
1530 &blsp1_uart1_apps_clk_src.clkr.hw,
1531 },
1532 .num_parents = 1,
1533 .ops = &clk_branch2_ops,
1534 .flags = CLK_SET_RATE_PARENT,
1535 }
1536 }
1537 };
1538
1539 static struct clk_branch gcc_blsp1_uart2_apps_clk = {
1540 .halt_reg = 0x0302c,
1541 .halt_check = BRANCH_HALT,
1542 .clkr = {
1543 .enable_reg = 0x0302c,
1544 .enable_mask = BIT(0),
1545 .hw.init = &(struct clk_init_data) {
1546 .name = "gcc_blsp1_uart2_apps_clk",
1547 .parent_hws = (const struct clk_hw*[]) {
1548 &blsp1_uart2_apps_clk_src.clkr.hw,
1549 },
1550 .num_parents = 1,
1551 .ops = &clk_branch2_ops,
1552 .flags = CLK_SET_RATE_PARENT,
1553 }
1554 }
1555 };
1556
1557 static struct clk_branch gcc_camss_ahb_clk = {
1558 .halt_reg = 0x5a014,
1559 .halt_check = BRANCH_HALT,
1560 .clkr = {
1561 .enable_reg = 0x5a014,
1562 .enable_mask = BIT(0),
1563 .hw.init = &(struct clk_init_data) {
1564 .name = "gcc_camss_ahb_clk",
1565 .parent_hws = (const struct clk_hw*[]) {
1566 &pcnoc_bfdcd_clk_src.clkr.hw,
1567 },
1568 .num_parents = 1,
1569 .ops = &clk_branch2_ops,
1570 }
1571 }
1572 };
1573
1574 static struct clk_branch gcc_camss_csi0_clk = {
1575 .halt_reg = 0x4e03c,
1576 .halt_check = BRANCH_HALT,
1577 .clkr = {
1578 .enable_reg = 0x4e03c,
1579 .enable_mask = BIT(0),
1580 .hw.init = &(struct clk_init_data) {
1581 .name = "gcc_camss_csi0_clk",
1582 .parent_hws = (const struct clk_hw*[]) {
1583 &csi0_clk_src.clkr.hw,
1584 },
1585 .num_parents = 1,
1586 .ops = &clk_branch2_ops,
1587 .flags = CLK_SET_RATE_PARENT,
1588 }
1589 }
1590 };
1591
1592 static struct clk_branch gcc_camss_csi0_ahb_clk = {
1593 .halt_reg = 0x4e040,
1594 .halt_check = BRANCH_HALT,
1595 .clkr = {
1596 .enable_reg = 0x4e040,
1597 .enable_mask = BIT(0),
1598 .hw.init = &(struct clk_init_data) {
1599 .name = "gcc_camss_csi0_ahb_clk",
1600 .parent_hws = (const struct clk_hw*[]) {
1601 &camss_top_ahb_clk_src.clkr.hw,
1602 },
1603 .num_parents = 1,
1604 .ops = &clk_branch2_ops,
1605 .flags = CLK_SET_RATE_PARENT,
1606 }
1607 }
1608 };
1609
1610 static struct clk_branch gcc_camss_csi0phy_clk = {
1611 .halt_reg = 0x4e048,
1612 .halt_check = BRANCH_HALT,
1613 .clkr = {
1614 .enable_reg = 0x4e048,
1615 .enable_mask = BIT(0),
1616 .hw.init = &(struct clk_init_data) {
1617 .name = "gcc_camss_csi0phy_clk",
1618 .parent_hws = (const struct clk_hw*[]) {
1619 &csi0_clk_src.clkr.hw,
1620 },
1621 .num_parents = 1,
1622 .ops = &clk_branch2_ops,
1623 .flags = CLK_SET_RATE_PARENT,
1624 }
1625 }
1626 };
1627
1628 static struct clk_branch gcc_camss_csi0phytimer_clk = {
1629 .halt_reg = 0x4e01c,
1630 .halt_check = BRANCH_HALT,
1631 .clkr = {
1632 .enable_reg = 0x4e01c,
1633 .enable_mask = BIT(0),
1634 .hw.init = &(struct clk_init_data) {
1635 .name = "gcc_camss_csi0phytimer_clk",
1636 .parent_hws = (const struct clk_hw*[]) {
1637 &csi0phytimer_clk_src.clkr.hw,
1638 },
1639 .num_parents = 1,
1640 .ops = &clk_branch2_ops,
1641 .flags = CLK_SET_RATE_PARENT,
1642 }
1643 }
1644 };
1645
1646 static struct clk_branch gcc_camss_csi0pix_clk = {
1647 .halt_reg = 0x4e058,
1648 .halt_check = BRANCH_HALT,
1649 .clkr = {
1650 .enable_reg = 0x4e058,
1651 .enable_mask = BIT(0),
1652 .hw.init = &(struct clk_init_data) {
1653 .name = "gcc_camss_csi0pix_clk",
1654 .parent_hws = (const struct clk_hw*[]) {
1655 &csi0_clk_src.clkr.hw,
1656 },
1657 .num_parents = 1,
1658 .ops = &clk_branch2_ops,
1659 .flags = CLK_SET_RATE_PARENT,
1660 }
1661 }
1662 };
1663
1664 static struct clk_branch gcc_camss_csi0rdi_clk = {
1665 .halt_reg = 0x4e050,
1666 .halt_check = BRANCH_HALT,
1667 .clkr = {
1668 .enable_reg = 0x4e050,
1669 .enable_mask = BIT(0),
1670 .hw.init = &(struct clk_init_data) {
1671 .name = "gcc_camss_csi0rdi_clk",
1672 .parent_hws = (const struct clk_hw*[]) {
1673 &csi0_clk_src.clkr.hw,
1674 },
1675 .num_parents = 1,
1676 .ops = &clk_branch2_ops,
1677 .flags = CLK_SET_RATE_PARENT,
1678 }
1679 }
1680 };
1681
1682 static struct clk_branch gcc_camss_csi1_clk = {
1683 .halt_reg = 0x4f03c,
1684 .halt_check = BRANCH_HALT,
1685 .clkr = {
1686 .enable_reg = 0x4f03c,
1687 .enable_mask = BIT(0),
1688 .hw.init = &(struct clk_init_data) {
1689 .name = "gcc_camss_csi1_clk",
1690 .parent_hws = (const struct clk_hw*[]) {
1691 &csi1_clk_src.clkr.hw,
1692 },
1693 .num_parents = 1,
1694 .ops = &clk_branch2_ops,
1695 .flags = CLK_SET_RATE_PARENT,
1696 }
1697 }
1698 };
1699
1700 static struct clk_branch gcc_camss_csi1_ahb_clk = {
1701 .halt_reg = 0x4f040,
1702 .halt_check = BRANCH_HALT,
1703 .clkr = {
1704 .enable_reg = 0x4f040,
1705 .enable_mask = BIT(0),
1706 .hw.init = &(struct clk_init_data) {
1707 .name = "gcc_camss_csi1_ahb_clk",
1708 .parent_hws = (const struct clk_hw*[]) {
1709 &camss_top_ahb_clk_src.clkr.hw,
1710 },
1711 .num_parents = 1,
1712 .ops = &clk_branch2_ops,
1713 .flags = CLK_SET_RATE_PARENT,
1714 }
1715 }
1716 };
1717
1718 static struct clk_branch gcc_camss_csi1phy_clk = {
1719 .halt_reg = 0x4f048,
1720 .halt_check = BRANCH_HALT,
1721 .clkr = {
1722 .enable_reg = 0x4f048,
1723 .enable_mask = BIT(0),
1724 .hw.init = &(struct clk_init_data) {
1725 .name = "gcc_camss_csi1phy_clk",
1726 .parent_hws = (const struct clk_hw*[]) {
1727 &csi1_clk_src.clkr.hw,
1728 },
1729 .num_parents = 1,
1730 .ops = &clk_branch2_ops,
1731 .flags = CLK_SET_RATE_PARENT,
1732 }
1733 }
1734 };
1735
1736 static struct clk_branch gcc_camss_csi1pix_clk = {
1737 .halt_reg = 0x4f058,
1738 .halt_check = BRANCH_HALT,
1739 .clkr = {
1740 .enable_reg = 0x4f058,
1741 .enable_mask = BIT(0),
1742 .hw.init = &(struct clk_init_data) {
1743 .name = "gcc_camss_csi1pix_clk",
1744 .parent_hws = (const struct clk_hw*[]) {
1745 &csi1_clk_src.clkr.hw,
1746 },
1747 .num_parents = 1,
1748 .ops = &clk_branch2_ops,
1749 .flags = CLK_SET_RATE_PARENT,
1750 }
1751 }
1752 };
1753
1754 static struct clk_branch gcc_camss_csi1rdi_clk = {
1755 .halt_reg = 0x4f050,
1756 .halt_check = BRANCH_HALT,
1757 .clkr = {
1758 .enable_reg = 0x4f050,
1759 .enable_mask = BIT(0),
1760 .hw.init = &(struct clk_init_data) {
1761 .name = "gcc_camss_csi1rdi_clk",
1762 .parent_hws = (const struct clk_hw*[]) {
1763 &csi1_clk_src.clkr.hw,
1764 },
1765 .num_parents = 1,
1766 .ops = &clk_branch2_ops,
1767 .flags = CLK_SET_RATE_PARENT,
1768 }
1769 }
1770 };
1771
1772 static struct clk_branch gcc_camss_csi_vfe0_clk = {
1773 .halt_reg = 0x58050,
1774 .halt_check = BRANCH_HALT,
1775 .clkr = {
1776 .enable_reg = 0x58050,
1777 .enable_mask = BIT(0),
1778 .hw.init = &(struct clk_init_data) {
1779 .name = "gcc_camss_csi_vfe0_clk",
1780 .parent_hws = (const struct clk_hw*[]) {
1781 &vfe0_clk_src.clkr.hw,
1782 },
1783 .num_parents = 1,
1784 .ops = &clk_branch2_ops,
1785 .flags = CLK_SET_RATE_PARENT,
1786 }
1787 }
1788 };
1789
1790 static struct clk_branch gcc_camss_gp0_clk = {
1791 .halt_reg = 0x54018,
1792 .halt_check = BRANCH_HALT,
1793 .clkr = {
1794 .enable_reg = 0x54018,
1795 .enable_mask = BIT(0),
1796 .hw.init = &(struct clk_init_data) {
1797 .name = "gcc_camss_gp0_clk",
1798 .parent_hws = (const struct clk_hw*[]) {
1799 &camss_gp0_clk_src.clkr.hw,
1800 },
1801 .num_parents = 1,
1802 .ops = &clk_branch2_ops,
1803 .flags = CLK_SET_RATE_PARENT,
1804 }
1805 }
1806 };
1807
1808 static struct clk_branch gcc_camss_gp1_clk = {
1809 .halt_reg = 0x55018,
1810 .halt_check = BRANCH_HALT,
1811 .clkr = {
1812 .enable_reg = 0x55018,
1813 .enable_mask = BIT(0),
1814 .hw.init = &(struct clk_init_data) {
1815 .name = "gcc_camss_gp1_clk",
1816 .parent_hws = (const struct clk_hw*[]) {
1817 &camss_gp1_clk_src.clkr.hw,
1818 },
1819 .num_parents = 1,
1820 .ops = &clk_branch2_ops,
1821 .flags = CLK_SET_RATE_PARENT,
1822 }
1823 }
1824 };
1825
1826 static struct clk_branch gcc_camss_ispif_ahb_clk = {
1827 .halt_reg = 0x50004,
1828 .halt_check = BRANCH_HALT,
1829 .clkr = {
1830 .enable_reg = 0x50004,
1831 .enable_mask = BIT(0),
1832 .hw.init = &(struct clk_init_data) {
1833 .name = "gcc_camss_ispif_ahb_clk",
1834 .parent_hws = (const struct clk_hw*[]) {
1835 &camss_top_ahb_clk_src.clkr.hw,
1836 },
1837 .num_parents = 1,
1838 .ops = &clk_branch2_ops,
1839 .flags = CLK_SET_RATE_PARENT,
1840 }
1841 }
1842 };
1843
1844 static struct clk_branch gcc_camss_mclk0_clk = {
1845 .halt_reg = 0x52018,
1846 .halt_check = BRANCH_HALT,
1847 .clkr = {
1848 .enable_reg = 0x52018,
1849 .enable_mask = BIT(0),
1850 .hw.init = &(struct clk_init_data) {
1851 .name = "gcc_camss_mclk0_clk",
1852 .parent_hws = (const struct clk_hw*[]) {
1853 &mclk0_clk_src.clkr.hw,
1854 },
1855 .num_parents = 1,
1856 .ops = &clk_branch2_ops,
1857 .flags = CLK_SET_RATE_PARENT,
1858 }
1859 }
1860 };
1861
1862 static struct clk_branch gcc_camss_mclk1_clk = {
1863 .halt_reg = 0x53018,
1864 .halt_check = BRANCH_HALT,
1865 .clkr = {
1866 .enable_reg = 0x53018,
1867 .enable_mask = BIT(0),
1868 .hw.init = &(struct clk_init_data) {
1869 .name = "gcc_camss_mclk1_clk",
1870 .parent_hws = (const struct clk_hw*[]) {
1871 &mclk1_clk_src.clkr.hw,
1872 },
1873 .num_parents = 1,
1874 .ops = &clk_branch2_ops,
1875 .flags = CLK_SET_RATE_PARENT,
1876 }
1877 }
1878 };
1879
1880 static struct clk_branch gcc_camss_top_ahb_clk = {
1881 .halt_reg = 0x56004,
1882 .halt_check = BRANCH_HALT,
1883 .clkr = {
1884 .enable_reg = 0x56004,
1885 .enable_mask = BIT(0),
1886 .hw.init = &(struct clk_init_data) {
1887 .name = "gcc_camss_top_ahb_clk",
1888 .parent_hws = (const struct clk_hw*[]) {
1889 &camss_top_ahb_clk_src.clkr.hw,
1890 },
1891 .num_parents = 1,
1892 .ops = &clk_branch2_ops,
1893 .flags = CLK_SET_RATE_PARENT,
1894 }
1895 }
1896 };
1897
1898 static struct clk_branch gcc_camss_vfe0_clk = {
1899 .halt_reg = 0x58038,
1900 .halt_check = BRANCH_HALT,
1901 .clkr = {
1902 .enable_reg = 0x58038,
1903 .enable_mask = BIT(0),
1904 .hw.init = &(struct clk_init_data) {
1905 .name = "gcc_camss_vfe0_clk",
1906 .parent_hws = (const struct clk_hw*[]) {
1907 &vfe0_clk_src.clkr.hw,
1908 },
1909 .num_parents = 1,
1910 .ops = &clk_branch2_ops,
1911 .flags = CLK_SET_RATE_PARENT,
1912 }
1913 }
1914 };
1915
1916 static struct clk_branch gcc_camss_vfe_ahb_clk = {
1917 .halt_reg = 0x58044,
1918 .halt_check = BRANCH_HALT,
1919 .clkr = {
1920 .enable_reg = 0x58044,
1921 .enable_mask = BIT(0),
1922 .hw.init = &(struct clk_init_data) {
1923 .name = "gcc_camss_vfe_ahb_clk",
1924 .parent_hws = (const struct clk_hw*[]) {
1925 &camss_top_ahb_clk_src.clkr.hw,
1926 },
1927 .num_parents = 1,
1928 .ops = &clk_branch2_ops,
1929 .flags = CLK_SET_RATE_PARENT,
1930 }
1931 }
1932 };
1933
1934 static struct clk_branch gcc_camss_vfe_axi_clk = {
1935 .halt_reg = 0x58048,
1936 .halt_check = BRANCH_HALT,
1937 .clkr = {
1938 .enable_reg = 0x58048,
1939 .enable_mask = BIT(0),
1940 .hw.init = &(struct clk_init_data) {
1941 .name = "gcc_camss_vfe_axi_clk",
1942 .parent_hws = (const struct clk_hw*[]) {
1943 &system_noc_bfdcd_clk_src.clkr.hw,
1944 },
1945 .num_parents = 1,
1946 .ops = &clk_branch2_ops,
1947 }
1948 }
1949 };
1950
1951 static struct clk_branch gcc_gp1_clk = {
1952 .halt_reg = 0x08000,
1953 .halt_check = BRANCH_HALT,
1954 .clkr = {
1955 .enable_reg = 0x08000,
1956 .enable_mask = BIT(0),
1957 .hw.init = &(struct clk_init_data) {
1958 .name = "gcc_gp1_clk",
1959 .parent_hws = (const struct clk_hw*[]) {
1960 &gp1_clk_src.clkr.hw,
1961 },
1962 .num_parents = 1,
1963 .ops = &clk_branch2_ops,
1964 .flags = CLK_SET_RATE_PARENT,
1965 }
1966 }
1967 };
1968
1969 static struct clk_branch gcc_gp2_clk = {
1970 .halt_reg = 0x09000,
1971 .halt_check = BRANCH_HALT,
1972 .clkr = {
1973 .enable_reg = 0x09000,
1974 .enable_mask = BIT(0),
1975 .hw.init = &(struct clk_init_data) {
1976 .name = "gcc_gp2_clk",
1977 .parent_hws = (const struct clk_hw*[]) {
1978 &gp2_clk_src.clkr.hw,
1979 },
1980 .num_parents = 1,
1981 .ops = &clk_branch2_ops,
1982 .flags = CLK_SET_RATE_PARENT,
1983 }
1984 }
1985 };
1986
1987 static struct clk_branch gcc_gp3_clk = {
1988 .halt_reg = 0x0a000,
1989 .halt_check = BRANCH_HALT,
1990 .clkr = {
1991 .enable_reg = 0x0a000,
1992 .enable_mask = BIT(0),
1993 .hw.init = &(struct clk_init_data) {
1994 .name = "gcc_gp3_clk",
1995 .parent_hws = (const struct clk_hw*[]) {
1996 &gp3_clk_src.clkr.hw,
1997 },
1998 .num_parents = 1,
1999 .ops = &clk_branch2_ops,
2000 .flags = CLK_SET_RATE_PARENT,
2001 }
2002 }
2003 };
2004
2005 static struct clk_branch gcc_mdss_ahb_clk = {
2006 .halt_reg = 0x4d07c,
2007 .halt_check = BRANCH_HALT,
2008 .clkr = {
2009 .enable_reg = 0x4d07c,
2010 .enable_mask = BIT(0),
2011 .hw.init = &(struct clk_init_data) {
2012 .name = "gcc_mdss_ahb_clk",
2013 .parent_hws = (const struct clk_hw*[]) {
2014 &pcnoc_bfdcd_clk_src.clkr.hw,
2015 },
2016 .num_parents = 1,
2017 .ops = &clk_branch2_ops,
2018 }
2019 }
2020 };
2021
2022 static struct clk_branch gcc_mdss_axi_clk = {
2023 .halt_reg = 0x4d080,
2024 .halt_check = BRANCH_HALT,
2025 .clkr = {
2026 .enable_reg = 0x4d080,
2027 .enable_mask = BIT(0),
2028 .hw.init = &(struct clk_init_data) {
2029 .name = "gcc_mdss_axi_clk",
2030 .parent_hws = (const struct clk_hw*[]) {
2031 &system_noc_bfdcd_clk_src.clkr.hw,
2032 },
2033 .num_parents = 1,
2034 .ops = &clk_branch2_ops,
2035 }
2036 }
2037 };
2038
2039 static struct clk_branch gcc_mdss_byte0_clk = {
2040 .halt_reg = 0x4d094,
2041 .halt_check = BRANCH_HALT,
2042 .clkr = {
2043 .enable_reg = 0x4d094,
2044 .enable_mask = BIT(0),
2045 .hw.init = &(struct clk_init_data) {
2046 .name = "gcc_mdss_byte0_clk",
2047 .parent_hws = (const struct clk_hw*[]) {
2048 &byte0_clk_src.clkr.hw,
2049 },
2050 .num_parents = 1,
2051 .ops = &clk_branch2_ops,
2052 .flags = CLK_SET_RATE_PARENT,
2053 }
2054 }
2055 };
2056
2057 static struct clk_branch gcc_mdss_esc0_clk = {
2058 .halt_reg = 0x4d098,
2059 .halt_check = BRANCH_HALT,
2060 .clkr = {
2061 .enable_reg = 0x4d098,
2062 .enable_mask = BIT(0),
2063 .hw.init = &(struct clk_init_data) {
2064 .name = "gcc_mdss_esc0_clk",
2065 .parent_hws = (const struct clk_hw*[]) {
2066 &esc0_clk_src.clkr.hw,
2067 },
2068 .num_parents = 1,
2069 .ops = &clk_branch2_ops,
2070 .flags = CLK_SET_RATE_PARENT,
2071 }
2072 }
2073 };
2074
2075 static struct clk_branch gcc_mdss_mdp_clk = {
2076 .halt_reg = 0x4d088,
2077 .halt_check = BRANCH_HALT,
2078 .clkr = {
2079 .enable_reg = 0x4d088,
2080 .enable_mask = BIT(0),
2081 .hw.init = &(struct clk_init_data) {
2082 .name = "gcc_mdss_mdp_clk",
2083 .parent_hws = (const struct clk_hw*[]) {
2084 &mdp_clk_src.clkr.hw,
2085 },
2086 .num_parents = 1,
2087 .ops = &clk_branch2_ops,
2088 .flags = CLK_SET_RATE_PARENT,
2089 }
2090 }
2091 };
2092
2093 static struct clk_branch gcc_mdss_pclk0_clk = {
2094 .halt_reg = 0x4d084,
2095 .halt_check = BRANCH_HALT,
2096 .clkr = {
2097 .enable_reg = 0x4d084,
2098 .enable_mask = BIT(0),
2099 .hw.init = &(struct clk_init_data) {
2100 .name = "gcc_mdss_pclk0_clk",
2101 .parent_hws = (const struct clk_hw*[]) {
2102 &pclk0_clk_src.clkr.hw,
2103 },
2104 .num_parents = 1,
2105 .ops = &clk_branch2_ops,
2106 .flags = CLK_SET_RATE_PARENT,
2107 }
2108 }
2109 };
2110
2111 static struct clk_branch gcc_mdss_vsync_clk = {
2112 .halt_reg = 0x4d090,
2113 .halt_check = BRANCH_HALT,
2114 .clkr = {
2115 .enable_reg = 0x4d090,
2116 .enable_mask = BIT(0),
2117 .hw.init = &(struct clk_init_data) {
2118 .name = "gcc_mdss_vsync_clk",
2119 .parent_hws = (const struct clk_hw*[]) {
2120 &vsync_clk_src.clkr.hw,
2121 },
2122 .num_parents = 1,
2123 .ops = &clk_branch2_ops,
2124 .flags = CLK_SET_RATE_PARENT,
2125 }
2126 }
2127 };
2128
2129 static struct clk_branch gcc_mss_cfg_ahb_clk = {
2130 .halt_reg = 0x49000,
2131 .halt_check = BRANCH_HALT,
2132 .clkr = {
2133 .enable_reg = 0x49000,
2134 .enable_mask = BIT(0),
2135 .hw.init = &(struct clk_init_data) {
2136 .name = "gcc_mss_cfg_ahb_clk",
2137 .parent_hws = (const struct clk_hw*[]) {
2138 &pcnoc_bfdcd_clk_src.clkr.hw,
2139 },
2140 .num_parents = 1,
2141 .ops = &clk_branch2_ops,
2142 }
2143 }
2144 };
2145
2146 static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
2147 .halt_reg = 0x49004,
2148 .halt_check = BRANCH_HALT,
2149 .clkr = {
2150 .enable_reg = 0x49004,
2151 .enable_mask = BIT(0),
2152 .hw.init = &(struct clk_init_data) {
2153 .name = "gcc_mss_q6_bimc_axi_clk",
2154 .parent_hws = (const struct clk_hw*[]) {
2155 &bimc_ddr_clk_src.clkr.hw,
2156 },
2157 .num_parents = 1,
2158 .ops = &clk_branch2_ops,
2159 }
2160 }
2161 };
2162
2163 static struct clk_branch gcc_oxili_ahb_clk = {
2164 .halt_reg = 0x59028,
2165 .halt_check = BRANCH_HALT,
2166 .clkr = {
2167 .enable_reg = 0x59028,
2168 .enable_mask = BIT(0),
2169 .hw.init = &(struct clk_init_data) {
2170 .name = "gcc_oxili_ahb_clk",
2171 .parent_hws = (const struct clk_hw*[]) {
2172 &pcnoc_bfdcd_clk_src.clkr.hw,
2173 },
2174 .num_parents = 1,
2175 .ops = &clk_branch2_ops,
2176 }
2177 }
2178 };
2179
2180 static struct clk_branch gcc_oxili_gfx3d_clk = {
2181 .halt_reg = 0x59020,
2182 .halt_check = BRANCH_HALT,
2183 .clkr = {
2184 .enable_reg = 0x59020,
2185 .enable_mask = BIT(0),
2186 .hw.init = &(struct clk_init_data) {
2187 .name = "gcc_oxili_gfx3d_clk",
2188 .parent_hws = (const struct clk_hw*[]) {
2189 &gfx3d_clk_src.clkr.hw,
2190 },
2191 .num_parents = 1,
2192 .ops = &clk_branch2_ops,
2193 .flags = CLK_SET_RATE_PARENT,
2194 }
2195 }
2196 };
2197
2198 static struct clk_branch gcc_pdm2_clk = {
2199 .halt_reg = 0x4400c,
2200 .halt_check = BRANCH_HALT,
2201 .clkr = {
2202 .enable_reg = 0x4400c,
2203 .enable_mask = BIT(0),
2204 .hw.init = &(struct clk_init_data) {
2205 .name = "gcc_pdm2_clk",
2206 .parent_hws = (const struct clk_hw*[]) {
2207 &pdm2_clk_src.clkr.hw,
2208 },
2209 .num_parents = 1,
2210 .ops = &clk_branch2_ops,
2211 .flags = CLK_SET_RATE_PARENT,
2212 }
2213 }
2214 };
2215
2216 static struct clk_branch gcc_pdm_ahb_clk = {
2217 .halt_reg = 0x44004,
2218 .halt_check = BRANCH_HALT,
2219 .clkr = {
2220 .enable_reg = 0x44004,
2221 .enable_mask = BIT(0),
2222 .hw.init = &(struct clk_init_data) {
2223 .name = "gcc_pdm_ahb_clk",
2224 .parent_hws = (const struct clk_hw*[]) {
2225 &pcnoc_bfdcd_clk_src.clkr.hw,
2226 },
2227 .num_parents = 1,
2228 .ops = &clk_branch2_ops,
2229 }
2230 }
2231 };
2232
2233 static struct clk_branch gcc_sdcc1_ahb_clk = {
2234 .halt_reg = 0x4201c,
2235 .halt_check = BRANCH_HALT,
2236 .clkr = {
2237 .enable_reg = 0x4201c,
2238 .enable_mask = BIT(0),
2239 .hw.init = &(struct clk_init_data) {
2240 .name = "gcc_sdcc1_ahb_clk",
2241 .parent_hws = (const struct clk_hw*[]) {
2242 &pcnoc_bfdcd_clk_src.clkr.hw,
2243 },
2244 .num_parents = 1,
2245 .ops = &clk_branch2_ops,
2246 }
2247 }
2248 };
2249
2250 static struct clk_branch gcc_sdcc1_apps_clk = {
2251 .halt_reg = 0x42018,
2252 .halt_check = BRANCH_HALT,
2253 .clkr = {
2254 .enable_reg = 0x42018,
2255 .enable_mask = BIT(0),
2256 .hw.init = &(struct clk_init_data) {
2257 .name = "gcc_sdcc1_apps_clk",
2258 .parent_hws = (const struct clk_hw*[]) {
2259 &sdcc1_apps_clk_src.clkr.hw,
2260 },
2261 .num_parents = 1,
2262 .ops = &clk_branch2_ops,
2263 .flags = CLK_SET_RATE_PARENT,
2264 }
2265 }
2266 };
2267
2268 static struct clk_branch gcc_sdcc2_ahb_clk = {
2269 .halt_reg = 0x4301c,
2270 .halt_check = BRANCH_HALT,
2271 .clkr = {
2272 .enable_reg = 0x4301c,
2273 .enable_mask = BIT(0),
2274 .hw.init = &(struct clk_init_data) {
2275 .name = "gcc_sdcc2_ahb_clk",
2276 .parent_hws = (const struct clk_hw*[]) {
2277 &pcnoc_bfdcd_clk_src.clkr.hw,
2278 },
2279 .num_parents = 1,
2280 .ops = &clk_branch2_ops,
2281 }
2282 }
2283 };
2284
2285 static struct clk_branch gcc_sdcc2_apps_clk = {
2286 .halt_reg = 0x43018,
2287 .halt_check = BRANCH_HALT,
2288 .clkr = {
2289 .enable_reg = 0x43018,
2290 .enable_mask = BIT(0),
2291 .hw.init = &(struct clk_init_data) {
2292 .name = "gcc_sdcc2_apps_clk",
2293 .parent_hws = (const struct clk_hw*[]) {
2294 &sdcc2_apps_clk_src.clkr.hw,
2295 },
2296 .num_parents = 1,
2297 .ops = &clk_branch2_ops,
2298 .flags = CLK_SET_RATE_PARENT,
2299 }
2300 }
2301 };
2302
2303 static struct clk_branch gcc_usb2a_phy_sleep_clk = {
2304 .halt_reg = 0x4102c,
2305 .halt_check = BRANCH_HALT,
2306 .clkr = {
2307 .enable_reg = 0x4102c,
2308 .enable_mask = BIT(0),
2309 .hw.init = &(struct clk_init_data) {
2310 .name = "gcc_usb2a_phy_sleep_clk",
2311 .parent_data = gcc_sleep_clk_data,
2312 .num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
2313 .ops = &clk_branch2_ops,
2314 }
2315 }
2316 };
2317
2318 static struct clk_branch gcc_usb_hs_ahb_clk = {
2319 .halt_reg = 0x41008,
2320 .halt_check = BRANCH_HALT,
2321 .clkr = {
2322 .enable_reg = 0x41008,
2323 .enable_mask = BIT(0),
2324 .hw.init = &(struct clk_init_data) {
2325 .name = "gcc_usb_hs_ahb_clk",
2326 .parent_hws = (const struct clk_hw*[]) {
2327 &pcnoc_bfdcd_clk_src.clkr.hw,
2328 },
2329 .num_parents = 1,
2330 .ops = &clk_branch2_ops,
2331 }
2332 }
2333 };
2334
2335 static struct clk_branch gcc_usb_hs_phy_cfg_ahb_clk = {
2336 .halt_reg = 0x41030,
2337 .halt_check = BRANCH_HALT,
2338 .clkr = {
2339 .enable_reg = 0x41030,
2340 .enable_mask = BIT(0),
2341 .hw.init = &(struct clk_init_data) {
2342 .name = "gcc_usb_hs_phy_cfg_ahb_clk",
2343 .parent_hws = (const struct clk_hw*[]) {
2344 &pcnoc_bfdcd_clk_src.clkr.hw,
2345 },
2346 .num_parents = 1,
2347 .ops = &clk_branch2_ops,
2348 }
2349 }
2350 };
2351
2352 static struct clk_branch gcc_usb_hs_system_clk = {
2353 .halt_reg = 0x41004,
2354 .halt_check = BRANCH_HALT,
2355 .clkr = {
2356 .enable_reg = 0x41004,
2357 .enable_mask = BIT(0),
2358 .hw.init = &(struct clk_init_data) {
2359 .name = "gcc_usb_hs_system_clk",
2360 .parent_hws = (const struct clk_hw*[]) {
2361 &usb_hs_system_clk_src.clkr.hw,
2362 },
2363 .num_parents = 1,
2364 .ops = &clk_branch2_ops,
2365 .flags = CLK_SET_RATE_PARENT,
2366 }
2367 }
2368 };
2369
2370 static struct clk_branch gcc_venus0_ahb_clk = {
2371 .halt_reg = 0x4c020,
2372 .halt_check = BRANCH_HALT,
2373 .clkr = {
2374 .enable_reg = 0x4c020,
2375 .enable_mask = BIT(0),
2376 .hw.init = &(struct clk_init_data) {
2377 .name = "gcc_venus0_ahb_clk",
2378 .parent_hws = (const struct clk_hw*[]) {
2379 &pcnoc_bfdcd_clk_src.clkr.hw,
2380 },
2381 .num_parents = 1,
2382 .ops = &clk_branch2_ops,
2383 }
2384 }
2385 };
2386
2387 static struct clk_branch gcc_venus0_axi_clk = {
2388 .halt_reg = 0x4c024,
2389 .halt_check = BRANCH_HALT,
2390 .clkr = {
2391 .enable_reg = 0x4c024,
2392 .enable_mask = BIT(0),
2393 .hw.init = &(struct clk_init_data) {
2394 .name = "gcc_venus0_axi_clk",
2395 .parent_hws = (const struct clk_hw*[]) {
2396 &system_noc_bfdcd_clk_src.clkr.hw,
2397 },
2398 .num_parents = 1,
2399 .ops = &clk_branch2_ops,
2400 }
2401 }
2402 };
2403
2404 static struct clk_branch gcc_venus0_core0_vcodec0_clk = {
2405 .halt_reg = 0x4c02c,
2406 .halt_check = BRANCH_HALT,
2407 .clkr = {
2408 .enable_reg = 0x4c02c,
2409 .enable_mask = BIT(0),
2410 .hw.init = &(struct clk_init_data) {
2411 .name = "gcc_venus0_core0_vcodec0_clk",
2412 .parent_hws = (const struct clk_hw*[]) {
2413 &vcodec0_clk_src.clkr.hw,
2414 },
2415 .num_parents = 1,
2416 .ops = &clk_branch2_ops,
2417 .flags = CLK_SET_RATE_PARENT,
2418 }
2419 }
2420 };
2421
2422 static struct clk_branch gcc_venus0_vcodec0_clk = {
2423 .halt_reg = 0x4c01c,
2424 .halt_check = BRANCH_HALT,
2425 .clkr = {
2426 .enable_reg = 0x4c01c,
2427 .enable_mask = BIT(0),
2428 .hw.init = &(struct clk_init_data) {
2429 .name = "gcc_venus0_vcodec0_clk",
2430 .parent_hws = (const struct clk_hw*[]) {
2431 &vcodec0_clk_src.clkr.hw,
2432 },
2433 .num_parents = 1,
2434 .ops = &clk_branch2_ops,
2435 .flags = CLK_SET_RATE_PARENT,
2436 }
2437 }
2438 };
2439
2440 static struct gdsc mdss_gdsc = {
2441 .gdscr = 0x4d078,
2442 .cxcs = (unsigned int []) { 0x4d080, 0x4d088 },
2443 .cxc_count = 2,
2444 .pd = {
2445 .name = "mdss_gdsc",
2446 },
2447 .pwrsts = PWRSTS_OFF_ON,
2448 };
2449
2450 static struct gdsc oxili_gdsc = {
2451 .gdscr = 0x5901c,
2452 .cxcs = (unsigned int []) { 0x59020 },
2453 .cxc_count = 1,
2454 .pd = {
2455 .name = "oxili_gdsc",
2456 },
2457 .pwrsts = PWRSTS_OFF_ON,
2458 };
2459
2460 static struct gdsc venus_gdsc = {
2461 .gdscr = 0x4c018,
2462 .cxcs = (unsigned int []) { 0x4c024, 0x4c01c },
2463 .cxc_count = 2,
2464 .pd = {
2465 .name = "venus_gdsc",
2466 },
2467 .pwrsts = PWRSTS_OFF_ON,
2468 };
2469
2470 static struct gdsc venus_core0_gdsc = {
2471 .gdscr = 0x4c028,
2472 .cxcs = (unsigned int []) { 0x4c02c },
2473 .cxc_count = 1,
2474 .pd = {
2475 .name = "venus_core0_gdsc",
2476 },
2477 .flags = HW_CTRL,
2478 .pwrsts = PWRSTS_OFF_ON,
2479 };
2480
2481 static struct gdsc vfe_gdsc = {
2482 .gdscr = 0x58034,
2483 .cxcs = (unsigned int []) { 0x58038, 0x58048, 0x58050 },
2484 .cxc_count = 3,
2485 .pd = {
2486 .name = "vfe_gdsc",
2487 },
2488 .pwrsts = PWRSTS_OFF_ON,
2489 };
2490
2491 static struct clk_regmap *gcc_msm8909_clocks[] = {
2492 [GPLL0_EARLY] = &gpll0_early.clkr,
2493 [GPLL0] = &gpll0.clkr,
2494 [GPLL1] = &gpll1.clkr,
2495 [GPLL1_VOTE] = &gpll1_vote,
2496 [GPLL2_EARLY] = &gpll2_early.clkr,
2497 [GPLL2] = &gpll2.clkr,
2498 [BIMC_PLL_EARLY] = &bimc_pll_early.clkr,
2499 [BIMC_PLL] = &bimc_pll.clkr,
2500 [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
2501 [BIMC_DDR_CLK_SRC] = &bimc_ddr_clk_src.clkr,
2502 [BIMC_GPU_CLK_SRC] = &bimc_gpu_clk_src.clkr,
2503 [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
2504 [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
2505 [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
2506 [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
2507 [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
2508 [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
2509 [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
2510 [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
2511 [BLSP1_QUP5_I2C_APPS_CLK_SRC] = &blsp1_qup5_i2c_apps_clk_src.clkr,
2512 [BLSP1_QUP5_SPI_APPS_CLK_SRC] = &blsp1_qup5_spi_apps_clk_src.clkr,
2513 [BLSP1_QUP6_I2C_APPS_CLK_SRC] = &blsp1_qup6_i2c_apps_clk_src.clkr,
2514 [BLSP1_QUP6_SPI_APPS_CLK_SRC] = &blsp1_qup6_spi_apps_clk_src.clkr,
2515 [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
2516 [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
2517 [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2518 [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2519 [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2520 [CAMSS_TOP_AHB_CLK_SRC] = &camss_top_ahb_clk_src.clkr,
2521 [CRYPTO_CLK_SRC] = &crypto_clk_src.clkr,
2522 [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2523 [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2524 [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2525 [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2526 [GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
2527 [GP1_CLK_SRC] = &gp1_clk_src.clkr,
2528 [GP2_CLK_SRC] = &gp2_clk_src.clkr,
2529 [GP3_CLK_SRC] = &gp3_clk_src.clkr,
2530 [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2531 [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2532 [MDP_CLK_SRC] = &mdp_clk_src.clkr,
2533 [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2534 [PCNOC_BFDCD_CLK_SRC] = &pcnoc_bfdcd_clk_src.clkr,
2535 [PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
2536 [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
2537 [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
2538 [SYSTEM_NOC_BFDCD_CLK_SRC] = &system_noc_bfdcd_clk_src.clkr,
2539 [USB_HS_SYSTEM_CLK_SRC] = &usb_hs_system_clk_src.clkr,
2540 [VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr,
2541 [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2542 [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2543 [GCC_APSS_TCU_CLK] = &gcc_apss_tcu_clk.clkr,
2544 [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
2545 [GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr,
2546 [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
2547 [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
2548 [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
2549 [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
2550 [GCC_GFX_TBU_CLK] = &gcc_gfx_tbu_clk.clkr,
2551 [GCC_GFX_TCU_CLK] = &gcc_gfx_tcu_clk.clkr,
2552 [GCC_GTCU_AHB_CLK] = &gcc_gtcu_ahb_clk.clkr,
2553 [GCC_MDP_TBU_CLK] = &gcc_mdp_tbu_clk.clkr,
2554 [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
2555 [GCC_SMMU_CFG_CLK] = &gcc_smmu_cfg_clk.clkr,
2556 [GCC_VENUS_TBU_CLK] = &gcc_venus_tbu_clk.clkr,
2557 [GCC_VFE_TBU_CLK] = &gcc_vfe_tbu_clk.clkr,
2558 [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
2559 [GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_clk.clkr,
2560 [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
2561 [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
2562 [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
2563 [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
2564 [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
2565 [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
2566 [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
2567 [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
2568 [GCC_BLSP1_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr,
2569 [GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr,
2570 [GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr,
2571 [GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_spi_apps_clk.clkr,
2572 [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
2573 [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
2574 [GCC_CAMSS_AHB_CLK] = &gcc_camss_ahb_clk.clkr,
2575 [GCC_CAMSS_CSI0_CLK] = &gcc_camss_csi0_clk.clkr,
2576 [GCC_CAMSS_CSI0_AHB_CLK] = &gcc_camss_csi0_ahb_clk.clkr,
2577 [GCC_CAMSS_CSI0PHY_CLK] = &gcc_camss_csi0phy_clk.clkr,
2578 [GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
2579 [GCC_CAMSS_CSI0PIX_CLK] = &gcc_camss_csi0pix_clk.clkr,
2580 [GCC_CAMSS_CSI0RDI_CLK] = &gcc_camss_csi0rdi_clk.clkr,
2581 [GCC_CAMSS_CSI1_CLK] = &gcc_camss_csi1_clk.clkr,
2582 [GCC_CAMSS_CSI1_AHB_CLK] = &gcc_camss_csi1_ahb_clk.clkr,
2583 [GCC_CAMSS_CSI1PHY_CLK] = &gcc_camss_csi1phy_clk.clkr,
2584 [GCC_CAMSS_CSI1PIX_CLK] = &gcc_camss_csi1pix_clk.clkr,
2585 [GCC_CAMSS_CSI1RDI_CLK] = &gcc_camss_csi1rdi_clk.clkr,
2586 [GCC_CAMSS_CSI_VFE0_CLK] = &gcc_camss_csi_vfe0_clk.clkr,
2587 [GCC_CAMSS_GP0_CLK] = &gcc_camss_gp0_clk.clkr,
2588 [GCC_CAMSS_GP1_CLK] = &gcc_camss_gp1_clk.clkr,
2589 [GCC_CAMSS_ISPIF_AHB_CLK] = &gcc_camss_ispif_ahb_clk.clkr,
2590 [GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
2591 [GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
2592 [GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
2593 [GCC_CAMSS_VFE0_CLK] = &gcc_camss_vfe0_clk.clkr,
2594 [GCC_CAMSS_VFE_AHB_CLK] = &gcc_camss_vfe_ahb_clk.clkr,
2595 [GCC_CAMSS_VFE_AXI_CLK] = &gcc_camss_vfe_axi_clk.clkr,
2596 [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
2597 [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
2598 [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
2599 [GCC_MDSS_AHB_CLK] = &gcc_mdss_ahb_clk.clkr,
2600 [GCC_MDSS_AXI_CLK] = &gcc_mdss_axi_clk.clkr,
2601 [GCC_MDSS_BYTE0_CLK] = &gcc_mdss_byte0_clk.clkr,
2602 [GCC_MDSS_ESC0_CLK] = &gcc_mdss_esc0_clk.clkr,
2603 [GCC_MDSS_MDP_CLK] = &gcc_mdss_mdp_clk.clkr,
2604 [GCC_MDSS_PCLK0_CLK] = &gcc_mdss_pclk0_clk.clkr,
2605 [GCC_MDSS_VSYNC_CLK] = &gcc_mdss_vsync_clk.clkr,
2606 [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
2607 [GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
2608 [GCC_OXILI_AHB_CLK] = &gcc_oxili_ahb_clk.clkr,
2609 [GCC_OXILI_GFX3D_CLK] = &gcc_oxili_gfx3d_clk.clkr,
2610 [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
2611 [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
2612 [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
2613 [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
2614 [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
2615 [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
2616 [GCC_USB2A_PHY_SLEEP_CLK] = &gcc_usb2a_phy_sleep_clk.clkr,
2617 [GCC_USB_HS_AHB_CLK] = &gcc_usb_hs_ahb_clk.clkr,
2618 [GCC_USB_HS_PHY_CFG_AHB_CLK] = &gcc_usb_hs_phy_cfg_ahb_clk.clkr,
2619 [GCC_USB_HS_SYSTEM_CLK] = &gcc_usb_hs_system_clk.clkr,
2620 [GCC_VENUS0_AHB_CLK] = &gcc_venus0_ahb_clk.clkr,
2621 [GCC_VENUS0_AXI_CLK] = &gcc_venus0_axi_clk.clkr,
2622 [GCC_VENUS0_CORE0_VCODEC0_CLK] = &gcc_venus0_core0_vcodec0_clk.clkr,
2623 [GCC_VENUS0_VCODEC0_CLK] = &gcc_venus0_vcodec0_clk.clkr,
2624 };
2625
2626 static struct gdsc *gcc_msm8909_gdscs[] = {
2627 [MDSS_GDSC] = &mdss_gdsc,
2628 [OXILI_GDSC] = &oxili_gdsc,
2629 [VENUS_GDSC] = &venus_gdsc,
2630 [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2631 [VFE_GDSC] = &vfe_gdsc,
2632 };
2633
2634 static const struct qcom_reset_map gcc_msm8909_resets[] = {
2635 [GCC_AUDIO_CORE_BCR] = { 0x1c008 },
2636 [GCC_BLSP1_BCR] = { 0x01000 },
2637 [GCC_BLSP1_QUP1_BCR] = { 0x02000 },
2638 [GCC_BLSP1_QUP2_BCR] = { 0x03008 },
2639 [GCC_BLSP1_QUP3_BCR] = { 0x04018 },
2640 [GCC_BLSP1_QUP4_BCR] = { 0x05018 },
2641 [GCC_BLSP1_QUP5_BCR] = { 0x06018 },
2642 [GCC_BLSP1_QUP6_BCR] = { 0x07018 },
2643 [GCC_BLSP1_UART1_BCR] = { 0x02038 },
2644 [GCC_BLSP1_UART2_BCR] = { 0x03028 },
2645 [GCC_CAMSS_CSI0_BCR] = { 0x4e038 },
2646 [GCC_CAMSS_CSI0PHY_BCR] = { 0x4e044 },
2647 [GCC_CAMSS_CSI0PIX_BCR] = { 0x4e054 },
2648 [GCC_CAMSS_CSI0RDI_BCR] = { 0x4e04c },
2649 [GCC_CAMSS_CSI1_BCR] = { 0x4f038 },
2650 [GCC_CAMSS_CSI1PHY_BCR] = { 0x4f044 },
2651 [GCC_CAMSS_CSI1PIX_BCR] = { 0x4f054 },
2652 [GCC_CAMSS_CSI1RDI_BCR] = { 0x4f04c },
2653 [GCC_CAMSS_CSI_VFE0_BCR] = { 0x5804c },
2654 [GCC_CAMSS_GP0_BCR] = { 0x54014 },
2655 [GCC_CAMSS_GP1_BCR] = { 0x55014 },
2656 [GCC_CAMSS_ISPIF_BCR] = { 0x50000 },
2657 [GCC_CAMSS_MCLK0_BCR] = { 0x52014 },
2658 [GCC_CAMSS_MCLK1_BCR] = { 0x53014 },
2659 [GCC_CAMSS_PHY0_BCR] = { 0x4e018 },
2660 [GCC_CAMSS_TOP_BCR] = { 0x56000 },
2661 [GCC_CAMSS_TOP_AHB_BCR] = { 0x5a018 },
2662 [GCC_CAMSS_VFE_BCR] = { 0x58030 },
2663 [GCC_CRYPTO_BCR] = { 0x16000 },
2664 [GCC_MDSS_BCR] = { 0x4d074 },
2665 [GCC_OXILI_BCR] = { 0x59018 },
2666 [GCC_PDM_BCR] = { 0x44000 },
2667 [GCC_PRNG_BCR] = { 0x13000 },
2668 [GCC_QUSB2_PHY_BCR] = { 0x4103c },
2669 [GCC_SDCC1_BCR] = { 0x42000 },
2670 [GCC_SDCC2_BCR] = { 0x43000 },
2671 [GCC_ULT_AUDIO_BCR] = { 0x1c0b4 },
2672 [GCC_USB2A_PHY_BCR] = { 0x41028 },
2673 [GCC_USB2_HS_PHY_ONLY_BCR] = { .reg = 0x41034, .udelay = 15 },
2674 [GCC_USB_HS_BCR] = { 0x41000 },
2675 [GCC_VENUS0_BCR] = { 0x4c014 },
2676 /* Subsystem Restart */
2677 [GCC_MSS_RESTART] = { 0x3e000 },
2678 };
2679
2680 static const struct regmap_config gcc_msm8909_regmap_config = {
2681 .reg_bits = 32,
2682 .reg_stride = 4,
2683 .val_bits = 32,
2684 .max_register = 0x80000,
2685 .fast_io = true,
2686 };
2687
2688 static const struct qcom_cc_desc gcc_msm8909_desc = {
2689 .config = &gcc_msm8909_regmap_config,
2690 .clks = gcc_msm8909_clocks,
2691 .num_clks = ARRAY_SIZE(gcc_msm8909_clocks),
2692 .resets = gcc_msm8909_resets,
2693 .num_resets = ARRAY_SIZE(gcc_msm8909_resets),
2694 .gdscs = gcc_msm8909_gdscs,
2695 .num_gdscs = ARRAY_SIZE(gcc_msm8909_gdscs),
2696 };
2697
2698 static const struct of_device_id gcc_msm8909_match_table[] = {
2699 { .compatible = "qcom,gcc-msm8909" },
2700 { }
2701 };
2702 MODULE_DEVICE_TABLE(of, gcc_msm8909_match_table);
2703
gcc_msm8909_probe(struct platform_device * pdev)2704 static int gcc_msm8909_probe(struct platform_device *pdev)
2705 {
2706 return qcom_cc_probe(pdev, &gcc_msm8909_desc);
2707 }
2708
2709 static struct platform_driver gcc_msm8909_driver = {
2710 .probe = gcc_msm8909_probe,
2711 .driver = {
2712 .name = "gcc-msm8909",
2713 .of_match_table = gcc_msm8909_match_table,
2714 },
2715 };
2716
gcc_msm8909_init(void)2717 static int __init gcc_msm8909_init(void)
2718 {
2719 return platform_driver_register(&gcc_msm8909_driver);
2720 }
2721 core_initcall(gcc_msm8909_init);
2722
gcc_msm8909_exit(void)2723 static void __exit gcc_msm8909_exit(void)
2724 {
2725 platform_driver_unregister(&gcc_msm8909_driver);
2726 }
2727 module_exit(gcc_msm8909_exit);
2728
2729 MODULE_DESCRIPTION("Qualcomm GCC MSM8909 Driver");
2730 MODULE_LICENSE("GPL");
2731 MODULE_ALIAS("platform:gcc-msm8909");
2732