1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (C) 2022-2023, STMicroelectronics - All Rights Reserved 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <errno.h> 9*91f16700Schasinglulu #include <limits.h> 10*91f16700Schasinglulu #include <stdint.h> 11*91f16700Schasinglulu #include <stdio.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <arch.h> 14*91f16700Schasinglulu #include <arch_helpers.h> 15*91f16700Schasinglulu #include "clk-stm32-core.h" 16*91f16700Schasinglulu #include <common/debug.h> 17*91f16700Schasinglulu #include <common/fdt_wrappers.h> 18*91f16700Schasinglulu #include <drivers/clk.h> 19*91f16700Schasinglulu #include <drivers/delay_timer.h> 20*91f16700Schasinglulu #include <drivers/st/stm32mp13_rcc.h> 21*91f16700Schasinglulu #include <drivers/st/stm32mp1_clk.h> 22*91f16700Schasinglulu #include <drivers/st/stm32mp_clkfunc.h> 23*91f16700Schasinglulu #include <dt-bindings/clock/stm32mp13-clksrc.h> 24*91f16700Schasinglulu #include <lib/mmio.h> 25*91f16700Schasinglulu #include <lib/spinlock.h> 26*91f16700Schasinglulu #include <lib/utils_def.h> 27*91f16700Schasinglulu #include <libfdt.h> 28*91f16700Schasinglulu #include <plat/common/platform.h> 29*91f16700Schasinglulu 30*91f16700Schasinglulu #include <platform_def.h> 31*91f16700Schasinglulu 32*91f16700Schasinglulu struct stm32_osci_dt_cfg { 33*91f16700Schasinglulu unsigned long freq; 34*91f16700Schasinglulu bool bypass; 35*91f16700Schasinglulu bool digbyp; 36*91f16700Schasinglulu bool css; 37*91f16700Schasinglulu uint32_t drive; 38*91f16700Schasinglulu }; 39*91f16700Schasinglulu 40*91f16700Schasinglulu enum pll_mn { 41*91f16700Schasinglulu PLL_CFG_M, 42*91f16700Schasinglulu PLL_CFG_N, 43*91f16700Schasinglulu PLL_DIV_MN_NB 44*91f16700Schasinglulu }; 45*91f16700Schasinglulu 46*91f16700Schasinglulu enum pll_pqr { 47*91f16700Schasinglulu PLL_CFG_P, 48*91f16700Schasinglulu PLL_CFG_Q, 49*91f16700Schasinglulu PLL_CFG_R, 50*91f16700Schasinglulu PLL_DIV_PQR_NB 51*91f16700Schasinglulu }; 52*91f16700Schasinglulu 53*91f16700Schasinglulu enum pll_csg { 54*91f16700Schasinglulu PLL_CSG_MOD_PER, 55*91f16700Schasinglulu PLL_CSG_INC_STEP, 56*91f16700Schasinglulu PLL_CSG_SSCG_MODE, 57*91f16700Schasinglulu PLL_CSG_NB 58*91f16700Schasinglulu }; 59*91f16700Schasinglulu 60*91f16700Schasinglulu struct stm32_pll_vco { 61*91f16700Schasinglulu uint32_t status; 62*91f16700Schasinglulu uint32_t src; 63*91f16700Schasinglulu uint32_t div_mn[PLL_DIV_MN_NB]; 64*91f16700Schasinglulu uint32_t frac; 65*91f16700Schasinglulu bool csg_enabled; 66*91f16700Schasinglulu uint32_t csg[PLL_CSG_NB]; 67*91f16700Schasinglulu }; 68*91f16700Schasinglulu 69*91f16700Schasinglulu struct stm32_pll_output { 70*91f16700Schasinglulu uint32_t output[PLL_DIV_PQR_NB]; 71*91f16700Schasinglulu }; 72*91f16700Schasinglulu 73*91f16700Schasinglulu struct stm32_pll_dt_cfg { 74*91f16700Schasinglulu struct stm32_pll_vco vco; 75*91f16700Schasinglulu struct stm32_pll_output output; 76*91f16700Schasinglulu }; 77*91f16700Schasinglulu 78*91f16700Schasinglulu struct stm32_clk_platdata { 79*91f16700Schasinglulu uint32_t nosci; 80*91f16700Schasinglulu struct stm32_osci_dt_cfg *osci; 81*91f16700Schasinglulu uint32_t npll; 82*91f16700Schasinglulu struct stm32_pll_dt_cfg *pll; 83*91f16700Schasinglulu uint32_t nclksrc; 84*91f16700Schasinglulu uint32_t *clksrc; 85*91f16700Schasinglulu uint32_t nclkdiv; 86*91f16700Schasinglulu uint32_t *clkdiv; 87*91f16700Schasinglulu }; 88*91f16700Schasinglulu 89*91f16700Schasinglulu enum stm32_clock { 90*91f16700Schasinglulu /* ROOT CLOCKS */ 91*91f16700Schasinglulu _CK_OFF, 92*91f16700Schasinglulu _CK_HSI, 93*91f16700Schasinglulu _CK_HSE, 94*91f16700Schasinglulu _CK_CSI, 95*91f16700Schasinglulu _CK_LSI, 96*91f16700Schasinglulu _CK_LSE, 97*91f16700Schasinglulu _I2SCKIN, 98*91f16700Schasinglulu _CSI_DIV122, 99*91f16700Schasinglulu _HSE_DIV, 100*91f16700Schasinglulu _HSE_DIV2, 101*91f16700Schasinglulu _CK_PLL1, 102*91f16700Schasinglulu _CK_PLL2, 103*91f16700Schasinglulu _CK_PLL3, 104*91f16700Schasinglulu _CK_PLL4, 105*91f16700Schasinglulu _PLL1P, 106*91f16700Schasinglulu _PLL1P_DIV, 107*91f16700Schasinglulu _PLL2P, 108*91f16700Schasinglulu _PLL2Q, 109*91f16700Schasinglulu _PLL2R, 110*91f16700Schasinglulu _PLL3P, 111*91f16700Schasinglulu _PLL3Q, 112*91f16700Schasinglulu _PLL3R, 113*91f16700Schasinglulu _PLL4P, 114*91f16700Schasinglulu _PLL4Q, 115*91f16700Schasinglulu _PLL4R, 116*91f16700Schasinglulu _PCLK1, 117*91f16700Schasinglulu _PCLK2, 118*91f16700Schasinglulu _PCLK3, 119*91f16700Schasinglulu _PCLK4, 120*91f16700Schasinglulu _PCLK5, 121*91f16700Schasinglulu _PCLK6, 122*91f16700Schasinglulu _CKMPU, 123*91f16700Schasinglulu _CKAXI, 124*91f16700Schasinglulu _CKMLAHB, 125*91f16700Schasinglulu _CKPER, 126*91f16700Schasinglulu _CKTIMG1, 127*91f16700Schasinglulu _CKTIMG2, 128*91f16700Schasinglulu _CKTIMG3, 129*91f16700Schasinglulu _USB_PHY_48, 130*91f16700Schasinglulu _MCO1_K, 131*91f16700Schasinglulu _MCO2_K, 132*91f16700Schasinglulu _TRACECK, 133*91f16700Schasinglulu /* BUS and KERNEL CLOCKS */ 134*91f16700Schasinglulu _DDRC1, 135*91f16700Schasinglulu _DDRC1LP, 136*91f16700Schasinglulu _DDRPHYC, 137*91f16700Schasinglulu _DDRPHYCLP, 138*91f16700Schasinglulu _DDRCAPB, 139*91f16700Schasinglulu _DDRCAPBLP, 140*91f16700Schasinglulu _AXIDCG, 141*91f16700Schasinglulu _DDRPHYCAPB, 142*91f16700Schasinglulu _DDRPHYCAPBLP, 143*91f16700Schasinglulu _SYSCFG, 144*91f16700Schasinglulu _DDRPERFM, 145*91f16700Schasinglulu _IWDG2APB, 146*91f16700Schasinglulu _USBPHY_K, 147*91f16700Schasinglulu _USBO_K, 148*91f16700Schasinglulu _RTCAPB, 149*91f16700Schasinglulu _TZC, 150*91f16700Schasinglulu _ETZPC, 151*91f16700Schasinglulu _IWDG1APB, 152*91f16700Schasinglulu _BSEC, 153*91f16700Schasinglulu _STGENC, 154*91f16700Schasinglulu _USART1_K, 155*91f16700Schasinglulu _USART2_K, 156*91f16700Schasinglulu _I2C3_K, 157*91f16700Schasinglulu _I2C4_K, 158*91f16700Schasinglulu _I2C5_K, 159*91f16700Schasinglulu _TIM12, 160*91f16700Schasinglulu _TIM15, 161*91f16700Schasinglulu _RTCCK, 162*91f16700Schasinglulu _GPIOA, 163*91f16700Schasinglulu _GPIOB, 164*91f16700Schasinglulu _GPIOC, 165*91f16700Schasinglulu _GPIOD, 166*91f16700Schasinglulu _GPIOE, 167*91f16700Schasinglulu _GPIOF, 168*91f16700Schasinglulu _GPIOG, 169*91f16700Schasinglulu _GPIOH, 170*91f16700Schasinglulu _GPIOI, 171*91f16700Schasinglulu _PKA, 172*91f16700Schasinglulu _SAES_K, 173*91f16700Schasinglulu _CRYP1, 174*91f16700Schasinglulu _HASH1, 175*91f16700Schasinglulu _RNG1_K, 176*91f16700Schasinglulu _BKPSRAM, 177*91f16700Schasinglulu _SDMMC1_K, 178*91f16700Schasinglulu _SDMMC2_K, 179*91f16700Schasinglulu _DBGCK, 180*91f16700Schasinglulu _USART3_K, 181*91f16700Schasinglulu _UART4_K, 182*91f16700Schasinglulu _UART5_K, 183*91f16700Schasinglulu _UART7_K, 184*91f16700Schasinglulu _UART8_K, 185*91f16700Schasinglulu _USART6_K, 186*91f16700Schasinglulu _MCE, 187*91f16700Schasinglulu _FMC_K, 188*91f16700Schasinglulu _QSPI_K, 189*91f16700Schasinglulu #if defined(IMAGE_BL32) 190*91f16700Schasinglulu _LTDC, 191*91f16700Schasinglulu _DMA1, 192*91f16700Schasinglulu _DMA2, 193*91f16700Schasinglulu _MDMA, 194*91f16700Schasinglulu _ETH1MAC, 195*91f16700Schasinglulu _USBH, 196*91f16700Schasinglulu _TIM2, 197*91f16700Schasinglulu _TIM3, 198*91f16700Schasinglulu _TIM4, 199*91f16700Schasinglulu _TIM5, 200*91f16700Schasinglulu _TIM6, 201*91f16700Schasinglulu _TIM7, 202*91f16700Schasinglulu _LPTIM1_K, 203*91f16700Schasinglulu _SPI2_K, 204*91f16700Schasinglulu _SPI3_K, 205*91f16700Schasinglulu _SPDIF_K, 206*91f16700Schasinglulu _TIM1, 207*91f16700Schasinglulu _TIM8, 208*91f16700Schasinglulu _SPI1_K, 209*91f16700Schasinglulu _SAI1_K, 210*91f16700Schasinglulu _SAI2_K, 211*91f16700Schasinglulu _DFSDM, 212*91f16700Schasinglulu _FDCAN_K, 213*91f16700Schasinglulu _TIM13, 214*91f16700Schasinglulu _TIM14, 215*91f16700Schasinglulu _TIM16, 216*91f16700Schasinglulu _TIM17, 217*91f16700Schasinglulu _SPI4_K, 218*91f16700Schasinglulu _SPI5_K, 219*91f16700Schasinglulu _I2C1_K, 220*91f16700Schasinglulu _I2C2_K, 221*91f16700Schasinglulu _ADFSDM, 222*91f16700Schasinglulu _LPTIM2_K, 223*91f16700Schasinglulu _LPTIM3_K, 224*91f16700Schasinglulu _LPTIM4_K, 225*91f16700Schasinglulu _LPTIM5_K, 226*91f16700Schasinglulu _VREF, 227*91f16700Schasinglulu _DTS, 228*91f16700Schasinglulu _PMBCTRL, 229*91f16700Schasinglulu _HDP, 230*91f16700Schasinglulu _STGENRO, 231*91f16700Schasinglulu _DCMIPP_K, 232*91f16700Schasinglulu _DMAMUX1, 233*91f16700Schasinglulu _DMAMUX2, 234*91f16700Schasinglulu _DMA3, 235*91f16700Schasinglulu _ADC1_K, 236*91f16700Schasinglulu _ADC2_K, 237*91f16700Schasinglulu _TSC, 238*91f16700Schasinglulu _AXIMC, 239*91f16700Schasinglulu _ETH1CK, 240*91f16700Schasinglulu _ETH1TX, 241*91f16700Schasinglulu _ETH1RX, 242*91f16700Schasinglulu _CRC1, 243*91f16700Schasinglulu _ETH2CK, 244*91f16700Schasinglulu _ETH2TX, 245*91f16700Schasinglulu _ETH2RX, 246*91f16700Schasinglulu _ETH2MAC, 247*91f16700Schasinglulu #endif 248*91f16700Schasinglulu CK_LAST 249*91f16700Schasinglulu }; 250*91f16700Schasinglulu 251*91f16700Schasinglulu /* PARENT CONFIG */ 252*91f16700Schasinglulu static const uint16_t RTC_src[] = { 253*91f16700Schasinglulu _CK_OFF, _CK_LSE, _CK_LSI, _CK_HSE 254*91f16700Schasinglulu }; 255*91f16700Schasinglulu 256*91f16700Schasinglulu static const uint16_t MCO1_src[] = { 257*91f16700Schasinglulu _CK_HSI, _CK_HSE, _CK_CSI, _CK_LSI, _CK_LSE 258*91f16700Schasinglulu }; 259*91f16700Schasinglulu 260*91f16700Schasinglulu static const uint16_t MCO2_src[] = { 261*91f16700Schasinglulu _CKMPU, _CKAXI, _CKMLAHB, _PLL4P, _CK_HSE, _CK_HSI 262*91f16700Schasinglulu }; 263*91f16700Schasinglulu 264*91f16700Schasinglulu static const uint16_t PLL12_src[] = { 265*91f16700Schasinglulu _CK_HSI, _CK_HSE 266*91f16700Schasinglulu }; 267*91f16700Schasinglulu 268*91f16700Schasinglulu static const uint16_t PLL3_src[] = { 269*91f16700Schasinglulu _CK_HSI, _CK_HSE, _CK_CSI 270*91f16700Schasinglulu }; 271*91f16700Schasinglulu 272*91f16700Schasinglulu static const uint16_t PLL4_src[] = { 273*91f16700Schasinglulu _CK_HSI, _CK_HSE, _CK_CSI, _I2SCKIN 274*91f16700Schasinglulu }; 275*91f16700Schasinglulu 276*91f16700Schasinglulu static const uint16_t MPU_src[] = { 277*91f16700Schasinglulu _CK_HSI, _CK_HSE, _PLL1P, _PLL1P_DIV 278*91f16700Schasinglulu }; 279*91f16700Schasinglulu 280*91f16700Schasinglulu static const uint16_t AXI_src[] = { 281*91f16700Schasinglulu _CK_HSI, _CK_HSE, _PLL2P 282*91f16700Schasinglulu }; 283*91f16700Schasinglulu 284*91f16700Schasinglulu static const uint16_t MLAHBS_src[] = { 285*91f16700Schasinglulu _CK_HSI, _CK_HSE, _CK_CSI, _PLL3P 286*91f16700Schasinglulu }; 287*91f16700Schasinglulu 288*91f16700Schasinglulu static const uint16_t CKPER_src[] = { 289*91f16700Schasinglulu _CK_HSI, _CK_CSI, _CK_HSE, _CK_OFF 290*91f16700Schasinglulu }; 291*91f16700Schasinglulu 292*91f16700Schasinglulu static const uint16_t I2C12_src[] = { 293*91f16700Schasinglulu _PCLK1, _PLL4R, _CK_HSI, _CK_CSI 294*91f16700Schasinglulu }; 295*91f16700Schasinglulu 296*91f16700Schasinglulu static const uint16_t I2C3_src[] = { 297*91f16700Schasinglulu _PCLK6, _PLL4R, _CK_HSI, _CK_CSI 298*91f16700Schasinglulu }; 299*91f16700Schasinglulu 300*91f16700Schasinglulu static const uint16_t I2C4_src[] = { 301*91f16700Schasinglulu _PCLK6, _PLL4R, _CK_HSI, _CK_CSI 302*91f16700Schasinglulu }; 303*91f16700Schasinglulu 304*91f16700Schasinglulu static const uint16_t I2C5_src[] = { 305*91f16700Schasinglulu _PCLK6, _PLL4R, _CK_HSI, _CK_CSI 306*91f16700Schasinglulu }; 307*91f16700Schasinglulu 308*91f16700Schasinglulu static const uint16_t SPI1_src[] = { 309*91f16700Schasinglulu _PLL4P, _PLL3Q, _I2SCKIN, _CKPER, _PLL3R 310*91f16700Schasinglulu }; 311*91f16700Schasinglulu 312*91f16700Schasinglulu static const uint16_t SPI23_src[] = { 313*91f16700Schasinglulu _PLL4P, _PLL3Q, _I2SCKIN, _CKPER, _PLL3R 314*91f16700Schasinglulu }; 315*91f16700Schasinglulu 316*91f16700Schasinglulu static const uint16_t SPI4_src[] = { 317*91f16700Schasinglulu _PCLK6, _PLL4Q, _CK_HSI, _CK_CSI, _CK_HSE, _I2SCKIN 318*91f16700Schasinglulu }; 319*91f16700Schasinglulu 320*91f16700Schasinglulu static const uint16_t SPI5_src[] = { 321*91f16700Schasinglulu _PCLK6, _PLL4Q, _CK_HSI, _CK_CSI, _CK_HSE 322*91f16700Schasinglulu }; 323*91f16700Schasinglulu 324*91f16700Schasinglulu static const uint16_t UART1_src[] = { 325*91f16700Schasinglulu _PCLK6, _PLL3Q, _CK_HSI, _CK_CSI, _PLL4Q, _CK_HSE 326*91f16700Schasinglulu }; 327*91f16700Schasinglulu 328*91f16700Schasinglulu static const uint16_t UART2_src[] = { 329*91f16700Schasinglulu _PCLK6, _PLL3Q, _CK_HSI, _CK_CSI, _PLL4Q, _CK_HSE 330*91f16700Schasinglulu }; 331*91f16700Schasinglulu 332*91f16700Schasinglulu static const uint16_t UART35_src[] = { 333*91f16700Schasinglulu _PCLK1, _PLL4Q, _CK_HSI, _CK_CSI, _CK_HSE 334*91f16700Schasinglulu }; 335*91f16700Schasinglulu 336*91f16700Schasinglulu static const uint16_t UART4_src[] = { 337*91f16700Schasinglulu _PCLK1, _PLL4Q, _CK_HSI, _CK_CSI, _CK_HSE 338*91f16700Schasinglulu }; 339*91f16700Schasinglulu 340*91f16700Schasinglulu static const uint16_t UART6_src[] = { 341*91f16700Schasinglulu _PCLK2, _PLL4Q, _CK_HSI, _CK_CSI, _CK_HSE 342*91f16700Schasinglulu }; 343*91f16700Schasinglulu 344*91f16700Schasinglulu static const uint16_t UART78_src[] = { 345*91f16700Schasinglulu _PCLK1, _PLL4Q, _CK_HSI, _CK_CSI, _CK_HSE 346*91f16700Schasinglulu }; 347*91f16700Schasinglulu 348*91f16700Schasinglulu static const uint16_t LPTIM1_src[] = { 349*91f16700Schasinglulu _PCLK1, _PLL4P, _PLL3Q, _CK_LSE, _CK_LSI, _CKPER 350*91f16700Schasinglulu }; 351*91f16700Schasinglulu 352*91f16700Schasinglulu static const uint16_t LPTIM2_src[] = { 353*91f16700Schasinglulu _PCLK3, _PLL4Q, _CKPER, _CK_LSE, _CK_LSI 354*91f16700Schasinglulu }; 355*91f16700Schasinglulu 356*91f16700Schasinglulu static const uint16_t LPTIM3_src[] = { 357*91f16700Schasinglulu _PCLK3, _PLL4Q, _CKPER, _CK_LSE, _CK_LSI 358*91f16700Schasinglulu }; 359*91f16700Schasinglulu 360*91f16700Schasinglulu static const uint16_t LPTIM45_src[] = { 361*91f16700Schasinglulu _PCLK3, _PLL4P, _PLL3Q, _CK_LSE, _CK_LSI, _CKPER 362*91f16700Schasinglulu }; 363*91f16700Schasinglulu 364*91f16700Schasinglulu static const uint16_t SAI1_src[] = { 365*91f16700Schasinglulu _PLL4Q, _PLL3Q, _I2SCKIN, _CKPER, _PLL3R 366*91f16700Schasinglulu }; 367*91f16700Schasinglulu 368*91f16700Schasinglulu static const uint16_t SAI2_src[] = { 369*91f16700Schasinglulu _PLL4Q, _PLL3Q, _I2SCKIN, _CKPER, _NO_ID, _PLL3R 370*91f16700Schasinglulu }; 371*91f16700Schasinglulu 372*91f16700Schasinglulu static const uint16_t FDCAN_src[] = { 373*91f16700Schasinglulu _CK_HSE, _PLL3Q, _PLL4Q, _PLL4R 374*91f16700Schasinglulu }; 375*91f16700Schasinglulu 376*91f16700Schasinglulu static const uint16_t SPDIF_src[] = { 377*91f16700Schasinglulu _PLL4P, _PLL3Q, _CK_HSI 378*91f16700Schasinglulu }; 379*91f16700Schasinglulu 380*91f16700Schasinglulu static const uint16_t ADC1_src[] = { 381*91f16700Schasinglulu _PLL4R, _CKPER, _PLL3Q 382*91f16700Schasinglulu }; 383*91f16700Schasinglulu 384*91f16700Schasinglulu static const uint16_t ADC2_src[] = { 385*91f16700Schasinglulu _PLL4R, _CKPER, _PLL3Q 386*91f16700Schasinglulu }; 387*91f16700Schasinglulu 388*91f16700Schasinglulu static const uint16_t SDMMC1_src[] = { 389*91f16700Schasinglulu _CKAXI, _PLL3R, _PLL4P, _CK_HSI 390*91f16700Schasinglulu }; 391*91f16700Schasinglulu 392*91f16700Schasinglulu static const uint16_t SDMMC2_src[] = { 393*91f16700Schasinglulu _CKAXI, _PLL3R, _PLL4P, _CK_HSI 394*91f16700Schasinglulu }; 395*91f16700Schasinglulu 396*91f16700Schasinglulu static const uint16_t ETH1_src[] = { 397*91f16700Schasinglulu _PLL4P, _PLL3Q 398*91f16700Schasinglulu }; 399*91f16700Schasinglulu 400*91f16700Schasinglulu static const uint16_t ETH2_src[] = { 401*91f16700Schasinglulu _PLL4P, _PLL3Q 402*91f16700Schasinglulu }; 403*91f16700Schasinglulu 404*91f16700Schasinglulu static const uint16_t USBPHY_src[] = { 405*91f16700Schasinglulu _CK_HSE, _PLL4R, _HSE_DIV2 406*91f16700Schasinglulu }; 407*91f16700Schasinglulu 408*91f16700Schasinglulu static const uint16_t USBO_src[] = { 409*91f16700Schasinglulu _PLL4R, _USB_PHY_48 410*91f16700Schasinglulu }; 411*91f16700Schasinglulu 412*91f16700Schasinglulu static const uint16_t QSPI_src[] = { 413*91f16700Schasinglulu _CKAXI, _PLL3R, _PLL4P, _CKPER 414*91f16700Schasinglulu }; 415*91f16700Schasinglulu 416*91f16700Schasinglulu static const uint16_t FMC_src[] = { 417*91f16700Schasinglulu _CKAXI, _PLL3R, _PLL4P, _CKPER 418*91f16700Schasinglulu }; 419*91f16700Schasinglulu 420*91f16700Schasinglulu /* Position 2 of RNG1 mux is reserved */ 421*91f16700Schasinglulu static const uint16_t RNG1_src[] = { 422*91f16700Schasinglulu _CK_CSI, _PLL4R, _CK_OFF, _CK_LSI 423*91f16700Schasinglulu }; 424*91f16700Schasinglulu 425*91f16700Schasinglulu static const uint16_t STGEN_src[] = { 426*91f16700Schasinglulu _CK_HSI, _CK_HSE 427*91f16700Schasinglulu }; 428*91f16700Schasinglulu 429*91f16700Schasinglulu static const uint16_t DCMIPP_src[] = { 430*91f16700Schasinglulu _CKAXI, _PLL2Q, _PLL4P, _CKPER 431*91f16700Schasinglulu }; 432*91f16700Schasinglulu 433*91f16700Schasinglulu static const uint16_t SAES_src[] = { 434*91f16700Schasinglulu _CKAXI, _CKPER, _PLL4R, _CK_LSI 435*91f16700Schasinglulu }; 436*91f16700Schasinglulu 437*91f16700Schasinglulu #define MUX_CFG(id, src, _offset, _shift, _witdh)[id] = {\ 438*91f16700Schasinglulu .id_parents = src,\ 439*91f16700Schasinglulu .num_parents = ARRAY_SIZE(src),\ 440*91f16700Schasinglulu .mux = &(struct mux_cfg) {\ 441*91f16700Schasinglulu .offset = (_offset),\ 442*91f16700Schasinglulu .shift = (_shift),\ 443*91f16700Schasinglulu .width = (_witdh),\ 444*91f16700Schasinglulu .bitrdy = MUX_NO_BIT_RDY,\ 445*91f16700Schasinglulu },\ 446*91f16700Schasinglulu } 447*91f16700Schasinglulu 448*91f16700Schasinglulu #define MUX_RDY_CFG(id, src, _offset, _shift, _witdh)[id] = {\ 449*91f16700Schasinglulu .id_parents = src,\ 450*91f16700Schasinglulu .num_parents = ARRAY_SIZE(src),\ 451*91f16700Schasinglulu .mux = &(struct mux_cfg) {\ 452*91f16700Schasinglulu .offset = (_offset),\ 453*91f16700Schasinglulu .shift = (_shift),\ 454*91f16700Schasinglulu .width = (_witdh),\ 455*91f16700Schasinglulu .bitrdy = 31,\ 456*91f16700Schasinglulu },\ 457*91f16700Schasinglulu } 458*91f16700Schasinglulu 459*91f16700Schasinglulu static const struct parent_cfg parent_mp13[MUX_MAX] = { 460*91f16700Schasinglulu MUX_CFG(MUX_ADC1, ADC1_src, RCC_ADC12CKSELR, 0, 2), 461*91f16700Schasinglulu MUX_CFG(MUX_ADC2, ADC2_src, RCC_ADC12CKSELR, 2, 2), 462*91f16700Schasinglulu MUX_RDY_CFG(MUX_AXI, AXI_src, RCC_ASSCKSELR, 0, 3), 463*91f16700Schasinglulu MUX_CFG(MUX_CKPER, CKPER_src, RCC_CPERCKSELR, 0, 2), 464*91f16700Schasinglulu MUX_CFG(MUX_DCMIPP, DCMIPP_src, RCC_DCMIPPCKSELR, 0, 2), 465*91f16700Schasinglulu MUX_CFG(MUX_ETH1, ETH1_src, RCC_ETH12CKSELR, 0, 2), 466*91f16700Schasinglulu MUX_CFG(MUX_ETH2, ETH2_src, RCC_ETH12CKSELR, 8, 2), 467*91f16700Schasinglulu MUX_CFG(MUX_FDCAN, FDCAN_src, RCC_FDCANCKSELR, 0, 2), 468*91f16700Schasinglulu MUX_CFG(MUX_FMC, FMC_src, RCC_FMCCKSELR, 0, 2), 469*91f16700Schasinglulu MUX_CFG(MUX_I2C12, I2C12_src, RCC_I2C12CKSELR, 0, 3), 470*91f16700Schasinglulu MUX_CFG(MUX_I2C3, I2C3_src, RCC_I2C345CKSELR, 0, 3), 471*91f16700Schasinglulu MUX_CFG(MUX_I2C4, I2C4_src, RCC_I2C345CKSELR, 3, 3), 472*91f16700Schasinglulu MUX_CFG(MUX_I2C5, I2C5_src, RCC_I2C345CKSELR, 6, 3), 473*91f16700Schasinglulu MUX_CFG(MUX_LPTIM1, LPTIM1_src, RCC_LPTIM1CKSELR, 0, 3), 474*91f16700Schasinglulu MUX_CFG(MUX_LPTIM2, LPTIM2_src, RCC_LPTIM23CKSELR, 0, 3), 475*91f16700Schasinglulu MUX_CFG(MUX_LPTIM3, LPTIM3_src, RCC_LPTIM23CKSELR, 3, 3), 476*91f16700Schasinglulu MUX_CFG(MUX_LPTIM45, LPTIM45_src, RCC_LPTIM45CKSELR, 0, 3), 477*91f16700Schasinglulu MUX_CFG(MUX_MCO1, MCO1_src, RCC_MCO1CFGR, 0, 3), 478*91f16700Schasinglulu MUX_CFG(MUX_MCO2, MCO2_src, RCC_MCO2CFGR, 0, 3), 479*91f16700Schasinglulu MUX_RDY_CFG(MUX_MLAHB, MLAHBS_src, RCC_MSSCKSELR, 0, 2), 480*91f16700Schasinglulu MUX_RDY_CFG(MUX_MPU, MPU_src, RCC_MPCKSELR, 0, 2), 481*91f16700Schasinglulu MUX_RDY_CFG(MUX_PLL12, PLL12_src, RCC_RCK12SELR, 0, 2), 482*91f16700Schasinglulu MUX_RDY_CFG(MUX_PLL3, PLL3_src, RCC_RCK3SELR, 0, 2), 483*91f16700Schasinglulu MUX_RDY_CFG(MUX_PLL4, PLL4_src, RCC_RCK4SELR, 0, 2), 484*91f16700Schasinglulu MUX_CFG(MUX_QSPI, QSPI_src, RCC_QSPICKSELR, 0, 2), 485*91f16700Schasinglulu MUX_CFG(MUX_RNG1, RNG1_src, RCC_RNG1CKSELR, 0, 2), 486*91f16700Schasinglulu MUX_CFG(MUX_RTC, RTC_src, RCC_BDCR, 16, 2), 487*91f16700Schasinglulu MUX_CFG(MUX_SAES, SAES_src, RCC_SAESCKSELR, 0, 2), 488*91f16700Schasinglulu MUX_CFG(MUX_SAI1, SAI1_src, RCC_SAI1CKSELR, 0, 3), 489*91f16700Schasinglulu MUX_CFG(MUX_SAI2, SAI2_src, RCC_SAI2CKSELR, 0, 3), 490*91f16700Schasinglulu MUX_CFG(MUX_SDMMC1, SDMMC1_src, RCC_SDMMC12CKSELR, 0, 3), 491*91f16700Schasinglulu MUX_CFG(MUX_SDMMC2, SDMMC2_src, RCC_SDMMC12CKSELR, 3, 3), 492*91f16700Schasinglulu MUX_CFG(MUX_SPDIF, SPDIF_src, RCC_SPDIFCKSELR, 0, 2), 493*91f16700Schasinglulu MUX_CFG(MUX_SPI1, SPI1_src, RCC_SPI2S1CKSELR, 0, 3), 494*91f16700Schasinglulu MUX_CFG(MUX_SPI23, SPI23_src, RCC_SPI2S23CKSELR, 0, 3), 495*91f16700Schasinglulu MUX_CFG(MUX_SPI4, SPI4_src, RCC_SPI45CKSELR, 0, 3), 496*91f16700Schasinglulu MUX_CFG(MUX_SPI5, SPI5_src, RCC_SPI45CKSELR, 3, 3), 497*91f16700Schasinglulu MUX_CFG(MUX_STGEN, STGEN_src, RCC_STGENCKSELR, 0, 2), 498*91f16700Schasinglulu MUX_CFG(MUX_UART1, UART1_src, RCC_UART12CKSELR, 0, 3), 499*91f16700Schasinglulu MUX_CFG(MUX_UART2, UART2_src, RCC_UART12CKSELR, 3, 3), 500*91f16700Schasinglulu MUX_CFG(MUX_UART35, UART35_src, RCC_UART35CKSELR, 0, 3), 501*91f16700Schasinglulu MUX_CFG(MUX_UART4, UART4_src, RCC_UART4CKSELR, 0, 3), 502*91f16700Schasinglulu MUX_CFG(MUX_UART6, UART6_src, RCC_UART6CKSELR, 0, 3), 503*91f16700Schasinglulu MUX_CFG(MUX_UART78, UART78_src, RCC_UART78CKSELR, 0, 3), 504*91f16700Schasinglulu MUX_CFG(MUX_USBO, USBO_src, RCC_USBCKSELR, 4, 1), 505*91f16700Schasinglulu MUX_CFG(MUX_USBPHY, USBPHY_src, RCC_USBCKSELR, 0, 2), 506*91f16700Schasinglulu }; 507*91f16700Schasinglulu 508*91f16700Schasinglulu /* 509*91f16700Schasinglulu * GATE CONFIG 510*91f16700Schasinglulu */ 511*91f16700Schasinglulu 512*91f16700Schasinglulu enum enum_gate_cfg { 513*91f16700Schasinglulu GATE_ZERO, /* reserved for no gate */ 514*91f16700Schasinglulu GATE_LSE, 515*91f16700Schasinglulu GATE_RTCCK, 516*91f16700Schasinglulu GATE_LSI, 517*91f16700Schasinglulu GATE_HSI, 518*91f16700Schasinglulu GATE_CSI, 519*91f16700Schasinglulu GATE_HSE, 520*91f16700Schasinglulu GATE_LSI_RDY, 521*91f16700Schasinglulu GATE_CSI_RDY, 522*91f16700Schasinglulu GATE_LSE_RDY, 523*91f16700Schasinglulu GATE_HSE_RDY, 524*91f16700Schasinglulu GATE_HSI_RDY, 525*91f16700Schasinglulu GATE_MCO1, 526*91f16700Schasinglulu GATE_MCO2, 527*91f16700Schasinglulu GATE_DBGCK, 528*91f16700Schasinglulu GATE_TRACECK, 529*91f16700Schasinglulu GATE_PLL1, 530*91f16700Schasinglulu GATE_PLL1_DIVP, 531*91f16700Schasinglulu GATE_PLL1_DIVQ, 532*91f16700Schasinglulu GATE_PLL1_DIVR, 533*91f16700Schasinglulu GATE_PLL2, 534*91f16700Schasinglulu GATE_PLL2_DIVP, 535*91f16700Schasinglulu GATE_PLL2_DIVQ, 536*91f16700Schasinglulu GATE_PLL2_DIVR, 537*91f16700Schasinglulu GATE_PLL3, 538*91f16700Schasinglulu GATE_PLL3_DIVP, 539*91f16700Schasinglulu GATE_PLL3_DIVQ, 540*91f16700Schasinglulu GATE_PLL3_DIVR, 541*91f16700Schasinglulu GATE_PLL4, 542*91f16700Schasinglulu GATE_PLL4_DIVP, 543*91f16700Schasinglulu GATE_PLL4_DIVQ, 544*91f16700Schasinglulu GATE_PLL4_DIVR, 545*91f16700Schasinglulu GATE_DDRC1, 546*91f16700Schasinglulu GATE_DDRC1LP, 547*91f16700Schasinglulu GATE_DDRPHYC, 548*91f16700Schasinglulu GATE_DDRPHYCLP, 549*91f16700Schasinglulu GATE_DDRCAPB, 550*91f16700Schasinglulu GATE_DDRCAPBLP, 551*91f16700Schasinglulu GATE_AXIDCG, 552*91f16700Schasinglulu GATE_DDRPHYCAPB, 553*91f16700Schasinglulu GATE_DDRPHYCAPBLP, 554*91f16700Schasinglulu GATE_TIM2, 555*91f16700Schasinglulu GATE_TIM3, 556*91f16700Schasinglulu GATE_TIM4, 557*91f16700Schasinglulu GATE_TIM5, 558*91f16700Schasinglulu GATE_TIM6, 559*91f16700Schasinglulu GATE_TIM7, 560*91f16700Schasinglulu GATE_LPTIM1, 561*91f16700Schasinglulu GATE_SPI2, 562*91f16700Schasinglulu GATE_SPI3, 563*91f16700Schasinglulu GATE_USART3, 564*91f16700Schasinglulu GATE_UART4, 565*91f16700Schasinglulu GATE_UART5, 566*91f16700Schasinglulu GATE_UART7, 567*91f16700Schasinglulu GATE_UART8, 568*91f16700Schasinglulu GATE_I2C1, 569*91f16700Schasinglulu GATE_I2C2, 570*91f16700Schasinglulu GATE_SPDIF, 571*91f16700Schasinglulu GATE_TIM1, 572*91f16700Schasinglulu GATE_TIM8, 573*91f16700Schasinglulu GATE_SPI1, 574*91f16700Schasinglulu GATE_USART6, 575*91f16700Schasinglulu GATE_SAI1, 576*91f16700Schasinglulu GATE_SAI2, 577*91f16700Schasinglulu GATE_DFSDM, 578*91f16700Schasinglulu GATE_ADFSDM, 579*91f16700Schasinglulu GATE_FDCAN, 580*91f16700Schasinglulu GATE_LPTIM2, 581*91f16700Schasinglulu GATE_LPTIM3, 582*91f16700Schasinglulu GATE_LPTIM4, 583*91f16700Schasinglulu GATE_LPTIM5, 584*91f16700Schasinglulu GATE_VREF, 585*91f16700Schasinglulu GATE_DTS, 586*91f16700Schasinglulu GATE_PMBCTRL, 587*91f16700Schasinglulu GATE_HDP, 588*91f16700Schasinglulu GATE_SYSCFG, 589*91f16700Schasinglulu GATE_DCMIPP, 590*91f16700Schasinglulu GATE_DDRPERFM, 591*91f16700Schasinglulu GATE_IWDG2APB, 592*91f16700Schasinglulu GATE_USBPHY, 593*91f16700Schasinglulu GATE_STGENRO, 594*91f16700Schasinglulu GATE_LTDC, 595*91f16700Schasinglulu GATE_RTCAPB, 596*91f16700Schasinglulu GATE_TZC, 597*91f16700Schasinglulu GATE_ETZPC, 598*91f16700Schasinglulu GATE_IWDG1APB, 599*91f16700Schasinglulu GATE_BSEC, 600*91f16700Schasinglulu GATE_STGENC, 601*91f16700Schasinglulu GATE_USART1, 602*91f16700Schasinglulu GATE_USART2, 603*91f16700Schasinglulu GATE_SPI4, 604*91f16700Schasinglulu GATE_SPI5, 605*91f16700Schasinglulu GATE_I2C3, 606*91f16700Schasinglulu GATE_I2C4, 607*91f16700Schasinglulu GATE_I2C5, 608*91f16700Schasinglulu GATE_TIM12, 609*91f16700Schasinglulu GATE_TIM13, 610*91f16700Schasinglulu GATE_TIM14, 611*91f16700Schasinglulu GATE_TIM15, 612*91f16700Schasinglulu GATE_TIM16, 613*91f16700Schasinglulu GATE_TIM17, 614*91f16700Schasinglulu GATE_DMA1, 615*91f16700Schasinglulu GATE_DMA2, 616*91f16700Schasinglulu GATE_DMAMUX1, 617*91f16700Schasinglulu GATE_DMA3, 618*91f16700Schasinglulu GATE_DMAMUX2, 619*91f16700Schasinglulu GATE_ADC1, 620*91f16700Schasinglulu GATE_ADC2, 621*91f16700Schasinglulu GATE_USBO, 622*91f16700Schasinglulu GATE_TSC, 623*91f16700Schasinglulu GATE_GPIOA, 624*91f16700Schasinglulu GATE_GPIOB, 625*91f16700Schasinglulu GATE_GPIOC, 626*91f16700Schasinglulu GATE_GPIOD, 627*91f16700Schasinglulu GATE_GPIOE, 628*91f16700Schasinglulu GATE_GPIOF, 629*91f16700Schasinglulu GATE_GPIOG, 630*91f16700Schasinglulu GATE_GPIOH, 631*91f16700Schasinglulu GATE_GPIOI, 632*91f16700Schasinglulu GATE_PKA, 633*91f16700Schasinglulu GATE_SAES, 634*91f16700Schasinglulu GATE_CRYP1, 635*91f16700Schasinglulu GATE_HASH1, 636*91f16700Schasinglulu GATE_RNG1, 637*91f16700Schasinglulu GATE_BKPSRAM, 638*91f16700Schasinglulu GATE_AXIMC, 639*91f16700Schasinglulu GATE_MCE, 640*91f16700Schasinglulu GATE_ETH1CK, 641*91f16700Schasinglulu GATE_ETH1TX, 642*91f16700Schasinglulu GATE_ETH1RX, 643*91f16700Schasinglulu GATE_ETH1MAC, 644*91f16700Schasinglulu GATE_FMC, 645*91f16700Schasinglulu GATE_QSPI, 646*91f16700Schasinglulu GATE_SDMMC1, 647*91f16700Schasinglulu GATE_SDMMC2, 648*91f16700Schasinglulu GATE_CRC1, 649*91f16700Schasinglulu GATE_USBH, 650*91f16700Schasinglulu GATE_ETH2CK, 651*91f16700Schasinglulu GATE_ETH2TX, 652*91f16700Schasinglulu GATE_ETH2RX, 653*91f16700Schasinglulu GATE_ETH2MAC, 654*91f16700Schasinglulu GATE_MDMA, 655*91f16700Schasinglulu 656*91f16700Schasinglulu LAST_GATE 657*91f16700Schasinglulu }; 658*91f16700Schasinglulu 659*91f16700Schasinglulu #define GATE_CFG(id, _offset, _bit_idx, _offset_clr)[id] = {\ 660*91f16700Schasinglulu .offset = (_offset),\ 661*91f16700Schasinglulu .bit_idx = (_bit_idx),\ 662*91f16700Schasinglulu .set_clr = (_offset_clr),\ 663*91f16700Schasinglulu } 664*91f16700Schasinglulu 665*91f16700Schasinglulu static const struct gate_cfg gates_mp13[LAST_GATE] = { 666*91f16700Schasinglulu GATE_CFG(GATE_LSE, RCC_BDCR, 0, 0), 667*91f16700Schasinglulu GATE_CFG(GATE_RTCCK, RCC_BDCR, 20, 0), 668*91f16700Schasinglulu GATE_CFG(GATE_LSI, RCC_RDLSICR, 0, 0), 669*91f16700Schasinglulu GATE_CFG(GATE_HSI, RCC_OCENSETR, 0, 1), 670*91f16700Schasinglulu GATE_CFG(GATE_CSI, RCC_OCENSETR, 4, 1), 671*91f16700Schasinglulu GATE_CFG(GATE_HSE, RCC_OCENSETR, 8, 1), 672*91f16700Schasinglulu GATE_CFG(GATE_LSI_RDY, RCC_RDLSICR, 1, 0), 673*91f16700Schasinglulu GATE_CFG(GATE_CSI_RDY, RCC_OCRDYR, 4, 0), 674*91f16700Schasinglulu GATE_CFG(GATE_LSE_RDY, RCC_BDCR, 2, 0), 675*91f16700Schasinglulu GATE_CFG(GATE_HSE_RDY, RCC_OCRDYR, 8, 0), 676*91f16700Schasinglulu GATE_CFG(GATE_HSI_RDY, RCC_OCRDYR, 0, 0), 677*91f16700Schasinglulu GATE_CFG(GATE_MCO1, RCC_MCO1CFGR, 12, 0), 678*91f16700Schasinglulu GATE_CFG(GATE_MCO2, RCC_MCO2CFGR, 12, 0), 679*91f16700Schasinglulu GATE_CFG(GATE_DBGCK, RCC_DBGCFGR, 8, 0), 680*91f16700Schasinglulu GATE_CFG(GATE_TRACECK, RCC_DBGCFGR, 9, 0), 681*91f16700Schasinglulu GATE_CFG(GATE_PLL1, RCC_PLL1CR, 0, 0), 682*91f16700Schasinglulu GATE_CFG(GATE_PLL1_DIVP, RCC_PLL1CR, 4, 0), 683*91f16700Schasinglulu GATE_CFG(GATE_PLL1_DIVQ, RCC_PLL1CR, 5, 0), 684*91f16700Schasinglulu GATE_CFG(GATE_PLL1_DIVR, RCC_PLL1CR, 6, 0), 685*91f16700Schasinglulu GATE_CFG(GATE_PLL2, RCC_PLL2CR, 0, 0), 686*91f16700Schasinglulu GATE_CFG(GATE_PLL2_DIVP, RCC_PLL2CR, 4, 0), 687*91f16700Schasinglulu GATE_CFG(GATE_PLL2_DIVQ, RCC_PLL2CR, 5, 0), 688*91f16700Schasinglulu GATE_CFG(GATE_PLL2_DIVR, RCC_PLL2CR, 6, 0), 689*91f16700Schasinglulu GATE_CFG(GATE_PLL3, RCC_PLL3CR, 0, 0), 690*91f16700Schasinglulu GATE_CFG(GATE_PLL3_DIVP, RCC_PLL3CR, 4, 0), 691*91f16700Schasinglulu GATE_CFG(GATE_PLL3_DIVQ, RCC_PLL3CR, 5, 0), 692*91f16700Schasinglulu GATE_CFG(GATE_PLL3_DIVR, RCC_PLL3CR, 6, 0), 693*91f16700Schasinglulu GATE_CFG(GATE_PLL4, RCC_PLL4CR, 0, 0), 694*91f16700Schasinglulu GATE_CFG(GATE_PLL4_DIVP, RCC_PLL4CR, 4, 0), 695*91f16700Schasinglulu GATE_CFG(GATE_PLL4_DIVQ, RCC_PLL4CR, 5, 0), 696*91f16700Schasinglulu GATE_CFG(GATE_PLL4_DIVR, RCC_PLL4CR, 6, 0), 697*91f16700Schasinglulu GATE_CFG(GATE_DDRC1, RCC_DDRITFCR, 0, 0), 698*91f16700Schasinglulu GATE_CFG(GATE_DDRC1LP, RCC_DDRITFCR, 1, 0), 699*91f16700Schasinglulu GATE_CFG(GATE_DDRPHYC, RCC_DDRITFCR, 4, 0), 700*91f16700Schasinglulu GATE_CFG(GATE_DDRPHYCLP, RCC_DDRITFCR, 5, 0), 701*91f16700Schasinglulu GATE_CFG(GATE_DDRCAPB, RCC_DDRITFCR, 6, 0), 702*91f16700Schasinglulu GATE_CFG(GATE_DDRCAPBLP, RCC_DDRITFCR, 7, 0), 703*91f16700Schasinglulu GATE_CFG(GATE_AXIDCG, RCC_DDRITFCR, 8, 0), 704*91f16700Schasinglulu GATE_CFG(GATE_DDRPHYCAPB, RCC_DDRITFCR, 9, 0), 705*91f16700Schasinglulu GATE_CFG(GATE_DDRPHYCAPBLP, RCC_DDRITFCR, 10, 0), 706*91f16700Schasinglulu GATE_CFG(GATE_TIM2, RCC_MP_APB1ENSETR, 0, 1), 707*91f16700Schasinglulu GATE_CFG(GATE_TIM3, RCC_MP_APB1ENSETR, 1, 1), 708*91f16700Schasinglulu GATE_CFG(GATE_TIM4, RCC_MP_APB1ENSETR, 2, 1), 709*91f16700Schasinglulu GATE_CFG(GATE_TIM5, RCC_MP_APB1ENSETR, 3, 1), 710*91f16700Schasinglulu GATE_CFG(GATE_TIM6, RCC_MP_APB1ENSETR, 4, 1), 711*91f16700Schasinglulu GATE_CFG(GATE_TIM7, RCC_MP_APB1ENSETR, 5, 1), 712*91f16700Schasinglulu GATE_CFG(GATE_LPTIM1, RCC_MP_APB1ENSETR, 9, 1), 713*91f16700Schasinglulu GATE_CFG(GATE_SPI2, RCC_MP_APB1ENSETR, 11, 1), 714*91f16700Schasinglulu GATE_CFG(GATE_SPI3, RCC_MP_APB1ENSETR, 12, 1), 715*91f16700Schasinglulu GATE_CFG(GATE_USART3, RCC_MP_APB1ENSETR, 15, 1), 716*91f16700Schasinglulu GATE_CFG(GATE_UART4, RCC_MP_APB1ENSETR, 16, 1), 717*91f16700Schasinglulu GATE_CFG(GATE_UART5, RCC_MP_APB1ENSETR, 17, 1), 718*91f16700Schasinglulu GATE_CFG(GATE_UART7, RCC_MP_APB1ENSETR, 18, 1), 719*91f16700Schasinglulu GATE_CFG(GATE_UART8, RCC_MP_APB1ENSETR, 19, 1), 720*91f16700Schasinglulu GATE_CFG(GATE_I2C1, RCC_MP_APB1ENSETR, 21, 1), 721*91f16700Schasinglulu GATE_CFG(GATE_I2C2, RCC_MP_APB1ENSETR, 22, 1), 722*91f16700Schasinglulu GATE_CFG(GATE_SPDIF, RCC_MP_APB1ENSETR, 26, 1), 723*91f16700Schasinglulu GATE_CFG(GATE_TIM1, RCC_MP_APB2ENSETR, 0, 1), 724*91f16700Schasinglulu GATE_CFG(GATE_TIM8, RCC_MP_APB2ENSETR, 1, 1), 725*91f16700Schasinglulu GATE_CFG(GATE_SPI1, RCC_MP_APB2ENSETR, 8, 1), 726*91f16700Schasinglulu GATE_CFG(GATE_USART6, RCC_MP_APB2ENSETR, 13, 1), 727*91f16700Schasinglulu GATE_CFG(GATE_SAI1, RCC_MP_APB2ENSETR, 16, 1), 728*91f16700Schasinglulu GATE_CFG(GATE_SAI2, RCC_MP_APB2ENSETR, 17, 1), 729*91f16700Schasinglulu GATE_CFG(GATE_DFSDM, RCC_MP_APB2ENSETR, 20, 1), 730*91f16700Schasinglulu GATE_CFG(GATE_ADFSDM, RCC_MP_APB2ENSETR, 21, 1), 731*91f16700Schasinglulu GATE_CFG(GATE_FDCAN, RCC_MP_APB2ENSETR, 24, 1), 732*91f16700Schasinglulu GATE_CFG(GATE_LPTIM2, RCC_MP_APB3ENSETR, 0, 1), 733*91f16700Schasinglulu GATE_CFG(GATE_LPTIM3, RCC_MP_APB3ENSETR, 1, 1), 734*91f16700Schasinglulu GATE_CFG(GATE_LPTIM4, RCC_MP_APB3ENSETR, 2, 1), 735*91f16700Schasinglulu GATE_CFG(GATE_LPTIM5, RCC_MP_APB3ENSETR, 3, 1), 736*91f16700Schasinglulu GATE_CFG(GATE_VREF, RCC_MP_APB3ENSETR, 13, 1), 737*91f16700Schasinglulu GATE_CFG(GATE_DTS, RCC_MP_APB3ENSETR, 16, 1), 738*91f16700Schasinglulu GATE_CFG(GATE_PMBCTRL, RCC_MP_APB3ENSETR, 17, 1), 739*91f16700Schasinglulu GATE_CFG(GATE_HDP, RCC_MP_APB3ENSETR, 20, 1), 740*91f16700Schasinglulu GATE_CFG(GATE_SYSCFG, RCC_MP_S_APB3ENSETR, 0, 1), 741*91f16700Schasinglulu GATE_CFG(GATE_DCMIPP, RCC_MP_APB4ENSETR, 1, 1), 742*91f16700Schasinglulu GATE_CFG(GATE_DDRPERFM, RCC_MP_APB4ENSETR, 8, 1), 743*91f16700Schasinglulu GATE_CFG(GATE_IWDG2APB, RCC_MP_APB4ENSETR, 15, 1), 744*91f16700Schasinglulu GATE_CFG(GATE_USBPHY, RCC_MP_APB4ENSETR, 16, 1), 745*91f16700Schasinglulu GATE_CFG(GATE_STGENRO, RCC_MP_APB4ENSETR, 20, 1), 746*91f16700Schasinglulu GATE_CFG(GATE_LTDC, RCC_MP_S_APB4ENSETR, 0, 1), 747*91f16700Schasinglulu GATE_CFG(GATE_RTCAPB, RCC_MP_APB5ENSETR, 8, 1), 748*91f16700Schasinglulu GATE_CFG(GATE_TZC, RCC_MP_APB5ENSETR, 11, 1), 749*91f16700Schasinglulu GATE_CFG(GATE_ETZPC, RCC_MP_APB5ENSETR, 13, 1), 750*91f16700Schasinglulu GATE_CFG(GATE_IWDG1APB, RCC_MP_APB5ENSETR, 15, 1), 751*91f16700Schasinglulu GATE_CFG(GATE_BSEC, RCC_MP_APB5ENSETR, 16, 1), 752*91f16700Schasinglulu GATE_CFG(GATE_STGENC, RCC_MP_APB5ENSETR, 20, 1), 753*91f16700Schasinglulu GATE_CFG(GATE_USART1, RCC_MP_APB6ENSETR, 0, 1), 754*91f16700Schasinglulu GATE_CFG(GATE_USART2, RCC_MP_APB6ENSETR, 1, 1), 755*91f16700Schasinglulu GATE_CFG(GATE_SPI4, RCC_MP_APB6ENSETR, 2, 1), 756*91f16700Schasinglulu GATE_CFG(GATE_SPI5, RCC_MP_APB6ENSETR, 3, 1), 757*91f16700Schasinglulu GATE_CFG(GATE_I2C3, RCC_MP_APB6ENSETR, 4, 1), 758*91f16700Schasinglulu GATE_CFG(GATE_I2C4, RCC_MP_APB6ENSETR, 5, 1), 759*91f16700Schasinglulu GATE_CFG(GATE_I2C5, RCC_MP_APB6ENSETR, 6, 1), 760*91f16700Schasinglulu GATE_CFG(GATE_TIM12, RCC_MP_APB6ENSETR, 7, 1), 761*91f16700Schasinglulu GATE_CFG(GATE_TIM13, RCC_MP_APB6ENSETR, 8, 1), 762*91f16700Schasinglulu GATE_CFG(GATE_TIM14, RCC_MP_APB6ENSETR, 9, 1), 763*91f16700Schasinglulu GATE_CFG(GATE_TIM15, RCC_MP_APB6ENSETR, 10, 1), 764*91f16700Schasinglulu GATE_CFG(GATE_TIM16, RCC_MP_APB6ENSETR, 11, 1), 765*91f16700Schasinglulu GATE_CFG(GATE_TIM17, RCC_MP_APB6ENSETR, 12, 1), 766*91f16700Schasinglulu GATE_CFG(GATE_DMA1, RCC_MP_AHB2ENSETR, 0, 1), 767*91f16700Schasinglulu GATE_CFG(GATE_DMA2, RCC_MP_AHB2ENSETR, 1, 1), 768*91f16700Schasinglulu GATE_CFG(GATE_DMAMUX1, RCC_MP_AHB2ENSETR, 2, 1), 769*91f16700Schasinglulu GATE_CFG(GATE_DMA3, RCC_MP_AHB2ENSETR, 3, 1), 770*91f16700Schasinglulu GATE_CFG(GATE_DMAMUX2, RCC_MP_AHB2ENSETR, 4, 1), 771*91f16700Schasinglulu GATE_CFG(GATE_ADC1, RCC_MP_AHB2ENSETR, 5, 1), 772*91f16700Schasinglulu GATE_CFG(GATE_ADC2, RCC_MP_AHB2ENSETR, 6, 1), 773*91f16700Schasinglulu GATE_CFG(GATE_USBO, RCC_MP_AHB2ENSETR, 8, 1), 774*91f16700Schasinglulu GATE_CFG(GATE_TSC, RCC_MP_AHB4ENSETR, 15, 1), 775*91f16700Schasinglulu 776*91f16700Schasinglulu GATE_CFG(GATE_GPIOA, RCC_MP_S_AHB4ENSETR, 0, 1), 777*91f16700Schasinglulu GATE_CFG(GATE_GPIOB, RCC_MP_S_AHB4ENSETR, 1, 1), 778*91f16700Schasinglulu GATE_CFG(GATE_GPIOC, RCC_MP_S_AHB4ENSETR, 2, 1), 779*91f16700Schasinglulu GATE_CFG(GATE_GPIOD, RCC_MP_S_AHB4ENSETR, 3, 1), 780*91f16700Schasinglulu GATE_CFG(GATE_GPIOE, RCC_MP_S_AHB4ENSETR, 4, 1), 781*91f16700Schasinglulu GATE_CFG(GATE_GPIOF, RCC_MP_S_AHB4ENSETR, 5, 1), 782*91f16700Schasinglulu GATE_CFG(GATE_GPIOG, RCC_MP_S_AHB4ENSETR, 6, 1), 783*91f16700Schasinglulu GATE_CFG(GATE_GPIOH, RCC_MP_S_AHB4ENSETR, 7, 1), 784*91f16700Schasinglulu GATE_CFG(GATE_GPIOI, RCC_MP_S_AHB4ENSETR, 8, 1), 785*91f16700Schasinglulu 786*91f16700Schasinglulu GATE_CFG(GATE_PKA, RCC_MP_AHB5ENSETR, 2, 1), 787*91f16700Schasinglulu GATE_CFG(GATE_SAES, RCC_MP_AHB5ENSETR, 3, 1), 788*91f16700Schasinglulu GATE_CFG(GATE_CRYP1, RCC_MP_AHB5ENSETR, 4, 1), 789*91f16700Schasinglulu GATE_CFG(GATE_HASH1, RCC_MP_AHB5ENSETR, 5, 1), 790*91f16700Schasinglulu GATE_CFG(GATE_RNG1, RCC_MP_AHB5ENSETR, 6, 1), 791*91f16700Schasinglulu GATE_CFG(GATE_BKPSRAM, RCC_MP_AHB5ENSETR, 8, 1), 792*91f16700Schasinglulu GATE_CFG(GATE_AXIMC, RCC_MP_AHB5ENSETR, 16, 1), 793*91f16700Schasinglulu GATE_CFG(GATE_MCE, RCC_MP_AHB6ENSETR, 1, 1), 794*91f16700Schasinglulu GATE_CFG(GATE_ETH1CK, RCC_MP_AHB6ENSETR, 7, 1), 795*91f16700Schasinglulu GATE_CFG(GATE_ETH1TX, RCC_MP_AHB6ENSETR, 8, 1), 796*91f16700Schasinglulu GATE_CFG(GATE_ETH1RX, RCC_MP_AHB6ENSETR, 9, 1), 797*91f16700Schasinglulu GATE_CFG(GATE_ETH1MAC, RCC_MP_AHB6ENSETR, 10, 1), 798*91f16700Schasinglulu GATE_CFG(GATE_FMC, RCC_MP_AHB6ENSETR, 12, 1), 799*91f16700Schasinglulu GATE_CFG(GATE_QSPI, RCC_MP_AHB6ENSETR, 14, 1), 800*91f16700Schasinglulu GATE_CFG(GATE_SDMMC1, RCC_MP_AHB6ENSETR, 16, 1), 801*91f16700Schasinglulu GATE_CFG(GATE_SDMMC2, RCC_MP_AHB6ENSETR, 17, 1), 802*91f16700Schasinglulu GATE_CFG(GATE_CRC1, RCC_MP_AHB6ENSETR, 20, 1), 803*91f16700Schasinglulu GATE_CFG(GATE_USBH, RCC_MP_AHB6ENSETR, 24, 1), 804*91f16700Schasinglulu GATE_CFG(GATE_ETH2CK, RCC_MP_AHB6ENSETR, 27, 1), 805*91f16700Schasinglulu GATE_CFG(GATE_ETH2TX, RCC_MP_AHB6ENSETR, 28, 1), 806*91f16700Schasinglulu GATE_CFG(GATE_ETH2RX, RCC_MP_AHB6ENSETR, 29, 1), 807*91f16700Schasinglulu GATE_CFG(GATE_ETH2MAC, RCC_MP_AHB6ENSETR, 30, 1), 808*91f16700Schasinglulu GATE_CFG(GATE_MDMA, RCC_MP_S_AHB6ENSETR, 0, 1), 809*91f16700Schasinglulu }; 810*91f16700Schasinglulu 811*91f16700Schasinglulu /* 812*91f16700Schasinglulu * DIV CONFIG 813*91f16700Schasinglulu */ 814*91f16700Schasinglulu 815*91f16700Schasinglulu static const struct clk_div_table axi_div_table[] = { 816*91f16700Schasinglulu { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 817*91f16700Schasinglulu { 4, 4 }, { 5, 4 }, { 6, 4 }, { 7, 4 }, 818*91f16700Schasinglulu { 0 }, 819*91f16700Schasinglulu }; 820*91f16700Schasinglulu 821*91f16700Schasinglulu static const struct clk_div_table mlahb_div_table[] = { 822*91f16700Schasinglulu { 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 }, 823*91f16700Schasinglulu { 4, 16 }, { 5, 32 }, { 6, 64 }, { 7, 128 }, 824*91f16700Schasinglulu { 8, 256 }, { 9, 512 }, { 10, 512}, { 11, 512 }, 825*91f16700Schasinglulu { 12, 512 }, { 13, 512 }, { 14, 512}, { 15, 512 }, 826*91f16700Schasinglulu { 0 }, 827*91f16700Schasinglulu }; 828*91f16700Schasinglulu 829*91f16700Schasinglulu static const struct clk_div_table apb_div_table[] = { 830*91f16700Schasinglulu { 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 }, 831*91f16700Schasinglulu { 4, 16 }, { 5, 16 }, { 6, 16 }, { 7, 16 }, 832*91f16700Schasinglulu { 0 }, 833*91f16700Schasinglulu }; 834*91f16700Schasinglulu 835*91f16700Schasinglulu #define DIV_CFG(id, _offset, _shift, _width, _flags, _table, _bitrdy)[id] = {\ 836*91f16700Schasinglulu .offset = _offset,\ 837*91f16700Schasinglulu .shift = _shift,\ 838*91f16700Schasinglulu .width = _width,\ 839*91f16700Schasinglulu .flags = _flags,\ 840*91f16700Schasinglulu .table = _table,\ 841*91f16700Schasinglulu .bitrdy = _bitrdy,\ 842*91f16700Schasinglulu } 843*91f16700Schasinglulu 844*91f16700Schasinglulu static const struct div_cfg dividers_mp13[DIV_MAX] = { 845*91f16700Schasinglulu DIV_CFG(DIV_PLL1DIVP, RCC_PLL1CFGR2, 0, 7, 0, NULL, DIV_NO_BIT_RDY), 846*91f16700Schasinglulu DIV_CFG(DIV_PLL2DIVP, RCC_PLL2CFGR2, 0, 7, 0, NULL, DIV_NO_BIT_RDY), 847*91f16700Schasinglulu DIV_CFG(DIV_PLL2DIVQ, RCC_PLL2CFGR2, 8, 7, 0, NULL, DIV_NO_BIT_RDY), 848*91f16700Schasinglulu DIV_CFG(DIV_PLL2DIVR, RCC_PLL2CFGR2, 16, 7, 0, NULL, DIV_NO_BIT_RDY), 849*91f16700Schasinglulu DIV_CFG(DIV_PLL3DIVP, RCC_PLL3CFGR2, 0, 7, 0, NULL, DIV_NO_BIT_RDY), 850*91f16700Schasinglulu DIV_CFG(DIV_PLL3DIVQ, RCC_PLL3CFGR2, 8, 7, 0, NULL, DIV_NO_BIT_RDY), 851*91f16700Schasinglulu DIV_CFG(DIV_PLL3DIVR, RCC_PLL3CFGR2, 16, 7, 0, NULL, DIV_NO_BIT_RDY), 852*91f16700Schasinglulu DIV_CFG(DIV_PLL4DIVP, RCC_PLL4CFGR2, 0, 7, 0, NULL, DIV_NO_BIT_RDY), 853*91f16700Schasinglulu DIV_CFG(DIV_PLL4DIVQ, RCC_PLL4CFGR2, 8, 7, 0, NULL, DIV_NO_BIT_RDY), 854*91f16700Schasinglulu DIV_CFG(DIV_PLL4DIVR, RCC_PLL4CFGR2, 16, 7, 0, NULL, DIV_NO_BIT_RDY), 855*91f16700Schasinglulu DIV_CFG(DIV_MPU, RCC_MPCKDIVR, 0, 4, 0, NULL, DIV_NO_BIT_RDY), 856*91f16700Schasinglulu DIV_CFG(DIV_AXI, RCC_AXIDIVR, 0, 3, 0, axi_div_table, 31), 857*91f16700Schasinglulu DIV_CFG(DIV_MLAHB, RCC_MLAHBDIVR, 0, 4, 0, mlahb_div_table, 31), 858*91f16700Schasinglulu DIV_CFG(DIV_APB1, RCC_APB1DIVR, 0, 3, 0, apb_div_table, 31), 859*91f16700Schasinglulu DIV_CFG(DIV_APB2, RCC_APB2DIVR, 0, 3, 0, apb_div_table, 31), 860*91f16700Schasinglulu DIV_CFG(DIV_APB3, RCC_APB3DIVR, 0, 3, 0, apb_div_table, 31), 861*91f16700Schasinglulu DIV_CFG(DIV_APB4, RCC_APB4DIVR, 0, 3, 0, apb_div_table, 31), 862*91f16700Schasinglulu DIV_CFG(DIV_APB5, RCC_APB5DIVR, 0, 3, 0, apb_div_table, 31), 863*91f16700Schasinglulu DIV_CFG(DIV_APB6, RCC_APB6DIVR, 0, 3, 0, apb_div_table, 31), 864*91f16700Schasinglulu DIV_CFG(DIV_RTC, RCC_RTCDIVR, 0, 6, 0, NULL, DIV_NO_BIT_RDY), 865*91f16700Schasinglulu DIV_CFG(DIV_MCO1, RCC_MCO1CFGR, 4, 4, 0, NULL, DIV_NO_BIT_RDY), 866*91f16700Schasinglulu DIV_CFG(DIV_MCO2, RCC_MCO2CFGR, 4, 4, 0, NULL, DIV_NO_BIT_RDY), 867*91f16700Schasinglulu 868*91f16700Schasinglulu DIV_CFG(DIV_HSI, RCC_HSICFGR, 0, 2, CLK_DIVIDER_POWER_OF_TWO, NULL, DIV_NO_BIT_RDY), 869*91f16700Schasinglulu DIV_CFG(DIV_TRACE, RCC_DBGCFGR, 0, 3, CLK_DIVIDER_POWER_OF_TWO, NULL, DIV_NO_BIT_RDY), 870*91f16700Schasinglulu 871*91f16700Schasinglulu DIV_CFG(DIV_ETH1PTP, RCC_ETH12CKSELR, 4, 4, 0, NULL, DIV_NO_BIT_RDY), 872*91f16700Schasinglulu DIV_CFG(DIV_ETH2PTP, RCC_ETH12CKSELR, 12, 4, 0, NULL, DIV_NO_BIT_RDY), 873*91f16700Schasinglulu }; 874*91f16700Schasinglulu 875*91f16700Schasinglulu #define MAX_HSI_HZ 64000000 876*91f16700Schasinglulu #define USB_PHY_48_MHZ 48000000 877*91f16700Schasinglulu 878*91f16700Schasinglulu #define TIMEOUT_US_200MS U(200000) 879*91f16700Schasinglulu #define TIMEOUT_US_1S U(1000000) 880*91f16700Schasinglulu 881*91f16700Schasinglulu #define PLLRDY_TIMEOUT TIMEOUT_US_200MS 882*91f16700Schasinglulu #define CLKSRC_TIMEOUT TIMEOUT_US_200MS 883*91f16700Schasinglulu #define CLKDIV_TIMEOUT TIMEOUT_US_200MS 884*91f16700Schasinglulu #define HSIDIV_TIMEOUT TIMEOUT_US_200MS 885*91f16700Schasinglulu #define OSCRDY_TIMEOUT TIMEOUT_US_1S 886*91f16700Schasinglulu 887*91f16700Schasinglulu enum stm32_osc { 888*91f16700Schasinglulu OSC_HSI, 889*91f16700Schasinglulu OSC_HSE, 890*91f16700Schasinglulu OSC_CSI, 891*91f16700Schasinglulu OSC_LSI, 892*91f16700Schasinglulu OSC_LSE, 893*91f16700Schasinglulu OSC_I2SCKIN, 894*91f16700Schasinglulu NB_OSCILLATOR 895*91f16700Schasinglulu }; 896*91f16700Schasinglulu 897*91f16700Schasinglulu enum stm32mp1_pll_id { 898*91f16700Schasinglulu _PLL1, 899*91f16700Schasinglulu _PLL2, 900*91f16700Schasinglulu _PLL3, 901*91f16700Schasinglulu _PLL4, 902*91f16700Schasinglulu _PLL_NB 903*91f16700Schasinglulu }; 904*91f16700Schasinglulu 905*91f16700Schasinglulu enum stm32mp1_plltype { 906*91f16700Schasinglulu PLL_800, 907*91f16700Schasinglulu PLL_1600, 908*91f16700Schasinglulu PLL_2000, 909*91f16700Schasinglulu PLL_TYPE_NB 910*91f16700Schasinglulu }; 911*91f16700Schasinglulu 912*91f16700Schasinglulu #define RCC_OFFSET_PLLXCR 0 913*91f16700Schasinglulu #define RCC_OFFSET_PLLXCFGR1 4 914*91f16700Schasinglulu #define RCC_OFFSET_PLLXCFGR2 8 915*91f16700Schasinglulu #define RCC_OFFSET_PLLXFRACR 12 916*91f16700Schasinglulu #define RCC_OFFSET_PLLXCSGR 16 917*91f16700Schasinglulu 918*91f16700Schasinglulu struct stm32_clk_pll { 919*91f16700Schasinglulu enum stm32mp1_plltype plltype; 920*91f16700Schasinglulu uint16_t clk_id; 921*91f16700Schasinglulu uint16_t reg_pllxcr; 922*91f16700Schasinglulu }; 923*91f16700Schasinglulu 924*91f16700Schasinglulu struct stm32mp1_pll { 925*91f16700Schasinglulu uint8_t refclk_min; 926*91f16700Schasinglulu uint8_t refclk_max; 927*91f16700Schasinglulu }; 928*91f16700Schasinglulu 929*91f16700Schasinglulu /* Define characteristic of PLL according type */ 930*91f16700Schasinglulu static const struct stm32mp1_pll stm32mp1_pll[PLL_TYPE_NB] = { 931*91f16700Schasinglulu [PLL_800] = { 932*91f16700Schasinglulu .refclk_min = 4, 933*91f16700Schasinglulu .refclk_max = 16, 934*91f16700Schasinglulu }, 935*91f16700Schasinglulu [PLL_1600] = { 936*91f16700Schasinglulu .refclk_min = 8, 937*91f16700Schasinglulu .refclk_max = 16, 938*91f16700Schasinglulu }, 939*91f16700Schasinglulu [PLL_2000] = { 940*91f16700Schasinglulu .refclk_min = 8, 941*91f16700Schasinglulu .refclk_max = 16, 942*91f16700Schasinglulu }, 943*91f16700Schasinglulu }; 944*91f16700Schasinglulu 945*91f16700Schasinglulu #if STM32MP_USB_PROGRAMMER 946*91f16700Schasinglulu static bool pll4_bootrom; 947*91f16700Schasinglulu #endif 948*91f16700Schasinglulu 949*91f16700Schasinglulu /* RCC clock device driver private */ 950*91f16700Schasinglulu static unsigned int refcounts_mp13[CK_LAST]; 951*91f16700Schasinglulu 952*91f16700Schasinglulu static const struct stm32_clk_pll *clk_st32_pll_data(unsigned int idx); 953*91f16700Schasinglulu 954*91f16700Schasinglulu #if STM32MP_UART_PROGRAMMER || STM32MP_USB_PROGRAMMER 955*91f16700Schasinglulu static void clk_oscillator_check_bypass(struct stm32_clk_priv *priv, int idx, 956*91f16700Schasinglulu bool digbyp, bool bypass) 957*91f16700Schasinglulu { 958*91f16700Schasinglulu struct clk_oscillator_data *osc_data = clk_oscillator_get_data(priv, idx); 959*91f16700Schasinglulu struct stm32_clk_bypass *bypass_data = osc_data->bypass; 960*91f16700Schasinglulu uintptr_t address; 961*91f16700Schasinglulu 962*91f16700Schasinglulu if (bypass_data == NULL) { 963*91f16700Schasinglulu return; 964*91f16700Schasinglulu } 965*91f16700Schasinglulu 966*91f16700Schasinglulu address = priv->base + bypass_data->offset; 967*91f16700Schasinglulu if ((mmio_read_32(address) & RCC_OCENR_HSEBYP) && 968*91f16700Schasinglulu (!(digbyp || bypass))) { 969*91f16700Schasinglulu panic(); 970*91f16700Schasinglulu } 971*91f16700Schasinglulu } 972*91f16700Schasinglulu #endif 973*91f16700Schasinglulu 974*91f16700Schasinglulu static void stm32_enable_oscillator_hse(struct stm32_clk_priv *priv) 975*91f16700Schasinglulu { 976*91f16700Schasinglulu struct stm32_clk_platdata *pdata = priv->pdata; 977*91f16700Schasinglulu struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_HSE]; 978*91f16700Schasinglulu bool digbyp = osci->digbyp; 979*91f16700Schasinglulu bool bypass = osci->bypass; 980*91f16700Schasinglulu bool css = osci->css; 981*91f16700Schasinglulu 982*91f16700Schasinglulu if (_clk_stm32_get_rate(priv, _CK_HSE) == 0U) { 983*91f16700Schasinglulu return; 984*91f16700Schasinglulu } 985*91f16700Schasinglulu 986*91f16700Schasinglulu clk_oscillator_set_bypass(priv, _CK_HSE, digbyp, bypass); 987*91f16700Schasinglulu 988*91f16700Schasinglulu _clk_stm32_enable(priv, _CK_HSE); 989*91f16700Schasinglulu 990*91f16700Schasinglulu #if STM32MP_UART_PROGRAMMER || STM32MP_USB_PROGRAMMER 991*91f16700Schasinglulu clk_oscillator_check_bypass(priv, _CK_HSE, digbyp, bypass); 992*91f16700Schasinglulu #endif 993*91f16700Schasinglulu 994*91f16700Schasinglulu clk_oscillator_set_css(priv, _CK_HSE, css); 995*91f16700Schasinglulu } 996*91f16700Schasinglulu 997*91f16700Schasinglulu static void stm32_enable_oscillator_lse(struct stm32_clk_priv *priv) 998*91f16700Schasinglulu { 999*91f16700Schasinglulu struct clk_oscillator_data *osc_data = clk_oscillator_get_data(priv, _CK_LSE); 1000*91f16700Schasinglulu struct stm32_clk_platdata *pdata = priv->pdata; 1001*91f16700Schasinglulu struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 1002*91f16700Schasinglulu bool digbyp = osci->digbyp; 1003*91f16700Schasinglulu bool bypass = osci->bypass; 1004*91f16700Schasinglulu uint8_t drive = osci->drive; 1005*91f16700Schasinglulu 1006*91f16700Schasinglulu if (_clk_stm32_get_rate(priv, _CK_LSE) == 0U) { 1007*91f16700Schasinglulu return; 1008*91f16700Schasinglulu } 1009*91f16700Schasinglulu 1010*91f16700Schasinglulu clk_oscillator_set_bypass(priv, _CK_LSE, digbyp, bypass); 1011*91f16700Schasinglulu 1012*91f16700Schasinglulu clk_oscillator_set_drive(priv, _CK_LSE, drive); 1013*91f16700Schasinglulu 1014*91f16700Schasinglulu _clk_stm32_gate_enable(priv, osc_data->gate_id); 1015*91f16700Schasinglulu } 1016*91f16700Schasinglulu 1017*91f16700Schasinglulu static int stm32mp1_set_hsidiv(uint8_t hsidiv) 1018*91f16700Schasinglulu { 1019*91f16700Schasinglulu uint64_t timeout; 1020*91f16700Schasinglulu uintptr_t rcc_base = stm32mp_rcc_base(); 1021*91f16700Schasinglulu uintptr_t address = rcc_base + RCC_OCRDYR; 1022*91f16700Schasinglulu 1023*91f16700Schasinglulu mmio_clrsetbits_32(rcc_base + RCC_HSICFGR, 1024*91f16700Schasinglulu RCC_HSICFGR_HSIDIV_MASK, 1025*91f16700Schasinglulu RCC_HSICFGR_HSIDIV_MASK & (uint32_t)hsidiv); 1026*91f16700Schasinglulu 1027*91f16700Schasinglulu timeout = timeout_init_us(HSIDIV_TIMEOUT); 1028*91f16700Schasinglulu while ((mmio_read_32(address) & RCC_OCRDYR_HSIDIVRDY) == 0U) { 1029*91f16700Schasinglulu if (timeout_elapsed(timeout)) { 1030*91f16700Schasinglulu ERROR("HSIDIV failed @ 0x%lx: 0x%x\n", 1031*91f16700Schasinglulu address, mmio_read_32(address)); 1032*91f16700Schasinglulu return -ETIMEDOUT; 1033*91f16700Schasinglulu } 1034*91f16700Schasinglulu } 1035*91f16700Schasinglulu 1036*91f16700Schasinglulu return 0; 1037*91f16700Schasinglulu } 1038*91f16700Schasinglulu 1039*91f16700Schasinglulu static int stm32mp1_hsidiv(unsigned long hsifreq) 1040*91f16700Schasinglulu { 1041*91f16700Schasinglulu uint8_t hsidiv; 1042*91f16700Schasinglulu uint32_t hsidivfreq = MAX_HSI_HZ; 1043*91f16700Schasinglulu 1044*91f16700Schasinglulu for (hsidiv = 0; hsidiv < 4U; hsidiv++) { 1045*91f16700Schasinglulu if (hsidivfreq == hsifreq) { 1046*91f16700Schasinglulu break; 1047*91f16700Schasinglulu } 1048*91f16700Schasinglulu 1049*91f16700Schasinglulu hsidivfreq /= 2U; 1050*91f16700Schasinglulu } 1051*91f16700Schasinglulu 1052*91f16700Schasinglulu if (hsidiv == 4U) { 1053*91f16700Schasinglulu ERROR("Invalid clk-hsi frequency\n"); 1054*91f16700Schasinglulu return -EINVAL; 1055*91f16700Schasinglulu } 1056*91f16700Schasinglulu 1057*91f16700Schasinglulu if (hsidiv != 0U) { 1058*91f16700Schasinglulu return stm32mp1_set_hsidiv(hsidiv); 1059*91f16700Schasinglulu } 1060*91f16700Schasinglulu 1061*91f16700Schasinglulu return 0; 1062*91f16700Schasinglulu } 1063*91f16700Schasinglulu 1064*91f16700Schasinglulu static int stm32_clk_oscillators_lse_set_css(struct stm32_clk_priv *priv) 1065*91f16700Schasinglulu { 1066*91f16700Schasinglulu struct stm32_clk_platdata *pdata = priv->pdata; 1067*91f16700Schasinglulu struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 1068*91f16700Schasinglulu 1069*91f16700Schasinglulu clk_oscillator_set_css(priv, _CK_LSE, osci->css); 1070*91f16700Schasinglulu 1071*91f16700Schasinglulu return 0; 1072*91f16700Schasinglulu } 1073*91f16700Schasinglulu 1074*91f16700Schasinglulu static int stm32mp1_come_back_to_hsi(void) 1075*91f16700Schasinglulu { 1076*91f16700Schasinglulu int ret; 1077*91f16700Schasinglulu struct stm32_clk_priv *priv = clk_stm32_get_priv(); 1078*91f16700Schasinglulu 1079*91f16700Schasinglulu /* Come back to HSI */ 1080*91f16700Schasinglulu ret = _clk_stm32_set_parent(priv, _CKMPU, _CK_HSI); 1081*91f16700Schasinglulu if (ret != 0) { 1082*91f16700Schasinglulu return ret; 1083*91f16700Schasinglulu } 1084*91f16700Schasinglulu 1085*91f16700Schasinglulu ret = _clk_stm32_set_parent(priv, _CKAXI, _CK_HSI); 1086*91f16700Schasinglulu if (ret != 0) { 1087*91f16700Schasinglulu return ret; 1088*91f16700Schasinglulu } 1089*91f16700Schasinglulu 1090*91f16700Schasinglulu ret = _clk_stm32_set_parent(priv, _CKMLAHB, _CK_HSI); 1091*91f16700Schasinglulu if (ret != 0) { 1092*91f16700Schasinglulu return ret; 1093*91f16700Schasinglulu } 1094*91f16700Schasinglulu 1095*91f16700Schasinglulu return 0; 1096*91f16700Schasinglulu } 1097*91f16700Schasinglulu 1098*91f16700Schasinglulu static int stm32_clk_configure_clk_get_binding_id(struct stm32_clk_priv *priv, uint32_t data) 1099*91f16700Schasinglulu { 1100*91f16700Schasinglulu unsigned long binding_id = ((unsigned long)data & CLK_ID_MASK) >> CLK_ID_SHIFT; 1101*91f16700Schasinglulu 1102*91f16700Schasinglulu return clk_get_index(priv, binding_id); 1103*91f16700Schasinglulu } 1104*91f16700Schasinglulu 1105*91f16700Schasinglulu static int stm32_clk_configure_clk(struct stm32_clk_priv *priv, uint32_t data) 1106*91f16700Schasinglulu { 1107*91f16700Schasinglulu int sel = (data & CLK_SEL_MASK) >> CLK_SEL_SHIFT; 1108*91f16700Schasinglulu int enable = (data & CLK_ON_MASK) >> CLK_ON_SHIFT; 1109*91f16700Schasinglulu int clk_id; 1110*91f16700Schasinglulu int ret; 1111*91f16700Schasinglulu 1112*91f16700Schasinglulu clk_id = stm32_clk_configure_clk_get_binding_id(priv, data); 1113*91f16700Schasinglulu if (clk_id < 0) { 1114*91f16700Schasinglulu return clk_id; 1115*91f16700Schasinglulu } 1116*91f16700Schasinglulu 1117*91f16700Schasinglulu ret = _clk_stm32_set_parent_by_index(priv, clk_id, sel); 1118*91f16700Schasinglulu if (ret != 0) { 1119*91f16700Schasinglulu return ret; 1120*91f16700Schasinglulu } 1121*91f16700Schasinglulu 1122*91f16700Schasinglulu if (enable != 0) { 1123*91f16700Schasinglulu clk_stm32_enable_call_ops(priv, clk_id); 1124*91f16700Schasinglulu } else { 1125*91f16700Schasinglulu clk_stm32_disable_call_ops(priv, clk_id); 1126*91f16700Schasinglulu } 1127*91f16700Schasinglulu 1128*91f16700Schasinglulu return 0; 1129*91f16700Schasinglulu } 1130*91f16700Schasinglulu 1131*91f16700Schasinglulu static int stm32_clk_configure_mux(struct stm32_clk_priv *priv, uint32_t data) 1132*91f16700Schasinglulu { 1133*91f16700Schasinglulu int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT; 1134*91f16700Schasinglulu int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 1135*91f16700Schasinglulu 1136*91f16700Schasinglulu return clk_mux_set_parent(priv, mux, sel); 1137*91f16700Schasinglulu } 1138*91f16700Schasinglulu 1139*91f16700Schasinglulu static int stm32_clk_dividers_configure(struct stm32_clk_priv *priv) 1140*91f16700Schasinglulu { 1141*91f16700Schasinglulu struct stm32_clk_platdata *pdata = priv->pdata; 1142*91f16700Schasinglulu uint32_t i; 1143*91f16700Schasinglulu 1144*91f16700Schasinglulu for (i = 0; i < pdata->nclkdiv; i++) { 1145*91f16700Schasinglulu int div_id, div_n; 1146*91f16700Schasinglulu int val; 1147*91f16700Schasinglulu int ret; 1148*91f16700Schasinglulu 1149*91f16700Schasinglulu val = pdata->clkdiv[i] & CMD_DATA_MASK; 1150*91f16700Schasinglulu div_id = (val & DIV_ID_MASK) >> DIV_ID_SHIFT; 1151*91f16700Schasinglulu div_n = (val & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT; 1152*91f16700Schasinglulu 1153*91f16700Schasinglulu ret = clk_stm32_set_div(priv, div_id, div_n); 1154*91f16700Schasinglulu if (ret != 0) { 1155*91f16700Schasinglulu return ret; 1156*91f16700Schasinglulu } 1157*91f16700Schasinglulu } 1158*91f16700Schasinglulu 1159*91f16700Schasinglulu return 0; 1160*91f16700Schasinglulu } 1161*91f16700Schasinglulu 1162*91f16700Schasinglulu static int stm32_clk_source_configure(struct stm32_clk_priv *priv) 1163*91f16700Schasinglulu { 1164*91f16700Schasinglulu struct stm32_clk_platdata *pdata = priv->pdata; 1165*91f16700Schasinglulu bool ckper_disabled = false; 1166*91f16700Schasinglulu int clk_id; 1167*91f16700Schasinglulu int ret; 1168*91f16700Schasinglulu uint32_t i; 1169*91f16700Schasinglulu 1170*91f16700Schasinglulu for (i = 0; i < pdata->nclksrc; i++) { 1171*91f16700Schasinglulu uint32_t val = pdata->clksrc[i]; 1172*91f16700Schasinglulu uint32_t cmd, cmd_data; 1173*91f16700Schasinglulu 1174*91f16700Schasinglulu if (val == (uint32_t)CLK_CKPER_DISABLED) { 1175*91f16700Schasinglulu ckper_disabled = true; 1176*91f16700Schasinglulu continue; 1177*91f16700Schasinglulu } 1178*91f16700Schasinglulu 1179*91f16700Schasinglulu if (val == (uint32_t)CLK_RTC_DISABLED) { 1180*91f16700Schasinglulu continue; 1181*91f16700Schasinglulu } 1182*91f16700Schasinglulu 1183*91f16700Schasinglulu cmd = (val & CMD_MASK) >> CMD_SHIFT; 1184*91f16700Schasinglulu cmd_data = val & ~CMD_MASK; 1185*91f16700Schasinglulu 1186*91f16700Schasinglulu switch (cmd) { 1187*91f16700Schasinglulu case CMD_MUX: 1188*91f16700Schasinglulu ret = stm32_clk_configure_mux(priv, cmd_data); 1189*91f16700Schasinglulu break; 1190*91f16700Schasinglulu 1191*91f16700Schasinglulu case CMD_CLK: 1192*91f16700Schasinglulu clk_id = stm32_clk_configure_clk_get_binding_id(priv, cmd_data); 1193*91f16700Schasinglulu 1194*91f16700Schasinglulu if (clk_id == _RTCCK) { 1195*91f16700Schasinglulu if ((_clk_stm32_is_enabled(priv, _RTCCK) == true)) { 1196*91f16700Schasinglulu continue; 1197*91f16700Schasinglulu } 1198*91f16700Schasinglulu } 1199*91f16700Schasinglulu 1200*91f16700Schasinglulu ret = stm32_clk_configure_clk(priv, cmd_data); 1201*91f16700Schasinglulu break; 1202*91f16700Schasinglulu default: 1203*91f16700Schasinglulu ret = -EINVAL; 1204*91f16700Schasinglulu break; 1205*91f16700Schasinglulu } 1206*91f16700Schasinglulu 1207*91f16700Schasinglulu if (ret != 0) { 1208*91f16700Schasinglulu return ret; 1209*91f16700Schasinglulu } 1210*91f16700Schasinglulu } 1211*91f16700Schasinglulu 1212*91f16700Schasinglulu /* 1213*91f16700Schasinglulu * CKPER is source for some peripheral clocks 1214*91f16700Schasinglulu * (FMC-NAND / QPSI-NOR) and switching source is allowed 1215*91f16700Schasinglulu * only if previous clock is still ON 1216*91f16700Schasinglulu * => deactivate CKPER only after switching clock 1217*91f16700Schasinglulu */ 1218*91f16700Schasinglulu if (ckper_disabled) { 1219*91f16700Schasinglulu ret = stm32_clk_configure_mux(priv, CLK_CKPER_DISABLED); 1220*91f16700Schasinglulu if (ret != 0) { 1221*91f16700Schasinglulu return ret; 1222*91f16700Schasinglulu } 1223*91f16700Schasinglulu } 1224*91f16700Schasinglulu 1225*91f16700Schasinglulu return 0; 1226*91f16700Schasinglulu } 1227*91f16700Schasinglulu 1228*91f16700Schasinglulu static int stm32_clk_stgen_configure(struct stm32_clk_priv *priv, int id) 1229*91f16700Schasinglulu { 1230*91f16700Schasinglulu unsigned long stgen_freq; 1231*91f16700Schasinglulu 1232*91f16700Schasinglulu stgen_freq = _clk_stm32_get_rate(priv, id); 1233*91f16700Schasinglulu 1234*91f16700Schasinglulu stm32mp_stgen_config(stgen_freq); 1235*91f16700Schasinglulu 1236*91f16700Schasinglulu return 0; 1237*91f16700Schasinglulu } 1238*91f16700Schasinglulu 1239*91f16700Schasinglulu #define CLK_PLL_CFG(_idx, _clk_id, _type, _reg)\ 1240*91f16700Schasinglulu [(_idx)] = {\ 1241*91f16700Schasinglulu .clk_id = (_clk_id),\ 1242*91f16700Schasinglulu .plltype = (_type),\ 1243*91f16700Schasinglulu .reg_pllxcr = (_reg),\ 1244*91f16700Schasinglulu } 1245*91f16700Schasinglulu 1246*91f16700Schasinglulu static int clk_stm32_pll_compute_cfgr1(struct stm32_clk_priv *priv, 1247*91f16700Schasinglulu const struct stm32_clk_pll *pll, 1248*91f16700Schasinglulu struct stm32_pll_vco *vco, 1249*91f16700Schasinglulu uint32_t *value) 1250*91f16700Schasinglulu { 1251*91f16700Schasinglulu uint32_t divm = vco->div_mn[PLL_CFG_M]; 1252*91f16700Schasinglulu uint32_t divn = vco->div_mn[PLL_CFG_N]; 1253*91f16700Schasinglulu unsigned long prate = 0UL; 1254*91f16700Schasinglulu unsigned long refclk = 0UL; 1255*91f16700Schasinglulu 1256*91f16700Schasinglulu prate = _clk_stm32_get_parent_rate(priv, pll->clk_id); 1257*91f16700Schasinglulu refclk = prate / (divm + 1U); 1258*91f16700Schasinglulu 1259*91f16700Schasinglulu if ((refclk < (stm32mp1_pll[pll->plltype].refclk_min * 1000000U)) || 1260*91f16700Schasinglulu (refclk > (stm32mp1_pll[pll->plltype].refclk_max * 1000000U))) { 1261*91f16700Schasinglulu return -EINVAL; 1262*91f16700Schasinglulu } 1263*91f16700Schasinglulu 1264*91f16700Schasinglulu *value = 0; 1265*91f16700Schasinglulu 1266*91f16700Schasinglulu if ((pll->plltype == PLL_800) && (refclk >= 8000000U)) { 1267*91f16700Schasinglulu *value = 1U << RCC_PLLNCFGR1_IFRGE_SHIFT; 1268*91f16700Schasinglulu } 1269*91f16700Schasinglulu 1270*91f16700Schasinglulu *value |= (divn << RCC_PLLNCFGR1_DIVN_SHIFT) & RCC_PLLNCFGR1_DIVN_MASK; 1271*91f16700Schasinglulu *value |= (divm << RCC_PLLNCFGR1_DIVM_SHIFT) & RCC_PLLNCFGR1_DIVM_MASK; 1272*91f16700Schasinglulu 1273*91f16700Schasinglulu return 0; 1274*91f16700Schasinglulu } 1275*91f16700Schasinglulu 1276*91f16700Schasinglulu static uint32_t clk_stm32_pll_compute_cfgr2(struct stm32_pll_output *out) 1277*91f16700Schasinglulu { 1278*91f16700Schasinglulu uint32_t value = 0; 1279*91f16700Schasinglulu 1280*91f16700Schasinglulu value |= (out->output[PLL_CFG_P] << RCC_PLLNCFGR2_DIVP_SHIFT) & RCC_PLLNCFGR2_DIVP_MASK; 1281*91f16700Schasinglulu value |= (out->output[PLL_CFG_Q] << RCC_PLLNCFGR2_DIVQ_SHIFT) & RCC_PLLNCFGR2_DIVQ_MASK; 1282*91f16700Schasinglulu value |= (out->output[PLL_CFG_R] << RCC_PLLNCFGR2_DIVR_SHIFT) & RCC_PLLNCFGR2_DIVR_MASK; 1283*91f16700Schasinglulu 1284*91f16700Schasinglulu return value; 1285*91f16700Schasinglulu } 1286*91f16700Schasinglulu 1287*91f16700Schasinglulu static void clk_stm32_pll_config_vco(struct stm32_clk_priv *priv, 1288*91f16700Schasinglulu const struct stm32_clk_pll *pll, 1289*91f16700Schasinglulu struct stm32_pll_vco *vco) 1290*91f16700Schasinglulu { 1291*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1292*91f16700Schasinglulu uint32_t value = 0; 1293*91f16700Schasinglulu 1294*91f16700Schasinglulu if (clk_stm32_pll_compute_cfgr1(priv, pll, vco, &value) != 0) { 1295*91f16700Schasinglulu ERROR("Invalid Vref clock !\n"); 1296*91f16700Schasinglulu panic(); 1297*91f16700Schasinglulu } 1298*91f16700Schasinglulu 1299*91f16700Schasinglulu /* Write N / M / IFREGE fields */ 1300*91f16700Schasinglulu mmio_write_32(pll_base + RCC_OFFSET_PLLXCFGR1, value); 1301*91f16700Schasinglulu 1302*91f16700Schasinglulu /* Fractional configuration */ 1303*91f16700Schasinglulu mmio_write_32(pll_base + RCC_OFFSET_PLLXFRACR, 0); 1304*91f16700Schasinglulu 1305*91f16700Schasinglulu /* Frac must be enabled only once its configuration is loaded */ 1306*91f16700Schasinglulu mmio_write_32(pll_base + RCC_OFFSET_PLLXFRACR, vco->frac << RCC_PLLNFRACR_FRACV_SHIFT); 1307*91f16700Schasinglulu mmio_setbits_32(pll_base + RCC_OFFSET_PLLXFRACR, RCC_PLLNFRACR_FRACLE); 1308*91f16700Schasinglulu } 1309*91f16700Schasinglulu 1310*91f16700Schasinglulu static void clk_stm32_pll_config_csg(struct stm32_clk_priv *priv, 1311*91f16700Schasinglulu const struct stm32_clk_pll *pll, 1312*91f16700Schasinglulu struct stm32_pll_vco *vco) 1313*91f16700Schasinglulu { 1314*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1315*91f16700Schasinglulu uint32_t mod_per = 0; 1316*91f16700Schasinglulu uint32_t inc_step = 0; 1317*91f16700Schasinglulu uint32_t sscg_mode = 0; 1318*91f16700Schasinglulu uint32_t value = 0; 1319*91f16700Schasinglulu 1320*91f16700Schasinglulu if (!vco->csg_enabled) { 1321*91f16700Schasinglulu return; 1322*91f16700Schasinglulu } 1323*91f16700Schasinglulu 1324*91f16700Schasinglulu mod_per = vco->csg[PLL_CSG_MOD_PER]; 1325*91f16700Schasinglulu inc_step = vco->csg[PLL_CSG_INC_STEP]; 1326*91f16700Schasinglulu sscg_mode = vco->csg[PLL_CSG_SSCG_MODE]; 1327*91f16700Schasinglulu 1328*91f16700Schasinglulu value |= (mod_per << RCC_PLLNCSGR_MOD_PER_SHIFT) & RCC_PLLNCSGR_MOD_PER_MASK; 1329*91f16700Schasinglulu value |= (inc_step << RCC_PLLNCSGR_INC_STEP_SHIFT) & RCC_PLLNCSGR_INC_STEP_MASK; 1330*91f16700Schasinglulu value |= (sscg_mode << RCC_PLLNCSGR_SSCG_MODE_SHIFT) & RCC_PLLNCSGR_SSCG_MODE_MASK; 1331*91f16700Schasinglulu 1332*91f16700Schasinglulu mmio_write_32(pll_base + RCC_OFFSET_PLLXCSGR, value); 1333*91f16700Schasinglulu mmio_setbits_32(pll_base + RCC_OFFSET_PLLXCR, RCC_PLLNCR_SSCG_CTRL); 1334*91f16700Schasinglulu } 1335*91f16700Schasinglulu 1336*91f16700Schasinglulu static void clk_stm32_pll_config_out(struct stm32_clk_priv *priv, const struct stm32_clk_pll *pll, 1337*91f16700Schasinglulu struct stm32_pll_output *out) 1338*91f16700Schasinglulu { 1339*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1340*91f16700Schasinglulu uint32_t value = 0; 1341*91f16700Schasinglulu 1342*91f16700Schasinglulu value = clk_stm32_pll_compute_cfgr2(out); 1343*91f16700Schasinglulu 1344*91f16700Schasinglulu mmio_write_32(pll_base + RCC_OFFSET_PLLXCFGR2, value); 1345*91f16700Schasinglulu } 1346*91f16700Schasinglulu 1347*91f16700Schasinglulu static inline struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(int pll_idx) 1348*91f16700Schasinglulu { 1349*91f16700Schasinglulu struct stm32_clk_priv *priv = clk_stm32_get_priv(); 1350*91f16700Schasinglulu struct stm32_clk_platdata *pdata = priv->pdata; 1351*91f16700Schasinglulu 1352*91f16700Schasinglulu return &pdata->pll[pll_idx]; 1353*91f16700Schasinglulu } 1354*91f16700Schasinglulu 1355*91f16700Schasinglulu static bool _clk_stm32_pll_is_enabled(struct stm32_clk_priv *priv, const struct stm32_clk_pll *pll) 1356*91f16700Schasinglulu { 1357*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1358*91f16700Schasinglulu 1359*91f16700Schasinglulu return ((mmio_read_32(pll_base) & RCC_PLLNCR_PLLON) != 0U); 1360*91f16700Schasinglulu } 1361*91f16700Schasinglulu 1362*91f16700Schasinglulu static void _clk_stm32_pll_set_on(struct stm32_clk_priv *priv, const struct stm32_clk_pll *pll) 1363*91f16700Schasinglulu { 1364*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1365*91f16700Schasinglulu 1366*91f16700Schasinglulu /* Preserve RCC_PLLNCR_SSCG_CTRL value */ 1367*91f16700Schasinglulu mmio_clrsetbits_32(pll_base, RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN | RCC_PLLNCR_DIVREN, 1368*91f16700Schasinglulu RCC_PLLNCR_PLLON); 1369*91f16700Schasinglulu } 1370*91f16700Schasinglulu 1371*91f16700Schasinglulu static void _clk_stm32_pll_set_off(struct stm32_clk_priv *priv, const struct stm32_clk_pll *pll) 1372*91f16700Schasinglulu { 1373*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1374*91f16700Schasinglulu 1375*91f16700Schasinglulu /* Stop all output */ 1376*91f16700Schasinglulu mmio_clrbits_32(pll_base, RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN | RCC_PLLNCR_DIVREN); 1377*91f16700Schasinglulu 1378*91f16700Schasinglulu /* Stop PLL */ 1379*91f16700Schasinglulu mmio_clrbits_32(pll_base, RCC_PLLNCR_PLLON); 1380*91f16700Schasinglulu } 1381*91f16700Schasinglulu 1382*91f16700Schasinglulu static int _clk_stm32_pll_wait_ready_on(struct stm32_clk_priv *priv, 1383*91f16700Schasinglulu const struct stm32_clk_pll *pll) 1384*91f16700Schasinglulu { 1385*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1386*91f16700Schasinglulu uint64_t timeout = timeout_init_us(PLLRDY_TIMEOUT); 1387*91f16700Schasinglulu 1388*91f16700Schasinglulu /* Wait PLL lock */ 1389*91f16700Schasinglulu while ((mmio_read_32(pll_base) & RCC_PLLNCR_PLLRDY) == 0U) { 1390*91f16700Schasinglulu if (timeout_elapsed(timeout)) { 1391*91f16700Schasinglulu ERROR("%d clock start failed @ 0x%x: 0x%x\n", 1392*91f16700Schasinglulu pll->clk_id, pll->reg_pllxcr, mmio_read_32(pll_base)); 1393*91f16700Schasinglulu return -EINVAL; 1394*91f16700Schasinglulu } 1395*91f16700Schasinglulu } 1396*91f16700Schasinglulu 1397*91f16700Schasinglulu return 0; 1398*91f16700Schasinglulu } 1399*91f16700Schasinglulu 1400*91f16700Schasinglulu static int _clk_stm32_pll_wait_ready_off(struct stm32_clk_priv *priv, 1401*91f16700Schasinglulu const struct stm32_clk_pll *pll) 1402*91f16700Schasinglulu { 1403*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1404*91f16700Schasinglulu uint64_t timeout = timeout_init_us(PLLRDY_TIMEOUT); 1405*91f16700Schasinglulu 1406*91f16700Schasinglulu /* Wait PLL lock */ 1407*91f16700Schasinglulu while ((mmio_read_32(pll_base) & RCC_PLLNCR_PLLRDY) != 0U) { 1408*91f16700Schasinglulu if (timeout_elapsed(timeout)) { 1409*91f16700Schasinglulu ERROR("%d clock stop failed @ 0x%x: 0x%x\n", 1410*91f16700Schasinglulu pll->clk_id, pll->reg_pllxcr, mmio_read_32(pll_base)); 1411*91f16700Schasinglulu return -EINVAL; 1412*91f16700Schasinglulu } 1413*91f16700Schasinglulu } 1414*91f16700Schasinglulu 1415*91f16700Schasinglulu return 0; 1416*91f16700Schasinglulu } 1417*91f16700Schasinglulu 1418*91f16700Schasinglulu static int _clk_stm32_pll_enable(struct stm32_clk_priv *priv, const struct stm32_clk_pll *pll) 1419*91f16700Schasinglulu { 1420*91f16700Schasinglulu if (_clk_stm32_pll_is_enabled(priv, pll)) { 1421*91f16700Schasinglulu return 0; 1422*91f16700Schasinglulu } 1423*91f16700Schasinglulu 1424*91f16700Schasinglulu /* Preserve RCC_PLLNCR_SSCG_CTRL value */ 1425*91f16700Schasinglulu _clk_stm32_pll_set_on(priv, pll); 1426*91f16700Schasinglulu 1427*91f16700Schasinglulu /* Wait PLL lock */ 1428*91f16700Schasinglulu return _clk_stm32_pll_wait_ready_on(priv, pll); 1429*91f16700Schasinglulu } 1430*91f16700Schasinglulu 1431*91f16700Schasinglulu static void _clk_stm32_pll_disable(struct stm32_clk_priv *priv, const struct stm32_clk_pll *pll) 1432*91f16700Schasinglulu { 1433*91f16700Schasinglulu if (!_clk_stm32_pll_is_enabled(priv, pll)) { 1434*91f16700Schasinglulu return; 1435*91f16700Schasinglulu } 1436*91f16700Schasinglulu 1437*91f16700Schasinglulu /* Stop all outputs and the PLL */ 1438*91f16700Schasinglulu _clk_stm32_pll_set_off(priv, pll); 1439*91f16700Schasinglulu 1440*91f16700Schasinglulu /* Wait PLL stopped */ 1441*91f16700Schasinglulu _clk_stm32_pll_wait_ready_off(priv, pll); 1442*91f16700Schasinglulu } 1443*91f16700Schasinglulu 1444*91f16700Schasinglulu static int _clk_stm32_pll_init(struct stm32_clk_priv *priv, int pll_idx, 1445*91f16700Schasinglulu struct stm32_pll_dt_cfg *pll_conf) 1446*91f16700Schasinglulu { 1447*91f16700Schasinglulu const struct stm32_clk_pll *pll = clk_st32_pll_data(pll_idx); 1448*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1449*91f16700Schasinglulu int ret = 0; 1450*91f16700Schasinglulu 1451*91f16700Schasinglulu /* Configure PLLs source */ 1452*91f16700Schasinglulu ret = stm32_clk_configure_mux(priv, pll_conf->vco.src); 1453*91f16700Schasinglulu if (ret != 0) { 1454*91f16700Schasinglulu return ret; 1455*91f16700Schasinglulu } 1456*91f16700Schasinglulu 1457*91f16700Schasinglulu #if STM32MP_USB_PROGRAMMER 1458*91f16700Schasinglulu if ((pll_idx == _PLL4) && pll4_bootrom) { 1459*91f16700Schasinglulu clk_stm32_pll_config_out(priv, pll, &pll_conf->output); 1460*91f16700Schasinglulu 1461*91f16700Schasinglulu mmio_setbits_32(pll_base, 1462*91f16700Schasinglulu RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN | RCC_PLLNCR_DIVREN); 1463*91f16700Schasinglulu 1464*91f16700Schasinglulu return 0; 1465*91f16700Schasinglulu } 1466*91f16700Schasinglulu #endif 1467*91f16700Schasinglulu /* Stop the PLL before */ 1468*91f16700Schasinglulu _clk_stm32_pll_disable(priv, pll); 1469*91f16700Schasinglulu 1470*91f16700Schasinglulu clk_stm32_pll_config_vco(priv, pll, &pll_conf->vco); 1471*91f16700Schasinglulu clk_stm32_pll_config_out(priv, pll, &pll_conf->output); 1472*91f16700Schasinglulu clk_stm32_pll_config_csg(priv, pll, &pll_conf->vco); 1473*91f16700Schasinglulu 1474*91f16700Schasinglulu ret = _clk_stm32_pll_enable(priv, pll); 1475*91f16700Schasinglulu if (ret != 0) { 1476*91f16700Schasinglulu return ret; 1477*91f16700Schasinglulu } 1478*91f16700Schasinglulu 1479*91f16700Schasinglulu mmio_setbits_32(pll_base, RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN | RCC_PLLNCR_DIVREN); 1480*91f16700Schasinglulu 1481*91f16700Schasinglulu return 0; 1482*91f16700Schasinglulu } 1483*91f16700Schasinglulu 1484*91f16700Schasinglulu static int clk_stm32_pll_init(struct stm32_clk_priv *priv, int pll_idx) 1485*91f16700Schasinglulu { 1486*91f16700Schasinglulu struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(pll_idx); 1487*91f16700Schasinglulu 1488*91f16700Schasinglulu if (pll_conf->vco.status != 0U) { 1489*91f16700Schasinglulu return _clk_stm32_pll_init(priv, pll_idx, pll_conf); 1490*91f16700Schasinglulu } 1491*91f16700Schasinglulu 1492*91f16700Schasinglulu return 0; 1493*91f16700Schasinglulu } 1494*91f16700Schasinglulu 1495*91f16700Schasinglulu static int stm32_clk_pll_configure(struct stm32_clk_priv *priv) 1496*91f16700Schasinglulu { 1497*91f16700Schasinglulu int err = 0; 1498*91f16700Schasinglulu 1499*91f16700Schasinglulu err = clk_stm32_pll_init(priv, _PLL1); 1500*91f16700Schasinglulu if (err != 0) { 1501*91f16700Schasinglulu return err; 1502*91f16700Schasinglulu } 1503*91f16700Schasinglulu 1504*91f16700Schasinglulu err = clk_stm32_pll_init(priv, _PLL2); 1505*91f16700Schasinglulu if (err != 0) { 1506*91f16700Schasinglulu return err; 1507*91f16700Schasinglulu } 1508*91f16700Schasinglulu 1509*91f16700Schasinglulu err = clk_stm32_pll_init(priv, _PLL3); 1510*91f16700Schasinglulu if (err != 0) { 1511*91f16700Schasinglulu return err; 1512*91f16700Schasinglulu } 1513*91f16700Schasinglulu 1514*91f16700Schasinglulu err = clk_stm32_pll_init(priv, _PLL4); 1515*91f16700Schasinglulu if (err != 0) { 1516*91f16700Schasinglulu return err; 1517*91f16700Schasinglulu } 1518*91f16700Schasinglulu 1519*91f16700Schasinglulu return 0; 1520*91f16700Schasinglulu } 1521*91f16700Schasinglulu 1522*91f16700Schasinglulu static int stm32_clk_oscillators_wait_lse_ready(struct stm32_clk_priv *priv) 1523*91f16700Schasinglulu { 1524*91f16700Schasinglulu int ret = 0; 1525*91f16700Schasinglulu 1526*91f16700Schasinglulu if (_clk_stm32_get_rate(priv, _CK_LSE) != 0U) { 1527*91f16700Schasinglulu ret = clk_oscillator_wait_ready_on(priv, _CK_LSE); 1528*91f16700Schasinglulu } 1529*91f16700Schasinglulu 1530*91f16700Schasinglulu return ret; 1531*91f16700Schasinglulu } 1532*91f16700Schasinglulu 1533*91f16700Schasinglulu static void stm32_clk_oscillators_enable(struct stm32_clk_priv *priv) 1534*91f16700Schasinglulu { 1535*91f16700Schasinglulu stm32_enable_oscillator_hse(priv); 1536*91f16700Schasinglulu stm32_enable_oscillator_lse(priv); 1537*91f16700Schasinglulu _clk_stm32_enable(priv, _CK_LSI); 1538*91f16700Schasinglulu _clk_stm32_enable(priv, _CK_CSI); 1539*91f16700Schasinglulu } 1540*91f16700Schasinglulu 1541*91f16700Schasinglulu static int stm32_clk_hsidiv_configure(struct stm32_clk_priv *priv) 1542*91f16700Schasinglulu { 1543*91f16700Schasinglulu return stm32mp1_hsidiv(_clk_stm32_get_rate(priv, _CK_HSI)); 1544*91f16700Schasinglulu } 1545*91f16700Schasinglulu 1546*91f16700Schasinglulu #if STM32MP_USB_PROGRAMMER 1547*91f16700Schasinglulu static bool stm32mp1_clk_is_pll4_used_by_bootrom(struct stm32_clk_priv *priv, int usbphy_p) 1548*91f16700Schasinglulu { 1549*91f16700Schasinglulu /* Don't initialize PLL4, when used by BOOTROM */ 1550*91f16700Schasinglulu if ((stm32mp_get_boot_itf_selected() == 1551*91f16700Schasinglulu BOOT_API_CTX_BOOT_INTERFACE_SEL_SERIAL_USB) && 1552*91f16700Schasinglulu (usbphy_p == _PLL4R)) { 1553*91f16700Schasinglulu return true; 1554*91f16700Schasinglulu } 1555*91f16700Schasinglulu 1556*91f16700Schasinglulu return false; 1557*91f16700Schasinglulu } 1558*91f16700Schasinglulu 1559*91f16700Schasinglulu static int stm32mp1_clk_check_usb_conflict(struct stm32_clk_priv *priv, int usbphy_p, int usbo_p) 1560*91f16700Schasinglulu { 1561*91f16700Schasinglulu int _usbo_p; 1562*91f16700Schasinglulu int _usbphy_p; 1563*91f16700Schasinglulu 1564*91f16700Schasinglulu if (!pll4_bootrom) { 1565*91f16700Schasinglulu return 0; 1566*91f16700Schasinglulu } 1567*91f16700Schasinglulu 1568*91f16700Schasinglulu _usbo_p = _clk_stm32_get_parent(priv, _USBO_K); 1569*91f16700Schasinglulu _usbphy_p = _clk_stm32_get_parent(priv, _USBPHY_K); 1570*91f16700Schasinglulu 1571*91f16700Schasinglulu if ((_usbo_p != usbo_p) || (_usbphy_p != usbphy_p)) { 1572*91f16700Schasinglulu return -FDT_ERR_BADVALUE; 1573*91f16700Schasinglulu } 1574*91f16700Schasinglulu 1575*91f16700Schasinglulu return 0; 1576*91f16700Schasinglulu } 1577*91f16700Schasinglulu #endif 1578*91f16700Schasinglulu 1579*91f16700Schasinglulu static struct clk_oscillator_data stm32mp13_osc_data[NB_OSCILLATOR] = { 1580*91f16700Schasinglulu OSCILLATOR(OSC_HSI, _CK_HSI, "clk-hsi", GATE_HSI, GATE_HSI_RDY, 1581*91f16700Schasinglulu NULL, NULL, NULL), 1582*91f16700Schasinglulu 1583*91f16700Schasinglulu OSCILLATOR(OSC_LSI, _CK_LSI, "clk-lsi", GATE_LSI, GATE_LSI_RDY, 1584*91f16700Schasinglulu NULL, NULL, NULL), 1585*91f16700Schasinglulu 1586*91f16700Schasinglulu OSCILLATOR(OSC_CSI, _CK_CSI, "clk-csi", GATE_CSI, GATE_CSI_RDY, 1587*91f16700Schasinglulu NULL, NULL, NULL), 1588*91f16700Schasinglulu 1589*91f16700Schasinglulu OSCILLATOR(OSC_LSE, _CK_LSE, "clk-lse", GATE_LSE, GATE_LSE_RDY, 1590*91f16700Schasinglulu BYPASS(RCC_BDCR, 1, 3), 1591*91f16700Schasinglulu CSS(RCC_BDCR, 8), 1592*91f16700Schasinglulu DRIVE(RCC_BDCR, 4, 2, 2)), 1593*91f16700Schasinglulu 1594*91f16700Schasinglulu OSCILLATOR(OSC_HSE, _CK_HSE, "clk-hse", GATE_HSE, GATE_HSE_RDY, 1595*91f16700Schasinglulu BYPASS(RCC_OCENSETR, 10, 7), 1596*91f16700Schasinglulu CSS(RCC_OCENSETR, 11), 1597*91f16700Schasinglulu NULL), 1598*91f16700Schasinglulu 1599*91f16700Schasinglulu OSCILLATOR(OSC_I2SCKIN, _I2SCKIN, "i2s_ckin", NO_GATE, NO_GATE, 1600*91f16700Schasinglulu NULL, NULL, NULL), 1601*91f16700Schasinglulu }; 1602*91f16700Schasinglulu 1603*91f16700Schasinglulu static const char *clk_stm32_get_oscillator_name(enum stm32_osc id) 1604*91f16700Schasinglulu { 1605*91f16700Schasinglulu if (id < NB_OSCILLATOR) { 1606*91f16700Schasinglulu return stm32mp13_osc_data[id].name; 1607*91f16700Schasinglulu } 1608*91f16700Schasinglulu 1609*91f16700Schasinglulu return NULL; 1610*91f16700Schasinglulu } 1611*91f16700Schasinglulu 1612*91f16700Schasinglulu #define CLK_PLL_CFG(_idx, _clk_id, _type, _reg)\ 1613*91f16700Schasinglulu [(_idx)] = {\ 1614*91f16700Schasinglulu .clk_id = (_clk_id),\ 1615*91f16700Schasinglulu .plltype = (_type),\ 1616*91f16700Schasinglulu .reg_pllxcr = (_reg),\ 1617*91f16700Schasinglulu } 1618*91f16700Schasinglulu 1619*91f16700Schasinglulu static const struct stm32_clk_pll stm32_mp13_clk_pll[_PLL_NB] = { 1620*91f16700Schasinglulu CLK_PLL_CFG(_PLL1, _CK_PLL1, PLL_2000, RCC_PLL1CR), 1621*91f16700Schasinglulu CLK_PLL_CFG(_PLL2, _CK_PLL2, PLL_1600, RCC_PLL2CR), 1622*91f16700Schasinglulu CLK_PLL_CFG(_PLL3, _CK_PLL3, PLL_800, RCC_PLL3CR), 1623*91f16700Schasinglulu CLK_PLL_CFG(_PLL4, _CK_PLL4, PLL_800, RCC_PLL4CR), 1624*91f16700Schasinglulu }; 1625*91f16700Schasinglulu 1626*91f16700Schasinglulu static const struct stm32_clk_pll *clk_st32_pll_data(unsigned int idx) 1627*91f16700Schasinglulu { 1628*91f16700Schasinglulu return &stm32_mp13_clk_pll[idx]; 1629*91f16700Schasinglulu } 1630*91f16700Schasinglulu 1631*91f16700Schasinglulu struct stm32_pll_cfg { 1632*91f16700Schasinglulu int pll_id; 1633*91f16700Schasinglulu }; 1634*91f16700Schasinglulu 1635*91f16700Schasinglulu static unsigned long clk_stm32_pll_recalc_rate(struct stm32_clk_priv *priv, int id, 1636*91f16700Schasinglulu unsigned long prate) 1637*91f16700Schasinglulu { 1638*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, id); 1639*91f16700Schasinglulu struct stm32_pll_cfg *pll_cfg = clk->clock_cfg; 1640*91f16700Schasinglulu const struct stm32_clk_pll *pll = clk_st32_pll_data(pll_cfg->pll_id); 1641*91f16700Schasinglulu uintptr_t pll_base = priv->base + pll->reg_pllxcr; 1642*91f16700Schasinglulu uint32_t cfgr1, fracr, divm, divn; 1643*91f16700Schasinglulu unsigned long fvco; 1644*91f16700Schasinglulu 1645*91f16700Schasinglulu cfgr1 = mmio_read_32(pll_base + RCC_OFFSET_PLLXCFGR1); 1646*91f16700Schasinglulu fracr = mmio_read_32(pll_base + RCC_OFFSET_PLLXFRACR); 1647*91f16700Schasinglulu 1648*91f16700Schasinglulu divm = (cfgr1 & (RCC_PLLNCFGR1_DIVM_MASK)) >> RCC_PLLNCFGR1_DIVM_SHIFT; 1649*91f16700Schasinglulu divn = cfgr1 & RCC_PLLNCFGR1_DIVN_MASK; 1650*91f16700Schasinglulu 1651*91f16700Schasinglulu /* 1652*91f16700Schasinglulu * With FRACV : 1653*91f16700Schasinglulu * Fvco = Fck_ref * ((DIVN + 1) + FRACV / 2^13) / (DIVM + 1) 1654*91f16700Schasinglulu * Without FRACV 1655*91f16700Schasinglulu * Fvco = Fck_ref * ((DIVN + 1) / (DIVM + 1) 1656*91f16700Schasinglulu */ 1657*91f16700Schasinglulu if ((fracr & RCC_PLLNFRACR_FRACLE) != 0U) { 1658*91f16700Schasinglulu uint32_t fracv = (fracr & RCC_PLLNFRACR_FRACV_MASK) >> 1659*91f16700Schasinglulu RCC_PLLNFRACR_FRACV_SHIFT; 1660*91f16700Schasinglulu unsigned long long numerator, denominator; 1661*91f16700Schasinglulu 1662*91f16700Schasinglulu numerator = (((unsigned long long)divn + 1U) << 13) + fracv; 1663*91f16700Schasinglulu numerator = prate * numerator; 1664*91f16700Schasinglulu denominator = ((unsigned long long)divm + 1U) << 13; 1665*91f16700Schasinglulu fvco = (unsigned long)(numerator / denominator); 1666*91f16700Schasinglulu } else { 1667*91f16700Schasinglulu fvco = (unsigned long)(prate * (divn + 1U) / (divm + 1U)); 1668*91f16700Schasinglulu } 1669*91f16700Schasinglulu 1670*91f16700Schasinglulu return fvco; 1671*91f16700Schasinglulu }; 1672*91f16700Schasinglulu 1673*91f16700Schasinglulu static bool clk_stm32_pll_is_enabled(struct stm32_clk_priv *priv, int id) 1674*91f16700Schasinglulu { 1675*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, id); 1676*91f16700Schasinglulu struct stm32_pll_cfg *pll_cfg = clk->clock_cfg; 1677*91f16700Schasinglulu const struct stm32_clk_pll *pll = clk_st32_pll_data(pll_cfg->pll_id); 1678*91f16700Schasinglulu 1679*91f16700Schasinglulu return _clk_stm32_pll_is_enabled(priv, pll); 1680*91f16700Schasinglulu } 1681*91f16700Schasinglulu 1682*91f16700Schasinglulu static int clk_stm32_pll_enable(struct stm32_clk_priv *priv, int id) 1683*91f16700Schasinglulu { 1684*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, id); 1685*91f16700Schasinglulu struct stm32_pll_cfg *pll_cfg = clk->clock_cfg; 1686*91f16700Schasinglulu const struct stm32_clk_pll *pll = clk_st32_pll_data(pll_cfg->pll_id); 1687*91f16700Schasinglulu 1688*91f16700Schasinglulu return _clk_stm32_pll_enable(priv, pll); 1689*91f16700Schasinglulu } 1690*91f16700Schasinglulu 1691*91f16700Schasinglulu static void clk_stm32_pll_disable(struct stm32_clk_priv *priv, int id) 1692*91f16700Schasinglulu { 1693*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, id); 1694*91f16700Schasinglulu struct stm32_pll_cfg *pll_cfg = clk->clock_cfg; 1695*91f16700Schasinglulu const struct stm32_clk_pll *pll = clk_st32_pll_data(pll_cfg->pll_id); 1696*91f16700Schasinglulu 1697*91f16700Schasinglulu _clk_stm32_pll_disable(priv, pll); 1698*91f16700Schasinglulu } 1699*91f16700Schasinglulu 1700*91f16700Schasinglulu static const struct stm32_clk_ops clk_stm32_pll_ops = { 1701*91f16700Schasinglulu .recalc_rate = clk_stm32_pll_recalc_rate, 1702*91f16700Schasinglulu .enable = clk_stm32_pll_enable, 1703*91f16700Schasinglulu .disable = clk_stm32_pll_disable, 1704*91f16700Schasinglulu .is_enabled = clk_stm32_pll_is_enabled, 1705*91f16700Schasinglulu }; 1706*91f16700Schasinglulu 1707*91f16700Schasinglulu #define CLK_PLL(idx, _idx, _parent, _gate, _pll_id, _flags)[idx] = {\ 1708*91f16700Schasinglulu .binding = _idx,\ 1709*91f16700Schasinglulu .parent = _parent,\ 1710*91f16700Schasinglulu .flags = (_flags),\ 1711*91f16700Schasinglulu .clock_cfg = &(struct stm32_pll_cfg) {\ 1712*91f16700Schasinglulu .pll_id = _pll_id,\ 1713*91f16700Schasinglulu },\ 1714*91f16700Schasinglulu .ops = &clk_stm32_pll_ops,\ 1715*91f16700Schasinglulu } 1716*91f16700Schasinglulu 1717*91f16700Schasinglulu struct clk_stm32_composite_cfg { 1718*91f16700Schasinglulu int gate_id; 1719*91f16700Schasinglulu int div_id; 1720*91f16700Schasinglulu }; 1721*91f16700Schasinglulu 1722*91f16700Schasinglulu static unsigned long clk_stm32_composite_recalc_rate(struct stm32_clk_priv *priv, 1723*91f16700Schasinglulu int idx, unsigned long prate) 1724*91f16700Schasinglulu { 1725*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, idx); 1726*91f16700Schasinglulu struct clk_stm32_composite_cfg *composite_cfg = clk->clock_cfg; 1727*91f16700Schasinglulu 1728*91f16700Schasinglulu return _clk_stm32_divider_recalc(priv, composite_cfg->div_id, prate); 1729*91f16700Schasinglulu }; 1730*91f16700Schasinglulu 1731*91f16700Schasinglulu static bool clk_stm32_composite_gate_is_enabled(struct stm32_clk_priv *priv, int idx) 1732*91f16700Schasinglulu { 1733*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, idx); 1734*91f16700Schasinglulu struct clk_stm32_composite_cfg *composite_cfg = clk->clock_cfg; 1735*91f16700Schasinglulu 1736*91f16700Schasinglulu return _clk_stm32_gate_is_enabled(priv, composite_cfg->gate_id); 1737*91f16700Schasinglulu } 1738*91f16700Schasinglulu 1739*91f16700Schasinglulu static int clk_stm32_composite_gate_enable(struct stm32_clk_priv *priv, int idx) 1740*91f16700Schasinglulu { 1741*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, idx); 1742*91f16700Schasinglulu struct clk_stm32_composite_cfg *composite_cfg = clk->clock_cfg; 1743*91f16700Schasinglulu 1744*91f16700Schasinglulu return _clk_stm32_gate_enable(priv, composite_cfg->gate_id); 1745*91f16700Schasinglulu } 1746*91f16700Schasinglulu 1747*91f16700Schasinglulu static void clk_stm32_composite_gate_disable(struct stm32_clk_priv *priv, int idx) 1748*91f16700Schasinglulu { 1749*91f16700Schasinglulu const struct clk_stm32 *clk = _clk_get(priv, idx); 1750*91f16700Schasinglulu struct clk_stm32_composite_cfg *composite_cfg = clk->clock_cfg; 1751*91f16700Schasinglulu 1752*91f16700Schasinglulu _clk_stm32_gate_disable(priv, composite_cfg->gate_id); 1753*91f16700Schasinglulu } 1754*91f16700Schasinglulu 1755*91f16700Schasinglulu static const struct stm32_clk_ops clk_stm32_composite_ops = { 1756*91f16700Schasinglulu .recalc_rate = clk_stm32_composite_recalc_rate, 1757*91f16700Schasinglulu .is_enabled = clk_stm32_composite_gate_is_enabled, 1758*91f16700Schasinglulu .enable = clk_stm32_composite_gate_enable, 1759*91f16700Schasinglulu .disable = clk_stm32_composite_gate_disable, 1760*91f16700Schasinglulu }; 1761*91f16700Schasinglulu 1762*91f16700Schasinglulu #define STM32_COMPOSITE(idx, _binding, _parent, _flags, _gate_id,\ 1763*91f16700Schasinglulu _div_id)[idx] = {\ 1764*91f16700Schasinglulu .binding = (_binding),\ 1765*91f16700Schasinglulu .parent = (_parent),\ 1766*91f16700Schasinglulu .flags = (_flags),\ 1767*91f16700Schasinglulu .clock_cfg = &(struct clk_stm32_composite_cfg) {\ 1768*91f16700Schasinglulu .gate_id = (_gate_id),\ 1769*91f16700Schasinglulu .div_id = (_div_id),\ 1770*91f16700Schasinglulu },\ 1771*91f16700Schasinglulu .ops = &clk_stm32_composite_ops,\ 1772*91f16700Schasinglulu } 1773*91f16700Schasinglulu 1774*91f16700Schasinglulu static const struct clk_stm32 stm32mp13_clk[CK_LAST] = { 1775*91f16700Schasinglulu /* ROOT CLOCKS */ 1776*91f16700Schasinglulu CLK_FIXED_RATE(_CK_OFF, _NO_ID, 0), 1777*91f16700Schasinglulu CLK_OSC(_CK_HSE, CK_HSE, CLK_IS_ROOT, OSC_HSE), 1778*91f16700Schasinglulu CLK_OSC(_CK_HSI, CK_HSI, CLK_IS_ROOT, OSC_HSI), 1779*91f16700Schasinglulu CLK_OSC(_CK_CSI, CK_CSI, CLK_IS_ROOT, OSC_CSI), 1780*91f16700Schasinglulu CLK_OSC(_CK_LSI, CK_LSI, CLK_IS_ROOT, OSC_LSI), 1781*91f16700Schasinglulu CLK_OSC(_CK_LSE, CK_LSE, CLK_IS_ROOT, OSC_LSE), 1782*91f16700Schasinglulu 1783*91f16700Schasinglulu CLK_OSC_FIXED(_I2SCKIN, _NO_ID, CLK_IS_ROOT, OSC_I2SCKIN), 1784*91f16700Schasinglulu 1785*91f16700Schasinglulu CLK_FIXED_RATE(_USB_PHY_48, _NO_ID, USB_PHY_48_MHZ), 1786*91f16700Schasinglulu 1787*91f16700Schasinglulu STM32_DIV(_HSE_DIV, _NO_ID, _CK_HSE, 0, DIV_RTC), 1788*91f16700Schasinglulu 1789*91f16700Schasinglulu FIXED_FACTOR(_HSE_DIV2, CK_HSE_DIV2, _CK_HSE, 1, 2), 1790*91f16700Schasinglulu FIXED_FACTOR(_CSI_DIV122, _NO_ID, _CK_CSI, 1, 122), 1791*91f16700Schasinglulu 1792*91f16700Schasinglulu CLK_PLL(_CK_PLL1, PLL1, MUX(MUX_PLL12), GATE_PLL1, _PLL1, 0), 1793*91f16700Schasinglulu CLK_PLL(_CK_PLL2, PLL2, MUX(MUX_PLL12), GATE_PLL2, _PLL2, 0), 1794*91f16700Schasinglulu CLK_PLL(_CK_PLL3, PLL3, MUX(MUX_PLL3), GATE_PLL3, _PLL3, 0), 1795*91f16700Schasinglulu CLK_PLL(_CK_PLL4, PLL4, MUX(MUX_PLL4), GATE_PLL4, _PLL4, 0), 1796*91f16700Schasinglulu 1797*91f16700Schasinglulu STM32_COMPOSITE(_PLL1P, PLL1_P, _CK_PLL1, CLK_IS_CRITICAL, GATE_PLL1_DIVP, DIV_PLL1DIVP), 1798*91f16700Schasinglulu STM32_DIV(_PLL1P_DIV, _NO_ID, _CK_PLL1, 0, DIV_MPU), 1799*91f16700Schasinglulu 1800*91f16700Schasinglulu STM32_COMPOSITE(_PLL2P, PLL2_P, _CK_PLL2, CLK_IS_CRITICAL, GATE_PLL2_DIVP, DIV_PLL2DIVP), 1801*91f16700Schasinglulu STM32_COMPOSITE(_PLL2Q, PLL2_Q, _CK_PLL2, 0, GATE_PLL2_DIVQ, DIV_PLL2DIVQ), 1802*91f16700Schasinglulu STM32_COMPOSITE(_PLL2R, PLL2_R, _CK_PLL2, CLK_IS_CRITICAL, GATE_PLL2_DIVR, DIV_PLL2DIVR), 1803*91f16700Schasinglulu 1804*91f16700Schasinglulu STM32_COMPOSITE(_PLL3P, PLL3_P, _CK_PLL3, 0, GATE_PLL3_DIVP, DIV_PLL3DIVP), 1805*91f16700Schasinglulu STM32_COMPOSITE(_PLL3Q, PLL3_Q, _CK_PLL3, 0, GATE_PLL3_DIVQ, DIV_PLL3DIVQ), 1806*91f16700Schasinglulu STM32_COMPOSITE(_PLL3R, PLL3_R, _CK_PLL3, 0, GATE_PLL3_DIVR, DIV_PLL3DIVR), 1807*91f16700Schasinglulu 1808*91f16700Schasinglulu STM32_COMPOSITE(_PLL4P, PLL4_P, _CK_PLL4, 0, GATE_PLL4_DIVP, DIV_PLL4DIVP), 1809*91f16700Schasinglulu STM32_COMPOSITE(_PLL4Q, PLL4_Q, _CK_PLL4, 0, GATE_PLL4_DIVQ, DIV_PLL4DIVQ), 1810*91f16700Schasinglulu STM32_COMPOSITE(_PLL4R, PLL4_R, _CK_PLL4, 0, GATE_PLL4_DIVR, DIV_PLL4DIVR), 1811*91f16700Schasinglulu 1812*91f16700Schasinglulu STM32_MUX(_CKMPU, CK_MPU, MUX_MPU, 0), 1813*91f16700Schasinglulu STM32_DIV(_CKAXI, CK_AXI, MUX(MUX_AXI), 0, DIV_AXI), 1814*91f16700Schasinglulu STM32_DIV(_CKMLAHB, CK_MLAHB, MUX(MUX_MLAHB), CLK_IS_CRITICAL, DIV_MLAHB), 1815*91f16700Schasinglulu STM32_MUX(_CKPER, CK_PER, MUX(MUX_CKPER), 0), 1816*91f16700Schasinglulu 1817*91f16700Schasinglulu STM32_DIV(_PCLK1, PCLK1, _CKMLAHB, 0, DIV_APB1), 1818*91f16700Schasinglulu STM32_DIV(_PCLK2, PCLK2, _CKMLAHB, 0, DIV_APB2), 1819*91f16700Schasinglulu STM32_DIV(_PCLK3, PCLK3, _CKMLAHB, 0, DIV_APB3), 1820*91f16700Schasinglulu STM32_DIV(_PCLK4, PCLK4, _CKAXI, 0, DIV_APB4), 1821*91f16700Schasinglulu STM32_DIV(_PCLK5, PCLK5, _CKAXI, 0, DIV_APB5), 1822*91f16700Schasinglulu STM32_DIV(_PCLK6, PCLK6, _CKMLAHB, 0, DIV_APB6), 1823*91f16700Schasinglulu 1824*91f16700Schasinglulu CK_TIMER(_CKTIMG1, CK_TIMG1, _PCLK1, 0, RCC_APB1DIVR, RCC_TIMG1PRER), 1825*91f16700Schasinglulu CK_TIMER(_CKTIMG2, CK_TIMG2, _PCLK2, 0, RCC_APB2DIVR, RCC_TIMG2PRER), 1826*91f16700Schasinglulu CK_TIMER(_CKTIMG3, CK_TIMG3, _PCLK6, 0, RCC_APB6DIVR, RCC_TIMG3PRER), 1827*91f16700Schasinglulu 1828*91f16700Schasinglulu /* END ROOT CLOCKS */ 1829*91f16700Schasinglulu 1830*91f16700Schasinglulu STM32_GATE(_DDRC1, DDRC1, _CKAXI, CLK_IS_CRITICAL, GATE_DDRC1), 1831*91f16700Schasinglulu STM32_GATE(_DDRC1LP, DDRC1LP, _CKAXI, CLK_IS_CRITICAL, GATE_DDRC1LP), 1832*91f16700Schasinglulu STM32_GATE(_DDRPHYC, DDRPHYC, _PLL2R, CLK_IS_CRITICAL, GATE_DDRPHYC), 1833*91f16700Schasinglulu STM32_GATE(_DDRPHYCLP, DDRPHYCLP, _PLL2R, CLK_IS_CRITICAL, GATE_DDRPHYCLP), 1834*91f16700Schasinglulu STM32_GATE(_DDRCAPB, DDRCAPB, _PCLK4, CLK_IS_CRITICAL, GATE_DDRCAPB), 1835*91f16700Schasinglulu STM32_GATE(_DDRCAPBLP, DDRCAPBLP, _PCLK4, CLK_IS_CRITICAL, GATE_DDRCAPBLP), 1836*91f16700Schasinglulu STM32_GATE(_AXIDCG, AXIDCG, _CKAXI, CLK_IS_CRITICAL, GATE_AXIDCG), 1837*91f16700Schasinglulu STM32_GATE(_DDRPHYCAPB, DDRPHYCAPB, _PCLK4, CLK_IS_CRITICAL, GATE_DDRPHYCAPB), 1838*91f16700Schasinglulu STM32_GATE(_DDRPHYCAPBLP, DDRPHYCAPBLP, _PCLK4, CLK_IS_CRITICAL, GATE_DDRPHYCAPBLP), 1839*91f16700Schasinglulu 1840*91f16700Schasinglulu STM32_GATE(_SYSCFG, SYSCFG, _PCLK3, 0, GATE_SYSCFG), 1841*91f16700Schasinglulu STM32_GATE(_DDRPERFM, DDRPERFM, _PCLK4, 0, GATE_DDRPERFM), 1842*91f16700Schasinglulu STM32_GATE(_IWDG2APB, IWDG2, _PCLK4, 0, GATE_IWDG2APB), 1843*91f16700Schasinglulu STM32_GATE(_USBPHY_K, USBPHY_K, MUX(MUX_USBPHY), 0, GATE_USBPHY), 1844*91f16700Schasinglulu STM32_GATE(_USBO_K, USBO_K, MUX(MUX_USBO), 0, GATE_USBO), 1845*91f16700Schasinglulu 1846*91f16700Schasinglulu STM32_GATE(_RTCAPB, RTCAPB, _PCLK5, CLK_IS_CRITICAL, GATE_RTCAPB), 1847*91f16700Schasinglulu STM32_GATE(_TZC, TZC, _PCLK5, CLK_IS_CRITICAL, GATE_TZC), 1848*91f16700Schasinglulu STM32_GATE(_ETZPC, TZPC, _PCLK5, CLK_IS_CRITICAL, GATE_ETZPC), 1849*91f16700Schasinglulu STM32_GATE(_IWDG1APB, IWDG1, _PCLK5, 0, GATE_IWDG1APB), 1850*91f16700Schasinglulu STM32_GATE(_BSEC, BSEC, _PCLK5, CLK_IS_CRITICAL, GATE_BSEC), 1851*91f16700Schasinglulu STM32_GATE(_STGENC, STGEN_K, MUX(MUX_STGEN), CLK_IS_CRITICAL, GATE_STGENC), 1852*91f16700Schasinglulu 1853*91f16700Schasinglulu STM32_GATE(_USART1_K, USART1_K, MUX(MUX_UART1), 0, GATE_USART1), 1854*91f16700Schasinglulu STM32_GATE(_USART2_K, USART2_K, MUX(MUX_UART2), 0, GATE_USART2), 1855*91f16700Schasinglulu STM32_GATE(_I2C3_K, I2C3_K, MUX(MUX_I2C3), 0, GATE_I2C3), 1856*91f16700Schasinglulu STM32_GATE(_I2C4_K, I2C4_K, MUX(MUX_I2C4), 0, GATE_I2C4), 1857*91f16700Schasinglulu STM32_GATE(_I2C5_K, I2C5_K, MUX(MUX_I2C5), 0, GATE_I2C5), 1858*91f16700Schasinglulu STM32_GATE(_TIM12, TIM12_K, _CKTIMG3, 0, GATE_TIM12), 1859*91f16700Schasinglulu STM32_GATE(_TIM15, TIM15_K, _CKTIMG3, 0, GATE_TIM15), 1860*91f16700Schasinglulu 1861*91f16700Schasinglulu STM32_GATE(_RTCCK, RTC, MUX(MUX_RTC), 0, GATE_RTCCK), 1862*91f16700Schasinglulu 1863*91f16700Schasinglulu STM32_GATE(_GPIOA, GPIOA, _CKMLAHB, 0, GATE_GPIOA), 1864*91f16700Schasinglulu STM32_GATE(_GPIOB, GPIOB, _CKMLAHB, 0, GATE_GPIOB), 1865*91f16700Schasinglulu STM32_GATE(_GPIOC, GPIOC, _CKMLAHB, 0, GATE_GPIOC), 1866*91f16700Schasinglulu STM32_GATE(_GPIOD, GPIOD, _CKMLAHB, 0, GATE_GPIOD), 1867*91f16700Schasinglulu STM32_GATE(_GPIOE, GPIOE, _CKMLAHB, 0, GATE_GPIOE), 1868*91f16700Schasinglulu STM32_GATE(_GPIOF, GPIOF, _CKMLAHB, 0, GATE_GPIOF), 1869*91f16700Schasinglulu STM32_GATE(_GPIOG, GPIOG, _CKMLAHB, 0, GATE_GPIOG), 1870*91f16700Schasinglulu STM32_GATE(_GPIOH, GPIOH, _CKMLAHB, 0, GATE_GPIOH), 1871*91f16700Schasinglulu STM32_GATE(_GPIOI, GPIOI, _CKMLAHB, 0, GATE_GPIOI), 1872*91f16700Schasinglulu 1873*91f16700Schasinglulu STM32_GATE(_PKA, PKA, _CKAXI, 0, GATE_PKA), 1874*91f16700Schasinglulu STM32_GATE(_SAES_K, SAES_K, MUX(MUX_SAES), 0, GATE_SAES), 1875*91f16700Schasinglulu STM32_GATE(_CRYP1, CRYP1, _PCLK5, 0, GATE_CRYP1), 1876*91f16700Schasinglulu STM32_GATE(_HASH1, HASH1, _PCLK5, 0, GATE_HASH1), 1877*91f16700Schasinglulu 1878*91f16700Schasinglulu STM32_GATE(_RNG1_K, RNG1_K, MUX(MUX_RNG1), 0, GATE_RNG1), 1879*91f16700Schasinglulu STM32_GATE(_BKPSRAM, BKPSRAM, _PCLK5, CLK_IS_CRITICAL, GATE_BKPSRAM), 1880*91f16700Schasinglulu 1881*91f16700Schasinglulu STM32_GATE(_SDMMC1_K, SDMMC1_K, MUX(MUX_SDMMC1), 0, GATE_SDMMC1), 1882*91f16700Schasinglulu STM32_GATE(_SDMMC2_K, SDMMC2_K, MUX(MUX_SDMMC2), 0, GATE_SDMMC2), 1883*91f16700Schasinglulu STM32_GATE(_DBGCK, CK_DBG, _CKAXI, 0, GATE_DBGCK), 1884*91f16700Schasinglulu 1885*91f16700Schasinglulu /* TODO: CHECK CLOCK FOR BL2/BL32 AND IF ONLY FOR TEST OR NOT */ 1886*91f16700Schasinglulu STM32_GATE(_USART3_K, USART3_K, MUX(MUX_UART35), 0, GATE_USART3), 1887*91f16700Schasinglulu STM32_GATE(_UART4_K, UART4_K, MUX(MUX_UART4), 0, GATE_UART4), 1888*91f16700Schasinglulu STM32_GATE(_UART5_K, UART5_K, MUX(MUX_UART35), 0, GATE_UART5), 1889*91f16700Schasinglulu STM32_GATE(_UART7_K, UART7_K, MUX(MUX_UART78), 0, GATE_UART7), 1890*91f16700Schasinglulu STM32_GATE(_UART8_K, UART8_K, MUX(MUX_UART78), 0, GATE_UART8), 1891*91f16700Schasinglulu STM32_GATE(_USART6_K, USART6_K, MUX(MUX_UART6), 0, GATE_USART6), 1892*91f16700Schasinglulu STM32_GATE(_MCE, MCE, _CKAXI, CLK_IS_CRITICAL, GATE_MCE), 1893*91f16700Schasinglulu STM32_GATE(_FMC_K, FMC_K, MUX(MUX_FMC), 0, GATE_FMC), 1894*91f16700Schasinglulu STM32_GATE(_QSPI_K, QSPI_K, MUX(MUX_QSPI), 0, GATE_QSPI), 1895*91f16700Schasinglulu 1896*91f16700Schasinglulu STM32_COMPOSITE(_MCO1_K, CK_MCO1, MUX(MUX_MCO1), 0, GATE_MCO1, DIV_MCO1), 1897*91f16700Schasinglulu STM32_COMPOSITE(_MCO2_K, CK_MCO2, MUX(MUX_MCO2), 0, GATE_MCO2, DIV_MCO2), 1898*91f16700Schasinglulu STM32_COMPOSITE(_TRACECK, CK_TRACE, _CKAXI, 0, GATE_TRACECK, DIV_TRACE), 1899*91f16700Schasinglulu 1900*91f16700Schasinglulu #if defined(IMAGE_BL32) 1901*91f16700Schasinglulu STM32_GATE(_TIM2, TIM2_K, _CKTIMG1, 0, GATE_TIM2), 1902*91f16700Schasinglulu STM32_GATE(_TIM3, TIM3_K, _CKTIMG1, 0, GATE_TIM3), 1903*91f16700Schasinglulu STM32_GATE(_TIM4, TIM4_K, _CKTIMG1, 0, GATE_TIM4), 1904*91f16700Schasinglulu STM32_GATE(_TIM5, TIM5_K, _CKTIMG1, 0, GATE_TIM5), 1905*91f16700Schasinglulu STM32_GATE(_TIM6, TIM6_K, _CKTIMG1, 0, GATE_TIM6), 1906*91f16700Schasinglulu STM32_GATE(_TIM7, TIM7_K, _CKTIMG1, 0, GATE_TIM7), 1907*91f16700Schasinglulu STM32_GATE(_TIM13, TIM13_K, _CKTIMG3, 0, GATE_TIM13), 1908*91f16700Schasinglulu STM32_GATE(_TIM14, TIM14_K, _CKTIMG3, 0, GATE_TIM14), 1909*91f16700Schasinglulu STM32_GATE(_LPTIM1_K, LPTIM1_K, MUX(MUX_LPTIM1), 0, GATE_LPTIM1), 1910*91f16700Schasinglulu STM32_GATE(_SPI2_K, SPI2_K, MUX(MUX_SPI23), 0, GATE_SPI2), 1911*91f16700Schasinglulu STM32_GATE(_SPI3_K, SPI3_K, MUX(MUX_SPI23), 0, GATE_SPI3), 1912*91f16700Schasinglulu STM32_GATE(_SPDIF_K, SPDIF_K, MUX(MUX_SPDIF), 0, GATE_SPDIF), 1913*91f16700Schasinglulu STM32_GATE(_TIM1, TIM1_K, _CKTIMG2, 0, GATE_TIM1), 1914*91f16700Schasinglulu STM32_GATE(_TIM8, TIM8_K, _CKTIMG2, 0, GATE_TIM8), 1915*91f16700Schasinglulu STM32_GATE(_TIM16, TIM16_K, _CKTIMG3, 0, GATE_TIM16), 1916*91f16700Schasinglulu STM32_GATE(_TIM17, TIM17_K, _CKTIMG3, 0, GATE_TIM17), 1917*91f16700Schasinglulu STM32_GATE(_SPI1_K, SPI1_K, MUX(MUX_SPI1), 0, GATE_SPI1), 1918*91f16700Schasinglulu STM32_GATE(_SPI4_K, SPI4_K, MUX(MUX_SPI4), 0, GATE_SPI4), 1919*91f16700Schasinglulu STM32_GATE(_SPI5_K, SPI5_K, MUX(MUX_SPI5), 0, GATE_SPI5), 1920*91f16700Schasinglulu STM32_GATE(_SAI1_K, SAI1_K, MUX(MUX_SAI1), 0, GATE_SAI1), 1921*91f16700Schasinglulu STM32_GATE(_SAI2_K, SAI2_K, MUX(MUX_SAI2), 0, GATE_SAI2), 1922*91f16700Schasinglulu STM32_GATE(_DFSDM, DFSDM_K, MUX(MUX_SAI1), 0, GATE_DFSDM), 1923*91f16700Schasinglulu STM32_GATE(_FDCAN_K, FDCAN_K, MUX(MUX_FDCAN), 0, GATE_FDCAN), 1924*91f16700Schasinglulu STM32_GATE(_USBH, USBH, _CKAXI, 0, GATE_USBH), 1925*91f16700Schasinglulu STM32_GATE(_I2C1_K, I2C1_K, MUX(MUX_I2C12), 0, GATE_I2C1), 1926*91f16700Schasinglulu STM32_GATE(_I2C2_K, I2C2_K, MUX(MUX_I2C12), 0, GATE_I2C2), 1927*91f16700Schasinglulu STM32_GATE(_ADFSDM, ADFSDM_K, MUX(MUX_SAI1), 0, GATE_ADFSDM), 1928*91f16700Schasinglulu STM32_GATE(_LPTIM2_K, LPTIM2_K, MUX(MUX_LPTIM2), 0, GATE_LPTIM2), 1929*91f16700Schasinglulu STM32_GATE(_LPTIM3_K, LPTIM3_K, MUX(MUX_LPTIM3), 0, GATE_LPTIM3), 1930*91f16700Schasinglulu STM32_GATE(_LPTIM4_K, LPTIM4_K, MUX(MUX_LPTIM45), 0, GATE_LPTIM4), 1931*91f16700Schasinglulu STM32_GATE(_LPTIM5_K, LPTIM5_K, MUX(MUX_LPTIM45), 0, GATE_LPTIM5), 1932*91f16700Schasinglulu STM32_GATE(_VREF, VREF, _PCLK3, 0, GATE_VREF), 1933*91f16700Schasinglulu STM32_GATE(_DTS, TMPSENS, _PCLK3, 0, GATE_DTS), 1934*91f16700Schasinglulu STM32_GATE(_PMBCTRL, PMBCTRL, _PCLK3, 0, GATE_HDP), 1935*91f16700Schasinglulu STM32_GATE(_HDP, HDP, _PCLK3, 0, GATE_PMBCTRL), 1936*91f16700Schasinglulu STM32_GATE(_STGENRO, STGENRO, _PCLK4, 0, GATE_DCMIPP), 1937*91f16700Schasinglulu STM32_GATE(_DCMIPP_K, DCMIPP_K, MUX(MUX_DCMIPP), 0, GATE_DCMIPP), 1938*91f16700Schasinglulu STM32_GATE(_DMAMUX1, DMAMUX1, _CKAXI, 0, GATE_DMAMUX1), 1939*91f16700Schasinglulu STM32_GATE(_DMAMUX2, DMAMUX2, _CKAXI, 0, GATE_DMAMUX2), 1940*91f16700Schasinglulu STM32_GATE(_DMA3, DMA3, _CKAXI, 0, GATE_DMAMUX2), 1941*91f16700Schasinglulu STM32_GATE(_ADC1_K, ADC1_K, MUX(MUX_ADC1), 0, GATE_ADC1), 1942*91f16700Schasinglulu STM32_GATE(_ADC2_K, ADC2_K, MUX(MUX_ADC2), 0, GATE_ADC2), 1943*91f16700Schasinglulu STM32_GATE(_TSC, TSC, _CKAXI, 0, GATE_TSC), 1944*91f16700Schasinglulu STM32_GATE(_AXIMC, AXIMC, _CKAXI, 0, GATE_AXIMC), 1945*91f16700Schasinglulu STM32_GATE(_CRC1, CRC1, _CKAXI, 0, GATE_ETH1TX), 1946*91f16700Schasinglulu STM32_GATE(_ETH1CK, ETH1CK_K, MUX(MUX_ETH1), 0, GATE_ETH1CK), 1947*91f16700Schasinglulu STM32_GATE(_ETH1TX, ETH1TX, _CKAXI, 0, GATE_ETH1TX), 1948*91f16700Schasinglulu STM32_GATE(_ETH1RX, ETH1RX, _CKAXI, 0, GATE_ETH1RX), 1949*91f16700Schasinglulu STM32_GATE(_ETH2CK, ETH2CK_K, MUX(MUX_ETH2), 0, GATE_ETH2CK), 1950*91f16700Schasinglulu STM32_GATE(_ETH2TX, ETH2TX, _CKAXI, 0, GATE_ETH2TX), 1951*91f16700Schasinglulu STM32_GATE(_ETH2RX, ETH2RX, _CKAXI, 0, GATE_ETH2RX), 1952*91f16700Schasinglulu STM32_GATE(_ETH2MAC, ETH2MAC, _CKAXI, 0, GATE_ETH2MAC), 1953*91f16700Schasinglulu #endif 1954*91f16700Schasinglulu }; 1955*91f16700Schasinglulu 1956*91f16700Schasinglulu static struct stm32_pll_dt_cfg mp13_pll[_PLL_NB]; 1957*91f16700Schasinglulu 1958*91f16700Schasinglulu static struct stm32_osci_dt_cfg mp13_osci[NB_OSCILLATOR]; 1959*91f16700Schasinglulu 1960*91f16700Schasinglulu static uint32_t mp13_clksrc[MUX_MAX]; 1961*91f16700Schasinglulu 1962*91f16700Schasinglulu static uint32_t mp13_clkdiv[DIV_MAX]; 1963*91f16700Schasinglulu 1964*91f16700Schasinglulu static struct stm32_clk_platdata stm32mp13_clock_pdata = { 1965*91f16700Schasinglulu .osci = mp13_osci, 1966*91f16700Schasinglulu .nosci = NB_OSCILLATOR, 1967*91f16700Schasinglulu .pll = mp13_pll, 1968*91f16700Schasinglulu .npll = _PLL_NB, 1969*91f16700Schasinglulu .clksrc = mp13_clksrc, 1970*91f16700Schasinglulu .nclksrc = MUX_MAX, 1971*91f16700Schasinglulu .clkdiv = mp13_clkdiv, 1972*91f16700Schasinglulu .nclkdiv = DIV_MAX, 1973*91f16700Schasinglulu }; 1974*91f16700Schasinglulu 1975*91f16700Schasinglulu static struct stm32_clk_priv stm32mp13_clock_data = { 1976*91f16700Schasinglulu .base = RCC_BASE, 1977*91f16700Schasinglulu .num = ARRAY_SIZE(stm32mp13_clk), 1978*91f16700Schasinglulu .clks = stm32mp13_clk, 1979*91f16700Schasinglulu .parents = parent_mp13, 1980*91f16700Schasinglulu .nb_parents = ARRAY_SIZE(parent_mp13), 1981*91f16700Schasinglulu .gates = gates_mp13, 1982*91f16700Schasinglulu .nb_gates = ARRAY_SIZE(gates_mp13), 1983*91f16700Schasinglulu .div = dividers_mp13, 1984*91f16700Schasinglulu .nb_div = ARRAY_SIZE(dividers_mp13), 1985*91f16700Schasinglulu .osci_data = stm32mp13_osc_data, 1986*91f16700Schasinglulu .nb_osci_data = ARRAY_SIZE(stm32mp13_osc_data), 1987*91f16700Schasinglulu .gate_refcounts = refcounts_mp13, 1988*91f16700Schasinglulu .pdata = &stm32mp13_clock_pdata, 1989*91f16700Schasinglulu }; 1990*91f16700Schasinglulu 1991*91f16700Schasinglulu static int stm32mp1_init_clock_tree(void) 1992*91f16700Schasinglulu { 1993*91f16700Schasinglulu struct stm32_clk_priv *priv = clk_stm32_get_priv(); 1994*91f16700Schasinglulu int ret; 1995*91f16700Schasinglulu 1996*91f16700Schasinglulu #if STM32MP_USB_PROGRAMMER 1997*91f16700Schasinglulu int usbphy_p = _clk_stm32_get_parent(priv, _USBPHY_K); 1998*91f16700Schasinglulu int usbo_p = _clk_stm32_get_parent(priv, _USBO_K); 1999*91f16700Schasinglulu 2000*91f16700Schasinglulu /* Don't initialize PLL4, when used by BOOTROM */ 2001*91f16700Schasinglulu pll4_bootrom = stm32mp1_clk_is_pll4_used_by_bootrom(priv, usbphy_p); 2002*91f16700Schasinglulu #endif 2003*91f16700Schasinglulu 2004*91f16700Schasinglulu /* 2005*91f16700Schasinglulu * Switch ON oscillators found in device-tree. 2006*91f16700Schasinglulu * Note: HSI already ON after BootROM stage. 2007*91f16700Schasinglulu */ 2008*91f16700Schasinglulu stm32_clk_oscillators_enable(priv); 2009*91f16700Schasinglulu 2010*91f16700Schasinglulu /* Come back to HSI */ 2011*91f16700Schasinglulu ret = stm32mp1_come_back_to_hsi(); 2012*91f16700Schasinglulu if (ret != 0) { 2013*91f16700Schasinglulu return ret; 2014*91f16700Schasinglulu } 2015*91f16700Schasinglulu 2016*91f16700Schasinglulu ret = stm32_clk_hsidiv_configure(priv); 2017*91f16700Schasinglulu if (ret != 0) { 2018*91f16700Schasinglulu return ret; 2019*91f16700Schasinglulu } 2020*91f16700Schasinglulu 2021*91f16700Schasinglulu ret = stm32_clk_stgen_configure(priv, _STGENC); 2022*91f16700Schasinglulu if (ret != 0) { 2023*91f16700Schasinglulu panic(); 2024*91f16700Schasinglulu } 2025*91f16700Schasinglulu 2026*91f16700Schasinglulu ret = stm32_clk_dividers_configure(priv); 2027*91f16700Schasinglulu if (ret != 0) { 2028*91f16700Schasinglulu panic(); 2029*91f16700Schasinglulu } 2030*91f16700Schasinglulu 2031*91f16700Schasinglulu ret = stm32_clk_pll_configure(priv); 2032*91f16700Schasinglulu if (ret != 0) { 2033*91f16700Schasinglulu panic(); 2034*91f16700Schasinglulu } 2035*91f16700Schasinglulu 2036*91f16700Schasinglulu /* Wait LSE ready before to use it */ 2037*91f16700Schasinglulu ret = stm32_clk_oscillators_wait_lse_ready(priv); 2038*91f16700Schasinglulu if (ret != 0) { 2039*91f16700Schasinglulu panic(); 2040*91f16700Schasinglulu } 2041*91f16700Schasinglulu 2042*91f16700Schasinglulu /* Configure with expected clock source */ 2043*91f16700Schasinglulu ret = stm32_clk_source_configure(priv); 2044*91f16700Schasinglulu if (ret != 0) { 2045*91f16700Schasinglulu panic(); 2046*91f16700Schasinglulu } 2047*91f16700Schasinglulu 2048*91f16700Schasinglulu /* Configure LSE css after RTC source configuration */ 2049*91f16700Schasinglulu ret = stm32_clk_oscillators_lse_set_css(priv); 2050*91f16700Schasinglulu if (ret != 0) { 2051*91f16700Schasinglulu panic(); 2052*91f16700Schasinglulu } 2053*91f16700Schasinglulu 2054*91f16700Schasinglulu #if STM32MP_USB_PROGRAMMER 2055*91f16700Schasinglulu ret = stm32mp1_clk_check_usb_conflict(priv, usbphy_p, usbo_p); 2056*91f16700Schasinglulu if (ret != 0) { 2057*91f16700Schasinglulu return ret; 2058*91f16700Schasinglulu } 2059*91f16700Schasinglulu #endif 2060*91f16700Schasinglulu /* reconfigure STGEN with DT config */ 2061*91f16700Schasinglulu ret = stm32_clk_stgen_configure(priv, _STGENC); 2062*91f16700Schasinglulu if (ret != 0) { 2063*91f16700Schasinglulu panic(); 2064*91f16700Schasinglulu } 2065*91f16700Schasinglulu 2066*91f16700Schasinglulu /* Software Self-Refresh mode (SSR) during DDR initilialization */ 2067*91f16700Schasinglulu mmio_clrsetbits_32(priv->base + RCC_DDRITFCR, 2068*91f16700Schasinglulu RCC_DDRITFCR_DDRCKMOD_MASK, 2069*91f16700Schasinglulu RCC_DDRITFCR_DDRCKMOD_SSR << 2070*91f16700Schasinglulu RCC_DDRITFCR_DDRCKMOD_SHIFT); 2071*91f16700Schasinglulu 2072*91f16700Schasinglulu return 0; 2073*91f16700Schasinglulu } 2074*91f16700Schasinglulu 2075*91f16700Schasinglulu #define LSEDRV_MEDIUM_HIGH 2 2076*91f16700Schasinglulu 2077*91f16700Schasinglulu static int clk_stm32_parse_oscillator_fdt(void *fdt, int node, const char *name, 2078*91f16700Schasinglulu struct stm32_osci_dt_cfg *osci) 2079*91f16700Schasinglulu { 2080*91f16700Schasinglulu int subnode = 0; 2081*91f16700Schasinglulu 2082*91f16700Schasinglulu /* default value oscillator not found, freq=0 */ 2083*91f16700Schasinglulu osci->freq = 0; 2084*91f16700Schasinglulu 2085*91f16700Schasinglulu fdt_for_each_subnode(subnode, fdt, node) { 2086*91f16700Schasinglulu const char *cchar = NULL; 2087*91f16700Schasinglulu const fdt32_t *cuint = NULL; 2088*91f16700Schasinglulu int ret = 0; 2089*91f16700Schasinglulu 2090*91f16700Schasinglulu cchar = fdt_get_name(fdt, subnode, &ret); 2091*91f16700Schasinglulu if (cchar == NULL) { 2092*91f16700Schasinglulu return ret; 2093*91f16700Schasinglulu } 2094*91f16700Schasinglulu 2095*91f16700Schasinglulu if (strncmp(cchar, name, (size_t)ret) || 2096*91f16700Schasinglulu fdt_get_status(subnode) == DT_DISABLED) { 2097*91f16700Schasinglulu continue; 2098*91f16700Schasinglulu } 2099*91f16700Schasinglulu 2100*91f16700Schasinglulu cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret); 2101*91f16700Schasinglulu if (cuint == NULL) { 2102*91f16700Schasinglulu return ret; 2103*91f16700Schasinglulu } 2104*91f16700Schasinglulu 2105*91f16700Schasinglulu osci->freq = fdt32_to_cpu(*cuint); 2106*91f16700Schasinglulu 2107*91f16700Schasinglulu if (fdt_getprop(fdt, subnode, "st,bypass", NULL) != NULL) { 2108*91f16700Schasinglulu osci->bypass = true; 2109*91f16700Schasinglulu } 2110*91f16700Schasinglulu 2111*91f16700Schasinglulu if (fdt_getprop(fdt, subnode, "st,digbypass", NULL) != NULL) { 2112*91f16700Schasinglulu osci->digbyp = true; 2113*91f16700Schasinglulu } 2114*91f16700Schasinglulu 2115*91f16700Schasinglulu if (fdt_getprop(fdt, subnode, "st,css", NULL) != NULL) { 2116*91f16700Schasinglulu osci->css = true; 2117*91f16700Schasinglulu } 2118*91f16700Schasinglulu 2119*91f16700Schasinglulu osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive", LSEDRV_MEDIUM_HIGH); 2120*91f16700Schasinglulu 2121*91f16700Schasinglulu return 0; 2122*91f16700Schasinglulu } 2123*91f16700Schasinglulu 2124*91f16700Schasinglulu return 0; 2125*91f16700Schasinglulu } 2126*91f16700Schasinglulu 2127*91f16700Schasinglulu static int stm32_clk_parse_fdt_all_oscillator(void *fdt, struct stm32_clk_platdata *pdata) 2128*91f16700Schasinglulu { 2129*91f16700Schasinglulu int fdt_err = 0; 2130*91f16700Schasinglulu uint32_t i = 0; 2131*91f16700Schasinglulu int node = 0; 2132*91f16700Schasinglulu 2133*91f16700Schasinglulu node = fdt_path_offset(fdt, "/clocks"); 2134*91f16700Schasinglulu if (node < 0) { 2135*91f16700Schasinglulu return -FDT_ERR_NOTFOUND; 2136*91f16700Schasinglulu } 2137*91f16700Schasinglulu 2138*91f16700Schasinglulu for (i = 0; i < pdata->nosci; i++) { 2139*91f16700Schasinglulu const char *name = NULL; 2140*91f16700Schasinglulu 2141*91f16700Schasinglulu name = clk_stm32_get_oscillator_name((enum stm32_osc)i); 2142*91f16700Schasinglulu if (name == NULL) { 2143*91f16700Schasinglulu continue; 2144*91f16700Schasinglulu } 2145*91f16700Schasinglulu 2146*91f16700Schasinglulu fdt_err = clk_stm32_parse_oscillator_fdt(fdt, node, name, &pdata->osci[i]); 2147*91f16700Schasinglulu if (fdt_err < 0) { 2148*91f16700Schasinglulu panic(); 2149*91f16700Schasinglulu } 2150*91f16700Schasinglulu } 2151*91f16700Schasinglulu 2152*91f16700Schasinglulu return 0; 2153*91f16700Schasinglulu } 2154*91f16700Schasinglulu 2155*91f16700Schasinglulu #define RCC_PLL_NAME_SIZE 12 2156*91f16700Schasinglulu 2157*91f16700Schasinglulu static int clk_stm32_load_vco_config(void *fdt, int subnode, struct stm32_pll_vco *vco) 2158*91f16700Schasinglulu { 2159*91f16700Schasinglulu int err = 0; 2160*91f16700Schasinglulu 2161*91f16700Schasinglulu err = fdt_read_uint32_array(fdt, subnode, "divmn", (int)PLL_DIV_MN_NB, vco->div_mn); 2162*91f16700Schasinglulu if (err != 0) { 2163*91f16700Schasinglulu return err; 2164*91f16700Schasinglulu } 2165*91f16700Schasinglulu 2166*91f16700Schasinglulu err = fdt_read_uint32_array(fdt, subnode, "csg", (int)PLL_CSG_NB, vco->csg); 2167*91f16700Schasinglulu 2168*91f16700Schasinglulu vco->csg_enabled = (err == 0); 2169*91f16700Schasinglulu 2170*91f16700Schasinglulu if (err == -FDT_ERR_NOTFOUND) { 2171*91f16700Schasinglulu err = 0; 2172*91f16700Schasinglulu } 2173*91f16700Schasinglulu 2174*91f16700Schasinglulu if (err != 0) { 2175*91f16700Schasinglulu return err; 2176*91f16700Schasinglulu } 2177*91f16700Schasinglulu 2178*91f16700Schasinglulu vco->status = RCC_PLLNCR_DIVPEN | RCC_PLLNCR_DIVQEN | RCC_PLLNCR_DIVREN | RCC_PLLNCR_PLLON; 2179*91f16700Schasinglulu 2180*91f16700Schasinglulu vco->frac = fdt_read_uint32_default(fdt, subnode, "frac", 0); 2181*91f16700Schasinglulu 2182*91f16700Schasinglulu vco->src = fdt_read_uint32_default(fdt, subnode, "src", UINT32_MAX); 2183*91f16700Schasinglulu 2184*91f16700Schasinglulu return 0; 2185*91f16700Schasinglulu } 2186*91f16700Schasinglulu 2187*91f16700Schasinglulu static int clk_stm32_load_output_config(void *fdt, int subnode, struct stm32_pll_output *output) 2188*91f16700Schasinglulu { 2189*91f16700Schasinglulu int err = 0; 2190*91f16700Schasinglulu 2191*91f16700Schasinglulu err = fdt_read_uint32_array(fdt, subnode, "st,pll_div_pqr", (int)PLL_DIV_PQR_NB, 2192*91f16700Schasinglulu output->output); 2193*91f16700Schasinglulu if (err != 0) { 2194*91f16700Schasinglulu return err; 2195*91f16700Schasinglulu } 2196*91f16700Schasinglulu 2197*91f16700Schasinglulu return 0; 2198*91f16700Schasinglulu } 2199*91f16700Schasinglulu 2200*91f16700Schasinglulu static int clk_stm32_parse_pll_fdt(void *fdt, int subnode, struct stm32_pll_dt_cfg *pll) 2201*91f16700Schasinglulu { 2202*91f16700Schasinglulu const fdt32_t *cuint = NULL; 2203*91f16700Schasinglulu int subnode_pll = 0; 2204*91f16700Schasinglulu int subnode_vco = 0; 2205*91f16700Schasinglulu int err = 0; 2206*91f16700Schasinglulu 2207*91f16700Schasinglulu cuint = fdt_getprop(fdt, subnode, "st,pll", NULL); 2208*91f16700Schasinglulu if (!cuint) { 2209*91f16700Schasinglulu return -FDT_ERR_NOTFOUND; 2210*91f16700Schasinglulu } 2211*91f16700Schasinglulu 2212*91f16700Schasinglulu subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint)); 2213*91f16700Schasinglulu if (subnode_pll < 0) { 2214*91f16700Schasinglulu return -FDT_ERR_NOTFOUND; 2215*91f16700Schasinglulu } 2216*91f16700Schasinglulu 2217*91f16700Schasinglulu cuint = fdt_getprop(fdt, subnode_pll, "st,pll_vco", NULL); 2218*91f16700Schasinglulu if (!cuint) { 2219*91f16700Schasinglulu return -FDT_ERR_NOTFOUND; 2220*91f16700Schasinglulu } 2221*91f16700Schasinglulu 2222*91f16700Schasinglulu subnode_vco = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint)); 2223*91f16700Schasinglulu if (subnode_vco < 0) { 2224*91f16700Schasinglulu return -FDT_ERR_NOTFOUND; 2225*91f16700Schasinglulu } 2226*91f16700Schasinglulu 2227*91f16700Schasinglulu err = clk_stm32_load_vco_config(fdt, subnode_vco, &pll->vco); 2228*91f16700Schasinglulu if (err != 0) { 2229*91f16700Schasinglulu return err; 2230*91f16700Schasinglulu } 2231*91f16700Schasinglulu 2232*91f16700Schasinglulu err = clk_stm32_load_output_config(fdt, subnode_pll, &pll->output); 2233*91f16700Schasinglulu if (err != 0) { 2234*91f16700Schasinglulu return err; 2235*91f16700Schasinglulu } 2236*91f16700Schasinglulu 2237*91f16700Schasinglulu return 0; 2238*91f16700Schasinglulu } 2239*91f16700Schasinglulu 2240*91f16700Schasinglulu static int stm32_clk_parse_fdt_all_pll(void *fdt, int node, struct stm32_clk_platdata *pdata) 2241*91f16700Schasinglulu { 2242*91f16700Schasinglulu size_t i = 0U; 2243*91f16700Schasinglulu 2244*91f16700Schasinglulu for (i = _PLL1; i < pdata->npll; i++) { 2245*91f16700Schasinglulu struct stm32_pll_dt_cfg *pll = &pdata->pll[i]; 2246*91f16700Schasinglulu char name[RCC_PLL_NAME_SIZE]; 2247*91f16700Schasinglulu int subnode = 0; 2248*91f16700Schasinglulu int err = 0; 2249*91f16700Schasinglulu 2250*91f16700Schasinglulu snprintf(name, sizeof(name), "st,pll@%u", i); 2251*91f16700Schasinglulu 2252*91f16700Schasinglulu subnode = fdt_subnode_offset(fdt, node, name); 2253*91f16700Schasinglulu if (!fdt_check_node(subnode)) { 2254*91f16700Schasinglulu continue; 2255*91f16700Schasinglulu } 2256*91f16700Schasinglulu 2257*91f16700Schasinglulu err = clk_stm32_parse_pll_fdt(fdt, subnode, pll); 2258*91f16700Schasinglulu if (err != 0) { 2259*91f16700Schasinglulu panic(); 2260*91f16700Schasinglulu } 2261*91f16700Schasinglulu } 2262*91f16700Schasinglulu 2263*91f16700Schasinglulu return 0; 2264*91f16700Schasinglulu } 2265*91f16700Schasinglulu 2266*91f16700Schasinglulu static int stm32_clk_parse_fdt(struct stm32_clk_platdata *pdata) 2267*91f16700Schasinglulu { 2268*91f16700Schasinglulu void *fdt = NULL; 2269*91f16700Schasinglulu int node; 2270*91f16700Schasinglulu uint32_t err; 2271*91f16700Schasinglulu 2272*91f16700Schasinglulu if (fdt_get_address(&fdt) == 0) { 2273*91f16700Schasinglulu return -ENOENT; 2274*91f16700Schasinglulu } 2275*91f16700Schasinglulu 2276*91f16700Schasinglulu node = fdt_node_offset_by_compatible(fdt, -1, DT_RCC_CLK_COMPAT); 2277*91f16700Schasinglulu if (node < 0) { 2278*91f16700Schasinglulu panic(); 2279*91f16700Schasinglulu } 2280*91f16700Schasinglulu 2281*91f16700Schasinglulu err = stm32_clk_parse_fdt_all_oscillator(fdt, pdata); 2282*91f16700Schasinglulu if (err != 0) { 2283*91f16700Schasinglulu return err; 2284*91f16700Schasinglulu } 2285*91f16700Schasinglulu 2286*91f16700Schasinglulu err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata); 2287*91f16700Schasinglulu if (err != 0) { 2288*91f16700Schasinglulu return err; 2289*91f16700Schasinglulu } 2290*91f16700Schasinglulu 2291*91f16700Schasinglulu err = stm32_clk_parse_fdt_by_name(fdt, node, "st,clkdiv", pdata->clkdiv, &pdata->nclkdiv); 2292*91f16700Schasinglulu if (err != 0) { 2293*91f16700Schasinglulu return err; 2294*91f16700Schasinglulu } 2295*91f16700Schasinglulu 2296*91f16700Schasinglulu err = stm32_clk_parse_fdt_by_name(fdt, node, "st,clksrc", pdata->clksrc, &pdata->nclksrc); 2297*91f16700Schasinglulu if (err != 0) { 2298*91f16700Schasinglulu return err; 2299*91f16700Schasinglulu } 2300*91f16700Schasinglulu 2301*91f16700Schasinglulu return 0; 2302*91f16700Schasinglulu } 2303*91f16700Schasinglulu 2304*91f16700Schasinglulu int stm32mp1_clk_init(void) 2305*91f16700Schasinglulu { 2306*91f16700Schasinglulu return 0; 2307*91f16700Schasinglulu } 2308*91f16700Schasinglulu 2309*91f16700Schasinglulu int stm32mp1_clk_probe(void) 2310*91f16700Schasinglulu { 2311*91f16700Schasinglulu uintptr_t base = RCC_BASE; 2312*91f16700Schasinglulu int ret; 2313*91f16700Schasinglulu 2314*91f16700Schasinglulu ret = stm32_clk_parse_fdt(&stm32mp13_clock_pdata); 2315*91f16700Schasinglulu if (ret != 0) { 2316*91f16700Schasinglulu return ret; 2317*91f16700Schasinglulu } 2318*91f16700Schasinglulu 2319*91f16700Schasinglulu ret = clk_stm32_init(&stm32mp13_clock_data, base); 2320*91f16700Schasinglulu if (ret != 0) { 2321*91f16700Schasinglulu return ret; 2322*91f16700Schasinglulu } 2323*91f16700Schasinglulu 2324*91f16700Schasinglulu ret = stm32mp1_init_clock_tree(); 2325*91f16700Schasinglulu if (ret != 0) { 2326*91f16700Schasinglulu return ret; 2327*91f16700Schasinglulu } 2328*91f16700Schasinglulu 2329*91f16700Schasinglulu clk_stm32_enable_critical_clocks(); 2330*91f16700Schasinglulu 2331*91f16700Schasinglulu return 0; 2332*91f16700Schasinglulu } 2333