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