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