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