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