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