1*28c10f9eSGabriel Fernandez // SPDX-License-Identifier: BSD-2-Clause 2*28c10f9eSGabriel Fernandez /* 3*28c10f9eSGabriel Fernandez * Copyright (C) 2024, STMicroelectronics 4*28c10f9eSGabriel Fernandez */ 5*28c10f9eSGabriel Fernandez 6*28c10f9eSGabriel Fernandez #include <assert.h> 7*28c10f9eSGabriel Fernandez #include <config.h> 8*28c10f9eSGabriel Fernandez #include <drivers/clk_dt.h> 9*28c10f9eSGabriel Fernandez #include <drivers/stm32_shared_io.h> 10*28c10f9eSGabriel Fernandez #include <drivers/stm32mp25_rcc.h> 11*28c10f9eSGabriel Fernandez #include <drivers/stm32mp_dt_bindings.h> 12*28c10f9eSGabriel Fernandez #include <io.h> 13*28c10f9eSGabriel Fernandez #include <kernel/dt.h> 14*28c10f9eSGabriel Fernandez #include <kernel/panic.h> 15*28c10f9eSGabriel Fernandez #include <libfdt.h> 16*28c10f9eSGabriel Fernandez #include <stdbool.h> 17*28c10f9eSGabriel Fernandez #include <stdio.h> 18*28c10f9eSGabriel Fernandez #include <stm32_sysconf.h> 19*28c10f9eSGabriel Fernandez #include <stm32_util.h> 20*28c10f9eSGabriel Fernandez #include <trace.h> 21*28c10f9eSGabriel Fernandez #include <util.h> 22*28c10f9eSGabriel Fernandez 23*28c10f9eSGabriel Fernandez #include "clk-stm32-core.h" 24*28c10f9eSGabriel Fernandez 25*28c10f9eSGabriel Fernandez #define MAX_OPP CFG_STM32MP_OPP_COUNT 26*28c10f9eSGabriel Fernandez 27*28c10f9eSGabriel Fernandez #define TIMEOUT_US_100MS U(100000) 28*28c10f9eSGabriel Fernandez #define TIMEOUT_US_200MS U(200000) 29*28c10f9eSGabriel Fernandez #define TIMEOUT_US_1S U(1000000) 30*28c10f9eSGabriel Fernandez 31*28c10f9eSGabriel Fernandez #define PLLRDY_TIMEOUT TIMEOUT_US_200MS 32*28c10f9eSGabriel Fernandez #define CLKSRC_TIMEOUT TIMEOUT_US_200MS 33*28c10f9eSGabriel Fernandez #define CLKDIV_TIMEOUT TIMEOUT_US_200MS 34*28c10f9eSGabriel Fernandez #define OSCRDY_TIMEOUT TIMEOUT_US_1S 35*28c10f9eSGabriel Fernandez 36*28c10f9eSGabriel Fernandez /* PLL minimal frequencies for clock sources */ 37*28c10f9eSGabriel Fernandez #define PLL_REFCLK_MIN UL(5000000) 38*28c10f9eSGabriel Fernandez #define PLL_FRAC_REFCLK_MIN UL(10000000) 39*28c10f9eSGabriel Fernandez 40*28c10f9eSGabriel Fernandez /* Parameters from XBAR_CFG in st,cksrc field */ 41*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_CHANNEL GENMASK_32(5, 0) 42*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC GENMASK_32(9, 6) 43*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC_OFFSET U(6) 44*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV GENMASK_32(19, 10) 45*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV_OFFSET U(10) 46*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV GENMASK_32(25, 20) 47*28c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV_OFFSET U(20) 48*28c10f9eSGabriel Fernandez 49*28c10f9eSGabriel Fernandez #define XBAR_CHANNEL_NB U(64) 50*28c10f9eSGabriel Fernandez #define XBAR_ROOT_CHANNEL_NB U(7) 51*28c10f9eSGabriel Fernandez 52*28c10f9eSGabriel Fernandez #define FLEX_STGEN U(33) 53*28c10f9eSGabriel Fernandez 54*28c10f9eSGabriel Fernandez #define RCC_0_MHZ UL(0) 55*28c10f9eSGabriel Fernandez #define RCC_4_MHZ UL(4000000) 56*28c10f9eSGabriel Fernandez #define RCC_16_MHZ UL(16000000) 57*28c10f9eSGabriel Fernandez 58*28c10f9eSGabriel Fernandez enum pll_cfg { 59*28c10f9eSGabriel Fernandez FBDIV, 60*28c10f9eSGabriel Fernandez REFDIV, 61*28c10f9eSGabriel Fernandez POSTDIV1, 62*28c10f9eSGabriel Fernandez POSTDIV2, 63*28c10f9eSGabriel Fernandez PLLCFG_NB 64*28c10f9eSGabriel Fernandez }; 65*28c10f9eSGabriel Fernandez 66*28c10f9eSGabriel Fernandez enum pll_csg { 67*28c10f9eSGabriel Fernandez DIVVAL, 68*28c10f9eSGabriel Fernandez SPREAD, 69*28c10f9eSGabriel Fernandez DOWNSPREAD, 70*28c10f9eSGabriel Fernandez PLLCSG_NB 71*28c10f9eSGabriel Fernandez }; 72*28c10f9eSGabriel Fernandez 73*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg { 74*28c10f9eSGabriel Fernandez bool enabled; 75*28c10f9eSGabriel Fernandez uint32_t cfg[PLLCFG_NB]; 76*28c10f9eSGabriel Fernandez uint32_t csg[PLLCSG_NB]; 77*28c10f9eSGabriel Fernandez uint32_t frac; 78*28c10f9eSGabriel Fernandez bool csg_enabled; 79*28c10f9eSGabriel Fernandez uint32_t src; 80*28c10f9eSGabriel Fernandez }; 81*28c10f9eSGabriel Fernandez 82*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg { 83*28c10f9eSGabriel Fernandez unsigned long freq; 84*28c10f9eSGabriel Fernandez bool bypass; 85*28c10f9eSGabriel Fernandez bool digbyp; 86*28c10f9eSGabriel Fernandez bool css; 87*28c10f9eSGabriel Fernandez uint32_t drive; 88*28c10f9eSGabriel Fernandez }; 89*28c10f9eSGabriel Fernandez 90*28c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg { 91*28c10f9eSGabriel Fernandez uint32_t frq; 92*28c10f9eSGabriel Fernandez uint32_t src; 93*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg pll_cfg; 94*28c10f9eSGabriel Fernandez }; 95*28c10f9eSGabriel Fernandez 96*28c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg { 97*28c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg cpu1_opp[MAX_OPP]; 98*28c10f9eSGabriel Fernandez }; 99*28c10f9eSGabriel Fernandez 100*28c10f9eSGabriel Fernandez struct stm32_clk_platdata { 101*28c10f9eSGabriel Fernandez uintptr_t rcc_base; 102*28c10f9eSGabriel Fernandez uint32_t nosci; 103*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci; 104*28c10f9eSGabriel Fernandez uint32_t npll; 105*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll; 106*28c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp; 107*28c10f9eSGabriel Fernandez uint32_t nbusclk; 108*28c10f9eSGabriel Fernandez uint32_t *busclk; 109*28c10f9eSGabriel Fernandez uint32_t nkernelclk; 110*28c10f9eSGabriel Fernandez uint32_t *kernelclk; 111*28c10f9eSGabriel Fernandez uint32_t nflexgen; 112*28c10f9eSGabriel Fernandez uint32_t *flexgen; 113*28c10f9eSGabriel Fernandez uint32_t c1msrd; 114*28c10f9eSGabriel Fernandez bool safe_rst; 115*28c10f9eSGabriel Fernandez }; 116*28c10f9eSGabriel Fernandez 117*28c10f9eSGabriel Fernandez /* 118*28c10f9eSGabriel Fernandez * GATE CONFIG 119*28c10f9eSGabriel Fernandez */ 120*28c10f9eSGabriel Fernandez 121*28c10f9eSGabriel Fernandez /* WARNING GATE_XXX_RDY MUST FOLLOW GATE_XXX */ 122*28c10f9eSGabriel Fernandez 123*28c10f9eSGabriel Fernandez enum enum_gate_cfg { 124*28c10f9eSGabriel Fernandez GATE_HSI, 125*28c10f9eSGabriel Fernandez GATE_HSI_RDY, 126*28c10f9eSGabriel Fernandez GATE_HSE, 127*28c10f9eSGabriel Fernandez GATE_HSE_RDY, 128*28c10f9eSGabriel Fernandez GATE_LSE, 129*28c10f9eSGabriel Fernandez GATE_LSE_RDY, 130*28c10f9eSGabriel Fernandez GATE_LSI, 131*28c10f9eSGabriel Fernandez GATE_LSI_RDY, 132*28c10f9eSGabriel Fernandez GATE_MSI, 133*28c10f9eSGabriel Fernandez GATE_MSI_RDY, 134*28c10f9eSGabriel Fernandez GATE_PLL1, 135*28c10f9eSGabriel Fernandez GATE_PLL1_RDY, 136*28c10f9eSGabriel Fernandez GATE_PLL2, 137*28c10f9eSGabriel Fernandez GATE_PLL2_RDY, 138*28c10f9eSGabriel Fernandez GATE_PLL3, 139*28c10f9eSGabriel Fernandez GATE_PLL3_RDY, 140*28c10f9eSGabriel Fernandez GATE_PLL4, 141*28c10f9eSGabriel Fernandez GATE_PLL4_RDY, 142*28c10f9eSGabriel Fernandez GATE_PLL5, 143*28c10f9eSGabriel Fernandez GATE_PLL5_RDY, 144*28c10f9eSGabriel Fernandez GATE_PLL6, 145*28c10f9eSGabriel Fernandez GATE_PLL6_RDY, 146*28c10f9eSGabriel Fernandez GATE_PLL7, 147*28c10f9eSGabriel Fernandez GATE_PLL7_RDY, 148*28c10f9eSGabriel Fernandez GATE_PLL8, 149*28c10f9eSGabriel Fernandez GATE_PLL8_RDY, 150*28c10f9eSGabriel Fernandez GATE_PLL4_CKREFST, 151*28c10f9eSGabriel Fernandez GATE_PLL5_CKREFST, 152*28c10f9eSGabriel Fernandez GATE_PLL6_CKREFST, 153*28c10f9eSGabriel Fernandez GATE_PLL7_CKREFST, 154*28c10f9eSGabriel Fernandez GATE_PLL8_CKREFST, 155*28c10f9eSGabriel Fernandez GATE_HSEDIV2, 156*28c10f9eSGabriel Fernandez GATE_APB1DIV_RDY, 157*28c10f9eSGabriel Fernandez GATE_APB2DIV_RDY, 158*28c10f9eSGabriel Fernandez GATE_APB3DIV_RDY, 159*28c10f9eSGabriel Fernandez GATE_APB4DIV_RDY, 160*28c10f9eSGabriel Fernandez GATE_APBDBGDIV_RDY, 161*28c10f9eSGabriel Fernandez GATE_TIMG1PRE_RDY, 162*28c10f9eSGabriel Fernandez GATE_TIMG2PRE_RDY, 163*28c10f9eSGabriel Fernandez GATE_LSMCUDIV_RDY, 164*28c10f9eSGabriel Fernandez GATE_RTCCK, 165*28c10f9eSGabriel Fernandez GATE_C3, 166*28c10f9eSGabriel Fernandez GATE_LPTIM3C3, 167*28c10f9eSGabriel Fernandez GATE_LPTIM4C3, 168*28c10f9eSGabriel Fernandez GATE_LPTIM5C3, 169*28c10f9eSGabriel Fernandez GATE_SPI8C3, 170*28c10f9eSGabriel Fernandez GATE_LPUART1C3, 171*28c10f9eSGabriel Fernandez GATE_I2C8C3, 172*28c10f9eSGabriel Fernandez GATE_ADF1C3, 173*28c10f9eSGabriel Fernandez GATE_GPIOZC3, 174*28c10f9eSGabriel Fernandez GATE_LPDMAC3, 175*28c10f9eSGabriel Fernandez GATE_RTCC3, 176*28c10f9eSGabriel Fernandez GATE_I3C4C3, 177*28c10f9eSGabriel Fernandez GATE_MCO1, 178*28c10f9eSGabriel Fernandez GATE_MCO2, 179*28c10f9eSGabriel Fernandez GATE_DDRCP, 180*28c10f9eSGabriel Fernandez GATE_DDRCAPB, 181*28c10f9eSGabriel Fernandez GATE_DDRPHYCAPB, 182*28c10f9eSGabriel Fernandez GATE_DDRPHYC, 183*28c10f9eSGabriel Fernandez GATE_DDRCFG, 184*28c10f9eSGabriel Fernandez GATE_SYSRAM, 185*28c10f9eSGabriel Fernandez GATE_VDERAM, 186*28c10f9eSGabriel Fernandez GATE_SRAM1, 187*28c10f9eSGabriel Fernandez GATE_SRAM2, 188*28c10f9eSGabriel Fernandez GATE_RETRAM, 189*28c10f9eSGabriel Fernandez GATE_BKPSRAM, 190*28c10f9eSGabriel Fernandez GATE_LPSRAM1, 191*28c10f9eSGabriel Fernandez GATE_LPSRAM2, 192*28c10f9eSGabriel Fernandez GATE_LPSRAM3, 193*28c10f9eSGabriel Fernandez GATE_OSPI1, 194*28c10f9eSGabriel Fernandez GATE_OSPI2, 195*28c10f9eSGabriel Fernandez GATE_FMC, 196*28c10f9eSGabriel Fernandez GATE_DBG, 197*28c10f9eSGabriel Fernandez GATE_TRACE, 198*28c10f9eSGabriel Fernandez GATE_STM, 199*28c10f9eSGabriel Fernandez GATE_ETR, 200*28c10f9eSGabriel Fernandez GATE_GPIOA, 201*28c10f9eSGabriel Fernandez GATE_GPIOB, 202*28c10f9eSGabriel Fernandez GATE_GPIOC, 203*28c10f9eSGabriel Fernandez GATE_GPIOD, 204*28c10f9eSGabriel Fernandez GATE_GPIOE, 205*28c10f9eSGabriel Fernandez GATE_GPIOF, 206*28c10f9eSGabriel Fernandez GATE_GPIOG, 207*28c10f9eSGabriel Fernandez GATE_GPIOH, 208*28c10f9eSGabriel Fernandez GATE_GPIOI, 209*28c10f9eSGabriel Fernandez GATE_GPIOJ, 210*28c10f9eSGabriel Fernandez GATE_GPIOK, 211*28c10f9eSGabriel Fernandez GATE_GPIOZ, 212*28c10f9eSGabriel Fernandez GATE_HPDMA1, 213*28c10f9eSGabriel Fernandez GATE_HPDMA2, 214*28c10f9eSGabriel Fernandez GATE_HPDMA3, 215*28c10f9eSGabriel Fernandez GATE_LPDMA, 216*28c10f9eSGabriel Fernandez GATE_HSEM, 217*28c10f9eSGabriel Fernandez GATE_IPCC1, 218*28c10f9eSGabriel Fernandez GATE_IPCC2, 219*28c10f9eSGabriel Fernandez GATE_RTC, 220*28c10f9eSGabriel Fernandez GATE_SYSCPU1, 221*28c10f9eSGabriel Fernandez GATE_BSEC, 222*28c10f9eSGabriel Fernandez GATE_IS2M, 223*28c10f9eSGabriel Fernandez GATE_HSIMON, 224*28c10f9eSGabriel Fernandez GATE_TIM1, 225*28c10f9eSGabriel Fernandez GATE_TIM2, 226*28c10f9eSGabriel Fernandez GATE_TIM3, 227*28c10f9eSGabriel Fernandez GATE_TIM4, 228*28c10f9eSGabriel Fernandez GATE_TIM5, 229*28c10f9eSGabriel Fernandez GATE_TIM6, 230*28c10f9eSGabriel Fernandez GATE_TIM7, 231*28c10f9eSGabriel Fernandez GATE_TIM8, 232*28c10f9eSGabriel Fernandez GATE_TIM10, 233*28c10f9eSGabriel Fernandez GATE_TIM11, 234*28c10f9eSGabriel Fernandez GATE_TIM12, 235*28c10f9eSGabriel Fernandez GATE_TIM13, 236*28c10f9eSGabriel Fernandez GATE_TIM14, 237*28c10f9eSGabriel Fernandez GATE_TIM15, 238*28c10f9eSGabriel Fernandez GATE_TIM16, 239*28c10f9eSGabriel Fernandez GATE_TIM17, 240*28c10f9eSGabriel Fernandez GATE_TIM20, 241*28c10f9eSGabriel Fernandez GATE_LPTIM1, 242*28c10f9eSGabriel Fernandez GATE_LPTIM2, 243*28c10f9eSGabriel Fernandez GATE_LPTIM3, 244*28c10f9eSGabriel Fernandez GATE_LPTIM4, 245*28c10f9eSGabriel Fernandez GATE_LPTIM5, 246*28c10f9eSGabriel Fernandez GATE_SPI1, 247*28c10f9eSGabriel Fernandez GATE_SPI2, 248*28c10f9eSGabriel Fernandez GATE_SPI3, 249*28c10f9eSGabriel Fernandez GATE_SPI4, 250*28c10f9eSGabriel Fernandez GATE_SPI5, 251*28c10f9eSGabriel Fernandez GATE_SPI6, 252*28c10f9eSGabriel Fernandez GATE_SPI7, 253*28c10f9eSGabriel Fernandez GATE_SPI8, 254*28c10f9eSGabriel Fernandez GATE_SPDIFRX, 255*28c10f9eSGabriel Fernandez GATE_USART1, 256*28c10f9eSGabriel Fernandez GATE_USART2, 257*28c10f9eSGabriel Fernandez GATE_USART3, 258*28c10f9eSGabriel Fernandez GATE_UART4, 259*28c10f9eSGabriel Fernandez GATE_UART5, 260*28c10f9eSGabriel Fernandez GATE_USART6, 261*28c10f9eSGabriel Fernandez GATE_UART7, 262*28c10f9eSGabriel Fernandez GATE_UART8, 263*28c10f9eSGabriel Fernandez GATE_UART9, 264*28c10f9eSGabriel Fernandez GATE_LPUART1, 265*28c10f9eSGabriel Fernandez GATE_I2C1, 266*28c10f9eSGabriel Fernandez GATE_I2C2, 267*28c10f9eSGabriel Fernandez GATE_I2C3, 268*28c10f9eSGabriel Fernandez GATE_I2C4, 269*28c10f9eSGabriel Fernandez GATE_I2C5, 270*28c10f9eSGabriel Fernandez GATE_I2C6, 271*28c10f9eSGabriel Fernandez GATE_I2C7, 272*28c10f9eSGabriel Fernandez GATE_I2C8, 273*28c10f9eSGabriel Fernandez GATE_SAI1, 274*28c10f9eSGabriel Fernandez GATE_SAI2, 275*28c10f9eSGabriel Fernandez GATE_SAI3, 276*28c10f9eSGabriel Fernandez GATE_SAI4, 277*28c10f9eSGabriel Fernandez GATE_MDF1, 278*28c10f9eSGabriel Fernandez GATE_ADF1, 279*28c10f9eSGabriel Fernandez GATE_FDCAN, 280*28c10f9eSGabriel Fernandez GATE_HDP, 281*28c10f9eSGabriel Fernandez GATE_ADC12, 282*28c10f9eSGabriel Fernandez GATE_ADC3, 283*28c10f9eSGabriel Fernandez GATE_ETH1MAC, 284*28c10f9eSGabriel Fernandez GATE_ETH1, 285*28c10f9eSGabriel Fernandez GATE_ETH1TX, 286*28c10f9eSGabriel Fernandez GATE_ETH1RX, 287*28c10f9eSGabriel Fernandez GATE_ETH1STP, 288*28c10f9eSGabriel Fernandez GATE_ETH2MAC, 289*28c10f9eSGabriel Fernandez GATE_ETH2, 290*28c10f9eSGabriel Fernandez GATE_ETH2STP, 291*28c10f9eSGabriel Fernandez GATE_ETH2TX, 292*28c10f9eSGabriel Fernandez GATE_ETH2RX, 293*28c10f9eSGabriel Fernandez GATE_USB2, 294*28c10f9eSGabriel Fernandez GATE_USB2PHY1, 295*28c10f9eSGabriel Fernandez GATE_USB2PHY2, 296*28c10f9eSGabriel Fernandez GATE_USB3DR, 297*28c10f9eSGabriel Fernandez GATE_USB3PCIEPHY, 298*28c10f9eSGabriel Fernandez GATE_PCIE, 299*28c10f9eSGabriel Fernandez GATE_USBTC, 300*28c10f9eSGabriel Fernandez GATE_ETHSWMAC, 301*28c10f9eSGabriel Fernandez GATE_ETHSW, 302*28c10f9eSGabriel Fernandez GATE_ETHSWREF, 303*28c10f9eSGabriel Fernandez GATE_STGEN, 304*28c10f9eSGabriel Fernandez GATE_SDMMC1, 305*28c10f9eSGabriel Fernandez GATE_SDMMC2, 306*28c10f9eSGabriel Fernandez GATE_SDMMC3, 307*28c10f9eSGabriel Fernandez GATE_GPU, 308*28c10f9eSGabriel Fernandez GATE_LTDC, 309*28c10f9eSGabriel Fernandez GATE_DSI, 310*28c10f9eSGabriel Fernandez GATE_LVDS, 311*28c10f9eSGabriel Fernandez GATE_CSI, 312*28c10f9eSGabriel Fernandez GATE_DCMIPP, 313*28c10f9eSGabriel Fernandez GATE_CCI, 314*28c10f9eSGabriel Fernandez GATE_VDEC, 315*28c10f9eSGabriel Fernandez GATE_VENC, 316*28c10f9eSGabriel Fernandez GATE_RNG, 317*28c10f9eSGabriel Fernandez GATE_PKA, 318*28c10f9eSGabriel Fernandez GATE_SAES, 319*28c10f9eSGabriel Fernandez GATE_HASH, 320*28c10f9eSGabriel Fernandez GATE_CRYP1, 321*28c10f9eSGabriel Fernandez GATE_CRYP2, 322*28c10f9eSGabriel Fernandez GATE_IWDG1, 323*28c10f9eSGabriel Fernandez GATE_IWDG2, 324*28c10f9eSGabriel Fernandez GATE_IWDG3, 325*28c10f9eSGabriel Fernandez GATE_IWDG4, 326*28c10f9eSGabriel Fernandez GATE_IWDG5, 327*28c10f9eSGabriel Fernandez GATE_WWDG1, 328*28c10f9eSGabriel Fernandez GATE_WWDG2, 329*28c10f9eSGabriel Fernandez GATE_VREF, 330*28c10f9eSGabriel Fernandez GATE_DTS, 331*28c10f9eSGabriel Fernandez GATE_CRC, 332*28c10f9eSGabriel Fernandez GATE_SERC, 333*28c10f9eSGabriel Fernandez GATE_OSPIIOM, 334*28c10f9eSGabriel Fernandez GATE_GICV2M, 335*28c10f9eSGabriel Fernandez GATE_I3C1, 336*28c10f9eSGabriel Fernandez GATE_I3C2, 337*28c10f9eSGabriel Fernandez GATE_I3C3, 338*28c10f9eSGabriel Fernandez GATE_I3C4, 339*28c10f9eSGabriel Fernandez GATE_NB 340*28c10f9eSGabriel Fernandez }; 341*28c10f9eSGabriel Fernandez 342*28c10f9eSGabriel Fernandez #define GATE_CFG(_id, _offset, _bit_idx, _offset_clr)\ 343*28c10f9eSGabriel Fernandez [(_id)] = {\ 344*28c10f9eSGabriel Fernandez .offset = (_offset),\ 345*28c10f9eSGabriel Fernandez .bit_idx = (_bit_idx),\ 346*28c10f9eSGabriel Fernandez .set_clr = (_offset_clr),\ 347*28c10f9eSGabriel Fernandez } 348*28c10f9eSGabriel Fernandez 349*28c10f9eSGabriel Fernandez static const struct gate_cfg gates_mp25[GATE_NB] = { 350*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LSE, RCC_BDCR, 0, 0), 351*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LSE_RDY, RCC_BDCR, 2, 0), 352*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LSI, RCC_BDCR, 9, 0), 353*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LSI_RDY, RCC_BDCR, 10, 0), 354*28c10f9eSGabriel Fernandez GATE_CFG(GATE_RTCCK, RCC_BDCR, 20, 0), 355*28c10f9eSGabriel Fernandez GATE_CFG(GATE_MSI, RCC_D3DCR, 0, 0), 356*28c10f9eSGabriel Fernandez GATE_CFG(GATE_MSI_RDY, RCC_D3DCR, 2, 0), 357*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL1, RCC_PLL2CFGR1, 8, 0), 358*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL1_RDY, RCC_PLL2CFGR1, 24, 0), 359*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL2, RCC_PLL2CFGR1, 8, 0), 360*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL2_RDY, RCC_PLL2CFGR1, 24, 0), 361*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL3, RCC_PLL3CFGR1, 8, 0), 362*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL3_RDY, RCC_PLL3CFGR1, 24, 0), 363*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4, RCC_PLL4CFGR1, 8, 0), 364*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4_RDY, RCC_PLL4CFGR1, 24, 0), 365*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5, RCC_PLL5CFGR1, 8, 0), 366*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5_RDY, RCC_PLL5CFGR1, 24, 0), 367*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6, RCC_PLL6CFGR1, 8, 0), 368*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6_RDY, RCC_PLL6CFGR1, 24, 0), 369*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7, RCC_PLL7CFGR1, 8, 0), 370*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7_RDY, RCC_PLL7CFGR1, 24, 0), 371*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8, RCC_PLL8CFGR1, 8, 0), 372*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8_RDY, RCC_PLL8CFGR1, 24, 0), 373*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4_CKREFST, RCC_PLL4CFGR1, 28, 0), 374*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5_CKREFST, RCC_PLL5CFGR1, 28, 0), 375*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6_CKREFST, RCC_PLL6CFGR1, 28, 0), 376*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7_CKREFST, RCC_PLL7CFGR1, 28, 0), 377*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8_CKREFST, RCC_PLL8CFGR1, 28, 0), 378*28c10f9eSGabriel Fernandez GATE_CFG(GATE_C3, RCC_C3CFGR, 1, 0), 379*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM3C3, RCC_C3CFGR, 16, 0), 380*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM4C3, RCC_C3CFGR, 17, 0), 381*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM5C3, RCC_C3CFGR, 18, 0), 382*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI8C3, RCC_C3CFGR, 19, 0), 383*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPUART1C3, RCC_C3CFGR, 20, 0), 384*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C8C3, RCC_C3CFGR, 21, 0), 385*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ADF1C3, RCC_C3CFGR, 23, 0), 386*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOZC3, RCC_C3CFGR, 24, 0), 387*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPDMAC3, RCC_C3CFGR, 25, 0), 388*28c10f9eSGabriel Fernandez GATE_CFG(GATE_RTCC3, RCC_C3CFGR, 26, 0), 389*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C4C3, RCC_C3CFGR, 27, 0), 390*28c10f9eSGabriel Fernandez GATE_CFG(GATE_MCO1, RCC_MCO1CFGR, 8, 0), 391*28c10f9eSGabriel Fernandez GATE_CFG(GATE_MCO2, RCC_MCO2CFGR, 8, 0), 392*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSI, RCC_OCENSETR, 0, 1), 393*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSEDIV2, RCC_OCENSETR, 5, 1), 394*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSE, RCC_OCENSETR, 8, 1), 395*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSI_RDY, RCC_OCRDYR, 0, 0), 396*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSE_RDY, RCC_OCRDYR, 8, 0), 397*28c10f9eSGabriel Fernandez GATE_CFG(GATE_APB1DIV_RDY, RCC_APB1DIVR, 31, 0), 398*28c10f9eSGabriel Fernandez GATE_CFG(GATE_APB2DIV_RDY, RCC_APB2DIVR, 31, 0), 399*28c10f9eSGabriel Fernandez GATE_CFG(GATE_APB3DIV_RDY, RCC_APB3DIVR, 31, 0), 400*28c10f9eSGabriel Fernandez GATE_CFG(GATE_APB4DIV_RDY, RCC_APB4DIVR, 31, 0), 401*28c10f9eSGabriel Fernandez GATE_CFG(GATE_APBDBGDIV_RDY, RCC_APBDBGDIVR, 31, 0), 402*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIMG1PRE_RDY, RCC_TIMG1PRER, 31, 0), 403*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIMG2PRE_RDY, RCC_TIMG2PRER, 31, 0), 404*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LSMCUDIV_RDY, RCC_LSMCUDIVR, 31, 0), 405*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCP, RCC_DDRCPCFGR, 1, 0), 406*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCAPB, RCC_DDRCAPBCFGR, 1, 0), 407*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRPHYCAPB, RCC_DDRPHYCAPBCFGR, 1, 0), 408*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRPHYC, RCC_DDRPHYCCFGR, 1, 0), 409*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCFG, RCC_DDRCFGR, 1, 0), 410*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SYSRAM, RCC_SYSRAMCFGR, 1, 0), 411*28c10f9eSGabriel Fernandez GATE_CFG(GATE_VDERAM, RCC_VDERAMCFGR, 1, 0), 412*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SRAM1, RCC_SRAM1CFGR, 1, 0), 413*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SRAM2, RCC_SRAM2CFGR, 1, 0), 414*28c10f9eSGabriel Fernandez GATE_CFG(GATE_RETRAM, RCC_RETRAMCFGR, 1, 0), 415*28c10f9eSGabriel Fernandez GATE_CFG(GATE_BKPSRAM, RCC_BKPSRAMCFGR, 1, 0), 416*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM1, RCC_LPSRAM1CFGR, 1, 0), 417*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM2, RCC_LPSRAM2CFGR, 1, 0), 418*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM3, RCC_LPSRAM3CFGR, 1, 0), 419*28c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPI1, RCC_OSPI1CFGR, 1, 0), 420*28c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPI2, RCC_OSPI2CFGR, 1, 0), 421*28c10f9eSGabriel Fernandez GATE_CFG(GATE_FMC, RCC_FMCCFGR, 1, 0), 422*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DBG, RCC_DBGCFGR, 8, 0), 423*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TRACE, RCC_DBGCFGR, 9, 0), 424*28c10f9eSGabriel Fernandez GATE_CFG(GATE_STM, RCC_STMCFGR, 1, 0), 425*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETR, RCC_ETRCFGR, 1, 0), 426*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOA, RCC_GPIOACFGR, 1, 0), 427*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOB, RCC_GPIOBCFGR, 1, 0), 428*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOC, RCC_GPIOCCFGR, 1, 0), 429*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOD, RCC_GPIODCFGR, 1, 0), 430*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOE, RCC_GPIOECFGR, 1, 0), 431*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOF, RCC_GPIOFCFGR, 1, 0), 432*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOG, RCC_GPIOGCFGR, 1, 0), 433*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOH, RCC_GPIOHCFGR, 1, 0), 434*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOI, RCC_GPIOICFGR, 1, 0), 435*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOJ, RCC_GPIOJCFGR, 1, 0), 436*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOK, RCC_GPIOKCFGR, 1, 0), 437*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOZ, RCC_GPIOZCFGR, 1, 0), 438*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA1, RCC_HPDMA1CFGR, 1, 0), 439*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA2, RCC_HPDMA2CFGR, 1, 0), 440*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA3, RCC_HPDMA3CFGR, 1, 0), 441*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPDMA, RCC_LPDMACFGR, 1, 0), 442*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSEM, RCC_HSEMCFGR, 1, 0), 443*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IPCC1, RCC_IPCC1CFGR, 1, 0), 444*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IPCC2, RCC_IPCC2CFGR, 1, 0), 445*28c10f9eSGabriel Fernandez GATE_CFG(GATE_RTC, RCC_RTCCFGR, 1, 0), 446*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SYSCPU1, RCC_SYSCPU1CFGR, 1, 0), 447*28c10f9eSGabriel Fernandez GATE_CFG(GATE_BSEC, RCC_BSECCFGR, 1, 0), 448*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IS2M, RCC_IS2MCFGR, 1, 0), 449*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HSIMON, RCC_HSIFMONCR, 15, 0), 450*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM1, RCC_TIM1CFGR, 1, 0), 451*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM2, RCC_TIM2CFGR, 1, 0), 452*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM3, RCC_TIM3CFGR, 1, 0), 453*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM4, RCC_TIM4CFGR, 1, 0), 454*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM5, RCC_TIM5CFGR, 1, 0), 455*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM6, RCC_TIM6CFGR, 1, 0), 456*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM7, RCC_TIM7CFGR, 1, 0), 457*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM8, RCC_TIM8CFGR, 1, 0), 458*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM10, RCC_TIM10CFGR, 1, 0), 459*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM11, RCC_TIM11CFGR, 1, 0), 460*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM12, RCC_TIM12CFGR, 1, 0), 461*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM13, RCC_TIM13CFGR, 1, 0), 462*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM14, RCC_TIM14CFGR, 1, 0), 463*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM15, RCC_TIM15CFGR, 1, 0), 464*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM16, RCC_TIM16CFGR, 1, 0), 465*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM17, RCC_TIM17CFGR, 1, 0), 466*28c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM20, RCC_TIM20CFGR, 1, 0), 467*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM1, RCC_LPTIM1CFGR, 1, 0), 468*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM2, RCC_LPTIM2CFGR, 1, 0), 469*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM3, RCC_LPTIM3CFGR, 1, 0), 470*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM4, RCC_LPTIM4CFGR, 1, 0), 471*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM5, RCC_LPTIM5CFGR, 1, 0), 472*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI1, RCC_SPI1CFGR, 1, 0), 473*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI2, RCC_SPI2CFGR, 1, 0), 474*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI3, RCC_SPI3CFGR, 1, 0), 475*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI4, RCC_SPI4CFGR, 1, 0), 476*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI5, RCC_SPI5CFGR, 1, 0), 477*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI6, RCC_SPI6CFGR, 1, 0), 478*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI7, RCC_SPI7CFGR, 1, 0), 479*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI8, RCC_SPI8CFGR, 1, 0), 480*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SPDIFRX, RCC_SPDIFRXCFGR, 1, 0), 481*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USART1, RCC_USART1CFGR, 1, 0), 482*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USART2, RCC_USART2CFGR, 1, 0), 483*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USART3, RCC_USART3CFGR, 1, 0), 484*28c10f9eSGabriel Fernandez GATE_CFG(GATE_UART4, RCC_UART4CFGR, 1, 0), 485*28c10f9eSGabriel Fernandez GATE_CFG(GATE_UART5, RCC_UART5CFGR, 1, 0), 486*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USART6, RCC_USART6CFGR, 1, 0), 487*28c10f9eSGabriel Fernandez GATE_CFG(GATE_UART7, RCC_UART7CFGR, 1, 0), 488*28c10f9eSGabriel Fernandez GATE_CFG(GATE_UART8, RCC_UART8CFGR, 1, 0), 489*28c10f9eSGabriel Fernandez GATE_CFG(GATE_UART9, RCC_UART9CFGR, 1, 0), 490*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LPUART1, RCC_LPUART1CFGR, 1, 0), 491*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C1, RCC_I2C1CFGR, 1, 0), 492*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C2, RCC_I2C2CFGR, 1, 0), 493*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C3, RCC_I2C3CFGR, 1, 0), 494*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C4, RCC_I2C4CFGR, 1, 0), 495*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C5, RCC_I2C5CFGR, 1, 0), 496*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C6, RCC_I2C6CFGR, 1, 0), 497*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C7, RCC_I2C7CFGR, 1, 0), 498*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C8, RCC_I2C8CFGR, 1, 0), 499*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI1, RCC_SAI1CFGR, 1, 0), 500*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI2, RCC_SAI2CFGR, 1, 0), 501*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI3, RCC_SAI3CFGR, 1, 0), 502*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI4, RCC_SAI4CFGR, 1, 0), 503*28c10f9eSGabriel Fernandez GATE_CFG(GATE_MDF1, RCC_MDF1CFGR, 1, 0), 504*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ADF1, RCC_ADF1CFGR, 1, 0), 505*28c10f9eSGabriel Fernandez GATE_CFG(GATE_FDCAN, RCC_FDCANCFGR, 1, 0), 506*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HDP, RCC_HDPCFGR, 1, 0), 507*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ADC12, RCC_ADC12CFGR, 1, 0), 508*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ADC3, RCC_ADC3CFGR, 1, 0), 509*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1MAC, RCC_ETH1CFGR, 1, 0), 510*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1STP, RCC_ETH1CFGR, 4, 0), 511*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1, RCC_ETH1CFGR, 5, 0), 512*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1TX, RCC_ETH1CFGR, 8, 0), 513*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1RX, RCC_ETH1CFGR, 10, 0), 514*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2MAC, RCC_ETH2CFGR, 1, 0), 515*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2STP, RCC_ETH2CFGR, 4, 0), 516*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2, RCC_ETH2CFGR, 5, 0), 517*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2TX, RCC_ETH2CFGR, 8, 0), 518*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2RX, RCC_ETH2CFGR, 10, 0), 519*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2, RCC_USB2CFGR, 1, 0), 520*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2PHY1, RCC_USB2PHY1CFGR, 1, 0), 521*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2PHY2, RCC_USB2PHY2CFGR, 1, 0), 522*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USB3DR, RCC_USB3DRCFGR, 1, 0), 523*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 1, 0), 524*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PCIE, RCC_PCIECFGR, 1, 0), 525*28c10f9eSGabriel Fernandez GATE_CFG(GATE_USBTC, RCC_USBTCCFGR, 1, 0), 526*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSWMAC, RCC_ETHSWCFGR, 1, 0), 527*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSW, RCC_ETHSWCFGR, 5, 0), 528*28c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSWREF, RCC_ETHSWCFGR, 21, 0), 529*28c10f9eSGabriel Fernandez GATE_CFG(GATE_STGEN, RCC_STGENCFGR, 1, 0), 530*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC1, RCC_SDMMC1CFGR, 1, 0), 531*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC2, RCC_SDMMC2CFGR, 1, 0), 532*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC3, RCC_SDMMC3CFGR, 1, 0), 533*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GPU, RCC_GPUCFGR, 1, 0), 534*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LTDC, RCC_LTDCCFGR, 1, 0), 535*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DSI, RCC_DSICFGR, 1, 0), 536*28c10f9eSGabriel Fernandez GATE_CFG(GATE_LVDS, RCC_LVDSCFGR, 1, 0), 537*28c10f9eSGabriel Fernandez GATE_CFG(GATE_CSI, RCC_CSICFGR, 1, 0), 538*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DCMIPP, RCC_DCMIPPCFGR, 1, 0), 539*28c10f9eSGabriel Fernandez GATE_CFG(GATE_CCI, RCC_CCICFGR, 1, 0), 540*28c10f9eSGabriel Fernandez GATE_CFG(GATE_VDEC, RCC_VDECCFGR, 1, 0), 541*28c10f9eSGabriel Fernandez GATE_CFG(GATE_VENC, RCC_VENCCFGR, 1, 0), 542*28c10f9eSGabriel Fernandez GATE_CFG(GATE_RNG, RCC_RNGCFGR, 1, 0), 543*28c10f9eSGabriel Fernandez GATE_CFG(GATE_PKA, RCC_PKACFGR, 1, 0), 544*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SAES, RCC_SAESCFGR, 1, 0), 545*28c10f9eSGabriel Fernandez GATE_CFG(GATE_HASH, RCC_HASHCFGR, 1, 0), 546*28c10f9eSGabriel Fernandez GATE_CFG(GATE_CRYP1, RCC_CRYP1CFGR, 1, 0), 547*28c10f9eSGabriel Fernandez GATE_CFG(GATE_CRYP2, RCC_CRYP2CFGR, 1, 0), 548*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG1, RCC_IWDG1CFGR, 1, 0), 549*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG2, RCC_IWDG2CFGR, 1, 0), 550*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG3, RCC_IWDG3CFGR, 1, 0), 551*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG4, RCC_IWDG4CFGR, 1, 0), 552*28c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG5, RCC_IWDG5CFGR, 1, 0), 553*28c10f9eSGabriel Fernandez GATE_CFG(GATE_WWDG1, RCC_WWDG1CFGR, 1, 0), 554*28c10f9eSGabriel Fernandez GATE_CFG(GATE_WWDG2, RCC_WWDG2CFGR, 1, 0), 555*28c10f9eSGabriel Fernandez GATE_CFG(GATE_VREF, RCC_VREFCFGR, 1, 0), 556*28c10f9eSGabriel Fernandez GATE_CFG(GATE_DTS, RCC_DTSCFGR, 1, 0), 557*28c10f9eSGabriel Fernandez GATE_CFG(GATE_CRC, RCC_CRCCFGR, 1, 0), 558*28c10f9eSGabriel Fernandez GATE_CFG(GATE_SERC, RCC_SERCCFGR, 1, 0), 559*28c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPIIOM, RCC_OSPIIOMCFGR, 1, 0), 560*28c10f9eSGabriel Fernandez GATE_CFG(GATE_GICV2M, RCC_GICV2MCFGR, 1, 0), 561*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C1, RCC_I3C1CFGR, 1, 0), 562*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C2, RCC_I3C2CFGR, 1, 0), 563*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C3, RCC_I3C3CFGR, 1, 0), 564*28c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C4, RCC_I3C4CFGR, 1, 0), 565*28c10f9eSGabriel Fernandez }; 566*28c10f9eSGabriel Fernandez 567*28c10f9eSGabriel Fernandez /* 568*28c10f9eSGabriel Fernandez * MUX CONFIG 569*28c10f9eSGabriel Fernandez */ 570*28c10f9eSGabriel Fernandez 571*28c10f9eSGabriel Fernandez #define _MUX_CFG(_id, _offset, _shift, _width, _rdy)\ 572*28c10f9eSGabriel Fernandez [(_id)] = {\ 573*28c10f9eSGabriel Fernandez .offset = (_offset),\ 574*28c10f9eSGabriel Fernandez .shift = (_shift),\ 575*28c10f9eSGabriel Fernandez .width = (_width),\ 576*28c10f9eSGabriel Fernandez .ready = (_rdy),\ 577*28c10f9eSGabriel Fernandez } 578*28c10f9eSGabriel Fernandez 579*28c10f9eSGabriel Fernandez static const struct mux_cfg parent_mp25[MUX_NB] = { 580*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL0, RCC_MUXSELCFGR, 0, 2, GATE_PLL4_CKREFST), 581*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL1, RCC_MUXSELCFGR, 4, 2, GATE_PLL5_CKREFST), 582*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL2, RCC_MUXSELCFGR, 8, 2, GATE_PLL6_CKREFST), 583*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL3, RCC_MUXSELCFGR, 12, 2, GATE_PLL7_CKREFST), 584*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL4, RCC_MUXSELCFGR, 16, 2, GATE_PLL8_CKREFST), 585*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL5, RCC_MUXSELCFGR, 20, 2, MUX_NO_RDY), 586*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL6, RCC_MUXSELCFGR, 24, 2, MUX_NO_RDY), 587*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL7, RCC_MUXSELCFGR, 28, 2, MUX_NO_RDY), 588*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_XBARSEL, RCC_XBAR0CFGR, 0, 4, MUX_NO_RDY), 589*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_RTC, RCC_BDCR, 16, 2, MUX_NO_RDY), 590*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_D3PER, RCC_D3DCR, 16, 2, MUX_NO_RDY), 591*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MCO1, RCC_MCO1CFGR, 0, 1, MUX_NO_RDY), 592*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_MCO2, RCC_MCO2CFGR, 0, 1, MUX_NO_RDY), 593*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_ADC12, RCC_ADC12CFGR, 12, 1, MUX_NO_RDY), 594*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_ADC3, RCC_ADC3CFGR, 12, 2, MUX_NO_RDY), 595*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB2PHY1, RCC_USB2PHY1CFGR, 15, 1, MUX_NO_RDY), 596*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB2PHY2, RCC_USB2PHY2CFGR, 15, 1, MUX_NO_RDY), 597*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 15, 1, MUX_NO_RDY), 598*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_DSIBLANE, RCC_DSICFGR, 12, 1, MUX_NO_RDY), 599*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_DSIPHY, RCC_DSICFGR, 15, 1, MUX_NO_RDY), 600*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_LVDSPHY, RCC_LVDSCFGR, 15, 1, MUX_NO_RDY), 601*28c10f9eSGabriel Fernandez _MUX_CFG(MUX_DTS, RCC_DTSCFGR, 12, 2, MUX_NO_RDY), 602*28c10f9eSGabriel Fernandez }; 603*28c10f9eSGabriel Fernandez 604*28c10f9eSGabriel Fernandez /* 605*28c10f9eSGabriel Fernandez * DIV CONFIG 606*28c10f9eSGabriel Fernandez */ 607*28c10f9eSGabriel Fernandez 608*28c10f9eSGabriel Fernandez static const struct div_table_cfg apb_div_table[] = { 609*28c10f9eSGabriel Fernandez { .val = 0, .div = 1 }, 610*28c10f9eSGabriel Fernandez { .val = 1, .div = 2 }, 611*28c10f9eSGabriel Fernandez { .val = 2, .div = 4 }, 612*28c10f9eSGabriel Fernandez { .val = 3, .div = 8 }, 613*28c10f9eSGabriel Fernandez { .val = 4, .div = 16 }, 614*28c10f9eSGabriel Fernandez { .val = 5, .div = 16 }, 615*28c10f9eSGabriel Fernandez { .val = 6, .div = 16 }, 616*28c10f9eSGabriel Fernandez { .val = 7, .div = 16 }, 617*28c10f9eSGabriel Fernandez /* .div = 0 termination cell */ 618*28c10f9eSGabriel Fernandez { } 619*28c10f9eSGabriel Fernandez }; 620*28c10f9eSGabriel Fernandez 621*28c10f9eSGabriel Fernandez #define _DIV_CFG(_id, _offset, _shift, _width, _flags, _table, _ready)\ 622*28c10f9eSGabriel Fernandez [(_id)] = {\ 623*28c10f9eSGabriel Fernandez .offset = (_offset),\ 624*28c10f9eSGabriel Fernandez .shift = (_shift),\ 625*28c10f9eSGabriel Fernandez .width = (_width),\ 626*28c10f9eSGabriel Fernandez .flags = (_flags),\ 627*28c10f9eSGabriel Fernandez .table = (_table),\ 628*28c10f9eSGabriel Fernandez .ready = (_ready),\ 629*28c10f9eSGabriel Fernandez } 630*28c10f9eSGabriel Fernandez 631*28c10f9eSGabriel Fernandez static const struct div_cfg dividers_mp25[DIV_NB] = { 632*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_RTC, RCC_RTCDIVR, 0, 6, 0, NULL, DIV_NO_RDY), 633*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB1, RCC_APB1DIVR, 0, 3, 0, apb_div_table, 634*28c10f9eSGabriel Fernandez GATE_APB1DIV_RDY), 635*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB2, RCC_APB2DIVR, 0, 3, 0, apb_div_table, 636*28c10f9eSGabriel Fernandez GATE_APB2DIV_RDY), 637*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB3, RCC_APB3DIVR, 0, 3, 0, apb_div_table, 638*28c10f9eSGabriel Fernandez GATE_APB3DIV_RDY), 639*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB4, RCC_APB4DIVR, 0, 3, 0, apb_div_table, 640*28c10f9eSGabriel Fernandez GATE_APB4DIV_RDY), 641*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_APBDBG, RCC_APBDBGDIVR, 0, 3, 0, apb_div_table, 642*28c10f9eSGabriel Fernandez GATE_APBDBGDIV_RDY), 643*28c10f9eSGabriel Fernandez _DIV_CFG(DIV_LSMCU, RCC_LSMCUDIVR, 0, 1, 0, NULL, GATE_LSMCUDIV_RDY), 644*28c10f9eSGabriel Fernandez }; 645*28c10f9eSGabriel Fernandez 646*28c10f9eSGabriel Fernandez enum stm32_osc { 647*28c10f9eSGabriel Fernandez OSC_HSI, 648*28c10f9eSGabriel Fernandez OSC_HSE, 649*28c10f9eSGabriel Fernandez OSC_MSI, 650*28c10f9eSGabriel Fernandez OSC_LSI, 651*28c10f9eSGabriel Fernandez OSC_LSE, 652*28c10f9eSGabriel Fernandez NB_OSCILLATOR 653*28c10f9eSGabriel Fernandez }; 654*28c10f9eSGabriel Fernandez 655*28c10f9eSGabriel Fernandez struct clk_stm32_bypass { 656*28c10f9eSGabriel Fernandez uint16_t offset; 657*28c10f9eSGabriel Fernandez uint8_t bit_byp; 658*28c10f9eSGabriel Fernandez uint8_t bit_digbyp; 659*28c10f9eSGabriel Fernandez }; 660*28c10f9eSGabriel Fernandez 661*28c10f9eSGabriel Fernandez struct clk_stm32_css { 662*28c10f9eSGabriel Fernandez uint16_t offset; 663*28c10f9eSGabriel Fernandez uint8_t bit_css; 664*28c10f9eSGabriel Fernandez }; 665*28c10f9eSGabriel Fernandez 666*28c10f9eSGabriel Fernandez struct clk_stm32_drive { 667*28c10f9eSGabriel Fernandez uint16_t offset; 668*28c10f9eSGabriel Fernandez uint8_t drv_shift; 669*28c10f9eSGabriel Fernandez uint8_t drv_width; 670*28c10f9eSGabriel Fernandez uint8_t drv_default; 671*28c10f9eSGabriel Fernandez }; 672*28c10f9eSGabriel Fernandez 673*28c10f9eSGabriel Fernandez struct clk_oscillator_data { 674*28c10f9eSGabriel Fernandez const char *name; 675*28c10f9eSGabriel Fernandez unsigned long frequency; 676*28c10f9eSGabriel Fernandez uint16_t gate_id; 677*28c10f9eSGabriel Fernandez struct clk_stm32_bypass *bypass; 678*28c10f9eSGabriel Fernandez struct clk_stm32_css *css; 679*28c10f9eSGabriel Fernandez struct clk_stm32_drive *drive; 680*28c10f9eSGabriel Fernandez }; 681*28c10f9eSGabriel Fernandez 682*28c10f9eSGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) \ 683*28c10f9eSGabriel Fernandez (&(struct clk_stm32_bypass){\ 684*28c10f9eSGabriel Fernandez .offset = (_offset),\ 685*28c10f9eSGabriel Fernandez .bit_byp = (_bit_byp),\ 686*28c10f9eSGabriel Fernandez .bit_digbyp = (_bit_digbyp),\ 687*28c10f9eSGabriel Fernandez }) 688*28c10f9eSGabriel Fernandez 689*28c10f9eSGabriel Fernandez #define CSS(_offset, _bit_css) \ 690*28c10f9eSGabriel Fernandez (&(struct clk_stm32_css){\ 691*28c10f9eSGabriel Fernandez .offset = (_offset),\ 692*28c10f9eSGabriel Fernandez .bit_css = (_bit_css),\ 693*28c10f9eSGabriel Fernandez }) 694*28c10f9eSGabriel Fernandez 695*28c10f9eSGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) \ 696*28c10f9eSGabriel Fernandez (&(struct clk_stm32_drive){\ 697*28c10f9eSGabriel Fernandez .offset = (_offset),\ 698*28c10f9eSGabriel Fernandez .drv_shift = (_shift),\ 699*28c10f9eSGabriel Fernandez .drv_width = (_width),\ 700*28c10f9eSGabriel Fernandez .drv_default = (_default),\ 701*28c10f9eSGabriel Fernandez }) 702*28c10f9eSGabriel Fernandez 703*28c10f9eSGabriel Fernandez #define OSCILLATOR(idx_osc, _name, _gate_id, _bypass, _css, _drive) \ 704*28c10f9eSGabriel Fernandez [(idx_osc)] = (struct clk_oscillator_data){\ 705*28c10f9eSGabriel Fernandez .name = (_name),\ 706*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 707*28c10f9eSGabriel Fernandez .bypass = (_bypass),\ 708*28c10f9eSGabriel Fernandez .css = (_css),\ 709*28c10f9eSGabriel Fernandez .drive = (_drive),\ 710*28c10f9eSGabriel Fernandez } 711*28c10f9eSGabriel Fernandez 712*28c10f9eSGabriel Fernandez static struct clk_oscillator_data stm32mp25_osc_data[NB_OSCILLATOR] = { 713*28c10f9eSGabriel Fernandez OSCILLATOR(OSC_HSI, "clk-hsi", GATE_HSI, 714*28c10f9eSGabriel Fernandez NULL, NULL, NULL), 715*28c10f9eSGabriel Fernandez 716*28c10f9eSGabriel Fernandez OSCILLATOR(OSC_LSI, "clk-lsi", GATE_LSI, 717*28c10f9eSGabriel Fernandez NULL, NULL, NULL), 718*28c10f9eSGabriel Fernandez 719*28c10f9eSGabriel Fernandez OSCILLATOR(OSC_MSI, "clk-msi", GATE_MSI, 720*28c10f9eSGabriel Fernandez NULL, NULL, NULL), 721*28c10f9eSGabriel Fernandez 722*28c10f9eSGabriel Fernandez OSCILLATOR(OSC_LSE, "clk-lse", GATE_LSE, 723*28c10f9eSGabriel Fernandez BYPASS(RCC_BDCR, RCC_BDCR_LSEBYP_BIT, 724*28c10f9eSGabriel Fernandez RCC_BDCR_LSEDIGBYP_BIT), 725*28c10f9eSGabriel Fernandez CSS(RCC_BDCR, RCC_BDCR_LSECSSON_BIT), 726*28c10f9eSGabriel Fernandez DRIVE(RCC_BDCR, RCC_BDCR_LSEDRV_SHIFT, 727*28c10f9eSGabriel Fernandez RCC_BDCR_LSEDRV_WIDTH, LSEDRV_MEDIUM_HIGH)), 728*28c10f9eSGabriel Fernandez 729*28c10f9eSGabriel Fernandez OSCILLATOR(OSC_HSE, "clk-hse", GATE_HSE, 730*28c10f9eSGabriel Fernandez BYPASS(RCC_OCENSETR, RCC_OCENSETR_HSEBYP_BIT, 731*28c10f9eSGabriel Fernandez RCC_OCENSETR_HSEDIGBYP_BIT), 732*28c10f9eSGabriel Fernandez CSS(RCC_OCENSETR, RCC_OCENSETR_HSECSSON_BIT), 733*28c10f9eSGabriel Fernandez NULL), 734*28c10f9eSGabriel Fernandez }; 735*28c10f9eSGabriel Fernandez 736*28c10f9eSGabriel Fernandez static struct clk_oscillator_data *clk_oscillator_get_data(unsigned int osc_id) 737*28c10f9eSGabriel Fernandez { 738*28c10f9eSGabriel Fernandez assert(osc_id < ARRAY_SIZE(stm32mp25_osc_data)); 739*28c10f9eSGabriel Fernandez 740*28c10f9eSGabriel Fernandez return &stm32mp25_osc_data[osc_id]; 741*28c10f9eSGabriel Fernandez } 742*28c10f9eSGabriel Fernandez 743*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_get_rate_oscillator(unsigned int osc_id) 744*28c10f9eSGabriel Fernandez { 745*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 746*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 747*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[osc_id]; 748*28c10f9eSGabriel Fernandez 749*28c10f9eSGabriel Fernandez return osci->freq; 750*28c10f9eSGabriel Fernandez } 751*28c10f9eSGabriel Fernandez 752*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_oscillator_rate(unsigned int sel) 753*28c10f9eSGabriel Fernandez { 754*28c10f9eSGabriel Fernandez unsigned int osc[] = { OSC_HSI, OSC_HSE, OSC_MSI }; 755*28c10f9eSGabriel Fernandez 756*28c10f9eSGabriel Fernandez assert(sel < ARRAY_SIZE(osc)); 757*28c10f9eSGabriel Fernandez 758*28c10f9eSGabriel Fernandez return clk_stm32_get_rate_oscillator(osc[sel]); 759*28c10f9eSGabriel Fernandez } 760*28c10f9eSGabriel Fernandez 761*28c10f9eSGabriel Fernandez static void clk_oscillator_set_bypass(struct clk_stm32_priv *priv, 762*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data, 763*28c10f9eSGabriel Fernandez bool digbyp, bool bypass) 764*28c10f9eSGabriel Fernandez { 765*28c10f9eSGabriel Fernandez struct clk_stm32_bypass *bypass_data = osc_data->bypass; 766*28c10f9eSGabriel Fernandez uintptr_t address = 0; 767*28c10f9eSGabriel Fernandez 768*28c10f9eSGabriel Fernandez if (!bypass_data) 769*28c10f9eSGabriel Fernandez return; 770*28c10f9eSGabriel Fernandez 771*28c10f9eSGabriel Fernandez address = priv->base + bypass_data->offset; 772*28c10f9eSGabriel Fernandez 773*28c10f9eSGabriel Fernandez if (digbyp) 774*28c10f9eSGabriel Fernandez io_setbits32(address, BIT(bypass_data->bit_digbyp)); 775*28c10f9eSGabriel Fernandez 776*28c10f9eSGabriel Fernandez if (bypass || digbyp) 777*28c10f9eSGabriel Fernandez io_setbits32(address, BIT(bypass_data->bit_byp)); 778*28c10f9eSGabriel Fernandez } 779*28c10f9eSGabriel Fernandez 780*28c10f9eSGabriel Fernandez static void clk_oscillator_set_css(struct clk_stm32_priv *priv, 781*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data, 782*28c10f9eSGabriel Fernandez bool css) 783*28c10f9eSGabriel Fernandez { 784*28c10f9eSGabriel Fernandez struct clk_stm32_css *css_data = osc_data->css; 785*28c10f9eSGabriel Fernandez 786*28c10f9eSGabriel Fernandez if (css_data && css) 787*28c10f9eSGabriel Fernandez io_setbits32(priv->base + css_data->offset, 788*28c10f9eSGabriel Fernandez BIT(css_data->bit_css)); 789*28c10f9eSGabriel Fernandez } 790*28c10f9eSGabriel Fernandez 791*28c10f9eSGabriel Fernandez static void clk_oscillator_set_drive(struct clk_stm32_priv *priv, 792*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data, 793*28c10f9eSGabriel Fernandez uint8_t lsedrv) 794*28c10f9eSGabriel Fernandez { 795*28c10f9eSGabriel Fernandez struct clk_stm32_drive *drive_data = osc_data->drive; 796*28c10f9eSGabriel Fernandez uintptr_t address = 0; 797*28c10f9eSGabriel Fernandez uint32_t mask = 0; 798*28c10f9eSGabriel Fernandez uint32_t value = 0; 799*28c10f9eSGabriel Fernandez 800*28c10f9eSGabriel Fernandez if (!drive_data) 801*28c10f9eSGabriel Fernandez return; 802*28c10f9eSGabriel Fernandez 803*28c10f9eSGabriel Fernandez address = priv->base + drive_data->offset; 804*28c10f9eSGabriel Fernandez 805*28c10f9eSGabriel Fernandez mask = SHIFT_U32(BIT(drive_data->drv_width) - 1, drive_data->drv_shift); 806*28c10f9eSGabriel Fernandez 807*28c10f9eSGabriel Fernandez /* 808*28c10f9eSGabriel Fernandez * Warning: not recommended to switch directly from "high drive" 809*28c10f9eSGabriel Fernandez * to "medium low drive", and vice-versa. 810*28c10f9eSGabriel Fernandez */ 811*28c10f9eSGabriel Fernandez value = (io_read32(address) & mask) >> drive_data->drv_shift; 812*28c10f9eSGabriel Fernandez 813*28c10f9eSGabriel Fernandez while (value != lsedrv) { 814*28c10f9eSGabriel Fernandez if (value > lsedrv) 815*28c10f9eSGabriel Fernandez value--; 816*28c10f9eSGabriel Fernandez else 817*28c10f9eSGabriel Fernandez value++; 818*28c10f9eSGabriel Fernandez 819*28c10f9eSGabriel Fernandez io_clrsetbits32(address, mask, 820*28c10f9eSGabriel Fernandez SHIFT_U32(value, drive_data->drv_shift)); 821*28c10f9eSGabriel Fernandez } 822*28c10f9eSGabriel Fernandez } 823*28c10f9eSGabriel Fernandez 824*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_hse(struct clk_stm32_priv *priv, 825*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 826*28c10f9eSGabriel Fernandez { 827*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_HSE); 828*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_HSE]; 829*28c10f9eSGabriel Fernandez 830*28c10f9eSGabriel Fernandez if (!osci->freq) 831*28c10f9eSGabriel Fernandez return; 832*28c10f9eSGabriel Fernandez 833*28c10f9eSGabriel Fernandez clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass); 834*28c10f9eSGabriel Fernandez 835*28c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */ 836*28c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id)) 837*28c10f9eSGabriel Fernandez panic("timeout to enable hse clock"); 838*28c10f9eSGabriel Fernandez 839*28c10f9eSGabriel Fernandez clk_oscillator_set_css(priv, osc_data, osci->css); 840*28c10f9eSGabriel Fernandez } 841*28c10f9eSGabriel Fernandez 842*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lse(struct clk_stm32_priv *priv, 843*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 844*28c10f9eSGabriel Fernandez { 845*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE); 846*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 847*28c10f9eSGabriel Fernandez 848*28c10f9eSGabriel Fernandez if (!osci->freq) 849*28c10f9eSGabriel Fernandez return; 850*28c10f9eSGabriel Fernandez 851*28c10f9eSGabriel Fernandez if (stm32_gate_is_enabled(osc_data->gate_id)) 852*28c10f9eSGabriel Fernandez return; 853*28c10f9eSGabriel Fernandez 854*28c10f9eSGabriel Fernandez clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass); 855*28c10f9eSGabriel Fernandez 856*28c10f9eSGabriel Fernandez clk_oscillator_set_drive(priv, osc_data, osci->drive); 857*28c10f9eSGabriel Fernandez 858*28c10f9eSGabriel Fernandez /* Enable LSE clock, but don't wait ready bit */ 859*28c10f9eSGabriel Fernandez stm32_gate_enable(osc_data->gate_id); 860*28c10f9eSGabriel Fernandez } 861*28c10f9eSGabriel Fernandez 862*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lsi(struct clk_stm32_priv *priv __unused, 863*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 864*28c10f9eSGabriel Fernandez { 865*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSI); 866*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSI]; 867*28c10f9eSGabriel Fernandez 868*28c10f9eSGabriel Fernandez if (!osci->freq) 869*28c10f9eSGabriel Fernandez return; 870*28c10f9eSGabriel Fernandez 871*28c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */ 872*28c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id)) 873*28c10f9eSGabriel Fernandez panic("timeout to enable lsi clock"); 874*28c10f9eSGabriel Fernandez } 875*28c10f9eSGabriel Fernandez 876*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_msi_set_rate(struct clk_stm32_priv *priv, 877*28c10f9eSGabriel Fernandez unsigned long rate) 878*28c10f9eSGabriel Fernandez { 879*28c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR; 880*28c10f9eSGabriel Fernandez uint32_t mask = RCC_BDCR_MSIFREQSEL; 881*28c10f9eSGabriel Fernandez 882*28c10f9eSGabriel Fernandez switch (rate) { 883*28c10f9eSGabriel Fernandez case RCC_4_MHZ: 884*28c10f9eSGabriel Fernandez io_clrbits32_stm32shregs(address, mask); 885*28c10f9eSGabriel Fernandez break; 886*28c10f9eSGabriel Fernandez case RCC_16_MHZ: 887*28c10f9eSGabriel Fernandez io_setbits32_stm32shregs(address, mask); 888*28c10f9eSGabriel Fernandez break; 889*28c10f9eSGabriel Fernandez default: 890*28c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 891*28c10f9eSGabriel Fernandez } 892*28c10f9eSGabriel Fernandez 893*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 894*28c10f9eSGabriel Fernandez } 895*28c10f9eSGabriel Fernandez 896*28c10f9eSGabriel Fernandez static void stm32_enable_oscillator_msi(struct clk_stm32_priv *priv, 897*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 898*28c10f9eSGabriel Fernandez { 899*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_MSI); 900*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_MSI]; 901*28c10f9eSGabriel Fernandez 902*28c10f9eSGabriel Fernandez if (!osci->freq) 903*28c10f9eSGabriel Fernandez return; 904*28c10f9eSGabriel Fernandez 905*28c10f9eSGabriel Fernandez if (clk_stm32_osc_msi_set_rate(priv, osci->freq) != TEE_SUCCESS) 906*28c10f9eSGabriel Fernandez EMSG("invalid rate %ld Hz for MSI ! (4000000 or 16000000 only)", 907*28c10f9eSGabriel Fernandez osci->freq); 908*28c10f9eSGabriel Fernandez 909*28c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */ 910*28c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id)) 911*28c10f9eSGabriel Fernandez panic("timeout to enable msi clock"); 912*28c10f9eSGabriel Fernandez } 913*28c10f9eSGabriel Fernandez 914*28c10f9eSGabriel Fernandez static void stm32_clk_oscillators_lse_set_css(struct clk_stm32_priv *priv, 915*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 916*28c10f9eSGabriel Fernandez 917*28c10f9eSGabriel Fernandez { 918*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE); 919*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 920*28c10f9eSGabriel Fernandez 921*28c10f9eSGabriel Fernandez clk_oscillator_set_css(priv, osc_data, osci->css); 922*28c10f9eSGabriel Fernandez } 923*28c10f9eSGabriel Fernandez 924*28c10f9eSGabriel Fernandez static int 925*28c10f9eSGabriel Fernandez stm32_clk_oscillators_wait_lse_ready(struct clk_stm32_priv *priv __unused, 926*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 927*28c10f9eSGabriel Fernandez { 928*28c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE); 929*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 930*28c10f9eSGabriel Fernandez int ret = 0; 931*28c10f9eSGabriel Fernandez 932*28c10f9eSGabriel Fernandez if (osci->freq) 933*28c10f9eSGabriel Fernandez ret = stm32_gate_wait_ready(osc_data->gate_id, true); 934*28c10f9eSGabriel Fernandez 935*28c10f9eSGabriel Fernandez return ret; 936*28c10f9eSGabriel Fernandez } 937*28c10f9eSGabriel Fernandez 938*28c10f9eSGabriel Fernandez static void stm32_clk_oscillators_enable(struct clk_stm32_priv *priv, 939*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 940*28c10f9eSGabriel Fernandez { 941*28c10f9eSGabriel Fernandez stm32_enable_oscillator_hse(priv, pdata); 942*28c10f9eSGabriel Fernandez stm32_enable_oscillator_lse(priv, pdata); 943*28c10f9eSGabriel Fernandez stm32_enable_oscillator_lsi(priv, pdata); 944*28c10f9eSGabriel Fernandez stm32_enable_oscillator_msi(priv, pdata); 945*28c10f9eSGabriel Fernandez } 946*28c10f9eSGabriel Fernandez 947*28c10f9eSGabriel Fernandez enum stm32_pll_id { 948*28c10f9eSGabriel Fernandez PLL1_ID, 949*28c10f9eSGabriel Fernandez PLL2_ID, 950*28c10f9eSGabriel Fernandez PLL3_ID, 951*28c10f9eSGabriel Fernandez PLL4_ID, 952*28c10f9eSGabriel Fernandez PLL5_ID, 953*28c10f9eSGabriel Fernandez PLL6_ID, 954*28c10f9eSGabriel Fernandez PLL7_ID, 955*28c10f9eSGabriel Fernandez PLL8_ID, 956*28c10f9eSGabriel Fernandez PLL_NB 957*28c10f9eSGabriel Fernandez }; 958*28c10f9eSGabriel Fernandez 959*28c10f9eSGabriel Fernandez /* PLL configuration registers offsets from RCC_PLLxCFGR1 */ 960*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR1 0x00 961*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR2 0x04 962*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR3 0x08 963*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR4 0x0C 964*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR5 0x10 965*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR6 0x18 966*28c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR7 0x1C 967*28c10f9eSGabriel Fernandez 968*28c10f9eSGabriel Fernandez struct stm32_clk_pll { 969*28c10f9eSGabriel Fernandez uint16_t gate_id; 970*28c10f9eSGabriel Fernandez uint16_t mux_id; 971*28c10f9eSGabriel Fernandez uint16_t reg_pllxcfgr1; 972*28c10f9eSGabriel Fernandez }; 973*28c10f9eSGabriel Fernandez 974*28c10f9eSGabriel Fernandez #define CLK_PLL_CFG(_idx, _gate_id, _mux_id, _reg)\ 975*28c10f9eSGabriel Fernandez [(_idx)] = {\ 976*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 977*28c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 978*28c10f9eSGabriel Fernandez .reg_pllxcfgr1 = (_reg),\ 979*28c10f9eSGabriel Fernandez } 980*28c10f9eSGabriel Fernandez 981*28c10f9eSGabriel Fernandez static const struct stm32_clk_pll stm32mp25_clk_pll[PLL_NB] = { 982*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL1_ID, GATE_PLL1, MUX_MUXSEL5, 0), 983*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL2_ID, GATE_PLL2, MUX_MUXSEL6, RCC_PLL2CFGR1), 984*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL3_ID, GATE_PLL3, MUX_MUXSEL7, RCC_PLL3CFGR1), 985*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL4_ID, GATE_PLL4, MUX_MUXSEL0, RCC_PLL4CFGR1), 986*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL5_ID, GATE_PLL5, MUX_MUXSEL1, RCC_PLL5CFGR1), 987*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL6_ID, GATE_PLL6, MUX_MUXSEL2, RCC_PLL6CFGR1), 988*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL7_ID, GATE_PLL7, MUX_MUXSEL3, RCC_PLL7CFGR1), 989*28c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL8_ID, GATE_PLL8, MUX_MUXSEL4, RCC_PLL8CFGR1), 990*28c10f9eSGabriel Fernandez }; 991*28c10f9eSGabriel Fernandez 992*28c10f9eSGabriel Fernandez static const struct stm32_clk_pll *clk_stm32_pll_data(unsigned int idx) 993*28c10f9eSGabriel Fernandez { 994*28c10f9eSGabriel Fernandez assert(idx < ARRAY_SIZE(stm32mp25_clk_pll)); 995*28c10f9eSGabriel Fernandez 996*28c10f9eSGabriel Fernandez return &stm32mp25_clk_pll[idx]; 997*28c10f9eSGabriel Fernandez } 998*28c10f9eSGabriel Fernandez 999*28c10f9eSGabriel Fernandez static int stm32_clk_parse_oscillator_fdt(const void *fdt, int node, 1000*28c10f9eSGabriel Fernandez const char *name, 1001*28c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci) 1002*28c10f9eSGabriel Fernandez { 1003*28c10f9eSGabriel Fernandez int subnode = 0; 1004*28c10f9eSGabriel Fernandez 1005*28c10f9eSGabriel Fernandez /* default value when oscillator is not found */ 1006*28c10f9eSGabriel Fernandez osci->freq = 0; 1007*28c10f9eSGabriel Fernandez 1008*28c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) { 1009*28c10f9eSGabriel Fernandez const char *cchar = NULL; 1010*28c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL; 1011*28c10f9eSGabriel Fernandez int ret = 0; 1012*28c10f9eSGabriel Fernandez 1013*28c10f9eSGabriel Fernandez cchar = fdt_get_name(fdt, subnode, &ret); 1014*28c10f9eSGabriel Fernandez if (!cchar) 1015*28c10f9eSGabriel Fernandez return ret; 1016*28c10f9eSGabriel Fernandez 1017*28c10f9eSGabriel Fernandez if (strncmp(cchar, name, (size_t)ret) || 1018*28c10f9eSGabriel Fernandez fdt_get_status(fdt, subnode) == DT_STATUS_DISABLED) 1019*28c10f9eSGabriel Fernandez continue; 1020*28c10f9eSGabriel Fernandez 1021*28c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret); 1022*28c10f9eSGabriel Fernandez if (!cuint) 1023*28c10f9eSGabriel Fernandez return ret; 1024*28c10f9eSGabriel Fernandez 1025*28c10f9eSGabriel Fernandez osci->freq = fdt32_to_cpu(*cuint); 1026*28c10f9eSGabriel Fernandez 1027*28c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,bypass", NULL)) 1028*28c10f9eSGabriel Fernandez osci->bypass = true; 1029*28c10f9eSGabriel Fernandez 1030*28c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,digbypass", NULL)) 1031*28c10f9eSGabriel Fernandez osci->digbyp = true; 1032*28c10f9eSGabriel Fernandez 1033*28c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,css", NULL)) 1034*28c10f9eSGabriel Fernandez osci->css = true; 1035*28c10f9eSGabriel Fernandez 1036*28c10f9eSGabriel Fernandez osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive", 1037*28c10f9eSGabriel Fernandez LSEDRV_MEDIUM_HIGH); 1038*28c10f9eSGabriel Fernandez 1039*28c10f9eSGabriel Fernandez return 0; 1040*28c10f9eSGabriel Fernandez } 1041*28c10f9eSGabriel Fernandez 1042*28c10f9eSGabriel Fernandez return 0; 1043*28c10f9eSGabriel Fernandez } 1044*28c10f9eSGabriel Fernandez 1045*28c10f9eSGabriel Fernandez static const char *stm32_clk_get_oscillator_name(enum stm32_osc id) 1046*28c10f9eSGabriel Fernandez { 1047*28c10f9eSGabriel Fernandez if (id < NB_OSCILLATOR) 1048*28c10f9eSGabriel Fernandez return stm32mp25_osc_data[id].name; 1049*28c10f9eSGabriel Fernandez 1050*28c10f9eSGabriel Fernandez return NULL; 1051*28c10f9eSGabriel Fernandez } 1052*28c10f9eSGabriel Fernandez 1053*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_oscillator(const void *fdt, 1054*28c10f9eSGabriel Fernandez int node __unused, 1055*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 1056*28c10f9eSGabriel Fernandez { 1057*28c10f9eSGabriel Fernandez int fdt_err = 0; 1058*28c10f9eSGabriel Fernandez size_t i = 0; 1059*28c10f9eSGabriel Fernandez int osc_node = 0; 1060*28c10f9eSGabriel Fernandez 1061*28c10f9eSGabriel Fernandez osc_node = fdt_path_offset(fdt, "/clocks"); 1062*28c10f9eSGabriel Fernandez if (osc_node < 0) 1063*28c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND; 1064*28c10f9eSGabriel Fernandez 1065*28c10f9eSGabriel Fernandez for (i = 0; i < pdata->nosci; i++) { 1066*28c10f9eSGabriel Fernandez const char *name = NULL; 1067*28c10f9eSGabriel Fernandez 1068*28c10f9eSGabriel Fernandez name = stm32_clk_get_oscillator_name((enum stm32_osc)i); 1069*28c10f9eSGabriel Fernandez if (!name) 1070*28c10f9eSGabriel Fernandez continue; 1071*28c10f9eSGabriel Fernandez 1072*28c10f9eSGabriel Fernandez fdt_err = stm32_clk_parse_oscillator_fdt(fdt, osc_node, name, 1073*28c10f9eSGabriel Fernandez &pdata->osci[i]); 1074*28c10f9eSGabriel Fernandez if (fdt_err < 0) 1075*28c10f9eSGabriel Fernandez panic(); 1076*28c10f9eSGabriel Fernandez } 1077*28c10f9eSGabriel Fernandez 1078*28c10f9eSGabriel Fernandez return 0; 1079*28c10f9eSGabriel Fernandez } 1080*28c10f9eSGabriel Fernandez 1081*28c10f9eSGabriel Fernandez static int clk_stm32_parse_pll_fdt(const void *fdt, int subnode, 1082*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll) 1083*28c10f9eSGabriel Fernandez { 1084*28c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL; 1085*28c10f9eSGabriel Fernandez int subnode_pll = 0; 1086*28c10f9eSGabriel Fernandez int err = 0; 1087*28c10f9eSGabriel Fernandez 1088*28c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "st,pll", NULL); 1089*28c10f9eSGabriel Fernandez if (!cuint) 1090*28c10f9eSGabriel Fernandez return 0; 1091*28c10f9eSGabriel Fernandez 1092*28c10f9eSGabriel Fernandez subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint)); 1093*28c10f9eSGabriel Fernandez if (subnode_pll < 0) 1094*28c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND; 1095*28c10f9eSGabriel Fernandez 1096*28c10f9eSGabriel Fernandez if (fdt_read_uint32_array(fdt, subnode_pll, "cfg", pll->cfg, 1097*28c10f9eSGabriel Fernandez PLLCFG_NB) != 0) 1098*28c10f9eSGabriel Fernandez panic("cfg property is mandatory"); 1099*28c10f9eSGabriel Fernandez 1100*28c10f9eSGabriel Fernandez err = fdt_read_uint32_array(fdt, subnode_pll, "csg", pll->csg, 1101*28c10f9eSGabriel Fernandez PLLCSG_NB); 1102*28c10f9eSGabriel Fernandez 1103*28c10f9eSGabriel Fernandez pll->csg_enabled = (err == 0); 1104*28c10f9eSGabriel Fernandez 1105*28c10f9eSGabriel Fernandez if (err == -FDT_ERR_NOTFOUND) 1106*28c10f9eSGabriel Fernandez err = 0; 1107*28c10f9eSGabriel Fernandez 1108*28c10f9eSGabriel Fernandez if (err != 0) 1109*28c10f9eSGabriel Fernandez return err; 1110*28c10f9eSGabriel Fernandez 1111*28c10f9eSGabriel Fernandez pll->enabled = true; 1112*28c10f9eSGabriel Fernandez 1113*28c10f9eSGabriel Fernandez pll->frac = fdt_read_uint32_default(fdt, subnode_pll, "frac", 0); 1114*28c10f9eSGabriel Fernandez 1115*28c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode_pll, "src", &pll->src)) 1116*28c10f9eSGabriel Fernandez panic("src property is mandatory"); 1117*28c10f9eSGabriel Fernandez 1118*28c10f9eSGabriel Fernandez return 0; 1119*28c10f9eSGabriel Fernandez } 1120*28c10f9eSGabriel Fernandez 1121*28c10f9eSGabriel Fernandez #define RCC_PLL_NAME_SIZE 20 1122*28c10f9eSGabriel Fernandez 1123*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_pll(const void *fdt, int node, 1124*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 1125*28c10f9eSGabriel Fernandez { 1126*28c10f9eSGabriel Fernandez unsigned int i = 0; 1127*28c10f9eSGabriel Fernandez 1128*28c10f9eSGabriel Fernandez for (i = 0; i < pdata->npll; i++) { 1129*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll = pdata->pll + i; 1130*28c10f9eSGabriel Fernandez char name[RCC_PLL_NAME_SIZE] = { }; 1131*28c10f9eSGabriel Fernandez int subnode = 0; 1132*28c10f9eSGabriel Fernandez 1133*28c10f9eSGabriel Fernandez snprintf(name, sizeof(name), "st,pll-%u", i + 1); 1134*28c10f9eSGabriel Fernandez 1135*28c10f9eSGabriel Fernandez subnode = fdt_subnode_offset(fdt, node, name); 1136*28c10f9eSGabriel Fernandez if (subnode < 0) 1137*28c10f9eSGabriel Fernandez continue; 1138*28c10f9eSGabriel Fernandez 1139*28c10f9eSGabriel Fernandez if (clk_stm32_parse_pll_fdt(fdt, subnode, pll)) 1140*28c10f9eSGabriel Fernandez panic(); 1141*28c10f9eSGabriel Fernandez } 1142*28c10f9eSGabriel Fernandez 1143*28c10f9eSGabriel Fernandez return 0; 1144*28c10f9eSGabriel Fernandez } 1145*28c10f9eSGabriel Fernandez 1146*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_opp(const void *fdt, int node, 1147*28c10f9eSGabriel Fernandez const char *opp_name, 1148*28c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp_cfg) 1149*28c10f9eSGabriel Fernandez { 1150*28c10f9eSGabriel Fernandez int subnode = 0; 1151*28c10f9eSGabriel Fernandez int nb_opp = 0; 1152*28c10f9eSGabriel Fernandez int ret = 0; 1153*28c10f9eSGabriel Fernandez 1154*28c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, opp_name); 1155*28c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND) 1156*28c10f9eSGabriel Fernandez return 0; 1157*28c10f9eSGabriel Fernandez 1158*28c10f9eSGabriel Fernandez if (node < 0) 1159*28c10f9eSGabriel Fernandez return node; 1160*28c10f9eSGabriel Fernandez 1161*28c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) { 1162*28c10f9eSGabriel Fernandez assert(nb_opp <= MAX_OPP); 1163*28c10f9eSGabriel Fernandez 1164*28c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "hz", &opp_cfg->frq)) 1165*28c10f9eSGabriel Fernandez panic("hz property is mandatory"); 1166*28c10f9eSGabriel Fernandez 1167*28c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "st,clksrc", &opp_cfg->src)) 1168*28c10f9eSGabriel Fernandez panic("st,clksrc property is mandatory"); 1169*28c10f9eSGabriel Fernandez 1170*28c10f9eSGabriel Fernandez ret = clk_stm32_parse_pll_fdt(fdt, subnode, &opp_cfg->pll_cfg); 1171*28c10f9eSGabriel Fernandez if (ret < 0) 1172*28c10f9eSGabriel Fernandez return ret; 1173*28c10f9eSGabriel Fernandez 1174*28c10f9eSGabriel Fernandez opp_cfg++; 1175*28c10f9eSGabriel Fernandez nb_opp++; 1176*28c10f9eSGabriel Fernandez } 1177*28c10f9eSGabriel Fernandez 1178*28c10f9eSGabriel Fernandez return 0; 1179*28c10f9eSGabriel Fernandez } 1180*28c10f9eSGabriel Fernandez 1181*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_opp(const void *fdt, int node, 1182*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 1183*28c10f9eSGabriel Fernandez { 1184*28c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp = pdata->opp; 1185*28c10f9eSGabriel Fernandez 1186*28c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, "st,clk_opp"); 1187*28c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND) 1188*28c10f9eSGabriel Fernandez return 0; 1189*28c10f9eSGabriel Fernandez 1190*28c10f9eSGabriel Fernandez if (node < 0) 1191*28c10f9eSGabriel Fernandez return node; 1192*28c10f9eSGabriel Fernandez 1193*28c10f9eSGabriel Fernandez return stm32_clk_parse_fdt_opp(fdt, node, "st,ck_cpu1", opp->cpu1_opp); 1194*28c10f9eSGabriel Fernandez } 1195*28c10f9eSGabriel Fernandez 1196*28c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt(const void *fdt, int node, 1197*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 1198*28c10f9eSGabriel Fernandez { 1199*28c10f9eSGabriel Fernandez int err = 0; 1200*28c10f9eSGabriel Fernandez 1201*28c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_oscillator(fdt, node, pdata); 1202*28c10f9eSGabriel Fernandez if (err != 0) 1203*28c10f9eSGabriel Fernandez return err; 1204*28c10f9eSGabriel Fernandez 1205*28c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata); 1206*28c10f9eSGabriel Fernandez if (err != 0) 1207*28c10f9eSGabriel Fernandez return err; 1208*28c10f9eSGabriel Fernandez 1209*28c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_opp(fdt, node, pdata); 1210*28c10f9eSGabriel Fernandez if (err != 0) 1211*28c10f9eSGabriel Fernandez return err; 1212*28c10f9eSGabriel Fernandez 1213*28c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,busclk", 1214*28c10f9eSGabriel Fernandez pdata->busclk, 1215*28c10f9eSGabriel Fernandez &pdata->nbusclk); 1216*28c10f9eSGabriel Fernandez if (err != 0) 1217*28c10f9eSGabriel Fernandez return err; 1218*28c10f9eSGabriel Fernandez 1219*28c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,flexgen", 1220*28c10f9eSGabriel Fernandez pdata->flexgen, 1221*28c10f9eSGabriel Fernandez &pdata->nflexgen); 1222*28c10f9eSGabriel Fernandez if (err != 0) 1223*28c10f9eSGabriel Fernandez return err; 1224*28c10f9eSGabriel Fernandez 1225*28c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,kerclk", 1226*28c10f9eSGabriel Fernandez pdata->kernelclk, 1227*28c10f9eSGabriel Fernandez &pdata->nkernelclk); 1228*28c10f9eSGabriel Fernandez if (err != 0) 1229*28c10f9eSGabriel Fernandez return err; 1230*28c10f9eSGabriel Fernandez 1231*28c10f9eSGabriel Fernandez pdata->c1msrd = fdt_read_uint32_default(fdt, node, "st,c1msrd", 0); 1232*28c10f9eSGabriel Fernandez 1233*28c10f9eSGabriel Fernandez if (fdt_getprop(fdt, node, "st,safe_rst", NULL)) 1234*28c10f9eSGabriel Fernandez pdata->safe_rst = true; 1235*28c10f9eSGabriel Fernandez 1236*28c10f9eSGabriel Fernandez pdata->rcc_base = stm32_rcc_base(); 1237*28c10f9eSGabriel Fernandez 1238*28c10f9eSGabriel Fernandez return 0; 1239*28c10f9eSGabriel Fernandez } 1240*28c10f9eSGabriel Fernandez 1241*28c10f9eSGabriel Fernandez static void stm32mp2_a35_ss_on_hsi(void) 1242*28c10f9eSGabriel Fernandez { 1243*28c10f9eSGabriel Fernandez uint64_t timeout = 0; 1244*28c10f9eSGabriel Fernandez 1245*28c10f9eSGabriel Fernandez /* Nothing to do if clock source is already set on bypass clock */ 1246*28c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1247*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) 1248*28c10f9eSGabriel Fernandez return; 1249*28c10f9eSGabriel Fernandez 1250*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 1251*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_EN, 1252*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK); 1253*28c10f9eSGabriel Fernandez 1254*28c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 1255*28c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 1256*28c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1257*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) 1258*28c10f9eSGabriel Fernandez break; 1259*28c10f9eSGabriel Fernandez 1260*28c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1261*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)) 1262*28c10f9eSGabriel Fernandez panic("Cannot switch A35 to bypass clock"); 1263*28c10f9eSGabriel Fernandez 1264*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 1265*28c10f9eSGabriel Fernandez 0, 1266*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK); 1267*28c10f9eSGabriel Fernandez } 1268*28c10f9eSGabriel Fernandez 1269*28c10f9eSGabriel Fernandez static void stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv *priv) 1270*28c10f9eSGabriel Fernandez { 1271*28c10f9eSGabriel Fernandez uintptr_t xbar0cfgr = priv->base + RCC_XBAR0CFGR; 1272*28c10f9eSGabriel Fernandez uint32_t i = 0; 1273*28c10f9eSGabriel Fernandez 1274*28c10f9eSGabriel Fernandez for (i = 0; i < XBAR_ROOT_CHANNEL_NB; i++) 1275*28c10f9eSGabriel Fernandez io_clrsetbits32(xbar0cfgr + (0x4 * i), 1276*28c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, XBAR_SRC_HSI); 1277*28c10f9eSGabriel Fernandez } 1278*28c10f9eSGabriel Fernandez 1279*28c10f9eSGabriel Fernandez static int stm32mp2_a35_pll1_start(void) 1280*28c10f9eSGabriel Fernandez { 1281*28c10f9eSGabriel Fernandez uint64_t timeout = 0; 1282*28c10f9eSGabriel Fernandez 1283*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 1284*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_PD_EN, 1285*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_PD_EN); 1286*28c10f9eSGabriel Fernandez 1287*28c10f9eSGabriel Fernandez /* Wait PLL lock */ 1288*28c10f9eSGabriel Fernandez timeout = timeout_init_us(PLLRDY_TIMEOUT); 1289*28c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 1290*28c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_PLL_EN) & 1291*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_LOCKP_MASK) 1292*28c10f9eSGabriel Fernandez break; 1293*28c10f9eSGabriel Fernandez 1294*28c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_PLL_EN) & 1295*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_LOCKP_MASK)) { 1296*28c10f9eSGabriel Fernandez EMSG("PLL1 not locked"); 1297*28c10f9eSGabriel Fernandez return -1; 1298*28c10f9eSGabriel Fernandez } 1299*28c10f9eSGabriel Fernandez 1300*28c10f9eSGabriel Fernandez /* De-assert reset on PLL output clock path */ 1301*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 1302*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_EN, 1303*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK); 1304*28c10f9eSGabriel Fernandez 1305*28c10f9eSGabriel Fernandez /* Switch CPU clock to PLL clock */ 1306*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 1307*28c10f9eSGabriel Fernandez 0, 1308*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK); 1309*28c10f9eSGabriel Fernandez 1310*28c10f9eSGabriel Fernandez /* Wait for clock change acknowledge */ 1311*28c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 1312*28c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 1313*28c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1314*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)) 1315*28c10f9eSGabriel Fernandez break; 1316*28c10f9eSGabriel Fernandez 1317*28c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1318*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) { 1319*28c10f9eSGabriel Fernandez EMSG("A35 switch to PLL1 failed"); 1320*28c10f9eSGabriel Fernandez return -1; 1321*28c10f9eSGabriel Fernandez } 1322*28c10f9eSGabriel Fernandez 1323*28c10f9eSGabriel Fernandez return 0; 1324*28c10f9eSGabriel Fernandez } 1325*28c10f9eSGabriel Fernandez 1326*28c10f9eSGabriel Fernandez static void stm32mp2_a35_pll1_config(uint32_t fbdiv, uint32_t refdiv, 1327*28c10f9eSGabriel Fernandez uint32_t postdiv1, uint32_t postdiv2) 1328*28c10f9eSGabriel Fernandez { 1329*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ1, 1330*28c10f9eSGabriel Fernandez SHIFT_U32(refdiv, 1331*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT) | 1332*28c10f9eSGabriel Fernandez SHIFT_U32(fbdiv, A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT), 1333*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_MASK); 1334*28c10f9eSGabriel Fernandez 1335*28c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ2, 1336*28c10f9eSGabriel Fernandez SHIFT_U32(postdiv1, 1337*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT) | 1338*28c10f9eSGabriel Fernandez SHIFT_U32(postdiv2, 1339*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT), 1340*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_MASK); 1341*28c10f9eSGabriel Fernandez } 1342*28c10f9eSGabriel Fernandez 1343*28c10f9eSGabriel Fernandez static void clk_stm32_pll_config_output(struct clk_stm32_priv *priv, 1344*28c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll, 1345*28c10f9eSGabriel Fernandez uint32_t pllsrc, 1346*28c10f9eSGabriel Fernandez uint32_t *pllcfg, 1347*28c10f9eSGabriel Fernandez uint32_t fracv) 1348*28c10f9eSGabriel Fernandez { 1349*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 1350*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2; 1351*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 1352*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 1353*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6; 1354*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7; 1355*28c10f9eSGabriel Fernandez int sel = (pllsrc & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 1356*28c10f9eSGabriel Fernandez unsigned long refclk = clk_stm32_pll_get_oscillator_rate(sel); 1357*28c10f9eSGabriel Fernandez 1358*28c10f9eSGabriel Fernandez if (fracv == 0) { 1359*28c10f9eSGabriel Fernandez /* PLL in integer mode */ 1360*28c10f9eSGabriel Fernandez 1361*28c10f9eSGabriel Fernandez /* 1362*28c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks 1363*28c10f9eSGabriel Fernandez * will always be less than 1.2GHz 1364*28c10f9eSGabriel Fernandez */ 1365*28c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN) 1366*28c10f9eSGabriel Fernandez panic(); 1367*28c10f9eSGabriel Fernandez 1368*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK); 1369*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 1370*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN); 1371*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 1372*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST); 1373*28c10f9eSGabriel Fernandez } else { 1374*28c10f9eSGabriel Fernandez /* PLL in frac mode */ 1375*28c10f9eSGabriel Fernandez 1376*28c10f9eSGabriel Fernandez /* 1377*28c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks 1378*28c10f9eSGabriel Fernandez * will always be less than 1.2GHz 1379*28c10f9eSGabriel Fernandez */ 1380*28c10f9eSGabriel Fernandez if (refclk < PLL_FRAC_REFCLK_MIN) 1381*28c10f9eSGabriel Fernandez panic(); 1382*28c10f9eSGabriel Fernandez 1383*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK, 1384*28c10f9eSGabriel Fernandez fracv & RCC_PLLxCFGR3_FRACIN_MASK); 1385*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 1386*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 1387*28c10f9eSGabriel Fernandez } 1388*28c10f9eSGabriel Fernandez 1389*28c10f9eSGabriel Fernandez assert(pllcfg[REFDIV]); 1390*28c10f9eSGabriel Fernandez 1391*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FBDIV_MASK, 1392*28c10f9eSGabriel Fernandez SHIFT_U32(pllcfg[FBDIV], RCC_PLLxCFGR2_FBDIV_SHIFT) & 1393*28c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_MASK); 1394*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FREFDIV_MASK, 1395*28c10f9eSGabriel Fernandez pllcfg[REFDIV] & RCC_PLLxCFGR2_FREFDIV_MASK); 1396*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr6, RCC_PLLxCFGR6_POSTDIV1_MASK, 1397*28c10f9eSGabriel Fernandez pllcfg[POSTDIV1] & RCC_PLLxCFGR6_POSTDIV1_MASK); 1398*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr7, RCC_PLLxCFGR7_POSTDIV2_MASK, 1399*28c10f9eSGabriel Fernandez pllcfg[POSTDIV2] & RCC_PLLxCFGR7_POSTDIV2_MASK); 1400*28c10f9eSGabriel Fernandez 1401*28c10f9eSGabriel Fernandez if (pllcfg[POSTDIV1] == 0 || pllcfg[POSTDIV2] == 0) { 1402*28c10f9eSGabriel Fernandez /* Bypass mode */ 1403*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS); 1404*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN); 1405*28c10f9eSGabriel Fernandez } else { 1406*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS); 1407*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN); 1408*28c10f9eSGabriel Fernandez } 1409*28c10f9eSGabriel Fernandez } 1410*28c10f9eSGabriel Fernandez 1411*28c10f9eSGabriel Fernandez static void clk_stm32_pll_config_csg(struct clk_stm32_priv *priv, 1412*28c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll, 1413*28c10f9eSGabriel Fernandez uint32_t *csg) 1414*28c10f9eSGabriel Fernandez { 1415*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 1416*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 1417*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 1418*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr5 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR5; 1419*28c10f9eSGabriel Fernandez 1420*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_DIVVAL_MASK, 1421*28c10f9eSGabriel Fernandez csg[DIVVAL] & RCC_PLLxCFGR5_DIVVAL_MASK); 1422*28c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_SPREAD_MASK, 1423*28c10f9eSGabriel Fernandez SHIFT_U32(csg[SPREAD], RCC_PLLxCFGR5_SPREAD_SHIFT) & 1424*28c10f9eSGabriel Fernandez RCC_PLLxCFGR5_SPREAD_MASK); 1425*28c10f9eSGabriel Fernandez 1426*28c10f9eSGabriel Fernandez if (csg[DOWNSPREAD] != 0) 1427*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD); 1428*28c10f9eSGabriel Fernandez else 1429*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD); 1430*28c10f9eSGabriel Fernandez 1431*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 1432*28c10f9eSGabriel Fernandez 1433*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_PLLEN); 1434*28c10f9eSGabriel Fernandez udelay(1); 1435*28c10f9eSGabriel Fernandez 1436*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 1437*28c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN); 1438*28c10f9eSGabriel Fernandez } 1439*28c10f9eSGabriel Fernandez 1440*28c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(unsigned int pll_idx) 1441*28c10f9eSGabriel Fernandez { 1442*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 1443*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 1444*28c10f9eSGabriel Fernandez 1445*28c10f9eSGabriel Fernandez assert(pll_idx < pdata->npll); 1446*28c10f9eSGabriel Fernandez 1447*28c10f9eSGabriel Fernandez return &pdata->pll[pll_idx]; 1448*28c10f9eSGabriel Fernandez } 1449*28c10f9eSGabriel Fernandez 1450*28c10f9eSGabriel Fernandez static int clk_stm32_pll_set_mux(struct clk_stm32_priv *priv __unused, 1451*28c10f9eSGabriel Fernandez uint32_t src) 1452*28c10f9eSGabriel Fernandez { 1453*28c10f9eSGabriel Fernandez int mux = (src & MUX_ID_MASK) >> MUX_ID_SHIFT; 1454*28c10f9eSGabriel Fernandez int sel = (src & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 1455*28c10f9eSGabriel Fernandez 1456*28c10f9eSGabriel Fernandez return stm32_mux_set_parent(mux, sel); 1457*28c10f9eSGabriel Fernandez } 1458*28c10f9eSGabriel Fernandez 1459*28c10f9eSGabriel Fernandez static void clk_stm32_pll1_init(struct clk_stm32_priv *priv, 1460*28c10f9eSGabriel Fernandez int pll_idx __unused, 1461*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf) 1462*28c10f9eSGabriel Fernandez { 1463*28c10f9eSGabriel Fernandez int sel = (pll_conf->src & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 1464*28c10f9eSGabriel Fernandez unsigned long refclk = 0; 1465*28c10f9eSGabriel Fernandez 1466*28c10f9eSGabriel Fernandez /* 1467*28c10f9eSGabriel Fernandez * TODO: check if pll has already good parameters or if we could make 1468*28c10f9eSGabriel Fernandez * a configuration on the fly. 1469*28c10f9eSGabriel Fernandez */ 1470*28c10f9eSGabriel Fernandez 1471*28c10f9eSGabriel Fernandez stm32mp2_a35_ss_on_hsi(); 1472*28c10f9eSGabriel Fernandez 1473*28c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src)) 1474*28c10f9eSGabriel Fernandez panic(); 1475*28c10f9eSGabriel Fernandez 1476*28c10f9eSGabriel Fernandez refclk = clk_stm32_pll_get_oscillator_rate(sel); 1477*28c10f9eSGabriel Fernandez 1478*28c10f9eSGabriel Fernandez /* 1479*28c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks will 1480*28c10f9eSGabriel Fernandez * always be less than 1.2GHz 1481*28c10f9eSGabriel Fernandez */ 1482*28c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN) 1483*28c10f9eSGabriel Fernandez panic(); 1484*28c10f9eSGabriel Fernandez 1485*28c10f9eSGabriel Fernandez stm32mp2_a35_pll1_config(pll_conf->cfg[FBDIV], 1486*28c10f9eSGabriel Fernandez pll_conf->cfg[REFDIV], 1487*28c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV1], 1488*28c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV2]); 1489*28c10f9eSGabriel Fernandez 1490*28c10f9eSGabriel Fernandez if (stm32mp2_a35_pll1_start()) 1491*28c10f9eSGabriel Fernandez panic(); 1492*28c10f9eSGabriel Fernandez } 1493*28c10f9eSGabriel Fernandez 1494*28c10f9eSGabriel Fernandez static void clk_stm32_pll_init(struct clk_stm32_priv *priv, int pll_idx, 1495*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf) 1496*28c10f9eSGabriel Fernandez { 1497*28c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll = clk_stm32_pll_data(pll_idx); 1498*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 1499*28c10f9eSGabriel Fernandez bool spread_spectrum = false; 1500*28c10f9eSGabriel Fernandez 1501*28c10f9eSGabriel Fernandez /* 1502*28c10f9eSGabriel Fernandez * TODO: check if pll has already good parameters or if we could make 1503*28c10f9eSGabriel Fernandez * a configuration on the fly. 1504*28c10f9eSGabriel Fernandez */ 1505*28c10f9eSGabriel Fernandez 1506*28c10f9eSGabriel Fernandez stm32_gate_rdy_disable(pll->gate_id); 1507*28c10f9eSGabriel Fernandez 1508*28c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src)) 1509*28c10f9eSGabriel Fernandez panic(); 1510*28c10f9eSGabriel Fernandez 1511*28c10f9eSGabriel Fernandez clk_stm32_pll_config_output(priv, pll, pll_conf->src, 1512*28c10f9eSGabriel Fernandez pll_conf->cfg, pll_conf->frac); 1513*28c10f9eSGabriel Fernandez 1514*28c10f9eSGabriel Fernandez if (pll_conf->csg_enabled) { 1515*28c10f9eSGabriel Fernandez clk_stm32_pll_config_csg(priv, pll, pll_conf->csg); 1516*28c10f9eSGabriel Fernandez spread_spectrum = true; 1517*28c10f9eSGabriel Fernandez } 1518*28c10f9eSGabriel Fernandez 1519*28c10f9eSGabriel Fernandez stm32_gate_rdy_enable(pll->gate_id); 1520*28c10f9eSGabriel Fernandez 1521*28c10f9eSGabriel Fernandez if (spread_spectrum) 1522*28c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST); 1523*28c10f9eSGabriel Fernandez } 1524*28c10f9eSGabriel Fernandez 1525*28c10f9eSGabriel Fernandez static int stm32_clk_pll_configure(struct clk_stm32_priv *priv) 1526*28c10f9eSGabriel Fernandez { 1527*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL; 1528*28c10f9eSGabriel Fernandez size_t i = 0; 1529*28c10f9eSGabriel Fernandez 1530*28c10f9eSGabriel Fernandez for (i = 0; i < PLL_NB; i++) { 1531*28c10f9eSGabriel Fernandez pll_conf = clk_stm32_pll_get_pdata(i); 1532*28c10f9eSGabriel Fernandez 1533*28c10f9eSGabriel Fernandez if (pll_conf->enabled) { 1534*28c10f9eSGabriel Fernandez /* Skip the pll3 (need GPU regulator to configure) */ 1535*28c10f9eSGabriel Fernandez if (i == PLL3_ID) 1536*28c10f9eSGabriel Fernandez continue; 1537*28c10f9eSGabriel Fernandez 1538*28c10f9eSGabriel Fernandez /* Skip the pll2 (reserved to DDR) */ 1539*28c10f9eSGabriel Fernandez if (i == PLL2_ID) 1540*28c10f9eSGabriel Fernandez continue; 1541*28c10f9eSGabriel Fernandez 1542*28c10f9eSGabriel Fernandez if (i == PLL1_ID) 1543*28c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, i, pll_conf); 1544*28c10f9eSGabriel Fernandez else 1545*28c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, i, pll_conf); 1546*28c10f9eSGabriel Fernandez } 1547*28c10f9eSGabriel Fernandez } 1548*28c10f9eSGabriel Fernandez 1549*28c10f9eSGabriel Fernandez return 0; 1550*28c10f9eSGabriel Fernandez } 1551*28c10f9eSGabriel Fernandez 1552*28c10f9eSGabriel Fernandez #define __WORD_BIT 32 1553*28c10f9eSGabriel Fernandez 1554*28c10f9eSGabriel Fernandez static int wait_predivsr(uint16_t channel) 1555*28c10f9eSGabriel Fernandez { 1556*28c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 1557*28c10f9eSGabriel Fernandez uintptr_t previvsr = 0; 1558*28c10f9eSGabriel Fernandez uint32_t channel_bit = 0; 1559*28c10f9eSGabriel Fernandez uint32_t value = 0; 1560*28c10f9eSGabriel Fernandez 1561*28c10f9eSGabriel Fernandez if (channel < __WORD_BIT) { 1562*28c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR1; 1563*28c10f9eSGabriel Fernandez channel_bit = BIT(channel); 1564*28c10f9eSGabriel Fernandez } else { 1565*28c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR2; 1566*28c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT); 1567*28c10f9eSGabriel Fernandez } 1568*28c10f9eSGabriel Fernandez 1569*28c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(previvsr, value, !(value & channel_bit), 0, 1570*28c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 1571*28c10f9eSGabriel Fernandez EMSG("Pre divider status: %#"PRIx32, io_read32(previvsr)); 1572*28c10f9eSGabriel Fernandez return -1; 1573*28c10f9eSGabriel Fernandez } 1574*28c10f9eSGabriel Fernandez 1575*28c10f9eSGabriel Fernandez return 0; 1576*28c10f9eSGabriel Fernandez } 1577*28c10f9eSGabriel Fernandez 1578*28c10f9eSGabriel Fernandez static int wait_findivsr(uint16_t channel) 1579*28c10f9eSGabriel Fernandez { 1580*28c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 1581*28c10f9eSGabriel Fernandez uintptr_t finvivsr = 0; 1582*28c10f9eSGabriel Fernandez uint32_t channel_bit = 0; 1583*28c10f9eSGabriel Fernandez uint32_t value = 0; 1584*28c10f9eSGabriel Fernandez 1585*28c10f9eSGabriel Fernandez if (channel < __WORD_BIT) { 1586*28c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR1; 1587*28c10f9eSGabriel Fernandez channel_bit = BIT(channel); 1588*28c10f9eSGabriel Fernandez } else { 1589*28c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR2; 1590*28c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT); 1591*28c10f9eSGabriel Fernandez } 1592*28c10f9eSGabriel Fernandez 1593*28c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(finvivsr, value, !(value & channel_bit), 0, 1594*28c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 1595*28c10f9eSGabriel Fernandez EMSG("Final divider status: %#"PRIx32, io_read32(finvivsr)); 1596*28c10f9eSGabriel Fernandez return -1; 1597*28c10f9eSGabriel Fernandez } 1598*28c10f9eSGabriel Fernandez 1599*28c10f9eSGabriel Fernandez return 0; 1600*28c10f9eSGabriel Fernandez } 1601*28c10f9eSGabriel Fernandez 1602*28c10f9eSGabriel Fernandez static int wait_xbar_sts(uint16_t channel) 1603*28c10f9eSGabriel Fernandez { 1604*28c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 1605*28c10f9eSGabriel Fernandez uintptr_t xbar_cfgr = rcc_base + RCC_XBAR0CFGR + (0x4 * channel); 1606*28c10f9eSGabriel Fernandez uint32_t value = 0; 1607*28c10f9eSGabriel Fernandez 1608*28c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(xbar_cfgr, value, 1609*28c10f9eSGabriel Fernandez !(value & RCC_XBAR0CFGR_XBAR0STS), 0, 1610*28c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 1611*28c10f9eSGabriel Fernandez EMSG("XBAR%"PRIu16"CFGR: %#"PRIx32, channel, 1612*28c10f9eSGabriel Fernandez io_read32(xbar_cfgr)); 1613*28c10f9eSGabriel Fernandez return -1; 1614*28c10f9eSGabriel Fernandez } 1615*28c10f9eSGabriel Fernandez 1616*28c10f9eSGabriel Fernandez return 0; 1617*28c10f9eSGabriel Fernandez } 1618*28c10f9eSGabriel Fernandez 1619*28c10f9eSGabriel Fernandez static void flexclkgen_config_channel(uint16_t channel, unsigned int clk_src, 1620*28c10f9eSGabriel Fernandez unsigned int prediv, unsigned int findiv) 1621*28c10f9eSGabriel Fernandez { 1622*28c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 1623*28c10f9eSGabriel Fernandez 1624*28c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 1625*28c10f9eSGabriel Fernandez panic(); 1626*28c10f9eSGabriel Fernandez 1627*28c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel), 1628*28c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, prediv); 1629*28c10f9eSGabriel Fernandez 1630*28c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 1631*28c10f9eSGabriel Fernandez panic(); 1632*28c10f9eSGabriel Fernandez 1633*28c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 1634*28c10f9eSGabriel Fernandez panic(); 1635*28c10f9eSGabriel Fernandez 1636*28c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 1637*28c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK, 1638*28c10f9eSGabriel Fernandez findiv); 1639*28c10f9eSGabriel Fernandez 1640*28c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 1641*28c10f9eSGabriel Fernandez panic(); 1642*28c10f9eSGabriel Fernandez 1643*28c10f9eSGabriel Fernandez if (wait_xbar_sts(channel) != 0) 1644*28c10f9eSGabriel Fernandez panic(); 1645*28c10f9eSGabriel Fernandez 1646*28c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel), 1647*28c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, 1648*28c10f9eSGabriel Fernandez clk_src); 1649*28c10f9eSGabriel Fernandez 1650*28c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel), 1651*28c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0EN); 1652*28c10f9eSGabriel Fernandez 1653*28c10f9eSGabriel Fernandez if (wait_xbar_sts(channel) != 0) 1654*28c10f9eSGabriel Fernandez panic(); 1655*28c10f9eSGabriel Fernandez } 1656*28c10f9eSGabriel Fernandez 1657*28c10f9eSGabriel Fernandez static int stm32mp2_clk_flexgen_configure(struct clk_stm32_priv *priv) 1658*28c10f9eSGabriel Fernandez { 1659*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 1660*28c10f9eSGabriel Fernandez uint32_t i = 0; 1661*28c10f9eSGabriel Fernandez 1662*28c10f9eSGabriel Fernandez for (i = 0; i < pdata->nflexgen; i++) { 1663*28c10f9eSGabriel Fernandez uint32_t val = pdata->flexgen[i]; 1664*28c10f9eSGabriel Fernandez uint32_t cmd = 0; 1665*28c10f9eSGabriel Fernandez uint32_t cmd_data = 0; 1666*28c10f9eSGabriel Fernandez unsigned int channel = 0; 1667*28c10f9eSGabriel Fernandez unsigned int clk_src = 0; 1668*28c10f9eSGabriel Fernandez unsigned int pdiv = 0; 1669*28c10f9eSGabriel Fernandez unsigned int fdiv = 0; 1670*28c10f9eSGabriel Fernandez 1671*28c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT; 1672*28c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK; 1673*28c10f9eSGabriel Fernandez 1674*28c10f9eSGabriel Fernandez if (cmd != CMD_FLEXGEN) 1675*28c10f9eSGabriel Fernandez continue; 1676*28c10f9eSGabriel Fernandez 1677*28c10f9eSGabriel Fernandez channel = (cmd_data & FLEX_ID_MASK) >> FLEX_ID_SHIFT; 1678*28c10f9eSGabriel Fernandez 1679*28c10f9eSGabriel Fernandez /* 1680*28c10f9eSGabriel Fernandez * Skip ck_ker_stgen configuration, will be done by 1681*28c10f9eSGabriel Fernandez * stgen driver. 1682*28c10f9eSGabriel Fernandez */ 1683*28c10f9eSGabriel Fernandez if (channel == FLEX_STGEN) 1684*28c10f9eSGabriel Fernandez continue; 1685*28c10f9eSGabriel Fernandez 1686*28c10f9eSGabriel Fernandez clk_src = (cmd_data & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT; 1687*28c10f9eSGabriel Fernandez pdiv = (cmd_data & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT; 1688*28c10f9eSGabriel Fernandez fdiv = (cmd_data & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT; 1689*28c10f9eSGabriel Fernandez 1690*28c10f9eSGabriel Fernandez flexclkgen_config_channel(channel, clk_src, pdiv, fdiv); 1691*28c10f9eSGabriel Fernandez } 1692*28c10f9eSGabriel Fernandez 1693*28c10f9eSGabriel Fernandez return 0; 1694*28c10f9eSGabriel Fernandez } 1695*28c10f9eSGabriel Fernandez 1696*28c10f9eSGabriel Fernandez static int stm32_clk_configure_div(struct clk_stm32_priv *priv __unused, 1697*28c10f9eSGabriel Fernandez uint32_t data) 1698*28c10f9eSGabriel Fernandez { 1699*28c10f9eSGabriel Fernandez uint32_t div_id = 0; 1700*28c10f9eSGabriel Fernandez uint32_t div_n = 0; 1701*28c10f9eSGabriel Fernandez 1702*28c10f9eSGabriel Fernandez div_id = (data & DIV_ID_MASK) >> DIV_ID_SHIFT; 1703*28c10f9eSGabriel Fernandez div_n = (data & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT; 1704*28c10f9eSGabriel Fernandez 1705*28c10f9eSGabriel Fernandez return stm32_div_set_value(div_id, div_n); 1706*28c10f9eSGabriel Fernandez } 1707*28c10f9eSGabriel Fernandez 1708*28c10f9eSGabriel Fernandez static int stm32_clk_configure_mux(struct clk_stm32_priv *priv __unused, 1709*28c10f9eSGabriel Fernandez uint32_t data) 1710*28c10f9eSGabriel Fernandez { 1711*28c10f9eSGabriel Fernandez int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT; 1712*28c10f9eSGabriel Fernandez int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 1713*28c10f9eSGabriel Fernandez 1714*28c10f9eSGabriel Fernandez return stm32_mux_set_parent(mux, sel); 1715*28c10f9eSGabriel Fernandez } 1716*28c10f9eSGabriel Fernandez 1717*28c10f9eSGabriel Fernandez static int stm32_clk_configure_by_addr_val(struct clk_stm32_priv *priv, 1718*28c10f9eSGabriel Fernandez uint32_t data) 1719*28c10f9eSGabriel Fernandez { 1720*28c10f9eSGabriel Fernandez uint32_t addr = data >> CLK_ADDR_SHIFT; 1721*28c10f9eSGabriel Fernandez uint32_t val = data & CLK_ADDR_VAL_MASK; 1722*28c10f9eSGabriel Fernandez 1723*28c10f9eSGabriel Fernandez io_setbits32(priv->base + addr, val); 1724*28c10f9eSGabriel Fernandez 1725*28c10f9eSGabriel Fernandez return 0; 1726*28c10f9eSGabriel Fernandez } 1727*28c10f9eSGabriel Fernandez 1728*28c10f9eSGabriel Fernandez static void stm32_clk_configure_obs(struct clk_stm32_priv *priv, 1729*28c10f9eSGabriel Fernandez uint32_t data) 1730*28c10f9eSGabriel Fernandez { 1731*28c10f9eSGabriel Fernandez uint32_t id = (data & OBS_ID_MASK) >> OBS_ID_SHIFT; 1732*28c10f9eSGabriel Fernandez uint32_t status = (data & OBS_STATUS_MASK) >> OBS_STATUS_SHIFT; 1733*28c10f9eSGabriel Fernandez uint32_t int_ext = (data & OBS_INTEXT_MASK) >> OBS_INTEXT_SHIFT; 1734*28c10f9eSGabriel Fernandez uint32_t div = (data & OBS_DIV_MASK) >> OBS_DIV_SHIFT; 1735*28c10f9eSGabriel Fernandez uint32_t inv = (data & OBS_INV_MASK) >> OBS_INV_SHIFT; 1736*28c10f9eSGabriel Fernandez uint32_t sel = (data & OBS_SEL_MASK) >> OBS_SEL_SHIFT; 1737*28c10f9eSGabriel Fernandez uint32_t reg = 0; 1738*28c10f9eSGabriel Fernandez uint32_t val = 0; 1739*28c10f9eSGabriel Fernandez 1740*28c10f9eSGabriel Fernandez if (!id) 1741*28c10f9eSGabriel Fernandez reg = RCC_FCALCOBS0CFGR; 1742*28c10f9eSGabriel Fernandez else 1743*28c10f9eSGabriel Fernandez reg = RCC_FCALCOBS1CFGR; 1744*28c10f9eSGabriel Fernandez 1745*28c10f9eSGabriel Fernandez if (status) 1746*28c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEN; 1747*28c10f9eSGabriel Fernandez 1748*28c10f9eSGabriel Fernandez if (int_ext == OBS_EXT) { 1749*28c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEXTSEL; 1750*28c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKEXTSEL_SHIFT); 1751*28c10f9eSGabriel Fernandez } else { 1752*28c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKINTSEL_SHIFT); 1753*28c10f9eSGabriel Fernandez } 1754*28c10f9eSGabriel Fernandez 1755*28c10f9eSGabriel Fernandez if (inv) 1756*28c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSINV; 1757*28c10f9eSGabriel Fernandez 1758*28c10f9eSGabriel Fernandez val |= SHIFT_U32(div, RCC_FCALCOBS0CFGR_CKOBSDIV_SHIFT); 1759*28c10f9eSGabriel Fernandez 1760*28c10f9eSGabriel Fernandez io_write32(priv->base + reg, val); 1761*28c10f9eSGabriel Fernandez } 1762*28c10f9eSGabriel Fernandez 1763*28c10f9eSGabriel Fernandez static int stm32_clk_configure(struct clk_stm32_priv *priv, uint32_t val) 1764*28c10f9eSGabriel Fernandez { 1765*28c10f9eSGabriel Fernandez uint32_t cmd_data = 0; 1766*28c10f9eSGabriel Fernandez uint32_t cmd = 0; 1767*28c10f9eSGabriel Fernandez int ret = 0; 1768*28c10f9eSGabriel Fernandez 1769*28c10f9eSGabriel Fernandez if (val & CMD_ADDR_BIT) { 1770*28c10f9eSGabriel Fernandez cmd_data = val & ~CMD_ADDR_BIT; 1771*28c10f9eSGabriel Fernandez 1772*28c10f9eSGabriel Fernandez return stm32_clk_configure_by_addr_val(priv, cmd_data); 1773*28c10f9eSGabriel Fernandez } 1774*28c10f9eSGabriel Fernandez 1775*28c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT; 1776*28c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK; 1777*28c10f9eSGabriel Fernandez 1778*28c10f9eSGabriel Fernandez switch (cmd) { 1779*28c10f9eSGabriel Fernandez case CMD_DIV: 1780*28c10f9eSGabriel Fernandez ret = stm32_clk_configure_div(priv, cmd_data); 1781*28c10f9eSGabriel Fernandez break; 1782*28c10f9eSGabriel Fernandez 1783*28c10f9eSGabriel Fernandez case CMD_MUX: 1784*28c10f9eSGabriel Fernandez ret = stm32_clk_configure_mux(priv, cmd_data); 1785*28c10f9eSGabriel Fernandez break; 1786*28c10f9eSGabriel Fernandez 1787*28c10f9eSGabriel Fernandez case CMD_OBS: 1788*28c10f9eSGabriel Fernandez stm32_clk_configure_obs(priv, cmd_data); 1789*28c10f9eSGabriel Fernandez break; 1790*28c10f9eSGabriel Fernandez 1791*28c10f9eSGabriel Fernandez default: 1792*28c10f9eSGabriel Fernandez EMSG("cmd unknown ! : %#"PRIx32, val); 1793*28c10f9eSGabriel Fernandez ret = -1; 1794*28c10f9eSGabriel Fernandez } 1795*28c10f9eSGabriel Fernandez 1796*28c10f9eSGabriel Fernandez return ret; 1797*28c10f9eSGabriel Fernandez } 1798*28c10f9eSGabriel Fernandez 1799*28c10f9eSGabriel Fernandez static int stm32_clk_bus_configure(struct clk_stm32_priv *priv) 1800*28c10f9eSGabriel Fernandez { 1801*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 1802*28c10f9eSGabriel Fernandez uint32_t i = 0; 1803*28c10f9eSGabriel Fernandez 1804*28c10f9eSGabriel Fernandez for (i = 0; i < pdata->nbusclk; i++) { 1805*28c10f9eSGabriel Fernandez int ret = 0; 1806*28c10f9eSGabriel Fernandez 1807*28c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->busclk[i]); 1808*28c10f9eSGabriel Fernandez if (ret != 0) 1809*28c10f9eSGabriel Fernandez return ret; 1810*28c10f9eSGabriel Fernandez } 1811*28c10f9eSGabriel Fernandez 1812*28c10f9eSGabriel Fernandez return 0; 1813*28c10f9eSGabriel Fernandez } 1814*28c10f9eSGabriel Fernandez 1815*28c10f9eSGabriel Fernandez static int stm32_clk_kernel_configure(struct clk_stm32_priv *priv) 1816*28c10f9eSGabriel Fernandez { 1817*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 1818*28c10f9eSGabriel Fernandez uint32_t i = 0; 1819*28c10f9eSGabriel Fernandez 1820*28c10f9eSGabriel Fernandez for (i = 0; i < pdata->nkernelclk; i++) { 1821*28c10f9eSGabriel Fernandez int ret = 0; 1822*28c10f9eSGabriel Fernandez 1823*28c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->kernelclk[i]); 1824*28c10f9eSGabriel Fernandez if (ret != 0) 1825*28c10f9eSGabriel Fernandez return ret; 1826*28c10f9eSGabriel Fernandez } 1827*28c10f9eSGabriel Fernandez 1828*28c10f9eSGabriel Fernandez return 0; 1829*28c10f9eSGabriel Fernandez } 1830*28c10f9eSGabriel Fernandez 1831*28c10f9eSGabriel Fernandez static void stm32mp2_init_clock_tree(struct clk_stm32_priv *priv, 1832*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 1833*28c10f9eSGabriel Fernandez { 1834*28c10f9eSGabriel Fernandez stm32_clk_oscillators_enable(priv, pdata); 1835*28c10f9eSGabriel Fernandez 1836*28c10f9eSGabriel Fernandez /* Come back to HSI for flexgen */ 1837*28c10f9eSGabriel Fernandez stm32mp2_clk_xbar_on_hsi(priv); 1838*28c10f9eSGabriel Fernandez 1839*28c10f9eSGabriel Fernandez if (stm32_clk_pll_configure(priv)) 1840*28c10f9eSGabriel Fernandez panic("Cannot configure plls"); 1841*28c10f9eSGabriel Fernandez 1842*28c10f9eSGabriel Fernandez /* Wait LSE ready before to use it */ 1843*28c10f9eSGabriel Fernandez if (stm32_clk_oscillators_wait_lse_ready(priv, pdata)) 1844*28c10f9eSGabriel Fernandez panic("Timeout: to enable LSE"); 1845*28c10f9eSGabriel Fernandez 1846*28c10f9eSGabriel Fernandez if (stm32mp2_clk_flexgen_configure(priv)) 1847*28c10f9eSGabriel Fernandez panic("Cannot configure flexgen"); 1848*28c10f9eSGabriel Fernandez 1849*28c10f9eSGabriel Fernandez if (stm32_clk_bus_configure(priv)) 1850*28c10f9eSGabriel Fernandez panic("Cannot config bus clocks"); 1851*28c10f9eSGabriel Fernandez 1852*28c10f9eSGabriel Fernandez if (stm32_clk_kernel_configure(priv)) 1853*28c10f9eSGabriel Fernandez panic("Cannot configure kernel clocks"); 1854*28c10f9eSGabriel Fernandez 1855*28c10f9eSGabriel Fernandez /* Configure LSE css after RTC source configuration */ 1856*28c10f9eSGabriel Fernandez stm32_clk_oscillators_lse_set_css(priv, pdata); 1857*28c10f9eSGabriel Fernandez } 1858*28c10f9eSGabriel Fernandez 1859*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_enable(struct clk *clk) 1860*28c10f9eSGabriel Fernandez { 1861*28c10f9eSGabriel Fernandez return clk_stm32_gate_ready_ops.enable(clk); 1862*28c10f9eSGabriel Fernandez } 1863*28c10f9eSGabriel Fernandez 1864*28c10f9eSGabriel Fernandez static void clk_stm32_osc_disable(struct clk *clk) 1865*28c10f9eSGabriel Fernandez { 1866*28c10f9eSGabriel Fernandez clk_stm32_gate_ready_ops.disable(clk); 1867*28c10f9eSGabriel Fernandez } 1868*28c10f9eSGabriel Fernandez 1869*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_osc_ops = { 1870*28c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable, 1871*28c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable, 1872*28c10f9eSGabriel Fernandez }; 1873*28c10f9eSGabriel Fernandez 1874*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_msi_get_rate(struct clk *clk __unused, 1875*28c10f9eSGabriel Fernandez unsigned long prate __unused) 1876*28c10f9eSGabriel Fernandez { 1877*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 1878*28c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR; 1879*28c10f9eSGabriel Fernandez 1880*28c10f9eSGabriel Fernandez if ((io_read32(address) & RCC_BDCR_MSIFREQSEL)) 1881*28c10f9eSGabriel Fernandez return RCC_16_MHZ; 1882*28c10f9eSGabriel Fernandez 1883*28c10f9eSGabriel Fernandez return RCC_4_MHZ; 1884*28c10f9eSGabriel Fernandez } 1885*28c10f9eSGabriel Fernandez 1886*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_msi_set_rate(struct clk *clk __unused, 1887*28c10f9eSGabriel Fernandez unsigned long rate, 1888*28c10f9eSGabriel Fernandez unsigned long prate __unused) 1889*28c10f9eSGabriel Fernandez { 1890*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 1891*28c10f9eSGabriel Fernandez 1892*28c10f9eSGabriel Fernandez return clk_stm32_osc_msi_set_rate(priv, rate); 1893*28c10f9eSGabriel Fernandez } 1894*28c10f9eSGabriel Fernandez 1895*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_oscillator_msi_ops = { 1896*28c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable, 1897*28c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable, 1898*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_msi_get_rate, 1899*28c10f9eSGabriel Fernandez .set_rate = clk_stm32_msi_set_rate, 1900*28c10f9eSGabriel Fernandez }; 1901*28c10f9eSGabriel Fernandez 1902*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hse_div_set_rate(struct clk *clk, 1903*28c10f9eSGabriel Fernandez unsigned long rate, 1904*28c10f9eSGabriel Fernandez unsigned long parent_rate) 1905*28c10f9eSGabriel Fernandez { 1906*28c10f9eSGabriel Fernandez return clk_stm32_divider_set_rate(clk, rate, parent_rate); 1907*28c10f9eSGabriel Fernandez } 1908*28c10f9eSGabriel Fernandez 1909*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_hse_div_ops = { 1910*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_divider_get_rate, 1911*28c10f9eSGabriel Fernandez .set_rate = clk_stm32_hse_div_set_rate, 1912*28c10f9eSGabriel Fernandez }; 1913*28c10f9eSGabriel Fernandez 1914*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hsediv2_enable(struct clk *clk) 1915*28c10f9eSGabriel Fernandez { 1916*28c10f9eSGabriel Fernandez return clk_stm32_gate_ops.enable(clk); 1917*28c10f9eSGabriel Fernandez } 1918*28c10f9eSGabriel Fernandez 1919*28c10f9eSGabriel Fernandez static void clk_stm32_hsediv2_disable(struct clk *clk) 1920*28c10f9eSGabriel Fernandez { 1921*28c10f9eSGabriel Fernandez clk_stm32_gate_ops.disable(clk); 1922*28c10f9eSGabriel Fernandez } 1923*28c10f9eSGabriel Fernandez 1924*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_hsediv2_get_rate(struct clk *clk __unused, 1925*28c10f9eSGabriel Fernandez unsigned long prate) 1926*28c10f9eSGabriel Fernandez { 1927*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 1928*28c10f9eSGabriel Fernandez uintptr_t addr = priv->base + RCC_OCENSETR; 1929*28c10f9eSGabriel Fernandez 1930*28c10f9eSGabriel Fernandez if (io_read32(addr) & RCC_OCENSETR_HSEDIV2BYP) 1931*28c10f9eSGabriel Fernandez return prate; 1932*28c10f9eSGabriel Fernandez 1933*28c10f9eSGabriel Fernandez return prate / 2; 1934*28c10f9eSGabriel Fernandez } 1935*28c10f9eSGabriel Fernandez 1936*28c10f9eSGabriel Fernandez static const struct clk_ops clk_hsediv2_ops = { 1937*28c10f9eSGabriel Fernandez .enable = clk_stm32_hsediv2_enable, 1938*28c10f9eSGabriel Fernandez .disable = clk_stm32_hsediv2_disable, 1939*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_hsediv2_get_rate, 1940*28c10f9eSGabriel Fernandez }; 1941*28c10f9eSGabriel Fernandez 1942*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg { 1943*28c10f9eSGabriel Fernandez uint32_t pll_offset; 1944*28c10f9eSGabriel Fernandez int gate_id; 1945*28c10f9eSGabriel Fernandez int mux_id; 1946*28c10f9eSGabriel Fernandez }; 1947*28c10f9eSGabriel Fernandez 1948*28c10f9eSGabriel Fernandez static unsigned long clk_get_pll1_fvco_rate(unsigned long refclk) 1949*28c10f9eSGabriel Fernandez { 1950*28c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ1); 1951*28c10f9eSGabriel Fernandez uint32_t fbdiv = 0; 1952*28c10f9eSGabriel Fernandez uint32_t refdiv = 0; 1953*28c10f9eSGabriel Fernandez unsigned long freq = 0; 1954*28c10f9eSGabriel Fernandez 1955*28c10f9eSGabriel Fernandez fbdiv = (reg & A35SS_SSC_PLL_FREQ1_FBDIV_MASK) >> 1956*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT; 1957*28c10f9eSGabriel Fernandez 1958*28c10f9eSGabriel Fernandez refdiv = (reg & A35SS_SSC_PLL_FREQ1_REFDIV_MASK) >> 1959*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT; 1960*28c10f9eSGabriel Fernandez 1961*28c10f9eSGabriel Fernandez if (!refdiv || MUL_OVERFLOW(refclk, fbdiv, &freq)) 1962*28c10f9eSGabriel Fernandez panic(); 1963*28c10f9eSGabriel Fernandez 1964*28c10f9eSGabriel Fernandez return freq / refdiv; 1965*28c10f9eSGabriel Fernandez } 1966*28c10f9eSGabriel Fernandez 1967*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll1_get_rate(struct clk *clk __unused, 1968*28c10f9eSGabriel Fernandez unsigned long prate) 1969*28c10f9eSGabriel Fernandez { 1970*28c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ2); 1971*28c10f9eSGabriel Fernandez unsigned long dfout = 0; 1972*28c10f9eSGabriel Fernandez uint32_t postdiv1 = 0; 1973*28c10f9eSGabriel Fernandez uint32_t postdiv2 = 0; 1974*28c10f9eSGabriel Fernandez 1975*28c10f9eSGabriel Fernandez postdiv1 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV1_MASK) >> 1976*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT; 1977*28c10f9eSGabriel Fernandez 1978*28c10f9eSGabriel Fernandez postdiv2 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV2_MASK) >> 1979*28c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT; 1980*28c10f9eSGabriel Fernandez 1981*28c10f9eSGabriel Fernandez if (postdiv1 == 0 || postdiv2 == 0) 1982*28c10f9eSGabriel Fernandez dfout = prate; 1983*28c10f9eSGabriel Fernandez else 1984*28c10f9eSGabriel Fernandez dfout = clk_get_pll1_fvco_rate(prate) / (postdiv1 * postdiv2); 1985*28c10f9eSGabriel Fernandez 1986*28c10f9eSGabriel Fernandez return dfout; 1987*28c10f9eSGabriel Fernandez } 1988*28c10f9eSGabriel Fernandez 1989*28c10f9eSGabriel Fernandez static struct stm32_clk_opp_cfg * 1990*28c10f9eSGabriel Fernandez clk_stm32_get_opp_config(struct stm32_clk_opp_cfg *opp_cfg, unsigned long rate) 1991*28c10f9eSGabriel Fernandez { 1992*28c10f9eSGabriel Fernandez unsigned int i = 0; 1993*28c10f9eSGabriel Fernandez 1994*28c10f9eSGabriel Fernandez for (i = 0; i < MAX_OPP && opp_cfg->frq; i++, opp_cfg++) 1995*28c10f9eSGabriel Fernandez if (opp_cfg->frq == rate) 1996*28c10f9eSGabriel Fernandez return opp_cfg; 1997*28c10f9eSGabriel Fernandez 1998*28c10f9eSGabriel Fernandez return NULL; 1999*28c10f9eSGabriel Fernandez } 2000*28c10f9eSGabriel Fernandez 2001*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll1_set_rate(struct clk *clk __unused, 2002*28c10f9eSGabriel Fernandez unsigned long rate, 2003*28c10f9eSGabriel Fernandez unsigned long parent_rate __unused) 2004*28c10f9eSGabriel Fernandez { 2005*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 2006*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 2007*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL; 2008*28c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp = NULL; 2009*28c10f9eSGabriel Fernandez 2010*28c10f9eSGabriel Fernandez opp = clk_stm32_get_opp_config(pdata->opp->cpu1_opp, rate); 2011*28c10f9eSGabriel Fernandez if (!opp) 2012*28c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 2013*28c10f9eSGabriel Fernandez 2014*28c10f9eSGabriel Fernandez pll_conf = &opp->pll_cfg; 2015*28c10f9eSGabriel Fernandez 2016*28c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, PLL1_ID, pll_conf); 2017*28c10f9eSGabriel Fernandez 2018*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 2019*28c10f9eSGabriel Fernandez } 2020*28c10f9eSGabriel Fernandez 2021*28c10f9eSGabriel Fernandez static size_t clk_stm32_pll_get_parent(struct clk *clk) 2022*28c10f9eSGabriel Fernandez { 2023*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 2024*28c10f9eSGabriel Fernandez 2025*28c10f9eSGabriel Fernandez return stm32_mux_get_parent(cfg->mux_id); 2026*28c10f9eSGabriel Fernandez } 2027*28c10f9eSGabriel Fernandez 2028*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll1_ops = { 2029*28c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 2030*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll1_get_rate, 2031*28c10f9eSGabriel Fernandez .set_rate = clk_stm32_pll1_set_rate, 2032*28c10f9eSGabriel Fernandez }; 2033*28c10f9eSGabriel Fernandez 2034*28c10f9eSGabriel Fernandez static unsigned long clk_get_pll_fvco(uint32_t offset_base, 2035*28c10f9eSGabriel Fernandez unsigned long prate) 2036*28c10f9eSGabriel Fernandez { 2037*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 2038*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + offset_base; 2039*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2; 2040*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 2041*28c10f9eSGabriel Fernandez unsigned long fvco = 0; 2042*28c10f9eSGabriel Fernandez uint32_t fracin = 0; 2043*28c10f9eSGabriel Fernandez uint32_t fbdiv = 0; 2044*28c10f9eSGabriel Fernandez uint32_t refdiv = 0; 2045*28c10f9eSGabriel Fernandez 2046*28c10f9eSGabriel Fernandez fracin = io_read32(pllxcfgr3) & RCC_PLLxCFGR3_FRACIN_MASK; 2047*28c10f9eSGabriel Fernandez fbdiv = (io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FBDIV_MASK) >> 2048*28c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_SHIFT; 2049*28c10f9eSGabriel Fernandez 2050*28c10f9eSGabriel Fernandez refdiv = io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FREFDIV_MASK; 2051*28c10f9eSGabriel Fernandez 2052*28c10f9eSGabriel Fernandez assert(refdiv); 2053*28c10f9eSGabriel Fernandez 2054*28c10f9eSGabriel Fernandez if (fracin) { 2055*28c10f9eSGabriel Fernandez unsigned long long numerator = 0; 2056*28c10f9eSGabriel Fernandez unsigned long long denominator = 0; 2057*28c10f9eSGabriel Fernandez 2058*28c10f9eSGabriel Fernandez numerator = SHIFT_U64(fbdiv, 24) + fracin; 2059*28c10f9eSGabriel Fernandez numerator = prate * numerator; 2060*28c10f9eSGabriel Fernandez denominator = SHIFT_U64(refdiv, 24); 2061*28c10f9eSGabriel Fernandez fvco = (unsigned long)(numerator / denominator); 2062*28c10f9eSGabriel Fernandez } else { 2063*28c10f9eSGabriel Fernandez fvco = (unsigned long)(prate * fbdiv / refdiv); 2064*28c10f9eSGabriel Fernandez } 2065*28c10f9eSGabriel Fernandez 2066*28c10f9eSGabriel Fernandez return fvco; 2067*28c10f9eSGabriel Fernandez } 2068*28c10f9eSGabriel Fernandez 2069*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_rate(struct clk *clk __unused, 2070*28c10f9eSGabriel Fernandez unsigned long prate) 2071*28c10f9eSGabriel Fernandez { 2072*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 2073*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 2074*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + cfg->pll_offset; 2075*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 2076*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6; 2077*28c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7; 2078*28c10f9eSGabriel Fernandez unsigned long dfout = 0; 2079*28c10f9eSGabriel Fernandez uint32_t postdiv1 = 0; 2080*28c10f9eSGabriel Fernandez uint32_t postdiv2 = 0; 2081*28c10f9eSGabriel Fernandez 2082*28c10f9eSGabriel Fernandez postdiv1 = io_read32(pllxcfgr6) & RCC_PLLxCFGR6_POSTDIV1_MASK; 2083*28c10f9eSGabriel Fernandez postdiv2 = io_read32(pllxcfgr7) & RCC_PLLxCFGR7_POSTDIV2_MASK; 2084*28c10f9eSGabriel Fernandez 2085*28c10f9eSGabriel Fernandez if ((io_read32(pllxcfgr4) & RCC_PLLxCFGR4_BYPASS) || 2086*28c10f9eSGabriel Fernandez !postdiv1 || !postdiv2) 2087*28c10f9eSGabriel Fernandez dfout = prate; 2088*28c10f9eSGabriel Fernandez else 2089*28c10f9eSGabriel Fernandez dfout = clk_get_pll_fvco(cfg->pll_offset, 2090*28c10f9eSGabriel Fernandez prate) / (postdiv1 * postdiv2); 2091*28c10f9eSGabriel Fernandez 2092*28c10f9eSGabriel Fernandez return dfout; 2093*28c10f9eSGabriel Fernandez } 2094*28c10f9eSGabriel Fernandez 2095*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll_enable(struct clk *clk) 2096*28c10f9eSGabriel Fernandez { 2097*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 2098*28c10f9eSGabriel Fernandez 2099*28c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) { 2100*28c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 2101*28c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT; 2102*28c10f9eSGabriel Fernandez } 2103*28c10f9eSGabriel Fernandez 2104*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 2105*28c10f9eSGabriel Fernandez } 2106*28c10f9eSGabriel Fernandez 2107*28c10f9eSGabriel Fernandez static void clk_stm32_pll_disable(struct clk *clk) 2108*28c10f9eSGabriel Fernandez { 2109*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 2110*28c10f9eSGabriel Fernandez 2111*28c10f9eSGabriel Fernandez if (stm32_gate_rdy_disable(cfg->gate_id)) { 2112*28c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 2113*28c10f9eSGabriel Fernandez panic(); 2114*28c10f9eSGabriel Fernandez } 2115*28c10f9eSGabriel Fernandez } 2116*28c10f9eSGabriel Fernandez 2117*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll_ops = { 2118*28c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 2119*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate, 2120*28c10f9eSGabriel Fernandez .enable = clk_stm32_pll_enable, 2121*28c10f9eSGabriel Fernandez .disable = clk_stm32_pll_disable, 2122*28c10f9eSGabriel Fernandez }; 2123*28c10f9eSGabriel Fernandez 2124*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll3_enable(struct clk *clk) 2125*28c10f9eSGabriel Fernandez { 2126*28c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 2127*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 2128*28c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(PLL3_ID); 2129*28c10f9eSGabriel Fernandez struct clk *parent = NULL; 2130*28c10f9eSGabriel Fernandez size_t pidx = 0; 2131*28c10f9eSGabriel Fernandez 2132*28c10f9eSGabriel Fernandez /* ck_icn_p_gpu activate */ 2133*28c10f9eSGabriel Fernandez stm32_gate_enable(GATE_GPU); 2134*28c10f9eSGabriel Fernandez 2135*28c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, PLL3_ID, pll_conf); 2136*28c10f9eSGabriel Fernandez 2137*28c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) { 2138*28c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 2139*28c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT; 2140*28c10f9eSGabriel Fernandez } 2141*28c10f9eSGabriel Fernandez 2142*28c10f9eSGabriel Fernandez /* Update parent */ 2143*28c10f9eSGabriel Fernandez pidx = clk_stm32_pll_get_parent(clk); 2144*28c10f9eSGabriel Fernandez parent = clk_get_parent_by_index(clk, pidx); 2145*28c10f9eSGabriel Fernandez 2146*28c10f9eSGabriel Fernandez clk->parent = parent; 2147*28c10f9eSGabriel Fernandez 2148*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 2149*28c10f9eSGabriel Fernandez } 2150*28c10f9eSGabriel Fernandez 2151*28c10f9eSGabriel Fernandez static void clk_stm32_pll3_disable(struct clk *clk) 2152*28c10f9eSGabriel Fernandez { 2153*28c10f9eSGabriel Fernandez clk_stm32_pll_disable(clk); 2154*28c10f9eSGabriel Fernandez stm32_gate_disable(GATE_GPU); 2155*28c10f9eSGabriel Fernandez } 2156*28c10f9eSGabriel Fernandez 2157*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll3_ops = { 2158*28c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 2159*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate, 2160*28c10f9eSGabriel Fernandez .enable = clk_stm32_pll3_enable, 2161*28c10f9eSGabriel Fernandez .disable = clk_stm32_pll3_disable, 2162*28c10f9eSGabriel Fernandez }; 2163*28c10f9eSGabriel Fernandez 2164*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg { 2165*28c10f9eSGabriel Fernandez int flex_id; 2166*28c10f9eSGabriel Fernandez }; 2167*28c10f9eSGabriel Fernandez 2168*28c10f9eSGabriel Fernandez static size_t clk_stm32_flexgen_get_parent(struct clk *clk) 2169*28c10f9eSGabriel Fernandez { 2170*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 2171*28c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 2172*28c10f9eSGabriel Fernandez uint32_t address = 0; 2173*28c10f9eSGabriel Fernandez 2174*28c10f9eSGabriel Fernandez address = rcc_base + RCC_XBAR0CFGR + (cfg->flex_id * 4); 2175*28c10f9eSGabriel Fernandez 2176*28c10f9eSGabriel Fernandez return io_read32(address) & RCC_XBAR0CFGR_XBAR0SEL_MASK; 2177*28c10f9eSGabriel Fernandez } 2178*28c10f9eSGabriel Fernandez 2179*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_parent(struct clk *clk, size_t pidx) 2180*28c10f9eSGabriel Fernandez { 2181*28c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 2182*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 2183*28c10f9eSGabriel Fernandez uint16_t channel = cfg->flex_id * 4; 2184*28c10f9eSGabriel Fernandez 2185*28c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (channel), 2186*28c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, pidx); 2187*28c10f9eSGabriel Fernandez 2188*28c10f9eSGabriel Fernandez if (wait_xbar_sts(channel)) 2189*28c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 2190*28c10f9eSGabriel Fernandez 2191*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 2192*28c10f9eSGabriel Fernandez } 2193*28c10f9eSGabriel Fernandez 2194*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_rate(struct clk *clk __unused, 2195*28c10f9eSGabriel Fernandez unsigned long prate) 2196*28c10f9eSGabriel Fernandez { 2197*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 2198*28c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 2199*28c10f9eSGabriel Fernandez uint32_t prediv = 0; 2200*28c10f9eSGabriel Fernandez uint32_t findiv = 0; 2201*28c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 2202*28c10f9eSGabriel Fernandez unsigned long freq = prate; 2203*28c10f9eSGabriel Fernandez 2204*28c10f9eSGabriel Fernandez prediv = io_read32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel)) & 2205*28c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK; 2206*28c10f9eSGabriel Fernandez findiv = io_read32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel)) & 2207*28c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK; 2208*28c10f9eSGabriel Fernandez 2209*28c10f9eSGabriel Fernandez if (freq == 0) 2210*28c10f9eSGabriel Fernandez return 0; 2211*28c10f9eSGabriel Fernandez 2212*28c10f9eSGabriel Fernandez switch (prediv) { 2213*28c10f9eSGabriel Fernandez case 0x0: 2214*28c10f9eSGabriel Fernandez break; 2215*28c10f9eSGabriel Fernandez 2216*28c10f9eSGabriel Fernandez case 0x1: 2217*28c10f9eSGabriel Fernandez freq /= 2; 2218*28c10f9eSGabriel Fernandez break; 2219*28c10f9eSGabriel Fernandez 2220*28c10f9eSGabriel Fernandez case 0x3: 2221*28c10f9eSGabriel Fernandez freq /= 4; 2222*28c10f9eSGabriel Fernandez break; 2223*28c10f9eSGabriel Fernandez 2224*28c10f9eSGabriel Fernandez case 0x3FF: 2225*28c10f9eSGabriel Fernandez freq /= 1024; 2226*28c10f9eSGabriel Fernandez break; 2227*28c10f9eSGabriel Fernandez 2228*28c10f9eSGabriel Fernandez default: 2229*28c10f9eSGabriel Fernandez EMSG("Unsupported PREDIV value (%#"PRIx32")", prediv); 2230*28c10f9eSGabriel Fernandez panic(); 2231*28c10f9eSGabriel Fernandez break; 2232*28c10f9eSGabriel Fernandez } 2233*28c10f9eSGabriel Fernandez 2234*28c10f9eSGabriel Fernandez freq /= findiv + 1; 2235*28c10f9eSGabriel Fernandez 2236*28c10f9eSGabriel Fernandez return freq; 2237*28c10f9eSGabriel Fernandez } 2238*28c10f9eSGabriel Fernandez 2239*28c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_round_rate(unsigned long rate, 2240*28c10f9eSGabriel Fernandez unsigned long prate, 2241*28c10f9eSGabriel Fernandez unsigned int *prediv, 2242*28c10f9eSGabriel Fernandez unsigned int *findiv) 2243*28c10f9eSGabriel Fernandez { 2244*28c10f9eSGabriel Fernandez unsigned int pre_val[] = { 0x0, 0x1, 0x3, 0x3FF }; 2245*28c10f9eSGabriel Fernandez unsigned int pre_div[] = { 1, 2, 4, 1024 }; 2246*28c10f9eSGabriel Fernandez long best_diff = LONG_MAX; 2247*28c10f9eSGabriel Fernandez unsigned int i = 0; 2248*28c10f9eSGabriel Fernandez 2249*28c10f9eSGabriel Fernandez *prediv = 0; 2250*28c10f9eSGabriel Fernandez *findiv = 0; 2251*28c10f9eSGabriel Fernandez 2252*28c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(pre_div); i++) { 2253*28c10f9eSGabriel Fernandez unsigned long freq = 0; 2254*28c10f9eSGabriel Fernandez unsigned long ratio = 0; 2255*28c10f9eSGabriel Fernandez long diff = 0L; 2256*28c10f9eSGabriel Fernandez 2257*28c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)prate, pre_div[i]); 2258*28c10f9eSGabriel Fernandez ratio = UDIV_ROUND_NEAREST((uint64_t)freq, rate); 2259*28c10f9eSGabriel Fernandez 2260*28c10f9eSGabriel Fernandez if (ratio == 0) 2261*28c10f9eSGabriel Fernandez ratio = 1; 2262*28c10f9eSGabriel Fernandez else if (ratio > 64) 2263*28c10f9eSGabriel Fernandez ratio = 64; 2264*28c10f9eSGabriel Fernandez 2265*28c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)freq, ratio); 2266*28c10f9eSGabriel Fernandez if (freq < rate) 2267*28c10f9eSGabriel Fernandez diff = rate - freq; 2268*28c10f9eSGabriel Fernandez else 2269*28c10f9eSGabriel Fernandez diff = freq - rate; 2270*28c10f9eSGabriel Fernandez 2271*28c10f9eSGabriel Fernandez if (diff < best_diff) { 2272*28c10f9eSGabriel Fernandez best_diff = diff; 2273*28c10f9eSGabriel Fernandez *prediv = pre_val[i]; 2274*28c10f9eSGabriel Fernandez *findiv = ratio - 1; 2275*28c10f9eSGabriel Fernandez 2276*28c10f9eSGabriel Fernandez if (diff == 0) 2277*28c10f9eSGabriel Fernandez break; 2278*28c10f9eSGabriel Fernandez } 2279*28c10f9eSGabriel Fernandez } 2280*28c10f9eSGabriel Fernandez 2281*28c10f9eSGabriel Fernandez return (prate / (*prediv + 1)) / (*findiv + 1); 2282*28c10f9eSGabriel Fernandez } 2283*28c10f9eSGabriel Fernandez 2284*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_rate(struct clk *clk, 2285*28c10f9eSGabriel Fernandez unsigned long rate, 2286*28c10f9eSGabriel Fernandez unsigned long parent_rate) 2287*28c10f9eSGabriel Fernandez { 2288*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 2289*28c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 2290*28c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 2291*28c10f9eSGabriel Fernandez unsigned int prediv = 0; 2292*28c10f9eSGabriel Fernandez unsigned int findiv = 0; 2293*28c10f9eSGabriel Fernandez 2294*28c10f9eSGabriel Fernandez clk_stm32_flexgen_get_round_rate(rate, parent_rate, &prediv, &findiv); 2295*28c10f9eSGabriel Fernandez 2296*28c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 2297*28c10f9eSGabriel Fernandez panic(); 2298*28c10f9eSGabriel Fernandez 2299*28c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel), 2300*28c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, 2301*28c10f9eSGabriel Fernandez prediv); 2302*28c10f9eSGabriel Fernandez 2303*28c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 2304*28c10f9eSGabriel Fernandez panic(); 2305*28c10f9eSGabriel Fernandez 2306*28c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 2307*28c10f9eSGabriel Fernandez panic(); 2308*28c10f9eSGabriel Fernandez 2309*28c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 2310*28c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK, 2311*28c10f9eSGabriel Fernandez findiv); 2312*28c10f9eSGabriel Fernandez 2313*28c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 2314*28c10f9eSGabriel Fernandez panic(); 2315*28c10f9eSGabriel Fernandez 2316*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 2317*28c10f9eSGabriel Fernandez } 2318*28c10f9eSGabriel Fernandez 2319*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_enable(struct clk *clk) 2320*28c10f9eSGabriel Fernandez { 2321*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 2322*28c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 2323*28c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 2324*28c10f9eSGabriel Fernandez 2325*28c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 2326*28c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN); 2327*28c10f9eSGabriel Fernandez 2328*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 2329*28c10f9eSGabriel Fernandez } 2330*28c10f9eSGabriel Fernandez 2331*28c10f9eSGabriel Fernandez static void clk_stm32_flexgen_disable(struct clk *clk) 2332*28c10f9eSGabriel Fernandez { 2333*28c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 2334*28c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 2335*28c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 2336*28c10f9eSGabriel Fernandez 2337*28c10f9eSGabriel Fernandez io_clrbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 2338*28c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN); 2339*28c10f9eSGabriel Fernandez } 2340*28c10f9eSGabriel Fernandez 2341*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_flexgen_ops = { 2342*28c10f9eSGabriel Fernandez .get_rate = clk_stm32_flexgen_get_rate, 2343*28c10f9eSGabriel Fernandez .set_rate = clk_stm32_flexgen_set_rate, 2344*28c10f9eSGabriel Fernandez .get_parent = clk_stm32_flexgen_get_parent, 2345*28c10f9eSGabriel Fernandez .set_parent = clk_stm32_flexgen_set_parent, 2346*28c10f9eSGabriel Fernandez .enable = clk_stm32_flexgen_enable, 2347*28c10f9eSGabriel Fernandez .disable = clk_stm32_flexgen_disable, 2348*28c10f9eSGabriel Fernandez }; 2349*28c10f9eSGabriel Fernandez 2350*28c10f9eSGabriel Fernandez static size_t clk_cpu1_get_parent(struct clk *clk __unused) 2351*28c10f9eSGabriel Fernandez { 2352*28c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ); 2353*28c10f9eSGabriel Fernandez 2354*28c10f9eSGabriel Fernandez return (reg & A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) >> 2355*28c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_SHIFT; 2356*28c10f9eSGabriel Fernandez } 2357*28c10f9eSGabriel Fernandez 2358*28c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_cpu1_ops = { 2359*28c10f9eSGabriel Fernandez .get_parent = clk_cpu1_get_parent, 2360*28c10f9eSGabriel Fernandez }; 2361*28c10f9eSGabriel Fernandez 2362*28c10f9eSGabriel Fernandez #define APB_DIV_MASK GENMASK_32(2, 0) 2363*28c10f9eSGabriel Fernandez #define TIM_PRE_MASK BIT(0) 2364*28c10f9eSGabriel Fernandez 2365*28c10f9eSGabriel Fernandez static unsigned long ck_timer_get_rate_ops(struct clk *clk, unsigned long prate) 2366*28c10f9eSGabriel Fernandez { 2367*28c10f9eSGabriel Fernandez struct clk_stm32_timer_cfg *cfg = clk->priv; 2368*28c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 2369*28c10f9eSGabriel Fernandez uint32_t prescaler = 0; 2370*28c10f9eSGabriel Fernandez uint32_t timpre = 0; 2371*28c10f9eSGabriel Fernandez 2372*28c10f9eSGabriel Fernandez prescaler = io_read32(rcc_base + cfg->apbdiv) & APB_DIV_MASK; 2373*28c10f9eSGabriel Fernandez 2374*28c10f9eSGabriel Fernandez timpre = io_read32(rcc_base + cfg->timpre) & TIM_PRE_MASK; 2375*28c10f9eSGabriel Fernandez 2376*28c10f9eSGabriel Fernandez if (prescaler == 0) 2377*28c10f9eSGabriel Fernandez return prate; 2378*28c10f9eSGabriel Fernandez 2379*28c10f9eSGabriel Fernandez return prate * (timpre + 1) * 2; 2380*28c10f9eSGabriel Fernandez }; 2381*28c10f9eSGabriel Fernandez 2382*28c10f9eSGabriel Fernandez static const struct clk_ops ck_timer_ops = { 2383*28c10f9eSGabriel Fernandez .get_rate = ck_timer_get_rate_ops, 2384*28c10f9eSGabriel Fernandez }; 2385*28c10f9eSGabriel Fernandez 2386*28c10f9eSGabriel Fernandez #define PLL_PARENTS { &ck_hsi, &ck_hse, &ck_msi } 2387*28c10f9eSGabriel Fernandez #define PLL_NUM_PATENTS 3 2388*28c10f9eSGabriel Fernandez 2389*28c10f9eSGabriel Fernandez #define STM32_OSC(_name, _flags, _gate_id)\ 2390*28c10f9eSGabriel Fernandez struct clk _name = {\ 2391*28c10f9eSGabriel Fernandez .ops = &clk_stm32_osc_ops,\ 2392*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 2393*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 2394*28c10f9eSGabriel Fernandez },\ 2395*28c10f9eSGabriel Fernandez .name = #_name,\ 2396*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2397*28c10f9eSGabriel Fernandez .num_parents = 1,\ 2398*28c10f9eSGabriel Fernandez .parents = { NULL },\ 2399*28c10f9eSGabriel Fernandez } 2400*28c10f9eSGabriel Fernandez 2401*28c10f9eSGabriel Fernandez #define STM32_OSC_MSI(_name, _flags, _gate_id)\ 2402*28c10f9eSGabriel Fernandez struct clk _name = {\ 2403*28c10f9eSGabriel Fernandez .ops = &clk_stm32_oscillator_msi_ops,\ 2404*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 2405*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 2406*28c10f9eSGabriel Fernandez },\ 2407*28c10f9eSGabriel Fernandez .name = #_name,\ 2408*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2409*28c10f9eSGabriel Fernandez .num_parents = 1,\ 2410*28c10f9eSGabriel Fernandez .parents = { NULL },\ 2411*28c10f9eSGabriel Fernandez } 2412*28c10f9eSGabriel Fernandez 2413*28c10f9eSGabriel Fernandez #define STM32_HSE_DIV2(_name, _parent, _flags, _gate_id)\ 2414*28c10f9eSGabriel Fernandez struct clk _name = {\ 2415*28c10f9eSGabriel Fernandez .ops = &clk_hsediv2_ops,\ 2416*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 2417*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 2418*28c10f9eSGabriel Fernandez },\ 2419*28c10f9eSGabriel Fernandez .name = #_name,\ 2420*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2421*28c10f9eSGabriel Fernandez .num_parents = 1,\ 2422*28c10f9eSGabriel Fernandez .parents = { (_parent) },\ 2423*28c10f9eSGabriel Fernandez } 2424*28c10f9eSGabriel Fernandez 2425*28c10f9eSGabriel Fernandez #define STM32_HSE_RTC(_name, _parent, _flags, _div_id)\ 2426*28c10f9eSGabriel Fernandez struct clk _name = {\ 2427*28c10f9eSGabriel Fernandez .ops = &clk_stm32_hse_div_ops,\ 2428*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_div_cfg){\ 2429*28c10f9eSGabriel Fernandez .div_id = (_div_id),\ 2430*28c10f9eSGabriel Fernandez },\ 2431*28c10f9eSGabriel Fernandez .name = #_name,\ 2432*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2433*28c10f9eSGabriel Fernandez .num_parents = 1,\ 2434*28c10f9eSGabriel Fernandez .parents = { (_parent) },\ 2435*28c10f9eSGabriel Fernandez } 2436*28c10f9eSGabriel Fernandez 2437*28c10f9eSGabriel Fernandez #define STM32_PLL1(_name, _flags, _mux_id)\ 2438*28c10f9eSGabriel Fernandez struct clk _name = {\ 2439*28c10f9eSGabriel Fernandez .ops = &clk_stm32_pll1_ops,\ 2440*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 2441*28c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 2442*28c10f9eSGabriel Fernandez },\ 2443*28c10f9eSGabriel Fernandez .name = #_name,\ 2444*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2445*28c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 2446*28c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 2447*28c10f9eSGabriel Fernandez } 2448*28c10f9eSGabriel Fernandez 2449*28c10f9eSGabriel Fernandez #define STM32_PLL2(_name, _flags, _reg, _gate_id, _mux_id)\ 2450*28c10f9eSGabriel Fernandez struct clk _name = {\ 2451*28c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\ 2452*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 2453*28c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 2454*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 2455*28c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 2456*28c10f9eSGabriel Fernandez },\ 2457*28c10f9eSGabriel Fernandez .name = #_name,\ 2458*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2459*28c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 2460*28c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 2461*28c10f9eSGabriel Fernandez } 2462*28c10f9eSGabriel Fernandez 2463*28c10f9eSGabriel Fernandez #define STM32_PLL3(_name, _flags, _reg, _gate_id, _mux_id)\ 2464*28c10f9eSGabriel Fernandez struct clk _name = {\ 2465*28c10f9eSGabriel Fernandez .ops = &clk_stm32_pll3_ops,\ 2466*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 2467*28c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 2468*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 2469*28c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 2470*28c10f9eSGabriel Fernandez },\ 2471*28c10f9eSGabriel Fernandez .name = #_name,\ 2472*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2473*28c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 2474*28c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 2475*28c10f9eSGabriel Fernandez } 2476*28c10f9eSGabriel Fernandez 2477*28c10f9eSGabriel Fernandez #define STM32_PLLS(_name, _flags, _reg, _gate_id, _mux_id)\ 2478*28c10f9eSGabriel Fernandez struct clk _name = {\ 2479*28c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\ 2480*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 2481*28c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 2482*28c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 2483*28c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 2484*28c10f9eSGabriel Fernandez },\ 2485*28c10f9eSGabriel Fernandez .name = #_name,\ 2486*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2487*28c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 2488*28c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 2489*28c10f9eSGabriel Fernandez } 2490*28c10f9eSGabriel Fernandez 2491*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_off, RCC_0_MHZ); 2492*28c10f9eSGabriel Fernandez 2493*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser0, 0); 2494*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser1, 0); 2495*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(spdifsymb, 0); 2496*28c10f9eSGabriel Fernandez static STM32_FIXED_RATE(txbyteclk, 27000000); 2497*28c10f9eSGabriel Fernandez 2498*28c10f9eSGabriel Fernandez /* Oscillator clocks */ 2499*28c10f9eSGabriel Fernandez static STM32_OSC(ck_hsi, 0, GATE_HSI); 2500*28c10f9eSGabriel Fernandez static STM32_OSC(ck_hse, 0, GATE_HSE); 2501*28c10f9eSGabriel Fernandez static STM32_OSC_MSI(ck_msi, 0, GATE_MSI); 2502*28c10f9eSGabriel Fernandez static STM32_OSC(ck_lsi, 0, GATE_LSI); 2503*28c10f9eSGabriel Fernandez static STM32_OSC(ck_lse, 0, GATE_LSE); 2504*28c10f9eSGabriel Fernandez 2505*28c10f9eSGabriel Fernandez static STM32_HSE_DIV2(ck_hse_div2, &ck_hse, 0, GATE_HSEDIV2); 2506*28c10f9eSGabriel Fernandez static STM32_HSE_RTC(ck_hse_rtc, &ck_hse, 0, DIV_RTC); 2507*28c10f9eSGabriel Fernandez 2508*28c10f9eSGabriel Fernandez static STM32_FIXED_FACTOR(i2sckin, NULL, 0, 1, 1); 2509*28c10f9eSGabriel Fernandez 2510*28c10f9eSGabriel Fernandez static STM32_PLL1(ck_pll1, 0, MUX_MUXSEL5); 2511*28c10f9eSGabriel Fernandez static STM32_PLL2(ck_pll2, 0, RCC_PLL2CFGR1, GATE_PLL2, MUX_MUXSEL6); 2512*28c10f9eSGabriel Fernandez static STM32_PLL3(ck_pll3, 0, RCC_PLL3CFGR1, GATE_PLL3, MUX_MUXSEL7); 2513*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll4, 0, RCC_PLL4CFGR1, GATE_PLL4, MUX_MUXSEL0); 2514*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll5, 0, RCC_PLL5CFGR1, GATE_PLL5, MUX_MUXSEL1); 2515*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll6, 0, RCC_PLL6CFGR1, GATE_PLL6, MUX_MUXSEL2); 2516*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll7, 0, RCC_PLL7CFGR1, GATE_PLL7, MUX_MUXSEL3); 2517*28c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll8, 0, RCC_PLL8CFGR1, GATE_PLL8, MUX_MUXSEL4); 2518*28c10f9eSGabriel Fernandez 2519*28c10f9eSGabriel Fernandez #define STM32_FLEXGEN(_name, _flags, _flex_id)\ 2520*28c10f9eSGabriel Fernandez struct clk _name = {\ 2521*28c10f9eSGabriel Fernandez .ops = &clk_stm32_flexgen_ops,\ 2522*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_flexgen_cfg){\ 2523*28c10f9eSGabriel Fernandez .flex_id = (_flex_id),\ 2524*28c10f9eSGabriel Fernandez },\ 2525*28c10f9eSGabriel Fernandez .name = #_name,\ 2526*28c10f9eSGabriel Fernandez .flags = (_flags) | CLK_SET_RATE_UNGATE,\ 2527*28c10f9eSGabriel Fernandez .num_parents = 15,\ 2528*28c10f9eSGabriel Fernandez .parents = {\ 2529*28c10f9eSGabriel Fernandez &ck_pll4, &ck_pll5, &ck_pll6, &ck_pll7, &ck_pll8,\ 2530*28c10f9eSGabriel Fernandez &ck_hsi, &ck_hse, &ck_msi, &ck_hsi, &ck_hse, &ck_msi,\ 2531*28c10f9eSGabriel Fernandez &spdifsymb, &i2sckin, &ck_lsi, &ck_lse\ 2532*28c10f9eSGabriel Fernandez },\ 2533*28c10f9eSGabriel Fernandez } 2534*28c10f9eSGabriel Fernandez 2535*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hs_mcu, 0, 0); 2536*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_sdmmc, 0, 1); 2537*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_ddr, 0, 2); 2538*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_display, 0, 3); 2539*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hsl, 0, 4); 2540*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_nic, 0, 5); 2541*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_vid, 0, 6); 2542*28c10f9eSGabriel Fernandez 2543*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_ls_mcu, &ck_icn_hs_mcu, 0, DIV_LSMCU); 2544*28c10f9eSGabriel Fernandez 2545*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_07, 0, 7); 2546*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_08, 0, 8); 2547*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_09, 0, 9); 2548*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_10, 0, 10); 2549*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_11, 0, 11); 2550*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_12, 0, 12); 2551*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_13, 0, 13); 2552*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_14, 0, 14); 2553*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_15, 0, 15); 2554*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_16, 0, 16); 2555*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_17, 0, 17); 2556*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_18, 0, 18); 2557*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_19, 0, 19); 2558*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_20, 0, 20); 2559*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_21, 0, 21); 2560*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_22, 0, 22); 2561*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_23, 0, 23); 2562*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_24, 0, 24); 2563*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_25, 0, 25); 2564*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_26, 0, 26); 2565*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_27, 0, 27); 2566*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_28, 0, 28); 2567*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_29, 0, 29); 2568*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_30, 0, 30); 2569*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_31, 0, 31); 2570*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_32, 0, 32); 2571*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_33, 0, 33); 2572*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_34, 0, 34); 2573*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_35, 0, 35); 2574*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_36, 0, 36); 2575*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_37, 0, 37); 2576*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_38, 0, 38); 2577*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_39, 0, 39); 2578*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_40, 0, 40); 2579*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_41, 0, 41); 2580*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_42, 0, 42); 2581*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_43, 0, 43); 2582*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_44, 0, 44); 2583*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_45, 0, 45); 2584*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_46, 0, 46); 2585*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_47, 0, 47); 2586*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_48, 0, 48); 2587*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_49, 0, 49); 2588*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_50, 0, 50); 2589*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_51, 0, 51); 2590*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_52, 0, 52); 2591*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_53, 0, 53); 2592*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_54, 0, 54); 2593*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_55, 0, 55); 2594*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_56, 0, 56); 2595*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_57, 0, 57); 2596*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_58, 0, 58); 2597*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_59, 0, 59); 2598*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_60, 0, 60); 2599*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_61, 0, 61); 2600*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_62, 0, 62); 2601*28c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_63, 0, 63); 2602*28c10f9eSGabriel Fernandez 2603*28c10f9eSGabriel Fernandez static struct clk ck_cpu1 = { 2604*28c10f9eSGabriel Fernandez .ops = &clk_stm32_cpu1_ops, 2605*28c10f9eSGabriel Fernandez .name = "ck_cpu1", 2606*28c10f9eSGabriel Fernandez .flags = CLK_SET_RATE_PARENT, 2607*28c10f9eSGabriel Fernandez .num_parents = 2, 2608*28c10f9eSGabriel Fernandez .parents = { &ck_pll1, &ck_flexgen_63 }, 2609*28c10f9eSGabriel Fernandez }; 2610*28c10f9eSGabriel Fernandez 2611*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb1, &ck_icn_ls_mcu, 0, DIV_APB1); 2612*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb2, &ck_icn_ls_mcu, 0, DIV_APB2); 2613*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb3, &ck_icn_ls_mcu, 0, DIV_APB3); 2614*28c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb4, &ck_icn_ls_mcu, 0, DIV_APB4); 2615*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_icn_apbdbg, 1, { &ck_icn_ls_mcu }, 0, 2616*28c10f9eSGabriel Fernandez GATE_DBG, DIV_APBDBG, NO_MUX); 2617*28c10f9eSGabriel Fernandez 2618*28c10f9eSGabriel Fernandez #define STM32_TIMER(_name, _parent, _flags, _apbdiv, _timpre)\ 2619*28c10f9eSGabriel Fernandez struct clk _name = {\ 2620*28c10f9eSGabriel Fernandez .ops = &ck_timer_ops,\ 2621*28c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_timer_cfg){\ 2622*28c10f9eSGabriel Fernandez .apbdiv = (_apbdiv),\ 2623*28c10f9eSGabriel Fernandez .timpre = (_timpre),\ 2624*28c10f9eSGabriel Fernandez },\ 2625*28c10f9eSGabriel Fernandez .name = #_name,\ 2626*28c10f9eSGabriel Fernandez .flags = (_flags),\ 2627*28c10f9eSGabriel Fernandez .num_parents = 1,\ 2628*28c10f9eSGabriel Fernandez .parents = { _parent },\ 2629*28c10f9eSGabriel Fernandez } 2630*28c10f9eSGabriel Fernandez 2631*28c10f9eSGabriel Fernandez /* Kernel Timers */ 2632*28c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg1, &ck_icn_apb1, 0, RCC_APB1DIVR, RCC_TIMG1PRER); 2633*28c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg2, &ck_icn_apb2, 0, RCC_APB2DIVR, RCC_TIMG2PRER); 2634*28c10f9eSGabriel Fernandez 2635*28c10f9eSGabriel Fernandez /* Clocks under RCC RIF protection */ 2636*28c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_dbg, &ck_icn_apbdbg, 0, GATE_DBG); 2637*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stm, &ck_icn_apbdbg, 0, GATE_STM); 2638*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_stm, &ck_icn_ls_mcu, 0, GATE_STM); 2639*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tsdbg, &ck_flexgen_43, 0, GATE_DBG); 2640*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tpiu, &ck_flexgen_44, 0, GATE_TRACE); 2641*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_etr, &ck_icn_apbdbg, 0, GATE_ETR); 2642*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_etr, &ck_flexgen_45, 0, GATE_ETR); 2643*28c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_atb, &ck_flexgen_45, 0, GATE_DBG); 2644*28c10f9eSGabriel Fernandez 2645*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sysram, &ck_icn_hs_mcu, 0, GATE_SYSRAM); 2646*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_vderam, &ck_icn_hs_mcu, 0, GATE_VDERAM); 2647*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_retram, &ck_icn_hs_mcu, 0, GATE_RETRAM); 2648*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_bkpsram, &ck_icn_ls_mcu, 0, GATE_BKPSRAM); 2649*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram1, &ck_icn_hs_mcu, 0, GATE_SRAM1); 2650*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram2, &ck_icn_hs_mcu, 0, GATE_SRAM2); 2651*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram1, &ck_icn_ls_mcu, 0, GATE_LPSRAM1); 2652*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram2, &ck_icn_ls_mcu, 0, GATE_LPSRAM2); 2653*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram3, &ck_icn_ls_mcu, 0, GATE_LPSRAM3); 2654*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma1, &ck_icn_ls_mcu, 0, GATE_HPDMA1); 2655*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma2, &ck_icn_ls_mcu, 0, GATE_HPDMA2); 2656*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma3, &ck_icn_ls_mcu, 0, GATE_HPDMA3); 2657*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpdma, &ck_icn_ls_mcu, 0, GATE_LPDMA); 2658*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc1, &ck_icn_ls_mcu, 0, GATE_IPCC1); 2659*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc2, &ck_icn_ls_mcu, 0, GATE_IPCC2); 2660*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hsem, &ck_icn_ls_mcu, 0, GATE_HSEM); 2661*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioa, &ck_icn_ls_mcu, 0, GATE_GPIOA); 2662*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiob, &ck_icn_ls_mcu, 0, GATE_GPIOB); 2663*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioc, &ck_icn_ls_mcu, 0, GATE_GPIOC); 2664*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiod, &ck_icn_ls_mcu, 0, GATE_GPIOD); 2665*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioe, &ck_icn_ls_mcu, 0, GATE_GPIOE); 2666*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiof, &ck_icn_ls_mcu, 0, GATE_GPIOF); 2667*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiog, &ck_icn_ls_mcu, 0, GATE_GPIOG); 2668*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioh, &ck_icn_ls_mcu, 0, GATE_GPIOH); 2669*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioi, &ck_icn_ls_mcu, 0, GATE_GPIOI); 2670*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioj, &ck_icn_ls_mcu, 0, GATE_GPIOJ); 2671*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiok, &ck_icn_ls_mcu, 0, GATE_GPIOK); 2672*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioz, &ck_icn_ls_mcu, 0, GATE_GPIOZ); 2673*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rtc, &ck_icn_ls_mcu, 0, GATE_RTC); 2674*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_rtc, 4, 2675*28c10f9eSGabriel Fernandez PARENT(&ck_off, &ck_lse, &ck_lsi, &ck_hse_rtc), 2676*28c10f9eSGabriel Fernandez 0, GATE_RTCCK, NO_DIV, MUX_RTC); 2677*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_bsec, &ck_icn_apb3, 0, GATE_BSEC); 2678*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrphyc, &ck_icn_ls_mcu, 0, GATE_DDRPHYCAPB); 2679*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_risaf4, &ck_icn_ls_mcu, 0, GATE_DDRCP); 2680*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ddr, &ck_icn_ddr, 0, GATE_DDRCP); 2681*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrc, &ck_icn_apb4, 0, GATE_DDRCAPB); 2682*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrcfg, &ck_icn_apb4, 0, GATE_DDRCFG); 2683*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_syscpu1, &ck_icn_ls_mcu, 0, GATE_SYSCPU1); 2684*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_is2m, &ck_icn_apb3, 0, GATE_IS2M); 2685*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco1, 2, PARENT(&ck_flexgen_61, &ck_obser0), 0, 2686*28c10f9eSGabriel Fernandez GATE_MCO1, NO_DIV, MUX_MCO1); 2687*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco2, 2, PARENT(&ck_flexgen_62, &ck_obser1), 0, 2688*28c10f9eSGabriel Fernandez GATE_MCO2, NO_DIV, MUX_MCO2); 2689*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi1, &ck_icn_hs_mcu, 0, GATE_OSPI1); 2690*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi1, &ck_flexgen_48, 0, GATE_OSPI1); 2691*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi2, &ck_icn_hs_mcu, 0, GATE_OSPI2); 2692*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi2, &ck_flexgen_49, 0, GATE_OSPI2); 2693*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fmc, &ck_icn_ls_mcu, 0, GATE_FMC); 2694*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fmc, &ck_flexgen_50, 0, GATE_FMC); 2695*28c10f9eSGabriel Fernandez 2696*28c10f9eSGabriel Fernandez /* Kernel Clocks */ 2697*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cci, &ck_icn_ls_mcu, 0, GATE_CCI); 2698*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_crc, &ck_icn_ls_mcu, 0, GATE_CRC); 2699*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ospiiom, &ck_icn_ls_mcu, 0, GATE_OSPIIOM); 2700*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hash, &ck_icn_ls_mcu, 0, GATE_HASH); 2701*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rng, &ck_icn_ls_mcu, 0, GATE_RNG); 2702*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp1, &ck_icn_ls_mcu, 0, GATE_CRYP1); 2703*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp2, &ck_icn_ls_mcu, 0, GATE_CRYP2); 2704*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_saes, &ck_icn_ls_mcu, 0, GATE_SAES); 2705*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pka, &ck_icn_ls_mcu, 0, GATE_PKA); 2706*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adf1, &ck_icn_ls_mcu, 0, GATE_ADF1); 2707*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg5, &ck_icn_ls_mcu, 0, GATE_IWDG5); 2708*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg2, &ck_icn_ls_mcu, 0, GATE_WWDG2); 2709*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth1, &ck_icn_ls_mcu, 0, GATE_ETH1); 2710*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ethsw, &ck_icn_ls_mcu, 0, GATE_ETHSWMAC); 2711*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth2, &ck_icn_ls_mcu, 0, GATE_ETH2); 2712*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pcie, &ck_icn_ls_mcu, 0, GATE_PCIE); 2713*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc12, &ck_icn_ls_mcu, 0, GATE_ADC12); 2714*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc3, &ck_icn_ls_mcu, 0, GATE_ADC3); 2715*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_mdf1, &ck_icn_ls_mcu, 0, GATE_MDF1); 2716*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi8, &ck_icn_ls_mcu, 0, GATE_SPI8); 2717*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpuart1, &ck_icn_ls_mcu, 0, GATE_LPUART1); 2718*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c8, &ck_icn_ls_mcu, 0, GATE_I2C8); 2719*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim3, &ck_icn_ls_mcu, 0, GATE_LPTIM3); 2720*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim4, &ck_icn_ls_mcu, 0, GATE_LPTIM4); 2721*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim5, &ck_icn_ls_mcu, 0, GATE_LPTIM5); 2722*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc1, &ck_icn_sdmmc, 0, GATE_SDMMC1); 2723*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc2, &ck_icn_sdmmc, 0, GATE_SDMMC2); 2724*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc3, &ck_icn_sdmmc, 0, GATE_SDMMC3); 2725*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ohci, &ck_icn_hsl, 0, GATE_USB2); 2726*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ehci, &ck_icn_hsl, 0, GATE_USB2); 2727*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb3dr, &ck_icn_hsl, 0, GATE_USB3DR); 2728*28c10f9eSGabriel Fernandez 2729*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim2, &ck_icn_apb1, 0, GATE_TIM2); 2730*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim3, &ck_icn_apb1, 0, GATE_TIM3); 2731*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim4, &ck_icn_apb1, 0, GATE_TIM4); 2732*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim5, &ck_icn_apb1, 0, GATE_TIM5); 2733*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim6, &ck_icn_apb1, 0, GATE_TIM6); 2734*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim7, &ck_icn_apb1, 0, GATE_TIM7); 2735*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim10, &ck_icn_apb1, 0, GATE_TIM10); 2736*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim11, &ck_icn_apb1, 0, GATE_TIM11); 2737*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim12, &ck_icn_apb1, 0, GATE_TIM12); 2738*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim13, &ck_icn_apb1, 0, GATE_TIM13); 2739*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim14, &ck_icn_apb1, 0, GATE_TIM14); 2740*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim1, &ck_icn_apb1, 0, GATE_LPTIM1); 2741*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim2, &ck_icn_apb1, 0, GATE_LPTIM2); 2742*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi2, &ck_icn_apb1, 0, GATE_SPI2); 2743*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi3, &ck_icn_apb1, 0, GATE_SPI3); 2744*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spdifrx, &ck_icn_apb1, 0, GATE_SPDIFRX); 2745*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart2, &ck_icn_apb1, 0, GATE_USART2); 2746*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart3, &ck_icn_apb1, 0, GATE_USART3); 2747*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart4, &ck_icn_apb1, 0, GATE_UART4); 2748*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart5, &ck_icn_apb1, 0, GATE_UART5); 2749*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c1, &ck_icn_apb1, 0, GATE_I2C1); 2750*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c2, &ck_icn_apb1, 0, GATE_I2C2); 2751*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c3, &ck_icn_apb1, 0, GATE_I2C3); 2752*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c4, &ck_icn_apb1, 0, GATE_I2C4); 2753*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c5, &ck_icn_apb1, 0, GATE_I2C5); 2754*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c6, &ck_icn_apb1, 0, GATE_I2C6); 2755*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c7, &ck_icn_apb1, 0, GATE_I2C7); 2756*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c1, &ck_icn_apb1, 0, GATE_I3C1); 2757*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c2, &ck_icn_apb1, 0, GATE_I3C2); 2758*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c3, &ck_icn_apb1, 0, GATE_I3C3); 2759*28c10f9eSGabriel Fernandez 2760*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c4, &ck_icn_ls_mcu, 0, GATE_I3C4); 2761*28c10f9eSGabriel Fernandez 2762*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim1, &ck_icn_apb2, 0, GATE_TIM1); 2763*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim8, &ck_icn_apb2, 0, GATE_TIM8); 2764*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim15, &ck_icn_apb2, 0, GATE_TIM15); 2765*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim16, &ck_icn_apb2, 0, GATE_TIM16); 2766*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim17, &ck_icn_apb2, 0, GATE_TIM17); 2767*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim20, &ck_icn_apb2, 0, GATE_TIM20); 2768*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai1, &ck_icn_apb2, 0, GATE_SAI1); 2769*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai2, &ck_icn_apb2, 0, GATE_SAI2); 2770*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai3, &ck_icn_apb2, 0, GATE_SAI3); 2771*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai4, &ck_icn_apb2, 0, GATE_SAI4); 2772*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart1, &ck_icn_apb2, 0, GATE_USART1); 2773*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart6, &ck_icn_apb2, 0, GATE_USART6); 2774*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart7, &ck_icn_apb2, 0, GATE_UART7); 2775*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart8, &ck_icn_apb2, 0, GATE_UART8); 2776*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart9, &ck_icn_apb2, 0, GATE_UART9); 2777*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fdcan, &ck_icn_apb2, 0, GATE_FDCAN); 2778*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi1, &ck_icn_apb2, 0, GATE_SPI1); 2779*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi4, &ck_icn_apb2, 0, GATE_SPI4); 2780*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi5, &ck_icn_apb2, 0, GATE_SPI5); 2781*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi6, &ck_icn_apb2, 0, GATE_SPI6); 2782*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi7, &ck_icn_apb2, 0, GATE_SPI7); 2783*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg1, &ck_icn_apb3, 0, GATE_IWDG1); 2784*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg2, &ck_icn_apb3, 0, GATE_IWDG2); 2785*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg3, &ck_icn_apb3, 0, GATE_IWDG3); 2786*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg4, &ck_icn_apb3, 0, GATE_IWDG4); 2787*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg1, &ck_icn_apb3, 0, GATE_WWDG1); 2788*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vref, &ck_icn_apb3, 0, GATE_VREF); 2789*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dts, &ck_icn_apb3, 0, GATE_DTS); 2790*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_serc, &ck_icn_apb3, 0, GATE_SERC); 2791*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hdp, &ck_icn_apb3, 0, GATE_HDP); 2792*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dsi, &ck_icn_apb4, 0, GATE_DSI); 2793*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ltdc, &ck_icn_apb4, 0, GATE_LTDC); 2794*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_csi, &ck_icn_apb4, 0, GATE_CSI); 2795*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dcmipp, &ck_icn_apb4, 0, GATE_DCMIPP); 2796*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lvds, &ck_icn_apb4, 0, GATE_LVDS); 2797*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gicv2m, &ck_icn_apb4, 0, GATE_GICV2M); 2798*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usbtc, &ck_icn_apb4, 0, GATE_USBTC); 2799*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usb3pciephy, &ck_icn_apb4, 0, GATE_USB3PCIEPHY); 2800*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stgen, &ck_icn_apb4, 0, GATE_STGEN); 2801*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vdec, &ck_icn_apb4, 0, GATE_VDEC); 2802*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_venc, &ck_icn_apb4, 0, GATE_VENC); 2803*28c10f9eSGabriel Fernandez 2804*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim2, &ck_timg1, 0, GATE_TIM2); 2805*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim3, &ck_timg1, 0, GATE_TIM3); 2806*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim4, &ck_timg1, 0, GATE_TIM4); 2807*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim5, &ck_timg1, 0, GATE_TIM5); 2808*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim6, &ck_timg1, 0, GATE_TIM6); 2809*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim7, &ck_timg1, 0, GATE_TIM7); 2810*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim10, &ck_timg1, 0, GATE_TIM10); 2811*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim11, &ck_timg1, 0, GATE_TIM11); 2812*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim12, &ck_timg1, 0, GATE_TIM12); 2813*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim13, &ck_timg1, 0, GATE_TIM13); 2814*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim14, &ck_timg1, 0, GATE_TIM14); 2815*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim1, &ck_timg2, 0, GATE_TIM1); 2816*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim8, &ck_timg2, 0, GATE_TIM8); 2817*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim15, &ck_timg2, 0, GATE_TIM15); 2818*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim16, &ck_timg2, 0, GATE_TIM16); 2819*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim17, &ck_timg2, 0, GATE_TIM17); 2820*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim20, &ck_timg2, 0, GATE_TIM20); 2821*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim1, &ck_flexgen_07, 0, GATE_LPTIM1); 2822*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim2, &ck_flexgen_07, 0, GATE_LPTIM2); 2823*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart2, &ck_flexgen_08, 0, GATE_USART2); 2824*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart4, &ck_flexgen_08, 0, GATE_UART4); 2825*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart3, &ck_flexgen_09, 0, GATE_USART3); 2826*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart5, &ck_flexgen_09, 0, GATE_UART5); 2827*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi2, &ck_flexgen_10, 0, GATE_SPI2); 2828*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi3, &ck_flexgen_10, 0, GATE_SPI3); 2829*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spdifrx, &ck_flexgen_11, 0, GATE_SPDIFRX); 2830*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c1, &ck_flexgen_12, 0, GATE_I2C1); 2831*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c2, &ck_flexgen_12, 0, GATE_I2C2); 2832*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c1, &ck_flexgen_12, 0, GATE_I3C1); 2833*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c2, &ck_flexgen_12, 0, GATE_I3C2); 2834*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c3, &ck_flexgen_13, 0, GATE_I2C3); 2835*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c5, &ck_flexgen_13, 0, GATE_I2C5); 2836*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c3, &ck_flexgen_13, 0, GATE_I3C3); 2837*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c4, &ck_flexgen_14, 0, GATE_I2C4); 2838*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c6, &ck_flexgen_14, 0, GATE_I2C6); 2839*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c7, &ck_flexgen_15, 0, GATE_I2C7); 2840*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi1, &ck_flexgen_16, 0, GATE_SPI1); 2841*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi4, &ck_flexgen_17, 0, GATE_SPI4); 2842*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi5, &ck_flexgen_17, 0, GATE_SPI5); 2843*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi6, &ck_flexgen_18, 0, GATE_SPI6); 2844*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi7, &ck_flexgen_18, 0, GATE_SPI7); 2845*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart1, &ck_flexgen_19, 0, GATE_USART1); 2846*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart6, &ck_flexgen_20, 0, GATE_USART6); 2847*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart7, &ck_flexgen_21, 0, GATE_UART7); 2848*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart8, &ck_flexgen_21, 0, GATE_UART8); 2849*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart9, &ck_flexgen_22, 0, GATE_UART9); 2850*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_mdf1, &ck_flexgen_23, 0, GATE_MDF1); 2851*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai1, &ck_flexgen_23, 0, GATE_SAI1); 2852*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai2, &ck_flexgen_24, 0, GATE_SAI2); 2853*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai3, &ck_flexgen_25, 0, GATE_SAI3); 2854*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai4, &ck_flexgen_25, 0, GATE_SAI4); 2855*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fdcan, &ck_flexgen_26, 0, GATE_FDCAN); 2856*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csi, &ck_flexgen_29, 0, GATE_CSI); 2857*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csitxesc, &ck_flexgen_30, 0, GATE_CSI); 2858*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csiphy, &ck_flexgen_31, 0, GATE_CSI); 2859*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_stgen, &ck_flexgen_33, CLK_SET_RATE_PARENT, 2860*28c10f9eSGabriel Fernandez GATE_STGEN); 2861*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usbtc, &ck_flexgen_35, 0, GATE_USBTC); 2862*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c4, &ck_flexgen_36, 0, GATE_I3C4); 2863*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi8, &ck_flexgen_37, 0, GATE_SPI8); 2864*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c8, &ck_flexgen_38, 0, GATE_I2C8); 2865*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lpuart1, &ck_flexgen_39, 0, GATE_LPUART1); 2866*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim3, &ck_flexgen_40, 0, GATE_LPTIM3); 2867*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim4, &ck_flexgen_41, 0, GATE_LPTIM4); 2868*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim5, &ck_flexgen_41, 0, GATE_LPTIM5); 2869*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_adf1, &ck_flexgen_42, 0, GATE_ADF1); 2870*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc1, &ck_flexgen_51, 0, GATE_SDMMC1); 2871*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc2, &ck_flexgen_52, 0, GATE_SDMMC2); 2872*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc3, &ck_flexgen_53, 0, GATE_SDMMC3); 2873*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1, &ck_flexgen_54, 0, GATE_ETH1); 2874*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethsw, &ck_flexgen_54, 0, GATE_ETHSW); 2875*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2, &ck_flexgen_55, 0, GATE_ETH2); 2876*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1ptp, &ck_flexgen_56, 0, GATE_ETH1); 2877*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2ptp, &ck_flexgen_56, 0, GATE_ETH2); 2878*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usb2phy2, &ck_flexgen_58, 0, GATE_USB3DR); 2879*28c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_gpu, &ck_flexgen_59, 0, GATE_GPU); 2880*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_gpu, &ck_pll3, 0, GATE_GPU); 2881*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethswref, &ck_flexgen_60, 0, GATE_ETHSWREF); 2882*28c10f9eSGabriel Fernandez 2883*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1stp, &ck_icn_ls_mcu, 0, GATE_ETH1STP); 2884*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2stp, &ck_icn_ls_mcu, 0, GATE_ETH2STP); 2885*28c10f9eSGabriel Fernandez 2886*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ltdc, &ck_flexgen_27, CLK_SET_RATE_PARENT, 2887*28c10f9eSGabriel Fernandez GATE_LTDC); 2888*28c10f9eSGabriel Fernandez 2889*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc12, 2, PARENT(&ck_flexgen_46, &ck_icn_ls_mcu), 2890*28c10f9eSGabriel Fernandez 0, GATE_ADC12, NO_DIV, MUX_ADC12); 2891*28c10f9eSGabriel Fernandez 2892*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc3, 3, PARENT(&ck_flexgen_47, &ck_icn_ls_mcu, 2893*28c10f9eSGabriel Fernandez &ck_flexgen_46), 2894*28c10f9eSGabriel Fernandez 0, GATE_ADC3, NO_DIV, MUX_ADC3); 2895*28c10f9eSGabriel Fernandez 2896*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy1, 2, PARENT(&ck_flexgen_57, 2897*28c10f9eSGabriel Fernandez &ck_hse_div2), 2898*28c10f9eSGabriel Fernandez 0, GATE_USB2PHY1, NO_DIV, MUX_USB2PHY1); 2899*28c10f9eSGabriel Fernandez 2900*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy2_en, 2, PARENT(&ck_flexgen_58, 2901*28c10f9eSGabriel Fernandez &ck_hse_div2), 2902*28c10f9eSGabriel Fernandez 0, GATE_USB2PHY2, NO_DIV, MUX_USB2PHY2); 2903*28c10f9eSGabriel Fernandez 2904*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb3pciephy, 2, PARENT(&ck_flexgen_34, 2905*28c10f9eSGabriel Fernandez &ck_hse_div2), 2906*28c10f9eSGabriel Fernandez 0, GATE_USB3PCIEPHY, NO_DIV, MUX_USB3PCIEPHY); 2907*28c10f9eSGabriel Fernandez 2908*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(clk_lanebyte, 2, PARENT(&txbyteclk, &ck_ker_ltdc), 2909*28c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIBLANE); 2910*28c10f9eSGabriel Fernandez 2911*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_phy_dsi, 2, PARENT(&ck_flexgen_28, &ck_hse), 2912*28c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIPHY); 2913*28c10f9eSGabriel Fernandez 2914*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_lvdsphy, 2, PARENT(&ck_flexgen_32, &ck_hse), 2915*28c10f9eSGabriel Fernandez 0, GATE_LVDS, NO_DIV, MUX_LVDSPHY); 2916*28c10f9eSGabriel Fernandez 2917*28c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_dts, 3, PARENT(&ck_hsi, &ck_hse, &ck_msi), 2918*28c10f9eSGabriel Fernandez 0, GATE_DTS, NO_DIV, MUX_DTS); 2919*28c10f9eSGabriel Fernandez 2920*28c10f9eSGabriel Fernandez enum { 2921*28c10f9eSGabriel Fernandez CK_OFF = STM32MP25_LAST_CLK, 2922*28c10f9eSGabriel Fernandez I2SCKIN, 2923*28c10f9eSGabriel Fernandez SPDIFSYMB, 2924*28c10f9eSGabriel Fernandez CK_HSE_RTC, 2925*28c10f9eSGabriel Fernandez TXBYTECLK, 2926*28c10f9eSGabriel Fernandez CK_OBSER0, 2927*28c10f9eSGabriel Fernandez CK_OBSER1, 2928*28c10f9eSGabriel Fernandez STM32MP25_ALL_CLK_NB 2929*28c10f9eSGabriel Fernandez }; 2930*28c10f9eSGabriel Fernandez 2931*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1mac, &ck_icn_ls_mcu, 0, GATE_ETH1MAC); 2932*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1tx, &ck_icn_ls_mcu, 0, GATE_ETH1TX); 2933*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1rx, &ck_icn_ls_mcu, 0, GATE_ETH1RX); 2934*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2mac, &ck_icn_ls_mcu, 0, GATE_ETH2MAC); 2935*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2tx, &ck_icn_ls_mcu, 0, GATE_ETH2TX); 2936*28c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2rx, &ck_icn_ls_mcu, 0, GATE_ETH2RX); 2937*28c10f9eSGabriel Fernandez 2938*28c10f9eSGabriel Fernandez static struct clk *stm32mp25_clk_provided[STM32MP25_ALL_CLK_NB] = { 2939*28c10f9eSGabriel Fernandez [HSI_CK] = &ck_hsi, 2940*28c10f9eSGabriel Fernandez [HSE_CK] = &ck_hse, 2941*28c10f9eSGabriel Fernandez [MSI_CK] = &ck_msi, 2942*28c10f9eSGabriel Fernandez [LSI_CK] = &ck_lsi, 2943*28c10f9eSGabriel Fernandez [LSE_CK] = &ck_lse, 2944*28c10f9eSGabriel Fernandez 2945*28c10f9eSGabriel Fernandez [HSE_DIV2_CK] = &ck_hse_div2, 2946*28c10f9eSGabriel Fernandez 2947*28c10f9eSGabriel Fernandez [PLL1_CK] = &ck_pll1, 2948*28c10f9eSGabriel Fernandez [PLL2_CK] = &ck_pll2, 2949*28c10f9eSGabriel Fernandez [PLL3_CK] = &ck_pll3, 2950*28c10f9eSGabriel Fernandez [PLL4_CK] = &ck_pll4, 2951*28c10f9eSGabriel Fernandez [PLL5_CK] = &ck_pll5, 2952*28c10f9eSGabriel Fernandez [PLL6_CK] = &ck_pll6, 2953*28c10f9eSGabriel Fernandez [PLL7_CK] = &ck_pll7, 2954*28c10f9eSGabriel Fernandez [PLL8_CK] = &ck_pll8, 2955*28c10f9eSGabriel Fernandez 2956*28c10f9eSGabriel Fernandez [CK_ICN_HS_MCU] = &ck_icn_hs_mcu, 2957*28c10f9eSGabriel Fernandez [CK_ICN_LS_MCU] = &ck_icn_ls_mcu, 2958*28c10f9eSGabriel Fernandez 2959*28c10f9eSGabriel Fernandez [CK_ICN_SDMMC] = &ck_icn_sdmmc, 2960*28c10f9eSGabriel Fernandez [CK_ICN_DDR] = &ck_icn_ddr, 2961*28c10f9eSGabriel Fernandez [CK_ICN_DISPLAY] = &ck_icn_display, 2962*28c10f9eSGabriel Fernandez [CK_ICN_HSL] = &ck_icn_hsl, 2963*28c10f9eSGabriel Fernandez [CK_ICN_NIC] = &ck_icn_nic, 2964*28c10f9eSGabriel Fernandez [CK_ICN_VID] = &ck_icn_vid, 2965*28c10f9eSGabriel Fernandez [CK_FLEXGEN_07] = &ck_flexgen_07, 2966*28c10f9eSGabriel Fernandez [CK_FLEXGEN_08] = &ck_flexgen_08, 2967*28c10f9eSGabriel Fernandez [CK_FLEXGEN_09] = &ck_flexgen_09, 2968*28c10f9eSGabriel Fernandez [CK_FLEXGEN_10] = &ck_flexgen_10, 2969*28c10f9eSGabriel Fernandez [CK_FLEXGEN_11] = &ck_flexgen_11, 2970*28c10f9eSGabriel Fernandez [CK_FLEXGEN_12] = &ck_flexgen_12, 2971*28c10f9eSGabriel Fernandez [CK_FLEXGEN_13] = &ck_flexgen_13, 2972*28c10f9eSGabriel Fernandez [CK_FLEXGEN_14] = &ck_flexgen_14, 2973*28c10f9eSGabriel Fernandez [CK_FLEXGEN_15] = &ck_flexgen_15, 2974*28c10f9eSGabriel Fernandez [CK_FLEXGEN_16] = &ck_flexgen_16, 2975*28c10f9eSGabriel Fernandez [CK_FLEXGEN_17] = &ck_flexgen_17, 2976*28c10f9eSGabriel Fernandez [CK_FLEXGEN_18] = &ck_flexgen_18, 2977*28c10f9eSGabriel Fernandez [CK_FLEXGEN_19] = &ck_flexgen_19, 2978*28c10f9eSGabriel Fernandez [CK_FLEXGEN_20] = &ck_flexgen_20, 2979*28c10f9eSGabriel Fernandez [CK_FLEXGEN_21] = &ck_flexgen_21, 2980*28c10f9eSGabriel Fernandez [CK_FLEXGEN_22] = &ck_flexgen_22, 2981*28c10f9eSGabriel Fernandez [CK_FLEXGEN_23] = &ck_flexgen_23, 2982*28c10f9eSGabriel Fernandez [CK_FLEXGEN_24] = &ck_flexgen_24, 2983*28c10f9eSGabriel Fernandez [CK_FLEXGEN_25] = &ck_flexgen_25, 2984*28c10f9eSGabriel Fernandez [CK_FLEXGEN_26] = &ck_flexgen_26, 2985*28c10f9eSGabriel Fernandez [CK_FLEXGEN_27] = &ck_flexgen_27, 2986*28c10f9eSGabriel Fernandez [CK_FLEXGEN_28] = &ck_flexgen_28, 2987*28c10f9eSGabriel Fernandez [CK_FLEXGEN_29] = &ck_flexgen_29, 2988*28c10f9eSGabriel Fernandez [CK_FLEXGEN_30] = &ck_flexgen_30, 2989*28c10f9eSGabriel Fernandez [CK_FLEXGEN_31] = &ck_flexgen_31, 2990*28c10f9eSGabriel Fernandez [CK_FLEXGEN_32] = &ck_flexgen_32, 2991*28c10f9eSGabriel Fernandez [CK_FLEXGEN_33] = &ck_flexgen_33, 2992*28c10f9eSGabriel Fernandez [CK_FLEXGEN_34] = &ck_flexgen_34, 2993*28c10f9eSGabriel Fernandez [CK_FLEXGEN_35] = &ck_flexgen_35, 2994*28c10f9eSGabriel Fernandez [CK_FLEXGEN_36] = &ck_flexgen_36, 2995*28c10f9eSGabriel Fernandez [CK_FLEXGEN_37] = &ck_flexgen_37, 2996*28c10f9eSGabriel Fernandez [CK_FLEXGEN_38] = &ck_flexgen_38, 2997*28c10f9eSGabriel Fernandez [CK_FLEXGEN_39] = &ck_flexgen_39, 2998*28c10f9eSGabriel Fernandez [CK_FLEXGEN_40] = &ck_flexgen_40, 2999*28c10f9eSGabriel Fernandez [CK_FLEXGEN_41] = &ck_flexgen_41, 3000*28c10f9eSGabriel Fernandez [CK_FLEXGEN_42] = &ck_flexgen_42, 3001*28c10f9eSGabriel Fernandez [CK_FLEXGEN_43] = &ck_flexgen_43, 3002*28c10f9eSGabriel Fernandez [CK_FLEXGEN_44] = &ck_flexgen_44, 3003*28c10f9eSGabriel Fernandez [CK_FLEXGEN_45] = &ck_flexgen_45, 3004*28c10f9eSGabriel Fernandez [CK_FLEXGEN_46] = &ck_flexgen_46, 3005*28c10f9eSGabriel Fernandez [CK_FLEXGEN_47] = &ck_flexgen_47, 3006*28c10f9eSGabriel Fernandez [CK_FLEXGEN_48] = &ck_flexgen_48, 3007*28c10f9eSGabriel Fernandez [CK_FLEXGEN_49] = &ck_flexgen_49, 3008*28c10f9eSGabriel Fernandez [CK_FLEXGEN_50] = &ck_flexgen_50, 3009*28c10f9eSGabriel Fernandez [CK_FLEXGEN_51] = &ck_flexgen_51, 3010*28c10f9eSGabriel Fernandez [CK_FLEXGEN_52] = &ck_flexgen_52, 3011*28c10f9eSGabriel Fernandez [CK_FLEXGEN_53] = &ck_flexgen_53, 3012*28c10f9eSGabriel Fernandez [CK_FLEXGEN_54] = &ck_flexgen_54, 3013*28c10f9eSGabriel Fernandez [CK_FLEXGEN_55] = &ck_flexgen_55, 3014*28c10f9eSGabriel Fernandez [CK_FLEXGEN_56] = &ck_flexgen_56, 3015*28c10f9eSGabriel Fernandez [CK_FLEXGEN_57] = &ck_flexgen_57, 3016*28c10f9eSGabriel Fernandez [CK_FLEXGEN_58] = &ck_flexgen_58, 3017*28c10f9eSGabriel Fernandez [CK_FLEXGEN_59] = &ck_flexgen_59, 3018*28c10f9eSGabriel Fernandez [CK_FLEXGEN_60] = &ck_flexgen_60, 3019*28c10f9eSGabriel Fernandez [CK_FLEXGEN_61] = &ck_flexgen_61, 3020*28c10f9eSGabriel Fernandez [CK_FLEXGEN_62] = &ck_flexgen_62, 3021*28c10f9eSGabriel Fernandez [CK_FLEXGEN_63] = &ck_flexgen_63, 3022*28c10f9eSGabriel Fernandez 3023*28c10f9eSGabriel Fernandez [CK_CPU1] = &ck_cpu1, 3024*28c10f9eSGabriel Fernandez 3025*28c10f9eSGabriel Fernandez [CK_ICN_APB1] = &ck_icn_apb1, 3026*28c10f9eSGabriel Fernandez [CK_ICN_APB2] = &ck_icn_apb2, 3027*28c10f9eSGabriel Fernandez [CK_ICN_APB3] = &ck_icn_apb3, 3028*28c10f9eSGabriel Fernandez [CK_ICN_APB4] = &ck_icn_apb4, 3029*28c10f9eSGabriel Fernandez [CK_ICN_APBDBG] = &ck_icn_apbdbg, 3030*28c10f9eSGabriel Fernandez 3031*28c10f9eSGabriel Fernandez [TIMG1_CK] = &ck_timg1, 3032*28c10f9eSGabriel Fernandez [TIMG2_CK] = &ck_timg2, 3033*28c10f9eSGabriel Fernandez 3034*28c10f9eSGabriel Fernandez [CK_BUS_SYSRAM] = &ck_icn_s_sysram, 3035*28c10f9eSGabriel Fernandez [CK_BUS_VDERAM] = &ck_icn_s_vderam, 3036*28c10f9eSGabriel Fernandez [CK_BUS_RETRAM] = &ck_icn_s_retram, 3037*28c10f9eSGabriel Fernandez [CK_BUS_SRAM1] = &ck_icn_s_sram1, 3038*28c10f9eSGabriel Fernandez [CK_BUS_SRAM2] = &ck_icn_s_sram2, 3039*28c10f9eSGabriel Fernandez [CK_BUS_OSPI1] = &ck_icn_s_ospi1, 3040*28c10f9eSGabriel Fernandez [CK_BUS_OSPI2] = &ck_icn_s_ospi2, 3041*28c10f9eSGabriel Fernandez [CK_BUS_BKPSRAM] = &ck_icn_s_bkpsram, 3042*28c10f9eSGabriel Fernandez [CK_BUS_DDRPHYC] = &ck_icn_p_ddrphyc, 3043*28c10f9eSGabriel Fernandez [CK_BUS_SYSCPU1] = &ck_icn_p_syscpu1, 3044*28c10f9eSGabriel Fernandez [CK_BUS_HPDMA1] = &ck_icn_p_hpdma1, 3045*28c10f9eSGabriel Fernandez [CK_BUS_HPDMA2] = &ck_icn_p_hpdma2, 3046*28c10f9eSGabriel Fernandez [CK_BUS_HPDMA3] = &ck_icn_p_hpdma3, 3047*28c10f9eSGabriel Fernandez [CK_BUS_IPCC1] = &ck_icn_p_ipcc1, 3048*28c10f9eSGabriel Fernandez [CK_BUS_IPCC2] = &ck_icn_p_ipcc2, 3049*28c10f9eSGabriel Fernandez [CK_BUS_CCI] = &ck_icn_p_cci, 3050*28c10f9eSGabriel Fernandez [CK_BUS_CRC] = &ck_icn_p_crc, 3051*28c10f9eSGabriel Fernandez [CK_BUS_OSPIIOM] = &ck_icn_p_ospiiom, 3052*28c10f9eSGabriel Fernandez [CK_BUS_HASH] = &ck_icn_p_hash, 3053*28c10f9eSGabriel Fernandez [CK_BUS_RNG] = &ck_icn_p_rng, 3054*28c10f9eSGabriel Fernandez [CK_BUS_CRYP1] = &ck_icn_p_cryp1, 3055*28c10f9eSGabriel Fernandez [CK_BUS_CRYP2] = &ck_icn_p_cryp2, 3056*28c10f9eSGabriel Fernandez [CK_BUS_SAES] = &ck_icn_p_saes, 3057*28c10f9eSGabriel Fernandez [CK_BUS_PKA] = &ck_icn_p_pka, 3058*28c10f9eSGabriel Fernandez [CK_BUS_GPIOA] = &ck_icn_p_gpioa, 3059*28c10f9eSGabriel Fernandez [CK_BUS_GPIOB] = &ck_icn_p_gpiob, 3060*28c10f9eSGabriel Fernandez [CK_BUS_GPIOC] = &ck_icn_p_gpioc, 3061*28c10f9eSGabriel Fernandez [CK_BUS_GPIOD] = &ck_icn_p_gpiod, 3062*28c10f9eSGabriel Fernandez [CK_BUS_GPIOE] = &ck_icn_p_gpioe, 3063*28c10f9eSGabriel Fernandez [CK_BUS_GPIOF] = &ck_icn_p_gpiof, 3064*28c10f9eSGabriel Fernandez [CK_BUS_GPIOG] = &ck_icn_p_gpiog, 3065*28c10f9eSGabriel Fernandez [CK_BUS_GPIOH] = &ck_icn_p_gpioh, 3066*28c10f9eSGabriel Fernandez [CK_BUS_GPIOI] = &ck_icn_p_gpioi, 3067*28c10f9eSGabriel Fernandez [CK_BUS_GPIOJ] = &ck_icn_p_gpioj, 3068*28c10f9eSGabriel Fernandez [CK_BUS_GPIOK] = &ck_icn_p_gpiok, 3069*28c10f9eSGabriel Fernandez [CK_BUS_LPSRAM1] = &ck_icn_s_lpsram1, 3070*28c10f9eSGabriel Fernandez [CK_BUS_LPSRAM2] = &ck_icn_s_lpsram2, 3071*28c10f9eSGabriel Fernandez [CK_BUS_LPSRAM3] = &ck_icn_s_lpsram3, 3072*28c10f9eSGabriel Fernandez [CK_BUS_GPIOZ] = &ck_icn_p_gpioz, 3073*28c10f9eSGabriel Fernandez [CK_BUS_LPDMA] = &ck_icn_p_lpdma, 3074*28c10f9eSGabriel Fernandez [CK_BUS_ADF1] = &ck_icn_p_adf1, 3075*28c10f9eSGabriel Fernandez [CK_BUS_HSEM] = &ck_icn_p_hsem, 3076*28c10f9eSGabriel Fernandez [CK_BUS_RTC] = &ck_icn_p_rtc, 3077*28c10f9eSGabriel Fernandez [CK_BUS_IWDG5] = &ck_icn_p_iwdg5, 3078*28c10f9eSGabriel Fernandez [CK_BUS_WWDG2] = &ck_icn_p_wwdg2, 3079*28c10f9eSGabriel Fernandez [CK_BUS_STM] = &ck_icn_p_stm, 3080*28c10f9eSGabriel Fernandez [CK_KER_STM] = &ck_icn_s_stm, 3081*28c10f9eSGabriel Fernandez [CK_BUS_FMC] = &ck_icn_p_fmc, 3082*28c10f9eSGabriel Fernandez [CK_BUS_ETH1] = &ck_icn_p_eth1, 3083*28c10f9eSGabriel Fernandez [CK_BUS_ETHSW] = &ck_icn_p_ethsw, 3084*28c10f9eSGabriel Fernandez [CK_BUS_ETH2] = &ck_icn_p_eth2, 3085*28c10f9eSGabriel Fernandez [CK_BUS_PCIE] = &ck_icn_p_pcie, 3086*28c10f9eSGabriel Fernandez [CK_BUS_ADC12] = &ck_icn_p_adc12, 3087*28c10f9eSGabriel Fernandez [CK_BUS_ADC3] = &ck_icn_p_adc3, 3088*28c10f9eSGabriel Fernandez [CK_BUS_MDF1] = &ck_icn_p_mdf1, 3089*28c10f9eSGabriel Fernandez [CK_BUS_SPI8] = &ck_icn_p_spi8, 3090*28c10f9eSGabriel Fernandez [CK_BUS_LPUART1] = &ck_icn_p_lpuart1, 3091*28c10f9eSGabriel Fernandez [CK_BUS_I2C8] = &ck_icn_p_i2c8, 3092*28c10f9eSGabriel Fernandez [CK_BUS_LPTIM3] = &ck_icn_p_lptim3, 3093*28c10f9eSGabriel Fernandez [CK_BUS_LPTIM4] = &ck_icn_p_lptim4, 3094*28c10f9eSGabriel Fernandez [CK_BUS_LPTIM5] = &ck_icn_p_lptim5, 3095*28c10f9eSGabriel Fernandez [CK_BUS_RISAF4] = &ck_icn_p_risaf4, 3096*28c10f9eSGabriel Fernandez [CK_BUS_SDMMC1] = &ck_icn_m_sdmmc1, 3097*28c10f9eSGabriel Fernandez [CK_BUS_SDMMC2] = &ck_icn_m_sdmmc2, 3098*28c10f9eSGabriel Fernandez [CK_BUS_SDMMC3] = &ck_icn_m_sdmmc3, 3099*28c10f9eSGabriel Fernandez [CK_BUS_DDR] = &ck_icn_s_ddr, 3100*28c10f9eSGabriel Fernandez [CK_BUS_USB2OHCI] = &ck_icn_m_usb2ohci, 3101*28c10f9eSGabriel Fernandez [CK_BUS_USB2EHCI] = &ck_icn_m_usb2ehci, 3102*28c10f9eSGabriel Fernandez [CK_BUS_USB3DR] = &ck_icn_m_usb3dr, 3103*28c10f9eSGabriel Fernandez [CK_BUS_TIM2] = &ck_icn_p_tim2, 3104*28c10f9eSGabriel Fernandez [CK_BUS_TIM3] = &ck_icn_p_tim3, 3105*28c10f9eSGabriel Fernandez [CK_BUS_TIM4] = &ck_icn_p_tim4, 3106*28c10f9eSGabriel Fernandez [CK_BUS_TIM5] = &ck_icn_p_tim5, 3107*28c10f9eSGabriel Fernandez [CK_BUS_TIM6] = &ck_icn_p_tim6, 3108*28c10f9eSGabriel Fernandez [CK_BUS_TIM7] = &ck_icn_p_tim7, 3109*28c10f9eSGabriel Fernandez [CK_BUS_TIM10] = &ck_icn_p_tim10, 3110*28c10f9eSGabriel Fernandez [CK_BUS_TIM11] = &ck_icn_p_tim11, 3111*28c10f9eSGabriel Fernandez [CK_BUS_TIM12] = &ck_icn_p_tim12, 3112*28c10f9eSGabriel Fernandez [CK_BUS_TIM13] = &ck_icn_p_tim13, 3113*28c10f9eSGabriel Fernandez [CK_BUS_TIM14] = &ck_icn_p_tim14, 3114*28c10f9eSGabriel Fernandez [CK_BUS_LPTIM1] = &ck_icn_p_lptim1, 3115*28c10f9eSGabriel Fernandez [CK_BUS_LPTIM2] = &ck_icn_p_lptim2, 3116*28c10f9eSGabriel Fernandez [CK_BUS_SPI2] = &ck_icn_p_spi2, 3117*28c10f9eSGabriel Fernandez [CK_BUS_SPI3] = &ck_icn_p_spi3, 3118*28c10f9eSGabriel Fernandez [CK_BUS_SPDIFRX] = &ck_icn_p_spdifrx, 3119*28c10f9eSGabriel Fernandez [CK_BUS_USART2] = &ck_icn_p_usart2, 3120*28c10f9eSGabriel Fernandez [CK_BUS_USART3] = &ck_icn_p_usart3, 3121*28c10f9eSGabriel Fernandez [CK_BUS_UART4] = &ck_icn_p_uart4, 3122*28c10f9eSGabriel Fernandez [CK_BUS_UART5] = &ck_icn_p_uart5, 3123*28c10f9eSGabriel Fernandez [CK_BUS_I2C1] = &ck_icn_p_i2c1, 3124*28c10f9eSGabriel Fernandez [CK_BUS_I2C2] = &ck_icn_p_i2c2, 3125*28c10f9eSGabriel Fernandez [CK_BUS_I2C3] = &ck_icn_p_i2c3, 3126*28c10f9eSGabriel Fernandez [CK_BUS_I2C4] = &ck_icn_p_i2c4, 3127*28c10f9eSGabriel Fernandez [CK_BUS_I2C5] = &ck_icn_p_i2c5, 3128*28c10f9eSGabriel Fernandez [CK_BUS_I2C6] = &ck_icn_p_i2c6, 3129*28c10f9eSGabriel Fernandez [CK_BUS_I2C7] = &ck_icn_p_i2c7, 3130*28c10f9eSGabriel Fernandez [CK_BUS_I3C1] = &ck_icn_p_i3c1, 3131*28c10f9eSGabriel Fernandez [CK_BUS_I3C2] = &ck_icn_p_i3c2, 3132*28c10f9eSGabriel Fernandez [CK_BUS_I3C3] = &ck_icn_p_i3c3, 3133*28c10f9eSGabriel Fernandez [CK_BUS_I3C4] = &ck_icn_p_i3c4, 3134*28c10f9eSGabriel Fernandez [CK_BUS_TIM1] = &ck_icn_p_tim1, 3135*28c10f9eSGabriel Fernandez [CK_BUS_TIM8] = &ck_icn_p_tim8, 3136*28c10f9eSGabriel Fernandez [CK_BUS_TIM15] = &ck_icn_p_tim15, 3137*28c10f9eSGabriel Fernandez [CK_BUS_TIM16] = &ck_icn_p_tim16, 3138*28c10f9eSGabriel Fernandez [CK_BUS_TIM17] = &ck_icn_p_tim17, 3139*28c10f9eSGabriel Fernandez [CK_BUS_TIM20] = &ck_icn_p_tim20, 3140*28c10f9eSGabriel Fernandez [CK_BUS_SAI1] = &ck_icn_p_sai1, 3141*28c10f9eSGabriel Fernandez [CK_BUS_SAI2] = &ck_icn_p_sai2, 3142*28c10f9eSGabriel Fernandez [CK_BUS_SAI3] = &ck_icn_p_sai3, 3143*28c10f9eSGabriel Fernandez [CK_BUS_SAI4] = &ck_icn_p_sai4, 3144*28c10f9eSGabriel Fernandez [CK_BUS_USART1] = &ck_icn_p_usart1, 3145*28c10f9eSGabriel Fernandez [CK_BUS_USART6] = &ck_icn_p_usart6, 3146*28c10f9eSGabriel Fernandez [CK_BUS_UART7] = &ck_icn_p_uart7, 3147*28c10f9eSGabriel Fernandez [CK_BUS_UART8] = &ck_icn_p_uart8, 3148*28c10f9eSGabriel Fernandez [CK_BUS_UART9] = &ck_icn_p_uart9, 3149*28c10f9eSGabriel Fernandez [CK_BUS_FDCAN] = &ck_icn_p_fdcan, 3150*28c10f9eSGabriel Fernandez [CK_BUS_SPI1] = &ck_icn_p_spi1, 3151*28c10f9eSGabriel Fernandez [CK_BUS_SPI4] = &ck_icn_p_spi4, 3152*28c10f9eSGabriel Fernandez [CK_BUS_SPI5] = &ck_icn_p_spi5, 3153*28c10f9eSGabriel Fernandez [CK_BUS_SPI6] = &ck_icn_p_spi6, 3154*28c10f9eSGabriel Fernandez [CK_BUS_SPI7] = &ck_icn_p_spi7, 3155*28c10f9eSGabriel Fernandez [CK_BUS_BSEC] = &ck_icn_p_bsec, 3156*28c10f9eSGabriel Fernandez [CK_BUS_IWDG1] = &ck_icn_p_iwdg1, 3157*28c10f9eSGabriel Fernandez [CK_BUS_IWDG2] = &ck_icn_p_iwdg2, 3158*28c10f9eSGabriel Fernandez [CK_BUS_IWDG3] = &ck_icn_p_iwdg3, 3159*28c10f9eSGabriel Fernandez [CK_BUS_IWDG4] = &ck_icn_p_iwdg4, 3160*28c10f9eSGabriel Fernandez [CK_BUS_WWDG1] = &ck_icn_p_wwdg1, 3161*28c10f9eSGabriel Fernandez [CK_BUS_VREF] = &ck_icn_p_vref, 3162*28c10f9eSGabriel Fernandez [CK_BUS_SERC] = &ck_icn_p_serc, 3163*28c10f9eSGabriel Fernandez [CK_BUS_DTS] = &ck_icn_p_dts, 3164*28c10f9eSGabriel Fernandez [CK_BUS_HDP] = &ck_icn_p_hdp, 3165*28c10f9eSGabriel Fernandez [CK_BUS_IS2M] = &ck_icn_p_is2m, 3166*28c10f9eSGabriel Fernandez [CK_BUS_DSI] = &ck_icn_p_dsi, 3167*28c10f9eSGabriel Fernandez [CK_BUS_LTDC] = &ck_icn_p_ltdc, 3168*28c10f9eSGabriel Fernandez [CK_BUS_CSI] = &ck_icn_p_csi, 3169*28c10f9eSGabriel Fernandez [CK_BUS_DCMIPP] = &ck_icn_p_dcmipp, 3170*28c10f9eSGabriel Fernandez [CK_BUS_DDRC] = &ck_icn_p_ddrc, 3171*28c10f9eSGabriel Fernandez [CK_BUS_DDRCFG] = &ck_icn_p_ddrcfg, 3172*28c10f9eSGabriel Fernandez [CK_BUS_LVDS] = &ck_icn_p_lvds, 3173*28c10f9eSGabriel Fernandez [CK_BUS_GICV2M] = &ck_icn_p_gicv2m, 3174*28c10f9eSGabriel Fernandez [CK_BUS_USBTC] = &ck_icn_p_usbtc, 3175*28c10f9eSGabriel Fernandez [CK_BUS_USB3PCIEPHY] = &ck_icn_p_usb3pciephy, 3176*28c10f9eSGabriel Fernandez [CK_BUS_STGEN] = &ck_icn_p_stgen, 3177*28c10f9eSGabriel Fernandez [CK_BUS_VDEC] = &ck_icn_p_vdec, 3178*28c10f9eSGabriel Fernandez [CK_BUS_VENC] = &ck_icn_p_venc, 3179*28c10f9eSGabriel Fernandez [CK_SYSDBG] = &ck_sys_dbg, 3180*28c10f9eSGabriel Fernandez [CK_KER_TIM2] = &ck_ker_tim2, 3181*28c10f9eSGabriel Fernandez [CK_KER_TIM3] = &ck_ker_tim3, 3182*28c10f9eSGabriel Fernandez [CK_KER_TIM4] = &ck_ker_tim4, 3183*28c10f9eSGabriel Fernandez [CK_KER_TIM5] = &ck_ker_tim5, 3184*28c10f9eSGabriel Fernandez [CK_KER_TIM6] = &ck_ker_tim6, 3185*28c10f9eSGabriel Fernandez [CK_KER_TIM7] = &ck_ker_tim7, 3186*28c10f9eSGabriel Fernandez [CK_KER_TIM10] = &ck_ker_tim10, 3187*28c10f9eSGabriel Fernandez [CK_KER_TIM11] = &ck_ker_tim11, 3188*28c10f9eSGabriel Fernandez [CK_KER_TIM12] = &ck_ker_tim12, 3189*28c10f9eSGabriel Fernandez [CK_KER_TIM13] = &ck_ker_tim13, 3190*28c10f9eSGabriel Fernandez [CK_KER_TIM14] = &ck_ker_tim14, 3191*28c10f9eSGabriel Fernandez [CK_KER_TIM1] = &ck_ker_tim1, 3192*28c10f9eSGabriel Fernandez [CK_KER_TIM8] = &ck_ker_tim8, 3193*28c10f9eSGabriel Fernandez [CK_KER_TIM15] = &ck_ker_tim15, 3194*28c10f9eSGabriel Fernandez [CK_KER_TIM16] = &ck_ker_tim16, 3195*28c10f9eSGabriel Fernandez [CK_KER_TIM17] = &ck_ker_tim17, 3196*28c10f9eSGabriel Fernandez [CK_KER_TIM20] = &ck_ker_tim20, 3197*28c10f9eSGabriel Fernandez [CK_KER_LPTIM1] = &ck_ker_lptim1, 3198*28c10f9eSGabriel Fernandez [CK_KER_LPTIM2] = &ck_ker_lptim2, 3199*28c10f9eSGabriel Fernandez [CK_KER_USART2] = &ck_ker_usart2, 3200*28c10f9eSGabriel Fernandez [CK_KER_UART4] = &ck_ker_uart4, 3201*28c10f9eSGabriel Fernandez [CK_KER_USART3] = &ck_ker_usart3, 3202*28c10f9eSGabriel Fernandez [CK_KER_UART5] = &ck_ker_uart5, 3203*28c10f9eSGabriel Fernandez [CK_KER_SPI2] = &ck_ker_spi2, 3204*28c10f9eSGabriel Fernandez [CK_KER_SPI3] = &ck_ker_spi3, 3205*28c10f9eSGabriel Fernandez [CK_KER_SPDIFRX] = &ck_ker_spdifrx, 3206*28c10f9eSGabriel Fernandez [CK_KER_I2C1] = &ck_ker_i2c1, 3207*28c10f9eSGabriel Fernandez [CK_KER_I2C2] = &ck_ker_i2c2, 3208*28c10f9eSGabriel Fernandez [CK_KER_I3C1] = &ck_ker_i3c1, 3209*28c10f9eSGabriel Fernandez [CK_KER_I3C2] = &ck_ker_i3c2, 3210*28c10f9eSGabriel Fernandez [CK_KER_I2C3] = &ck_ker_i2c3, 3211*28c10f9eSGabriel Fernandez [CK_KER_I2C5] = &ck_ker_i2c5, 3212*28c10f9eSGabriel Fernandez [CK_KER_I3C3] = &ck_ker_i3c3, 3213*28c10f9eSGabriel Fernandez [CK_KER_I2C4] = &ck_ker_i2c4, 3214*28c10f9eSGabriel Fernandez [CK_KER_I2C6] = &ck_ker_i2c6, 3215*28c10f9eSGabriel Fernandez [CK_KER_I2C7] = &ck_ker_i2c7, 3216*28c10f9eSGabriel Fernandez [CK_KER_SPI1] = &ck_ker_spi1, 3217*28c10f9eSGabriel Fernandez [CK_KER_SPI4] = &ck_ker_spi4, 3218*28c10f9eSGabriel Fernandez [CK_KER_SPI5] = &ck_ker_spi5, 3219*28c10f9eSGabriel Fernandez [CK_KER_SPI6] = &ck_ker_spi6, 3220*28c10f9eSGabriel Fernandez [CK_KER_SPI7] = &ck_ker_spi7, 3221*28c10f9eSGabriel Fernandez [CK_KER_USART1] = &ck_ker_usart1, 3222*28c10f9eSGabriel Fernandez [CK_KER_USART6] = &ck_ker_usart6, 3223*28c10f9eSGabriel Fernandez [CK_KER_UART7] = &ck_ker_uart7, 3224*28c10f9eSGabriel Fernandez [CK_KER_UART8] = &ck_ker_uart8, 3225*28c10f9eSGabriel Fernandez [CK_KER_UART9] = &ck_ker_uart9, 3226*28c10f9eSGabriel Fernandez [CK_KER_MDF1] = &ck_ker_mdf1, 3227*28c10f9eSGabriel Fernandez [CK_KER_SAI1] = &ck_ker_sai1, 3228*28c10f9eSGabriel Fernandez [CK_KER_SAI2] = &ck_ker_sai2, 3229*28c10f9eSGabriel Fernandez [CK_KER_SAI3] = &ck_ker_sai3, 3230*28c10f9eSGabriel Fernandez [CK_KER_SAI4] = &ck_ker_sai4, 3231*28c10f9eSGabriel Fernandez [CK_KER_FDCAN] = &ck_ker_fdcan, 3232*28c10f9eSGabriel Fernandez [CK_KER_CSI] = &ck_ker_csi, 3233*28c10f9eSGabriel Fernandez [CK_KER_CSITXESC] = &ck_ker_csitxesc, 3234*28c10f9eSGabriel Fernandez [CK_KER_CSIPHY] = &ck_ker_csiphy, 3235*28c10f9eSGabriel Fernandez [CK_KER_STGEN] = &ck_ker_stgen, 3236*28c10f9eSGabriel Fernandez [CK_KER_USBTC] = &ck_ker_usbtc, 3237*28c10f9eSGabriel Fernandez [CK_KER_I3C4] = &ck_ker_i3c4, 3238*28c10f9eSGabriel Fernandez [CK_KER_SPI8] = &ck_ker_spi8, 3239*28c10f9eSGabriel Fernandez [CK_KER_I2C8] = &ck_ker_i2c8, 3240*28c10f9eSGabriel Fernandez [CK_KER_LPUART1] = &ck_ker_lpuart1, 3241*28c10f9eSGabriel Fernandez [CK_KER_LPTIM3] = &ck_ker_lptim3, 3242*28c10f9eSGabriel Fernandez [CK_KER_LPTIM4] = &ck_ker_lptim4, 3243*28c10f9eSGabriel Fernandez [CK_KER_LPTIM5] = &ck_ker_lptim5, 3244*28c10f9eSGabriel Fernandez [CK_KER_ADF1] = &ck_ker_adf1, 3245*28c10f9eSGabriel Fernandez [CK_KER_TSDBG] = &ck_ker_tsdbg, 3246*28c10f9eSGabriel Fernandez [CK_KER_TPIU] = &ck_ker_tpiu, 3247*28c10f9eSGabriel Fernandez [CK_BUS_ETR] = &ck_icn_p_etr, 3248*28c10f9eSGabriel Fernandez [CK_KER_ETR] = &ck_icn_m_etr, 3249*28c10f9eSGabriel Fernandez [CK_BUS_SYSATB] = &ck_sys_atb, 3250*28c10f9eSGabriel Fernandez [CK_KER_OSPI1] = &ck_ker_ospi1, 3251*28c10f9eSGabriel Fernandez [CK_KER_OSPI2] = &ck_ker_ospi2, 3252*28c10f9eSGabriel Fernandez [CK_KER_FMC] = &ck_ker_fmc, 3253*28c10f9eSGabriel Fernandez [CK_KER_SDMMC1] = &ck_ker_sdmmc1, 3254*28c10f9eSGabriel Fernandez [CK_KER_SDMMC2] = &ck_ker_sdmmc2, 3255*28c10f9eSGabriel Fernandez [CK_KER_SDMMC3] = &ck_ker_sdmmc3, 3256*28c10f9eSGabriel Fernandez [CK_KER_ETH1] = &ck_ker_eth1, 3257*28c10f9eSGabriel Fernandez [CK_ETH1_STP] = &ck_ker_eth1stp, 3258*28c10f9eSGabriel Fernandez [CK_KER_ETHSW] = &ck_ker_ethsw, 3259*28c10f9eSGabriel Fernandez [CK_KER_ETH2] = &ck_ker_eth2, 3260*28c10f9eSGabriel Fernandez [CK_ETH2_STP] = &ck_ker_eth2stp, 3261*28c10f9eSGabriel Fernandez [CK_KER_ETH1PTP] = &ck_ker_eth1ptp, 3262*28c10f9eSGabriel Fernandez [CK_KER_ETH2PTP] = &ck_ker_eth2ptp, 3263*28c10f9eSGabriel Fernandez [CK_BUS_GPU] = &ck_icn_m_gpu, 3264*28c10f9eSGabriel Fernandez [CK_KER_GPU] = &ck_ker_gpu, 3265*28c10f9eSGabriel Fernandez [CK_KER_ETHSWREF] = &ck_ker_ethswref, 3266*28c10f9eSGabriel Fernandez 3267*28c10f9eSGabriel Fernandez [CK_MCO1] = &ck_mco1, 3268*28c10f9eSGabriel Fernandez [CK_MCO2] = &ck_mco2, 3269*28c10f9eSGabriel Fernandez [CK_KER_ADC12] = &ck_ker_adc12, 3270*28c10f9eSGabriel Fernandez [CK_KER_ADC3] = &ck_ker_adc3, 3271*28c10f9eSGabriel Fernandez [CK_KER_USB2PHY1] = &ck_ker_usb2phy1, 3272*28c10f9eSGabriel Fernandez [CK_KER_USB2PHY2] = &ck_ker_usb2phy2, 3273*28c10f9eSGabriel Fernandez [CK_KER_USB2PHY2EN] = &ck_ker_usb2phy2_en, 3274*28c10f9eSGabriel Fernandez [CK_KER_USB3PCIEPHY] = &ck_ker_usb3pciephy, 3275*28c10f9eSGabriel Fernandez [CK_KER_LTDC] = &ck_ker_ltdc, 3276*28c10f9eSGabriel Fernandez [CK_KER_DSIBLANE] = &clk_lanebyte, 3277*28c10f9eSGabriel Fernandez [CK_KER_DSIPHY] = &ck_phy_dsi, 3278*28c10f9eSGabriel Fernandez [CK_KER_LVDSPHY] = &ck_ker_lvdsphy, 3279*28c10f9eSGabriel Fernandez [CK_KER_DTS] = &ck_ker_dts, 3280*28c10f9eSGabriel Fernandez [RTC_CK] = &ck_rtc, 3281*28c10f9eSGabriel Fernandez 3282*28c10f9eSGabriel Fernandez [CK_ETH1_MAC] = &ck_ker_eth1mac, 3283*28c10f9eSGabriel Fernandez [CK_ETH1_TX] = &ck_ker_eth1tx, 3284*28c10f9eSGabriel Fernandez [CK_ETH1_RX] = &ck_ker_eth1rx, 3285*28c10f9eSGabriel Fernandez [CK_ETH2_MAC] = &ck_ker_eth2mac, 3286*28c10f9eSGabriel Fernandez [CK_ETH2_TX] = &ck_ker_eth2tx, 3287*28c10f9eSGabriel Fernandez [CK_ETH2_RX] = &ck_ker_eth2rx, 3288*28c10f9eSGabriel Fernandez 3289*28c10f9eSGabriel Fernandez [CK_HSE_RTC] = &ck_hse_rtc, 3290*28c10f9eSGabriel Fernandez [CK_OBSER0] = &ck_obser0, 3291*28c10f9eSGabriel Fernandez [CK_OBSER1] = &ck_obser1, 3292*28c10f9eSGabriel Fernandez [CK_OFF] = &ck_off, 3293*28c10f9eSGabriel Fernandez [I2SCKIN] = &i2sckin, 3294*28c10f9eSGabriel Fernandez [SPDIFSYMB] = &spdifsymb, 3295*28c10f9eSGabriel Fernandez [TXBYTECLK] = &txbyteclk, 3296*28c10f9eSGabriel Fernandez }; 3297*28c10f9eSGabriel Fernandez 3298*28c10f9eSGabriel Fernandez static bool clk_stm32_clock_is_critical(struct clk *clk) 3299*28c10f9eSGabriel Fernandez { 3300*28c10f9eSGabriel Fernandez struct clk *clk_criticals[] = { 3301*28c10f9eSGabriel Fernandez &ck_hsi, 3302*28c10f9eSGabriel Fernandez &ck_hse, 3303*28c10f9eSGabriel Fernandez &ck_msi, 3304*28c10f9eSGabriel Fernandez &ck_lsi, 3305*28c10f9eSGabriel Fernandez &ck_lse, 3306*28c10f9eSGabriel Fernandez &ck_cpu1, 3307*28c10f9eSGabriel Fernandez &ck_icn_p_syscpu1, 3308*28c10f9eSGabriel Fernandez &ck_icn_s_ddr, 3309*28c10f9eSGabriel Fernandez &ck_icn_p_ddrc, 3310*28c10f9eSGabriel Fernandez &ck_icn_p_ddrcfg, 3311*28c10f9eSGabriel Fernandez &ck_icn_p_ddrphyc, 3312*28c10f9eSGabriel Fernandez &ck_icn_s_sysram, 3313*28c10f9eSGabriel Fernandez &ck_icn_s_bkpsram, 3314*28c10f9eSGabriel Fernandez &ck_ker_fmc, 3315*28c10f9eSGabriel Fernandez &ck_ker_ospi1, 3316*28c10f9eSGabriel Fernandez &ck_ker_ospi2, 3317*28c10f9eSGabriel Fernandez &ck_icn_s_vderam, 3318*28c10f9eSGabriel Fernandez &ck_icn_s_lpsram1, 3319*28c10f9eSGabriel Fernandez &ck_icn_s_lpsram2, 3320*28c10f9eSGabriel Fernandez &ck_icn_s_lpsram3, 3321*28c10f9eSGabriel Fernandez &ck_icn_p_hpdma1, 3322*28c10f9eSGabriel Fernandez &ck_icn_p_hpdma2, 3323*28c10f9eSGabriel Fernandez &ck_icn_p_hpdma3, 3324*28c10f9eSGabriel Fernandez &ck_icn_p_gpioa, 3325*28c10f9eSGabriel Fernandez &ck_icn_p_gpiob, 3326*28c10f9eSGabriel Fernandez &ck_icn_p_gpioc, 3327*28c10f9eSGabriel Fernandez &ck_icn_p_gpiod, 3328*28c10f9eSGabriel Fernandez &ck_icn_p_gpioe, 3329*28c10f9eSGabriel Fernandez &ck_icn_p_gpiof, 3330*28c10f9eSGabriel Fernandez &ck_icn_p_gpiog, 3331*28c10f9eSGabriel Fernandez &ck_icn_p_gpioh, 3332*28c10f9eSGabriel Fernandez &ck_icn_p_gpioi, 3333*28c10f9eSGabriel Fernandez &ck_icn_p_gpioj, 3334*28c10f9eSGabriel Fernandez &ck_icn_p_gpiok, 3335*28c10f9eSGabriel Fernandez &ck_icn_p_gpioz, 3336*28c10f9eSGabriel Fernandez &ck_icn_p_ipcc1, 3337*28c10f9eSGabriel Fernandez &ck_icn_p_ipcc2, 3338*28c10f9eSGabriel Fernandez &ck_icn_p_gicv2m, 3339*28c10f9eSGabriel Fernandez &ck_icn_p_rtc 3340*28c10f9eSGabriel Fernandez }; 3341*28c10f9eSGabriel Fernandez size_t i = 0; 3342*28c10f9eSGabriel Fernandez 3343*28c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clk_criticals); i++) 3344*28c10f9eSGabriel Fernandez if (clk == clk_criticals[i]) 3345*28c10f9eSGabriel Fernandez return true; 3346*28c10f9eSGabriel Fernandez return false; 3347*28c10f9eSGabriel Fernandez } 3348*28c10f9eSGabriel Fernandez 3349*28c10f9eSGabriel Fernandez static void clk_stm32_init_oscillators(const void *fdt, int node) 3350*28c10f9eSGabriel Fernandez { 3351*28c10f9eSGabriel Fernandez size_t i = 0; 3352*28c10f9eSGabriel Fernandez static const char * const name[] = { 3353*28c10f9eSGabriel Fernandez "clk-hse", "clk-hsi", "clk-lse", 3354*28c10f9eSGabriel Fernandez "clk-lsi", "clk-msi", "clk-i2sin" 3355*28c10f9eSGabriel Fernandez }; 3356*28c10f9eSGabriel Fernandez struct clk *clks[ARRAY_SIZE(name)] = { 3357*28c10f9eSGabriel Fernandez &ck_hse, &ck_hsi, &ck_lse, 3358*28c10f9eSGabriel Fernandez &ck_lsi, &ck_msi, &i2sckin 3359*28c10f9eSGabriel Fernandez }; 3360*28c10f9eSGabriel Fernandez 3361*28c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clks); i++) { 3362*28c10f9eSGabriel Fernandez struct clk *clk = NULL; 3363*28c10f9eSGabriel Fernandez 3364*28c10f9eSGabriel Fernandez if (clk_dt_get_by_name(fdt, node, name[i], &clk)) 3365*28c10f9eSGabriel Fernandez panic(); 3366*28c10f9eSGabriel Fernandez 3367*28c10f9eSGabriel Fernandez clks[i]->parents[0] = clk; 3368*28c10f9eSGabriel Fernandez } 3369*28c10f9eSGabriel Fernandez } 3370*28c10f9eSGabriel Fernandez 3371*28c10f9eSGabriel Fernandez static TEE_Result clk_stm32_apply_rcc_config(struct stm32_clk_platdata *pdata) 3372*28c10f9eSGabriel Fernandez { 3373*28c10f9eSGabriel Fernandez if (pdata->safe_rst) 3374*28c10f9eSGabriel Fernandez stm32mp25_syscfg_set_safe_reset(true); 3375*28c10f9eSGabriel Fernandez 3376*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 3377*28c10f9eSGabriel Fernandez } 3378*28c10f9eSGabriel Fernandez 3379*28c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg mp25_pll[PLL_NB]; 3380*28c10f9eSGabriel Fernandez static struct stm32_clk_opp_dt_cfg mp25_clk_opp; 3381*28c10f9eSGabriel Fernandez static struct stm32_osci_dt_cfg mp25_osci[NB_OSCILLATOR]; 3382*28c10f9eSGabriel Fernandez 3383*28c10f9eSGabriel Fernandez #define DT_FLEXGEN_CLK_MAX 64 3384*28c10f9eSGabriel Fernandez static uint32_t mp25_flexgen[DT_FLEXGEN_CLK_MAX]; 3385*28c10f9eSGabriel Fernandez 3386*28c10f9eSGabriel Fernandez #define DT_BUS_CLK_MAX 6 3387*28c10f9eSGabriel Fernandez static uint32_t mp25_busclk[DT_BUS_CLK_MAX]; 3388*28c10f9eSGabriel Fernandez 3389*28c10f9eSGabriel Fernandez #define DT_KERNEL_CLK_MAX 20 3390*28c10f9eSGabriel Fernandez static uint32_t mp25_kernelclk[DT_KERNEL_CLK_MAX]; 3391*28c10f9eSGabriel Fernandez 3392*28c10f9eSGabriel Fernandez static struct stm32_clk_platdata stm32mp25_clock_pdata = { 3393*28c10f9eSGabriel Fernandez .osci = mp25_osci, 3394*28c10f9eSGabriel Fernandez .nosci = NB_OSCILLATOR, 3395*28c10f9eSGabriel Fernandez .pll = mp25_pll, 3396*28c10f9eSGabriel Fernandez .npll = PLL_NB, 3397*28c10f9eSGabriel Fernandez .opp = &mp25_clk_opp, 3398*28c10f9eSGabriel Fernandez .busclk = mp25_busclk, 3399*28c10f9eSGabriel Fernandez .nbusclk = DT_BUS_CLK_MAX, 3400*28c10f9eSGabriel Fernandez .kernelclk = mp25_kernelclk, 3401*28c10f9eSGabriel Fernandez .nkernelclk = DT_KERNEL_CLK_MAX, 3402*28c10f9eSGabriel Fernandez .flexgen = mp25_flexgen, 3403*28c10f9eSGabriel Fernandez .nflexgen = DT_FLEXGEN_CLK_MAX, 3404*28c10f9eSGabriel Fernandez }; 3405*28c10f9eSGabriel Fernandez 3406*28c10f9eSGabriel Fernandez static struct clk_stm32_priv stm32mp25_clock_data = { 3407*28c10f9eSGabriel Fernandez .muxes = parent_mp25, 3408*28c10f9eSGabriel Fernandez .nb_muxes = ARRAY_SIZE(parent_mp25), 3409*28c10f9eSGabriel Fernandez .gates = gates_mp25, 3410*28c10f9eSGabriel Fernandez .nb_gates = ARRAY_SIZE(gates_mp25), 3411*28c10f9eSGabriel Fernandez .div = dividers_mp25, 3412*28c10f9eSGabriel Fernandez .nb_div = ARRAY_SIZE(dividers_mp25), 3413*28c10f9eSGabriel Fernandez .pdata = &stm32mp25_clock_pdata, 3414*28c10f9eSGabriel Fernandez .nb_clk_refs = STM32MP25_ALL_CLK_NB, 3415*28c10f9eSGabriel Fernandez .clk_refs = stm32mp25_clk_provided, 3416*28c10f9eSGabriel Fernandez .is_critical = clk_stm32_clock_is_critical, 3417*28c10f9eSGabriel Fernandez }; 3418*28c10f9eSGabriel Fernandez 3419*28c10f9eSGabriel Fernandez static TEE_Result stm32mp2_clk_probe(const void *fdt, int node, 3420*28c10f9eSGabriel Fernandez const void *compat_data __unused) 3421*28c10f9eSGabriel Fernandez { 3422*28c10f9eSGabriel Fernandez TEE_Result res = TEE_ERROR_GENERIC; 3423*28c10f9eSGabriel Fernandez int fdt_rc = 0; 3424*28c10f9eSGabriel Fernandez int rc = 0; 3425*28c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = &stm32mp25_clock_data; 3426*28c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata; 3427*28c10f9eSGabriel Fernandez 3428*28c10f9eSGabriel Fernandez fdt_rc = stm32_clk_parse_fdt(fdt, node, pdata); 3429*28c10f9eSGabriel Fernandez if (fdt_rc) { 3430*28c10f9eSGabriel Fernandez EMSG("Failed to parse clock node %s: %d", 3431*28c10f9eSGabriel Fernandez fdt_get_name(fdt, node, NULL), fdt_rc); 3432*28c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 3433*28c10f9eSGabriel Fernandez } 3434*28c10f9eSGabriel Fernandez 3435*28c10f9eSGabriel Fernandez rc = clk_stm32_init(priv, stm32_rcc_base()); 3436*28c10f9eSGabriel Fernandez if (rc) 3437*28c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 3438*28c10f9eSGabriel Fernandez 3439*28c10f9eSGabriel Fernandez stm32mp2_init_clock_tree(priv, pdata); 3440*28c10f9eSGabriel Fernandez 3441*28c10f9eSGabriel Fernandez clk_stm32_init_oscillators(fdt, node); 3442*28c10f9eSGabriel Fernandez 3443*28c10f9eSGabriel Fernandez res = clk_stm32_apply_rcc_config(pdata); 3444*28c10f9eSGabriel Fernandez if (res) 3445*28c10f9eSGabriel Fernandez panic("Error when applying RCC config"); 3446*28c10f9eSGabriel Fernandez 3447*28c10f9eSGabriel Fernandez stm32mp_clk_provider_probe_final(fdt, node, priv); 3448*28c10f9eSGabriel Fernandez 3449*28c10f9eSGabriel Fernandez if (IS_ENABLED(CFG_STM32_CLK_DEBUG)) 3450*28c10f9eSGabriel Fernandez clk_print_tree(); 3451*28c10f9eSGabriel Fernandez 3452*28c10f9eSGabriel Fernandez return TEE_SUCCESS; 3453*28c10f9eSGabriel Fernandez } 3454*28c10f9eSGabriel Fernandez 3455*28c10f9eSGabriel Fernandez CLK_DT_DECLARE(stm32mp25_clk, "st,stm32mp25-rcc", stm32mp2_clk_probe); 3456