1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
4 */
5
6 #include <linux/kernel.h>
7 #include <linux/bitops.h>
8 #include <linux/err.h>
9 #include <linux/delay.h>
10 #include <linux/platform_device.h>
11 #include <linux/module.h>
12 #include <linux/clk.h>
13 #include <linux/clk-provider.h>
14 #include <linux/regmap.h>
15
16 #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
17 #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
18
19 #include "common.h"
20 #include "clk-regmap.h"
21 #include "clk-pll.h"
22 #include "clk-rcg.h"
23 #include "clk-branch.h"
24 #include "reset.h"
25
26 enum {
27 P_PXO,
28 P_PLL8,
29 P_PLL2,
30 P_PLL3,
31 P_PLL15,
32 P_HDMI_PLL,
33 P_DSI1_PLL_DSICLK,
34 P_DSI2_PLL_DSICLK,
35 P_DSI1_PLL_BYTECLK,
36 P_DSI2_PLL_BYTECLK,
37 P_LVDS_PLL,
38 };
39
40 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
41
42 static struct clk_pll pll2 = {
43 .l_reg = 0x320,
44 .m_reg = 0x324,
45 .n_reg = 0x328,
46 .config_reg = 0x32c,
47 .mode_reg = 0x31c,
48 .status_reg = 0x334,
49 .status_bit = 16,
50 .clkr.hw.init = &(struct clk_init_data){
51 .name = "pll2",
52 .parent_data = (const struct clk_parent_data[]){
53 { .fw_name = "pxo", .name = "pxo_board" },
54 },
55 .num_parents = 1,
56 .ops = &clk_pll_ops,
57 },
58 };
59
60 static struct clk_pll pll15 = {
61 .l_reg = 0x33c,
62 .m_reg = 0x340,
63 .n_reg = 0x344,
64 .config_reg = 0x348,
65 .mode_reg = 0x338,
66 .status_reg = 0x350,
67 .status_bit = 16,
68 .clkr.hw.init = &(struct clk_init_data){
69 .name = "pll15",
70 .parent_data = (const struct clk_parent_data[]){
71 { .fw_name = "pxo", .name = "pxo_board" },
72 },
73 .num_parents = 1,
74 .ops = &clk_pll_ops,
75 },
76 };
77
78 static const struct pll_config pll15_config = {
79 .l = 33,
80 .m = 1,
81 .n = 3,
82 .vco_val = 0x2 << 16,
83 .vco_mask = 0x3 << 16,
84 .pre_div_val = 0x0,
85 .pre_div_mask = BIT(19),
86 .post_div_val = 0x0,
87 .post_div_mask = 0x3 << 20,
88 .mn_ena_mask = BIT(22),
89 .main_output_mask = BIT(23),
90 };
91
92 static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
93 { P_PXO, 0 },
94 { P_PLL8, 2 },
95 { P_PLL2, 1 }
96 };
97
98 static const struct clk_parent_data mmcc_pxo_pll8_pll2[] = {
99 { .fw_name = "pxo", .name = "pxo_board" },
100 { .fw_name = "pll8_vote", .name = "pll8_vote" },
101 { .hw = &pll2.clkr.hw },
102 };
103
104 static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
105 { P_PXO, 0 },
106 { P_PLL8, 2 },
107 { P_PLL2, 1 },
108 { P_PLL3, 3 }
109 };
110
111 static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll15[] = {
112 { .fw_name = "pxo", .name = "pxo_board" },
113 { .fw_name = "pll8_vote", .name = "pll8_vote" },
114 { .hw = &pll2.clkr.hw },
115 { .hw = &pll15.clkr.hw },
116 };
117
118 static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
119 { P_PXO, 0 },
120 { P_PLL8, 2 },
121 { P_PLL2, 1 },
122 { P_PLL15, 3 }
123 };
124
125 static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll3[] = {
126 { .fw_name = "pxo", .name = "pxo_board" },
127 { .fw_name = "pll8_vote", .name = "pll8_vote" },
128 { .hw = &pll2.clkr.hw },
129 { .fw_name = "pll3", .name = "pll3" },
130 };
131
132 static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = {
133 { P_PXO, 0 },
134 { P_DSI2_PLL_DSICLK, 1 },
135 { P_DSI1_PLL_DSICLK, 3 },
136 };
137
138 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1[] = {
139 { .fw_name = "pxo", .name = "pxo_board" },
140 { .fw_name = "dsi2pll", .name = "dsi2pll" },
141 { .fw_name = "dsi1pll", .name = "dsi1pll" },
142 };
143
144 static const struct parent_map mmcc_pxo_dsi2_dsi1_lvds_map[] = {
145 { P_PXO, 0 },
146 { P_DSI2_PLL_DSICLK, 1 },
147 { P_LVDS_PLL, 2 },
148 { P_DSI1_PLL_DSICLK, 3 },
149 };
150
151 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1_lvds[] = {
152 { .fw_name = "pxo", .name = "pxo_board" },
153 { .fw_name = "dsi2pll", .name = "dsi2pll" },
154 { .fw_name = "lvdspll", .name = "mpd4_lvds_pll" },
155 { .fw_name = "dsi1pll", .name = "dsi1pll" },
156 };
157
158 static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = {
159 { P_PXO, 0 },
160 { P_DSI1_PLL_BYTECLK, 1 },
161 { P_DSI2_PLL_BYTECLK, 2 },
162 };
163
164 static const struct clk_parent_data mmcc_pxo_dsi1_dsi2_byte[] = {
165 { .fw_name = "pxo", .name = "pxo_board" },
166 { .fw_name = "dsi1pllbyte", .name = "dsi1pllbyte" },
167 { .fw_name = "dsi2pllbyte", .name = "dsi2pllbyte" },
168 };
169
170 static const struct freq_tbl clk_tbl_cam[] = {
171 { 6000000, P_PLL8, 4, 1, 16 },
172 { 8000000, P_PLL8, 4, 1, 12 },
173 { 12000000, P_PLL8, 4, 1, 8 },
174 { 16000000, P_PLL8, 4, 1, 6 },
175 { 19200000, P_PLL8, 4, 1, 5 },
176 { 24000000, P_PLL8, 4, 1, 4 },
177 { 32000000, P_PLL8, 4, 1, 3 },
178 { 48000000, P_PLL8, 4, 1, 2 },
179 { 64000000, P_PLL8, 3, 1, 2 },
180 { 96000000, P_PLL8, 4, 0, 0 },
181 { 128000000, P_PLL8, 3, 0, 0 },
182 { }
183 };
184
185 static struct clk_rcg camclk0_src = {
186 .ns_reg = 0x0148,
187 .md_reg = 0x0144,
188 .mn = {
189 .mnctr_en_bit = 5,
190 .mnctr_reset_bit = 8,
191 .reset_in_cc = true,
192 .mnctr_mode_shift = 6,
193 .n_val_shift = 24,
194 .m_val_shift = 8,
195 .width = 8,
196 },
197 .p = {
198 .pre_div_shift = 14,
199 .pre_div_width = 2,
200 },
201 .s = {
202 .src_sel_shift = 0,
203 .parent_map = mmcc_pxo_pll8_pll2_map,
204 },
205 .freq_tbl = clk_tbl_cam,
206 .clkr = {
207 .enable_reg = 0x0140,
208 .enable_mask = BIT(2),
209 .hw.init = &(struct clk_init_data){
210 .name = "camclk0_src",
211 .parent_data = mmcc_pxo_pll8_pll2,
212 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
213 .ops = &clk_rcg_ops,
214 },
215 },
216 };
217
218 static struct clk_branch camclk0_clk = {
219 .halt_reg = 0x01e8,
220 .halt_bit = 15,
221 .clkr = {
222 .enable_reg = 0x0140,
223 .enable_mask = BIT(0),
224 .hw.init = &(struct clk_init_data){
225 .name = "camclk0_clk",
226 .parent_hws = (const struct clk_hw*[]){
227 &camclk0_src.clkr.hw
228 },
229 .num_parents = 1,
230 .ops = &clk_branch_ops,
231 },
232 },
233
234 };
235
236 static struct clk_rcg camclk1_src = {
237 .ns_reg = 0x015c,
238 .md_reg = 0x0158,
239 .mn = {
240 .mnctr_en_bit = 5,
241 .mnctr_reset_bit = 8,
242 .reset_in_cc = true,
243 .mnctr_mode_shift = 6,
244 .n_val_shift = 24,
245 .m_val_shift = 8,
246 .width = 8,
247 },
248 .p = {
249 .pre_div_shift = 14,
250 .pre_div_width = 2,
251 },
252 .s = {
253 .src_sel_shift = 0,
254 .parent_map = mmcc_pxo_pll8_pll2_map,
255 },
256 .freq_tbl = clk_tbl_cam,
257 .clkr = {
258 .enable_reg = 0x0154,
259 .enable_mask = BIT(2),
260 .hw.init = &(struct clk_init_data){
261 .name = "camclk1_src",
262 .parent_data = mmcc_pxo_pll8_pll2,
263 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
264 .ops = &clk_rcg_ops,
265 },
266 },
267 };
268
269 static struct clk_branch camclk1_clk = {
270 .halt_reg = 0x01e8,
271 .halt_bit = 16,
272 .clkr = {
273 .enable_reg = 0x0154,
274 .enable_mask = BIT(0),
275 .hw.init = &(struct clk_init_data){
276 .name = "camclk1_clk",
277 .parent_hws = (const struct clk_hw*[]){
278 &camclk1_src.clkr.hw
279 },
280 .num_parents = 1,
281 .ops = &clk_branch_ops,
282 },
283 },
284
285 };
286
287 static struct clk_rcg camclk2_src = {
288 .ns_reg = 0x0228,
289 .md_reg = 0x0224,
290 .mn = {
291 .mnctr_en_bit = 5,
292 .mnctr_reset_bit = 8,
293 .reset_in_cc = true,
294 .mnctr_mode_shift = 6,
295 .n_val_shift = 24,
296 .m_val_shift = 8,
297 .width = 8,
298 },
299 .p = {
300 .pre_div_shift = 14,
301 .pre_div_width = 2,
302 },
303 .s = {
304 .src_sel_shift = 0,
305 .parent_map = mmcc_pxo_pll8_pll2_map,
306 },
307 .freq_tbl = clk_tbl_cam,
308 .clkr = {
309 .enable_reg = 0x0220,
310 .enable_mask = BIT(2),
311 .hw.init = &(struct clk_init_data){
312 .name = "camclk2_src",
313 .parent_data = mmcc_pxo_pll8_pll2,
314 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
315 .ops = &clk_rcg_ops,
316 },
317 },
318 };
319
320 static struct clk_branch camclk2_clk = {
321 .halt_reg = 0x01e8,
322 .halt_bit = 16,
323 .clkr = {
324 .enable_reg = 0x0220,
325 .enable_mask = BIT(0),
326 .hw.init = &(struct clk_init_data){
327 .name = "camclk2_clk",
328 .parent_hws = (const struct clk_hw*[]){
329 &camclk2_src.clkr.hw
330 },
331 .num_parents = 1,
332 .ops = &clk_branch_ops,
333 },
334 },
335
336 };
337
338 static const struct freq_tbl clk_tbl_csi[] = {
339 { 27000000, P_PXO, 1, 0, 0 },
340 { 85330000, P_PLL8, 1, 2, 9 },
341 { 177780000, P_PLL2, 1, 2, 9 },
342 { }
343 };
344
345 static struct clk_rcg csi0_src = {
346 .ns_reg = 0x0048,
347 .md_reg = 0x0044,
348 .mn = {
349 .mnctr_en_bit = 5,
350 .mnctr_reset_bit = 7,
351 .mnctr_mode_shift = 6,
352 .n_val_shift = 24,
353 .m_val_shift = 8,
354 .width = 8,
355 },
356 .p = {
357 .pre_div_shift = 14,
358 .pre_div_width = 2,
359 },
360 .s = {
361 .src_sel_shift = 0,
362 .parent_map = mmcc_pxo_pll8_pll2_map,
363 },
364 .freq_tbl = clk_tbl_csi,
365 .clkr = {
366 .enable_reg = 0x0040,
367 .enable_mask = BIT(2),
368 .hw.init = &(struct clk_init_data){
369 .name = "csi0_src",
370 .parent_data = mmcc_pxo_pll8_pll2,
371 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
372 .ops = &clk_rcg_ops,
373 },
374 },
375 };
376
377 static struct clk_branch csi0_clk = {
378 .halt_reg = 0x01cc,
379 .halt_bit = 13,
380 .clkr = {
381 .enable_reg = 0x0040,
382 .enable_mask = BIT(0),
383 .hw.init = &(struct clk_init_data){
384 .parent_hws = (const struct clk_hw*[]){
385 &csi0_src.clkr.hw
386 },
387 .num_parents = 1,
388 .name = "csi0_clk",
389 .ops = &clk_branch_ops,
390 .flags = CLK_SET_RATE_PARENT,
391 },
392 },
393 };
394
395 static struct clk_branch csi0_phy_clk = {
396 .halt_reg = 0x01e8,
397 .halt_bit = 9,
398 .clkr = {
399 .enable_reg = 0x0040,
400 .enable_mask = BIT(8),
401 .hw.init = &(struct clk_init_data){
402 .parent_hws = (const struct clk_hw*[]){
403 &csi0_src.clkr.hw
404 },
405 .num_parents = 1,
406 .name = "csi0_phy_clk",
407 .ops = &clk_branch_ops,
408 .flags = CLK_SET_RATE_PARENT,
409 },
410 },
411 };
412
413 static struct clk_rcg csi1_src = {
414 .ns_reg = 0x0010,
415 .md_reg = 0x0028,
416 .mn = {
417 .mnctr_en_bit = 5,
418 .mnctr_reset_bit = 7,
419 .mnctr_mode_shift = 6,
420 .n_val_shift = 24,
421 .m_val_shift = 8,
422 .width = 8,
423 },
424 .p = {
425 .pre_div_shift = 14,
426 .pre_div_width = 2,
427 },
428 .s = {
429 .src_sel_shift = 0,
430 .parent_map = mmcc_pxo_pll8_pll2_map,
431 },
432 .freq_tbl = clk_tbl_csi,
433 .clkr = {
434 .enable_reg = 0x0024,
435 .enable_mask = BIT(2),
436 .hw.init = &(struct clk_init_data){
437 .name = "csi1_src",
438 .parent_data = mmcc_pxo_pll8_pll2,
439 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
440 .ops = &clk_rcg_ops,
441 },
442 },
443 };
444
445 static struct clk_branch csi1_clk = {
446 .halt_reg = 0x01cc,
447 .halt_bit = 14,
448 .clkr = {
449 .enable_reg = 0x0024,
450 .enable_mask = BIT(0),
451 .hw.init = &(struct clk_init_data){
452 .parent_hws = (const struct clk_hw*[]){
453 &csi1_src.clkr.hw
454 },
455 .num_parents = 1,
456 .name = "csi1_clk",
457 .ops = &clk_branch_ops,
458 .flags = CLK_SET_RATE_PARENT,
459 },
460 },
461 };
462
463 static struct clk_branch csi1_phy_clk = {
464 .halt_reg = 0x01e8,
465 .halt_bit = 10,
466 .clkr = {
467 .enable_reg = 0x0024,
468 .enable_mask = BIT(8),
469 .hw.init = &(struct clk_init_data){
470 .parent_hws = (const struct clk_hw*[]){
471 &csi1_src.clkr.hw
472 },
473 .num_parents = 1,
474 .name = "csi1_phy_clk",
475 .ops = &clk_branch_ops,
476 .flags = CLK_SET_RATE_PARENT,
477 },
478 },
479 };
480
481 static struct clk_rcg csi2_src = {
482 .ns_reg = 0x0234,
483 .md_reg = 0x022c,
484 .mn = {
485 .mnctr_en_bit = 5,
486 .mnctr_reset_bit = 7,
487 .mnctr_mode_shift = 6,
488 .n_val_shift = 24,
489 .m_val_shift = 8,
490 .width = 8,
491 },
492 .p = {
493 .pre_div_shift = 14,
494 .pre_div_width = 2,
495 },
496 .s = {
497 .src_sel_shift = 0,
498 .parent_map = mmcc_pxo_pll8_pll2_map,
499 },
500 .freq_tbl = clk_tbl_csi,
501 .clkr = {
502 .enable_reg = 0x022c,
503 .enable_mask = BIT(2),
504 .hw.init = &(struct clk_init_data){
505 .name = "csi2_src",
506 .parent_data = mmcc_pxo_pll8_pll2,
507 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
508 .ops = &clk_rcg_ops,
509 },
510 },
511 };
512
513 static struct clk_branch csi2_clk = {
514 .halt_reg = 0x01cc,
515 .halt_bit = 29,
516 .clkr = {
517 .enable_reg = 0x022c,
518 .enable_mask = BIT(0),
519 .hw.init = &(struct clk_init_data){
520 .parent_hws = (const struct clk_hw*[]){
521 &csi2_src.clkr.hw
522 },
523 .num_parents = 1,
524 .name = "csi2_clk",
525 .ops = &clk_branch_ops,
526 .flags = CLK_SET_RATE_PARENT,
527 },
528 },
529 };
530
531 static struct clk_branch csi2_phy_clk = {
532 .halt_reg = 0x01e8,
533 .halt_bit = 29,
534 .clkr = {
535 .enable_reg = 0x022c,
536 .enable_mask = BIT(8),
537 .hw.init = &(struct clk_init_data){
538 .parent_hws = (const struct clk_hw*[]){
539 &csi2_src.clkr.hw
540 },
541 .num_parents = 1,
542 .name = "csi2_phy_clk",
543 .ops = &clk_branch_ops,
544 .flags = CLK_SET_RATE_PARENT,
545 },
546 },
547 };
548
549 struct clk_pix_rdi {
550 u32 s_reg;
551 u32 s_mask;
552 u32 s2_reg;
553 u32 s2_mask;
554 struct clk_regmap clkr;
555 };
556
557 #define to_clk_pix_rdi(_hw) \
558 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
559
pix_rdi_set_parent(struct clk_hw * hw,u8 index)560 static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
561 {
562 int i;
563 int ret = 0;
564 u32 val;
565 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
566 int num_parents = clk_hw_get_num_parents(hw);
567
568 /*
569 * These clocks select three inputs via two muxes. One mux selects
570 * between csi0 and csi1 and the second mux selects between that mux's
571 * output and csi2. The source and destination selections for each
572 * mux must be clocking for the switch to succeed so just turn on
573 * all three sources because it's easier than figuring out what source
574 * needs to be on at what time.
575 */
576 for (i = 0; i < num_parents; i++) {
577 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
578 ret = clk_prepare_enable(p->clk);
579 if (ret)
580 goto err;
581 }
582
583 if (index == 2)
584 val = rdi->s2_mask;
585 else
586 val = 0;
587 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
588 /*
589 * Wait at least 6 cycles of slowest clock
590 * for the glitch-free MUX to fully switch sources.
591 */
592 udelay(1);
593
594 if (index == 1)
595 val = rdi->s_mask;
596 else
597 val = 0;
598 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
599 /*
600 * Wait at least 6 cycles of slowest clock
601 * for the glitch-free MUX to fully switch sources.
602 */
603 udelay(1);
604
605 err:
606 for (i--; i >= 0; i--) {
607 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
608 clk_disable_unprepare(p->clk);
609 }
610
611 return ret;
612 }
613
pix_rdi_get_parent(struct clk_hw * hw)614 static u8 pix_rdi_get_parent(struct clk_hw *hw)
615 {
616 u32 val;
617 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
618
619
620 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
621 if (val & rdi->s2_mask)
622 return 2;
623
624 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
625 if (val & rdi->s_mask)
626 return 1;
627
628 return 0;
629 }
630
631 static const struct clk_ops clk_ops_pix_rdi = {
632 .enable = clk_enable_regmap,
633 .disable = clk_disable_regmap,
634 .set_parent = pix_rdi_set_parent,
635 .get_parent = pix_rdi_get_parent,
636 .determine_rate = __clk_mux_determine_rate,
637 };
638
639 static const struct clk_hw *pix_rdi_parents[] = {
640 &csi0_clk.clkr.hw,
641 &csi1_clk.clkr.hw,
642 &csi2_clk.clkr.hw,
643 };
644
645 static struct clk_pix_rdi csi_pix_clk = {
646 .s_reg = 0x0058,
647 .s_mask = BIT(25),
648 .s2_reg = 0x0238,
649 .s2_mask = BIT(13),
650 .clkr = {
651 .enable_reg = 0x0058,
652 .enable_mask = BIT(26),
653 .hw.init = &(struct clk_init_data){
654 .name = "csi_pix_clk",
655 .parent_hws = pix_rdi_parents,
656 .num_parents = ARRAY_SIZE(pix_rdi_parents),
657 .ops = &clk_ops_pix_rdi,
658 },
659 },
660 };
661
662 static struct clk_pix_rdi csi_pix1_clk = {
663 .s_reg = 0x0238,
664 .s_mask = BIT(8),
665 .s2_reg = 0x0238,
666 .s2_mask = BIT(9),
667 .clkr = {
668 .enable_reg = 0x0238,
669 .enable_mask = BIT(10),
670 .hw.init = &(struct clk_init_data){
671 .name = "csi_pix1_clk",
672 .parent_hws = pix_rdi_parents,
673 .num_parents = ARRAY_SIZE(pix_rdi_parents),
674 .ops = &clk_ops_pix_rdi,
675 },
676 },
677 };
678
679 static struct clk_pix_rdi csi_rdi_clk = {
680 .s_reg = 0x0058,
681 .s_mask = BIT(12),
682 .s2_reg = 0x0238,
683 .s2_mask = BIT(12),
684 .clkr = {
685 .enable_reg = 0x0058,
686 .enable_mask = BIT(13),
687 .hw.init = &(struct clk_init_data){
688 .name = "csi_rdi_clk",
689 .parent_hws = pix_rdi_parents,
690 .num_parents = ARRAY_SIZE(pix_rdi_parents),
691 .ops = &clk_ops_pix_rdi,
692 },
693 },
694 };
695
696 static struct clk_pix_rdi csi_rdi1_clk = {
697 .s_reg = 0x0238,
698 .s_mask = BIT(0),
699 .s2_reg = 0x0238,
700 .s2_mask = BIT(1),
701 .clkr = {
702 .enable_reg = 0x0238,
703 .enable_mask = BIT(2),
704 .hw.init = &(struct clk_init_data){
705 .name = "csi_rdi1_clk",
706 .parent_hws = pix_rdi_parents,
707 .num_parents = ARRAY_SIZE(pix_rdi_parents),
708 .ops = &clk_ops_pix_rdi,
709 },
710 },
711 };
712
713 static struct clk_pix_rdi csi_rdi2_clk = {
714 .s_reg = 0x0238,
715 .s_mask = BIT(4),
716 .s2_reg = 0x0238,
717 .s2_mask = BIT(5),
718 .clkr = {
719 .enable_reg = 0x0238,
720 .enable_mask = BIT(6),
721 .hw.init = &(struct clk_init_data){
722 .name = "csi_rdi2_clk",
723 .parent_hws = pix_rdi_parents,
724 .num_parents = ARRAY_SIZE(pix_rdi_parents),
725 .ops = &clk_ops_pix_rdi,
726 },
727 },
728 };
729
730 static const struct freq_tbl clk_tbl_csiphytimer[] = {
731 { 85330000, P_PLL8, 1, 2, 9 },
732 { 177780000, P_PLL2, 1, 2, 9 },
733 { }
734 };
735
736 static struct clk_rcg csiphytimer_src = {
737 .ns_reg = 0x0168,
738 .md_reg = 0x0164,
739 .mn = {
740 .mnctr_en_bit = 5,
741 .mnctr_reset_bit = 8,
742 .reset_in_cc = true,
743 .mnctr_mode_shift = 6,
744 .n_val_shift = 24,
745 .m_val_shift = 8,
746 .width = 8,
747 },
748 .p = {
749 .pre_div_shift = 14,
750 .pre_div_width = 2,
751 },
752 .s = {
753 .src_sel_shift = 0,
754 .parent_map = mmcc_pxo_pll8_pll2_map,
755 },
756 .freq_tbl = clk_tbl_csiphytimer,
757 .clkr = {
758 .enable_reg = 0x0160,
759 .enable_mask = BIT(2),
760 .hw.init = &(struct clk_init_data){
761 .name = "csiphytimer_src",
762 .parent_data = mmcc_pxo_pll8_pll2,
763 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
764 .ops = &clk_rcg_ops,
765 },
766 },
767 };
768
769 static struct clk_branch csiphy0_timer_clk = {
770 .halt_reg = 0x01e8,
771 .halt_bit = 17,
772 .clkr = {
773 .enable_reg = 0x0160,
774 .enable_mask = BIT(0),
775 .hw.init = &(struct clk_init_data){
776 .parent_hws = (const struct clk_hw*[]){
777 &csiphytimer_src.clkr.hw,
778 },
779 .num_parents = 1,
780 .name = "csiphy0_timer_clk",
781 .ops = &clk_branch_ops,
782 .flags = CLK_SET_RATE_PARENT,
783 },
784 },
785 };
786
787 static struct clk_branch csiphy1_timer_clk = {
788 .halt_reg = 0x01e8,
789 .halt_bit = 18,
790 .clkr = {
791 .enable_reg = 0x0160,
792 .enable_mask = BIT(9),
793 .hw.init = &(struct clk_init_data){
794 .parent_hws = (const struct clk_hw*[]){
795 &csiphytimer_src.clkr.hw,
796 },
797 .num_parents = 1,
798 .name = "csiphy1_timer_clk",
799 .ops = &clk_branch_ops,
800 .flags = CLK_SET_RATE_PARENT,
801 },
802 },
803 };
804
805 static struct clk_branch csiphy2_timer_clk = {
806 .halt_reg = 0x01e8,
807 .halt_bit = 30,
808 .clkr = {
809 .enable_reg = 0x0160,
810 .enable_mask = BIT(11),
811 .hw.init = &(struct clk_init_data){
812 .parent_hws = (const struct clk_hw*[]){
813 &csiphytimer_src.clkr.hw,
814 },
815 .num_parents = 1,
816 .name = "csiphy2_timer_clk",
817 .ops = &clk_branch_ops,
818 .flags = CLK_SET_RATE_PARENT,
819 },
820 },
821 };
822
823 static const struct freq_tbl clk_tbl_gfx2d[] = {
824 F_MN( 27000000, P_PXO, 1, 0),
825 F_MN( 48000000, P_PLL8, 1, 8),
826 F_MN( 54857000, P_PLL8, 1, 7),
827 F_MN( 64000000, P_PLL8, 1, 6),
828 F_MN( 76800000, P_PLL8, 1, 5),
829 F_MN( 96000000, P_PLL8, 1, 4),
830 F_MN(128000000, P_PLL8, 1, 3),
831 F_MN(145455000, P_PLL2, 2, 11),
832 F_MN(160000000, P_PLL2, 1, 5),
833 F_MN(177778000, P_PLL2, 2, 9),
834 F_MN(200000000, P_PLL2, 1, 4),
835 F_MN(228571000, P_PLL2, 2, 7),
836 { }
837 };
838
839 static struct clk_dyn_rcg gfx2d0_src = {
840 .ns_reg[0] = 0x0070,
841 .ns_reg[1] = 0x0070,
842 .md_reg[0] = 0x0064,
843 .md_reg[1] = 0x0068,
844 .bank_reg = 0x0060,
845 .mn[0] = {
846 .mnctr_en_bit = 8,
847 .mnctr_reset_bit = 25,
848 .mnctr_mode_shift = 9,
849 .n_val_shift = 20,
850 .m_val_shift = 4,
851 .width = 4,
852 },
853 .mn[1] = {
854 .mnctr_en_bit = 5,
855 .mnctr_reset_bit = 24,
856 .mnctr_mode_shift = 6,
857 .n_val_shift = 16,
858 .m_val_shift = 4,
859 .width = 4,
860 },
861 .s[0] = {
862 .src_sel_shift = 3,
863 .parent_map = mmcc_pxo_pll8_pll2_map,
864 },
865 .s[1] = {
866 .src_sel_shift = 0,
867 .parent_map = mmcc_pxo_pll8_pll2_map,
868 },
869 .mux_sel_bit = 11,
870 .freq_tbl = clk_tbl_gfx2d,
871 .clkr = {
872 .enable_reg = 0x0060,
873 .enable_mask = BIT(2),
874 .hw.init = &(struct clk_init_data){
875 .name = "gfx2d0_src",
876 .parent_data = mmcc_pxo_pll8_pll2,
877 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
878 .ops = &clk_dyn_rcg_ops,
879 },
880 },
881 };
882
883 static struct clk_branch gfx2d0_clk = {
884 .halt_reg = 0x01c8,
885 .halt_bit = 9,
886 .clkr = {
887 .enable_reg = 0x0060,
888 .enable_mask = BIT(0),
889 .hw.init = &(struct clk_init_data){
890 .name = "gfx2d0_clk",
891 .parent_hws = (const struct clk_hw*[]){
892 &gfx2d0_src.clkr.hw
893 },
894 .num_parents = 1,
895 .ops = &clk_branch_ops,
896 .flags = CLK_SET_RATE_PARENT,
897 },
898 },
899 };
900
901 static struct clk_dyn_rcg gfx2d1_src = {
902 .ns_reg[0] = 0x007c,
903 .ns_reg[1] = 0x007c,
904 .md_reg[0] = 0x0078,
905 .md_reg[1] = 0x006c,
906 .bank_reg = 0x0074,
907 .mn[0] = {
908 .mnctr_en_bit = 8,
909 .mnctr_reset_bit = 25,
910 .mnctr_mode_shift = 9,
911 .n_val_shift = 20,
912 .m_val_shift = 4,
913 .width = 4,
914 },
915 .mn[1] = {
916 .mnctr_en_bit = 5,
917 .mnctr_reset_bit = 24,
918 .mnctr_mode_shift = 6,
919 .n_val_shift = 16,
920 .m_val_shift = 4,
921 .width = 4,
922 },
923 .s[0] = {
924 .src_sel_shift = 3,
925 .parent_map = mmcc_pxo_pll8_pll2_map,
926 },
927 .s[1] = {
928 .src_sel_shift = 0,
929 .parent_map = mmcc_pxo_pll8_pll2_map,
930 },
931 .mux_sel_bit = 11,
932 .freq_tbl = clk_tbl_gfx2d,
933 .clkr = {
934 .enable_reg = 0x0074,
935 .enable_mask = BIT(2),
936 .hw.init = &(struct clk_init_data){
937 .name = "gfx2d1_src",
938 .parent_data = mmcc_pxo_pll8_pll2,
939 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
940 .ops = &clk_dyn_rcg_ops,
941 },
942 },
943 };
944
945 static struct clk_branch gfx2d1_clk = {
946 .halt_reg = 0x01c8,
947 .halt_bit = 14,
948 .clkr = {
949 .enable_reg = 0x0074,
950 .enable_mask = BIT(0),
951 .hw.init = &(struct clk_init_data){
952 .name = "gfx2d1_clk",
953 .parent_hws = (const struct clk_hw*[]){
954 &gfx2d1_src.clkr.hw
955 },
956 .num_parents = 1,
957 .ops = &clk_branch_ops,
958 .flags = CLK_SET_RATE_PARENT,
959 },
960 },
961 };
962
963 static const struct freq_tbl clk_tbl_gfx3d[] = {
964 F_MN( 27000000, P_PXO, 1, 0),
965 F_MN( 48000000, P_PLL8, 1, 8),
966 F_MN( 54857000, P_PLL8, 1, 7),
967 F_MN( 64000000, P_PLL8, 1, 6),
968 F_MN( 76800000, P_PLL8, 1, 5),
969 F_MN( 96000000, P_PLL8, 1, 4),
970 F_MN(128000000, P_PLL8, 1, 3),
971 F_MN(145455000, P_PLL2, 2, 11),
972 F_MN(160000000, P_PLL2, 1, 5),
973 F_MN(177778000, P_PLL2, 2, 9),
974 F_MN(200000000, P_PLL2, 1, 4),
975 F_MN(228571000, P_PLL2, 2, 7),
976 F_MN(266667000, P_PLL2, 1, 3),
977 F_MN(300000000, P_PLL3, 1, 4),
978 F_MN(320000000, P_PLL2, 2, 5),
979 F_MN(400000000, P_PLL2, 1, 2),
980 { }
981 };
982
983 static const struct freq_tbl clk_tbl_gfx3d_8064[] = {
984 F_MN( 27000000, P_PXO, 0, 0),
985 F_MN( 48000000, P_PLL8, 1, 8),
986 F_MN( 54857000, P_PLL8, 1, 7),
987 F_MN( 64000000, P_PLL8, 1, 6),
988 F_MN( 76800000, P_PLL8, 1, 5),
989 F_MN( 96000000, P_PLL8, 1, 4),
990 F_MN(128000000, P_PLL8, 1, 3),
991 F_MN(145455000, P_PLL2, 2, 11),
992 F_MN(160000000, P_PLL2, 1, 5),
993 F_MN(177778000, P_PLL2, 2, 9),
994 F_MN(192000000, P_PLL8, 1, 2),
995 F_MN(200000000, P_PLL2, 1, 4),
996 F_MN(228571000, P_PLL2, 2, 7),
997 F_MN(266667000, P_PLL2, 1, 3),
998 F_MN(320000000, P_PLL2, 2, 5),
999 F_MN(400000000, P_PLL2, 1, 2),
1000 F_MN(450000000, P_PLL15, 1, 2),
1001 { }
1002 };
1003
1004 static struct clk_dyn_rcg gfx3d_src = {
1005 .ns_reg[0] = 0x008c,
1006 .ns_reg[1] = 0x008c,
1007 .md_reg[0] = 0x0084,
1008 .md_reg[1] = 0x0088,
1009 .bank_reg = 0x0080,
1010 .mn[0] = {
1011 .mnctr_en_bit = 8,
1012 .mnctr_reset_bit = 25,
1013 .mnctr_mode_shift = 9,
1014 .n_val_shift = 18,
1015 .m_val_shift = 4,
1016 .width = 4,
1017 },
1018 .mn[1] = {
1019 .mnctr_en_bit = 5,
1020 .mnctr_reset_bit = 24,
1021 .mnctr_mode_shift = 6,
1022 .n_val_shift = 14,
1023 .m_val_shift = 4,
1024 .width = 4,
1025 },
1026 .s[0] = {
1027 .src_sel_shift = 3,
1028 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
1029 },
1030 .s[1] = {
1031 .src_sel_shift = 0,
1032 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
1033 },
1034 .mux_sel_bit = 11,
1035 .freq_tbl = clk_tbl_gfx3d,
1036 .clkr = {
1037 .enable_reg = 0x0080,
1038 .enable_mask = BIT(2),
1039 .hw.init = &(struct clk_init_data){
1040 .name = "gfx3d_src",
1041 .parent_data = mmcc_pxo_pll8_pll2_pll3,
1042 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll3),
1043 .ops = &clk_dyn_rcg_ops,
1044 },
1045 },
1046 };
1047
1048 static const struct clk_init_data gfx3d_8064_init = {
1049 .name = "gfx3d_src",
1050 .parent_data = mmcc_pxo_pll8_pll2_pll15,
1051 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll15),
1052 .ops = &clk_dyn_rcg_ops,
1053 };
1054
1055 static struct clk_branch gfx3d_clk = {
1056 .halt_reg = 0x01c8,
1057 .halt_bit = 4,
1058 .clkr = {
1059 .enable_reg = 0x0080,
1060 .enable_mask = BIT(0),
1061 .hw.init = &(struct clk_init_data){
1062 .name = "gfx3d_clk",
1063 .parent_hws = (const struct clk_hw*[]){
1064 &gfx3d_src.clkr.hw
1065 },
1066 .num_parents = 1,
1067 .ops = &clk_branch_ops,
1068 .flags = CLK_SET_RATE_PARENT,
1069 },
1070 },
1071 };
1072
1073 static const struct freq_tbl clk_tbl_vcap[] = {
1074 F_MN( 27000000, P_PXO, 0, 0),
1075 F_MN( 54860000, P_PLL8, 1, 7),
1076 F_MN( 64000000, P_PLL8, 1, 6),
1077 F_MN( 76800000, P_PLL8, 1, 5),
1078 F_MN(128000000, P_PLL8, 1, 3),
1079 F_MN(160000000, P_PLL2, 1, 5),
1080 F_MN(200000000, P_PLL2, 1, 4),
1081 { }
1082 };
1083
1084 static struct clk_dyn_rcg vcap_src = {
1085 .ns_reg[0] = 0x021c,
1086 .ns_reg[1] = 0x021c,
1087 .md_reg[0] = 0x01ec,
1088 .md_reg[1] = 0x0218,
1089 .bank_reg = 0x0178,
1090 .mn[0] = {
1091 .mnctr_en_bit = 8,
1092 .mnctr_reset_bit = 23,
1093 .mnctr_mode_shift = 9,
1094 .n_val_shift = 18,
1095 .m_val_shift = 4,
1096 .width = 4,
1097 },
1098 .mn[1] = {
1099 .mnctr_en_bit = 5,
1100 .mnctr_reset_bit = 22,
1101 .mnctr_mode_shift = 6,
1102 .n_val_shift = 14,
1103 .m_val_shift = 4,
1104 .width = 4,
1105 },
1106 .s[0] = {
1107 .src_sel_shift = 3,
1108 .parent_map = mmcc_pxo_pll8_pll2_map,
1109 },
1110 .s[1] = {
1111 .src_sel_shift = 0,
1112 .parent_map = mmcc_pxo_pll8_pll2_map,
1113 },
1114 .mux_sel_bit = 11,
1115 .freq_tbl = clk_tbl_vcap,
1116 .clkr = {
1117 .enable_reg = 0x0178,
1118 .enable_mask = BIT(2),
1119 .hw.init = &(struct clk_init_data){
1120 .name = "vcap_src",
1121 .parent_data = mmcc_pxo_pll8_pll2,
1122 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1123 .ops = &clk_dyn_rcg_ops,
1124 },
1125 },
1126 };
1127
1128 static struct clk_branch vcap_clk = {
1129 .halt_reg = 0x0240,
1130 .halt_bit = 15,
1131 .clkr = {
1132 .enable_reg = 0x0178,
1133 .enable_mask = BIT(0),
1134 .hw.init = &(struct clk_init_data){
1135 .name = "vcap_clk",
1136 .parent_hws = (const struct clk_hw*[]){
1137 &vcap_src.clkr.hw
1138 },
1139 .num_parents = 1,
1140 .ops = &clk_branch_ops,
1141 .flags = CLK_SET_RATE_PARENT,
1142 },
1143 },
1144 };
1145
1146 static struct clk_branch vcap_npl_clk = {
1147 .halt_reg = 0x0240,
1148 .halt_bit = 25,
1149 .clkr = {
1150 .enable_reg = 0x0178,
1151 .enable_mask = BIT(13),
1152 .hw.init = &(struct clk_init_data){
1153 .name = "vcap_npl_clk",
1154 .parent_hws = (const struct clk_hw*[]){
1155 &vcap_src.clkr.hw
1156 },
1157 .num_parents = 1,
1158 .ops = &clk_branch_ops,
1159 .flags = CLK_SET_RATE_PARENT,
1160 },
1161 },
1162 };
1163
1164 static const struct freq_tbl clk_tbl_ijpeg[] = {
1165 { 27000000, P_PXO, 1, 0, 0 },
1166 { 36570000, P_PLL8, 1, 2, 21 },
1167 { 54860000, P_PLL8, 7, 0, 0 },
1168 { 96000000, P_PLL8, 4, 0, 0 },
1169 { 109710000, P_PLL8, 1, 2, 7 },
1170 { 128000000, P_PLL8, 3, 0, 0 },
1171 { 153600000, P_PLL8, 1, 2, 5 },
1172 { 200000000, P_PLL2, 4, 0, 0 },
1173 { 228571000, P_PLL2, 1, 2, 7 },
1174 { 266667000, P_PLL2, 1, 1, 3 },
1175 { 320000000, P_PLL2, 1, 2, 5 },
1176 { }
1177 };
1178
1179 static struct clk_rcg ijpeg_src = {
1180 .ns_reg = 0x00a0,
1181 .md_reg = 0x009c,
1182 .mn = {
1183 .mnctr_en_bit = 5,
1184 .mnctr_reset_bit = 7,
1185 .mnctr_mode_shift = 6,
1186 .n_val_shift = 16,
1187 .m_val_shift = 8,
1188 .width = 8,
1189 },
1190 .p = {
1191 .pre_div_shift = 12,
1192 .pre_div_width = 2,
1193 },
1194 .s = {
1195 .src_sel_shift = 0,
1196 .parent_map = mmcc_pxo_pll8_pll2_map,
1197 },
1198 .freq_tbl = clk_tbl_ijpeg,
1199 .clkr = {
1200 .enable_reg = 0x0098,
1201 .enable_mask = BIT(2),
1202 .hw.init = &(struct clk_init_data){
1203 .name = "ijpeg_src",
1204 .parent_data = mmcc_pxo_pll8_pll2,
1205 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1206 .ops = &clk_rcg_ops,
1207 },
1208 },
1209 };
1210
1211 static struct clk_branch ijpeg_clk = {
1212 .halt_reg = 0x01c8,
1213 .halt_bit = 24,
1214 .clkr = {
1215 .enable_reg = 0x0098,
1216 .enable_mask = BIT(0),
1217 .hw.init = &(struct clk_init_data){
1218 .name = "ijpeg_clk",
1219 .parent_hws = (const struct clk_hw*[]){
1220 &ijpeg_src.clkr.hw
1221 },
1222 .num_parents = 1,
1223 .ops = &clk_branch_ops,
1224 .flags = CLK_SET_RATE_PARENT,
1225 },
1226 },
1227 };
1228
1229 static const struct freq_tbl clk_tbl_jpegd[] = {
1230 { 64000000, P_PLL8, 6 },
1231 { 76800000, P_PLL8, 5 },
1232 { 96000000, P_PLL8, 4 },
1233 { 160000000, P_PLL2, 5 },
1234 { 200000000, P_PLL2, 4 },
1235 { }
1236 };
1237
1238 static struct clk_rcg jpegd_src = {
1239 .ns_reg = 0x00ac,
1240 .p = {
1241 .pre_div_shift = 12,
1242 .pre_div_width = 4,
1243 },
1244 .s = {
1245 .src_sel_shift = 0,
1246 .parent_map = mmcc_pxo_pll8_pll2_map,
1247 },
1248 .freq_tbl = clk_tbl_jpegd,
1249 .clkr = {
1250 .enable_reg = 0x00a4,
1251 .enable_mask = BIT(2),
1252 .hw.init = &(struct clk_init_data){
1253 .name = "jpegd_src",
1254 .parent_data = mmcc_pxo_pll8_pll2,
1255 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1256 .ops = &clk_rcg_ops,
1257 },
1258 },
1259 };
1260
1261 static struct clk_branch jpegd_clk = {
1262 .halt_reg = 0x01c8,
1263 .halt_bit = 19,
1264 .clkr = {
1265 .enable_reg = 0x00a4,
1266 .enable_mask = BIT(0),
1267 .hw.init = &(struct clk_init_data){
1268 .name = "jpegd_clk",
1269 .parent_hws = (const struct clk_hw*[]){
1270 &jpegd_src.clkr.hw
1271 },
1272 .num_parents = 1,
1273 .ops = &clk_branch_ops,
1274 .flags = CLK_SET_RATE_PARENT,
1275 },
1276 },
1277 };
1278
1279 static const struct freq_tbl clk_tbl_mdp[] = {
1280 { 9600000, P_PLL8, 1, 1, 40 },
1281 { 13710000, P_PLL8, 1, 1, 28 },
1282 { 27000000, P_PXO, 1, 0, 0 },
1283 { 29540000, P_PLL8, 1, 1, 13 },
1284 { 34910000, P_PLL8, 1, 1, 11 },
1285 { 38400000, P_PLL8, 1, 1, 10 },
1286 { 59080000, P_PLL8, 1, 2, 13 },
1287 { 76800000, P_PLL8, 1, 1, 5 },
1288 { 85330000, P_PLL8, 1, 2, 9 },
1289 { 96000000, P_PLL8, 1, 1, 4 },
1290 { 128000000, P_PLL8, 1, 1, 3 },
1291 { 160000000, P_PLL2, 1, 1, 5 },
1292 { 177780000, P_PLL2, 1, 2, 9 },
1293 { 200000000, P_PLL2, 1, 1, 4 },
1294 { 228571000, P_PLL2, 1, 2, 7 },
1295 { 266667000, P_PLL2, 1, 1, 3 },
1296 { }
1297 };
1298
1299 static struct clk_dyn_rcg mdp_src = {
1300 .ns_reg[0] = 0x00d0,
1301 .ns_reg[1] = 0x00d0,
1302 .md_reg[0] = 0x00c4,
1303 .md_reg[1] = 0x00c8,
1304 .bank_reg = 0x00c0,
1305 .mn[0] = {
1306 .mnctr_en_bit = 8,
1307 .mnctr_reset_bit = 31,
1308 .mnctr_mode_shift = 9,
1309 .n_val_shift = 22,
1310 .m_val_shift = 8,
1311 .width = 8,
1312 },
1313 .mn[1] = {
1314 .mnctr_en_bit = 5,
1315 .mnctr_reset_bit = 30,
1316 .mnctr_mode_shift = 6,
1317 .n_val_shift = 14,
1318 .m_val_shift = 8,
1319 .width = 8,
1320 },
1321 .s[0] = {
1322 .src_sel_shift = 3,
1323 .parent_map = mmcc_pxo_pll8_pll2_map,
1324 },
1325 .s[1] = {
1326 .src_sel_shift = 0,
1327 .parent_map = mmcc_pxo_pll8_pll2_map,
1328 },
1329 .mux_sel_bit = 11,
1330 .freq_tbl = clk_tbl_mdp,
1331 .clkr = {
1332 .enable_reg = 0x00c0,
1333 .enable_mask = BIT(2),
1334 .hw.init = &(struct clk_init_data){
1335 .name = "mdp_src",
1336 .parent_data = mmcc_pxo_pll8_pll2,
1337 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1338 .ops = &clk_dyn_rcg_ops,
1339 },
1340 },
1341 };
1342
1343 static struct clk_branch mdp_clk = {
1344 .halt_reg = 0x01d0,
1345 .halt_bit = 10,
1346 .clkr = {
1347 .enable_reg = 0x00c0,
1348 .enable_mask = BIT(0),
1349 .hw.init = &(struct clk_init_data){
1350 .name = "mdp_clk",
1351 .parent_hws = (const struct clk_hw*[]){
1352 &mdp_src.clkr.hw
1353 },
1354 .num_parents = 1,
1355 .ops = &clk_branch_ops,
1356 .flags = CLK_SET_RATE_PARENT,
1357 },
1358 },
1359 };
1360
1361 static struct clk_branch mdp_lut_clk = {
1362 .halt_reg = 0x01e8,
1363 .halt_bit = 13,
1364 .clkr = {
1365 .enable_reg = 0x016c,
1366 .enable_mask = BIT(0),
1367 .hw.init = &(struct clk_init_data){
1368 .parent_hws = (const struct clk_hw*[]){
1369 &mdp_src.clkr.hw
1370 },
1371 .num_parents = 1,
1372 .name = "mdp_lut_clk",
1373 .ops = &clk_branch_ops,
1374 .flags = CLK_SET_RATE_PARENT,
1375 },
1376 },
1377 };
1378
1379 static struct clk_branch mdp_vsync_clk = {
1380 .halt_reg = 0x01cc,
1381 .halt_bit = 22,
1382 .clkr = {
1383 .enable_reg = 0x0058,
1384 .enable_mask = BIT(6),
1385 .hw.init = &(struct clk_init_data){
1386 .name = "mdp_vsync_clk",
1387 .parent_data = (const struct clk_parent_data[]){
1388 { .fw_name = "pxo", .name = "pxo_board" },
1389 },
1390 .num_parents = 1,
1391 .ops = &clk_branch_ops
1392 },
1393 },
1394 };
1395
1396 static const struct freq_tbl clk_tbl_rot[] = {
1397 { 27000000, P_PXO, 1 },
1398 { 29540000, P_PLL8, 13 },
1399 { 32000000, P_PLL8, 12 },
1400 { 38400000, P_PLL8, 10 },
1401 { 48000000, P_PLL8, 8 },
1402 { 54860000, P_PLL8, 7 },
1403 { 64000000, P_PLL8, 6 },
1404 { 76800000, P_PLL8, 5 },
1405 { 96000000, P_PLL8, 4 },
1406 { 100000000, P_PLL2, 8 },
1407 { 114290000, P_PLL2, 7 },
1408 { 133330000, P_PLL2, 6 },
1409 { 160000000, P_PLL2, 5 },
1410 { 200000000, P_PLL2, 4 },
1411 { }
1412 };
1413
1414 static struct clk_dyn_rcg rot_src = {
1415 .ns_reg[0] = 0x00e8,
1416 .ns_reg[1] = 0x00e8,
1417 .bank_reg = 0x00e8,
1418 .p[0] = {
1419 .pre_div_shift = 22,
1420 .pre_div_width = 4,
1421 },
1422 .p[1] = {
1423 .pre_div_shift = 26,
1424 .pre_div_width = 4,
1425 },
1426 .s[0] = {
1427 .src_sel_shift = 16,
1428 .parent_map = mmcc_pxo_pll8_pll2_map,
1429 },
1430 .s[1] = {
1431 .src_sel_shift = 19,
1432 .parent_map = mmcc_pxo_pll8_pll2_map,
1433 },
1434 .mux_sel_bit = 30,
1435 .freq_tbl = clk_tbl_rot,
1436 .clkr = {
1437 .enable_reg = 0x00e0,
1438 .enable_mask = BIT(2),
1439 .hw.init = &(struct clk_init_data){
1440 .name = "rot_src",
1441 .parent_data = mmcc_pxo_pll8_pll2,
1442 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1443 .ops = &clk_dyn_rcg_ops,
1444 },
1445 },
1446 };
1447
1448 static struct clk_branch rot_clk = {
1449 .halt_reg = 0x01d0,
1450 .halt_bit = 15,
1451 .clkr = {
1452 .enable_reg = 0x00e0,
1453 .enable_mask = BIT(0),
1454 .hw.init = &(struct clk_init_data){
1455 .name = "rot_clk",
1456 .parent_hws = (const struct clk_hw*[]){
1457 &rot_src.clkr.hw
1458 },
1459 .num_parents = 1,
1460 .ops = &clk_branch_ops,
1461 .flags = CLK_SET_RATE_PARENT,
1462 },
1463 },
1464 };
1465
1466 static const struct parent_map mmcc_pxo_hdmi_map[] = {
1467 { P_PXO, 0 },
1468 { P_HDMI_PLL, 3 }
1469 };
1470
1471 static const struct clk_parent_data mmcc_pxo_hdmi[] = {
1472 { .fw_name = "pxo", .name = "pxo_board" },
1473 { .fw_name = "hdmipll", .name = "hdmi_pll" },
1474 };
1475
1476 static const struct freq_tbl clk_tbl_tv[] = {
1477 { .src = P_HDMI_PLL, .pre_div = 1 },
1478 { }
1479 };
1480
1481 static struct clk_rcg tv_src = {
1482 .ns_reg = 0x00f4,
1483 .md_reg = 0x00f0,
1484 .mn = {
1485 .mnctr_en_bit = 5,
1486 .mnctr_reset_bit = 7,
1487 .mnctr_mode_shift = 6,
1488 .n_val_shift = 16,
1489 .m_val_shift = 8,
1490 .width = 8,
1491 },
1492 .p = {
1493 .pre_div_shift = 14,
1494 .pre_div_width = 2,
1495 },
1496 .s = {
1497 .src_sel_shift = 0,
1498 .parent_map = mmcc_pxo_hdmi_map,
1499 },
1500 .freq_tbl = clk_tbl_tv,
1501 .clkr = {
1502 .enable_reg = 0x00ec,
1503 .enable_mask = BIT(2),
1504 .hw.init = &(struct clk_init_data){
1505 .name = "tv_src",
1506 .parent_data = mmcc_pxo_hdmi,
1507 .num_parents = ARRAY_SIZE(mmcc_pxo_hdmi),
1508 .ops = &clk_rcg_bypass_ops,
1509 .flags = CLK_SET_RATE_PARENT,
1510 },
1511 },
1512 };
1513
1514 static struct clk_branch tv_enc_clk = {
1515 .halt_reg = 0x01d4,
1516 .halt_bit = 9,
1517 .clkr = {
1518 .enable_reg = 0x00ec,
1519 .enable_mask = BIT(8),
1520 .hw.init = &(struct clk_init_data){
1521 .parent_hws = (const struct clk_hw*[]){
1522 &tv_src.clkr.hw,
1523 },
1524 .num_parents = 1,
1525 .name = "tv_enc_clk",
1526 .ops = &clk_branch_ops,
1527 .flags = CLK_SET_RATE_PARENT,
1528 },
1529 },
1530 };
1531
1532 static struct clk_branch tv_dac_clk = {
1533 .halt_reg = 0x01d4,
1534 .halt_bit = 10,
1535 .clkr = {
1536 .enable_reg = 0x00ec,
1537 .enable_mask = BIT(10),
1538 .hw.init = &(struct clk_init_data){
1539 .parent_hws = (const struct clk_hw*[]){
1540 &tv_src.clkr.hw,
1541 },
1542 .num_parents = 1,
1543 .name = "tv_dac_clk",
1544 .ops = &clk_branch_ops,
1545 .flags = CLK_SET_RATE_PARENT,
1546 },
1547 },
1548 };
1549
1550 static struct clk_branch mdp_tv_clk = {
1551 .halt_reg = 0x01d4,
1552 .halt_bit = 12,
1553 .clkr = {
1554 .enable_reg = 0x00ec,
1555 .enable_mask = BIT(0),
1556 .hw.init = &(struct clk_init_data){
1557 .parent_hws = (const struct clk_hw*[]){
1558 &tv_src.clkr.hw,
1559 },
1560 .num_parents = 1,
1561 .name = "mdp_tv_clk",
1562 .ops = &clk_branch_ops,
1563 .flags = CLK_SET_RATE_PARENT,
1564 },
1565 },
1566 };
1567
1568 static struct clk_branch hdmi_tv_clk = {
1569 .halt_reg = 0x01d4,
1570 .halt_bit = 11,
1571 .clkr = {
1572 .enable_reg = 0x00ec,
1573 .enable_mask = BIT(12),
1574 .hw.init = &(struct clk_init_data){
1575 .parent_hws = (const struct clk_hw*[]){
1576 &tv_src.clkr.hw,
1577 },
1578 .num_parents = 1,
1579 .name = "hdmi_tv_clk",
1580 .ops = &clk_branch_ops,
1581 .flags = CLK_SET_RATE_PARENT,
1582 },
1583 },
1584 };
1585
1586 static struct clk_branch rgb_tv_clk = {
1587 .halt_reg = 0x0240,
1588 .halt_bit = 27,
1589 .clkr = {
1590 .enable_reg = 0x0124,
1591 .enable_mask = BIT(14),
1592 .hw.init = &(struct clk_init_data){
1593 .parent_hws = (const struct clk_hw*[]){
1594 &tv_src.clkr.hw,
1595 },
1596 .num_parents = 1,
1597 .name = "rgb_tv_clk",
1598 .ops = &clk_branch_ops,
1599 .flags = CLK_SET_RATE_PARENT,
1600 },
1601 },
1602 };
1603
1604 static struct clk_branch npl_tv_clk = {
1605 .halt_reg = 0x0240,
1606 .halt_bit = 26,
1607 .clkr = {
1608 .enable_reg = 0x0124,
1609 .enable_mask = BIT(16),
1610 .hw.init = &(struct clk_init_data){
1611 .parent_hws = (const struct clk_hw*[]){
1612 &tv_src.clkr.hw,
1613 },
1614 .num_parents = 1,
1615 .name = "npl_tv_clk",
1616 .ops = &clk_branch_ops,
1617 .flags = CLK_SET_RATE_PARENT,
1618 },
1619 },
1620 };
1621
1622 static struct clk_branch hdmi_app_clk = {
1623 .halt_reg = 0x01cc,
1624 .halt_bit = 25,
1625 .clkr = {
1626 .enable_reg = 0x005c,
1627 .enable_mask = BIT(11),
1628 .hw.init = &(struct clk_init_data){
1629 .parent_data = (const struct clk_parent_data[]){
1630 { .fw_name = "pxo", .name = "pxo_board" },
1631 },
1632 .num_parents = 1,
1633 .name = "hdmi_app_clk",
1634 .ops = &clk_branch_ops,
1635 },
1636 },
1637 };
1638
1639 static const struct freq_tbl clk_tbl_vcodec[] = {
1640 F_MN( 27000000, P_PXO, 1, 0),
1641 F_MN( 32000000, P_PLL8, 1, 12),
1642 F_MN( 48000000, P_PLL8, 1, 8),
1643 F_MN( 54860000, P_PLL8, 1, 7),
1644 F_MN( 96000000, P_PLL8, 1, 4),
1645 F_MN(133330000, P_PLL2, 1, 6),
1646 F_MN(200000000, P_PLL2, 1, 4),
1647 F_MN(228570000, P_PLL2, 2, 7),
1648 F_MN(266670000, P_PLL2, 1, 3),
1649 { }
1650 };
1651
1652 static struct clk_dyn_rcg vcodec_src = {
1653 .ns_reg[0] = 0x0100,
1654 .ns_reg[1] = 0x0100,
1655 .md_reg[0] = 0x00fc,
1656 .md_reg[1] = 0x0128,
1657 .bank_reg = 0x00f8,
1658 .mn[0] = {
1659 .mnctr_en_bit = 5,
1660 .mnctr_reset_bit = 31,
1661 .mnctr_mode_shift = 6,
1662 .n_val_shift = 11,
1663 .m_val_shift = 8,
1664 .width = 8,
1665 },
1666 .mn[1] = {
1667 .mnctr_en_bit = 10,
1668 .mnctr_reset_bit = 30,
1669 .mnctr_mode_shift = 11,
1670 .n_val_shift = 19,
1671 .m_val_shift = 8,
1672 .width = 8,
1673 },
1674 .s[0] = {
1675 .src_sel_shift = 27,
1676 .parent_map = mmcc_pxo_pll8_pll2_map,
1677 },
1678 .s[1] = {
1679 .src_sel_shift = 0,
1680 .parent_map = mmcc_pxo_pll8_pll2_map,
1681 },
1682 .mux_sel_bit = 13,
1683 .freq_tbl = clk_tbl_vcodec,
1684 .clkr = {
1685 .enable_reg = 0x00f8,
1686 .enable_mask = BIT(2),
1687 .hw.init = &(struct clk_init_data){
1688 .name = "vcodec_src",
1689 .parent_data = mmcc_pxo_pll8_pll2,
1690 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1691 .ops = &clk_dyn_rcg_ops,
1692 },
1693 },
1694 };
1695
1696 static struct clk_branch vcodec_clk = {
1697 .halt_reg = 0x01d0,
1698 .halt_bit = 29,
1699 .clkr = {
1700 .enable_reg = 0x00f8,
1701 .enable_mask = BIT(0),
1702 .hw.init = &(struct clk_init_data){
1703 .name = "vcodec_clk",
1704 .parent_hws = (const struct clk_hw*[]){
1705 &vcodec_src.clkr.hw
1706 },
1707 .num_parents = 1,
1708 .ops = &clk_branch_ops,
1709 .flags = CLK_SET_RATE_PARENT,
1710 },
1711 },
1712 };
1713
1714 static const struct freq_tbl clk_tbl_vpe[] = {
1715 { 27000000, P_PXO, 1 },
1716 { 34909000, P_PLL8, 11 },
1717 { 38400000, P_PLL8, 10 },
1718 { 64000000, P_PLL8, 6 },
1719 { 76800000, P_PLL8, 5 },
1720 { 96000000, P_PLL8, 4 },
1721 { 100000000, P_PLL2, 8 },
1722 { 160000000, P_PLL2, 5 },
1723 { }
1724 };
1725
1726 static struct clk_rcg vpe_src = {
1727 .ns_reg = 0x0118,
1728 .p = {
1729 .pre_div_shift = 12,
1730 .pre_div_width = 4,
1731 },
1732 .s = {
1733 .src_sel_shift = 0,
1734 .parent_map = mmcc_pxo_pll8_pll2_map,
1735 },
1736 .freq_tbl = clk_tbl_vpe,
1737 .clkr = {
1738 .enable_reg = 0x0110,
1739 .enable_mask = BIT(2),
1740 .hw.init = &(struct clk_init_data){
1741 .name = "vpe_src",
1742 .parent_data = mmcc_pxo_pll8_pll2,
1743 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1744 .ops = &clk_rcg_ops,
1745 },
1746 },
1747 };
1748
1749 static struct clk_branch vpe_clk = {
1750 .halt_reg = 0x01c8,
1751 .halt_bit = 28,
1752 .clkr = {
1753 .enable_reg = 0x0110,
1754 .enable_mask = BIT(0),
1755 .hw.init = &(struct clk_init_data){
1756 .name = "vpe_clk",
1757 .parent_hws = (const struct clk_hw*[]){
1758 &vpe_src.clkr.hw
1759 },
1760 .num_parents = 1,
1761 .ops = &clk_branch_ops,
1762 .flags = CLK_SET_RATE_PARENT,
1763 },
1764 },
1765 };
1766
1767 static const struct freq_tbl clk_tbl_vfe[] = {
1768 { 13960000, P_PLL8, 1, 2, 55 },
1769 { 27000000, P_PXO, 1, 0, 0 },
1770 { 36570000, P_PLL8, 1, 2, 21 },
1771 { 38400000, P_PLL8, 2, 1, 5 },
1772 { 45180000, P_PLL8, 1, 2, 17 },
1773 { 48000000, P_PLL8, 2, 1, 4 },
1774 { 54860000, P_PLL8, 1, 1, 7 },
1775 { 64000000, P_PLL8, 2, 1, 3 },
1776 { 76800000, P_PLL8, 1, 1, 5 },
1777 { 96000000, P_PLL8, 2, 1, 2 },
1778 { 109710000, P_PLL8, 1, 2, 7 },
1779 { 128000000, P_PLL8, 1, 1, 3 },
1780 { 153600000, P_PLL8, 1, 2, 5 },
1781 { 200000000, P_PLL2, 2, 1, 2 },
1782 { 228570000, P_PLL2, 1, 2, 7 },
1783 { 266667000, P_PLL2, 1, 1, 3 },
1784 { 320000000, P_PLL2, 1, 2, 5 },
1785 { }
1786 };
1787
1788 static struct clk_rcg vfe_src = {
1789 .ns_reg = 0x0108,
1790 .mn = {
1791 .mnctr_en_bit = 5,
1792 .mnctr_reset_bit = 7,
1793 .mnctr_mode_shift = 6,
1794 .n_val_shift = 16,
1795 .m_val_shift = 8,
1796 .width = 8,
1797 },
1798 .p = {
1799 .pre_div_shift = 10,
1800 .pre_div_width = 1,
1801 },
1802 .s = {
1803 .src_sel_shift = 0,
1804 .parent_map = mmcc_pxo_pll8_pll2_map,
1805 },
1806 .freq_tbl = clk_tbl_vfe,
1807 .clkr = {
1808 .enable_reg = 0x0104,
1809 .enable_mask = BIT(2),
1810 .hw.init = &(struct clk_init_data){
1811 .name = "vfe_src",
1812 .parent_data = mmcc_pxo_pll8_pll2,
1813 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1814 .ops = &clk_rcg_ops,
1815 },
1816 },
1817 };
1818
1819 static struct clk_branch vfe_clk = {
1820 .halt_reg = 0x01cc,
1821 .halt_bit = 6,
1822 .clkr = {
1823 .enable_reg = 0x0104,
1824 .enable_mask = BIT(0),
1825 .hw.init = &(struct clk_init_data){
1826 .name = "vfe_clk",
1827 .parent_hws = (const struct clk_hw*[]){
1828 &vfe_src.clkr.hw
1829 },
1830 .num_parents = 1,
1831 .ops = &clk_branch_ops,
1832 .flags = CLK_SET_RATE_PARENT,
1833 },
1834 },
1835 };
1836
1837 static struct clk_branch vfe_csi_clk = {
1838 .halt_reg = 0x01cc,
1839 .halt_bit = 8,
1840 .clkr = {
1841 .enable_reg = 0x0104,
1842 .enable_mask = BIT(12),
1843 .hw.init = &(struct clk_init_data){
1844 .parent_hws = (const struct clk_hw*[]){
1845 &vfe_src.clkr.hw
1846 },
1847 .num_parents = 1,
1848 .name = "vfe_csi_clk",
1849 .ops = &clk_branch_ops,
1850 .flags = CLK_SET_RATE_PARENT,
1851 },
1852 },
1853 };
1854
1855 static struct clk_branch gmem_axi_clk = {
1856 .halt_reg = 0x01d8,
1857 .halt_bit = 6,
1858 .clkr = {
1859 .enable_reg = 0x0018,
1860 .enable_mask = BIT(24),
1861 .hw.init = &(struct clk_init_data){
1862 .name = "gmem_axi_clk",
1863 .ops = &clk_branch_ops,
1864 },
1865 },
1866 };
1867
1868 static struct clk_branch ijpeg_axi_clk = {
1869 .hwcg_reg = 0x0018,
1870 .hwcg_bit = 11,
1871 .halt_reg = 0x01d8,
1872 .halt_bit = 4,
1873 .clkr = {
1874 .enable_reg = 0x0018,
1875 .enable_mask = BIT(21),
1876 .hw.init = &(struct clk_init_data){
1877 .name = "ijpeg_axi_clk",
1878 .ops = &clk_branch_ops,
1879 },
1880 },
1881 };
1882
1883 static struct clk_branch mmss_imem_axi_clk = {
1884 .hwcg_reg = 0x0018,
1885 .hwcg_bit = 15,
1886 .halt_reg = 0x01d8,
1887 .halt_bit = 7,
1888 .clkr = {
1889 .enable_reg = 0x0018,
1890 .enable_mask = BIT(22),
1891 .hw.init = &(struct clk_init_data){
1892 .name = "mmss_imem_axi_clk",
1893 .ops = &clk_branch_ops,
1894 },
1895 },
1896 };
1897
1898 static struct clk_branch jpegd_axi_clk = {
1899 .halt_reg = 0x01d8,
1900 .halt_bit = 5,
1901 .clkr = {
1902 .enable_reg = 0x0018,
1903 .enable_mask = BIT(25),
1904 .hw.init = &(struct clk_init_data){
1905 .name = "jpegd_axi_clk",
1906 .ops = &clk_branch_ops,
1907 },
1908 },
1909 };
1910
1911 static struct clk_branch vcodec_axi_b_clk = {
1912 .hwcg_reg = 0x0114,
1913 .hwcg_bit = 22,
1914 .halt_reg = 0x01e8,
1915 .halt_bit = 25,
1916 .clkr = {
1917 .enable_reg = 0x0114,
1918 .enable_mask = BIT(23),
1919 .hw.init = &(struct clk_init_data){
1920 .name = "vcodec_axi_b_clk",
1921 .ops = &clk_branch_ops,
1922 },
1923 },
1924 };
1925
1926 static struct clk_branch vcodec_axi_a_clk = {
1927 .hwcg_reg = 0x0114,
1928 .hwcg_bit = 24,
1929 .halt_reg = 0x01e8,
1930 .halt_bit = 26,
1931 .clkr = {
1932 .enable_reg = 0x0114,
1933 .enable_mask = BIT(25),
1934 .hw.init = &(struct clk_init_data){
1935 .name = "vcodec_axi_a_clk",
1936 .ops = &clk_branch_ops,
1937 },
1938 },
1939 };
1940
1941 static struct clk_branch vcodec_axi_clk = {
1942 .hwcg_reg = 0x0018,
1943 .hwcg_bit = 13,
1944 .halt_reg = 0x01d8,
1945 .halt_bit = 3,
1946 .clkr = {
1947 .enable_reg = 0x0018,
1948 .enable_mask = BIT(19),
1949 .hw.init = &(struct clk_init_data){
1950 .name = "vcodec_axi_clk",
1951 .ops = &clk_branch_ops,
1952 },
1953 },
1954 };
1955
1956 static struct clk_branch vfe_axi_clk = {
1957 .halt_reg = 0x01d8,
1958 .halt_bit = 0,
1959 .clkr = {
1960 .enable_reg = 0x0018,
1961 .enable_mask = BIT(18),
1962 .hw.init = &(struct clk_init_data){
1963 .name = "vfe_axi_clk",
1964 .ops = &clk_branch_ops,
1965 },
1966 },
1967 };
1968
1969 static struct clk_branch mdp_axi_clk = {
1970 .hwcg_reg = 0x0018,
1971 .hwcg_bit = 16,
1972 .halt_reg = 0x01d8,
1973 .halt_bit = 8,
1974 .clkr = {
1975 .enable_reg = 0x0018,
1976 .enable_mask = BIT(23),
1977 .hw.init = &(struct clk_init_data){
1978 .name = "mdp_axi_clk",
1979 .ops = &clk_branch_ops,
1980 },
1981 },
1982 };
1983
1984 static struct clk_branch rot_axi_clk = {
1985 .hwcg_reg = 0x0020,
1986 .hwcg_bit = 25,
1987 .halt_reg = 0x01d8,
1988 .halt_bit = 2,
1989 .clkr = {
1990 .enable_reg = 0x0020,
1991 .enable_mask = BIT(24),
1992 .hw.init = &(struct clk_init_data){
1993 .name = "rot_axi_clk",
1994 .ops = &clk_branch_ops,
1995 },
1996 },
1997 };
1998
1999 static struct clk_branch vcap_axi_clk = {
2000 .halt_reg = 0x0240,
2001 .halt_bit = 20,
2002 .hwcg_reg = 0x0244,
2003 .hwcg_bit = 11,
2004 .clkr = {
2005 .enable_reg = 0x0244,
2006 .enable_mask = BIT(12),
2007 .hw.init = &(struct clk_init_data){
2008 .name = "vcap_axi_clk",
2009 .ops = &clk_branch_ops,
2010 },
2011 },
2012 };
2013
2014 static struct clk_branch vpe_axi_clk = {
2015 .hwcg_reg = 0x0020,
2016 .hwcg_bit = 27,
2017 .halt_reg = 0x01d8,
2018 .halt_bit = 1,
2019 .clkr = {
2020 .enable_reg = 0x0020,
2021 .enable_mask = BIT(26),
2022 .hw.init = &(struct clk_init_data){
2023 .name = "vpe_axi_clk",
2024 .ops = &clk_branch_ops,
2025 },
2026 },
2027 };
2028
2029 static struct clk_branch gfx3d_axi_clk = {
2030 .hwcg_reg = 0x0244,
2031 .hwcg_bit = 24,
2032 .halt_reg = 0x0240,
2033 .halt_bit = 30,
2034 .clkr = {
2035 .enable_reg = 0x0244,
2036 .enable_mask = BIT(25),
2037 .hw.init = &(struct clk_init_data){
2038 .name = "gfx3d_axi_clk",
2039 .ops = &clk_branch_ops,
2040 },
2041 },
2042 };
2043
2044 static struct clk_branch amp_ahb_clk = {
2045 .halt_reg = 0x01dc,
2046 .halt_bit = 18,
2047 .clkr = {
2048 .enable_reg = 0x0008,
2049 .enable_mask = BIT(24),
2050 .hw.init = &(struct clk_init_data){
2051 .name = "amp_ahb_clk",
2052 .ops = &clk_branch_ops,
2053 },
2054 },
2055 };
2056
2057 static struct clk_branch csi_ahb_clk = {
2058 .halt_reg = 0x01dc,
2059 .halt_bit = 16,
2060 .clkr = {
2061 .enable_reg = 0x0008,
2062 .enable_mask = BIT(7),
2063 .hw.init = &(struct clk_init_data){
2064 .name = "csi_ahb_clk",
2065 .ops = &clk_branch_ops,
2066 },
2067 },
2068 };
2069
2070 static struct clk_branch dsi_m_ahb_clk = {
2071 .halt_reg = 0x01dc,
2072 .halt_bit = 19,
2073 .clkr = {
2074 .enable_reg = 0x0008,
2075 .enable_mask = BIT(9),
2076 .hw.init = &(struct clk_init_data){
2077 .name = "dsi_m_ahb_clk",
2078 .ops = &clk_branch_ops,
2079 },
2080 },
2081 };
2082
2083 static struct clk_branch dsi_s_ahb_clk = {
2084 .hwcg_reg = 0x0038,
2085 .hwcg_bit = 20,
2086 .halt_reg = 0x01dc,
2087 .halt_bit = 21,
2088 .clkr = {
2089 .enable_reg = 0x0008,
2090 .enable_mask = BIT(18),
2091 .hw.init = &(struct clk_init_data){
2092 .name = "dsi_s_ahb_clk",
2093 .ops = &clk_branch_ops,
2094 },
2095 },
2096 };
2097
2098 static struct clk_branch dsi2_m_ahb_clk = {
2099 .halt_reg = 0x01d8,
2100 .halt_bit = 18,
2101 .clkr = {
2102 .enable_reg = 0x0008,
2103 .enable_mask = BIT(17),
2104 .hw.init = &(struct clk_init_data){
2105 .name = "dsi2_m_ahb_clk",
2106 .ops = &clk_branch_ops,
2107 },
2108 },
2109 };
2110
2111 static struct clk_branch dsi2_s_ahb_clk = {
2112 .hwcg_reg = 0x0038,
2113 .hwcg_bit = 15,
2114 .halt_reg = 0x01dc,
2115 .halt_bit = 20,
2116 .clkr = {
2117 .enable_reg = 0x0008,
2118 .enable_mask = BIT(22),
2119 .hw.init = &(struct clk_init_data){
2120 .name = "dsi2_s_ahb_clk",
2121 .ops = &clk_branch_ops,
2122 },
2123 },
2124 };
2125
2126 static struct clk_rcg dsi1_src = {
2127 .ns_reg = 0x0054,
2128 .md_reg = 0x0050,
2129 .mn = {
2130 .mnctr_en_bit = 5,
2131 .mnctr_reset_bit = 7,
2132 .mnctr_mode_shift = 6,
2133 .n_val_shift = 24,
2134 .m_val_shift = 8,
2135 .width = 8,
2136 },
2137 .p = {
2138 .pre_div_shift = 14,
2139 .pre_div_width = 2,
2140 },
2141 .s = {
2142 .src_sel_shift = 0,
2143 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2144 },
2145 .clkr = {
2146 .enable_reg = 0x004c,
2147 .enable_mask = BIT(2),
2148 .hw.init = &(struct clk_init_data){
2149 .name = "dsi1_src",
2150 .parent_data = mmcc_pxo_dsi2_dsi1,
2151 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
2152 .ops = &clk_rcg_bypass2_ops,
2153 .flags = CLK_SET_RATE_PARENT,
2154 },
2155 },
2156 };
2157
2158 static struct clk_branch dsi1_clk = {
2159 .halt_reg = 0x01d0,
2160 .halt_bit = 2,
2161 .clkr = {
2162 .enable_reg = 0x004c,
2163 .enable_mask = BIT(0),
2164 .hw.init = &(struct clk_init_data){
2165 .name = "dsi1_clk",
2166 .parent_hws = (const struct clk_hw*[]){
2167 &dsi1_src.clkr.hw
2168 },
2169 .num_parents = 1,
2170 .ops = &clk_branch_ops,
2171 .flags = CLK_SET_RATE_PARENT,
2172 },
2173 },
2174 };
2175
2176 static struct clk_rcg dsi2_src = {
2177 .ns_reg = 0x012c,
2178 .md_reg = 0x00a8,
2179 .mn = {
2180 .mnctr_en_bit = 5,
2181 .mnctr_reset_bit = 7,
2182 .mnctr_mode_shift = 6,
2183 .n_val_shift = 24,
2184 .m_val_shift = 8,
2185 .width = 8,
2186 },
2187 .p = {
2188 .pre_div_shift = 14,
2189 .pre_div_width = 2,
2190 },
2191 .s = {
2192 .src_sel_shift = 0,
2193 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2194 },
2195 .clkr = {
2196 .enable_reg = 0x003c,
2197 .enable_mask = BIT(2),
2198 .hw.init = &(struct clk_init_data){
2199 .name = "dsi2_src",
2200 .parent_data = mmcc_pxo_dsi2_dsi1,
2201 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
2202 .ops = &clk_rcg_bypass2_ops,
2203 .flags = CLK_SET_RATE_PARENT,
2204 },
2205 },
2206 };
2207
2208 static struct clk_branch dsi2_clk = {
2209 .halt_reg = 0x01d0,
2210 .halt_bit = 20,
2211 .clkr = {
2212 .enable_reg = 0x003c,
2213 .enable_mask = BIT(0),
2214 .hw.init = &(struct clk_init_data){
2215 .name = "dsi2_clk",
2216 .parent_hws = (const struct clk_hw*[]){
2217 &dsi2_src.clkr.hw
2218 },
2219 .num_parents = 1,
2220 .ops = &clk_branch_ops,
2221 .flags = CLK_SET_RATE_PARENT,
2222 },
2223 },
2224 };
2225
2226 static struct clk_rcg dsi1_byte_src = {
2227 .ns_reg = 0x00b0,
2228 .p = {
2229 .pre_div_shift = 12,
2230 .pre_div_width = 4,
2231 },
2232 .s = {
2233 .src_sel_shift = 0,
2234 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2235 },
2236 .clkr = {
2237 .enable_reg = 0x0090,
2238 .enable_mask = BIT(2),
2239 .hw.init = &(struct clk_init_data){
2240 .name = "dsi1_byte_src",
2241 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2242 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2243 .ops = &clk_rcg_bypass2_ops,
2244 .flags = CLK_SET_RATE_PARENT,
2245 },
2246 },
2247 };
2248
2249 static struct clk_branch dsi1_byte_clk = {
2250 .halt_reg = 0x01cc,
2251 .halt_bit = 21,
2252 .clkr = {
2253 .enable_reg = 0x0090,
2254 .enable_mask = BIT(0),
2255 .hw.init = &(struct clk_init_data){
2256 .name = "dsi1_byte_clk",
2257 .parent_hws = (const struct clk_hw*[]){
2258 &dsi1_byte_src.clkr.hw
2259 },
2260 .num_parents = 1,
2261 .ops = &clk_branch_ops,
2262 .flags = CLK_SET_RATE_PARENT,
2263 },
2264 },
2265 };
2266
2267 static struct clk_rcg dsi2_byte_src = {
2268 .ns_reg = 0x012c,
2269 .p = {
2270 .pre_div_shift = 12,
2271 .pre_div_width = 4,
2272 },
2273 .s = {
2274 .src_sel_shift = 0,
2275 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2276 },
2277 .clkr = {
2278 .enable_reg = 0x0130,
2279 .enable_mask = BIT(2),
2280 .hw.init = &(struct clk_init_data){
2281 .name = "dsi2_byte_src",
2282 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2283 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2284 .ops = &clk_rcg_bypass2_ops,
2285 .flags = CLK_SET_RATE_PARENT,
2286 },
2287 },
2288 };
2289
2290 static struct clk_branch dsi2_byte_clk = {
2291 .halt_reg = 0x01cc,
2292 .halt_bit = 20,
2293 .clkr = {
2294 .enable_reg = 0x00b4,
2295 .enable_mask = BIT(0),
2296 .hw.init = &(struct clk_init_data){
2297 .name = "dsi2_byte_clk",
2298 .parent_hws = (const struct clk_hw*[]){
2299 &dsi2_byte_src.clkr.hw
2300 },
2301 .num_parents = 1,
2302 .ops = &clk_branch_ops,
2303 .flags = CLK_SET_RATE_PARENT,
2304 },
2305 },
2306 };
2307
2308 static struct clk_rcg dsi1_esc_src = {
2309 .ns_reg = 0x0011c,
2310 .p = {
2311 .pre_div_shift = 12,
2312 .pre_div_width = 4,
2313 },
2314 .s = {
2315 .src_sel_shift = 0,
2316 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2317 },
2318 .clkr = {
2319 .enable_reg = 0x00cc,
2320 .enable_mask = BIT(2),
2321 .hw.init = &(struct clk_init_data){
2322 .name = "dsi1_esc_src",
2323 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2324 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2325 .ops = &clk_rcg_esc_ops,
2326 },
2327 },
2328 };
2329
2330 static struct clk_branch dsi1_esc_clk = {
2331 .halt_reg = 0x01e8,
2332 .halt_bit = 1,
2333 .clkr = {
2334 .enable_reg = 0x00cc,
2335 .enable_mask = BIT(0),
2336 .hw.init = &(struct clk_init_data){
2337 .name = "dsi1_esc_clk",
2338 .parent_hws = (const struct clk_hw*[]){
2339 &dsi1_esc_src.clkr.hw
2340 },
2341 .num_parents = 1,
2342 .ops = &clk_branch_ops,
2343 .flags = CLK_SET_RATE_PARENT,
2344 },
2345 },
2346 };
2347
2348 static struct clk_rcg dsi2_esc_src = {
2349 .ns_reg = 0x0150,
2350 .p = {
2351 .pre_div_shift = 12,
2352 .pre_div_width = 4,
2353 },
2354 .s = {
2355 .src_sel_shift = 0,
2356 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2357 },
2358 .clkr = {
2359 .enable_reg = 0x013c,
2360 .enable_mask = BIT(2),
2361 .hw.init = &(struct clk_init_data){
2362 .name = "dsi2_esc_src",
2363 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2364 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2365 .ops = &clk_rcg_esc_ops,
2366 },
2367 },
2368 };
2369
2370 static struct clk_branch dsi2_esc_clk = {
2371 .halt_reg = 0x01e8,
2372 .halt_bit = 3,
2373 .clkr = {
2374 .enable_reg = 0x013c,
2375 .enable_mask = BIT(0),
2376 .hw.init = &(struct clk_init_data){
2377 .name = "dsi2_esc_clk",
2378 .parent_hws = (const struct clk_hw*[]){
2379 &dsi2_esc_src.clkr.hw
2380 },
2381 .num_parents = 1,
2382 .ops = &clk_branch_ops,
2383 .flags = CLK_SET_RATE_PARENT,
2384 },
2385 },
2386 };
2387
2388 static struct clk_rcg dsi1_pixel_src = {
2389 .ns_reg = 0x0138,
2390 .md_reg = 0x0134,
2391 .mn = {
2392 .mnctr_en_bit = 5,
2393 .mnctr_reset_bit = 7,
2394 .mnctr_mode_shift = 6,
2395 .n_val_shift = 16,
2396 .m_val_shift = 8,
2397 .width = 8,
2398 },
2399 .p = {
2400 .pre_div_shift = 12,
2401 .pre_div_width = 4,
2402 },
2403 .s = {
2404 .src_sel_shift = 0,
2405 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2406 },
2407 .clkr = {
2408 .enable_reg = 0x0130,
2409 .enable_mask = BIT(2),
2410 .hw.init = &(struct clk_init_data){
2411 .name = "dsi1_pixel_src",
2412 .parent_data = mmcc_pxo_dsi2_dsi1,
2413 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
2414 .ops = &clk_rcg_pixel_ops,
2415 },
2416 },
2417 };
2418
2419 static struct clk_branch dsi1_pixel_clk = {
2420 .halt_reg = 0x01d0,
2421 .halt_bit = 6,
2422 .clkr = {
2423 .enable_reg = 0x0130,
2424 .enable_mask = BIT(0),
2425 .hw.init = &(struct clk_init_data){
2426 .name = "mdp_pclk1_clk",
2427 .parent_hws = (const struct clk_hw*[]){
2428 &dsi1_pixel_src.clkr.hw
2429 },
2430 .num_parents = 1,
2431 .ops = &clk_branch_ops,
2432 .flags = CLK_SET_RATE_PARENT,
2433 },
2434 },
2435 };
2436
2437 static struct clk_rcg dsi2_pixel_src = {
2438 .ns_reg = 0x00e4,
2439 .md_reg = 0x00b8,
2440 .mn = {
2441 .mnctr_en_bit = 5,
2442 .mnctr_reset_bit = 7,
2443 .mnctr_mode_shift = 6,
2444 .n_val_shift = 16,
2445 .m_val_shift = 8,
2446 .width = 8,
2447 },
2448 .p = {
2449 .pre_div_shift = 12,
2450 .pre_div_width = 4,
2451 },
2452 .s = {
2453 .src_sel_shift = 0,
2454 .parent_map = mmcc_pxo_dsi2_dsi1_lvds_map,
2455 },
2456 .clkr = {
2457 .enable_reg = 0x0094,
2458 .enable_mask = BIT(2),
2459 .hw.init = &(struct clk_init_data){
2460 .name = "dsi2_pixel_src",
2461 .parent_data = mmcc_pxo_dsi2_dsi1_lvds,
2462 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1_lvds),
2463 .ops = &clk_rcg_pixel_ops,
2464 },
2465 },
2466 };
2467
2468 static struct clk_branch dsi2_pixel_lvds_src = {
2469 .clkr = {
2470 .enable_reg = 0x0094,
2471 .enable_mask = BIT(0),
2472 .hw.init = &(struct clk_init_data){
2473 .name = "dsi2_pixel_lvds_src",
2474 .parent_hws = (const struct clk_hw*[]){
2475 &dsi2_pixel_src.clkr.hw
2476 },
2477 .num_parents = 1,
2478 .ops = &clk_branch_simple_ops,
2479 .flags = CLK_SET_RATE_PARENT,
2480 },
2481 },
2482 };
2483
2484 static struct clk_branch dsi2_pixel_clk = {
2485 .halt_reg = 0x01d0,
2486 .halt_bit = 19,
2487 .clkr = {
2488 .enable_reg = 0x0094,
2489 .enable_mask = 0,
2490 .hw.init = &(struct clk_init_data){
2491 .name = "mdp_pclk2_clk",
2492 .parent_hws = (const struct clk_hw*[]){
2493 &dsi2_pixel_src.clkr.hw
2494 },
2495 .num_parents = 1,
2496 .ops = &clk_branch_ops,
2497 .flags = CLK_SET_RATE_PARENT,
2498 },
2499 },
2500 };
2501
2502 static struct clk_branch lvds_clk = {
2503 .halt_reg = 0x024c,
2504 .halt_bit = 6,
2505 .clkr = {
2506 .enable_reg = 0x0264,
2507 .enable_mask = BIT(1),
2508 .hw.init = &(struct clk_init_data){
2509 .name = "mdp_lvds_clk",
2510 .parent_hws = (const struct clk_hw*[]){
2511 &dsi2_pixel_lvds_src.clkr.hw
2512 },
2513 .num_parents = 1,
2514 .ops = &clk_branch_ops,
2515 .flags = CLK_SET_RATE_PARENT,
2516 },
2517 },
2518 };
2519
2520 static struct clk_branch gfx2d0_ahb_clk = {
2521 .hwcg_reg = 0x0038,
2522 .hwcg_bit = 28,
2523 .halt_reg = 0x01dc,
2524 .halt_bit = 2,
2525 .clkr = {
2526 .enable_reg = 0x0008,
2527 .enable_mask = BIT(19),
2528 .hw.init = &(struct clk_init_data){
2529 .name = "gfx2d0_ahb_clk",
2530 .ops = &clk_branch_ops,
2531 },
2532 },
2533 };
2534
2535 static struct clk_branch gfx2d1_ahb_clk = {
2536 .hwcg_reg = 0x0038,
2537 .hwcg_bit = 29,
2538 .halt_reg = 0x01dc,
2539 .halt_bit = 3,
2540 .clkr = {
2541 .enable_reg = 0x0008,
2542 .enable_mask = BIT(2),
2543 .hw.init = &(struct clk_init_data){
2544 .name = "gfx2d1_ahb_clk",
2545 .ops = &clk_branch_ops,
2546 },
2547 },
2548 };
2549
2550 static struct clk_branch gfx3d_ahb_clk = {
2551 .hwcg_reg = 0x0038,
2552 .hwcg_bit = 27,
2553 .halt_reg = 0x01dc,
2554 .halt_bit = 4,
2555 .clkr = {
2556 .enable_reg = 0x0008,
2557 .enable_mask = BIT(3),
2558 .hw.init = &(struct clk_init_data){
2559 .name = "gfx3d_ahb_clk",
2560 .ops = &clk_branch_ops,
2561 },
2562 },
2563 };
2564
2565 static struct clk_branch hdmi_m_ahb_clk = {
2566 .hwcg_reg = 0x0038,
2567 .hwcg_bit = 21,
2568 .halt_reg = 0x01dc,
2569 .halt_bit = 5,
2570 .clkr = {
2571 .enable_reg = 0x0008,
2572 .enable_mask = BIT(14),
2573 .hw.init = &(struct clk_init_data){
2574 .name = "hdmi_m_ahb_clk",
2575 .ops = &clk_branch_ops,
2576 },
2577 },
2578 };
2579
2580 static struct clk_branch hdmi_s_ahb_clk = {
2581 .hwcg_reg = 0x0038,
2582 .hwcg_bit = 22,
2583 .halt_reg = 0x01dc,
2584 .halt_bit = 6,
2585 .clkr = {
2586 .enable_reg = 0x0008,
2587 .enable_mask = BIT(4),
2588 .hw.init = &(struct clk_init_data){
2589 .name = "hdmi_s_ahb_clk",
2590 .ops = &clk_branch_ops,
2591 },
2592 },
2593 };
2594
2595 static struct clk_branch ijpeg_ahb_clk = {
2596 .halt_reg = 0x01dc,
2597 .halt_bit = 9,
2598 .clkr = {
2599 .enable_reg = 0x0008,
2600 .enable_mask = BIT(5),
2601 .hw.init = &(struct clk_init_data){
2602 .name = "ijpeg_ahb_clk",
2603 .ops = &clk_branch_ops,
2604 },
2605 },
2606 };
2607
2608 static struct clk_branch mmss_imem_ahb_clk = {
2609 .hwcg_reg = 0x0038,
2610 .hwcg_bit = 12,
2611 .halt_reg = 0x01dc,
2612 .halt_bit = 10,
2613 .clkr = {
2614 .enable_reg = 0x0008,
2615 .enable_mask = BIT(6),
2616 .hw.init = &(struct clk_init_data){
2617 .name = "mmss_imem_ahb_clk",
2618 .ops = &clk_branch_ops,
2619 },
2620 },
2621 };
2622
2623 static struct clk_branch jpegd_ahb_clk = {
2624 .halt_reg = 0x01dc,
2625 .halt_bit = 7,
2626 .clkr = {
2627 .enable_reg = 0x0008,
2628 .enable_mask = BIT(21),
2629 .hw.init = &(struct clk_init_data){
2630 .name = "jpegd_ahb_clk",
2631 .ops = &clk_branch_ops,
2632 },
2633 },
2634 };
2635
2636 static struct clk_branch mdp_ahb_clk = {
2637 .halt_reg = 0x01dc,
2638 .halt_bit = 11,
2639 .clkr = {
2640 .enable_reg = 0x0008,
2641 .enable_mask = BIT(10),
2642 .hw.init = &(struct clk_init_data){
2643 .name = "mdp_ahb_clk",
2644 .ops = &clk_branch_ops,
2645 },
2646 },
2647 };
2648
2649 static struct clk_branch rot_ahb_clk = {
2650 .halt_reg = 0x01dc,
2651 .halt_bit = 13,
2652 .clkr = {
2653 .enable_reg = 0x0008,
2654 .enable_mask = BIT(12),
2655 .hw.init = &(struct clk_init_data){
2656 .name = "rot_ahb_clk",
2657 .ops = &clk_branch_ops,
2658 },
2659 },
2660 };
2661
2662 static struct clk_branch smmu_ahb_clk = {
2663 .hwcg_reg = 0x0008,
2664 .hwcg_bit = 26,
2665 .halt_reg = 0x01dc,
2666 .halt_bit = 22,
2667 .clkr = {
2668 .enable_reg = 0x0008,
2669 .enable_mask = BIT(15),
2670 .hw.init = &(struct clk_init_data){
2671 .name = "smmu_ahb_clk",
2672 .ops = &clk_branch_ops,
2673 },
2674 },
2675 };
2676
2677 static struct clk_branch tv_enc_ahb_clk = {
2678 .halt_reg = 0x01dc,
2679 .halt_bit = 23,
2680 .clkr = {
2681 .enable_reg = 0x0008,
2682 .enable_mask = BIT(25),
2683 .hw.init = &(struct clk_init_data){
2684 .name = "tv_enc_ahb_clk",
2685 .ops = &clk_branch_ops,
2686 },
2687 },
2688 };
2689
2690 static struct clk_branch vcap_ahb_clk = {
2691 .halt_reg = 0x0240,
2692 .halt_bit = 23,
2693 .clkr = {
2694 .enable_reg = 0x0248,
2695 .enable_mask = BIT(1),
2696 .hw.init = &(struct clk_init_data){
2697 .name = "vcap_ahb_clk",
2698 .ops = &clk_branch_ops,
2699 },
2700 },
2701 };
2702
2703 static struct clk_branch vcodec_ahb_clk = {
2704 .hwcg_reg = 0x0038,
2705 .hwcg_bit = 26,
2706 .halt_reg = 0x01dc,
2707 .halt_bit = 12,
2708 .clkr = {
2709 .enable_reg = 0x0008,
2710 .enable_mask = BIT(11),
2711 .hw.init = &(struct clk_init_data){
2712 .name = "vcodec_ahb_clk",
2713 .ops = &clk_branch_ops,
2714 },
2715 },
2716 };
2717
2718 static struct clk_branch vfe_ahb_clk = {
2719 .halt_reg = 0x01dc,
2720 .halt_bit = 14,
2721 .clkr = {
2722 .enable_reg = 0x0008,
2723 .enable_mask = BIT(13),
2724 .hw.init = &(struct clk_init_data){
2725 .name = "vfe_ahb_clk",
2726 .ops = &clk_branch_ops,
2727 },
2728 },
2729 };
2730
2731 static struct clk_branch vpe_ahb_clk = {
2732 .halt_reg = 0x01dc,
2733 .halt_bit = 15,
2734 .clkr = {
2735 .enable_reg = 0x0008,
2736 .enable_mask = BIT(16),
2737 .hw.init = &(struct clk_init_data){
2738 .name = "vpe_ahb_clk",
2739 .ops = &clk_branch_ops,
2740 },
2741 },
2742 };
2743
2744 static struct clk_regmap *mmcc_msm8960_clks[] = {
2745 [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
2746 [AMP_AHB_CLK] = &_ahb_clk.clkr,
2747 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2748 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2749 [GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr,
2750 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2751 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2752 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2753 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2754 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2755 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2756 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2757 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2758 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2759 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2760 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2761 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2762 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2763 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2764 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2765 [GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr,
2766 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2767 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2768 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2769 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2770 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2771 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2772 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2773 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2774 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2775 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2776 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2777 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2778 [CSI0_SRC] = &csi0_src.clkr,
2779 [CSI0_CLK] = &csi0_clk.clkr,
2780 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2781 [CSI1_SRC] = &csi1_src.clkr,
2782 [CSI1_CLK] = &csi1_clk.clkr,
2783 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2784 [CSI2_SRC] = &csi2_src.clkr,
2785 [CSI2_CLK] = &csi2_clk.clkr,
2786 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2787 [DSI_SRC] = &dsi1_src.clkr,
2788 [DSI_CLK] = &dsi1_clk.clkr,
2789 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2790 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2791 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2792 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2793 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2794 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2795 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2796 [GFX2D0_SRC] = &gfx2d0_src.clkr,
2797 [GFX2D0_CLK] = &gfx2d0_clk.clkr,
2798 [GFX2D1_SRC] = &gfx2d1_src.clkr,
2799 [GFX2D1_CLK] = &gfx2d1_clk.clkr,
2800 [GFX3D_SRC] = &gfx3d_src.clkr,
2801 [GFX3D_CLK] = &gfx3d_clk.clkr,
2802 [IJPEG_SRC] = &ijpeg_src.clkr,
2803 [IJPEG_CLK] = &ijpeg_clk.clkr,
2804 [JPEGD_SRC] = &jpegd_src.clkr,
2805 [JPEGD_CLK] = &jpegd_clk.clkr,
2806 [MDP_SRC] = &mdp_src.clkr,
2807 [MDP_CLK] = &mdp_clk.clkr,
2808 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2809 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
2810 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
2811 [DSI2_SRC] = &dsi2_src.clkr,
2812 [DSI2_CLK] = &dsi2_clk.clkr,
2813 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
2814 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
2815 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
2816 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
2817 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
2818 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
2819 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
2820 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
2821 [ROT_SRC] = &rot_src.clkr,
2822 [ROT_CLK] = &rot_clk.clkr,
2823 [TV_ENC_CLK] = &tv_enc_clk.clkr,
2824 [TV_DAC_CLK] = &tv_dac_clk.clkr,
2825 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
2826 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
2827 [TV_SRC] = &tv_src.clkr,
2828 [VCODEC_SRC] = &vcodec_src.clkr,
2829 [VCODEC_CLK] = &vcodec_clk.clkr,
2830 [VFE_SRC] = &vfe_src.clkr,
2831 [VFE_CLK] = &vfe_clk.clkr,
2832 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
2833 [VPE_SRC] = &vpe_src.clkr,
2834 [VPE_CLK] = &vpe_clk.clkr,
2835 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
2836 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
2837 [CAMCLK0_SRC] = &camclk0_src.clkr,
2838 [CAMCLK0_CLK] = &camclk0_clk.clkr,
2839 [CAMCLK1_SRC] = &camclk1_src.clkr,
2840 [CAMCLK1_CLK] = &camclk1_clk.clkr,
2841 [CAMCLK2_SRC] = &camclk2_src.clkr,
2842 [CAMCLK2_CLK] = &camclk2_clk.clkr,
2843 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
2844 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
2845 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
2846 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
2847 [PLL2] = &pll2.clkr,
2848 [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr,
2849 [LVDS_CLK] = &lvds_clk.clkr,
2850 };
2851
2852 static const struct qcom_reset_map mmcc_msm8960_resets[] = {
2853 [VPE_AXI_RESET] = { 0x0208, 15 },
2854 [IJPEG_AXI_RESET] = { 0x0208, 14 },
2855 [MPD_AXI_RESET] = { 0x0208, 13 },
2856 [VFE_AXI_RESET] = { 0x0208, 9 },
2857 [SP_AXI_RESET] = { 0x0208, 8 },
2858 [VCODEC_AXI_RESET] = { 0x0208, 7 },
2859 [ROT_AXI_RESET] = { 0x0208, 6 },
2860 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
2861 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
2862 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
2863 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
2864 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
2865 [FAB_S0_AXI_RESET] = { 0x0208 },
2866 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
2867 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
2868 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
2869 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
2870 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
2871 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
2872 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
2873 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
2874 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
2875 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
2876 [SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 },
2877 [SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 },
2878 [APU_AHB_RESET] = { 0x020c, 18 },
2879 [CSI_AHB_RESET] = { 0x020c, 17 },
2880 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
2881 [VPE_AHB_RESET] = { 0x020c, 14 },
2882 [FABRIC_AHB_RESET] = { 0x020c, 13 },
2883 [GFX2D0_AHB_RESET] = { 0x020c, 12 },
2884 [GFX2D1_AHB_RESET] = { 0x020c, 11 },
2885 [GFX3D_AHB_RESET] = { 0x020c, 10 },
2886 [HDMI_AHB_RESET] = { 0x020c, 9 },
2887 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
2888 [IJPEG_AHB_RESET] = { 0x020c, 7 },
2889 [DSI_M_AHB_RESET] = { 0x020c, 6 },
2890 [DSI_S_AHB_RESET] = { 0x020c, 5 },
2891 [JPEGD_AHB_RESET] = { 0x020c, 4 },
2892 [MDP_AHB_RESET] = { 0x020c, 3 },
2893 [ROT_AHB_RESET] = { 0x020c, 2 },
2894 [VCODEC_AHB_RESET] = { 0x020c, 1 },
2895 [VFE_AHB_RESET] = { 0x020c, 0 },
2896 [DSI2_M_AHB_RESET] = { 0x0210, 31 },
2897 [DSI2_S_AHB_RESET] = { 0x0210, 30 },
2898 [CSIPHY2_RESET] = { 0x0210, 29 },
2899 [CSI_PIX1_RESET] = { 0x0210, 28 },
2900 [CSIPHY0_RESET] = { 0x0210, 27 },
2901 [CSIPHY1_RESET] = { 0x0210, 26 },
2902 [DSI2_RESET] = { 0x0210, 25 },
2903 [VFE_CSI_RESET] = { 0x0210, 24 },
2904 [MDP_RESET] = { 0x0210, 21 },
2905 [AMP_RESET] = { 0x0210, 20 },
2906 [JPEGD_RESET] = { 0x0210, 19 },
2907 [CSI1_RESET] = { 0x0210, 18 },
2908 [VPE_RESET] = { 0x0210, 17 },
2909 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
2910 [VFE_RESET] = { 0x0210, 15 },
2911 [GFX2D0_RESET] = { 0x0210, 14 },
2912 [GFX2D1_RESET] = { 0x0210, 13 },
2913 [GFX3D_RESET] = { 0x0210, 12 },
2914 [HDMI_RESET] = { 0x0210, 11 },
2915 [MMSS_IMEM_RESET] = { 0x0210, 10 },
2916 [IJPEG_RESET] = { 0x0210, 9 },
2917 [CSI0_RESET] = { 0x0210, 8 },
2918 [DSI_RESET] = { 0x0210, 7 },
2919 [VCODEC_RESET] = { 0x0210, 6 },
2920 [MDP_TV_RESET] = { 0x0210, 4 },
2921 [MDP_VSYNC_RESET] = { 0x0210, 3 },
2922 [ROT_RESET] = { 0x0210, 2 },
2923 [TV_HDMI_RESET] = { 0x0210, 1 },
2924 [TV_ENC_RESET] = { 0x0210 },
2925 [CSI2_RESET] = { 0x0214, 2 },
2926 [CSI_RDI1_RESET] = { 0x0214, 1 },
2927 [CSI_RDI2_RESET] = { 0x0214 },
2928 };
2929
2930 static struct clk_regmap *mmcc_apq8064_clks[] = {
2931 [AMP_AHB_CLK] = &_ahb_clk.clkr,
2932 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2933 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2934 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2935 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2936 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2937 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2938 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2939 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2940 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2941 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2942 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2943 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2944 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2945 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2946 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2947 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2948 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2949 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2950 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2951 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2952 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2953 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2954 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2955 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2956 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2957 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2958 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2959 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2960 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2961 [CSI0_SRC] = &csi0_src.clkr,
2962 [CSI0_CLK] = &csi0_clk.clkr,
2963 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2964 [CSI1_SRC] = &csi1_src.clkr,
2965 [CSI1_CLK] = &csi1_clk.clkr,
2966 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2967 [CSI2_SRC] = &csi2_src.clkr,
2968 [CSI2_CLK] = &csi2_clk.clkr,
2969 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2970 [DSI_SRC] = &dsi1_src.clkr,
2971 [DSI_CLK] = &dsi1_clk.clkr,
2972 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2973 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2974 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2975 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2976 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2977 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2978 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2979 [GFX3D_SRC] = &gfx3d_src.clkr,
2980 [GFX3D_CLK] = &gfx3d_clk.clkr,
2981 [IJPEG_SRC] = &ijpeg_src.clkr,
2982 [IJPEG_CLK] = &ijpeg_clk.clkr,
2983 [JPEGD_SRC] = &jpegd_src.clkr,
2984 [JPEGD_CLK] = &jpegd_clk.clkr,
2985 [MDP_SRC] = &mdp_src.clkr,
2986 [MDP_CLK] = &mdp_clk.clkr,
2987 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2988 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
2989 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
2990 [DSI2_SRC] = &dsi2_src.clkr,
2991 [DSI2_CLK] = &dsi2_clk.clkr,
2992 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
2993 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
2994 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
2995 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
2996 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
2997 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
2998 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
2999 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
3000 [ROT_SRC] = &rot_src.clkr,
3001 [ROT_CLK] = &rot_clk.clkr,
3002 [TV_DAC_CLK] = &tv_dac_clk.clkr,
3003 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
3004 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
3005 [TV_SRC] = &tv_src.clkr,
3006 [VCODEC_SRC] = &vcodec_src.clkr,
3007 [VCODEC_CLK] = &vcodec_clk.clkr,
3008 [VFE_SRC] = &vfe_src.clkr,
3009 [VFE_CLK] = &vfe_clk.clkr,
3010 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
3011 [VPE_SRC] = &vpe_src.clkr,
3012 [VPE_CLK] = &vpe_clk.clkr,
3013 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
3014 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
3015 [CAMCLK0_SRC] = &camclk0_src.clkr,
3016 [CAMCLK0_CLK] = &camclk0_clk.clkr,
3017 [CAMCLK1_SRC] = &camclk1_src.clkr,
3018 [CAMCLK1_CLK] = &camclk1_clk.clkr,
3019 [CAMCLK2_SRC] = &camclk2_src.clkr,
3020 [CAMCLK2_CLK] = &camclk2_clk.clkr,
3021 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
3022 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
3023 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
3024 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
3025 [PLL2] = &pll2.clkr,
3026 [RGB_TV_CLK] = &rgb_tv_clk.clkr,
3027 [NPL_TV_CLK] = &npl_tv_clk.clkr,
3028 [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr,
3029 [VCAP_AXI_CLK] = &vcap_axi_clk.clkr,
3030 [VCAP_SRC] = &vcap_src.clkr,
3031 [VCAP_CLK] = &vcap_clk.clkr,
3032 [VCAP_NPL_CLK] = &vcap_npl_clk.clkr,
3033 [PLL15] = &pll15.clkr,
3034 [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr,
3035 [LVDS_CLK] = &lvds_clk.clkr,
3036 };
3037
3038 static const struct qcom_reset_map mmcc_apq8064_resets[] = {
3039 [GFX3D_AXI_RESET] = { 0x0208, 17 },
3040 [VCAP_AXI_RESET] = { 0x0208, 16 },
3041 [VPE_AXI_RESET] = { 0x0208, 15 },
3042 [IJPEG_AXI_RESET] = { 0x0208, 14 },
3043 [MPD_AXI_RESET] = { 0x0208, 13 },
3044 [VFE_AXI_RESET] = { 0x0208, 9 },
3045 [SP_AXI_RESET] = { 0x0208, 8 },
3046 [VCODEC_AXI_RESET] = { 0x0208, 7 },
3047 [ROT_AXI_RESET] = { 0x0208, 6 },
3048 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
3049 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
3050 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
3051 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
3052 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
3053 [FAB_S0_AXI_RESET] = { 0x0208 },
3054 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
3055 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
3056 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
3057 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
3058 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
3059 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
3060 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
3061 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
3062 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
3063 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
3064 [APU_AHB_RESET] = { 0x020c, 18 },
3065 [CSI_AHB_RESET] = { 0x020c, 17 },
3066 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
3067 [VPE_AHB_RESET] = { 0x020c, 14 },
3068 [FABRIC_AHB_RESET] = { 0x020c, 13 },
3069 [GFX3D_AHB_RESET] = { 0x020c, 10 },
3070 [HDMI_AHB_RESET] = { 0x020c, 9 },
3071 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
3072 [IJPEG_AHB_RESET] = { 0x020c, 7 },
3073 [DSI_M_AHB_RESET] = { 0x020c, 6 },
3074 [DSI_S_AHB_RESET] = { 0x020c, 5 },
3075 [JPEGD_AHB_RESET] = { 0x020c, 4 },
3076 [MDP_AHB_RESET] = { 0x020c, 3 },
3077 [ROT_AHB_RESET] = { 0x020c, 2 },
3078 [VCODEC_AHB_RESET] = { 0x020c, 1 },
3079 [VFE_AHB_RESET] = { 0x020c, 0 },
3080 [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 },
3081 [VCAP_AHB_RESET] = { 0x0200, 2 },
3082 [DSI2_M_AHB_RESET] = { 0x0200, 1 },
3083 [DSI2_S_AHB_RESET] = { 0x0200, 0 },
3084 [CSIPHY2_RESET] = { 0x0210, 31 },
3085 [CSI_PIX1_RESET] = { 0x0210, 30 },
3086 [CSIPHY0_RESET] = { 0x0210, 29 },
3087 [CSIPHY1_RESET] = { 0x0210, 28 },
3088 [CSI_RDI_RESET] = { 0x0210, 27 },
3089 [CSI_PIX_RESET] = { 0x0210, 26 },
3090 [DSI2_RESET] = { 0x0210, 25 },
3091 [VFE_CSI_RESET] = { 0x0210, 24 },
3092 [MDP_RESET] = { 0x0210, 21 },
3093 [AMP_RESET] = { 0x0210, 20 },
3094 [JPEGD_RESET] = { 0x0210, 19 },
3095 [CSI1_RESET] = { 0x0210, 18 },
3096 [VPE_RESET] = { 0x0210, 17 },
3097 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
3098 [VFE_RESET] = { 0x0210, 15 },
3099 [GFX3D_RESET] = { 0x0210, 12 },
3100 [HDMI_RESET] = { 0x0210, 11 },
3101 [MMSS_IMEM_RESET] = { 0x0210, 10 },
3102 [IJPEG_RESET] = { 0x0210, 9 },
3103 [CSI0_RESET] = { 0x0210, 8 },
3104 [DSI_RESET] = { 0x0210, 7 },
3105 [VCODEC_RESET] = { 0x0210, 6 },
3106 [MDP_TV_RESET] = { 0x0210, 4 },
3107 [MDP_VSYNC_RESET] = { 0x0210, 3 },
3108 [ROT_RESET] = { 0x0210, 2 },
3109 [TV_HDMI_RESET] = { 0x0210, 1 },
3110 [VCAP_NPL_RESET] = { 0x0214, 4 },
3111 [VCAP_RESET] = { 0x0214, 3 },
3112 [CSI2_RESET] = { 0x0214, 2 },
3113 [CSI_RDI1_RESET] = { 0x0214, 1 },
3114 [CSI_RDI2_RESET] = { 0x0214 },
3115 };
3116
3117 static const struct regmap_config mmcc_msm8960_regmap_config = {
3118 .reg_bits = 32,
3119 .reg_stride = 4,
3120 .val_bits = 32,
3121 .max_register = 0x334,
3122 .fast_io = true,
3123 };
3124
3125 static const struct regmap_config mmcc_apq8064_regmap_config = {
3126 .reg_bits = 32,
3127 .reg_stride = 4,
3128 .val_bits = 32,
3129 .max_register = 0x350,
3130 .fast_io = true,
3131 };
3132
3133 static const struct qcom_cc_desc mmcc_msm8960_desc = {
3134 .config = &mmcc_msm8960_regmap_config,
3135 .clks = mmcc_msm8960_clks,
3136 .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
3137 .resets = mmcc_msm8960_resets,
3138 .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
3139 };
3140
3141 static const struct qcom_cc_desc mmcc_apq8064_desc = {
3142 .config = &mmcc_apq8064_regmap_config,
3143 .clks = mmcc_apq8064_clks,
3144 .num_clks = ARRAY_SIZE(mmcc_apq8064_clks),
3145 .resets = mmcc_apq8064_resets,
3146 .num_resets = ARRAY_SIZE(mmcc_apq8064_resets),
3147 };
3148
3149 static const struct of_device_id mmcc_msm8960_match_table[] = {
3150 { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
3151 { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
3152 { }
3153 };
3154 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
3155
mmcc_msm8960_probe(struct platform_device * pdev)3156 static int mmcc_msm8960_probe(struct platform_device *pdev)
3157 {
3158 struct regmap *regmap;
3159 struct device *dev = &pdev->dev;
3160 const struct qcom_cc_desc *desc = device_get_match_data(dev);
3161
3162 if (desc == &mmcc_apq8064_desc) {
3163 gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064;
3164 gfx3d_src.clkr.hw.init = &gfx3d_8064_init;
3165 gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
3166 gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
3167 }
3168
3169 regmap = qcom_cc_map(pdev, desc);
3170 if (IS_ERR(regmap))
3171 return PTR_ERR(regmap);
3172
3173 clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
3174
3175 return qcom_cc_really_probe(&pdev->dev, desc, regmap);
3176 }
3177
3178 static struct platform_driver mmcc_msm8960_driver = {
3179 .probe = mmcc_msm8960_probe,
3180 .driver = {
3181 .name = "mmcc-msm8960",
3182 .of_match_table = mmcc_msm8960_match_table,
3183 },
3184 };
3185
3186 module_platform_driver(mmcc_msm8960_driver);
3187
3188 MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
3189 MODULE_LICENSE("GPL v2");
3190 MODULE_ALIAS("platform:mmcc-msm8960");
3191