Linux Audio

Check our new training course

Linux BSP development engineering services

Need help to port Linux and bootloaders to your hardware?
Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: GPL-2.0  */
  2/*
  3 * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
  4 * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
  5 */
  6
  7#include <linux/clk-provider.h>
  8
  9struct stm32_rcc_match_data;
 10
 11struct stm32_mux_cfg {
 12	u16	offset;
 13	u8	shift;
 14	u8	width;
 15	u8	flags;
 16	u32	*table;
 17	u8	ready;
 18};
 19
 20struct stm32_gate_cfg {
 21	u16	offset;
 22	u8	bit_idx;
 23	u8	set_clr;
 24};
 25
 26struct stm32_div_cfg {
 27	u16	offset;
 28	u8	shift;
 29	u8	width;
 30	u8	flags;
 31	u8	ready;
 32	const struct clk_div_table *table;
 33};
 34
 35struct stm32_composite_cfg {
 36	int	mux;
 37	int	gate;
 38	int	div;
 39};
 40
 41#define NO_ID 0xFFFFFFFF
 42
 43#define NO_STM32_MUX		0xFFFF
 44#define NO_STM32_DIV		0xFFFF
 45#define NO_STM32_GATE		0xFFFF
 46
 47struct clock_config {
 48	unsigned long	id;
 49	int		sec_id;
 50	void		*clock_cfg;
 51
 52	struct clk_hw *(*func)(struct device *dev,
 53			       const struct stm32_rcc_match_data *data,
 54			       void __iomem *base,
 55			       spinlock_t *lock,
 56			       const struct clock_config *cfg);
 57};
 58
 59struct clk_stm32_clock_data {
 60	u16 *gate_cpt;
 61	const struct stm32_gate_cfg	*gates;
 62	const struct stm32_mux_cfg	*muxes;
 63	const struct stm32_div_cfg	*dividers;
 64	struct clk_hw *(*is_multi_mux)(struct clk_hw *hw);
 65};
 66
 67struct stm32_rcc_match_data {
 68	struct clk_hw_onecell_data	*hw_clks;
 69	unsigned int			num_clocks;
 70	const struct clock_config	*tab_clocks;
 71	unsigned int			maxbinding;
 72	struct clk_stm32_clock_data	*clock_data;
 73	u32				clear_offset;
 74	int (*check_security)(void __iomem *base,
 75			      const struct clock_config *cfg);
 76	int (*multi_mux)(void __iomem *base, const struct clock_config *cfg);
 77};
 78
 79int stm32_rcc_reset_init(struct device *dev, const struct of_device_id *match,
 80			 void __iomem *base);
 81
 82int stm32_rcc_init(struct device *dev, const struct of_device_id *match_data,
 83		   void __iomem *base);
 84
 85/* MUX define */
 86#define MUX_NO_RDY		0xFF
 87#define MUX_SAFE		BIT(7)
 88
 89/* DIV define */
 90#define DIV_NO_RDY		0xFF
 91
 92/* Definition of clock structure */
 93struct clk_stm32_mux {
 94	u16 mux_id;
 95	struct clk_hw hw;
 96	void __iomem *base;
 97	struct clk_stm32_clock_data *clock_data;
 98	spinlock_t *lock; /* spin lock */
 99};
100
101#define to_clk_stm32_mux(_hw) container_of(_hw, struct clk_stm32_mux, hw)
102
103struct clk_stm32_gate {
104	u16 gate_id;
105	struct clk_hw hw;
106	void __iomem *base;
107	struct clk_stm32_clock_data *clock_data;
108	spinlock_t *lock; /* spin lock */
109};
110
111#define to_clk_stm32_gate(_hw) container_of(_hw, struct clk_stm32_gate, hw)
112
113struct clk_stm32_div {
114	u16 div_id;
115	struct clk_hw hw;
116	void __iomem *base;
117	struct clk_stm32_clock_data *clock_data;
118	spinlock_t *lock; /* spin lock */
119};
120
121#define to_clk_stm32_divider(_hw) container_of(_hw, struct clk_stm32_div, hw)
122
123struct clk_stm32_composite {
124	u16 gate_id;
125	u16 mux_id;
126	u16 div_id;
127	struct clk_hw hw;
128	void __iomem *base;
129	struct clk_stm32_clock_data *clock_data;
130	spinlock_t *lock; /* spin lock */
131};
132
133#define to_clk_stm32_composite(_hw) container_of(_hw, struct clk_stm32_composite, hw)
134
135/* Clock operators */
136extern const struct clk_ops clk_stm32_mux_ops;
137extern const struct clk_ops clk_stm32_gate_ops;
138extern const struct clk_ops clk_stm32_divider_ops;
139extern const struct clk_ops clk_stm32_composite_ops;
140
141/* Clock registering */
142struct clk_hw *clk_stm32_mux_register(struct device *dev,
143				      const struct stm32_rcc_match_data *data,
144				      void __iomem *base,
145				      spinlock_t *lock,
146				      const struct clock_config *cfg);
147
148struct clk_hw *clk_stm32_gate_register(struct device *dev,
149				       const struct stm32_rcc_match_data *data,
150				       void __iomem *base,
151				       spinlock_t *lock,
152				       const struct clock_config *cfg);
153
154struct clk_hw *clk_stm32_div_register(struct device *dev,
155				      const struct stm32_rcc_match_data *data,
156				      void __iomem *base,
157				      spinlock_t *lock,
158				      const struct clock_config *cfg);
159
160struct clk_hw *clk_stm32_composite_register(struct device *dev,
161					    const struct stm32_rcc_match_data *data,
162					    void __iomem *base,
163					    spinlock_t *lock,
164					    const struct clock_config *cfg);
165
166#define STM32_CLOCK_CFG(_binding, _clk, _sec_id, _struct, _register)\
167{\
168	.id		= (_binding),\
169	.sec_id		= (_sec_id),\
170	.clock_cfg	= (_struct) {_clk},\
171	.func		= (_register),\
172}
173
174#define STM32_MUX_CFG(_binding, _clk, _sec_id)\
175	STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_mux *,\
176			&clk_stm32_mux_register)
177
178#define STM32_GATE_CFG(_binding, _clk, _sec_id)\
179	STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_gate *,\
180			&clk_stm32_gate_register)
181
182#define STM32_DIV_CFG(_binding, _clk, _sec_id)\
183	STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_div *,\
184			&clk_stm32_div_register)
185
186#define STM32_COMPOSITE_CFG(_binding, _clk, _sec_id)\
187	STM32_CLOCK_CFG(_binding, &(_clk), _sec_id, struct clk_stm32_composite *,\
188			&clk_stm32_composite_register)