cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clk-stm32-core.h (4820B)


      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)