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