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