xref: /rk3399_ARM-atf/drivers/st/clk/clk-stm32-core.h (revision 78ff36192f7dd4defa874d8f4387ec94cfcd20ee)
19be88e75SGabriel Fernandez /*
2d9a7ddebSGabriel Fernandez  * Copyright (C) 2022-2024, STMicroelectronics - All Rights Reserved
39be88e75SGabriel Fernandez  *
49be88e75SGabriel Fernandez  * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
59be88e75SGabriel Fernandez  */
69be88e75SGabriel Fernandez 
79be88e75SGabriel Fernandez #ifndef CLK_STM32_CORE_H
89be88e75SGabriel Fernandez #define CLK_STM32_CORE_H
99be88e75SGabriel Fernandez 
109be88e75SGabriel Fernandez struct mux_cfg {
119be88e75SGabriel Fernandez 	uint16_t offset;
129be88e75SGabriel Fernandez 	uint8_t shift;
139be88e75SGabriel Fernandez 	uint8_t width;
149be88e75SGabriel Fernandez 	uint8_t bitrdy;
159be88e75SGabriel Fernandez };
169be88e75SGabriel Fernandez 
179be88e75SGabriel Fernandez struct gate_cfg {
189be88e75SGabriel Fernandez 	uint16_t offset;
199be88e75SGabriel Fernandez 	uint8_t bit_idx;
209be88e75SGabriel Fernandez 	uint8_t set_clr;
219be88e75SGabriel Fernandez };
229be88e75SGabriel Fernandez 
239be88e75SGabriel Fernandez struct clk_div_table {
24d9a7ddebSGabriel Fernandez 	uint16_t val;
25d9a7ddebSGabriel Fernandez 	uint16_t div;
269be88e75SGabriel Fernandez };
279be88e75SGabriel Fernandez 
289be88e75SGabriel Fernandez struct div_cfg {
29d9a7ddebSGabriel Fernandez 	const struct clk_div_table *table;
309be88e75SGabriel Fernandez 	uint16_t offset;
319be88e75SGabriel Fernandez 	uint8_t shift;
329be88e75SGabriel Fernandez 	uint8_t width;
339be88e75SGabriel Fernandez 	uint8_t flags;
349be88e75SGabriel Fernandez 	uint8_t bitrdy;
359be88e75SGabriel Fernandez };
369be88e75SGabriel Fernandez 
379be88e75SGabriel Fernandez struct parent_cfg {
389be88e75SGabriel Fernandez 	const uint16_t *id_parents;
399be88e75SGabriel Fernandez 	struct mux_cfg *mux;
40d9a7ddebSGabriel Fernandez 	uint8_t num_parents;
419be88e75SGabriel Fernandez };
429be88e75SGabriel Fernandez 
439be88e75SGabriel Fernandez struct stm32_clk_priv;
449be88e75SGabriel Fernandez 
459be88e75SGabriel Fernandez struct stm32_clk_ops {
469be88e75SGabriel Fernandez 	unsigned long (*recalc_rate)(struct stm32_clk_priv *priv, int id, unsigned long rate);
479be88e75SGabriel Fernandez 	int (*get_parent)(struct stm32_clk_priv *priv, int id);
489be88e75SGabriel Fernandez 	int (*set_rate)(struct stm32_clk_priv *priv, int id, unsigned long rate,
499be88e75SGabriel Fernandez 			unsigned long prate);
509be88e75SGabriel Fernandez 	int (*enable)(struct stm32_clk_priv *priv, int id);
519be88e75SGabriel Fernandez 	void (*disable)(struct stm32_clk_priv *priv, int id);
529be88e75SGabriel Fernandez 	bool (*is_enabled)(struct stm32_clk_priv *priv, int id);
539be88e75SGabriel Fernandez 	void (*init)(struct stm32_clk_priv *priv, int id);
549be88e75SGabriel Fernandez };
559be88e75SGabriel Fernandez 
569be88e75SGabriel Fernandez struct clk_stm32 {
579be88e75SGabriel Fernandez 	uint16_t binding;
589be88e75SGabriel Fernandez 	uint16_t parent;
59d9a7ddebSGabriel Fernandez 	uint8_t ops;
609be88e75SGabriel Fernandez 	uint8_t flags;
619be88e75SGabriel Fernandez 	void *clock_cfg;
629be88e75SGabriel Fernandez };
639be88e75SGabriel Fernandez 
649be88e75SGabriel Fernandez struct stm32_clk_priv {
659be88e75SGabriel Fernandez 	uintptr_t base;
669be88e75SGabriel Fernandez 	const uint32_t num;
679be88e75SGabriel Fernandez 	const struct clk_stm32 *clks;
689be88e75SGabriel Fernandez 	const struct parent_cfg *parents;
699be88e75SGabriel Fernandez 	const uint32_t nb_parents;
709be88e75SGabriel Fernandez 	const struct gate_cfg *gates;
719be88e75SGabriel Fernandez 	const uint32_t nb_gates;
729be88e75SGabriel Fernandez 	const struct div_cfg *div;
739be88e75SGabriel Fernandez 	const uint32_t nb_div;
749be88e75SGabriel Fernandez 	struct clk_oscillator_data *osci_data;
759be88e75SGabriel Fernandez 	const uint32_t nb_osci_data;
76d9a7ddebSGabriel Fernandez 	uint8_t *gate_refcounts;
779be88e75SGabriel Fernandez 	void *pdata;
78d9a7ddebSGabriel Fernandez 	const struct stm32_clk_ops **ops_array;
799be88e75SGabriel Fernandez };
809be88e75SGabriel Fernandez 
819be88e75SGabriel Fernandez struct stm32_clk_bypass {
829be88e75SGabriel Fernandez 	uint16_t offset;
839be88e75SGabriel Fernandez 	uint8_t bit_byp;
849be88e75SGabriel Fernandez 	uint8_t bit_digbyp;
859be88e75SGabriel Fernandez };
869be88e75SGabriel Fernandez 
879be88e75SGabriel Fernandez struct stm32_clk_css {
889be88e75SGabriel Fernandez 	uint16_t offset;
899be88e75SGabriel Fernandez 	uint8_t bit_css;
909be88e75SGabriel Fernandez };
919be88e75SGabriel Fernandez 
929be88e75SGabriel Fernandez struct stm32_clk_drive {
939be88e75SGabriel Fernandez 	uint16_t offset;
949be88e75SGabriel Fernandez 	uint8_t drv_shift;
959be88e75SGabriel Fernandez 	uint8_t drv_width;
969be88e75SGabriel Fernandez 	uint8_t drv_default;
979be88e75SGabriel Fernandez };
989be88e75SGabriel Fernandez 
999be88e75SGabriel Fernandez struct clk_oscillator_data {
1009be88e75SGabriel Fernandez 	const char *name;
1019be88e75SGabriel Fernandez 	struct stm32_clk_bypass *bypass;
1029be88e75SGabriel Fernandez 	struct stm32_clk_css *css;
1039be88e75SGabriel Fernandez 	struct stm32_clk_drive *drive;
104d9a7ddebSGabriel Fernandez 	unsigned long frequency;
105d9a7ddebSGabriel Fernandez 	uint16_t id_clk;
106d9a7ddebSGabriel Fernandez 	uint16_t gate_id;
107d9a7ddebSGabriel Fernandez 	uint16_t gate_rdy_id;
108d9a7ddebSGabriel Fernandez 
1099be88e75SGabriel Fernandez };
1109be88e75SGabriel Fernandez 
1119be88e75SGabriel Fernandez struct clk_gate_cfg {
1129be88e75SGabriel Fernandez 	uint32_t offset;
1139be88e75SGabriel Fernandez 	uint8_t bit_idx;
1149be88e75SGabriel Fernandez };
1159be88e75SGabriel Fernandez 
1169be88e75SGabriel Fernandez /* CLOCK FLAGS */
1179be88e75SGabriel Fernandez #define CLK_IS_CRITICAL			BIT(0)
1189be88e75SGabriel Fernandez #define CLK_IGNORE_UNUSED		BIT(1)
1199be88e75SGabriel Fernandez #define CLK_SET_RATE_PARENT		BIT(2)
1209be88e75SGabriel Fernandez 
1219be88e75SGabriel Fernandez #define CLK_DIVIDER_ONE_BASED		BIT(0)
1229be88e75SGabriel Fernandez #define CLK_DIVIDER_POWER_OF_TWO	BIT(1)
1239be88e75SGabriel Fernandez #define CLK_DIVIDER_ALLOW_ZERO		BIT(2)
1249be88e75SGabriel Fernandez #define CLK_DIVIDER_HIWORD_MASK		BIT(3)
1259be88e75SGabriel Fernandez #define CLK_DIVIDER_ROUND_CLOSEST	BIT(4)
1269be88e75SGabriel Fernandez #define CLK_DIVIDER_READ_ONLY		BIT(5)
1279be88e75SGabriel Fernandez #define CLK_DIVIDER_MAX_AT_ZERO		BIT(6)
1289be88e75SGabriel Fernandez #define CLK_DIVIDER_BIG_ENDIAN		BIT(7)
1299be88e75SGabriel Fernandez 
1309be88e75SGabriel Fernandez #define MUX_MAX_PARENTS			U(0x8000)
1319be88e75SGabriel Fernandez #define MUX_PARENT_MASK			GENMASK(14, 0)
1329be88e75SGabriel Fernandez #define MUX_FLAG			U(0x8000)
1339be88e75SGabriel Fernandez #define MUX(mux)			((mux) | MUX_FLAG)
1349be88e75SGabriel Fernandez 
1359be88e75SGabriel Fernandez #define NO_GATE				0
1369be88e75SGabriel Fernandez #define _NO_ID				UINT16_MAX
1379be88e75SGabriel Fernandez #define CLK_IS_ROOT			UINT16_MAX
1389be88e75SGabriel Fernandez #define MUX_NO_BIT_RDY			UINT8_MAX
1399be88e75SGabriel Fernandez #define DIV_NO_BIT_RDY			UINT8_MAX
1409be88e75SGabriel Fernandez 
1419be88e75SGabriel Fernandez #define MASK_WIDTH_SHIFT(_width, _shift) \
1429be88e75SGabriel Fernandez 	GENMASK(((_width) + (_shift) - 1U), (_shift))
1439be88e75SGabriel Fernandez 
144*1be399b8SYann Gautier void clk_stm32_rcc_regs_lock(void);
145*1be399b8SYann Gautier void clk_stm32_rcc_regs_unlock(void);
146*1be399b8SYann Gautier 
1479be88e75SGabriel Fernandez int clk_stm32_init(struct stm32_clk_priv *priv, uintptr_t base);
1489be88e75SGabriel Fernandez void clk_stm32_enable_critical_clocks(void);
1499be88e75SGabriel Fernandez 
1509be88e75SGabriel Fernandez struct stm32_clk_priv *clk_stm32_get_priv(void);
1519be88e75SGabriel Fernandez 
1529be88e75SGabriel Fernandez int clk_get_index(struct stm32_clk_priv *priv, unsigned long binding_id);
1539be88e75SGabriel Fernandez const struct clk_stm32 *_clk_get(struct stm32_clk_priv *priv, int id);
1549be88e75SGabriel Fernandez 
1559be88e75SGabriel Fernandez void clk_oscillator_set_bypass(struct stm32_clk_priv *priv, int id, bool digbyp, bool bypass);
1569be88e75SGabriel Fernandez void clk_oscillator_set_drive(struct stm32_clk_priv *priv, int id, uint8_t lsedrv);
1579be88e75SGabriel Fernandez void clk_oscillator_set_css(struct stm32_clk_priv *priv, int id, bool css);
1589be88e75SGabriel Fernandez 
1599be88e75SGabriel Fernandez int _clk_stm32_gate_wait_ready(struct stm32_clk_priv *priv, uint16_t gate_id, bool ready_on);
1609be88e75SGabriel Fernandez 
1619be88e75SGabriel Fernandez int clk_oscillator_wait_ready(struct stm32_clk_priv *priv, int id, bool ready_on);
1629be88e75SGabriel Fernandez int clk_oscillator_wait_ready_on(struct stm32_clk_priv *priv, int id);
1639be88e75SGabriel Fernandez int clk_oscillator_wait_ready_off(struct stm32_clk_priv *priv, int id);
1649be88e75SGabriel Fernandez 
1659be88e75SGabriel Fernandez int clk_stm32_get_counter(unsigned long binding_id);
1669be88e75SGabriel Fernandez 
1679be88e75SGabriel Fernandez void _clk_stm32_gate_disable(struct stm32_clk_priv *priv, uint16_t gate_id);
1689be88e75SGabriel Fernandez int _clk_stm32_gate_enable(struct stm32_clk_priv *priv, uint16_t gate_id);
1699be88e75SGabriel Fernandez 
1709be88e75SGabriel Fernandez int _clk_stm32_set_parent(struct stm32_clk_priv *priv, int id, int src_id);
1719be88e75SGabriel Fernandez int _clk_stm32_set_parent_by_index(struct stm32_clk_priv *priv, int clk, int sel);
1729be88e75SGabriel Fernandez 
1739be88e75SGabriel Fernandez int _clk_stm32_get_parent(struct stm32_clk_priv *priv, int id);
1749be88e75SGabriel Fernandez int _clk_stm32_get_parent_by_index(struct stm32_clk_priv *priv, int clk_id, int idx);
1759be88e75SGabriel Fernandez int _clk_stm32_get_parent_index(struct stm32_clk_priv *priv, int clk_id);
1769be88e75SGabriel Fernandez 
1779be88e75SGabriel Fernandez unsigned long _clk_stm32_get_rate(struct stm32_clk_priv *priv, int id);
1789be88e75SGabriel Fernandez unsigned long _clk_stm32_get_parent_rate(struct stm32_clk_priv *priv, int id);
1799be88e75SGabriel Fernandez 
1809be88e75SGabriel Fernandez bool _stm32_clk_is_flags(struct stm32_clk_priv *priv, int id, uint8_t flag);
1819be88e75SGabriel Fernandez 
1829be88e75SGabriel Fernandez int _clk_stm32_enable(struct stm32_clk_priv *priv, int id);
1839be88e75SGabriel Fernandez void _clk_stm32_disable(struct stm32_clk_priv *priv, int id);
1849be88e75SGabriel Fernandez 
1859be88e75SGabriel Fernandez int clk_stm32_enable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
1869be88e75SGabriel Fernandez void clk_stm32_disable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
1879be88e75SGabriel Fernandez 
1889be88e75SGabriel Fernandez bool _clk_stm32_is_enabled(struct stm32_clk_priv *priv, int id);
1899be88e75SGabriel Fernandez 
1909be88e75SGabriel Fernandez int _clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int div_id,
1919be88e75SGabriel Fernandez 				unsigned long rate, unsigned long parent_rate);
1929be88e75SGabriel Fernandez 
1939be88e75SGabriel Fernandez int clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int id, unsigned long rate,
1949be88e75SGabriel Fernandez 			       unsigned long prate);
1959be88e75SGabriel Fernandez 
1969be88e75SGabriel Fernandez unsigned long _clk_stm32_divider_recalc(struct stm32_clk_priv *priv,
1979be88e75SGabriel Fernandez 					int div_id,
1989be88e75SGabriel Fernandez 					unsigned long prate);
1999be88e75SGabriel Fernandez 
2009be88e75SGabriel Fernandez unsigned long clk_stm32_divider_recalc(struct stm32_clk_priv *priv, int idx,
2019be88e75SGabriel Fernandez 				       unsigned long prate);
2029be88e75SGabriel Fernandez 
2039be88e75SGabriel Fernandez int clk_stm32_gate_enable(struct stm32_clk_priv *priv, int idx);
2049be88e75SGabriel Fernandez void clk_stm32_gate_disable(struct stm32_clk_priv *priv, int idx);
2059be88e75SGabriel Fernandez 
2069be88e75SGabriel Fernandez bool _clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int gate_id);
2079be88e75SGabriel Fernandez bool clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int idx);
2089be88e75SGabriel Fernandez 
2099be88e75SGabriel Fernandez uint32_t clk_stm32_div_get_value(struct stm32_clk_priv *priv, int div_id);
2109be88e75SGabriel Fernandez int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value);
2119be88e75SGabriel Fernandez int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel);
2129be88e75SGabriel Fernandez int clk_mux_get_parent(struct stm32_clk_priv *priv, uint32_t mux_id);
2139be88e75SGabriel Fernandez 
2149be88e75SGabriel Fernandez int stm32_clk_parse_fdt_by_name(void *fdt, int node, const char *name, uint32_t *tab, uint32_t *nb);
2159be88e75SGabriel Fernandez 
2169be88e75SGabriel Fernandez #ifdef CFG_STM32_CLK_DEBUG
2179be88e75SGabriel Fernandez void clk_stm32_display_clock_info(void);
2189be88e75SGabriel Fernandez #endif
2199be88e75SGabriel Fernandez 
2209be88e75SGabriel Fernandez struct clk_stm32_div_cfg {
221d9a7ddebSGabriel Fernandez 	uint8_t id;
2229be88e75SGabriel Fernandez };
2239be88e75SGabriel Fernandez 
2249be88e75SGabriel Fernandez #define STM32_DIV(idx, _binding, _parent, _flags, _div_id) \
2259be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2269be88e75SGabriel Fernandez 		.binding	= (_binding),\
2279be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2289be88e75SGabriel Fernandez 		.flags		= (_flags),\
2299be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_div_cfg){\
2309be88e75SGabriel Fernandez 			.id	= (_div_id),\
2319be88e75SGabriel Fernandez 		},\
232d9a7ddebSGabriel Fernandez 		.ops		= STM32_DIVIDER_OPS,\
2339be88e75SGabriel Fernandez 	}
2349be88e75SGabriel Fernandez 
2359be88e75SGabriel Fernandez struct clk_stm32_gate_cfg {
236d9a7ddebSGabriel Fernandez 	uint8_t id;
2379be88e75SGabriel Fernandez };
2389be88e75SGabriel Fernandez 
2399be88e75SGabriel Fernandez #define STM32_GATE(idx, _binding, _parent, _flags, _gate_id) \
2409be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2419be88e75SGabriel Fernandez 		.binding	= (_binding),\
2429be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2439be88e75SGabriel Fernandez 		.flags		= (_flags),\
2449be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_gate_cfg){\
2459be88e75SGabriel Fernandez 			.id	= (_gate_id),\
2469be88e75SGabriel Fernandez 		},\
247d9a7ddebSGabriel Fernandez 		.ops		= STM32_GATE_OPS,\
2489be88e75SGabriel Fernandez 	}
2499be88e75SGabriel Fernandez 
2509be88e75SGabriel Fernandez struct fixed_factor_cfg {
251d9a7ddebSGabriel Fernandez 	uint8_t mult;
252d9a7ddebSGabriel Fernandez 	uint8_t div;
2539be88e75SGabriel Fernandez };
2549be88e75SGabriel Fernandez 
2559be88e75SGabriel Fernandez unsigned long fixed_factor_recalc_rate(struct stm32_clk_priv *priv,
2569be88e75SGabriel Fernandez 				       int _idx, unsigned long prate);
2579be88e75SGabriel Fernandez 
2589be88e75SGabriel Fernandez #define FIXED_FACTOR(idx, _idx, _parent, _mult, _div) \
2599be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2609be88e75SGabriel Fernandez 		.binding	= (_idx),\
2619be88e75SGabriel Fernandez 		.parent		= (_parent),\
2629be88e75SGabriel Fernandez 		.clock_cfg	= &(struct fixed_factor_cfg){\
2639be88e75SGabriel Fernandez 			.mult	= (_mult),\
2649be88e75SGabriel Fernandez 			.div	= (_div),\
2659be88e75SGabriel Fernandez 		},\
266d9a7ddebSGabriel Fernandez 		.ops		= FIXED_FACTOR_OPS,\
2679be88e75SGabriel Fernandez 	}
2689be88e75SGabriel Fernandez 
2699be88e75SGabriel Fernandez #define GATE(idx, _binding, _parent, _flags, _offset, _bit_idx) \
2709be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2719be88e75SGabriel Fernandez 		.binding	= (_binding),\
2729be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2739be88e75SGabriel Fernandez 		.flags		= (_flags),\
2749be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_gate_cfg){\
2759be88e75SGabriel Fernandez 			.offset		= (_offset),\
2769be88e75SGabriel Fernandez 			.bit_idx	= (_bit_idx),\
2779be88e75SGabriel Fernandez 		},\
278d9a7ddebSGabriel Fernandez 		.ops		= GATE_OPS,\
2799be88e75SGabriel Fernandez 	}
2809be88e75SGabriel Fernandez 
2819be88e75SGabriel Fernandez #define STM32_MUX(idx, _binding, _mux_id, _flags) \
2829be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2839be88e75SGabriel Fernandez 		.binding	= (_binding),\
2849be88e75SGabriel Fernandez 		.parent		= (MUX(_mux_id)),\
2859be88e75SGabriel Fernandez 		.flags		= (_flags),\
2869be88e75SGabriel Fernandez 		.clock_cfg	= NULL,\
287d9a7ddebSGabriel Fernandez 		.ops		= STM32_MUX_OPS\
2889be88e75SGabriel Fernandez 	}
2899be88e75SGabriel Fernandez 
2909be88e75SGabriel Fernandez struct clk_timer_cfg {
2919be88e75SGabriel Fernandez 	uint32_t apbdiv;
2929be88e75SGabriel Fernandez 	uint32_t timpre;
2939be88e75SGabriel Fernandez };
2949be88e75SGabriel Fernandez 
2959be88e75SGabriel Fernandez #define CK_TIMER(idx, _idx, _parent, _flags, _apbdiv, _timpre) \
2969be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2979be88e75SGabriel Fernandez 		.binding	= (_idx),\
2989be88e75SGabriel Fernandez 		.parent		= (_parent),\
2999be88e75SGabriel Fernandez 		.flags		= (CLK_SET_RATE_PARENT | (_flags)),\
3009be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_timer_cfg){\
3019be88e75SGabriel Fernandez 			.apbdiv = (_apbdiv),\
3029be88e75SGabriel Fernandez 			.timpre = (_timpre),\
3039be88e75SGabriel Fernandez 		},\
304d9a7ddebSGabriel Fernandez 		.ops		= STM32_TIMER_OPS,\
3059be88e75SGabriel Fernandez 	}
3069be88e75SGabriel Fernandez 
3079be88e75SGabriel Fernandez struct clk_stm32_fixed_rate_cfg {
3089be88e75SGabriel Fernandez 	unsigned long rate;
3099be88e75SGabriel Fernandez };
3109be88e75SGabriel Fernandez 
3119be88e75SGabriel Fernandez #define CLK_FIXED_RATE(idx, _binding, _rate) \
3129be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3139be88e75SGabriel Fernandez 		.binding	= (_binding),\
3149be88e75SGabriel Fernandez 		.parent		= (CLK_IS_ROOT),\
3159be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_fixed_rate_cfg){\
3169be88e75SGabriel Fernandez 			.rate	= (_rate),\
3179be88e75SGabriel Fernandez 		},\
318d9a7ddebSGabriel Fernandez 		.ops		= STM32_FIXED_RATE_OPS,\
3199be88e75SGabriel Fernandez 	}
3209be88e75SGabriel Fernandez 
3219be88e75SGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) &(struct stm32_clk_bypass){\
3229be88e75SGabriel Fernandez 	.offset		= (_offset),\
3239be88e75SGabriel Fernandez 	.bit_byp	= (_bit_byp),\
3249be88e75SGabriel Fernandez 	.bit_digbyp	= (_bit_digbyp),\
3259be88e75SGabriel Fernandez }
3269be88e75SGabriel Fernandez 
3279be88e75SGabriel Fernandez #define CSS(_offset, _bit_css)	&(struct stm32_clk_css){\
3289be88e75SGabriel Fernandez 	.offset		= (_offset),\
3299be88e75SGabriel Fernandez 	.bit_css	= (_bit_css),\
3309be88e75SGabriel Fernandez }
3319be88e75SGabriel Fernandez 
3329be88e75SGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) &(struct stm32_clk_drive){\
3339be88e75SGabriel Fernandez 	.offset		= (_offset),\
3349be88e75SGabriel Fernandez 	.drv_shift	= (_shift),\
3359be88e75SGabriel Fernandez 	.drv_width	= (_width),\
3369be88e75SGabriel Fernandez 	.drv_default	= (_default),\
3379be88e75SGabriel Fernandez }
3389be88e75SGabriel Fernandez 
3399be88e75SGabriel Fernandez #define OSCILLATOR(idx_osc, _id, _name, _gate_id, _gate_rdy_id, _bypass, _css, _drive) \
3409be88e75SGabriel Fernandez 	[(idx_osc)] = (struct clk_oscillator_data){\
3419be88e75SGabriel Fernandez 		.name		= (_name),\
3429be88e75SGabriel Fernandez 		.id_clk		= (_id),\
3439be88e75SGabriel Fernandez 		.gate_id	= (_gate_id),\
3449be88e75SGabriel Fernandez 		.gate_rdy_id	= (_gate_rdy_id),\
3459be88e75SGabriel Fernandez 		.bypass		= (_bypass),\
3469be88e75SGabriel Fernandez 		.css		= (_css),\
3479be88e75SGabriel Fernandez 		.drive		= (_drive),\
3489be88e75SGabriel Fernandez 	}
3499be88e75SGabriel Fernandez 
3509be88e75SGabriel Fernandez struct clk_oscillator_data *clk_oscillator_get_data(struct stm32_clk_priv *priv, int id);
3519be88e75SGabriel Fernandez 
3529be88e75SGabriel Fernandez void clk_stm32_osc_init(struct stm32_clk_priv *priv, int id);
3539be88e75SGabriel Fernandez bool clk_stm32_osc_gate_is_enabled(struct stm32_clk_priv *priv, int id);
3549be88e75SGabriel Fernandez int clk_stm32_osc_gate_enable(struct stm32_clk_priv *priv, int id);
3559be88e75SGabriel Fernandez void clk_stm32_osc_gate_disable(struct stm32_clk_priv *priv, int id);
3569be88e75SGabriel Fernandez 
3579be88e75SGabriel Fernandez struct stm32_osc_cfg {
358d9a7ddebSGabriel Fernandez 	uint8_t osc_id;
3599be88e75SGabriel Fernandez };
3609be88e75SGabriel Fernandez 
3619be88e75SGabriel Fernandez #define CLK_OSC(idx, _idx, _parent, _osc_id) \
3629be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3639be88e75SGabriel Fernandez 		.binding	= (_idx),\
3649be88e75SGabriel Fernandez 		.parent		= (_parent),\
3659be88e75SGabriel Fernandez 		.flags		= CLK_IS_CRITICAL,\
3669be88e75SGabriel Fernandez 		.clock_cfg	= &(struct stm32_osc_cfg){\
3679be88e75SGabriel Fernandez 			.osc_id = (_osc_id),\
3689be88e75SGabriel Fernandez 		},\
369d9a7ddebSGabriel Fernandez 		.ops		= STM32_OSC_OPS,\
3709be88e75SGabriel Fernandez 	}
3719be88e75SGabriel Fernandez 
3729be88e75SGabriel Fernandez #define CLK_OSC_FIXED(idx, _idx, _parent, _osc_id) \
3739be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3749be88e75SGabriel Fernandez 		.binding	= (_idx),\
3759be88e75SGabriel Fernandez 		.parent		= (_parent),\
3769be88e75SGabriel Fernandez 		.flags		= CLK_IS_CRITICAL,\
3779be88e75SGabriel Fernandez 		.clock_cfg	= &(struct stm32_osc_cfg){\
3789be88e75SGabriel Fernandez 			.osc_id	= (_osc_id),\
3799be88e75SGabriel Fernandez 		},\
380d9a7ddebSGabriel Fernandez 		.ops		= STM32_OSC_NOGATE_OPS,\
3819be88e75SGabriel Fernandez 	}
3829be88e75SGabriel Fernandez 
3839be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_mux_ops;
3849be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_divider_ops;
3859be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_gate_ops;
3869be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_fixed_factor_ops;
3879be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_gate_ops;
3889be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_timer_ops;
3899be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_fixed_rate_ops;
3909be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_ops;
3919be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_nogate_ops;
3929be88e75SGabriel Fernandez 
393d9a7ddebSGabriel Fernandez enum {
394d9a7ddebSGabriel Fernandez 	NO_OPS,
395d9a7ddebSGabriel Fernandez 	FIXED_FACTOR_OPS,
396d9a7ddebSGabriel Fernandez 	GATE_OPS,
397d9a7ddebSGabriel Fernandez 	STM32_MUX_OPS,
398d9a7ddebSGabriel Fernandez 	STM32_DIVIDER_OPS,
399d9a7ddebSGabriel Fernandez 	STM32_GATE_OPS,
400d9a7ddebSGabriel Fernandez 	STM32_TIMER_OPS,
401d9a7ddebSGabriel Fernandez 	STM32_FIXED_RATE_OPS,
402d9a7ddebSGabriel Fernandez 	STM32_OSC_OPS,
403d9a7ddebSGabriel Fernandez 	STM32_OSC_NOGATE_OPS,
404d9a7ddebSGabriel Fernandez 
405d9a7ddebSGabriel Fernandez 	STM32_LAST_OPS
406d9a7ddebSGabriel Fernandez };
407d9a7ddebSGabriel Fernandez 
4089be88e75SGabriel Fernandez #endif /* CLK_STM32_CORE_H */
409