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