1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2020, Martin Botka <martin.botka@somainline.org>
5 * Copyright (c) 2020, Konrad Dybcio <konrad.dybcio@somainline.org>
6 */
7
8 #include <linux/kernel.h>
9 #include <linux/bitops.h>
10 #include <linux/err.h>
11 #include <linux/platform_device.h>
12 #include <linux/mod_devicetable.h>
13 #include <linux/module.h>
14 #include <linux/clk-provider.h>
15 #include <linux/regmap.h>
16
17 #include <dt-bindings/clock/qcom,mmcc-sdm660.h>
18
19 #include "common.h"
20 #include "clk-regmap.h"
21 #include "clk-regmap-divider.h"
22 #include "clk-alpha-pll.h"
23 #include "clk-rcg.h"
24 #include "clk-branch.h"
25 #include "reset.h"
26 #include "gdsc.h"
27
28 enum {
29 P_XO,
30 P_DSI0PLL_BYTE,
31 P_DSI0PLL,
32 P_DSI1PLL_BYTE,
33 P_DSI1PLL,
34 P_GPLL0,
35 P_GPLL0_DIV,
36 P_MMPLL0,
37 P_MMPLL10,
38 P_MMPLL3,
39 P_MMPLL4,
40 P_MMPLL5,
41 P_MMPLL6,
42 P_MMPLL7,
43 P_MMPLL8,
44 P_SLEEP_CLK,
45 P_DP_PHY_PLL_LINK_CLK,
46 P_DP_PHY_PLL_VCO_DIV,
47 };
48
49 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map[] = {
50 { P_XO, 0 },
51 { P_MMPLL0, 1 },
52 { P_MMPLL4, 2 },
53 { P_MMPLL7, 3 },
54 { P_MMPLL8, 4 },
55 { P_GPLL0, 5 },
56 { P_GPLL0_DIV, 6 },
57 };
58
59 /* Voteable PLL */
60 static struct clk_alpha_pll mmpll0 = {
61 .offset = 0xc000,
62 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
63 .clkr = {
64 .enable_reg = 0x1f0,
65 .enable_mask = BIT(0),
66 .hw.init = &(struct clk_init_data){
67 .name = "mmpll0",
68 .parent_data = &(const struct clk_parent_data){
69 .fw_name = "xo",
70 },
71 .num_parents = 1,
72 .ops = &clk_alpha_pll_ops,
73 },
74 },
75 };
76
77 static struct clk_alpha_pll mmpll6 = {
78 .offset = 0xf0,
79 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
80 .clkr = {
81 .enable_reg = 0x1f0,
82 .enable_mask = BIT(2),
83 .hw.init = &(struct clk_init_data){
84 .name = "mmpll6",
85 .parent_data = &(const struct clk_parent_data){
86 .fw_name = "xo",
87 },
88 .num_parents = 1,
89 .ops = &clk_alpha_pll_ops,
90 },
91 },
92 };
93
94 /* APSS controlled PLLs */
95 static const struct pll_vco vco[] = {
96 { 1000000000, 2000000000, 0 },
97 { 750000000, 1500000000, 1 },
98 { 500000000, 1000000000, 2 },
99 { 250000000, 500000000, 3 },
100 };
101
102 static const struct pll_vco mmpll3_vco[] = {
103 { 750000000, 1500000000, 1 },
104 };
105
106 static const struct alpha_pll_config mmpll10_config = {
107 .l = 0x1e,
108 .config_ctl_val = 0x00004289,
109 .main_output_mask = 0x1,
110 };
111
112 static struct clk_alpha_pll mmpll10 = {
113 .offset = 0x190,
114 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
115 .clkr = {
116 .hw.init = &(struct clk_init_data){
117 .name = "mmpll10",
118 .parent_data = &(const struct clk_parent_data){
119 .fw_name = "xo",
120 },
121 .num_parents = 1,
122 .ops = &clk_alpha_pll_ops,
123 },
124 },
125 };
126
127 static const struct alpha_pll_config mmpll3_config = {
128 .l = 0x2e,
129 .config_ctl_val = 0x4001055b,
130 .vco_val = 0x1 << 20,
131 .vco_mask = 0x3 << 20,
132 .main_output_mask = 0x1,
133 };
134
135 static struct clk_alpha_pll mmpll3 = {
136 .offset = 0x0,
137 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
138 .vco_table = mmpll3_vco,
139 .num_vco = ARRAY_SIZE(mmpll3_vco),
140 .clkr = {
141 .hw.init = &(struct clk_init_data){
142 .name = "mmpll3",
143 .parent_data = &(const struct clk_parent_data){
144 .fw_name = "xo",
145 },
146 .num_parents = 1,
147 .ops = &clk_alpha_pll_ops,
148 },
149 },
150 };
151
152 static const struct alpha_pll_config mmpll4_config = {
153 .l = 0x28,
154 .config_ctl_val = 0x4001055b,
155 .vco_val = 0x2 << 20,
156 .vco_mask = 0x3 << 20,
157 .main_output_mask = 0x1,
158 };
159
160 static struct clk_alpha_pll mmpll4 = {
161 .offset = 0x50,
162 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
163 .vco_table = vco,
164 .num_vco = ARRAY_SIZE(vco),
165 .clkr = {
166 .hw.init = &(struct clk_init_data){
167 .name = "mmpll4",
168 .parent_data = &(const struct clk_parent_data){
169 .fw_name = "xo",
170 },
171 .num_parents = 1,
172 .ops = &clk_alpha_pll_ops,
173 },
174 },
175 };
176
177 static const struct alpha_pll_config mmpll5_config = {
178 .l = 0x2a,
179 .config_ctl_val = 0x4001055b,
180 .alpha_hi = 0xf8,
181 .alpha_en_mask = BIT(24),
182 .vco_val = 0x2 << 20,
183 .vco_mask = 0x3 << 20,
184 .main_output_mask = 0x1,
185 };
186
187 static struct clk_alpha_pll mmpll5 = {
188 .offset = 0xa0,
189 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
190 .vco_table = vco,
191 .num_vco = ARRAY_SIZE(vco),
192 .clkr = {
193 .hw.init = &(struct clk_init_data){
194 .name = "mmpll5",
195 .parent_data = &(const struct clk_parent_data){
196 .fw_name = "xo",
197 },
198 .num_parents = 1,
199 .ops = &clk_alpha_pll_ops,
200 },
201 },
202 };
203
204 static const struct alpha_pll_config mmpll7_config = {
205 .l = 0x32,
206 .config_ctl_val = 0x4001055b,
207 .vco_val = 0x2 << 20,
208 .vco_mask = 0x3 << 20,
209 .main_output_mask = 0x1,
210 };
211
212 static struct clk_alpha_pll mmpll7 = {
213 .offset = 0x140,
214 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
215 .vco_table = vco,
216 .num_vco = ARRAY_SIZE(vco),
217 .clkr = {
218 .hw.init = &(struct clk_init_data){
219 .name = "mmpll7",
220 .parent_data = &(const struct clk_parent_data){
221 .fw_name = "xo",
222 },
223 .num_parents = 1,
224 .ops = &clk_alpha_pll_ops,
225 },
226 },
227 };
228
229 static const struct alpha_pll_config mmpll8_config = {
230 .l = 0x30,
231 .alpha_hi = 0x70,
232 .alpha_en_mask = BIT(24),
233 .config_ctl_val = 0x4001055b,
234 .vco_val = 0x2 << 20,
235 .vco_mask = 0x3 << 20,
236 .main_output_mask = 0x1,
237 };
238
239 static struct clk_alpha_pll mmpll8 = {
240 .offset = 0x1c0,
241 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
242 .vco_table = vco,
243 .num_vco = ARRAY_SIZE(vco),
244 .clkr = {
245 .hw.init = &(struct clk_init_data){
246 .name = "mmpll8",
247 .parent_data = &(const struct clk_parent_data){
248 .fw_name = "xo",
249 },
250 .num_parents = 1,
251 .ops = &clk_alpha_pll_ops,
252 },
253 },
254 };
255
256 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div[] = {
257 { .fw_name = "xo" },
258 { .hw = &mmpll0.clkr.hw },
259 { .hw = &mmpll4.clkr.hw },
260 { .hw = &mmpll7.clkr.hw },
261 { .hw = &mmpll8.clkr.hw },
262 { .fw_name = "gpll0" },
263 { .fw_name = "gpll0_div" },
264 };
265
266 static const struct parent_map mmcc_xo_dsibyte_map[] = {
267 { P_XO, 0 },
268 { P_DSI0PLL_BYTE, 1 },
269 { P_DSI1PLL_BYTE, 2 },
270 };
271
272 static const struct clk_parent_data mmcc_xo_dsibyte[] = {
273 { .fw_name = "xo" },
274 { .fw_name = "dsi0pllbyte" },
275 { .fw_name = "dsi1pllbyte" },
276 };
277
278 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
279 { P_XO, 0 },
280 { P_MMPLL0, 1 },
281 { P_MMPLL4, 2 },
282 { P_MMPLL7, 3 },
283 { P_MMPLL10, 4 },
284 { P_GPLL0, 5 },
285 { P_GPLL0_DIV, 6 },
286 };
287
288 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
289 { .fw_name = "xo" },
290 { .hw = &mmpll0.clkr.hw },
291 { .hw = &mmpll4.clkr.hw },
292 { .hw = &mmpll7.clkr.hw },
293 { .hw = &mmpll10.clkr.hw },
294 { .fw_name = "gpll0" },
295 { .fw_name = "gpll0_div" },
296 };
297
298 static const struct parent_map mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
299 { P_XO, 0 },
300 { P_MMPLL4, 1 },
301 { P_MMPLL7, 2 },
302 { P_MMPLL10, 3 },
303 { P_SLEEP_CLK, 4 },
304 { P_GPLL0, 5 },
305 { P_GPLL0_DIV, 6 },
306 };
307
308 static const struct clk_parent_data mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
309 { .fw_name = "xo" },
310 { .hw = &mmpll4.clkr.hw },
311 { .hw = &mmpll7.clkr.hw },
312 { .hw = &mmpll10.clkr.hw },
313 { .fw_name = "sleep_clk" },
314 { .fw_name = "gpll0" },
315 { .fw_name = "gpll0_div" },
316 };
317
318 static const struct parent_map mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
319 { P_XO, 0 },
320 { P_MMPLL0, 1 },
321 { P_MMPLL7, 2 },
322 { P_MMPLL10, 3 },
323 { P_SLEEP_CLK, 4 },
324 { P_GPLL0, 5 },
325 { P_GPLL0_DIV, 6 },
326 };
327
328 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
329 { .fw_name = "xo" },
330 { .hw = &mmpll0.clkr.hw },
331 { .hw = &mmpll7.clkr.hw },
332 { .hw = &mmpll10.clkr.hw },
333 { .fw_name = "sleep_clk" },
334 { .fw_name = "gpll0" },
335 { .fw_name = "gpll0_div" },
336 };
337
338 static const struct parent_map mmcc_xo_gpll0_gpll0_div_map[] = {
339 { P_XO, 0 },
340 { P_GPLL0, 5 },
341 { P_GPLL0_DIV, 6 },
342 };
343
344 static const struct clk_parent_data mmcc_xo_gpll0_gpll0_div[] = {
345 { .fw_name = "xo" },
346 { .fw_name = "gpll0" },
347 { .fw_name = "gpll0_div" },
348 };
349
350 static const struct parent_map mmcc_xo_dplink_dpvco_map[] = {
351 { P_XO, 0 },
352 { P_DP_PHY_PLL_LINK_CLK, 1 },
353 { P_DP_PHY_PLL_VCO_DIV, 2 },
354 };
355
356 static const struct clk_parent_data mmcc_xo_dplink_dpvco[] = {
357 { .fw_name = "xo" },
358 { .fw_name = "dp_link_2x_clk_divsel_five" },
359 { .fw_name = "dp_vco_divided_clk_src_mux" },
360 };
361
362 static const struct parent_map mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map[] = {
363 { P_XO, 0 },
364 { P_MMPLL0, 1 },
365 { P_MMPLL5, 2 },
366 { P_MMPLL7, 3 },
367 { P_GPLL0, 5 },
368 { P_GPLL0_DIV, 6 },
369 };
370
371 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div[] = {
372 { .fw_name = "xo" },
373 { .hw = &mmpll0.clkr.hw },
374 { .hw = &mmpll5.clkr.hw },
375 { .hw = &mmpll7.clkr.hw },
376 { .fw_name = "gpll0" },
377 { .fw_name = "gpll0_div" },
378 };
379
380 static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
381 { P_XO, 0 },
382 { P_DSI0PLL, 1 },
383 { P_DSI1PLL, 2 },
384 };
385
386 static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
387 { .fw_name = "xo" },
388 { .fw_name = "dsi0pll" },
389 { .fw_name = "dsi1pll" },
390 };
391
392 static const struct parent_map mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map[] = {
393 { P_XO, 0 },
394 { P_MMPLL0, 1 },
395 { P_MMPLL4, 2 },
396 { P_MMPLL7, 3 },
397 { P_MMPLL10, 4 },
398 { P_MMPLL6, 5 },
399 { P_GPLL0, 6 },
400 };
401
402 static const struct clk_parent_data mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0[] = {
403 { .fw_name = "xo" },
404 { .hw = &mmpll0.clkr.hw },
405 { .hw = &mmpll4.clkr.hw },
406 { .hw = &mmpll7.clkr.hw },
407 { .hw = &mmpll10.clkr.hw },
408 { .hw = &mmpll6.clkr.hw },
409 { .fw_name = "gpll0" },
410 };
411
412 static const struct parent_map mmcc_xo_mmpll0_gpll0_gpll0_div_map[] = {
413 { P_XO, 0 },
414 { P_MMPLL0, 1 },
415 { P_GPLL0, 5 },
416 { P_GPLL0_DIV, 6 },
417 };
418
419 static const struct clk_parent_data mmcc_xo_mmpll0_gpll0_gpll0_div[] = {
420 { .fw_name = "xo" },
421 { .hw = &mmpll0.clkr.hw },
422 { .fw_name = "gpll0" },
423 { .fw_name = "gpll0_div" },
424 };
425
426 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map[] = {
427 { P_XO, 0 },
428 { P_MMPLL0, 1 },
429 { P_MMPLL4, 2 },
430 { P_MMPLL7, 3 },
431 { P_MMPLL10, 4 },
432 { P_GPLL0, 5 },
433 { P_MMPLL6, 6 },
434 };
435
436 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6[] = {
437 { .fw_name = "xo" },
438 { .hw = &mmpll0.clkr.hw },
439 { .hw = &mmpll4.clkr.hw },
440 { .hw = &mmpll7.clkr.hw },
441 { .hw = &mmpll10.clkr.hw },
442 { .fw_name = "gpll0" },
443 { .hw = &mmpll6.clkr.hw },
444 };
445
446 static const struct parent_map mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map[] = {
447 { P_XO, 0 },
448 { P_MMPLL0, 1 },
449 { P_MMPLL8, 2 },
450 { P_MMPLL3, 3 },
451 { P_MMPLL6, 4 },
452 { P_GPLL0, 5 },
453 { P_MMPLL7, 6 },
454 };
455
456 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7[] = {
457 { .fw_name = "xo" },
458 { .hw = &mmpll0.clkr.hw },
459 { .hw = &mmpll8.clkr.hw },
460 { .hw = &mmpll3.clkr.hw },
461 { .hw = &mmpll6.clkr.hw },
462 { .fw_name = "gpll0" },
463 { .hw = &mmpll7.clkr.hw },
464 };
465
466 static const struct freq_tbl ftbl_ahb_clk_src[] = {
467 F(19200000, P_XO, 1, 0, 0),
468 F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
469 F(80800000, P_MMPLL0, 10, 0, 0),
470 { }
471 };
472
473 static struct clk_rcg2 ahb_clk_src = {
474 .cmd_rcgr = 0x5000,
475 .mnd_width = 0,
476 .hid_width = 5,
477 .parent_map = mmcc_xo_mmpll0_gpll0_gpll0_div_map,
478 .freq_tbl = ftbl_ahb_clk_src,
479 .clkr.hw.init = &(struct clk_init_data){
480 .name = "ahb_clk_src",
481 .parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,
482 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),
483 .ops = &clk_rcg2_ops,
484 },
485 };
486
487 static struct clk_rcg2 byte0_clk_src = {
488 .cmd_rcgr = 0x2120,
489 .mnd_width = 0,
490 .hid_width = 5,
491 .parent_map = mmcc_xo_dsibyte_map,
492 .clkr.hw.init = &(struct clk_init_data){
493 .name = "byte0_clk_src",
494 .parent_data = mmcc_xo_dsibyte,
495 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
496 .ops = &clk_byte2_ops,
497 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
498 },
499 };
500
501 static struct clk_rcg2 byte1_clk_src = {
502 .cmd_rcgr = 0x2140,
503 .mnd_width = 0,
504 .hid_width = 5,
505 .parent_map = mmcc_xo_dsibyte_map,
506 .clkr.hw.init = &(struct clk_init_data){
507 .name = "byte1_clk_src",
508 .parent_data = mmcc_xo_dsibyte,
509 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
510 .ops = &clk_byte2_ops,
511 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
512 },
513 };
514
515 static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {
516 F(10000, P_XO, 16, 1, 120),
517 F(24000, P_XO, 16, 1, 50),
518 F(6000000, P_GPLL0_DIV, 10, 1, 5),
519 F(12000000, P_GPLL0_DIV, 10, 2, 5),
520 F(13043478, P_GPLL0_DIV, 1, 1, 23),
521 F(24000000, P_GPLL0_DIV, 1, 2, 25),
522 F(50000000, P_GPLL0_DIV, 6, 0, 0),
523 F(100000000, P_GPLL0_DIV, 3, 0, 0),
524 F(200000000, P_GPLL0, 3, 0, 0),
525 { }
526 };
527
528 static struct clk_rcg2 camss_gp0_clk_src = {
529 .cmd_rcgr = 0x3420,
530 .mnd_width = 8,
531 .hid_width = 5,
532 .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
533 .freq_tbl = ftbl_camss_gp0_clk_src,
534 .clkr.hw.init = &(struct clk_init_data){
535 .name = "camss_gp0_clk_src",
536 .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
537 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
538 .ops = &clk_rcg2_ops,
539 },
540 };
541
542 static struct clk_rcg2 camss_gp1_clk_src = {
543 .cmd_rcgr = 0x3450,
544 .mnd_width = 8,
545 .hid_width = 5,
546 .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
547 .freq_tbl = ftbl_camss_gp0_clk_src,
548 .clkr.hw.init = &(struct clk_init_data){
549 .name = "camss_gp1_clk_src",
550 .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
551 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
552 .ops = &clk_rcg2_ops,
553 },
554 };
555
556 static const struct freq_tbl ftbl_cci_clk_src[] = {
557 F(37500000, P_GPLL0_DIV, 8, 0, 0),
558 F(50000000, P_GPLL0_DIV, 6, 0, 0),
559 F(100000000, P_GPLL0, 6, 0, 0),
560 { }
561 };
562
563 static struct clk_rcg2 cci_clk_src = {
564 .cmd_rcgr = 0x3300,
565 .mnd_width = 8,
566 .hid_width = 5,
567 .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
568 .freq_tbl = ftbl_cci_clk_src,
569 .clkr.hw.init = &(struct clk_init_data){
570 .name = "cci_clk_src",
571 .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
572 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
573 .ops = &clk_rcg2_ops,
574 },
575 };
576
577 static const struct freq_tbl ftbl_cpp_clk_src[] = {
578 F(120000000, P_GPLL0, 5, 0, 0),
579 F(256000000, P_MMPLL4, 3, 0, 0),
580 F(384000000, P_MMPLL4, 2, 0, 0),
581 F(480000000, P_MMPLL7, 2, 0, 0),
582 F(540000000, P_MMPLL6, 2, 0, 0),
583 F(576000000, P_MMPLL10, 1, 0, 0),
584 { }
585 };
586
587 static struct clk_rcg2 cpp_clk_src = {
588 .cmd_rcgr = 0x3640,
589 .mnd_width = 0,
590 .hid_width = 5,
591 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map,
592 .freq_tbl = ftbl_cpp_clk_src,
593 .clkr.hw.init = &(struct clk_init_data){
594 .name = "cpp_clk_src",
595 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,
596 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),
597 .ops = &clk_rcg2_ops,
598 },
599 };
600
601 static const struct freq_tbl ftbl_csi0_clk_src[] = {
602 F(100000000, P_GPLL0_DIV, 3, 0, 0),
603 F(200000000, P_GPLL0, 3, 0, 0),
604 F(310000000, P_MMPLL8, 3, 0, 0),
605 F(404000000, P_MMPLL0, 2, 0, 0),
606 F(465000000, P_MMPLL8, 2, 0, 0),
607 { }
608 };
609
610 static struct clk_rcg2 csi0_clk_src = {
611 .cmd_rcgr = 0x3090,
612 .mnd_width = 0,
613 .hid_width = 5,
614 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
615 .freq_tbl = ftbl_csi0_clk_src,
616 .clkr.hw.init = &(struct clk_init_data){
617 .name = "csi0_clk_src",
618 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
619 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
620 .ops = &clk_rcg2_ops,
621 },
622 };
623
624 static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {
625 F(100000000, P_GPLL0_DIV, 3, 0, 0),
626 F(200000000, P_GPLL0, 3, 0, 0),
627 F(269333333, P_MMPLL0, 3, 0, 0),
628 { }
629 };
630
631 static struct clk_rcg2 csi0phytimer_clk_src = {
632 .cmd_rcgr = 0x3000,
633 .mnd_width = 0,
634 .hid_width = 5,
635 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
636 .freq_tbl = ftbl_csi0phytimer_clk_src,
637 .clkr.hw.init = &(struct clk_init_data){
638 .name = "csi0phytimer_clk_src",
639 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
640 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
641 .ops = &clk_rcg2_ops,
642 },
643 };
644
645 static struct clk_rcg2 csi1_clk_src = {
646 .cmd_rcgr = 0x3100,
647 .mnd_width = 0,
648 .hid_width = 5,
649 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
650 .freq_tbl = ftbl_csi0_clk_src,
651 .clkr.hw.init = &(struct clk_init_data){
652 .name = "csi1_clk_src",
653 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
654 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
655 .ops = &clk_rcg2_ops,
656 },
657 };
658
659 static struct clk_rcg2 csi1phytimer_clk_src = {
660 .cmd_rcgr = 0x3030,
661 .mnd_width = 0,
662 .hid_width = 5,
663 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
664 .freq_tbl = ftbl_csi0phytimer_clk_src,
665 .clkr.hw.init = &(struct clk_init_data){
666 .name = "csi1phytimer_clk_src",
667 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
668 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
669 .ops = &clk_rcg2_ops,
670 },
671 };
672
673 static struct clk_rcg2 csi2_clk_src = {
674 .cmd_rcgr = 0x3160,
675 .mnd_width = 0,
676 .hid_width = 5,
677 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
678 .freq_tbl = ftbl_csi0_clk_src,
679 .clkr.hw.init = &(struct clk_init_data){
680 .name = "csi2_clk_src",
681 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
682 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
683 .ops = &clk_rcg2_ops,
684 },
685 };
686
687 static struct clk_rcg2 csi2phytimer_clk_src = {
688 .cmd_rcgr = 0x3060,
689 .mnd_width = 0,
690 .hid_width = 5,
691 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
692 .freq_tbl = ftbl_csi0phytimer_clk_src,
693 .clkr.hw.init = &(struct clk_init_data){
694 .name = "csi2phytimer_clk_src",
695 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
696 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
697 .ops = &clk_rcg2_ops,
698 },
699 };
700
701 static struct clk_rcg2 csi3_clk_src = {
702 .cmd_rcgr = 0x31c0,
703 .mnd_width = 0,
704 .hid_width = 5,
705 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
706 .freq_tbl = ftbl_csi0_clk_src,
707 .clkr.hw.init = &(struct clk_init_data){
708 .name = "csi3_clk_src",
709 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
710 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
711 .ops = &clk_rcg2_ops,
712 },
713 };
714
715 static const struct freq_tbl ftbl_csiphy_clk_src[] = {
716 F(100000000, P_GPLL0_DIV, 3, 0, 0),
717 F(200000000, P_GPLL0, 3, 0, 0),
718 F(269333333, P_MMPLL0, 3, 0, 0),
719 F(320000000, P_MMPLL7, 3, 0, 0),
720 { }
721 };
722
723 static struct clk_rcg2 csiphy_clk_src = {
724 .cmd_rcgr = 0x3800,
725 .mnd_width = 0,
726 .hid_width = 5,
727 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
728 .freq_tbl = ftbl_csiphy_clk_src,
729 .clkr.hw.init = &(struct clk_init_data){
730 .name = "csiphy_clk_src",
731 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
732 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
733 .ops = &clk_rcg2_ops,
734 },
735 };
736
737 static const struct freq_tbl ftbl_dp_aux_clk_src[] = {
738 F(19200000, P_XO, 1, 0, 0),
739 { }
740 };
741
742 static struct clk_rcg2 dp_aux_clk_src = {
743 .cmd_rcgr = 0x2260,
744 .mnd_width = 0,
745 .hid_width = 5,
746 .parent_map = mmcc_xo_gpll0_gpll0_div_map,
747 .freq_tbl = ftbl_dp_aux_clk_src,
748 .clkr.hw.init = &(struct clk_init_data){
749 .name = "dp_aux_clk_src",
750 .parent_data = mmcc_xo_gpll0_gpll0_div,
751 .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
752 .ops = &clk_rcg2_ops,
753 },
754 };
755
756 static const struct freq_tbl ftbl_dp_crypto_clk_src[] = {
757 F(101250000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
758 F(168750000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
759 F(337500000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
760 { }
761 };
762
763 static struct clk_rcg2 dp_crypto_clk_src = {
764 .cmd_rcgr = 0x2220,
765 .mnd_width = 8,
766 .hid_width = 5,
767 .parent_map = mmcc_xo_dplink_dpvco_map,
768 .freq_tbl = ftbl_dp_crypto_clk_src,
769 .clkr.hw.init = &(struct clk_init_data){
770 .name = "dp_crypto_clk_src",
771 .parent_data = mmcc_xo_dplink_dpvco,
772 .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
773 .ops = &clk_rcg2_ops,
774 },
775 };
776
777 static const struct freq_tbl ftbl_dp_gtc_clk_src[] = {
778 F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
779 F(60000000, P_GPLL0, 10, 0, 0),
780 { }
781 };
782
783 static struct clk_rcg2 dp_gtc_clk_src = {
784 .cmd_rcgr = 0x2280,
785 .mnd_width = 0,
786 .hid_width = 5,
787 .parent_map = mmcc_xo_gpll0_gpll0_div_map,
788 .freq_tbl = ftbl_dp_gtc_clk_src,
789 .clkr.hw.init = &(struct clk_init_data){
790 .name = "dp_gtc_clk_src",
791 .parent_data = mmcc_xo_gpll0_gpll0_div,
792 .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
793 .ops = &clk_rcg2_ops,
794 },
795 };
796
797 static const struct freq_tbl ftbl_dp_link_clk_src[] = {
798 F(162000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
799 F(270000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
800 F(540000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
801 { }
802 };
803
804 static struct clk_rcg2 dp_link_clk_src = {
805 .cmd_rcgr = 0x2200,
806 .mnd_width = 0,
807 .hid_width = 5,
808 .parent_map = mmcc_xo_dplink_dpvco_map,
809 .freq_tbl = ftbl_dp_link_clk_src,
810 .clkr.hw.init = &(struct clk_init_data){
811 .name = "dp_link_clk_src",
812 .parent_data = mmcc_xo_dplink_dpvco,
813 .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
814 .ops = &clk_rcg2_ops,
815 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
816 },
817 };
818
819 static struct clk_rcg2 dp_pixel_clk_src = {
820 .cmd_rcgr = 0x2240,
821 .mnd_width = 16,
822 .hid_width = 5,
823 .parent_map = mmcc_xo_dplink_dpvco_map,
824 .clkr.hw.init = &(struct clk_init_data){
825 .name = "dp_pixel_clk_src",
826 .parent_data = mmcc_xo_dplink_dpvco,
827 .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
828 .ops = &clk_dp_ops,
829 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
830 },
831 };
832
833 static struct clk_rcg2 esc0_clk_src = {
834 .cmd_rcgr = 0x2160,
835 .mnd_width = 0,
836 .hid_width = 5,
837 .parent_map = mmcc_xo_dsibyte_map,
838 .clkr.hw.init = &(struct clk_init_data){
839 .name = "esc0_clk_src",
840 .parent_data = mmcc_xo_dsibyte,
841 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
842 .ops = &clk_rcg2_ops,
843 },
844 };
845
846 static struct clk_rcg2 esc1_clk_src = {
847 .cmd_rcgr = 0x2180,
848 .mnd_width = 0,
849 .hid_width = 5,
850 .parent_map = mmcc_xo_dsibyte_map,
851 .clkr.hw.init = &(struct clk_init_data){
852 .name = "esc1_clk_src",
853 .parent_data = mmcc_xo_dsibyte,
854 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
855 .ops = &clk_rcg2_ops,
856 },
857 };
858
859 static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
860 F(66666667, P_GPLL0_DIV, 4.5, 0, 0),
861 F(133333333, P_GPLL0, 4.5, 0, 0),
862 F(219428571, P_MMPLL4, 3.5, 0, 0),
863 F(320000000, P_MMPLL7, 3, 0, 0),
864 F(480000000, P_MMPLL7, 2, 0, 0),
865 { }
866 };
867
868 static struct clk_rcg2 jpeg0_clk_src = {
869 .cmd_rcgr = 0x3500,
870 .mnd_width = 0,
871 .hid_width = 5,
872 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
873 .freq_tbl = ftbl_jpeg0_clk_src,
874 .clkr.hw.init = &(struct clk_init_data){
875 .name = "jpeg0_clk_src",
876 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
877 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
878 .ops = &clk_rcg2_ops,
879 },
880 };
881
882 static const struct freq_tbl ftbl_mclk0_clk_src[] = {
883 F(4800000, P_XO, 4, 0, 0),
884 F(6000000, P_GPLL0_DIV, 10, 1, 5),
885 F(8000000, P_GPLL0_DIV, 1, 2, 75),
886 F(9600000, P_XO, 2, 0, 0),
887 F(16666667, P_GPLL0_DIV, 2, 1, 9),
888 F(19200000, P_XO, 1, 0, 0),
889 F(24000000, P_MMPLL10, 1, 1, 24),
890 F(33333333, P_GPLL0_DIV, 1, 1, 9),
891 F(48000000, P_GPLL0, 1, 2, 25),
892 F(66666667, P_GPLL0, 1, 1, 9),
893 { }
894 };
895
896 static struct clk_rcg2 mclk0_clk_src = {
897 .cmd_rcgr = 0x3360,
898 .mnd_width = 8,
899 .hid_width = 5,
900 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
901 .freq_tbl = ftbl_mclk0_clk_src,
902 .clkr.hw.init = &(struct clk_init_data){
903 .name = "mclk0_clk_src",
904 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
905 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
906 .ops = &clk_rcg2_ops,
907 },
908 };
909
910 static struct clk_rcg2 mclk1_clk_src = {
911 .cmd_rcgr = 0x3390,
912 .mnd_width = 8,
913 .hid_width = 5,
914 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
915 .freq_tbl = ftbl_mclk0_clk_src,
916 .clkr.hw.init = &(struct clk_init_data){
917 .name = "mclk1_clk_src",
918 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
919 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
920 .ops = &clk_rcg2_ops,
921 },
922 };
923
924 static struct clk_rcg2 mclk2_clk_src = {
925 .cmd_rcgr = 0x33c0,
926 .mnd_width = 8,
927 .hid_width = 5,
928 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
929 .freq_tbl = ftbl_mclk0_clk_src,
930 .clkr.hw.init = &(struct clk_init_data){
931 .name = "mclk2_clk_src",
932 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
933 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
934 .ops = &clk_rcg2_ops,
935 },
936 };
937
938 static struct clk_rcg2 mclk3_clk_src = {
939 .cmd_rcgr = 0x33f0,
940 .mnd_width = 8,
941 .hid_width = 5,
942 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
943 .freq_tbl = ftbl_mclk0_clk_src,
944 .clkr.hw.init = &(struct clk_init_data){
945 .name = "mclk3_clk_src",
946 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
947 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
948 .ops = &clk_rcg2_ops,
949 },
950 };
951
952 static const struct freq_tbl ftbl_mdp_clk_src[] = {
953 F(100000000, P_GPLL0_DIV, 3, 0, 0),
954 F(150000000, P_GPLL0_DIV, 2, 0, 0),
955 F(171428571, P_GPLL0, 3.5, 0, 0),
956 F(200000000, P_GPLL0, 3, 0, 0),
957 F(275000000, P_MMPLL5, 3, 0, 0),
958 F(300000000, P_GPLL0, 2, 0, 0),
959 F(330000000, P_MMPLL5, 2.5, 0, 0),
960 F(412500000, P_MMPLL5, 2, 0, 0),
961 { }
962 };
963
964 static struct clk_rcg2 mdp_clk_src = {
965 .cmd_rcgr = 0x2040,
966 .mnd_width = 0,
967 .hid_width = 5,
968 .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
969 .freq_tbl = ftbl_mdp_clk_src,
970 .clkr.hw.init = &(struct clk_init_data){
971 .name = "mdp_clk_src",
972 .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
973 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
974 .ops = &clk_rcg2_ops,
975 },
976 };
977
978 static struct clk_rcg2 pclk0_clk_src = {
979 .cmd_rcgr = 0x2000,
980 .mnd_width = 8,
981 .hid_width = 5,
982 .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
983 .clkr.hw.init = &(struct clk_init_data){
984 .name = "pclk0_clk_src",
985 .parent_data = mmcc_xo_dsi0pll_dsi1pll,
986 .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
987 .ops = &clk_pixel_ops,
988 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
989 },
990 };
991
992 static struct clk_rcg2 pclk1_clk_src = {
993 .cmd_rcgr = 0x2020,
994 .mnd_width = 8,
995 .hid_width = 5,
996 .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
997 .clkr.hw.init = &(struct clk_init_data){
998 .name = "pclk1_clk_src",
999 .parent_data = mmcc_xo_dsi0pll_dsi1pll,
1000 .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
1001 .ops = &clk_pixel_ops,
1002 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1003 },
1004 };
1005
1006 static const struct freq_tbl ftbl_rot_clk_src[] = {
1007 F(171428571, P_GPLL0, 3.5, 0, 0),
1008 F(275000000, P_MMPLL5, 3, 0, 0),
1009 F(300000000, P_GPLL0, 2, 0, 0),
1010 F(330000000, P_MMPLL5, 2.5, 0, 0),
1011 F(412500000, P_MMPLL5, 2, 0, 0),
1012 { }
1013 };
1014
1015 static struct clk_rcg2 rot_clk_src = {
1016 .cmd_rcgr = 0x21a0,
1017 .mnd_width = 0,
1018 .hid_width = 5,
1019 .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
1020 .freq_tbl = ftbl_rot_clk_src,
1021 .clkr.hw.init = &(struct clk_init_data){
1022 .name = "rot_clk_src",
1023 .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
1024 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
1025 .ops = &clk_rcg2_ops,
1026 },
1027 };
1028
1029 static const struct freq_tbl ftbl_vfe0_clk_src[] = {
1030 F(120000000, P_GPLL0, 5, 0, 0),
1031 F(200000000, P_GPLL0, 3, 0, 0),
1032 F(256000000, P_MMPLL4, 3, 0, 0),
1033 F(300000000, P_GPLL0, 2, 0, 0),
1034 F(404000000, P_MMPLL0, 2, 0, 0),
1035 F(480000000, P_MMPLL7, 2, 0, 0),
1036 F(540000000, P_MMPLL6, 2, 0, 0),
1037 F(576000000, P_MMPLL10, 1, 0, 0),
1038 { }
1039 };
1040
1041 static struct clk_rcg2 vfe0_clk_src = {
1042 .cmd_rcgr = 0x3600,
1043 .mnd_width = 0,
1044 .hid_width = 5,
1045 .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1046 .freq_tbl = ftbl_vfe0_clk_src,
1047 .clkr.hw.init = &(struct clk_init_data){
1048 .name = "vfe0_clk_src",
1049 .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1050 .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1051 .ops = &clk_rcg2_ops,
1052 },
1053 };
1054
1055 static struct clk_rcg2 vfe1_clk_src = {
1056 .cmd_rcgr = 0x3620,
1057 .mnd_width = 0,
1058 .hid_width = 5,
1059 .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1060 .freq_tbl = ftbl_vfe0_clk_src,
1061 .clkr.hw.init = &(struct clk_init_data){
1062 .name = "vfe1_clk_src",
1063 .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1064 .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1065 .ops = &clk_rcg2_ops,
1066 },
1067 };
1068
1069 static const struct freq_tbl ftbl_video_core_clk_src[] = {
1070 F(133333333, P_GPLL0, 4.5, 0, 0),
1071 F(269333333, P_MMPLL0, 3, 0, 0),
1072 F(320000000, P_MMPLL7, 3, 0, 0),
1073 F(404000000, P_MMPLL0, 2, 0, 0),
1074 F(441600000, P_MMPLL3, 2, 0, 0),
1075 F(518400000, P_MMPLL3, 2, 0, 0),
1076 { }
1077 };
1078
1079 static struct clk_rcg2 video_core_clk_src = {
1080 .cmd_rcgr = 0x1000,
1081 .mnd_width = 0,
1082 .hid_width = 5,
1083 .parent_map = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map,
1084 .freq_tbl = ftbl_video_core_clk_src,
1085 .clkr.hw.init = &(struct clk_init_data){
1086 .name = "video_core_clk_src",
1087 .parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,
1088 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),
1089 .ops = &clk_rcg2_ops,
1090 .flags = CLK_IS_CRITICAL,
1091 },
1092 };
1093
1094 static struct clk_rcg2 vsync_clk_src = {
1095 .cmd_rcgr = 0x2080,
1096 .mnd_width = 0,
1097 .hid_width = 5,
1098 .parent_map = mmcc_xo_gpll0_gpll0_div_map,
1099 .freq_tbl = ftbl_dp_aux_clk_src,
1100 .clkr.hw.init = &(struct clk_init_data){
1101 .name = "vsync_clk_src",
1102 .parent_data = mmcc_xo_gpll0_gpll0_div,
1103 .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
1104 .ops = &clk_rcg2_ops,
1105 },
1106 };
1107
1108 static struct clk_branch bimc_smmu_ahb_clk = {
1109 .halt_reg = 0xe004,
1110 .halt_check = BRANCH_VOTED,
1111 .hwcg_reg = 0xe004,
1112 .hwcg_bit = 1,
1113 .clkr = {
1114 .enable_reg = 0xe004,
1115 .enable_mask = BIT(0),
1116 .hw.init = &(struct clk_init_data){
1117 .name = "bimc_smmu_ahb_clk",
1118 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1119 .num_parents = 1,
1120 .ops = &clk_branch2_ops,
1121 },
1122 },
1123 };
1124
1125 static struct clk_branch bimc_smmu_axi_clk = {
1126 .halt_reg = 0xe008,
1127 .halt_check = BRANCH_VOTED,
1128 .hwcg_reg = 0xe008,
1129 .hwcg_bit = 1,
1130 .clkr = {
1131 .enable_reg = 0xe008,
1132 .enable_mask = BIT(0),
1133 .hw.init = &(struct clk_init_data){
1134 .name = "bimc_smmu_axi_clk",
1135 .ops = &clk_branch2_ops,
1136 },
1137 },
1138 };
1139
1140 static struct clk_branch camss_ahb_clk = {
1141 .halt_reg = 0x348c,
1142 .halt_check = BRANCH_HALT,
1143 .hwcg_reg = 0x348c,
1144 .hwcg_bit = 1,
1145 .clkr = {
1146 .enable_reg = 0x348c,
1147 .enable_mask = BIT(0),
1148 .hw.init = &(struct clk_init_data){
1149 .name = "camss_ahb_clk",
1150 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1151 .num_parents = 1,
1152 .ops = &clk_branch2_ops,
1153 },
1154 },
1155 };
1156
1157 static struct clk_branch camss_cci_ahb_clk = {
1158 .halt_reg = 0x3348,
1159 .halt_check = BRANCH_HALT,
1160 .clkr = {
1161 .enable_reg = 0x3348,
1162 .enable_mask = BIT(0),
1163 .hw.init = &(struct clk_init_data){
1164 .name = "camss_cci_ahb_clk",
1165 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1166 .num_parents = 1,
1167 .flags = CLK_SET_RATE_PARENT,
1168 .ops = &clk_branch2_ops,
1169 },
1170 },
1171 };
1172
1173 static struct clk_branch camss_cci_clk = {
1174 .halt_reg = 0x3344,
1175 .halt_check = BRANCH_HALT,
1176 .clkr = {
1177 .enable_reg = 0x3344,
1178 .enable_mask = BIT(0),
1179 .hw.init = &(struct clk_init_data){
1180 .name = "camss_cci_clk",
1181 .parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
1182 .num_parents = 1,
1183 .flags = CLK_SET_RATE_PARENT,
1184 .ops = &clk_branch2_ops,
1185 },
1186 },
1187 };
1188
1189 static struct clk_branch camss_cpp_ahb_clk = {
1190 .halt_reg = 0x36b4,
1191 .halt_check = BRANCH_HALT,
1192 .clkr = {
1193 .enable_reg = 0x36b4,
1194 .enable_mask = BIT(0),
1195 .hw.init = &(struct clk_init_data){
1196 .name = "camss_cpp_ahb_clk",
1197 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1198 .num_parents = 1,
1199 .ops = &clk_branch2_ops,
1200 },
1201 },
1202 };
1203
1204 static struct clk_branch camss_cpp_axi_clk = {
1205 .halt_reg = 0x36c4,
1206 .halt_check = BRANCH_HALT,
1207 .clkr = {
1208 .enable_reg = 0x36c4,
1209 .enable_mask = BIT(0),
1210 .hw.init = &(struct clk_init_data){
1211 .name = "camss_cpp_axi_clk",
1212 .ops = &clk_branch2_ops,
1213 },
1214 },
1215 };
1216
1217 static struct clk_branch camss_cpp_clk = {
1218 .halt_reg = 0x36b0,
1219 .halt_check = BRANCH_HALT,
1220 .clkr = {
1221 .enable_reg = 0x36b0,
1222 .enable_mask = BIT(0),
1223 .hw.init = &(struct clk_init_data){
1224 .name = "camss_cpp_clk",
1225 .parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
1226 .num_parents = 1,
1227 .flags = CLK_SET_RATE_PARENT,
1228 .ops = &clk_branch2_ops,
1229 },
1230 },
1231 };
1232
1233 static struct clk_branch camss_cpp_vbif_ahb_clk = {
1234 .halt_reg = 0x36c8,
1235 .halt_check = BRANCH_HALT,
1236 .clkr = {
1237 .enable_reg = 0x36c8,
1238 .enable_mask = BIT(0),
1239 .hw.init = &(struct clk_init_data){
1240 .name = "camss_cpp_vbif_ahb_clk",
1241 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1242 .num_parents = 1,
1243 .ops = &clk_branch2_ops,
1244 },
1245 },
1246 };
1247
1248 static struct clk_branch camss_csi0_ahb_clk = {
1249 .halt_reg = 0x30bc,
1250 .halt_check = BRANCH_HALT,
1251 .clkr = {
1252 .enable_reg = 0x30bc,
1253 .enable_mask = BIT(0),
1254 .hw.init = &(struct clk_init_data){
1255 .name = "camss_csi0_ahb_clk",
1256 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1257 .num_parents = 1,
1258 .ops = &clk_branch2_ops,
1259 },
1260 },
1261 };
1262
1263 static struct clk_branch camss_csi0_clk = {
1264 .halt_reg = 0x30b4,
1265 .halt_check = BRANCH_HALT,
1266 .clkr = {
1267 .enable_reg = 0x30b4,
1268 .enable_mask = BIT(0),
1269 .hw.init = &(struct clk_init_data){
1270 .name = "camss_csi0_clk",
1271 .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1272 .num_parents = 1,
1273 .flags = CLK_SET_RATE_PARENT,
1274 .ops = &clk_branch2_ops,
1275 },
1276 },
1277 };
1278
1279 static struct clk_branch camss_csi0phytimer_clk = {
1280 .halt_reg = 0x3024,
1281 .halt_check = BRANCH_HALT,
1282 .clkr = {
1283 .enable_reg = 0x3024,
1284 .enable_mask = BIT(0),
1285 .hw.init = &(struct clk_init_data){
1286 .name = "camss_csi0phytimer_clk",
1287 .parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
1288 .num_parents = 1,
1289 .flags = CLK_SET_RATE_PARENT,
1290 .ops = &clk_branch2_ops,
1291 },
1292 },
1293 };
1294
1295 static struct clk_branch camss_csi0pix_clk = {
1296 .halt_reg = 0x30e4,
1297 .halt_check = BRANCH_HALT,
1298 .clkr = {
1299 .enable_reg = 0x30e4,
1300 .enable_mask = BIT(0),
1301 .hw.init = &(struct clk_init_data){
1302 .name = "camss_csi0pix_clk",
1303 .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1304 .num_parents = 1,
1305 .ops = &clk_branch2_ops,
1306 },
1307 },
1308 };
1309
1310 static struct clk_branch camss_csi0rdi_clk = {
1311 .halt_reg = 0x30d4,
1312 .halt_check = BRANCH_HALT,
1313 .clkr = {
1314 .enable_reg = 0x30d4,
1315 .enable_mask = BIT(0),
1316 .hw.init = &(struct clk_init_data){
1317 .name = "camss_csi0rdi_clk",
1318 .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1319 .num_parents = 1,
1320 .ops = &clk_branch2_ops,
1321 },
1322 },
1323 };
1324
1325 static struct clk_branch camss_csi1_ahb_clk = {
1326 .halt_reg = 0x3128,
1327 .halt_check = BRANCH_HALT,
1328 .clkr = {
1329 .enable_reg = 0x3128,
1330 .enable_mask = BIT(0),
1331 .hw.init = &(struct clk_init_data){
1332 .name = "camss_csi1_ahb_clk",
1333 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1334 .num_parents = 1,
1335 .ops = &clk_branch2_ops,
1336 },
1337 },
1338 };
1339
1340 static struct clk_branch camss_csi1_clk = {
1341 .halt_reg = 0x3124,
1342 .halt_check = BRANCH_HALT,
1343 .clkr = {
1344 .enable_reg = 0x3124,
1345 .enable_mask = BIT(0),
1346 .hw.init = &(struct clk_init_data){
1347 .name = "camss_csi1_clk",
1348 .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1349 .num_parents = 1,
1350 .flags = CLK_SET_RATE_PARENT,
1351 .ops = &clk_branch2_ops,
1352 },
1353 },
1354 };
1355
1356 static struct clk_branch camss_csi1phytimer_clk = {
1357 .halt_reg = 0x3054,
1358 .halt_check = BRANCH_HALT,
1359 .clkr = {
1360 .enable_reg = 0x3054,
1361 .enable_mask = BIT(0),
1362 .hw.init = &(struct clk_init_data){
1363 .name = "camss_csi1phytimer_clk",
1364 .parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
1365 .num_parents = 1,
1366 .flags = CLK_SET_RATE_PARENT,
1367 .ops = &clk_branch2_ops,
1368 },
1369 },
1370 };
1371
1372 static struct clk_branch camss_csi1pix_clk = {
1373 .halt_reg = 0x3154,
1374 .halt_check = BRANCH_HALT,
1375 .clkr = {
1376 .enable_reg = 0x3154,
1377 .enable_mask = BIT(0),
1378 .hw.init = &(struct clk_init_data){
1379 .name = "camss_csi1pix_clk",
1380 .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1381 .num_parents = 1,
1382 .ops = &clk_branch2_ops,
1383 },
1384 },
1385 };
1386
1387 static struct clk_branch camss_csi1rdi_clk = {
1388 .halt_reg = 0x3144,
1389 .halt_check = BRANCH_HALT,
1390 .clkr = {
1391 .enable_reg = 0x3144,
1392 .enable_mask = BIT(0),
1393 .hw.init = &(struct clk_init_data){
1394 .name = "camss_csi1rdi_clk",
1395 .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1396 .num_parents = 1,
1397 .ops = &clk_branch2_ops,
1398 },
1399 },
1400 };
1401
1402 static struct clk_branch camss_csi2_ahb_clk = {
1403 .halt_reg = 0x3188,
1404 .halt_check = BRANCH_HALT,
1405 .clkr = {
1406 .enable_reg = 0x3188,
1407 .enable_mask = BIT(0),
1408 .hw.init = &(struct clk_init_data){
1409 .name = "camss_csi2_ahb_clk",
1410 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1411 .num_parents = 1,
1412 .ops = &clk_branch2_ops,
1413 },
1414 },
1415 };
1416
1417 static struct clk_branch camss_csi2_clk = {
1418 .halt_reg = 0x3184,
1419 .halt_check = BRANCH_HALT,
1420 .clkr = {
1421 .enable_reg = 0x3184,
1422 .enable_mask = BIT(0),
1423 .hw.init = &(struct clk_init_data){
1424 .name = "camss_csi2_clk",
1425 .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1426 .num_parents = 1,
1427 .flags = CLK_SET_RATE_PARENT,
1428 .ops = &clk_branch2_ops,
1429 },
1430 },
1431 };
1432
1433 static struct clk_branch camss_csi2phytimer_clk = {
1434 .halt_reg = 0x3084,
1435 .halt_check = BRANCH_HALT,
1436 .clkr = {
1437 .enable_reg = 0x3084,
1438 .enable_mask = BIT(0),
1439 .hw.init = &(struct clk_init_data){
1440 .name = "camss_csi2phytimer_clk",
1441 .parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
1442 .num_parents = 1,
1443 .flags = CLK_SET_RATE_PARENT,
1444 .ops = &clk_branch2_ops,
1445 },
1446 },
1447 };
1448
1449 static struct clk_branch camss_csi2pix_clk = {
1450 .halt_reg = 0x31b4,
1451 .halt_check = BRANCH_HALT,
1452 .clkr = {
1453 .enable_reg = 0x31b4,
1454 .enable_mask = BIT(0),
1455 .hw.init = &(struct clk_init_data){
1456 .name = "camss_csi2pix_clk",
1457 .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1458 .num_parents = 1,
1459 .ops = &clk_branch2_ops,
1460 },
1461 },
1462 };
1463
1464 static struct clk_branch camss_csi2rdi_clk = {
1465 .halt_reg = 0x31a4,
1466 .halt_check = BRANCH_HALT,
1467 .clkr = {
1468 .enable_reg = 0x31a4,
1469 .enable_mask = BIT(0),
1470 .hw.init = &(struct clk_init_data){
1471 .name = "camss_csi2rdi_clk",
1472 .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1473 .num_parents = 1,
1474 .ops = &clk_branch2_ops,
1475 },
1476 },
1477 };
1478
1479 static struct clk_branch camss_csi3_ahb_clk = {
1480 .halt_reg = 0x31e8,
1481 .halt_check = BRANCH_HALT,
1482 .clkr = {
1483 .enable_reg = 0x31e8,
1484 .enable_mask = BIT(0),
1485 .hw.init = &(struct clk_init_data){
1486 .name = "camss_csi3_ahb_clk",
1487 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1488 .num_parents = 1,
1489 .ops = &clk_branch2_ops,
1490 },
1491 },
1492 };
1493
1494 static struct clk_branch camss_csi3_clk = {
1495 .halt_reg = 0x31e4,
1496 .halt_check = BRANCH_HALT,
1497 .clkr = {
1498 .enable_reg = 0x31e4,
1499 .enable_mask = BIT(0),
1500 .hw.init = &(struct clk_init_data){
1501 .name = "camss_csi3_clk",
1502 .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1503 .num_parents = 1,
1504 .flags = CLK_SET_RATE_PARENT,
1505 .ops = &clk_branch2_ops,
1506 },
1507 },
1508 };
1509
1510 static struct clk_branch camss_csi3pix_clk = {
1511 .halt_reg = 0x3214,
1512 .halt_check = BRANCH_HALT,
1513 .clkr = {
1514 .enable_reg = 0x3214,
1515 .enable_mask = BIT(0),
1516 .hw.init = &(struct clk_init_data){
1517 .name = "camss_csi3pix_clk",
1518 .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1519 .num_parents = 1,
1520 .ops = &clk_branch2_ops,
1521 },
1522 },
1523 };
1524
1525 static struct clk_branch camss_csi3rdi_clk = {
1526 .halt_reg = 0x3204,
1527 .halt_check = BRANCH_HALT,
1528 .clkr = {
1529 .enable_reg = 0x3204,
1530 .enable_mask = BIT(0),
1531 .hw.init = &(struct clk_init_data){
1532 .name = "camss_csi3rdi_clk",
1533 .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1534 .num_parents = 1,
1535 .ops = &clk_branch2_ops,
1536 },
1537 },
1538 };
1539
1540 static struct clk_branch camss_csi_vfe0_clk = {
1541 .halt_reg = 0x3704,
1542 .halt_check = BRANCH_HALT,
1543 .clkr = {
1544 .enable_reg = 0x3704,
1545 .enable_mask = BIT(0),
1546 .hw.init = &(struct clk_init_data){
1547 .name = "camss_csi_vfe0_clk",
1548 .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1549 .num_parents = 1,
1550 .ops = &clk_branch2_ops,
1551 },
1552 },
1553 };
1554
1555 static struct clk_branch camss_csi_vfe1_clk = {
1556 .halt_reg = 0x3714,
1557 .halt_check = BRANCH_HALT,
1558 .clkr = {
1559 .enable_reg = 0x3714,
1560 .enable_mask = BIT(0),
1561 .hw.init = &(struct clk_init_data){
1562 .name = "camss_csi_vfe1_clk",
1563 .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1564 .num_parents = 1,
1565 .ops = &clk_branch2_ops,
1566 },
1567 },
1568 };
1569
1570 static struct clk_branch camss_csiphy0_clk = {
1571 .halt_reg = 0x3740,
1572 .halt_check = BRANCH_HALT,
1573 .clkr = {
1574 .enable_reg = 0x3740,
1575 .enable_mask = BIT(0),
1576 .hw.init = &(struct clk_init_data){
1577 .name = "camss_csiphy0_clk",
1578 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1579 .num_parents = 1,
1580 .flags = CLK_SET_RATE_PARENT,
1581 .ops = &clk_branch2_ops,
1582 },
1583 },
1584 };
1585
1586 static struct clk_branch camss_csiphy1_clk = {
1587 .halt_reg = 0x3744,
1588 .halt_check = BRANCH_HALT,
1589 .clkr = {
1590 .enable_reg = 0x3744,
1591 .enable_mask = BIT(0),
1592 .hw.init = &(struct clk_init_data){
1593 .name = "camss_csiphy1_clk",
1594 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1595 .num_parents = 1,
1596 .flags = CLK_SET_RATE_PARENT,
1597 .ops = &clk_branch2_ops,
1598 },
1599 },
1600 };
1601
1602 static struct clk_branch camss_csiphy2_clk = {
1603 .halt_reg = 0x3748,
1604 .halt_check = BRANCH_HALT,
1605 .clkr = {
1606 .enable_reg = 0x3748,
1607 .enable_mask = BIT(0),
1608 .hw.init = &(struct clk_init_data){
1609 .name = "camss_csiphy2_clk",
1610 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1611 .num_parents = 1,
1612 .flags = CLK_SET_RATE_PARENT,
1613 .ops = &clk_branch2_ops,
1614 },
1615 },
1616 };
1617
1618
1619 static struct clk_branch camss_cphy_csid0_clk = {
1620 .halt_reg = 0x3730,
1621 .halt_check = BRANCH_HALT,
1622 .clkr = {
1623 .enable_reg = 0x3730,
1624 .enable_mask = BIT(0),
1625 .hw.init = &(struct clk_init_data){
1626 .name = "camss_cphy_csid0_clk",
1627 .parent_hws = (const struct clk_hw *[]){ &camss_csiphy0_clk.clkr.hw },
1628 .num_parents = 1,
1629 .flags = CLK_SET_RATE_PARENT,
1630 .ops = &clk_branch2_ops,
1631 },
1632 },
1633 };
1634
1635 static struct clk_branch camss_cphy_csid1_clk = {
1636 .halt_reg = 0x3734,
1637 .halt_check = BRANCH_HALT,
1638 .clkr = {
1639 .enable_reg = 0x3734,
1640 .enable_mask = BIT(0),
1641 .hw.init = &(struct clk_init_data){
1642 .name = "camss_cphy_csid1_clk",
1643 .parent_hws = (const struct clk_hw *[]){ &camss_csiphy1_clk.clkr.hw },
1644 .num_parents = 1,
1645 .flags = CLK_SET_RATE_PARENT,
1646 .ops = &clk_branch2_ops,
1647 },
1648 },
1649 };
1650
1651 static struct clk_branch camss_cphy_csid2_clk = {
1652 .halt_reg = 0x3738,
1653 .halt_check = BRANCH_HALT,
1654 .clkr = {
1655 .enable_reg = 0x3738,
1656 .enable_mask = BIT(0),
1657 .hw.init = &(struct clk_init_data){
1658 .name = "camss_cphy_csid2_clk",
1659 .parent_hws = (const struct clk_hw *[]){ &camss_csiphy2_clk.clkr.hw },
1660 .num_parents = 1,
1661 .flags = CLK_SET_RATE_PARENT,
1662 .ops = &clk_branch2_ops,
1663 },
1664 },
1665 };
1666
1667 static struct clk_branch camss_cphy_csid3_clk = {
1668 .halt_reg = 0x373c,
1669 .halt_check = BRANCH_HALT,
1670 .clkr = {
1671 .enable_reg = 0x373c,
1672 .enable_mask = BIT(0),
1673 .hw.init = &(struct clk_init_data){
1674 .name = "camss_cphy_csid3_clk",
1675 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1676 .num_parents = 1,
1677 .flags = CLK_SET_RATE_PARENT,
1678 .ops = &clk_branch2_ops,
1679 },
1680 },
1681 };
1682
1683 static struct clk_branch camss_gp0_clk = {
1684 .halt_reg = 0x3444,
1685 .halt_check = BRANCH_HALT,
1686 .clkr = {
1687 .enable_reg = 0x3444,
1688 .enable_mask = BIT(0),
1689 .hw.init = &(struct clk_init_data){
1690 .name = "camss_gp0_clk",
1691 .parent_hws = (const struct clk_hw *[]){ &camss_gp0_clk_src.clkr.hw },
1692 .num_parents = 1,
1693 .flags = CLK_SET_RATE_PARENT,
1694 .ops = &clk_branch2_ops,
1695 },
1696 },
1697 };
1698
1699 static struct clk_branch camss_gp1_clk = {
1700 .halt_reg = 0x3474,
1701 .halt_check = BRANCH_HALT,
1702 .clkr = {
1703 .enable_reg = 0x3474,
1704 .enable_mask = BIT(0),
1705 .hw.init = &(struct clk_init_data){
1706 .name = "camss_gp1_clk",
1707 .parent_hws = (const struct clk_hw *[]){ &camss_gp1_clk_src.clkr.hw },
1708 .num_parents = 1,
1709 .flags = CLK_SET_RATE_PARENT,
1710 .ops = &clk_branch2_ops,
1711 },
1712 },
1713 };
1714
1715 static struct clk_branch camss_ispif_ahb_clk = {
1716 .halt_reg = 0x3224,
1717 .halt_check = BRANCH_HALT,
1718 .clkr = {
1719 .enable_reg = 0x3224,
1720 .enable_mask = BIT(0),
1721 .hw.init = &(struct clk_init_data){
1722 .name = "camss_ispif_ahb_clk",
1723 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1724 .num_parents = 1,
1725 .ops = &clk_branch2_ops,
1726 },
1727 },
1728 };
1729
1730 static struct clk_branch camss_jpeg0_clk = {
1731 .halt_reg = 0x35a8,
1732 .halt_check = BRANCH_HALT,
1733 .clkr = {
1734 .enable_reg = 0x35a8,
1735 .enable_mask = BIT(0),
1736 .hw.init = &(struct clk_init_data){
1737 .name = "camss_jpeg0_clk",
1738 .parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
1739 .num_parents = 1,
1740 .flags = CLK_SET_RATE_PARENT,
1741 .ops = &clk_branch2_ops,
1742 },
1743 },
1744 };
1745
1746 static struct clk_branch camss_jpeg_ahb_clk = {
1747 .halt_reg = 0x35b4,
1748 .halt_check = BRANCH_HALT,
1749 .clkr = {
1750 .enable_reg = 0x35b4,
1751 .enable_mask = BIT(0),
1752 .hw.init = &(struct clk_init_data){
1753 .name = "camss_jpeg_ahb_clk",
1754 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1755 .num_parents = 1,
1756 .ops = &clk_branch2_ops,
1757 },
1758 },
1759 };
1760
1761 static struct clk_branch camss_jpeg_axi_clk = {
1762 .halt_reg = 0x35b8,
1763 .halt_check = BRANCH_HALT,
1764 .clkr = {
1765 .enable_reg = 0x35b8,
1766 .enable_mask = BIT(0),
1767 .hw.init = &(struct clk_init_data){
1768 .name = "camss_jpeg_axi_clk",
1769 .ops = &clk_branch2_ops,
1770 },
1771 },
1772 };
1773
1774 static struct clk_branch throttle_camss_axi_clk = {
1775 .halt_reg = 0x3c3c,
1776 .halt_check = BRANCH_HALT,
1777 .clkr = {
1778 .enable_reg = 0x3c3c,
1779 .enable_mask = BIT(0),
1780 .hw.init = &(struct clk_init_data){
1781 .name = "throttle_camss_axi_clk",
1782 .ops = &clk_branch2_ops,
1783 },
1784 },
1785 };
1786
1787 static struct clk_branch camss_mclk0_clk = {
1788 .halt_reg = 0x3384,
1789 .halt_check = BRANCH_HALT,
1790 .clkr = {
1791 .enable_reg = 0x3384,
1792 .enable_mask = BIT(0),
1793 .hw.init = &(struct clk_init_data){
1794 .name = "camss_mclk0_clk",
1795 .parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
1796 .num_parents = 1,
1797 .flags = CLK_SET_RATE_PARENT,
1798 .ops = &clk_branch2_ops,
1799 },
1800 },
1801 };
1802
1803 static struct clk_branch camss_mclk1_clk = {
1804 .halt_reg = 0x33b4,
1805 .halt_check = BRANCH_HALT,
1806 .clkr = {
1807 .enable_reg = 0x33b4,
1808 .enable_mask = BIT(0),
1809 .hw.init = &(struct clk_init_data){
1810 .name = "camss_mclk1_clk",
1811 .parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
1812 .num_parents = 1,
1813 .flags = CLK_SET_RATE_PARENT,
1814 .ops = &clk_branch2_ops,
1815 },
1816 },
1817 };
1818
1819 static struct clk_branch camss_mclk2_clk = {
1820 .halt_reg = 0x33e4,
1821 .halt_check = BRANCH_HALT,
1822 .clkr = {
1823 .enable_reg = 0x33e4,
1824 .enable_mask = BIT(0),
1825 .hw.init = &(struct clk_init_data){
1826 .name = "camss_mclk2_clk",
1827 .parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
1828 .num_parents = 1,
1829 .flags = CLK_SET_RATE_PARENT,
1830 .ops = &clk_branch2_ops,
1831 },
1832 },
1833 };
1834
1835 static struct clk_branch camss_mclk3_clk = {
1836 .halt_reg = 0x3414,
1837 .halt_check = BRANCH_HALT,
1838 .clkr = {
1839 .enable_reg = 0x3414,
1840 .enable_mask = BIT(0),
1841 .hw.init = &(struct clk_init_data){
1842 .name = "camss_mclk3_clk",
1843 .parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
1844 .num_parents = 1,
1845 .flags = CLK_SET_RATE_PARENT,
1846 .ops = &clk_branch2_ops,
1847 },
1848 },
1849 };
1850
1851 static struct clk_branch camss_micro_ahb_clk = {
1852 .halt_reg = 0x3494,
1853 .halt_check = BRANCH_HALT,
1854 .clkr = {
1855 .enable_reg = 0x3494,
1856 .enable_mask = BIT(0),
1857 .hw.init = &(struct clk_init_data){
1858 .name = "camss_micro_ahb_clk",
1859 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1860 .num_parents = 1,
1861 .ops = &clk_branch2_ops,
1862 },
1863 },
1864 };
1865
1866 static struct clk_branch camss_top_ahb_clk = {
1867 .halt_reg = 0x3484,
1868 .halt_check = BRANCH_HALT,
1869 .clkr = {
1870 .enable_reg = 0x3484,
1871 .enable_mask = BIT(0),
1872 .hw.init = &(struct clk_init_data){
1873 .name = "camss_top_ahb_clk",
1874 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1875 .num_parents = 1,
1876 .ops = &clk_branch2_ops,
1877 },
1878 },
1879 };
1880
1881 static struct clk_branch camss_vfe0_ahb_clk = {
1882 .halt_reg = 0x3668,
1883 .halt_check = BRANCH_HALT,
1884 .clkr = {
1885 .enable_reg = 0x3668,
1886 .enable_mask = BIT(0),
1887 .hw.init = &(struct clk_init_data){
1888 .name = "camss_vfe0_ahb_clk",
1889 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1890 .num_parents = 1,
1891 .ops = &clk_branch2_ops,
1892 },
1893 },
1894 };
1895
1896 static struct clk_branch camss_vfe0_clk = {
1897 .halt_reg = 0x36a8,
1898 .halt_check = BRANCH_HALT,
1899 .clkr = {
1900 .enable_reg = 0x36a8,
1901 .enable_mask = BIT(0),
1902 .hw.init = &(struct clk_init_data){
1903 .name = "camss_vfe0_clk",
1904 .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1905 .num_parents = 1,
1906 .flags = CLK_SET_RATE_PARENT,
1907 .ops = &clk_branch2_ops,
1908 },
1909 },
1910 };
1911
1912 static struct clk_branch camss_vfe0_stream_clk = {
1913 .halt_reg = 0x3720,
1914 .halt_check = BRANCH_HALT,
1915 .clkr = {
1916 .enable_reg = 0x3720,
1917 .enable_mask = BIT(0),
1918 .hw.init = &(struct clk_init_data){
1919 .name = "camss_vfe0_stream_clk",
1920 .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1921 .num_parents = 1,
1922 .ops = &clk_branch2_ops,
1923 },
1924 },
1925 };
1926
1927 static struct clk_branch camss_vfe1_ahb_clk = {
1928 .halt_reg = 0x3678,
1929 .halt_check = BRANCH_HALT,
1930 .clkr = {
1931 .enable_reg = 0x3678,
1932 .enable_mask = BIT(0),
1933 .hw.init = &(struct clk_init_data){
1934 .name = "camss_vfe1_ahb_clk",
1935 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1936 .num_parents = 1,
1937 .ops = &clk_branch2_ops,
1938 },
1939 },
1940 };
1941
1942 static struct clk_branch camss_vfe1_clk = {
1943 .halt_reg = 0x36ac,
1944 .halt_check = BRANCH_HALT,
1945 .clkr = {
1946 .enable_reg = 0x36ac,
1947 .enable_mask = BIT(0),
1948 .hw.init = &(struct clk_init_data){
1949 .name = "camss_vfe1_clk",
1950 .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1951 .num_parents = 1,
1952 .flags = CLK_SET_RATE_PARENT,
1953 .ops = &clk_branch2_ops,
1954 },
1955 },
1956 };
1957
1958 static struct clk_branch camss_vfe1_stream_clk = {
1959 .halt_reg = 0x3724,
1960 .halt_check = BRANCH_HALT,
1961 .clkr = {
1962 .enable_reg = 0x3724,
1963 .enable_mask = BIT(0),
1964 .hw.init = &(struct clk_init_data){
1965 .name = "camss_vfe1_stream_clk",
1966 .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1967 .num_parents = 1,
1968 .ops = &clk_branch2_ops,
1969 },
1970 },
1971 };
1972
1973 static struct clk_branch camss_vfe_vbif_ahb_clk = {
1974 .halt_reg = 0x36b8,
1975 .halt_check = BRANCH_HALT,
1976 .clkr = {
1977 .enable_reg = 0x36b8,
1978 .enable_mask = BIT(0),
1979 .hw.init = &(struct clk_init_data){
1980 .name = "camss_vfe_vbif_ahb_clk",
1981 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1982 .num_parents = 1,
1983 .ops = &clk_branch2_ops,
1984 },
1985 },
1986 };
1987
1988 static struct clk_branch camss_vfe_vbif_axi_clk = {
1989 .halt_reg = 0x36bc,
1990 .halt_check = BRANCH_HALT,
1991 .clkr = {
1992 .enable_reg = 0x36bc,
1993 .enable_mask = BIT(0),
1994 .hw.init = &(struct clk_init_data){
1995 .name = "camss_vfe_vbif_axi_clk",
1996 .ops = &clk_branch2_ops,
1997 },
1998 },
1999 };
2000
2001 static struct clk_branch csiphy_ahb2crif_clk = {
2002 .halt_reg = 0x374c,
2003 .halt_check = BRANCH_HALT,
2004 .hwcg_reg = 0x374c,
2005 .hwcg_bit = 1,
2006 .clkr = {
2007 .enable_reg = 0x374c,
2008 .enable_mask = BIT(0),
2009 .hw.init = &(struct clk_init_data){
2010 .name = "csiphy_ahb2crif_clk",
2011 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2012 .num_parents = 1,
2013 .ops = &clk_branch2_ops,
2014 },
2015 },
2016 };
2017
2018 static struct clk_branch mdss_ahb_clk = {
2019 .halt_reg = 0x2308,
2020 .halt_check = BRANCH_HALT,
2021 .hwcg_reg = 0x8a004,
2022 .hwcg_bit = 1,
2023 .clkr = {
2024 .enable_reg = 0x2308,
2025 .enable_mask = BIT(0),
2026 .hw.init = &(struct clk_init_data){
2027 .name = "mdss_ahb_clk",
2028 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2029 .flags = CLK_SET_RATE_PARENT,
2030 .num_parents = 1,
2031 .ops = &clk_branch2_ops,
2032 },
2033 },
2034 };
2035
2036 static const struct freq_tbl ftbl_axi_clk_src[] = {
2037 F(75000000, P_GPLL0, 8, 0, 0),
2038 F(171428571, P_GPLL0, 3.5, 0, 0),
2039 F(240000000, P_GPLL0, 2.5, 0, 0),
2040 F(323200000, P_MMPLL0, 2.5, 0, 0),
2041 F(406000000, P_MMPLL0, 2, 0, 0),
2042 { }
2043 };
2044
2045 /* RO to linux */
2046 static struct clk_rcg2 axi_clk_src = {
2047 .cmd_rcgr = 0xd000,
2048 .hid_width = 5,
2049 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
2050 .freq_tbl = ftbl_axi_clk_src,
2051 .clkr.hw.init = &(struct clk_init_data){
2052 .name = "axi_clk_src",
2053 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
2054 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
2055 .ops = &clk_rcg2_ops,
2056 },
2057 };
2058
2059 static struct clk_branch mdss_axi_clk = {
2060 .halt_reg = 0x2310,
2061 .halt_check = BRANCH_HALT,
2062 .clkr = {
2063 .enable_reg = 0x2310,
2064 .enable_mask = BIT(0),
2065 .hw.init = &(struct clk_init_data){
2066 .name = "mdss_axi_clk",
2067 .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
2068 .ops = &clk_branch2_ops,
2069 },
2070 },
2071 };
2072
2073 static struct clk_branch throttle_mdss_axi_clk = {
2074 .halt_reg = 0x246c,
2075 .halt_check = BRANCH_HALT,
2076 .hwcg_reg = 0x246c,
2077 .hwcg_bit = 1,
2078 .clkr = {
2079 .enable_reg = 0x246c,
2080 .enable_mask = BIT(0),
2081 .hw.init = &(struct clk_init_data){
2082 .name = "throttle_mdss_axi_clk",
2083 .ops = &clk_branch2_ops,
2084 },
2085 },
2086 };
2087
2088 static struct clk_branch mdss_byte0_clk = {
2089 .halt_reg = 0x233c,
2090 .halt_check = BRANCH_HALT,
2091 .clkr = {
2092 .enable_reg = 0x233c,
2093 .enable_mask = BIT(0),
2094 .hw.init = &(struct clk_init_data){
2095 .name = "mdss_byte0_clk",
2096 .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2097 .num_parents = 1,
2098 .flags = CLK_SET_RATE_PARENT,
2099 .ops = &clk_branch2_ops,
2100 },
2101 },
2102 };
2103
2104 static struct clk_regmap_div mdss_byte0_intf_div_clk = {
2105 .reg = 0x237c,
2106 .shift = 0,
2107 .width = 2,
2108 /*
2109 * NOTE: Op does not work for div-3. Current assumption is that div-3
2110 * is not a recommended setting for this divider.
2111 */
2112 .clkr = {
2113 .hw.init = &(struct clk_init_data){
2114 .name = "mdss_byte0_intf_div_clk",
2115 .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2116 .num_parents = 1,
2117 .ops = &clk_regmap_div_ops,
2118 .flags = CLK_GET_RATE_NOCACHE,
2119 },
2120 },
2121 };
2122
2123 static struct clk_branch mdss_byte0_intf_clk = {
2124 .halt_reg = 0x2374,
2125 .halt_check = BRANCH_HALT,
2126 .clkr = {
2127 .enable_reg = 0x2374,
2128 .enable_mask = BIT(0),
2129 .hw.init = &(struct clk_init_data){
2130 .name = "mdss_byte0_intf_clk",
2131 .parent_hws = (const struct clk_hw *[]){ &mdss_byte0_intf_div_clk.clkr.hw },
2132 .num_parents = 1,
2133 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2134 .ops = &clk_branch2_ops,
2135 },
2136 },
2137 };
2138
2139 static struct clk_branch mdss_byte1_clk = {
2140 .halt_reg = 0x2340,
2141 .halt_check = BRANCH_HALT,
2142 .clkr = {
2143 .enable_reg = 0x2340,
2144 .enable_mask = BIT(0),
2145 .hw.init = &(struct clk_init_data){
2146 .name = "mdss_byte1_clk",
2147 .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2148 .num_parents = 1,
2149 .flags = CLK_SET_RATE_PARENT,
2150 .ops = &clk_branch2_ops,
2151 },
2152 },
2153 };
2154
2155 static struct clk_regmap_div mdss_byte1_intf_div_clk = {
2156 .reg = 0x2380,
2157 .shift = 0,
2158 .width = 2,
2159 /*
2160 * NOTE: Op does not work for div-3. Current assumption is that div-3
2161 * is not a recommended setting for this divider.
2162 */
2163 .clkr = {
2164 .hw.init = &(struct clk_init_data){
2165 .name = "mdss_byte1_intf_div_clk",
2166 .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2167 .num_parents = 1,
2168 .ops = &clk_regmap_div_ops,
2169 .flags = CLK_GET_RATE_NOCACHE,
2170 },
2171 },
2172 };
2173
2174 static struct clk_branch mdss_byte1_intf_clk = {
2175 .halt_reg = 0x2378,
2176 .halt_check = BRANCH_HALT,
2177 .clkr = {
2178 .enable_reg = 0x2378,
2179 .enable_mask = BIT(0),
2180 .hw.init = &(struct clk_init_data){
2181 .name = "mdss_byte1_intf_clk",
2182 .parent_hws = (const struct clk_hw *[]){ &mdss_byte1_intf_div_clk.clkr.hw },
2183 .num_parents = 1,
2184 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2185 .ops = &clk_branch2_ops,
2186 },
2187 },
2188 };
2189
2190 static struct clk_branch mdss_dp_aux_clk = {
2191 .halt_reg = 0x2364,
2192 .halt_check = BRANCH_HALT,
2193 .clkr = {
2194 .enable_reg = 0x2364,
2195 .enable_mask = BIT(0),
2196 .hw.init = &(struct clk_init_data){
2197 .name = "mdss_dp_aux_clk",
2198 .parent_hws = (const struct clk_hw *[]){ &dp_aux_clk_src.clkr.hw },
2199 .num_parents = 1,
2200 .flags = CLK_SET_RATE_PARENT,
2201 .ops = &clk_branch2_ops,
2202 },
2203 },
2204 };
2205
2206 static struct clk_branch mdss_dp_crypto_clk = {
2207 .halt_reg = 0x235c,
2208 .halt_check = BRANCH_HALT,
2209 .clkr = {
2210 .enable_reg = 0x235c,
2211 .enable_mask = BIT(0),
2212 .hw.init = &(struct clk_init_data){
2213 .name = "mdss_dp_crypto_clk",
2214 .parent_hws = (const struct clk_hw *[]){ &dp_crypto_clk_src.clkr.hw },
2215 .num_parents = 1,
2216 .flags = CLK_SET_RATE_PARENT,
2217 .ops = &clk_branch2_ops,
2218 },
2219 },
2220 };
2221
2222 static struct clk_branch mdss_dp_gtc_clk = {
2223 .halt_reg = 0x2368,
2224 .halt_check = BRANCH_HALT,
2225 .clkr = {
2226 .enable_reg = 0x2368,
2227 .enable_mask = BIT(0),
2228 .hw.init = &(struct clk_init_data){
2229 .name = "mdss_dp_gtc_clk",
2230 .parent_hws = (const struct clk_hw *[]){ &dp_gtc_clk_src.clkr.hw },
2231 .num_parents = 1,
2232 .flags = CLK_SET_RATE_PARENT,
2233 .ops = &clk_branch2_ops,
2234 },
2235 },
2236 };
2237
2238 static struct clk_branch mdss_dp_link_clk = {
2239 .halt_reg = 0x2354,
2240 .halt_check = BRANCH_HALT,
2241 .clkr = {
2242 .enable_reg = 0x2354,
2243 .enable_mask = BIT(0),
2244 .hw.init = &(struct clk_init_data){
2245 .name = "mdss_dp_link_clk",
2246 .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2247 .num_parents = 1,
2248 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2249 .ops = &clk_branch2_ops,
2250 },
2251 },
2252 };
2253
2254 /* Reset state of MDSS_DP_LINK_INTF_DIV is 0x3 (div-4) */
2255 static struct clk_branch mdss_dp_link_intf_clk = {
2256 .halt_reg = 0x2358,
2257 .halt_check = BRANCH_HALT,
2258 .clkr = {
2259 .enable_reg = 0x2358,
2260 .enable_mask = BIT(0),
2261 .hw.init = &(struct clk_init_data){
2262 .name = "mdss_dp_link_intf_clk",
2263 .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2264 .num_parents = 1,
2265 .ops = &clk_branch2_ops,
2266 },
2267 },
2268 };
2269
2270 static struct clk_branch mdss_dp_pixel_clk = {
2271 .halt_reg = 0x2360,
2272 .halt_check = BRANCH_HALT,
2273 .clkr = {
2274 .enable_reg = 0x2360,
2275 .enable_mask = BIT(0),
2276 .hw.init = &(struct clk_init_data){
2277 .name = "mdss_dp_pixel_clk",
2278 .parent_hws = (const struct clk_hw *[]){ &dp_pixel_clk_src.clkr.hw },
2279 .num_parents = 1,
2280 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2281 .ops = &clk_branch2_ops,
2282 },
2283 },
2284 };
2285
2286 static struct clk_branch mdss_esc0_clk = {
2287 .halt_reg = 0x2344,
2288 .halt_check = BRANCH_HALT,
2289 .clkr = {
2290 .enable_reg = 0x2344,
2291 .enable_mask = BIT(0),
2292 .hw.init = &(struct clk_init_data){
2293 .name = "mdss_esc0_clk",
2294 .parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
2295 .num_parents = 1,
2296 .flags = CLK_SET_RATE_PARENT,
2297 .ops = &clk_branch2_ops,
2298 },
2299 },
2300 };
2301
2302 static struct clk_branch mdss_esc1_clk = {
2303 .halt_reg = 0x2348,
2304 .halt_check = BRANCH_HALT,
2305 .clkr = {
2306 .enable_reg = 0x2348,
2307 .enable_mask = BIT(0),
2308 .hw.init = &(struct clk_init_data){
2309 .name = "mdss_esc1_clk",
2310 .parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
2311 .num_parents = 1,
2312 .flags = CLK_SET_RATE_PARENT,
2313 .ops = &clk_branch2_ops,
2314 },
2315 },
2316 };
2317
2318 static struct clk_branch mdss_hdmi_dp_ahb_clk = {
2319 .halt_reg = 0x230c,
2320 .halt_check = BRANCH_HALT,
2321 .clkr = {
2322 .enable_reg = 0x230c,
2323 .enable_mask = BIT(0),
2324 .hw.init = &(struct clk_init_data){
2325 .name = "mdss_hdmi_dp_ahb_clk",
2326 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2327 .num_parents = 1,
2328 .ops = &clk_branch2_ops,
2329 },
2330 },
2331 };
2332
2333 static struct clk_branch mdss_mdp_clk = {
2334 .halt_reg = 0x231c,
2335 .halt_check = BRANCH_HALT,
2336 .clkr = {
2337 .enable_reg = 0x231c,
2338 .enable_mask = BIT(0),
2339 .hw.init = &(struct clk_init_data){
2340 .name = "mdss_mdp_clk",
2341 .parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
2342 .num_parents = 1,
2343 .flags = CLK_SET_RATE_PARENT,
2344 .ops = &clk_branch2_ops,
2345 },
2346 },
2347 };
2348
2349 static struct clk_branch mdss_pclk0_clk = {
2350 .halt_reg = 0x2314,
2351 .halt_check = BRANCH_HALT,
2352 .clkr = {
2353 .enable_reg = 0x2314,
2354 .enable_mask = BIT(0),
2355 .hw.init = &(struct clk_init_data){
2356 .name = "mdss_pclk0_clk",
2357 .parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
2358 .num_parents = 1,
2359 .flags = CLK_SET_RATE_PARENT,
2360 .ops = &clk_branch2_ops,
2361 },
2362 },
2363 };
2364
2365 static struct clk_branch mdss_pclk1_clk = {
2366 .halt_reg = 0x2318,
2367 .halt_check = BRANCH_HALT,
2368 .clkr = {
2369 .enable_reg = 0x2318,
2370 .enable_mask = BIT(0),
2371 .hw.init = &(struct clk_init_data){
2372 .name = "mdss_pclk1_clk",
2373 .parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
2374 .num_parents = 1,
2375 .flags = CLK_SET_RATE_PARENT,
2376 .ops = &clk_branch2_ops,
2377 },
2378 },
2379 };
2380
2381 static struct clk_branch mdss_rot_clk = {
2382 .halt_reg = 0x2350,
2383 .halt_check = BRANCH_HALT,
2384 .clkr = {
2385 .enable_reg = 0x2350,
2386 .enable_mask = BIT(0),
2387 .hw.init = &(struct clk_init_data){
2388 .name = "mdss_rot_clk",
2389 .parent_hws = (const struct clk_hw *[]){ &rot_clk_src.clkr.hw },
2390 .num_parents = 1,
2391 .flags = CLK_SET_RATE_PARENT,
2392 .ops = &clk_branch2_ops,
2393 },
2394 },
2395 };
2396
2397 static struct clk_branch mdss_vsync_clk = {
2398 .halt_reg = 0x2328,
2399 .halt_check = BRANCH_HALT,
2400 .clkr = {
2401 .enable_reg = 0x2328,
2402 .enable_mask = BIT(0),
2403 .hw.init = &(struct clk_init_data){
2404 .name = "mdss_vsync_clk",
2405 .parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
2406 .num_parents = 1,
2407 .flags = CLK_SET_RATE_PARENT,
2408 .ops = &clk_branch2_ops,
2409 },
2410 },
2411 };
2412
2413 static struct clk_branch mnoc_ahb_clk = {
2414 .halt_reg = 0x5024,
2415 .halt_check = BRANCH_VOTED,
2416 .clkr = {
2417 .enable_reg = 0x5024,
2418 .enable_mask = BIT(0),
2419 .hw.init = &(struct clk_init_data){
2420 .name = "mnoc_ahb_clk",
2421 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2422 .num_parents = 1,
2423 .flags = CLK_SET_RATE_PARENT,
2424 .ops = &clk_branch2_ops,
2425 },
2426 },
2427 };
2428
2429 static struct clk_branch misc_ahb_clk = {
2430 .halt_reg = 0x328,
2431 .halt_check = BRANCH_HALT,
2432 .hwcg_reg = 0x328,
2433 .hwcg_bit = 1,
2434 .clkr = {
2435 .enable_reg = 0x328,
2436 .enable_mask = BIT(0),
2437 .hw.init = &(struct clk_init_data){
2438 .name = "misc_ahb_clk",
2439 /*
2440 * Dependency to be enabled before the branch is
2441 * enabled.
2442 */
2443 .parent_hws = (const struct clk_hw *[]){ &mnoc_ahb_clk.clkr.hw },
2444 .num_parents = 1,
2445 .ops = &clk_branch2_ops,
2446 },
2447 },
2448 };
2449
2450 static struct clk_branch misc_cxo_clk = {
2451 .halt_reg = 0x324,
2452 .halt_check = BRANCH_HALT,
2453 .clkr = {
2454 .enable_reg = 0x324,
2455 .enable_mask = BIT(0),
2456 .hw.init = &(struct clk_init_data){
2457 .name = "misc_cxo_clk",
2458 .parent_data = &(const struct clk_parent_data){
2459 .fw_name = "xo",
2460 },
2461 .num_parents = 1,
2462 .ops = &clk_branch2_ops,
2463 },
2464 },
2465 };
2466
2467 static struct clk_branch snoc_dvm_axi_clk = {
2468 .halt_reg = 0xe040,
2469 .halt_check = BRANCH_HALT,
2470 .clkr = {
2471 .enable_reg = 0xe040,
2472 .enable_mask = BIT(0),
2473 .hw.init = &(struct clk_init_data){
2474 .name = "snoc_dvm_axi_clk",
2475 .ops = &clk_branch2_ops,
2476 },
2477 },
2478 };
2479
2480 static struct clk_branch video_ahb_clk = {
2481 .halt_reg = 0x1030,
2482 .halt_check = BRANCH_HALT,
2483 .hwcg_reg = 0x1030,
2484 .hwcg_bit = 1,
2485 .clkr = {
2486 .enable_reg = 0x1030,
2487 .enable_mask = BIT(0),
2488 .hw.init = &(struct clk_init_data){
2489 .name = "video_ahb_clk",
2490 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2491 .num_parents = 1,
2492 .ops = &clk_branch2_ops,
2493 },
2494 },
2495 };
2496
2497 static struct clk_branch video_axi_clk = {
2498 .halt_reg = 0x1034,
2499 .halt_check = BRANCH_HALT,
2500 .clkr = {
2501 .enable_reg = 0x1034,
2502 .enable_mask = BIT(0),
2503 .hw.init = &(struct clk_init_data){
2504 .name = "video_axi_clk",
2505 .ops = &clk_branch2_ops,
2506 },
2507 },
2508 };
2509
2510 static struct clk_branch throttle_video_axi_clk = {
2511 .halt_reg = 0x118c,
2512 .halt_check = BRANCH_HALT,
2513 .hwcg_reg = 0x118c,
2514 .hwcg_bit = 1,
2515 .clkr = {
2516 .enable_reg = 0x118c,
2517 .enable_mask = BIT(0),
2518 .hw.init = &(struct clk_init_data){
2519 .name = "throttle_video_axi_clk",
2520 .ops = &clk_branch2_ops,
2521 },
2522 },
2523 };
2524
2525 static struct clk_branch video_core_clk = {
2526 .halt_reg = 0x1028,
2527 .halt_check = BRANCH_HALT,
2528 .clkr = {
2529 .enable_reg = 0x1028,
2530 .enable_mask = BIT(0),
2531 .hw.init = &(struct clk_init_data){
2532 .name = "video_core_clk",
2533 .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2534 .num_parents = 1,
2535 .flags = CLK_SET_RATE_PARENT,
2536 .ops = &clk_branch2_ops,
2537 },
2538 },
2539 };
2540
2541 static struct clk_branch video_subcore0_clk = {
2542 .halt_reg = 0x1048,
2543 .halt_check = BRANCH_HALT_SKIP,
2544 .clkr = {
2545 .enable_reg = 0x1048,
2546 .enable_mask = BIT(0),
2547 .hw.init = &(struct clk_init_data){
2548 .name = "video_subcore0_clk",
2549 .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2550 .num_parents = 1,
2551 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2552 .ops = &clk_branch2_ops,
2553 },
2554 },
2555 };
2556
2557 static struct gdsc venus_gdsc = {
2558 .gdscr = 0x1024,
2559 .cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },
2560 .cxc_count = 3,
2561 .pd = {
2562 .name = "venus",
2563 },
2564 .pwrsts = PWRSTS_OFF_ON,
2565 };
2566
2567 static struct gdsc venus_core0_gdsc = {
2568 .gdscr = 0x1040,
2569 .pd = {
2570 .name = "venus_core0",
2571 },
2572 .parent = &venus_gdsc.pd,
2573 .pwrsts = PWRSTS_OFF_ON,
2574 .flags = HW_CTRL,
2575 };
2576
2577 static struct gdsc mdss_gdsc = {
2578 .gdscr = 0x2304,
2579 .pd = {
2580 .name = "mdss",
2581 },
2582 .cxcs = (unsigned int []){ 0x2040 },
2583 .cxc_count = 1,
2584 .pwrsts = PWRSTS_OFF_ON,
2585 };
2586
2587 static struct gdsc camss_top_gdsc = {
2588 .gdscr = 0x34a0,
2589 .pd = {
2590 .name = "camss_top",
2591 },
2592 .pwrsts = PWRSTS_OFF_ON,
2593 };
2594
2595 static struct gdsc camss_vfe0_gdsc = {
2596 .gdscr = 0x3664,
2597 .pd = {
2598 .name = "camss_vfe0",
2599 },
2600 .parent = &camss_top_gdsc.pd,
2601 .pwrsts = PWRSTS_OFF_ON,
2602 };
2603
2604 static struct gdsc camss_vfe1_gdsc = {
2605 .gdscr = 0x3674,
2606 .pd = {
2607 .name = "camss_vfe1_gdsc",
2608 },
2609 .parent = &camss_top_gdsc.pd,
2610 .pwrsts = PWRSTS_OFF_ON,
2611 };
2612
2613 static struct gdsc camss_cpp_gdsc = {
2614 .gdscr = 0x36d4,
2615 .pd = {
2616 .name = "camss_cpp",
2617 },
2618 .parent = &camss_top_gdsc.pd,
2619 .pwrsts = PWRSTS_OFF_ON,
2620 };
2621
2622 /* This GDSC seems to hang the whole multimedia subsystem.
2623 static struct gdsc bimc_smmu_gdsc = {
2624 .gdscr = 0xe020,
2625 .gds_hw_ctrl = 0xe024,
2626 .pd = {
2627 .name = "bimc_smmu",
2628 },
2629 .pwrsts = PWRSTS_OFF_ON,
2630 .parent = &bimc_smmu_gdsc.pd,
2631 .flags = HW_CTRL,
2632 };
2633 */
2634
2635 static struct clk_regmap *mmcc_660_clocks[] = {
2636 [AHB_CLK_SRC] = &ahb_clk_src.clkr,
2637 [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2638 [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
2639 [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2640 [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2641 [CCI_CLK_SRC] = &cci_clk_src.clkr,
2642 [CPP_CLK_SRC] = &cpp_clk_src.clkr,
2643 [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2644 [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2645 [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2646 [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
2647 [CSI2_CLK_SRC] = &csi2_clk_src.clkr,
2648 [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
2649 [CSI3_CLK_SRC] = &csi3_clk_src.clkr,
2650 [CSIPHY_CLK_SRC] = &csiphy_clk_src.clkr,
2651 [DP_AUX_CLK_SRC] = &dp_aux_clk_src.clkr,
2652 [DP_CRYPTO_CLK_SRC] = &dp_crypto_clk_src.clkr,
2653 [DP_GTC_CLK_SRC] = &dp_gtc_clk_src.clkr,
2654 [DP_LINK_CLK_SRC] = &dp_link_clk_src.clkr,
2655 [DP_PIXEL_CLK_SRC] = &dp_pixel_clk_src.clkr,
2656 [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2657 [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
2658 [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
2659 [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2660 [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2661 [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
2662 [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
2663 [MDP_CLK_SRC] = &mdp_clk_src.clkr,
2664 [MMPLL0_PLL] = &mmpll0.clkr,
2665 [MMPLL10_PLL] = &mmpll10.clkr,
2666 [MMPLL3_PLL] = &mmpll3.clkr,
2667 [MMPLL4_PLL] = &mmpll4.clkr,
2668 [MMPLL5_PLL] = &mmpll5.clkr,
2669 [MMPLL6_PLL] = &mmpll6.clkr,
2670 [MMPLL7_PLL] = &mmpll7.clkr,
2671 [MMPLL8_PLL] = &mmpll8.clkr,
2672 [BIMC_SMMU_AHB_CLK] = &bimc_smmu_ahb_clk.clkr,
2673 [BIMC_SMMU_AXI_CLK] = &bimc_smmu_axi_clk.clkr,
2674 [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
2675 [CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,
2676 [CAMSS_CCI_CLK] = &camss_cci_clk.clkr,
2677 [CAMSS_CPHY_CSID0_CLK] = &camss_cphy_csid0_clk.clkr,
2678 [CAMSS_CPHY_CSID1_CLK] = &camss_cphy_csid1_clk.clkr,
2679 [CAMSS_CPHY_CSID2_CLK] = &camss_cphy_csid2_clk.clkr,
2680 [CAMSS_CPHY_CSID3_CLK] = &camss_cphy_csid3_clk.clkr,
2681 [CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,
2682 [CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,
2683 [CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,
2684 [CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,
2685 [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
2686 [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
2687 [CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,
2688 [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
2689 [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
2690 [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
2691 [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
2692 [CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,
2693 [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
2694 [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
2695 [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
2696 [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
2697 [CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,
2698 [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
2699 [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
2700 [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
2701 [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
2702 [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
2703 [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
2704 [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
2705 [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
2706 [CAMSS_CSIPHY0_CLK] = &camss_csiphy0_clk.clkr,
2707 [CAMSS_CSIPHY1_CLK] = &camss_csiphy1_clk.clkr,
2708 [CAMSS_CSIPHY2_CLK] = &camss_csiphy2_clk.clkr,
2709 [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
2710 [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
2711 [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
2712 [CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,
2713 [CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,
2714 [CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,
2715 [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
2716 [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
2717 [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
2718 [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
2719 [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
2720 [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
2721 [CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,
2722 [CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,
2723 [CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,
2724 [CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,
2725 [CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,
2726 [CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,
2727 [CAMSS_VFE_VBIF_AHB_CLK] = &camss_vfe_vbif_ahb_clk.clkr,
2728 [CAMSS_VFE_VBIF_AXI_CLK] = &camss_vfe_vbif_axi_clk.clkr,
2729 [CSIPHY_AHB2CRIF_CLK] = &csiphy_ahb2crif_clk.clkr,
2730 [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
2731 [MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
2732 [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
2733 [MDSS_BYTE0_INTF_CLK] = &mdss_byte0_intf_clk.clkr,
2734 [MDSS_BYTE0_INTF_DIV_CLK] = &mdss_byte0_intf_div_clk.clkr,
2735 [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
2736 [MDSS_BYTE1_INTF_CLK] = &mdss_byte1_intf_clk.clkr,
2737 [MDSS_DP_AUX_CLK] = &mdss_dp_aux_clk.clkr,
2738 [MDSS_DP_CRYPTO_CLK] = &mdss_dp_crypto_clk.clkr,
2739 [MDSS_DP_GTC_CLK] = &mdss_dp_gtc_clk.clkr,
2740 [MDSS_DP_LINK_CLK] = &mdss_dp_link_clk.clkr,
2741 [MDSS_DP_LINK_INTF_CLK] = &mdss_dp_link_intf_clk.clkr,
2742 [MDSS_DP_PIXEL_CLK] = &mdss_dp_pixel_clk.clkr,
2743 [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
2744 [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
2745 [MDSS_HDMI_DP_AHB_CLK] = &mdss_hdmi_dp_ahb_clk.clkr,
2746 [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
2747 [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
2748 [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
2749 [MDSS_ROT_CLK] = &mdss_rot_clk.clkr,
2750 [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
2751 [MISC_AHB_CLK] = &misc_ahb_clk.clkr,
2752 [MISC_CXO_CLK] = &misc_cxo_clk.clkr,
2753 [MNOC_AHB_CLK] = &mnoc_ahb_clk.clkr,
2754 [SNOC_DVM_AXI_CLK] = &snoc_dvm_axi_clk.clkr,
2755 [THROTTLE_CAMSS_AXI_CLK] = &throttle_camss_axi_clk.clkr,
2756 [THROTTLE_MDSS_AXI_CLK] = &throttle_mdss_axi_clk.clkr,
2757 [THROTTLE_VIDEO_AXI_CLK] = &throttle_video_axi_clk.clkr,
2758 [VIDEO_AHB_CLK] = &video_ahb_clk.clkr,
2759 [VIDEO_AXI_CLK] = &video_axi_clk.clkr,
2760 [VIDEO_CORE_CLK] = &video_core_clk.clkr,
2761 [VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,
2762 [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2763 [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
2764 [ROT_CLK_SRC] = &rot_clk_src.clkr,
2765 [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2766 [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
2767 [VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,
2768 [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2769 [MDSS_BYTE1_INTF_DIV_CLK] = &mdss_byte1_intf_div_clk.clkr,
2770 [AXI_CLK_SRC] = &axi_clk_src.clkr,
2771 };
2772
2773 static struct gdsc *mmcc_sdm660_gdscs[] = {
2774 [VENUS_GDSC] = &venus_gdsc,
2775 [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2776 [MDSS_GDSC] = &mdss_gdsc,
2777 [CAMSS_TOP_GDSC] = &camss_top_gdsc,
2778 [CAMSS_VFE0_GDSC] = &camss_vfe0_gdsc,
2779 [CAMSS_VFE1_GDSC] = &camss_vfe1_gdsc,
2780 [CAMSS_CPP_GDSC] = &camss_cpp_gdsc,
2781 };
2782
2783 static const struct qcom_reset_map mmcc_660_resets[] = {
2784 [CAMSS_MICRO_BCR] = { 0x3490 },
2785 };
2786
2787 static const struct regmap_config mmcc_660_regmap_config = {
2788 .reg_bits = 32,
2789 .reg_stride = 4,
2790 .val_bits = 32,
2791 .max_register = 0x40000,
2792 .fast_io = true,
2793 };
2794
2795 static const struct qcom_cc_desc mmcc_660_desc = {
2796 .config = &mmcc_660_regmap_config,
2797 .clks = mmcc_660_clocks,
2798 .num_clks = ARRAY_SIZE(mmcc_660_clocks),
2799 .resets = mmcc_660_resets,
2800 .num_resets = ARRAY_SIZE(mmcc_660_resets),
2801 .gdscs = mmcc_sdm660_gdscs,
2802 .num_gdscs = ARRAY_SIZE(mmcc_sdm660_gdscs),
2803 };
2804
2805 static const struct of_device_id mmcc_660_match_table[] = {
2806 { .compatible = "qcom,mmcc-sdm660" },
2807 { .compatible = "qcom,mmcc-sdm630", .data = (void *)1UL },
2808 { }
2809 };
2810 MODULE_DEVICE_TABLE(of, mmcc_660_match_table);
2811
sdm630_clock_override(void)2812 static void sdm630_clock_override(void)
2813 {
2814 /* SDM630 has only one DSI */
2815 mmcc_660_desc.clks[BYTE1_CLK_SRC] = NULL;
2816 mmcc_660_desc.clks[MDSS_BYTE1_CLK] = NULL;
2817 mmcc_660_desc.clks[MDSS_BYTE1_INTF_DIV_CLK] = NULL;
2818 mmcc_660_desc.clks[MDSS_BYTE1_INTF_CLK] = NULL;
2819 mmcc_660_desc.clks[ESC1_CLK_SRC] = NULL;
2820 mmcc_660_desc.clks[MDSS_ESC1_CLK] = NULL;
2821 mmcc_660_desc.clks[PCLK1_CLK_SRC] = NULL;
2822 mmcc_660_desc.clks[MDSS_PCLK1_CLK] = NULL;
2823 }
2824
mmcc_660_probe(struct platform_device * pdev)2825 static int mmcc_660_probe(struct platform_device *pdev)
2826 {
2827 struct regmap *regmap;
2828 bool is_sdm630;
2829
2830 is_sdm630 = !!device_get_match_data(&pdev->dev);
2831
2832 regmap = qcom_cc_map(pdev, &mmcc_660_desc);
2833 if (IS_ERR(regmap))
2834 return PTR_ERR(regmap);
2835
2836 if (is_sdm630)
2837 sdm630_clock_override();
2838
2839 clk_alpha_pll_configure(&mmpll3, regmap, &mmpll3_config);
2840 clk_alpha_pll_configure(&mmpll4, regmap, &mmpll4_config);
2841 clk_alpha_pll_configure(&mmpll5, regmap, &mmpll5_config);
2842 clk_alpha_pll_configure(&mmpll7, regmap, &mmpll7_config);
2843 clk_alpha_pll_configure(&mmpll8, regmap, &mmpll8_config);
2844 clk_alpha_pll_configure(&mmpll10, regmap, &mmpll10_config);
2845
2846 return qcom_cc_really_probe(&pdev->dev, &mmcc_660_desc, regmap);
2847 }
2848
2849 static struct platform_driver mmcc_660_driver = {
2850 .probe = mmcc_660_probe,
2851 .driver = {
2852 .name = "mmcc-sdm660",
2853 .of_match_table = mmcc_660_match_table,
2854 },
2855 };
2856 module_platform_driver(mmcc_660_driver);
2857
2858 MODULE_DESCRIPTION("Qualcomm SDM630/SDM660 MMCC driver");
2859 MODULE_LICENSE("GPL v2");
2860