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