1cd32ac64SAdrian Chadd /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3cd32ac64SAdrian Chadd  *
4cd32ac64SAdrian Chadd  * Copyright (c) 2021, Adrian Chadd <adrian@FreeBSD.org>
5cd32ac64SAdrian Chadd  *
6cd32ac64SAdrian Chadd  * Redistribution and use in source and binary forms, with or without
7cd32ac64SAdrian Chadd  * modification, are permitted provided that the following conditions
8cd32ac64SAdrian Chadd  * are met:
9cd32ac64SAdrian Chadd  * 1. Redistributions of source code must retain the above copyright
10cd32ac64SAdrian Chadd  *    notice unmodified, this list of conditions, and the following
11cd32ac64SAdrian Chadd  *    disclaimer.
12cd32ac64SAdrian Chadd  * 2. Redistributions in binary form must reproduce the above copyright
13cd32ac64SAdrian Chadd  *    notice, this list of conditions and the following disclaimer in the
14cd32ac64SAdrian Chadd  *    documentation and/or other materials provided with the distribution.
15cd32ac64SAdrian Chadd  *
16cd32ac64SAdrian Chadd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17cd32ac64SAdrian Chadd  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18cd32ac64SAdrian Chadd  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19cd32ac64SAdrian Chadd  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20cd32ac64SAdrian Chadd  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21cd32ac64SAdrian Chadd  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22cd32ac64SAdrian Chadd  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23cd32ac64SAdrian Chadd  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24cd32ac64SAdrian Chadd  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25cd32ac64SAdrian Chadd  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26cd32ac64SAdrian Chadd  */
27cd32ac64SAdrian Chadd 
28cd32ac64SAdrian Chadd /* Driver for Qualcomm IPQ4018 clock and reset device */
29cd32ac64SAdrian Chadd 
30cd32ac64SAdrian Chadd #include <sys/param.h>
31cd32ac64SAdrian Chadd #include <sys/kernel.h>
32cd32ac64SAdrian Chadd #include <sys/malloc.h>
33cd32ac64SAdrian Chadd #include <sys/module.h>
34cd32ac64SAdrian Chadd #include <sys/sglist.h>
35cd32ac64SAdrian Chadd #include <sys/random.h>
36cd32ac64SAdrian Chadd #include <sys/stdatomic.h>
37cd32ac64SAdrian Chadd #include <sys/mutex.h>
38cd32ac64SAdrian Chadd 
39cd32ac64SAdrian Chadd #include <machine/bus.h>
40cd32ac64SAdrian Chadd #include <machine/resource.h>
41cd32ac64SAdrian Chadd #include <sys/bus.h>
42cd32ac64SAdrian Chadd 
43cd32ac64SAdrian Chadd #include <dev/fdt/fdt_common.h>
44cd32ac64SAdrian Chadd #include <dev/ofw/ofw_bus.h>
45cd32ac64SAdrian Chadd #include <dev/ofw/ofw_bus_subr.h>
46cd32ac64SAdrian Chadd 
47be82b3a0SEmmanuel Vadot #include <dev/clk/clk_div.h>
48be82b3a0SEmmanuel Vadot #include <dev/clk/clk_fixed.h>
49be82b3a0SEmmanuel Vadot #include <dev/clk/clk_mux.h>
50be82b3a0SEmmanuel Vadot #include <dev/clk/clk_link.h>
51cd32ac64SAdrian Chadd 
52cd32ac64SAdrian Chadd #include <dt-bindings/clock/qcom,gcc-ipq4019.h>
53cd32ac64SAdrian Chadd 
54cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_freqtbl.h>
55cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_fepll.h>
56cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_fdiv.h>
57cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_apssdiv.h>
58cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_rcg2.h>
59cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_branch2.h>
60cd32ac64SAdrian Chadd #include <dev/qcom_clk/qcom_clk_ro_div.h>
61cd32ac64SAdrian Chadd 
62cd32ac64SAdrian Chadd #include "qcom_gcc_ipq4018_var.h"
63cd32ac64SAdrian Chadd 
64cd32ac64SAdrian Chadd 
65cd32ac64SAdrian Chadd /* Fixed rate clock. */
66cd32ac64SAdrian Chadd #define F_RATE(_id, cname, _freq)					\
67cd32ac64SAdrian Chadd {									\
68cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
69cd32ac64SAdrian Chadd 	.clkdef.name = cname,						\
70cd32ac64SAdrian Chadd 	.clkdef.parent_names = NULL,					\
71cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 0,						\
72cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
73cd32ac64SAdrian Chadd 	.freq = _freq,							\
74cd32ac64SAdrian Chadd }
75cd32ac64SAdrian Chadd 
76cd32ac64SAdrian Chadd /* Linked clock. */
77cd32ac64SAdrian Chadd #define F_LINK(_id, _cname)						\
78cd32ac64SAdrian Chadd {									\
79cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
80cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
81cd32ac64SAdrian Chadd 	.clkdef.parent_names = NULL,					\
82cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 0,						\
83cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
84cd32ac64SAdrian Chadd }
85cd32ac64SAdrian Chadd 
86cd32ac64SAdrian Chadd 
87cd32ac64SAdrian Chadd /* FEPLL clock */
88cd32ac64SAdrian Chadd #define F_FEPLL(_id, _cname, _parent, _reg, _fs, _fw, _rs, _rw)		\
89cd32ac64SAdrian Chadd {									\
90cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
91cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
92cd32ac64SAdrian Chadd 	.clkdef.parent_names = (const char *[]){_parent},		\
93cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 1,						\
94cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
95cd32ac64SAdrian Chadd 	.offset = _reg,							\
96cd32ac64SAdrian Chadd 	.fdbkdiv_shift = _fs,						\
97cd32ac64SAdrian Chadd 	.fdbkdiv_width = _fw,						\
98cd32ac64SAdrian Chadd 	.refclkdiv_shift = _rs,						\
99cd32ac64SAdrian Chadd 	.refclkdiv_width = _rw,						\
100cd32ac64SAdrian Chadd }
101cd32ac64SAdrian Chadd 
102cd32ac64SAdrian Chadd /* Fixed divisor clock */
103cd32ac64SAdrian Chadd #define F_FDIV(_id, _cname, _parent, _divisor)				\
104cd32ac64SAdrian Chadd {									\
105cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
106cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
107cd32ac64SAdrian Chadd 	.clkdef.parent_names = (const char *[]){_parent},		\
108cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 1,						\
109cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
110cd32ac64SAdrian Chadd 	.divisor = _divisor,						\
111cd32ac64SAdrian Chadd }
112cd32ac64SAdrian Chadd 
113cd32ac64SAdrian Chadd /* APSS DIV clock */
114cd32ac64SAdrian Chadd #define F_APSSDIV(_id, _cname, _parent, _doffset, _dshift, _dwidth,	\
115cd32ac64SAdrian Chadd     _eoffset, _eshift, _freqtbl)					\
116cd32ac64SAdrian Chadd {									\
117cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
118cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
119cd32ac64SAdrian Chadd 	.clkdef.parent_names = (const char *[]){_parent},		\
120cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 1,						\
121cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
122cd32ac64SAdrian Chadd 	.div_offset = _doffset,						\
123cd32ac64SAdrian Chadd 	.div_width = _dwidth,						\
124cd32ac64SAdrian Chadd 	.div_shift = _dshift,						\
125cd32ac64SAdrian Chadd 	.enable_offset = _eoffset,					\
126cd32ac64SAdrian Chadd 	.enable_shift = _eshift,					\
127cd32ac64SAdrian Chadd 	.freq_tbl = _freqtbl,						\
128cd32ac64SAdrian Chadd }
129cd32ac64SAdrian Chadd 
130cd32ac64SAdrian Chadd /* read-only div table */
131cd32ac64SAdrian Chadd #define	F_RO_DIV(_id, _cname, _parent, _offset, _shift, _width, _tbl)	\
132cd32ac64SAdrian Chadd {									\
133cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
134cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
135cd32ac64SAdrian Chadd 	.clkdef.parent_names = (const char *[]){_parent},		\
136cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 1,						\
137cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
138cd32ac64SAdrian Chadd 	.offset = _offset,						\
139cd32ac64SAdrian Chadd 	.width = _width,						\
140cd32ac64SAdrian Chadd 	.shift = _shift,						\
141cd32ac64SAdrian Chadd 	.div_tbl = _tbl,						\
142cd32ac64SAdrian Chadd }
143cd32ac64SAdrian Chadd 
144cd32ac64SAdrian Chadd /* RCG2 clock */
145cd32ac64SAdrian Chadd #define F_RCG2(_id, _cname, _parents, _rcgr, _hid_width, _mnd_width,	\
146cd32ac64SAdrian Chadd     _safe_src_idx, _safe_pre_parent_idx, _cfg_offset, _flags,		\
147cd32ac64SAdrian Chadd     _freq_tbl)								\
148cd32ac64SAdrian Chadd {									\
149cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
150cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
151cd32ac64SAdrian Chadd 	.clkdef.parent_names = _parents,				\
152cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = nitems(_parents),				\
153cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
154cd32ac64SAdrian Chadd 	.cmd_rcgr = _rcgr,						\
155cd32ac64SAdrian Chadd 	.hid_width = _hid_width,					\
156cd32ac64SAdrian Chadd 	.mnd_width = _mnd_width,					\
157cd32ac64SAdrian Chadd 	.safe_src_idx = _safe_src_idx,					\
158cd32ac64SAdrian Chadd 	.flags= _flags,							\
159cd32ac64SAdrian Chadd 	.safe_pre_parent_idx = _safe_pre_parent_idx,			\
160cd32ac64SAdrian Chadd 	.freq_tbl = _freq_tbl,						\
161cd32ac64SAdrian Chadd }
162cd32ac64SAdrian Chadd 
163cd32ac64SAdrian Chadd /* branch2 gate nodes */
164cd32ac64SAdrian Chadd #define	F_BRANCH2(_id, _cname, _parent, _eo, _es, _hr, _hs, _haltreg,	\
165cd32ac64SAdrian Chadd     _type, _voted, _flags)						\
166cd32ac64SAdrian Chadd {									\
167cd32ac64SAdrian Chadd 	.clkdef.id = _id,						\
168cd32ac64SAdrian Chadd 	.clkdef.name = _cname,						\
169cd32ac64SAdrian Chadd 	.clkdef.parent_names = (const char *[]){_parent},		\
170cd32ac64SAdrian Chadd 	.clkdef.parent_cnt = 1,						\
171cd32ac64SAdrian Chadd 	.clkdef.flags = CLK_NODE_STATIC_STRINGS,			\
172cd32ac64SAdrian Chadd 	.enable_offset = _eo,						\
173cd32ac64SAdrian Chadd 	.enable_shift = _es,						\
174cd32ac64SAdrian Chadd 	.hwcg_reg = _hr,						\
175cd32ac64SAdrian Chadd 	.hwcg_bit = _hs,						\
176cd32ac64SAdrian Chadd 	.halt_reg = _haltreg,						\
177cd32ac64SAdrian Chadd 	.halt_check_type = _type,					\
178cd32ac64SAdrian Chadd 	.halt_check_voted = _voted,					\
179cd32ac64SAdrian Chadd 	.flags = _flags,						\
180cd32ac64SAdrian Chadd }
181cd32ac64SAdrian Chadd 
182cd32ac64SAdrian Chadd /*
183cd32ac64SAdrian Chadd  * Fixed "gcc_fepll_vco" PLL derived sources:
184cd32ac64SAdrian Chadd  *
185cd32ac64SAdrian Chadd  * P_FEPLL125 - 125MHz
186cd32ac64SAdrian Chadd  * P_FEPLL125DLY - 125MHz
187cd32ac64SAdrian Chadd  * P_FEPLL200 - 200MHz
188cd32ac64SAdrian Chadd  * "fepll500" - 500MHz
189cd32ac64SAdrian Chadd  *
190cd32ac64SAdrian Chadd  * Fixed "gcc_apps_ddrpll_vco" PLL derived sources:
191cd32ac64SAdrian Chadd  *
192cd32ac64SAdrian Chadd  * P_DDRPLL - 192MHz
193cd32ac64SAdrian Chadd  */
194cd32ac64SAdrian Chadd static struct qcom_clk_fdiv_def fdiv_tbl[] = {
195cd32ac64SAdrian Chadd 	F_FDIV(GCC_FEPLL125_CLK, "fepll125", "gcc_fepll_vco", 32),
196cd32ac64SAdrian Chadd 	F_FDIV(GCC_FEPLL125DLY_CLK, "fepll125dly", "gcc_fepll_vco", 32),
197cd32ac64SAdrian Chadd 	F_FDIV(GCC_FEPLL200_CLK, "fepll200", "gcc_fepll_vco", 20),
198cd32ac64SAdrian Chadd 	F_FDIV(GCC_FEPLL500_CLK, "fepll500", "gcc_fepll_vco", 8),
199cd32ac64SAdrian Chadd 	F_FDIV(GCC_SDCC_PLLDIV_CLK, "ddrpllsdcc", "gcc_apps_ddrpll_vco", 28),
200cd32ac64SAdrian Chadd };
201cd32ac64SAdrian Chadd 
202cd32ac64SAdrian Chadd /*
203cd32ac64SAdrian Chadd  * FEPLL - 48MHz (xo) input, 4GHz output
204cd32ac64SAdrian Chadd  * DDRPLL - 48MHz (xo) input, 5.376GHz output
205cd32ac64SAdrian Chadd  */
206cd32ac64SAdrian Chadd static struct qcom_clk_fepll_def fepll_tbl[] = {
207cd32ac64SAdrian Chadd 	F_FEPLL(GCC_FEPLL_VCO, "gcc_fepll_vco", "xo", 0x2f020, 16, 8, 24, 5),
208cd32ac64SAdrian Chadd 	F_FEPLL(GCC_APSS_DDRPLL_VCO, "gcc_apps_ddrpll_vco", "xo", 0x2e020,
209cd32ac64SAdrian Chadd 	    16, 8, 24, 5),
210cd32ac64SAdrian Chadd };
211cd32ac64SAdrian Chadd 
212cd32ac64SAdrian Chadd /*
213cd32ac64SAdrian Chadd  * Frequency table for the APSS PLL/DIV path for the CPU frequency.
214cd32ac64SAdrian Chadd  *
215cd32ac64SAdrian Chadd  * Note - the APSS DIV code only needs the frequency and pre-divisor,
216cd32ac64SAdrian Chadd  * not the other fields.
217cd32ac64SAdrian Chadd  */
218cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl apss_freq_tbl[] = {
219cd32ac64SAdrian Chadd 	{ 384000000, "gcc_apps_ddrpll_vco", 0xd, 0, 0 },
220cd32ac64SAdrian Chadd 	{ 413000000, "gcc_apps_ddrpll_vco", 0xc, 0, 0 },
221cd32ac64SAdrian Chadd 	{ 448000000, "gcc_apps_ddrpll_vco", 0xb, 0, 0 },
222cd32ac64SAdrian Chadd 	{ 488000000, "gcc_apps_ddrpll_vco", 0xa, 0, 0 },
223cd32ac64SAdrian Chadd 	{ 512000000, "gcc_apps_ddrpll_vco", 0x9, 0, 0 },
224cd32ac64SAdrian Chadd 	{ 537000000, "gcc_apps_ddrpll_vco", 0x8, 0, 0 },
225cd32ac64SAdrian Chadd 	{ 565000000, "gcc_apps_ddrpll_vco", 0x7, 0, 0 },
226cd32ac64SAdrian Chadd 	{ 597000000, "gcc_apps_ddrpll_vco", 0x6, 0, 0 },
227cd32ac64SAdrian Chadd 	{ 632000000, "gcc_apps_ddrpll_vco", 0x5, 0, 0 },
228cd32ac64SAdrian Chadd 	{ 672000000, "gcc_apps_ddrpll_vco", 0x4, 0, 0 },
229cd32ac64SAdrian Chadd 	{ 716000000, "gcc_apps_ddrpll_vco", 0x3, 0, 0 },
230cd32ac64SAdrian Chadd 	{ 768000000, "gcc_apps_ddrpll_vco", 0x2, 0, 0 },
231cd32ac64SAdrian Chadd 	{ 823000000, "gcc_apps_ddrpll_vco", 0x1, 0, 0 },
232cd32ac64SAdrian Chadd 	{ 896000000, "gcc_apps_ddrpll_vco", 0x0, 0, 0 },
233cd32ac64SAdrian Chadd 	{ 0, }
234cd32ac64SAdrian Chadd };
235cd32ac64SAdrian Chadd 
236cd32ac64SAdrian Chadd /*
237cd32ac64SAdrian Chadd  * APSS div/gate
238cd32ac64SAdrian Chadd  */
239cd32ac64SAdrian Chadd static struct qcom_clk_apssdiv_def apssdiv_tbl[] = {
240cd32ac64SAdrian Chadd 	F_APSSDIV(GCC_APSS_CPU_PLLDIV_CLK, "ddrpllapss",
241cd32ac64SAdrian Chadd 	    "gcc_apps_ddrpll_vco", 0x2e020,
242cd32ac64SAdrian Chadd 	    4, 4, 0x2e000, 0, &apss_freq_tbl[0]),
243cd32ac64SAdrian Chadd };
244cd32ac64SAdrian Chadd 
245cd32ac64SAdrian Chadd /*
246cd32ac64SAdrian Chadd  * Parent clocks for the apps_clk_src clock.
247cd32ac64SAdrian Chadd  */
248cd32ac64SAdrian Chadd static const char * apps_clk_src_parents[] = {
249cd32ac64SAdrian Chadd 	"xo", "ddrpllapss", "fepll500", "fepll200"
250cd32ac64SAdrian Chadd };
251cd32ac64SAdrian Chadd 
252cd32ac64SAdrian Chadd /*
253cd32ac64SAdrian Chadd  * Parents lists for a variety of blocks.
254cd32ac64SAdrian Chadd  */
255cd32ac64SAdrian Chadd static const char * gcc_xo_200_parents[] = {
256cd32ac64SAdrian Chadd 	"xo", "fepll200"
257cd32ac64SAdrian Chadd };
258cd32ac64SAdrian Chadd static const char * gcc_xo_200_500_parents[] = {
259cd32ac64SAdrian Chadd 	"xo", "fepll200", "fepll500"
260cd32ac64SAdrian Chadd };
261cd32ac64SAdrian Chadd static const char * gcc_xo_200_spi_parents[] = {
262cd32ac64SAdrian Chadd 	"xo", NULL, "fepll200"
263cd32ac64SAdrian Chadd };
264cd32ac64SAdrian Chadd static const char * gcc_xo_sdcc1_500_parents[] = {
265cd32ac64SAdrian Chadd 	"xo", "ddrpllsdcc", "fepll500"
266cd32ac64SAdrian Chadd };
267cd32ac64SAdrian Chadd 
268cd32ac64SAdrian Chadd static const char * gcc_xo_125_dly_parents[] = {
269cd32ac64SAdrian Chadd 	"xo", "fepll125dly"
270cd32ac64SAdrian Chadd };
271cd32ac64SAdrian Chadd 
272cd32ac64SAdrian Chadd static const char * gcc_xo_wcss2g_parents[] = {
273cd32ac64SAdrian Chadd 	"xo", "fepllwcss2g"
274cd32ac64SAdrian Chadd };
275cd32ac64SAdrian Chadd 
276cd32ac64SAdrian Chadd static const char * gcc_xo_wcss5g_parents[] = {
277cd32ac64SAdrian Chadd 	"xo", "fepllwcss5g"
278cd32ac64SAdrian Chadd };
279cd32ac64SAdrian Chadd 
280cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl apps_clk_src_freq_tbl[] = {
281cd32ac64SAdrian Chadd 	{ 48000000, "xo", 1, 0, 0 },
282cd32ac64SAdrian Chadd 	{ 200000000, "fepll200", 1, 0, 0 },
283cd32ac64SAdrian Chadd 	{ 384000000, "ddrpllapss", 1, 0, 0 },
284cd32ac64SAdrian Chadd 	{ 413000000, "ddrpllapss", 1, 0, 0 },
285cd32ac64SAdrian Chadd 	{ 448000000, "ddrpllapss", 1, 0, 0 },
286cd32ac64SAdrian Chadd 	{ 488000000, "ddrpllapss", 1, 0, 0 },
287cd32ac64SAdrian Chadd 	{ 500000000, "fepll500", 1, 0, 0 },
288cd32ac64SAdrian Chadd 	{ 512000000, "ddrpllapss", 1, 0, 0 },
289cd32ac64SAdrian Chadd 	{ 537000000, "ddrpllapss", 1, 0, 0 },
290cd32ac64SAdrian Chadd 	{ 565000000, "ddrpllapss", 1, 0, 0 },
291cd32ac64SAdrian Chadd 	{ 597000000, "ddrpllapss", 1, 0, 0 },
292cd32ac64SAdrian Chadd 	{ 632000000, "ddrpllapss", 1, 0, 0 },
293cd32ac64SAdrian Chadd 	{ 672000000, "ddrpllapss", 1, 0, 0 },
294cd32ac64SAdrian Chadd 	{ 716000000, "ddrpllapss", 1, 0, 0 },
295cd32ac64SAdrian Chadd 	{ 0,}
296cd32ac64SAdrian Chadd 
297cd32ac64SAdrian Chadd };
298cd32ac64SAdrian Chadd 
299cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl audio_clk_src_freq_tbl[] = {
300cd32ac64SAdrian Chadd 	{ 48000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
301cd32ac64SAdrian Chadd 	{ 200000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
302cd32ac64SAdrian Chadd 	{ 0,}
303cd32ac64SAdrian Chadd };
304cd32ac64SAdrian Chadd 
305cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl blsp1_qup1_i2c_apps_clk_src_freq_tbl[] = {
306cd32ac64SAdrian Chadd 	{ 19050000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(10.5), 1, 1 },
307cd32ac64SAdrian Chadd 	{ 0,}
308cd32ac64SAdrian Chadd };
309cd32ac64SAdrian Chadd 
310cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl blsp1_qup1_spi_apps_clk_src_freq_tbl[] = {
311cd32ac64SAdrian Chadd 	{ 960000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(12), 1, 4 },
312cd32ac64SAdrian Chadd 	{ 4800000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 10 },
313cd32ac64SAdrian Chadd 	{ 9600000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 5 },
314cd32ac64SAdrian Chadd 	{ 15000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 3 },
315cd32ac64SAdrian Chadd 	{ 19200000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 2, 5 },
316cd32ac64SAdrian Chadd 	{ 24000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 2 },
317cd32ac64SAdrian Chadd 	{ 48000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
318cd32ac64SAdrian Chadd 	{ 0,}
319cd32ac64SAdrian Chadd };
320cd32ac64SAdrian Chadd 
321cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl gcc_pcnoc_ahb_clk_src_freq_tbl[] = {
322cd32ac64SAdrian Chadd 	{ 48000000,  "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
323cd32ac64SAdrian Chadd 	{ 100000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(2), 0, 0 },
324cd32ac64SAdrian Chadd 	{ 0, }
325cd32ac64SAdrian Chadd };
326cd32ac64SAdrian Chadd 
327cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl blsp1_uart1_apps_clk_src_freq_tbl[] = {
328cd32ac64SAdrian Chadd 	{ 1843200, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 144, 15625 },
329cd32ac64SAdrian Chadd 	{ 3686400, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 288, 15625 },
330cd32ac64SAdrian Chadd 	{ 7372800, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 576, 15625 },
331cd32ac64SAdrian Chadd 	{ 14745600, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1152, 15625 },
332cd32ac64SAdrian Chadd 	{ 16000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 2, 25 },
333cd32ac64SAdrian Chadd 	{ 24000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 2 },
334cd32ac64SAdrian Chadd 	{ 32000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 4, 25 },
335cd32ac64SAdrian Chadd 	{ 40000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 5 },
336cd32ac64SAdrian Chadd 	{ 46400000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 29, 125 },
337cd32ac64SAdrian Chadd 	{ 48000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
338cd32ac64SAdrian Chadd 	{ 0, }
339cd32ac64SAdrian Chadd };
340cd32ac64SAdrian Chadd 
341cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl gp1_clk_src_freq_tbl[] = {
342cd32ac64SAdrian Chadd 	{ 1250000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 16, 0 },
343cd32ac64SAdrian Chadd 	{ 2500000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1),  8, 0 },
344cd32ac64SAdrian Chadd 	{ 5000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(1),  4, 0 },
345cd32ac64SAdrian Chadd 	{ 0, }
346cd32ac64SAdrian Chadd };
347cd32ac64SAdrian Chadd 
348cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl sdcc1_apps_clk_src_freq_tbl[] = {
349cd32ac64SAdrian Chadd 	{ 144000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 3, 240 },
350cd32ac64SAdrian Chadd 	{ 400000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 0 },
351cd32ac64SAdrian Chadd 	{ 20000000, "fepll500", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 25 },
352cd32ac64SAdrian Chadd 	{ 25000000, "fepll500", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 20 },
353cd32ac64SAdrian Chadd 	{ 50000000, "fepll500", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 10 },
354cd32ac64SAdrian Chadd 	{ 100000000, "fepll500", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 1, 5 },
355cd32ac64SAdrian Chadd 	{ 192000000, "ddrpllsdcc", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
356cd32ac64SAdrian Chadd 	{ 0, }
357cd32ac64SAdrian Chadd };
358cd32ac64SAdrian Chadd 
359cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl apps_ahb_clk_src_freq_tbl[] = {
360cd32ac64SAdrian Chadd 	{ 48000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
361cd32ac64SAdrian Chadd 	{ 100000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(2), 0, 0 },
362cd32ac64SAdrian Chadd 	{ 0, }
363cd32ac64SAdrian Chadd };
364cd32ac64SAdrian Chadd 
365cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl usb30_mock_utmi_clk_src_freq_tbl[] = {
366cd32ac64SAdrian Chadd 	{ 2000000, "fepll200", QCOM_CLK_FREQTBL_PREDIV_RCG2(10), 0, 0 },
367cd32ac64SAdrian Chadd 	{ 0, }
368cd32ac64SAdrian Chadd };
369cd32ac64SAdrian Chadd 
370cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl fephy_125m_dly_clk_src_freq_tbl[] = {
371cd32ac64SAdrian Chadd 	{ 125000000, "fepll125dly", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
372cd32ac64SAdrian Chadd 	{ 0, }
373cd32ac64SAdrian Chadd };
374cd32ac64SAdrian Chadd 
375cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl wcss2g_clk_src_freq_tbl[] = {
376cd32ac64SAdrian Chadd 	{ 48000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
377cd32ac64SAdrian Chadd 	{ 250000000, "fepllwcss2g", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
378cd32ac64SAdrian Chadd 	{ 0, }
379cd32ac64SAdrian Chadd };
380cd32ac64SAdrian Chadd 
381cd32ac64SAdrian Chadd static struct qcom_clk_freq_tbl wcss5g_clk_src_freq_tbl[] = {
382cd32ac64SAdrian Chadd 	{ 48000000, "xo", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
383cd32ac64SAdrian Chadd 	{ 250000000, "fepllwcss5g", QCOM_CLK_FREQTBL_PREDIV_RCG2(1), 0, 0 },
384cd32ac64SAdrian Chadd 	{ 0, }
385cd32ac64SAdrian Chadd };
386cd32ac64SAdrian Chadd 
387cd32ac64SAdrian Chadd /*
388cd32ac64SAdrian Chadd  * Divisor table for the 2g/5g wifi clock divisors.
389cd32ac64SAdrian Chadd  */
390cd32ac64SAdrian Chadd static struct qcom_clk_ro_div_tbl fepllwcss_clk_div_tbl[] = {
391cd32ac64SAdrian Chadd 	{ 0, 15 },
392cd32ac64SAdrian Chadd 	{ 1, 16 },
393cd32ac64SAdrian Chadd 	{ 2, 18 },
394cd32ac64SAdrian Chadd 	{ 3, 20 },
395cd32ac64SAdrian Chadd 	{ 0, 0 }
396cd32ac64SAdrian Chadd };
397cd32ac64SAdrian Chadd 
398cd32ac64SAdrian Chadd /*
399cd32ac64SAdrian Chadd  * Read-only divisor table clocks.
400cd32ac64SAdrian Chadd  */
401cd32ac64SAdrian Chadd static struct qcom_clk_ro_div_def ro_div_tbl[] = {
402cd32ac64SAdrian Chadd 	F_RO_DIV(GCC_FEPLL_WCSS2G_CLK, "fepllwcss2g", "gcc_fepll_vco",
403cd32ac64SAdrian Chadd 	     0x2f020, 8, 2, &fepllwcss_clk_div_tbl[0]),
404cd32ac64SAdrian Chadd 	F_RO_DIV(GCC_FEPLL_WCSS5G_CLK, "fepllwcss5g", "gcc_fepll_vco",
405cd32ac64SAdrian Chadd 	     0x2f020, 12, 2, &fepllwcss_clk_div_tbl[0]),
406cd32ac64SAdrian Chadd };
407cd32ac64SAdrian Chadd 
408cd32ac64SAdrian Chadd /*
409cd32ac64SAdrian Chadd  * RCG2 clocks
410cd32ac64SAdrian Chadd  */
411cd32ac64SAdrian Chadd static struct qcom_clk_rcg2_def rcg2_tbl[] = {
412cd32ac64SAdrian Chadd 	F_RCG2(AUDIO_CLK_SRC, "audio_clk_src", gcc_xo_200_parents,
413cd32ac64SAdrian Chadd 	    0x1b000, 5, 0, -1, -1, 0, 0, &audio_clk_src_freq_tbl[0]),
414cd32ac64SAdrian Chadd 	F_RCG2(BLSP1_QUP1_I2C_APPS_CLK_SRC, "blsp1_qup1_i2c_apps_clk_src",
415cd32ac64SAdrian Chadd 	    gcc_xo_200_parents, 0x200c, 5, 0, -1, -1, 0, 0,
416cd32ac64SAdrian Chadd 	    &blsp1_qup1_i2c_apps_clk_src_freq_tbl[0]),
417cd32ac64SAdrian Chadd 	F_RCG2(BLSP1_QUP2_I2C_APPS_CLK_SRC, "blsp1_qup2_i2c_apps_clk_src",
418cd32ac64SAdrian Chadd 	    gcc_xo_200_parents, 0x3000, 5, 0, -1, -1, 0, 0,
419cd32ac64SAdrian Chadd 	    &blsp1_qup1_i2c_apps_clk_src_freq_tbl[0]),
420cd32ac64SAdrian Chadd 	F_RCG2(BLSP1_QUP1_SPI_APPS_CLK_SRC, "blsp1_qup1_spi_apps_clk_src",
421cd32ac64SAdrian Chadd 	    gcc_xo_200_spi_parents, 0x2024, 5, 8, -1, -1, 0, 0,
422cd32ac64SAdrian Chadd 	    &blsp1_qup1_spi_apps_clk_src_freq_tbl[0]),
423cd32ac64SAdrian Chadd 	F_RCG2(BLSP1_QUP2_SPI_APPS_CLK_SRC, "blsp1_qup2_spi_apps_clk_src",
424cd32ac64SAdrian Chadd 	    gcc_xo_200_spi_parents, 0x3014, 5, 8, -1, -1, 0, 0,
425cd32ac64SAdrian Chadd 	    &blsp1_qup1_spi_apps_clk_src_freq_tbl[0]),
426cd32ac64SAdrian Chadd 	F_RCG2(BLSP1_UART1_APPS_CLK_SRC, "blsp1_uart1_apps_clk_src",
427cd32ac64SAdrian Chadd 	    gcc_xo_200_spi_parents, 0x2044, 5, 16, -1, -1, 0, 0,
428cd32ac64SAdrian Chadd 	    &blsp1_uart1_apps_clk_src_freq_tbl[0]),
429cd32ac64SAdrian Chadd 	F_RCG2(BLSP1_UART2_APPS_CLK_SRC, "blsp1_uart2_apps_clk_src",
430cd32ac64SAdrian Chadd 	    gcc_xo_200_spi_parents, 0x3034, 5, 16, -1, -1, 0, 0,
431cd32ac64SAdrian Chadd 	    &blsp1_uart1_apps_clk_src_freq_tbl[0]),
432cd32ac64SAdrian Chadd 	F_RCG2(GP1_CLK_SRC, "gp1_clk_src", gcc_xo_200_parents, 0x8004,
433cd32ac64SAdrian Chadd 	    5, 8, -1, -1, 0, 0,
434cd32ac64SAdrian Chadd 	    &gp1_clk_src_freq_tbl[0]),
435cd32ac64SAdrian Chadd 	F_RCG2(GP2_CLK_SRC, "gp2_clk_src", gcc_xo_200_parents, 0x9004,
436cd32ac64SAdrian Chadd 	    5, 8, -1, -1, 0, 0,
437cd32ac64SAdrian Chadd 	    &gp1_clk_src_freq_tbl[0]),
438cd32ac64SAdrian Chadd 	F_RCG2(GP3_CLK_SRC, "gp3_clk_src", gcc_xo_200_parents, 0xa004,
439cd32ac64SAdrian Chadd 	    5, 8, -1, -1, 0, 0,
440cd32ac64SAdrian Chadd 	    &gp1_clk_src_freq_tbl[0]),
441cd32ac64SAdrian Chadd 	F_RCG2(SDCC1_APPS_CLK_SRC, "sdcc1_apps_clk_src",
442cd32ac64SAdrian Chadd 	    gcc_xo_sdcc1_500_parents, 0x18004, 5, 0, -1, -1, 0, 0,
443cd32ac64SAdrian Chadd 	    &sdcc1_apps_clk_src_freq_tbl[0]),
444cd32ac64SAdrian Chadd 	F_RCG2(GCC_APPS_CLK_SRC, "apps_clk_src", apps_clk_src_parents,
445cd32ac64SAdrian Chadd 	    0x1900c, 5, 0, -1, 2, 0,
446cd32ac64SAdrian Chadd 	    QCOM_CLK_RCG2_FLAGS_SET_RATE_PARENT,
447cd32ac64SAdrian Chadd 	    &apps_clk_src_freq_tbl[0]),
448cd32ac64SAdrian Chadd 	F_RCG2(GCC_APPS_AHB_CLK_SRC, "apps_ahb_clk_src",
449cd32ac64SAdrian Chadd 	    gcc_xo_200_500_parents, 0x19014, 5, 0, -1, -1, 0,
450cd32ac64SAdrian Chadd 	    0, &apps_ahb_clk_src_freq_tbl[0]),
451cd32ac64SAdrian Chadd 	F_RCG2(GCC_USB3_MOCK_UTMI_CLK_SRC, "usb30_mock_utmi_clk_src",
452cd32ac64SAdrian Chadd 	    gcc_xo_200_parents, 0x1e000, 5, 0, -1, -1, 0, 0,
453cd32ac64SAdrian Chadd 	    &usb30_mock_utmi_clk_src_freq_tbl[0]),
454cd32ac64SAdrian Chadd 	F_RCG2(FEPHY_125M_DLY_CLK_SRC, "fephy_125m_dly_clk_src",
455cd32ac64SAdrian Chadd 	    gcc_xo_125_dly_parents, 0x12000, 5, 0, -1, -1, 0, 0,
456cd32ac64SAdrian Chadd 	    &fephy_125m_dly_clk_src_freq_tbl[0]),
457cd32ac64SAdrian Chadd 	F_RCG2(WCSS2G_CLK_SRC, "wcss2g_clk_src", gcc_xo_wcss2g_parents,
458cd32ac64SAdrian Chadd 	    0x1f000, 5, 0, -1, -1, 0, 0,
459cd32ac64SAdrian Chadd 	    &wcss2g_clk_src_freq_tbl[0]),
460cd32ac64SAdrian Chadd 	F_RCG2(WCSS5G_CLK_SRC, "wcss5g_clk_src", gcc_xo_wcss5g_parents,
461cd32ac64SAdrian Chadd 	    0x20000, 5, 0, -1, -1, 0, 0,
462cd32ac64SAdrian Chadd 	    &wcss5g_clk_src_freq_tbl[0]),
463cd32ac64SAdrian Chadd 	F_RCG2(GCC_PCNOC_AHB_CLK_SRC, "gcc_pcnoc_ahb_clk_src",
464cd32ac64SAdrian Chadd 	    gcc_xo_200_500_parents, 0x21024, 5, 0, -1, -1, 0, 0,
465cd32ac64SAdrian Chadd 	    &gcc_pcnoc_ahb_clk_src_freq_tbl[0]),
466cd32ac64SAdrian Chadd };
467cd32ac64SAdrian Chadd 
468cd32ac64SAdrian Chadd /*
469cd32ac64SAdrian Chadd  * branch2 clocks
470cd32ac64SAdrian Chadd  */
471cd32ac64SAdrian Chadd static struct qcom_clk_branch2_def branch2_tbl[] = {
472cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_AUDIO_AHB_CLK, "gcc_audio_ahb_clk", "pcnoc_clk_src",
473cd32ac64SAdrian Chadd 	    0x1b010, 0, 0, 0, 0x1b010, QCOM_CLK_BRANCH2_BRANCH_HALT,
474cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
475cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_AUDIO_PWM_CLK, "gcc_audio_pwm_clk", "audio_clk_src",
476cd32ac64SAdrian Chadd 	    0x1b00c, 0, 0, 0, 0x1b00c, QCOM_CLK_BRANCH2_BRANCH_HALT,
477cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
478cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_QUP1_I2C_APPS_CLK, "gcc_blsp1_qup1_i2c_apps_clk",
479cd32ac64SAdrian Chadd 	    "blsp1_qup1_i2c_apps_clk_src",
480cd32ac64SAdrian Chadd 	    0x2008, 0, 0, 0, 0x2008, QCOM_CLK_BRANCH2_BRANCH_HALT,
481cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
482cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_QUP2_I2C_APPS_CLK, "gcc_blsp1_qup2_i2c_apps_clk",
483cd32ac64SAdrian Chadd 	    "blsp1_qup2_i2c_apps_clk_src",
484cd32ac64SAdrian Chadd 	    0x3010, 0, 0, 0, 0x3010, QCOM_CLK_BRANCH2_BRANCH_HALT,
485cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
486cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_QUP1_SPI_APPS_CLK, "gcc_blsp1_qup1_spi_apps_clk",
487cd32ac64SAdrian Chadd 	    "blsp1_qup1_spi_apps_clk_src",
488cd32ac64SAdrian Chadd 	    0x2004, 0, 0, 0, 0x2004, QCOM_CLK_BRANCH2_BRANCH_HALT,
489cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
490cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_QUP2_SPI_APPS_CLK, "gcc_blsp1_qup2_spi_apps_clk",
491cd32ac64SAdrian Chadd 	    "blsp1_qup2_spi_apps_clk_src",
492cd32ac64SAdrian Chadd 	    0x300c, 0, 0, 0, 0x300c, QCOM_CLK_BRANCH2_BRANCH_HALT,
493cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
494cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_UART1_APPS_CLK, "gcc_blsp1_uart1_apps_clk",
495cd32ac64SAdrian Chadd 	    "blsp1_uart1_apps_clk_src",
496cd32ac64SAdrian Chadd 	    0x203c, 0, 0, 0, 0x203c, QCOM_CLK_BRANCH2_BRANCH_HALT,
497cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
498cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_UART2_APPS_CLK, "gcc_blsp1_uart2_apps_clk",
499cd32ac64SAdrian Chadd 	    "blsp1_uart2_apps_clk_src",
500cd32ac64SAdrian Chadd 	    0x302c, 0, 0, 0, 0x302c, QCOM_CLK_BRANCH2_BRANCH_HALT,
501cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
502cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_GP1_CLK, "gcc_gp1_clk", "gp1_clk_src",
503cd32ac64SAdrian Chadd 	    0x8000, 0, 0, 0, 0x8000, QCOM_CLK_BRANCH2_BRANCH_HALT,
504cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
505cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_GP2_CLK, "gcc_gp2_clk", "gp2_clk_src",
506cd32ac64SAdrian Chadd 	    0x9000, 0, 0, 0, 0x9000, QCOM_CLK_BRANCH2_BRANCH_HALT,
507cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
508cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_GP3_CLK, "gcc_gp3_clk", "gp3_clk_src",
509cd32ac64SAdrian Chadd 	    0xa000, 0, 0, 0, 0xa000, QCOM_CLK_BRANCH2_BRANCH_HALT,
510cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
511cd32ac64SAdrian Chadd 	/* BRANCH_HALT_VOTED; note the different enable/halt */
512cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_APPS_AHB_CLK_SRC, "gcc_apss_ahb_clk",
513cd32ac64SAdrian Chadd 	    "apps_ahb_clk_src",
514cd32ac64SAdrian Chadd 	    0x6000, 14, 0, 0, 0x19004, QCOM_CLK_BRANCH2_BRANCH_HALT,
515cd32ac64SAdrian Chadd 	    true, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
516cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BLSP1_AHB_CLK, "gcc_blsp1_ahb_clk",
517cd32ac64SAdrian Chadd 	    "pcnoc_clk_src",
518cd32ac64SAdrian Chadd 	    0x6000, 10, 0, 0, 0x1008, QCOM_CLK_BRANCH2_BRANCH_HALT,
519cd32ac64SAdrian Chadd 	    true, 0), /* BRANCH_HALT_VOTED */
520cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_DCD_XO_CLK, "gcc_dcd_xo_clk", "xo",
521cd32ac64SAdrian Chadd 	    0x2103c, 0, 0, 0, 0x2103c, QCOM_CLK_BRANCH2_BRANCH_HALT,
522cd32ac64SAdrian Chadd 	    false, 0),
523cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_BOOT_ROM_AHB_CLK, "gcc_boot_rom_ahb_clk",
524cd32ac64SAdrian Chadd 	    "pcnoc_clk_src", 0x1300c, 0, 0, 0, 0x1300c,
525cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_BRANCH_HALT,
526cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
527cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_CRYPTO_AHB_CLK, "gcc_crypto_ahb_clk",
528cd32ac64SAdrian Chadd 	    "pcnoc_clk_src", 0x6000, 0, 0, 0, 0x16024,
529cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_BRANCH_HALT,
530cd32ac64SAdrian Chadd 	    true, 0), /* BRANCH_HALT_VOTED */
531cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_CRYPTO_AXI_CLK, "gcc_crypto_axi_clk",
532cd32ac64SAdrian Chadd 	    "fepll125", 0x6000, 1, 0, 0, 0x16020,
533cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_BRANCH_HALT,
534cd32ac64SAdrian Chadd 	    true, 0), /* BRANCH_HALT_VOTED */
535cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_CRYPTO_CLK, "gcc_crypto_clk", "fepll125",
536cd32ac64SAdrian Chadd 	    0x6000, 2, 0, 0, 0x1601c, QCOM_CLK_BRANCH2_BRANCH_HALT,
537cd32ac64SAdrian Chadd 	    true, 0), /* BRANCH_HALT_VOTED */
538cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_ESS_CLK, "gcc_ess_clk", "fephy_125m_dly_clk_src",
539cd32ac64SAdrian Chadd 	    0x12010, 0, 0, 0, 0x12010, QCOM_CLK_BRANCH2_BRANCH_HALT,
540cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
541cd32ac64SAdrian Chadd 	/* BRANCH_HALT_VOTED */
542cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_IMEM_AXI_CLK, "gcc_imem_axi_clk", "fepll200",
543cd32ac64SAdrian Chadd 	    0x6000, 17, 0, 0, 0xe004, QCOM_CLK_BRANCH2_BRANCH_HALT,
544cd32ac64SAdrian Chadd 	    true, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
545cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_IMEM_CFG_AHB_CLK, "gcc_imem_cfg_ahb_clk",
546cd32ac64SAdrian Chadd 	    "pcnoc_clk_src",
547cd32ac64SAdrian Chadd 	    0xe008, 0, 0, 0, 0xe008, QCOM_CLK_BRANCH2_BRANCH_HALT,
548cd32ac64SAdrian Chadd 	    false, 0),
549cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_PCIE_AHB_CLK, "gcc_pcie_ahb_clk", "pcnoc_clk_src",
550cd32ac64SAdrian Chadd 	    0x1d00c, 0, 0, 0, 0x1d00c, QCOM_CLK_BRANCH2_BRANCH_HALT,
551cd32ac64SAdrian Chadd 	    false, 0),
552cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_PCIE_AXI_M_CLK, "gcc_pcie_axi_m_clk", "fepll200",
553cd32ac64SAdrian Chadd 	    0x1d004, 0, 0, 0, 0x1d004, QCOM_CLK_BRANCH2_BRANCH_HALT,
554cd32ac64SAdrian Chadd 	    false, 0),
555cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_PCIE_AXI_S_CLK, "gcc_pcie_axi_s_clk", "fepll200",
556cd32ac64SAdrian Chadd 	    0x1d008, 0, 0, 0, 0x1d008, QCOM_CLK_BRANCH2_BRANCH_HALT,
557cd32ac64SAdrian Chadd 	    false, 0),
558cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_PRNG_AHB_CLK, "gcc_prng_ahb_clk", "pcnoc_clk_src",
559cd32ac64SAdrian Chadd 	    0x6000, 8, 0, 0, 0x13004, QCOM_CLK_BRANCH2_BRANCH_HALT,
560cd32ac64SAdrian Chadd 	    true, 0), /* BRANCH_HALT_VOTED */
561cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_QPIC_AHB_CLK, "gcc_qpic_ahb_clk", "pcnoc_clk_src",
562cd32ac64SAdrian Chadd 	    0x1c008, 0, 0, 0, 0x1c008, QCOM_CLK_BRANCH2_BRANCH_HALT,
563cd32ac64SAdrian Chadd 	    false, 0),
564cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_QPIC_CLK, "gcc_qpic_clk", "pcnoc_clk_src",
565cd32ac64SAdrian Chadd 	    0x1c004, 0, 0, 0, 0x1c004, QCOM_CLK_BRANCH2_BRANCH_HALT,
566cd32ac64SAdrian Chadd 	    false, 0),
567cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_SDCC1_AHB_CLK, "gcc_sdcc1_ahb_clk", "pcnoc_clk_src",
568cd32ac64SAdrian Chadd 	    0x18010, 0, 0, 0, 0x18010, QCOM_CLK_BRANCH2_BRANCH_HALT,
569cd32ac64SAdrian Chadd 	    false, 0),
570cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_SDCC1_APPS_CLK, "gcc_sdcc1_apps_clk",
571cd32ac64SAdrian Chadd 	    "sdcc1_apps_clk_src", 0x1800c, 0, 0, 0, 0x1800c,
572cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_BRANCH_HALT,
573cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
574cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_TLMM_AHB_CLK, "gcc_tlmm_ahb_clk", "pcnoc_clk_src",
575cd32ac64SAdrian Chadd 	    0x6000, 5, 0, 0, 0x5004, QCOM_CLK_BRANCH2_BRANCH_HALT,
576cd32ac64SAdrian Chadd 	    true, 0), /* BRANCH_HALT_VOTED */
577cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_USB2_MASTER_CLK, "gcc_usb2_master_clk", "pcnoc_clk_src",
578cd32ac64SAdrian Chadd 	    0x1e00c, 0, 0, 0, 0x1e00c, QCOM_CLK_BRANCH2_BRANCH_HALT,
579cd32ac64SAdrian Chadd 	    false, 0),
580cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_USB2_SLEEP_CLK, "gcc_usb2_sleep_clk",
581f05b3c9fSAdrian Chadd 	    "gcc_sleep_clk_src", 0x1e010, 0, 0, 0, 0x1e010,
582cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_BRANCH_HALT,
583cd32ac64SAdrian Chadd 	    false, 0),
584cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_USB2_MOCK_UTMI_CLK, "gcc_usb2_mock_utmi_clk",
585cd32ac64SAdrian Chadd 	    "usb30_mock_utmi_clk_src", 0x1e014, 0, 0, 0, 0x1e014,
586cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_BRANCH_HALT,
587cd32ac64SAdrian Chadd 	    false, 0),
588cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_USB3_MASTER_CLK, "gcc_usb3_master_clk", "fepll125",
589cd32ac64SAdrian Chadd 	    0x1e028, 0, 0, 0, 0x1e028, QCOM_CLK_BRANCH2_BRANCH_HALT,
590cd32ac64SAdrian Chadd 	    false, 0),
591f05b3c9fSAdrian Chadd 	F_BRANCH2(GCC_USB3_SLEEP_CLK, "gcc_usb3_sleep_clk", "gcc_sleep_clk_src",
592cd32ac64SAdrian Chadd 	    0x1e02c, 0, 0, 0, 0x1e02c, QCOM_CLK_BRANCH2_BRANCH_HALT,
593cd32ac64SAdrian Chadd 	    false, 0),
594cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_USB3_MOCK_UTMI_CLK, "gcc_usb3_mock_utmi_clk",
595cd32ac64SAdrian Chadd 	    "usb30_mock_utmi_clk_src",
596cd32ac64SAdrian Chadd 	    0x1e030, 0, 0, 0, 0x1e030, QCOM_CLK_BRANCH2_BRANCH_HALT,
597cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
598cd32ac64SAdrian Chadd 	/* Note - yes, these two have the same registers in linux */
599cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_WCSS2G_CLK, "gcc_wcss2g_clk", "wcss2g_clk_src",
600cd32ac64SAdrian Chadd 	    0x1f00c, 0, 0, 0, 0x1f00c, QCOM_CLK_BRANCH2_BRANCH_HALT,
601cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
602cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_WCSS2G_REF_CLK, "gcc_wcss2g_ref_clk", "xo",
603cd32ac64SAdrian Chadd 	    0x1f00c, 0, 0, 0, 0x1f00c, QCOM_CLK_BRANCH2_BRANCH_HALT,
604cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
605f05b3c9fSAdrian Chadd 	F_BRANCH2(GCC_WCSS2G_RTC_CLK, "gcc_wcss2g_rtc_clk", "gcc_sleep_clk_src",
606cd32ac64SAdrian Chadd 	    0x1f010, 0, 0, 0, 0x1f010, QCOM_CLK_BRANCH2_BRANCH_HALT,
607cd32ac64SAdrian Chadd 	    false, 0),
608cd32ac64SAdrian Chadd 
609cd32ac64SAdrian Chadd 	/* Note - yes, these two have the same registers in linux */
610cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_WCSS5G_CLK, "gcc_wcss5g_clk", "wcss5g_clk_src",
611cd32ac64SAdrian Chadd 	    0x1f00c, 0, 0, 0, 0x2000c, QCOM_CLK_BRANCH2_BRANCH_HALT,
612cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
613cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_WCSS5G_REF_CLK, "gcc_wcss5g_ref_clk", "xo",
614cd32ac64SAdrian Chadd 	    0x1f00c, 0, 0, 0, 0x2000c, QCOM_CLK_BRANCH2_BRANCH_HALT,
615cd32ac64SAdrian Chadd 	    false, QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
616f05b3c9fSAdrian Chadd 	F_BRANCH2(GCC_WCSS5G_RTC_CLK, "gcc_wcss5g_rtc_clk", "gcc_sleep_clk_src",
617cd32ac64SAdrian Chadd 	    0x1f010, 0, 0, 0, 0x20010, QCOM_CLK_BRANCH2_BRANCH_HALT,
618cd32ac64SAdrian Chadd 	    false, 0),
619cd32ac64SAdrian Chadd 
620cd32ac64SAdrian Chadd 	F_BRANCH2(GCC_PCNOC_AHB_CLK, "pcnoc_clk_src", "gcc_pcnoc_ahb_clk_src",
621cd32ac64SAdrian Chadd 	    0x21030, 0, 0, 0, 0x21030, QCOM_CLK_BRANCH2_BRANCH_HALT, false,
622cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_FLAGS_CRITICAL |
623cd32ac64SAdrian Chadd 	    QCOM_CLK_BRANCH2_FLAGS_SET_RATE_PARENT),
624cd32ac64SAdrian Chadd };
625cd32ac64SAdrian Chadd 
626cd32ac64SAdrian Chadd static void
qcom_gcc_ipq4018_clock_init_fepll(struct qcom_gcc_ipq4018_softc * sc)627cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_init_fepll(struct qcom_gcc_ipq4018_softc *sc)
628cd32ac64SAdrian Chadd {
629cd32ac64SAdrian Chadd 	int i, rv;
630cd32ac64SAdrian Chadd 
631cd32ac64SAdrian Chadd 	for (i = 0; i < nitems(fepll_tbl); i++) {
632cd32ac64SAdrian Chadd 		rv = qcom_clk_fepll_register(sc->clkdom, fepll_tbl + i);
633cd32ac64SAdrian Chadd 		if (rv != 0)
634cd32ac64SAdrian Chadd 			panic("qcom_clk_fepll_register failed");
635cd32ac64SAdrian Chadd 	}
636cd32ac64SAdrian Chadd }
637cd32ac64SAdrian Chadd 
638cd32ac64SAdrian Chadd static void
qcom_gcc_ipq4018_clock_init_fdiv(struct qcom_gcc_ipq4018_softc * sc)639cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_init_fdiv(struct qcom_gcc_ipq4018_softc *sc)
640cd32ac64SAdrian Chadd {
641cd32ac64SAdrian Chadd 	int i, rv;
642cd32ac64SAdrian Chadd 
643cd32ac64SAdrian Chadd 	for (i = 0; i < nitems(fdiv_tbl); i++) {
644cd32ac64SAdrian Chadd 		rv = qcom_clk_fdiv_register(sc->clkdom, fdiv_tbl + i);
645cd32ac64SAdrian Chadd 		if (rv != 0)
646cd32ac64SAdrian Chadd 			panic("qcom_clk_fdiv_register failed");
647cd32ac64SAdrian Chadd 	}
648cd32ac64SAdrian Chadd }
649cd32ac64SAdrian Chadd 
650cd32ac64SAdrian Chadd static void
qcom_gcc_ipq4018_clock_init_apssdiv(struct qcom_gcc_ipq4018_softc * sc)651cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_init_apssdiv(struct qcom_gcc_ipq4018_softc *sc)
652cd32ac64SAdrian Chadd {
653cd32ac64SAdrian Chadd 	int i, rv;
654cd32ac64SAdrian Chadd 
655cd32ac64SAdrian Chadd 	for (i = 0; i < nitems(apssdiv_tbl); i++) {
656cd32ac64SAdrian Chadd 		rv = qcom_clk_apssdiv_register(sc->clkdom, apssdiv_tbl + i);
657cd32ac64SAdrian Chadd 		if (rv != 0)
658cd32ac64SAdrian Chadd 			panic("qcom_clk_apssdiv_register failed");
659cd32ac64SAdrian Chadd 	}
660cd32ac64SAdrian Chadd }
661cd32ac64SAdrian Chadd 
662cd32ac64SAdrian Chadd static void
qcom_gcc_ipq4018_clock_init_rcg2(struct qcom_gcc_ipq4018_softc * sc)663cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_init_rcg2(struct qcom_gcc_ipq4018_softc *sc)
664cd32ac64SAdrian Chadd {
665cd32ac64SAdrian Chadd 	int i, rv;
666cd32ac64SAdrian Chadd 
667cd32ac64SAdrian Chadd 	for (i = 0; i < nitems(rcg2_tbl); i++) {
668cd32ac64SAdrian Chadd 		rv = qcom_clk_rcg2_register(sc->clkdom, rcg2_tbl + i);
669cd32ac64SAdrian Chadd 		if (rv != 0)
670cd32ac64SAdrian Chadd 			panic("qcom_clk_rcg2_register failed");
671cd32ac64SAdrian Chadd 	}
672cd32ac64SAdrian Chadd }
673cd32ac64SAdrian Chadd 
674cd32ac64SAdrian Chadd static void
qcom_gcc_ipq4018_clock_init_branch2(struct qcom_gcc_ipq4018_softc * sc)675cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_init_branch2(struct qcom_gcc_ipq4018_softc *sc)
676cd32ac64SAdrian Chadd {
677cd32ac64SAdrian Chadd 	int i, rv;
678cd32ac64SAdrian Chadd 
679cd32ac64SAdrian Chadd 	for (i = 0; i < nitems(branch2_tbl); i++) {
680cd32ac64SAdrian Chadd 		rv = qcom_clk_branch2_register(sc->clkdom, branch2_tbl + i);
681cd32ac64SAdrian Chadd 		if (rv != 0)
682cd32ac64SAdrian Chadd 			panic("qcom_clk_branch2_register failed");
683cd32ac64SAdrian Chadd 	}
684cd32ac64SAdrian Chadd }
685cd32ac64SAdrian Chadd 
686cd32ac64SAdrian Chadd static void
qcom_gcc_ipq4018_clock_init_ro_div(struct qcom_gcc_ipq4018_softc * sc)687cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_init_ro_div(struct qcom_gcc_ipq4018_softc *sc)
688cd32ac64SAdrian Chadd {
689cd32ac64SAdrian Chadd 	int i, rv;
690cd32ac64SAdrian Chadd 
691cd32ac64SAdrian Chadd 	for (i = 0; i < nitems(ro_div_tbl); i++) {
692cd32ac64SAdrian Chadd 		rv = qcom_clk_ro_div_register(sc->clkdom, ro_div_tbl + i);
693cd32ac64SAdrian Chadd 		if (rv != 0)
694cd32ac64SAdrian Chadd 			panic("qcom_clk_ro_div_register failed");
695cd32ac64SAdrian Chadd 	}
696cd32ac64SAdrian Chadd }
697cd32ac64SAdrian Chadd 
698cd32ac64SAdrian Chadd int
qcom_gcc_ipq4018_clock_read(device_t dev,bus_addr_t addr,uint32_t * val)699cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_read(device_t dev, bus_addr_t addr, uint32_t *val)
700cd32ac64SAdrian Chadd {
701cd32ac64SAdrian Chadd 	struct qcom_gcc_ipq4018_softc *sc;
702cd32ac64SAdrian Chadd 
703cd32ac64SAdrian Chadd 	sc = device_get_softc(dev);
704cd32ac64SAdrian Chadd 	*val = bus_read_4(sc->reg, addr);
705cd32ac64SAdrian Chadd 	return (0);
706cd32ac64SAdrian Chadd }
707cd32ac64SAdrian Chadd 
708cd32ac64SAdrian Chadd int
qcom_gcc_ipq4018_clock_write(device_t dev,bus_addr_t addr,uint32_t val)709cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_write(device_t dev, bus_addr_t addr, uint32_t val)
710cd32ac64SAdrian Chadd {
711cd32ac64SAdrian Chadd 	struct qcom_gcc_ipq4018_softc *sc;
712cd32ac64SAdrian Chadd 
713cd32ac64SAdrian Chadd 	sc = device_get_softc(dev);
714cd32ac64SAdrian Chadd 	bus_write_4(sc->reg, addr, val);
715cd32ac64SAdrian Chadd 	return (0);
716cd32ac64SAdrian Chadd }
717cd32ac64SAdrian Chadd 
718cd32ac64SAdrian Chadd int
qcom_gcc_ipq4018_clock_modify(device_t dev,bus_addr_t addr,uint32_t clear_mask,uint32_t set_mask)719cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_modify(device_t dev, bus_addr_t addr,
720cd32ac64SAdrian Chadd      uint32_t clear_mask, uint32_t set_mask)
721cd32ac64SAdrian Chadd {
722cd32ac64SAdrian Chadd 	struct qcom_gcc_ipq4018_softc *sc;
723cd32ac64SAdrian Chadd 	uint32_t reg;
724cd32ac64SAdrian Chadd 
725cd32ac64SAdrian Chadd 	sc = device_get_softc(dev);
726cd32ac64SAdrian Chadd 	reg = bus_read_4(sc->reg, addr);
727cd32ac64SAdrian Chadd 	reg &= clear_mask;
728cd32ac64SAdrian Chadd 	reg |= set_mask;
729cd32ac64SAdrian Chadd 	bus_write_4(sc->reg, addr, reg);
730cd32ac64SAdrian Chadd 	return (0);
731cd32ac64SAdrian Chadd }
732cd32ac64SAdrian Chadd 
733cd32ac64SAdrian Chadd void
qcom_gcc_ipq4018_clock_setup(struct qcom_gcc_ipq4018_softc * sc)734cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_setup(struct qcom_gcc_ipq4018_softc *sc)
735cd32ac64SAdrian Chadd {
736cd32ac64SAdrian Chadd 
737cd32ac64SAdrian Chadd 	sc->clkdom = clkdom_create(sc->dev);
738cd32ac64SAdrian Chadd 
739cd32ac64SAdrian Chadd 	/* Setup stuff */
740cd32ac64SAdrian Chadd 	qcom_gcc_ipq4018_clock_init_fepll(sc);
741cd32ac64SAdrian Chadd 	qcom_gcc_ipq4018_clock_init_fdiv(sc);
742cd32ac64SAdrian Chadd 	qcom_gcc_ipq4018_clock_init_apssdiv(sc);
743cd32ac64SAdrian Chadd 	qcom_gcc_ipq4018_clock_init_rcg2(sc);
744cd32ac64SAdrian Chadd 	qcom_gcc_ipq4018_clock_init_branch2(sc);
745cd32ac64SAdrian Chadd 	qcom_gcc_ipq4018_clock_init_ro_div(sc);
746cd32ac64SAdrian Chadd 
747cd32ac64SAdrian Chadd 	/* Finalise clock tree */
748cd32ac64SAdrian Chadd 	clkdom_finit(sc->clkdom);
749cd32ac64SAdrian Chadd }
750cd32ac64SAdrian Chadd 
751cd32ac64SAdrian Chadd void
qcom_gcc_ipq4018_clock_lock(device_t dev)752cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_lock(device_t dev)
753cd32ac64SAdrian Chadd {
754cd32ac64SAdrian Chadd 	struct qcom_gcc_ipq4018_softc *sc;
755cd32ac64SAdrian Chadd 
756cd32ac64SAdrian Chadd 	sc = device_get_softc(dev);
757cd32ac64SAdrian Chadd 	mtx_lock(&sc->mtx);
758cd32ac64SAdrian Chadd }
759cd32ac64SAdrian Chadd 
760cd32ac64SAdrian Chadd void
qcom_gcc_ipq4018_clock_unlock(device_t dev)761cd32ac64SAdrian Chadd qcom_gcc_ipq4018_clock_unlock(device_t dev)
762cd32ac64SAdrian Chadd {
763cd32ac64SAdrian Chadd 	struct qcom_gcc_ipq4018_softc *sc;
764cd32ac64SAdrian Chadd 
765cd32ac64SAdrian Chadd 	sc = device_get_softc(dev);
766cd32ac64SAdrian Chadd 	mtx_unlock(&sc->mtx);
767cd32ac64SAdrian Chadd }
768