xref: /arm-trusted-firmware/drivers/st/clk/clk-stm32-core.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (C) 2022, STMicroelectronics - All Rights Reserved
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef CLK_STM32_CORE_H
8*91f16700Schasinglulu #define CLK_STM32_CORE_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu struct mux_cfg {
11*91f16700Schasinglulu 	uint16_t offset;
12*91f16700Schasinglulu 	uint8_t shift;
13*91f16700Schasinglulu 	uint8_t width;
14*91f16700Schasinglulu 	uint8_t bitrdy;
15*91f16700Schasinglulu };
16*91f16700Schasinglulu 
17*91f16700Schasinglulu struct gate_cfg {
18*91f16700Schasinglulu 	uint16_t offset;
19*91f16700Schasinglulu 	uint8_t bit_idx;
20*91f16700Schasinglulu 	uint8_t set_clr;
21*91f16700Schasinglulu };
22*91f16700Schasinglulu 
23*91f16700Schasinglulu struct clk_div_table {
24*91f16700Schasinglulu 	unsigned int val;
25*91f16700Schasinglulu 	unsigned int div;
26*91f16700Schasinglulu };
27*91f16700Schasinglulu 
28*91f16700Schasinglulu struct div_cfg {
29*91f16700Schasinglulu 	uint16_t offset;
30*91f16700Schasinglulu 	uint8_t shift;
31*91f16700Schasinglulu 	uint8_t width;
32*91f16700Schasinglulu 	uint8_t flags;
33*91f16700Schasinglulu 	uint8_t bitrdy;
34*91f16700Schasinglulu 	const struct clk_div_table *table;
35*91f16700Schasinglulu };
36*91f16700Schasinglulu 
37*91f16700Schasinglulu struct parent_cfg {
38*91f16700Schasinglulu 	uint8_t num_parents;
39*91f16700Schasinglulu 	const uint16_t *id_parents;
40*91f16700Schasinglulu 	struct mux_cfg *mux;
41*91f16700Schasinglulu };
42*91f16700Schasinglulu 
43*91f16700Schasinglulu struct stm32_clk_priv;
44*91f16700Schasinglulu 
45*91f16700Schasinglulu struct stm32_clk_ops {
46*91f16700Schasinglulu 	unsigned long (*recalc_rate)(struct stm32_clk_priv *priv, int id, unsigned long rate);
47*91f16700Schasinglulu 	int (*get_parent)(struct stm32_clk_priv *priv, int id);
48*91f16700Schasinglulu 	int (*set_rate)(struct stm32_clk_priv *priv, int id, unsigned long rate,
49*91f16700Schasinglulu 			unsigned long prate);
50*91f16700Schasinglulu 	int (*enable)(struct stm32_clk_priv *priv, int id);
51*91f16700Schasinglulu 	void (*disable)(struct stm32_clk_priv *priv, int id);
52*91f16700Schasinglulu 	bool (*is_enabled)(struct stm32_clk_priv *priv, int id);
53*91f16700Schasinglulu 	void (*init)(struct stm32_clk_priv *priv, int id);
54*91f16700Schasinglulu };
55*91f16700Schasinglulu 
56*91f16700Schasinglulu struct clk_stm32 {
57*91f16700Schasinglulu 	uint16_t binding;
58*91f16700Schasinglulu 	uint16_t parent;
59*91f16700Schasinglulu 	uint8_t flags;
60*91f16700Schasinglulu 	void *clock_cfg;
61*91f16700Schasinglulu 	const struct stm32_clk_ops *ops;
62*91f16700Schasinglulu };
63*91f16700Schasinglulu 
64*91f16700Schasinglulu struct stm32_clk_priv {
65*91f16700Schasinglulu 	uintptr_t base;
66*91f16700Schasinglulu 	const uint32_t num;
67*91f16700Schasinglulu 	const struct clk_stm32 *clks;
68*91f16700Schasinglulu 	const struct parent_cfg *parents;
69*91f16700Schasinglulu 	const uint32_t nb_parents;
70*91f16700Schasinglulu 	const struct gate_cfg *gates;
71*91f16700Schasinglulu 	const uint32_t nb_gates;
72*91f16700Schasinglulu 	const struct div_cfg *div;
73*91f16700Schasinglulu 	const uint32_t nb_div;
74*91f16700Schasinglulu 	struct clk_oscillator_data *osci_data;
75*91f16700Schasinglulu 	const uint32_t nb_osci_data;
76*91f16700Schasinglulu 	uint32_t *gate_refcounts;
77*91f16700Schasinglulu 	void *pdata;
78*91f16700Schasinglulu };
79*91f16700Schasinglulu 
80*91f16700Schasinglulu struct stm32_clk_bypass {
81*91f16700Schasinglulu 	uint16_t offset;
82*91f16700Schasinglulu 	uint8_t bit_byp;
83*91f16700Schasinglulu 	uint8_t bit_digbyp;
84*91f16700Schasinglulu };
85*91f16700Schasinglulu 
86*91f16700Schasinglulu struct stm32_clk_css {
87*91f16700Schasinglulu 	uint16_t offset;
88*91f16700Schasinglulu 	uint8_t bit_css;
89*91f16700Schasinglulu };
90*91f16700Schasinglulu 
91*91f16700Schasinglulu struct stm32_clk_drive {
92*91f16700Schasinglulu 	uint16_t offset;
93*91f16700Schasinglulu 	uint8_t drv_shift;
94*91f16700Schasinglulu 	uint8_t drv_width;
95*91f16700Schasinglulu 	uint8_t drv_default;
96*91f16700Schasinglulu };
97*91f16700Schasinglulu 
98*91f16700Schasinglulu struct clk_oscillator_data {
99*91f16700Schasinglulu 	const char *name;
100*91f16700Schasinglulu 	uint16_t id_clk;
101*91f16700Schasinglulu 	unsigned long frequency;
102*91f16700Schasinglulu 	uint16_t gate_id;
103*91f16700Schasinglulu 	uint16_t gate_rdy_id;
104*91f16700Schasinglulu 	struct stm32_clk_bypass *bypass;
105*91f16700Schasinglulu 	struct stm32_clk_css *css;
106*91f16700Schasinglulu 	struct stm32_clk_drive *drive;
107*91f16700Schasinglulu };
108*91f16700Schasinglulu 
109*91f16700Schasinglulu struct clk_fixed_rate {
110*91f16700Schasinglulu 	const char *name;
111*91f16700Schasinglulu 	unsigned long fixed_rate;
112*91f16700Schasinglulu };
113*91f16700Schasinglulu 
114*91f16700Schasinglulu struct clk_gate_cfg {
115*91f16700Schasinglulu 	uint32_t offset;
116*91f16700Schasinglulu 	uint8_t bit_idx;
117*91f16700Schasinglulu };
118*91f16700Schasinglulu 
119*91f16700Schasinglulu /* CLOCK FLAGS */
120*91f16700Schasinglulu #define CLK_IS_CRITICAL			BIT(0)
121*91f16700Schasinglulu #define CLK_IGNORE_UNUSED		BIT(1)
122*91f16700Schasinglulu #define CLK_SET_RATE_PARENT		BIT(2)
123*91f16700Schasinglulu 
124*91f16700Schasinglulu #define CLK_DIVIDER_ONE_BASED		BIT(0)
125*91f16700Schasinglulu #define CLK_DIVIDER_POWER_OF_TWO	BIT(1)
126*91f16700Schasinglulu #define CLK_DIVIDER_ALLOW_ZERO		BIT(2)
127*91f16700Schasinglulu #define CLK_DIVIDER_HIWORD_MASK		BIT(3)
128*91f16700Schasinglulu #define CLK_DIVIDER_ROUND_CLOSEST	BIT(4)
129*91f16700Schasinglulu #define CLK_DIVIDER_READ_ONLY		BIT(5)
130*91f16700Schasinglulu #define CLK_DIVIDER_MAX_AT_ZERO		BIT(6)
131*91f16700Schasinglulu #define CLK_DIVIDER_BIG_ENDIAN		BIT(7)
132*91f16700Schasinglulu 
133*91f16700Schasinglulu #define MUX_MAX_PARENTS			U(0x8000)
134*91f16700Schasinglulu #define MUX_PARENT_MASK			GENMASK(14, 0)
135*91f16700Schasinglulu #define MUX_FLAG			U(0x8000)
136*91f16700Schasinglulu #define MUX(mux)			((mux) | MUX_FLAG)
137*91f16700Schasinglulu 
138*91f16700Schasinglulu #define NO_GATE				0
139*91f16700Schasinglulu #define _NO_ID				UINT16_MAX
140*91f16700Schasinglulu #define CLK_IS_ROOT			UINT16_MAX
141*91f16700Schasinglulu #define MUX_NO_BIT_RDY			UINT8_MAX
142*91f16700Schasinglulu #define DIV_NO_BIT_RDY			UINT8_MAX
143*91f16700Schasinglulu 
144*91f16700Schasinglulu #define MASK_WIDTH_SHIFT(_width, _shift) \
145*91f16700Schasinglulu 	GENMASK(((_width) + (_shift) - 1U), (_shift))
146*91f16700Schasinglulu 
147*91f16700Schasinglulu int clk_stm32_init(struct stm32_clk_priv *priv, uintptr_t base);
148*91f16700Schasinglulu void clk_stm32_enable_critical_clocks(void);
149*91f16700Schasinglulu 
150*91f16700Schasinglulu struct stm32_clk_priv *clk_stm32_get_priv(void);
151*91f16700Schasinglulu 
152*91f16700Schasinglulu int clk_get_index(struct stm32_clk_priv *priv, unsigned long binding_id);
153*91f16700Schasinglulu const struct clk_stm32 *_clk_get(struct stm32_clk_priv *priv, int id);
154*91f16700Schasinglulu 
155*91f16700Schasinglulu void clk_oscillator_set_bypass(struct stm32_clk_priv *priv, int id, bool digbyp, bool bypass);
156*91f16700Schasinglulu void clk_oscillator_set_drive(struct stm32_clk_priv *priv, int id, uint8_t lsedrv);
157*91f16700Schasinglulu void clk_oscillator_set_css(struct stm32_clk_priv *priv, int id, bool css);
158*91f16700Schasinglulu 
159*91f16700Schasinglulu int _clk_stm32_gate_wait_ready(struct stm32_clk_priv *priv, uint16_t gate_id, bool ready_on);
160*91f16700Schasinglulu 
161*91f16700Schasinglulu int clk_oscillator_wait_ready(struct stm32_clk_priv *priv, int id, bool ready_on);
162*91f16700Schasinglulu int clk_oscillator_wait_ready_on(struct stm32_clk_priv *priv, int id);
163*91f16700Schasinglulu int clk_oscillator_wait_ready_off(struct stm32_clk_priv *priv, int id);
164*91f16700Schasinglulu 
165*91f16700Schasinglulu int clk_stm32_get_counter(unsigned long binding_id);
166*91f16700Schasinglulu 
167*91f16700Schasinglulu void _clk_stm32_gate_disable(struct stm32_clk_priv *priv, uint16_t gate_id);
168*91f16700Schasinglulu int _clk_stm32_gate_enable(struct stm32_clk_priv *priv, uint16_t gate_id);
169*91f16700Schasinglulu 
170*91f16700Schasinglulu int _clk_stm32_set_parent(struct stm32_clk_priv *priv, int id, int src_id);
171*91f16700Schasinglulu int _clk_stm32_set_parent_by_index(struct stm32_clk_priv *priv, int clk, int sel);
172*91f16700Schasinglulu 
173*91f16700Schasinglulu int _clk_stm32_get_parent(struct stm32_clk_priv *priv, int id);
174*91f16700Schasinglulu int _clk_stm32_get_parent_by_index(struct stm32_clk_priv *priv, int clk_id, int idx);
175*91f16700Schasinglulu int _clk_stm32_get_parent_index(struct stm32_clk_priv *priv, int clk_id);
176*91f16700Schasinglulu 
177*91f16700Schasinglulu unsigned long _clk_stm32_get_rate(struct stm32_clk_priv *priv, int id);
178*91f16700Schasinglulu unsigned long _clk_stm32_get_parent_rate(struct stm32_clk_priv *priv, int id);
179*91f16700Schasinglulu 
180*91f16700Schasinglulu bool _stm32_clk_is_flags(struct stm32_clk_priv *priv, int id, uint8_t flag);
181*91f16700Schasinglulu 
182*91f16700Schasinglulu int _clk_stm32_enable(struct stm32_clk_priv *priv, int id);
183*91f16700Schasinglulu void _clk_stm32_disable(struct stm32_clk_priv *priv, int id);
184*91f16700Schasinglulu 
185*91f16700Schasinglulu int clk_stm32_enable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
186*91f16700Schasinglulu void clk_stm32_disable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
187*91f16700Schasinglulu 
188*91f16700Schasinglulu bool _clk_stm32_is_enabled(struct stm32_clk_priv *priv, int id);
189*91f16700Schasinglulu 
190*91f16700Schasinglulu int _clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int div_id,
191*91f16700Schasinglulu 				unsigned long rate, unsigned long parent_rate);
192*91f16700Schasinglulu 
193*91f16700Schasinglulu int clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int id, unsigned long rate,
194*91f16700Schasinglulu 			       unsigned long prate);
195*91f16700Schasinglulu 
196*91f16700Schasinglulu unsigned long _clk_stm32_divider_recalc(struct stm32_clk_priv *priv,
197*91f16700Schasinglulu 					int div_id,
198*91f16700Schasinglulu 					unsigned long prate);
199*91f16700Schasinglulu 
200*91f16700Schasinglulu unsigned long clk_stm32_divider_recalc(struct stm32_clk_priv *priv, int idx,
201*91f16700Schasinglulu 				       unsigned long prate);
202*91f16700Schasinglulu 
203*91f16700Schasinglulu int clk_stm32_gate_enable(struct stm32_clk_priv *priv, int idx);
204*91f16700Schasinglulu void clk_stm32_gate_disable(struct stm32_clk_priv *priv, int idx);
205*91f16700Schasinglulu 
206*91f16700Schasinglulu bool _clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int gate_id);
207*91f16700Schasinglulu bool clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int idx);
208*91f16700Schasinglulu 
209*91f16700Schasinglulu uint32_t clk_stm32_div_get_value(struct stm32_clk_priv *priv, int div_id);
210*91f16700Schasinglulu int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value);
211*91f16700Schasinglulu int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel);
212*91f16700Schasinglulu int clk_mux_get_parent(struct stm32_clk_priv *priv, uint32_t mux_id);
213*91f16700Schasinglulu 
214*91f16700Schasinglulu int stm32_clk_parse_fdt_by_name(void *fdt, int node, const char *name, uint32_t *tab, uint32_t *nb);
215*91f16700Schasinglulu 
216*91f16700Schasinglulu #ifdef CFG_STM32_CLK_DEBUG
217*91f16700Schasinglulu void clk_stm32_display_clock_info(void);
218*91f16700Schasinglulu #endif
219*91f16700Schasinglulu 
220*91f16700Schasinglulu struct clk_stm32_div_cfg {
221*91f16700Schasinglulu 	int id;
222*91f16700Schasinglulu };
223*91f16700Schasinglulu 
224*91f16700Schasinglulu #define STM32_DIV(idx, _binding, _parent, _flags, _div_id) \
225*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
226*91f16700Schasinglulu 		.binding	= (_binding),\
227*91f16700Schasinglulu 		.parent		=  (_parent),\
228*91f16700Schasinglulu 		.flags		= (_flags),\
229*91f16700Schasinglulu 		.clock_cfg	= &(struct clk_stm32_div_cfg){\
230*91f16700Schasinglulu 			.id	= (_div_id),\
231*91f16700Schasinglulu 		},\
232*91f16700Schasinglulu 		.ops		= &clk_stm32_divider_ops,\
233*91f16700Schasinglulu 	}
234*91f16700Schasinglulu 
235*91f16700Schasinglulu struct clk_stm32_gate_cfg {
236*91f16700Schasinglulu 	int id;
237*91f16700Schasinglulu };
238*91f16700Schasinglulu 
239*91f16700Schasinglulu #define STM32_GATE(idx, _binding, _parent, _flags, _gate_id) \
240*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
241*91f16700Schasinglulu 		.binding	= (_binding),\
242*91f16700Schasinglulu 		.parent		=  (_parent),\
243*91f16700Schasinglulu 		.flags		= (_flags),\
244*91f16700Schasinglulu 		.clock_cfg	= &(struct clk_stm32_gate_cfg){\
245*91f16700Schasinglulu 			.id	= (_gate_id),\
246*91f16700Schasinglulu 		},\
247*91f16700Schasinglulu 		.ops		= &clk_stm32_gate_ops,\
248*91f16700Schasinglulu 	}
249*91f16700Schasinglulu 
250*91f16700Schasinglulu struct fixed_factor_cfg {
251*91f16700Schasinglulu 	unsigned int mult;
252*91f16700Schasinglulu 	unsigned int div;
253*91f16700Schasinglulu };
254*91f16700Schasinglulu 
255*91f16700Schasinglulu unsigned long fixed_factor_recalc_rate(struct stm32_clk_priv *priv,
256*91f16700Schasinglulu 				       int _idx, unsigned long prate);
257*91f16700Schasinglulu 
258*91f16700Schasinglulu #define FIXED_FACTOR(idx, _idx, _parent, _mult, _div) \
259*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
260*91f16700Schasinglulu 		.binding	= (_idx),\
261*91f16700Schasinglulu 		.parent		= (_parent),\
262*91f16700Schasinglulu 		.clock_cfg	= &(struct fixed_factor_cfg){\
263*91f16700Schasinglulu 			.mult	= (_mult),\
264*91f16700Schasinglulu 			.div	= (_div),\
265*91f16700Schasinglulu 		},\
266*91f16700Schasinglulu 		.ops		= &clk_fixed_factor_ops,\
267*91f16700Schasinglulu 	}
268*91f16700Schasinglulu 
269*91f16700Schasinglulu #define GATE(idx, _binding, _parent, _flags, _offset, _bit_idx) \
270*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
271*91f16700Schasinglulu 		.binding	= (_binding),\
272*91f16700Schasinglulu 		.parent		=  (_parent),\
273*91f16700Schasinglulu 		.flags		= (_flags),\
274*91f16700Schasinglulu 		.clock_cfg	= &(struct clk_gate_cfg){\
275*91f16700Schasinglulu 			.offset		= (_offset),\
276*91f16700Schasinglulu 			.bit_idx	= (_bit_idx),\
277*91f16700Schasinglulu 		},\
278*91f16700Schasinglulu 		.ops		= &clk_gate_ops,\
279*91f16700Schasinglulu 	}
280*91f16700Schasinglulu 
281*91f16700Schasinglulu #define STM32_MUX(idx, _binding, _mux_id, _flags) \
282*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
283*91f16700Schasinglulu 		.binding	= (_binding),\
284*91f16700Schasinglulu 		.parent		= (MUX(_mux_id)),\
285*91f16700Schasinglulu 		.flags		= (_flags),\
286*91f16700Schasinglulu 		.clock_cfg	= NULL,\
287*91f16700Schasinglulu 		.ops		= (&clk_mux_ops),\
288*91f16700Schasinglulu 	}
289*91f16700Schasinglulu 
290*91f16700Schasinglulu struct clk_timer_cfg {
291*91f16700Schasinglulu 	uint32_t apbdiv;
292*91f16700Schasinglulu 	uint32_t timpre;
293*91f16700Schasinglulu };
294*91f16700Schasinglulu 
295*91f16700Schasinglulu #define CK_TIMER(idx, _idx, _parent, _flags, _apbdiv, _timpre) \
296*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
297*91f16700Schasinglulu 		.binding	= (_idx),\
298*91f16700Schasinglulu 		.parent		= (_parent),\
299*91f16700Schasinglulu 		.flags		= (CLK_SET_RATE_PARENT | (_flags)),\
300*91f16700Schasinglulu 		.clock_cfg	= &(struct clk_timer_cfg){\
301*91f16700Schasinglulu 			.apbdiv = (_apbdiv),\
302*91f16700Schasinglulu 			.timpre = (_timpre),\
303*91f16700Schasinglulu 		},\
304*91f16700Schasinglulu 		.ops		= &clk_timer_ops,\
305*91f16700Schasinglulu 	}
306*91f16700Schasinglulu 
307*91f16700Schasinglulu struct clk_stm32_fixed_rate_cfg {
308*91f16700Schasinglulu 	unsigned long rate;
309*91f16700Schasinglulu };
310*91f16700Schasinglulu 
311*91f16700Schasinglulu #define CLK_FIXED_RATE(idx, _binding, _rate) \
312*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
313*91f16700Schasinglulu 		.binding	= (_binding),\
314*91f16700Schasinglulu 		.parent		= (CLK_IS_ROOT),\
315*91f16700Schasinglulu 		.clock_cfg	= &(struct clk_stm32_fixed_rate_cfg){\
316*91f16700Schasinglulu 			.rate	= (_rate),\
317*91f16700Schasinglulu 		},\
318*91f16700Schasinglulu 		.ops		= &clk_stm32_fixed_rate_ops,\
319*91f16700Schasinglulu 	}
320*91f16700Schasinglulu 
321*91f16700Schasinglulu #define BYPASS(_offset, _bit_byp, _bit_digbyp) &(struct stm32_clk_bypass){\
322*91f16700Schasinglulu 	.offset		= (_offset),\
323*91f16700Schasinglulu 	.bit_byp	= (_bit_byp),\
324*91f16700Schasinglulu 	.bit_digbyp	= (_bit_digbyp),\
325*91f16700Schasinglulu }
326*91f16700Schasinglulu 
327*91f16700Schasinglulu #define CSS(_offset, _bit_css)	&(struct stm32_clk_css){\
328*91f16700Schasinglulu 	.offset		= (_offset),\
329*91f16700Schasinglulu 	.bit_css	= (_bit_css),\
330*91f16700Schasinglulu }
331*91f16700Schasinglulu 
332*91f16700Schasinglulu #define DRIVE(_offset, _shift, _width, _default) &(struct stm32_clk_drive){\
333*91f16700Schasinglulu 	.offset		= (_offset),\
334*91f16700Schasinglulu 	.drv_shift	= (_shift),\
335*91f16700Schasinglulu 	.drv_width	= (_width),\
336*91f16700Schasinglulu 	.drv_default	= (_default),\
337*91f16700Schasinglulu }
338*91f16700Schasinglulu 
339*91f16700Schasinglulu #define OSCILLATOR(idx_osc, _id, _name, _gate_id, _gate_rdy_id, _bypass, _css, _drive) \
340*91f16700Schasinglulu 	[(idx_osc)] = (struct clk_oscillator_data){\
341*91f16700Schasinglulu 		.name		= (_name),\
342*91f16700Schasinglulu 		.id_clk		= (_id),\
343*91f16700Schasinglulu 		.gate_id	= (_gate_id),\
344*91f16700Schasinglulu 		.gate_rdy_id	= (_gate_rdy_id),\
345*91f16700Schasinglulu 		.bypass		= (_bypass),\
346*91f16700Schasinglulu 		.css		= (_css),\
347*91f16700Schasinglulu 		.drive		= (_drive),\
348*91f16700Schasinglulu 	}
349*91f16700Schasinglulu 
350*91f16700Schasinglulu struct clk_oscillator_data *clk_oscillator_get_data(struct stm32_clk_priv *priv, int id);
351*91f16700Schasinglulu 
352*91f16700Schasinglulu void clk_stm32_osc_init(struct stm32_clk_priv *priv, int id);
353*91f16700Schasinglulu bool clk_stm32_osc_gate_is_enabled(struct stm32_clk_priv *priv, int id);
354*91f16700Schasinglulu int clk_stm32_osc_gate_enable(struct stm32_clk_priv *priv, int id);
355*91f16700Schasinglulu void clk_stm32_osc_gate_disable(struct stm32_clk_priv *priv, int id);
356*91f16700Schasinglulu 
357*91f16700Schasinglulu struct stm32_osc_cfg {
358*91f16700Schasinglulu 	int osc_id;
359*91f16700Schasinglulu };
360*91f16700Schasinglulu 
361*91f16700Schasinglulu #define CLK_OSC(idx, _idx, _parent, _osc_id) \
362*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
363*91f16700Schasinglulu 		.binding	= (_idx),\
364*91f16700Schasinglulu 		.parent		= (_parent),\
365*91f16700Schasinglulu 		.flags		= CLK_IS_CRITICAL,\
366*91f16700Schasinglulu 		.clock_cfg	= &(struct stm32_osc_cfg){\
367*91f16700Schasinglulu 			.osc_id = (_osc_id),\
368*91f16700Schasinglulu 		},\
369*91f16700Schasinglulu 		.ops		= &clk_stm32_osc_ops,\
370*91f16700Schasinglulu 	}
371*91f16700Schasinglulu 
372*91f16700Schasinglulu #define CLK_OSC_FIXED(idx, _idx, _parent, _osc_id) \
373*91f16700Schasinglulu 	[(idx)] = (struct clk_stm32){ \
374*91f16700Schasinglulu 		.binding	= (_idx),\
375*91f16700Schasinglulu 		.parent		= (_parent),\
376*91f16700Schasinglulu 		.flags		= CLK_IS_CRITICAL,\
377*91f16700Schasinglulu 		.clock_cfg	= &(struct stm32_osc_cfg){\
378*91f16700Schasinglulu 			.osc_id	= (_osc_id),\
379*91f16700Schasinglulu 		},\
380*91f16700Schasinglulu 		.ops		= &clk_stm32_osc_nogate_ops,\
381*91f16700Schasinglulu 	}
382*91f16700Schasinglulu 
383*91f16700Schasinglulu extern const struct stm32_clk_ops clk_mux_ops;
384*91f16700Schasinglulu extern const struct stm32_clk_ops clk_stm32_divider_ops;
385*91f16700Schasinglulu extern const struct stm32_clk_ops clk_stm32_gate_ops;
386*91f16700Schasinglulu extern const struct stm32_clk_ops clk_fixed_factor_ops;
387*91f16700Schasinglulu extern const struct stm32_clk_ops clk_gate_ops;
388*91f16700Schasinglulu extern const struct stm32_clk_ops clk_timer_ops;
389*91f16700Schasinglulu extern const struct stm32_clk_ops clk_stm32_fixed_rate_ops;
390*91f16700Schasinglulu extern const struct stm32_clk_ops clk_stm32_osc_ops;
391*91f16700Schasinglulu extern const struct stm32_clk_ops clk_stm32_osc_nogate_ops;
392*91f16700Schasinglulu 
393*91f16700Schasinglulu #endif /* CLK_STM32_CORE_H */
394