1*9be88e75SGabriel Fernandez /* 2*9be88e75SGabriel Fernandez * Copyright (C) 2022, STMicroelectronics - All Rights Reserved 3*9be88e75SGabriel Fernandez * 4*9be88e75SGabriel Fernandez * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 5*9be88e75SGabriel Fernandez */ 6*9be88e75SGabriel Fernandez 7*9be88e75SGabriel Fernandez #ifndef CLK_STM32_CORE_H 8*9be88e75SGabriel Fernandez #define CLK_STM32_CORE_H 9*9be88e75SGabriel Fernandez 10*9be88e75SGabriel Fernandez struct mux_cfg { 11*9be88e75SGabriel Fernandez uint16_t offset; 12*9be88e75SGabriel Fernandez uint8_t shift; 13*9be88e75SGabriel Fernandez uint8_t width; 14*9be88e75SGabriel Fernandez uint8_t bitrdy; 15*9be88e75SGabriel Fernandez }; 16*9be88e75SGabriel Fernandez 17*9be88e75SGabriel Fernandez struct gate_cfg { 18*9be88e75SGabriel Fernandez uint16_t offset; 19*9be88e75SGabriel Fernandez uint8_t bit_idx; 20*9be88e75SGabriel Fernandez uint8_t set_clr; 21*9be88e75SGabriel Fernandez }; 22*9be88e75SGabriel Fernandez 23*9be88e75SGabriel Fernandez struct clk_div_table { 24*9be88e75SGabriel Fernandez unsigned int val; 25*9be88e75SGabriel Fernandez unsigned int div; 26*9be88e75SGabriel Fernandez }; 27*9be88e75SGabriel Fernandez 28*9be88e75SGabriel Fernandez struct div_cfg { 29*9be88e75SGabriel Fernandez uint16_t offset; 30*9be88e75SGabriel Fernandez uint8_t shift; 31*9be88e75SGabriel Fernandez uint8_t width; 32*9be88e75SGabriel Fernandez uint8_t flags; 33*9be88e75SGabriel Fernandez uint8_t bitrdy; 34*9be88e75SGabriel Fernandez const struct clk_div_table *table; 35*9be88e75SGabriel Fernandez }; 36*9be88e75SGabriel Fernandez 37*9be88e75SGabriel Fernandez struct parent_cfg { 38*9be88e75SGabriel Fernandez uint8_t num_parents; 39*9be88e75SGabriel Fernandez const uint16_t *id_parents; 40*9be88e75SGabriel Fernandez struct mux_cfg *mux; 41*9be88e75SGabriel Fernandez }; 42*9be88e75SGabriel Fernandez 43*9be88e75SGabriel Fernandez struct stm32_clk_priv; 44*9be88e75SGabriel Fernandez 45*9be88e75SGabriel Fernandez struct stm32_clk_ops { 46*9be88e75SGabriel Fernandez unsigned long (*recalc_rate)(struct stm32_clk_priv *priv, int id, unsigned long rate); 47*9be88e75SGabriel Fernandez int (*get_parent)(struct stm32_clk_priv *priv, int id); 48*9be88e75SGabriel Fernandez int (*set_rate)(struct stm32_clk_priv *priv, int id, unsigned long rate, 49*9be88e75SGabriel Fernandez unsigned long prate); 50*9be88e75SGabriel Fernandez int (*enable)(struct stm32_clk_priv *priv, int id); 51*9be88e75SGabriel Fernandez void (*disable)(struct stm32_clk_priv *priv, int id); 52*9be88e75SGabriel Fernandez bool (*is_enabled)(struct stm32_clk_priv *priv, int id); 53*9be88e75SGabriel Fernandez void (*init)(struct stm32_clk_priv *priv, int id); 54*9be88e75SGabriel Fernandez }; 55*9be88e75SGabriel Fernandez 56*9be88e75SGabriel Fernandez struct clk_stm32 { 57*9be88e75SGabriel Fernandez const char *name; 58*9be88e75SGabriel Fernandez uint16_t binding; 59*9be88e75SGabriel Fernandez uint16_t parent; 60*9be88e75SGabriel Fernandez uint8_t flags; 61*9be88e75SGabriel Fernandez void *clock_cfg; 62*9be88e75SGabriel Fernandez const struct stm32_clk_ops *ops; 63*9be88e75SGabriel Fernandez }; 64*9be88e75SGabriel Fernandez 65*9be88e75SGabriel Fernandez struct stm32_clk_priv { 66*9be88e75SGabriel Fernandez uintptr_t base; 67*9be88e75SGabriel Fernandez const uint32_t num; 68*9be88e75SGabriel Fernandez const struct clk_stm32 *clks; 69*9be88e75SGabriel Fernandez const struct parent_cfg *parents; 70*9be88e75SGabriel Fernandez const uint32_t nb_parents; 71*9be88e75SGabriel Fernandez const struct gate_cfg *gates; 72*9be88e75SGabriel Fernandez const uint32_t nb_gates; 73*9be88e75SGabriel Fernandez const struct div_cfg *div; 74*9be88e75SGabriel Fernandez const uint32_t nb_div; 75*9be88e75SGabriel Fernandez struct clk_oscillator_data *osci_data; 76*9be88e75SGabriel Fernandez const uint32_t nb_osci_data; 77*9be88e75SGabriel Fernandez uint32_t *gate_refcounts; 78*9be88e75SGabriel Fernandez void *pdata; 79*9be88e75SGabriel Fernandez }; 80*9be88e75SGabriel Fernandez 81*9be88e75SGabriel Fernandez struct stm32_clk_bypass { 82*9be88e75SGabriel Fernandez uint16_t offset; 83*9be88e75SGabriel Fernandez uint8_t bit_byp; 84*9be88e75SGabriel Fernandez uint8_t bit_digbyp; 85*9be88e75SGabriel Fernandez }; 86*9be88e75SGabriel Fernandez 87*9be88e75SGabriel Fernandez struct stm32_clk_css { 88*9be88e75SGabriel Fernandez uint16_t offset; 89*9be88e75SGabriel Fernandez uint8_t bit_css; 90*9be88e75SGabriel Fernandez }; 91*9be88e75SGabriel Fernandez 92*9be88e75SGabriel Fernandez struct stm32_clk_drive { 93*9be88e75SGabriel Fernandez uint16_t offset; 94*9be88e75SGabriel Fernandez uint8_t drv_shift; 95*9be88e75SGabriel Fernandez uint8_t drv_width; 96*9be88e75SGabriel Fernandez uint8_t drv_default; 97*9be88e75SGabriel Fernandez }; 98*9be88e75SGabriel Fernandez 99*9be88e75SGabriel Fernandez struct clk_oscillator_data { 100*9be88e75SGabriel Fernandez const char *name; 101*9be88e75SGabriel Fernandez uint16_t id_clk; 102*9be88e75SGabriel Fernandez unsigned long frequency; 103*9be88e75SGabriel Fernandez uint16_t gate_id; 104*9be88e75SGabriel Fernandez uint16_t gate_rdy_id; 105*9be88e75SGabriel Fernandez struct stm32_clk_bypass *bypass; 106*9be88e75SGabriel Fernandez struct stm32_clk_css *css; 107*9be88e75SGabriel Fernandez struct stm32_clk_drive *drive; 108*9be88e75SGabriel Fernandez }; 109*9be88e75SGabriel Fernandez 110*9be88e75SGabriel Fernandez struct clk_fixed_rate { 111*9be88e75SGabriel Fernandez const char *name; 112*9be88e75SGabriel Fernandez unsigned long fixed_rate; 113*9be88e75SGabriel Fernandez }; 114*9be88e75SGabriel Fernandez 115*9be88e75SGabriel Fernandez struct clk_gate_cfg { 116*9be88e75SGabriel Fernandez uint32_t offset; 117*9be88e75SGabriel Fernandez uint8_t bit_idx; 118*9be88e75SGabriel Fernandez }; 119*9be88e75SGabriel Fernandez 120*9be88e75SGabriel Fernandez /* CLOCK FLAGS */ 121*9be88e75SGabriel Fernandez #define CLK_IS_CRITICAL BIT(0) 122*9be88e75SGabriel Fernandez #define CLK_IGNORE_UNUSED BIT(1) 123*9be88e75SGabriel Fernandez #define CLK_SET_RATE_PARENT BIT(2) 124*9be88e75SGabriel Fernandez 125*9be88e75SGabriel Fernandez #define CLK_DIVIDER_ONE_BASED BIT(0) 126*9be88e75SGabriel Fernandez #define CLK_DIVIDER_POWER_OF_TWO BIT(1) 127*9be88e75SGabriel Fernandez #define CLK_DIVIDER_ALLOW_ZERO BIT(2) 128*9be88e75SGabriel Fernandez #define CLK_DIVIDER_HIWORD_MASK BIT(3) 129*9be88e75SGabriel Fernandez #define CLK_DIVIDER_ROUND_CLOSEST BIT(4) 130*9be88e75SGabriel Fernandez #define CLK_DIVIDER_READ_ONLY BIT(5) 131*9be88e75SGabriel Fernandez #define CLK_DIVIDER_MAX_AT_ZERO BIT(6) 132*9be88e75SGabriel Fernandez #define CLK_DIVIDER_BIG_ENDIAN BIT(7) 133*9be88e75SGabriel Fernandez 134*9be88e75SGabriel Fernandez #define MUX_MAX_PARENTS U(0x8000) 135*9be88e75SGabriel Fernandez #define MUX_PARENT_MASK GENMASK(14, 0) 136*9be88e75SGabriel Fernandez #define MUX_FLAG U(0x8000) 137*9be88e75SGabriel Fernandez #define MUX(mux) ((mux) | MUX_FLAG) 138*9be88e75SGabriel Fernandez 139*9be88e75SGabriel Fernandez #define NO_GATE 0 140*9be88e75SGabriel Fernandez #define _NO_ID UINT16_MAX 141*9be88e75SGabriel Fernandez #define CLK_IS_ROOT UINT16_MAX 142*9be88e75SGabriel Fernandez #define MUX_NO_BIT_RDY UINT8_MAX 143*9be88e75SGabriel Fernandez #define DIV_NO_BIT_RDY UINT8_MAX 144*9be88e75SGabriel Fernandez 145*9be88e75SGabriel Fernandez #define MASK_WIDTH_SHIFT(_width, _shift) \ 146*9be88e75SGabriel Fernandez GENMASK(((_width) + (_shift) - 1U), (_shift)) 147*9be88e75SGabriel Fernandez 148*9be88e75SGabriel Fernandez int clk_stm32_init(struct stm32_clk_priv *priv, uintptr_t base); 149*9be88e75SGabriel Fernandez void clk_stm32_enable_critical_clocks(void); 150*9be88e75SGabriel Fernandez 151*9be88e75SGabriel Fernandez struct stm32_clk_priv *clk_stm32_get_priv(void); 152*9be88e75SGabriel Fernandez 153*9be88e75SGabriel Fernandez int clk_get_index(struct stm32_clk_priv *priv, unsigned long binding_id); 154*9be88e75SGabriel Fernandez const struct clk_stm32 *_clk_get(struct stm32_clk_priv *priv, int id); 155*9be88e75SGabriel Fernandez 156*9be88e75SGabriel Fernandez void clk_oscillator_set_bypass(struct stm32_clk_priv *priv, int id, bool digbyp, bool bypass); 157*9be88e75SGabriel Fernandez void clk_oscillator_set_drive(struct stm32_clk_priv *priv, int id, uint8_t lsedrv); 158*9be88e75SGabriel Fernandez void clk_oscillator_set_css(struct stm32_clk_priv *priv, int id, bool css); 159*9be88e75SGabriel Fernandez 160*9be88e75SGabriel Fernandez int _clk_stm32_gate_wait_ready(struct stm32_clk_priv *priv, uint16_t gate_id, bool ready_on); 161*9be88e75SGabriel Fernandez 162*9be88e75SGabriel Fernandez int clk_oscillator_wait_ready(struct stm32_clk_priv *priv, int id, bool ready_on); 163*9be88e75SGabriel Fernandez int clk_oscillator_wait_ready_on(struct stm32_clk_priv *priv, int id); 164*9be88e75SGabriel Fernandez int clk_oscillator_wait_ready_off(struct stm32_clk_priv *priv, int id); 165*9be88e75SGabriel Fernandez 166*9be88e75SGabriel Fernandez const char *_clk_stm32_get_name(struct stm32_clk_priv *priv, int id); 167*9be88e75SGabriel Fernandez const char *clk_stm32_get_name(struct stm32_clk_priv *priv, unsigned long binding_id); 168*9be88e75SGabriel Fernandez int clk_stm32_get_counter(unsigned long binding_id); 169*9be88e75SGabriel Fernandez 170*9be88e75SGabriel Fernandez void _clk_stm32_gate_disable(struct stm32_clk_priv *priv, uint16_t gate_id); 171*9be88e75SGabriel Fernandez int _clk_stm32_gate_enable(struct stm32_clk_priv *priv, uint16_t gate_id); 172*9be88e75SGabriel Fernandez 173*9be88e75SGabriel Fernandez int _clk_stm32_set_parent(struct stm32_clk_priv *priv, int id, int src_id); 174*9be88e75SGabriel Fernandez int _clk_stm32_set_parent_by_index(struct stm32_clk_priv *priv, int clk, int sel); 175*9be88e75SGabriel Fernandez 176*9be88e75SGabriel Fernandez int _clk_stm32_get_parent(struct stm32_clk_priv *priv, int id); 177*9be88e75SGabriel Fernandez int _clk_stm32_get_parent_by_index(struct stm32_clk_priv *priv, int clk_id, int idx); 178*9be88e75SGabriel Fernandez int _clk_stm32_get_parent_index(struct stm32_clk_priv *priv, int clk_id); 179*9be88e75SGabriel Fernandez 180*9be88e75SGabriel Fernandez unsigned long _clk_stm32_get_rate(struct stm32_clk_priv *priv, int id); 181*9be88e75SGabriel Fernandez unsigned long _clk_stm32_get_parent_rate(struct stm32_clk_priv *priv, int id); 182*9be88e75SGabriel Fernandez 183*9be88e75SGabriel Fernandez bool _stm32_clk_is_flags(struct stm32_clk_priv *priv, int id, uint8_t flag); 184*9be88e75SGabriel Fernandez 185*9be88e75SGabriel Fernandez int _clk_stm32_enable(struct stm32_clk_priv *priv, int id); 186*9be88e75SGabriel Fernandez void _clk_stm32_disable(struct stm32_clk_priv *priv, int id); 187*9be88e75SGabriel Fernandez 188*9be88e75SGabriel Fernandez int clk_stm32_enable_call_ops(struct stm32_clk_priv *priv, uint16_t id); 189*9be88e75SGabriel Fernandez void clk_stm32_disable_call_ops(struct stm32_clk_priv *priv, uint16_t id); 190*9be88e75SGabriel Fernandez 191*9be88e75SGabriel Fernandez bool _clk_stm32_is_enabled(struct stm32_clk_priv *priv, int id); 192*9be88e75SGabriel Fernandez 193*9be88e75SGabriel Fernandez int _clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int div_id, 194*9be88e75SGabriel Fernandez unsigned long rate, unsigned long parent_rate); 195*9be88e75SGabriel Fernandez 196*9be88e75SGabriel Fernandez int clk_stm32_divider_set_rate(struct stm32_clk_priv *priv, int id, unsigned long rate, 197*9be88e75SGabriel Fernandez unsigned long prate); 198*9be88e75SGabriel Fernandez 199*9be88e75SGabriel Fernandez unsigned long _clk_stm32_divider_recalc(struct stm32_clk_priv *priv, 200*9be88e75SGabriel Fernandez int div_id, 201*9be88e75SGabriel Fernandez unsigned long prate); 202*9be88e75SGabriel Fernandez 203*9be88e75SGabriel Fernandez unsigned long clk_stm32_divider_recalc(struct stm32_clk_priv *priv, int idx, 204*9be88e75SGabriel Fernandez unsigned long prate); 205*9be88e75SGabriel Fernandez 206*9be88e75SGabriel Fernandez int clk_stm32_gate_enable(struct stm32_clk_priv *priv, int idx); 207*9be88e75SGabriel Fernandez void clk_stm32_gate_disable(struct stm32_clk_priv *priv, int idx); 208*9be88e75SGabriel Fernandez 209*9be88e75SGabriel Fernandez bool _clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int gate_id); 210*9be88e75SGabriel Fernandez bool clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int idx); 211*9be88e75SGabriel Fernandez 212*9be88e75SGabriel Fernandez uint32_t clk_stm32_div_get_value(struct stm32_clk_priv *priv, int div_id); 213*9be88e75SGabriel Fernandez int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value); 214*9be88e75SGabriel Fernandez int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel); 215*9be88e75SGabriel Fernandez int clk_mux_get_parent(struct stm32_clk_priv *priv, uint32_t mux_id); 216*9be88e75SGabriel Fernandez 217*9be88e75SGabriel Fernandez int stm32_clk_parse_fdt_by_name(void *fdt, int node, const char *name, uint32_t *tab, uint32_t *nb); 218*9be88e75SGabriel Fernandez 219*9be88e75SGabriel Fernandez #ifdef CFG_STM32_CLK_DEBUG 220*9be88e75SGabriel Fernandez void clk_stm32_display_clock_info(void); 221*9be88e75SGabriel Fernandez #endif 222*9be88e75SGabriel Fernandez 223*9be88e75SGabriel Fernandez struct clk_stm32_div_cfg { 224*9be88e75SGabriel Fernandez int id; 225*9be88e75SGabriel Fernandez }; 226*9be88e75SGabriel Fernandez 227*9be88e75SGabriel Fernandez #define STM32_DIV(idx, _binding, _parent, _flags, _div_id) \ 228*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 229*9be88e75SGabriel Fernandez .name = #idx,\ 230*9be88e75SGabriel Fernandez .binding = (_binding),\ 231*9be88e75SGabriel Fernandez .parent = (_parent),\ 232*9be88e75SGabriel Fernandez .flags = (_flags),\ 233*9be88e75SGabriel Fernandez .clock_cfg = &(struct clk_stm32_div_cfg){\ 234*9be88e75SGabriel Fernandez .id = (_div_id),\ 235*9be88e75SGabriel Fernandez },\ 236*9be88e75SGabriel Fernandez .ops = &clk_stm32_divider_ops,\ 237*9be88e75SGabriel Fernandez } 238*9be88e75SGabriel Fernandez 239*9be88e75SGabriel Fernandez struct clk_stm32_gate_cfg { 240*9be88e75SGabriel Fernandez int id; 241*9be88e75SGabriel Fernandez }; 242*9be88e75SGabriel Fernandez 243*9be88e75SGabriel Fernandez #define STM32_GATE(idx, _binding, _parent, _flags, _gate_id) \ 244*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 245*9be88e75SGabriel Fernandez .name = #idx,\ 246*9be88e75SGabriel Fernandez .binding = (_binding),\ 247*9be88e75SGabriel Fernandez .parent = (_parent),\ 248*9be88e75SGabriel Fernandez .flags = (_flags),\ 249*9be88e75SGabriel Fernandez .clock_cfg = &(struct clk_stm32_gate_cfg){\ 250*9be88e75SGabriel Fernandez .id = (_gate_id),\ 251*9be88e75SGabriel Fernandez },\ 252*9be88e75SGabriel Fernandez .ops = &clk_stm32_gate_ops,\ 253*9be88e75SGabriel Fernandez } 254*9be88e75SGabriel Fernandez 255*9be88e75SGabriel Fernandez struct fixed_factor_cfg { 256*9be88e75SGabriel Fernandez unsigned int mult; 257*9be88e75SGabriel Fernandez unsigned int div; 258*9be88e75SGabriel Fernandez }; 259*9be88e75SGabriel Fernandez 260*9be88e75SGabriel Fernandez unsigned long fixed_factor_recalc_rate(struct stm32_clk_priv *priv, 261*9be88e75SGabriel Fernandez int _idx, unsigned long prate); 262*9be88e75SGabriel Fernandez 263*9be88e75SGabriel Fernandez #define FIXED_FACTOR(idx, _idx, _parent, _mult, _div) \ 264*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 265*9be88e75SGabriel Fernandez .name = #idx,\ 266*9be88e75SGabriel Fernandez .binding = (_idx),\ 267*9be88e75SGabriel Fernandez .parent = (_parent),\ 268*9be88e75SGabriel Fernandez .clock_cfg = &(struct fixed_factor_cfg){\ 269*9be88e75SGabriel Fernandez .mult = (_mult),\ 270*9be88e75SGabriel Fernandez .div = (_div),\ 271*9be88e75SGabriel Fernandez },\ 272*9be88e75SGabriel Fernandez .ops = &clk_fixed_factor_ops,\ 273*9be88e75SGabriel Fernandez } 274*9be88e75SGabriel Fernandez 275*9be88e75SGabriel Fernandez #define GATE(idx, _binding, _parent, _flags, _offset, _bit_idx) \ 276*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 277*9be88e75SGabriel Fernandez .name = #idx,\ 278*9be88e75SGabriel Fernandez .binding = (_binding),\ 279*9be88e75SGabriel Fernandez .parent = (_parent),\ 280*9be88e75SGabriel Fernandez .flags = (_flags),\ 281*9be88e75SGabriel Fernandez .clock_cfg = &(struct clk_gate_cfg){\ 282*9be88e75SGabriel Fernandez .offset = (_offset),\ 283*9be88e75SGabriel Fernandez .bit_idx = (_bit_idx),\ 284*9be88e75SGabriel Fernandez },\ 285*9be88e75SGabriel Fernandez .ops = &clk_gate_ops,\ 286*9be88e75SGabriel Fernandez } 287*9be88e75SGabriel Fernandez 288*9be88e75SGabriel Fernandez #define STM32_MUX(idx, _binding, _mux_id, _flags) \ 289*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 290*9be88e75SGabriel Fernandez .name = #idx,\ 291*9be88e75SGabriel Fernandez .binding = (_binding),\ 292*9be88e75SGabriel Fernandez .parent = (MUX(_mux_id)),\ 293*9be88e75SGabriel Fernandez .flags = (_flags),\ 294*9be88e75SGabriel Fernandez .clock_cfg = NULL,\ 295*9be88e75SGabriel Fernandez .ops = (&clk_mux_ops),\ 296*9be88e75SGabriel Fernandez } 297*9be88e75SGabriel Fernandez 298*9be88e75SGabriel Fernandez struct clk_timer_cfg { 299*9be88e75SGabriel Fernandez uint32_t apbdiv; 300*9be88e75SGabriel Fernandez uint32_t timpre; 301*9be88e75SGabriel Fernandez }; 302*9be88e75SGabriel Fernandez 303*9be88e75SGabriel Fernandez #define CK_TIMER(idx, _idx, _parent, _flags, _apbdiv, _timpre) \ 304*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 305*9be88e75SGabriel Fernandez .name = #idx,\ 306*9be88e75SGabriel Fernandez .binding = (_idx),\ 307*9be88e75SGabriel Fernandez .parent = (_parent),\ 308*9be88e75SGabriel Fernandez .flags = (CLK_SET_RATE_PARENT | (_flags)),\ 309*9be88e75SGabriel Fernandez .clock_cfg = &(struct clk_timer_cfg){\ 310*9be88e75SGabriel Fernandez .apbdiv = (_apbdiv),\ 311*9be88e75SGabriel Fernandez .timpre = (_timpre),\ 312*9be88e75SGabriel Fernandez },\ 313*9be88e75SGabriel Fernandez .ops = &clk_timer_ops,\ 314*9be88e75SGabriel Fernandez } 315*9be88e75SGabriel Fernandez 316*9be88e75SGabriel Fernandez struct clk_stm32_fixed_rate_cfg { 317*9be88e75SGabriel Fernandez unsigned long rate; 318*9be88e75SGabriel Fernandez }; 319*9be88e75SGabriel Fernandez 320*9be88e75SGabriel Fernandez #define CLK_FIXED_RATE(idx, _binding, _rate) \ 321*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 322*9be88e75SGabriel Fernandez .name = #idx,\ 323*9be88e75SGabriel Fernandez .binding = (_binding),\ 324*9be88e75SGabriel Fernandez .parent = (CLK_IS_ROOT),\ 325*9be88e75SGabriel Fernandez .clock_cfg = &(struct clk_stm32_fixed_rate_cfg){\ 326*9be88e75SGabriel Fernandez .rate = (_rate),\ 327*9be88e75SGabriel Fernandez },\ 328*9be88e75SGabriel Fernandez .ops = &clk_stm32_fixed_rate_ops,\ 329*9be88e75SGabriel Fernandez } 330*9be88e75SGabriel Fernandez 331*9be88e75SGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) &(struct stm32_clk_bypass){\ 332*9be88e75SGabriel Fernandez .offset = (_offset),\ 333*9be88e75SGabriel Fernandez .bit_byp = (_bit_byp),\ 334*9be88e75SGabriel Fernandez .bit_digbyp = (_bit_digbyp),\ 335*9be88e75SGabriel Fernandez } 336*9be88e75SGabriel Fernandez 337*9be88e75SGabriel Fernandez #define CSS(_offset, _bit_css) &(struct stm32_clk_css){\ 338*9be88e75SGabriel Fernandez .offset = (_offset),\ 339*9be88e75SGabriel Fernandez .bit_css = (_bit_css),\ 340*9be88e75SGabriel Fernandez } 341*9be88e75SGabriel Fernandez 342*9be88e75SGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) &(struct stm32_clk_drive){\ 343*9be88e75SGabriel Fernandez .offset = (_offset),\ 344*9be88e75SGabriel Fernandez .drv_shift = (_shift),\ 345*9be88e75SGabriel Fernandez .drv_width = (_width),\ 346*9be88e75SGabriel Fernandez .drv_default = (_default),\ 347*9be88e75SGabriel Fernandez } 348*9be88e75SGabriel Fernandez 349*9be88e75SGabriel Fernandez #define OSCILLATOR(idx_osc, _id, _name, _gate_id, _gate_rdy_id, _bypass, _css, _drive) \ 350*9be88e75SGabriel Fernandez [(idx_osc)] = (struct clk_oscillator_data){\ 351*9be88e75SGabriel Fernandez .name = (_name),\ 352*9be88e75SGabriel Fernandez .id_clk = (_id),\ 353*9be88e75SGabriel Fernandez .gate_id = (_gate_id),\ 354*9be88e75SGabriel Fernandez .gate_rdy_id = (_gate_rdy_id),\ 355*9be88e75SGabriel Fernandez .bypass = (_bypass),\ 356*9be88e75SGabriel Fernandez .css = (_css),\ 357*9be88e75SGabriel Fernandez .drive = (_drive),\ 358*9be88e75SGabriel Fernandez } 359*9be88e75SGabriel Fernandez 360*9be88e75SGabriel Fernandez struct clk_oscillator_data *clk_oscillator_get_data(struct stm32_clk_priv *priv, int id); 361*9be88e75SGabriel Fernandez 362*9be88e75SGabriel Fernandez void clk_stm32_osc_init(struct stm32_clk_priv *priv, int id); 363*9be88e75SGabriel Fernandez bool clk_stm32_osc_gate_is_enabled(struct stm32_clk_priv *priv, int id); 364*9be88e75SGabriel Fernandez int clk_stm32_osc_gate_enable(struct stm32_clk_priv *priv, int id); 365*9be88e75SGabriel Fernandez void clk_stm32_osc_gate_disable(struct stm32_clk_priv *priv, int id); 366*9be88e75SGabriel Fernandez 367*9be88e75SGabriel Fernandez struct stm32_osc_cfg { 368*9be88e75SGabriel Fernandez int osc_id; 369*9be88e75SGabriel Fernandez }; 370*9be88e75SGabriel Fernandez 371*9be88e75SGabriel Fernandez #define CLK_OSC(idx, _idx, _parent, _osc_id) \ 372*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 373*9be88e75SGabriel Fernandez .name = #idx,\ 374*9be88e75SGabriel Fernandez .binding = (_idx),\ 375*9be88e75SGabriel Fernandez .parent = (_parent),\ 376*9be88e75SGabriel Fernandez .flags = CLK_IS_CRITICAL,\ 377*9be88e75SGabriel Fernandez .clock_cfg = &(struct stm32_osc_cfg){\ 378*9be88e75SGabriel Fernandez .osc_id = (_osc_id),\ 379*9be88e75SGabriel Fernandez },\ 380*9be88e75SGabriel Fernandez .ops = &clk_stm32_osc_ops,\ 381*9be88e75SGabriel Fernandez } 382*9be88e75SGabriel Fernandez 383*9be88e75SGabriel Fernandez #define CLK_OSC_FIXED(idx, _idx, _parent, _osc_id) \ 384*9be88e75SGabriel Fernandez [(idx)] = (struct clk_stm32){ \ 385*9be88e75SGabriel Fernandez .name = #idx,\ 386*9be88e75SGabriel Fernandez .binding = (_idx),\ 387*9be88e75SGabriel Fernandez .parent = (_parent),\ 388*9be88e75SGabriel Fernandez .flags = CLK_IS_CRITICAL,\ 389*9be88e75SGabriel Fernandez .clock_cfg = &(struct stm32_osc_cfg){\ 390*9be88e75SGabriel Fernandez .osc_id = (_osc_id),\ 391*9be88e75SGabriel Fernandez },\ 392*9be88e75SGabriel Fernandez .ops = &clk_stm32_osc_nogate_ops,\ 393*9be88e75SGabriel Fernandez } 394*9be88e75SGabriel Fernandez 395*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_mux_ops; 396*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_divider_ops; 397*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_gate_ops; 398*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_fixed_factor_ops; 399*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_gate_ops; 400*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_timer_ops; 401*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_fixed_rate_ops; 402*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_ops; 403*9be88e75SGabriel Fernandez extern const struct stm32_clk_ops clk_stm32_osc_nogate_ops; 404*9be88e75SGabriel Fernandez 405*9be88e75SGabriel Fernandez #endif /* CLK_STM32_CORE_H */ 406