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