1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2022 Kernkonzept GmbH.
4 *
5 * Based on gcc-msm8916.c:
6 *   Copyright 2015 Linaro Limited
7 * adapted with data from clock-gcc-8909.c in Qualcomm's msm-3.18 release:
8 *   Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
9 */
10
11#include <linux/bitops.h>
12#include <linux/clk-provider.h>
13#include <linux/err.h>
14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/of.h>
17#include <linux/platform_device.h>
18#include <linux/regmap.h>
19#include <linux/reset-controller.h>
20
21#include <dt-bindings/clock/qcom,gcc-msm8909.h>
22
23#include "clk-alpha-pll.h"
24#include "clk-branch.h"
25#include "clk-pll.h"
26#include "clk-rcg.h"
27#include "clk-regmap.h"
28#include "common.h"
29#include "gdsc.h"
30#include "reset.h"
31
32/* Need to match the order of clocks in DT binding */
33enum {
34	DT_XO,
35	DT_SLEEP_CLK,
36	DT_DSI0PLL,
37	DT_DSI0PLL_BYTE,
38};
39
40enum {
41	P_XO,
42	P_SLEEP_CLK,
43	P_GPLL0,
44	P_GPLL1,
45	P_GPLL2,
46	P_BIMC,
47	P_DSI0PLL,
48	P_DSI0PLL_BYTE,
49};
50
51static const struct parent_map gcc_xo_map[] = {
52	{ P_XO, 0 },
53};
54
55static const struct clk_parent_data gcc_xo_data[] = {
56	{ .index = DT_XO },
57};
58
59static const struct clk_parent_data gcc_sleep_clk_data[] = {
60	{ .index = DT_SLEEP_CLK },
61};
62
63static struct clk_alpha_pll gpll0_early = {
64	.offset = 0x21000,
65	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
66	.clkr = {
67		.enable_reg = 0x45000,
68		.enable_mask = BIT(0),
69		.hw.init = &(struct clk_init_data) {
70			.name = "gpll0_early",
71			.parent_data = gcc_xo_data,
72			.num_parents = ARRAY_SIZE(gcc_xo_data),
73			/* Avoid rate changes for shared clock */
74			.ops = &clk_alpha_pll_fixed_ops,
75		},
76	},
77};
78
79static struct clk_alpha_pll_postdiv gpll0 = {
80	.offset = 0x21000,
81	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
82	.clkr.hw.init = &(struct clk_init_data) {
83		.name = "gpll0",
84		.parent_hws = (const struct clk_hw*[]) {
85			&gpll0_early.clkr.hw,
86		},
87		.num_parents = 1,
88		/* Avoid rate changes for shared clock */
89		.ops = &clk_alpha_pll_postdiv_ro_ops,
90	},
91};
92
93static struct clk_pll gpll1 = {
94	.l_reg = 0x20004,
95	.m_reg = 0x20008,
96	.n_reg = 0x2000c,
97	.config_reg = 0x20010,
98	.mode_reg = 0x20000,
99	.status_reg = 0x2001c,
100	.status_bit = 17,
101	.clkr.hw.init = &(struct clk_init_data) {
102		.name = "gpll1",
103		.parent_data = gcc_xo_data,
104		.num_parents = ARRAY_SIZE(gcc_xo_data),
105		.ops = &clk_pll_ops,
106	},
107};
108
109static struct clk_regmap gpll1_vote = {
110	.enable_reg = 0x45000,
111	.enable_mask = BIT(1),
112	.hw.init = &(struct clk_init_data) {
113		.name = "gpll1_vote",
114		.parent_hws = (const struct clk_hw*[]) {
115			&gpll1.clkr.hw,
116		},
117		.num_parents = 1,
118		.ops = &clk_pll_vote_ops,
119	},
120};
121
122static struct clk_alpha_pll gpll2_early = {
123	.offset = 0x25000,
124	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
125	.clkr = {
126		.enable_reg = 0x45000,
127		.enable_mask = BIT(3),
128		.hw.init = &(struct clk_init_data) {
129			.name = "gpll2_early",
130			.parent_data = gcc_xo_data,
131			.num_parents = ARRAY_SIZE(gcc_xo_data),
132			/* Avoid rate changes for shared clock */
133			.ops = &clk_alpha_pll_fixed_ops,
134		},
135	},
136};
137
138static struct clk_alpha_pll_postdiv gpll2 = {
139	.offset = 0x25000,
140	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
141	.clkr.hw.init = &(struct clk_init_data) {
142		.name = "gpll2",
143		.parent_hws = (const struct clk_hw*[]) {
144			&gpll2_early.clkr.hw,
145		},
146		.num_parents = 1,
147		/* Avoid rate changes for shared clock */
148		.ops = &clk_alpha_pll_postdiv_ro_ops,
149	},
150};
151
152static struct clk_alpha_pll bimc_pll_early = {
153	.offset = 0x23000,
154	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
155	.clkr = {
156		.enable_reg = 0x45000,
157		.enable_mask = BIT(2),
158		.hw.init = &(struct clk_init_data) {
159			.name = "bimc_pll_early",
160			.parent_data = gcc_xo_data,
161			.num_parents = ARRAY_SIZE(gcc_xo_data),
162			/* Avoid rate changes for shared clock */
163			.ops = &clk_alpha_pll_fixed_ops,
164		},
165	},
166};
167
168static struct clk_alpha_pll_postdiv bimc_pll = {
169	.offset = 0x23000,
170	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
171	.clkr.hw.init = &(struct clk_init_data) {
172		.name = "bimc_pll",
173		.parent_hws = (const struct clk_hw*[]) {
174			&bimc_pll_early.clkr.hw,
175		},
176		.num_parents = 1,
177		/* Avoid rate changes for shared clock */
178		.ops = &clk_alpha_pll_postdiv_ro_ops,
179	},
180};
181
182static const struct parent_map gcc_xo_gpll0_map[] = {
183	{ P_XO, 0 },
184	{ P_GPLL0, 1 },
185};
186
187static const struct clk_parent_data gcc_xo_gpll0_data[] = {
188	{ .index = DT_XO },
189	{ .hw = &gpll0.clkr.hw },
190};
191
192static const struct parent_map gcc_xo_gpll0_bimc_map[] = {
193	{ P_XO, 0 },
194	{ P_GPLL0, 1 },
195	{ P_BIMC, 2 },
196};
197
198static const struct clk_parent_data gcc_xo_gpll0_bimc_data[] = {
199	{ .index = DT_XO },
200	{ .hw = &gpll0.clkr.hw },
201	{ .hw = &bimc_pll.clkr.hw },
202};
203
204static const struct freq_tbl ftbl_apss_ahb_clk_src[] = {
205	F(19200000, P_XO, 1, 0, 0),
206	F(50000000, P_GPLL0, 16, 0, 0),
207	F(100000000, P_GPLL0, 8, 0, 0),
208	{ }
209};
210
211static struct clk_rcg2 apss_ahb_clk_src = {
212	.cmd_rcgr = 0x46000,
213	.hid_width = 5,
214	.freq_tbl = ftbl_apss_ahb_clk_src,
215	.parent_map = gcc_xo_gpll0_map,
216	.clkr.hw.init = &(struct clk_init_data) {
217		.name = "apss_ahb_clk_src",
218		.parent_data = gcc_xo_gpll0_data,
219		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
220		.ops = &clk_rcg2_ops,
221	}
222};
223
224static struct clk_rcg2 bimc_ddr_clk_src = {
225	.cmd_rcgr = 0x32004,
226	.hid_width = 5,
227	.parent_map = gcc_xo_gpll0_bimc_map,
228	.clkr.hw.init = &(struct clk_init_data) {
229		.name = "bimc_ddr_clk_src",
230		.parent_data = gcc_xo_gpll0_bimc_data,
231		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
232		.ops = &clk_rcg2_ops,
233		.flags = CLK_GET_RATE_NOCACHE,
234	},
235};
236
237static struct clk_rcg2 bimc_gpu_clk_src = {
238	.cmd_rcgr = 0x31028,
239	.hid_width = 5,
240	.parent_map = gcc_xo_gpll0_bimc_map,
241	.clkr.hw.init = &(struct clk_init_data) {
242		.name = "bimc_gpu_clk_src",
243		.parent_data = gcc_xo_gpll0_bimc_data,
244		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
245		.ops = &clk_rcg2_ops,
246		.flags = CLK_GET_RATE_NOCACHE,
247	},
248};
249
250static const struct freq_tbl ftbl_blsp_i2c_apps_clk_src[] = {
251	F(19200000, P_XO, 1, 0, 0),
252	F(50000000, P_GPLL0, 16, 0, 0),
253	{ }
254};
255
256static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
257	.cmd_rcgr = 0x0200c,
258	.hid_width = 5,
259	.freq_tbl = ftbl_blsp_i2c_apps_clk_src,
260	.parent_map = gcc_xo_gpll0_map,
261	.clkr.hw.init = &(struct clk_init_data) {
262		.name = "blsp1_qup1_i2c_apps_clk_src",
263		.parent_data = gcc_xo_gpll0_data,
264		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
265		.ops = &clk_rcg2_ops,
266	}
267};
268
269static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
270	.cmd_rcgr = 0x03000,
271	.hid_width = 5,
272	.freq_tbl = ftbl_blsp_i2c_apps_clk_src,
273	.parent_map = gcc_xo_gpll0_map,
274	.clkr.hw.init = &(struct clk_init_data) {
275		.name = "blsp1_qup2_i2c_apps_clk_src",
276		.parent_data = gcc_xo_gpll0_data,
277		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
278		.ops = &clk_rcg2_ops,
279	}
280};
281
282static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
283	.cmd_rcgr = 0x04000,
284	.hid_width = 5,
285	.freq_tbl = ftbl_blsp_i2c_apps_clk_src,
286	.parent_map = gcc_xo_gpll0_map,
287	.clkr.hw.init = &(struct clk_init_data) {
288		.name = "blsp1_qup3_i2c_apps_clk_src",
289		.parent_data = gcc_xo_gpll0_data,
290		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
291		.ops = &clk_rcg2_ops,
292	}
293};
294
295static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
296	.cmd_rcgr = 0x05000,
297	.hid_width = 5,
298	.freq_tbl = ftbl_blsp_i2c_apps_clk_src,
299	.parent_map = gcc_xo_gpll0_map,
300	.clkr.hw.init = &(struct clk_init_data) {
301		.name = "blsp1_qup4_i2c_apps_clk_src",
302		.parent_data = gcc_xo_gpll0_data,
303		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
304		.ops = &clk_rcg2_ops,
305	}
306};
307
308static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
309	.cmd_rcgr = 0x06000,
310	.hid_width = 5,
311	.freq_tbl = ftbl_blsp_i2c_apps_clk_src,
312	.parent_map = gcc_xo_gpll0_map,
313	.clkr.hw.init = &(struct clk_init_data) {
314		.name = "blsp1_qup5_i2c_apps_clk_src",
315		.parent_data = gcc_xo_gpll0_data,
316		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
317		.ops = &clk_rcg2_ops,
318	}
319};
320
321static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
322	.cmd_rcgr = 0x07000,
323	.hid_width = 5,
324	.freq_tbl = ftbl_blsp_i2c_apps_clk_src,
325	.parent_map = gcc_xo_gpll0_map,
326	.clkr.hw.init = &(struct clk_init_data) {
327		.name = "blsp1_qup6_i2c_apps_clk_src",
328		.parent_data = gcc_xo_gpll0_data,
329		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
330		.ops = &clk_rcg2_ops,
331	}
332};
333
334static const struct freq_tbl ftbl_blsp_spi_apps_clk_src[] = {
335	F(960000, P_XO, 10, 1, 2),
336	F(4800000, P_XO, 4, 0, 0),
337	F(9600000, P_XO, 2, 0, 0),
338	F(16000000, P_GPLL0, 10, 1, 5),
339	F(19200000, P_XO, 1, 0, 0),
340	F(25000000, P_GPLL0, 16, 1, 2),
341	F(50000000, P_GPLL0, 16, 0, 0),
342	{ }
343};
344
345static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
346	.cmd_rcgr = 0x02024,
347	.hid_width = 5,
348	.mnd_width = 8,
349	.freq_tbl = ftbl_blsp_spi_apps_clk_src,
350	.parent_map = gcc_xo_gpll0_map,
351	.clkr.hw.init = &(struct clk_init_data) {
352		.name = "blsp1_qup1_spi_apps_clk_src",
353		.parent_data = gcc_xo_gpll0_data,
354		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
355		.ops = &clk_rcg2_ops,
356	}
357};
358
359static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
360	.cmd_rcgr = 0x03014,
361	.hid_width = 5,
362	.mnd_width = 8,
363	.freq_tbl = ftbl_blsp_spi_apps_clk_src,
364	.parent_map = gcc_xo_gpll0_map,
365	.clkr.hw.init = &(struct clk_init_data) {
366		.name = "blsp1_qup2_spi_apps_clk_src",
367		.parent_data = gcc_xo_gpll0_data,
368		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
369		.ops = &clk_rcg2_ops,
370	}
371};
372
373static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
374	.cmd_rcgr = 0x04024,
375	.hid_width = 5,
376	.mnd_width = 8,
377	.freq_tbl = ftbl_blsp_spi_apps_clk_src,
378	.parent_map = gcc_xo_gpll0_map,
379	.clkr.hw.init = &(struct clk_init_data) {
380		.name = "blsp1_qup3_spi_apps_clk_src",
381		.parent_data = gcc_xo_gpll0_data,
382		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
383		.ops = &clk_rcg2_ops,
384	}
385};
386
387static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
388	.cmd_rcgr = 0x05024,
389	.hid_width = 5,
390	.mnd_width = 8,
391	.freq_tbl = ftbl_blsp_spi_apps_clk_src,
392	.parent_map = gcc_xo_gpll0_map,
393	.clkr.hw.init = &(struct clk_init_data) {
394		.name = "blsp1_qup4_spi_apps_clk_src",
395		.parent_data = gcc_xo_gpll0_data,
396		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
397		.ops = &clk_rcg2_ops,
398	}
399};
400
401static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
402	.cmd_rcgr = 0x06024,
403	.hid_width = 5,
404	.mnd_width = 8,
405	.freq_tbl = ftbl_blsp_spi_apps_clk_src,
406	.parent_map = gcc_xo_gpll0_map,
407	.clkr.hw.init = &(struct clk_init_data) {
408		.name = "blsp1_qup5_spi_apps_clk_src",
409		.parent_data = gcc_xo_gpll0_data,
410		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
411		.ops = &clk_rcg2_ops,
412	}
413};
414
415static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
416	.cmd_rcgr = 0x07024,
417	.hid_width = 5,
418	.mnd_width = 8,
419	.freq_tbl = ftbl_blsp_spi_apps_clk_src,
420	.parent_map = gcc_xo_gpll0_map,
421	.clkr.hw.init = &(struct clk_init_data) {
422		.name = "blsp1_qup6_spi_apps_clk_src",
423		.parent_data = gcc_xo_gpll0_data,
424		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
425		.ops = &clk_rcg2_ops,
426	}
427};
428
429static const struct freq_tbl ftbl_blsp_uart_apps_clk_src[] = {
430	F(3686400, P_GPLL0, 1, 72, 15625),
431	F(7372800, P_GPLL0, 1, 144, 15625),
432	F(14745600, P_GPLL0, 1, 288, 15625),
433	F(16000000, P_GPLL0, 10, 1, 5),
434	F(19200000, P_XO, 1, 0, 0),
435	F(24000000, P_GPLL0, 1, 3, 100),
436	F(25000000, P_GPLL0, 16, 1, 2),
437	F(32000000, P_GPLL0, 1, 1, 25),
438	F(40000000, P_GPLL0, 1, 1, 20),
439	F(46400000, P_GPLL0, 1, 29, 500),
440	F(48000000, P_GPLL0, 1, 3, 50),
441	F(51200000, P_GPLL0, 1, 8, 125),
442	F(56000000, P_GPLL0, 1, 7, 100),
443	F(58982400, P_GPLL0, 1, 1152, 15625),
444	F(60000000, P_GPLL0, 1, 3, 40),
445	{ }
446};
447
448static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
449	.cmd_rcgr = 0x02044,
450	.hid_width = 5,
451	.mnd_width = 16,
452	.freq_tbl = ftbl_blsp_uart_apps_clk_src,
453	.parent_map = gcc_xo_gpll0_map,
454	.clkr.hw.init = &(struct clk_init_data) {
455		.name = "blsp1_uart1_apps_clk_src",
456		.parent_data = gcc_xo_gpll0_data,
457		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
458		.ops = &clk_rcg2_ops,
459	}
460};
461
462static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
463	.cmd_rcgr = 0x03034,
464	.hid_width = 5,
465	.mnd_width = 16,
466	.freq_tbl = ftbl_blsp_uart_apps_clk_src,
467	.parent_map = gcc_xo_gpll0_map,
468	.clkr.hw.init = &(struct clk_init_data) {
469		.name = "blsp1_uart2_apps_clk_src",
470		.parent_data = gcc_xo_gpll0_data,
471		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
472		.ops = &clk_rcg2_ops,
473	}
474};
475
476static const struct parent_map gcc_byte0_map[] = {
477	{ P_XO, 0 },
478	{ P_DSI0PLL_BYTE, 1 },
479};
480
481static const struct clk_parent_data gcc_byte_data[] = {
482	{ .index = DT_XO },
483	{ .index = DT_DSI0PLL_BYTE },
484};
485
486static struct clk_rcg2 byte0_clk_src = {
487	.cmd_rcgr = 0x4d044,
488	.hid_width = 5,
489	.parent_map = gcc_byte0_map,
490	.clkr.hw.init = &(struct clk_init_data) {
491		.name = "byte0_clk_src",
492		.parent_data = gcc_byte_data,
493		.num_parents = ARRAY_SIZE(gcc_byte_data),
494		.ops = &clk_byte2_ops,
495		.flags = CLK_SET_RATE_PARENT,
496	}
497};
498
499static const struct freq_tbl ftbl_camss_gp_clk_src[] = {
500	F(100000000, P_GPLL0, 8, 0, 0),
501	F(200000000, P_GPLL0, 4, 0, 0),
502	{ }
503};
504
505static struct clk_rcg2 camss_gp0_clk_src = {
506	.cmd_rcgr = 0x54000,
507	.hid_width = 5,
508	.mnd_width = 8,
509	.freq_tbl = ftbl_camss_gp_clk_src,
510	.parent_map = gcc_xo_gpll0_map,
511	.clkr.hw.init = &(struct clk_init_data) {
512		.name = "camss_gp0_clk_src",
513		.parent_data = gcc_xo_gpll0_data,
514		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
515		.ops = &clk_rcg2_ops,
516	}
517};
518
519static struct clk_rcg2 camss_gp1_clk_src = {
520	.cmd_rcgr = 0x55000,
521	.hid_width = 5,
522	.mnd_width = 8,
523	.freq_tbl = ftbl_camss_gp_clk_src,
524	.parent_map = gcc_xo_gpll0_map,
525	.clkr.hw.init = &(struct clk_init_data) {
526		.name = "camss_gp1_clk_src",
527		.parent_data = gcc_xo_gpll0_data,
528		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
529		.ops = &clk_rcg2_ops,
530	}
531};
532
533static const struct freq_tbl ftbl_camss_top_ahb_clk_src[] = {
534	F(40000000, P_GPLL0, 10, 1, 2),
535	F(80000000, P_GPLL0, 10, 0, 0),
536	{ }
537};
538
539static struct clk_rcg2 camss_top_ahb_clk_src = {
540	.cmd_rcgr = 0x5a000,
541	.hid_width = 5,
542	.mnd_width = 8,
543	.freq_tbl = ftbl_camss_top_ahb_clk_src,
544	.parent_map = gcc_xo_gpll0_map,
545	.clkr.hw.init = &(struct clk_init_data) {
546		.name = "camss_top_ahb_clk_src",
547		.parent_data = gcc_xo_gpll0_data,
548		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
549		.ops = &clk_rcg2_ops,
550	}
551};
552
553static const struct freq_tbl ftbl_crypto_clk_src[] = {
554	F(50000000, P_GPLL0, 16, 0, 0),
555	F(80000000, P_GPLL0, 10, 0, 0),
556	F(100000000, P_GPLL0, 8, 0, 0),
557	F(160000000, P_GPLL0, 5, 0, 0),
558	{ }
559};
560
561static struct clk_rcg2 crypto_clk_src = {
562	.cmd_rcgr = 0x16004,
563	.hid_width = 5,
564	.freq_tbl = ftbl_crypto_clk_src,
565	.parent_map = gcc_xo_gpll0_map,
566	.clkr.hw.init = &(struct clk_init_data) {
567		.name = "crypto_clk_src",
568		.parent_data = gcc_xo_gpll0_data,
569		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
570		.ops = &clk_rcg2_ops,
571	}
572};
573
574static const struct freq_tbl ftbl_csi_clk_src[] = {
575	F(100000000, P_GPLL0, 8, 0, 0),
576	F(200000000, P_GPLL0, 4, 0, 0),
577	{ }
578};
579
580static struct clk_rcg2 csi0_clk_src = {
581	.cmd_rcgr = 0x4e020,
582	.hid_width = 5,
583	.freq_tbl = ftbl_csi_clk_src,
584	.parent_map = gcc_xo_gpll0_map,
585	.clkr.hw.init = &(struct clk_init_data) {
586		.name = "csi0_clk_src",
587		.parent_data = gcc_xo_gpll0_data,
588		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_map),
589		.ops = &clk_rcg2_ops,
590	}
591};
592
593static struct clk_rcg2 csi1_clk_src = {
594	.cmd_rcgr = 0x4f020,
595	.hid_width = 5,
596	.freq_tbl = ftbl_csi_clk_src,
597	.parent_map = gcc_xo_gpll0_map,
598	.clkr.hw.init = &(struct clk_init_data) {
599		.name = "csi1_clk_src",
600		.parent_data = gcc_xo_gpll0_data,
601		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
602		.ops = &clk_rcg2_ops,
603	}
604};
605
606static const struct freq_tbl ftbl_csi_phytimer_clk_src[] = {
607	F(100000000, P_GPLL0, 8, 0, 0),
608	F(200000000, P_GPLL0, 4, 0, 0),
609	{ }
610};
611
612static struct clk_rcg2 csi0phytimer_clk_src = {
613	.cmd_rcgr = 0x4e000,
614	.hid_width = 5,
615	.freq_tbl = ftbl_csi_phytimer_clk_src,
616	.parent_map = gcc_xo_gpll0_map,
617	.clkr.hw.init = &(struct clk_init_data) {
618		.name = "csi0phytimer_clk_src",
619		.parent_data = gcc_xo_gpll0_data,
620		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
621		.ops = &clk_rcg2_ops,
622	}
623};
624
625static const struct freq_tbl ftbl_esc0_clk_src[] = {
626	F(19200000, P_XO, 1, 0, 0),
627	{ }
628};
629
630static struct clk_rcg2 esc0_clk_src = {
631	.cmd_rcgr = 0x4d05c,
632	.hid_width = 5,
633	.freq_tbl = ftbl_esc0_clk_src,
634	.parent_map = gcc_xo_map,
635	.clkr.hw.init = &(struct clk_init_data) {
636		.name = "esc0_clk_src",
637		.parent_data = gcc_xo_data,
638		.num_parents = ARRAY_SIZE(gcc_xo_data),
639		.ops = &clk_rcg2_ops,
640	}
641};
642
643static const struct parent_map gcc_gfx3d_map[] = {
644	{ P_XO, 0 },
645	{ P_GPLL0, 1 },
646	{ P_GPLL1, 2 },
647};
648
649static const struct clk_parent_data gcc_gfx3d_data[] = {
650	{ .index = DT_XO },
651	{ .hw = &gpll0.clkr.hw },
652	{ .hw = &gpll1_vote.hw },
653};
654
655static const struct freq_tbl ftbl_gfx3d_clk_src[] = {
656	F(19200000, P_XO, 1, 0, 0),
657	F(50000000, P_GPLL0, 16, 0, 0),
658	F(80000000, P_GPLL0, 10, 0, 0),
659	F(100000000, P_GPLL0, 8, 0, 0),
660	F(160000000, P_GPLL0, 5, 0, 0),
661	F(177780000, P_GPLL0, 4.5, 0, 0),
662	F(200000000, P_GPLL0, 4, 0, 0),
663	F(266670000, P_GPLL0, 3, 0, 0),
664	F(307200000, P_GPLL1, 4, 0, 0),
665	F(409600000, P_GPLL1, 3, 0, 0),
666	{ }
667};
668
669static struct clk_rcg2 gfx3d_clk_src = {
670	.cmd_rcgr = 0x59000,
671	.hid_width = 5,
672	.freq_tbl = ftbl_gfx3d_clk_src,
673	.parent_map = gcc_gfx3d_map,
674	.clkr.hw.init = &(struct clk_init_data) {
675		.name = "gfx3d_clk_src",
676		.parent_data = gcc_gfx3d_data,
677		.num_parents = ARRAY_SIZE(gcc_gfx3d_data),
678		.ops = &clk_rcg2_ops,
679	}
680};
681
682static const struct freq_tbl ftbl_gp_clk_src[] = {
683	F(150000, P_XO, 1, 1, 128),
684	F(19200000, P_XO, 1, 0, 0),
685	{ }
686};
687
688static struct clk_rcg2 gp1_clk_src = {
689	.cmd_rcgr = 0x08004,
690	.hid_width = 5,
691	.mnd_width = 8,
692	.freq_tbl = ftbl_gp_clk_src,
693	.parent_map = gcc_xo_map,
694	.clkr.hw.init = &(struct clk_init_data) {
695		.name = "gp1_clk_src",
696		.parent_data = gcc_xo_data,
697		.num_parents = ARRAY_SIZE(gcc_xo_data),
698		.ops = &clk_rcg2_ops,
699	}
700};
701
702static struct clk_rcg2 gp2_clk_src = {
703	.cmd_rcgr = 0x09004,
704	.hid_width = 5,
705	.mnd_width = 8,
706	.freq_tbl = ftbl_gp_clk_src,
707	.parent_map = gcc_xo_map,
708	.clkr.hw.init = &(struct clk_init_data) {
709		.name = "gp2_clk_src",
710		.parent_data = gcc_xo_data,
711		.num_parents = ARRAY_SIZE(gcc_xo_data),
712		.ops = &clk_rcg2_ops,
713	}
714};
715
716static struct clk_rcg2 gp3_clk_src = {
717	.cmd_rcgr = 0x0a004,
718	.hid_width = 5,
719	.mnd_width = 8,
720	.freq_tbl = ftbl_gp_clk_src,
721	.parent_map = gcc_xo_map,
722	.clkr.hw.init = &(struct clk_init_data) {
723		.name = "gp3_clk_src",
724		.parent_data = gcc_xo_data,
725		.num_parents = ARRAY_SIZE(gcc_xo_data),
726		.ops = &clk_rcg2_ops,
727	}
728};
729
730static const struct parent_map gcc_mclk_map[] = {
731	{ P_XO, 0 },
732	{ P_GPLL0, 1 },
733	{ P_GPLL2, 3 },
734};
735
736static const struct clk_parent_data gcc_mclk_data[] = {
737	{ .index = DT_XO },
738	{ .hw = &gpll0.clkr.hw },
739	{ .hw = &gpll2.clkr.hw },
740};
741
742static const struct freq_tbl ftbl_mclk_clk_src[] = {
743	F(24000000, P_GPLL2, 1, 1, 33),
744	F(66667000, P_GPLL0, 12, 0, 0),
745	{ }
746};
747
748static struct clk_rcg2 mclk0_clk_src = {
749	.cmd_rcgr = 0x52000,
750	.hid_width = 5,
751	.mnd_width = 8,
752	.freq_tbl = ftbl_mclk_clk_src,
753	.parent_map = gcc_mclk_map,
754	.clkr.hw.init = &(struct clk_init_data) {
755		.name = "mclk0_clk_src",
756		.parent_data = gcc_mclk_data,
757		.num_parents = ARRAY_SIZE(gcc_mclk_data),
758		.ops = &clk_rcg2_ops,
759	}
760};
761
762static struct clk_rcg2 mclk1_clk_src = {
763	.cmd_rcgr = 0x53000,
764	.hid_width = 5,
765	.mnd_width = 8,
766	.freq_tbl = ftbl_mclk_clk_src,
767	.parent_map = gcc_mclk_map,
768	.clkr.hw.init = &(struct clk_init_data) {
769		.name = "mclk1_clk_src",
770		.parent_data = gcc_mclk_data,
771		.num_parents = ARRAY_SIZE(gcc_mclk_data),
772		.ops = &clk_rcg2_ops,
773	}
774};
775
776static const struct parent_map gcc_mdp_map[] = {
777	{ P_XO, 0 },
778	{ P_GPLL0, 1 },
779	{ P_GPLL1, 3 },
780};
781
782static const struct clk_parent_data gcc_mdp_data[] = {
783	{ .index = DT_XO },
784	{ .hw = &gpll0.clkr.hw },
785	{ .hw = &gpll1_vote.hw },
786};
787
788static const struct freq_tbl ftbl_mdp_clk_src[] = {
789	F(50000000, P_GPLL0, 16, 0, 0),
790	F(80000000, P_GPLL0, 10, 0, 0),
791	F(100000000, P_GPLL0, 8, 0, 0),
792	F(160000000, P_GPLL0, 5, 0, 0),
793	F(177780000, P_GPLL0, 4.5, 0, 0),
794	F(200000000, P_GPLL0, 4, 0, 0),
795	F(266670000, P_GPLL0, 3, 0, 0),
796	F(307200000, P_GPLL1, 4, 0, 0),
797	{ }
798};
799
800static struct clk_rcg2 mdp_clk_src = {
801	.cmd_rcgr = 0x4d014,
802	.hid_width = 5,
803	.freq_tbl = ftbl_mdp_clk_src,
804	.parent_map = gcc_mdp_map,
805	.clkr.hw.init = &(struct clk_init_data) {
806		.name = "mdp_clk_src",
807		.parent_data = gcc_mdp_data,
808		.num_parents = ARRAY_SIZE(gcc_mdp_data),
809		.ops = &clk_rcg2_ops,
810	}
811};
812
813static const struct parent_map gcc_pclk0_map[] = {
814	{ P_XO, 0 },
815	{ P_DSI0PLL, 1 },
816};
817
818static const struct clk_parent_data gcc_pclk_data[] = {
819	{ .index = DT_XO },
820	{ .index = DT_DSI0PLL },
821};
822
823static struct clk_rcg2 pclk0_clk_src = {
824	.cmd_rcgr = 0x4d000,
825	.hid_width = 5,
826	.mnd_width = 8,
827	.parent_map = gcc_pclk0_map,
828	.clkr.hw.init = &(struct clk_init_data) {
829		.name = "pclk0_clk_src",
830		.parent_data = gcc_pclk_data,
831		.num_parents = ARRAY_SIZE(gcc_pclk_data),
832		.ops = &clk_pixel_ops,
833		.flags = CLK_SET_RATE_PARENT,
834	}
835};
836
837static struct clk_rcg2 pcnoc_bfdcd_clk_src = {
838	.cmd_rcgr = 0x27000,
839	.hid_width = 5,
840	.parent_map = gcc_xo_gpll0_bimc_map,
841	.clkr.hw.init = &(struct clk_init_data) {
842		.name = "pcnoc_bfdcd_clk_src",
843		.parent_data = gcc_xo_gpll0_bimc_data,
844		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
845		.ops = &clk_rcg2_ops,
846	},
847};
848
849static const struct freq_tbl ftbl_pdm2_clk_src[] = {
850	F(64000000, P_GPLL0, 12.5, 0, 0),
851	{ }
852};
853
854static struct clk_rcg2 pdm2_clk_src = {
855	.cmd_rcgr = 0x44010,
856	.hid_width = 5,
857	.freq_tbl = ftbl_pdm2_clk_src,
858	.parent_map = gcc_xo_gpll0_map,
859	.clkr.hw.init = &(struct clk_init_data) {
860		.name = "pdm2_clk_src",
861		.parent_data = gcc_xo_gpll0_data,
862		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
863		.ops = &clk_rcg2_ops,
864	}
865};
866
867static const struct freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] = {
868	F(144000, P_XO, 16, 3, 25),
869	F(400000, P_XO, 12, 1, 4),
870	F(20000000, P_GPLL0, 10, 1, 4),
871	F(25000000, P_GPLL0, 16, 1, 2),
872	F(50000000, P_GPLL0, 16, 0, 0),
873	F(100000000, P_GPLL0, 8, 0, 0),
874	F(177770000, P_GPLL0, 4.5, 0, 0),
875	F(200000000, P_GPLL0, 4, 0, 0),
876	{ }
877};
878
879static struct clk_rcg2 sdcc1_apps_clk_src = {
880	.cmd_rcgr = 0x42004,
881	.hid_width = 5,
882	.mnd_width = 8,
883	.freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
884	.parent_map = gcc_xo_gpll0_map,
885	.clkr.hw.init = &(struct clk_init_data) {
886		.name = "sdcc1_apps_clk_src",
887		.parent_data = gcc_xo_gpll0_data,
888		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
889		.ops = &clk_rcg2_floor_ops,
890	}
891};
892
893static struct clk_rcg2 sdcc2_apps_clk_src = {
894	.cmd_rcgr = 0x43004,
895	.hid_width = 5,
896	.mnd_width = 8,
897	.freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
898	.parent_map = gcc_xo_gpll0_map,
899	.clkr.hw.init = &(struct clk_init_data) {
900		.name = "sdcc2_apps_clk_src",
901		.parent_data = gcc_xo_gpll0_data,
902		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
903		.ops = &clk_rcg2_floor_ops,
904	}
905};
906
907static struct clk_rcg2 system_noc_bfdcd_clk_src = {
908	.cmd_rcgr = 0x26004,
909	.hid_width = 5,
910	.parent_map = gcc_xo_gpll0_bimc_map,
911	.clkr.hw.init = &(struct clk_init_data) {
912		.name = "system_noc_bfdcd_clk_src",
913		.parent_data = gcc_xo_gpll0_bimc_data,
914		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
915		.ops = &clk_rcg2_ops,
916	},
917};
918
919static const struct freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
920	F(57140000, P_GPLL0, 14, 0, 0),
921	F(80000000, P_GPLL0, 10, 0, 0),
922	F(100000000, P_GPLL0, 8, 0, 0),
923	{ }
924};
925
926static struct clk_rcg2 usb_hs_system_clk_src = {
927	.cmd_rcgr = 0x41010,
928	.hid_width = 5,
929	.freq_tbl = ftbl_gcc_usb_hs_system_clk,
930	.parent_map = gcc_xo_gpll0_map,
931	.clkr.hw.init = &(struct clk_init_data) {
932		.name = "usb_hs_system_clk_src",
933		.parent_data = gcc_xo_gpll0_data,
934		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
935		.ops = &clk_rcg2_ops,
936	}
937};
938
939static const struct parent_map gcc_vcodec0_map[] = {
940	{ P_XO, 0 },
941	{ P_GPLL0, 1 },
942	{ P_GPLL1, 3 },
943};
944
945static const struct clk_parent_data gcc_vcodec0_data[] = {
946	{ .index = DT_XO },
947	{ .hw = &gpll0.clkr.hw },
948	{ .hw = &gpll1_vote.hw },
949};
950
951static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
952	F(133330000, P_GPLL0, 6, 0, 0),
953	F(266670000, P_GPLL0, 3, 0, 0),
954	F(307200000, P_GPLL1, 4, 0, 0),
955	{ }
956};
957
958static struct clk_rcg2 vcodec0_clk_src = {
959	.cmd_rcgr = 0x4c000,
960	.hid_width = 5,
961	.mnd_width = 8,
962	.freq_tbl = ftbl_vcodec0_clk_src,
963	.parent_map = gcc_vcodec0_map,
964	.clkr.hw.init = &(struct clk_init_data) {
965		.name = "vcodec0_clk_src",
966		.parent_data = gcc_vcodec0_data,
967		.num_parents = ARRAY_SIZE(gcc_vcodec0_data),
968		.ops = &clk_rcg2_ops,
969	}
970};
971
972static const struct freq_tbl ftbl_gcc_camss_vfe0_clk[] = {
973	F(50000000, P_GPLL0, 16, 0, 0),
974	F(80000000, P_GPLL0, 10, 0, 0),
975	F(100000000, P_GPLL0, 8, 0, 0),
976	F(133330000, P_GPLL0, 6, 0, 0),
977	F(160000000, P_GPLL0, 5, 0, 0),
978	F(177780000, P_GPLL0, 4.5, 0, 0),
979	F(200000000, P_GPLL0, 4, 0, 0),
980	F(266670000, P_GPLL0, 3, 0, 0),
981	F(320000000, P_GPLL0, 2.5, 0, 0),
982	{ }
983};
984
985static struct clk_rcg2 vfe0_clk_src = {
986	.cmd_rcgr = 0x58000,
987	.hid_width = 5,
988	.freq_tbl = ftbl_gcc_camss_vfe0_clk,
989	.parent_map = gcc_xo_gpll0_map,
990	.clkr.hw.init = &(struct clk_init_data) {
991		.name = "vfe0_clk_src",
992		.parent_data = gcc_xo_gpll0_data,
993		.num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
994		.ops = &clk_rcg2_ops,
995	}
996};
997
998static const struct freq_tbl ftbl_vsync_clk_src[] = {
999	F(19200000, P_XO, 1, 0, 0),
1000	{ }
1001};
1002
1003static struct clk_rcg2 vsync_clk_src = {
1004	.cmd_rcgr = 0x4d02c,
1005	.hid_width = 5,
1006	.freq_tbl = ftbl_vsync_clk_src,
1007	.parent_map = gcc_xo_map,
1008	.clkr.hw.init = &(struct clk_init_data) {
1009		.name = "vsync_clk_src",
1010		.parent_data = gcc_xo_data,
1011		.num_parents = ARRAY_SIZE(gcc_xo_data),
1012		.ops = &clk_rcg2_ops,
1013	}
1014};
1015
1016static struct clk_branch gcc_apss_tcu_clk = {
1017	.halt_reg = 0x12018,
1018	.halt_check = BRANCH_HALT_VOTED,
1019	.clkr = {
1020		.enable_reg = 0x4500c,
1021		.enable_mask = BIT(1),
1022		.hw.init = &(struct clk_init_data) {
1023			.name = "gcc_apss_tcu_clk",
1024			.parent_hws = (const struct clk_hw*[]) {
1025				&bimc_ddr_clk_src.clkr.hw,
1026			},
1027			.num_parents = 1,
1028			.ops = &clk_branch2_ops,
1029		}
1030	}
1031};
1032
1033static struct clk_branch gcc_blsp1_ahb_clk = {
1034	.halt_reg = 0x01008,
1035	.halt_check = BRANCH_HALT_VOTED,
1036	.clkr = {
1037		.enable_reg = 0x45004,
1038		.enable_mask = BIT(10),
1039		.hw.init = &(struct clk_init_data) {
1040			.name = "gcc_blsp1_ahb_clk",
1041			.parent_hws = (const struct clk_hw*[]) {
1042				&pcnoc_bfdcd_clk_src.clkr.hw,
1043			},
1044			.num_parents = 1,
1045			.ops = &clk_branch2_ops,
1046		}
1047	}
1048};
1049
1050static struct clk_branch gcc_blsp1_sleep_clk = {
1051	.halt_reg = 0x01004,
1052	.halt_check = BRANCH_HALT_VOTED,
1053	.clkr = {
1054		.enable_reg = 0x45004,
1055		.enable_mask = BIT(9),
1056		.hw.init = &(struct clk_init_data) {
1057			.name = "gcc_blsp1_sleep_clk",
1058			.parent_data = gcc_sleep_clk_data,
1059			.num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
1060			.ops = &clk_branch2_ops,
1061		}
1062	}
1063};
1064
1065static struct clk_branch gcc_boot_rom_ahb_clk = {
1066	.halt_reg = 0x1300c,
1067	.halt_check = BRANCH_HALT_VOTED,
1068	.clkr = {
1069		.enable_reg = 0x45004,
1070		.enable_mask = BIT(7),
1071		.hw.init = &(struct clk_init_data) {
1072			.name = "gcc_boot_rom_ahb_clk",
1073			.parent_hws = (const struct clk_hw*[]) {
1074				&pcnoc_bfdcd_clk_src.clkr.hw,
1075			},
1076			.num_parents = 1,
1077			.ops = &clk_branch2_ops,
1078		}
1079	}
1080};
1081
1082static struct clk_branch gcc_crypto_clk = {
1083	.halt_reg = 0x1601c,
1084	.halt_check = BRANCH_HALT_VOTED,
1085	.clkr = {
1086		.enable_reg = 0x45004,
1087		.enable_mask = BIT(2),
1088		.hw.init = &(struct clk_init_data) {
1089			.name = "gcc_crypto_clk",
1090			.parent_hws = (const struct clk_hw*[]) {
1091				&crypto_clk_src.clkr.hw,
1092			},
1093			.num_parents = 1,
1094			.ops = &clk_branch2_ops,
1095			.flags = CLK_SET_RATE_PARENT,
1096		}
1097	}
1098};
1099
1100static struct clk_branch gcc_crypto_ahb_clk = {
1101	.halt_reg = 0x16024,
1102	.halt_check = BRANCH_HALT_VOTED,
1103	.clkr = {
1104		.enable_reg = 0x45004,
1105		.enable_mask = BIT(0),
1106		.hw.init = &(struct clk_init_data) {
1107			.name = "gcc_crypto_ahb_clk",
1108			.parent_hws = (const struct clk_hw*[]) {
1109				&pcnoc_bfdcd_clk_src.clkr.hw,
1110			},
1111			.num_parents = 1,
1112			.ops = &clk_branch2_ops,
1113		}
1114	}
1115};
1116
1117static struct clk_branch gcc_crypto_axi_clk = {
1118	.halt_reg = 0x16020,
1119	.halt_check = BRANCH_HALT_VOTED,
1120	.clkr = {
1121		.enable_reg = 0x45004,
1122		.enable_mask = BIT(1),
1123		.hw.init = &(struct clk_init_data) {
1124			.name = "gcc_crypto_axi_clk",
1125			.parent_hws = (const struct clk_hw*[]) {
1126				&pcnoc_bfdcd_clk_src.clkr.hw,
1127			},
1128			.num_parents = 1,
1129			.ops = &clk_branch2_ops,
1130		}
1131	}
1132};
1133
1134static struct clk_branch gcc_gfx_tbu_clk = {
1135	.halt_reg = 0x12010,
1136	.halt_check = BRANCH_HALT_VOTED,
1137	.clkr = {
1138		.enable_reg = 0x4500c,
1139		.enable_mask = BIT(3),
1140		.hw.init = &(struct clk_init_data) {
1141			.name = "gcc_gfx_tbu_clk",
1142			.parent_hws = (const struct clk_hw*[]) {
1143				&bimc_ddr_clk_src.clkr.hw,
1144			},
1145			.num_parents = 1,
1146			.ops = &clk_branch2_ops,
1147		}
1148	}
1149};
1150
1151static struct clk_branch gcc_gfx_tcu_clk = {
1152	.halt_reg = 0x12020,
1153	.halt_check = BRANCH_HALT_VOTED,
1154	.clkr = {
1155		.enable_reg = 0x4500c,
1156		.enable_mask = BIT(2),
1157		.hw.init = &(struct clk_init_data) {
1158			.name = "gcc_gfx_tcu_clk",
1159			.parent_hws = (const struct clk_hw*[]) {
1160				&bimc_ddr_clk_src.clkr.hw,
1161			},
1162			.num_parents = 1,
1163			.ops = &clk_branch2_ops,
1164		}
1165	}
1166};
1167
1168static struct clk_branch gcc_gtcu_ahb_clk = {
1169	.halt_reg = 0x12044,
1170	.halt_check = BRANCH_HALT_VOTED,
1171	.clkr = {
1172		.enable_reg = 0x4500c,
1173		.enable_mask = BIT(13),
1174		.hw.init = &(struct clk_init_data) {
1175			.name = "gcc_gtcu_ahb_clk",
1176			.parent_hws = (const struct clk_hw*[]) {
1177				&pcnoc_bfdcd_clk_src.clkr.hw,
1178			},
1179			.num_parents = 1,
1180			.ops = &clk_branch2_ops,
1181		}
1182	}
1183};
1184
1185static struct clk_branch gcc_mdp_tbu_clk = {
1186	.halt_reg = 0x1201c,
1187	.halt_check = BRANCH_HALT_VOTED,
1188	.clkr = {
1189		.enable_reg = 0x4500c,
1190		.enable_mask = BIT(4),
1191		.hw.init = &(struct clk_init_data) {
1192			.name = "gcc_mdp_tbu_clk",
1193			.parent_hws = (const struct clk_hw*[]) {
1194				&system_noc_bfdcd_clk_src.clkr.hw,
1195			},
1196			.num_parents = 1,
1197			.ops = &clk_branch2_ops,
1198		}
1199	}
1200};
1201
1202static struct clk_branch gcc_prng_ahb_clk = {
1203	.halt_reg = 0x13004,
1204	.halt_check = BRANCH_HALT_VOTED,
1205	.clkr = {
1206		.enable_reg = 0x45004,
1207		.enable_mask = BIT(8),
1208		.hw.init = &(struct clk_init_data) {
1209			.name = "gcc_prng_ahb_clk",
1210			.parent_hws = (const struct clk_hw*[]) {
1211				&pcnoc_bfdcd_clk_src.clkr.hw,
1212			},
1213			.num_parents = 1,
1214			.ops = &clk_branch2_ops,
1215		}
1216	}
1217};
1218
1219static struct clk_branch gcc_smmu_cfg_clk = {
1220	.halt_reg = 0x12038,
1221	.halt_check = BRANCH_HALT_VOTED,
1222	.clkr = {
1223		.enable_reg = 0x4500c,
1224		.enable_mask = BIT(12),
1225		.hw.init = &(struct clk_init_data) {
1226			.name = "gcc_smmu_cfg_clk",
1227			.parent_hws = (const struct clk_hw*[]) {
1228				&pcnoc_bfdcd_clk_src.clkr.hw,
1229			},
1230			.num_parents = 1,
1231			.ops = &clk_branch2_ops,
1232		}
1233	}
1234};
1235
1236static struct clk_branch gcc_venus_tbu_clk = {
1237	.halt_reg = 0x12014,
1238	.halt_check = BRANCH_HALT_VOTED,
1239	.clkr = {
1240		.enable_reg = 0x4500c,
1241		.enable_mask = BIT(5),
1242		.hw.init = &(struct clk_init_data) {
1243			.name = "gcc_venus_tbu_clk",
1244			.parent_hws = (const struct clk_hw*[]) {
1245				&system_noc_bfdcd_clk_src.clkr.hw,
1246			},
1247			.num_parents = 1,
1248			.ops = &clk_branch2_ops,
1249		}
1250	}
1251};
1252
1253static struct clk_branch gcc_vfe_tbu_clk = {
1254	.halt_reg = 0x1203c,
1255	.halt_check = BRANCH_HALT_VOTED,
1256	.clkr = {
1257		.enable_reg = 0x4500c,
1258		.enable_mask = BIT(9),
1259		.hw.init = &(struct clk_init_data) {
1260			.name = "gcc_vfe_tbu_clk",
1261			.parent_hws = (const struct clk_hw*[]) {
1262				&system_noc_bfdcd_clk_src.clkr.hw,
1263			},
1264			.num_parents = 1,
1265			.ops = &clk_branch2_ops,
1266		}
1267	}
1268};
1269
1270static struct clk_branch gcc_bimc_gfx_clk = {
1271	.halt_reg = 0x31024,
1272	.halt_check = BRANCH_HALT,
1273	.clkr = {
1274		.enable_reg = 0x31024,
1275		.enable_mask = BIT(0),
1276		.hw.init = &(struct clk_init_data) {
1277			.name = "gcc_bimc_gfx_clk",
1278			.parent_hws = (const struct clk_hw*[]) {
1279				&bimc_gpu_clk_src.clkr.hw,
1280			},
1281			.num_parents = 1,
1282			.ops = &clk_branch2_ops,
1283		}
1284	}
1285};
1286
1287static struct clk_branch gcc_bimc_gpu_clk = {
1288	.halt_reg = 0x31040,
1289	.halt_check = BRANCH_HALT,
1290	.clkr = {
1291		.enable_reg = 0x31040,
1292		.enable_mask = BIT(0),
1293		.hw.init = &(struct clk_init_data) {
1294			.name = "gcc_bimc_gpu_clk",
1295			.parent_hws = (const struct clk_hw*[]) {
1296				&bimc_gpu_clk_src.clkr.hw,
1297			},
1298			.num_parents = 1,
1299			.ops = &clk_branch2_ops,
1300		}
1301	}
1302};
1303
1304static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
1305	.halt_reg = 0x02008,
1306	.halt_check = BRANCH_HALT,
1307	.clkr = {
1308		.enable_reg = 0x02008,
1309		.enable_mask = BIT(0),
1310		.hw.init = &(struct clk_init_data) {
1311			.name = "gcc_blsp1_qup1_i2c_apps_clk",
1312			.parent_hws = (const struct clk_hw*[]) {
1313				&blsp1_qup1_i2c_apps_clk_src.clkr.hw,
1314			},
1315			.num_parents = 1,
1316			.ops = &clk_branch2_ops,
1317			.flags = CLK_SET_RATE_PARENT,
1318		}
1319	}
1320};
1321
1322static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
1323	.halt_reg = 0x03010,
1324	.halt_check = BRANCH_HALT,
1325	.clkr = {
1326		.enable_reg = 0x03010,
1327		.enable_mask = BIT(0),
1328		.hw.init = &(struct clk_init_data) {
1329			.name = "gcc_blsp1_qup2_i2c_apps_clk",
1330			.parent_hws = (const struct clk_hw*[]) {
1331				&blsp1_qup2_i2c_apps_clk_src.clkr.hw,
1332			},
1333			.num_parents = 1,
1334			.ops = &clk_branch2_ops,
1335			.flags = CLK_SET_RATE_PARENT,
1336		}
1337	}
1338};
1339
1340static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
1341	.halt_reg = 0x04020,
1342	.halt_check = BRANCH_HALT,
1343	.clkr = {
1344		.enable_reg = 0x04020,
1345		.enable_mask = BIT(0),
1346		.hw.init = &(struct clk_init_data) {
1347			.name = "gcc_blsp1_qup3_i2c_apps_clk",
1348			.parent_hws = (const struct clk_hw*[]) {
1349				&blsp1_qup3_i2c_apps_clk_src.clkr.hw,
1350			},
1351			.num_parents = 1,
1352			.ops = &clk_branch2_ops,
1353			.flags = CLK_SET_RATE_PARENT,
1354		}
1355	}
1356};
1357
1358static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
1359	.halt_reg = 0x05020,
1360	.halt_check = BRANCH_HALT,
1361	.clkr = {
1362		.enable_reg = 0x05020,
1363		.enable_mask = BIT(0),
1364		.hw.init = &(struct clk_init_data) {
1365			.name = "gcc_blsp1_qup4_i2c_apps_clk",
1366			.parent_hws = (const struct clk_hw*[]) {
1367				&blsp1_qup4_i2c_apps_clk_src.clkr.hw,
1368			},
1369			.num_parents = 1,
1370			.ops = &clk_branch2_ops,
1371			.flags = CLK_SET_RATE_PARENT,
1372		}
1373	}
1374};
1375
1376static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
1377	.halt_reg = 0x06020,
1378	.halt_check = BRANCH_HALT,
1379	.clkr = {
1380		.enable_reg = 0x06020,
1381		.enable_mask = BIT(0),
1382		.hw.init = &(struct clk_init_data) {
1383			.name = "gcc_blsp1_qup5_i2c_apps_clk",
1384			.parent_hws = (const struct clk_hw*[]) {
1385				&blsp1_qup5_i2c_apps_clk_src.clkr.hw,
1386			},
1387			.num_parents = 1,
1388			.ops = &clk_branch2_ops,
1389			.flags = CLK_SET_RATE_PARENT,
1390		}
1391	}
1392};
1393
1394static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
1395	.halt_reg = 0x07020,
1396	.halt_check = BRANCH_HALT,
1397	.clkr = {
1398		.enable_reg = 0x07020,
1399		.enable_mask = BIT(0),
1400		.hw.init = &(struct clk_init_data) {
1401			.name = "gcc_blsp1_qup6_i2c_apps_clk",
1402			.parent_hws = (const struct clk_hw*[]) {
1403				&blsp1_qup6_i2c_apps_clk_src.clkr.hw,
1404			},
1405			.num_parents = 1,
1406			.ops = &clk_branch2_ops,
1407			.flags = CLK_SET_RATE_PARENT,
1408		}
1409	}
1410};
1411
1412static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
1413	.halt_reg = 0x02004,
1414	.halt_check = BRANCH_HALT,
1415	.clkr = {
1416		.enable_reg = 0x02004,
1417		.enable_mask = BIT(0),
1418		.hw.init = &(struct clk_init_data) {
1419			.name = "gcc_blsp1_qup1_spi_apps_clk",
1420			.parent_hws = (const struct clk_hw*[]) {
1421				&blsp1_qup1_spi_apps_clk_src.clkr.hw,
1422			},
1423			.num_parents = 1,
1424			.ops = &clk_branch2_ops,
1425			.flags = CLK_SET_RATE_PARENT,
1426		}
1427	}
1428};
1429
1430static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
1431	.halt_reg = 0x0300c,
1432	.halt_check = BRANCH_HALT,
1433	.clkr = {
1434		.enable_reg = 0x0300c,
1435		.enable_mask = BIT(0),
1436		.hw.init = &(struct clk_init_data) {
1437			.name = "gcc_blsp1_qup2_spi_apps_clk",
1438			.parent_hws = (const struct clk_hw*[]) {
1439				&blsp1_qup2_spi_apps_clk_src.clkr.hw,
1440			},
1441			.num_parents = 1,
1442			.ops = &clk_branch2_ops,
1443			.flags = CLK_SET_RATE_PARENT,
1444		}
1445	}
1446};
1447
1448static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
1449	.halt_reg = 0x0401c,
1450	.halt_check = BRANCH_HALT,
1451	.clkr = {
1452		.enable_reg = 0x0401c,
1453		.enable_mask = BIT(0),
1454		.hw.init = &(struct clk_init_data) {
1455			.name = "gcc_blsp1_qup3_spi_apps_clk",
1456			.parent_hws = (const struct clk_hw*[]) {
1457				&blsp1_qup3_spi_apps_clk_src.clkr.hw,
1458			},
1459			.num_parents = 1,
1460			.ops = &clk_branch2_ops,
1461			.flags = CLK_SET_RATE_PARENT,
1462		}
1463	}
1464};
1465
1466static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
1467	.halt_reg = 0x0501c,
1468	.halt_check = BRANCH_HALT,
1469	.clkr = {
1470		.enable_reg = 0x0501c,
1471		.enable_mask = BIT(0),
1472		.hw.init = &(struct clk_init_data) {
1473			.name = "gcc_blsp1_qup4_spi_apps_clk",
1474			.parent_hws = (const struct clk_hw*[]) {
1475				&blsp1_qup4_spi_apps_clk_src.clkr.hw,
1476			},
1477			.num_parents = 1,
1478			.ops = &clk_branch2_ops,
1479			.flags = CLK_SET_RATE_PARENT,
1480		}
1481	}
1482};
1483
1484static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
1485	.halt_reg = 0x0601c,
1486	.halt_check = BRANCH_HALT,
1487	.clkr = {
1488		.enable_reg = 0x0601c,
1489		.enable_mask = BIT(0),
1490		.hw.init = &(struct clk_init_data) {
1491			.name = "gcc_blsp1_qup5_spi_apps_clk",
1492			.parent_hws = (const struct clk_hw*[]) {
1493				&blsp1_qup5_spi_apps_clk_src.clkr.hw,
1494			},
1495			.num_parents = 1,
1496			.ops = &clk_branch2_ops,
1497			.flags = CLK_SET_RATE_PARENT,
1498		}
1499	}
1500};
1501
1502static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
1503	.halt_reg = 0x0701c,
1504	.halt_check = BRANCH_HALT,
1505	.clkr = {
1506		.enable_reg = 0x0701c,
1507		.enable_mask = BIT(0),
1508		.hw.init = &(struct clk_init_data) {
1509			.name = "gcc_blsp1_qup6_spi_apps_clk",
1510			.parent_hws = (const struct clk_hw*[]) {
1511				&blsp1_qup6_spi_apps_clk_src.clkr.hw,
1512			},
1513			.num_parents = 1,
1514			.ops = &clk_branch2_ops,
1515			.flags = CLK_SET_RATE_PARENT,
1516		}
1517	}
1518};
1519
1520static struct clk_branch gcc_blsp1_uart1_apps_clk = {
1521	.halt_reg = 0x0203c,
1522	.halt_check = BRANCH_HALT,
1523	.clkr = {
1524		.enable_reg = 0x0203c,
1525		.enable_mask = BIT(0),
1526		.hw.init = &(struct clk_init_data) {
1527			.name = "gcc_blsp1_uart1_apps_clk",
1528			.parent_hws = (const struct clk_hw*[]) {
1529				&blsp1_uart1_apps_clk_src.clkr.hw,
1530			},
1531			.num_parents = 1,
1532			.ops = &clk_branch2_ops,
1533			.flags = CLK_SET_RATE_PARENT,
1534		}
1535	}
1536};
1537
1538static struct clk_branch gcc_blsp1_uart2_apps_clk = {
1539	.halt_reg = 0x0302c,
1540	.halt_check = BRANCH_HALT,
1541	.clkr = {
1542		.enable_reg = 0x0302c,
1543		.enable_mask = BIT(0),
1544		.hw.init = &(struct clk_init_data) {
1545			.name = "gcc_blsp1_uart2_apps_clk",
1546			.parent_hws = (const struct clk_hw*[]) {
1547				&blsp1_uart2_apps_clk_src.clkr.hw,
1548			},
1549			.num_parents = 1,
1550			.ops = &clk_branch2_ops,
1551			.flags = CLK_SET_RATE_PARENT,
1552		}
1553	}
1554};
1555
1556static struct clk_branch gcc_camss_ahb_clk = {
1557	.halt_reg = 0x5a014,
1558	.halt_check = BRANCH_HALT,
1559	.clkr = {
1560		.enable_reg = 0x5a014,
1561		.enable_mask = BIT(0),
1562		.hw.init = &(struct clk_init_data) {
1563			.name = "gcc_camss_ahb_clk",
1564			.parent_hws = (const struct clk_hw*[]) {
1565				&pcnoc_bfdcd_clk_src.clkr.hw,
1566			},
1567			.num_parents = 1,
1568			.ops = &clk_branch2_ops,
1569		}
1570	}
1571};
1572
1573static struct clk_branch gcc_camss_csi0_clk = {
1574	.halt_reg = 0x4e03c,
1575	.halt_check = BRANCH_HALT,
1576	.clkr = {
1577		.enable_reg = 0x4e03c,
1578		.enable_mask = BIT(0),
1579		.hw.init = &(struct clk_init_data) {
1580			.name = "gcc_camss_csi0_clk",
1581			.parent_hws = (const struct clk_hw*[]) {
1582				&csi0_clk_src.clkr.hw,
1583			},
1584			.num_parents = 1,
1585			.ops = &clk_branch2_ops,
1586			.flags = CLK_SET_RATE_PARENT,
1587		}
1588	}
1589};
1590
1591static struct clk_branch gcc_camss_csi0_ahb_clk = {
1592	.halt_reg = 0x4e040,
1593	.halt_check = BRANCH_HALT,
1594	.clkr = {
1595		.enable_reg = 0x4e040,
1596		.enable_mask = BIT(0),
1597		.hw.init = &(struct clk_init_data) {
1598			.name = "gcc_camss_csi0_ahb_clk",
1599			.parent_hws = (const struct clk_hw*[]) {
1600				&camss_top_ahb_clk_src.clkr.hw,
1601			},
1602			.num_parents = 1,
1603			.ops = &clk_branch2_ops,
1604			.flags = CLK_SET_RATE_PARENT,
1605		}
1606	}
1607};
1608
1609static struct clk_branch gcc_camss_csi0phy_clk = {
1610	.halt_reg = 0x4e048,
1611	.halt_check = BRANCH_HALT,
1612	.clkr = {
1613		.enable_reg = 0x4e048,
1614		.enable_mask = BIT(0),
1615		.hw.init = &(struct clk_init_data) {
1616			.name = "gcc_camss_csi0phy_clk",
1617			.parent_hws = (const struct clk_hw*[]) {
1618				&csi0_clk_src.clkr.hw,
1619			},
1620			.num_parents = 1,
1621			.ops = &clk_branch2_ops,
1622			.flags = CLK_SET_RATE_PARENT,
1623		}
1624	}
1625};
1626
1627static struct clk_branch gcc_camss_csi0phytimer_clk = {
1628	.halt_reg = 0x4e01c,
1629	.halt_check = BRANCH_HALT,
1630	.clkr = {
1631		.enable_reg = 0x4e01c,
1632		.enable_mask = BIT(0),
1633		.hw.init = &(struct clk_init_data) {
1634			.name = "gcc_camss_csi0phytimer_clk",
1635			.parent_hws = (const struct clk_hw*[]) {
1636				&csi0phytimer_clk_src.clkr.hw,
1637			},
1638			.num_parents = 1,
1639			.ops = &clk_branch2_ops,
1640			.flags = CLK_SET_RATE_PARENT,
1641		}
1642	}
1643};
1644
1645static struct clk_branch gcc_camss_csi0pix_clk = {
1646	.halt_reg = 0x4e058,
1647	.halt_check = BRANCH_HALT,
1648	.clkr = {
1649		.enable_reg = 0x4e058,
1650		.enable_mask = BIT(0),
1651		.hw.init = &(struct clk_init_data) {
1652			.name = "gcc_camss_csi0pix_clk",
1653			.parent_hws = (const struct clk_hw*[]) {
1654				&csi0_clk_src.clkr.hw,
1655			},
1656			.num_parents = 1,
1657			.ops = &clk_branch2_ops,
1658			.flags = CLK_SET_RATE_PARENT,
1659		}
1660	}
1661};
1662
1663static struct clk_branch gcc_camss_csi0rdi_clk = {
1664	.halt_reg = 0x4e050,
1665	.halt_check = BRANCH_HALT,
1666	.clkr = {
1667		.enable_reg = 0x4e050,
1668		.enable_mask = BIT(0),
1669		.hw.init = &(struct clk_init_data) {
1670			.name = "gcc_camss_csi0rdi_clk",
1671			.parent_hws = (const struct clk_hw*[]) {
1672				&csi0_clk_src.clkr.hw,
1673			},
1674			.num_parents = 1,
1675			.ops = &clk_branch2_ops,
1676			.flags = CLK_SET_RATE_PARENT,
1677		}
1678	}
1679};
1680
1681static struct clk_branch gcc_camss_csi1_clk = {
1682	.halt_reg = 0x4f03c,
1683	.halt_check = BRANCH_HALT,
1684	.clkr = {
1685		.enable_reg = 0x4f03c,
1686		.enable_mask = BIT(0),
1687		.hw.init = &(struct clk_init_data) {
1688			.name = "gcc_camss_csi1_clk",
1689			.parent_hws = (const struct clk_hw*[]) {
1690				&csi1_clk_src.clkr.hw,
1691			},
1692			.num_parents = 1,
1693			.ops = &clk_branch2_ops,
1694			.flags = CLK_SET_RATE_PARENT,
1695		}
1696	}
1697};
1698
1699static struct clk_branch gcc_camss_csi1_ahb_clk = {
1700	.halt_reg = 0x4f040,
1701	.halt_check = BRANCH_HALT,
1702	.clkr = {
1703		.enable_reg = 0x4f040,
1704		.enable_mask = BIT(0),
1705		.hw.init = &(struct clk_init_data) {
1706			.name = "gcc_camss_csi1_ahb_clk",
1707			.parent_hws = (const struct clk_hw*[]) {
1708				&camss_top_ahb_clk_src.clkr.hw,
1709			},
1710			.num_parents = 1,
1711			.ops = &clk_branch2_ops,
1712			.flags = CLK_SET_RATE_PARENT,
1713		}
1714	}
1715};
1716
1717static struct clk_branch gcc_camss_csi1phy_clk = {
1718	.halt_reg = 0x4f048,
1719	.halt_check = BRANCH_HALT,
1720	.clkr = {
1721		.enable_reg = 0x4f048,
1722		.enable_mask = BIT(0),
1723		.hw.init = &(struct clk_init_data) {
1724			.name = "gcc_camss_csi1phy_clk",
1725			.parent_hws = (const struct clk_hw*[]) {
1726				&csi1_clk_src.clkr.hw,
1727			},
1728			.num_parents = 1,
1729			.ops = &clk_branch2_ops,
1730			.flags = CLK_SET_RATE_PARENT,
1731		}
1732	}
1733};
1734
1735static struct clk_branch gcc_camss_csi1pix_clk = {
1736	.halt_reg = 0x4f058,
1737	.halt_check = BRANCH_HALT,
1738	.clkr = {
1739		.enable_reg = 0x4f058,
1740		.enable_mask = BIT(0),
1741		.hw.init = &(struct clk_init_data) {
1742			.name = "gcc_camss_csi1pix_clk",
1743			.parent_hws = (const struct clk_hw*[]) {
1744				&csi1_clk_src.clkr.hw,
1745			},
1746			.num_parents = 1,
1747			.ops = &clk_branch2_ops,
1748			.flags = CLK_SET_RATE_PARENT,
1749		}
1750	}
1751};
1752
1753static struct clk_branch gcc_camss_csi1rdi_clk = {
1754	.halt_reg = 0x4f050,
1755	.halt_check = BRANCH_HALT,
1756	.clkr = {
1757		.enable_reg = 0x4f050,
1758		.enable_mask = BIT(0),
1759		.hw.init = &(struct clk_init_data) {
1760			.name = "gcc_camss_csi1rdi_clk",
1761			.parent_hws = (const struct clk_hw*[]) {
1762				&csi1_clk_src.clkr.hw,
1763			},
1764			.num_parents = 1,
1765			.ops = &clk_branch2_ops,
1766			.flags = CLK_SET_RATE_PARENT,
1767		}
1768	}
1769};
1770
1771static struct clk_branch gcc_camss_csi_vfe0_clk = {
1772	.halt_reg = 0x58050,
1773	.halt_check = BRANCH_HALT,
1774	.clkr = {
1775		.enable_reg = 0x58050,
1776		.enable_mask = BIT(0),
1777		.hw.init = &(struct clk_init_data) {
1778			.name = "gcc_camss_csi_vfe0_clk",
1779			.parent_hws = (const struct clk_hw*[]) {
1780				&vfe0_clk_src.clkr.hw,
1781			},
1782			.num_parents = 1,
1783			.ops = &clk_branch2_ops,
1784			.flags = CLK_SET_RATE_PARENT,
1785		}
1786	}
1787};
1788
1789static struct clk_branch gcc_camss_gp0_clk = {
1790	.halt_reg = 0x54018,
1791	.halt_check = BRANCH_HALT,
1792	.clkr = {
1793		.enable_reg = 0x54018,
1794		.enable_mask = BIT(0),
1795		.hw.init = &(struct clk_init_data) {
1796			.name = "gcc_camss_gp0_clk",
1797			.parent_hws = (const struct clk_hw*[]) {
1798				&camss_gp0_clk_src.clkr.hw,
1799			},
1800			.num_parents = 1,
1801			.ops = &clk_branch2_ops,
1802			.flags = CLK_SET_RATE_PARENT,
1803		}
1804	}
1805};
1806
1807static struct clk_branch gcc_camss_gp1_clk = {
1808	.halt_reg = 0x55018,
1809	.halt_check = BRANCH_HALT,
1810	.clkr = {
1811		.enable_reg = 0x55018,
1812		.enable_mask = BIT(0),
1813		.hw.init = &(struct clk_init_data) {
1814			.name = "gcc_camss_gp1_clk",
1815			.parent_hws = (const struct clk_hw*[]) {
1816				&camss_gp1_clk_src.clkr.hw,
1817			},
1818			.num_parents = 1,
1819			.ops = &clk_branch2_ops,
1820			.flags = CLK_SET_RATE_PARENT,
1821		}
1822	}
1823};
1824
1825static struct clk_branch gcc_camss_ispif_ahb_clk = {
1826	.halt_reg = 0x50004,
1827	.halt_check = BRANCH_HALT,
1828	.clkr = {
1829		.enable_reg = 0x50004,
1830		.enable_mask = BIT(0),
1831		.hw.init = &(struct clk_init_data) {
1832			.name = "gcc_camss_ispif_ahb_clk",
1833			.parent_hws = (const struct clk_hw*[]) {
1834				&camss_top_ahb_clk_src.clkr.hw,
1835			},
1836			.num_parents = 1,
1837			.ops = &clk_branch2_ops,
1838			.flags = CLK_SET_RATE_PARENT,
1839		}
1840	}
1841};
1842
1843static struct clk_branch gcc_camss_mclk0_clk = {
1844	.halt_reg = 0x52018,
1845	.halt_check = BRANCH_HALT,
1846	.clkr = {
1847		.enable_reg = 0x52018,
1848		.enable_mask = BIT(0),
1849		.hw.init = &(struct clk_init_data) {
1850			.name = "gcc_camss_mclk0_clk",
1851			.parent_hws = (const struct clk_hw*[]) {
1852				&mclk0_clk_src.clkr.hw,
1853			},
1854			.num_parents = 1,
1855			.ops = &clk_branch2_ops,
1856			.flags = CLK_SET_RATE_PARENT,
1857		}
1858	}
1859};
1860
1861static struct clk_branch gcc_camss_mclk1_clk = {
1862	.halt_reg = 0x53018,
1863	.halt_check = BRANCH_HALT,
1864	.clkr = {
1865		.enable_reg = 0x53018,
1866		.enable_mask = BIT(0),
1867		.hw.init = &(struct clk_init_data) {
1868			.name = "gcc_camss_mclk1_clk",
1869			.parent_hws = (const struct clk_hw*[]) {
1870				&mclk1_clk_src.clkr.hw,
1871			},
1872			.num_parents = 1,
1873			.ops = &clk_branch2_ops,
1874			.flags = CLK_SET_RATE_PARENT,
1875		}
1876	}
1877};
1878
1879static struct clk_branch gcc_camss_top_ahb_clk = {
1880	.halt_reg = 0x56004,
1881	.halt_check = BRANCH_HALT,
1882	.clkr = {
1883		.enable_reg = 0x56004,
1884		.enable_mask = BIT(0),
1885		.hw.init = &(struct clk_init_data) {
1886			.name = "gcc_camss_top_ahb_clk",
1887			.parent_hws = (const struct clk_hw*[]) {
1888				&camss_top_ahb_clk_src.clkr.hw,
1889			},
1890			.num_parents = 1,
1891			.ops = &clk_branch2_ops,
1892			.flags = CLK_SET_RATE_PARENT,
1893		}
1894	}
1895};
1896
1897static struct clk_branch gcc_camss_vfe0_clk = {
1898	.halt_reg = 0x58038,
1899	.halt_check = BRANCH_HALT,
1900	.clkr = {
1901		.enable_reg = 0x58038,
1902		.enable_mask = BIT(0),
1903		.hw.init = &(struct clk_init_data) {
1904			.name = "gcc_camss_vfe0_clk",
1905			.parent_hws = (const struct clk_hw*[]) {
1906				&vfe0_clk_src.clkr.hw,
1907			},
1908			.num_parents = 1,
1909			.ops = &clk_branch2_ops,
1910			.flags = CLK_SET_RATE_PARENT,
1911		}
1912	}
1913};
1914
1915static struct clk_branch gcc_camss_vfe_ahb_clk = {
1916	.halt_reg = 0x58044,
1917	.halt_check = BRANCH_HALT,
1918	.clkr = {
1919		.enable_reg = 0x58044,
1920		.enable_mask = BIT(0),
1921		.hw.init = &(struct clk_init_data) {
1922			.name = "gcc_camss_vfe_ahb_clk",
1923			.parent_hws = (const struct clk_hw*[]) {
1924				&camss_top_ahb_clk_src.clkr.hw,
1925			},
1926			.num_parents = 1,
1927			.ops = &clk_branch2_ops,
1928			.flags = CLK_SET_RATE_PARENT,
1929		}
1930	}
1931};
1932
1933static struct clk_branch gcc_camss_vfe_axi_clk = {
1934	.halt_reg = 0x58048,
1935	.halt_check = BRANCH_HALT,
1936	.clkr = {
1937		.enable_reg = 0x58048,
1938		.enable_mask = BIT(0),
1939		.hw.init = &(struct clk_init_data) {
1940			.name = "gcc_camss_vfe_axi_clk",
1941			.parent_hws = (const struct clk_hw*[]) {
1942				&system_noc_bfdcd_clk_src.clkr.hw,
1943			},
1944			.num_parents = 1,
1945			.ops = &clk_branch2_ops,
1946		}
1947	}
1948};
1949
1950static struct clk_branch gcc_gp1_clk = {
1951	.halt_reg = 0x08000,
1952	.halt_check = BRANCH_HALT,
1953	.clkr = {
1954		.enable_reg = 0x08000,
1955		.enable_mask = BIT(0),
1956		.hw.init = &(struct clk_init_data) {
1957			.name = "gcc_gp1_clk",
1958			.parent_hws = (const struct clk_hw*[]) {
1959				&gp1_clk_src.clkr.hw,
1960			},
1961			.num_parents = 1,
1962			.ops = &clk_branch2_ops,
1963			.flags = CLK_SET_RATE_PARENT,
1964		}
1965	}
1966};
1967
1968static struct clk_branch gcc_gp2_clk = {
1969	.halt_reg = 0x09000,
1970	.halt_check = BRANCH_HALT,
1971	.clkr = {
1972		.enable_reg = 0x09000,
1973		.enable_mask = BIT(0),
1974		.hw.init = &(struct clk_init_data) {
1975			.name = "gcc_gp2_clk",
1976			.parent_hws = (const struct clk_hw*[]) {
1977				&gp2_clk_src.clkr.hw,
1978			},
1979			.num_parents = 1,
1980			.ops = &clk_branch2_ops,
1981			.flags = CLK_SET_RATE_PARENT,
1982		}
1983	}
1984};
1985
1986static struct clk_branch gcc_gp3_clk = {
1987	.halt_reg = 0x0a000,
1988	.halt_check = BRANCH_HALT,
1989	.clkr = {
1990		.enable_reg = 0x0a000,
1991		.enable_mask = BIT(0),
1992		.hw.init = &(struct clk_init_data) {
1993			.name = "gcc_gp3_clk",
1994			.parent_hws = (const struct clk_hw*[]) {
1995				&gp3_clk_src.clkr.hw,
1996			},
1997			.num_parents = 1,
1998			.ops = &clk_branch2_ops,
1999			.flags = CLK_SET_RATE_PARENT,
2000		}
2001	}
2002};
2003
2004static struct clk_branch gcc_mdss_ahb_clk = {
2005	.halt_reg = 0x4d07c,
2006	.halt_check = BRANCH_HALT,
2007	.clkr = {
2008		.enable_reg = 0x4d07c,
2009		.enable_mask = BIT(0),
2010		.hw.init = &(struct clk_init_data) {
2011			.name = "gcc_mdss_ahb_clk",
2012			.parent_hws = (const struct clk_hw*[]) {
2013				&pcnoc_bfdcd_clk_src.clkr.hw,
2014			},
2015			.num_parents = 1,
2016			.ops = &clk_branch2_ops,
2017		}
2018	}
2019};
2020
2021static struct clk_branch gcc_mdss_axi_clk = {
2022	.halt_reg = 0x4d080,
2023	.halt_check = BRANCH_HALT,
2024	.clkr = {
2025		.enable_reg = 0x4d080,
2026		.enable_mask = BIT(0),
2027		.hw.init = &(struct clk_init_data) {
2028			.name = "gcc_mdss_axi_clk",
2029			.parent_hws = (const struct clk_hw*[]) {
2030				&system_noc_bfdcd_clk_src.clkr.hw,
2031			},
2032			.num_parents = 1,
2033			.ops = &clk_branch2_ops,
2034		}
2035	}
2036};
2037
2038static struct clk_branch gcc_mdss_byte0_clk = {
2039	.halt_reg = 0x4d094,
2040	.halt_check = BRANCH_HALT,
2041	.clkr = {
2042		.enable_reg = 0x4d094,
2043		.enable_mask = BIT(0),
2044		.hw.init = &(struct clk_init_data) {
2045			.name = "gcc_mdss_byte0_clk",
2046			.parent_hws = (const struct clk_hw*[]) {
2047				&byte0_clk_src.clkr.hw,
2048			},
2049			.num_parents = 1,
2050			.ops = &clk_branch2_ops,
2051			.flags = CLK_SET_RATE_PARENT,
2052		}
2053	}
2054};
2055
2056static struct clk_branch gcc_mdss_esc0_clk = {
2057	.halt_reg = 0x4d098,
2058	.halt_check = BRANCH_HALT,
2059	.clkr = {
2060		.enable_reg = 0x4d098,
2061		.enable_mask = BIT(0),
2062		.hw.init = &(struct clk_init_data) {
2063			.name = "gcc_mdss_esc0_clk",
2064			.parent_hws = (const struct clk_hw*[]) {
2065				&esc0_clk_src.clkr.hw,
2066			},
2067			.num_parents = 1,
2068			.ops = &clk_branch2_ops,
2069			.flags = CLK_SET_RATE_PARENT,
2070		}
2071	}
2072};
2073
2074static struct clk_branch gcc_mdss_mdp_clk = {
2075	.halt_reg = 0x4d088,
2076	.halt_check = BRANCH_HALT,
2077	.clkr = {
2078		.enable_reg = 0x4d088,
2079		.enable_mask = BIT(0),
2080		.hw.init = &(struct clk_init_data) {
2081			.name = "gcc_mdss_mdp_clk",
2082			.parent_hws = (const struct clk_hw*[]) {
2083				&mdp_clk_src.clkr.hw,
2084			},
2085			.num_parents = 1,
2086			.ops = &clk_branch2_ops,
2087			.flags = CLK_SET_RATE_PARENT,
2088		}
2089	}
2090};
2091
2092static struct clk_branch gcc_mdss_pclk0_clk = {
2093	.halt_reg = 0x4d084,
2094	.halt_check = BRANCH_HALT,
2095	.clkr = {
2096		.enable_reg = 0x4d084,
2097		.enable_mask = BIT(0),
2098		.hw.init = &(struct clk_init_data) {
2099			.name = "gcc_mdss_pclk0_clk",
2100			.parent_hws = (const struct clk_hw*[]) {
2101				&pclk0_clk_src.clkr.hw,
2102			},
2103			.num_parents = 1,
2104			.ops = &clk_branch2_ops,
2105			.flags = CLK_SET_RATE_PARENT,
2106		}
2107	}
2108};
2109
2110static struct clk_branch gcc_mdss_vsync_clk = {
2111	.halt_reg = 0x4d090,
2112	.halt_check = BRANCH_HALT,
2113	.clkr = {
2114		.enable_reg = 0x4d090,
2115		.enable_mask = BIT(0),
2116		.hw.init = &(struct clk_init_data) {
2117			.name = "gcc_mdss_vsync_clk",
2118			.parent_hws = (const struct clk_hw*[]) {
2119				&vsync_clk_src.clkr.hw,
2120			},
2121			.num_parents = 1,
2122			.ops = &clk_branch2_ops,
2123			.flags = CLK_SET_RATE_PARENT,
2124		}
2125	}
2126};
2127
2128static struct clk_branch gcc_mss_cfg_ahb_clk = {
2129	.halt_reg = 0x49000,
2130	.halt_check = BRANCH_HALT,
2131	.clkr = {
2132		.enable_reg = 0x49000,
2133		.enable_mask = BIT(0),
2134		.hw.init = &(struct clk_init_data) {
2135			.name = "gcc_mss_cfg_ahb_clk",
2136			.parent_hws = (const struct clk_hw*[]) {
2137				&pcnoc_bfdcd_clk_src.clkr.hw,
2138			},
2139			.num_parents = 1,
2140			.ops = &clk_branch2_ops,
2141		}
2142	}
2143};
2144
2145static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
2146	.halt_reg = 0x49004,
2147	.halt_check = BRANCH_HALT,
2148	.clkr = {
2149		.enable_reg = 0x49004,
2150		.enable_mask = BIT(0),
2151		.hw.init = &(struct clk_init_data) {
2152			.name = "gcc_mss_q6_bimc_axi_clk",
2153			.parent_hws = (const struct clk_hw*[]) {
2154				&bimc_ddr_clk_src.clkr.hw,
2155			},
2156			.num_parents = 1,
2157			.ops = &clk_branch2_ops,
2158		}
2159	}
2160};
2161
2162static struct clk_branch gcc_oxili_ahb_clk = {
2163	.halt_reg = 0x59028,
2164	.halt_check = BRANCH_HALT,
2165	.clkr = {
2166		.enable_reg = 0x59028,
2167		.enable_mask = BIT(0),
2168		.hw.init = &(struct clk_init_data) {
2169			.name = "gcc_oxili_ahb_clk",
2170			.parent_hws = (const struct clk_hw*[]) {
2171				&pcnoc_bfdcd_clk_src.clkr.hw,
2172			},
2173			.num_parents = 1,
2174			.ops = &clk_branch2_ops,
2175		}
2176	}
2177};
2178
2179static struct clk_branch gcc_oxili_gfx3d_clk = {
2180	.halt_reg = 0x59020,
2181	.halt_check = BRANCH_HALT,
2182	.clkr = {
2183		.enable_reg = 0x59020,
2184		.enable_mask = BIT(0),
2185		.hw.init = &(struct clk_init_data) {
2186			.name = "gcc_oxili_gfx3d_clk",
2187			.parent_hws = (const struct clk_hw*[]) {
2188				&gfx3d_clk_src.clkr.hw,
2189			},
2190			.num_parents = 1,
2191			.ops = &clk_branch2_ops,
2192			.flags = CLK_SET_RATE_PARENT,
2193		}
2194	}
2195};
2196
2197static struct clk_branch gcc_pdm2_clk = {
2198	.halt_reg = 0x4400c,
2199	.halt_check = BRANCH_HALT,
2200	.clkr = {
2201		.enable_reg = 0x4400c,
2202		.enable_mask = BIT(0),
2203		.hw.init = &(struct clk_init_data) {
2204			.name = "gcc_pdm2_clk",
2205			.parent_hws = (const struct clk_hw*[]) {
2206				&pdm2_clk_src.clkr.hw,
2207			},
2208			.num_parents = 1,
2209			.ops = &clk_branch2_ops,
2210			.flags = CLK_SET_RATE_PARENT,
2211		}
2212	}
2213};
2214
2215static struct clk_branch gcc_pdm_ahb_clk = {
2216	.halt_reg = 0x44004,
2217	.halt_check = BRANCH_HALT,
2218	.clkr = {
2219		.enable_reg = 0x44004,
2220		.enable_mask = BIT(0),
2221		.hw.init = &(struct clk_init_data) {
2222			.name = "gcc_pdm_ahb_clk",
2223			.parent_hws = (const struct clk_hw*[]) {
2224				&pcnoc_bfdcd_clk_src.clkr.hw,
2225			},
2226			.num_parents = 1,
2227			.ops = &clk_branch2_ops,
2228		}
2229	}
2230};
2231
2232static struct clk_branch gcc_sdcc1_ahb_clk = {
2233	.halt_reg = 0x4201c,
2234	.halt_check = BRANCH_HALT,
2235	.clkr = {
2236		.enable_reg = 0x4201c,
2237		.enable_mask = BIT(0),
2238		.hw.init = &(struct clk_init_data) {
2239			.name = "gcc_sdcc1_ahb_clk",
2240			.parent_hws = (const struct clk_hw*[]) {
2241				&pcnoc_bfdcd_clk_src.clkr.hw,
2242			},
2243			.num_parents = 1,
2244			.ops = &clk_branch2_ops,
2245		}
2246	}
2247};
2248
2249static struct clk_branch gcc_sdcc1_apps_clk = {
2250	.halt_reg = 0x42018,
2251	.halt_check = BRANCH_HALT,
2252	.clkr = {
2253		.enable_reg = 0x42018,
2254		.enable_mask = BIT(0),
2255		.hw.init = &(struct clk_init_data) {
2256			.name = "gcc_sdcc1_apps_clk",
2257			.parent_hws = (const struct clk_hw*[]) {
2258				&sdcc1_apps_clk_src.clkr.hw,
2259			},
2260			.num_parents = 1,
2261			.ops = &clk_branch2_ops,
2262			.flags = CLK_SET_RATE_PARENT,
2263		}
2264	}
2265};
2266
2267static struct clk_branch gcc_sdcc2_ahb_clk = {
2268	.halt_reg = 0x4301c,
2269	.halt_check = BRANCH_HALT,
2270	.clkr = {
2271		.enable_reg = 0x4301c,
2272		.enable_mask = BIT(0),
2273		.hw.init = &(struct clk_init_data) {
2274			.name = "gcc_sdcc2_ahb_clk",
2275			.parent_hws = (const struct clk_hw*[]) {
2276				&pcnoc_bfdcd_clk_src.clkr.hw,
2277			},
2278			.num_parents = 1,
2279			.ops = &clk_branch2_ops,
2280		}
2281	}
2282};
2283
2284static struct clk_branch gcc_sdcc2_apps_clk = {
2285	.halt_reg = 0x43018,
2286	.halt_check = BRANCH_HALT,
2287	.clkr = {
2288		.enable_reg = 0x43018,
2289		.enable_mask = BIT(0),
2290		.hw.init = &(struct clk_init_data) {
2291			.name = "gcc_sdcc2_apps_clk",
2292			.parent_hws = (const struct clk_hw*[]) {
2293				&sdcc2_apps_clk_src.clkr.hw,
2294			},
2295			.num_parents = 1,
2296			.ops = &clk_branch2_ops,
2297			.flags = CLK_SET_RATE_PARENT,
2298		}
2299	}
2300};
2301
2302static struct clk_branch gcc_usb2a_phy_sleep_clk = {
2303	.halt_reg = 0x4102c,
2304	.halt_check = BRANCH_HALT,
2305	.clkr = {
2306		.enable_reg = 0x4102c,
2307		.enable_mask = BIT(0),
2308		.hw.init = &(struct clk_init_data) {
2309			.name = "gcc_usb2a_phy_sleep_clk",
2310			.parent_data = gcc_sleep_clk_data,
2311			.num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
2312			.ops = &clk_branch2_ops,
2313		}
2314	}
2315};
2316
2317static struct clk_branch gcc_usb_hs_ahb_clk = {
2318	.halt_reg = 0x41008,
2319	.halt_check = BRANCH_HALT,
2320	.clkr = {
2321		.enable_reg = 0x41008,
2322		.enable_mask = BIT(0),
2323		.hw.init = &(struct clk_init_data) {
2324			.name = "gcc_usb_hs_ahb_clk",
2325			.parent_hws = (const struct clk_hw*[]) {
2326				&pcnoc_bfdcd_clk_src.clkr.hw,
2327			},
2328			.num_parents = 1,
2329			.ops = &clk_branch2_ops,
2330		}
2331	}
2332};
2333
2334static struct clk_branch gcc_usb_hs_phy_cfg_ahb_clk = {
2335	.halt_reg = 0x41030,
2336	.halt_check = BRANCH_HALT,
2337	.clkr = {
2338		.enable_reg = 0x41030,
2339		.enable_mask = BIT(0),
2340		.hw.init = &(struct clk_init_data) {
2341			.name = "gcc_usb_hs_phy_cfg_ahb_clk",
2342			.parent_hws = (const struct clk_hw*[]) {
2343				&pcnoc_bfdcd_clk_src.clkr.hw,
2344			},
2345			.num_parents = 1,
2346			.ops = &clk_branch2_ops,
2347		}
2348	}
2349};
2350
2351static struct clk_branch gcc_usb_hs_system_clk = {
2352	.halt_reg = 0x41004,
2353	.halt_check = BRANCH_HALT,
2354	.clkr = {
2355		.enable_reg = 0x41004,
2356		.enable_mask = BIT(0),
2357		.hw.init = &(struct clk_init_data) {
2358			.name = "gcc_usb_hs_system_clk",
2359			.parent_hws = (const struct clk_hw*[]) {
2360				&usb_hs_system_clk_src.clkr.hw,
2361			},
2362			.num_parents = 1,
2363			.ops = &clk_branch2_ops,
2364			.flags = CLK_SET_RATE_PARENT,
2365		}
2366	}
2367};
2368
2369static struct clk_branch gcc_venus0_ahb_clk = {
2370	.halt_reg = 0x4c020,
2371	.halt_check = BRANCH_HALT,
2372	.clkr = {
2373		.enable_reg = 0x4c020,
2374		.enable_mask = BIT(0),
2375		.hw.init = &(struct clk_init_data) {
2376			.name = "gcc_venus0_ahb_clk",
2377			.parent_hws = (const struct clk_hw*[]) {
2378				&pcnoc_bfdcd_clk_src.clkr.hw,
2379			},
2380			.num_parents = 1,
2381			.ops = &clk_branch2_ops,
2382		}
2383	}
2384};
2385
2386static struct clk_branch gcc_venus0_axi_clk = {
2387	.halt_reg = 0x4c024,
2388	.halt_check = BRANCH_HALT,
2389	.clkr = {
2390		.enable_reg = 0x4c024,
2391		.enable_mask = BIT(0),
2392		.hw.init = &(struct clk_init_data) {
2393			.name = "gcc_venus0_axi_clk",
2394			.parent_hws = (const struct clk_hw*[]) {
2395				&system_noc_bfdcd_clk_src.clkr.hw,
2396			},
2397			.num_parents = 1,
2398			.ops = &clk_branch2_ops,
2399		}
2400	}
2401};
2402
2403static struct clk_branch gcc_venus0_core0_vcodec0_clk = {
2404	.halt_reg = 0x4c02c,
2405	.halt_check = BRANCH_HALT,
2406	.clkr = {
2407		.enable_reg = 0x4c02c,
2408		.enable_mask = BIT(0),
2409		.hw.init = &(struct clk_init_data) {
2410			.name = "gcc_venus0_core0_vcodec0_clk",
2411			.parent_hws = (const struct clk_hw*[]) {
2412				&vcodec0_clk_src.clkr.hw,
2413			},
2414			.num_parents = 1,
2415			.ops = &clk_branch2_ops,
2416			.flags = CLK_SET_RATE_PARENT,
2417		}
2418	}
2419};
2420
2421static struct clk_branch gcc_venus0_vcodec0_clk = {
2422	.halt_reg = 0x4c01c,
2423	.halt_check = BRANCH_HALT,
2424	.clkr = {
2425		.enable_reg = 0x4c01c,
2426		.enable_mask = BIT(0),
2427		.hw.init = &(struct clk_init_data) {
2428			.name = "gcc_venus0_vcodec0_clk",
2429			.parent_hws = (const struct clk_hw*[]) {
2430				&vcodec0_clk_src.clkr.hw,
2431			},
2432			.num_parents = 1,
2433			.ops = &clk_branch2_ops,
2434			.flags = CLK_SET_RATE_PARENT,
2435		}
2436	}
2437};
2438
2439static struct gdsc mdss_gdsc = {
2440	.gdscr = 0x4d078,
2441	.cxcs = (unsigned int []) { 0x4d080, 0x4d088 },
2442	.cxc_count = 2,
2443	.pd = {
2444		.name = "mdss_gdsc",
2445	},
2446	.pwrsts = PWRSTS_OFF_ON,
2447};
2448
2449static struct gdsc oxili_gdsc = {
2450	.gdscr = 0x5901c,
2451	.cxcs = (unsigned int []) { 0x59020 },
2452	.cxc_count = 1,
2453	.pd = {
2454		.name = "oxili_gdsc",
2455	},
2456	.pwrsts = PWRSTS_OFF_ON,
2457};
2458
2459static struct gdsc venus_gdsc = {
2460	.gdscr = 0x4c018,
2461	.cxcs = (unsigned int []) { 0x4c024, 0x4c01c },
2462	.cxc_count = 2,
2463	.pd = {
2464		.name = "venus_gdsc",
2465	},
2466	.pwrsts = PWRSTS_OFF_ON,
2467};
2468
2469static struct gdsc venus_core0_gdsc = {
2470	.gdscr = 0x4c028,
2471	.cxcs = (unsigned int []) { 0x4c02c },
2472	.cxc_count = 1,
2473	.pd = {
2474		.name = "venus_core0_gdsc",
2475	},
2476	.flags = HW_CTRL,
2477	.pwrsts = PWRSTS_OFF_ON,
2478};
2479
2480static struct gdsc vfe_gdsc = {
2481	.gdscr = 0x58034,
2482	.cxcs = (unsigned int []) { 0x58038, 0x58048, 0x58050 },
2483	.cxc_count = 3,
2484	.pd = {
2485		.name = "vfe_gdsc",
2486	},
2487	.pwrsts = PWRSTS_OFF_ON,
2488};
2489
2490static struct clk_regmap *gcc_msm8909_clocks[] = {
2491	[GPLL0_EARLY] = &gpll0_early.clkr,
2492	[GPLL0] = &gpll0.clkr,
2493	[GPLL1] = &gpll1.clkr,
2494	[GPLL1_VOTE] = &gpll1_vote,
2495	[GPLL2_EARLY] = &gpll2_early.clkr,
2496	[GPLL2] = &gpll2.clkr,
2497	[BIMC_PLL_EARLY] = &bimc_pll_early.clkr,
2498	[BIMC_PLL] = &bimc_pll.clkr,
2499	[APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
2500	[BIMC_DDR_CLK_SRC] = &bimc_ddr_clk_src.clkr,
2501	[BIMC_GPU_CLK_SRC] = &bimc_gpu_clk_src.clkr,
2502	[BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
2503	[BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
2504	[BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
2505	[BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
2506	[BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
2507	[BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
2508	[BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
2509	[BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
2510	[BLSP1_QUP5_I2C_APPS_CLK_SRC] = &blsp1_qup5_i2c_apps_clk_src.clkr,
2511	[BLSP1_QUP5_SPI_APPS_CLK_SRC] = &blsp1_qup5_spi_apps_clk_src.clkr,
2512	[BLSP1_QUP6_I2C_APPS_CLK_SRC] = &blsp1_qup6_i2c_apps_clk_src.clkr,
2513	[BLSP1_QUP6_SPI_APPS_CLK_SRC] = &blsp1_qup6_spi_apps_clk_src.clkr,
2514	[BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
2515	[BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
2516	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2517	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2518	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2519	[CAMSS_TOP_AHB_CLK_SRC] = &camss_top_ahb_clk_src.clkr,
2520	[CRYPTO_CLK_SRC] = &crypto_clk_src.clkr,
2521	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2522	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2523	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2524	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2525	[GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
2526	[GP1_CLK_SRC] = &gp1_clk_src.clkr,
2527	[GP2_CLK_SRC] = &gp2_clk_src.clkr,
2528	[GP3_CLK_SRC] = &gp3_clk_src.clkr,
2529	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2530	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2531	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
2532	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2533	[PCNOC_BFDCD_CLK_SRC] = &pcnoc_bfdcd_clk_src.clkr,
2534	[PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
2535	[SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
2536	[SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
2537	[SYSTEM_NOC_BFDCD_CLK_SRC] = &system_noc_bfdcd_clk_src.clkr,
2538	[USB_HS_SYSTEM_CLK_SRC] = &usb_hs_system_clk_src.clkr,
2539	[VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr,
2540	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2541	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2542	[GCC_APSS_TCU_CLK] = &gcc_apss_tcu_clk.clkr,
2543	[GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
2544	[GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr,
2545	[GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
2546	[GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
2547	[GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
2548	[GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
2549	[GCC_GFX_TBU_CLK] = &gcc_gfx_tbu_clk.clkr,
2550	[GCC_GFX_TCU_CLK] = &gcc_gfx_tcu_clk.clkr,
2551	[GCC_GTCU_AHB_CLK] = &gcc_gtcu_ahb_clk.clkr,
2552	[GCC_MDP_TBU_CLK] = &gcc_mdp_tbu_clk.clkr,
2553	[GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
2554	[GCC_SMMU_CFG_CLK] = &gcc_smmu_cfg_clk.clkr,
2555	[GCC_VENUS_TBU_CLK] = &gcc_venus_tbu_clk.clkr,
2556	[GCC_VFE_TBU_CLK] = &gcc_vfe_tbu_clk.clkr,
2557	[GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
2558	[GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_clk.clkr,
2559	[GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
2560	[GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
2561	[GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
2562	[GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
2563	[GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
2564	[GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
2565	[GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
2566	[GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
2567	[GCC_BLSP1_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr,
2568	[GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr,
2569	[GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr,
2570	[GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_spi_apps_clk.clkr,
2571	[GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
2572	[GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
2573	[GCC_CAMSS_AHB_CLK] = &gcc_camss_ahb_clk.clkr,
2574	[GCC_CAMSS_CSI0_CLK] = &gcc_camss_csi0_clk.clkr,
2575	[GCC_CAMSS_CSI0_AHB_CLK] = &gcc_camss_csi0_ahb_clk.clkr,
2576	[GCC_CAMSS_CSI0PHY_CLK] = &gcc_camss_csi0phy_clk.clkr,
2577	[GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
2578	[GCC_CAMSS_CSI0PIX_CLK] = &gcc_camss_csi0pix_clk.clkr,
2579	[GCC_CAMSS_CSI0RDI_CLK] = &gcc_camss_csi0rdi_clk.clkr,
2580	[GCC_CAMSS_CSI1_CLK] = &gcc_camss_csi1_clk.clkr,
2581	[GCC_CAMSS_CSI1_AHB_CLK] = &gcc_camss_csi1_ahb_clk.clkr,
2582	[GCC_CAMSS_CSI1PHY_CLK] = &gcc_camss_csi1phy_clk.clkr,
2583	[GCC_CAMSS_CSI1PIX_CLK] = &gcc_camss_csi1pix_clk.clkr,
2584	[GCC_CAMSS_CSI1RDI_CLK] = &gcc_camss_csi1rdi_clk.clkr,
2585	[GCC_CAMSS_CSI_VFE0_CLK] = &gcc_camss_csi_vfe0_clk.clkr,
2586	[GCC_CAMSS_GP0_CLK] = &gcc_camss_gp0_clk.clkr,
2587	[GCC_CAMSS_GP1_CLK] = &gcc_camss_gp1_clk.clkr,
2588	[GCC_CAMSS_ISPIF_AHB_CLK] = &gcc_camss_ispif_ahb_clk.clkr,
2589	[GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
2590	[GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
2591	[GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
2592	[GCC_CAMSS_VFE0_CLK] = &gcc_camss_vfe0_clk.clkr,
2593	[GCC_CAMSS_VFE_AHB_CLK] = &gcc_camss_vfe_ahb_clk.clkr,
2594	[GCC_CAMSS_VFE_AXI_CLK] = &gcc_camss_vfe_axi_clk.clkr,
2595	[GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
2596	[GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
2597	[GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
2598	[GCC_MDSS_AHB_CLK] = &gcc_mdss_ahb_clk.clkr,
2599	[GCC_MDSS_AXI_CLK] = &gcc_mdss_axi_clk.clkr,
2600	[GCC_MDSS_BYTE0_CLK] = &gcc_mdss_byte0_clk.clkr,
2601	[GCC_MDSS_ESC0_CLK] = &gcc_mdss_esc0_clk.clkr,
2602	[GCC_MDSS_MDP_CLK] = &gcc_mdss_mdp_clk.clkr,
2603	[GCC_MDSS_PCLK0_CLK] = &gcc_mdss_pclk0_clk.clkr,
2604	[GCC_MDSS_VSYNC_CLK] = &gcc_mdss_vsync_clk.clkr,
2605	[GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
2606	[GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
2607	[GCC_OXILI_AHB_CLK] = &gcc_oxili_ahb_clk.clkr,
2608	[GCC_OXILI_GFX3D_CLK] = &gcc_oxili_gfx3d_clk.clkr,
2609	[GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
2610	[GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
2611	[GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
2612	[GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
2613	[GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
2614	[GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
2615	[GCC_USB2A_PHY_SLEEP_CLK] = &gcc_usb2a_phy_sleep_clk.clkr,
2616	[GCC_USB_HS_AHB_CLK] = &gcc_usb_hs_ahb_clk.clkr,
2617	[GCC_USB_HS_PHY_CFG_AHB_CLK] = &gcc_usb_hs_phy_cfg_ahb_clk.clkr,
2618	[GCC_USB_HS_SYSTEM_CLK] = &gcc_usb_hs_system_clk.clkr,
2619	[GCC_VENUS0_AHB_CLK] = &gcc_venus0_ahb_clk.clkr,
2620	[GCC_VENUS0_AXI_CLK] = &gcc_venus0_axi_clk.clkr,
2621	[GCC_VENUS0_CORE0_VCODEC0_CLK] = &gcc_venus0_core0_vcodec0_clk.clkr,
2622	[GCC_VENUS0_VCODEC0_CLK] = &gcc_venus0_vcodec0_clk.clkr,
2623};
2624
2625static struct gdsc *gcc_msm8909_gdscs[] = {
2626	[MDSS_GDSC] = &mdss_gdsc,
2627	[OXILI_GDSC] = &oxili_gdsc,
2628	[VENUS_GDSC] = &venus_gdsc,
2629	[VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2630	[VFE_GDSC] = &vfe_gdsc,
2631};
2632
2633static const struct qcom_reset_map gcc_msm8909_resets[] = {
2634	[GCC_AUDIO_CORE_BCR] = { 0x1c008 },
2635	[GCC_BLSP1_BCR] = { 0x01000 },
2636	[GCC_BLSP1_QUP1_BCR] = { 0x02000 },
2637	[GCC_BLSP1_QUP2_BCR] = { 0x03008 },
2638	[GCC_BLSP1_QUP3_BCR] = { 0x04018 },
2639	[GCC_BLSP1_QUP4_BCR] = { 0x05018 },
2640	[GCC_BLSP1_QUP5_BCR] = { 0x06018 },
2641	[GCC_BLSP1_QUP6_BCR] = { 0x07018 },
2642	[GCC_BLSP1_UART1_BCR] = { 0x02038 },
2643	[GCC_BLSP1_UART2_BCR] = { 0x03028 },
2644	[GCC_CAMSS_CSI0_BCR] = { 0x4e038 },
2645	[GCC_CAMSS_CSI0PHY_BCR] = { 0x4e044 },
2646	[GCC_CAMSS_CSI0PIX_BCR] = { 0x4e054 },
2647	[GCC_CAMSS_CSI0RDI_BCR] = { 0x4e04c },
2648	[GCC_CAMSS_CSI1_BCR] = { 0x4f038 },
2649	[GCC_CAMSS_CSI1PHY_BCR] = { 0x4f044 },
2650	[GCC_CAMSS_CSI1PIX_BCR] = { 0x4f054 },
2651	[GCC_CAMSS_CSI1RDI_BCR] = { 0x4f04c },
2652	[GCC_CAMSS_CSI_VFE0_BCR] = { 0x5804c },
2653	[GCC_CAMSS_GP0_BCR] = { 0x54014 },
2654	[GCC_CAMSS_GP1_BCR] = { 0x55014 },
2655	[GCC_CAMSS_ISPIF_BCR] = { 0x50000 },
2656	[GCC_CAMSS_MCLK0_BCR] = { 0x52014 },
2657	[GCC_CAMSS_MCLK1_BCR] = { 0x53014 },
2658	[GCC_CAMSS_PHY0_BCR] = { 0x4e018 },
2659	[GCC_CAMSS_TOP_BCR] = { 0x56000 },
2660	[GCC_CAMSS_TOP_AHB_BCR] = { 0x5a018 },
2661	[GCC_CAMSS_VFE_BCR] = { 0x58030 },
2662	[GCC_CRYPTO_BCR] = { 0x16000 },
2663	[GCC_MDSS_BCR] = { 0x4d074 },
2664	[GCC_OXILI_BCR] = { 0x59018 },
2665	[GCC_PDM_BCR] = { 0x44000 },
2666	[GCC_PRNG_BCR] = { 0x13000 },
2667	[GCC_QUSB2_PHY_BCR] = { 0x4103c },
2668	[GCC_SDCC1_BCR] = { 0x42000 },
2669	[GCC_SDCC2_BCR] = { 0x43000 },
2670	[GCC_ULT_AUDIO_BCR] = { 0x1c0b4 },
2671	[GCC_USB2A_PHY_BCR] = { 0x41028 },
2672	[GCC_USB2_HS_PHY_ONLY_BCR] = { .reg = 0x41034, .udelay = 15 },
2673	[GCC_USB_HS_BCR] = { 0x41000 },
2674	[GCC_VENUS0_BCR] = { 0x4c014 },
2675	/* Subsystem Restart */
2676	[GCC_MSS_RESTART] = { 0x3e000 },
2677};
2678
2679static const struct regmap_config gcc_msm8909_regmap_config = {
2680	.reg_bits	= 32,
2681	.reg_stride	= 4,
2682	.val_bits	= 32,
2683	.max_register	= 0x80000,
2684	.fast_io	= true,
2685};
2686
2687static const struct qcom_cc_desc gcc_msm8909_desc = {
2688	.config = &gcc_msm8909_regmap_config,
2689	.clks = gcc_msm8909_clocks,
2690	.num_clks = ARRAY_SIZE(gcc_msm8909_clocks),
2691	.resets = gcc_msm8909_resets,
2692	.num_resets = ARRAY_SIZE(gcc_msm8909_resets),
2693	.gdscs = gcc_msm8909_gdscs,
2694	.num_gdscs = ARRAY_SIZE(gcc_msm8909_gdscs),
2695};
2696
2697static const struct of_device_id gcc_msm8909_match_table[] = {
2698	{ .compatible = "qcom,gcc-msm8909" },
2699	{ }
2700};
2701MODULE_DEVICE_TABLE(of, gcc_msm8909_match_table);
2702
2703static int gcc_msm8909_probe(struct platform_device *pdev)
2704{
2705	return qcom_cc_probe(pdev, &gcc_msm8909_desc);
2706}
2707
2708static struct platform_driver gcc_msm8909_driver = {
2709	.probe		= gcc_msm8909_probe,
2710	.driver		= {
2711		.name	= "gcc-msm8909",
2712		.of_match_table = gcc_msm8909_match_table,
2713	},
2714};
2715
2716static int __init gcc_msm8909_init(void)
2717{
2718	return platform_driver_register(&gcc_msm8909_driver);
2719}
2720core_initcall(gcc_msm8909_init);
2721
2722static void __exit gcc_msm8909_exit(void)
2723{
2724	platform_driver_unregister(&gcc_msm8909_driver);
2725}
2726module_exit(gcc_msm8909_exit);
2727
2728MODULE_DESCRIPTION("Qualcomm GCC MSM8909 Driver");
2729MODULE_LICENSE("GPL");
2730MODULE_ALIAS("platform:gcc-msm8909");
2731