1/*
2 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/kernel.h>
15#include <linux/bitops.h>
16#include <linux/err.h>
17#include <linux/platform_device.h>
18#include <linux/module.h>
19#include <linux/of.h>
20#include <linux/of_device.h>
21#include <linux/clk-provider.h>
22#include <linux/regmap.h>
23#include <linux/reset-controller.h>
24
25#include <dt-bindings/clock/qcom,mmcc-msm8974.h>
26#include <dt-bindings/reset/qcom,mmcc-msm8974.h>
27
28#include "common.h"
29#include "clk-regmap.h"
30#include "clk-pll.h"
31#include "clk-rcg.h"
32#include "clk-branch.h"
33#include "reset.h"
34#include "gdsc.h"
35
36enum {
37	P_XO,
38	P_MMPLL0,
39	P_EDPLINK,
40	P_MMPLL1,
41	P_HDMIPLL,
42	P_GPLL0,
43	P_EDPVCO,
44	P_GPLL1,
45	P_DSI0PLL,
46	P_DSI0PLL_BYTE,
47	P_MMPLL2,
48	P_MMPLL3,
49	P_DSI1PLL,
50	P_DSI1PLL_BYTE,
51};
52
53static const struct parent_map mmcc_xo_mmpll0_mmpll1_gpll0_map[] = {
54	{ P_XO, 0 },
55	{ P_MMPLL0, 1 },
56	{ P_MMPLL1, 2 },
57	{ P_GPLL0, 5 }
58};
59
60static const char * const mmcc_xo_mmpll0_mmpll1_gpll0[] = {
61	"xo",
62	"mmpll0_vote",
63	"mmpll1_vote",
64	"mmss_gpll0_vote",
65};
66
67static const struct parent_map mmcc_xo_mmpll0_dsi_hdmi_gpll0_map[] = {
68	{ P_XO, 0 },
69	{ P_MMPLL0, 1 },
70	{ P_HDMIPLL, 4 },
71	{ P_GPLL0, 5 },
72	{ P_DSI0PLL, 2 },
73	{ P_DSI1PLL, 3 }
74};
75
76static const char * const mmcc_xo_mmpll0_dsi_hdmi_gpll0[] = {
77	"xo",
78	"mmpll0_vote",
79	"hdmipll",
80	"mmss_gpll0_vote",
81	"dsi0pll",
82	"dsi1pll",
83};
84
85static const struct parent_map mmcc_xo_mmpll0_1_2_gpll0_map[] = {
86	{ P_XO, 0 },
87	{ P_MMPLL0, 1 },
88	{ P_MMPLL1, 2 },
89	{ P_GPLL0, 5 },
90	{ P_MMPLL2, 3 }
91};
92
93static const char * const mmcc_xo_mmpll0_1_2_gpll0[] = {
94	"xo",
95	"mmpll0_vote",
96	"mmpll1_vote",
97	"mmss_gpll0_vote",
98	"mmpll2",
99};
100
101static const struct parent_map mmcc_xo_mmpll0_1_3_gpll0_map[] = {
102	{ P_XO, 0 },
103	{ P_MMPLL0, 1 },
104	{ P_MMPLL1, 2 },
105	{ P_GPLL0, 5 },
106	{ P_MMPLL3, 3 }
107};
108
109static const char * const mmcc_xo_mmpll0_1_3_gpll0[] = {
110	"xo",
111	"mmpll0_vote",
112	"mmpll1_vote",
113	"mmss_gpll0_vote",
114	"mmpll3",
115};
116
117static const struct parent_map mmcc_xo_mmpll0_1_gpll1_0_map[] = {
118	{ P_XO, 0 },
119	{ P_MMPLL0, 1 },
120	{ P_MMPLL1, 2 },
121	{ P_GPLL0, 5 },
122	{ P_GPLL1, 4 }
123};
124
125static const char * const mmcc_xo_mmpll0_1_gpll1_0[] = {
126	"xo",
127	"mmpll0_vote",
128	"mmpll1_vote",
129	"mmss_gpll0_vote",
130	"gpll1_vote",
131};
132
133static const struct parent_map mmcc_xo_dsi_hdmi_edp_map[] = {
134	{ P_XO, 0 },
135	{ P_EDPLINK, 4 },
136	{ P_HDMIPLL, 3 },
137	{ P_EDPVCO, 5 },
138	{ P_DSI0PLL, 1 },
139	{ P_DSI1PLL, 2 }
140};
141
142static const char * const mmcc_xo_dsi_hdmi_edp[] = {
143	"xo",
144	"edp_link_clk",
145	"hdmipll",
146	"edp_vco_div",
147	"dsi0pll",
148	"dsi1pll",
149};
150
151static const struct parent_map mmcc_xo_dsi_hdmi_edp_gpll0_map[] = {
152	{ P_XO, 0 },
153	{ P_EDPLINK, 4 },
154	{ P_HDMIPLL, 3 },
155	{ P_GPLL0, 5 },
156	{ P_DSI0PLL, 1 },
157	{ P_DSI1PLL, 2 }
158};
159
160static const char * const mmcc_xo_dsi_hdmi_edp_gpll0[] = {
161	"xo",
162	"edp_link_clk",
163	"hdmipll",
164	"gpll0_vote",
165	"dsi0pll",
166	"dsi1pll",
167};
168
169static const struct parent_map mmcc_xo_dsibyte_hdmi_edp_gpll0_map[] = {
170	{ P_XO, 0 },
171	{ P_EDPLINK, 4 },
172	{ P_HDMIPLL, 3 },
173	{ P_GPLL0, 5 },
174	{ P_DSI0PLL_BYTE, 1 },
175	{ P_DSI1PLL_BYTE, 2 }
176};
177
178static const char * const mmcc_xo_dsibyte_hdmi_edp_gpll0[] = {
179	"xo",
180	"edp_link_clk",
181	"hdmipll",
182	"gpll0_vote",
183	"dsi0pllbyte",
184	"dsi1pllbyte",
185};
186
187#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
188
189static struct clk_pll mmpll0 = {
190	.l_reg = 0x0004,
191	.m_reg = 0x0008,
192	.n_reg = 0x000c,
193	.config_reg = 0x0014,
194	.mode_reg = 0x0000,
195	.status_reg = 0x001c,
196	.status_bit = 17,
197        .clkr.hw.init = &(struct clk_init_data){
198                .name = "mmpll0",
199                .parent_names = (const char *[]){ "xo" },
200                .num_parents = 1,
201                .ops = &clk_pll_ops,
202        },
203};
204
205static struct clk_regmap mmpll0_vote = {
206	.enable_reg = 0x0100,
207	.enable_mask = BIT(0),
208	.hw.init = &(struct clk_init_data){
209		.name = "mmpll0_vote",
210		.parent_names = (const char *[]){ "mmpll0" },
211		.num_parents = 1,
212		.ops = &clk_pll_vote_ops,
213	},
214};
215
216static struct clk_pll mmpll1 = {
217	.l_reg = 0x0044,
218	.m_reg = 0x0048,
219	.n_reg = 0x004c,
220	.config_reg = 0x0050,
221	.mode_reg = 0x0040,
222	.status_reg = 0x005c,
223	.status_bit = 17,
224        .clkr.hw.init = &(struct clk_init_data){
225                .name = "mmpll1",
226                .parent_names = (const char *[]){ "xo" },
227                .num_parents = 1,
228                .ops = &clk_pll_ops,
229        },
230};
231
232static struct clk_regmap mmpll1_vote = {
233	.enable_reg = 0x0100,
234	.enable_mask = BIT(1),
235	.hw.init = &(struct clk_init_data){
236		.name = "mmpll1_vote",
237		.parent_names = (const char *[]){ "mmpll1" },
238		.num_parents = 1,
239		.ops = &clk_pll_vote_ops,
240	},
241};
242
243static struct clk_pll mmpll2 = {
244	.l_reg = 0x4104,
245	.m_reg = 0x4108,
246	.n_reg = 0x410c,
247	.config_reg = 0x4110,
248	.mode_reg = 0x4100,
249	.status_reg = 0x411c,
250        .clkr.hw.init = &(struct clk_init_data){
251                .name = "mmpll2",
252                .parent_names = (const char *[]){ "xo" },
253                .num_parents = 1,
254                .ops = &clk_pll_ops,
255        },
256};
257
258static struct clk_pll mmpll3 = {
259	.l_reg = 0x0084,
260	.m_reg = 0x0088,
261	.n_reg = 0x008c,
262	.config_reg = 0x0090,
263	.mode_reg = 0x0080,
264	.status_reg = 0x009c,
265	.status_bit = 17,
266        .clkr.hw.init = &(struct clk_init_data){
267                .name = "mmpll3",
268                .parent_names = (const char *[]){ "xo" },
269                .num_parents = 1,
270                .ops = &clk_pll_ops,
271        },
272};
273
274static struct clk_rcg2 mmss_ahb_clk_src = {
275	.cmd_rcgr = 0x5000,
276	.hid_width = 5,
277	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
278	.clkr.hw.init = &(struct clk_init_data){
279		.name = "mmss_ahb_clk_src",
280		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
281		.num_parents = 4,
282		.ops = &clk_rcg2_ops,
283	},
284};
285
286static struct freq_tbl ftbl_mmss_axi_clk[] = {
287	F( 19200000, P_XO, 1, 0, 0),
288	F( 37500000, P_GPLL0, 16, 0, 0),
289	F( 50000000, P_GPLL0, 12, 0, 0),
290	F( 75000000, P_GPLL0, 8, 0, 0),
291	F(100000000, P_GPLL0, 6, 0, 0),
292	F(150000000, P_GPLL0, 4, 0, 0),
293	F(291750000, P_MMPLL1, 4, 0, 0),
294	F(400000000, P_MMPLL0, 2, 0, 0),
295	F(466800000, P_MMPLL1, 2.5, 0, 0),
296};
297
298static struct clk_rcg2 mmss_axi_clk_src = {
299	.cmd_rcgr = 0x5040,
300	.hid_width = 5,
301	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
302	.freq_tbl = ftbl_mmss_axi_clk,
303	.clkr.hw.init = &(struct clk_init_data){
304		.name = "mmss_axi_clk_src",
305		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
306		.num_parents = 4,
307		.ops = &clk_rcg2_ops,
308	},
309};
310
311static struct freq_tbl ftbl_ocmemnoc_clk[] = {
312	F( 19200000, P_XO, 1, 0, 0),
313	F( 37500000, P_GPLL0, 16, 0, 0),
314	F( 50000000, P_GPLL0, 12, 0, 0),
315	F( 75000000, P_GPLL0, 8, 0, 0),
316	F(100000000, P_GPLL0, 6, 0, 0),
317	F(150000000, P_GPLL0, 4, 0, 0),
318	F(291750000, P_MMPLL1, 4, 0, 0),
319	F(400000000, P_MMPLL0, 2, 0, 0),
320};
321
322static struct clk_rcg2 ocmemnoc_clk_src = {
323	.cmd_rcgr = 0x5090,
324	.hid_width = 5,
325	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
326	.freq_tbl = ftbl_ocmemnoc_clk,
327	.clkr.hw.init = &(struct clk_init_data){
328		.name = "ocmemnoc_clk_src",
329		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
330		.num_parents = 4,
331		.ops = &clk_rcg2_ops,
332	},
333};
334
335static struct freq_tbl ftbl_camss_csi0_3_clk[] = {
336	F(100000000, P_GPLL0, 6, 0, 0),
337	F(200000000, P_MMPLL0, 4, 0, 0),
338	{ }
339};
340
341static struct clk_rcg2 csi0_clk_src = {
342	.cmd_rcgr = 0x3090,
343	.hid_width = 5,
344	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
345	.freq_tbl = ftbl_camss_csi0_3_clk,
346	.clkr.hw.init = &(struct clk_init_data){
347		.name = "csi0_clk_src",
348		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
349		.num_parents = 4,
350		.ops = &clk_rcg2_ops,
351	},
352};
353
354static struct clk_rcg2 csi1_clk_src = {
355	.cmd_rcgr = 0x3100,
356	.hid_width = 5,
357	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
358	.freq_tbl = ftbl_camss_csi0_3_clk,
359	.clkr.hw.init = &(struct clk_init_data){
360		.name = "csi1_clk_src",
361		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
362		.num_parents = 4,
363		.ops = &clk_rcg2_ops,
364	},
365};
366
367static struct clk_rcg2 csi2_clk_src = {
368	.cmd_rcgr = 0x3160,
369	.hid_width = 5,
370	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
371	.freq_tbl = ftbl_camss_csi0_3_clk,
372	.clkr.hw.init = &(struct clk_init_data){
373		.name = "csi2_clk_src",
374		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
375		.num_parents = 4,
376		.ops = &clk_rcg2_ops,
377	},
378};
379
380static struct clk_rcg2 csi3_clk_src = {
381	.cmd_rcgr = 0x31c0,
382	.hid_width = 5,
383	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
384	.freq_tbl = ftbl_camss_csi0_3_clk,
385	.clkr.hw.init = &(struct clk_init_data){
386		.name = "csi3_clk_src",
387		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
388		.num_parents = 4,
389		.ops = &clk_rcg2_ops,
390	},
391};
392
393static struct freq_tbl ftbl_camss_vfe_vfe0_1_clk[] = {
394	F(37500000, P_GPLL0, 16, 0, 0),
395	F(50000000, P_GPLL0, 12, 0, 0),
396	F(60000000, P_GPLL0, 10, 0, 0),
397	F(80000000, P_GPLL0, 7.5, 0, 0),
398	F(100000000, P_GPLL0, 6, 0, 0),
399	F(109090000, P_GPLL0, 5.5, 0, 0),
400	F(133330000, P_GPLL0, 4.5, 0, 0),
401	F(200000000, P_GPLL0, 3, 0, 0),
402	F(228570000, P_MMPLL0, 3.5, 0, 0),
403	F(266670000, P_MMPLL0, 3, 0, 0),
404	F(320000000, P_MMPLL0, 2.5, 0, 0),
405	F(400000000, P_MMPLL0, 2, 0, 0),
406	F(465000000, P_MMPLL3, 2, 0, 0),
407	{ }
408};
409
410static struct clk_rcg2 vfe0_clk_src = {
411	.cmd_rcgr = 0x3600,
412	.hid_width = 5,
413	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
414	.freq_tbl = ftbl_camss_vfe_vfe0_1_clk,
415	.clkr.hw.init = &(struct clk_init_data){
416		.name = "vfe0_clk_src",
417		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
418		.num_parents = 4,
419		.ops = &clk_rcg2_ops,
420	},
421};
422
423static struct clk_rcg2 vfe1_clk_src = {
424	.cmd_rcgr = 0x3620,
425	.hid_width = 5,
426	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
427	.freq_tbl = ftbl_camss_vfe_vfe0_1_clk,
428	.clkr.hw.init = &(struct clk_init_data){
429		.name = "vfe1_clk_src",
430		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
431		.num_parents = 4,
432		.ops = &clk_rcg2_ops,
433	},
434};
435
436static struct freq_tbl ftbl_mdss_mdp_clk[] = {
437	F(37500000, P_GPLL0, 16, 0, 0),
438	F(60000000, P_GPLL0, 10, 0, 0),
439	F(75000000, P_GPLL0, 8, 0, 0),
440	F(85710000, P_GPLL0, 7, 0, 0),
441	F(100000000, P_GPLL0, 6, 0, 0),
442	F(133330000, P_MMPLL0, 6, 0, 0),
443	F(160000000, P_MMPLL0, 5, 0, 0),
444	F(200000000, P_MMPLL0, 4, 0, 0),
445	F(228570000, P_MMPLL0, 3.5, 0, 0),
446	F(240000000, P_GPLL0, 2.5, 0, 0),
447	F(266670000, P_MMPLL0, 3, 0, 0),
448	F(320000000, P_MMPLL0, 2.5, 0, 0),
449	{ }
450};
451
452static struct clk_rcg2 mdp_clk_src = {
453	.cmd_rcgr = 0x2040,
454	.hid_width = 5,
455	.parent_map = mmcc_xo_mmpll0_dsi_hdmi_gpll0_map,
456	.freq_tbl = ftbl_mdss_mdp_clk,
457	.clkr.hw.init = &(struct clk_init_data){
458		.name = "mdp_clk_src",
459		.parent_names = mmcc_xo_mmpll0_dsi_hdmi_gpll0,
460		.num_parents = 6,
461		.ops = &clk_rcg2_ops,
462	},
463};
464
465static struct clk_rcg2 gfx3d_clk_src = {
466	.cmd_rcgr = 0x4000,
467	.hid_width = 5,
468	.parent_map = mmcc_xo_mmpll0_1_2_gpll0_map,
469	.clkr.hw.init = &(struct clk_init_data){
470		.name = "gfx3d_clk_src",
471		.parent_names = mmcc_xo_mmpll0_1_2_gpll0,
472		.num_parents = 5,
473		.ops = &clk_rcg2_ops,
474	},
475};
476
477static struct freq_tbl ftbl_camss_jpeg_jpeg0_2_clk[] = {
478	F(75000000, P_GPLL0, 8, 0, 0),
479	F(133330000, P_GPLL0, 4.5, 0, 0),
480	F(200000000, P_GPLL0, 3, 0, 0),
481	F(228570000, P_MMPLL0, 3.5, 0, 0),
482	F(266670000, P_MMPLL0, 3, 0, 0),
483	F(320000000, P_MMPLL0, 2.5, 0, 0),
484	{ }
485};
486
487static struct clk_rcg2 jpeg0_clk_src = {
488	.cmd_rcgr = 0x3500,
489	.hid_width = 5,
490	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
491	.freq_tbl = ftbl_camss_jpeg_jpeg0_2_clk,
492	.clkr.hw.init = &(struct clk_init_data){
493		.name = "jpeg0_clk_src",
494		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
495		.num_parents = 4,
496		.ops = &clk_rcg2_ops,
497	},
498};
499
500static struct clk_rcg2 jpeg1_clk_src = {
501	.cmd_rcgr = 0x3520,
502	.hid_width = 5,
503	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
504	.freq_tbl = ftbl_camss_jpeg_jpeg0_2_clk,
505	.clkr.hw.init = &(struct clk_init_data){
506		.name = "jpeg1_clk_src",
507		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
508		.num_parents = 4,
509		.ops = &clk_rcg2_ops,
510	},
511};
512
513static struct clk_rcg2 jpeg2_clk_src = {
514	.cmd_rcgr = 0x3540,
515	.hid_width = 5,
516	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
517	.freq_tbl = ftbl_camss_jpeg_jpeg0_2_clk,
518	.clkr.hw.init = &(struct clk_init_data){
519		.name = "jpeg2_clk_src",
520		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
521		.num_parents = 4,
522		.ops = &clk_rcg2_ops,
523	},
524};
525
526static struct clk_rcg2 pclk0_clk_src = {
527	.cmd_rcgr = 0x2000,
528	.mnd_width = 8,
529	.hid_width = 5,
530	.parent_map = mmcc_xo_dsi_hdmi_edp_gpll0_map,
531	.clkr.hw.init = &(struct clk_init_data){
532		.name = "pclk0_clk_src",
533		.parent_names = mmcc_xo_dsi_hdmi_edp_gpll0,
534		.num_parents = 6,
535		.ops = &clk_pixel_ops,
536		.flags = CLK_SET_RATE_PARENT,
537	},
538};
539
540static struct clk_rcg2 pclk1_clk_src = {
541	.cmd_rcgr = 0x2020,
542	.mnd_width = 8,
543	.hid_width = 5,
544	.parent_map = mmcc_xo_dsi_hdmi_edp_gpll0_map,
545	.clkr.hw.init = &(struct clk_init_data){
546		.name = "pclk1_clk_src",
547		.parent_names = mmcc_xo_dsi_hdmi_edp_gpll0,
548		.num_parents = 6,
549		.ops = &clk_pixel_ops,
550		.flags = CLK_SET_RATE_PARENT,
551	},
552};
553
554static struct freq_tbl ftbl_venus0_vcodec0_clk[] = {
555	F(50000000, P_GPLL0, 12, 0, 0),
556	F(100000000, P_GPLL0, 6, 0, 0),
557	F(133330000, P_MMPLL0, 6, 0, 0),
558	F(200000000, P_MMPLL0, 4, 0, 0),
559	F(266670000, P_MMPLL0, 3, 0, 0),
560	F(465000000, P_MMPLL3, 2, 0, 0),
561	{ }
562};
563
564static struct clk_rcg2 vcodec0_clk_src = {
565	.cmd_rcgr = 0x1000,
566	.mnd_width = 8,
567	.hid_width = 5,
568	.parent_map = mmcc_xo_mmpll0_1_3_gpll0_map,
569	.freq_tbl = ftbl_venus0_vcodec0_clk,
570	.clkr.hw.init = &(struct clk_init_data){
571		.name = "vcodec0_clk_src",
572		.parent_names = mmcc_xo_mmpll0_1_3_gpll0,
573		.num_parents = 5,
574		.ops = &clk_rcg2_ops,
575	},
576};
577
578static struct freq_tbl ftbl_camss_cci_cci_clk[] = {
579	F(19200000, P_XO, 1, 0, 0),
580	{ }
581};
582
583static struct clk_rcg2 cci_clk_src = {
584	.cmd_rcgr = 0x3300,
585	.hid_width = 5,
586	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
587	.freq_tbl = ftbl_camss_cci_cci_clk,
588	.clkr.hw.init = &(struct clk_init_data){
589		.name = "cci_clk_src",
590		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
591		.num_parents = 4,
592		.ops = &clk_rcg2_ops,
593	},
594};
595
596static struct freq_tbl ftbl_camss_gp0_1_clk[] = {
597	F(10000, P_XO, 16, 1, 120),
598	F(24000, P_XO, 16, 1, 50),
599	F(6000000, P_GPLL0, 10, 1, 10),
600	F(12000000, P_GPLL0, 10, 1, 5),
601	F(13000000, P_GPLL0, 4, 13, 150),
602	F(24000000, P_GPLL0, 5, 1, 5),
603	{ }
604};
605
606static struct clk_rcg2 camss_gp0_clk_src = {
607	.cmd_rcgr = 0x3420,
608	.mnd_width = 8,
609	.hid_width = 5,
610	.parent_map = mmcc_xo_mmpll0_1_gpll1_0_map,
611	.freq_tbl = ftbl_camss_gp0_1_clk,
612	.clkr.hw.init = &(struct clk_init_data){
613		.name = "camss_gp0_clk_src",
614		.parent_names = mmcc_xo_mmpll0_1_gpll1_0,
615		.num_parents = 5,
616		.ops = &clk_rcg2_ops,
617	},
618};
619
620static struct clk_rcg2 camss_gp1_clk_src = {
621	.cmd_rcgr = 0x3450,
622	.mnd_width = 8,
623	.hid_width = 5,
624	.parent_map = mmcc_xo_mmpll0_1_gpll1_0_map,
625	.freq_tbl = ftbl_camss_gp0_1_clk,
626	.clkr.hw.init = &(struct clk_init_data){
627		.name = "camss_gp1_clk_src",
628		.parent_names = mmcc_xo_mmpll0_1_gpll1_0,
629		.num_parents = 5,
630		.ops = &clk_rcg2_ops,
631	},
632};
633
634static struct freq_tbl ftbl_camss_mclk0_3_clk[] = {
635	F(4800000, P_XO, 4, 0, 0),
636	F(6000000, P_GPLL0, 10, 1, 10),
637	F(8000000, P_GPLL0, 15, 1, 5),
638	F(9600000, P_XO, 2, 0, 0),
639	F(16000000, P_GPLL0, 12.5, 1, 3),
640	F(19200000, P_XO, 1, 0, 0),
641	F(24000000, P_GPLL0, 5, 1, 5),
642	F(32000000, P_MMPLL0, 5, 1, 5),
643	F(48000000, P_GPLL0, 12.5, 0, 0),
644	F(64000000, P_MMPLL0, 12.5, 0, 0),
645	F(66670000, P_GPLL0, 9, 0, 0),
646	{ }
647};
648
649static struct clk_rcg2 mclk0_clk_src = {
650	.cmd_rcgr = 0x3360,
651	.hid_width = 5,
652	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
653	.freq_tbl = ftbl_camss_mclk0_3_clk,
654	.clkr.hw.init = &(struct clk_init_data){
655		.name = "mclk0_clk_src",
656		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
657		.num_parents = 4,
658		.ops = &clk_rcg2_ops,
659	},
660};
661
662static struct clk_rcg2 mclk1_clk_src = {
663	.cmd_rcgr = 0x3390,
664	.hid_width = 5,
665	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
666	.freq_tbl = ftbl_camss_mclk0_3_clk,
667	.clkr.hw.init = &(struct clk_init_data){
668		.name = "mclk1_clk_src",
669		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
670		.num_parents = 4,
671		.ops = &clk_rcg2_ops,
672	},
673};
674
675static struct clk_rcg2 mclk2_clk_src = {
676	.cmd_rcgr = 0x33c0,
677	.hid_width = 5,
678	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
679	.freq_tbl = ftbl_camss_mclk0_3_clk,
680	.clkr.hw.init = &(struct clk_init_data){
681		.name = "mclk2_clk_src",
682		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
683		.num_parents = 4,
684		.ops = &clk_rcg2_ops,
685	},
686};
687
688static struct clk_rcg2 mclk3_clk_src = {
689	.cmd_rcgr = 0x33f0,
690	.hid_width = 5,
691	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
692	.freq_tbl = ftbl_camss_mclk0_3_clk,
693	.clkr.hw.init = &(struct clk_init_data){
694		.name = "mclk3_clk_src",
695		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
696		.num_parents = 4,
697		.ops = &clk_rcg2_ops,
698	},
699};
700
701static struct freq_tbl ftbl_camss_phy0_2_csi0_2phytimer_clk[] = {
702	F(100000000, P_GPLL0, 6, 0, 0),
703	F(200000000, P_MMPLL0, 4, 0, 0),
704	{ }
705};
706
707static struct clk_rcg2 csi0phytimer_clk_src = {
708	.cmd_rcgr = 0x3000,
709	.hid_width = 5,
710	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
711	.freq_tbl = ftbl_camss_phy0_2_csi0_2phytimer_clk,
712	.clkr.hw.init = &(struct clk_init_data){
713		.name = "csi0phytimer_clk_src",
714		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
715		.num_parents = 4,
716		.ops = &clk_rcg2_ops,
717	},
718};
719
720static struct clk_rcg2 csi1phytimer_clk_src = {
721	.cmd_rcgr = 0x3030,
722	.hid_width = 5,
723	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
724	.freq_tbl = ftbl_camss_phy0_2_csi0_2phytimer_clk,
725	.clkr.hw.init = &(struct clk_init_data){
726		.name = "csi1phytimer_clk_src",
727		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
728		.num_parents = 4,
729		.ops = &clk_rcg2_ops,
730	},
731};
732
733static struct clk_rcg2 csi2phytimer_clk_src = {
734	.cmd_rcgr = 0x3060,
735	.hid_width = 5,
736	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
737	.freq_tbl = ftbl_camss_phy0_2_csi0_2phytimer_clk,
738	.clkr.hw.init = &(struct clk_init_data){
739		.name = "csi2phytimer_clk_src",
740		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
741		.num_parents = 4,
742		.ops = &clk_rcg2_ops,
743	},
744};
745
746static struct freq_tbl ftbl_camss_vfe_cpp_clk[] = {
747	F(133330000, P_GPLL0, 4.5, 0, 0),
748	F(266670000, P_MMPLL0, 3, 0, 0),
749	F(320000000, P_MMPLL0, 2.5, 0, 0),
750	F(400000000, P_MMPLL0, 2, 0, 0),
751	F(465000000, P_MMPLL3, 2, 0, 0),
752	{ }
753};
754
755static struct clk_rcg2 cpp_clk_src = {
756	.cmd_rcgr = 0x3640,
757	.hid_width = 5,
758	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
759	.freq_tbl = ftbl_camss_vfe_cpp_clk,
760	.clkr.hw.init = &(struct clk_init_data){
761		.name = "cpp_clk_src",
762		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
763		.num_parents = 4,
764		.ops = &clk_rcg2_ops,
765	},
766};
767
768static struct freq_tbl byte_freq_tbl[] = {
769	{ .src = P_DSI0PLL_BYTE },
770	{ }
771};
772
773static struct clk_rcg2 byte0_clk_src = {
774	.cmd_rcgr = 0x2120,
775	.hid_width = 5,
776	.parent_map = mmcc_xo_dsibyte_hdmi_edp_gpll0_map,
777	.freq_tbl = byte_freq_tbl,
778	.clkr.hw.init = &(struct clk_init_data){
779		.name = "byte0_clk_src",
780		.parent_names = mmcc_xo_dsibyte_hdmi_edp_gpll0,
781		.num_parents = 6,
782		.ops = &clk_byte2_ops,
783		.flags = CLK_SET_RATE_PARENT,
784	},
785};
786
787static struct clk_rcg2 byte1_clk_src = {
788	.cmd_rcgr = 0x2140,
789	.hid_width = 5,
790	.parent_map = mmcc_xo_dsibyte_hdmi_edp_gpll0_map,
791	.freq_tbl = byte_freq_tbl,
792	.clkr.hw.init = &(struct clk_init_data){
793		.name = "byte1_clk_src",
794		.parent_names = mmcc_xo_dsibyte_hdmi_edp_gpll0,
795		.num_parents = 6,
796		.ops = &clk_byte2_ops,
797		.flags = CLK_SET_RATE_PARENT,
798	},
799};
800
801static struct freq_tbl ftbl_mdss_edpaux_clk[] = {
802	F(19200000, P_XO, 1, 0, 0),
803	{ }
804};
805
806static struct clk_rcg2 edpaux_clk_src = {
807	.cmd_rcgr = 0x20e0,
808	.hid_width = 5,
809	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
810	.freq_tbl = ftbl_mdss_edpaux_clk,
811	.clkr.hw.init = &(struct clk_init_data){
812		.name = "edpaux_clk_src",
813		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
814		.num_parents = 4,
815		.ops = &clk_rcg2_ops,
816	},
817};
818
819static struct freq_tbl ftbl_mdss_edplink_clk[] = {
820	F(135000000, P_EDPLINK, 2, 0, 0),
821	F(270000000, P_EDPLINK, 11, 0, 0),
822	{ }
823};
824
825static struct clk_rcg2 edplink_clk_src = {
826	.cmd_rcgr = 0x20c0,
827	.hid_width = 5,
828	.parent_map = mmcc_xo_dsi_hdmi_edp_gpll0_map,
829	.freq_tbl = ftbl_mdss_edplink_clk,
830	.clkr.hw.init = &(struct clk_init_data){
831		.name = "edplink_clk_src",
832		.parent_names = mmcc_xo_dsi_hdmi_edp_gpll0,
833		.num_parents = 6,
834		.ops = &clk_rcg2_ops,
835		.flags = CLK_SET_RATE_PARENT,
836	},
837};
838
839static struct freq_tbl edp_pixel_freq_tbl[] = {
840	{ .src = P_EDPVCO },
841	{ }
842};
843
844static struct clk_rcg2 edppixel_clk_src = {
845	.cmd_rcgr = 0x20a0,
846	.mnd_width = 8,
847	.hid_width = 5,
848	.parent_map = mmcc_xo_dsi_hdmi_edp_map,
849	.freq_tbl = edp_pixel_freq_tbl,
850	.clkr.hw.init = &(struct clk_init_data){
851		.name = "edppixel_clk_src",
852		.parent_names = mmcc_xo_dsi_hdmi_edp,
853		.num_parents = 6,
854		.ops = &clk_edp_pixel_ops,
855	},
856};
857
858static struct freq_tbl ftbl_mdss_esc0_1_clk[] = {
859	F(19200000, P_XO, 1, 0, 0),
860	{ }
861};
862
863static struct clk_rcg2 esc0_clk_src = {
864	.cmd_rcgr = 0x2160,
865	.hid_width = 5,
866	.parent_map = mmcc_xo_dsibyte_hdmi_edp_gpll0_map,
867	.freq_tbl = ftbl_mdss_esc0_1_clk,
868	.clkr.hw.init = &(struct clk_init_data){
869		.name = "esc0_clk_src",
870		.parent_names = mmcc_xo_dsibyte_hdmi_edp_gpll0,
871		.num_parents = 6,
872		.ops = &clk_rcg2_ops,
873	},
874};
875
876static struct clk_rcg2 esc1_clk_src = {
877	.cmd_rcgr = 0x2180,
878	.hid_width = 5,
879	.parent_map = mmcc_xo_dsibyte_hdmi_edp_gpll0_map,
880	.freq_tbl = ftbl_mdss_esc0_1_clk,
881	.clkr.hw.init = &(struct clk_init_data){
882		.name = "esc1_clk_src",
883		.parent_names = mmcc_xo_dsibyte_hdmi_edp_gpll0,
884		.num_parents = 6,
885		.ops = &clk_rcg2_ops,
886	},
887};
888
889static struct freq_tbl extpclk_freq_tbl[] = {
890	{ .src = P_HDMIPLL },
891	{ }
892};
893
894static struct clk_rcg2 extpclk_clk_src = {
895	.cmd_rcgr = 0x2060,
896	.hid_width = 5,
897	.parent_map = mmcc_xo_dsi_hdmi_edp_gpll0_map,
898	.freq_tbl = extpclk_freq_tbl,
899	.clkr.hw.init = &(struct clk_init_data){
900		.name = "extpclk_clk_src",
901		.parent_names = mmcc_xo_dsi_hdmi_edp_gpll0,
902		.num_parents = 6,
903		.ops = &clk_byte_ops,
904		.flags = CLK_SET_RATE_PARENT,
905	},
906};
907
908static struct freq_tbl ftbl_mdss_hdmi_clk[] = {
909	F(19200000, P_XO, 1, 0, 0),
910	{ }
911};
912
913static struct clk_rcg2 hdmi_clk_src = {
914	.cmd_rcgr = 0x2100,
915	.hid_width = 5,
916	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
917	.freq_tbl = ftbl_mdss_hdmi_clk,
918	.clkr.hw.init = &(struct clk_init_data){
919		.name = "hdmi_clk_src",
920		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
921		.num_parents = 4,
922		.ops = &clk_rcg2_ops,
923	},
924};
925
926static struct freq_tbl ftbl_mdss_vsync_clk[] = {
927	F(19200000, P_XO, 1, 0, 0),
928	{ }
929};
930
931static struct clk_rcg2 vsync_clk_src = {
932	.cmd_rcgr = 0x2080,
933	.hid_width = 5,
934	.parent_map = mmcc_xo_mmpll0_mmpll1_gpll0_map,
935	.freq_tbl = ftbl_mdss_vsync_clk,
936	.clkr.hw.init = &(struct clk_init_data){
937		.name = "vsync_clk_src",
938		.parent_names = mmcc_xo_mmpll0_mmpll1_gpll0,
939		.num_parents = 4,
940		.ops = &clk_rcg2_ops,
941	},
942};
943
944static struct clk_branch camss_cci_cci_ahb_clk = {
945	.halt_reg = 0x3348,
946	.clkr = {
947		.enable_reg = 0x3348,
948		.enable_mask = BIT(0),
949		.hw.init = &(struct clk_init_data){
950			.name = "camss_cci_cci_ahb_clk",
951			.parent_names = (const char *[]){
952				"mmss_ahb_clk_src",
953			},
954			.num_parents = 1,
955			.ops = &clk_branch2_ops,
956		},
957	},
958};
959
960static struct clk_branch camss_cci_cci_clk = {
961	.halt_reg = 0x3344,
962	.clkr = {
963		.enable_reg = 0x3344,
964		.enable_mask = BIT(0),
965		.hw.init = &(struct clk_init_data){
966			.name = "camss_cci_cci_clk",
967			.parent_names = (const char *[]){
968				"cci_clk_src",
969			},
970			.num_parents = 1,
971			.flags = CLK_SET_RATE_PARENT,
972			.ops = &clk_branch2_ops,
973		},
974	},
975};
976
977static struct clk_branch camss_csi0_ahb_clk = {
978	.halt_reg = 0x30bc,
979	.clkr = {
980		.enable_reg = 0x30bc,
981		.enable_mask = BIT(0),
982		.hw.init = &(struct clk_init_data){
983			.name = "camss_csi0_ahb_clk",
984			.parent_names = (const char *[]){
985				"mmss_ahb_clk_src",
986			},
987			.num_parents = 1,
988			.ops = &clk_branch2_ops,
989		},
990	},
991};
992
993static struct clk_branch camss_csi0_clk = {
994	.halt_reg = 0x30b4,
995	.clkr = {
996		.enable_reg = 0x30b4,
997		.enable_mask = BIT(0),
998		.hw.init = &(struct clk_init_data){
999			.name = "camss_csi0_clk",
1000			.parent_names = (const char *[]){
1001				"csi0_clk_src",
1002			},
1003			.num_parents = 1,
1004			.flags = CLK_SET_RATE_PARENT,
1005			.ops = &clk_branch2_ops,
1006		},
1007	},
1008};
1009
1010static struct clk_branch camss_csi0phy_clk = {
1011	.halt_reg = 0x30c4,
1012	.clkr = {
1013		.enable_reg = 0x30c4,
1014		.enable_mask = BIT(0),
1015		.hw.init = &(struct clk_init_data){
1016			.name = "camss_csi0phy_clk",
1017			.parent_names = (const char *[]){
1018				"csi0_clk_src",
1019			},
1020			.num_parents = 1,
1021			.flags = CLK_SET_RATE_PARENT,
1022			.ops = &clk_branch2_ops,
1023		},
1024	},
1025};
1026
1027static struct clk_branch camss_csi0pix_clk = {
1028	.halt_reg = 0x30e4,
1029	.clkr = {
1030		.enable_reg = 0x30e4,
1031		.enable_mask = BIT(0),
1032		.hw.init = &(struct clk_init_data){
1033			.name = "camss_csi0pix_clk",
1034			.parent_names = (const char *[]){
1035				"csi0_clk_src",
1036			},
1037			.num_parents = 1,
1038			.flags = CLK_SET_RATE_PARENT,
1039			.ops = &clk_branch2_ops,
1040		},
1041	},
1042};
1043
1044static struct clk_branch camss_csi0rdi_clk = {
1045	.halt_reg = 0x30d4,
1046	.clkr = {
1047		.enable_reg = 0x30d4,
1048		.enable_mask = BIT(0),
1049		.hw.init = &(struct clk_init_data){
1050			.name = "camss_csi0rdi_clk",
1051			.parent_names = (const char *[]){
1052				"csi0_clk_src",
1053			},
1054			.num_parents = 1,
1055			.flags = CLK_SET_RATE_PARENT,
1056			.ops = &clk_branch2_ops,
1057		},
1058	},
1059};
1060
1061static struct clk_branch camss_csi1_ahb_clk = {
1062	.halt_reg = 0x3128,
1063	.clkr = {
1064		.enable_reg = 0x3128,
1065		.enable_mask = BIT(0),
1066		.hw.init = &(struct clk_init_data){
1067			.name = "camss_csi1_ahb_clk",
1068			.parent_names = (const char *[]){
1069				"mmss_ahb_clk_src",
1070			},
1071			.num_parents = 1,
1072			.ops = &clk_branch2_ops,
1073		},
1074	},
1075};
1076
1077static struct clk_branch camss_csi1_clk = {
1078	.halt_reg = 0x3124,
1079	.clkr = {
1080		.enable_reg = 0x3124,
1081		.enable_mask = BIT(0),
1082		.hw.init = &(struct clk_init_data){
1083			.name = "camss_csi1_clk",
1084			.parent_names = (const char *[]){
1085				"csi1_clk_src",
1086			},
1087			.num_parents = 1,
1088			.flags = CLK_SET_RATE_PARENT,
1089			.ops = &clk_branch2_ops,
1090		},
1091	},
1092};
1093
1094static struct clk_branch camss_csi1phy_clk = {
1095	.halt_reg = 0x3134,
1096	.clkr = {
1097		.enable_reg = 0x3134,
1098		.enable_mask = BIT(0),
1099		.hw.init = &(struct clk_init_data){
1100			.name = "camss_csi1phy_clk",
1101			.parent_names = (const char *[]){
1102				"csi1_clk_src",
1103			},
1104			.num_parents = 1,
1105			.flags = CLK_SET_RATE_PARENT,
1106			.ops = &clk_branch2_ops,
1107		},
1108	},
1109};
1110
1111static struct clk_branch camss_csi1pix_clk = {
1112	.halt_reg = 0x3154,
1113	.clkr = {
1114		.enable_reg = 0x3154,
1115		.enable_mask = BIT(0),
1116		.hw.init = &(struct clk_init_data){
1117			.name = "camss_csi1pix_clk",
1118			.parent_names = (const char *[]){
1119				"csi1_clk_src",
1120			},
1121			.num_parents = 1,
1122			.flags = CLK_SET_RATE_PARENT,
1123			.ops = &clk_branch2_ops,
1124		},
1125	},
1126};
1127
1128static struct clk_branch camss_csi1rdi_clk = {
1129	.halt_reg = 0x3144,
1130	.clkr = {
1131		.enable_reg = 0x3144,
1132		.enable_mask = BIT(0),
1133		.hw.init = &(struct clk_init_data){
1134			.name = "camss_csi1rdi_clk",
1135			.parent_names = (const char *[]){
1136				"csi1_clk_src",
1137			},
1138			.num_parents = 1,
1139			.flags = CLK_SET_RATE_PARENT,
1140			.ops = &clk_branch2_ops,
1141		},
1142	},
1143};
1144
1145static struct clk_branch camss_csi2_ahb_clk = {
1146	.halt_reg = 0x3188,
1147	.clkr = {
1148		.enable_reg = 0x3188,
1149		.enable_mask = BIT(0),
1150		.hw.init = &(struct clk_init_data){
1151			.name = "camss_csi2_ahb_clk",
1152			.parent_names = (const char *[]){
1153				"mmss_ahb_clk_src",
1154			},
1155			.num_parents = 1,
1156			.ops = &clk_branch2_ops,
1157		},
1158	},
1159};
1160
1161static struct clk_branch camss_csi2_clk = {
1162	.halt_reg = 0x3184,
1163	.clkr = {
1164		.enable_reg = 0x3184,
1165		.enable_mask = BIT(0),
1166		.hw.init = &(struct clk_init_data){
1167			.name = "camss_csi2_clk",
1168			.parent_names = (const char *[]){
1169				"csi2_clk_src",
1170			},
1171			.num_parents = 1,
1172			.flags = CLK_SET_RATE_PARENT,
1173			.ops = &clk_branch2_ops,
1174		},
1175	},
1176};
1177
1178static struct clk_branch camss_csi2phy_clk = {
1179	.halt_reg = 0x3194,
1180	.clkr = {
1181		.enable_reg = 0x3194,
1182		.enable_mask = BIT(0),
1183		.hw.init = &(struct clk_init_data){
1184			.name = "camss_csi2phy_clk",
1185			.parent_names = (const char *[]){
1186				"csi2_clk_src",
1187			},
1188			.num_parents = 1,
1189			.flags = CLK_SET_RATE_PARENT,
1190			.ops = &clk_branch2_ops,
1191		},
1192	},
1193};
1194
1195static struct clk_branch camss_csi2pix_clk = {
1196	.halt_reg = 0x31b4,
1197	.clkr = {
1198		.enable_reg = 0x31b4,
1199		.enable_mask = BIT(0),
1200		.hw.init = &(struct clk_init_data){
1201			.name = "camss_csi2pix_clk",
1202			.parent_names = (const char *[]){
1203				"csi2_clk_src",
1204			},
1205			.num_parents = 1,
1206			.flags = CLK_SET_RATE_PARENT,
1207			.ops = &clk_branch2_ops,
1208		},
1209	},
1210};
1211
1212static struct clk_branch camss_csi2rdi_clk = {
1213	.halt_reg = 0x31a4,
1214	.clkr = {
1215		.enable_reg = 0x31a4,
1216		.enable_mask = BIT(0),
1217		.hw.init = &(struct clk_init_data){
1218			.name = "camss_csi2rdi_clk",
1219			.parent_names = (const char *[]){
1220				"csi2_clk_src",
1221			},
1222			.num_parents = 1,
1223			.flags = CLK_SET_RATE_PARENT,
1224			.ops = &clk_branch2_ops,
1225		},
1226	},
1227};
1228
1229static struct clk_branch camss_csi3_ahb_clk = {
1230	.halt_reg = 0x31e8,
1231	.clkr = {
1232		.enable_reg = 0x31e8,
1233		.enable_mask = BIT(0),
1234		.hw.init = &(struct clk_init_data){
1235			.name = "camss_csi3_ahb_clk",
1236			.parent_names = (const char *[]){
1237				"mmss_ahb_clk_src",
1238			},
1239			.num_parents = 1,
1240			.ops = &clk_branch2_ops,
1241		},
1242	},
1243};
1244
1245static struct clk_branch camss_csi3_clk = {
1246	.halt_reg = 0x31e4,
1247	.clkr = {
1248		.enable_reg = 0x31e4,
1249		.enable_mask = BIT(0),
1250		.hw.init = &(struct clk_init_data){
1251			.name = "camss_csi3_clk",
1252			.parent_names = (const char *[]){
1253				"csi3_clk_src",
1254			},
1255			.num_parents = 1,
1256			.flags = CLK_SET_RATE_PARENT,
1257			.ops = &clk_branch2_ops,
1258		},
1259	},
1260};
1261
1262static struct clk_branch camss_csi3phy_clk = {
1263	.halt_reg = 0x31f4,
1264	.clkr = {
1265		.enable_reg = 0x31f4,
1266		.enable_mask = BIT(0),
1267		.hw.init = &(struct clk_init_data){
1268			.name = "camss_csi3phy_clk",
1269			.parent_names = (const char *[]){
1270				"csi3_clk_src",
1271			},
1272			.num_parents = 1,
1273			.flags = CLK_SET_RATE_PARENT,
1274			.ops = &clk_branch2_ops,
1275		},
1276	},
1277};
1278
1279static struct clk_branch camss_csi3pix_clk = {
1280	.halt_reg = 0x3214,
1281	.clkr = {
1282		.enable_reg = 0x3214,
1283		.enable_mask = BIT(0),
1284		.hw.init = &(struct clk_init_data){
1285			.name = "camss_csi3pix_clk",
1286			.parent_names = (const char *[]){
1287				"csi3_clk_src",
1288			},
1289			.num_parents = 1,
1290			.flags = CLK_SET_RATE_PARENT,
1291			.ops = &clk_branch2_ops,
1292		},
1293	},
1294};
1295
1296static struct clk_branch camss_csi3rdi_clk = {
1297	.halt_reg = 0x3204,
1298	.clkr = {
1299		.enable_reg = 0x3204,
1300		.enable_mask = BIT(0),
1301		.hw.init = &(struct clk_init_data){
1302			.name = "camss_csi3rdi_clk",
1303			.parent_names = (const char *[]){
1304				"csi3_clk_src",
1305			},
1306			.num_parents = 1,
1307			.flags = CLK_SET_RATE_PARENT,
1308			.ops = &clk_branch2_ops,
1309		},
1310	},
1311};
1312
1313static struct clk_branch camss_csi_vfe0_clk = {
1314	.halt_reg = 0x3704,
1315	.clkr = {
1316		.enable_reg = 0x3704,
1317		.enable_mask = BIT(0),
1318		.hw.init = &(struct clk_init_data){
1319			.name = "camss_csi_vfe0_clk",
1320			.parent_names = (const char *[]){
1321				"vfe0_clk_src",
1322			},
1323			.num_parents = 1,
1324			.flags = CLK_SET_RATE_PARENT,
1325			.ops = &clk_branch2_ops,
1326		},
1327	},
1328};
1329
1330static struct clk_branch camss_csi_vfe1_clk = {
1331	.halt_reg = 0x3714,
1332	.clkr = {
1333		.enable_reg = 0x3714,
1334		.enable_mask = BIT(0),
1335		.hw.init = &(struct clk_init_data){
1336			.name = "camss_csi_vfe1_clk",
1337			.parent_names = (const char *[]){
1338				"vfe1_clk_src",
1339			},
1340			.num_parents = 1,
1341			.flags = CLK_SET_RATE_PARENT,
1342			.ops = &clk_branch2_ops,
1343		},
1344	},
1345};
1346
1347static struct clk_branch camss_gp0_clk = {
1348	.halt_reg = 0x3444,
1349	.clkr = {
1350		.enable_reg = 0x3444,
1351		.enable_mask = BIT(0),
1352		.hw.init = &(struct clk_init_data){
1353			.name = "camss_gp0_clk",
1354			.parent_names = (const char *[]){
1355				"camss_gp0_clk_src",
1356			},
1357			.num_parents = 1,
1358			.flags = CLK_SET_RATE_PARENT,
1359			.ops = &clk_branch2_ops,
1360		},
1361	},
1362};
1363
1364static struct clk_branch camss_gp1_clk = {
1365	.halt_reg = 0x3474,
1366	.clkr = {
1367		.enable_reg = 0x3474,
1368		.enable_mask = BIT(0),
1369		.hw.init = &(struct clk_init_data){
1370			.name = "camss_gp1_clk",
1371			.parent_names = (const char *[]){
1372				"camss_gp1_clk_src",
1373			},
1374			.num_parents = 1,
1375			.flags = CLK_SET_RATE_PARENT,
1376			.ops = &clk_branch2_ops,
1377		},
1378	},
1379};
1380
1381static struct clk_branch camss_ispif_ahb_clk = {
1382	.halt_reg = 0x3224,
1383	.clkr = {
1384		.enable_reg = 0x3224,
1385		.enable_mask = BIT(0),
1386		.hw.init = &(struct clk_init_data){
1387			.name = "camss_ispif_ahb_clk",
1388			.parent_names = (const char *[]){
1389				"mmss_ahb_clk_src",
1390			},
1391			.num_parents = 1,
1392			.ops = &clk_branch2_ops,
1393		},
1394	},
1395};
1396
1397static struct clk_branch camss_jpeg_jpeg0_clk = {
1398	.halt_reg = 0x35a8,
1399	.clkr = {
1400		.enable_reg = 0x35a8,
1401		.enable_mask = BIT(0),
1402		.hw.init = &(struct clk_init_data){
1403			.name = "camss_jpeg_jpeg0_clk",
1404			.parent_names = (const char *[]){
1405				"jpeg0_clk_src",
1406			},
1407			.num_parents = 1,
1408			.flags = CLK_SET_RATE_PARENT,
1409			.ops = &clk_branch2_ops,
1410		},
1411	},
1412};
1413
1414static struct clk_branch camss_jpeg_jpeg1_clk = {
1415	.halt_reg = 0x35ac,
1416	.clkr = {
1417		.enable_reg = 0x35ac,
1418		.enable_mask = BIT(0),
1419		.hw.init = &(struct clk_init_data){
1420			.name = "camss_jpeg_jpeg1_clk",
1421			.parent_names = (const char *[]){
1422				"jpeg1_clk_src",
1423			},
1424			.num_parents = 1,
1425			.flags = CLK_SET_RATE_PARENT,
1426			.ops = &clk_branch2_ops,
1427		},
1428	},
1429};
1430
1431static struct clk_branch camss_jpeg_jpeg2_clk = {
1432	.halt_reg = 0x35b0,
1433	.clkr = {
1434		.enable_reg = 0x35b0,
1435		.enable_mask = BIT(0),
1436		.hw.init = &(struct clk_init_data){
1437			.name = "camss_jpeg_jpeg2_clk",
1438			.parent_names = (const char *[]){
1439				"jpeg2_clk_src",
1440			},
1441			.num_parents = 1,
1442			.flags = CLK_SET_RATE_PARENT,
1443			.ops = &clk_branch2_ops,
1444		},
1445	},
1446};
1447
1448static struct clk_branch camss_jpeg_jpeg_ahb_clk = {
1449	.halt_reg = 0x35b4,
1450	.clkr = {
1451		.enable_reg = 0x35b4,
1452		.enable_mask = BIT(0),
1453		.hw.init = &(struct clk_init_data){
1454			.name = "camss_jpeg_jpeg_ahb_clk",
1455			.parent_names = (const char *[]){
1456				"mmss_ahb_clk_src",
1457			},
1458			.num_parents = 1,
1459			.ops = &clk_branch2_ops,
1460		},
1461	},
1462};
1463
1464static struct clk_branch camss_jpeg_jpeg_axi_clk = {
1465	.halt_reg = 0x35b8,
1466	.clkr = {
1467		.enable_reg = 0x35b8,
1468		.enable_mask = BIT(0),
1469		.hw.init = &(struct clk_init_data){
1470			.name = "camss_jpeg_jpeg_axi_clk",
1471			.parent_names = (const char *[]){
1472				"mmss_axi_clk_src",
1473			},
1474			.num_parents = 1,
1475			.ops = &clk_branch2_ops,
1476		},
1477	},
1478};
1479
1480static struct clk_branch camss_jpeg_jpeg_ocmemnoc_clk = {
1481	.halt_reg = 0x35bc,
1482	.clkr = {
1483		.enable_reg = 0x35bc,
1484		.enable_mask = BIT(0),
1485		.hw.init = &(struct clk_init_data){
1486			.name = "camss_jpeg_jpeg_ocmemnoc_clk",
1487			.parent_names = (const char *[]){
1488				"ocmemnoc_clk_src",
1489			},
1490			.num_parents = 1,
1491			.flags = CLK_SET_RATE_PARENT,
1492			.ops = &clk_branch2_ops,
1493		},
1494	},
1495};
1496
1497static struct clk_branch camss_mclk0_clk = {
1498	.halt_reg = 0x3384,
1499	.clkr = {
1500		.enable_reg = 0x3384,
1501		.enable_mask = BIT(0),
1502		.hw.init = &(struct clk_init_data){
1503			.name = "camss_mclk0_clk",
1504			.parent_names = (const char *[]){
1505				"mclk0_clk_src",
1506			},
1507			.num_parents = 1,
1508			.flags = CLK_SET_RATE_PARENT,
1509			.ops = &clk_branch2_ops,
1510		},
1511	},
1512};
1513
1514static struct clk_branch camss_mclk1_clk = {
1515	.halt_reg = 0x33b4,
1516	.clkr = {
1517		.enable_reg = 0x33b4,
1518		.enable_mask = BIT(0),
1519		.hw.init = &(struct clk_init_data){
1520			.name = "camss_mclk1_clk",
1521			.parent_names = (const char *[]){
1522				"mclk1_clk_src",
1523			},
1524			.num_parents = 1,
1525			.flags = CLK_SET_RATE_PARENT,
1526			.ops = &clk_branch2_ops,
1527		},
1528	},
1529};
1530
1531static struct clk_branch camss_mclk2_clk = {
1532	.halt_reg = 0x33e4,
1533	.clkr = {
1534		.enable_reg = 0x33e4,
1535		.enable_mask = BIT(0),
1536		.hw.init = &(struct clk_init_data){
1537			.name = "camss_mclk2_clk",
1538			.parent_names = (const char *[]){
1539				"mclk2_clk_src",
1540			},
1541			.num_parents = 1,
1542			.flags = CLK_SET_RATE_PARENT,
1543			.ops = &clk_branch2_ops,
1544		},
1545	},
1546};
1547
1548static struct clk_branch camss_mclk3_clk = {
1549	.halt_reg = 0x3414,
1550	.clkr = {
1551		.enable_reg = 0x3414,
1552		.enable_mask = BIT(0),
1553		.hw.init = &(struct clk_init_data){
1554			.name = "camss_mclk3_clk",
1555			.parent_names = (const char *[]){
1556				"mclk3_clk_src",
1557			},
1558			.num_parents = 1,
1559			.flags = CLK_SET_RATE_PARENT,
1560			.ops = &clk_branch2_ops,
1561		},
1562	},
1563};
1564
1565static struct clk_branch camss_micro_ahb_clk = {
1566	.halt_reg = 0x3494,
1567	.clkr = {
1568		.enable_reg = 0x3494,
1569		.enable_mask = BIT(0),
1570		.hw.init = &(struct clk_init_data){
1571			.name = "camss_micro_ahb_clk",
1572			.parent_names = (const char *[]){
1573				"mmss_ahb_clk_src",
1574			},
1575			.num_parents = 1,
1576			.ops = &clk_branch2_ops,
1577		},
1578	},
1579};
1580
1581static struct clk_branch camss_phy0_csi0phytimer_clk = {
1582	.halt_reg = 0x3024,
1583	.clkr = {
1584		.enable_reg = 0x3024,
1585		.enable_mask = BIT(0),
1586		.hw.init = &(struct clk_init_data){
1587			.name = "camss_phy0_csi0phytimer_clk",
1588			.parent_names = (const char *[]){
1589				"csi0phytimer_clk_src",
1590			},
1591			.num_parents = 1,
1592			.flags = CLK_SET_RATE_PARENT,
1593			.ops = &clk_branch2_ops,
1594		},
1595	},
1596};
1597
1598static struct clk_branch camss_phy1_csi1phytimer_clk = {
1599	.halt_reg = 0x3054,
1600	.clkr = {
1601		.enable_reg = 0x3054,
1602		.enable_mask = BIT(0),
1603		.hw.init = &(struct clk_init_data){
1604			.name = "camss_phy1_csi1phytimer_clk",
1605			.parent_names = (const char *[]){
1606				"csi1phytimer_clk_src",
1607			},
1608			.num_parents = 1,
1609			.flags = CLK_SET_RATE_PARENT,
1610			.ops = &clk_branch2_ops,
1611		},
1612	},
1613};
1614
1615static struct clk_branch camss_phy2_csi2phytimer_clk = {
1616	.halt_reg = 0x3084,
1617	.clkr = {
1618		.enable_reg = 0x3084,
1619		.enable_mask = BIT(0),
1620		.hw.init = &(struct clk_init_data){
1621			.name = "camss_phy2_csi2phytimer_clk",
1622			.parent_names = (const char *[]){
1623				"csi2phytimer_clk_src",
1624			},
1625			.num_parents = 1,
1626			.flags = CLK_SET_RATE_PARENT,
1627			.ops = &clk_branch2_ops,
1628		},
1629	},
1630};
1631
1632static struct clk_branch camss_top_ahb_clk = {
1633	.halt_reg = 0x3484,
1634	.clkr = {
1635		.enable_reg = 0x3484,
1636		.enable_mask = BIT(0),
1637		.hw.init = &(struct clk_init_data){
1638			.name = "camss_top_ahb_clk",
1639			.parent_names = (const char *[]){
1640				"mmss_ahb_clk_src",
1641			},
1642			.num_parents = 1,
1643			.ops = &clk_branch2_ops,
1644		},
1645	},
1646};
1647
1648static struct clk_branch camss_vfe_cpp_ahb_clk = {
1649	.halt_reg = 0x36b4,
1650	.clkr = {
1651		.enable_reg = 0x36b4,
1652		.enable_mask = BIT(0),
1653		.hw.init = &(struct clk_init_data){
1654			.name = "camss_vfe_cpp_ahb_clk",
1655			.parent_names = (const char *[]){
1656				"mmss_ahb_clk_src",
1657			},
1658			.num_parents = 1,
1659			.ops = &clk_branch2_ops,
1660		},
1661	},
1662};
1663
1664static struct clk_branch camss_vfe_cpp_clk = {
1665	.halt_reg = 0x36b0,
1666	.clkr = {
1667		.enable_reg = 0x36b0,
1668		.enable_mask = BIT(0),
1669		.hw.init = &(struct clk_init_data){
1670			.name = "camss_vfe_cpp_clk",
1671			.parent_names = (const char *[]){
1672				"cpp_clk_src",
1673			},
1674			.num_parents = 1,
1675			.flags = CLK_SET_RATE_PARENT,
1676			.ops = &clk_branch2_ops,
1677		},
1678	},
1679};
1680
1681static struct clk_branch camss_vfe_vfe0_clk = {
1682	.halt_reg = 0x36a8,
1683	.clkr = {
1684		.enable_reg = 0x36a8,
1685		.enable_mask = BIT(0),
1686		.hw.init = &(struct clk_init_data){
1687			.name = "camss_vfe_vfe0_clk",
1688			.parent_names = (const char *[]){
1689				"vfe0_clk_src",
1690			},
1691			.num_parents = 1,
1692			.flags = CLK_SET_RATE_PARENT,
1693			.ops = &clk_branch2_ops,
1694		},
1695	},
1696};
1697
1698static struct clk_branch camss_vfe_vfe1_clk = {
1699	.halt_reg = 0x36ac,
1700	.clkr = {
1701		.enable_reg = 0x36ac,
1702		.enable_mask = BIT(0),
1703		.hw.init = &(struct clk_init_data){
1704			.name = "camss_vfe_vfe1_clk",
1705			.parent_names = (const char *[]){
1706				"vfe1_clk_src",
1707			},
1708			.num_parents = 1,
1709			.flags = CLK_SET_RATE_PARENT,
1710			.ops = &clk_branch2_ops,
1711		},
1712	},
1713};
1714
1715static struct clk_branch camss_vfe_vfe_ahb_clk = {
1716	.halt_reg = 0x36b8,
1717	.clkr = {
1718		.enable_reg = 0x36b8,
1719		.enable_mask = BIT(0),
1720		.hw.init = &(struct clk_init_data){
1721			.name = "camss_vfe_vfe_ahb_clk",
1722			.parent_names = (const char *[]){
1723				"mmss_ahb_clk_src",
1724			},
1725			.num_parents = 1,
1726			.ops = &clk_branch2_ops,
1727		},
1728	},
1729};
1730
1731static struct clk_branch camss_vfe_vfe_axi_clk = {
1732	.halt_reg = 0x36bc,
1733	.clkr = {
1734		.enable_reg = 0x36bc,
1735		.enable_mask = BIT(0),
1736		.hw.init = &(struct clk_init_data){
1737			.name = "camss_vfe_vfe_axi_clk",
1738			.parent_names = (const char *[]){
1739				"mmss_axi_clk_src",
1740			},
1741			.num_parents = 1,
1742			.ops = &clk_branch2_ops,
1743		},
1744	},
1745};
1746
1747static struct clk_branch camss_vfe_vfe_ocmemnoc_clk = {
1748	.halt_reg = 0x36c0,
1749	.clkr = {
1750		.enable_reg = 0x36c0,
1751		.enable_mask = BIT(0),
1752		.hw.init = &(struct clk_init_data){
1753			.name = "camss_vfe_vfe_ocmemnoc_clk",
1754			.parent_names = (const char *[]){
1755				"ocmemnoc_clk_src",
1756			},
1757			.num_parents = 1,
1758			.flags = CLK_SET_RATE_PARENT,
1759			.ops = &clk_branch2_ops,
1760		},
1761	},
1762};
1763
1764static struct clk_branch mdss_ahb_clk = {
1765	.halt_reg = 0x2308,
1766	.clkr = {
1767		.enable_reg = 0x2308,
1768		.enable_mask = BIT(0),
1769		.hw.init = &(struct clk_init_data){
1770			.name = "mdss_ahb_clk",
1771			.parent_names = (const char *[]){
1772				"mmss_ahb_clk_src",
1773			},
1774			.num_parents = 1,
1775			.ops = &clk_branch2_ops,
1776		},
1777	},
1778};
1779
1780static struct clk_branch mdss_axi_clk = {
1781	.halt_reg = 0x2310,
1782	.clkr = {
1783		.enable_reg = 0x2310,
1784		.enable_mask = BIT(0),
1785		.hw.init = &(struct clk_init_data){
1786			.name = "mdss_axi_clk",
1787			.parent_names = (const char *[]){
1788				"mmss_axi_clk_src",
1789			},
1790			.num_parents = 1,
1791			.flags = CLK_SET_RATE_PARENT,
1792			.ops = &clk_branch2_ops,
1793		},
1794	},
1795};
1796
1797static struct clk_branch mdss_byte0_clk = {
1798	.halt_reg = 0x233c,
1799	.clkr = {
1800		.enable_reg = 0x233c,
1801		.enable_mask = BIT(0),
1802		.hw.init = &(struct clk_init_data){
1803			.name = "mdss_byte0_clk",
1804			.parent_names = (const char *[]){
1805				"byte0_clk_src",
1806			},
1807			.num_parents = 1,
1808			.flags = CLK_SET_RATE_PARENT,
1809			.ops = &clk_branch2_ops,
1810		},
1811	},
1812};
1813
1814static struct clk_branch mdss_byte1_clk = {
1815	.halt_reg = 0x2340,
1816	.clkr = {
1817		.enable_reg = 0x2340,
1818		.enable_mask = BIT(0),
1819		.hw.init = &(struct clk_init_data){
1820			.name = "mdss_byte1_clk",
1821			.parent_names = (const char *[]){
1822				"byte1_clk_src",
1823			},
1824			.num_parents = 1,
1825			.flags = CLK_SET_RATE_PARENT,
1826			.ops = &clk_branch2_ops,
1827		},
1828	},
1829};
1830
1831static struct clk_branch mdss_edpaux_clk = {
1832	.halt_reg = 0x2334,
1833	.clkr = {
1834		.enable_reg = 0x2334,
1835		.enable_mask = BIT(0),
1836		.hw.init = &(struct clk_init_data){
1837			.name = "mdss_edpaux_clk",
1838			.parent_names = (const char *[]){
1839				"edpaux_clk_src",
1840			},
1841			.num_parents = 1,
1842			.flags = CLK_SET_RATE_PARENT,
1843			.ops = &clk_branch2_ops,
1844		},
1845	},
1846};
1847
1848static struct clk_branch mdss_edplink_clk = {
1849	.halt_reg = 0x2330,
1850	.clkr = {
1851		.enable_reg = 0x2330,
1852		.enable_mask = BIT(0),
1853		.hw.init = &(struct clk_init_data){
1854			.name = "mdss_edplink_clk",
1855			.parent_names = (const char *[]){
1856				"edplink_clk_src",
1857			},
1858			.num_parents = 1,
1859			.flags = CLK_SET_RATE_PARENT,
1860			.ops = &clk_branch2_ops,
1861		},
1862	},
1863};
1864
1865static struct clk_branch mdss_edppixel_clk = {
1866	.halt_reg = 0x232c,
1867	.clkr = {
1868		.enable_reg = 0x232c,
1869		.enable_mask = BIT(0),
1870		.hw.init = &(struct clk_init_data){
1871			.name = "mdss_edppixel_clk",
1872			.parent_names = (const char *[]){
1873				"edppixel_clk_src",
1874			},
1875			.num_parents = 1,
1876			.flags = CLK_SET_RATE_PARENT,
1877			.ops = &clk_branch2_ops,
1878		},
1879	},
1880};
1881
1882static struct clk_branch mdss_esc0_clk = {
1883	.halt_reg = 0x2344,
1884	.clkr = {
1885		.enable_reg = 0x2344,
1886		.enable_mask = BIT(0),
1887		.hw.init = &(struct clk_init_data){
1888			.name = "mdss_esc0_clk",
1889			.parent_names = (const char *[]){
1890				"esc0_clk_src",
1891			},
1892			.num_parents = 1,
1893			.flags = CLK_SET_RATE_PARENT,
1894			.ops = &clk_branch2_ops,
1895		},
1896	},
1897};
1898
1899static struct clk_branch mdss_esc1_clk = {
1900	.halt_reg = 0x2348,
1901	.clkr = {
1902		.enable_reg = 0x2348,
1903		.enable_mask = BIT(0),
1904		.hw.init = &(struct clk_init_data){
1905			.name = "mdss_esc1_clk",
1906			.parent_names = (const char *[]){
1907				"esc1_clk_src",
1908			},
1909			.num_parents = 1,
1910			.flags = CLK_SET_RATE_PARENT,
1911			.ops = &clk_branch2_ops,
1912		},
1913	},
1914};
1915
1916static struct clk_branch mdss_extpclk_clk = {
1917	.halt_reg = 0x2324,
1918	.clkr = {
1919		.enable_reg = 0x2324,
1920		.enable_mask = BIT(0),
1921		.hw.init = &(struct clk_init_data){
1922			.name = "mdss_extpclk_clk",
1923			.parent_names = (const char *[]){
1924				"extpclk_clk_src",
1925			},
1926			.num_parents = 1,
1927			.flags = CLK_SET_RATE_PARENT,
1928			.ops = &clk_branch2_ops,
1929		},
1930	},
1931};
1932
1933static struct clk_branch mdss_hdmi_ahb_clk = {
1934	.halt_reg = 0x230c,
1935	.clkr = {
1936		.enable_reg = 0x230c,
1937		.enable_mask = BIT(0),
1938		.hw.init = &(struct clk_init_data){
1939			.name = "mdss_hdmi_ahb_clk",
1940			.parent_names = (const char *[]){
1941				"mmss_ahb_clk_src",
1942			},
1943			.num_parents = 1,
1944			.ops = &clk_branch2_ops,
1945		},
1946	},
1947};
1948
1949static struct clk_branch mdss_hdmi_clk = {
1950	.halt_reg = 0x2338,
1951	.clkr = {
1952		.enable_reg = 0x2338,
1953		.enable_mask = BIT(0),
1954		.hw.init = &(struct clk_init_data){
1955			.name = "mdss_hdmi_clk",
1956			.parent_names = (const char *[]){
1957				"hdmi_clk_src",
1958			},
1959			.num_parents = 1,
1960			.flags = CLK_SET_RATE_PARENT,
1961			.ops = &clk_branch2_ops,
1962		},
1963	},
1964};
1965
1966static struct clk_branch mdss_mdp_clk = {
1967	.halt_reg = 0x231c,
1968	.clkr = {
1969		.enable_reg = 0x231c,
1970		.enable_mask = BIT(0),
1971		.hw.init = &(struct clk_init_data){
1972			.name = "mdss_mdp_clk",
1973			.parent_names = (const char *[]){
1974				"mdp_clk_src",
1975			},
1976			.num_parents = 1,
1977			.flags = CLK_SET_RATE_PARENT,
1978			.ops = &clk_branch2_ops,
1979		},
1980	},
1981};
1982
1983static struct clk_branch mdss_mdp_lut_clk = {
1984	.halt_reg = 0x2320,
1985	.clkr = {
1986		.enable_reg = 0x2320,
1987		.enable_mask = BIT(0),
1988		.hw.init = &(struct clk_init_data){
1989			.name = "mdss_mdp_lut_clk",
1990			.parent_names = (const char *[]){
1991				"mdp_clk_src",
1992			},
1993			.num_parents = 1,
1994			.flags = CLK_SET_RATE_PARENT,
1995			.ops = &clk_branch2_ops,
1996		},
1997	},
1998};
1999
2000static struct clk_branch mdss_pclk0_clk = {
2001	.halt_reg = 0x2314,
2002	.clkr = {
2003		.enable_reg = 0x2314,
2004		.enable_mask = BIT(0),
2005		.hw.init = &(struct clk_init_data){
2006			.name = "mdss_pclk0_clk",
2007			.parent_names = (const char *[]){
2008				"pclk0_clk_src",
2009			},
2010			.num_parents = 1,
2011			.flags = CLK_SET_RATE_PARENT,
2012			.ops = &clk_branch2_ops,
2013		},
2014	},
2015};
2016
2017static struct clk_branch mdss_pclk1_clk = {
2018	.halt_reg = 0x2318,
2019	.clkr = {
2020		.enable_reg = 0x2318,
2021		.enable_mask = BIT(0),
2022		.hw.init = &(struct clk_init_data){
2023			.name = "mdss_pclk1_clk",
2024			.parent_names = (const char *[]){
2025				"pclk1_clk_src",
2026			},
2027			.num_parents = 1,
2028			.flags = CLK_SET_RATE_PARENT,
2029			.ops = &clk_branch2_ops,
2030		},
2031	},
2032};
2033
2034static struct clk_branch mdss_vsync_clk = {
2035	.halt_reg = 0x2328,
2036	.clkr = {
2037		.enable_reg = 0x2328,
2038		.enable_mask = BIT(0),
2039		.hw.init = &(struct clk_init_data){
2040			.name = "mdss_vsync_clk",
2041			.parent_names = (const char *[]){
2042				"vsync_clk_src",
2043			},
2044			.num_parents = 1,
2045			.flags = CLK_SET_RATE_PARENT,
2046			.ops = &clk_branch2_ops,
2047		},
2048	},
2049};
2050
2051static struct clk_branch mmss_misc_ahb_clk = {
2052	.halt_reg = 0x502c,
2053	.clkr = {
2054		.enable_reg = 0x502c,
2055		.enable_mask = BIT(0),
2056		.hw.init = &(struct clk_init_data){
2057			.name = "mmss_misc_ahb_clk",
2058			.parent_names = (const char *[]){
2059				"mmss_ahb_clk_src",
2060			},
2061			.num_parents = 1,
2062			.ops = &clk_branch2_ops,
2063		},
2064	},
2065};
2066
2067static struct clk_branch mmss_mmssnoc_ahb_clk = {
2068	.halt_reg = 0x5024,
2069	.clkr = {
2070		.enable_reg = 0x5024,
2071		.enable_mask = BIT(0),
2072		.hw.init = &(struct clk_init_data){
2073			.name = "mmss_mmssnoc_ahb_clk",
2074			.parent_names = (const char *[]){
2075				"mmss_ahb_clk_src",
2076			},
2077			.num_parents = 1,
2078			.ops = &clk_branch2_ops,
2079			.flags = CLK_IGNORE_UNUSED,
2080		},
2081	},
2082};
2083
2084static struct clk_branch mmss_mmssnoc_bto_ahb_clk = {
2085	.halt_reg = 0x5028,
2086	.clkr = {
2087		.enable_reg = 0x5028,
2088		.enable_mask = BIT(0),
2089		.hw.init = &(struct clk_init_data){
2090			.name = "mmss_mmssnoc_bto_ahb_clk",
2091			.parent_names = (const char *[]){
2092				"mmss_ahb_clk_src",
2093			},
2094			.num_parents = 1,
2095			.ops = &clk_branch2_ops,
2096			.flags = CLK_IGNORE_UNUSED,
2097		},
2098	},
2099};
2100
2101static struct clk_branch mmss_mmssnoc_axi_clk = {
2102	.halt_reg = 0x506c,
2103	.clkr = {
2104		.enable_reg = 0x506c,
2105		.enable_mask = BIT(0),
2106		.hw.init = &(struct clk_init_data){
2107			.name = "mmss_mmssnoc_axi_clk",
2108			.parent_names = (const char *[]){
2109				"mmss_axi_clk_src",
2110			},
2111			.num_parents = 1,
2112			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
2113			.ops = &clk_branch2_ops,
2114		},
2115	},
2116};
2117
2118static struct clk_branch mmss_s0_axi_clk = {
2119	.halt_reg = 0x5064,
2120	.clkr = {
2121		.enable_reg = 0x5064,
2122		.enable_mask = BIT(0),
2123		.hw.init = &(struct clk_init_data){
2124			.name = "mmss_s0_axi_clk",
2125			.parent_names = (const char *[]){
2126				"mmss_axi_clk_src",
2127			},
2128			.num_parents = 1,
2129			.ops = &clk_branch2_ops,
2130			.flags = CLK_IGNORE_UNUSED,
2131		},
2132	},
2133};
2134
2135static struct clk_branch ocmemcx_ahb_clk = {
2136	.halt_reg = 0x405c,
2137	.clkr = {
2138		.enable_reg = 0x405c,
2139		.enable_mask = BIT(0),
2140		.hw.init = &(struct clk_init_data){
2141			.name = "ocmemcx_ahb_clk",
2142			.parent_names = (const char *[]){
2143				"mmss_ahb_clk_src",
2144			},
2145			.num_parents = 1,
2146			.ops = &clk_branch2_ops,
2147		},
2148	},
2149};
2150
2151static struct clk_branch ocmemcx_ocmemnoc_clk = {
2152	.halt_reg = 0x4058,
2153	.clkr = {
2154		.enable_reg = 0x4058,
2155		.enable_mask = BIT(0),
2156		.hw.init = &(struct clk_init_data){
2157			.name = "ocmemcx_ocmemnoc_clk",
2158			.parent_names = (const char *[]){
2159				"ocmemnoc_clk_src",
2160			},
2161			.num_parents = 1,
2162			.flags = CLK_SET_RATE_PARENT,
2163			.ops = &clk_branch2_ops,
2164		},
2165	},
2166};
2167
2168static struct clk_branch oxili_ocmemgx_clk = {
2169	.halt_reg = 0x402c,
2170	.clkr = {
2171		.enable_reg = 0x402c,
2172		.enable_mask = BIT(0),
2173		.hw.init = &(struct clk_init_data){
2174			.name = "oxili_ocmemgx_clk",
2175			.parent_names = (const char *[]){
2176				"gfx3d_clk_src",
2177			},
2178			.num_parents = 1,
2179			.flags = CLK_SET_RATE_PARENT,
2180			.ops = &clk_branch2_ops,
2181		},
2182	},
2183};
2184
2185static struct clk_branch ocmemnoc_clk = {
2186	.halt_reg = 0x50b4,
2187	.clkr = {
2188		.enable_reg = 0x50b4,
2189		.enable_mask = BIT(0),
2190		.hw.init = &(struct clk_init_data){
2191			.name = "ocmemnoc_clk",
2192			.parent_names = (const char *[]){
2193				"ocmemnoc_clk_src",
2194			},
2195			.num_parents = 1,
2196			.flags = CLK_SET_RATE_PARENT,
2197			.ops = &clk_branch2_ops,
2198		},
2199	},
2200};
2201
2202static struct clk_branch oxili_gfx3d_clk = {
2203	.halt_reg = 0x4028,
2204	.clkr = {
2205		.enable_reg = 0x4028,
2206		.enable_mask = BIT(0),
2207		.hw.init = &(struct clk_init_data){
2208			.name = "oxili_gfx3d_clk",
2209			.parent_names = (const char *[]){
2210				"gfx3d_clk_src",
2211			},
2212			.num_parents = 1,
2213			.flags = CLK_SET_RATE_PARENT,
2214			.ops = &clk_branch2_ops,
2215		},
2216	},
2217};
2218
2219static struct clk_branch oxilicx_ahb_clk = {
2220	.halt_reg = 0x403c,
2221	.clkr = {
2222		.enable_reg = 0x403c,
2223		.enable_mask = BIT(0),
2224		.hw.init = &(struct clk_init_data){
2225			.name = "oxilicx_ahb_clk",
2226			.parent_names = (const char *[]){
2227				"mmss_ahb_clk_src",
2228			},
2229			.num_parents = 1,
2230			.ops = &clk_branch2_ops,
2231		},
2232	},
2233};
2234
2235static struct clk_branch oxilicx_axi_clk = {
2236	.halt_reg = 0x4038,
2237	.clkr = {
2238		.enable_reg = 0x4038,
2239		.enable_mask = BIT(0),
2240		.hw.init = &(struct clk_init_data){
2241			.name = "oxilicx_axi_clk",
2242			.parent_names = (const char *[]){
2243				"mmss_axi_clk_src",
2244			},
2245			.num_parents = 1,
2246			.ops = &clk_branch2_ops,
2247		},
2248	},
2249};
2250
2251static struct clk_branch venus0_ahb_clk = {
2252	.halt_reg = 0x1030,
2253	.clkr = {
2254		.enable_reg = 0x1030,
2255		.enable_mask = BIT(0),
2256		.hw.init = &(struct clk_init_data){
2257			.name = "venus0_ahb_clk",
2258			.parent_names = (const char *[]){
2259				"mmss_ahb_clk_src",
2260			},
2261			.num_parents = 1,
2262			.ops = &clk_branch2_ops,
2263		},
2264	},
2265};
2266
2267static struct clk_branch venus0_axi_clk = {
2268	.halt_reg = 0x1034,
2269	.clkr = {
2270		.enable_reg = 0x1034,
2271		.enable_mask = BIT(0),
2272		.hw.init = &(struct clk_init_data){
2273			.name = "venus0_axi_clk",
2274			.parent_names = (const char *[]){
2275				"mmss_axi_clk_src",
2276			},
2277			.num_parents = 1,
2278			.ops = &clk_branch2_ops,
2279		},
2280	},
2281};
2282
2283static struct clk_branch venus0_ocmemnoc_clk = {
2284	.halt_reg = 0x1038,
2285	.clkr = {
2286		.enable_reg = 0x1038,
2287		.enable_mask = BIT(0),
2288		.hw.init = &(struct clk_init_data){
2289			.name = "venus0_ocmemnoc_clk",
2290			.parent_names = (const char *[]){
2291				"ocmemnoc_clk_src",
2292			},
2293			.num_parents = 1,
2294			.flags = CLK_SET_RATE_PARENT,
2295			.ops = &clk_branch2_ops,
2296		},
2297	},
2298};
2299
2300static struct clk_branch venus0_vcodec0_clk = {
2301	.halt_reg = 0x1028,
2302	.clkr = {
2303		.enable_reg = 0x1028,
2304		.enable_mask = BIT(0),
2305		.hw.init = &(struct clk_init_data){
2306			.name = "venus0_vcodec0_clk",
2307			.parent_names = (const char *[]){
2308				"vcodec0_clk_src",
2309			},
2310			.num_parents = 1,
2311			.flags = CLK_SET_RATE_PARENT,
2312			.ops = &clk_branch2_ops,
2313		},
2314	},
2315};
2316
2317static const struct pll_config mmpll1_config = {
2318	.l = 60,
2319	.m = 25,
2320	.n = 32,
2321	.vco_val = 0x0,
2322	.vco_mask = 0x3 << 20,
2323	.pre_div_val = 0x0,
2324	.pre_div_mask = 0x7 << 12,
2325	.post_div_val = 0x0,
2326	.post_div_mask = 0x3 << 8,
2327	.mn_ena_mask = BIT(24),
2328	.main_output_mask = BIT(0),
2329};
2330
2331static struct pll_config mmpll3_config = {
2332	.l = 48,
2333	.m = 7,
2334	.n = 16,
2335	.vco_val = 0x0,
2336	.vco_mask = 0x3 << 20,
2337	.pre_div_val = 0x0,
2338	.pre_div_mask = 0x7 << 12,
2339	.post_div_val = 0x0,
2340	.post_div_mask = 0x3 << 8,
2341	.mn_ena_mask = BIT(24),
2342	.main_output_mask = BIT(0),
2343	.aux_output_mask = BIT(1),
2344};
2345
2346static struct gdsc venus0_gdsc = {
2347	.gdscr = 0x1024,
2348	.cxcs = (unsigned int []){ 0x1028 },
2349	.cxc_count = 1,
2350	.resets = (unsigned int []){ VENUS0_RESET },
2351	.reset_count = 1,
2352	.pd = {
2353		.name = "venus0",
2354	},
2355	.pwrsts = PWRSTS_ON,
2356};
2357
2358static struct gdsc mdss_gdsc = {
2359	.gdscr = 0x2304,
2360	.cxcs = (unsigned int []){ 0x231c, 0x2320 },
2361	.cxc_count = 2,
2362	.pd = {
2363		.name = "mdss",
2364	},
2365	.pwrsts = PWRSTS_RET_ON,
2366};
2367
2368static struct gdsc camss_jpeg_gdsc = {
2369	.gdscr = 0x35a4,
2370	.cxcs = (unsigned int []){ 0x35a8, 0x35ac, 0x35b0 },
2371	.cxc_count = 3,
2372	.pd = {
2373		.name = "camss_jpeg",
2374	},
2375	.pwrsts = PWRSTS_OFF_ON,
2376};
2377
2378static struct gdsc camss_vfe_gdsc = {
2379	.gdscr = 0x36a4,
2380	.cxcs = (unsigned int []){ 0x36a8, 0x36ac, 0x3704, 0x3714, 0x36b0 },
2381	.cxc_count = 5,
2382	.pd = {
2383		.name = "camss_vfe",
2384	},
2385	.pwrsts = PWRSTS_OFF_ON,
2386};
2387
2388static struct gdsc oxili_gdsc = {
2389	.gdscr = 0x4024,
2390	.cxcs = (unsigned int []){ 0x4028 },
2391	.cxc_count = 1,
2392	.pd = {
2393		.name = "oxili",
2394	},
2395	.pwrsts = PWRSTS_OFF_ON,
2396};
2397
2398static struct gdsc oxilicx_gdsc = {
2399	.gdscr = 0x4034,
2400	.pd = {
2401		.name = "oxilicx",
2402	},
2403	.pwrsts = PWRSTS_OFF_ON,
2404};
2405
2406static struct clk_regmap *mmcc_msm8974_clocks[] = {
2407	[MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr,
2408	[MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr,
2409	[OCMEMNOC_CLK_SRC] = &ocmemnoc_clk_src.clkr,
2410	[MMPLL0] = &mmpll0.clkr,
2411	[MMPLL0_VOTE] = &mmpll0_vote,
2412	[MMPLL1] = &mmpll1.clkr,
2413	[MMPLL1_VOTE] = &mmpll1_vote,
2414	[MMPLL2] = &mmpll2.clkr,
2415	[MMPLL3] = &mmpll3.clkr,
2416	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2417	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2418	[CSI2_CLK_SRC] = &csi2_clk_src.clkr,
2419	[CSI3_CLK_SRC] = &csi3_clk_src.clkr,
2420	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2421	[VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
2422	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
2423	[GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
2424	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
2425	[JPEG1_CLK_SRC] = &jpeg1_clk_src.clkr,
2426	[JPEG2_CLK_SRC] = &jpeg2_clk_src.clkr,
2427	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2428	[PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
2429	[VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr,
2430	[CCI_CLK_SRC] = &cci_clk_src.clkr,
2431	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2432	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2433	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2434	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2435	[MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
2436	[MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
2437	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2438	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
2439	[CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
2440	[CPP_CLK_SRC] = &cpp_clk_src.clkr,
2441	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2442	[BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
2443	[EDPAUX_CLK_SRC] = &edpaux_clk_src.clkr,
2444	[EDPLINK_CLK_SRC] = &edplink_clk_src.clkr,
2445	[EDPPIXEL_CLK_SRC] = &edppixel_clk_src.clkr,
2446	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2447	[ESC1_CLK_SRC] = &esc1_clk_src.clkr,
2448	[EXTPCLK_CLK_SRC] = &extpclk_clk_src.clkr,
2449	[HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
2450	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2451	[CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr,
2452	[CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr,
2453	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
2454	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
2455	[CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr,
2456	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
2457	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
2458	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
2459	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
2460	[CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr,
2461	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
2462	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
2463	[CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
2464	[CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
2465	[CAMSS_CSI2PHY_CLK] = &camss_csi2phy_clk.clkr,
2466	[CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
2467	[CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
2468	[CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
2469	[CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
2470	[CAMSS_CSI3PHY_CLK] = &camss_csi3phy_clk.clkr,
2471	[CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
2472	[CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
2473	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
2474	[CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
2475	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
2476	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
2477	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
2478	[CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr,
2479	[CAMSS_JPEG_JPEG1_CLK] = &camss_jpeg_jpeg1_clk.clkr,
2480	[CAMSS_JPEG_JPEG2_CLK] = &camss_jpeg_jpeg2_clk.clkr,
2481	[CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr,
2482	[CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr,
2483	[CAMSS_JPEG_JPEG_OCMEMNOC_CLK] = &camss_jpeg_jpeg_ocmemnoc_clk.clkr,
2484	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
2485	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
2486	[CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
2487	[CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
2488	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
2489	[CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr,
2490	[CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr,
2491	[CAMSS_PHY2_CSI2PHYTIMER_CLK] = &camss_phy2_csi2phytimer_clk.clkr,
2492	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
2493	[CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr,
2494	[CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr,
2495	[CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr,
2496	[CAMSS_VFE_VFE1_CLK] = &camss_vfe_vfe1_clk.clkr,
2497	[CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr,
2498	[CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr,
2499	[CAMSS_VFE_VFE_OCMEMNOC_CLK] = &camss_vfe_vfe_ocmemnoc_clk.clkr,
2500	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
2501	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
2502	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
2503	[MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
2504	[MDSS_EDPAUX_CLK] = &mdss_edpaux_clk.clkr,
2505	[MDSS_EDPLINK_CLK] = &mdss_edplink_clk.clkr,
2506	[MDSS_EDPPIXEL_CLK] = &mdss_edppixel_clk.clkr,
2507	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
2508	[MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
2509	[MDSS_EXTPCLK_CLK] = &mdss_extpclk_clk.clkr,
2510	[MDSS_HDMI_AHB_CLK] = &mdss_hdmi_ahb_clk.clkr,
2511	[MDSS_HDMI_CLK] = &mdss_hdmi_clk.clkr,
2512	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
2513	[MDSS_MDP_LUT_CLK] = &mdss_mdp_lut_clk.clkr,
2514	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
2515	[MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
2516	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
2517	[MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr,
2518	[MMSS_MMSSNOC_AHB_CLK] = &mmss_mmssnoc_ahb_clk.clkr,
2519	[MMSS_MMSSNOC_BTO_AHB_CLK] = &mmss_mmssnoc_bto_ahb_clk.clkr,
2520	[MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr,
2521	[MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr,
2522	[OCMEMCX_AHB_CLK] = &ocmemcx_ahb_clk.clkr,
2523	[OCMEMCX_OCMEMNOC_CLK] = &ocmemcx_ocmemnoc_clk.clkr,
2524	[OXILI_OCMEMGX_CLK] = &oxili_ocmemgx_clk.clkr,
2525	[OCMEMNOC_CLK] = &ocmemnoc_clk.clkr,
2526	[OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr,
2527	[OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr,
2528	[OXILICX_AXI_CLK] = &oxilicx_axi_clk.clkr,
2529	[VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr,
2530	[VENUS0_AXI_CLK] = &venus0_axi_clk.clkr,
2531	[VENUS0_OCMEMNOC_CLK] = &venus0_ocmemnoc_clk.clkr,
2532	[VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr,
2533};
2534
2535static const struct qcom_reset_map mmcc_msm8974_resets[] = {
2536	[SPDM_RESET] = { 0x0200 },
2537	[SPDM_RM_RESET] = { 0x0300 },
2538	[VENUS0_RESET] = { 0x1020 },
2539	[MDSS_RESET] = { 0x2300 },
2540	[CAMSS_PHY0_RESET] = { 0x3020 },
2541	[CAMSS_PHY1_RESET] = { 0x3050 },
2542	[CAMSS_PHY2_RESET] = { 0x3080 },
2543	[CAMSS_CSI0_RESET] = { 0x30b0 },
2544	[CAMSS_CSI0PHY_RESET] = { 0x30c0 },
2545	[CAMSS_CSI0RDI_RESET] = { 0x30d0 },
2546	[CAMSS_CSI0PIX_RESET] = { 0x30e0 },
2547	[CAMSS_CSI1_RESET] = { 0x3120 },
2548	[CAMSS_CSI1PHY_RESET] = { 0x3130 },
2549	[CAMSS_CSI1RDI_RESET] = { 0x3140 },
2550	[CAMSS_CSI1PIX_RESET] = { 0x3150 },
2551	[CAMSS_CSI2_RESET] = { 0x3180 },
2552	[CAMSS_CSI2PHY_RESET] = { 0x3190 },
2553	[CAMSS_CSI2RDI_RESET] = { 0x31a0 },
2554	[CAMSS_CSI2PIX_RESET] = { 0x31b0 },
2555	[CAMSS_CSI3_RESET] = { 0x31e0 },
2556	[CAMSS_CSI3PHY_RESET] = { 0x31f0 },
2557	[CAMSS_CSI3RDI_RESET] = { 0x3200 },
2558	[CAMSS_CSI3PIX_RESET] = { 0x3210 },
2559	[CAMSS_ISPIF_RESET] = { 0x3220 },
2560	[CAMSS_CCI_RESET] = { 0x3340 },
2561	[CAMSS_MCLK0_RESET] = { 0x3380 },
2562	[CAMSS_MCLK1_RESET] = { 0x33b0 },
2563	[CAMSS_MCLK2_RESET] = { 0x33e0 },
2564	[CAMSS_MCLK3_RESET] = { 0x3410 },
2565	[CAMSS_GP0_RESET] = { 0x3440 },
2566	[CAMSS_GP1_RESET] = { 0x3470 },
2567	[CAMSS_TOP_RESET] = { 0x3480 },
2568	[CAMSS_MICRO_RESET] = { 0x3490 },
2569	[CAMSS_JPEG_RESET] = { 0x35a0 },
2570	[CAMSS_VFE_RESET] = { 0x36a0 },
2571	[CAMSS_CSI_VFE0_RESET] = { 0x3700 },
2572	[CAMSS_CSI_VFE1_RESET] = { 0x3710 },
2573	[OXILI_RESET] = { 0x4020 },
2574	[OXILICX_RESET] = { 0x4030 },
2575	[OCMEMCX_RESET] = { 0x4050 },
2576	[MMSS_RBCRP_RESET] = { 0x4080 },
2577	[MMSSNOCAHB_RESET] = { 0x5020 },
2578	[MMSSNOCAXI_RESET] = { 0x5060 },
2579	[OCMEMNOC_RESET] = { 0x50b0 },
2580};
2581
2582static struct gdsc *mmcc_msm8974_gdscs[] = {
2583	[VENUS0_GDSC] = &venus0_gdsc,
2584	[MDSS_GDSC] = &mdss_gdsc,
2585	[CAMSS_JPEG_GDSC] = &camss_jpeg_gdsc,
2586	[CAMSS_VFE_GDSC] = &camss_vfe_gdsc,
2587	[OXILI_GDSC] = &oxili_gdsc,
2588	[OXILICX_GDSC] = &oxilicx_gdsc,
2589};
2590
2591static const struct regmap_config mmcc_msm8974_regmap_config = {
2592	.reg_bits	= 32,
2593	.reg_stride	= 4,
2594	.val_bits	= 32,
2595	.max_register	= 0x5104,
2596	.fast_io	= true,
2597};
2598
2599static const struct qcom_cc_desc mmcc_msm8974_desc = {
2600	.config = &mmcc_msm8974_regmap_config,
2601	.clks = mmcc_msm8974_clocks,
2602	.num_clks = ARRAY_SIZE(mmcc_msm8974_clocks),
2603	.resets = mmcc_msm8974_resets,
2604	.num_resets = ARRAY_SIZE(mmcc_msm8974_resets),
2605	.gdscs = mmcc_msm8974_gdscs,
2606	.num_gdscs = ARRAY_SIZE(mmcc_msm8974_gdscs),
2607};
2608
2609static const struct of_device_id mmcc_msm8974_match_table[] = {
2610	{ .compatible = "qcom,mmcc-msm8974" },
2611	{ }
2612};
2613MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table);
2614
2615static int mmcc_msm8974_probe(struct platform_device *pdev)
2616{
2617	struct regmap *regmap;
2618	int ret;
2619
2620	regmap = qcom_cc_map(pdev, &mmcc_msm8974_desc);
2621	if (IS_ERR(regmap))
2622		return PTR_ERR(regmap);
2623
2624	clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true);
2625	clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false);
2626
2627	ret = qcom_cc_really_probe(pdev, &mmcc_msm8974_desc, regmap);
2628	if (ret)
2629		return ret;
2630
2631	return pm_genpd_add_subdomain(&oxili_gdsc.pd, &oxilicx_gdsc.pd);
2632}
2633
2634static int mmcc_msm8974_remove(struct platform_device *pdev)
2635{
2636	pm_genpd_remove_subdomain(&oxili_gdsc.pd, &oxilicx_gdsc.pd);
2637	return 0;
2638}
2639
2640static struct platform_driver mmcc_msm8974_driver = {
2641	.probe		= mmcc_msm8974_probe,
2642	.remove		= mmcc_msm8974_remove,
2643	.driver		= {
2644		.name	= "mmcc-msm8974",
2645		.of_match_table = mmcc_msm8974_match_table,
2646	},
2647};
2648module_platform_driver(mmcc_msm8974_driver);
2649
2650MODULE_DESCRIPTION("QCOM MMCC MSM8974 Driver");
2651MODULE_LICENSE("GPL v2");
2652MODULE_ALIAS("platform:mmcc-msm8974");
2653