xref: /arm-trusted-firmware/plat/xilinx/zynqmp/pm_service/pm_api_clock.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved.
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu /*
9*91f16700Schasinglulu  * ZynqMP system level PM-API functions for clock control.
10*91f16700Schasinglulu  */
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <stdbool.h>
13*91f16700Schasinglulu #include <string.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #include <arch_helpers.h>
16*91f16700Schasinglulu #include <lib/mmio.h>
17*91f16700Schasinglulu #include <plat/common/platform.h>
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #include "pm_api_clock.h"
20*91f16700Schasinglulu #include "pm_client.h"
21*91f16700Schasinglulu #include "pm_common.h"
22*91f16700Schasinglulu #include "pm_ipi.h"
23*91f16700Schasinglulu #include "zynqmp_pm_api_sys.h"
24*91f16700Schasinglulu 
25*91f16700Schasinglulu #define CLK_NODE_MAX			(6U)
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #define CLK_PARENTS_ID_LEN		(16U)
28*91f16700Schasinglulu #define CLK_TOPOLOGY_NODE_OFFSET	(16U)
29*91f16700Schasinglulu #define CLK_TOPOLOGY_PAYLOAD_LEN	(12U)
30*91f16700Schasinglulu #define CLK_PARENTS_PAYLOAD_LEN		(12U)
31*91f16700Schasinglulu #define CLK_TYPE_SHIFT			(2U)
32*91f16700Schasinglulu #define CLK_CLKFLAGS_SHIFT		(8U)
33*91f16700Schasinglulu #define CLK_TYPEFLAGS_SHIFT		(24U)
34*91f16700Schasinglulu #define CLK_TYPEFLAGS2_SHIFT		(4U)
35*91f16700Schasinglulu #define CLK_TYPEFLAGS_BITS_MASK		(0xFFU)
36*91f16700Schasinglulu #define CLK_TYPEFLAGS2_BITS_MASK	(0x0F00U)
37*91f16700Schasinglulu #define CLK_TYPEFLAGS_BITS		(8U)
38*91f16700Schasinglulu 
39*91f16700Schasinglulu #define CLK_EXTERNAL_PARENT	(PARENT_CLK_EXTERNAL << CLK_PARENTS_ID_LEN)
40*91f16700Schasinglulu 
41*91f16700Schasinglulu #define NA_MULT					(0U)
42*91f16700Schasinglulu #define NA_DIV					(0U)
43*91f16700Schasinglulu #define NA_SHIFT				(0U)
44*91f16700Schasinglulu #define NA_WIDTH				(0U)
45*91f16700Schasinglulu #define NA_CLK_FLAGS				(0U)
46*91f16700Schasinglulu #define NA_TYPE_FLAGS				(0U)
47*91f16700Schasinglulu 
48*91f16700Schasinglulu /* PLL nodes related definitions */
49*91f16700Schasinglulu #define PLL_PRESRC_MUX_SHIFT			(20U)
50*91f16700Schasinglulu #define PLL_PRESRC_MUX_WIDTH			(3U)
51*91f16700Schasinglulu #define PLL_POSTSRC_MUX_SHIFT			(24U)
52*91f16700Schasinglulu #define PLL_POSTSRC_MUX_WIDTH			(3U)
53*91f16700Schasinglulu #define PLL_DIV2_MUX_SHIFT			(16U)
54*91f16700Schasinglulu #define PLL_DIV2_MUX_WIDTH			(1U)
55*91f16700Schasinglulu #define PLL_BYPASS_MUX_SHIFT			(3U)
56*91f16700Schasinglulu #define PLL_BYPASS_MUX_WIDTH			(1U)
57*91f16700Schasinglulu 
58*91f16700Schasinglulu /* Peripheral nodes related definitions */
59*91f16700Schasinglulu /* Peripheral Clocks */
60*91f16700Schasinglulu #define PERIPH_MUX_SHIFT			(0U)
61*91f16700Schasinglulu #define PERIPH_MUX_WIDTH			(3U)
62*91f16700Schasinglulu #define PERIPH_DIV1_SHIFT			(8U)
63*91f16700Schasinglulu #define PERIPH_DIV1_WIDTH			(6U)
64*91f16700Schasinglulu #define PERIPH_DIV2_SHIFT			(16U)
65*91f16700Schasinglulu #define PERIPH_DIV2_WIDTH			(6U)
66*91f16700Schasinglulu #define PERIPH_GATE_SHIFT			(24U)
67*91f16700Schasinglulu #define PERIPH_GATE_WIDTH			(1U)
68*91f16700Schasinglulu 
69*91f16700Schasinglulu #define USB_GATE_SHIFT				(25U)
70*91f16700Schasinglulu 
71*91f16700Schasinglulu /* External clock related definitions */
72*91f16700Schasinglulu 
73*91f16700Schasinglulu #define EXT_CLK_MIO_DATA(mio)				\
74*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_MIO##mio)] = {		\
75*91f16700Schasinglulu 		.name = "mio_clk_"#mio,			\
76*91f16700Schasinglulu 	}
77*91f16700Schasinglulu 
78*91f16700Schasinglulu #define EXT_CLK_INDEX(n)	(n - CLK_MAX_OUTPUT_CLK)
79*91f16700Schasinglulu 
80*91f16700Schasinglulu /* Clock control related definitions */
81*91f16700Schasinglulu #define BIT_MASK(x, y) (((1U << (y)) - 1) << (x))
82*91f16700Schasinglulu 
83*91f16700Schasinglulu #define ISPLL(id)	(id == CLK_APLL_INT ||	\
84*91f16700Schasinglulu 			 id == CLK_DPLL_INT ||  \
85*91f16700Schasinglulu 			 id == CLK_VPLL_INT ||  \
86*91f16700Schasinglulu 			 id == CLK_IOPLL_INT || \
87*91f16700Schasinglulu 			 id == CLK_RPLL_INT)
88*91f16700Schasinglulu 
89*91f16700Schasinglulu 
90*91f16700Schasinglulu #define PLLCTRL_BP_MASK				BIT(3)
91*91f16700Schasinglulu #define PLLCTRL_RESET_MASK			(1U)
92*91f16700Schasinglulu #define PLL_FRAC_OFFSET				(8U)
93*91f16700Schasinglulu #define PLL_FRAC_MODE				(1U)
94*91f16700Schasinglulu #define PLL_INT_MODE				(0U)
95*91f16700Schasinglulu #define PLL_FRAC_MODE_MASK			(0x80000000U)
96*91f16700Schasinglulu #define PLL_FRAC_MODE_SHIFT			(31U)
97*91f16700Schasinglulu #define PLL_FRAC_DATA_MASK			(0xFFFFU)
98*91f16700Schasinglulu #define PLL_FRAC_DATA_SHIFT			(0U)
99*91f16700Schasinglulu #define PLL_FBDIV_MASK				(0x7F00U)
100*91f16700Schasinglulu #define PLL_FBDIV_WIDTH				(7U)
101*91f16700Schasinglulu #define PLL_FBDIV_SHIFT				(8U)
102*91f16700Schasinglulu 
103*91f16700Schasinglulu #define CLK_PLL_RESET_ASSERT			(1U)
104*91f16700Schasinglulu #define CLK_PLL_RESET_RELEASE			(2U)
105*91f16700Schasinglulu #define CLK_PLL_RESET_PULSE	(CLK_PLL_RESET_ASSERT | CLK_PLL_RESET_RELEASE)
106*91f16700Schasinglulu 
107*91f16700Schasinglulu /* Common topology definitions */
108*91f16700Schasinglulu #define GENERIC_MUX					\
109*91f16700Schasinglulu 	{						\
110*91f16700Schasinglulu 		.type = TYPE_MUX,			\
111*91f16700Schasinglulu 		.offset = PERIPH_MUX_SHIFT,		\
112*91f16700Schasinglulu 		.width = PERIPH_MUX_WIDTH,		\
113*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT |	\
114*91f16700Schasinglulu 			    CLK_IS_BASIC,		\
115*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,		\
116*91f16700Schasinglulu 		.mult = NA_MULT,			\
117*91f16700Schasinglulu 		.div = NA_DIV,				\
118*91f16700Schasinglulu 	}
119*91f16700Schasinglulu 
120*91f16700Schasinglulu #define IGNORE_UNUSED_MUX				\
121*91f16700Schasinglulu 	{						\
122*91f16700Schasinglulu 		.type = TYPE_MUX,			\
123*91f16700Schasinglulu 		.offset = PERIPH_MUX_SHIFT,		\
124*91f16700Schasinglulu 		.width = PERIPH_MUX_WIDTH,		\
125*91f16700Schasinglulu 		.clkflags = CLK_IGNORE_UNUSED |		\
126*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |	\
127*91f16700Schasinglulu 			    CLK_IS_BASIC,		\
128*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,		\
129*91f16700Schasinglulu 		.mult = NA_MULT,			\
130*91f16700Schasinglulu 		.div = NA_DIV,				\
131*91f16700Schasinglulu 	}
132*91f16700Schasinglulu 
133*91f16700Schasinglulu #define GENERIC_DIV1						\
134*91f16700Schasinglulu 	{							\
135*91f16700Schasinglulu 		.type = TYPE_DIV1,				\
136*91f16700Schasinglulu 		.offset = PERIPH_DIV1_SHIFT,			\
137*91f16700Schasinglulu 		.width = PERIPH_DIV1_WIDTH,			\
138*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT |		\
139*91f16700Schasinglulu 			    CLK_IS_BASIC,			\
140*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED |		\
141*91f16700Schasinglulu 			     CLK_DIVIDER_ALLOW_ZERO,		\
142*91f16700Schasinglulu 		.mult = NA_MULT,				\
143*91f16700Schasinglulu 		.div = NA_DIV,					\
144*91f16700Schasinglulu 	}
145*91f16700Schasinglulu 
146*91f16700Schasinglulu #define GENERIC_DIV2						\
147*91f16700Schasinglulu 	{							\
148*91f16700Schasinglulu 		.type = TYPE_DIV2,				\
149*91f16700Schasinglulu 		.offset = PERIPH_DIV2_SHIFT,			\
150*91f16700Schasinglulu 		.width = PERIPH_DIV2_WIDTH,			\
151*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT |		\
152*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT |		\
153*91f16700Schasinglulu 			    CLK_IS_BASIC,			\
154*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED |		\
155*91f16700Schasinglulu 			     CLK_DIVIDER_ALLOW_ZERO,		\
156*91f16700Schasinglulu 		.mult = NA_MULT,				\
157*91f16700Schasinglulu 		.div = NA_DIV,					\
158*91f16700Schasinglulu 	}
159*91f16700Schasinglulu 
160*91f16700Schasinglulu #define IGNORE_UNUSED_DIV(id)					\
161*91f16700Schasinglulu 	{							\
162*91f16700Schasinglulu 		.type = TYPE_DIV##id,				\
163*91f16700Schasinglulu 		.offset = PERIPH_DIV##id##_SHIFT,		\
164*91f16700Schasinglulu 		.width = PERIPH_DIV##id##_WIDTH,		\
165*91f16700Schasinglulu 		.clkflags = CLK_IGNORE_UNUSED |			\
166*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |		\
167*91f16700Schasinglulu 			    CLK_IS_BASIC,			\
168*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED |		\
169*91f16700Schasinglulu 			     CLK_DIVIDER_ALLOW_ZERO,		\
170*91f16700Schasinglulu 		.mult = NA_MULT,				\
171*91f16700Schasinglulu 		.div = NA_DIV,					\
172*91f16700Schasinglulu 	}
173*91f16700Schasinglulu 
174*91f16700Schasinglulu #define GENERIC_GATE						\
175*91f16700Schasinglulu 	{							\
176*91f16700Schasinglulu 		.type = TYPE_GATE,				\
177*91f16700Schasinglulu 		.offset = PERIPH_GATE_SHIFT,			\
178*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,			\
179*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |		\
180*91f16700Schasinglulu 			    CLK_SET_RATE_GATE |			\
181*91f16700Schasinglulu 			    CLK_IS_BASIC,			\
182*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,			\
183*91f16700Schasinglulu 		.mult = NA_MULT,				\
184*91f16700Schasinglulu 		.div = NA_DIV,					\
185*91f16700Schasinglulu 	}
186*91f16700Schasinglulu 
187*91f16700Schasinglulu #define IGNORE_UNUSED_GATE					\
188*91f16700Schasinglulu 	{							\
189*91f16700Schasinglulu 		.type = TYPE_GATE,				\
190*91f16700Schasinglulu 		.offset = PERIPH_GATE_SHIFT,			\
191*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,			\
192*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |		\
193*91f16700Schasinglulu 			    CLK_IGNORE_UNUSED |			\
194*91f16700Schasinglulu 			    CLK_IS_BASIC,			\
195*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,			\
196*91f16700Schasinglulu 		.mult = NA_MULT,				\
197*91f16700Schasinglulu 		.div = NA_DIV,					\
198*91f16700Schasinglulu 	}
199*91f16700Schasinglulu 
200*91f16700Schasinglulu /**
201*91f16700Schasinglulu  * struct pm_clock_node - Clock topology node information.
202*91f16700Schasinglulu  * @type: Topology type (mux/div1/div2/gate/pll/fixed factor).
203*91f16700Schasinglulu  * @offset: Offset in control register.
204*91f16700Schasinglulu  * @width: Width of the specific type in control register.
205*91f16700Schasinglulu  * @clkflags: Clk specific flags.
206*91f16700Schasinglulu  * @typeflags: Type specific flags.
207*91f16700Schasinglulu  * @mult: Multiplier for fixed factor.
208*91f16700Schasinglulu  * @div: Divisor for fixed factor.
209*91f16700Schasinglulu  *
210*91f16700Schasinglulu  */
211*91f16700Schasinglulu struct pm_clock_node {
212*91f16700Schasinglulu 	uint16_t clkflags;
213*91f16700Schasinglulu 	uint16_t typeflags;
214*91f16700Schasinglulu 	uint8_t type;
215*91f16700Schasinglulu 	uint8_t offset;
216*91f16700Schasinglulu 	uint8_t width;
217*91f16700Schasinglulu 	uint8_t mult:4;
218*91f16700Schasinglulu 	uint8_t div:4;
219*91f16700Schasinglulu };
220*91f16700Schasinglulu 
221*91f16700Schasinglulu /**
222*91f16700Schasinglulu  * struct pm_clock - Clock structure.
223*91f16700Schasinglulu  * @name: Clock name.
224*91f16700Schasinglulu  * @num_nodes: number of nodes.
225*91f16700Schasinglulu  * @control_reg: Control register address.
226*91f16700Schasinglulu  * @status_reg: Status register address.
227*91f16700Schasinglulu  * @parents: Parents for first clock node. Lower byte indicates parent
228*91f16700Schasinglulu  *           clock id and upper byte indicate flags for that id.
229*91f16700Schasinglulu  * @nodes: Clock nodes.
230*91f16700Schasinglulu  *
231*91f16700Schasinglulu  */
232*91f16700Schasinglulu struct pm_clock {
233*91f16700Schasinglulu 	char name[CLK_NAME_LEN];
234*91f16700Schasinglulu 	uint8_t num_nodes;
235*91f16700Schasinglulu 	uint32_t control_reg;
236*91f16700Schasinglulu 	uint32_t status_reg;
237*91f16700Schasinglulu 	int32_t (*parents)[];
238*91f16700Schasinglulu 	struct pm_clock_node(*nodes)[];
239*91f16700Schasinglulu };
240*91f16700Schasinglulu 
241*91f16700Schasinglulu /**
242*91f16700Schasinglulu  * struct pm_ext_clock - Clock structure.
243*91f16700Schasinglulu  * @name: Clock name.
244*91f16700Schasinglulu  *
245*91f16700Schasinglulu  */
246*91f16700Schasinglulu struct pm_ext_clock {
247*91f16700Schasinglulu 	char name[CLK_NAME_LEN];
248*91f16700Schasinglulu };
249*91f16700Schasinglulu 
250*91f16700Schasinglulu /* PLL Clocks */
251*91f16700Schasinglulu static struct pm_clock_node generic_pll_nodes[] = {
252*91f16700Schasinglulu 	{
253*91f16700Schasinglulu 		.type = TYPE_PLL,
254*91f16700Schasinglulu 		.offset = NA_SHIFT,
255*91f16700Schasinglulu 		.width = NA_WIDTH,
256*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT,
257*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
258*91f16700Schasinglulu 		.mult = NA_MULT,
259*91f16700Schasinglulu 		.div = NA_DIV,
260*91f16700Schasinglulu 	},
261*91f16700Schasinglulu };
262*91f16700Schasinglulu 
263*91f16700Schasinglulu static struct pm_clock_node ignore_unused_pll_nodes[] = {
264*91f16700Schasinglulu 	{
265*91f16700Schasinglulu 		.type = TYPE_PLL,
266*91f16700Schasinglulu 		.offset = NA_SHIFT,
267*91f16700Schasinglulu 		.width = NA_WIDTH,
268*91f16700Schasinglulu 		.clkflags = CLK_IGNORE_UNUSED | CLK_SET_RATE_NO_REPARENT,
269*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
270*91f16700Schasinglulu 		.mult = NA_MULT,
271*91f16700Schasinglulu 		.div = NA_DIV,
272*91f16700Schasinglulu 	},
273*91f16700Schasinglulu };
274*91f16700Schasinglulu 
275*91f16700Schasinglulu static struct pm_clock_node generic_pll_pre_src_nodes[] = {
276*91f16700Schasinglulu 	{
277*91f16700Schasinglulu 		.type = TYPE_MUX,
278*91f16700Schasinglulu 		.offset = PLL_PRESRC_MUX_SHIFT,
279*91f16700Schasinglulu 		.width = PLL_PRESRC_MUX_WIDTH,
280*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
281*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
282*91f16700Schasinglulu 		.mult = NA_MULT,
283*91f16700Schasinglulu 		.div = NA_DIV,
284*91f16700Schasinglulu 	},
285*91f16700Schasinglulu };
286*91f16700Schasinglulu 
287*91f16700Schasinglulu static struct pm_clock_node generic_pll_half_nodes[] = {
288*91f16700Schasinglulu 	{
289*91f16700Schasinglulu 		.type = TYPE_FIXEDFACTOR,
290*91f16700Schasinglulu 		.offset = NA_SHIFT,
291*91f16700Schasinglulu 		.width = NA_WIDTH,
292*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
293*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
294*91f16700Schasinglulu 		.mult = 1,
295*91f16700Schasinglulu 		.div = 2,
296*91f16700Schasinglulu 	},
297*91f16700Schasinglulu };
298*91f16700Schasinglulu 
299*91f16700Schasinglulu static struct pm_clock_node generic_pll_int_nodes[] = {
300*91f16700Schasinglulu 	{
301*91f16700Schasinglulu 		.type = TYPE_MUX,
302*91f16700Schasinglulu 		.offset = PLL_DIV2_MUX_SHIFT,
303*91f16700Schasinglulu 		.width =  PLL_DIV2_MUX_WIDTH,
304*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT |
305*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT |
306*91f16700Schasinglulu 			    CLK_IS_BASIC,
307*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
308*91f16700Schasinglulu 		.mult = NA_MULT,
309*91f16700Schasinglulu 		.div = NA_DIV,
310*91f16700Schasinglulu 	},
311*91f16700Schasinglulu };
312*91f16700Schasinglulu 
313*91f16700Schasinglulu static struct pm_clock_node generic_pll_post_src_nodes[] = {
314*91f16700Schasinglulu 	{
315*91f16700Schasinglulu 		.type = TYPE_MUX,
316*91f16700Schasinglulu 		.offset = PLL_POSTSRC_MUX_SHIFT,
317*91f16700Schasinglulu 		.width = PLL_POSTSRC_MUX_WIDTH,
318*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
319*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
320*91f16700Schasinglulu 		.mult = NA_MULT,
321*91f16700Schasinglulu 		.div = NA_DIV,
322*91f16700Schasinglulu 	},
323*91f16700Schasinglulu };
324*91f16700Schasinglulu 
325*91f16700Schasinglulu static struct pm_clock_node generic_pll_system_nodes[] = {
326*91f16700Schasinglulu 	{
327*91f16700Schasinglulu 		.type = TYPE_MUX,
328*91f16700Schasinglulu 		.offset = PLL_BYPASS_MUX_SHIFT,
329*91f16700Schasinglulu 		.width = PLL_BYPASS_MUX_WIDTH,
330*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT |
331*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT |
332*91f16700Schasinglulu 			    CLK_IS_BASIC,
333*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
334*91f16700Schasinglulu 		.mult = NA_MULT,
335*91f16700Schasinglulu 		.div = NA_DIV,
336*91f16700Schasinglulu 	},
337*91f16700Schasinglulu };
338*91f16700Schasinglulu 
339*91f16700Schasinglulu static struct pm_clock_node acpu_nodes[] = {
340*91f16700Schasinglulu 	{
341*91f16700Schasinglulu 		.type = TYPE_MUX,
342*91f16700Schasinglulu 		.offset = PERIPH_MUX_SHIFT,
343*91f16700Schasinglulu 		.width = PERIPH_MUX_WIDTH,
344*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC,
345*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
346*91f16700Schasinglulu 		.mult = NA_MULT,
347*91f16700Schasinglulu 		.div = NA_DIV,
348*91f16700Schasinglulu 	},
349*91f16700Schasinglulu 	{
350*91f16700Schasinglulu 		.type = TYPE_DIV1,
351*91f16700Schasinglulu 		.offset = PERIPH_DIV1_SHIFT,
352*91f16700Schasinglulu 		.width = PERIPH_DIV1_WIDTH,
353*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
354*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
355*91f16700Schasinglulu 		.mult = NA_MULT,
356*91f16700Schasinglulu 		.div = NA_DIV,
357*91f16700Schasinglulu 	},
358*91f16700Schasinglulu };
359*91f16700Schasinglulu 
360*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_nodes[] = {
361*91f16700Schasinglulu 	GENERIC_MUX,
362*91f16700Schasinglulu 	GENERIC_DIV1,
363*91f16700Schasinglulu };
364*91f16700Schasinglulu 
365*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_gate_nodes[] = {
366*91f16700Schasinglulu 	GENERIC_MUX,
367*91f16700Schasinglulu 	GENERIC_DIV1,
368*91f16700Schasinglulu 	GENERIC_GATE,
369*91f16700Schasinglulu };
370*91f16700Schasinglulu 
371*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_unused_gate_nodes[] = {
372*91f16700Schasinglulu 	GENERIC_MUX,
373*91f16700Schasinglulu 	GENERIC_DIV1,
374*91f16700Schasinglulu 	IGNORE_UNUSED_GATE,
375*91f16700Schasinglulu };
376*91f16700Schasinglulu 
377*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_div_gate_nodes[] = {
378*91f16700Schasinglulu 	GENERIC_MUX,
379*91f16700Schasinglulu 	GENERIC_DIV1,
380*91f16700Schasinglulu 	GENERIC_DIV2,
381*91f16700Schasinglulu 	GENERIC_GATE,
382*91f16700Schasinglulu };
383*91f16700Schasinglulu 
384*91f16700Schasinglulu static struct pm_clock_node dp_audio_video_ref_nodes[] = {
385*91f16700Schasinglulu 	{
386*91f16700Schasinglulu 		.type = TYPE_MUX,
387*91f16700Schasinglulu 		.offset = PERIPH_MUX_SHIFT,
388*91f16700Schasinglulu 		.width = PERIPH_MUX_WIDTH,
389*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT |
390*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT | CLK_IS_BASIC,
391*91f16700Schasinglulu 		.typeflags = CLK_FRAC,
392*91f16700Schasinglulu 		.mult = NA_MULT,
393*91f16700Schasinglulu 		.div = NA_DIV,
394*91f16700Schasinglulu 	},
395*91f16700Schasinglulu 	{
396*91f16700Schasinglulu 		.type = TYPE_DIV1,
397*91f16700Schasinglulu 		.offset = PERIPH_DIV1_SHIFT,
398*91f16700Schasinglulu 		.width = PERIPH_DIV1_WIDTH,
399*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT |
400*91f16700Schasinglulu 			    CLK_IS_BASIC,
401*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO |
402*91f16700Schasinglulu 			     CLK_FRAC,
403*91f16700Schasinglulu 		.mult = NA_MULT,
404*91f16700Schasinglulu 		.div = NA_DIV,
405*91f16700Schasinglulu 	},
406*91f16700Schasinglulu 	{
407*91f16700Schasinglulu 		.type = TYPE_DIV2,
408*91f16700Schasinglulu 		.offset = PERIPH_DIV2_SHIFT,
409*91f16700Schasinglulu 		.width = PERIPH_DIV2_WIDTH,
410*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT |
411*91f16700Schasinglulu 			    CLK_IS_BASIC,
412*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO |
413*91f16700Schasinglulu 			     CLK_FRAC,
414*91f16700Schasinglulu 		.mult = NA_MULT,
415*91f16700Schasinglulu 		.div = NA_DIV,
416*91f16700Schasinglulu 	},
417*91f16700Schasinglulu 	{
418*91f16700Schasinglulu 		.type = TYPE_GATE,
419*91f16700Schasinglulu 		.offset = PERIPH_GATE_SHIFT,
420*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
421*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
422*91f16700Schasinglulu 			    CLK_SET_RATE_GATE |
423*91f16700Schasinglulu 			    CLK_IS_BASIC,
424*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
425*91f16700Schasinglulu 		.mult = NA_MULT,
426*91f16700Schasinglulu 		.div = NA_DIV,
427*91f16700Schasinglulu 	},
428*91f16700Schasinglulu };
429*91f16700Schasinglulu 
430*91f16700Schasinglulu static struct pm_clock_node usb_nodes[] = {
431*91f16700Schasinglulu 	GENERIC_MUX,
432*91f16700Schasinglulu 	GENERIC_DIV1,
433*91f16700Schasinglulu 	GENERIC_DIV2,
434*91f16700Schasinglulu 	{
435*91f16700Schasinglulu 		.type = TYPE_GATE,
436*91f16700Schasinglulu 		.offset = USB_GATE_SHIFT,
437*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
438*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC |
439*91f16700Schasinglulu 			    CLK_SET_RATE_GATE,
440*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
441*91f16700Schasinglulu 		.mult = NA_MULT,
442*91f16700Schasinglulu 		.div = NA_DIV,
443*91f16700Schasinglulu 	},
444*91f16700Schasinglulu };
445*91f16700Schasinglulu 
446*91f16700Schasinglulu static struct pm_clock_node generic_domain_crossing_nodes[] = {
447*91f16700Schasinglulu 	{
448*91f16700Schasinglulu 		.type = TYPE_DIV1,
449*91f16700Schasinglulu 		.offset = 8,
450*91f16700Schasinglulu 		.width = 6,
451*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
452*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
453*91f16700Schasinglulu 		.mult = NA_MULT,
454*91f16700Schasinglulu 		.div = NA_DIV,
455*91f16700Schasinglulu 	},
456*91f16700Schasinglulu };
457*91f16700Schasinglulu 
458*91f16700Schasinglulu static struct pm_clock_node rpll_to_fpd_nodes[] = {
459*91f16700Schasinglulu 	{
460*91f16700Schasinglulu 		.type = TYPE_DIV1,
461*91f16700Schasinglulu 		.offset = 8,
462*91f16700Schasinglulu 		.width = 6,
463*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
464*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
465*91f16700Schasinglulu 		.mult = NA_MULT,
466*91f16700Schasinglulu 		.div = NA_DIV,
467*91f16700Schasinglulu 	},
468*91f16700Schasinglulu };
469*91f16700Schasinglulu 
470*91f16700Schasinglulu static struct pm_clock_node acpu_half_nodes[] = {
471*91f16700Schasinglulu 	{
472*91f16700Schasinglulu 		.type = TYPE_FIXEDFACTOR,
473*91f16700Schasinglulu 		.offset = 0,
474*91f16700Schasinglulu 		.width = 1,
475*91f16700Schasinglulu 		.clkflags = 0,
476*91f16700Schasinglulu 		.typeflags = 0,
477*91f16700Schasinglulu 		.mult = 1,
478*91f16700Schasinglulu 		.div = 2,
479*91f16700Schasinglulu 	},
480*91f16700Schasinglulu 	{
481*91f16700Schasinglulu 		.type = TYPE_GATE,
482*91f16700Schasinglulu 		.offset = 25,
483*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
484*91f16700Schasinglulu 		.clkflags = CLK_IGNORE_UNUSED |
485*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT |
486*91f16700Schasinglulu 			    CLK_IS_BASIC,
487*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
488*91f16700Schasinglulu 		.mult = NA_MULT,
489*91f16700Schasinglulu 		.div = NA_DIV,
490*91f16700Schasinglulu 	},
491*91f16700Schasinglulu };
492*91f16700Schasinglulu 
493*91f16700Schasinglulu static struct pm_clock_node acpu_full_nodes[] = {
494*91f16700Schasinglulu 	{
495*91f16700Schasinglulu 		.type = TYPE_GATE,
496*91f16700Schasinglulu 		.offset = 24,
497*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
498*91f16700Schasinglulu 		.clkflags = CLK_IGNORE_UNUSED |
499*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT |
500*91f16700Schasinglulu 			    CLK_IS_BASIC,
501*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
502*91f16700Schasinglulu 		.mult = NA_MULT,
503*91f16700Schasinglulu 		.div = NA_DIV,
504*91f16700Schasinglulu 	},
505*91f16700Schasinglulu };
506*91f16700Schasinglulu 
507*91f16700Schasinglulu static struct pm_clock_node wdt_nodes[] = {
508*91f16700Schasinglulu 	{
509*91f16700Schasinglulu 		.type = TYPE_MUX,
510*91f16700Schasinglulu 		.offset = 0,
511*91f16700Schasinglulu 		.width = 1,
512*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
513*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
514*91f16700Schasinglulu 			    CLK_IS_BASIC,
515*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
516*91f16700Schasinglulu 		.mult = NA_MULT,
517*91f16700Schasinglulu 		.div = NA_DIV,
518*91f16700Schasinglulu 	},
519*91f16700Schasinglulu };
520*91f16700Schasinglulu 
521*91f16700Schasinglulu static struct pm_clock_node ddr_nodes[] = {
522*91f16700Schasinglulu 	GENERIC_MUX,
523*91f16700Schasinglulu 	{
524*91f16700Schasinglulu 		.type = TYPE_DIV1,
525*91f16700Schasinglulu 		.offset = 8,
526*91f16700Schasinglulu 		.width = 6,
527*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC | CLK_IS_CRITICAL,
528*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
529*91f16700Schasinglulu 		.mult = NA_MULT,
530*91f16700Schasinglulu 		.div = NA_DIV,
531*91f16700Schasinglulu 	},
532*91f16700Schasinglulu };
533*91f16700Schasinglulu 
534*91f16700Schasinglulu static struct pm_clock_node pl_nodes[] = {
535*91f16700Schasinglulu 	GENERIC_MUX,
536*91f16700Schasinglulu 	{
537*91f16700Schasinglulu 		.type = TYPE_DIV1,
538*91f16700Schasinglulu 		.offset = PERIPH_DIV1_SHIFT,
539*91f16700Schasinglulu 		.width = PERIPH_DIV1_WIDTH,
540*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
541*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
542*91f16700Schasinglulu 		.mult = NA_MULT,
543*91f16700Schasinglulu 		.div = NA_DIV,
544*91f16700Schasinglulu 	},
545*91f16700Schasinglulu 	{
546*91f16700Schasinglulu 		.type = TYPE_DIV2,
547*91f16700Schasinglulu 		.offset = PERIPH_DIV2_SHIFT,
548*91f16700Schasinglulu 		.width = PERIPH_DIV2_WIDTH,
549*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC | CLK_SET_RATE_PARENT,
550*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
551*91f16700Schasinglulu 		.mult = NA_MULT,
552*91f16700Schasinglulu 		.div = NA_DIV,
553*91f16700Schasinglulu 	},
554*91f16700Schasinglulu 	{
555*91f16700Schasinglulu 		.type = TYPE_GATE,
556*91f16700Schasinglulu 		.offset = PERIPH_GATE_SHIFT,
557*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
558*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
559*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
560*91f16700Schasinglulu 		.mult = NA_MULT,
561*91f16700Schasinglulu 		.div = NA_DIV,
562*91f16700Schasinglulu 	},
563*91f16700Schasinglulu };
564*91f16700Schasinglulu 
565*91f16700Schasinglulu static struct pm_clock_node gpu_pp0_nodes[] = {
566*91f16700Schasinglulu 	{
567*91f16700Schasinglulu 		.type = TYPE_GATE,
568*91f16700Schasinglulu 		.offset = 25,
569*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
570*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
571*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
572*91f16700Schasinglulu 		.mult = NA_MULT,
573*91f16700Schasinglulu 		.div = NA_DIV,
574*91f16700Schasinglulu 	},
575*91f16700Schasinglulu };
576*91f16700Schasinglulu 
577*91f16700Schasinglulu static struct pm_clock_node gpu_pp1_nodes[] = {
578*91f16700Schasinglulu 	{
579*91f16700Schasinglulu 		.type = TYPE_GATE,
580*91f16700Schasinglulu 		.offset = 26,
581*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
582*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
583*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
584*91f16700Schasinglulu 		.mult = NA_MULT,
585*91f16700Schasinglulu 		.div = NA_DIV,
586*91f16700Schasinglulu 	},
587*91f16700Schasinglulu };
588*91f16700Schasinglulu 
589*91f16700Schasinglulu static struct pm_clock_node gem_ref_ungated_nodes[] = {
590*91f16700Schasinglulu 	GENERIC_MUX,
591*91f16700Schasinglulu 	{
592*91f16700Schasinglulu 		.type = TYPE_DIV1,
593*91f16700Schasinglulu 		.offset = 8,
594*91f16700Schasinglulu 		.width = 6,
595*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC,
596*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
597*91f16700Schasinglulu 		.mult = NA_MULT,
598*91f16700Schasinglulu 		.div = NA_DIV,
599*91f16700Schasinglulu 	},
600*91f16700Schasinglulu 	{
601*91f16700Schasinglulu 		.type = TYPE_DIV2,
602*91f16700Schasinglulu 		.offset = 16,
603*91f16700Schasinglulu 		.width = 6,
604*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC |
605*91f16700Schasinglulu 			    CLK_SET_RATE_PARENT,
606*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
607*91f16700Schasinglulu 		.mult = NA_MULT,
608*91f16700Schasinglulu 		.div = NA_DIV,
609*91f16700Schasinglulu 	},
610*91f16700Schasinglulu };
611*91f16700Schasinglulu 
612*91f16700Schasinglulu static struct pm_clock_node gem0_ref_nodes[] = {
613*91f16700Schasinglulu 	{
614*91f16700Schasinglulu 		.type = TYPE_MUX,
615*91f16700Schasinglulu 		.offset = 1,
616*91f16700Schasinglulu 		.width = 1,
617*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
618*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
619*91f16700Schasinglulu 			    CLK_IS_BASIC,
620*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
621*91f16700Schasinglulu 		.mult = NA_MULT,
622*91f16700Schasinglulu 		.div = NA_DIV,
623*91f16700Schasinglulu 	},
624*91f16700Schasinglulu };
625*91f16700Schasinglulu 
626*91f16700Schasinglulu static struct pm_clock_node gem1_ref_nodes[] = {
627*91f16700Schasinglulu 	{
628*91f16700Schasinglulu 		.type = TYPE_MUX,
629*91f16700Schasinglulu 		.offset = 6,
630*91f16700Schasinglulu 		.width = 1,
631*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
632*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
633*91f16700Schasinglulu 			    CLK_IS_BASIC,
634*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
635*91f16700Schasinglulu 		.mult = NA_MULT,
636*91f16700Schasinglulu 		.div = NA_DIV,
637*91f16700Schasinglulu 	},
638*91f16700Schasinglulu };
639*91f16700Schasinglulu 
640*91f16700Schasinglulu static struct pm_clock_node gem2_ref_nodes[] = {
641*91f16700Schasinglulu 	{
642*91f16700Schasinglulu 		.type = TYPE_MUX,
643*91f16700Schasinglulu 		.offset = 11,
644*91f16700Schasinglulu 		.width = 1,
645*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
646*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
647*91f16700Schasinglulu 			    CLK_IS_BASIC,
648*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
649*91f16700Schasinglulu 		.mult = NA_MULT,
650*91f16700Schasinglulu 		.div = NA_DIV,
651*91f16700Schasinglulu 	},
652*91f16700Schasinglulu };
653*91f16700Schasinglulu 
654*91f16700Schasinglulu static struct pm_clock_node gem3_ref_nodes[] = {
655*91f16700Schasinglulu 	{
656*91f16700Schasinglulu 		.type = TYPE_MUX,
657*91f16700Schasinglulu 		.offset = 16,
658*91f16700Schasinglulu 		.width = 1,
659*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
660*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
661*91f16700Schasinglulu 			    CLK_IS_BASIC,
662*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
663*91f16700Schasinglulu 		.mult = NA_MULT,
664*91f16700Schasinglulu 		.div = NA_DIV,
665*91f16700Schasinglulu 	},
666*91f16700Schasinglulu };
667*91f16700Schasinglulu 
668*91f16700Schasinglulu static struct pm_clock_node gem_tx_nodes[] = {
669*91f16700Schasinglulu 	{
670*91f16700Schasinglulu 		.type = TYPE_GATE,
671*91f16700Schasinglulu 		.offset = 25,
672*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
673*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
674*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
675*91f16700Schasinglulu 		.mult = NA_MULT,
676*91f16700Schasinglulu 		.div = NA_DIV,
677*91f16700Schasinglulu 	},
678*91f16700Schasinglulu };
679*91f16700Schasinglulu 
680*91f16700Schasinglulu static struct pm_clock_node gem_rx_nodes[] = {
681*91f16700Schasinglulu 	{
682*91f16700Schasinglulu 		.type = TYPE_GATE,
683*91f16700Schasinglulu 		.offset = 26,
684*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
685*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
686*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
687*91f16700Schasinglulu 		.mult = NA_MULT,
688*91f16700Schasinglulu 		.div = NA_DIV,
689*91f16700Schasinglulu 	},
690*91f16700Schasinglulu };
691*91f16700Schasinglulu 
692*91f16700Schasinglulu static struct pm_clock_node gem_tsu_nodes[] = {
693*91f16700Schasinglulu 	{
694*91f16700Schasinglulu 		.type = TYPE_MUX,
695*91f16700Schasinglulu 		.offset = 20,
696*91f16700Schasinglulu 		.width = 2,
697*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
698*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
699*91f16700Schasinglulu 			    CLK_IS_BASIC,
700*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
701*91f16700Schasinglulu 		.mult = NA_MULT,
702*91f16700Schasinglulu 		.div = NA_DIV,
703*91f16700Schasinglulu 	},
704*91f16700Schasinglulu };
705*91f16700Schasinglulu 
706*91f16700Schasinglulu static struct pm_clock_node can0_mio_nodes[] = {
707*91f16700Schasinglulu 	{
708*91f16700Schasinglulu 		.type = TYPE_MUX,
709*91f16700Schasinglulu 		.offset = 0,
710*91f16700Schasinglulu 		.width = 7,
711*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
712*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
713*91f16700Schasinglulu 			    CLK_IS_BASIC,
714*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
715*91f16700Schasinglulu 		.mult = NA_MULT,
716*91f16700Schasinglulu 		.div = NA_DIV,
717*91f16700Schasinglulu 	},
718*91f16700Schasinglulu };
719*91f16700Schasinglulu 
720*91f16700Schasinglulu static struct pm_clock_node can1_mio_nodes[] = {
721*91f16700Schasinglulu 	{
722*91f16700Schasinglulu 		.type = TYPE_MUX,
723*91f16700Schasinglulu 		.offset = 15,
724*91f16700Schasinglulu 		.width = 1,
725*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
726*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
727*91f16700Schasinglulu 			    CLK_IS_BASIC,
728*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
729*91f16700Schasinglulu 		.mult = NA_MULT,
730*91f16700Schasinglulu 		.div = NA_DIV,
731*91f16700Schasinglulu 	},
732*91f16700Schasinglulu };
733*91f16700Schasinglulu 
734*91f16700Schasinglulu static struct pm_clock_node can0_nodes[] = {
735*91f16700Schasinglulu 	{
736*91f16700Schasinglulu 		.type = TYPE_MUX,
737*91f16700Schasinglulu 		.offset = 7,
738*91f16700Schasinglulu 		.width = 1,
739*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
740*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
741*91f16700Schasinglulu 			    CLK_IS_BASIC,
742*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
743*91f16700Schasinglulu 		.mult = NA_MULT,
744*91f16700Schasinglulu 		.div = NA_DIV,
745*91f16700Schasinglulu 	},
746*91f16700Schasinglulu };
747*91f16700Schasinglulu 
748*91f16700Schasinglulu static struct pm_clock_node can1_nodes[] = {
749*91f16700Schasinglulu 	{
750*91f16700Schasinglulu 		.type = TYPE_MUX,
751*91f16700Schasinglulu 		.offset = 22,
752*91f16700Schasinglulu 		.width = 1,
753*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
754*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
755*91f16700Schasinglulu 			    CLK_IS_BASIC,
756*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
757*91f16700Schasinglulu 		.mult = NA_MULT,
758*91f16700Schasinglulu 		.div = NA_DIV,
759*91f16700Schasinglulu 	},
760*91f16700Schasinglulu };
761*91f16700Schasinglulu 
762*91f16700Schasinglulu static struct pm_clock_node cpu_r5_core_nodes[] = {
763*91f16700Schasinglulu 	{
764*91f16700Schasinglulu 		.type = TYPE_GATE,
765*91f16700Schasinglulu 		.offset = 25,
766*91f16700Schasinglulu 		.width = PERIPH_GATE_WIDTH,
767*91f16700Schasinglulu 		.clkflags = CLK_IGNORE_UNUSED |
768*91f16700Schasinglulu 			    CLK_IS_BASIC,
769*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
770*91f16700Schasinglulu 		.mult = NA_MULT,
771*91f16700Schasinglulu 		.div = NA_DIV,
772*91f16700Schasinglulu 	},
773*91f16700Schasinglulu };
774*91f16700Schasinglulu 
775*91f16700Schasinglulu static struct pm_clock_node dll_ref_nodes[] = {
776*91f16700Schasinglulu 	{
777*91f16700Schasinglulu 		.type = TYPE_MUX,
778*91f16700Schasinglulu 		.offset = 0,
779*91f16700Schasinglulu 		.width = 3,
780*91f16700Schasinglulu 		.clkflags = CLK_SET_RATE_PARENT |
781*91f16700Schasinglulu 			    CLK_SET_RATE_NO_REPARENT |
782*91f16700Schasinglulu 			    CLK_IS_BASIC,
783*91f16700Schasinglulu 		.typeflags = NA_TYPE_FLAGS,
784*91f16700Schasinglulu 		.mult = NA_MULT,
785*91f16700Schasinglulu 		.div = NA_DIV,
786*91f16700Schasinglulu 	},
787*91f16700Schasinglulu };
788*91f16700Schasinglulu 
789*91f16700Schasinglulu static struct pm_clock_node timestamp_ref_nodes[] = {
790*91f16700Schasinglulu 	GENERIC_MUX,
791*91f16700Schasinglulu 	{
792*91f16700Schasinglulu 		.type = TYPE_DIV1,
793*91f16700Schasinglulu 		.offset = 8,
794*91f16700Schasinglulu 		.width = 6,
795*91f16700Schasinglulu 		.clkflags = CLK_IS_BASIC,
796*91f16700Schasinglulu 		.typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
797*91f16700Schasinglulu 		.mult = NA_MULT,
798*91f16700Schasinglulu 		.div = NA_DIV,
799*91f16700Schasinglulu 	},
800*91f16700Schasinglulu 	IGNORE_UNUSED_GATE,
801*91f16700Schasinglulu };
802*91f16700Schasinglulu 
803*91f16700Schasinglulu static int32_t can_mio_parents[] = {
804*91f16700Schasinglulu 	EXT_CLK_MIO0, EXT_CLK_MIO1, EXT_CLK_MIO2, EXT_CLK_MIO3,
805*91f16700Schasinglulu 	EXT_CLK_MIO4, EXT_CLK_MIO5, EXT_CLK_MIO6, EXT_CLK_MIO7,
806*91f16700Schasinglulu 	EXT_CLK_MIO8, EXT_CLK_MIO9, EXT_CLK_MIO10, EXT_CLK_MIO11,
807*91f16700Schasinglulu 	EXT_CLK_MIO12, EXT_CLK_MIO13, EXT_CLK_MIO14, EXT_CLK_MIO15,
808*91f16700Schasinglulu 	EXT_CLK_MIO16, EXT_CLK_MIO17, EXT_CLK_MIO18, EXT_CLK_MIO19,
809*91f16700Schasinglulu 	EXT_CLK_MIO20, EXT_CLK_MIO21, EXT_CLK_MIO22, EXT_CLK_MIO23,
810*91f16700Schasinglulu 	EXT_CLK_MIO24, EXT_CLK_MIO25, EXT_CLK_MIO26, EXT_CLK_MIO27,
811*91f16700Schasinglulu 	EXT_CLK_MIO28, EXT_CLK_MIO29, EXT_CLK_MIO30, EXT_CLK_MIO31,
812*91f16700Schasinglulu 	EXT_CLK_MIO32, EXT_CLK_MIO33, EXT_CLK_MIO34, EXT_CLK_MIO35,
813*91f16700Schasinglulu 	EXT_CLK_MIO36, EXT_CLK_MIO37, EXT_CLK_MIO38, EXT_CLK_MIO39,
814*91f16700Schasinglulu 	EXT_CLK_MIO40, EXT_CLK_MIO41, EXT_CLK_MIO42, EXT_CLK_MIO43,
815*91f16700Schasinglulu 	EXT_CLK_MIO44, EXT_CLK_MIO45, EXT_CLK_MIO46, EXT_CLK_MIO47,
816*91f16700Schasinglulu 	EXT_CLK_MIO48, EXT_CLK_MIO49, EXT_CLK_MIO50, EXT_CLK_MIO51,
817*91f16700Schasinglulu 	EXT_CLK_MIO52, EXT_CLK_MIO53, EXT_CLK_MIO54, EXT_CLK_MIO55,
818*91f16700Schasinglulu 	EXT_CLK_MIO56, EXT_CLK_MIO57, EXT_CLK_MIO58, EXT_CLK_MIO59,
819*91f16700Schasinglulu 	EXT_CLK_MIO60, EXT_CLK_MIO61, EXT_CLK_MIO62, EXT_CLK_MIO63,
820*91f16700Schasinglulu 	EXT_CLK_MIO64, EXT_CLK_MIO65, EXT_CLK_MIO66, EXT_CLK_MIO67,
821*91f16700Schasinglulu 	EXT_CLK_MIO68, EXT_CLK_MIO69, EXT_CLK_MIO70, EXT_CLK_MIO71,
822*91f16700Schasinglulu 	EXT_CLK_MIO72, EXT_CLK_MIO73, EXT_CLK_MIO74, EXT_CLK_MIO75,
823*91f16700Schasinglulu 	EXT_CLK_MIO76, EXT_CLK_MIO77, CLK_NA_PARENT
824*91f16700Schasinglulu };
825*91f16700Schasinglulu 
826*91f16700Schasinglulu /* Clock array containing clock informaton */
827*91f16700Schasinglulu static struct pm_clock clocks[] = {
828*91f16700Schasinglulu 	[CLK_APLL_INT] = {
829*91f16700Schasinglulu 		.name = "apll_int",
830*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_CTRL,
831*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
832*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_APLL_PRE_SRC, CLK_NA_PARENT}),
833*91f16700Schasinglulu 		.nodes = &ignore_unused_pll_nodes,
834*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(ignore_unused_pll_nodes),
835*91f16700Schasinglulu 	},
836*91f16700Schasinglulu 	[CLK_APLL_PRE_SRC] = {
837*91f16700Schasinglulu 		.name = "apll_pre_src",
838*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_CTRL,
839*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
840*91f16700Schasinglulu 		.parents = &((int32_t []) {
841*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
842*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
843*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
844*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
845*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
846*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
847*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
848*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
849*91f16700Schasinglulu 			CLK_NA_PARENT
850*91f16700Schasinglulu 		}),
851*91f16700Schasinglulu 		.nodes = &generic_pll_pre_src_nodes,
852*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
853*91f16700Schasinglulu 	},
854*91f16700Schasinglulu 	[CLK_APLL_HALF] = {
855*91f16700Schasinglulu 		.name = "apll_half",
856*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_CTRL,
857*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
858*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_APLL_INT, CLK_NA_PARENT}),
859*91f16700Schasinglulu 		.nodes = &generic_pll_half_nodes,
860*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
861*91f16700Schasinglulu 	},
862*91f16700Schasinglulu 	[CLK_APLL_INT_MUX] = {
863*91f16700Schasinglulu 		.name = "apll_int_mux",
864*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_CTRL,
865*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
866*91f16700Schasinglulu 		.parents = &((int32_t []) {
867*91f16700Schasinglulu 			CLK_APLL_INT,
868*91f16700Schasinglulu 			CLK_APLL_HALF,
869*91f16700Schasinglulu 			CLK_NA_PARENT
870*91f16700Schasinglulu 		}),
871*91f16700Schasinglulu 		.nodes = &generic_pll_int_nodes,
872*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
873*91f16700Schasinglulu 	},
874*91f16700Schasinglulu 	[CLK_APLL_POST_SRC] = {
875*91f16700Schasinglulu 		.name = "apll_post_src",
876*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_CTRL,
877*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
878*91f16700Schasinglulu 		.parents = &((int32_t []) {
879*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
880*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
881*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
882*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
883*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
884*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
885*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
886*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
887*91f16700Schasinglulu 			CLK_NA_PARENT
888*91f16700Schasinglulu 		}),
889*91f16700Schasinglulu 		.nodes = &generic_pll_post_src_nodes,
890*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
891*91f16700Schasinglulu 	},
892*91f16700Schasinglulu 	[CLK_APLL] = {
893*91f16700Schasinglulu 		.name = "apll",
894*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_CTRL,
895*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
896*91f16700Schasinglulu 		.parents = &((int32_t []) {
897*91f16700Schasinglulu 			CLK_APLL_INT_MUX,
898*91f16700Schasinglulu 			CLK_APLL_POST_SRC,
899*91f16700Schasinglulu 			CLK_NA_PARENT
900*91f16700Schasinglulu 		}),
901*91f16700Schasinglulu 		.nodes = &generic_pll_system_nodes,
902*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
903*91f16700Schasinglulu 	},
904*91f16700Schasinglulu 	[CLK_DPLL_INT] = {
905*91f16700Schasinglulu 		.name = "dpll_int",
906*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_CTRL,
907*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
908*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_DPLL_PRE_SRC, CLK_NA_PARENT}),
909*91f16700Schasinglulu 		.nodes = &generic_pll_nodes,
910*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_nodes),
911*91f16700Schasinglulu 	},
912*91f16700Schasinglulu 	[CLK_DPLL_PRE_SRC] = {
913*91f16700Schasinglulu 		.name = "dpll_pre_src",
914*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_CTRL,
915*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
916*91f16700Schasinglulu 		.parents = &((int32_t []) {
917*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
918*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
919*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
920*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
921*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
922*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
923*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
924*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
925*91f16700Schasinglulu 			CLK_NA_PARENT
926*91f16700Schasinglulu 		}),
927*91f16700Schasinglulu 		.nodes = &generic_pll_pre_src_nodes,
928*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
929*91f16700Schasinglulu 	},
930*91f16700Schasinglulu 	[CLK_DPLL_HALF] = {
931*91f16700Schasinglulu 		.name = "dpll_half",
932*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_CTRL,
933*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
934*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_DPLL_INT, CLK_NA_PARENT}),
935*91f16700Schasinglulu 		.nodes = &generic_pll_half_nodes,
936*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
937*91f16700Schasinglulu 	},
938*91f16700Schasinglulu 	[CLK_DPLL_INT_MUX] = {
939*91f16700Schasinglulu 		.name = "dpll_int_mux",
940*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_CTRL,
941*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
942*91f16700Schasinglulu 		.parents = &((int32_t []) {
943*91f16700Schasinglulu 			CLK_DPLL_INT,
944*91f16700Schasinglulu 			CLK_DPLL_HALF,
945*91f16700Schasinglulu 			CLK_NA_PARENT
946*91f16700Schasinglulu 		}),
947*91f16700Schasinglulu 		.nodes = &generic_pll_int_nodes,
948*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
949*91f16700Schasinglulu 	},
950*91f16700Schasinglulu 	[CLK_DPLL_POST_SRC] = {
951*91f16700Schasinglulu 		.name = "dpll_post_src",
952*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_CTRL,
953*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
954*91f16700Schasinglulu 		.parents = &((int32_t []) {
955*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
956*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
957*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
958*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
959*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
960*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
961*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
962*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
963*91f16700Schasinglulu 			CLK_NA_PARENT
964*91f16700Schasinglulu 		}),
965*91f16700Schasinglulu 		.nodes = &generic_pll_post_src_nodes,
966*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
967*91f16700Schasinglulu 	},
968*91f16700Schasinglulu 	[CLK_DPLL] = {
969*91f16700Schasinglulu 		.name = "dpll",
970*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_CTRL,
971*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
972*91f16700Schasinglulu 		.parents = &((int32_t []) {
973*91f16700Schasinglulu 			CLK_DPLL_INT_MUX,
974*91f16700Schasinglulu 			CLK_DPLL_POST_SRC,
975*91f16700Schasinglulu 			CLK_NA_PARENT
976*91f16700Schasinglulu 		}),
977*91f16700Schasinglulu 		.nodes = &generic_pll_system_nodes,
978*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
979*91f16700Schasinglulu 	},
980*91f16700Schasinglulu 	[CLK_VPLL_INT] = {
981*91f16700Schasinglulu 		.name = "vpll_int",
982*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_CTRL,
983*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
984*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_VPLL_PRE_SRC, CLK_NA_PARENT}),
985*91f16700Schasinglulu 		.nodes = &ignore_unused_pll_nodes,
986*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(ignore_unused_pll_nodes),
987*91f16700Schasinglulu 	},
988*91f16700Schasinglulu 	[CLK_VPLL_PRE_SRC] = {
989*91f16700Schasinglulu 		.name = "vpll_pre_src",
990*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_CTRL,
991*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
992*91f16700Schasinglulu 		.parents = &((int32_t []) {
993*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
994*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
995*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
996*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
997*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
998*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
999*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1000*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1001*91f16700Schasinglulu 			CLK_NA_PARENT
1002*91f16700Schasinglulu 		}),
1003*91f16700Schasinglulu 		.nodes = &generic_pll_pre_src_nodes,
1004*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
1005*91f16700Schasinglulu 	},
1006*91f16700Schasinglulu 	[CLK_VPLL_HALF] = {
1007*91f16700Schasinglulu 		.name = "vpll_half",
1008*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_CTRL,
1009*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1010*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_VPLL_INT, CLK_NA_PARENT}),
1011*91f16700Schasinglulu 		.nodes = &generic_pll_half_nodes,
1012*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
1013*91f16700Schasinglulu 	},
1014*91f16700Schasinglulu 	[CLK_VPLL_INT_MUX] = {
1015*91f16700Schasinglulu 		.name = "vpll_int_mux",
1016*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_CTRL,
1017*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1018*91f16700Schasinglulu 		.parents = &((int32_t []) {
1019*91f16700Schasinglulu 			CLK_VPLL_INT,
1020*91f16700Schasinglulu 			CLK_VPLL_HALF,
1021*91f16700Schasinglulu 			CLK_NA_PARENT
1022*91f16700Schasinglulu 		}),
1023*91f16700Schasinglulu 		.nodes = &generic_pll_int_nodes,
1024*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
1025*91f16700Schasinglulu 	},
1026*91f16700Schasinglulu 	[CLK_VPLL_POST_SRC] = {
1027*91f16700Schasinglulu 		.name = "vpll_post_src",
1028*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_CTRL,
1029*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1030*91f16700Schasinglulu 		.parents = &((int32_t []) {
1031*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1032*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1033*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1034*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1035*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1036*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1037*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1038*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1039*91f16700Schasinglulu 			CLK_NA_PARENT
1040*91f16700Schasinglulu 		}),
1041*91f16700Schasinglulu 		.nodes = &generic_pll_post_src_nodes,
1042*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
1043*91f16700Schasinglulu 	},
1044*91f16700Schasinglulu 	[CLK_VPLL] = {
1045*91f16700Schasinglulu 		.name = "vpll",
1046*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_CTRL,
1047*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1048*91f16700Schasinglulu 		.parents = &((int32_t []) {
1049*91f16700Schasinglulu 			CLK_VPLL_INT_MUX,
1050*91f16700Schasinglulu 			CLK_VPLL_POST_SRC,
1051*91f16700Schasinglulu 			CLK_NA_PARENT
1052*91f16700Schasinglulu 		}),
1053*91f16700Schasinglulu 		.nodes = &generic_pll_system_nodes,
1054*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
1055*91f16700Schasinglulu 	},
1056*91f16700Schasinglulu 	[CLK_IOPLL_INT] = {
1057*91f16700Schasinglulu 		.name = "iopll_int",
1058*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_CTRL,
1059*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1060*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_IOPLL_PRE_SRC, CLK_NA_PARENT}),
1061*91f16700Schasinglulu 		.nodes = &generic_pll_nodes,
1062*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_nodes),
1063*91f16700Schasinglulu 	},
1064*91f16700Schasinglulu 	[CLK_IOPLL_PRE_SRC] = {
1065*91f16700Schasinglulu 		.name = "iopll_pre_src",
1066*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_CTRL,
1067*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1068*91f16700Schasinglulu 		.parents = &((int32_t []) {
1069*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1070*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1071*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1072*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1073*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1074*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1075*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1076*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1077*91f16700Schasinglulu 			CLK_NA_PARENT
1078*91f16700Schasinglulu 		}),
1079*91f16700Schasinglulu 		.nodes = &generic_pll_pre_src_nodes,
1080*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
1081*91f16700Schasinglulu 	},
1082*91f16700Schasinglulu 	[CLK_IOPLL_HALF] = {
1083*91f16700Schasinglulu 		.name = "iopll_half",
1084*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_CTRL,
1085*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1086*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_IOPLL_INT, CLK_NA_PARENT}),
1087*91f16700Schasinglulu 		.nodes = &generic_pll_half_nodes,
1088*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
1089*91f16700Schasinglulu 	},
1090*91f16700Schasinglulu 	[CLK_IOPLL_INT_MUX] = {
1091*91f16700Schasinglulu 		.name = "iopll_int_mux",
1092*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_CTRL,
1093*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1094*91f16700Schasinglulu 		.parents = &((int32_t []) {
1095*91f16700Schasinglulu 			CLK_IOPLL_INT,
1096*91f16700Schasinglulu 			CLK_IOPLL_HALF,
1097*91f16700Schasinglulu 			CLK_NA_PARENT
1098*91f16700Schasinglulu 		}),
1099*91f16700Schasinglulu 		.nodes = &generic_pll_int_nodes,
1100*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
1101*91f16700Schasinglulu 	},
1102*91f16700Schasinglulu 	[CLK_IOPLL_POST_SRC] = {
1103*91f16700Schasinglulu 		.name = "iopll_post_src",
1104*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_CTRL,
1105*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1106*91f16700Schasinglulu 		.parents = &((int32_t []) {
1107*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1108*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1109*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1110*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1111*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1112*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1113*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1114*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1115*91f16700Schasinglulu 			CLK_NA_PARENT
1116*91f16700Schasinglulu 		}),
1117*91f16700Schasinglulu 		.nodes = &generic_pll_post_src_nodes,
1118*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
1119*91f16700Schasinglulu 	},
1120*91f16700Schasinglulu 	[CLK_IOPLL] = {
1121*91f16700Schasinglulu 		.name = "iopll",
1122*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_CTRL,
1123*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1124*91f16700Schasinglulu 		.parents = &((int32_t []) {
1125*91f16700Schasinglulu 			CLK_IOPLL_INT_MUX,
1126*91f16700Schasinglulu 			CLK_IOPLL_POST_SRC,
1127*91f16700Schasinglulu 			CLK_NA_PARENT
1128*91f16700Schasinglulu 		}),
1129*91f16700Schasinglulu 		.nodes = &generic_pll_system_nodes,
1130*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
1131*91f16700Schasinglulu 	},
1132*91f16700Schasinglulu 	[CLK_RPLL_INT] = {
1133*91f16700Schasinglulu 		.name = "rpll_int",
1134*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_CTRL,
1135*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1136*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_RPLL_PRE_SRC, CLK_NA_PARENT}),
1137*91f16700Schasinglulu 		.nodes = &generic_pll_nodes,
1138*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_nodes),
1139*91f16700Schasinglulu 	},
1140*91f16700Schasinglulu 	[CLK_RPLL_PRE_SRC] = {
1141*91f16700Schasinglulu 		.name = "rpll_pre_src",
1142*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_CTRL,
1143*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1144*91f16700Schasinglulu 		.parents = &((int32_t []) {
1145*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1146*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1147*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1148*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1149*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1150*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1151*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1152*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1153*91f16700Schasinglulu 			CLK_NA_PARENT
1154*91f16700Schasinglulu 		}),
1155*91f16700Schasinglulu 
1156*91f16700Schasinglulu 		.nodes = &generic_pll_pre_src_nodes,
1157*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
1158*91f16700Schasinglulu 	},
1159*91f16700Schasinglulu 	[CLK_RPLL_HALF] = {
1160*91f16700Schasinglulu 		.name = "rpll_half",
1161*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_CTRL,
1162*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1163*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_RPLL_INT, CLK_NA_PARENT}),
1164*91f16700Schasinglulu 		.nodes = &generic_pll_half_nodes,
1165*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
1166*91f16700Schasinglulu 	},
1167*91f16700Schasinglulu 	[CLK_RPLL_INT_MUX] = {
1168*91f16700Schasinglulu 		.name = "rpll_int_mux",
1169*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_CTRL,
1170*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1171*91f16700Schasinglulu 		.parents = &((int32_t []) {
1172*91f16700Schasinglulu 			CLK_RPLL_INT,
1173*91f16700Schasinglulu 			CLK_RPLL_HALF,
1174*91f16700Schasinglulu 			CLK_NA_PARENT
1175*91f16700Schasinglulu 		}),
1176*91f16700Schasinglulu 		.nodes = &generic_pll_int_nodes,
1177*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
1178*91f16700Schasinglulu 	},
1179*91f16700Schasinglulu 	[CLK_RPLL_POST_SRC] = {
1180*91f16700Schasinglulu 		.name = "rpll_post_src",
1181*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_CTRL,
1182*91f16700Schasinglulu 		.status_reg = CRF_APB_PLL_STATUS,
1183*91f16700Schasinglulu 		.parents = &((int32_t []) {
1184*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1185*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1186*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1187*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1188*91f16700Schasinglulu 			EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1189*91f16700Schasinglulu 			EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1190*91f16700Schasinglulu 			EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1191*91f16700Schasinglulu 			EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1192*91f16700Schasinglulu 			CLK_NA_PARENT
1193*91f16700Schasinglulu 		}),
1194*91f16700Schasinglulu 		.nodes = &generic_pll_post_src_nodes,
1195*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
1196*91f16700Schasinglulu 	},
1197*91f16700Schasinglulu 	[CLK_RPLL] = {
1198*91f16700Schasinglulu 		.name = "rpll",
1199*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_CTRL,
1200*91f16700Schasinglulu 		.status_reg = CRL_APB_PLL_STATUS,
1201*91f16700Schasinglulu 		.parents = &((int32_t []) {
1202*91f16700Schasinglulu 			CLK_RPLL_INT_MUX,
1203*91f16700Schasinglulu 			CLK_RPLL_POST_SRC,
1204*91f16700Schasinglulu 			CLK_NA_PARENT
1205*91f16700Schasinglulu 		}),
1206*91f16700Schasinglulu 		.nodes = &generic_pll_system_nodes,
1207*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
1208*91f16700Schasinglulu 	},
1209*91f16700Schasinglulu 	/* Peripheral Clocks */
1210*91f16700Schasinglulu 	[CLK_ACPU] = {
1211*91f16700Schasinglulu 		.name = "acpu",
1212*91f16700Schasinglulu 		.control_reg = CRF_APB_ACPU_CTRL,
1213*91f16700Schasinglulu 		.status_reg = 0,
1214*91f16700Schasinglulu 		.parents = &((int32_t []) {
1215*91f16700Schasinglulu 			CLK_APLL,
1216*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1217*91f16700Schasinglulu 			CLK_DPLL,
1218*91f16700Schasinglulu 			CLK_VPLL,
1219*91f16700Schasinglulu 			CLK_NA_PARENT
1220*91f16700Schasinglulu 		}),
1221*91f16700Schasinglulu 		.nodes = &acpu_nodes,
1222*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(acpu_nodes),
1223*91f16700Schasinglulu 	},
1224*91f16700Schasinglulu 	[CLK_ACPU_FULL] = {
1225*91f16700Schasinglulu 		.name = "acpu_full",
1226*91f16700Schasinglulu 		.control_reg = CRF_APB_ACPU_CTRL,
1227*91f16700Schasinglulu 		.status_reg = 0,
1228*91f16700Schasinglulu 		.parents = &((int32_t []) {
1229*91f16700Schasinglulu 			CLK_ACPU | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
1230*91f16700Schasinglulu 			CLK_NA_PARENT
1231*91f16700Schasinglulu 		}),
1232*91f16700Schasinglulu 		.nodes = &acpu_full_nodes,
1233*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(acpu_full_nodes),
1234*91f16700Schasinglulu 	},
1235*91f16700Schasinglulu 	[CLK_DBG_TRACE] = {
1236*91f16700Schasinglulu 		.name = "dbg_trace",
1237*91f16700Schasinglulu 		.control_reg = CRF_APB_DBG_TRACE_CTRL,
1238*91f16700Schasinglulu 		.status_reg = 0,
1239*91f16700Schasinglulu 		.parents = &((int32_t []) {
1240*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1241*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1242*91f16700Schasinglulu 			CLK_DPLL,
1243*91f16700Schasinglulu 			CLK_APLL,
1244*91f16700Schasinglulu 			CLK_NA_PARENT
1245*91f16700Schasinglulu 		}),
1246*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1247*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1248*91f16700Schasinglulu 	},
1249*91f16700Schasinglulu 	[CLK_DBG_FPD] = {
1250*91f16700Schasinglulu 		.name = "dbg_fpd",
1251*91f16700Schasinglulu 		.control_reg = CRF_APB_DBG_FPD_CTRL,
1252*91f16700Schasinglulu 		.status_reg = 0,
1253*91f16700Schasinglulu 		.parents = &((int32_t []) {
1254*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1255*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1256*91f16700Schasinglulu 			CLK_DPLL,
1257*91f16700Schasinglulu 			CLK_APLL,
1258*91f16700Schasinglulu 			CLK_NA_PARENT
1259*91f16700Schasinglulu 		}),
1260*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1261*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1262*91f16700Schasinglulu 	},
1263*91f16700Schasinglulu 	[CLK_DBG_TSTMP] = {
1264*91f16700Schasinglulu 		.name = "dbg_tstmp",
1265*91f16700Schasinglulu 		.control_reg = CRF_APB_DBG_TSTMP_CTRL,
1266*91f16700Schasinglulu 		.status_reg = 0,
1267*91f16700Schasinglulu 		.parents = &((int32_t []) {
1268*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1269*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1270*91f16700Schasinglulu 			CLK_DPLL,
1271*91f16700Schasinglulu 			CLK_APLL,
1272*91f16700Schasinglulu 			CLK_NA_PARENT
1273*91f16700Schasinglulu 		}),
1274*91f16700Schasinglulu 		.nodes = &generic_mux_div_nodes,
1275*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_nodes),
1276*91f16700Schasinglulu 	},
1277*91f16700Schasinglulu 	[CLK_DP_VIDEO_REF] = {
1278*91f16700Schasinglulu 		.name = "dp_video_ref",
1279*91f16700Schasinglulu 		.control_reg = CRF_APB_DP_VIDEO_REF_CTRL,
1280*91f16700Schasinglulu 		.status_reg = 0,
1281*91f16700Schasinglulu 		.parents = &((int32_t []) {
1282*91f16700Schasinglulu 			CLK_VPLL,
1283*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1284*91f16700Schasinglulu 			CLK_DPLL,
1285*91f16700Schasinglulu 			CLK_RPLL_TO_FPD,
1286*91f16700Schasinglulu 			CLK_NA_PARENT
1287*91f16700Schasinglulu 		}),
1288*91f16700Schasinglulu 		.nodes = &dp_audio_video_ref_nodes,
1289*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(dp_audio_video_ref_nodes),
1290*91f16700Schasinglulu 	},
1291*91f16700Schasinglulu 	[CLK_DP_AUDIO_REF] = {
1292*91f16700Schasinglulu 		.name = "dp_audio_ref",
1293*91f16700Schasinglulu 		.control_reg = CRF_APB_DP_AUDIO_REF_CTRL,
1294*91f16700Schasinglulu 		.status_reg = 0,
1295*91f16700Schasinglulu 		.parents = &((int32_t []) {
1296*91f16700Schasinglulu 			CLK_VPLL,
1297*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1298*91f16700Schasinglulu 			CLK_DPLL,
1299*91f16700Schasinglulu 			CLK_RPLL_TO_FPD,
1300*91f16700Schasinglulu 			CLK_NA_PARENT
1301*91f16700Schasinglulu 		}),
1302*91f16700Schasinglulu 		.nodes = &dp_audio_video_ref_nodes,
1303*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(dp_audio_video_ref_nodes),
1304*91f16700Schasinglulu 	},
1305*91f16700Schasinglulu 	[CLK_DP_STC_REF] = {
1306*91f16700Schasinglulu 		.name = "dp_stc_ref",
1307*91f16700Schasinglulu 		.control_reg = CRF_APB_DP_STC_REF_CTRL,
1308*91f16700Schasinglulu 		.status_reg = 0,
1309*91f16700Schasinglulu 		.parents = &((int32_t []) {
1310*91f16700Schasinglulu 			CLK_VPLL,
1311*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1312*91f16700Schasinglulu 			CLK_DPLL,
1313*91f16700Schasinglulu 			CLK_RPLL_TO_FPD,
1314*91f16700Schasinglulu 			CLK_NA_PARENT
1315*91f16700Schasinglulu 		}),
1316*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1317*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1318*91f16700Schasinglulu 	},
1319*91f16700Schasinglulu 	[CLK_DPDMA_REF] = {
1320*91f16700Schasinglulu 		.name = "dpdma_ref",
1321*91f16700Schasinglulu 		.control_reg = CRF_APB_DPDMA_REF_CTRL,
1322*91f16700Schasinglulu 		.status_reg = 0,
1323*91f16700Schasinglulu 		.parents = &((int32_t []) {
1324*91f16700Schasinglulu 			CLK_APLL,
1325*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1326*91f16700Schasinglulu 			CLK_VPLL,
1327*91f16700Schasinglulu 			CLK_DPLL,
1328*91f16700Schasinglulu 			CLK_NA_PARENT
1329*91f16700Schasinglulu 		}),
1330*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1331*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1332*91f16700Schasinglulu 	},
1333*91f16700Schasinglulu 	[CLK_DDR_REF] = {
1334*91f16700Schasinglulu 		.name = "ddr_ref",
1335*91f16700Schasinglulu 		.control_reg = CRF_APB_DDR_CTRL,
1336*91f16700Schasinglulu 		.status_reg = 0,
1337*91f16700Schasinglulu 		.parents = &((int32_t []) {
1338*91f16700Schasinglulu 			CLK_DPLL,
1339*91f16700Schasinglulu 			CLK_VPLL,
1340*91f16700Schasinglulu 			CLK_NA_PARENT
1341*91f16700Schasinglulu 		}),
1342*91f16700Schasinglulu 		.nodes = &ddr_nodes,
1343*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(ddr_nodes),
1344*91f16700Schasinglulu 	},
1345*91f16700Schasinglulu 	[CLK_GPU_REF] = {
1346*91f16700Schasinglulu 		.name = "gpu_ref",
1347*91f16700Schasinglulu 		.control_reg = CRF_APB_GPU_REF_CTRL,
1348*91f16700Schasinglulu 		.status_reg = 0,
1349*91f16700Schasinglulu 		.parents = &((int32_t []) {
1350*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1351*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1352*91f16700Schasinglulu 			CLK_VPLL,
1353*91f16700Schasinglulu 			CLK_DPLL,
1354*91f16700Schasinglulu 			CLK_NA_PARENT
1355*91f16700Schasinglulu 		}),
1356*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1357*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1358*91f16700Schasinglulu 	},
1359*91f16700Schasinglulu 	[CLK_SATA_REF] = {
1360*91f16700Schasinglulu 		.name = "sata_ref",
1361*91f16700Schasinglulu 		.control_reg = CRF_APB_SATA_REF_CTRL,
1362*91f16700Schasinglulu 		.status_reg = 0,
1363*91f16700Schasinglulu 		.parents = &((int32_t []) {
1364*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1365*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1366*91f16700Schasinglulu 			CLK_APLL,
1367*91f16700Schasinglulu 			CLK_DPLL,
1368*91f16700Schasinglulu 			CLK_NA_PARENT
1369*91f16700Schasinglulu 		}),
1370*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1371*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1372*91f16700Schasinglulu 	},
1373*91f16700Schasinglulu 	[CLK_PCIE_REF] = {
1374*91f16700Schasinglulu 		.name = "pcie_ref",
1375*91f16700Schasinglulu 		.control_reg = CRF_APB_PCIE_REF_CTRL,
1376*91f16700Schasinglulu 		.status_reg = 0,
1377*91f16700Schasinglulu 		.parents = &((int32_t []) {
1378*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1379*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1380*91f16700Schasinglulu 			CLK_RPLL_TO_FPD,
1381*91f16700Schasinglulu 			CLK_DPLL,
1382*91f16700Schasinglulu 			CLK_NA_PARENT
1383*91f16700Schasinglulu 		}),
1384*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1385*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1386*91f16700Schasinglulu 	},
1387*91f16700Schasinglulu 	[CLK_GDMA_REF] = {
1388*91f16700Schasinglulu 		.name = "gdma_ref",
1389*91f16700Schasinglulu 		.control_reg = CRF_APB_GDMA_REF_CTRL,
1390*91f16700Schasinglulu 		.status_reg = 0,
1391*91f16700Schasinglulu 		.parents = &((int32_t []) {
1392*91f16700Schasinglulu 			CLK_APLL,
1393*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1394*91f16700Schasinglulu 			CLK_VPLL,
1395*91f16700Schasinglulu 			CLK_DPLL,
1396*91f16700Schasinglulu 			CLK_NA_PARENT
1397*91f16700Schasinglulu 		}),
1398*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1399*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1400*91f16700Schasinglulu 	},
1401*91f16700Schasinglulu 	[CLK_GTGREF0_REF] = {
1402*91f16700Schasinglulu 		.name = "gtgref0_ref",
1403*91f16700Schasinglulu 		.control_reg = CRF_APB_GTGREF0_REF_CTRL,
1404*91f16700Schasinglulu 		.status_reg = 0,
1405*91f16700Schasinglulu 		.parents = &((int32_t []) {
1406*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1407*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1408*91f16700Schasinglulu 			CLK_APLL,
1409*91f16700Schasinglulu 			CLK_DPLL,
1410*91f16700Schasinglulu 			CLK_NA_PARENT
1411*91f16700Schasinglulu 		}),
1412*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1413*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1414*91f16700Schasinglulu 	},
1415*91f16700Schasinglulu 	[CLK_TOPSW_MAIN] = {
1416*91f16700Schasinglulu 		.name = "topsw_main",
1417*91f16700Schasinglulu 		.control_reg = CRF_APB_TOPSW_MAIN_CTRL,
1418*91f16700Schasinglulu 		.status_reg = 0,
1419*91f16700Schasinglulu 		.parents = &((int32_t []) {
1420*91f16700Schasinglulu 			CLK_APLL,
1421*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1422*91f16700Schasinglulu 			CLK_VPLL,
1423*91f16700Schasinglulu 			CLK_DPLL,
1424*91f16700Schasinglulu 			CLK_NA_PARENT
1425*91f16700Schasinglulu 		}),
1426*91f16700Schasinglulu 		.nodes = &generic_mux_div_unused_gate_nodes,
1427*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1428*91f16700Schasinglulu 	},
1429*91f16700Schasinglulu 	[CLK_TOPSW_LSBUS] = {
1430*91f16700Schasinglulu 		.name = "topsw_lsbus",
1431*91f16700Schasinglulu 		.control_reg = CRF_APB_TOPSW_LSBUS_CTRL,
1432*91f16700Schasinglulu 		.status_reg = 0,
1433*91f16700Schasinglulu 		.parents = &((int32_t []) {
1434*91f16700Schasinglulu 			CLK_APLL,
1435*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1436*91f16700Schasinglulu 			CLK_IOPLL_TO_FPD,
1437*91f16700Schasinglulu 			CLK_DPLL,
1438*91f16700Schasinglulu 			CLK_NA_PARENT
1439*91f16700Schasinglulu 		}),
1440*91f16700Schasinglulu 		.nodes = &generic_mux_div_unused_gate_nodes,
1441*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1442*91f16700Schasinglulu 	},
1443*91f16700Schasinglulu 	[CLK_IOU_SWITCH] = {
1444*91f16700Schasinglulu 		.name = "iou_switch",
1445*91f16700Schasinglulu 		.control_reg = CRL_APB_IOU_SWITCH_CTRL,
1446*91f16700Schasinglulu 		.status_reg = 0,
1447*91f16700Schasinglulu 		.parents = &((int32_t []) {
1448*91f16700Schasinglulu 			CLK_RPLL,
1449*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1450*91f16700Schasinglulu 			CLK_IOPLL,
1451*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1452*91f16700Schasinglulu 			CLK_NA_PARENT
1453*91f16700Schasinglulu 		}),
1454*91f16700Schasinglulu 		.nodes = &generic_mux_div_unused_gate_nodes,
1455*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1456*91f16700Schasinglulu 	},
1457*91f16700Schasinglulu 	[CLK_GEM0_REF_UNGATED] = {
1458*91f16700Schasinglulu 		.name = "gem0_ref_ung",
1459*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM0_REF_CTRL,
1460*91f16700Schasinglulu 		.status_reg = 0,
1461*91f16700Schasinglulu 		.parents = &((int32_t []) {
1462*91f16700Schasinglulu 			CLK_IOPLL,
1463*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1464*91f16700Schasinglulu 			CLK_RPLL,
1465*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1466*91f16700Schasinglulu 			CLK_NA_PARENT
1467*91f16700Schasinglulu 		}),
1468*91f16700Schasinglulu 		.nodes = &gem_ref_ungated_nodes,
1469*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
1470*91f16700Schasinglulu 	},
1471*91f16700Schasinglulu 	[CLK_GEM1_REF_UNGATED] = {
1472*91f16700Schasinglulu 		.name = "gem1_ref_ung",
1473*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM1_REF_CTRL,
1474*91f16700Schasinglulu 		.status_reg = 0,
1475*91f16700Schasinglulu 		.parents = &((int32_t []) {
1476*91f16700Schasinglulu 			CLK_IOPLL,
1477*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1478*91f16700Schasinglulu 			CLK_RPLL,
1479*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1480*91f16700Schasinglulu 			CLK_NA_PARENT
1481*91f16700Schasinglulu 		}),
1482*91f16700Schasinglulu 		.nodes = &gem_ref_ungated_nodes,
1483*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
1484*91f16700Schasinglulu 	},
1485*91f16700Schasinglulu 	[CLK_GEM2_REF_UNGATED] = {
1486*91f16700Schasinglulu 		.name = "gem2_ref_ung",
1487*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM2_REF_CTRL,
1488*91f16700Schasinglulu 		.status_reg = 0,
1489*91f16700Schasinglulu 		.parents = &((int32_t []) {
1490*91f16700Schasinglulu 			CLK_IOPLL,
1491*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1492*91f16700Schasinglulu 			CLK_RPLL,
1493*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1494*91f16700Schasinglulu 			CLK_NA_PARENT
1495*91f16700Schasinglulu 		}),
1496*91f16700Schasinglulu 		.nodes = &gem_ref_ungated_nodes,
1497*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
1498*91f16700Schasinglulu 	},
1499*91f16700Schasinglulu 	[CLK_GEM3_REF_UNGATED] = {
1500*91f16700Schasinglulu 		.name = "gem3_ref_ung",
1501*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM3_REF_CTRL,
1502*91f16700Schasinglulu 		.status_reg = 0,
1503*91f16700Schasinglulu 		.parents = &((int32_t []) {
1504*91f16700Schasinglulu 			CLK_IOPLL,
1505*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1506*91f16700Schasinglulu 			CLK_RPLL,
1507*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1508*91f16700Schasinglulu 			CLK_NA_PARENT
1509*91f16700Schasinglulu 		}),
1510*91f16700Schasinglulu 		.nodes = &gem_ref_ungated_nodes,
1511*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
1512*91f16700Schasinglulu 	},
1513*91f16700Schasinglulu 	[CLK_GEM0_REF] = {
1514*91f16700Schasinglulu 		.name = "gem0_ref",
1515*91f16700Schasinglulu 		.control_reg = IOU_SLCR_GEM_CLK_CTRL,
1516*91f16700Schasinglulu 		.status_reg = 0,
1517*91f16700Schasinglulu 		.parents = &((int32_t []) {
1518*91f16700Schasinglulu 			CLK_GEM0_REF_UNGATED |
1519*91f16700Schasinglulu 			(PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1520*91f16700Schasinglulu 			EXT_CLK_GEM0_TX_EMIO | CLK_EXTERNAL_PARENT,
1521*91f16700Schasinglulu 			CLK_NA_PARENT
1522*91f16700Schasinglulu 		}),
1523*91f16700Schasinglulu 		.nodes = &gem0_ref_nodes,
1524*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem0_ref_nodes),
1525*91f16700Schasinglulu 	},
1526*91f16700Schasinglulu 	[CLK_GEM1_REF] = {
1527*91f16700Schasinglulu 		.name = "gem1_ref",
1528*91f16700Schasinglulu 		.control_reg = IOU_SLCR_GEM_CLK_CTRL,
1529*91f16700Schasinglulu 		.status_reg = 0,
1530*91f16700Schasinglulu 		.parents = &((int32_t []) {
1531*91f16700Schasinglulu 			CLK_GEM1_REF_UNGATED |
1532*91f16700Schasinglulu 			(PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1533*91f16700Schasinglulu 			EXT_CLK_GEM1_TX_EMIO | CLK_EXTERNAL_PARENT,
1534*91f16700Schasinglulu 			CLK_NA_PARENT
1535*91f16700Schasinglulu 		}),
1536*91f16700Schasinglulu 		.nodes = &gem1_ref_nodes,
1537*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem1_ref_nodes),
1538*91f16700Schasinglulu 	},
1539*91f16700Schasinglulu 	[CLK_GEM2_REF] = {
1540*91f16700Schasinglulu 		.name = "gem2_ref",
1541*91f16700Schasinglulu 		.control_reg = IOU_SLCR_GEM_CLK_CTRL,
1542*91f16700Schasinglulu 		.status_reg = 0,
1543*91f16700Schasinglulu 		.parents = &((int32_t []) {
1544*91f16700Schasinglulu 			CLK_GEM2_REF_UNGATED |
1545*91f16700Schasinglulu 			(PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1546*91f16700Schasinglulu 			EXT_CLK_GEM2_TX_EMIO | CLK_EXTERNAL_PARENT,
1547*91f16700Schasinglulu 			CLK_NA_PARENT
1548*91f16700Schasinglulu 		}),
1549*91f16700Schasinglulu 		.nodes = &gem2_ref_nodes,
1550*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem2_ref_nodes),
1551*91f16700Schasinglulu 	},
1552*91f16700Schasinglulu 	[CLK_GEM3_REF] = {
1553*91f16700Schasinglulu 		.name = "gem3_ref",
1554*91f16700Schasinglulu 		.control_reg = IOU_SLCR_GEM_CLK_CTRL,
1555*91f16700Schasinglulu 		.status_reg = 0,
1556*91f16700Schasinglulu 		.parents = &((int32_t []) {
1557*91f16700Schasinglulu 			CLK_GEM3_REF_UNGATED |
1558*91f16700Schasinglulu 			(PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1559*91f16700Schasinglulu 			EXT_CLK_GEM3_TX_EMIO | CLK_EXTERNAL_PARENT,
1560*91f16700Schasinglulu 			CLK_NA_PARENT
1561*91f16700Schasinglulu 		}),
1562*91f16700Schasinglulu 		.nodes = &gem3_ref_nodes,
1563*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem3_ref_nodes),
1564*91f16700Schasinglulu 	},
1565*91f16700Schasinglulu 	[CLK_USB0_BUS_REF] = {
1566*91f16700Schasinglulu 		.name = "usb0_bus_ref",
1567*91f16700Schasinglulu 		.control_reg = CRL_APB_USB0_BUS_REF_CTRL,
1568*91f16700Schasinglulu 		.status_reg = 0,
1569*91f16700Schasinglulu 		.parents = &((int32_t []) {
1570*91f16700Schasinglulu 			CLK_IOPLL,
1571*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1572*91f16700Schasinglulu 			CLK_RPLL,
1573*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1574*91f16700Schasinglulu 			CLK_NA_PARENT
1575*91f16700Schasinglulu 		}),
1576*91f16700Schasinglulu 		.nodes = &usb_nodes,
1577*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(usb_nodes),
1578*91f16700Schasinglulu 	},
1579*91f16700Schasinglulu 	[CLK_USB1_BUS_REF] = {
1580*91f16700Schasinglulu 		.name = "usb1_bus_ref",
1581*91f16700Schasinglulu 		.control_reg = CRL_APB_USB1_BUS_REF_CTRL,
1582*91f16700Schasinglulu 		.status_reg = 0,
1583*91f16700Schasinglulu 		.parents = &((int32_t []) {
1584*91f16700Schasinglulu 			CLK_IOPLL,
1585*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1586*91f16700Schasinglulu 			CLK_RPLL,
1587*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1588*91f16700Schasinglulu 			CLK_NA_PARENT
1589*91f16700Schasinglulu 		}),
1590*91f16700Schasinglulu 		.nodes = &usb_nodes,
1591*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(usb_nodes),
1592*91f16700Schasinglulu 	},
1593*91f16700Schasinglulu 	[CLK_USB3_DUAL_REF] = {
1594*91f16700Schasinglulu 		.name = "usb3_dual_ref",
1595*91f16700Schasinglulu 		.control_reg = CRL_APB_USB3_DUAL_REF_CTRL,
1596*91f16700Schasinglulu 		.status_reg = 0,
1597*91f16700Schasinglulu 		.parents = &((int32_t []) {
1598*91f16700Schasinglulu 			CLK_IOPLL,
1599*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1600*91f16700Schasinglulu 			CLK_RPLL,
1601*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1602*91f16700Schasinglulu 			CLK_NA_PARENT
1603*91f16700Schasinglulu 		}),
1604*91f16700Schasinglulu 		.nodes = &usb_nodes,
1605*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(usb_nodes),
1606*91f16700Schasinglulu 	},
1607*91f16700Schasinglulu 	[CLK_QSPI_REF] = {
1608*91f16700Schasinglulu 		.name = "qspi_ref",
1609*91f16700Schasinglulu 		.control_reg = CRL_APB_QSPI_REF_CTRL,
1610*91f16700Schasinglulu 		.status_reg = 0,
1611*91f16700Schasinglulu 		.parents = &((int32_t []) {
1612*91f16700Schasinglulu 			CLK_IOPLL,
1613*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1614*91f16700Schasinglulu 			CLK_RPLL,
1615*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1616*91f16700Schasinglulu 			CLK_NA_PARENT
1617*91f16700Schasinglulu 		}),
1618*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1619*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1620*91f16700Schasinglulu 	},
1621*91f16700Schasinglulu 	[CLK_SDIO0_REF] = {
1622*91f16700Schasinglulu 		.name = "sdio0_ref",
1623*91f16700Schasinglulu 		.control_reg = CRL_APB_SDIO0_REF_CTRL,
1624*91f16700Schasinglulu 		.status_reg = 0,
1625*91f16700Schasinglulu 		.parents = &((int32_t []) {
1626*91f16700Schasinglulu 			CLK_IOPLL,
1627*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1628*91f16700Schasinglulu 			CLK_RPLL,
1629*91f16700Schasinglulu 			CLK_VPLL_TO_LPD,
1630*91f16700Schasinglulu 			CLK_NA_PARENT
1631*91f16700Schasinglulu 		}),
1632*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1633*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1634*91f16700Schasinglulu 	},
1635*91f16700Schasinglulu 	[CLK_SDIO1_REF] = {
1636*91f16700Schasinglulu 		.name = "sdio1_ref",
1637*91f16700Schasinglulu 		.control_reg = CRL_APB_SDIO1_REF_CTRL,
1638*91f16700Schasinglulu 		.status_reg = 0,
1639*91f16700Schasinglulu 		.parents = &((int32_t []) {
1640*91f16700Schasinglulu 			CLK_IOPLL,
1641*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1642*91f16700Schasinglulu 			CLK_RPLL,
1643*91f16700Schasinglulu 			CLK_VPLL_TO_LPD,
1644*91f16700Schasinglulu 			CLK_NA_PARENT
1645*91f16700Schasinglulu 		}),
1646*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1647*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1648*91f16700Schasinglulu 	},
1649*91f16700Schasinglulu 	[CLK_UART0_REF] = {
1650*91f16700Schasinglulu 		.name = "uart0_ref",
1651*91f16700Schasinglulu 		.control_reg = CRL_APB_UART0_REF_CTRL,
1652*91f16700Schasinglulu 		.status_reg = 0,
1653*91f16700Schasinglulu 		.parents = &((int32_t []) {
1654*91f16700Schasinglulu 			CLK_IOPLL,
1655*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1656*91f16700Schasinglulu 			CLK_RPLL,
1657*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1658*91f16700Schasinglulu 			CLK_NA_PARENT
1659*91f16700Schasinglulu 		}),
1660*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1661*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1662*91f16700Schasinglulu 	},
1663*91f16700Schasinglulu 	[CLK_UART1_REF] = {
1664*91f16700Schasinglulu 		.name = "uart1_ref",
1665*91f16700Schasinglulu 		.control_reg = CRL_APB_UART1_REF_CTRL,
1666*91f16700Schasinglulu 		.status_reg = 0,
1667*91f16700Schasinglulu 		.parents = &((int32_t []) {
1668*91f16700Schasinglulu 			CLK_IOPLL,
1669*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1670*91f16700Schasinglulu 			CLK_RPLL,
1671*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1672*91f16700Schasinglulu 			CLK_NA_PARENT
1673*91f16700Schasinglulu 		}),
1674*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1675*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1676*91f16700Schasinglulu 	},
1677*91f16700Schasinglulu 	[CLK_SPI0_REF] = {
1678*91f16700Schasinglulu 		.name = "spi0_ref",
1679*91f16700Schasinglulu 		.control_reg = CRL_APB_SPI0_REF_CTRL,
1680*91f16700Schasinglulu 		.status_reg = 0,
1681*91f16700Schasinglulu 		.parents = &((int32_t []) {
1682*91f16700Schasinglulu 			CLK_IOPLL,
1683*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1684*91f16700Schasinglulu 			CLK_RPLL,
1685*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1686*91f16700Schasinglulu 			CLK_NA_PARENT
1687*91f16700Schasinglulu 		}),
1688*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1689*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1690*91f16700Schasinglulu 	},
1691*91f16700Schasinglulu 	[CLK_SPI1_REF] = {
1692*91f16700Schasinglulu 		.name = "spi1_ref",
1693*91f16700Schasinglulu 		.control_reg = CRL_APB_SPI1_REF_CTRL,
1694*91f16700Schasinglulu 		.status_reg = 0,
1695*91f16700Schasinglulu 		.parents = &((int32_t []) {
1696*91f16700Schasinglulu 			CLK_IOPLL,
1697*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1698*91f16700Schasinglulu 			CLK_RPLL,
1699*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1700*91f16700Schasinglulu 			CLK_NA_PARENT
1701*91f16700Schasinglulu 		}),
1702*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1703*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1704*91f16700Schasinglulu 	},
1705*91f16700Schasinglulu 	[CLK_CAN0_REF] = {
1706*91f16700Schasinglulu 		.name = "can0_ref",
1707*91f16700Schasinglulu 		.control_reg = CRL_APB_CAN0_REF_CTRL,
1708*91f16700Schasinglulu 		.status_reg = 0,
1709*91f16700Schasinglulu 		.parents = &((int32_t []) {
1710*91f16700Schasinglulu 			CLK_IOPLL,
1711*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1712*91f16700Schasinglulu 			CLK_RPLL,
1713*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1714*91f16700Schasinglulu 			CLK_NA_PARENT
1715*91f16700Schasinglulu 		}),
1716*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1717*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1718*91f16700Schasinglulu 	},
1719*91f16700Schasinglulu 	[CLK_CAN1_REF] = {
1720*91f16700Schasinglulu 		.name = "can1_ref",
1721*91f16700Schasinglulu 		.control_reg = CRL_APB_CAN1_REF_CTRL,
1722*91f16700Schasinglulu 		.status_reg = 0,
1723*91f16700Schasinglulu 		.parents = &((int32_t []) {
1724*91f16700Schasinglulu 			CLK_IOPLL,
1725*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1726*91f16700Schasinglulu 			CLK_RPLL,
1727*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1728*91f16700Schasinglulu 			CLK_NA_PARENT
1729*91f16700Schasinglulu 		}),
1730*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1731*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1732*91f16700Schasinglulu 	},
1733*91f16700Schasinglulu 	[CLK_NAND_REF] = {
1734*91f16700Schasinglulu 		.name = "nand_ref",
1735*91f16700Schasinglulu 		.control_reg = CRL_APB_NAND_REF_CTRL,
1736*91f16700Schasinglulu 		.status_reg = 0,
1737*91f16700Schasinglulu 		.parents = &((int32_t []) {
1738*91f16700Schasinglulu 			CLK_IOPLL,
1739*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1740*91f16700Schasinglulu 			CLK_RPLL,
1741*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1742*91f16700Schasinglulu 			CLK_NA_PARENT
1743*91f16700Schasinglulu 		}),
1744*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1745*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1746*91f16700Schasinglulu 	},
1747*91f16700Schasinglulu 	[CLK_GEM_TSU_REF] = {
1748*91f16700Schasinglulu 		.name = "gem_tsu_ref",
1749*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM_TSU_REF_CTRL,
1750*91f16700Schasinglulu 		.status_reg = 0,
1751*91f16700Schasinglulu 		.parents = &((int32_t []) {
1752*91f16700Schasinglulu 			CLK_IOPLL,
1753*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1754*91f16700Schasinglulu 			CLK_RPLL,
1755*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1756*91f16700Schasinglulu 			CLK_NA_PARENT
1757*91f16700Schasinglulu 		}),
1758*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1759*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1760*91f16700Schasinglulu 	},
1761*91f16700Schasinglulu 	[CLK_DLL_REF] = {
1762*91f16700Schasinglulu 		.name = "dll_ref",
1763*91f16700Schasinglulu 		.control_reg = CRL_APB_DLL_REF_CTRL,
1764*91f16700Schasinglulu 		.status_reg = 0,
1765*91f16700Schasinglulu 		.parents = &((int32_t []) {
1766*91f16700Schasinglulu 			CLK_IOPLL,
1767*91f16700Schasinglulu 			CLK_RPLL,
1768*91f16700Schasinglulu 			CLK_NA_PARENT
1769*91f16700Schasinglulu 		}),
1770*91f16700Schasinglulu 		.nodes = &dll_ref_nodes,
1771*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(dll_ref_nodes),
1772*91f16700Schasinglulu 	},
1773*91f16700Schasinglulu 	[CLK_ADMA_REF] = {
1774*91f16700Schasinglulu 		.name = "adma_ref",
1775*91f16700Schasinglulu 		.control_reg = CRL_APB_ADMA_REF_CTRL,
1776*91f16700Schasinglulu 		.status_reg = 0,
1777*91f16700Schasinglulu 		.parents = &((int32_t []) {
1778*91f16700Schasinglulu 			CLK_RPLL,
1779*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1780*91f16700Schasinglulu 			CLK_IOPLL,
1781*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1782*91f16700Schasinglulu 			CLK_NA_PARENT
1783*91f16700Schasinglulu 		}),
1784*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1785*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1786*91f16700Schasinglulu 	},
1787*91f16700Schasinglulu 	[CLK_DBG_LPD] = {
1788*91f16700Schasinglulu 		.name = "dbg_lpd",
1789*91f16700Schasinglulu 		.control_reg = CRL_APB_DBG_LPD_CTRL,
1790*91f16700Schasinglulu 		.status_reg = 0,
1791*91f16700Schasinglulu 		.parents = &((int32_t []) {
1792*91f16700Schasinglulu 			CLK_RPLL,
1793*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1794*91f16700Schasinglulu 			CLK_IOPLL,
1795*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1796*91f16700Schasinglulu 			CLK_NA_PARENT
1797*91f16700Schasinglulu 		}),
1798*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1799*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1800*91f16700Schasinglulu 	},
1801*91f16700Schasinglulu 	[CLK_CPU_R5] = {
1802*91f16700Schasinglulu 		.name = "cpu_r5",
1803*91f16700Schasinglulu 		.control_reg = CRL_APB_CPU_R5_CTRL,
1804*91f16700Schasinglulu 		.status_reg = 0,
1805*91f16700Schasinglulu 		.parents = &((int32_t []) {
1806*91f16700Schasinglulu 			CLK_RPLL,
1807*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1808*91f16700Schasinglulu 			CLK_IOPLL,
1809*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1810*91f16700Schasinglulu 			CLK_NA_PARENT
1811*91f16700Schasinglulu 		}),
1812*91f16700Schasinglulu 		.nodes = &generic_mux_div_unused_gate_nodes,
1813*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1814*91f16700Schasinglulu 	},
1815*91f16700Schasinglulu 	[CLK_CSU_PLL] = {
1816*91f16700Schasinglulu 		.name = "csu_pll",
1817*91f16700Schasinglulu 		.control_reg = CRL_APB_CSU_PLL_CTRL,
1818*91f16700Schasinglulu 		.status_reg = 0,
1819*91f16700Schasinglulu 		.parents = &((int32_t []) {
1820*91f16700Schasinglulu 			CLK_IOPLL,
1821*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1822*91f16700Schasinglulu 			CLK_RPLL,
1823*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1824*91f16700Schasinglulu 			CLK_NA_PARENT
1825*91f16700Schasinglulu 		}),
1826*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1827*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1828*91f16700Schasinglulu 	},
1829*91f16700Schasinglulu 	[CLK_PCAP] = {
1830*91f16700Schasinglulu 		.name = "pcap",
1831*91f16700Schasinglulu 		.control_reg = CRL_APB_PCAP_CTRL,
1832*91f16700Schasinglulu 		.status_reg = 0,
1833*91f16700Schasinglulu 		.parents = &((int32_t []) {
1834*91f16700Schasinglulu 			CLK_IOPLL,
1835*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1836*91f16700Schasinglulu 			CLK_RPLL,
1837*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1838*91f16700Schasinglulu 			CLK_NA_PARENT
1839*91f16700Schasinglulu 		}),
1840*91f16700Schasinglulu 		.nodes = &generic_mux_div_gate_nodes,
1841*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1842*91f16700Schasinglulu 	},
1843*91f16700Schasinglulu 	[CLK_LPD_LSBUS] = {
1844*91f16700Schasinglulu 		.name = "lpd_lsbus",
1845*91f16700Schasinglulu 		.control_reg = CRL_APB_LPD_LSBUS_CTRL,
1846*91f16700Schasinglulu 		.status_reg = 0,
1847*91f16700Schasinglulu 		.parents = &((int32_t []) {
1848*91f16700Schasinglulu 			CLK_RPLL,
1849*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1850*91f16700Schasinglulu 			CLK_IOPLL,
1851*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1852*91f16700Schasinglulu 			CLK_NA_PARENT
1853*91f16700Schasinglulu 		}),
1854*91f16700Schasinglulu 		.nodes = &generic_mux_div_unused_gate_nodes,
1855*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1856*91f16700Schasinglulu 	},
1857*91f16700Schasinglulu 	[CLK_LPD_SWITCH] = {
1858*91f16700Schasinglulu 		.name = "lpd_switch",
1859*91f16700Schasinglulu 		.control_reg = CRL_APB_LPD_SWITCH_CTRL,
1860*91f16700Schasinglulu 		.status_reg = 0,
1861*91f16700Schasinglulu 		.parents = &((int32_t []) {
1862*91f16700Schasinglulu 			CLK_RPLL,
1863*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1864*91f16700Schasinglulu 			CLK_IOPLL,
1865*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1866*91f16700Schasinglulu 			CLK_NA_PARENT
1867*91f16700Schasinglulu 		}),
1868*91f16700Schasinglulu 		.nodes = &generic_mux_div_unused_gate_nodes,
1869*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1870*91f16700Schasinglulu 	},
1871*91f16700Schasinglulu 	[CLK_I2C0_REF] = {
1872*91f16700Schasinglulu 		.name = "i2c0_ref",
1873*91f16700Schasinglulu 		.control_reg = CRL_APB_I2C0_REF_CTRL,
1874*91f16700Schasinglulu 		.status_reg = 0,
1875*91f16700Schasinglulu 		.parents = &((int32_t []) {
1876*91f16700Schasinglulu 			CLK_IOPLL,
1877*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1878*91f16700Schasinglulu 			CLK_RPLL,
1879*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1880*91f16700Schasinglulu 			CLK_NA_PARENT
1881*91f16700Schasinglulu 		}),
1882*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1883*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1884*91f16700Schasinglulu 	},
1885*91f16700Schasinglulu 	[CLK_I2C1_REF] = {
1886*91f16700Schasinglulu 		.name = "i2c1_ref",
1887*91f16700Schasinglulu 		.control_reg = CRL_APB_I2C1_REF_CTRL,
1888*91f16700Schasinglulu 		.status_reg = 0,
1889*91f16700Schasinglulu 		.parents = &((int32_t []) {
1890*91f16700Schasinglulu 			CLK_IOPLL,
1891*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1892*91f16700Schasinglulu 			CLK_RPLL,
1893*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1894*91f16700Schasinglulu 			CLK_NA_PARENT
1895*91f16700Schasinglulu 		}),
1896*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1897*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1898*91f16700Schasinglulu 	},
1899*91f16700Schasinglulu 	[CLK_TIMESTAMP_REF] = {
1900*91f16700Schasinglulu 		.name = "timestamp_ref",
1901*91f16700Schasinglulu 		.control_reg = CRL_APB_TIMESTAMP_REF_CTRL,
1902*91f16700Schasinglulu 		.status_reg = 0,
1903*91f16700Schasinglulu 		.parents = &((int32_t []) {
1904*91f16700Schasinglulu 			CLK_IOPLL,
1905*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1906*91f16700Schasinglulu 			CLK_RPLL,
1907*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1908*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1909*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1910*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1911*91f16700Schasinglulu 			EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1912*91f16700Schasinglulu 			CLK_NA_PARENT
1913*91f16700Schasinglulu 		}),
1914*91f16700Schasinglulu 		.nodes = &timestamp_ref_nodes,
1915*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(timestamp_ref_nodes),
1916*91f16700Schasinglulu 	},
1917*91f16700Schasinglulu 	[CLK_PL0_REF] = {
1918*91f16700Schasinglulu 		.name = "pl0_ref",
1919*91f16700Schasinglulu 		.control_reg = CRL_APB_PL0_REF_CTRL,
1920*91f16700Schasinglulu 		.status_reg = 0,
1921*91f16700Schasinglulu 		.parents = &((int32_t []) {
1922*91f16700Schasinglulu 			CLK_IOPLL,
1923*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1924*91f16700Schasinglulu 			CLK_RPLL,
1925*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1926*91f16700Schasinglulu 			CLK_NA_PARENT
1927*91f16700Schasinglulu 		}),
1928*91f16700Schasinglulu 		.nodes = &pl_nodes,
1929*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(pl_nodes),
1930*91f16700Schasinglulu 	},
1931*91f16700Schasinglulu 	[CLK_PL1_REF] = {
1932*91f16700Schasinglulu 		.name = "pl1_ref",
1933*91f16700Schasinglulu 		.control_reg = CRL_APB_PL1_REF_CTRL,
1934*91f16700Schasinglulu 		.status_reg = 0,
1935*91f16700Schasinglulu 		.parents = &((int32_t []) {
1936*91f16700Schasinglulu 			CLK_IOPLL,
1937*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1938*91f16700Schasinglulu 			CLK_RPLL,
1939*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1940*91f16700Schasinglulu 			CLK_NA_PARENT
1941*91f16700Schasinglulu 		}),
1942*91f16700Schasinglulu 		.nodes = &pl_nodes,
1943*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(pl_nodes),
1944*91f16700Schasinglulu 	},
1945*91f16700Schasinglulu 	[CLK_PL2_REF] = {
1946*91f16700Schasinglulu 		.name = "pl2_ref",
1947*91f16700Schasinglulu 		.control_reg = CRL_APB_PL2_REF_CTRL,
1948*91f16700Schasinglulu 		.status_reg = 0,
1949*91f16700Schasinglulu 		.parents = &((int32_t []) {
1950*91f16700Schasinglulu 			CLK_IOPLL,
1951*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1952*91f16700Schasinglulu 			CLK_RPLL,
1953*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1954*91f16700Schasinglulu 			CLK_NA_PARENT
1955*91f16700Schasinglulu 		}),
1956*91f16700Schasinglulu 		.nodes = &pl_nodes,
1957*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(pl_nodes),
1958*91f16700Schasinglulu 	},
1959*91f16700Schasinglulu 	[CLK_PL3_REF] = {
1960*91f16700Schasinglulu 		.name = "pl3_ref",
1961*91f16700Schasinglulu 		.control_reg = CRL_APB_PL3_REF_CTRL,
1962*91f16700Schasinglulu 		.status_reg = 0,
1963*91f16700Schasinglulu 		.parents = &((int32_t []) {
1964*91f16700Schasinglulu 			CLK_IOPLL,
1965*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1966*91f16700Schasinglulu 			CLK_RPLL,
1967*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1968*91f16700Schasinglulu 			CLK_NA_PARENT
1969*91f16700Schasinglulu 		}),
1970*91f16700Schasinglulu 		.nodes = &pl_nodes,
1971*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(pl_nodes),
1972*91f16700Schasinglulu 	},
1973*91f16700Schasinglulu 	[CLK_AMS_REF] = {
1974*91f16700Schasinglulu 		.name = "ams_ref",
1975*91f16700Schasinglulu 		.control_reg = CRL_APB_AMS_REF_CTRL,
1976*91f16700Schasinglulu 		.status_reg = 0,
1977*91f16700Schasinglulu 		.parents = &((int32_t []) {
1978*91f16700Schasinglulu 			CLK_RPLL,
1979*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
1980*91f16700Schasinglulu 			CLK_IOPLL,
1981*91f16700Schasinglulu 			CLK_DPLL_TO_LPD,
1982*91f16700Schasinglulu 			CLK_NA_PARENT
1983*91f16700Schasinglulu 		}),
1984*91f16700Schasinglulu 		.nodes = &generic_mux_div_div_gate_nodes,
1985*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1986*91f16700Schasinglulu 	},
1987*91f16700Schasinglulu 	[CLK_IOPLL_TO_FPD] = {
1988*91f16700Schasinglulu 		.name = "iopll_to_fpd",
1989*91f16700Schasinglulu 		.control_reg = CRL_APB_IOPLL_TO_FPD_CTRL,
1990*91f16700Schasinglulu 		.status_reg = 0,
1991*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_IOPLL, CLK_NA_PARENT}),
1992*91f16700Schasinglulu 		.nodes = &generic_domain_crossing_nodes,
1993*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
1994*91f16700Schasinglulu 	},
1995*91f16700Schasinglulu 	[CLK_RPLL_TO_FPD] = {
1996*91f16700Schasinglulu 		.name = "rpll_to_fpd",
1997*91f16700Schasinglulu 		.control_reg = CRL_APB_RPLL_TO_FPD_CTRL,
1998*91f16700Schasinglulu 		.status_reg = 0,
1999*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_RPLL, CLK_NA_PARENT}),
2000*91f16700Schasinglulu 		.nodes = &rpll_to_fpd_nodes,
2001*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(rpll_to_fpd_nodes),
2002*91f16700Schasinglulu 	},
2003*91f16700Schasinglulu 	[CLK_APLL_TO_LPD] = {
2004*91f16700Schasinglulu 		.name = "apll_to_lpd",
2005*91f16700Schasinglulu 		.control_reg = CRF_APB_APLL_TO_LPD_CTRL,
2006*91f16700Schasinglulu 		.status_reg = 0,
2007*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_APLL, CLK_NA_PARENT}),
2008*91f16700Schasinglulu 		.nodes = &generic_domain_crossing_nodes,
2009*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
2010*91f16700Schasinglulu 	},
2011*91f16700Schasinglulu 	[CLK_DPLL_TO_LPD] = {
2012*91f16700Schasinglulu 		.name = "dpll_to_lpd",
2013*91f16700Schasinglulu 		.control_reg = CRF_APB_DPLL_TO_LPD_CTRL,
2014*91f16700Schasinglulu 		.status_reg = 0,
2015*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_DPLL, CLK_NA_PARENT}),
2016*91f16700Schasinglulu 		.nodes = &generic_domain_crossing_nodes,
2017*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
2018*91f16700Schasinglulu 	},
2019*91f16700Schasinglulu 	[CLK_VPLL_TO_LPD] = {
2020*91f16700Schasinglulu 		.name = "vpll_to_lpd",
2021*91f16700Schasinglulu 		.control_reg = CRF_APB_VPLL_TO_LPD_CTRL,
2022*91f16700Schasinglulu 		.status_reg = 0,
2023*91f16700Schasinglulu 		.parents = &((int32_t []) {CLK_VPLL, CLK_NA_PARENT}),
2024*91f16700Schasinglulu 		.nodes = &generic_domain_crossing_nodes,
2025*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
2026*91f16700Schasinglulu 	},
2027*91f16700Schasinglulu 	[CLK_GEM0_TX] = {
2028*91f16700Schasinglulu 		.name = "gem0_tx",
2029*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM0_REF_CTRL,
2030*91f16700Schasinglulu 		.status_reg = 0,
2031*91f16700Schasinglulu 		.parents = &((int32_t []) {
2032*91f16700Schasinglulu 			CLK_GEM0_REF,
2033*91f16700Schasinglulu 			CLK_NA_PARENT
2034*91f16700Schasinglulu 		}),
2035*91f16700Schasinglulu 		.nodes = &gem_tx_nodes,
2036*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_tx_nodes),
2037*91f16700Schasinglulu 	},
2038*91f16700Schasinglulu 	[CLK_GEM1_TX] = {
2039*91f16700Schasinglulu 		.name = "gem1_tx",
2040*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM1_REF_CTRL,
2041*91f16700Schasinglulu 		.status_reg = 0,
2042*91f16700Schasinglulu 		.parents = &((int32_t []) {
2043*91f16700Schasinglulu 			CLK_GEM1_REF,
2044*91f16700Schasinglulu 			CLK_NA_PARENT
2045*91f16700Schasinglulu 		}),
2046*91f16700Schasinglulu 		.nodes = &gem_tx_nodes,
2047*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_tx_nodes),
2048*91f16700Schasinglulu 	},
2049*91f16700Schasinglulu 	[CLK_GEM2_TX] = {
2050*91f16700Schasinglulu 		.name = "gem2_tx",
2051*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM2_REF_CTRL,
2052*91f16700Schasinglulu 		.status_reg = 0,
2053*91f16700Schasinglulu 		.parents = &((int32_t []) {
2054*91f16700Schasinglulu 			CLK_GEM2_REF,
2055*91f16700Schasinglulu 			CLK_NA_PARENT
2056*91f16700Schasinglulu 		}),
2057*91f16700Schasinglulu 		.nodes = &gem_tx_nodes,
2058*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_tx_nodes),
2059*91f16700Schasinglulu 	},
2060*91f16700Schasinglulu 	[CLK_GEM3_TX] = {
2061*91f16700Schasinglulu 		.name = "gem3_tx",
2062*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM3_REF_CTRL,
2063*91f16700Schasinglulu 		.status_reg = 0,
2064*91f16700Schasinglulu 		.parents = &((int32_t []) {
2065*91f16700Schasinglulu 			CLK_GEM3_REF,
2066*91f16700Schasinglulu 			CLK_NA_PARENT
2067*91f16700Schasinglulu 		}),
2068*91f16700Schasinglulu 		.nodes = &gem_tx_nodes,
2069*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_tx_nodes),
2070*91f16700Schasinglulu 	},
2071*91f16700Schasinglulu 	[CLK_GEM0_RX] = {
2072*91f16700Schasinglulu 		.name = "gem0_rx",
2073*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM0_REF_CTRL,
2074*91f16700Schasinglulu 		.status_reg = 0,
2075*91f16700Schasinglulu 		.parents = &((int32_t []) {
2076*91f16700Schasinglulu 			EXT_CLK_GEM0_RX_EMIO | CLK_EXTERNAL_PARENT,
2077*91f16700Schasinglulu 			CLK_NA_PARENT
2078*91f16700Schasinglulu 		}),
2079*91f16700Schasinglulu 		.nodes = &gem_rx_nodes,
2080*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_rx_nodes),
2081*91f16700Schasinglulu 	},
2082*91f16700Schasinglulu 	[CLK_GEM1_RX] = {
2083*91f16700Schasinglulu 		.name = "gem1_rx",
2084*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM1_REF_CTRL,
2085*91f16700Schasinglulu 		.status_reg = 0,
2086*91f16700Schasinglulu 		.parents = &((int32_t []) {
2087*91f16700Schasinglulu 			EXT_CLK_GEM1_RX_EMIO | CLK_EXTERNAL_PARENT,
2088*91f16700Schasinglulu 			CLK_NA_PARENT
2089*91f16700Schasinglulu 		}),
2090*91f16700Schasinglulu 		.nodes = &gem_rx_nodes,
2091*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_rx_nodes),
2092*91f16700Schasinglulu 	},
2093*91f16700Schasinglulu 	[CLK_GEM2_RX] = {
2094*91f16700Schasinglulu 		.name = "gem2_rx",
2095*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM2_REF_CTRL,
2096*91f16700Schasinglulu 		.status_reg = 0,
2097*91f16700Schasinglulu 		.parents = &((int32_t []) {
2098*91f16700Schasinglulu 			EXT_CLK_GEM2_RX_EMIO | CLK_EXTERNAL_PARENT,
2099*91f16700Schasinglulu 			CLK_NA_PARENT
2100*91f16700Schasinglulu 		}),
2101*91f16700Schasinglulu 		.nodes = &gem_rx_nodes,
2102*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_rx_nodes),
2103*91f16700Schasinglulu 	},
2104*91f16700Schasinglulu 	[CLK_GEM3_RX] = {
2105*91f16700Schasinglulu 		.name = "gem3_rx",
2106*91f16700Schasinglulu 		.control_reg = CRL_APB_GEM3_REF_CTRL,
2107*91f16700Schasinglulu 		.status_reg = 0,
2108*91f16700Schasinglulu 		.parents = &((int32_t []) {
2109*91f16700Schasinglulu 			EXT_CLK_GEM3_RX_EMIO | CLK_EXTERNAL_PARENT,
2110*91f16700Schasinglulu 			CLK_NA_PARENT
2111*91f16700Schasinglulu 		}),
2112*91f16700Schasinglulu 		.nodes = &gem_rx_nodes,
2113*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_rx_nodes),
2114*91f16700Schasinglulu 	},
2115*91f16700Schasinglulu 	[CLK_ACPU_HALF] = {
2116*91f16700Schasinglulu 		.name = "acpu_half",
2117*91f16700Schasinglulu 		.control_reg = CRF_APB_ACPU_CTRL,
2118*91f16700Schasinglulu 		.status_reg = 0,
2119*91f16700Schasinglulu 		.parents = &((int32_t []) {
2120*91f16700Schasinglulu 			CLK_ACPU | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2121*91f16700Schasinglulu 			CLK_NA_PARENT
2122*91f16700Schasinglulu 		}),
2123*91f16700Schasinglulu 		.nodes = &acpu_half_nodes,
2124*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(acpu_half_nodes),
2125*91f16700Schasinglulu 	},
2126*91f16700Schasinglulu 	[CLK_FPD_WDT] = {
2127*91f16700Schasinglulu 		.name = "fpd_wdt",
2128*91f16700Schasinglulu 		.control_reg = FPD_SLCR_WDT_CLK_SEL,
2129*91f16700Schasinglulu 		.status_reg = 0,
2130*91f16700Schasinglulu 		.parents = &((int32_t []) {
2131*91f16700Schasinglulu 			CLK_TOPSW_LSBUS,
2132*91f16700Schasinglulu 			EXT_CLK_SWDT0 | CLK_EXTERNAL_PARENT,
2133*91f16700Schasinglulu 			CLK_NA_PARENT
2134*91f16700Schasinglulu 		}),
2135*91f16700Schasinglulu 		.nodes = &wdt_nodes,
2136*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(wdt_nodes),
2137*91f16700Schasinglulu 	},
2138*91f16700Schasinglulu 	[CLK_GPU_PP0_REF] = {
2139*91f16700Schasinglulu 		.name = "gpu_pp0_ref",
2140*91f16700Schasinglulu 		.control_reg = CRF_APB_GPU_REF_CTRL,
2141*91f16700Schasinglulu 		.status_reg = 0,
2142*91f16700Schasinglulu 		.parents = &((int32_t []) {
2143*91f16700Schasinglulu 			CLK_GPU_REF | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2144*91f16700Schasinglulu 			CLK_NA_PARENT
2145*91f16700Schasinglulu 		}),
2146*91f16700Schasinglulu 		.nodes = &gpu_pp0_nodes,
2147*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gpu_pp0_nodes),
2148*91f16700Schasinglulu 	},
2149*91f16700Schasinglulu 	[CLK_GPU_PP1_REF] = {
2150*91f16700Schasinglulu 		.name = "gpu_pp1_ref",
2151*91f16700Schasinglulu 		.control_reg = CRF_APB_GPU_REF_CTRL,
2152*91f16700Schasinglulu 		.status_reg = 0,
2153*91f16700Schasinglulu 		.parents = &((int32_t []) {
2154*91f16700Schasinglulu 			CLK_GPU_REF | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2155*91f16700Schasinglulu 			CLK_NA_PARENT
2156*91f16700Schasinglulu 		}),
2157*91f16700Schasinglulu 		.nodes = &gpu_pp1_nodes,
2158*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gpu_pp1_nodes),
2159*91f16700Schasinglulu 	},
2160*91f16700Schasinglulu 	[CLK_GEM_TSU] = {
2161*91f16700Schasinglulu 		.name = "gem_tsu",
2162*91f16700Schasinglulu 		.control_reg = IOU_SLCR_GEM_CLK_CTRL,
2163*91f16700Schasinglulu 		.status_reg = 0,
2164*91f16700Schasinglulu 		.parents = &((int32_t []) {
2165*91f16700Schasinglulu 			CLK_GEM_TSU_REF,
2166*91f16700Schasinglulu 			CLK_GEM_TSU_REF,
2167*91f16700Schasinglulu 			EXT_CLK_MIO26 | CLK_EXTERNAL_PARENT,
2168*91f16700Schasinglulu 			EXT_CLK_MIO50_OR_MIO51 | CLK_EXTERNAL_PARENT,
2169*91f16700Schasinglulu 			CLK_NA_PARENT
2170*91f16700Schasinglulu 		}),
2171*91f16700Schasinglulu 		.nodes = &gem_tsu_nodes,
2172*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(gem_tsu_nodes),
2173*91f16700Schasinglulu 	},
2174*91f16700Schasinglulu 	[CLK_CPU_R5_CORE] = {
2175*91f16700Schasinglulu 		.name = "cpu_r5_core",
2176*91f16700Schasinglulu 		.control_reg = CRL_APB_CPU_R5_CTRL,
2177*91f16700Schasinglulu 		.status_reg = 0,
2178*91f16700Schasinglulu 		.parents = &((int32_t []) {
2179*91f16700Schasinglulu 			CLK_CPU_R5 | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2180*91f16700Schasinglulu 			CLK_DUMMY_PARENT,
2181*91f16700Schasinglulu 			CLK_NA_PARENT
2182*91f16700Schasinglulu 		}),
2183*91f16700Schasinglulu 		.nodes = &cpu_r5_core_nodes,
2184*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(cpu_r5_core_nodes),
2185*91f16700Schasinglulu 	},
2186*91f16700Schasinglulu 	[CLK_CAN0_MIO] = {
2187*91f16700Schasinglulu 		.name = "can0_mio",
2188*91f16700Schasinglulu 		.control_reg = IOU_SLCR_CAN_MIO_CTRL,
2189*91f16700Schasinglulu 		.status_reg = 0,
2190*91f16700Schasinglulu 		.parents = &can_mio_parents,
2191*91f16700Schasinglulu 		.nodes = &can0_mio_nodes,
2192*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(can0_mio_nodes),
2193*91f16700Schasinglulu 	},
2194*91f16700Schasinglulu 	[CLK_CAN1_MIO] = {
2195*91f16700Schasinglulu 		.name = "can1_mio",
2196*91f16700Schasinglulu 		.control_reg = IOU_SLCR_CAN_MIO_CTRL,
2197*91f16700Schasinglulu 		.status_reg = 0,
2198*91f16700Schasinglulu 		.parents = &can_mio_parents,
2199*91f16700Schasinglulu 		.nodes = &can1_mio_nodes,
2200*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(can1_mio_nodes),
2201*91f16700Schasinglulu 	},
2202*91f16700Schasinglulu 	[CLK_CAN0] = {
2203*91f16700Schasinglulu 		.name = "can0",
2204*91f16700Schasinglulu 		.control_reg = IOU_SLCR_CAN_MIO_CTRL,
2205*91f16700Schasinglulu 		.status_reg = 0,
2206*91f16700Schasinglulu 		.parents = &((int32_t []) {
2207*91f16700Schasinglulu 			CLK_CAN0_REF,
2208*91f16700Schasinglulu 			CLK_CAN0_MIO,
2209*91f16700Schasinglulu 			CLK_NA_PARENT
2210*91f16700Schasinglulu 		}),
2211*91f16700Schasinglulu 		.nodes = &can0_nodes,
2212*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(can0_nodes),
2213*91f16700Schasinglulu 	},
2214*91f16700Schasinglulu 	[CLK_CAN1] = {
2215*91f16700Schasinglulu 		.name = "can1",
2216*91f16700Schasinglulu 		.control_reg = IOU_SLCR_CAN_MIO_CTRL,
2217*91f16700Schasinglulu 		.status_reg = 0,
2218*91f16700Schasinglulu 		.parents = &((int32_t []) {
2219*91f16700Schasinglulu 			CLK_CAN1_REF,
2220*91f16700Schasinglulu 			CLK_CAN1_MIO,
2221*91f16700Schasinglulu 			CLK_NA_PARENT
2222*91f16700Schasinglulu 		}),
2223*91f16700Schasinglulu 		.nodes = &can1_nodes,
2224*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(can1_nodes),
2225*91f16700Schasinglulu 	},
2226*91f16700Schasinglulu 	[CLK_LPD_WDT] = {
2227*91f16700Schasinglulu 		.name = "lpd_wdt",
2228*91f16700Schasinglulu 		.control_reg = IOU_SLCR_WDT_CLK_SEL,
2229*91f16700Schasinglulu 		.status_reg = 0,
2230*91f16700Schasinglulu 		.parents = &((int32_t []) {
2231*91f16700Schasinglulu 			CLK_LPD_LSBUS,
2232*91f16700Schasinglulu 			EXT_CLK_SWDT1 | CLK_EXTERNAL_PARENT,
2233*91f16700Schasinglulu 			CLK_NA_PARENT
2234*91f16700Schasinglulu 		}),
2235*91f16700Schasinglulu 		.nodes = &wdt_nodes,
2236*91f16700Schasinglulu 		.num_nodes = ARRAY_SIZE(wdt_nodes),
2237*91f16700Schasinglulu 	},
2238*91f16700Schasinglulu };
2239*91f16700Schasinglulu 
2240*91f16700Schasinglulu static struct pm_ext_clock ext_clocks[] = {
2241*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_PSS_REF)] = {
2242*91f16700Schasinglulu 		.name = "pss_ref_clk",
2243*91f16700Schasinglulu 	},
2244*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_VIDEO)] = {
2245*91f16700Schasinglulu 		.name = "video_clk",
2246*91f16700Schasinglulu 	},
2247*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_PSS_ALT_REF)] = {
2248*91f16700Schasinglulu 		.name = "pss_alt_ref_clk",
2249*91f16700Schasinglulu 	},
2250*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_AUX_REF)] = {
2251*91f16700Schasinglulu 		.name = "aux_ref_clk",
2252*91f16700Schasinglulu 	},
2253*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GT_CRX_REF)] = {
2254*91f16700Schasinglulu 		.name = "video_clk",
2255*91f16700Schasinglulu 	},
2256*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_SWDT0)] = {
2257*91f16700Schasinglulu 		.name = "swdt0_ext_clk",
2258*91f16700Schasinglulu 	},
2259*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_SWDT1)] = {
2260*91f16700Schasinglulu 		.name = "swdt1_ext_clk",
2261*91f16700Schasinglulu 	},
2262*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM0_TX_EMIO)] = {
2263*91f16700Schasinglulu 		.name = "gem0_tx_ext",
2264*91f16700Schasinglulu 	},
2265*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM1_TX_EMIO)] = {
2266*91f16700Schasinglulu 		.name = "gem1_tx_ext",
2267*91f16700Schasinglulu 	},
2268*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM2_TX_EMIO)] = {
2269*91f16700Schasinglulu 		.name = "gem2_tx_ext",
2270*91f16700Schasinglulu 	},
2271*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM3_TX_EMIO)] = {
2272*91f16700Schasinglulu 		.name = "gem3_tx_ext",
2273*91f16700Schasinglulu 	},
2274*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM0_RX_EMIO)] = {
2275*91f16700Schasinglulu 		.name = "gem0_rx_ext",
2276*91f16700Schasinglulu 	},
2277*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM1_RX_EMIO)] = {
2278*91f16700Schasinglulu 		.name = "gem1_rx_ext",
2279*91f16700Schasinglulu 	},
2280*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM2_RX_EMIO)] = {
2281*91f16700Schasinglulu 		.name = "gem2_rx_ext",
2282*91f16700Schasinglulu 	},
2283*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_GEM3_RX_EMIO)] = {
2284*91f16700Schasinglulu 		.name = "gem3_rx_ext",
2285*91f16700Schasinglulu 	},
2286*91f16700Schasinglulu 	[EXT_CLK_INDEX(EXT_CLK_MIO50_OR_MIO51)] = {
2287*91f16700Schasinglulu 		.name = "mio_clk_50_51",
2288*91f16700Schasinglulu 	},
2289*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(0),
2290*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(1),
2291*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(2),
2292*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(3),
2293*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(4),
2294*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(5),
2295*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(6),
2296*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(7),
2297*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(8),
2298*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(9),
2299*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(10),
2300*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(11),
2301*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(12),
2302*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(13),
2303*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(14),
2304*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(15),
2305*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(16),
2306*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(17),
2307*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(18),
2308*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(19),
2309*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(20),
2310*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(21),
2311*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(22),
2312*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(23),
2313*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(24),
2314*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(25),
2315*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(26),
2316*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(27),
2317*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(28),
2318*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(29),
2319*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(30),
2320*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(31),
2321*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(32),
2322*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(33),
2323*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(34),
2324*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(35),
2325*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(36),
2326*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(37),
2327*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(38),
2328*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(39),
2329*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(40),
2330*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(41),
2331*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(42),
2332*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(43),
2333*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(44),
2334*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(45),
2335*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(46),
2336*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(47),
2337*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(48),
2338*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(49),
2339*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(50),
2340*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(51),
2341*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(52),
2342*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(53),
2343*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(54),
2344*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(55),
2345*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(56),
2346*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(57),
2347*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(58),
2348*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(59),
2349*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(60),
2350*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(61),
2351*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(62),
2352*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(63),
2353*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(64),
2354*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(65),
2355*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(66),
2356*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(67),
2357*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(68),
2358*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(69),
2359*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(70),
2360*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(71),
2361*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(72),
2362*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(73),
2363*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(74),
2364*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(75),
2365*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(76),
2366*91f16700Schasinglulu 	EXT_CLK_MIO_DATA(77),
2367*91f16700Schasinglulu };
2368*91f16700Schasinglulu 
2369*91f16700Schasinglulu /* Array of clock which are invalid for this variant */
2370*91f16700Schasinglulu static uint32_t pm_clk_invalid_list[] = {CLK_USB0, CLK_USB1, CLK_CSU_SPB,
2371*91f16700Schasinglulu 	CLK_ACPU_FULL,
2372*91f16700Schasinglulu 	CLK_ACPU_HALF,
2373*91f16700Schasinglulu 	CLK_APLL_TO_LPD,
2374*91f16700Schasinglulu 	CLK_DBG_FPD,
2375*91f16700Schasinglulu 	CLK_DBG_LPD,
2376*91f16700Schasinglulu 	CLK_DBG_TRACE,
2377*91f16700Schasinglulu 	CLK_DBG_TSTMP,
2378*91f16700Schasinglulu 	CLK_DDR_REF,
2379*91f16700Schasinglulu 	CLK_TOPSW_MAIN,
2380*91f16700Schasinglulu 	CLK_GTGREF0_REF,
2381*91f16700Schasinglulu 	CLK_LPD_SWITCH,
2382*91f16700Schasinglulu 	CLK_CPU_R5,
2383*91f16700Schasinglulu 	CLK_CPU_R5_CORE,
2384*91f16700Schasinglulu 	CLK_CSU_SPB,
2385*91f16700Schasinglulu 	CLK_CSU_PLL,
2386*91f16700Schasinglulu 	CLK_PCAP,
2387*91f16700Schasinglulu 	CLK_IOU_SWITCH,
2388*91f16700Schasinglulu 	CLK_DLL_REF,
2389*91f16700Schasinglulu 	CLK_TIMESTAMP_REF,
2390*91f16700Schasinglulu };
2391*91f16700Schasinglulu 
2392*91f16700Schasinglulu /**
2393*91f16700Schasinglulu  * pm_clock_valid - Check if clock is valid or not.
2394*91f16700Schasinglulu  * @clock_id: Id of the clock to be queried.
2395*91f16700Schasinglulu  *
2396*91f16700Schasinglulu  * This function is used to check if given clock is valid
2397*91f16700Schasinglulu  * or not for the chip variant.
2398*91f16700Schasinglulu  *
2399*91f16700Schasinglulu  * List of invalid clocks are maintained in array list for
2400*91f16700Schasinglulu  * different variants.
2401*91f16700Schasinglulu  *
2402*91f16700Schasinglulu  * Return: Returns 1 if clock is valid else 0.
2403*91f16700Schasinglulu  *
2404*91f16700Schasinglulu  */
2405*91f16700Schasinglulu static bool pm_clock_valid(uint32_t clock_id)
2406*91f16700Schasinglulu {
2407*91f16700Schasinglulu 	unsigned int i;
2408*91f16700Schasinglulu 
2409*91f16700Schasinglulu 	for (i = 0U; i < ARRAY_SIZE(pm_clk_invalid_list); i++)
2410*91f16700Schasinglulu 		if (pm_clk_invalid_list[i] == clock_id)
2411*91f16700Schasinglulu 			return 0;
2412*91f16700Schasinglulu 
2413*91f16700Schasinglulu 	return 1;
2414*91f16700Schasinglulu }
2415*91f16700Schasinglulu 
2416*91f16700Schasinglulu /**
2417*91f16700Schasinglulu  * pm_clock_type - Get clock's type.
2418*91f16700Schasinglulu  * @clock_id: Id of the clock to be queried.
2419*91f16700Schasinglulu  *
2420*91f16700Schasinglulu  * This function is used to check type of clock (OUTPUT/EXTERNAL).
2421*91f16700Schasinglulu  *
2422*91f16700Schasinglulu  * Return: Returns type of clock (OUTPUT/EXTERNAL).
2423*91f16700Schasinglulu  *
2424*91f16700Schasinglulu  */
2425*91f16700Schasinglulu static uint32_t pm_clock_type(uint32_t clock_id)
2426*91f16700Schasinglulu {
2427*91f16700Schasinglulu 	return (clock_id < CLK_MAX_OUTPUT_CLK) ?
2428*91f16700Schasinglulu 		CLK_TYPE_OUTPUT : CLK_TYPE_EXTERNAL;
2429*91f16700Schasinglulu }
2430*91f16700Schasinglulu 
2431*91f16700Schasinglulu /**
2432*91f16700Schasinglulu  * pm_api_clock_get_num_clocks() - PM call to request number of clocks.
2433*91f16700Schasinglulu  * @nclocks: Number of clocks.
2434*91f16700Schasinglulu  *
2435*91f16700Schasinglulu  * This function is used by master to get number of clocks.
2436*91f16700Schasinglulu  *
2437*91f16700Schasinglulu  * Return: Returns success.
2438*91f16700Schasinglulu  *
2439*91f16700Schasinglulu  */
2440*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_num_clocks(uint32_t *nclocks)
2441*91f16700Schasinglulu {
2442*91f16700Schasinglulu 	*nclocks = CLK_MAX;
2443*91f16700Schasinglulu 
2444*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2445*91f16700Schasinglulu }
2446*91f16700Schasinglulu 
2447*91f16700Schasinglulu /**
2448*91f16700Schasinglulu  * pm_api_clock_get_name() - PM call to request a clock's name.
2449*91f16700Schasinglulu  * @clock_id: Clock ID.
2450*91f16700Schasinglulu  * @name: Name of clock (max 16 bytes).
2451*91f16700Schasinglulu  *
2452*91f16700Schasinglulu  * This function is used by master to get nmae of clock specified
2453*91f16700Schasinglulu  * by given clock ID.
2454*91f16700Schasinglulu  *
2455*91f16700Schasinglulu  */
2456*91f16700Schasinglulu void pm_api_clock_get_name(uint32_t clock_id, char *name)
2457*91f16700Schasinglulu {
2458*91f16700Schasinglulu 	if (clock_id == CLK_MAX) {
2459*91f16700Schasinglulu 		memcpy(name, END_OF_CLK, sizeof(END_OF_CLK) > CLK_NAME_LEN ?
2460*91f16700Schasinglulu 					 CLK_NAME_LEN : sizeof(END_OF_CLK));
2461*91f16700Schasinglulu 	} else if ((clock_id > CLK_MAX) || (!pm_clock_valid(clock_id))) {
2462*91f16700Schasinglulu 		memset(name, 0, CLK_NAME_LEN);
2463*91f16700Schasinglulu 	} else if (clock_id < CLK_MAX_OUTPUT_CLK) {
2464*91f16700Schasinglulu 		memcpy(name, clocks[clock_id].name, CLK_NAME_LEN);
2465*91f16700Schasinglulu 	} else {
2466*91f16700Schasinglulu 		memcpy(name, ext_clocks[clock_id - CLK_MAX_OUTPUT_CLK].name,
2467*91f16700Schasinglulu 		       CLK_NAME_LEN);
2468*91f16700Schasinglulu 	}
2469*91f16700Schasinglulu }
2470*91f16700Schasinglulu 
2471*91f16700Schasinglulu /**
2472*91f16700Schasinglulu  * pm_api_clock_get_topology() - PM call to request a clock's topology.
2473*91f16700Schasinglulu  * @clock_id: Clock ID.
2474*91f16700Schasinglulu  * @index: Topology index for next toplogy node.
2475*91f16700Schasinglulu  * @topology: Buffer to store nodes in topology and flags.
2476*91f16700Schasinglulu  *
2477*91f16700Schasinglulu  * This function is used by master to get topology information for the
2478*91f16700Schasinglulu  * clock specified by given clock ID. Each response would return 3
2479*91f16700Schasinglulu  * topology nodes. To get next nodes, caller needs to call this API with
2480*91f16700Schasinglulu  * index of next node. Index starts from 0.
2481*91f16700Schasinglulu  *
2482*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2483*91f16700Schasinglulu  *
2484*91f16700Schasinglulu  */
2485*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_topology(uint32_t clock_id,
2486*91f16700Schasinglulu 					     uint32_t index,
2487*91f16700Schasinglulu 					     uint32_t *topology)
2488*91f16700Schasinglulu {
2489*91f16700Schasinglulu 	struct pm_clock_node *clock_nodes;
2490*91f16700Schasinglulu 	uint8_t num_nodes;
2491*91f16700Schasinglulu 	uint32_t i;
2492*91f16700Schasinglulu 	uint16_t typeflags;
2493*91f16700Schasinglulu 
2494*91f16700Schasinglulu 	if (!pm_clock_valid(clock_id)) {
2495*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2496*91f16700Schasinglulu 	}
2497*91f16700Schasinglulu 
2498*91f16700Schasinglulu 	if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) {
2499*91f16700Schasinglulu 		return PM_RET_ERROR_NOTSUPPORTED;
2500*91f16700Schasinglulu 	}
2501*91f16700Schasinglulu 
2502*91f16700Schasinglulu 	memset(topology, 0, CLK_TOPOLOGY_PAYLOAD_LEN);
2503*91f16700Schasinglulu 	clock_nodes = *clocks[clock_id].nodes;
2504*91f16700Schasinglulu 	num_nodes = clocks[clock_id].num_nodes;
2505*91f16700Schasinglulu 
2506*91f16700Schasinglulu 	/* Skip parent till index */
2507*91f16700Schasinglulu 	if (index >= num_nodes) {
2508*91f16700Schasinglulu 		return PM_RET_SUCCESS;
2509*91f16700Schasinglulu 	}
2510*91f16700Schasinglulu 
2511*91f16700Schasinglulu 	for (i = 0; i < 3U; i++) {
2512*91f16700Schasinglulu 		if ((index + i) == num_nodes) {
2513*91f16700Schasinglulu 			break;
2514*91f16700Schasinglulu 		}
2515*91f16700Schasinglulu 
2516*91f16700Schasinglulu 		topology[i] = clock_nodes[index + i].type;
2517*91f16700Schasinglulu 		topology[i] |= clock_nodes[index + i].clkflags <<
2518*91f16700Schasinglulu 					CLK_CLKFLAGS_SHIFT;
2519*91f16700Schasinglulu 		typeflags = clock_nodes[index + i].typeflags;
2520*91f16700Schasinglulu 		topology[i] |= (typeflags & CLK_TYPEFLAGS_BITS_MASK) <<
2521*91f16700Schasinglulu 					CLK_TYPEFLAGS_SHIFT;
2522*91f16700Schasinglulu 		topology[i] |= (typeflags & CLK_TYPEFLAGS2_BITS_MASK) >>
2523*91f16700Schasinglulu 				(CLK_TYPEFLAGS_BITS - CLK_TYPEFLAGS2_SHIFT);
2524*91f16700Schasinglulu 	}
2525*91f16700Schasinglulu 
2526*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2527*91f16700Schasinglulu }
2528*91f16700Schasinglulu 
2529*91f16700Schasinglulu /**
2530*91f16700Schasinglulu  * pm_api_clock_get_fixedfactor_params() - PM call to request a clock's fixed
2531*91f16700Schasinglulu  *					   factor parameters for fixed clock.
2532*91f16700Schasinglulu  * @clock_id: Clock ID.
2533*91f16700Schasinglulu  * @mul: Multiplication value.
2534*91f16700Schasinglulu  * @div: Divisor value.
2535*91f16700Schasinglulu  *
2536*91f16700Schasinglulu  * This function is used by master to get fixed factor parameers for the
2537*91f16700Schasinglulu  * fixed clock. This API is application only for the fixed clock.
2538*91f16700Schasinglulu  *
2539*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2540*91f16700Schasinglulu  *
2541*91f16700Schasinglulu  */
2542*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_fixedfactor_params(uint32_t clock_id,
2543*91f16700Schasinglulu 						       uint32_t *mul,
2544*91f16700Schasinglulu 						       uint32_t *div)
2545*91f16700Schasinglulu {
2546*91f16700Schasinglulu 	struct pm_clock_node *clock_nodes;
2547*91f16700Schasinglulu 	uint8_t num_nodes;
2548*91f16700Schasinglulu 	uint32_t type, i;
2549*91f16700Schasinglulu 
2550*91f16700Schasinglulu 	if (!pm_clock_valid(clock_id)) {
2551*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2552*91f16700Schasinglulu 	}
2553*91f16700Schasinglulu 
2554*91f16700Schasinglulu 	if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) {
2555*91f16700Schasinglulu 		return PM_RET_ERROR_NOTSUPPORTED;
2556*91f16700Schasinglulu 	}
2557*91f16700Schasinglulu 
2558*91f16700Schasinglulu 	clock_nodes = *clocks[clock_id].nodes;
2559*91f16700Schasinglulu 	num_nodes = clocks[clock_id].num_nodes;
2560*91f16700Schasinglulu 
2561*91f16700Schasinglulu 	for (i = 0; i < num_nodes; i++) {
2562*91f16700Schasinglulu 		type =  clock_nodes[i].type;
2563*91f16700Schasinglulu 		if (type == TYPE_FIXEDFACTOR) {
2564*91f16700Schasinglulu 			*mul = clock_nodes[i].mult;
2565*91f16700Schasinglulu 			*div = clock_nodes[i].div;
2566*91f16700Schasinglulu 			break;
2567*91f16700Schasinglulu 		}
2568*91f16700Schasinglulu 	}
2569*91f16700Schasinglulu 
2570*91f16700Schasinglulu 	/* Clock is not fixed clock */
2571*91f16700Schasinglulu 	if (i == num_nodes) {
2572*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2573*91f16700Schasinglulu 	}
2574*91f16700Schasinglulu 
2575*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2576*91f16700Schasinglulu }
2577*91f16700Schasinglulu 
2578*91f16700Schasinglulu /**
2579*91f16700Schasinglulu  * pm_api_clock_get_parents() - PM call to request a clock's first 3 parents.
2580*91f16700Schasinglulu  * @clock_id: Clock ID.
2581*91f16700Schasinglulu  * @index: Index of next parent.
2582*91f16700Schasinglulu  * @parents: Parents of the given clock.
2583*91f16700Schasinglulu  *
2584*91f16700Schasinglulu  * This function is used by master to get clock's parents information.
2585*91f16700Schasinglulu  * This API will return 3 parents with a single response. To get other
2586*91f16700Schasinglulu  * parents, master should call same API in loop with new parent index
2587*91f16700Schasinglulu  * till error is returned.
2588*91f16700Schasinglulu  *
2589*91f16700Schasinglulu  * E.g First call should have index 0 which will return parents 0, 1 and
2590*91f16700Schasinglulu  * 2. Next call, index should be 3 which will return parent 3,4 and 5 and
2591*91f16700Schasinglulu  * so on.
2592*91f16700Schasinglulu  *
2593*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2594*91f16700Schasinglulu  *
2595*91f16700Schasinglulu  */
2596*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_parents(uint32_t clock_id,
2597*91f16700Schasinglulu 					    uint32_t index,
2598*91f16700Schasinglulu 					    uint32_t *parents)
2599*91f16700Schasinglulu {
2600*91f16700Schasinglulu 	uint32_t i;
2601*91f16700Schasinglulu 	int32_t *clk_parents;
2602*91f16700Schasinglulu 
2603*91f16700Schasinglulu 	if (!pm_clock_valid(clock_id)) {
2604*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2605*91f16700Schasinglulu 	}
2606*91f16700Schasinglulu 
2607*91f16700Schasinglulu 	if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) {
2608*91f16700Schasinglulu 		return PM_RET_ERROR_NOTSUPPORTED;
2609*91f16700Schasinglulu 	}
2610*91f16700Schasinglulu 
2611*91f16700Schasinglulu 	clk_parents = *clocks[clock_id].parents;
2612*91f16700Schasinglulu 	if (clk_parents == NULL) {
2613*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2614*91f16700Schasinglulu 	}
2615*91f16700Schasinglulu 
2616*91f16700Schasinglulu 	memset(parents, 0, CLK_PARENTS_PAYLOAD_LEN);
2617*91f16700Schasinglulu 
2618*91f16700Schasinglulu 	/* Skip parent till index */
2619*91f16700Schasinglulu 	for (i = 0; i < index; i++) {
2620*91f16700Schasinglulu 		if (clk_parents[i] == CLK_NA_PARENT) {
2621*91f16700Schasinglulu 			return PM_RET_SUCCESS;
2622*91f16700Schasinglulu 		}
2623*91f16700Schasinglulu 	}
2624*91f16700Schasinglulu 
2625*91f16700Schasinglulu 	for (i = 0; i < 3U; i++) {
2626*91f16700Schasinglulu 		parents[i] = clk_parents[index + i];
2627*91f16700Schasinglulu 		if (clk_parents[index + i] == CLK_NA_PARENT) {
2628*91f16700Schasinglulu 			break;
2629*91f16700Schasinglulu 		}
2630*91f16700Schasinglulu 	}
2631*91f16700Schasinglulu 
2632*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2633*91f16700Schasinglulu }
2634*91f16700Schasinglulu 
2635*91f16700Schasinglulu /**
2636*91f16700Schasinglulu  * pm_api_clock_get_attributes() - PM call to request a clock's attributes.
2637*91f16700Schasinglulu  * @clock_id: Clock ID.
2638*91f16700Schasinglulu  * @attr: Clock attributes.
2639*91f16700Schasinglulu  *
2640*91f16700Schasinglulu  * This function is used by master to get clock's attributes
2641*91f16700Schasinglulu  * (e.g. valid, clock type, etc).
2642*91f16700Schasinglulu  *
2643*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2644*91f16700Schasinglulu  *
2645*91f16700Schasinglulu  */
2646*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_attributes(uint32_t clock_id,
2647*91f16700Schasinglulu 					       uint32_t *attr)
2648*91f16700Schasinglulu {
2649*91f16700Schasinglulu 	if (clock_id >= CLK_MAX) {
2650*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2651*91f16700Schasinglulu 	}
2652*91f16700Schasinglulu 
2653*91f16700Schasinglulu 	/* Clock valid bit */
2654*91f16700Schasinglulu 	*attr = pm_clock_valid(clock_id);
2655*91f16700Schasinglulu 
2656*91f16700Schasinglulu 	/* Clock type (Output/External) */
2657*91f16700Schasinglulu 	*attr |= (pm_clock_type(clock_id) << CLK_TYPE_SHIFT);
2658*91f16700Schasinglulu 
2659*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2660*91f16700Schasinglulu }
2661*91f16700Schasinglulu 
2662*91f16700Schasinglulu /**
2663*91f16700Schasinglulu  * pm_api_clock_get_max_divisor - PM call to get max divisor.
2664*91f16700Schasinglulu  * @clock_id: Clock ID.
2665*91f16700Schasinglulu  * @div_type: Divisor Type (TYPE_DIV1 or TYPE_DIV2).
2666*91f16700Schasinglulu  * @max_div: Maximum supported divisor.
2667*91f16700Schasinglulu  *
2668*91f16700Schasinglulu  * This function is used by master to get maximum supported value.
2669*91f16700Schasinglulu  *
2670*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2671*91f16700Schasinglulu  *
2672*91f16700Schasinglulu  */
2673*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_max_divisor(enum clock_id clock_id,
2674*91f16700Schasinglulu 						uint8_t div_type,
2675*91f16700Schasinglulu 						uint32_t *max_div)
2676*91f16700Schasinglulu {
2677*91f16700Schasinglulu 	uint32_t i;
2678*91f16700Schasinglulu 	struct pm_clock_node *nodes;
2679*91f16700Schasinglulu 
2680*91f16700Schasinglulu 	if (clock_id >= CLK_MAX_OUTPUT_CLK) {
2681*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2682*91f16700Schasinglulu 	}
2683*91f16700Schasinglulu 
2684*91f16700Schasinglulu 	nodes = *clocks[clock_id].nodes;
2685*91f16700Schasinglulu 	for (i = 0; i < clocks[clock_id].num_nodes; i++) {
2686*91f16700Schasinglulu 		if (nodes[i].type == div_type) {
2687*91f16700Schasinglulu 			if (CLK_DIVIDER_POWER_OF_TWO &
2688*91f16700Schasinglulu 					nodes[i].typeflags) {
2689*91f16700Schasinglulu 				*max_div = (1U << (BIT(nodes[i].width) - 1U));
2690*91f16700Schasinglulu 			} else {
2691*91f16700Schasinglulu 				*max_div = BIT(nodes[i].width) - 1U;
2692*91f16700Schasinglulu 			}
2693*91f16700Schasinglulu 			return PM_RET_SUCCESS;
2694*91f16700Schasinglulu 		}
2695*91f16700Schasinglulu 	}
2696*91f16700Schasinglulu 
2697*91f16700Schasinglulu 	return PM_RET_ERROR_ARGS;
2698*91f16700Schasinglulu }
2699*91f16700Schasinglulu 
2700*91f16700Schasinglulu /**
2701*91f16700Schasinglulu  * struct pm_pll - PLL related data required to map IOCTL-based PLL control.
2702*91f16700Schasinglulu  * implemented by linux to system-level EEMI APIs.
2703*91f16700Schasinglulu  * @nid: PLL node ID.
2704*91f16700Schasinglulu  * @cid: PLL clock ID.
2705*91f16700Schasinglulu  * @pre_src: Pre-source PLL clock ID.
2706*91f16700Schasinglulu  * @post_src: Post-source PLL clock ID.
2707*91f16700Schasinglulu  * @div2: DIV2 PLL clock ID.
2708*91f16700Schasinglulu  * @bypass: PLL output clock ID that maps to bypass select output.
2709*91f16700Schasinglulu  * @mode: PLL mode currently set via IOCTL (PLL_FRAC_MODE/PLL_INT_MODE).
2710*91f16700Schasinglulu  *
2711*91f16700Schasinglulu  */
2712*91f16700Schasinglulu struct pm_pll {
2713*91f16700Schasinglulu 	const enum pm_node_id nid;
2714*91f16700Schasinglulu 	const enum clock_id cid;
2715*91f16700Schasinglulu 	const enum clock_id pre_src;
2716*91f16700Schasinglulu 	const enum clock_id post_src;
2717*91f16700Schasinglulu 	const enum clock_id div2;
2718*91f16700Schasinglulu 	const enum clock_id bypass;
2719*91f16700Schasinglulu 	uint8_t mode;
2720*91f16700Schasinglulu };
2721*91f16700Schasinglulu 
2722*91f16700Schasinglulu static struct pm_pll pm_plls[] = {
2723*91f16700Schasinglulu 	{
2724*91f16700Schasinglulu 		.nid = NODE_IOPLL,
2725*91f16700Schasinglulu 		.cid = CLK_IOPLL_INT,
2726*91f16700Schasinglulu 		.pre_src = CLK_IOPLL_PRE_SRC,
2727*91f16700Schasinglulu 		.post_src = CLK_IOPLL_POST_SRC,
2728*91f16700Schasinglulu 		.div2 = CLK_IOPLL_INT_MUX,
2729*91f16700Schasinglulu 		.bypass = CLK_IOPLL,
2730*91f16700Schasinglulu 	}, {
2731*91f16700Schasinglulu 		.nid = NODE_RPLL,
2732*91f16700Schasinglulu 		.cid = CLK_RPLL_INT,
2733*91f16700Schasinglulu 		.pre_src = CLK_RPLL_PRE_SRC,
2734*91f16700Schasinglulu 		.post_src = CLK_RPLL_POST_SRC,
2735*91f16700Schasinglulu 		.div2 = CLK_RPLL_INT_MUX,
2736*91f16700Schasinglulu 		.bypass = CLK_RPLL,
2737*91f16700Schasinglulu 	}, {
2738*91f16700Schasinglulu 		.nid = NODE_APLL,
2739*91f16700Schasinglulu 		.cid = CLK_APLL_INT,
2740*91f16700Schasinglulu 		.pre_src = CLK_APLL_PRE_SRC,
2741*91f16700Schasinglulu 		.post_src = CLK_APLL_POST_SRC,
2742*91f16700Schasinglulu 		.div2 = CLK_APLL_INT_MUX,
2743*91f16700Schasinglulu 		.bypass = CLK_APLL,
2744*91f16700Schasinglulu 	}, {
2745*91f16700Schasinglulu 		.nid = NODE_VPLL,
2746*91f16700Schasinglulu 		.cid = CLK_VPLL_INT,
2747*91f16700Schasinglulu 		.pre_src = CLK_VPLL_PRE_SRC,
2748*91f16700Schasinglulu 		.post_src = CLK_VPLL_POST_SRC,
2749*91f16700Schasinglulu 		.div2 = CLK_VPLL_INT_MUX,
2750*91f16700Schasinglulu 		.bypass = CLK_VPLL,
2751*91f16700Schasinglulu 	}, {
2752*91f16700Schasinglulu 		.nid = NODE_DPLL,
2753*91f16700Schasinglulu 		.cid = CLK_DPLL_INT,
2754*91f16700Schasinglulu 		.pre_src = CLK_DPLL_PRE_SRC,
2755*91f16700Schasinglulu 		.post_src = CLK_DPLL_POST_SRC,
2756*91f16700Schasinglulu 		.div2 = CLK_DPLL_INT_MUX,
2757*91f16700Schasinglulu 		.bypass = CLK_DPLL,
2758*91f16700Schasinglulu 	},
2759*91f16700Schasinglulu };
2760*91f16700Schasinglulu 
2761*91f16700Schasinglulu /**
2762*91f16700Schasinglulu  * pm_clock_get_pll() - Get PLL structure by PLL clock ID.
2763*91f16700Schasinglulu  * @clock_id: Clock ID of the target PLL.
2764*91f16700Schasinglulu  *
2765*91f16700Schasinglulu  * Return: Pointer to PLL structure if found, NULL otherwise.
2766*91f16700Schasinglulu  *
2767*91f16700Schasinglulu  */
2768*91f16700Schasinglulu struct pm_pll *pm_clock_get_pll(enum clock_id clock_id)
2769*91f16700Schasinglulu {
2770*91f16700Schasinglulu 	uint32_t i;
2771*91f16700Schasinglulu 
2772*91f16700Schasinglulu 	for (i = 0; i < ARRAY_SIZE(pm_plls); i++) {
2773*91f16700Schasinglulu 		if (pm_plls[i].cid == clock_id) {
2774*91f16700Schasinglulu 			return &pm_plls[i];
2775*91f16700Schasinglulu 		}
2776*91f16700Schasinglulu 	}
2777*91f16700Schasinglulu 
2778*91f16700Schasinglulu 	return NULL;
2779*91f16700Schasinglulu }
2780*91f16700Schasinglulu 
2781*91f16700Schasinglulu /**
2782*91f16700Schasinglulu  * pm_clock_get_pll_node_id() - Get PLL node ID by PLL clock ID.
2783*91f16700Schasinglulu  * @clock_id: Clock ID of the target PLL.
2784*91f16700Schasinglulu  * @node_id: Location to store node ID of the target PLL.
2785*91f16700Schasinglulu  *
2786*91f16700Schasinglulu  * Return: PM_RET_SUCCESS if node ID is found, PM_RET_ERROR_ARGS otherwise.
2787*91f16700Schasinglulu  *
2788*91f16700Schasinglulu  */
2789*91f16700Schasinglulu enum pm_ret_status pm_clock_get_pll_node_id(enum clock_id clock_id,
2790*91f16700Schasinglulu 					    enum pm_node_id *node_id)
2791*91f16700Schasinglulu {
2792*91f16700Schasinglulu 	struct pm_pll *pll = pm_clock_get_pll(clock_id);
2793*91f16700Schasinglulu 
2794*91f16700Schasinglulu 	if (pll) {
2795*91f16700Schasinglulu 		*node_id = pll->nid;
2796*91f16700Schasinglulu 		return PM_RET_SUCCESS;
2797*91f16700Schasinglulu 	}
2798*91f16700Schasinglulu 
2799*91f16700Schasinglulu 	return PM_RET_ERROR_ARGS;
2800*91f16700Schasinglulu }
2801*91f16700Schasinglulu 
2802*91f16700Schasinglulu /**
2803*91f16700Schasinglulu  * pm_clock_get_pll_by_related_clk() - Get PLL structure by PLL-related clock
2804*91f16700Schasinglulu  *                                     ID.
2805*91f16700Schasinglulu  * @clock_id: Clock ID.
2806*91f16700Schasinglulu  *
2807*91f16700Schasinglulu  * Return: Pointer to PLL structure if found, NULL otherwise.
2808*91f16700Schasinglulu  *
2809*91f16700Schasinglulu  */
2810*91f16700Schasinglulu struct pm_pll *pm_clock_get_pll_by_related_clk(enum clock_id clock_id)
2811*91f16700Schasinglulu {
2812*91f16700Schasinglulu 	uint32_t i;
2813*91f16700Schasinglulu 
2814*91f16700Schasinglulu 	for (i = 0; i < ARRAY_SIZE(pm_plls); i++) {
2815*91f16700Schasinglulu 		if (pm_plls[i].pre_src == clock_id ||
2816*91f16700Schasinglulu 		    pm_plls[i].post_src == clock_id ||
2817*91f16700Schasinglulu 		    pm_plls[i].div2 == clock_id ||
2818*91f16700Schasinglulu 		    pm_plls[i].bypass == clock_id) {
2819*91f16700Schasinglulu 			return &pm_plls[i];
2820*91f16700Schasinglulu 		}
2821*91f16700Schasinglulu 	}
2822*91f16700Schasinglulu 
2823*91f16700Schasinglulu 	return NULL;
2824*91f16700Schasinglulu }
2825*91f16700Schasinglulu 
2826*91f16700Schasinglulu /**
2827*91f16700Schasinglulu  * pm_clock_pll_enable() - "Enable" the PLL clock (lock the PLL).
2828*91f16700Schasinglulu  * @pll: PLL to be locked.
2829*91f16700Schasinglulu  *
2830*91f16700Schasinglulu  * This function is used to map IOCTL/linux-based PLL handling to system-level
2831*91f16700Schasinglulu  * EEMI APIs.
2832*91f16700Schasinglulu  *
2833*91f16700Schasinglulu  * Return: Error if the argument is not valid or status as returned by PMU.
2834*91f16700Schasinglulu  *
2835*91f16700Schasinglulu  */
2836*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_enable(struct pm_pll *pll)
2837*91f16700Schasinglulu {
2838*91f16700Schasinglulu 	if (pll == NULL) {
2839*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2840*91f16700Schasinglulu 	}
2841*91f16700Schasinglulu 
2842*91f16700Schasinglulu 	/* Set the PLL mode according to the buffered mode value */
2843*91f16700Schasinglulu 	if (pll->mode == PLL_FRAC_MODE) {
2844*91f16700Schasinglulu 		return pm_pll_set_mode(pll->nid, PM_PLL_MODE_FRACTIONAL);
2845*91f16700Schasinglulu 	}
2846*91f16700Schasinglulu 
2847*91f16700Schasinglulu 	return pm_pll_set_mode(pll->nid, PM_PLL_MODE_INTEGER);
2848*91f16700Schasinglulu }
2849*91f16700Schasinglulu 
2850*91f16700Schasinglulu /**
2851*91f16700Schasinglulu  * pm_clock_pll_disable - "Disable" the PLL clock (bypass/reset the PLL).
2852*91f16700Schasinglulu  * @pll: PLL to be bypassed/reset.
2853*91f16700Schasinglulu  *
2854*91f16700Schasinglulu  * This function is used to map IOCTL/linux-based PLL handling to system-level
2855*91f16700Schasinglulu  * EEMI APIs.
2856*91f16700Schasinglulu  *
2857*91f16700Schasinglulu  * Return: Error if the argument is not valid or status as returned by PMU.
2858*91f16700Schasinglulu  *
2859*91f16700Schasinglulu  */
2860*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_disable(struct pm_pll *pll)
2861*91f16700Schasinglulu {
2862*91f16700Schasinglulu 	if (pll == NULL) {
2863*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2864*91f16700Schasinglulu 	}
2865*91f16700Schasinglulu 
2866*91f16700Schasinglulu 	return pm_pll_set_mode(pll->nid, PM_PLL_MODE_RESET);
2867*91f16700Schasinglulu }
2868*91f16700Schasinglulu 
2869*91f16700Schasinglulu /**
2870*91f16700Schasinglulu  * pm_clock_pll_get_state - Get state of the PLL.
2871*91f16700Schasinglulu  * @pll: Pointer to the target PLL structure.
2872*91f16700Schasinglulu  * @state: Location to store the state: 1/0 ("Enabled"/"Disabled").
2873*91f16700Schasinglulu  *
2874*91f16700Schasinglulu  * "Enable" actually means that the PLL is locked and its bypass is deasserted,
2875*91f16700Schasinglulu  * "Disable" means that it is bypassed.
2876*91f16700Schasinglulu  *
2877*91f16700Schasinglulu  * Return: PM_RET_ERROR_ARGS error if the argument is not valid, success if
2878*91f16700Schasinglulu  *         returned state value is valid or an error if returned by PMU.
2879*91f16700Schasinglulu  */
2880*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_get_state(struct pm_pll *pll,
2881*91f16700Schasinglulu 					  uint32_t *state)
2882*91f16700Schasinglulu {
2883*91f16700Schasinglulu 	enum pm_ret_status status;
2884*91f16700Schasinglulu 	enum pm_pll_mode mode;
2885*91f16700Schasinglulu 
2886*91f16700Schasinglulu 	if ((pll == NULL) || !state) {
2887*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2888*91f16700Schasinglulu 	}
2889*91f16700Schasinglulu 
2890*91f16700Schasinglulu 	status = pm_pll_get_mode(pll->nid, &mode);
2891*91f16700Schasinglulu 	if (status != PM_RET_SUCCESS) {
2892*91f16700Schasinglulu 		return status;
2893*91f16700Schasinglulu 	}
2894*91f16700Schasinglulu 
2895*91f16700Schasinglulu 	if (mode == PM_PLL_MODE_RESET) {
2896*91f16700Schasinglulu 		*state = 0;
2897*91f16700Schasinglulu 	} else {
2898*91f16700Schasinglulu 		*state = 1;
2899*91f16700Schasinglulu 	}
2900*91f16700Schasinglulu 
2901*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2902*91f16700Schasinglulu }
2903*91f16700Schasinglulu 
2904*91f16700Schasinglulu /**
2905*91f16700Schasinglulu  * pm_clock_pll_set_parent - Set the clock parent for PLL-related clock id.
2906*91f16700Schasinglulu  * @pll: Target PLL structure.
2907*91f16700Schasinglulu  * @clock_id: Id of the clock.
2908*91f16700Schasinglulu  * @parent_index: parent index (=mux select value).
2909*91f16700Schasinglulu  *
2910*91f16700Schasinglulu  * The whole clock-tree implementation relies on the fact that parent indexes
2911*91f16700Schasinglulu  * match to the multiplexer select values. This function has to rely on that
2912*91f16700Schasinglulu  * assumption as well => parent_index is actually the mux select value.
2913*91f16700Schasinglulu  *
2914*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2915*91f16700Schasinglulu  *
2916*91f16700Schasinglulu  */
2917*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_set_parent(struct pm_pll *pll,
2918*91f16700Schasinglulu 					   enum clock_id clock_id,
2919*91f16700Schasinglulu 					   uint32_t parent_index)
2920*91f16700Schasinglulu {
2921*91f16700Schasinglulu 	if (pll == NULL) {
2922*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2923*91f16700Schasinglulu 	}
2924*91f16700Schasinglulu 	if (pll->pre_src == clock_id) {
2925*91f16700Schasinglulu 		return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_PRE_SRC,
2926*91f16700Schasinglulu 					    parent_index);
2927*91f16700Schasinglulu 	}
2928*91f16700Schasinglulu 	if (pll->post_src == clock_id) {
2929*91f16700Schasinglulu 		return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_POST_SRC,
2930*91f16700Schasinglulu 					    parent_index);
2931*91f16700Schasinglulu 	}
2932*91f16700Schasinglulu 	if (pll->div2 == clock_id) {
2933*91f16700Schasinglulu 		return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_DIV2,
2934*91f16700Schasinglulu 					    parent_index);
2935*91f16700Schasinglulu 	}
2936*91f16700Schasinglulu 
2937*91f16700Schasinglulu 	return PM_RET_ERROR_ARGS;
2938*91f16700Schasinglulu }
2939*91f16700Schasinglulu 
2940*91f16700Schasinglulu /**
2941*91f16700Schasinglulu  * pm_clock_pll_get_parent - Get mux select value of PLL-related clock parent.
2942*91f16700Schasinglulu  * @pll: Target PLL structure.
2943*91f16700Schasinglulu  * @clock_id: Id of the clock.
2944*91f16700Schasinglulu  * @parent_index: parent index (=mux select value).
2945*91f16700Schasinglulu  *
2946*91f16700Schasinglulu  * This function is used by master to get parent index for PLL-related clock.
2947*91f16700Schasinglulu  *
2948*91f16700Schasinglulu  * Return: Returns status, either success or error+reason.
2949*91f16700Schasinglulu  *
2950*91f16700Schasinglulu  */
2951*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_get_parent(struct pm_pll *pll,
2952*91f16700Schasinglulu 					   enum clock_id clock_id,
2953*91f16700Schasinglulu 					   uint32_t *parent_index)
2954*91f16700Schasinglulu {
2955*91f16700Schasinglulu 	if (pll == NULL) {
2956*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2957*91f16700Schasinglulu 	}
2958*91f16700Schasinglulu 	if (pll->pre_src == clock_id) {
2959*91f16700Schasinglulu 		return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_PRE_SRC,
2960*91f16700Schasinglulu 					    parent_index);
2961*91f16700Schasinglulu 	}
2962*91f16700Schasinglulu 	if (pll->post_src == clock_id) {
2963*91f16700Schasinglulu 		return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_POST_SRC,
2964*91f16700Schasinglulu 					    parent_index);
2965*91f16700Schasinglulu 	}
2966*91f16700Schasinglulu 	if (pll->div2 == clock_id) {
2967*91f16700Schasinglulu 		return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_DIV2,
2968*91f16700Schasinglulu 					    parent_index);
2969*91f16700Schasinglulu 	}
2970*91f16700Schasinglulu 	if (pll->bypass == clock_id) {
2971*91f16700Schasinglulu 		*parent_index = 0;
2972*91f16700Schasinglulu 		return PM_RET_SUCCESS;
2973*91f16700Schasinglulu 	}
2974*91f16700Schasinglulu 
2975*91f16700Schasinglulu 	return PM_RET_ERROR_ARGS;
2976*91f16700Schasinglulu }
2977*91f16700Schasinglulu 
2978*91f16700Schasinglulu /**
2979*91f16700Schasinglulu  * pm_clock_set_pll_mode() -  Set PLL mode.
2980*91f16700Schasinglulu  * @clock_id: PLL clock id.
2981*91f16700Schasinglulu  * @mode: Mode fractional/integer.
2982*91f16700Schasinglulu  *
2983*91f16700Schasinglulu  * This function buffers/saves the PLL mode that is set.
2984*91f16700Schasinglulu  *
2985*91f16700Schasinglulu  * Return: Success if mode is buffered or error if an argument is invalid.
2986*91f16700Schasinglulu  *
2987*91f16700Schasinglulu  */
2988*91f16700Schasinglulu enum pm_ret_status pm_clock_set_pll_mode(enum clock_id clock_id,
2989*91f16700Schasinglulu 					 uint32_t mode)
2990*91f16700Schasinglulu {
2991*91f16700Schasinglulu 	struct pm_pll *pll = pm_clock_get_pll(clock_id);
2992*91f16700Schasinglulu 
2993*91f16700Schasinglulu 	if ((pll == NULL) || (mode != PLL_FRAC_MODE && mode != PLL_INT_MODE)) {
2994*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
2995*91f16700Schasinglulu 	}
2996*91f16700Schasinglulu 	pll->mode = mode;
2997*91f16700Schasinglulu 
2998*91f16700Schasinglulu 	return PM_RET_SUCCESS;
2999*91f16700Schasinglulu }
3000*91f16700Schasinglulu 
3001*91f16700Schasinglulu /**
3002*91f16700Schasinglulu  * pm_clock_get_pll_mode() -  Get PLL mode.
3003*91f16700Schasinglulu  * @clock_id: PLL clock id.
3004*91f16700Schasinglulu  * @mode: Location to store the mode (fractional/integer).
3005*91f16700Schasinglulu  *
3006*91f16700Schasinglulu  * This function returns buffered PLL mode.
3007*91f16700Schasinglulu  *
3008*91f16700Schasinglulu  * Return: Success if mode is stored or error if an argument is invalid.
3009*91f16700Schasinglulu  *
3010*91f16700Schasinglulu  */
3011*91f16700Schasinglulu enum pm_ret_status pm_clock_get_pll_mode(enum clock_id clock_id,
3012*91f16700Schasinglulu 					 uint32_t *mode)
3013*91f16700Schasinglulu {
3014*91f16700Schasinglulu 	struct pm_pll *pll = pm_clock_get_pll(clock_id);
3015*91f16700Schasinglulu 
3016*91f16700Schasinglulu 	if ((pll == NULL) || !mode) {
3017*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
3018*91f16700Schasinglulu 	}
3019*91f16700Schasinglulu 	*mode = pll->mode;
3020*91f16700Schasinglulu 
3021*91f16700Schasinglulu 	return PM_RET_SUCCESS;
3022*91f16700Schasinglulu }
3023*91f16700Schasinglulu 
3024*91f16700Schasinglulu /**
3025*91f16700Schasinglulu  * pm_clock_id_is_valid() -  Check if given clock ID is valid.
3026*91f16700Schasinglulu  * @clock_id: ID of the clock to be checked.
3027*91f16700Schasinglulu  *
3028*91f16700Schasinglulu  * Return: Returns success if clock_id is valid, otherwise an error.
3029*91f16700Schasinglulu  *
3030*91f16700Schasinglulu  */
3031*91f16700Schasinglulu enum pm_ret_status pm_clock_id_is_valid(uint32_t clock_id)
3032*91f16700Schasinglulu {
3033*91f16700Schasinglulu 	if (!pm_clock_valid(clock_id)) {
3034*91f16700Schasinglulu 		return PM_RET_ERROR_ARGS;
3035*91f16700Schasinglulu 	}
3036*91f16700Schasinglulu 
3037*91f16700Schasinglulu 	if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) {
3038*91f16700Schasinglulu 		return PM_RET_ERROR_NOTSUPPORTED;
3039*91f16700Schasinglulu 	}
3040*91f16700Schasinglulu 
3041*91f16700Schasinglulu 	return PM_RET_SUCCESS;
3042*91f16700Schasinglulu }
3043*91f16700Schasinglulu 
3044*91f16700Schasinglulu /**
3045*91f16700Schasinglulu  * pm_clock_has_div() - Check if the clock has divider with given ID.
3046*91f16700Schasinglulu  * @clock_id: Clock ID.
3047*91f16700Schasinglulu  * @div_id: Divider ID.
3048*91f16700Schasinglulu  *
3049*91f16700Schasinglulu  * Return: True(1)=clock has the divider, false(0)=otherwise.
3050*91f16700Schasinglulu  *
3051*91f16700Schasinglulu  */
3052*91f16700Schasinglulu uint8_t pm_clock_has_div(uint32_t clock_id, enum pm_clock_div_id div_id)
3053*91f16700Schasinglulu {
3054*91f16700Schasinglulu 	uint32_t i;
3055*91f16700Schasinglulu 	struct pm_clock_node *nodes;
3056*91f16700Schasinglulu 
3057*91f16700Schasinglulu 	if (clock_id >= CLK_MAX_OUTPUT_CLK) {
3058*91f16700Schasinglulu 		return 0;
3059*91f16700Schasinglulu 	}
3060*91f16700Schasinglulu 
3061*91f16700Schasinglulu 	nodes = *clocks[clock_id].nodes;
3062*91f16700Schasinglulu 	for (i = 0; i < clocks[clock_id].num_nodes; i++) {
3063*91f16700Schasinglulu 		if (nodes[i].type == TYPE_DIV1) {
3064*91f16700Schasinglulu 			if (div_id == PM_CLOCK_DIV0_ID)
3065*91f16700Schasinglulu 				return 1;
3066*91f16700Schasinglulu 		} else if (nodes[i].type == TYPE_DIV2) {
3067*91f16700Schasinglulu 			if (div_id == PM_CLOCK_DIV1_ID)
3068*91f16700Schasinglulu 				return 1;
3069*91f16700Schasinglulu 		} else {
3070*91f16700Schasinglulu 			/* To fix the misra 15.7 warning */
3071*91f16700Schasinglulu 		}
3072*91f16700Schasinglulu 	}
3073*91f16700Schasinglulu 
3074*91f16700Schasinglulu 	return 0;
3075*91f16700Schasinglulu }
3076