xref: /rk3399_ARM-atf/drivers/st/clk/clk-stm32-core.h (revision 1be399b81326073dd44836837ee189463fc48820)
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_fixed_rate {
1129be88e75SGabriel Fernandez 	const char *name;
1139be88e75SGabriel Fernandez 	unsigned long fixed_rate;
1149be88e75SGabriel Fernandez };
1159be88e75SGabriel Fernandez 
1169be88e75SGabriel Fernandez struct clk_gate_cfg {
1179be88e75SGabriel Fernandez 	uint32_t offset;
1189be88e75SGabriel Fernandez 	uint8_t bit_idx;
1199be88e75SGabriel Fernandez };
1209be88e75SGabriel Fernandez 
1219be88e75SGabriel Fernandez /* CLOCK FLAGS */
1229be88e75SGabriel Fernandez #define CLK_IS_CRITICAL			BIT(0)
1239be88e75SGabriel Fernandez #define CLK_IGNORE_UNUSED		BIT(1)
1249be88e75SGabriel Fernandez #define CLK_SET_RATE_PARENT		BIT(2)
1259be88e75SGabriel Fernandez 
1269be88e75SGabriel Fernandez #define CLK_DIVIDER_ONE_BASED		BIT(0)
1279be88e75SGabriel Fernandez #define CLK_DIVIDER_POWER_OF_TWO	BIT(1)
1289be88e75SGabriel Fernandez #define CLK_DIVIDER_ALLOW_ZERO		BIT(2)
1299be88e75SGabriel Fernandez #define CLK_DIVIDER_HIWORD_MASK		BIT(3)
1309be88e75SGabriel Fernandez #define CLK_DIVIDER_ROUND_CLOSEST	BIT(4)
1319be88e75SGabriel Fernandez #define CLK_DIVIDER_READ_ONLY		BIT(5)
1329be88e75SGabriel Fernandez #define CLK_DIVIDER_MAX_AT_ZERO		BIT(6)
1339be88e75SGabriel Fernandez #define CLK_DIVIDER_BIG_ENDIAN		BIT(7)
1349be88e75SGabriel Fernandez 
1359be88e75SGabriel Fernandez #define MUX_MAX_PARENTS			U(0x8000)
1369be88e75SGabriel Fernandez #define MUX_PARENT_MASK			GENMASK(14, 0)
1379be88e75SGabriel Fernandez #define MUX_FLAG			U(0x8000)
1389be88e75SGabriel Fernandez #define MUX(mux)			((mux) | MUX_FLAG)
1399be88e75SGabriel Fernandez 
1409be88e75SGabriel Fernandez #define NO_GATE				0
1419be88e75SGabriel Fernandez #define _NO_ID				UINT16_MAX
1429be88e75SGabriel Fernandez #define CLK_IS_ROOT			UINT16_MAX
1439be88e75SGabriel Fernandez #define MUX_NO_BIT_RDY			UINT8_MAX
1449be88e75SGabriel Fernandez #define DIV_NO_BIT_RDY			UINT8_MAX
1459be88e75SGabriel Fernandez 
1469be88e75SGabriel Fernandez #define MASK_WIDTH_SHIFT(_width, _shift) \
1479be88e75SGabriel Fernandez 	GENMASK(((_width) + (_shift) - 1U), (_shift))
1489be88e75SGabriel Fernandez 
149*1be399b8SYann Gautier void clk_stm32_rcc_regs_lock(void);
150*1be399b8SYann Gautier void clk_stm32_rcc_regs_unlock(void);
151*1be399b8SYann Gautier 
1529be88e75SGabriel Fernandez int clk_stm32_init(struct stm32_clk_priv *priv, uintptr_t base);
1539be88e75SGabriel Fernandez void clk_stm32_enable_critical_clocks(void);
1549be88e75SGabriel Fernandez 
1559be88e75SGabriel Fernandez struct stm32_clk_priv *clk_stm32_get_priv(void);
1569be88e75SGabriel Fernandez 
1579be88e75SGabriel Fernandez int clk_get_index(struct stm32_clk_priv *priv, unsigned long binding_id);
1589be88e75SGabriel Fernandez const struct clk_stm32 *_clk_get(struct stm32_clk_priv *priv, int id);
1599be88e75SGabriel Fernandez 
1609be88e75SGabriel Fernandez void clk_oscillator_set_bypass(struct stm32_clk_priv *priv, int id, bool digbyp, bool bypass);
1619be88e75SGabriel Fernandez void clk_oscillator_set_drive(struct stm32_clk_priv *priv, int id, uint8_t lsedrv);
1629be88e75SGabriel Fernandez void clk_oscillator_set_css(struct stm32_clk_priv *priv, int id, bool css);
1639be88e75SGabriel Fernandez 
1649be88e75SGabriel Fernandez int _clk_stm32_gate_wait_ready(struct stm32_clk_priv *priv, uint16_t gate_id, bool ready_on);
1659be88e75SGabriel Fernandez 
1669be88e75SGabriel Fernandez int clk_oscillator_wait_ready(struct stm32_clk_priv *priv, int id, bool ready_on);
1679be88e75SGabriel Fernandez int clk_oscillator_wait_ready_on(struct stm32_clk_priv *priv, int id);
1689be88e75SGabriel Fernandez int clk_oscillator_wait_ready_off(struct stm32_clk_priv *priv, int id);
1699be88e75SGabriel Fernandez 
1709be88e75SGabriel Fernandez int clk_stm32_get_counter(unsigned long binding_id);
1719be88e75SGabriel Fernandez 
1729be88e75SGabriel Fernandez void _clk_stm32_gate_disable(struct stm32_clk_priv *priv, uint16_t gate_id);
1739be88e75SGabriel Fernandez int _clk_stm32_gate_enable(struct stm32_clk_priv *priv, uint16_t gate_id);
1749be88e75SGabriel Fernandez 
1759be88e75SGabriel Fernandez int _clk_stm32_set_parent(struct stm32_clk_priv *priv, int id, int src_id);
1769be88e75SGabriel Fernandez int _clk_stm32_set_parent_by_index(struct stm32_clk_priv *priv, int clk, int sel);
1779be88e75SGabriel Fernandez 
1789be88e75SGabriel Fernandez int _clk_stm32_get_parent(struct stm32_clk_priv *priv, int id);
1799be88e75SGabriel Fernandez int _clk_stm32_get_parent_by_index(struct stm32_clk_priv *priv, int clk_id, int idx);
1809be88e75SGabriel Fernandez int _clk_stm32_get_parent_index(struct stm32_clk_priv *priv, int clk_id);
1819be88e75SGabriel Fernandez 
1829be88e75SGabriel Fernandez unsigned long _clk_stm32_get_rate(struct stm32_clk_priv *priv, int id);
1839be88e75SGabriel Fernandez unsigned long _clk_stm32_get_parent_rate(struct stm32_clk_priv *priv, int id);
1849be88e75SGabriel Fernandez 
1859be88e75SGabriel Fernandez bool _stm32_clk_is_flags(struct stm32_clk_priv *priv, int id, uint8_t flag);
1869be88e75SGabriel Fernandez 
1879be88e75SGabriel Fernandez int _clk_stm32_enable(struct stm32_clk_priv *priv, int id);
1889be88e75SGabriel Fernandez void _clk_stm32_disable(struct stm32_clk_priv *priv, int id);
1899be88e75SGabriel Fernandez 
1909be88e75SGabriel Fernandez int clk_stm32_enable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
1919be88e75SGabriel Fernandez void clk_stm32_disable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
1929be88e75SGabriel Fernandez 
1939be88e75SGabriel Fernandez bool _clk_stm32_is_enabled(struct stm32_clk_priv *priv, int id);
1949be88e75SGabriel Fernandez 
1959be88e75SGabriel Fernandez int _clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int div_id,
1969be88e75SGabriel Fernandez 				unsigned long rate, unsigned long parent_rate);
1979be88e75SGabriel Fernandez 
1989be88e75SGabriel Fernandez int clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int id, unsigned long rate,
1999be88e75SGabriel Fernandez 			       unsigned long prate);
2009be88e75SGabriel Fernandez 
2019be88e75SGabriel Fernandez unsigned long _clk_stm32_divider_recalc(struct stm32_clk_priv *priv,
2029be88e75SGabriel Fernandez 					int div_id,
2039be88e75SGabriel Fernandez 					unsigned long prate);
2049be88e75SGabriel Fernandez 
2059be88e75SGabriel Fernandez unsigned long clk_stm32_divider_recalc(struct stm32_clk_priv *priv, int idx,
2069be88e75SGabriel Fernandez 				       unsigned long prate);
2079be88e75SGabriel Fernandez 
2089be88e75SGabriel Fernandez int clk_stm32_gate_enable(struct stm32_clk_priv *priv, int idx);
2099be88e75SGabriel Fernandez void clk_stm32_gate_disable(struct stm32_clk_priv *priv, int idx);
2109be88e75SGabriel Fernandez 
2119be88e75SGabriel Fernandez bool _clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int gate_id);
2129be88e75SGabriel Fernandez bool clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int idx);
2139be88e75SGabriel Fernandez 
2149be88e75SGabriel Fernandez uint32_t clk_stm32_div_get_value(struct stm32_clk_priv *priv, int div_id);
2159be88e75SGabriel Fernandez int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value);
2169be88e75SGabriel Fernandez int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel);
2179be88e75SGabriel Fernandez int clk_mux_get_parent(struct stm32_clk_priv *priv, uint32_t mux_id);
2189be88e75SGabriel Fernandez 
2199be88e75SGabriel Fernandez int stm32_clk_parse_fdt_by_name(void *fdt, int node, const char *name, uint32_t *tab, uint32_t *nb);
2209be88e75SGabriel Fernandez 
2219be88e75SGabriel Fernandez #ifdef CFG_STM32_CLK_DEBUG
2229be88e75SGabriel Fernandez void clk_stm32_display_clock_info(void);
2239be88e75SGabriel Fernandez #endif
2249be88e75SGabriel Fernandez 
2259be88e75SGabriel Fernandez struct clk_stm32_div_cfg {
226d9a7ddebSGabriel Fernandez 	uint8_t id;
2279be88e75SGabriel Fernandez };
2289be88e75SGabriel Fernandez 
2299be88e75SGabriel Fernandez #define STM32_DIV(idx, _binding, _parent, _flags, _div_id) \
2309be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2319be88e75SGabriel Fernandez 		.binding	= (_binding),\
2329be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2339be88e75SGabriel Fernandez 		.flags		= (_flags),\
2349be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_div_cfg){\
2359be88e75SGabriel Fernandez 			.id	= (_div_id),\
2369be88e75SGabriel Fernandez 		},\
237d9a7ddebSGabriel Fernandez 		.ops		= STM32_DIVIDER_OPS,\
2389be88e75SGabriel Fernandez 	}
2399be88e75SGabriel Fernandez 
2409be88e75SGabriel Fernandez struct clk_stm32_gate_cfg {
241d9a7ddebSGabriel Fernandez 	uint8_t id;
2429be88e75SGabriel Fernandez };
2439be88e75SGabriel Fernandez 
2449be88e75SGabriel Fernandez #define STM32_GATE(idx, _binding, _parent, _flags, _gate_id) \
2459be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2469be88e75SGabriel Fernandez 		.binding	= (_binding),\
2479be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2489be88e75SGabriel Fernandez 		.flags		= (_flags),\
2499be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_gate_cfg){\
2509be88e75SGabriel Fernandez 			.id	= (_gate_id),\
2519be88e75SGabriel Fernandez 		},\
252d9a7ddebSGabriel Fernandez 		.ops		= STM32_GATE_OPS,\
2539be88e75SGabriel Fernandez 	}
2549be88e75SGabriel Fernandez 
2559be88e75SGabriel Fernandez struct fixed_factor_cfg {
256d9a7ddebSGabriel Fernandez 	uint8_t mult;
257d9a7ddebSGabriel Fernandez 	uint8_t div;
2589be88e75SGabriel Fernandez };
2599be88e75SGabriel Fernandez 
2609be88e75SGabriel Fernandez unsigned long fixed_factor_recalc_rate(struct stm32_clk_priv *priv,
2619be88e75SGabriel Fernandez 				       int _idx, unsigned long prate);
2629be88e75SGabriel Fernandez 
2639be88e75SGabriel Fernandez #define FIXED_FACTOR(idx, _idx, _parent, _mult, _div) \
2649be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2659be88e75SGabriel Fernandez 		.binding	= (_idx),\
2669be88e75SGabriel Fernandez 		.parent		= (_parent),\
2679be88e75SGabriel Fernandez 		.clock_cfg	= &(struct fixed_factor_cfg){\
2689be88e75SGabriel Fernandez 			.mult	= (_mult),\
2699be88e75SGabriel Fernandez 			.div	= (_div),\
2709be88e75SGabriel Fernandez 		},\
271d9a7ddebSGabriel Fernandez 		.ops		= FIXED_FACTOR_OPS,\
2729be88e75SGabriel Fernandez 	}
2739be88e75SGabriel Fernandez 
2749be88e75SGabriel Fernandez #define GATE(idx, _binding, _parent, _flags, _offset, _bit_idx) \
2759be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2769be88e75SGabriel Fernandez 		.binding	= (_binding),\
2779be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2789be88e75SGabriel Fernandez 		.flags		= (_flags),\
2799be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_gate_cfg){\
2809be88e75SGabriel Fernandez 			.offset		= (_offset),\
2819be88e75SGabriel Fernandez 			.bit_idx	= (_bit_idx),\
2829be88e75SGabriel Fernandez 		},\
283d9a7ddebSGabriel Fernandez 		.ops		= GATE_OPS,\
2849be88e75SGabriel Fernandez 	}
2859be88e75SGabriel Fernandez 
2869be88e75SGabriel Fernandez #define STM32_MUX(idx, _binding, _mux_id, _flags) \
2879be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2889be88e75SGabriel Fernandez 		.binding	= (_binding),\
2899be88e75SGabriel Fernandez 		.parent		= (MUX(_mux_id)),\
2909be88e75SGabriel Fernandez 		.flags		= (_flags),\
2919be88e75SGabriel Fernandez 		.clock_cfg	= NULL,\
292d9a7ddebSGabriel Fernandez 		.ops		= STM32_MUX_OPS\
2939be88e75SGabriel Fernandez 	}
2949be88e75SGabriel Fernandez 
2959be88e75SGabriel Fernandez struct clk_timer_cfg {
2969be88e75SGabriel Fernandez 	uint32_t apbdiv;
2979be88e75SGabriel Fernandez 	uint32_t timpre;
2989be88e75SGabriel Fernandez };
2999be88e75SGabriel Fernandez 
3009be88e75SGabriel Fernandez #define CK_TIMER(idx, _idx, _parent, _flags, _apbdiv, _timpre) \
3019be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3029be88e75SGabriel Fernandez 		.binding	= (_idx),\
3039be88e75SGabriel Fernandez 		.parent		= (_parent),\
3049be88e75SGabriel Fernandez 		.flags		= (CLK_SET_RATE_PARENT | (_flags)),\
3059be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_timer_cfg){\
3069be88e75SGabriel Fernandez 			.apbdiv = (_apbdiv),\
3079be88e75SGabriel Fernandez 			.timpre = (_timpre),\
3089be88e75SGabriel Fernandez 		},\
309d9a7ddebSGabriel Fernandez 		.ops		= STM32_TIMER_OPS,\
3109be88e75SGabriel Fernandez 	}
3119be88e75SGabriel Fernandez 
3129be88e75SGabriel Fernandez struct clk_stm32_fixed_rate_cfg {
3139be88e75SGabriel Fernandez 	unsigned long rate;
3149be88e75SGabriel Fernandez };
3159be88e75SGabriel Fernandez 
3169be88e75SGabriel Fernandez #define CLK_FIXED_RATE(idx, _binding, _rate) \
3179be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3189be88e75SGabriel Fernandez 		.binding	= (_binding),\
3199be88e75SGabriel Fernandez 		.parent		= (CLK_IS_ROOT),\
3209be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_fixed_rate_cfg){\
3219be88e75SGabriel Fernandez 			.rate	= (_rate),\
3229be88e75SGabriel Fernandez 		},\
323d9a7ddebSGabriel Fernandez 		.ops		= STM32_FIXED_RATE_OPS,\
3249be88e75SGabriel Fernandez 	}
3259be88e75SGabriel Fernandez 
3269be88e75SGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) &(struct stm32_clk_bypass){\
3279be88e75SGabriel Fernandez 	.offset		= (_offset),\
3289be88e75SGabriel Fernandez 	.bit_byp	= (_bit_byp),\
3299be88e75SGabriel Fernandez 	.bit_digbyp	= (_bit_digbyp),\
3309be88e75SGabriel Fernandez }
3319be88e75SGabriel Fernandez 
3329be88e75SGabriel Fernandez #define CSS(_offset, _bit_css)	&(struct stm32_clk_css){\
3339be88e75SGabriel Fernandez 	.offset		= (_offset),\
3349be88e75SGabriel Fernandez 	.bit_css	= (_bit_css),\
3359be88e75SGabriel Fernandez }
3369be88e75SGabriel Fernandez 
3379be88e75SGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) &(struct stm32_clk_drive){\
3389be88e75SGabriel Fernandez 	.offset		= (_offset),\
3399be88e75SGabriel Fernandez 	.drv_shift	= (_shift),\
3409be88e75SGabriel Fernandez 	.drv_width	= (_width),\
3419be88e75SGabriel Fernandez 	.drv_default	= (_default),\
3429be88e75SGabriel Fernandez }
3439be88e75SGabriel Fernandez 
3449be88e75SGabriel Fernandez #define OSCILLATOR(idx_osc, _id, _name, _gate_id, _gate_rdy_id, _bypass, _css, _drive) \
3459be88e75SGabriel Fernandez 	[(idx_osc)] = (struct clk_oscillator_data){\
3469be88e75SGabriel Fernandez 		.name		= (_name),\
3479be88e75SGabriel Fernandez 		.id_clk		= (_id),\
3489be88e75SGabriel Fernandez 		.gate_id	= (_gate_id),\
3499be88e75SGabriel Fernandez 		.gate_rdy_id	= (_gate_rdy_id),\
3509be88e75SGabriel Fernandez 		.bypass		= (_bypass),\
3519be88e75SGabriel Fernandez 		.css		= (_css),\
3529be88e75SGabriel Fernandez 		.drive		= (_drive),\
3539be88e75SGabriel Fernandez 	}
3549be88e75SGabriel Fernandez 
3559be88e75SGabriel Fernandez struct clk_oscillator_data *clk_oscillator_get_data(struct stm32_clk_priv *priv, int id);
3569be88e75SGabriel Fernandez 
3579be88e75SGabriel Fernandez void clk_stm32_osc_init(struct stm32_clk_priv *priv, int id);
3589be88e75SGabriel Fernandez bool clk_stm32_osc_gate_is_enabled(struct stm32_clk_priv *priv, int id);
3599be88e75SGabriel Fernandez int clk_stm32_osc_gate_enable(struct stm32_clk_priv *priv, int id);
3609be88e75SGabriel Fernandez void clk_stm32_osc_gate_disable(struct stm32_clk_priv *priv, int id);
3619be88e75SGabriel Fernandez 
3629be88e75SGabriel Fernandez struct stm32_osc_cfg {
363d9a7ddebSGabriel Fernandez 	uint8_t osc_id;
3649be88e75SGabriel Fernandez };
3659be88e75SGabriel Fernandez 
3669be88e75SGabriel Fernandez #define CLK_OSC(idx, _idx, _parent, _osc_id) \
3679be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3689be88e75SGabriel Fernandez 		.binding	= (_idx),\
3699be88e75SGabriel Fernandez 		.parent		= (_parent),\
3709be88e75SGabriel Fernandez 		.flags		= CLK_IS_CRITICAL,\
3719be88e75SGabriel Fernandez 		.clock_cfg	= &(struct stm32_osc_cfg){\
3729be88e75SGabriel Fernandez 			.osc_id = (_osc_id),\
3739be88e75SGabriel Fernandez 		},\
374d9a7ddebSGabriel Fernandez 		.ops		= STM32_OSC_OPS,\
3759be88e75SGabriel Fernandez 	}
3769be88e75SGabriel Fernandez 
3779be88e75SGabriel Fernandez #define CLK_OSC_FIXED(idx, _idx, _parent, _osc_id) \
3789be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3799be88e75SGabriel Fernandez 		.binding	= (_idx),\
3809be88e75SGabriel Fernandez 		.parent		= (_parent),\
3819be88e75SGabriel Fernandez 		.flags		= CLK_IS_CRITICAL,\
3829be88e75SGabriel Fernandez 		.clock_cfg	= &(struct stm32_osc_cfg){\
3839be88e75SGabriel Fernandez 			.osc_id	= (_osc_id),\
3849be88e75SGabriel Fernandez 		},\
385d9a7ddebSGabriel Fernandez 		.ops		= STM32_OSC_NOGATE_OPS,\
3869be88e75SGabriel Fernandez 	}
3879be88e75SGabriel Fernandez 
3889be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_mux_ops;
3899be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_divider_ops;
3909be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_gate_ops;
3919be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_fixed_factor_ops;
3929be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_gate_ops;
3939be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_timer_ops;
3949be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_fixed_rate_ops;
3959be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_ops;
3969be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_nogate_ops;
3979be88e75SGabriel Fernandez 
398d9a7ddebSGabriel Fernandez enum {
399d9a7ddebSGabriel Fernandez 	NO_OPS,
400d9a7ddebSGabriel Fernandez 	FIXED_FACTOR_OPS,
401d9a7ddebSGabriel Fernandez 	GATE_OPS,
402d9a7ddebSGabriel Fernandez 	STM32_MUX_OPS,
403d9a7ddebSGabriel Fernandez 	STM32_DIVIDER_OPS,
404d9a7ddebSGabriel Fernandez 	STM32_GATE_OPS,
405d9a7ddebSGabriel Fernandez 	STM32_TIMER_OPS,
406d9a7ddebSGabriel Fernandez 	STM32_FIXED_RATE_OPS,
407d9a7ddebSGabriel Fernandez 	STM32_OSC_OPS,
408d9a7ddebSGabriel Fernandez 	STM32_OSC_NOGATE_OPS,
409d9a7ddebSGabriel Fernandez 
410d9a7ddebSGabriel Fernandez 	STM32_LAST_OPS
411d9a7ddebSGabriel Fernandez };
412d9a7ddebSGabriel Fernandez 
4139be88e75SGabriel Fernandez #endif /* CLK_STM32_CORE_H */
414