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