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