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