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