xref: /rk3399_ARM-atf/drivers/st/clk/clk-stm32-core.h (revision d9a7ddeb2528000114997e228eaa0d9e930b0a1d)
19be88e75SGabriel Fernandez /*
2*d9a7ddebSGabriel 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 {
24*d9a7ddebSGabriel Fernandez 	uint16_t val;
25*d9a7ddebSGabriel Fernandez 	uint16_t div;
269be88e75SGabriel Fernandez };
279be88e75SGabriel Fernandez 
289be88e75SGabriel Fernandez struct div_cfg {
29*d9a7ddebSGabriel 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;
40*d9a7ddebSGabriel 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;
59*d9a7ddebSGabriel 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;
76*d9a7ddebSGabriel Fernandez 	uint8_t *gate_refcounts;
779be88e75SGabriel Fernandez 	void *pdata;
78*d9a7ddebSGabriel 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;
104*d9a7ddebSGabriel Fernandez 	unsigned long frequency;
105*d9a7ddebSGabriel Fernandez 	uint16_t id_clk;
106*d9a7ddebSGabriel Fernandez 	uint16_t gate_id;
107*d9a7ddebSGabriel Fernandez 	uint16_t gate_rdy_id;
108*d9a7ddebSGabriel 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 
1499be88e75SGabriel Fernandez int clk_stm32_init(struct stm32_clk_priv *priv, uintptr_t base);
1509be88e75SGabriel Fernandez void clk_stm32_enable_critical_clocks(void);
1519be88e75SGabriel Fernandez 
1529be88e75SGabriel Fernandez struct stm32_clk_priv *clk_stm32_get_priv(void);
1539be88e75SGabriel Fernandez 
1549be88e75SGabriel Fernandez int clk_get_index(struct stm32_clk_priv *priv, unsigned long binding_id);
1559be88e75SGabriel Fernandez const struct clk_stm32 *_clk_get(struct stm32_clk_priv *priv, int id);
1569be88e75SGabriel Fernandez 
1579be88e75SGabriel Fernandez void clk_oscillator_set_bypass(struct stm32_clk_priv *priv, int id, bool digbyp, bool bypass);
1589be88e75SGabriel Fernandez void clk_oscillator_set_drive(struct stm32_clk_priv *priv, int id, uint8_t lsedrv);
1599be88e75SGabriel Fernandez void clk_oscillator_set_css(struct stm32_clk_priv *priv, int id, bool css);
1609be88e75SGabriel Fernandez 
1619be88e75SGabriel Fernandez int _clk_stm32_gate_wait_ready(struct stm32_clk_priv *priv, uint16_t gate_id, bool ready_on);
1629be88e75SGabriel Fernandez 
1639be88e75SGabriel Fernandez int clk_oscillator_wait_ready(struct stm32_clk_priv *priv, int id, bool ready_on);
1649be88e75SGabriel Fernandez int clk_oscillator_wait_ready_on(struct stm32_clk_priv *priv, int id);
1659be88e75SGabriel Fernandez int clk_oscillator_wait_ready_off(struct stm32_clk_priv *priv, int id);
1669be88e75SGabriel Fernandez 
1679be88e75SGabriel Fernandez int clk_stm32_get_counter(unsigned long binding_id);
1689be88e75SGabriel Fernandez 
1699be88e75SGabriel Fernandez void _clk_stm32_gate_disable(struct stm32_clk_priv *priv, uint16_t gate_id);
1709be88e75SGabriel Fernandez int _clk_stm32_gate_enable(struct stm32_clk_priv *priv, uint16_t gate_id);
1719be88e75SGabriel Fernandez 
1729be88e75SGabriel Fernandez int _clk_stm32_set_parent(struct stm32_clk_priv *priv, int id, int src_id);
1739be88e75SGabriel Fernandez int _clk_stm32_set_parent_by_index(struct stm32_clk_priv *priv, int clk, int sel);
1749be88e75SGabriel Fernandez 
1759be88e75SGabriel Fernandez int _clk_stm32_get_parent(struct stm32_clk_priv *priv, int id);
1769be88e75SGabriel Fernandez int _clk_stm32_get_parent_by_index(struct stm32_clk_priv *priv, int clk_id, int idx);
1779be88e75SGabriel Fernandez int _clk_stm32_get_parent_index(struct stm32_clk_priv *priv, int clk_id);
1789be88e75SGabriel Fernandez 
1799be88e75SGabriel Fernandez unsigned long _clk_stm32_get_rate(struct stm32_clk_priv *priv, int id);
1809be88e75SGabriel Fernandez unsigned long _clk_stm32_get_parent_rate(struct stm32_clk_priv *priv, int id);
1819be88e75SGabriel Fernandez 
1829be88e75SGabriel Fernandez bool _stm32_clk_is_flags(struct stm32_clk_priv *priv, int id, uint8_t flag);
1839be88e75SGabriel Fernandez 
1849be88e75SGabriel Fernandez int _clk_stm32_enable(struct stm32_clk_priv *priv, int id);
1859be88e75SGabriel Fernandez void _clk_stm32_disable(struct stm32_clk_priv *priv, int id);
1869be88e75SGabriel Fernandez 
1879be88e75SGabriel Fernandez int clk_stm32_enable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
1889be88e75SGabriel Fernandez void clk_stm32_disable_call_ops(struct stm32_clk_priv *priv, uint16_t id);
1899be88e75SGabriel Fernandez 
1909be88e75SGabriel Fernandez bool _clk_stm32_is_enabled(struct stm32_clk_priv *priv, int id);
1919be88e75SGabriel Fernandez 
1929be88e75SGabriel Fernandez int _clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int div_id,
1939be88e75SGabriel Fernandez 				unsigned long rate, unsigned long parent_rate);
1949be88e75SGabriel Fernandez 
1959be88e75SGabriel Fernandez int clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int id, unsigned long rate,
1969be88e75SGabriel Fernandez 			       unsigned long prate);
1979be88e75SGabriel Fernandez 
1989be88e75SGabriel Fernandez unsigned long _clk_stm32_divider_recalc(struct stm32_clk_priv *priv,
1999be88e75SGabriel Fernandez 					int div_id,
2009be88e75SGabriel Fernandez 					unsigned long prate);
2019be88e75SGabriel Fernandez 
2029be88e75SGabriel Fernandez unsigned long clk_stm32_divider_recalc(struct stm32_clk_priv *priv, int idx,
2039be88e75SGabriel Fernandez 				       unsigned long prate);
2049be88e75SGabriel Fernandez 
2059be88e75SGabriel Fernandez int clk_stm32_gate_enable(struct stm32_clk_priv *priv, int idx);
2069be88e75SGabriel Fernandez void clk_stm32_gate_disable(struct stm32_clk_priv *priv, int idx);
2079be88e75SGabriel Fernandez 
2089be88e75SGabriel Fernandez bool _clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int gate_id);
2099be88e75SGabriel Fernandez bool clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int idx);
2109be88e75SGabriel Fernandez 
2119be88e75SGabriel Fernandez uint32_t clk_stm32_div_get_value(struct stm32_clk_priv *priv, int div_id);
2129be88e75SGabriel Fernandez int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value);
2139be88e75SGabriel Fernandez int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel);
2149be88e75SGabriel Fernandez int clk_mux_get_parent(struct stm32_clk_priv *priv, uint32_t mux_id);
2159be88e75SGabriel Fernandez 
2169be88e75SGabriel Fernandez int stm32_clk_parse_fdt_by_name(void *fdt, int node, const char *name, uint32_t *tab, uint32_t *nb);
2179be88e75SGabriel Fernandez 
2189be88e75SGabriel Fernandez #ifdef CFG_STM32_CLK_DEBUG
2199be88e75SGabriel Fernandez void clk_stm32_display_clock_info(void);
2209be88e75SGabriel Fernandez #endif
2219be88e75SGabriel Fernandez 
2229be88e75SGabriel Fernandez struct clk_stm32_div_cfg {
223*d9a7ddebSGabriel Fernandez 	uint8_t id;
2249be88e75SGabriel Fernandez };
2259be88e75SGabriel Fernandez 
2269be88e75SGabriel Fernandez #define STM32_DIV(idx, _binding, _parent, _flags, _div_id) \
2279be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2289be88e75SGabriel Fernandez 		.binding	= (_binding),\
2299be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2309be88e75SGabriel Fernandez 		.flags		= (_flags),\
2319be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_div_cfg){\
2329be88e75SGabriel Fernandez 			.id	= (_div_id),\
2339be88e75SGabriel Fernandez 		},\
234*d9a7ddebSGabriel Fernandez 		.ops		= STM32_DIVIDER_OPS,\
2359be88e75SGabriel Fernandez 	}
2369be88e75SGabriel Fernandez 
2379be88e75SGabriel Fernandez struct clk_stm32_gate_cfg {
238*d9a7ddebSGabriel Fernandez 	uint8_t id;
2399be88e75SGabriel Fernandez };
2409be88e75SGabriel Fernandez 
2419be88e75SGabriel Fernandez #define STM32_GATE(idx, _binding, _parent, _flags, _gate_id) \
2429be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2439be88e75SGabriel Fernandez 		.binding	= (_binding),\
2449be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2459be88e75SGabriel Fernandez 		.flags		= (_flags),\
2469be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_gate_cfg){\
2479be88e75SGabriel Fernandez 			.id	= (_gate_id),\
2489be88e75SGabriel Fernandez 		},\
249*d9a7ddebSGabriel Fernandez 		.ops		= STM32_GATE_OPS,\
2509be88e75SGabriel Fernandez 	}
2519be88e75SGabriel Fernandez 
2529be88e75SGabriel Fernandez struct fixed_factor_cfg {
253*d9a7ddebSGabriel Fernandez 	uint8_t mult;
254*d9a7ddebSGabriel Fernandez 	uint8_t div;
2559be88e75SGabriel Fernandez };
2569be88e75SGabriel Fernandez 
2579be88e75SGabriel Fernandez unsigned long fixed_factor_recalc_rate(struct stm32_clk_priv *priv,
2589be88e75SGabriel Fernandez 				       int _idx, unsigned long prate);
2599be88e75SGabriel Fernandez 
2609be88e75SGabriel Fernandez #define FIXED_FACTOR(idx, _idx, _parent, _mult, _div) \
2619be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2629be88e75SGabriel Fernandez 		.binding	= (_idx),\
2639be88e75SGabriel Fernandez 		.parent		= (_parent),\
2649be88e75SGabriel Fernandez 		.clock_cfg	= &(struct fixed_factor_cfg){\
2659be88e75SGabriel Fernandez 			.mult	= (_mult),\
2669be88e75SGabriel Fernandez 			.div	= (_div),\
2679be88e75SGabriel Fernandez 		},\
268*d9a7ddebSGabriel Fernandez 		.ops		= FIXED_FACTOR_OPS,\
2699be88e75SGabriel Fernandez 	}
2709be88e75SGabriel Fernandez 
2719be88e75SGabriel Fernandez #define GATE(idx, _binding, _parent, _flags, _offset, _bit_idx) \
2729be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2739be88e75SGabriel Fernandez 		.binding	= (_binding),\
2749be88e75SGabriel Fernandez 		.parent		=  (_parent),\
2759be88e75SGabriel Fernandez 		.flags		= (_flags),\
2769be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_gate_cfg){\
2779be88e75SGabriel Fernandez 			.offset		= (_offset),\
2789be88e75SGabriel Fernandez 			.bit_idx	= (_bit_idx),\
2799be88e75SGabriel Fernandez 		},\
280*d9a7ddebSGabriel Fernandez 		.ops		= GATE_OPS,\
2819be88e75SGabriel Fernandez 	}
2829be88e75SGabriel Fernandez 
2839be88e75SGabriel Fernandez #define STM32_MUX(idx, _binding, _mux_id, _flags) \
2849be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2859be88e75SGabriel Fernandez 		.binding	= (_binding),\
2869be88e75SGabriel Fernandez 		.parent		= (MUX(_mux_id)),\
2879be88e75SGabriel Fernandez 		.flags		= (_flags),\
2889be88e75SGabriel Fernandez 		.clock_cfg	= NULL,\
289*d9a7ddebSGabriel Fernandez 		.ops		= STM32_MUX_OPS\
2909be88e75SGabriel Fernandez 	}
2919be88e75SGabriel Fernandez 
2929be88e75SGabriel Fernandez struct clk_timer_cfg {
2939be88e75SGabriel Fernandez 	uint32_t apbdiv;
2949be88e75SGabriel Fernandez 	uint32_t timpre;
2959be88e75SGabriel Fernandez };
2969be88e75SGabriel Fernandez 
2979be88e75SGabriel Fernandez #define CK_TIMER(idx, _idx, _parent, _flags, _apbdiv, _timpre) \
2989be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
2999be88e75SGabriel Fernandez 		.binding	= (_idx),\
3009be88e75SGabriel Fernandez 		.parent		= (_parent),\
3019be88e75SGabriel Fernandez 		.flags		= (CLK_SET_RATE_PARENT | (_flags)),\
3029be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_timer_cfg){\
3039be88e75SGabriel Fernandez 			.apbdiv = (_apbdiv),\
3049be88e75SGabriel Fernandez 			.timpre = (_timpre),\
3059be88e75SGabriel Fernandez 		},\
306*d9a7ddebSGabriel Fernandez 		.ops		= STM32_TIMER_OPS,\
3079be88e75SGabriel Fernandez 	}
3089be88e75SGabriel Fernandez 
3099be88e75SGabriel Fernandez struct clk_stm32_fixed_rate_cfg {
3109be88e75SGabriel Fernandez 	unsigned long rate;
3119be88e75SGabriel Fernandez };
3129be88e75SGabriel Fernandez 
3139be88e75SGabriel Fernandez #define CLK_FIXED_RATE(idx, _binding, _rate) \
3149be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3159be88e75SGabriel Fernandez 		.binding	= (_binding),\
3169be88e75SGabriel Fernandez 		.parent		= (CLK_IS_ROOT),\
3179be88e75SGabriel Fernandez 		.clock_cfg	= &(struct clk_stm32_fixed_rate_cfg){\
3189be88e75SGabriel Fernandez 			.rate	= (_rate),\
3199be88e75SGabriel Fernandez 		},\
320*d9a7ddebSGabriel Fernandez 		.ops		= STM32_FIXED_RATE_OPS,\
3219be88e75SGabriel Fernandez 	}
3229be88e75SGabriel Fernandez 
3239be88e75SGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) &(struct stm32_clk_bypass){\
3249be88e75SGabriel Fernandez 	.offset		= (_offset),\
3259be88e75SGabriel Fernandez 	.bit_byp	= (_bit_byp),\
3269be88e75SGabriel Fernandez 	.bit_digbyp	= (_bit_digbyp),\
3279be88e75SGabriel Fernandez }
3289be88e75SGabriel Fernandez 
3299be88e75SGabriel Fernandez #define CSS(_offset, _bit_css)	&(struct stm32_clk_css){\
3309be88e75SGabriel Fernandez 	.offset		= (_offset),\
3319be88e75SGabriel Fernandez 	.bit_css	= (_bit_css),\
3329be88e75SGabriel Fernandez }
3339be88e75SGabriel Fernandez 
3349be88e75SGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) &(struct stm32_clk_drive){\
3359be88e75SGabriel Fernandez 	.offset		= (_offset),\
3369be88e75SGabriel Fernandez 	.drv_shift	= (_shift),\
3379be88e75SGabriel Fernandez 	.drv_width	= (_width),\
3389be88e75SGabriel Fernandez 	.drv_default	= (_default),\
3399be88e75SGabriel Fernandez }
3409be88e75SGabriel Fernandez 
3419be88e75SGabriel Fernandez #define OSCILLATOR(idx_osc, _id, _name, _gate_id, _gate_rdy_id, _bypass, _css, _drive) \
3429be88e75SGabriel Fernandez 	[(idx_osc)] = (struct clk_oscillator_data){\
3439be88e75SGabriel Fernandez 		.name		= (_name),\
3449be88e75SGabriel Fernandez 		.id_clk		= (_id),\
3459be88e75SGabriel Fernandez 		.gate_id	= (_gate_id),\
3469be88e75SGabriel Fernandez 		.gate_rdy_id	= (_gate_rdy_id),\
3479be88e75SGabriel Fernandez 		.bypass		= (_bypass),\
3489be88e75SGabriel Fernandez 		.css		= (_css),\
3499be88e75SGabriel Fernandez 		.drive		= (_drive),\
3509be88e75SGabriel Fernandez 	}
3519be88e75SGabriel Fernandez 
3529be88e75SGabriel Fernandez struct clk_oscillator_data *clk_oscillator_get_data(struct stm32_clk_priv *priv, int id);
3539be88e75SGabriel Fernandez 
3549be88e75SGabriel Fernandez void clk_stm32_osc_init(struct stm32_clk_priv *priv, int id);
3559be88e75SGabriel Fernandez bool clk_stm32_osc_gate_is_enabled(struct stm32_clk_priv *priv, int id);
3569be88e75SGabriel Fernandez int clk_stm32_osc_gate_enable(struct stm32_clk_priv *priv, int id);
3579be88e75SGabriel Fernandez void clk_stm32_osc_gate_disable(struct stm32_clk_priv *priv, int id);
3589be88e75SGabriel Fernandez 
3599be88e75SGabriel Fernandez struct stm32_osc_cfg {
360*d9a7ddebSGabriel Fernandez 	uint8_t osc_id;
3619be88e75SGabriel Fernandez };
3629be88e75SGabriel Fernandez 
3639be88e75SGabriel Fernandez #define CLK_OSC(idx, _idx, _parent, _osc_id) \
3649be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3659be88e75SGabriel Fernandez 		.binding	= (_idx),\
3669be88e75SGabriel Fernandez 		.parent		= (_parent),\
3679be88e75SGabriel Fernandez 		.flags		= CLK_IS_CRITICAL,\
3689be88e75SGabriel Fernandez 		.clock_cfg	= &(struct stm32_osc_cfg){\
3699be88e75SGabriel Fernandez 			.osc_id = (_osc_id),\
3709be88e75SGabriel Fernandez 		},\
371*d9a7ddebSGabriel Fernandez 		.ops		= STM32_OSC_OPS,\
3729be88e75SGabriel Fernandez 	}
3739be88e75SGabriel Fernandez 
3749be88e75SGabriel Fernandez #define CLK_OSC_FIXED(idx, _idx, _parent, _osc_id) \
3759be88e75SGabriel Fernandez 	[(idx)] = (struct clk_stm32){ \
3769be88e75SGabriel Fernandez 		.binding	= (_idx),\
3779be88e75SGabriel Fernandez 		.parent		= (_parent),\
3789be88e75SGabriel Fernandez 		.flags		= CLK_IS_CRITICAL,\
3799be88e75SGabriel Fernandez 		.clock_cfg	= &(struct stm32_osc_cfg){\
3809be88e75SGabriel Fernandez 			.osc_id	= (_osc_id),\
3819be88e75SGabriel Fernandez 		},\
382*d9a7ddebSGabriel Fernandez 		.ops		= STM32_OSC_NOGATE_OPS,\
3839be88e75SGabriel Fernandez 	}
3849be88e75SGabriel Fernandez 
3859be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_mux_ops;
3869be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_divider_ops;
3879be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_gate_ops;
3889be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_fixed_factor_ops;
3899be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_gate_ops;
3909be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_timer_ops;
3919be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_fixed_rate_ops;
3929be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_ops;
3939be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_nogate_ops;
3949be88e75SGabriel Fernandez 
395*d9a7ddebSGabriel Fernandez enum {
396*d9a7ddebSGabriel Fernandez 	NO_OPS,
397*d9a7ddebSGabriel Fernandez 	FIXED_FACTOR_OPS,
398*d9a7ddebSGabriel Fernandez 	GATE_OPS,
399*d9a7ddebSGabriel Fernandez 	STM32_MUX_OPS,
400*d9a7ddebSGabriel Fernandez 	STM32_DIVIDER_OPS,
401*d9a7ddebSGabriel Fernandez 	STM32_GATE_OPS,
402*d9a7ddebSGabriel Fernandez 	STM32_TIMER_OPS,
403*d9a7ddebSGabriel Fernandez 	STM32_FIXED_RATE_OPS,
404*d9a7ddebSGabriel Fernandez 	STM32_OSC_OPS,
405*d9a7ddebSGabriel Fernandez 	STM32_OSC_NOGATE_OPS,
406*d9a7ddebSGabriel Fernandez 
407*d9a7ddebSGabriel Fernandez 	STM32_LAST_OPS
408*d9a7ddebSGabriel Fernandez };
409*d9a7ddebSGabriel Fernandez 
4109be88e75SGabriel Fernandez #endif /* CLK_STM32_CORE_H */
411