128c10f9eSGabriel Fernandez // SPDX-License-Identifier: BSD-2-Clause 228c10f9eSGabriel Fernandez /* 328c10f9eSGabriel Fernandez * Copyright (C) 2024, STMicroelectronics 428c10f9eSGabriel Fernandez */ 528c10f9eSGabriel Fernandez 628c10f9eSGabriel Fernandez #include <assert.h> 728c10f9eSGabriel Fernandez #include <config.h> 828c10f9eSGabriel Fernandez #include <drivers/clk_dt.h> 928c10f9eSGabriel Fernandez #include <drivers/stm32_shared_io.h> 1028c10f9eSGabriel Fernandez #include <drivers/stm32mp25_rcc.h> 1128c10f9eSGabriel Fernandez #include <drivers/stm32mp_dt_bindings.h> 1228c10f9eSGabriel Fernandez #include <io.h> 1328c10f9eSGabriel Fernandez #include <kernel/dt.h> 1428c10f9eSGabriel Fernandez #include <kernel/panic.h> 1528c10f9eSGabriel Fernandez #include <libfdt.h> 1628c10f9eSGabriel Fernandez #include <stdbool.h> 1728c10f9eSGabriel Fernandez #include <stdio.h> 1828c10f9eSGabriel Fernandez #include <stm32_sysconf.h> 1928c10f9eSGabriel Fernandez #include <stm32_util.h> 2028c10f9eSGabriel Fernandez #include <trace.h> 2128c10f9eSGabriel Fernandez #include <util.h> 2228c10f9eSGabriel Fernandez 2328c10f9eSGabriel Fernandez #include "clk-stm32-core.h" 2428c10f9eSGabriel Fernandez 2528c10f9eSGabriel Fernandez #define MAX_OPP CFG_STM32MP_OPP_COUNT 2628c10f9eSGabriel Fernandez 2728c10f9eSGabriel Fernandez #define TIMEOUT_US_100MS U(100000) 2828c10f9eSGabriel Fernandez #define TIMEOUT_US_200MS U(200000) 2928c10f9eSGabriel Fernandez #define TIMEOUT_US_1S U(1000000) 3028c10f9eSGabriel Fernandez 3128c10f9eSGabriel Fernandez #define PLLRDY_TIMEOUT TIMEOUT_US_200MS 3228c10f9eSGabriel Fernandez #define CLKSRC_TIMEOUT TIMEOUT_US_200MS 3328c10f9eSGabriel Fernandez #define CLKDIV_TIMEOUT TIMEOUT_US_200MS 3428c10f9eSGabriel Fernandez #define OSCRDY_TIMEOUT TIMEOUT_US_1S 3528c10f9eSGabriel Fernandez 3628c10f9eSGabriel Fernandez /* PLL minimal frequencies for clock sources */ 3728c10f9eSGabriel Fernandez #define PLL_REFCLK_MIN UL(5000000) 3828c10f9eSGabriel Fernandez #define PLL_FRAC_REFCLK_MIN UL(10000000) 3928c10f9eSGabriel Fernandez 4028c10f9eSGabriel Fernandez /* Parameters from XBAR_CFG in st,cksrc field */ 4128c10f9eSGabriel Fernandez #define XBAR_CKSRC_CHANNEL GENMASK_32(5, 0) 4228c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC GENMASK_32(9, 6) 4328c10f9eSGabriel Fernandez #define XBAR_CKSRC_SRC_OFFSET U(6) 4428c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV GENMASK_32(19, 10) 4528c10f9eSGabriel Fernandez #define XBAR_CKSRC_PREDIV_OFFSET U(10) 4628c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV GENMASK_32(25, 20) 4728c10f9eSGabriel Fernandez #define XBAR_CKSRC_FINDIV_OFFSET U(20) 4828c10f9eSGabriel Fernandez 4928c10f9eSGabriel Fernandez #define XBAR_CHANNEL_NB U(64) 5028c10f9eSGabriel Fernandez #define XBAR_ROOT_CHANNEL_NB U(7) 5128c10f9eSGabriel Fernandez 5228c10f9eSGabriel Fernandez #define FLEX_STGEN U(33) 5328c10f9eSGabriel Fernandez 5428c10f9eSGabriel Fernandez #define RCC_0_MHZ UL(0) 5528c10f9eSGabriel Fernandez #define RCC_4_MHZ UL(4000000) 5628c10f9eSGabriel Fernandez #define RCC_16_MHZ UL(16000000) 5728c10f9eSGabriel Fernandez 5828c10f9eSGabriel Fernandez enum pll_cfg { 5928c10f9eSGabriel Fernandez FBDIV, 6028c10f9eSGabriel Fernandez REFDIV, 6128c10f9eSGabriel Fernandez POSTDIV1, 6228c10f9eSGabriel Fernandez POSTDIV2, 6328c10f9eSGabriel Fernandez PLLCFG_NB 6428c10f9eSGabriel Fernandez }; 6528c10f9eSGabriel Fernandez 6628c10f9eSGabriel Fernandez enum pll_csg { 6728c10f9eSGabriel Fernandez DIVVAL, 6828c10f9eSGabriel Fernandez SPREAD, 6928c10f9eSGabriel Fernandez DOWNSPREAD, 7028c10f9eSGabriel Fernandez PLLCSG_NB 7128c10f9eSGabriel Fernandez }; 7228c10f9eSGabriel Fernandez 7328c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg { 7428c10f9eSGabriel Fernandez bool enabled; 7528c10f9eSGabriel Fernandez uint32_t cfg[PLLCFG_NB]; 7628c10f9eSGabriel Fernandez uint32_t csg[PLLCSG_NB]; 7728c10f9eSGabriel Fernandez uint32_t frac; 7828c10f9eSGabriel Fernandez bool csg_enabled; 7928c10f9eSGabriel Fernandez uint32_t src; 8028c10f9eSGabriel Fernandez }; 8128c10f9eSGabriel Fernandez 8228c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg { 8328c10f9eSGabriel Fernandez unsigned long freq; 8428c10f9eSGabriel Fernandez bool bypass; 8528c10f9eSGabriel Fernandez bool digbyp; 8628c10f9eSGabriel Fernandez bool css; 8728c10f9eSGabriel Fernandez uint32_t drive; 8828c10f9eSGabriel Fernandez }; 8928c10f9eSGabriel Fernandez 9028c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg { 9128c10f9eSGabriel Fernandez uint32_t frq; 9228c10f9eSGabriel Fernandez uint32_t src; 9328c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg pll_cfg; 9428c10f9eSGabriel Fernandez }; 9528c10f9eSGabriel Fernandez 9628c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg { 9728c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg cpu1_opp[MAX_OPP]; 9828c10f9eSGabriel Fernandez }; 9928c10f9eSGabriel Fernandez 10028c10f9eSGabriel Fernandez struct stm32_clk_platdata { 10128c10f9eSGabriel Fernandez uintptr_t rcc_base; 10228c10f9eSGabriel Fernandez uint32_t nosci; 10328c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci; 10428c10f9eSGabriel Fernandez uint32_t npll; 10528c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll; 10628c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp; 10728c10f9eSGabriel Fernandez uint32_t nbusclk; 10828c10f9eSGabriel Fernandez uint32_t *busclk; 10928c10f9eSGabriel Fernandez uint32_t nkernelclk; 11028c10f9eSGabriel Fernandez uint32_t *kernelclk; 11128c10f9eSGabriel Fernandez uint32_t nflexgen; 11228c10f9eSGabriel Fernandez uint32_t *flexgen; 11328c10f9eSGabriel Fernandez uint32_t c1msrd; 11428c10f9eSGabriel Fernandez bool safe_rst; 11528c10f9eSGabriel Fernandez }; 11628c10f9eSGabriel Fernandez 11728c10f9eSGabriel Fernandez /* 11828c10f9eSGabriel Fernandez * GATE CONFIG 11928c10f9eSGabriel Fernandez */ 12028c10f9eSGabriel Fernandez 12128c10f9eSGabriel Fernandez /* WARNING GATE_XXX_RDY MUST FOLLOW GATE_XXX */ 12228c10f9eSGabriel Fernandez 12328c10f9eSGabriel Fernandez enum enum_gate_cfg { 12428c10f9eSGabriel Fernandez GATE_HSI, 12528c10f9eSGabriel Fernandez GATE_HSI_RDY, 12628c10f9eSGabriel Fernandez GATE_HSE, 12728c10f9eSGabriel Fernandez GATE_HSE_RDY, 12828c10f9eSGabriel Fernandez GATE_LSE, 12928c10f9eSGabriel Fernandez GATE_LSE_RDY, 13028c10f9eSGabriel Fernandez GATE_LSI, 13128c10f9eSGabriel Fernandez GATE_LSI_RDY, 13228c10f9eSGabriel Fernandez GATE_MSI, 13328c10f9eSGabriel Fernandez GATE_MSI_RDY, 13428c10f9eSGabriel Fernandez GATE_PLL1, 13528c10f9eSGabriel Fernandez GATE_PLL1_RDY, 13628c10f9eSGabriel Fernandez GATE_PLL2, 13728c10f9eSGabriel Fernandez GATE_PLL2_RDY, 13828c10f9eSGabriel Fernandez GATE_PLL3, 13928c10f9eSGabriel Fernandez GATE_PLL3_RDY, 14028c10f9eSGabriel Fernandez GATE_PLL4, 14128c10f9eSGabriel Fernandez GATE_PLL4_RDY, 14228c10f9eSGabriel Fernandez GATE_PLL5, 14328c10f9eSGabriel Fernandez GATE_PLL5_RDY, 14428c10f9eSGabriel Fernandez GATE_PLL6, 14528c10f9eSGabriel Fernandez GATE_PLL6_RDY, 14628c10f9eSGabriel Fernandez GATE_PLL7, 14728c10f9eSGabriel Fernandez GATE_PLL7_RDY, 14828c10f9eSGabriel Fernandez GATE_PLL8, 14928c10f9eSGabriel Fernandez GATE_PLL8_RDY, 15028c10f9eSGabriel Fernandez GATE_PLL4_CKREFST, 15128c10f9eSGabriel Fernandez GATE_PLL5_CKREFST, 15228c10f9eSGabriel Fernandez GATE_PLL6_CKREFST, 15328c10f9eSGabriel Fernandez GATE_PLL7_CKREFST, 15428c10f9eSGabriel Fernandez GATE_PLL8_CKREFST, 15528c10f9eSGabriel Fernandez GATE_HSEDIV2, 15628c10f9eSGabriel Fernandez GATE_APB1DIV_RDY, 15728c10f9eSGabriel Fernandez GATE_APB2DIV_RDY, 15828c10f9eSGabriel Fernandez GATE_APB3DIV_RDY, 15928c10f9eSGabriel Fernandez GATE_APB4DIV_RDY, 16028c10f9eSGabriel Fernandez GATE_APBDBGDIV_RDY, 16128c10f9eSGabriel Fernandez GATE_TIMG1PRE_RDY, 16228c10f9eSGabriel Fernandez GATE_TIMG2PRE_RDY, 16328c10f9eSGabriel Fernandez GATE_LSMCUDIV_RDY, 16428c10f9eSGabriel Fernandez GATE_RTCCK, 16528c10f9eSGabriel Fernandez GATE_C3, 16628c10f9eSGabriel Fernandez GATE_LPTIM3C3, 16728c10f9eSGabriel Fernandez GATE_LPTIM4C3, 16828c10f9eSGabriel Fernandez GATE_LPTIM5C3, 16928c10f9eSGabriel Fernandez GATE_SPI8C3, 17028c10f9eSGabriel Fernandez GATE_LPUART1C3, 17128c10f9eSGabriel Fernandez GATE_I2C8C3, 17228c10f9eSGabriel Fernandez GATE_ADF1C3, 17328c10f9eSGabriel Fernandez GATE_GPIOZC3, 17428c10f9eSGabriel Fernandez GATE_LPDMAC3, 17528c10f9eSGabriel Fernandez GATE_RTCC3, 17628c10f9eSGabriel Fernandez GATE_I3C4C3, 17728c10f9eSGabriel Fernandez GATE_MCO1, 17828c10f9eSGabriel Fernandez GATE_MCO2, 17928c10f9eSGabriel Fernandez GATE_DDRCP, 18028c10f9eSGabriel Fernandez GATE_DDRCAPB, 18128c10f9eSGabriel Fernandez GATE_DDRPHYCAPB, 18228c10f9eSGabriel Fernandez GATE_DDRPHYC, 18328c10f9eSGabriel Fernandez GATE_DDRCFG, 18428c10f9eSGabriel Fernandez GATE_SYSRAM, 18528c10f9eSGabriel Fernandez GATE_VDERAM, 18628c10f9eSGabriel Fernandez GATE_SRAM1, 18728c10f9eSGabriel Fernandez GATE_SRAM2, 18828c10f9eSGabriel Fernandez GATE_RETRAM, 18928c10f9eSGabriel Fernandez GATE_BKPSRAM, 19028c10f9eSGabriel Fernandez GATE_LPSRAM1, 19128c10f9eSGabriel Fernandez GATE_LPSRAM2, 19228c10f9eSGabriel Fernandez GATE_LPSRAM3, 19328c10f9eSGabriel Fernandez GATE_OSPI1, 19428c10f9eSGabriel Fernandez GATE_OSPI2, 19528c10f9eSGabriel Fernandez GATE_FMC, 19628c10f9eSGabriel Fernandez GATE_DBG, 19728c10f9eSGabriel Fernandez GATE_TRACE, 19828c10f9eSGabriel Fernandez GATE_STM, 19928c10f9eSGabriel Fernandez GATE_ETR, 20028c10f9eSGabriel Fernandez GATE_GPIOA, 20128c10f9eSGabriel Fernandez GATE_GPIOB, 20228c10f9eSGabriel Fernandez GATE_GPIOC, 20328c10f9eSGabriel Fernandez GATE_GPIOD, 20428c10f9eSGabriel Fernandez GATE_GPIOE, 20528c10f9eSGabriel Fernandez GATE_GPIOF, 20628c10f9eSGabriel Fernandez GATE_GPIOG, 20728c10f9eSGabriel Fernandez GATE_GPIOH, 20828c10f9eSGabriel Fernandez GATE_GPIOI, 20928c10f9eSGabriel Fernandez GATE_GPIOJ, 21028c10f9eSGabriel Fernandez GATE_GPIOK, 21128c10f9eSGabriel Fernandez GATE_GPIOZ, 21228c10f9eSGabriel Fernandez GATE_HPDMA1, 21328c10f9eSGabriel Fernandez GATE_HPDMA2, 21428c10f9eSGabriel Fernandez GATE_HPDMA3, 21528c10f9eSGabriel Fernandez GATE_LPDMA, 21628c10f9eSGabriel Fernandez GATE_HSEM, 21728c10f9eSGabriel Fernandez GATE_IPCC1, 21828c10f9eSGabriel Fernandez GATE_IPCC2, 21928c10f9eSGabriel Fernandez GATE_RTC, 22028c10f9eSGabriel Fernandez GATE_SYSCPU1, 22128c10f9eSGabriel Fernandez GATE_BSEC, 22228c10f9eSGabriel Fernandez GATE_IS2M, 22328c10f9eSGabriel Fernandez GATE_HSIMON, 22428c10f9eSGabriel Fernandez GATE_TIM1, 22528c10f9eSGabriel Fernandez GATE_TIM2, 22628c10f9eSGabriel Fernandez GATE_TIM3, 22728c10f9eSGabriel Fernandez GATE_TIM4, 22828c10f9eSGabriel Fernandez GATE_TIM5, 22928c10f9eSGabriel Fernandez GATE_TIM6, 23028c10f9eSGabriel Fernandez GATE_TIM7, 23128c10f9eSGabriel Fernandez GATE_TIM8, 23228c10f9eSGabriel Fernandez GATE_TIM10, 23328c10f9eSGabriel Fernandez GATE_TIM11, 23428c10f9eSGabriel Fernandez GATE_TIM12, 23528c10f9eSGabriel Fernandez GATE_TIM13, 23628c10f9eSGabriel Fernandez GATE_TIM14, 23728c10f9eSGabriel Fernandez GATE_TIM15, 23828c10f9eSGabriel Fernandez GATE_TIM16, 23928c10f9eSGabriel Fernandez GATE_TIM17, 24028c10f9eSGabriel Fernandez GATE_TIM20, 24128c10f9eSGabriel Fernandez GATE_LPTIM1, 24228c10f9eSGabriel Fernandez GATE_LPTIM2, 24328c10f9eSGabriel Fernandez GATE_LPTIM3, 24428c10f9eSGabriel Fernandez GATE_LPTIM4, 24528c10f9eSGabriel Fernandez GATE_LPTIM5, 24628c10f9eSGabriel Fernandez GATE_SPI1, 24728c10f9eSGabriel Fernandez GATE_SPI2, 24828c10f9eSGabriel Fernandez GATE_SPI3, 24928c10f9eSGabriel Fernandez GATE_SPI4, 25028c10f9eSGabriel Fernandez GATE_SPI5, 25128c10f9eSGabriel Fernandez GATE_SPI6, 25228c10f9eSGabriel Fernandez GATE_SPI7, 25328c10f9eSGabriel Fernandez GATE_SPI8, 25428c10f9eSGabriel Fernandez GATE_SPDIFRX, 25528c10f9eSGabriel Fernandez GATE_USART1, 25628c10f9eSGabriel Fernandez GATE_USART2, 25728c10f9eSGabriel Fernandez GATE_USART3, 25828c10f9eSGabriel Fernandez GATE_UART4, 25928c10f9eSGabriel Fernandez GATE_UART5, 26028c10f9eSGabriel Fernandez GATE_USART6, 26128c10f9eSGabriel Fernandez GATE_UART7, 26228c10f9eSGabriel Fernandez GATE_UART8, 26328c10f9eSGabriel Fernandez GATE_UART9, 26428c10f9eSGabriel Fernandez GATE_LPUART1, 26528c10f9eSGabriel Fernandez GATE_I2C1, 26628c10f9eSGabriel Fernandez GATE_I2C2, 26728c10f9eSGabriel Fernandez GATE_I2C3, 26828c10f9eSGabriel Fernandez GATE_I2C4, 26928c10f9eSGabriel Fernandez GATE_I2C5, 27028c10f9eSGabriel Fernandez GATE_I2C6, 27128c10f9eSGabriel Fernandez GATE_I2C7, 27228c10f9eSGabriel Fernandez GATE_I2C8, 27328c10f9eSGabriel Fernandez GATE_SAI1, 27428c10f9eSGabriel Fernandez GATE_SAI2, 27528c10f9eSGabriel Fernandez GATE_SAI3, 27628c10f9eSGabriel Fernandez GATE_SAI4, 27728c10f9eSGabriel Fernandez GATE_MDF1, 27828c10f9eSGabriel Fernandez GATE_ADF1, 27928c10f9eSGabriel Fernandez GATE_FDCAN, 28028c10f9eSGabriel Fernandez GATE_HDP, 28128c10f9eSGabriel Fernandez GATE_ADC12, 28228c10f9eSGabriel Fernandez GATE_ADC3, 28328c10f9eSGabriel Fernandez GATE_ETH1MAC, 28428c10f9eSGabriel Fernandez GATE_ETH1, 28528c10f9eSGabriel Fernandez GATE_ETH1TX, 28628c10f9eSGabriel Fernandez GATE_ETH1RX, 28728c10f9eSGabriel Fernandez GATE_ETH1STP, 28828c10f9eSGabriel Fernandez GATE_ETH2MAC, 28928c10f9eSGabriel Fernandez GATE_ETH2, 29028c10f9eSGabriel Fernandez GATE_ETH2STP, 29128c10f9eSGabriel Fernandez GATE_ETH2TX, 29228c10f9eSGabriel Fernandez GATE_ETH2RX, 29328c10f9eSGabriel Fernandez GATE_USB2, 29428c10f9eSGabriel Fernandez GATE_USB2PHY1, 29528c10f9eSGabriel Fernandez GATE_USB2PHY2, 29628c10f9eSGabriel Fernandez GATE_USB3DR, 29728c10f9eSGabriel Fernandez GATE_USB3PCIEPHY, 29828c10f9eSGabriel Fernandez GATE_PCIE, 29928c10f9eSGabriel Fernandez GATE_USBTC, 30028c10f9eSGabriel Fernandez GATE_ETHSWMAC, 30128c10f9eSGabriel Fernandez GATE_ETHSW, 30228c10f9eSGabriel Fernandez GATE_ETHSWREF, 30328c10f9eSGabriel Fernandez GATE_STGEN, 30428c10f9eSGabriel Fernandez GATE_SDMMC1, 30528c10f9eSGabriel Fernandez GATE_SDMMC2, 30628c10f9eSGabriel Fernandez GATE_SDMMC3, 30728c10f9eSGabriel Fernandez GATE_GPU, 30828c10f9eSGabriel Fernandez GATE_LTDC, 30928c10f9eSGabriel Fernandez GATE_DSI, 31028c10f9eSGabriel Fernandez GATE_LVDS, 31128c10f9eSGabriel Fernandez GATE_CSI, 31228c10f9eSGabriel Fernandez GATE_DCMIPP, 31328c10f9eSGabriel Fernandez GATE_CCI, 31428c10f9eSGabriel Fernandez GATE_VDEC, 31528c10f9eSGabriel Fernandez GATE_VENC, 31628c10f9eSGabriel Fernandez GATE_RNG, 31728c10f9eSGabriel Fernandez GATE_PKA, 31828c10f9eSGabriel Fernandez GATE_SAES, 31928c10f9eSGabriel Fernandez GATE_HASH, 32028c10f9eSGabriel Fernandez GATE_CRYP1, 32128c10f9eSGabriel Fernandez GATE_CRYP2, 32228c10f9eSGabriel Fernandez GATE_IWDG1, 32328c10f9eSGabriel Fernandez GATE_IWDG2, 32428c10f9eSGabriel Fernandez GATE_IWDG3, 32528c10f9eSGabriel Fernandez GATE_IWDG4, 32628c10f9eSGabriel Fernandez GATE_IWDG5, 32728c10f9eSGabriel Fernandez GATE_WWDG1, 32828c10f9eSGabriel Fernandez GATE_WWDG2, 32928c10f9eSGabriel Fernandez GATE_VREF, 33028c10f9eSGabriel Fernandez GATE_DTS, 33128c10f9eSGabriel Fernandez GATE_CRC, 33228c10f9eSGabriel Fernandez GATE_SERC, 33328c10f9eSGabriel Fernandez GATE_OSPIIOM, 33428c10f9eSGabriel Fernandez GATE_GICV2M, 33528c10f9eSGabriel Fernandez GATE_I3C1, 33628c10f9eSGabriel Fernandez GATE_I3C2, 33728c10f9eSGabriel Fernandez GATE_I3C3, 33828c10f9eSGabriel Fernandez GATE_I3C4, 33928c10f9eSGabriel Fernandez GATE_NB 34028c10f9eSGabriel Fernandez }; 34128c10f9eSGabriel Fernandez 34228c10f9eSGabriel Fernandez #define GATE_CFG(_id, _offset, _bit_idx, _offset_clr)\ 34328c10f9eSGabriel Fernandez [(_id)] = {\ 34428c10f9eSGabriel Fernandez .offset = (_offset),\ 34528c10f9eSGabriel Fernandez .bit_idx = (_bit_idx),\ 34628c10f9eSGabriel Fernandez .set_clr = (_offset_clr),\ 34728c10f9eSGabriel Fernandez } 34828c10f9eSGabriel Fernandez 34928c10f9eSGabriel Fernandez static const struct gate_cfg gates_mp25[GATE_NB] = { 35028c10f9eSGabriel Fernandez GATE_CFG(GATE_LSE, RCC_BDCR, 0, 0), 35128c10f9eSGabriel Fernandez GATE_CFG(GATE_LSE_RDY, RCC_BDCR, 2, 0), 35228c10f9eSGabriel Fernandez GATE_CFG(GATE_LSI, RCC_BDCR, 9, 0), 35328c10f9eSGabriel Fernandez GATE_CFG(GATE_LSI_RDY, RCC_BDCR, 10, 0), 35428c10f9eSGabriel Fernandez GATE_CFG(GATE_RTCCK, RCC_BDCR, 20, 0), 35528c10f9eSGabriel Fernandez GATE_CFG(GATE_MSI, RCC_D3DCR, 0, 0), 35628c10f9eSGabriel Fernandez GATE_CFG(GATE_MSI_RDY, RCC_D3DCR, 2, 0), 35728c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL1, RCC_PLL2CFGR1, 8, 0), 35828c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL1_RDY, RCC_PLL2CFGR1, 24, 0), 35928c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL2, RCC_PLL2CFGR1, 8, 0), 36028c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL2_RDY, RCC_PLL2CFGR1, 24, 0), 36128c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL3, RCC_PLL3CFGR1, 8, 0), 36228c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL3_RDY, RCC_PLL3CFGR1, 24, 0), 36328c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4, RCC_PLL4CFGR1, 8, 0), 36428c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4_RDY, RCC_PLL4CFGR1, 24, 0), 36528c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5, RCC_PLL5CFGR1, 8, 0), 36628c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5_RDY, RCC_PLL5CFGR1, 24, 0), 36728c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6, RCC_PLL6CFGR1, 8, 0), 36828c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6_RDY, RCC_PLL6CFGR1, 24, 0), 36928c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7, RCC_PLL7CFGR1, 8, 0), 37028c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7_RDY, RCC_PLL7CFGR1, 24, 0), 37128c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8, RCC_PLL8CFGR1, 8, 0), 37228c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8_RDY, RCC_PLL8CFGR1, 24, 0), 37328c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL4_CKREFST, RCC_PLL4CFGR1, 28, 0), 37428c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL5_CKREFST, RCC_PLL5CFGR1, 28, 0), 37528c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL6_CKREFST, RCC_PLL6CFGR1, 28, 0), 37628c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL7_CKREFST, RCC_PLL7CFGR1, 28, 0), 37728c10f9eSGabriel Fernandez GATE_CFG(GATE_PLL8_CKREFST, RCC_PLL8CFGR1, 28, 0), 37828c10f9eSGabriel Fernandez GATE_CFG(GATE_C3, RCC_C3CFGR, 1, 0), 37928c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM3C3, RCC_C3CFGR, 16, 0), 38028c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM4C3, RCC_C3CFGR, 17, 0), 38128c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM5C3, RCC_C3CFGR, 18, 0), 38228c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI8C3, RCC_C3CFGR, 19, 0), 38328c10f9eSGabriel Fernandez GATE_CFG(GATE_LPUART1C3, RCC_C3CFGR, 20, 0), 38428c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C8C3, RCC_C3CFGR, 21, 0), 38528c10f9eSGabriel Fernandez GATE_CFG(GATE_ADF1C3, RCC_C3CFGR, 23, 0), 38628c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOZC3, RCC_C3CFGR, 24, 0), 38728c10f9eSGabriel Fernandez GATE_CFG(GATE_LPDMAC3, RCC_C3CFGR, 25, 0), 38828c10f9eSGabriel Fernandez GATE_CFG(GATE_RTCC3, RCC_C3CFGR, 26, 0), 38928c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C4C3, RCC_C3CFGR, 27, 0), 39028c10f9eSGabriel Fernandez GATE_CFG(GATE_MCO1, RCC_MCO1CFGR, 8, 0), 39128c10f9eSGabriel Fernandez GATE_CFG(GATE_MCO2, RCC_MCO2CFGR, 8, 0), 39228c10f9eSGabriel Fernandez GATE_CFG(GATE_HSI, RCC_OCENSETR, 0, 1), 39328c10f9eSGabriel Fernandez GATE_CFG(GATE_HSEDIV2, RCC_OCENSETR, 5, 1), 39428c10f9eSGabriel Fernandez GATE_CFG(GATE_HSE, RCC_OCENSETR, 8, 1), 39528c10f9eSGabriel Fernandez GATE_CFG(GATE_HSI_RDY, RCC_OCRDYR, 0, 0), 39628c10f9eSGabriel Fernandez GATE_CFG(GATE_HSE_RDY, RCC_OCRDYR, 8, 0), 39728c10f9eSGabriel Fernandez GATE_CFG(GATE_APB1DIV_RDY, RCC_APB1DIVR, 31, 0), 39828c10f9eSGabriel Fernandez GATE_CFG(GATE_APB2DIV_RDY, RCC_APB2DIVR, 31, 0), 39928c10f9eSGabriel Fernandez GATE_CFG(GATE_APB3DIV_RDY, RCC_APB3DIVR, 31, 0), 40028c10f9eSGabriel Fernandez GATE_CFG(GATE_APB4DIV_RDY, RCC_APB4DIVR, 31, 0), 40128c10f9eSGabriel Fernandez GATE_CFG(GATE_APBDBGDIV_RDY, RCC_APBDBGDIVR, 31, 0), 40228c10f9eSGabriel Fernandez GATE_CFG(GATE_TIMG1PRE_RDY, RCC_TIMG1PRER, 31, 0), 40328c10f9eSGabriel Fernandez GATE_CFG(GATE_TIMG2PRE_RDY, RCC_TIMG2PRER, 31, 0), 40428c10f9eSGabriel Fernandez GATE_CFG(GATE_LSMCUDIV_RDY, RCC_LSMCUDIVR, 31, 0), 40528c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCP, RCC_DDRCPCFGR, 1, 0), 40628c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCAPB, RCC_DDRCAPBCFGR, 1, 0), 40728c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRPHYCAPB, RCC_DDRPHYCAPBCFGR, 1, 0), 40828c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRPHYC, RCC_DDRPHYCCFGR, 1, 0), 40928c10f9eSGabriel Fernandez GATE_CFG(GATE_DDRCFG, RCC_DDRCFGR, 1, 0), 41028c10f9eSGabriel Fernandez GATE_CFG(GATE_SYSRAM, RCC_SYSRAMCFGR, 1, 0), 41128c10f9eSGabriel Fernandez GATE_CFG(GATE_VDERAM, RCC_VDERAMCFGR, 1, 0), 41228c10f9eSGabriel Fernandez GATE_CFG(GATE_SRAM1, RCC_SRAM1CFGR, 1, 0), 41328c10f9eSGabriel Fernandez GATE_CFG(GATE_SRAM2, RCC_SRAM2CFGR, 1, 0), 41428c10f9eSGabriel Fernandez GATE_CFG(GATE_RETRAM, RCC_RETRAMCFGR, 1, 0), 41528c10f9eSGabriel Fernandez GATE_CFG(GATE_BKPSRAM, RCC_BKPSRAMCFGR, 1, 0), 41628c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM1, RCC_LPSRAM1CFGR, 1, 0), 41728c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM2, RCC_LPSRAM2CFGR, 1, 0), 41828c10f9eSGabriel Fernandez GATE_CFG(GATE_LPSRAM3, RCC_LPSRAM3CFGR, 1, 0), 41928c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPI1, RCC_OSPI1CFGR, 1, 0), 42028c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPI2, RCC_OSPI2CFGR, 1, 0), 42128c10f9eSGabriel Fernandez GATE_CFG(GATE_FMC, RCC_FMCCFGR, 1, 0), 42228c10f9eSGabriel Fernandez GATE_CFG(GATE_DBG, RCC_DBGCFGR, 8, 0), 42328c10f9eSGabriel Fernandez GATE_CFG(GATE_TRACE, RCC_DBGCFGR, 9, 0), 42428c10f9eSGabriel Fernandez GATE_CFG(GATE_STM, RCC_STMCFGR, 1, 0), 42528c10f9eSGabriel Fernandez GATE_CFG(GATE_ETR, RCC_ETRCFGR, 1, 0), 42628c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOA, RCC_GPIOACFGR, 1, 0), 42728c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOB, RCC_GPIOBCFGR, 1, 0), 42828c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOC, RCC_GPIOCCFGR, 1, 0), 42928c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOD, RCC_GPIODCFGR, 1, 0), 43028c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOE, RCC_GPIOECFGR, 1, 0), 43128c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOF, RCC_GPIOFCFGR, 1, 0), 43228c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOG, RCC_GPIOGCFGR, 1, 0), 43328c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOH, RCC_GPIOHCFGR, 1, 0), 43428c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOI, RCC_GPIOICFGR, 1, 0), 43528c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOJ, RCC_GPIOJCFGR, 1, 0), 43628c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOK, RCC_GPIOKCFGR, 1, 0), 43728c10f9eSGabriel Fernandez GATE_CFG(GATE_GPIOZ, RCC_GPIOZCFGR, 1, 0), 43828c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA1, RCC_HPDMA1CFGR, 1, 0), 43928c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA2, RCC_HPDMA2CFGR, 1, 0), 44028c10f9eSGabriel Fernandez GATE_CFG(GATE_HPDMA3, RCC_HPDMA3CFGR, 1, 0), 44128c10f9eSGabriel Fernandez GATE_CFG(GATE_LPDMA, RCC_LPDMACFGR, 1, 0), 44228c10f9eSGabriel Fernandez GATE_CFG(GATE_HSEM, RCC_HSEMCFGR, 1, 0), 44328c10f9eSGabriel Fernandez GATE_CFG(GATE_IPCC1, RCC_IPCC1CFGR, 1, 0), 44428c10f9eSGabriel Fernandez GATE_CFG(GATE_IPCC2, RCC_IPCC2CFGR, 1, 0), 44528c10f9eSGabriel Fernandez GATE_CFG(GATE_RTC, RCC_RTCCFGR, 1, 0), 44628c10f9eSGabriel Fernandez GATE_CFG(GATE_SYSCPU1, RCC_SYSCPU1CFGR, 1, 0), 44728c10f9eSGabriel Fernandez GATE_CFG(GATE_BSEC, RCC_BSECCFGR, 1, 0), 44828c10f9eSGabriel Fernandez GATE_CFG(GATE_IS2M, RCC_IS2MCFGR, 1, 0), 44928c10f9eSGabriel Fernandez GATE_CFG(GATE_HSIMON, RCC_HSIFMONCR, 15, 0), 45028c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM1, RCC_TIM1CFGR, 1, 0), 45128c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM2, RCC_TIM2CFGR, 1, 0), 45228c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM3, RCC_TIM3CFGR, 1, 0), 45328c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM4, RCC_TIM4CFGR, 1, 0), 45428c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM5, RCC_TIM5CFGR, 1, 0), 45528c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM6, RCC_TIM6CFGR, 1, 0), 45628c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM7, RCC_TIM7CFGR, 1, 0), 45728c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM8, RCC_TIM8CFGR, 1, 0), 45828c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM10, RCC_TIM10CFGR, 1, 0), 45928c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM11, RCC_TIM11CFGR, 1, 0), 46028c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM12, RCC_TIM12CFGR, 1, 0), 46128c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM13, RCC_TIM13CFGR, 1, 0), 46228c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM14, RCC_TIM14CFGR, 1, 0), 46328c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM15, RCC_TIM15CFGR, 1, 0), 46428c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM16, RCC_TIM16CFGR, 1, 0), 46528c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM17, RCC_TIM17CFGR, 1, 0), 46628c10f9eSGabriel Fernandez GATE_CFG(GATE_TIM20, RCC_TIM20CFGR, 1, 0), 46728c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM1, RCC_LPTIM1CFGR, 1, 0), 46828c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM2, RCC_LPTIM2CFGR, 1, 0), 46928c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM3, RCC_LPTIM3CFGR, 1, 0), 47028c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM4, RCC_LPTIM4CFGR, 1, 0), 47128c10f9eSGabriel Fernandez GATE_CFG(GATE_LPTIM5, RCC_LPTIM5CFGR, 1, 0), 47228c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI1, RCC_SPI1CFGR, 1, 0), 47328c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI2, RCC_SPI2CFGR, 1, 0), 47428c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI3, RCC_SPI3CFGR, 1, 0), 47528c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI4, RCC_SPI4CFGR, 1, 0), 47628c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI5, RCC_SPI5CFGR, 1, 0), 47728c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI6, RCC_SPI6CFGR, 1, 0), 47828c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI7, RCC_SPI7CFGR, 1, 0), 47928c10f9eSGabriel Fernandez GATE_CFG(GATE_SPI8, RCC_SPI8CFGR, 1, 0), 48028c10f9eSGabriel Fernandez GATE_CFG(GATE_SPDIFRX, RCC_SPDIFRXCFGR, 1, 0), 48128c10f9eSGabriel Fernandez GATE_CFG(GATE_USART1, RCC_USART1CFGR, 1, 0), 48228c10f9eSGabriel Fernandez GATE_CFG(GATE_USART2, RCC_USART2CFGR, 1, 0), 48328c10f9eSGabriel Fernandez GATE_CFG(GATE_USART3, RCC_USART3CFGR, 1, 0), 48428c10f9eSGabriel Fernandez GATE_CFG(GATE_UART4, RCC_UART4CFGR, 1, 0), 48528c10f9eSGabriel Fernandez GATE_CFG(GATE_UART5, RCC_UART5CFGR, 1, 0), 48628c10f9eSGabriel Fernandez GATE_CFG(GATE_USART6, RCC_USART6CFGR, 1, 0), 48728c10f9eSGabriel Fernandez GATE_CFG(GATE_UART7, RCC_UART7CFGR, 1, 0), 48828c10f9eSGabriel Fernandez GATE_CFG(GATE_UART8, RCC_UART8CFGR, 1, 0), 48928c10f9eSGabriel Fernandez GATE_CFG(GATE_UART9, RCC_UART9CFGR, 1, 0), 49028c10f9eSGabriel Fernandez GATE_CFG(GATE_LPUART1, RCC_LPUART1CFGR, 1, 0), 49128c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C1, RCC_I2C1CFGR, 1, 0), 49228c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C2, RCC_I2C2CFGR, 1, 0), 49328c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C3, RCC_I2C3CFGR, 1, 0), 49428c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C4, RCC_I2C4CFGR, 1, 0), 49528c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C5, RCC_I2C5CFGR, 1, 0), 49628c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C6, RCC_I2C6CFGR, 1, 0), 49728c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C7, RCC_I2C7CFGR, 1, 0), 49828c10f9eSGabriel Fernandez GATE_CFG(GATE_I2C8, RCC_I2C8CFGR, 1, 0), 49928c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI1, RCC_SAI1CFGR, 1, 0), 50028c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI2, RCC_SAI2CFGR, 1, 0), 50128c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI3, RCC_SAI3CFGR, 1, 0), 50228c10f9eSGabriel Fernandez GATE_CFG(GATE_SAI4, RCC_SAI4CFGR, 1, 0), 50328c10f9eSGabriel Fernandez GATE_CFG(GATE_MDF1, RCC_MDF1CFGR, 1, 0), 50428c10f9eSGabriel Fernandez GATE_CFG(GATE_ADF1, RCC_ADF1CFGR, 1, 0), 50528c10f9eSGabriel Fernandez GATE_CFG(GATE_FDCAN, RCC_FDCANCFGR, 1, 0), 50628c10f9eSGabriel Fernandez GATE_CFG(GATE_HDP, RCC_HDPCFGR, 1, 0), 50728c10f9eSGabriel Fernandez GATE_CFG(GATE_ADC12, RCC_ADC12CFGR, 1, 0), 50828c10f9eSGabriel Fernandez GATE_CFG(GATE_ADC3, RCC_ADC3CFGR, 1, 0), 50928c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1MAC, RCC_ETH1CFGR, 1, 0), 51028c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1STP, RCC_ETH1CFGR, 4, 0), 51128c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1, RCC_ETH1CFGR, 5, 0), 51228c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1TX, RCC_ETH1CFGR, 8, 0), 51328c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH1RX, RCC_ETH1CFGR, 10, 0), 51428c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2MAC, RCC_ETH2CFGR, 1, 0), 51528c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2STP, RCC_ETH2CFGR, 4, 0), 51628c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2, RCC_ETH2CFGR, 5, 0), 51728c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2TX, RCC_ETH2CFGR, 8, 0), 51828c10f9eSGabriel Fernandez GATE_CFG(GATE_ETH2RX, RCC_ETH2CFGR, 10, 0), 51928c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2, RCC_USB2CFGR, 1, 0), 52028c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2PHY1, RCC_USB2PHY1CFGR, 1, 0), 52128c10f9eSGabriel Fernandez GATE_CFG(GATE_USB2PHY2, RCC_USB2PHY2CFGR, 1, 0), 52228c10f9eSGabriel Fernandez GATE_CFG(GATE_USB3DR, RCC_USB3DRCFGR, 1, 0), 52328c10f9eSGabriel Fernandez GATE_CFG(GATE_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 1, 0), 52428c10f9eSGabriel Fernandez GATE_CFG(GATE_PCIE, RCC_PCIECFGR, 1, 0), 52528c10f9eSGabriel Fernandez GATE_CFG(GATE_USBTC, RCC_USBTCCFGR, 1, 0), 52628c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSWMAC, RCC_ETHSWCFGR, 1, 0), 52728c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSW, RCC_ETHSWCFGR, 5, 0), 52828c10f9eSGabriel Fernandez GATE_CFG(GATE_ETHSWREF, RCC_ETHSWCFGR, 21, 0), 52928c10f9eSGabriel Fernandez GATE_CFG(GATE_STGEN, RCC_STGENCFGR, 1, 0), 53028c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC1, RCC_SDMMC1CFGR, 1, 0), 53128c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC2, RCC_SDMMC2CFGR, 1, 0), 53228c10f9eSGabriel Fernandez GATE_CFG(GATE_SDMMC3, RCC_SDMMC3CFGR, 1, 0), 53328c10f9eSGabriel Fernandez GATE_CFG(GATE_GPU, RCC_GPUCFGR, 1, 0), 53428c10f9eSGabriel Fernandez GATE_CFG(GATE_LTDC, RCC_LTDCCFGR, 1, 0), 53528c10f9eSGabriel Fernandez GATE_CFG(GATE_DSI, RCC_DSICFGR, 1, 0), 53628c10f9eSGabriel Fernandez GATE_CFG(GATE_LVDS, RCC_LVDSCFGR, 1, 0), 53728c10f9eSGabriel Fernandez GATE_CFG(GATE_CSI, RCC_CSICFGR, 1, 0), 53828c10f9eSGabriel Fernandez GATE_CFG(GATE_DCMIPP, RCC_DCMIPPCFGR, 1, 0), 53928c10f9eSGabriel Fernandez GATE_CFG(GATE_CCI, RCC_CCICFGR, 1, 0), 54028c10f9eSGabriel Fernandez GATE_CFG(GATE_VDEC, RCC_VDECCFGR, 1, 0), 54128c10f9eSGabriel Fernandez GATE_CFG(GATE_VENC, RCC_VENCCFGR, 1, 0), 54228c10f9eSGabriel Fernandez GATE_CFG(GATE_RNG, RCC_RNGCFGR, 1, 0), 54328c10f9eSGabriel Fernandez GATE_CFG(GATE_PKA, RCC_PKACFGR, 1, 0), 54428c10f9eSGabriel Fernandez GATE_CFG(GATE_SAES, RCC_SAESCFGR, 1, 0), 54528c10f9eSGabriel Fernandez GATE_CFG(GATE_HASH, RCC_HASHCFGR, 1, 0), 54628c10f9eSGabriel Fernandez GATE_CFG(GATE_CRYP1, RCC_CRYP1CFGR, 1, 0), 54728c10f9eSGabriel Fernandez GATE_CFG(GATE_CRYP2, RCC_CRYP2CFGR, 1, 0), 54828c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG1, RCC_IWDG1CFGR, 1, 0), 54928c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG2, RCC_IWDG2CFGR, 1, 0), 55028c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG3, RCC_IWDG3CFGR, 1, 0), 55128c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG4, RCC_IWDG4CFGR, 1, 0), 55228c10f9eSGabriel Fernandez GATE_CFG(GATE_IWDG5, RCC_IWDG5CFGR, 1, 0), 55328c10f9eSGabriel Fernandez GATE_CFG(GATE_WWDG1, RCC_WWDG1CFGR, 1, 0), 55428c10f9eSGabriel Fernandez GATE_CFG(GATE_WWDG2, RCC_WWDG2CFGR, 1, 0), 55528c10f9eSGabriel Fernandez GATE_CFG(GATE_VREF, RCC_VREFCFGR, 1, 0), 55628c10f9eSGabriel Fernandez GATE_CFG(GATE_DTS, RCC_DTSCFGR, 1, 0), 55728c10f9eSGabriel Fernandez GATE_CFG(GATE_CRC, RCC_CRCCFGR, 1, 0), 55828c10f9eSGabriel Fernandez GATE_CFG(GATE_SERC, RCC_SERCCFGR, 1, 0), 55928c10f9eSGabriel Fernandez GATE_CFG(GATE_OSPIIOM, RCC_OSPIIOMCFGR, 1, 0), 56028c10f9eSGabriel Fernandez GATE_CFG(GATE_GICV2M, RCC_GICV2MCFGR, 1, 0), 56128c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C1, RCC_I3C1CFGR, 1, 0), 56228c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C2, RCC_I3C2CFGR, 1, 0), 56328c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C3, RCC_I3C3CFGR, 1, 0), 56428c10f9eSGabriel Fernandez GATE_CFG(GATE_I3C4, RCC_I3C4CFGR, 1, 0), 56528c10f9eSGabriel Fernandez }; 56628c10f9eSGabriel Fernandez 56728c10f9eSGabriel Fernandez /* 56828c10f9eSGabriel Fernandez * MUX CONFIG 56928c10f9eSGabriel Fernandez */ 57028c10f9eSGabriel Fernandez 57128c10f9eSGabriel Fernandez #define _MUX_CFG(_id, _offset, _shift, _width, _rdy)\ 57228c10f9eSGabriel Fernandez [(_id)] = {\ 57328c10f9eSGabriel Fernandez .offset = (_offset),\ 57428c10f9eSGabriel Fernandez .shift = (_shift),\ 57528c10f9eSGabriel Fernandez .width = (_width),\ 57628c10f9eSGabriel Fernandez .ready = (_rdy),\ 57728c10f9eSGabriel Fernandez } 57828c10f9eSGabriel Fernandez 57928c10f9eSGabriel Fernandez static const struct mux_cfg parent_mp25[MUX_NB] = { 58028c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL0, RCC_MUXSELCFGR, 0, 2, GATE_PLL4_CKREFST), 58128c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL1, RCC_MUXSELCFGR, 4, 2, GATE_PLL5_CKREFST), 58228c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL2, RCC_MUXSELCFGR, 8, 2, GATE_PLL6_CKREFST), 58328c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL3, RCC_MUXSELCFGR, 12, 2, GATE_PLL7_CKREFST), 58428c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL4, RCC_MUXSELCFGR, 16, 2, GATE_PLL8_CKREFST), 58528c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL5, RCC_MUXSELCFGR, 20, 2, MUX_NO_RDY), 58628c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL6, RCC_MUXSELCFGR, 24, 2, MUX_NO_RDY), 58728c10f9eSGabriel Fernandez _MUX_CFG(MUX_MUXSEL7, RCC_MUXSELCFGR, 28, 2, MUX_NO_RDY), 58828c10f9eSGabriel Fernandez _MUX_CFG(MUX_XBARSEL, RCC_XBAR0CFGR, 0, 4, MUX_NO_RDY), 58928c10f9eSGabriel Fernandez _MUX_CFG(MUX_RTC, RCC_BDCR, 16, 2, MUX_NO_RDY), 59028c10f9eSGabriel Fernandez _MUX_CFG(MUX_D3PER, RCC_D3DCR, 16, 2, MUX_NO_RDY), 59128c10f9eSGabriel Fernandez _MUX_CFG(MUX_MCO1, RCC_MCO1CFGR, 0, 1, MUX_NO_RDY), 59228c10f9eSGabriel Fernandez _MUX_CFG(MUX_MCO2, RCC_MCO2CFGR, 0, 1, MUX_NO_RDY), 59328c10f9eSGabriel Fernandez _MUX_CFG(MUX_ADC12, RCC_ADC12CFGR, 12, 1, MUX_NO_RDY), 59428c10f9eSGabriel Fernandez _MUX_CFG(MUX_ADC3, RCC_ADC3CFGR, 12, 2, MUX_NO_RDY), 59528c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB2PHY1, RCC_USB2PHY1CFGR, 15, 1, MUX_NO_RDY), 59628c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB2PHY2, RCC_USB2PHY2CFGR, 15, 1, MUX_NO_RDY), 59728c10f9eSGabriel Fernandez _MUX_CFG(MUX_USB3PCIEPHY, RCC_USB3PCIEPHYCFGR, 15, 1, MUX_NO_RDY), 59828c10f9eSGabriel Fernandez _MUX_CFG(MUX_DSIBLANE, RCC_DSICFGR, 12, 1, MUX_NO_RDY), 59928c10f9eSGabriel Fernandez _MUX_CFG(MUX_DSIPHY, RCC_DSICFGR, 15, 1, MUX_NO_RDY), 60028c10f9eSGabriel Fernandez _MUX_CFG(MUX_LVDSPHY, RCC_LVDSCFGR, 15, 1, MUX_NO_RDY), 60128c10f9eSGabriel Fernandez _MUX_CFG(MUX_DTS, RCC_DTSCFGR, 12, 2, MUX_NO_RDY), 60228c10f9eSGabriel Fernandez }; 60328c10f9eSGabriel Fernandez 60428c10f9eSGabriel Fernandez /* 60528c10f9eSGabriel Fernandez * DIV CONFIG 60628c10f9eSGabriel Fernandez */ 60728c10f9eSGabriel Fernandez 60828c10f9eSGabriel Fernandez static const struct div_table_cfg apb_div_table[] = { 60928c10f9eSGabriel Fernandez { .val = 0, .div = 1 }, 61028c10f9eSGabriel Fernandez { .val = 1, .div = 2 }, 61128c10f9eSGabriel Fernandez { .val = 2, .div = 4 }, 61228c10f9eSGabriel Fernandez { .val = 3, .div = 8 }, 61328c10f9eSGabriel Fernandez { .val = 4, .div = 16 }, 61428c10f9eSGabriel Fernandez { .val = 5, .div = 16 }, 61528c10f9eSGabriel Fernandez { .val = 6, .div = 16 }, 61628c10f9eSGabriel Fernandez { .val = 7, .div = 16 }, 61728c10f9eSGabriel Fernandez /* .div = 0 termination cell */ 61828c10f9eSGabriel Fernandez { } 61928c10f9eSGabriel Fernandez }; 62028c10f9eSGabriel Fernandez 62128c10f9eSGabriel Fernandez #define _DIV_CFG(_id, _offset, _shift, _width, _flags, _table, _ready)\ 62228c10f9eSGabriel Fernandez [(_id)] = {\ 62328c10f9eSGabriel Fernandez .offset = (_offset),\ 62428c10f9eSGabriel Fernandez .shift = (_shift),\ 62528c10f9eSGabriel Fernandez .width = (_width),\ 62628c10f9eSGabriel Fernandez .flags = (_flags),\ 62728c10f9eSGabriel Fernandez .table = (_table),\ 62828c10f9eSGabriel Fernandez .ready = (_ready),\ 62928c10f9eSGabriel Fernandez } 63028c10f9eSGabriel Fernandez 63128c10f9eSGabriel Fernandez static const struct div_cfg dividers_mp25[DIV_NB] = { 63228c10f9eSGabriel Fernandez _DIV_CFG(DIV_RTC, RCC_RTCDIVR, 0, 6, 0, NULL, DIV_NO_RDY), 63328c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB1, RCC_APB1DIVR, 0, 3, 0, apb_div_table, 63428c10f9eSGabriel Fernandez GATE_APB1DIV_RDY), 63528c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB2, RCC_APB2DIVR, 0, 3, 0, apb_div_table, 63628c10f9eSGabriel Fernandez GATE_APB2DIV_RDY), 63728c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB3, RCC_APB3DIVR, 0, 3, 0, apb_div_table, 63828c10f9eSGabriel Fernandez GATE_APB3DIV_RDY), 63928c10f9eSGabriel Fernandez _DIV_CFG(DIV_APB4, RCC_APB4DIVR, 0, 3, 0, apb_div_table, 64028c10f9eSGabriel Fernandez GATE_APB4DIV_RDY), 64128c10f9eSGabriel Fernandez _DIV_CFG(DIV_APBDBG, RCC_APBDBGDIVR, 0, 3, 0, apb_div_table, 64228c10f9eSGabriel Fernandez GATE_APBDBGDIV_RDY), 64328c10f9eSGabriel Fernandez _DIV_CFG(DIV_LSMCU, RCC_LSMCUDIVR, 0, 1, 0, NULL, GATE_LSMCUDIV_RDY), 64428c10f9eSGabriel Fernandez }; 64528c10f9eSGabriel Fernandez 64628c10f9eSGabriel Fernandez enum stm32_osc { 64728c10f9eSGabriel Fernandez OSC_HSI, 64828c10f9eSGabriel Fernandez OSC_HSE, 64928c10f9eSGabriel Fernandez OSC_MSI, 65028c10f9eSGabriel Fernandez OSC_LSI, 65128c10f9eSGabriel Fernandez OSC_LSE, 65228c10f9eSGabriel Fernandez NB_OSCILLATOR 65328c10f9eSGabriel Fernandez }; 65428c10f9eSGabriel Fernandez 65528c10f9eSGabriel Fernandez struct clk_stm32_bypass { 65628c10f9eSGabriel Fernandez uint16_t offset; 65728c10f9eSGabriel Fernandez uint8_t bit_byp; 65828c10f9eSGabriel Fernandez uint8_t bit_digbyp; 65928c10f9eSGabriel Fernandez }; 66028c10f9eSGabriel Fernandez 66128c10f9eSGabriel Fernandez struct clk_stm32_css { 66228c10f9eSGabriel Fernandez uint16_t offset; 66328c10f9eSGabriel Fernandez uint8_t bit_css; 66428c10f9eSGabriel Fernandez }; 66528c10f9eSGabriel Fernandez 66628c10f9eSGabriel Fernandez struct clk_stm32_drive { 66728c10f9eSGabriel Fernandez uint16_t offset; 66828c10f9eSGabriel Fernandez uint8_t drv_shift; 66928c10f9eSGabriel Fernandez uint8_t drv_width; 67028c10f9eSGabriel Fernandez uint8_t drv_default; 67128c10f9eSGabriel Fernandez }; 67228c10f9eSGabriel Fernandez 67328c10f9eSGabriel Fernandez struct clk_oscillator_data { 67428c10f9eSGabriel Fernandez const char *name; 67528c10f9eSGabriel Fernandez unsigned long frequency; 67628c10f9eSGabriel Fernandez uint16_t gate_id; 67728c10f9eSGabriel Fernandez struct clk_stm32_bypass *bypass; 67828c10f9eSGabriel Fernandez struct clk_stm32_css *css; 67928c10f9eSGabriel Fernandez struct clk_stm32_drive *drive; 68028c10f9eSGabriel Fernandez }; 68128c10f9eSGabriel Fernandez 68228c10f9eSGabriel Fernandez #define BYPASS(_offset, _bit_byp, _bit_digbyp) \ 68328c10f9eSGabriel Fernandez (&(struct clk_stm32_bypass){\ 68428c10f9eSGabriel Fernandez .offset = (_offset),\ 68528c10f9eSGabriel Fernandez .bit_byp = (_bit_byp),\ 68628c10f9eSGabriel Fernandez .bit_digbyp = (_bit_digbyp),\ 68728c10f9eSGabriel Fernandez }) 68828c10f9eSGabriel Fernandez 68928c10f9eSGabriel Fernandez #define CSS(_offset, _bit_css) \ 69028c10f9eSGabriel Fernandez (&(struct clk_stm32_css){\ 69128c10f9eSGabriel Fernandez .offset = (_offset),\ 69228c10f9eSGabriel Fernandez .bit_css = (_bit_css),\ 69328c10f9eSGabriel Fernandez }) 69428c10f9eSGabriel Fernandez 69528c10f9eSGabriel Fernandez #define DRIVE(_offset, _shift, _width, _default) \ 69628c10f9eSGabriel Fernandez (&(struct clk_stm32_drive){\ 69728c10f9eSGabriel Fernandez .offset = (_offset),\ 69828c10f9eSGabriel Fernandez .drv_shift = (_shift),\ 69928c10f9eSGabriel Fernandez .drv_width = (_width),\ 70028c10f9eSGabriel Fernandez .drv_default = (_default),\ 70128c10f9eSGabriel Fernandez }) 70228c10f9eSGabriel Fernandez 70328c10f9eSGabriel Fernandez #define OSCILLATOR(idx_osc, _name, _gate_id, _bypass, _css, _drive) \ 70428c10f9eSGabriel Fernandez [(idx_osc)] = (struct clk_oscillator_data){\ 70528c10f9eSGabriel Fernandez .name = (_name),\ 70628c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 70728c10f9eSGabriel Fernandez .bypass = (_bypass),\ 70828c10f9eSGabriel Fernandez .css = (_css),\ 70928c10f9eSGabriel Fernandez .drive = (_drive),\ 71028c10f9eSGabriel Fernandez } 71128c10f9eSGabriel Fernandez 71228c10f9eSGabriel Fernandez static struct clk_oscillator_data stm32mp25_osc_data[NB_OSCILLATOR] = { 71328c10f9eSGabriel Fernandez OSCILLATOR(OSC_HSI, "clk-hsi", GATE_HSI, 71428c10f9eSGabriel Fernandez NULL, NULL, NULL), 71528c10f9eSGabriel Fernandez 71628c10f9eSGabriel Fernandez OSCILLATOR(OSC_LSI, "clk-lsi", GATE_LSI, 71728c10f9eSGabriel Fernandez NULL, NULL, NULL), 71828c10f9eSGabriel Fernandez 71928c10f9eSGabriel Fernandez OSCILLATOR(OSC_MSI, "clk-msi", GATE_MSI, 72028c10f9eSGabriel Fernandez NULL, NULL, NULL), 72128c10f9eSGabriel Fernandez 72228c10f9eSGabriel Fernandez OSCILLATOR(OSC_LSE, "clk-lse", GATE_LSE, 72328c10f9eSGabriel Fernandez BYPASS(RCC_BDCR, RCC_BDCR_LSEBYP_BIT, 72428c10f9eSGabriel Fernandez RCC_BDCR_LSEDIGBYP_BIT), 72528c10f9eSGabriel Fernandez CSS(RCC_BDCR, RCC_BDCR_LSECSSON_BIT), 72628c10f9eSGabriel Fernandez DRIVE(RCC_BDCR, RCC_BDCR_LSEDRV_SHIFT, 72728c10f9eSGabriel Fernandez RCC_BDCR_LSEDRV_WIDTH, LSEDRV_MEDIUM_HIGH)), 72828c10f9eSGabriel Fernandez 72928c10f9eSGabriel Fernandez OSCILLATOR(OSC_HSE, "clk-hse", GATE_HSE, 73028c10f9eSGabriel Fernandez BYPASS(RCC_OCENSETR, RCC_OCENSETR_HSEBYP_BIT, 73128c10f9eSGabriel Fernandez RCC_OCENSETR_HSEDIGBYP_BIT), 73228c10f9eSGabriel Fernandez CSS(RCC_OCENSETR, RCC_OCENSETR_HSECSSON_BIT), 73328c10f9eSGabriel Fernandez NULL), 73428c10f9eSGabriel Fernandez }; 73528c10f9eSGabriel Fernandez 73628c10f9eSGabriel Fernandez static struct clk_oscillator_data *clk_oscillator_get_data(unsigned int osc_id) 73728c10f9eSGabriel Fernandez { 73828c10f9eSGabriel Fernandez assert(osc_id < ARRAY_SIZE(stm32mp25_osc_data)); 73928c10f9eSGabriel Fernandez 74028c10f9eSGabriel Fernandez return &stm32mp25_osc_data[osc_id]; 74128c10f9eSGabriel Fernandez } 74228c10f9eSGabriel Fernandez 74328c10f9eSGabriel Fernandez static unsigned long clk_stm32_get_rate_oscillator(unsigned int osc_id) 74428c10f9eSGabriel Fernandez { 74528c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 74628c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 74728c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[osc_id]; 74828c10f9eSGabriel Fernandez 74928c10f9eSGabriel Fernandez return osci->freq; 75028c10f9eSGabriel Fernandez } 75128c10f9eSGabriel Fernandez 75228c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_oscillator_rate(unsigned int sel) 75328c10f9eSGabriel Fernandez { 75428c10f9eSGabriel Fernandez unsigned int osc[] = { OSC_HSI, OSC_HSE, OSC_MSI }; 75528c10f9eSGabriel Fernandez 75628c10f9eSGabriel Fernandez assert(sel < ARRAY_SIZE(osc)); 75728c10f9eSGabriel Fernandez 75828c10f9eSGabriel Fernandez return clk_stm32_get_rate_oscillator(osc[sel]); 75928c10f9eSGabriel Fernandez } 76028c10f9eSGabriel Fernandez 76128c10f9eSGabriel Fernandez static void clk_oscillator_set_bypass(struct clk_stm32_priv *priv, 76228c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data, 76328c10f9eSGabriel Fernandez bool digbyp, bool bypass) 76428c10f9eSGabriel Fernandez { 76528c10f9eSGabriel Fernandez struct clk_stm32_bypass *bypass_data = osc_data->bypass; 76628c10f9eSGabriel Fernandez uintptr_t address = 0; 76728c10f9eSGabriel Fernandez 76828c10f9eSGabriel Fernandez if (!bypass_data) 76928c10f9eSGabriel Fernandez return; 77028c10f9eSGabriel Fernandez 77128c10f9eSGabriel Fernandez address = priv->base + bypass_data->offset; 77228c10f9eSGabriel Fernandez 77328c10f9eSGabriel Fernandez if (digbyp) 77428c10f9eSGabriel Fernandez io_setbits32(address, BIT(bypass_data->bit_digbyp)); 77528c10f9eSGabriel Fernandez 77628c10f9eSGabriel Fernandez if (bypass || digbyp) 77728c10f9eSGabriel Fernandez io_setbits32(address, BIT(bypass_data->bit_byp)); 77828c10f9eSGabriel Fernandez } 77928c10f9eSGabriel Fernandez 78028c10f9eSGabriel Fernandez static void clk_oscillator_set_css(struct clk_stm32_priv *priv, 78128c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data, 78228c10f9eSGabriel Fernandez bool css) 78328c10f9eSGabriel Fernandez { 78428c10f9eSGabriel Fernandez struct clk_stm32_css *css_data = osc_data->css; 78528c10f9eSGabriel Fernandez 78628c10f9eSGabriel Fernandez if (css_data && css) 78728c10f9eSGabriel Fernandez io_setbits32(priv->base + css_data->offset, 78828c10f9eSGabriel Fernandez BIT(css_data->bit_css)); 78928c10f9eSGabriel Fernandez } 79028c10f9eSGabriel Fernandez 79128c10f9eSGabriel Fernandez static void clk_oscillator_set_drive(struct clk_stm32_priv *priv, 79228c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data, 79328c10f9eSGabriel Fernandez uint8_t lsedrv) 79428c10f9eSGabriel Fernandez { 79528c10f9eSGabriel Fernandez struct clk_stm32_drive *drive_data = osc_data->drive; 79628c10f9eSGabriel Fernandez uintptr_t address = 0; 79728c10f9eSGabriel Fernandez uint32_t mask = 0; 79828c10f9eSGabriel Fernandez uint32_t value = 0; 79928c10f9eSGabriel Fernandez 80028c10f9eSGabriel Fernandez if (!drive_data) 80128c10f9eSGabriel Fernandez return; 80228c10f9eSGabriel Fernandez 80328c10f9eSGabriel Fernandez address = priv->base + drive_data->offset; 80428c10f9eSGabriel Fernandez 80528c10f9eSGabriel Fernandez mask = SHIFT_U32(BIT(drive_data->drv_width) - 1, drive_data->drv_shift); 80628c10f9eSGabriel Fernandez 80728c10f9eSGabriel Fernandez /* 80828c10f9eSGabriel Fernandez * Warning: not recommended to switch directly from "high drive" 80928c10f9eSGabriel Fernandez * to "medium low drive", and vice-versa. 81028c10f9eSGabriel Fernandez */ 81128c10f9eSGabriel Fernandez value = (io_read32(address) & mask) >> drive_data->drv_shift; 81228c10f9eSGabriel Fernandez 81328c10f9eSGabriel Fernandez while (value != lsedrv) { 81428c10f9eSGabriel Fernandez if (value > lsedrv) 81528c10f9eSGabriel Fernandez value--; 81628c10f9eSGabriel Fernandez else 81728c10f9eSGabriel Fernandez value++; 81828c10f9eSGabriel Fernandez 81928c10f9eSGabriel Fernandez io_clrsetbits32(address, mask, 82028c10f9eSGabriel Fernandez SHIFT_U32(value, drive_data->drv_shift)); 82128c10f9eSGabriel Fernandez } 82228c10f9eSGabriel Fernandez } 82328c10f9eSGabriel Fernandez 82428c10f9eSGabriel Fernandez static void stm32_enable_oscillator_hse(struct clk_stm32_priv *priv, 82528c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 82628c10f9eSGabriel Fernandez { 82728c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_HSE); 82828c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_HSE]; 82928c10f9eSGabriel Fernandez 83028c10f9eSGabriel Fernandez if (!osci->freq) 83128c10f9eSGabriel Fernandez return; 83228c10f9eSGabriel Fernandez 83328c10f9eSGabriel Fernandez clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass); 83428c10f9eSGabriel Fernandez 83528c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */ 83628c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id)) 83728c10f9eSGabriel Fernandez panic("timeout to enable hse clock"); 83828c10f9eSGabriel Fernandez 83928c10f9eSGabriel Fernandez clk_oscillator_set_css(priv, osc_data, osci->css); 84028c10f9eSGabriel Fernandez } 84128c10f9eSGabriel Fernandez 84228c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lse(struct clk_stm32_priv *priv, 84328c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 84428c10f9eSGabriel Fernandez { 84528c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE); 84628c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 84728c10f9eSGabriel Fernandez 84828c10f9eSGabriel Fernandez if (!osci->freq) 84928c10f9eSGabriel Fernandez return; 85028c10f9eSGabriel Fernandez 85128c10f9eSGabriel Fernandez if (stm32_gate_is_enabled(osc_data->gate_id)) 85228c10f9eSGabriel Fernandez return; 85328c10f9eSGabriel Fernandez 85428c10f9eSGabriel Fernandez clk_oscillator_set_bypass(priv, osc_data, osci->digbyp, osci->bypass); 85528c10f9eSGabriel Fernandez 85628c10f9eSGabriel Fernandez clk_oscillator_set_drive(priv, osc_data, osci->drive); 85728c10f9eSGabriel Fernandez 85828c10f9eSGabriel Fernandez /* Enable LSE clock, but don't wait ready bit */ 85928c10f9eSGabriel Fernandez stm32_gate_enable(osc_data->gate_id); 86028c10f9eSGabriel Fernandez } 86128c10f9eSGabriel Fernandez 86228c10f9eSGabriel Fernandez static void stm32_enable_oscillator_lsi(struct clk_stm32_priv *priv __unused, 86328c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 86428c10f9eSGabriel Fernandez { 86528c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSI); 86628c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSI]; 86728c10f9eSGabriel Fernandez 86828c10f9eSGabriel Fernandez if (!osci->freq) 86928c10f9eSGabriel Fernandez return; 87028c10f9eSGabriel Fernandez 87128c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */ 87228c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id)) 87328c10f9eSGabriel Fernandez panic("timeout to enable lsi clock"); 87428c10f9eSGabriel Fernandez } 87528c10f9eSGabriel Fernandez 87628c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_msi_set_rate(struct clk_stm32_priv *priv, 87728c10f9eSGabriel Fernandez unsigned long rate) 87828c10f9eSGabriel Fernandez { 87928c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR; 88028c10f9eSGabriel Fernandez uint32_t mask = RCC_BDCR_MSIFREQSEL; 88128c10f9eSGabriel Fernandez 88228c10f9eSGabriel Fernandez switch (rate) { 88328c10f9eSGabriel Fernandez case RCC_4_MHZ: 88428c10f9eSGabriel Fernandez io_clrbits32_stm32shregs(address, mask); 88528c10f9eSGabriel Fernandez break; 88628c10f9eSGabriel Fernandez case RCC_16_MHZ: 88728c10f9eSGabriel Fernandez io_setbits32_stm32shregs(address, mask); 88828c10f9eSGabriel Fernandez break; 88928c10f9eSGabriel Fernandez default: 89028c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 89128c10f9eSGabriel Fernandez } 89228c10f9eSGabriel Fernandez 89328c10f9eSGabriel Fernandez return TEE_SUCCESS; 89428c10f9eSGabriel Fernandez } 89528c10f9eSGabriel Fernandez 89628c10f9eSGabriel Fernandez static void stm32_enable_oscillator_msi(struct clk_stm32_priv *priv, 89728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 89828c10f9eSGabriel Fernandez { 89928c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_MSI); 90028c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_MSI]; 90128c10f9eSGabriel Fernandez 90228c10f9eSGabriel Fernandez if (!osci->freq) 90328c10f9eSGabriel Fernandez return; 90428c10f9eSGabriel Fernandez 905*2604f62dSEtienne Carriere if (clk_stm32_osc_msi_set_rate(priv, osci->freq) != TEE_SUCCESS) { 90628c10f9eSGabriel Fernandez EMSG("invalid rate %ld Hz for MSI ! (4000000 or 16000000 only)", 90728c10f9eSGabriel Fernandez osci->freq); 908*2604f62dSEtienne Carriere panic(); 909*2604f62dSEtienne Carriere } 91028c10f9eSGabriel Fernandez 91128c10f9eSGabriel Fernandez /* Enable clock and wait ready bit */ 91228c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(osc_data->gate_id)) 91328c10f9eSGabriel Fernandez panic("timeout to enable msi clock"); 91428c10f9eSGabriel Fernandez } 91528c10f9eSGabriel Fernandez 91628c10f9eSGabriel Fernandez static void stm32_clk_oscillators_lse_set_css(struct clk_stm32_priv *priv, 91728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 91828c10f9eSGabriel Fernandez 91928c10f9eSGabriel Fernandez { 92028c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE); 92128c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 92228c10f9eSGabriel Fernandez 92328c10f9eSGabriel Fernandez clk_oscillator_set_css(priv, osc_data, osci->css); 92428c10f9eSGabriel Fernandez } 92528c10f9eSGabriel Fernandez 92628c10f9eSGabriel Fernandez static int 92728c10f9eSGabriel Fernandez stm32_clk_oscillators_wait_lse_ready(struct clk_stm32_priv *priv __unused, 92828c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 92928c10f9eSGabriel Fernandez { 93028c10f9eSGabriel Fernandez struct clk_oscillator_data *osc_data = clk_oscillator_get_data(OSC_LSE); 93128c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci = &pdata->osci[OSC_LSE]; 93228c10f9eSGabriel Fernandez int ret = 0; 93328c10f9eSGabriel Fernandez 93428c10f9eSGabriel Fernandez if (osci->freq) 93528c10f9eSGabriel Fernandez ret = stm32_gate_wait_ready(osc_data->gate_id, true); 93628c10f9eSGabriel Fernandez 93728c10f9eSGabriel Fernandez return ret; 93828c10f9eSGabriel Fernandez } 93928c10f9eSGabriel Fernandez 94028c10f9eSGabriel Fernandez static void stm32_clk_oscillators_enable(struct clk_stm32_priv *priv, 94128c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 94228c10f9eSGabriel Fernandez { 94328c10f9eSGabriel Fernandez stm32_enable_oscillator_hse(priv, pdata); 94428c10f9eSGabriel Fernandez stm32_enable_oscillator_lse(priv, pdata); 94528c10f9eSGabriel Fernandez stm32_enable_oscillator_lsi(priv, pdata); 94628c10f9eSGabriel Fernandez stm32_enable_oscillator_msi(priv, pdata); 94728c10f9eSGabriel Fernandez } 94828c10f9eSGabriel Fernandez 94928c10f9eSGabriel Fernandez enum stm32_pll_id { 95028c10f9eSGabriel Fernandez PLL1_ID, 95128c10f9eSGabriel Fernandez PLL2_ID, 95228c10f9eSGabriel Fernandez PLL3_ID, 95328c10f9eSGabriel Fernandez PLL4_ID, 95428c10f9eSGabriel Fernandez PLL5_ID, 95528c10f9eSGabriel Fernandez PLL6_ID, 95628c10f9eSGabriel Fernandez PLL7_ID, 95728c10f9eSGabriel Fernandez PLL8_ID, 95828c10f9eSGabriel Fernandez PLL_NB 95928c10f9eSGabriel Fernandez }; 96028c10f9eSGabriel Fernandez 96128c10f9eSGabriel Fernandez /* PLL configuration registers offsets from RCC_PLLxCFGR1 */ 96228c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR1 0x00 96328c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR2 0x04 96428c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR3 0x08 96528c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR4 0x0C 96628c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR5 0x10 96728c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR6 0x18 96828c10f9eSGabriel Fernandez #define RCC_OFFSET_PLLXCFGR7 0x1C 96928c10f9eSGabriel Fernandez 97028c10f9eSGabriel Fernandez struct stm32_clk_pll { 97128c10f9eSGabriel Fernandez uint16_t gate_id; 97228c10f9eSGabriel Fernandez uint16_t mux_id; 97328c10f9eSGabriel Fernandez uint16_t reg_pllxcfgr1; 97428c10f9eSGabriel Fernandez }; 97528c10f9eSGabriel Fernandez 97628c10f9eSGabriel Fernandez #define CLK_PLL_CFG(_idx, _gate_id, _mux_id, _reg)\ 97728c10f9eSGabriel Fernandez [(_idx)] = {\ 97828c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 97928c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 98028c10f9eSGabriel Fernandez .reg_pllxcfgr1 = (_reg),\ 98128c10f9eSGabriel Fernandez } 98228c10f9eSGabriel Fernandez 98328c10f9eSGabriel Fernandez static const struct stm32_clk_pll stm32mp25_clk_pll[PLL_NB] = { 98428c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL1_ID, GATE_PLL1, MUX_MUXSEL5, 0), 98528c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL2_ID, GATE_PLL2, MUX_MUXSEL6, RCC_PLL2CFGR1), 98628c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL3_ID, GATE_PLL3, MUX_MUXSEL7, RCC_PLL3CFGR1), 98728c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL4_ID, GATE_PLL4, MUX_MUXSEL0, RCC_PLL4CFGR1), 98828c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL5_ID, GATE_PLL5, MUX_MUXSEL1, RCC_PLL5CFGR1), 98928c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL6_ID, GATE_PLL6, MUX_MUXSEL2, RCC_PLL6CFGR1), 99028c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL7_ID, GATE_PLL7, MUX_MUXSEL3, RCC_PLL7CFGR1), 99128c10f9eSGabriel Fernandez CLK_PLL_CFG(PLL8_ID, GATE_PLL8, MUX_MUXSEL4, RCC_PLL8CFGR1), 99228c10f9eSGabriel Fernandez }; 99328c10f9eSGabriel Fernandez 99428c10f9eSGabriel Fernandez static const struct stm32_clk_pll *clk_stm32_pll_data(unsigned int idx) 99528c10f9eSGabriel Fernandez { 99628c10f9eSGabriel Fernandez assert(idx < ARRAY_SIZE(stm32mp25_clk_pll)); 99728c10f9eSGabriel Fernandez 99828c10f9eSGabriel Fernandez return &stm32mp25_clk_pll[idx]; 99928c10f9eSGabriel Fernandez } 100028c10f9eSGabriel Fernandez 100128c10f9eSGabriel Fernandez static int stm32_clk_parse_oscillator_fdt(const void *fdt, int node, 100228c10f9eSGabriel Fernandez const char *name, 100328c10f9eSGabriel Fernandez struct stm32_osci_dt_cfg *osci) 100428c10f9eSGabriel Fernandez { 100528c10f9eSGabriel Fernandez int subnode = 0; 100628c10f9eSGabriel Fernandez 100728c10f9eSGabriel Fernandez /* default value when oscillator is not found */ 100828c10f9eSGabriel Fernandez osci->freq = 0; 100928c10f9eSGabriel Fernandez 101028c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) { 101128c10f9eSGabriel Fernandez const char *cchar = NULL; 101228c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL; 101328c10f9eSGabriel Fernandez int ret = 0; 101428c10f9eSGabriel Fernandez 101528c10f9eSGabriel Fernandez cchar = fdt_get_name(fdt, subnode, &ret); 101628c10f9eSGabriel Fernandez if (!cchar) 101728c10f9eSGabriel Fernandez return ret; 101828c10f9eSGabriel Fernandez 101928c10f9eSGabriel Fernandez if (strncmp(cchar, name, (size_t)ret) || 102028c10f9eSGabriel Fernandez fdt_get_status(fdt, subnode) == DT_STATUS_DISABLED) 102128c10f9eSGabriel Fernandez continue; 102228c10f9eSGabriel Fernandez 102328c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret); 102428c10f9eSGabriel Fernandez if (!cuint) 102528c10f9eSGabriel Fernandez return ret; 102628c10f9eSGabriel Fernandez 102728c10f9eSGabriel Fernandez osci->freq = fdt32_to_cpu(*cuint); 102828c10f9eSGabriel Fernandez 102928c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,bypass", NULL)) 103028c10f9eSGabriel Fernandez osci->bypass = true; 103128c10f9eSGabriel Fernandez 103228c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,digbypass", NULL)) 103328c10f9eSGabriel Fernandez osci->digbyp = true; 103428c10f9eSGabriel Fernandez 103528c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,css", NULL)) 103628c10f9eSGabriel Fernandez osci->css = true; 103728c10f9eSGabriel Fernandez 103828c10f9eSGabriel Fernandez osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive", 103928c10f9eSGabriel Fernandez LSEDRV_MEDIUM_HIGH); 104028c10f9eSGabriel Fernandez 104128c10f9eSGabriel Fernandez return 0; 104228c10f9eSGabriel Fernandez } 104328c10f9eSGabriel Fernandez 104428c10f9eSGabriel Fernandez return 0; 104528c10f9eSGabriel Fernandez } 104628c10f9eSGabriel Fernandez 104728c10f9eSGabriel Fernandez static const char *stm32_clk_get_oscillator_name(enum stm32_osc id) 104828c10f9eSGabriel Fernandez { 104928c10f9eSGabriel Fernandez if (id < NB_OSCILLATOR) 105028c10f9eSGabriel Fernandez return stm32mp25_osc_data[id].name; 105128c10f9eSGabriel Fernandez 105228c10f9eSGabriel Fernandez return NULL; 105328c10f9eSGabriel Fernandez } 105428c10f9eSGabriel Fernandez 105528c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_oscillator(const void *fdt, 105628c10f9eSGabriel Fernandez int node __unused, 105728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 105828c10f9eSGabriel Fernandez { 105928c10f9eSGabriel Fernandez int fdt_err = 0; 106028c10f9eSGabriel Fernandez size_t i = 0; 106128c10f9eSGabriel Fernandez int osc_node = 0; 106228c10f9eSGabriel Fernandez 106328c10f9eSGabriel Fernandez osc_node = fdt_path_offset(fdt, "/clocks"); 106428c10f9eSGabriel Fernandez if (osc_node < 0) 106528c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND; 106628c10f9eSGabriel Fernandez 106728c10f9eSGabriel Fernandez for (i = 0; i < pdata->nosci; i++) { 106828c10f9eSGabriel Fernandez const char *name = NULL; 106928c10f9eSGabriel Fernandez 107028c10f9eSGabriel Fernandez name = stm32_clk_get_oscillator_name((enum stm32_osc)i); 107128c10f9eSGabriel Fernandez if (!name) 107228c10f9eSGabriel Fernandez continue; 107328c10f9eSGabriel Fernandez 107428c10f9eSGabriel Fernandez fdt_err = stm32_clk_parse_oscillator_fdt(fdt, osc_node, name, 107528c10f9eSGabriel Fernandez &pdata->osci[i]); 107628c10f9eSGabriel Fernandez if (fdt_err < 0) 107728c10f9eSGabriel Fernandez panic(); 107828c10f9eSGabriel Fernandez } 107928c10f9eSGabriel Fernandez 108028c10f9eSGabriel Fernandez return 0; 108128c10f9eSGabriel Fernandez } 108228c10f9eSGabriel Fernandez 108328c10f9eSGabriel Fernandez static int clk_stm32_parse_pll_fdt(const void *fdt, int subnode, 108428c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll) 108528c10f9eSGabriel Fernandez { 108628c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL; 108728c10f9eSGabriel Fernandez int subnode_pll = 0; 108828c10f9eSGabriel Fernandez int err = 0; 108928c10f9eSGabriel Fernandez 109028c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "st,pll", NULL); 109128c10f9eSGabriel Fernandez if (!cuint) 109228c10f9eSGabriel Fernandez return 0; 109328c10f9eSGabriel Fernandez 109428c10f9eSGabriel Fernandez subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint)); 109528c10f9eSGabriel Fernandez if (subnode_pll < 0) 109628c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND; 109728c10f9eSGabriel Fernandez 109828c10f9eSGabriel Fernandez if (fdt_read_uint32_array(fdt, subnode_pll, "cfg", pll->cfg, 109928c10f9eSGabriel Fernandez PLLCFG_NB) != 0) 110028c10f9eSGabriel Fernandez panic("cfg property is mandatory"); 110128c10f9eSGabriel Fernandez 110228c10f9eSGabriel Fernandez err = fdt_read_uint32_array(fdt, subnode_pll, "csg", pll->csg, 110328c10f9eSGabriel Fernandez PLLCSG_NB); 110428c10f9eSGabriel Fernandez 110528c10f9eSGabriel Fernandez pll->csg_enabled = (err == 0); 110628c10f9eSGabriel Fernandez 110728c10f9eSGabriel Fernandez if (err == -FDT_ERR_NOTFOUND) 110828c10f9eSGabriel Fernandez err = 0; 110928c10f9eSGabriel Fernandez 111028c10f9eSGabriel Fernandez if (err != 0) 111128c10f9eSGabriel Fernandez return err; 111228c10f9eSGabriel Fernandez 111328c10f9eSGabriel Fernandez pll->enabled = true; 111428c10f9eSGabriel Fernandez 111528c10f9eSGabriel Fernandez pll->frac = fdt_read_uint32_default(fdt, subnode_pll, "frac", 0); 111628c10f9eSGabriel Fernandez 111728c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode_pll, "src", &pll->src)) 111828c10f9eSGabriel Fernandez panic("src property is mandatory"); 111928c10f9eSGabriel Fernandez 112028c10f9eSGabriel Fernandez return 0; 112128c10f9eSGabriel Fernandez } 112228c10f9eSGabriel Fernandez 112328c10f9eSGabriel Fernandez #define RCC_PLL_NAME_SIZE 20 112428c10f9eSGabriel Fernandez 112528c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_pll(const void *fdt, int node, 112628c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 112728c10f9eSGabriel Fernandez { 112828c10f9eSGabriel Fernandez unsigned int i = 0; 112928c10f9eSGabriel Fernandez 113028c10f9eSGabriel Fernandez for (i = 0; i < pdata->npll; i++) { 113128c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll = pdata->pll + i; 113228c10f9eSGabriel Fernandez char name[RCC_PLL_NAME_SIZE] = { }; 113328c10f9eSGabriel Fernandez int subnode = 0; 113428c10f9eSGabriel Fernandez 113528c10f9eSGabriel Fernandez snprintf(name, sizeof(name), "st,pll-%u", i + 1); 113628c10f9eSGabriel Fernandez 113728c10f9eSGabriel Fernandez subnode = fdt_subnode_offset(fdt, node, name); 113828c10f9eSGabriel Fernandez if (subnode < 0) 113928c10f9eSGabriel Fernandez continue; 114028c10f9eSGabriel Fernandez 114128c10f9eSGabriel Fernandez if (clk_stm32_parse_pll_fdt(fdt, subnode, pll)) 114228c10f9eSGabriel Fernandez panic(); 114328c10f9eSGabriel Fernandez } 114428c10f9eSGabriel Fernandez 114528c10f9eSGabriel Fernandez return 0; 114628c10f9eSGabriel Fernandez } 114728c10f9eSGabriel Fernandez 114828c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_opp(const void *fdt, int node, 114928c10f9eSGabriel Fernandez const char *opp_name, 115028c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp_cfg) 115128c10f9eSGabriel Fernandez { 115228c10f9eSGabriel Fernandez int subnode = 0; 115328c10f9eSGabriel Fernandez int nb_opp = 0; 115428c10f9eSGabriel Fernandez int ret = 0; 115528c10f9eSGabriel Fernandez 115628c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, opp_name); 115728c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND) 115828c10f9eSGabriel Fernandez return 0; 115928c10f9eSGabriel Fernandez 116028c10f9eSGabriel Fernandez if (node < 0) 116128c10f9eSGabriel Fernandez return node; 116228c10f9eSGabriel Fernandez 116328c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) { 116428c10f9eSGabriel Fernandez assert(nb_opp <= MAX_OPP); 116528c10f9eSGabriel Fernandez 116628c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "hz", &opp_cfg->frq)) 116728c10f9eSGabriel Fernandez panic("hz property is mandatory"); 116828c10f9eSGabriel Fernandez 116928c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "st,clksrc", &opp_cfg->src)) 117028c10f9eSGabriel Fernandez panic("st,clksrc property is mandatory"); 117128c10f9eSGabriel Fernandez 117228c10f9eSGabriel Fernandez ret = clk_stm32_parse_pll_fdt(fdt, subnode, &opp_cfg->pll_cfg); 117328c10f9eSGabriel Fernandez if (ret < 0) 117428c10f9eSGabriel Fernandez return ret; 117528c10f9eSGabriel Fernandez 117628c10f9eSGabriel Fernandez opp_cfg++; 117728c10f9eSGabriel Fernandez nb_opp++; 117828c10f9eSGabriel Fernandez } 117928c10f9eSGabriel Fernandez 118028c10f9eSGabriel Fernandez return 0; 118128c10f9eSGabriel Fernandez } 118228c10f9eSGabriel Fernandez 118328c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_opp(const void *fdt, int node, 118428c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 118528c10f9eSGabriel Fernandez { 118628c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp = pdata->opp; 118728c10f9eSGabriel Fernandez 118828c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, "st,clk_opp"); 118928c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND) 119028c10f9eSGabriel Fernandez return 0; 119128c10f9eSGabriel Fernandez 119228c10f9eSGabriel Fernandez if (node < 0) 119328c10f9eSGabriel Fernandez return node; 119428c10f9eSGabriel Fernandez 119528c10f9eSGabriel Fernandez return stm32_clk_parse_fdt_opp(fdt, node, "st,ck_cpu1", opp->cpu1_opp); 119628c10f9eSGabriel Fernandez } 119728c10f9eSGabriel Fernandez 119828c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt(const void *fdt, int node, 119928c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 120028c10f9eSGabriel Fernandez { 120128c10f9eSGabriel Fernandez int err = 0; 120228c10f9eSGabriel Fernandez 120328c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_oscillator(fdt, node, pdata); 120428c10f9eSGabriel Fernandez if (err != 0) 120528c10f9eSGabriel Fernandez return err; 120628c10f9eSGabriel Fernandez 120728c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata); 120828c10f9eSGabriel Fernandez if (err != 0) 120928c10f9eSGabriel Fernandez return err; 121028c10f9eSGabriel Fernandez 121128c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_opp(fdt, node, pdata); 121228c10f9eSGabriel Fernandez if (err != 0) 121328c10f9eSGabriel Fernandez return err; 121428c10f9eSGabriel Fernandez 121528c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,busclk", 121628c10f9eSGabriel Fernandez pdata->busclk, 121728c10f9eSGabriel Fernandez &pdata->nbusclk); 121828c10f9eSGabriel Fernandez if (err != 0) 121928c10f9eSGabriel Fernandez return err; 122028c10f9eSGabriel Fernandez 122128c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,flexgen", 122228c10f9eSGabriel Fernandez pdata->flexgen, 122328c10f9eSGabriel Fernandez &pdata->nflexgen); 122428c10f9eSGabriel Fernandez if (err != 0) 122528c10f9eSGabriel Fernandez return err; 122628c10f9eSGabriel Fernandez 122728c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,kerclk", 122828c10f9eSGabriel Fernandez pdata->kernelclk, 122928c10f9eSGabriel Fernandez &pdata->nkernelclk); 123028c10f9eSGabriel Fernandez if (err != 0) 123128c10f9eSGabriel Fernandez return err; 123228c10f9eSGabriel Fernandez 123328c10f9eSGabriel Fernandez pdata->c1msrd = fdt_read_uint32_default(fdt, node, "st,c1msrd", 0); 123428c10f9eSGabriel Fernandez 123528c10f9eSGabriel Fernandez if (fdt_getprop(fdt, node, "st,safe_rst", NULL)) 123628c10f9eSGabriel Fernandez pdata->safe_rst = true; 123728c10f9eSGabriel Fernandez 123828c10f9eSGabriel Fernandez pdata->rcc_base = stm32_rcc_base(); 123928c10f9eSGabriel Fernandez 124028c10f9eSGabriel Fernandez return 0; 124128c10f9eSGabriel Fernandez } 124228c10f9eSGabriel Fernandez 124328c10f9eSGabriel Fernandez static void stm32mp2_a35_ss_on_hsi(void) 124428c10f9eSGabriel Fernandez { 124528c10f9eSGabriel Fernandez uint64_t timeout = 0; 124628c10f9eSGabriel Fernandez 124728c10f9eSGabriel Fernandez /* Nothing to do if clock source is already set on bypass clock */ 124828c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 124928c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) 125028c10f9eSGabriel Fernandez return; 125128c10f9eSGabriel Fernandez 125228c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 125328c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_EN, 125428c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK); 125528c10f9eSGabriel Fernandez 125628c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 125728c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 125828c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 125928c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) 126028c10f9eSGabriel Fernandez break; 126128c10f9eSGabriel Fernandez 126228c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 126328c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)) 126428c10f9eSGabriel Fernandez panic("Cannot switch A35 to bypass clock"); 126528c10f9eSGabriel Fernandez 126628c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 126728c10f9eSGabriel Fernandez 0, 126828c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK); 126928c10f9eSGabriel Fernandez } 127028c10f9eSGabriel Fernandez 127128c10f9eSGabriel Fernandez static void stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv *priv) 127228c10f9eSGabriel Fernandez { 127328c10f9eSGabriel Fernandez uintptr_t xbar0cfgr = priv->base + RCC_XBAR0CFGR; 127428c10f9eSGabriel Fernandez uint32_t i = 0; 127528c10f9eSGabriel Fernandez 127628c10f9eSGabriel Fernandez for (i = 0; i < XBAR_ROOT_CHANNEL_NB; i++) 127728c10f9eSGabriel Fernandez io_clrsetbits32(xbar0cfgr + (0x4 * i), 127828c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, XBAR_SRC_HSI); 127928c10f9eSGabriel Fernandez } 128028c10f9eSGabriel Fernandez 128128c10f9eSGabriel Fernandez static int stm32mp2_a35_pll1_start(void) 128228c10f9eSGabriel Fernandez { 128328c10f9eSGabriel Fernandez uint64_t timeout = 0; 128428c10f9eSGabriel Fernandez 128528c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 128628c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_PD_EN, 128728c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_PD_EN); 128828c10f9eSGabriel Fernandez 128928c10f9eSGabriel Fernandez /* Wait PLL lock */ 129028c10f9eSGabriel Fernandez timeout = timeout_init_us(PLLRDY_TIMEOUT); 129128c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 129228c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_PLL_EN) & 129328c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_LOCKP_MASK) 129428c10f9eSGabriel Fernandez break; 129528c10f9eSGabriel Fernandez 129628c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_PLL_EN) & 129728c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_LOCKP_MASK)) { 129828c10f9eSGabriel Fernandez EMSG("PLL1 not locked"); 129928c10f9eSGabriel Fernandez return -1; 130028c10f9eSGabriel Fernandez } 130128c10f9eSGabriel Fernandez 130228c10f9eSGabriel Fernandez /* De-assert reset on PLL output clock path */ 130328c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 130428c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_EN, 130528c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK); 130628c10f9eSGabriel Fernandez 130728c10f9eSGabriel Fernandez /* Switch CPU clock to PLL clock */ 130828c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 130928c10f9eSGabriel Fernandez 0, 131028c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK); 131128c10f9eSGabriel Fernandez 131228c10f9eSGabriel Fernandez /* Wait for clock change acknowledge */ 131328c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 131428c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 131528c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 131628c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)) 131728c10f9eSGabriel Fernandez break; 131828c10f9eSGabriel Fernandez 131928c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 132028c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) { 132128c10f9eSGabriel Fernandez EMSG("A35 switch to PLL1 failed"); 132228c10f9eSGabriel Fernandez return -1; 132328c10f9eSGabriel Fernandez } 132428c10f9eSGabriel Fernandez 132528c10f9eSGabriel Fernandez return 0; 132628c10f9eSGabriel Fernandez } 132728c10f9eSGabriel Fernandez 132828c10f9eSGabriel Fernandez static void stm32mp2_a35_pll1_config(uint32_t fbdiv, uint32_t refdiv, 132928c10f9eSGabriel Fernandez uint32_t postdiv1, uint32_t postdiv2) 133028c10f9eSGabriel Fernandez { 133128c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ1, 133228c10f9eSGabriel Fernandez SHIFT_U32(refdiv, 133328c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT) | 133428c10f9eSGabriel Fernandez SHIFT_U32(fbdiv, A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT), 133528c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_MASK); 133628c10f9eSGabriel Fernandez 133728c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ2, 133828c10f9eSGabriel Fernandez SHIFT_U32(postdiv1, 133928c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT) | 134028c10f9eSGabriel Fernandez SHIFT_U32(postdiv2, 134128c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT), 134228c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_MASK); 134328c10f9eSGabriel Fernandez } 134428c10f9eSGabriel Fernandez 134528c10f9eSGabriel Fernandez static void clk_stm32_pll_config_output(struct clk_stm32_priv *priv, 134628c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll, 134728c10f9eSGabriel Fernandez uint32_t pllsrc, 134828c10f9eSGabriel Fernandez uint32_t *pllcfg, 134928c10f9eSGabriel Fernandez uint32_t fracv) 135028c10f9eSGabriel Fernandez { 135128c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 135228c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2; 135328c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 135428c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 135528c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6; 135628c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7; 135728c10f9eSGabriel Fernandez int sel = (pllsrc & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 135828c10f9eSGabriel Fernandez unsigned long refclk = clk_stm32_pll_get_oscillator_rate(sel); 135928c10f9eSGabriel Fernandez 136028c10f9eSGabriel Fernandez if (fracv == 0) { 136128c10f9eSGabriel Fernandez /* PLL in integer mode */ 136228c10f9eSGabriel Fernandez 136328c10f9eSGabriel Fernandez /* 136428c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks 136528c10f9eSGabriel Fernandez * will always be less than 1.2GHz 136628c10f9eSGabriel Fernandez */ 136728c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN) 136828c10f9eSGabriel Fernandez panic(); 136928c10f9eSGabriel Fernandez 137028c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK); 137128c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 137228c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN); 137328c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 137428c10f9eSGabriel Fernandez io_setbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST); 137528c10f9eSGabriel Fernandez } else { 137628c10f9eSGabriel Fernandez /* PLL in frac mode */ 137728c10f9eSGabriel Fernandez 137828c10f9eSGabriel Fernandez /* 137928c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks 138028c10f9eSGabriel Fernandez * will always be less than 1.2GHz 138128c10f9eSGabriel Fernandez */ 138228c10f9eSGabriel Fernandez if (refclk < PLL_FRAC_REFCLK_MIN) 138328c10f9eSGabriel Fernandez panic(); 138428c10f9eSGabriel Fernandez 138528c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK, 138628c10f9eSGabriel Fernandez fracv & RCC_PLLxCFGR3_FRACIN_MASK); 138728c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 138828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 138928c10f9eSGabriel Fernandez } 139028c10f9eSGabriel Fernandez 139128c10f9eSGabriel Fernandez assert(pllcfg[REFDIV]); 139228c10f9eSGabriel Fernandez 139328c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FBDIV_MASK, 139428c10f9eSGabriel Fernandez SHIFT_U32(pllcfg[FBDIV], RCC_PLLxCFGR2_FBDIV_SHIFT) & 139528c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_MASK); 139628c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FREFDIV_MASK, 139728c10f9eSGabriel Fernandez pllcfg[REFDIV] & RCC_PLLxCFGR2_FREFDIV_MASK); 139828c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr6, RCC_PLLxCFGR6_POSTDIV1_MASK, 139928c10f9eSGabriel Fernandez pllcfg[POSTDIV1] & RCC_PLLxCFGR6_POSTDIV1_MASK); 140028c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr7, RCC_PLLxCFGR7_POSTDIV2_MASK, 140128c10f9eSGabriel Fernandez pllcfg[POSTDIV2] & RCC_PLLxCFGR7_POSTDIV2_MASK); 140228c10f9eSGabriel Fernandez 140328c10f9eSGabriel Fernandez if (pllcfg[POSTDIV1] == 0 || pllcfg[POSTDIV2] == 0) { 140428c10f9eSGabriel Fernandez /* Bypass mode */ 140528c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS); 140628c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN); 140728c10f9eSGabriel Fernandez } else { 140828c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS); 140928c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN); 141028c10f9eSGabriel Fernandez } 141128c10f9eSGabriel Fernandez } 141228c10f9eSGabriel Fernandez 141328c10f9eSGabriel Fernandez static void clk_stm32_pll_config_csg(struct clk_stm32_priv *priv, 141428c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll, 141528c10f9eSGabriel Fernandez uint32_t *csg) 141628c10f9eSGabriel Fernandez { 141728c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 141828c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 141928c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 142028c10f9eSGabriel Fernandez uintptr_t pllxcfgr5 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR5; 142128c10f9eSGabriel Fernandez 142228c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_DIVVAL_MASK, 142328c10f9eSGabriel Fernandez csg[DIVVAL] & RCC_PLLxCFGR5_DIVVAL_MASK); 142428c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_SPREAD_MASK, 142528c10f9eSGabriel Fernandez SHIFT_U32(csg[SPREAD], RCC_PLLxCFGR5_SPREAD_SHIFT) & 142628c10f9eSGabriel Fernandez RCC_PLLxCFGR5_SPREAD_MASK); 142728c10f9eSGabriel Fernandez 142828c10f9eSGabriel Fernandez if (csg[DOWNSPREAD] != 0) 142928c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD); 143028c10f9eSGabriel Fernandez else 143128c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD); 143228c10f9eSGabriel Fernandez 143328c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 143428c10f9eSGabriel Fernandez 143528c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_PLLEN); 143628c10f9eSGabriel Fernandez udelay(1); 143728c10f9eSGabriel Fernandez 143828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 143928c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN); 144028c10f9eSGabriel Fernandez } 144128c10f9eSGabriel Fernandez 144228c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(unsigned int pll_idx) 144328c10f9eSGabriel Fernandez { 144428c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 144528c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 144628c10f9eSGabriel Fernandez 144728c10f9eSGabriel Fernandez assert(pll_idx < pdata->npll); 144828c10f9eSGabriel Fernandez 144928c10f9eSGabriel Fernandez return &pdata->pll[pll_idx]; 145028c10f9eSGabriel Fernandez } 145128c10f9eSGabriel Fernandez 145228c10f9eSGabriel Fernandez static int clk_stm32_pll_set_mux(struct clk_stm32_priv *priv __unused, 145328c10f9eSGabriel Fernandez uint32_t src) 145428c10f9eSGabriel Fernandez { 145528c10f9eSGabriel Fernandez int mux = (src & MUX_ID_MASK) >> MUX_ID_SHIFT; 145628c10f9eSGabriel Fernandez int sel = (src & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 145728c10f9eSGabriel Fernandez 145828c10f9eSGabriel Fernandez return stm32_mux_set_parent(mux, sel); 145928c10f9eSGabriel Fernandez } 146028c10f9eSGabriel Fernandez 146128c10f9eSGabriel Fernandez static void clk_stm32_pll1_init(struct clk_stm32_priv *priv, 146228c10f9eSGabriel Fernandez int pll_idx __unused, 146328c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf) 146428c10f9eSGabriel Fernandez { 146528c10f9eSGabriel Fernandez int sel = (pll_conf->src & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 146628c10f9eSGabriel Fernandez unsigned long refclk = 0; 146728c10f9eSGabriel Fernandez 146828c10f9eSGabriel Fernandez /* 146928c10f9eSGabriel Fernandez * TODO: check if pll has already good parameters or if we could make 147028c10f9eSGabriel Fernandez * a configuration on the fly. 147128c10f9eSGabriel Fernandez */ 147228c10f9eSGabriel Fernandez 147328c10f9eSGabriel Fernandez stm32mp2_a35_ss_on_hsi(); 147428c10f9eSGabriel Fernandez 147528c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src)) 147628c10f9eSGabriel Fernandez panic(); 147728c10f9eSGabriel Fernandez 147828c10f9eSGabriel Fernandez refclk = clk_stm32_pll_get_oscillator_rate(sel); 147928c10f9eSGabriel Fernandez 148028c10f9eSGabriel Fernandez /* 148128c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks will 148228c10f9eSGabriel Fernandez * always be less than 1.2GHz 148328c10f9eSGabriel Fernandez */ 148428c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN) 148528c10f9eSGabriel Fernandez panic(); 148628c10f9eSGabriel Fernandez 148728c10f9eSGabriel Fernandez stm32mp2_a35_pll1_config(pll_conf->cfg[FBDIV], 148828c10f9eSGabriel Fernandez pll_conf->cfg[REFDIV], 148928c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV1], 149028c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV2]); 149128c10f9eSGabriel Fernandez 149228c10f9eSGabriel Fernandez if (stm32mp2_a35_pll1_start()) 149328c10f9eSGabriel Fernandez panic(); 149428c10f9eSGabriel Fernandez } 149528c10f9eSGabriel Fernandez 149628c10f9eSGabriel Fernandez static void clk_stm32_pll_init(struct clk_stm32_priv *priv, int pll_idx, 149728c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf) 149828c10f9eSGabriel Fernandez { 149928c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll = clk_stm32_pll_data(pll_idx); 150028c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 150128c10f9eSGabriel Fernandez bool spread_spectrum = false; 150228c10f9eSGabriel Fernandez 150328c10f9eSGabriel Fernandez /* 150428c10f9eSGabriel Fernandez * TODO: check if pll has already good parameters or if we could make 150528c10f9eSGabriel Fernandez * a configuration on the fly. 150628c10f9eSGabriel Fernandez */ 150728c10f9eSGabriel Fernandez 1508*2604f62dSEtienne Carriere if (stm32_gate_rdy_disable(pll->gate_id)) 1509*2604f62dSEtienne Carriere panic(); 151028c10f9eSGabriel Fernandez 151128c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src)) 151228c10f9eSGabriel Fernandez panic(); 151328c10f9eSGabriel Fernandez 151428c10f9eSGabriel Fernandez clk_stm32_pll_config_output(priv, pll, pll_conf->src, 151528c10f9eSGabriel Fernandez pll_conf->cfg, pll_conf->frac); 151628c10f9eSGabriel Fernandez 151728c10f9eSGabriel Fernandez if (pll_conf->csg_enabled) { 151828c10f9eSGabriel Fernandez clk_stm32_pll_config_csg(priv, pll, pll_conf->csg); 151928c10f9eSGabriel Fernandez spread_spectrum = true; 152028c10f9eSGabriel Fernandez } 152128c10f9eSGabriel Fernandez 1522*2604f62dSEtienne Carriere if (stm32_gate_rdy_enable(pll->gate_id)) 1523*2604f62dSEtienne Carriere panic(); 152428c10f9eSGabriel Fernandez 152528c10f9eSGabriel Fernandez if (spread_spectrum) 152628c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST); 152728c10f9eSGabriel Fernandez } 152828c10f9eSGabriel Fernandez 152928c10f9eSGabriel Fernandez static int stm32_clk_pll_configure(struct clk_stm32_priv *priv) 153028c10f9eSGabriel Fernandez { 153128c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL; 153228c10f9eSGabriel Fernandez size_t i = 0; 153328c10f9eSGabriel Fernandez 153428c10f9eSGabriel Fernandez for (i = 0; i < PLL_NB; i++) { 153528c10f9eSGabriel Fernandez pll_conf = clk_stm32_pll_get_pdata(i); 153628c10f9eSGabriel Fernandez 153728c10f9eSGabriel Fernandez if (pll_conf->enabled) { 153828c10f9eSGabriel Fernandez /* Skip the pll3 (need GPU regulator to configure) */ 153928c10f9eSGabriel Fernandez if (i == PLL3_ID) 154028c10f9eSGabriel Fernandez continue; 154128c10f9eSGabriel Fernandez 154228c10f9eSGabriel Fernandez /* Skip the pll2 (reserved to DDR) */ 154328c10f9eSGabriel Fernandez if (i == PLL2_ID) 154428c10f9eSGabriel Fernandez continue; 154528c10f9eSGabriel Fernandez 154628c10f9eSGabriel Fernandez if (i == PLL1_ID) 154728c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, i, pll_conf); 154828c10f9eSGabriel Fernandez else 154928c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, i, pll_conf); 155028c10f9eSGabriel Fernandez } 155128c10f9eSGabriel Fernandez } 155228c10f9eSGabriel Fernandez 155328c10f9eSGabriel Fernandez return 0; 155428c10f9eSGabriel Fernandez } 155528c10f9eSGabriel Fernandez 155628c10f9eSGabriel Fernandez #define __WORD_BIT 32 155728c10f9eSGabriel Fernandez 155828c10f9eSGabriel Fernandez static int wait_predivsr(uint16_t channel) 155928c10f9eSGabriel Fernandez { 156028c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 156128c10f9eSGabriel Fernandez uintptr_t previvsr = 0; 156228c10f9eSGabriel Fernandez uint32_t channel_bit = 0; 156328c10f9eSGabriel Fernandez uint32_t value = 0; 156428c10f9eSGabriel Fernandez 156528c10f9eSGabriel Fernandez if (channel < __WORD_BIT) { 156628c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR1; 156728c10f9eSGabriel Fernandez channel_bit = BIT(channel); 156828c10f9eSGabriel Fernandez } else { 156928c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR2; 157028c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT); 157128c10f9eSGabriel Fernandez } 157228c10f9eSGabriel Fernandez 157328c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(previvsr, value, !(value & channel_bit), 0, 157428c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 157528c10f9eSGabriel Fernandez EMSG("Pre divider status: %#"PRIx32, io_read32(previvsr)); 157628c10f9eSGabriel Fernandez return -1; 157728c10f9eSGabriel Fernandez } 157828c10f9eSGabriel Fernandez 157928c10f9eSGabriel Fernandez return 0; 158028c10f9eSGabriel Fernandez } 158128c10f9eSGabriel Fernandez 158228c10f9eSGabriel Fernandez static int wait_findivsr(uint16_t channel) 158328c10f9eSGabriel Fernandez { 158428c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 158528c10f9eSGabriel Fernandez uintptr_t finvivsr = 0; 158628c10f9eSGabriel Fernandez uint32_t channel_bit = 0; 158728c10f9eSGabriel Fernandez uint32_t value = 0; 158828c10f9eSGabriel Fernandez 158928c10f9eSGabriel Fernandez if (channel < __WORD_BIT) { 159028c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR1; 159128c10f9eSGabriel Fernandez channel_bit = BIT(channel); 159228c10f9eSGabriel Fernandez } else { 159328c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR2; 159428c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT); 159528c10f9eSGabriel Fernandez } 159628c10f9eSGabriel Fernandez 159728c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(finvivsr, value, !(value & channel_bit), 0, 159828c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 159928c10f9eSGabriel Fernandez EMSG("Final divider status: %#"PRIx32, io_read32(finvivsr)); 160028c10f9eSGabriel Fernandez return -1; 160128c10f9eSGabriel Fernandez } 160228c10f9eSGabriel Fernandez 160328c10f9eSGabriel Fernandez return 0; 160428c10f9eSGabriel Fernandez } 160528c10f9eSGabriel Fernandez 160628c10f9eSGabriel Fernandez static int wait_xbar_sts(uint16_t channel) 160728c10f9eSGabriel Fernandez { 160828c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 160928c10f9eSGabriel Fernandez uintptr_t xbar_cfgr = rcc_base + RCC_XBAR0CFGR + (0x4 * channel); 161028c10f9eSGabriel Fernandez uint32_t value = 0; 161128c10f9eSGabriel Fernandez 161228c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(xbar_cfgr, value, 161328c10f9eSGabriel Fernandez !(value & RCC_XBAR0CFGR_XBAR0STS), 0, 161428c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 161528c10f9eSGabriel Fernandez EMSG("XBAR%"PRIu16"CFGR: %#"PRIx32, channel, 161628c10f9eSGabriel Fernandez io_read32(xbar_cfgr)); 161728c10f9eSGabriel Fernandez return -1; 161828c10f9eSGabriel Fernandez } 161928c10f9eSGabriel Fernandez 162028c10f9eSGabriel Fernandez return 0; 162128c10f9eSGabriel Fernandez } 162228c10f9eSGabriel Fernandez 162328c10f9eSGabriel Fernandez static void flexclkgen_config_channel(uint16_t channel, unsigned int clk_src, 162428c10f9eSGabriel Fernandez unsigned int prediv, unsigned int findiv) 162528c10f9eSGabriel Fernandez { 162628c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 162728c10f9eSGabriel Fernandez 162828c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 162928c10f9eSGabriel Fernandez panic(); 163028c10f9eSGabriel Fernandez 163128c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel), 163228c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, prediv); 163328c10f9eSGabriel Fernandez 163428c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 163528c10f9eSGabriel Fernandez panic(); 163628c10f9eSGabriel Fernandez 163728c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 163828c10f9eSGabriel Fernandez panic(); 163928c10f9eSGabriel Fernandez 164028c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 164128c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK, 164228c10f9eSGabriel Fernandez findiv); 164328c10f9eSGabriel Fernandez 164428c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 164528c10f9eSGabriel Fernandez panic(); 164628c10f9eSGabriel Fernandez 164728c10f9eSGabriel Fernandez if (wait_xbar_sts(channel) != 0) 164828c10f9eSGabriel Fernandez panic(); 164928c10f9eSGabriel Fernandez 165028c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel), 165128c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, 165228c10f9eSGabriel Fernandez clk_src); 165328c10f9eSGabriel Fernandez 165428c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel), 165528c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0EN); 165628c10f9eSGabriel Fernandez 165728c10f9eSGabriel Fernandez if (wait_xbar_sts(channel) != 0) 165828c10f9eSGabriel Fernandez panic(); 165928c10f9eSGabriel Fernandez } 166028c10f9eSGabriel Fernandez 166128c10f9eSGabriel Fernandez static int stm32mp2_clk_flexgen_configure(struct clk_stm32_priv *priv) 166228c10f9eSGabriel Fernandez { 166328c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 166428c10f9eSGabriel Fernandez uint32_t i = 0; 166528c10f9eSGabriel Fernandez 166628c10f9eSGabriel Fernandez for (i = 0; i < pdata->nflexgen; i++) { 166728c10f9eSGabriel Fernandez uint32_t val = pdata->flexgen[i]; 166828c10f9eSGabriel Fernandez uint32_t cmd = 0; 166928c10f9eSGabriel Fernandez uint32_t cmd_data = 0; 167028c10f9eSGabriel Fernandez unsigned int channel = 0; 167128c10f9eSGabriel Fernandez unsigned int clk_src = 0; 167228c10f9eSGabriel Fernandez unsigned int pdiv = 0; 167328c10f9eSGabriel Fernandez unsigned int fdiv = 0; 167428c10f9eSGabriel Fernandez 167528c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT; 167628c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK; 167728c10f9eSGabriel Fernandez 167828c10f9eSGabriel Fernandez if (cmd != CMD_FLEXGEN) 167928c10f9eSGabriel Fernandez continue; 168028c10f9eSGabriel Fernandez 168128c10f9eSGabriel Fernandez channel = (cmd_data & FLEX_ID_MASK) >> FLEX_ID_SHIFT; 168228c10f9eSGabriel Fernandez 168328c10f9eSGabriel Fernandez /* 168428c10f9eSGabriel Fernandez * Skip ck_ker_stgen configuration, will be done by 168528c10f9eSGabriel Fernandez * stgen driver. 168628c10f9eSGabriel Fernandez */ 168728c10f9eSGabriel Fernandez if (channel == FLEX_STGEN) 168828c10f9eSGabriel Fernandez continue; 168928c10f9eSGabriel Fernandez 169028c10f9eSGabriel Fernandez clk_src = (cmd_data & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT; 169128c10f9eSGabriel Fernandez pdiv = (cmd_data & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT; 169228c10f9eSGabriel Fernandez fdiv = (cmd_data & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT; 169328c10f9eSGabriel Fernandez 169428c10f9eSGabriel Fernandez flexclkgen_config_channel(channel, clk_src, pdiv, fdiv); 169528c10f9eSGabriel Fernandez } 169628c10f9eSGabriel Fernandez 169728c10f9eSGabriel Fernandez return 0; 169828c10f9eSGabriel Fernandez } 169928c10f9eSGabriel Fernandez 170028c10f9eSGabriel Fernandez static int stm32_clk_configure_div(struct clk_stm32_priv *priv __unused, 170128c10f9eSGabriel Fernandez uint32_t data) 170228c10f9eSGabriel Fernandez { 170328c10f9eSGabriel Fernandez uint32_t div_id = 0; 170428c10f9eSGabriel Fernandez uint32_t div_n = 0; 170528c10f9eSGabriel Fernandez 170628c10f9eSGabriel Fernandez div_id = (data & DIV_ID_MASK) >> DIV_ID_SHIFT; 170728c10f9eSGabriel Fernandez div_n = (data & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT; 170828c10f9eSGabriel Fernandez 170928c10f9eSGabriel Fernandez return stm32_div_set_value(div_id, div_n); 171028c10f9eSGabriel Fernandez } 171128c10f9eSGabriel Fernandez 171228c10f9eSGabriel Fernandez static int stm32_clk_configure_mux(struct clk_stm32_priv *priv __unused, 171328c10f9eSGabriel Fernandez uint32_t data) 171428c10f9eSGabriel Fernandez { 171528c10f9eSGabriel Fernandez int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT; 171628c10f9eSGabriel Fernandez int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 171728c10f9eSGabriel Fernandez 171828c10f9eSGabriel Fernandez return stm32_mux_set_parent(mux, sel); 171928c10f9eSGabriel Fernandez } 172028c10f9eSGabriel Fernandez 172128c10f9eSGabriel Fernandez static int stm32_clk_configure_by_addr_val(struct clk_stm32_priv *priv, 172228c10f9eSGabriel Fernandez uint32_t data) 172328c10f9eSGabriel Fernandez { 172428c10f9eSGabriel Fernandez uint32_t addr = data >> CLK_ADDR_SHIFT; 172528c10f9eSGabriel Fernandez uint32_t val = data & CLK_ADDR_VAL_MASK; 172628c10f9eSGabriel Fernandez 172728c10f9eSGabriel Fernandez io_setbits32(priv->base + addr, val); 172828c10f9eSGabriel Fernandez 172928c10f9eSGabriel Fernandez return 0; 173028c10f9eSGabriel Fernandez } 173128c10f9eSGabriel Fernandez 173228c10f9eSGabriel Fernandez static void stm32_clk_configure_obs(struct clk_stm32_priv *priv, 173328c10f9eSGabriel Fernandez uint32_t data) 173428c10f9eSGabriel Fernandez { 173528c10f9eSGabriel Fernandez uint32_t id = (data & OBS_ID_MASK) >> OBS_ID_SHIFT; 173628c10f9eSGabriel Fernandez uint32_t status = (data & OBS_STATUS_MASK) >> OBS_STATUS_SHIFT; 173728c10f9eSGabriel Fernandez uint32_t int_ext = (data & OBS_INTEXT_MASK) >> OBS_INTEXT_SHIFT; 173828c10f9eSGabriel Fernandez uint32_t div = (data & OBS_DIV_MASK) >> OBS_DIV_SHIFT; 173928c10f9eSGabriel Fernandez uint32_t inv = (data & OBS_INV_MASK) >> OBS_INV_SHIFT; 174028c10f9eSGabriel Fernandez uint32_t sel = (data & OBS_SEL_MASK) >> OBS_SEL_SHIFT; 174128c10f9eSGabriel Fernandez uint32_t reg = 0; 174228c10f9eSGabriel Fernandez uint32_t val = 0; 174328c10f9eSGabriel Fernandez 174428c10f9eSGabriel Fernandez if (!id) 174528c10f9eSGabriel Fernandez reg = RCC_FCALCOBS0CFGR; 174628c10f9eSGabriel Fernandez else 174728c10f9eSGabriel Fernandez reg = RCC_FCALCOBS1CFGR; 174828c10f9eSGabriel Fernandez 174928c10f9eSGabriel Fernandez if (status) 175028c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEN; 175128c10f9eSGabriel Fernandez 175228c10f9eSGabriel Fernandez if (int_ext == OBS_EXT) { 175328c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEXTSEL; 175428c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKEXTSEL_SHIFT); 175528c10f9eSGabriel Fernandez } else { 175628c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKINTSEL_SHIFT); 175728c10f9eSGabriel Fernandez } 175828c10f9eSGabriel Fernandez 175928c10f9eSGabriel Fernandez if (inv) 176028c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSINV; 176128c10f9eSGabriel Fernandez 176228c10f9eSGabriel Fernandez val |= SHIFT_U32(div, RCC_FCALCOBS0CFGR_CKOBSDIV_SHIFT); 176328c10f9eSGabriel Fernandez 176428c10f9eSGabriel Fernandez io_write32(priv->base + reg, val); 176528c10f9eSGabriel Fernandez } 176628c10f9eSGabriel Fernandez 176728c10f9eSGabriel Fernandez static int stm32_clk_configure(struct clk_stm32_priv *priv, uint32_t val) 176828c10f9eSGabriel Fernandez { 176928c10f9eSGabriel Fernandez uint32_t cmd_data = 0; 177028c10f9eSGabriel Fernandez uint32_t cmd = 0; 177128c10f9eSGabriel Fernandez int ret = 0; 177228c10f9eSGabriel Fernandez 177328c10f9eSGabriel Fernandez if (val & CMD_ADDR_BIT) { 177428c10f9eSGabriel Fernandez cmd_data = val & ~CMD_ADDR_BIT; 177528c10f9eSGabriel Fernandez 177628c10f9eSGabriel Fernandez return stm32_clk_configure_by_addr_val(priv, cmd_data); 177728c10f9eSGabriel Fernandez } 177828c10f9eSGabriel Fernandez 177928c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT; 178028c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK; 178128c10f9eSGabriel Fernandez 178228c10f9eSGabriel Fernandez switch (cmd) { 178328c10f9eSGabriel Fernandez case CMD_DIV: 178428c10f9eSGabriel Fernandez ret = stm32_clk_configure_div(priv, cmd_data); 178528c10f9eSGabriel Fernandez break; 178628c10f9eSGabriel Fernandez 178728c10f9eSGabriel Fernandez case CMD_MUX: 178828c10f9eSGabriel Fernandez ret = stm32_clk_configure_mux(priv, cmd_data); 178928c10f9eSGabriel Fernandez break; 179028c10f9eSGabriel Fernandez 179128c10f9eSGabriel Fernandez case CMD_OBS: 179228c10f9eSGabriel Fernandez stm32_clk_configure_obs(priv, cmd_data); 179328c10f9eSGabriel Fernandez break; 179428c10f9eSGabriel Fernandez 179528c10f9eSGabriel Fernandez default: 179628c10f9eSGabriel Fernandez EMSG("cmd unknown ! : %#"PRIx32, val); 179728c10f9eSGabriel Fernandez ret = -1; 179828c10f9eSGabriel Fernandez } 179928c10f9eSGabriel Fernandez 180028c10f9eSGabriel Fernandez return ret; 180128c10f9eSGabriel Fernandez } 180228c10f9eSGabriel Fernandez 180328c10f9eSGabriel Fernandez static int stm32_clk_bus_configure(struct clk_stm32_priv *priv) 180428c10f9eSGabriel Fernandez { 180528c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 180628c10f9eSGabriel Fernandez uint32_t i = 0; 180728c10f9eSGabriel Fernandez 180828c10f9eSGabriel Fernandez for (i = 0; i < pdata->nbusclk; i++) { 180928c10f9eSGabriel Fernandez int ret = 0; 181028c10f9eSGabriel Fernandez 181128c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->busclk[i]); 181228c10f9eSGabriel Fernandez if (ret != 0) 181328c10f9eSGabriel Fernandez return ret; 181428c10f9eSGabriel Fernandez } 181528c10f9eSGabriel Fernandez 181628c10f9eSGabriel Fernandez return 0; 181728c10f9eSGabriel Fernandez } 181828c10f9eSGabriel Fernandez 181928c10f9eSGabriel Fernandez static int stm32_clk_kernel_configure(struct clk_stm32_priv *priv) 182028c10f9eSGabriel Fernandez { 182128c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 182228c10f9eSGabriel Fernandez uint32_t i = 0; 182328c10f9eSGabriel Fernandez 182428c10f9eSGabriel Fernandez for (i = 0; i < pdata->nkernelclk; i++) { 182528c10f9eSGabriel Fernandez int ret = 0; 182628c10f9eSGabriel Fernandez 182728c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->kernelclk[i]); 182828c10f9eSGabriel Fernandez if (ret != 0) 182928c10f9eSGabriel Fernandez return ret; 183028c10f9eSGabriel Fernandez } 183128c10f9eSGabriel Fernandez 183228c10f9eSGabriel Fernandez return 0; 183328c10f9eSGabriel Fernandez } 183428c10f9eSGabriel Fernandez 183528c10f9eSGabriel Fernandez static void stm32mp2_init_clock_tree(struct clk_stm32_priv *priv, 183628c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 183728c10f9eSGabriel Fernandez { 183828c10f9eSGabriel Fernandez stm32_clk_oscillators_enable(priv, pdata); 183928c10f9eSGabriel Fernandez 184028c10f9eSGabriel Fernandez /* Come back to HSI for flexgen */ 184128c10f9eSGabriel Fernandez stm32mp2_clk_xbar_on_hsi(priv); 184228c10f9eSGabriel Fernandez 184328c10f9eSGabriel Fernandez if (stm32_clk_pll_configure(priv)) 184428c10f9eSGabriel Fernandez panic("Cannot configure plls"); 184528c10f9eSGabriel Fernandez 184628c10f9eSGabriel Fernandez /* Wait LSE ready before to use it */ 184728c10f9eSGabriel Fernandez if (stm32_clk_oscillators_wait_lse_ready(priv, pdata)) 184828c10f9eSGabriel Fernandez panic("Timeout: to enable LSE"); 184928c10f9eSGabriel Fernandez 185028c10f9eSGabriel Fernandez if (stm32mp2_clk_flexgen_configure(priv)) 185128c10f9eSGabriel Fernandez panic("Cannot configure flexgen"); 185228c10f9eSGabriel Fernandez 185328c10f9eSGabriel Fernandez if (stm32_clk_bus_configure(priv)) 185428c10f9eSGabriel Fernandez panic("Cannot config bus clocks"); 185528c10f9eSGabriel Fernandez 185628c10f9eSGabriel Fernandez if (stm32_clk_kernel_configure(priv)) 185728c10f9eSGabriel Fernandez panic("Cannot configure kernel clocks"); 185828c10f9eSGabriel Fernandez 185928c10f9eSGabriel Fernandez /* Configure LSE css after RTC source configuration */ 186028c10f9eSGabriel Fernandez stm32_clk_oscillators_lse_set_css(priv, pdata); 186128c10f9eSGabriel Fernandez } 186228c10f9eSGabriel Fernandez 186328c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_enable(struct clk *clk) 186428c10f9eSGabriel Fernandez { 186528c10f9eSGabriel Fernandez return clk_stm32_gate_ready_ops.enable(clk); 186628c10f9eSGabriel Fernandez } 186728c10f9eSGabriel Fernandez 186828c10f9eSGabriel Fernandez static void clk_stm32_osc_disable(struct clk *clk) 186928c10f9eSGabriel Fernandez { 187028c10f9eSGabriel Fernandez clk_stm32_gate_ready_ops.disable(clk); 187128c10f9eSGabriel Fernandez } 187228c10f9eSGabriel Fernandez 187328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_osc_ops = { 187428c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable, 187528c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable, 187628c10f9eSGabriel Fernandez }; 187728c10f9eSGabriel Fernandez 187828c10f9eSGabriel Fernandez static unsigned long clk_stm32_msi_get_rate(struct clk *clk __unused, 187928c10f9eSGabriel Fernandez unsigned long prate __unused) 188028c10f9eSGabriel Fernandez { 188128c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 188228c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR; 188328c10f9eSGabriel Fernandez 188428c10f9eSGabriel Fernandez if ((io_read32(address) & RCC_BDCR_MSIFREQSEL)) 188528c10f9eSGabriel Fernandez return RCC_16_MHZ; 188628c10f9eSGabriel Fernandez 188728c10f9eSGabriel Fernandez return RCC_4_MHZ; 188828c10f9eSGabriel Fernandez } 188928c10f9eSGabriel Fernandez 189028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_msi_set_rate(struct clk *clk __unused, 189128c10f9eSGabriel Fernandez unsigned long rate, 189228c10f9eSGabriel Fernandez unsigned long prate __unused) 189328c10f9eSGabriel Fernandez { 189428c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 189528c10f9eSGabriel Fernandez 189628c10f9eSGabriel Fernandez return clk_stm32_osc_msi_set_rate(priv, rate); 189728c10f9eSGabriel Fernandez } 189828c10f9eSGabriel Fernandez 189928c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_oscillator_msi_ops = { 190028c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable, 190128c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable, 190228c10f9eSGabriel Fernandez .get_rate = clk_stm32_msi_get_rate, 190328c10f9eSGabriel Fernandez .set_rate = clk_stm32_msi_set_rate, 190428c10f9eSGabriel Fernandez }; 190528c10f9eSGabriel Fernandez 190628c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hse_div_set_rate(struct clk *clk, 190728c10f9eSGabriel Fernandez unsigned long rate, 190828c10f9eSGabriel Fernandez unsigned long parent_rate) 190928c10f9eSGabriel Fernandez { 191028c10f9eSGabriel Fernandez return clk_stm32_divider_set_rate(clk, rate, parent_rate); 191128c10f9eSGabriel Fernandez } 191228c10f9eSGabriel Fernandez 191328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_hse_div_ops = { 191428c10f9eSGabriel Fernandez .get_rate = clk_stm32_divider_get_rate, 191528c10f9eSGabriel Fernandez .set_rate = clk_stm32_hse_div_set_rate, 191628c10f9eSGabriel Fernandez }; 191728c10f9eSGabriel Fernandez 191828c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hsediv2_enable(struct clk *clk) 191928c10f9eSGabriel Fernandez { 192028c10f9eSGabriel Fernandez return clk_stm32_gate_ops.enable(clk); 192128c10f9eSGabriel Fernandez } 192228c10f9eSGabriel Fernandez 192328c10f9eSGabriel Fernandez static void clk_stm32_hsediv2_disable(struct clk *clk) 192428c10f9eSGabriel Fernandez { 192528c10f9eSGabriel Fernandez clk_stm32_gate_ops.disable(clk); 192628c10f9eSGabriel Fernandez } 192728c10f9eSGabriel Fernandez 192828c10f9eSGabriel Fernandez static unsigned long clk_stm32_hsediv2_get_rate(struct clk *clk __unused, 192928c10f9eSGabriel Fernandez unsigned long prate) 193028c10f9eSGabriel Fernandez { 193128c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 193228c10f9eSGabriel Fernandez uintptr_t addr = priv->base + RCC_OCENSETR; 193328c10f9eSGabriel Fernandez 193428c10f9eSGabriel Fernandez if (io_read32(addr) & RCC_OCENSETR_HSEDIV2BYP) 193528c10f9eSGabriel Fernandez return prate; 193628c10f9eSGabriel Fernandez 193728c10f9eSGabriel Fernandez return prate / 2; 193828c10f9eSGabriel Fernandez } 193928c10f9eSGabriel Fernandez 194028c10f9eSGabriel Fernandez static const struct clk_ops clk_hsediv2_ops = { 194128c10f9eSGabriel Fernandez .enable = clk_stm32_hsediv2_enable, 194228c10f9eSGabriel Fernandez .disable = clk_stm32_hsediv2_disable, 194328c10f9eSGabriel Fernandez .get_rate = clk_stm32_hsediv2_get_rate, 194428c10f9eSGabriel Fernandez }; 194528c10f9eSGabriel Fernandez 194628c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg { 194728c10f9eSGabriel Fernandez uint32_t pll_offset; 194828c10f9eSGabriel Fernandez int gate_id; 194928c10f9eSGabriel Fernandez int mux_id; 195028c10f9eSGabriel Fernandez }; 195128c10f9eSGabriel Fernandez 195228c10f9eSGabriel Fernandez static unsigned long clk_get_pll1_fvco_rate(unsigned long refclk) 195328c10f9eSGabriel Fernandez { 195428c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ1); 195528c10f9eSGabriel Fernandez uint32_t fbdiv = 0; 195628c10f9eSGabriel Fernandez uint32_t refdiv = 0; 195728c10f9eSGabriel Fernandez unsigned long freq = 0; 195828c10f9eSGabriel Fernandez 195928c10f9eSGabriel Fernandez fbdiv = (reg & A35SS_SSC_PLL_FREQ1_FBDIV_MASK) >> 196028c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT; 196128c10f9eSGabriel Fernandez 196228c10f9eSGabriel Fernandez refdiv = (reg & A35SS_SSC_PLL_FREQ1_REFDIV_MASK) >> 196328c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT; 196428c10f9eSGabriel Fernandez 196528c10f9eSGabriel Fernandez if (!refdiv || MUL_OVERFLOW(refclk, fbdiv, &freq)) 196628c10f9eSGabriel Fernandez panic(); 196728c10f9eSGabriel Fernandez 196828c10f9eSGabriel Fernandez return freq / refdiv; 196928c10f9eSGabriel Fernandez } 197028c10f9eSGabriel Fernandez 197128c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll1_get_rate(struct clk *clk __unused, 197228c10f9eSGabriel Fernandez unsigned long prate) 197328c10f9eSGabriel Fernandez { 197428c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ2); 197528c10f9eSGabriel Fernandez unsigned long dfout = 0; 197628c10f9eSGabriel Fernandez uint32_t postdiv1 = 0; 197728c10f9eSGabriel Fernandez uint32_t postdiv2 = 0; 197828c10f9eSGabriel Fernandez 197928c10f9eSGabriel Fernandez postdiv1 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV1_MASK) >> 198028c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT; 198128c10f9eSGabriel Fernandez 198228c10f9eSGabriel Fernandez postdiv2 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV2_MASK) >> 198328c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT; 198428c10f9eSGabriel Fernandez 198528c10f9eSGabriel Fernandez if (postdiv1 == 0 || postdiv2 == 0) 198628c10f9eSGabriel Fernandez dfout = prate; 198728c10f9eSGabriel Fernandez else 198828c10f9eSGabriel Fernandez dfout = clk_get_pll1_fvco_rate(prate) / (postdiv1 * postdiv2); 198928c10f9eSGabriel Fernandez 199028c10f9eSGabriel Fernandez return dfout; 199128c10f9eSGabriel Fernandez } 199228c10f9eSGabriel Fernandez 199328c10f9eSGabriel Fernandez static struct stm32_clk_opp_cfg * 199428c10f9eSGabriel Fernandez clk_stm32_get_opp_config(struct stm32_clk_opp_cfg *opp_cfg, unsigned long rate) 199528c10f9eSGabriel Fernandez { 199628c10f9eSGabriel Fernandez unsigned int i = 0; 199728c10f9eSGabriel Fernandez 199828c10f9eSGabriel Fernandez for (i = 0; i < MAX_OPP && opp_cfg->frq; i++, opp_cfg++) 199928c10f9eSGabriel Fernandez if (opp_cfg->frq == rate) 200028c10f9eSGabriel Fernandez return opp_cfg; 200128c10f9eSGabriel Fernandez 200228c10f9eSGabriel Fernandez return NULL; 200328c10f9eSGabriel Fernandez } 200428c10f9eSGabriel Fernandez 200528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll1_set_rate(struct clk *clk __unused, 200628c10f9eSGabriel Fernandez unsigned long rate, 200728c10f9eSGabriel Fernandez unsigned long parent_rate __unused) 200828c10f9eSGabriel Fernandez { 200928c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 201028c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 201128c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL; 201228c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp = NULL; 201328c10f9eSGabriel Fernandez 201428c10f9eSGabriel Fernandez opp = clk_stm32_get_opp_config(pdata->opp->cpu1_opp, rate); 201528c10f9eSGabriel Fernandez if (!opp) 201628c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 201728c10f9eSGabriel Fernandez 201828c10f9eSGabriel Fernandez pll_conf = &opp->pll_cfg; 201928c10f9eSGabriel Fernandez 202028c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, PLL1_ID, pll_conf); 202128c10f9eSGabriel Fernandez 202228c10f9eSGabriel Fernandez return TEE_SUCCESS; 202328c10f9eSGabriel Fernandez } 202428c10f9eSGabriel Fernandez 202528c10f9eSGabriel Fernandez static size_t clk_stm32_pll_get_parent(struct clk *clk) 202628c10f9eSGabriel Fernandez { 202728c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 202828c10f9eSGabriel Fernandez 202928c10f9eSGabriel Fernandez return stm32_mux_get_parent(cfg->mux_id); 203028c10f9eSGabriel Fernandez } 203128c10f9eSGabriel Fernandez 203228c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll1_ops = { 203328c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 203428c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll1_get_rate, 203528c10f9eSGabriel Fernandez .set_rate = clk_stm32_pll1_set_rate, 203628c10f9eSGabriel Fernandez }; 203728c10f9eSGabriel Fernandez 203828c10f9eSGabriel Fernandez static unsigned long clk_get_pll_fvco(uint32_t offset_base, 203928c10f9eSGabriel Fernandez unsigned long prate) 204028c10f9eSGabriel Fernandez { 204128c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 204228c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + offset_base; 204328c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2; 204428c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 204528c10f9eSGabriel Fernandez unsigned long fvco = 0; 204628c10f9eSGabriel Fernandez uint32_t fracin = 0; 204728c10f9eSGabriel Fernandez uint32_t fbdiv = 0; 204828c10f9eSGabriel Fernandez uint32_t refdiv = 0; 204928c10f9eSGabriel Fernandez 205028c10f9eSGabriel Fernandez fracin = io_read32(pllxcfgr3) & RCC_PLLxCFGR3_FRACIN_MASK; 205128c10f9eSGabriel Fernandez fbdiv = (io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FBDIV_MASK) >> 205228c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_SHIFT; 205328c10f9eSGabriel Fernandez 205428c10f9eSGabriel Fernandez refdiv = io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FREFDIV_MASK; 205528c10f9eSGabriel Fernandez 205628c10f9eSGabriel Fernandez assert(refdiv); 205728c10f9eSGabriel Fernandez 205828c10f9eSGabriel Fernandez if (fracin) { 205928c10f9eSGabriel Fernandez unsigned long long numerator = 0; 206028c10f9eSGabriel Fernandez unsigned long long denominator = 0; 206128c10f9eSGabriel Fernandez 206228c10f9eSGabriel Fernandez numerator = SHIFT_U64(fbdiv, 24) + fracin; 206328c10f9eSGabriel Fernandez numerator = prate * numerator; 206428c10f9eSGabriel Fernandez denominator = SHIFT_U64(refdiv, 24); 206528c10f9eSGabriel Fernandez fvco = (unsigned long)(numerator / denominator); 206628c10f9eSGabriel Fernandez } else { 206728c10f9eSGabriel Fernandez fvco = (unsigned long)(prate * fbdiv / refdiv); 206828c10f9eSGabriel Fernandez } 206928c10f9eSGabriel Fernandez 207028c10f9eSGabriel Fernandez return fvco; 207128c10f9eSGabriel Fernandez } 207228c10f9eSGabriel Fernandez 207328c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_rate(struct clk *clk __unused, 207428c10f9eSGabriel Fernandez unsigned long prate) 207528c10f9eSGabriel Fernandez { 207628c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 207728c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 207828c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + cfg->pll_offset; 207928c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 208028c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6; 208128c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7; 208228c10f9eSGabriel Fernandez unsigned long dfout = 0; 208328c10f9eSGabriel Fernandez uint32_t postdiv1 = 0; 208428c10f9eSGabriel Fernandez uint32_t postdiv2 = 0; 208528c10f9eSGabriel Fernandez 208628c10f9eSGabriel Fernandez postdiv1 = io_read32(pllxcfgr6) & RCC_PLLxCFGR6_POSTDIV1_MASK; 208728c10f9eSGabriel Fernandez postdiv2 = io_read32(pllxcfgr7) & RCC_PLLxCFGR7_POSTDIV2_MASK; 208828c10f9eSGabriel Fernandez 208928c10f9eSGabriel Fernandez if ((io_read32(pllxcfgr4) & RCC_PLLxCFGR4_BYPASS) || 209028c10f9eSGabriel Fernandez !postdiv1 || !postdiv2) 209128c10f9eSGabriel Fernandez dfout = prate; 209228c10f9eSGabriel Fernandez else 209328c10f9eSGabriel Fernandez dfout = clk_get_pll_fvco(cfg->pll_offset, 209428c10f9eSGabriel Fernandez prate) / (postdiv1 * postdiv2); 209528c10f9eSGabriel Fernandez 209628c10f9eSGabriel Fernandez return dfout; 209728c10f9eSGabriel Fernandez } 209828c10f9eSGabriel Fernandez 209928c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll_enable(struct clk *clk) 210028c10f9eSGabriel Fernandez { 210128c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 210228c10f9eSGabriel Fernandez 210328c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) { 210428c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 210528c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT; 210628c10f9eSGabriel Fernandez } 210728c10f9eSGabriel Fernandez 210828c10f9eSGabriel Fernandez return TEE_SUCCESS; 210928c10f9eSGabriel Fernandez } 211028c10f9eSGabriel Fernandez 211128c10f9eSGabriel Fernandez static void clk_stm32_pll_disable(struct clk *clk) 211228c10f9eSGabriel Fernandez { 211328c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 211428c10f9eSGabriel Fernandez 211528c10f9eSGabriel Fernandez if (stm32_gate_rdy_disable(cfg->gate_id)) { 211628c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 211728c10f9eSGabriel Fernandez panic(); 211828c10f9eSGabriel Fernandez } 211928c10f9eSGabriel Fernandez } 212028c10f9eSGabriel Fernandez 212128c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll_ops = { 212228c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 212328c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate, 212428c10f9eSGabriel Fernandez .enable = clk_stm32_pll_enable, 212528c10f9eSGabriel Fernandez .disable = clk_stm32_pll_disable, 212628c10f9eSGabriel Fernandez }; 212728c10f9eSGabriel Fernandez 212828c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll3_enable(struct clk *clk) 212928c10f9eSGabriel Fernandez { 213028c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 213128c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 213228c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(PLL3_ID); 213328c10f9eSGabriel Fernandez struct clk *parent = NULL; 213428c10f9eSGabriel Fernandez size_t pidx = 0; 213528c10f9eSGabriel Fernandez 213628c10f9eSGabriel Fernandez /* ck_icn_p_gpu activate */ 213728c10f9eSGabriel Fernandez stm32_gate_enable(GATE_GPU); 213828c10f9eSGabriel Fernandez 213928c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, PLL3_ID, pll_conf); 214028c10f9eSGabriel Fernandez 214128c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) { 214228c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 214328c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT; 214428c10f9eSGabriel Fernandez } 214528c10f9eSGabriel Fernandez 214628c10f9eSGabriel Fernandez /* Update parent */ 214728c10f9eSGabriel Fernandez pidx = clk_stm32_pll_get_parent(clk); 214828c10f9eSGabriel Fernandez parent = clk_get_parent_by_index(clk, pidx); 214928c10f9eSGabriel Fernandez 215028c10f9eSGabriel Fernandez clk->parent = parent; 215128c10f9eSGabriel Fernandez 215228c10f9eSGabriel Fernandez return TEE_SUCCESS; 215328c10f9eSGabriel Fernandez } 215428c10f9eSGabriel Fernandez 215528c10f9eSGabriel Fernandez static void clk_stm32_pll3_disable(struct clk *clk) 215628c10f9eSGabriel Fernandez { 215728c10f9eSGabriel Fernandez clk_stm32_pll_disable(clk); 215828c10f9eSGabriel Fernandez stm32_gate_disable(GATE_GPU); 215928c10f9eSGabriel Fernandez } 216028c10f9eSGabriel Fernandez 216128c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll3_ops = { 216228c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 216328c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate, 216428c10f9eSGabriel Fernandez .enable = clk_stm32_pll3_enable, 216528c10f9eSGabriel Fernandez .disable = clk_stm32_pll3_disable, 216628c10f9eSGabriel Fernandez }; 216728c10f9eSGabriel Fernandez 216828c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg { 216928c10f9eSGabriel Fernandez int flex_id; 217028c10f9eSGabriel Fernandez }; 217128c10f9eSGabriel Fernandez 217228c10f9eSGabriel Fernandez static size_t clk_stm32_flexgen_get_parent(struct clk *clk) 217328c10f9eSGabriel Fernandez { 217428c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 217528c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 217628c10f9eSGabriel Fernandez uint32_t address = 0; 217728c10f9eSGabriel Fernandez 217828c10f9eSGabriel Fernandez address = rcc_base + RCC_XBAR0CFGR + (cfg->flex_id * 4); 217928c10f9eSGabriel Fernandez 218028c10f9eSGabriel Fernandez return io_read32(address) & RCC_XBAR0CFGR_XBAR0SEL_MASK; 218128c10f9eSGabriel Fernandez } 218228c10f9eSGabriel Fernandez 218328c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_parent(struct clk *clk, size_t pidx) 218428c10f9eSGabriel Fernandez { 218528c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 218628c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 218728c10f9eSGabriel Fernandez uint16_t channel = cfg->flex_id * 4; 218828c10f9eSGabriel Fernandez 218928c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (channel), 219028c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, pidx); 219128c10f9eSGabriel Fernandez 219228c10f9eSGabriel Fernandez if (wait_xbar_sts(channel)) 219328c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 219428c10f9eSGabriel Fernandez 219528c10f9eSGabriel Fernandez return TEE_SUCCESS; 219628c10f9eSGabriel Fernandez } 219728c10f9eSGabriel Fernandez 219828c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_rate(struct clk *clk __unused, 219928c10f9eSGabriel Fernandez unsigned long prate) 220028c10f9eSGabriel Fernandez { 220128c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 220228c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 220328c10f9eSGabriel Fernandez uint32_t prediv = 0; 220428c10f9eSGabriel Fernandez uint32_t findiv = 0; 220528c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 220628c10f9eSGabriel Fernandez unsigned long freq = prate; 220728c10f9eSGabriel Fernandez 220828c10f9eSGabriel Fernandez prediv = io_read32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel)) & 220928c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK; 221028c10f9eSGabriel Fernandez findiv = io_read32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel)) & 221128c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK; 221228c10f9eSGabriel Fernandez 221328c10f9eSGabriel Fernandez if (freq == 0) 221428c10f9eSGabriel Fernandez return 0; 221528c10f9eSGabriel Fernandez 221628c10f9eSGabriel Fernandez switch (prediv) { 221728c10f9eSGabriel Fernandez case 0x0: 221828c10f9eSGabriel Fernandez break; 221928c10f9eSGabriel Fernandez 222028c10f9eSGabriel Fernandez case 0x1: 222128c10f9eSGabriel Fernandez freq /= 2; 222228c10f9eSGabriel Fernandez break; 222328c10f9eSGabriel Fernandez 222428c10f9eSGabriel Fernandez case 0x3: 222528c10f9eSGabriel Fernandez freq /= 4; 222628c10f9eSGabriel Fernandez break; 222728c10f9eSGabriel Fernandez 222828c10f9eSGabriel Fernandez case 0x3FF: 222928c10f9eSGabriel Fernandez freq /= 1024; 223028c10f9eSGabriel Fernandez break; 223128c10f9eSGabriel Fernandez 223228c10f9eSGabriel Fernandez default: 223328c10f9eSGabriel Fernandez EMSG("Unsupported PREDIV value (%#"PRIx32")", prediv); 223428c10f9eSGabriel Fernandez panic(); 223528c10f9eSGabriel Fernandez break; 223628c10f9eSGabriel Fernandez } 223728c10f9eSGabriel Fernandez 223828c10f9eSGabriel Fernandez freq /= findiv + 1; 223928c10f9eSGabriel Fernandez 224028c10f9eSGabriel Fernandez return freq; 224128c10f9eSGabriel Fernandez } 224228c10f9eSGabriel Fernandez 224328c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_round_rate(unsigned long rate, 224428c10f9eSGabriel Fernandez unsigned long prate, 224528c10f9eSGabriel Fernandez unsigned int *prediv, 224628c10f9eSGabriel Fernandez unsigned int *findiv) 224728c10f9eSGabriel Fernandez { 224828c10f9eSGabriel Fernandez unsigned int pre_val[] = { 0x0, 0x1, 0x3, 0x3FF }; 224928c10f9eSGabriel Fernandez unsigned int pre_div[] = { 1, 2, 4, 1024 }; 225028c10f9eSGabriel Fernandez long best_diff = LONG_MAX; 225128c10f9eSGabriel Fernandez unsigned int i = 0; 225228c10f9eSGabriel Fernandez 225328c10f9eSGabriel Fernandez *prediv = 0; 225428c10f9eSGabriel Fernandez *findiv = 0; 225528c10f9eSGabriel Fernandez 225628c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(pre_div); i++) { 225728c10f9eSGabriel Fernandez unsigned long freq = 0; 225828c10f9eSGabriel Fernandez unsigned long ratio = 0; 225928c10f9eSGabriel Fernandez long diff = 0L; 226028c10f9eSGabriel Fernandez 226128c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)prate, pre_div[i]); 226228c10f9eSGabriel Fernandez ratio = UDIV_ROUND_NEAREST((uint64_t)freq, rate); 226328c10f9eSGabriel Fernandez 226428c10f9eSGabriel Fernandez if (ratio == 0) 226528c10f9eSGabriel Fernandez ratio = 1; 226628c10f9eSGabriel Fernandez else if (ratio > 64) 226728c10f9eSGabriel Fernandez ratio = 64; 226828c10f9eSGabriel Fernandez 226928c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)freq, ratio); 227028c10f9eSGabriel Fernandez if (freq < rate) 227128c10f9eSGabriel Fernandez diff = rate - freq; 227228c10f9eSGabriel Fernandez else 227328c10f9eSGabriel Fernandez diff = freq - rate; 227428c10f9eSGabriel Fernandez 227528c10f9eSGabriel Fernandez if (diff < best_diff) { 227628c10f9eSGabriel Fernandez best_diff = diff; 227728c10f9eSGabriel Fernandez *prediv = pre_val[i]; 227828c10f9eSGabriel Fernandez *findiv = ratio - 1; 227928c10f9eSGabriel Fernandez 228028c10f9eSGabriel Fernandez if (diff == 0) 228128c10f9eSGabriel Fernandez break; 228228c10f9eSGabriel Fernandez } 228328c10f9eSGabriel Fernandez } 228428c10f9eSGabriel Fernandez 228528c10f9eSGabriel Fernandez return (prate / (*prediv + 1)) / (*findiv + 1); 228628c10f9eSGabriel Fernandez } 228728c10f9eSGabriel Fernandez 228828c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_rate(struct clk *clk, 228928c10f9eSGabriel Fernandez unsigned long rate, 229028c10f9eSGabriel Fernandez unsigned long parent_rate) 229128c10f9eSGabriel Fernandez { 229228c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 229328c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 229428c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 229528c10f9eSGabriel Fernandez unsigned int prediv = 0; 229628c10f9eSGabriel Fernandez unsigned int findiv = 0; 229728c10f9eSGabriel Fernandez 229828c10f9eSGabriel Fernandez clk_stm32_flexgen_get_round_rate(rate, parent_rate, &prediv, &findiv); 229928c10f9eSGabriel Fernandez 230028c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 230128c10f9eSGabriel Fernandez panic(); 230228c10f9eSGabriel Fernandez 230328c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel), 230428c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, 230528c10f9eSGabriel Fernandez prediv); 230628c10f9eSGabriel Fernandez 230728c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 230828c10f9eSGabriel Fernandez panic(); 230928c10f9eSGabriel Fernandez 231028c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 231128c10f9eSGabriel Fernandez panic(); 231228c10f9eSGabriel Fernandez 231328c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 231428c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK, 231528c10f9eSGabriel Fernandez findiv); 231628c10f9eSGabriel Fernandez 231728c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 231828c10f9eSGabriel Fernandez panic(); 231928c10f9eSGabriel Fernandez 232028c10f9eSGabriel Fernandez return TEE_SUCCESS; 232128c10f9eSGabriel Fernandez } 232228c10f9eSGabriel Fernandez 232328c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_enable(struct clk *clk) 232428c10f9eSGabriel Fernandez { 232528c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 232628c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 232728c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 232828c10f9eSGabriel Fernandez 232928c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 233028c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN); 233128c10f9eSGabriel Fernandez 233228c10f9eSGabriel Fernandez return TEE_SUCCESS; 233328c10f9eSGabriel Fernandez } 233428c10f9eSGabriel Fernandez 233528c10f9eSGabriel Fernandez static void clk_stm32_flexgen_disable(struct clk *clk) 233628c10f9eSGabriel Fernandez { 233728c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 233828c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 233928c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 234028c10f9eSGabriel Fernandez 234128c10f9eSGabriel Fernandez io_clrbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 234228c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN); 234328c10f9eSGabriel Fernandez } 234428c10f9eSGabriel Fernandez 234528c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_flexgen_ops = { 234628c10f9eSGabriel Fernandez .get_rate = clk_stm32_flexgen_get_rate, 234728c10f9eSGabriel Fernandez .set_rate = clk_stm32_flexgen_set_rate, 234828c10f9eSGabriel Fernandez .get_parent = clk_stm32_flexgen_get_parent, 234928c10f9eSGabriel Fernandez .set_parent = clk_stm32_flexgen_set_parent, 235028c10f9eSGabriel Fernandez .enable = clk_stm32_flexgen_enable, 235128c10f9eSGabriel Fernandez .disable = clk_stm32_flexgen_disable, 235228c10f9eSGabriel Fernandez }; 235328c10f9eSGabriel Fernandez 235428c10f9eSGabriel Fernandez static size_t clk_cpu1_get_parent(struct clk *clk __unused) 235528c10f9eSGabriel Fernandez { 235628c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ); 235728c10f9eSGabriel Fernandez 235828c10f9eSGabriel Fernandez return (reg & A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) >> 235928c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_SHIFT; 236028c10f9eSGabriel Fernandez } 236128c10f9eSGabriel Fernandez 236228c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_cpu1_ops = { 236328c10f9eSGabriel Fernandez .get_parent = clk_cpu1_get_parent, 236428c10f9eSGabriel Fernandez }; 236528c10f9eSGabriel Fernandez 236628c10f9eSGabriel Fernandez #define APB_DIV_MASK GENMASK_32(2, 0) 236728c10f9eSGabriel Fernandez #define TIM_PRE_MASK BIT(0) 236828c10f9eSGabriel Fernandez 236928c10f9eSGabriel Fernandez static unsigned long ck_timer_get_rate_ops(struct clk *clk, unsigned long prate) 237028c10f9eSGabriel Fernandez { 237128c10f9eSGabriel Fernandez struct clk_stm32_timer_cfg *cfg = clk->priv; 237228c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 237328c10f9eSGabriel Fernandez uint32_t prescaler = 0; 237428c10f9eSGabriel Fernandez uint32_t timpre = 0; 237528c10f9eSGabriel Fernandez 237628c10f9eSGabriel Fernandez prescaler = io_read32(rcc_base + cfg->apbdiv) & APB_DIV_MASK; 237728c10f9eSGabriel Fernandez 237828c10f9eSGabriel Fernandez timpre = io_read32(rcc_base + cfg->timpre) & TIM_PRE_MASK; 237928c10f9eSGabriel Fernandez 238028c10f9eSGabriel Fernandez if (prescaler == 0) 238128c10f9eSGabriel Fernandez return prate; 238228c10f9eSGabriel Fernandez 238328c10f9eSGabriel Fernandez return prate * (timpre + 1) * 2; 238428c10f9eSGabriel Fernandez }; 238528c10f9eSGabriel Fernandez 238628c10f9eSGabriel Fernandez static const struct clk_ops ck_timer_ops = { 238728c10f9eSGabriel Fernandez .get_rate = ck_timer_get_rate_ops, 238828c10f9eSGabriel Fernandez }; 238928c10f9eSGabriel Fernandez 239028c10f9eSGabriel Fernandez #define PLL_PARENTS { &ck_hsi, &ck_hse, &ck_msi } 239128c10f9eSGabriel Fernandez #define PLL_NUM_PATENTS 3 239228c10f9eSGabriel Fernandez 239328c10f9eSGabriel Fernandez #define STM32_OSC(_name, _flags, _gate_id)\ 239428c10f9eSGabriel Fernandez struct clk _name = {\ 239528c10f9eSGabriel Fernandez .ops = &clk_stm32_osc_ops,\ 239628c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 239728c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 239828c10f9eSGabriel Fernandez },\ 239928c10f9eSGabriel Fernandez .name = #_name,\ 240028c10f9eSGabriel Fernandez .flags = (_flags),\ 240128c10f9eSGabriel Fernandez .num_parents = 1,\ 240228c10f9eSGabriel Fernandez .parents = { NULL },\ 240328c10f9eSGabriel Fernandez } 240428c10f9eSGabriel Fernandez 240528c10f9eSGabriel Fernandez #define STM32_OSC_MSI(_name, _flags, _gate_id)\ 240628c10f9eSGabriel Fernandez struct clk _name = {\ 240728c10f9eSGabriel Fernandez .ops = &clk_stm32_oscillator_msi_ops,\ 240828c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 240928c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 241028c10f9eSGabriel Fernandez },\ 241128c10f9eSGabriel Fernandez .name = #_name,\ 241228c10f9eSGabriel Fernandez .flags = (_flags),\ 241328c10f9eSGabriel Fernandez .num_parents = 1,\ 241428c10f9eSGabriel Fernandez .parents = { NULL },\ 241528c10f9eSGabriel Fernandez } 241628c10f9eSGabriel Fernandez 241728c10f9eSGabriel Fernandez #define STM32_HSE_DIV2(_name, _parent, _flags, _gate_id)\ 241828c10f9eSGabriel Fernandez struct clk _name = {\ 241928c10f9eSGabriel Fernandez .ops = &clk_hsediv2_ops,\ 242028c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 242128c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 242228c10f9eSGabriel Fernandez },\ 242328c10f9eSGabriel Fernandez .name = #_name,\ 242428c10f9eSGabriel Fernandez .flags = (_flags),\ 242528c10f9eSGabriel Fernandez .num_parents = 1,\ 242628c10f9eSGabriel Fernandez .parents = { (_parent) },\ 242728c10f9eSGabriel Fernandez } 242828c10f9eSGabriel Fernandez 242928c10f9eSGabriel Fernandez #define STM32_HSE_RTC(_name, _parent, _flags, _div_id)\ 243028c10f9eSGabriel Fernandez struct clk _name = {\ 243128c10f9eSGabriel Fernandez .ops = &clk_stm32_hse_div_ops,\ 243228c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_div_cfg){\ 243328c10f9eSGabriel Fernandez .div_id = (_div_id),\ 243428c10f9eSGabriel Fernandez },\ 243528c10f9eSGabriel Fernandez .name = #_name,\ 243628c10f9eSGabriel Fernandez .flags = (_flags),\ 243728c10f9eSGabriel Fernandez .num_parents = 1,\ 243828c10f9eSGabriel Fernandez .parents = { (_parent) },\ 243928c10f9eSGabriel Fernandez } 244028c10f9eSGabriel Fernandez 244128c10f9eSGabriel Fernandez #define STM32_PLL1(_name, _flags, _mux_id)\ 244228c10f9eSGabriel Fernandez struct clk _name = {\ 244328c10f9eSGabriel Fernandez .ops = &clk_stm32_pll1_ops,\ 244428c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 244528c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 244628c10f9eSGabriel Fernandez },\ 244728c10f9eSGabriel Fernandez .name = #_name,\ 244828c10f9eSGabriel Fernandez .flags = (_flags),\ 244928c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 245028c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 245128c10f9eSGabriel Fernandez } 245228c10f9eSGabriel Fernandez 245328c10f9eSGabriel Fernandez #define STM32_PLL2(_name, _flags, _reg, _gate_id, _mux_id)\ 245428c10f9eSGabriel Fernandez struct clk _name = {\ 245528c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\ 245628c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 245728c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 245828c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 245928c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 246028c10f9eSGabriel Fernandez },\ 246128c10f9eSGabriel Fernandez .name = #_name,\ 246228c10f9eSGabriel Fernandez .flags = (_flags),\ 246328c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 246428c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 246528c10f9eSGabriel Fernandez } 246628c10f9eSGabriel Fernandez 246728c10f9eSGabriel Fernandez #define STM32_PLL3(_name, _flags, _reg, _gate_id, _mux_id)\ 246828c10f9eSGabriel Fernandez struct clk _name = {\ 246928c10f9eSGabriel Fernandez .ops = &clk_stm32_pll3_ops,\ 247028c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 247128c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 247228c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 247328c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 247428c10f9eSGabriel Fernandez },\ 247528c10f9eSGabriel Fernandez .name = #_name,\ 247628c10f9eSGabriel Fernandez .flags = (_flags),\ 247728c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 247828c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 247928c10f9eSGabriel Fernandez } 248028c10f9eSGabriel Fernandez 248128c10f9eSGabriel Fernandez #define STM32_PLLS(_name, _flags, _reg, _gate_id, _mux_id)\ 248228c10f9eSGabriel Fernandez struct clk _name = {\ 248328c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\ 248428c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 248528c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 248628c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 248728c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 248828c10f9eSGabriel Fernandez },\ 248928c10f9eSGabriel Fernandez .name = #_name,\ 249028c10f9eSGabriel Fernandez .flags = (_flags),\ 249128c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 249228c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 249328c10f9eSGabriel Fernandez } 249428c10f9eSGabriel Fernandez 249528c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_off, RCC_0_MHZ); 249628c10f9eSGabriel Fernandez 249728c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser0, 0); 249828c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser1, 0); 249928c10f9eSGabriel Fernandez static STM32_FIXED_RATE(spdifsymb, 0); 250028c10f9eSGabriel Fernandez static STM32_FIXED_RATE(txbyteclk, 27000000); 250128c10f9eSGabriel Fernandez 250228c10f9eSGabriel Fernandez /* Oscillator clocks */ 250328c10f9eSGabriel Fernandez static STM32_OSC(ck_hsi, 0, GATE_HSI); 250428c10f9eSGabriel Fernandez static STM32_OSC(ck_hse, 0, GATE_HSE); 250528c10f9eSGabriel Fernandez static STM32_OSC_MSI(ck_msi, 0, GATE_MSI); 250628c10f9eSGabriel Fernandez static STM32_OSC(ck_lsi, 0, GATE_LSI); 250728c10f9eSGabriel Fernandez static STM32_OSC(ck_lse, 0, GATE_LSE); 250828c10f9eSGabriel Fernandez 250928c10f9eSGabriel Fernandez static STM32_HSE_DIV2(ck_hse_div2, &ck_hse, 0, GATE_HSEDIV2); 251028c10f9eSGabriel Fernandez static STM32_HSE_RTC(ck_hse_rtc, &ck_hse, 0, DIV_RTC); 251128c10f9eSGabriel Fernandez 251228c10f9eSGabriel Fernandez static STM32_FIXED_FACTOR(i2sckin, NULL, 0, 1, 1); 251328c10f9eSGabriel Fernandez 251428c10f9eSGabriel Fernandez static STM32_PLL1(ck_pll1, 0, MUX_MUXSEL5); 251528c10f9eSGabriel Fernandez static STM32_PLL2(ck_pll2, 0, RCC_PLL2CFGR1, GATE_PLL2, MUX_MUXSEL6); 251628c10f9eSGabriel Fernandez static STM32_PLL3(ck_pll3, 0, RCC_PLL3CFGR1, GATE_PLL3, MUX_MUXSEL7); 251728c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll4, 0, RCC_PLL4CFGR1, GATE_PLL4, MUX_MUXSEL0); 251828c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll5, 0, RCC_PLL5CFGR1, GATE_PLL5, MUX_MUXSEL1); 251928c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll6, 0, RCC_PLL6CFGR1, GATE_PLL6, MUX_MUXSEL2); 252028c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll7, 0, RCC_PLL7CFGR1, GATE_PLL7, MUX_MUXSEL3); 252128c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll8, 0, RCC_PLL8CFGR1, GATE_PLL8, MUX_MUXSEL4); 252228c10f9eSGabriel Fernandez 252328c10f9eSGabriel Fernandez #define STM32_FLEXGEN(_name, _flags, _flex_id)\ 252428c10f9eSGabriel Fernandez struct clk _name = {\ 252528c10f9eSGabriel Fernandez .ops = &clk_stm32_flexgen_ops,\ 252628c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_flexgen_cfg){\ 252728c10f9eSGabriel Fernandez .flex_id = (_flex_id),\ 252828c10f9eSGabriel Fernandez },\ 252928c10f9eSGabriel Fernandez .name = #_name,\ 253028c10f9eSGabriel Fernandez .flags = (_flags) | CLK_SET_RATE_UNGATE,\ 253128c10f9eSGabriel Fernandez .num_parents = 15,\ 253228c10f9eSGabriel Fernandez .parents = {\ 253328c10f9eSGabriel Fernandez &ck_pll4, &ck_pll5, &ck_pll6, &ck_pll7, &ck_pll8,\ 253428c10f9eSGabriel Fernandez &ck_hsi, &ck_hse, &ck_msi, &ck_hsi, &ck_hse, &ck_msi,\ 253528c10f9eSGabriel Fernandez &spdifsymb, &i2sckin, &ck_lsi, &ck_lse\ 253628c10f9eSGabriel Fernandez },\ 253728c10f9eSGabriel Fernandez } 253828c10f9eSGabriel Fernandez 253928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hs_mcu, 0, 0); 254028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_sdmmc, 0, 1); 254128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_ddr, 0, 2); 254228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_display, 0, 3); 254328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hsl, 0, 4); 254428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_nic, 0, 5); 254528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_vid, 0, 6); 254628c10f9eSGabriel Fernandez 254728c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_ls_mcu, &ck_icn_hs_mcu, 0, DIV_LSMCU); 254828c10f9eSGabriel Fernandez 254928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_07, 0, 7); 255028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_08, 0, 8); 255128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_09, 0, 9); 255228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_10, 0, 10); 255328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_11, 0, 11); 255428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_12, 0, 12); 255528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_13, 0, 13); 255628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_14, 0, 14); 255728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_15, 0, 15); 255828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_16, 0, 16); 255928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_17, 0, 17); 256028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_18, 0, 18); 256128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_19, 0, 19); 256228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_20, 0, 20); 256328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_21, 0, 21); 256428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_22, 0, 22); 256528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_23, 0, 23); 256628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_24, 0, 24); 256728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_25, 0, 25); 256828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_26, 0, 26); 256928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_27, 0, 27); 257028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_28, 0, 28); 257128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_29, 0, 29); 257228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_30, 0, 30); 257328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_31, 0, 31); 257428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_32, 0, 32); 257528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_33, 0, 33); 257628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_34, 0, 34); 257728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_35, 0, 35); 257828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_36, 0, 36); 257928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_37, 0, 37); 258028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_38, 0, 38); 258128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_39, 0, 39); 258228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_40, 0, 40); 258328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_41, 0, 41); 258428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_42, 0, 42); 258528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_43, 0, 43); 258628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_44, 0, 44); 258728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_45, 0, 45); 258828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_46, 0, 46); 258928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_47, 0, 47); 259028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_48, 0, 48); 259128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_49, 0, 49); 259228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_50, 0, 50); 259328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_51, 0, 51); 259428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_52, 0, 52); 259528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_53, 0, 53); 259628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_54, 0, 54); 259728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_55, 0, 55); 259828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_56, 0, 56); 259928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_57, 0, 57); 260028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_58, 0, 58); 260128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_59, 0, 59); 260228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_60, 0, 60); 260328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_61, 0, 61); 260428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_62, 0, 62); 260528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_63, 0, 63); 260628c10f9eSGabriel Fernandez 260728c10f9eSGabriel Fernandez static struct clk ck_cpu1 = { 260828c10f9eSGabriel Fernandez .ops = &clk_stm32_cpu1_ops, 260928c10f9eSGabriel Fernandez .name = "ck_cpu1", 261028c10f9eSGabriel Fernandez .flags = CLK_SET_RATE_PARENT, 261128c10f9eSGabriel Fernandez .num_parents = 2, 261228c10f9eSGabriel Fernandez .parents = { &ck_pll1, &ck_flexgen_63 }, 261328c10f9eSGabriel Fernandez }; 261428c10f9eSGabriel Fernandez 261528c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb1, &ck_icn_ls_mcu, 0, DIV_APB1); 261628c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb2, &ck_icn_ls_mcu, 0, DIV_APB2); 261728c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb3, &ck_icn_ls_mcu, 0, DIV_APB3); 261828c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb4, &ck_icn_ls_mcu, 0, DIV_APB4); 261928c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_icn_apbdbg, 1, { &ck_icn_ls_mcu }, 0, 262028c10f9eSGabriel Fernandez GATE_DBG, DIV_APBDBG, NO_MUX); 262128c10f9eSGabriel Fernandez 262228c10f9eSGabriel Fernandez #define STM32_TIMER(_name, _parent, _flags, _apbdiv, _timpre)\ 262328c10f9eSGabriel Fernandez struct clk _name = {\ 262428c10f9eSGabriel Fernandez .ops = &ck_timer_ops,\ 262528c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_timer_cfg){\ 262628c10f9eSGabriel Fernandez .apbdiv = (_apbdiv),\ 262728c10f9eSGabriel Fernandez .timpre = (_timpre),\ 262828c10f9eSGabriel Fernandez },\ 262928c10f9eSGabriel Fernandez .name = #_name,\ 263028c10f9eSGabriel Fernandez .flags = (_flags),\ 263128c10f9eSGabriel Fernandez .num_parents = 1,\ 263228c10f9eSGabriel Fernandez .parents = { _parent },\ 263328c10f9eSGabriel Fernandez } 263428c10f9eSGabriel Fernandez 263528c10f9eSGabriel Fernandez /* Kernel Timers */ 263628c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg1, &ck_icn_apb1, 0, RCC_APB1DIVR, RCC_TIMG1PRER); 263728c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg2, &ck_icn_apb2, 0, RCC_APB2DIVR, RCC_TIMG2PRER); 263828c10f9eSGabriel Fernandez 263928c10f9eSGabriel Fernandez /* Clocks under RCC RIF protection */ 264028c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_dbg, &ck_icn_apbdbg, 0, GATE_DBG); 264128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stm, &ck_icn_apbdbg, 0, GATE_STM); 264228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_stm, &ck_icn_ls_mcu, 0, GATE_STM); 264328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tsdbg, &ck_flexgen_43, 0, GATE_DBG); 264428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tpiu, &ck_flexgen_44, 0, GATE_TRACE); 264528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_etr, &ck_icn_apbdbg, 0, GATE_ETR); 264628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_etr, &ck_flexgen_45, 0, GATE_ETR); 264728c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_atb, &ck_flexgen_45, 0, GATE_DBG); 264828c10f9eSGabriel Fernandez 264928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sysram, &ck_icn_hs_mcu, 0, GATE_SYSRAM); 265028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_vderam, &ck_icn_hs_mcu, 0, GATE_VDERAM); 265128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_retram, &ck_icn_hs_mcu, 0, GATE_RETRAM); 265228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_bkpsram, &ck_icn_ls_mcu, 0, GATE_BKPSRAM); 265328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram1, &ck_icn_hs_mcu, 0, GATE_SRAM1); 265428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram2, &ck_icn_hs_mcu, 0, GATE_SRAM2); 265528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram1, &ck_icn_ls_mcu, 0, GATE_LPSRAM1); 265628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram2, &ck_icn_ls_mcu, 0, GATE_LPSRAM2); 265728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram3, &ck_icn_ls_mcu, 0, GATE_LPSRAM3); 265828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma1, &ck_icn_ls_mcu, 0, GATE_HPDMA1); 265928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma2, &ck_icn_ls_mcu, 0, GATE_HPDMA2); 266028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma3, &ck_icn_ls_mcu, 0, GATE_HPDMA3); 266128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpdma, &ck_icn_ls_mcu, 0, GATE_LPDMA); 266228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc1, &ck_icn_ls_mcu, 0, GATE_IPCC1); 266328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc2, &ck_icn_ls_mcu, 0, GATE_IPCC2); 266428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hsem, &ck_icn_ls_mcu, 0, GATE_HSEM); 266528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioa, &ck_icn_ls_mcu, 0, GATE_GPIOA); 266628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiob, &ck_icn_ls_mcu, 0, GATE_GPIOB); 266728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioc, &ck_icn_ls_mcu, 0, GATE_GPIOC); 266828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiod, &ck_icn_ls_mcu, 0, GATE_GPIOD); 266928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioe, &ck_icn_ls_mcu, 0, GATE_GPIOE); 267028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiof, &ck_icn_ls_mcu, 0, GATE_GPIOF); 267128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiog, &ck_icn_ls_mcu, 0, GATE_GPIOG); 267228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioh, &ck_icn_ls_mcu, 0, GATE_GPIOH); 267328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioi, &ck_icn_ls_mcu, 0, GATE_GPIOI); 267428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioj, &ck_icn_ls_mcu, 0, GATE_GPIOJ); 267528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiok, &ck_icn_ls_mcu, 0, GATE_GPIOK); 267628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioz, &ck_icn_ls_mcu, 0, GATE_GPIOZ); 267728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rtc, &ck_icn_ls_mcu, 0, GATE_RTC); 267828c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_rtc, 4, 267928c10f9eSGabriel Fernandez PARENT(&ck_off, &ck_lse, &ck_lsi, &ck_hse_rtc), 268028c10f9eSGabriel Fernandez 0, GATE_RTCCK, NO_DIV, MUX_RTC); 268128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_bsec, &ck_icn_apb3, 0, GATE_BSEC); 268228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrphyc, &ck_icn_ls_mcu, 0, GATE_DDRPHYCAPB); 268328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_risaf4, &ck_icn_ls_mcu, 0, GATE_DDRCP); 268428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ddr, &ck_icn_ddr, 0, GATE_DDRCP); 268528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrc, &ck_icn_apb4, 0, GATE_DDRCAPB); 268628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrcfg, &ck_icn_apb4, 0, GATE_DDRCFG); 268728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_syscpu1, &ck_icn_ls_mcu, 0, GATE_SYSCPU1); 268828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_is2m, &ck_icn_apb3, 0, GATE_IS2M); 268928c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco1, 2, PARENT(&ck_flexgen_61, &ck_obser0), 0, 269028c10f9eSGabriel Fernandez GATE_MCO1, NO_DIV, MUX_MCO1); 269128c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco2, 2, PARENT(&ck_flexgen_62, &ck_obser1), 0, 269228c10f9eSGabriel Fernandez GATE_MCO2, NO_DIV, MUX_MCO2); 269328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi1, &ck_icn_hs_mcu, 0, GATE_OSPI1); 269428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi1, &ck_flexgen_48, 0, GATE_OSPI1); 269528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi2, &ck_icn_hs_mcu, 0, GATE_OSPI2); 269628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi2, &ck_flexgen_49, 0, GATE_OSPI2); 269728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fmc, &ck_icn_ls_mcu, 0, GATE_FMC); 269828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fmc, &ck_flexgen_50, 0, GATE_FMC); 269928c10f9eSGabriel Fernandez 270028c10f9eSGabriel Fernandez /* Kernel Clocks */ 270128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cci, &ck_icn_ls_mcu, 0, GATE_CCI); 270228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_crc, &ck_icn_ls_mcu, 0, GATE_CRC); 270328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ospiiom, &ck_icn_ls_mcu, 0, GATE_OSPIIOM); 270428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hash, &ck_icn_ls_mcu, 0, GATE_HASH); 270528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rng, &ck_icn_ls_mcu, 0, GATE_RNG); 270628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp1, &ck_icn_ls_mcu, 0, GATE_CRYP1); 270728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp2, &ck_icn_ls_mcu, 0, GATE_CRYP2); 270828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_saes, &ck_icn_ls_mcu, 0, GATE_SAES); 270928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pka, &ck_icn_ls_mcu, 0, GATE_PKA); 271028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adf1, &ck_icn_ls_mcu, 0, GATE_ADF1); 271128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg5, &ck_icn_ls_mcu, 0, GATE_IWDG5); 271228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg2, &ck_icn_ls_mcu, 0, GATE_WWDG2); 271328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth1, &ck_icn_ls_mcu, 0, GATE_ETH1); 271428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ethsw, &ck_icn_ls_mcu, 0, GATE_ETHSWMAC); 271528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth2, &ck_icn_ls_mcu, 0, GATE_ETH2); 271628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pcie, &ck_icn_ls_mcu, 0, GATE_PCIE); 271728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc12, &ck_icn_ls_mcu, 0, GATE_ADC12); 271828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc3, &ck_icn_ls_mcu, 0, GATE_ADC3); 271928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_mdf1, &ck_icn_ls_mcu, 0, GATE_MDF1); 272028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi8, &ck_icn_ls_mcu, 0, GATE_SPI8); 272128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpuart1, &ck_icn_ls_mcu, 0, GATE_LPUART1); 272228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c8, &ck_icn_ls_mcu, 0, GATE_I2C8); 272328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim3, &ck_icn_ls_mcu, 0, GATE_LPTIM3); 272428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim4, &ck_icn_ls_mcu, 0, GATE_LPTIM4); 272528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim5, &ck_icn_ls_mcu, 0, GATE_LPTIM5); 272628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc1, &ck_icn_sdmmc, 0, GATE_SDMMC1); 272728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc2, &ck_icn_sdmmc, 0, GATE_SDMMC2); 272828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc3, &ck_icn_sdmmc, 0, GATE_SDMMC3); 272928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ohci, &ck_icn_hsl, 0, GATE_USB2); 273028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ehci, &ck_icn_hsl, 0, GATE_USB2); 273128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb3dr, &ck_icn_hsl, 0, GATE_USB3DR); 273228c10f9eSGabriel Fernandez 273328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim2, &ck_icn_apb1, 0, GATE_TIM2); 273428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim3, &ck_icn_apb1, 0, GATE_TIM3); 273528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim4, &ck_icn_apb1, 0, GATE_TIM4); 273628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim5, &ck_icn_apb1, 0, GATE_TIM5); 273728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim6, &ck_icn_apb1, 0, GATE_TIM6); 273828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim7, &ck_icn_apb1, 0, GATE_TIM7); 273928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim10, &ck_icn_apb1, 0, GATE_TIM10); 274028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim11, &ck_icn_apb1, 0, GATE_TIM11); 274128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim12, &ck_icn_apb1, 0, GATE_TIM12); 274228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim13, &ck_icn_apb1, 0, GATE_TIM13); 274328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim14, &ck_icn_apb1, 0, GATE_TIM14); 274428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim1, &ck_icn_apb1, 0, GATE_LPTIM1); 274528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim2, &ck_icn_apb1, 0, GATE_LPTIM2); 274628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi2, &ck_icn_apb1, 0, GATE_SPI2); 274728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi3, &ck_icn_apb1, 0, GATE_SPI3); 274828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spdifrx, &ck_icn_apb1, 0, GATE_SPDIFRX); 274928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart2, &ck_icn_apb1, 0, GATE_USART2); 275028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart3, &ck_icn_apb1, 0, GATE_USART3); 275128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart4, &ck_icn_apb1, 0, GATE_UART4); 275228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart5, &ck_icn_apb1, 0, GATE_UART5); 275328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c1, &ck_icn_apb1, 0, GATE_I2C1); 275428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c2, &ck_icn_apb1, 0, GATE_I2C2); 275528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c3, &ck_icn_apb1, 0, GATE_I2C3); 275628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c4, &ck_icn_apb1, 0, GATE_I2C4); 275728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c5, &ck_icn_apb1, 0, GATE_I2C5); 275828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c6, &ck_icn_apb1, 0, GATE_I2C6); 275928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c7, &ck_icn_apb1, 0, GATE_I2C7); 276028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c1, &ck_icn_apb1, 0, GATE_I3C1); 276128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c2, &ck_icn_apb1, 0, GATE_I3C2); 276228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c3, &ck_icn_apb1, 0, GATE_I3C3); 276328c10f9eSGabriel Fernandez 276428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c4, &ck_icn_ls_mcu, 0, GATE_I3C4); 276528c10f9eSGabriel Fernandez 276628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim1, &ck_icn_apb2, 0, GATE_TIM1); 276728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim8, &ck_icn_apb2, 0, GATE_TIM8); 276828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim15, &ck_icn_apb2, 0, GATE_TIM15); 276928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim16, &ck_icn_apb2, 0, GATE_TIM16); 277028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim17, &ck_icn_apb2, 0, GATE_TIM17); 277128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim20, &ck_icn_apb2, 0, GATE_TIM20); 277228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai1, &ck_icn_apb2, 0, GATE_SAI1); 277328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai2, &ck_icn_apb2, 0, GATE_SAI2); 277428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai3, &ck_icn_apb2, 0, GATE_SAI3); 277528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai4, &ck_icn_apb2, 0, GATE_SAI4); 277628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart1, &ck_icn_apb2, 0, GATE_USART1); 277728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart6, &ck_icn_apb2, 0, GATE_USART6); 277828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart7, &ck_icn_apb2, 0, GATE_UART7); 277928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart8, &ck_icn_apb2, 0, GATE_UART8); 278028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart9, &ck_icn_apb2, 0, GATE_UART9); 278128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fdcan, &ck_icn_apb2, 0, GATE_FDCAN); 278228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi1, &ck_icn_apb2, 0, GATE_SPI1); 278328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi4, &ck_icn_apb2, 0, GATE_SPI4); 278428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi5, &ck_icn_apb2, 0, GATE_SPI5); 278528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi6, &ck_icn_apb2, 0, GATE_SPI6); 278628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi7, &ck_icn_apb2, 0, GATE_SPI7); 278728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg1, &ck_icn_apb3, 0, GATE_IWDG1); 278828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg2, &ck_icn_apb3, 0, GATE_IWDG2); 278928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg3, &ck_icn_apb3, 0, GATE_IWDG3); 279028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg4, &ck_icn_apb3, 0, GATE_IWDG4); 279128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg1, &ck_icn_apb3, 0, GATE_WWDG1); 279228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vref, &ck_icn_apb3, 0, GATE_VREF); 279328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dts, &ck_icn_apb3, 0, GATE_DTS); 279428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_serc, &ck_icn_apb3, 0, GATE_SERC); 279528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hdp, &ck_icn_apb3, 0, GATE_HDP); 279628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dsi, &ck_icn_apb4, 0, GATE_DSI); 279728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ltdc, &ck_icn_apb4, 0, GATE_LTDC); 279828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_csi, &ck_icn_apb4, 0, GATE_CSI); 279928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dcmipp, &ck_icn_apb4, 0, GATE_DCMIPP); 280028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lvds, &ck_icn_apb4, 0, GATE_LVDS); 280128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gicv2m, &ck_icn_apb4, 0, GATE_GICV2M); 280228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usbtc, &ck_icn_apb4, 0, GATE_USBTC); 280328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usb3pciephy, &ck_icn_apb4, 0, GATE_USB3PCIEPHY); 280428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stgen, &ck_icn_apb4, 0, GATE_STGEN); 280528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vdec, &ck_icn_apb4, 0, GATE_VDEC); 280628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_venc, &ck_icn_apb4, 0, GATE_VENC); 280728c10f9eSGabriel Fernandez 280828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim2, &ck_timg1, 0, GATE_TIM2); 280928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim3, &ck_timg1, 0, GATE_TIM3); 281028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim4, &ck_timg1, 0, GATE_TIM4); 281128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim5, &ck_timg1, 0, GATE_TIM5); 281228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim6, &ck_timg1, 0, GATE_TIM6); 281328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim7, &ck_timg1, 0, GATE_TIM7); 281428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim10, &ck_timg1, 0, GATE_TIM10); 281528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim11, &ck_timg1, 0, GATE_TIM11); 281628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim12, &ck_timg1, 0, GATE_TIM12); 281728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim13, &ck_timg1, 0, GATE_TIM13); 281828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim14, &ck_timg1, 0, GATE_TIM14); 281928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim1, &ck_timg2, 0, GATE_TIM1); 282028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim8, &ck_timg2, 0, GATE_TIM8); 282128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim15, &ck_timg2, 0, GATE_TIM15); 282228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim16, &ck_timg2, 0, GATE_TIM16); 282328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim17, &ck_timg2, 0, GATE_TIM17); 282428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim20, &ck_timg2, 0, GATE_TIM20); 282528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim1, &ck_flexgen_07, 0, GATE_LPTIM1); 282628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim2, &ck_flexgen_07, 0, GATE_LPTIM2); 282728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart2, &ck_flexgen_08, 0, GATE_USART2); 282828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart4, &ck_flexgen_08, 0, GATE_UART4); 282928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart3, &ck_flexgen_09, 0, GATE_USART3); 283028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart5, &ck_flexgen_09, 0, GATE_UART5); 283128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi2, &ck_flexgen_10, 0, GATE_SPI2); 283228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi3, &ck_flexgen_10, 0, GATE_SPI3); 283328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spdifrx, &ck_flexgen_11, 0, GATE_SPDIFRX); 283428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c1, &ck_flexgen_12, 0, GATE_I2C1); 283528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c2, &ck_flexgen_12, 0, GATE_I2C2); 283628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c1, &ck_flexgen_12, 0, GATE_I3C1); 283728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c2, &ck_flexgen_12, 0, GATE_I3C2); 283828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c3, &ck_flexgen_13, 0, GATE_I2C3); 283928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c5, &ck_flexgen_13, 0, GATE_I2C5); 284028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c3, &ck_flexgen_13, 0, GATE_I3C3); 284128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c4, &ck_flexgen_14, 0, GATE_I2C4); 284228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c6, &ck_flexgen_14, 0, GATE_I2C6); 284328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c7, &ck_flexgen_15, 0, GATE_I2C7); 284428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi1, &ck_flexgen_16, 0, GATE_SPI1); 284528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi4, &ck_flexgen_17, 0, GATE_SPI4); 284628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi5, &ck_flexgen_17, 0, GATE_SPI5); 284728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi6, &ck_flexgen_18, 0, GATE_SPI6); 284828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi7, &ck_flexgen_18, 0, GATE_SPI7); 284928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart1, &ck_flexgen_19, 0, GATE_USART1); 285028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart6, &ck_flexgen_20, 0, GATE_USART6); 285128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart7, &ck_flexgen_21, 0, GATE_UART7); 285228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart8, &ck_flexgen_21, 0, GATE_UART8); 285328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart9, &ck_flexgen_22, 0, GATE_UART9); 285428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_mdf1, &ck_flexgen_23, 0, GATE_MDF1); 285528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai1, &ck_flexgen_23, 0, GATE_SAI1); 285628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai2, &ck_flexgen_24, 0, GATE_SAI2); 285728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai3, &ck_flexgen_25, 0, GATE_SAI3); 285828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai4, &ck_flexgen_25, 0, GATE_SAI4); 285928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fdcan, &ck_flexgen_26, 0, GATE_FDCAN); 286028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csi, &ck_flexgen_29, 0, GATE_CSI); 286128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csitxesc, &ck_flexgen_30, 0, GATE_CSI); 286228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csiphy, &ck_flexgen_31, 0, GATE_CSI); 286328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_stgen, &ck_flexgen_33, CLK_SET_RATE_PARENT, 286428c10f9eSGabriel Fernandez GATE_STGEN); 286528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usbtc, &ck_flexgen_35, 0, GATE_USBTC); 286628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c4, &ck_flexgen_36, 0, GATE_I3C4); 286728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi8, &ck_flexgen_37, 0, GATE_SPI8); 286828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c8, &ck_flexgen_38, 0, GATE_I2C8); 286928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lpuart1, &ck_flexgen_39, 0, GATE_LPUART1); 287028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim3, &ck_flexgen_40, 0, GATE_LPTIM3); 287128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim4, &ck_flexgen_41, 0, GATE_LPTIM4); 287228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim5, &ck_flexgen_41, 0, GATE_LPTIM5); 287328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_adf1, &ck_flexgen_42, 0, GATE_ADF1); 287428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc1, &ck_flexgen_51, 0, GATE_SDMMC1); 287528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc2, &ck_flexgen_52, 0, GATE_SDMMC2); 287628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc3, &ck_flexgen_53, 0, GATE_SDMMC3); 287728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1, &ck_flexgen_54, 0, GATE_ETH1); 287828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethsw, &ck_flexgen_54, 0, GATE_ETHSW); 287928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2, &ck_flexgen_55, 0, GATE_ETH2); 288028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1ptp, &ck_flexgen_56, 0, GATE_ETH1); 288128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2ptp, &ck_flexgen_56, 0, GATE_ETH2); 288228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usb2phy2, &ck_flexgen_58, 0, GATE_USB3DR); 288328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_gpu, &ck_flexgen_59, 0, GATE_GPU); 288428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_gpu, &ck_pll3, 0, GATE_GPU); 288528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethswref, &ck_flexgen_60, 0, GATE_ETHSWREF); 288628c10f9eSGabriel Fernandez 288728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1stp, &ck_icn_ls_mcu, 0, GATE_ETH1STP); 288828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2stp, &ck_icn_ls_mcu, 0, GATE_ETH2STP); 288928c10f9eSGabriel Fernandez 289028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ltdc, &ck_flexgen_27, CLK_SET_RATE_PARENT, 289128c10f9eSGabriel Fernandez GATE_LTDC); 289228c10f9eSGabriel Fernandez 289328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc12, 2, PARENT(&ck_flexgen_46, &ck_icn_ls_mcu), 289428c10f9eSGabriel Fernandez 0, GATE_ADC12, NO_DIV, MUX_ADC12); 289528c10f9eSGabriel Fernandez 289628c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc3, 3, PARENT(&ck_flexgen_47, &ck_icn_ls_mcu, 289728c10f9eSGabriel Fernandez &ck_flexgen_46), 289828c10f9eSGabriel Fernandez 0, GATE_ADC3, NO_DIV, MUX_ADC3); 289928c10f9eSGabriel Fernandez 290028c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy1, 2, PARENT(&ck_flexgen_57, 290128c10f9eSGabriel Fernandez &ck_hse_div2), 290228c10f9eSGabriel Fernandez 0, GATE_USB2PHY1, NO_DIV, MUX_USB2PHY1); 290328c10f9eSGabriel Fernandez 290428c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy2_en, 2, PARENT(&ck_flexgen_58, 290528c10f9eSGabriel Fernandez &ck_hse_div2), 290628c10f9eSGabriel Fernandez 0, GATE_USB2PHY2, NO_DIV, MUX_USB2PHY2); 290728c10f9eSGabriel Fernandez 290828c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb3pciephy, 2, PARENT(&ck_flexgen_34, 290928c10f9eSGabriel Fernandez &ck_hse_div2), 291028c10f9eSGabriel Fernandez 0, GATE_USB3PCIEPHY, NO_DIV, MUX_USB3PCIEPHY); 291128c10f9eSGabriel Fernandez 291228c10f9eSGabriel Fernandez static STM32_COMPOSITE(clk_lanebyte, 2, PARENT(&txbyteclk, &ck_ker_ltdc), 291328c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIBLANE); 291428c10f9eSGabriel Fernandez 291528c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_phy_dsi, 2, PARENT(&ck_flexgen_28, &ck_hse), 291628c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIPHY); 291728c10f9eSGabriel Fernandez 291828c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_lvdsphy, 2, PARENT(&ck_flexgen_32, &ck_hse), 291928c10f9eSGabriel Fernandez 0, GATE_LVDS, NO_DIV, MUX_LVDSPHY); 292028c10f9eSGabriel Fernandez 292128c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_dts, 3, PARENT(&ck_hsi, &ck_hse, &ck_msi), 292228c10f9eSGabriel Fernandez 0, GATE_DTS, NO_DIV, MUX_DTS); 292328c10f9eSGabriel Fernandez 292428c10f9eSGabriel Fernandez enum { 292528c10f9eSGabriel Fernandez CK_OFF = STM32MP25_LAST_CLK, 292628c10f9eSGabriel Fernandez I2SCKIN, 292728c10f9eSGabriel Fernandez SPDIFSYMB, 292828c10f9eSGabriel Fernandez CK_HSE_RTC, 292928c10f9eSGabriel Fernandez TXBYTECLK, 293028c10f9eSGabriel Fernandez CK_OBSER0, 293128c10f9eSGabriel Fernandez CK_OBSER1, 293228c10f9eSGabriel Fernandez STM32MP25_ALL_CLK_NB 293328c10f9eSGabriel Fernandez }; 293428c10f9eSGabriel Fernandez 293528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1mac, &ck_icn_ls_mcu, 0, GATE_ETH1MAC); 293628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1tx, &ck_icn_ls_mcu, 0, GATE_ETH1TX); 293728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1rx, &ck_icn_ls_mcu, 0, GATE_ETH1RX); 293828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2mac, &ck_icn_ls_mcu, 0, GATE_ETH2MAC); 293928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2tx, &ck_icn_ls_mcu, 0, GATE_ETH2TX); 294028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2rx, &ck_icn_ls_mcu, 0, GATE_ETH2RX); 294128c10f9eSGabriel Fernandez 294228c10f9eSGabriel Fernandez static struct clk *stm32mp25_clk_provided[STM32MP25_ALL_CLK_NB] = { 294328c10f9eSGabriel Fernandez [HSI_CK] = &ck_hsi, 294428c10f9eSGabriel Fernandez [HSE_CK] = &ck_hse, 294528c10f9eSGabriel Fernandez [MSI_CK] = &ck_msi, 294628c10f9eSGabriel Fernandez [LSI_CK] = &ck_lsi, 294728c10f9eSGabriel Fernandez [LSE_CK] = &ck_lse, 294828c10f9eSGabriel Fernandez 294928c10f9eSGabriel Fernandez [HSE_DIV2_CK] = &ck_hse_div2, 295028c10f9eSGabriel Fernandez 295128c10f9eSGabriel Fernandez [PLL1_CK] = &ck_pll1, 295228c10f9eSGabriel Fernandez [PLL2_CK] = &ck_pll2, 295328c10f9eSGabriel Fernandez [PLL3_CK] = &ck_pll3, 295428c10f9eSGabriel Fernandez [PLL4_CK] = &ck_pll4, 295528c10f9eSGabriel Fernandez [PLL5_CK] = &ck_pll5, 295628c10f9eSGabriel Fernandez [PLL6_CK] = &ck_pll6, 295728c10f9eSGabriel Fernandez [PLL7_CK] = &ck_pll7, 295828c10f9eSGabriel Fernandez [PLL8_CK] = &ck_pll8, 295928c10f9eSGabriel Fernandez 296028c10f9eSGabriel Fernandez [CK_ICN_HS_MCU] = &ck_icn_hs_mcu, 296128c10f9eSGabriel Fernandez [CK_ICN_LS_MCU] = &ck_icn_ls_mcu, 296228c10f9eSGabriel Fernandez 296328c10f9eSGabriel Fernandez [CK_ICN_SDMMC] = &ck_icn_sdmmc, 296428c10f9eSGabriel Fernandez [CK_ICN_DDR] = &ck_icn_ddr, 296528c10f9eSGabriel Fernandez [CK_ICN_DISPLAY] = &ck_icn_display, 296628c10f9eSGabriel Fernandez [CK_ICN_HSL] = &ck_icn_hsl, 296728c10f9eSGabriel Fernandez [CK_ICN_NIC] = &ck_icn_nic, 296828c10f9eSGabriel Fernandez [CK_ICN_VID] = &ck_icn_vid, 296928c10f9eSGabriel Fernandez [CK_FLEXGEN_07] = &ck_flexgen_07, 297028c10f9eSGabriel Fernandez [CK_FLEXGEN_08] = &ck_flexgen_08, 297128c10f9eSGabriel Fernandez [CK_FLEXGEN_09] = &ck_flexgen_09, 297228c10f9eSGabriel Fernandez [CK_FLEXGEN_10] = &ck_flexgen_10, 297328c10f9eSGabriel Fernandez [CK_FLEXGEN_11] = &ck_flexgen_11, 297428c10f9eSGabriel Fernandez [CK_FLEXGEN_12] = &ck_flexgen_12, 297528c10f9eSGabriel Fernandez [CK_FLEXGEN_13] = &ck_flexgen_13, 297628c10f9eSGabriel Fernandez [CK_FLEXGEN_14] = &ck_flexgen_14, 297728c10f9eSGabriel Fernandez [CK_FLEXGEN_15] = &ck_flexgen_15, 297828c10f9eSGabriel Fernandez [CK_FLEXGEN_16] = &ck_flexgen_16, 297928c10f9eSGabriel Fernandez [CK_FLEXGEN_17] = &ck_flexgen_17, 298028c10f9eSGabriel Fernandez [CK_FLEXGEN_18] = &ck_flexgen_18, 298128c10f9eSGabriel Fernandez [CK_FLEXGEN_19] = &ck_flexgen_19, 298228c10f9eSGabriel Fernandez [CK_FLEXGEN_20] = &ck_flexgen_20, 298328c10f9eSGabriel Fernandez [CK_FLEXGEN_21] = &ck_flexgen_21, 298428c10f9eSGabriel Fernandez [CK_FLEXGEN_22] = &ck_flexgen_22, 298528c10f9eSGabriel Fernandez [CK_FLEXGEN_23] = &ck_flexgen_23, 298628c10f9eSGabriel Fernandez [CK_FLEXGEN_24] = &ck_flexgen_24, 298728c10f9eSGabriel Fernandez [CK_FLEXGEN_25] = &ck_flexgen_25, 298828c10f9eSGabriel Fernandez [CK_FLEXGEN_26] = &ck_flexgen_26, 298928c10f9eSGabriel Fernandez [CK_FLEXGEN_27] = &ck_flexgen_27, 299028c10f9eSGabriel Fernandez [CK_FLEXGEN_28] = &ck_flexgen_28, 299128c10f9eSGabriel Fernandez [CK_FLEXGEN_29] = &ck_flexgen_29, 299228c10f9eSGabriel Fernandez [CK_FLEXGEN_30] = &ck_flexgen_30, 299328c10f9eSGabriel Fernandez [CK_FLEXGEN_31] = &ck_flexgen_31, 299428c10f9eSGabriel Fernandez [CK_FLEXGEN_32] = &ck_flexgen_32, 299528c10f9eSGabriel Fernandez [CK_FLEXGEN_33] = &ck_flexgen_33, 299628c10f9eSGabriel Fernandez [CK_FLEXGEN_34] = &ck_flexgen_34, 299728c10f9eSGabriel Fernandez [CK_FLEXGEN_35] = &ck_flexgen_35, 299828c10f9eSGabriel Fernandez [CK_FLEXGEN_36] = &ck_flexgen_36, 299928c10f9eSGabriel Fernandez [CK_FLEXGEN_37] = &ck_flexgen_37, 300028c10f9eSGabriel Fernandez [CK_FLEXGEN_38] = &ck_flexgen_38, 300128c10f9eSGabriel Fernandez [CK_FLEXGEN_39] = &ck_flexgen_39, 300228c10f9eSGabriel Fernandez [CK_FLEXGEN_40] = &ck_flexgen_40, 300328c10f9eSGabriel Fernandez [CK_FLEXGEN_41] = &ck_flexgen_41, 300428c10f9eSGabriel Fernandez [CK_FLEXGEN_42] = &ck_flexgen_42, 300528c10f9eSGabriel Fernandez [CK_FLEXGEN_43] = &ck_flexgen_43, 300628c10f9eSGabriel Fernandez [CK_FLEXGEN_44] = &ck_flexgen_44, 300728c10f9eSGabriel Fernandez [CK_FLEXGEN_45] = &ck_flexgen_45, 300828c10f9eSGabriel Fernandez [CK_FLEXGEN_46] = &ck_flexgen_46, 300928c10f9eSGabriel Fernandez [CK_FLEXGEN_47] = &ck_flexgen_47, 301028c10f9eSGabriel Fernandez [CK_FLEXGEN_48] = &ck_flexgen_48, 301128c10f9eSGabriel Fernandez [CK_FLEXGEN_49] = &ck_flexgen_49, 301228c10f9eSGabriel Fernandez [CK_FLEXGEN_50] = &ck_flexgen_50, 301328c10f9eSGabriel Fernandez [CK_FLEXGEN_51] = &ck_flexgen_51, 301428c10f9eSGabriel Fernandez [CK_FLEXGEN_52] = &ck_flexgen_52, 301528c10f9eSGabriel Fernandez [CK_FLEXGEN_53] = &ck_flexgen_53, 301628c10f9eSGabriel Fernandez [CK_FLEXGEN_54] = &ck_flexgen_54, 301728c10f9eSGabriel Fernandez [CK_FLEXGEN_55] = &ck_flexgen_55, 301828c10f9eSGabriel Fernandez [CK_FLEXGEN_56] = &ck_flexgen_56, 301928c10f9eSGabriel Fernandez [CK_FLEXGEN_57] = &ck_flexgen_57, 302028c10f9eSGabriel Fernandez [CK_FLEXGEN_58] = &ck_flexgen_58, 302128c10f9eSGabriel Fernandez [CK_FLEXGEN_59] = &ck_flexgen_59, 302228c10f9eSGabriel Fernandez [CK_FLEXGEN_60] = &ck_flexgen_60, 302328c10f9eSGabriel Fernandez [CK_FLEXGEN_61] = &ck_flexgen_61, 302428c10f9eSGabriel Fernandez [CK_FLEXGEN_62] = &ck_flexgen_62, 302528c10f9eSGabriel Fernandez [CK_FLEXGEN_63] = &ck_flexgen_63, 302628c10f9eSGabriel Fernandez 302728c10f9eSGabriel Fernandez [CK_CPU1] = &ck_cpu1, 302828c10f9eSGabriel Fernandez 302928c10f9eSGabriel Fernandez [CK_ICN_APB1] = &ck_icn_apb1, 303028c10f9eSGabriel Fernandez [CK_ICN_APB2] = &ck_icn_apb2, 303128c10f9eSGabriel Fernandez [CK_ICN_APB3] = &ck_icn_apb3, 303228c10f9eSGabriel Fernandez [CK_ICN_APB4] = &ck_icn_apb4, 303328c10f9eSGabriel Fernandez [CK_ICN_APBDBG] = &ck_icn_apbdbg, 303428c10f9eSGabriel Fernandez 303528c10f9eSGabriel Fernandez [TIMG1_CK] = &ck_timg1, 303628c10f9eSGabriel Fernandez [TIMG2_CK] = &ck_timg2, 303728c10f9eSGabriel Fernandez 303828c10f9eSGabriel Fernandez [CK_BUS_SYSRAM] = &ck_icn_s_sysram, 303928c10f9eSGabriel Fernandez [CK_BUS_VDERAM] = &ck_icn_s_vderam, 304028c10f9eSGabriel Fernandez [CK_BUS_RETRAM] = &ck_icn_s_retram, 304128c10f9eSGabriel Fernandez [CK_BUS_SRAM1] = &ck_icn_s_sram1, 304228c10f9eSGabriel Fernandez [CK_BUS_SRAM2] = &ck_icn_s_sram2, 304328c10f9eSGabriel Fernandez [CK_BUS_OSPI1] = &ck_icn_s_ospi1, 304428c10f9eSGabriel Fernandez [CK_BUS_OSPI2] = &ck_icn_s_ospi2, 304528c10f9eSGabriel Fernandez [CK_BUS_BKPSRAM] = &ck_icn_s_bkpsram, 304628c10f9eSGabriel Fernandez [CK_BUS_DDRPHYC] = &ck_icn_p_ddrphyc, 304728c10f9eSGabriel Fernandez [CK_BUS_SYSCPU1] = &ck_icn_p_syscpu1, 304828c10f9eSGabriel Fernandez [CK_BUS_HPDMA1] = &ck_icn_p_hpdma1, 304928c10f9eSGabriel Fernandez [CK_BUS_HPDMA2] = &ck_icn_p_hpdma2, 305028c10f9eSGabriel Fernandez [CK_BUS_HPDMA3] = &ck_icn_p_hpdma3, 305128c10f9eSGabriel Fernandez [CK_BUS_IPCC1] = &ck_icn_p_ipcc1, 305228c10f9eSGabriel Fernandez [CK_BUS_IPCC2] = &ck_icn_p_ipcc2, 305328c10f9eSGabriel Fernandez [CK_BUS_CCI] = &ck_icn_p_cci, 305428c10f9eSGabriel Fernandez [CK_BUS_CRC] = &ck_icn_p_crc, 305528c10f9eSGabriel Fernandez [CK_BUS_OSPIIOM] = &ck_icn_p_ospiiom, 305628c10f9eSGabriel Fernandez [CK_BUS_HASH] = &ck_icn_p_hash, 305728c10f9eSGabriel Fernandez [CK_BUS_RNG] = &ck_icn_p_rng, 305828c10f9eSGabriel Fernandez [CK_BUS_CRYP1] = &ck_icn_p_cryp1, 305928c10f9eSGabriel Fernandez [CK_BUS_CRYP2] = &ck_icn_p_cryp2, 306028c10f9eSGabriel Fernandez [CK_BUS_SAES] = &ck_icn_p_saes, 306128c10f9eSGabriel Fernandez [CK_BUS_PKA] = &ck_icn_p_pka, 306228c10f9eSGabriel Fernandez [CK_BUS_GPIOA] = &ck_icn_p_gpioa, 306328c10f9eSGabriel Fernandez [CK_BUS_GPIOB] = &ck_icn_p_gpiob, 306428c10f9eSGabriel Fernandez [CK_BUS_GPIOC] = &ck_icn_p_gpioc, 306528c10f9eSGabriel Fernandez [CK_BUS_GPIOD] = &ck_icn_p_gpiod, 306628c10f9eSGabriel Fernandez [CK_BUS_GPIOE] = &ck_icn_p_gpioe, 306728c10f9eSGabriel Fernandez [CK_BUS_GPIOF] = &ck_icn_p_gpiof, 306828c10f9eSGabriel Fernandez [CK_BUS_GPIOG] = &ck_icn_p_gpiog, 306928c10f9eSGabriel Fernandez [CK_BUS_GPIOH] = &ck_icn_p_gpioh, 307028c10f9eSGabriel Fernandez [CK_BUS_GPIOI] = &ck_icn_p_gpioi, 307128c10f9eSGabriel Fernandez [CK_BUS_GPIOJ] = &ck_icn_p_gpioj, 307228c10f9eSGabriel Fernandez [CK_BUS_GPIOK] = &ck_icn_p_gpiok, 307328c10f9eSGabriel Fernandez [CK_BUS_LPSRAM1] = &ck_icn_s_lpsram1, 307428c10f9eSGabriel Fernandez [CK_BUS_LPSRAM2] = &ck_icn_s_lpsram2, 307528c10f9eSGabriel Fernandez [CK_BUS_LPSRAM3] = &ck_icn_s_lpsram3, 307628c10f9eSGabriel Fernandez [CK_BUS_GPIOZ] = &ck_icn_p_gpioz, 307728c10f9eSGabriel Fernandez [CK_BUS_LPDMA] = &ck_icn_p_lpdma, 307828c10f9eSGabriel Fernandez [CK_BUS_ADF1] = &ck_icn_p_adf1, 307928c10f9eSGabriel Fernandez [CK_BUS_HSEM] = &ck_icn_p_hsem, 308028c10f9eSGabriel Fernandez [CK_BUS_RTC] = &ck_icn_p_rtc, 308128c10f9eSGabriel Fernandez [CK_BUS_IWDG5] = &ck_icn_p_iwdg5, 308228c10f9eSGabriel Fernandez [CK_BUS_WWDG2] = &ck_icn_p_wwdg2, 308328c10f9eSGabriel Fernandez [CK_BUS_STM] = &ck_icn_p_stm, 308428c10f9eSGabriel Fernandez [CK_KER_STM] = &ck_icn_s_stm, 308528c10f9eSGabriel Fernandez [CK_BUS_FMC] = &ck_icn_p_fmc, 308628c10f9eSGabriel Fernandez [CK_BUS_ETH1] = &ck_icn_p_eth1, 308728c10f9eSGabriel Fernandez [CK_BUS_ETHSW] = &ck_icn_p_ethsw, 308828c10f9eSGabriel Fernandez [CK_BUS_ETH2] = &ck_icn_p_eth2, 308928c10f9eSGabriel Fernandez [CK_BUS_PCIE] = &ck_icn_p_pcie, 309028c10f9eSGabriel Fernandez [CK_BUS_ADC12] = &ck_icn_p_adc12, 309128c10f9eSGabriel Fernandez [CK_BUS_ADC3] = &ck_icn_p_adc3, 309228c10f9eSGabriel Fernandez [CK_BUS_MDF1] = &ck_icn_p_mdf1, 309328c10f9eSGabriel Fernandez [CK_BUS_SPI8] = &ck_icn_p_spi8, 309428c10f9eSGabriel Fernandez [CK_BUS_LPUART1] = &ck_icn_p_lpuart1, 309528c10f9eSGabriel Fernandez [CK_BUS_I2C8] = &ck_icn_p_i2c8, 309628c10f9eSGabriel Fernandez [CK_BUS_LPTIM3] = &ck_icn_p_lptim3, 309728c10f9eSGabriel Fernandez [CK_BUS_LPTIM4] = &ck_icn_p_lptim4, 309828c10f9eSGabriel Fernandez [CK_BUS_LPTIM5] = &ck_icn_p_lptim5, 309928c10f9eSGabriel Fernandez [CK_BUS_RISAF4] = &ck_icn_p_risaf4, 310028c10f9eSGabriel Fernandez [CK_BUS_SDMMC1] = &ck_icn_m_sdmmc1, 310128c10f9eSGabriel Fernandez [CK_BUS_SDMMC2] = &ck_icn_m_sdmmc2, 310228c10f9eSGabriel Fernandez [CK_BUS_SDMMC3] = &ck_icn_m_sdmmc3, 310328c10f9eSGabriel Fernandez [CK_BUS_DDR] = &ck_icn_s_ddr, 310428c10f9eSGabriel Fernandez [CK_BUS_USB2OHCI] = &ck_icn_m_usb2ohci, 310528c10f9eSGabriel Fernandez [CK_BUS_USB2EHCI] = &ck_icn_m_usb2ehci, 310628c10f9eSGabriel Fernandez [CK_BUS_USB3DR] = &ck_icn_m_usb3dr, 310728c10f9eSGabriel Fernandez [CK_BUS_TIM2] = &ck_icn_p_tim2, 310828c10f9eSGabriel Fernandez [CK_BUS_TIM3] = &ck_icn_p_tim3, 310928c10f9eSGabriel Fernandez [CK_BUS_TIM4] = &ck_icn_p_tim4, 311028c10f9eSGabriel Fernandez [CK_BUS_TIM5] = &ck_icn_p_tim5, 311128c10f9eSGabriel Fernandez [CK_BUS_TIM6] = &ck_icn_p_tim6, 311228c10f9eSGabriel Fernandez [CK_BUS_TIM7] = &ck_icn_p_tim7, 311328c10f9eSGabriel Fernandez [CK_BUS_TIM10] = &ck_icn_p_tim10, 311428c10f9eSGabriel Fernandez [CK_BUS_TIM11] = &ck_icn_p_tim11, 311528c10f9eSGabriel Fernandez [CK_BUS_TIM12] = &ck_icn_p_tim12, 311628c10f9eSGabriel Fernandez [CK_BUS_TIM13] = &ck_icn_p_tim13, 311728c10f9eSGabriel Fernandez [CK_BUS_TIM14] = &ck_icn_p_tim14, 311828c10f9eSGabriel Fernandez [CK_BUS_LPTIM1] = &ck_icn_p_lptim1, 311928c10f9eSGabriel Fernandez [CK_BUS_LPTIM2] = &ck_icn_p_lptim2, 312028c10f9eSGabriel Fernandez [CK_BUS_SPI2] = &ck_icn_p_spi2, 312128c10f9eSGabriel Fernandez [CK_BUS_SPI3] = &ck_icn_p_spi3, 312228c10f9eSGabriel Fernandez [CK_BUS_SPDIFRX] = &ck_icn_p_spdifrx, 312328c10f9eSGabriel Fernandez [CK_BUS_USART2] = &ck_icn_p_usart2, 312428c10f9eSGabriel Fernandez [CK_BUS_USART3] = &ck_icn_p_usart3, 312528c10f9eSGabriel Fernandez [CK_BUS_UART4] = &ck_icn_p_uart4, 312628c10f9eSGabriel Fernandez [CK_BUS_UART5] = &ck_icn_p_uart5, 312728c10f9eSGabriel Fernandez [CK_BUS_I2C1] = &ck_icn_p_i2c1, 312828c10f9eSGabriel Fernandez [CK_BUS_I2C2] = &ck_icn_p_i2c2, 312928c10f9eSGabriel Fernandez [CK_BUS_I2C3] = &ck_icn_p_i2c3, 313028c10f9eSGabriel Fernandez [CK_BUS_I2C4] = &ck_icn_p_i2c4, 313128c10f9eSGabriel Fernandez [CK_BUS_I2C5] = &ck_icn_p_i2c5, 313228c10f9eSGabriel Fernandez [CK_BUS_I2C6] = &ck_icn_p_i2c6, 313328c10f9eSGabriel Fernandez [CK_BUS_I2C7] = &ck_icn_p_i2c7, 313428c10f9eSGabriel Fernandez [CK_BUS_I3C1] = &ck_icn_p_i3c1, 313528c10f9eSGabriel Fernandez [CK_BUS_I3C2] = &ck_icn_p_i3c2, 313628c10f9eSGabriel Fernandez [CK_BUS_I3C3] = &ck_icn_p_i3c3, 313728c10f9eSGabriel Fernandez [CK_BUS_I3C4] = &ck_icn_p_i3c4, 313828c10f9eSGabriel Fernandez [CK_BUS_TIM1] = &ck_icn_p_tim1, 313928c10f9eSGabriel Fernandez [CK_BUS_TIM8] = &ck_icn_p_tim8, 314028c10f9eSGabriel Fernandez [CK_BUS_TIM15] = &ck_icn_p_tim15, 314128c10f9eSGabriel Fernandez [CK_BUS_TIM16] = &ck_icn_p_tim16, 314228c10f9eSGabriel Fernandez [CK_BUS_TIM17] = &ck_icn_p_tim17, 314328c10f9eSGabriel Fernandez [CK_BUS_TIM20] = &ck_icn_p_tim20, 314428c10f9eSGabriel Fernandez [CK_BUS_SAI1] = &ck_icn_p_sai1, 314528c10f9eSGabriel Fernandez [CK_BUS_SAI2] = &ck_icn_p_sai2, 314628c10f9eSGabriel Fernandez [CK_BUS_SAI3] = &ck_icn_p_sai3, 314728c10f9eSGabriel Fernandez [CK_BUS_SAI4] = &ck_icn_p_sai4, 314828c10f9eSGabriel Fernandez [CK_BUS_USART1] = &ck_icn_p_usart1, 314928c10f9eSGabriel Fernandez [CK_BUS_USART6] = &ck_icn_p_usart6, 315028c10f9eSGabriel Fernandez [CK_BUS_UART7] = &ck_icn_p_uart7, 315128c10f9eSGabriel Fernandez [CK_BUS_UART8] = &ck_icn_p_uart8, 315228c10f9eSGabriel Fernandez [CK_BUS_UART9] = &ck_icn_p_uart9, 315328c10f9eSGabriel Fernandez [CK_BUS_FDCAN] = &ck_icn_p_fdcan, 315428c10f9eSGabriel Fernandez [CK_BUS_SPI1] = &ck_icn_p_spi1, 315528c10f9eSGabriel Fernandez [CK_BUS_SPI4] = &ck_icn_p_spi4, 315628c10f9eSGabriel Fernandez [CK_BUS_SPI5] = &ck_icn_p_spi5, 315728c10f9eSGabriel Fernandez [CK_BUS_SPI6] = &ck_icn_p_spi6, 315828c10f9eSGabriel Fernandez [CK_BUS_SPI7] = &ck_icn_p_spi7, 315928c10f9eSGabriel Fernandez [CK_BUS_BSEC] = &ck_icn_p_bsec, 316028c10f9eSGabriel Fernandez [CK_BUS_IWDG1] = &ck_icn_p_iwdg1, 316128c10f9eSGabriel Fernandez [CK_BUS_IWDG2] = &ck_icn_p_iwdg2, 316228c10f9eSGabriel Fernandez [CK_BUS_IWDG3] = &ck_icn_p_iwdg3, 316328c10f9eSGabriel Fernandez [CK_BUS_IWDG4] = &ck_icn_p_iwdg4, 316428c10f9eSGabriel Fernandez [CK_BUS_WWDG1] = &ck_icn_p_wwdg1, 316528c10f9eSGabriel Fernandez [CK_BUS_VREF] = &ck_icn_p_vref, 316628c10f9eSGabriel Fernandez [CK_BUS_SERC] = &ck_icn_p_serc, 316728c10f9eSGabriel Fernandez [CK_BUS_DTS] = &ck_icn_p_dts, 316828c10f9eSGabriel Fernandez [CK_BUS_HDP] = &ck_icn_p_hdp, 316928c10f9eSGabriel Fernandez [CK_BUS_IS2M] = &ck_icn_p_is2m, 317028c10f9eSGabriel Fernandez [CK_BUS_DSI] = &ck_icn_p_dsi, 317128c10f9eSGabriel Fernandez [CK_BUS_LTDC] = &ck_icn_p_ltdc, 317228c10f9eSGabriel Fernandez [CK_BUS_CSI] = &ck_icn_p_csi, 317328c10f9eSGabriel Fernandez [CK_BUS_DCMIPP] = &ck_icn_p_dcmipp, 317428c10f9eSGabriel Fernandez [CK_BUS_DDRC] = &ck_icn_p_ddrc, 317528c10f9eSGabriel Fernandez [CK_BUS_DDRCFG] = &ck_icn_p_ddrcfg, 317628c10f9eSGabriel Fernandez [CK_BUS_LVDS] = &ck_icn_p_lvds, 317728c10f9eSGabriel Fernandez [CK_BUS_GICV2M] = &ck_icn_p_gicv2m, 317828c10f9eSGabriel Fernandez [CK_BUS_USBTC] = &ck_icn_p_usbtc, 317928c10f9eSGabriel Fernandez [CK_BUS_USB3PCIEPHY] = &ck_icn_p_usb3pciephy, 318028c10f9eSGabriel Fernandez [CK_BUS_STGEN] = &ck_icn_p_stgen, 318128c10f9eSGabriel Fernandez [CK_BUS_VDEC] = &ck_icn_p_vdec, 318228c10f9eSGabriel Fernandez [CK_BUS_VENC] = &ck_icn_p_venc, 318328c10f9eSGabriel Fernandez [CK_SYSDBG] = &ck_sys_dbg, 318428c10f9eSGabriel Fernandez [CK_KER_TIM2] = &ck_ker_tim2, 318528c10f9eSGabriel Fernandez [CK_KER_TIM3] = &ck_ker_tim3, 318628c10f9eSGabriel Fernandez [CK_KER_TIM4] = &ck_ker_tim4, 318728c10f9eSGabriel Fernandez [CK_KER_TIM5] = &ck_ker_tim5, 318828c10f9eSGabriel Fernandez [CK_KER_TIM6] = &ck_ker_tim6, 318928c10f9eSGabriel Fernandez [CK_KER_TIM7] = &ck_ker_tim7, 319028c10f9eSGabriel Fernandez [CK_KER_TIM10] = &ck_ker_tim10, 319128c10f9eSGabriel Fernandez [CK_KER_TIM11] = &ck_ker_tim11, 319228c10f9eSGabriel Fernandez [CK_KER_TIM12] = &ck_ker_tim12, 319328c10f9eSGabriel Fernandez [CK_KER_TIM13] = &ck_ker_tim13, 319428c10f9eSGabriel Fernandez [CK_KER_TIM14] = &ck_ker_tim14, 319528c10f9eSGabriel Fernandez [CK_KER_TIM1] = &ck_ker_tim1, 319628c10f9eSGabriel Fernandez [CK_KER_TIM8] = &ck_ker_tim8, 319728c10f9eSGabriel Fernandez [CK_KER_TIM15] = &ck_ker_tim15, 319828c10f9eSGabriel Fernandez [CK_KER_TIM16] = &ck_ker_tim16, 319928c10f9eSGabriel Fernandez [CK_KER_TIM17] = &ck_ker_tim17, 320028c10f9eSGabriel Fernandez [CK_KER_TIM20] = &ck_ker_tim20, 320128c10f9eSGabriel Fernandez [CK_KER_LPTIM1] = &ck_ker_lptim1, 320228c10f9eSGabriel Fernandez [CK_KER_LPTIM2] = &ck_ker_lptim2, 320328c10f9eSGabriel Fernandez [CK_KER_USART2] = &ck_ker_usart2, 320428c10f9eSGabriel Fernandez [CK_KER_UART4] = &ck_ker_uart4, 320528c10f9eSGabriel Fernandez [CK_KER_USART3] = &ck_ker_usart3, 320628c10f9eSGabriel Fernandez [CK_KER_UART5] = &ck_ker_uart5, 320728c10f9eSGabriel Fernandez [CK_KER_SPI2] = &ck_ker_spi2, 320828c10f9eSGabriel Fernandez [CK_KER_SPI3] = &ck_ker_spi3, 320928c10f9eSGabriel Fernandez [CK_KER_SPDIFRX] = &ck_ker_spdifrx, 321028c10f9eSGabriel Fernandez [CK_KER_I2C1] = &ck_ker_i2c1, 321128c10f9eSGabriel Fernandez [CK_KER_I2C2] = &ck_ker_i2c2, 321228c10f9eSGabriel Fernandez [CK_KER_I3C1] = &ck_ker_i3c1, 321328c10f9eSGabriel Fernandez [CK_KER_I3C2] = &ck_ker_i3c2, 321428c10f9eSGabriel Fernandez [CK_KER_I2C3] = &ck_ker_i2c3, 321528c10f9eSGabriel Fernandez [CK_KER_I2C5] = &ck_ker_i2c5, 321628c10f9eSGabriel Fernandez [CK_KER_I3C3] = &ck_ker_i3c3, 321728c10f9eSGabriel Fernandez [CK_KER_I2C4] = &ck_ker_i2c4, 321828c10f9eSGabriel Fernandez [CK_KER_I2C6] = &ck_ker_i2c6, 321928c10f9eSGabriel Fernandez [CK_KER_I2C7] = &ck_ker_i2c7, 322028c10f9eSGabriel Fernandez [CK_KER_SPI1] = &ck_ker_spi1, 322128c10f9eSGabriel Fernandez [CK_KER_SPI4] = &ck_ker_spi4, 322228c10f9eSGabriel Fernandez [CK_KER_SPI5] = &ck_ker_spi5, 322328c10f9eSGabriel Fernandez [CK_KER_SPI6] = &ck_ker_spi6, 322428c10f9eSGabriel Fernandez [CK_KER_SPI7] = &ck_ker_spi7, 322528c10f9eSGabriel Fernandez [CK_KER_USART1] = &ck_ker_usart1, 322628c10f9eSGabriel Fernandez [CK_KER_USART6] = &ck_ker_usart6, 322728c10f9eSGabriel Fernandez [CK_KER_UART7] = &ck_ker_uart7, 322828c10f9eSGabriel Fernandez [CK_KER_UART8] = &ck_ker_uart8, 322928c10f9eSGabriel Fernandez [CK_KER_UART9] = &ck_ker_uart9, 323028c10f9eSGabriel Fernandez [CK_KER_MDF1] = &ck_ker_mdf1, 323128c10f9eSGabriel Fernandez [CK_KER_SAI1] = &ck_ker_sai1, 323228c10f9eSGabriel Fernandez [CK_KER_SAI2] = &ck_ker_sai2, 323328c10f9eSGabriel Fernandez [CK_KER_SAI3] = &ck_ker_sai3, 323428c10f9eSGabriel Fernandez [CK_KER_SAI4] = &ck_ker_sai4, 323528c10f9eSGabriel Fernandez [CK_KER_FDCAN] = &ck_ker_fdcan, 323628c10f9eSGabriel Fernandez [CK_KER_CSI] = &ck_ker_csi, 323728c10f9eSGabriel Fernandez [CK_KER_CSITXESC] = &ck_ker_csitxesc, 323828c10f9eSGabriel Fernandez [CK_KER_CSIPHY] = &ck_ker_csiphy, 323928c10f9eSGabriel Fernandez [CK_KER_STGEN] = &ck_ker_stgen, 324028c10f9eSGabriel Fernandez [CK_KER_USBTC] = &ck_ker_usbtc, 324128c10f9eSGabriel Fernandez [CK_KER_I3C4] = &ck_ker_i3c4, 324228c10f9eSGabriel Fernandez [CK_KER_SPI8] = &ck_ker_spi8, 324328c10f9eSGabriel Fernandez [CK_KER_I2C8] = &ck_ker_i2c8, 324428c10f9eSGabriel Fernandez [CK_KER_LPUART1] = &ck_ker_lpuart1, 324528c10f9eSGabriel Fernandez [CK_KER_LPTIM3] = &ck_ker_lptim3, 324628c10f9eSGabriel Fernandez [CK_KER_LPTIM4] = &ck_ker_lptim4, 324728c10f9eSGabriel Fernandez [CK_KER_LPTIM5] = &ck_ker_lptim5, 324828c10f9eSGabriel Fernandez [CK_KER_ADF1] = &ck_ker_adf1, 324928c10f9eSGabriel Fernandez [CK_KER_TSDBG] = &ck_ker_tsdbg, 325028c10f9eSGabriel Fernandez [CK_KER_TPIU] = &ck_ker_tpiu, 325128c10f9eSGabriel Fernandez [CK_BUS_ETR] = &ck_icn_p_etr, 325228c10f9eSGabriel Fernandez [CK_KER_ETR] = &ck_icn_m_etr, 325328c10f9eSGabriel Fernandez [CK_BUS_SYSATB] = &ck_sys_atb, 325428c10f9eSGabriel Fernandez [CK_KER_OSPI1] = &ck_ker_ospi1, 325528c10f9eSGabriel Fernandez [CK_KER_OSPI2] = &ck_ker_ospi2, 325628c10f9eSGabriel Fernandez [CK_KER_FMC] = &ck_ker_fmc, 325728c10f9eSGabriel Fernandez [CK_KER_SDMMC1] = &ck_ker_sdmmc1, 325828c10f9eSGabriel Fernandez [CK_KER_SDMMC2] = &ck_ker_sdmmc2, 325928c10f9eSGabriel Fernandez [CK_KER_SDMMC3] = &ck_ker_sdmmc3, 326028c10f9eSGabriel Fernandez [CK_KER_ETH1] = &ck_ker_eth1, 326128c10f9eSGabriel Fernandez [CK_ETH1_STP] = &ck_ker_eth1stp, 326228c10f9eSGabriel Fernandez [CK_KER_ETHSW] = &ck_ker_ethsw, 326328c10f9eSGabriel Fernandez [CK_KER_ETH2] = &ck_ker_eth2, 326428c10f9eSGabriel Fernandez [CK_ETH2_STP] = &ck_ker_eth2stp, 326528c10f9eSGabriel Fernandez [CK_KER_ETH1PTP] = &ck_ker_eth1ptp, 326628c10f9eSGabriel Fernandez [CK_KER_ETH2PTP] = &ck_ker_eth2ptp, 326728c10f9eSGabriel Fernandez [CK_BUS_GPU] = &ck_icn_m_gpu, 326828c10f9eSGabriel Fernandez [CK_KER_GPU] = &ck_ker_gpu, 326928c10f9eSGabriel Fernandez [CK_KER_ETHSWREF] = &ck_ker_ethswref, 327028c10f9eSGabriel Fernandez 327128c10f9eSGabriel Fernandez [CK_MCO1] = &ck_mco1, 327228c10f9eSGabriel Fernandez [CK_MCO2] = &ck_mco2, 327328c10f9eSGabriel Fernandez [CK_KER_ADC12] = &ck_ker_adc12, 327428c10f9eSGabriel Fernandez [CK_KER_ADC3] = &ck_ker_adc3, 327528c10f9eSGabriel Fernandez [CK_KER_USB2PHY1] = &ck_ker_usb2phy1, 327628c10f9eSGabriel Fernandez [CK_KER_USB2PHY2] = &ck_ker_usb2phy2, 327728c10f9eSGabriel Fernandez [CK_KER_USB2PHY2EN] = &ck_ker_usb2phy2_en, 327828c10f9eSGabriel Fernandez [CK_KER_USB3PCIEPHY] = &ck_ker_usb3pciephy, 327928c10f9eSGabriel Fernandez [CK_KER_LTDC] = &ck_ker_ltdc, 328028c10f9eSGabriel Fernandez [CK_KER_DSIBLANE] = &clk_lanebyte, 328128c10f9eSGabriel Fernandez [CK_KER_DSIPHY] = &ck_phy_dsi, 328228c10f9eSGabriel Fernandez [CK_KER_LVDSPHY] = &ck_ker_lvdsphy, 328328c10f9eSGabriel Fernandez [CK_KER_DTS] = &ck_ker_dts, 328428c10f9eSGabriel Fernandez [RTC_CK] = &ck_rtc, 328528c10f9eSGabriel Fernandez 328628c10f9eSGabriel Fernandez [CK_ETH1_MAC] = &ck_ker_eth1mac, 328728c10f9eSGabriel Fernandez [CK_ETH1_TX] = &ck_ker_eth1tx, 328828c10f9eSGabriel Fernandez [CK_ETH1_RX] = &ck_ker_eth1rx, 328928c10f9eSGabriel Fernandez [CK_ETH2_MAC] = &ck_ker_eth2mac, 329028c10f9eSGabriel Fernandez [CK_ETH2_TX] = &ck_ker_eth2tx, 329128c10f9eSGabriel Fernandez [CK_ETH2_RX] = &ck_ker_eth2rx, 329228c10f9eSGabriel Fernandez 329328c10f9eSGabriel Fernandez [CK_HSE_RTC] = &ck_hse_rtc, 329428c10f9eSGabriel Fernandez [CK_OBSER0] = &ck_obser0, 329528c10f9eSGabriel Fernandez [CK_OBSER1] = &ck_obser1, 329628c10f9eSGabriel Fernandez [CK_OFF] = &ck_off, 329728c10f9eSGabriel Fernandez [I2SCKIN] = &i2sckin, 329828c10f9eSGabriel Fernandez [SPDIFSYMB] = &spdifsymb, 329928c10f9eSGabriel Fernandez [TXBYTECLK] = &txbyteclk, 330028c10f9eSGabriel Fernandez }; 330128c10f9eSGabriel Fernandez 330228c10f9eSGabriel Fernandez static bool clk_stm32_clock_is_critical(struct clk *clk) 330328c10f9eSGabriel Fernandez { 330428c10f9eSGabriel Fernandez struct clk *clk_criticals[] = { 330528c10f9eSGabriel Fernandez &ck_hsi, 330628c10f9eSGabriel Fernandez &ck_hse, 330728c10f9eSGabriel Fernandez &ck_msi, 330828c10f9eSGabriel Fernandez &ck_lsi, 330928c10f9eSGabriel Fernandez &ck_lse, 331028c10f9eSGabriel Fernandez &ck_cpu1, 331128c10f9eSGabriel Fernandez &ck_icn_p_syscpu1, 331228c10f9eSGabriel Fernandez &ck_icn_s_ddr, 331328c10f9eSGabriel Fernandez &ck_icn_p_ddrc, 331428c10f9eSGabriel Fernandez &ck_icn_p_ddrcfg, 331528c10f9eSGabriel Fernandez &ck_icn_p_ddrphyc, 331628c10f9eSGabriel Fernandez &ck_icn_s_sysram, 331728c10f9eSGabriel Fernandez &ck_icn_s_bkpsram, 331828c10f9eSGabriel Fernandez &ck_ker_fmc, 331928c10f9eSGabriel Fernandez &ck_ker_ospi1, 332028c10f9eSGabriel Fernandez &ck_ker_ospi2, 332128c10f9eSGabriel Fernandez &ck_icn_s_vderam, 332228c10f9eSGabriel Fernandez &ck_icn_s_lpsram1, 332328c10f9eSGabriel Fernandez &ck_icn_s_lpsram2, 332428c10f9eSGabriel Fernandez &ck_icn_s_lpsram3, 332528c10f9eSGabriel Fernandez &ck_icn_p_hpdma1, 332628c10f9eSGabriel Fernandez &ck_icn_p_hpdma2, 332728c10f9eSGabriel Fernandez &ck_icn_p_hpdma3, 332828c10f9eSGabriel Fernandez &ck_icn_p_gpioa, 332928c10f9eSGabriel Fernandez &ck_icn_p_gpiob, 333028c10f9eSGabriel Fernandez &ck_icn_p_gpioc, 333128c10f9eSGabriel Fernandez &ck_icn_p_gpiod, 333228c10f9eSGabriel Fernandez &ck_icn_p_gpioe, 333328c10f9eSGabriel Fernandez &ck_icn_p_gpiof, 333428c10f9eSGabriel Fernandez &ck_icn_p_gpiog, 333528c10f9eSGabriel Fernandez &ck_icn_p_gpioh, 333628c10f9eSGabriel Fernandez &ck_icn_p_gpioi, 333728c10f9eSGabriel Fernandez &ck_icn_p_gpioj, 333828c10f9eSGabriel Fernandez &ck_icn_p_gpiok, 333928c10f9eSGabriel Fernandez &ck_icn_p_gpioz, 334028c10f9eSGabriel Fernandez &ck_icn_p_ipcc1, 334128c10f9eSGabriel Fernandez &ck_icn_p_ipcc2, 334228c10f9eSGabriel Fernandez &ck_icn_p_gicv2m, 334328c10f9eSGabriel Fernandez &ck_icn_p_rtc 334428c10f9eSGabriel Fernandez }; 334528c10f9eSGabriel Fernandez size_t i = 0; 334628c10f9eSGabriel Fernandez 334728c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clk_criticals); i++) 334828c10f9eSGabriel Fernandez if (clk == clk_criticals[i]) 334928c10f9eSGabriel Fernandez return true; 335028c10f9eSGabriel Fernandez return false; 335128c10f9eSGabriel Fernandez } 335228c10f9eSGabriel Fernandez 335328c10f9eSGabriel Fernandez static void clk_stm32_init_oscillators(const void *fdt, int node) 335428c10f9eSGabriel Fernandez { 335528c10f9eSGabriel Fernandez size_t i = 0; 335628c10f9eSGabriel Fernandez static const char * const name[] = { 335728c10f9eSGabriel Fernandez "clk-hse", "clk-hsi", "clk-lse", 335828c10f9eSGabriel Fernandez "clk-lsi", "clk-msi", "clk-i2sin" 335928c10f9eSGabriel Fernandez }; 336028c10f9eSGabriel Fernandez struct clk *clks[ARRAY_SIZE(name)] = { 336128c10f9eSGabriel Fernandez &ck_hse, &ck_hsi, &ck_lse, 336228c10f9eSGabriel Fernandez &ck_lsi, &ck_msi, &i2sckin 336328c10f9eSGabriel Fernandez }; 336428c10f9eSGabriel Fernandez 336528c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clks); i++) { 336628c10f9eSGabriel Fernandez struct clk *clk = NULL; 336728c10f9eSGabriel Fernandez 336828c10f9eSGabriel Fernandez if (clk_dt_get_by_name(fdt, node, name[i], &clk)) 336928c10f9eSGabriel Fernandez panic(); 337028c10f9eSGabriel Fernandez 337128c10f9eSGabriel Fernandez clks[i]->parents[0] = clk; 337228c10f9eSGabriel Fernandez } 337328c10f9eSGabriel Fernandez } 337428c10f9eSGabriel Fernandez 337528c10f9eSGabriel Fernandez static TEE_Result clk_stm32_apply_rcc_config(struct stm32_clk_platdata *pdata) 337628c10f9eSGabriel Fernandez { 337728c10f9eSGabriel Fernandez if (pdata->safe_rst) 337828c10f9eSGabriel Fernandez stm32mp25_syscfg_set_safe_reset(true); 337928c10f9eSGabriel Fernandez 338028c10f9eSGabriel Fernandez return TEE_SUCCESS; 338128c10f9eSGabriel Fernandez } 338228c10f9eSGabriel Fernandez 338328c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg mp25_pll[PLL_NB]; 338428c10f9eSGabriel Fernandez static struct stm32_clk_opp_dt_cfg mp25_clk_opp; 338528c10f9eSGabriel Fernandez static struct stm32_osci_dt_cfg mp25_osci[NB_OSCILLATOR]; 338628c10f9eSGabriel Fernandez 338728c10f9eSGabriel Fernandez #define DT_FLEXGEN_CLK_MAX 64 338828c10f9eSGabriel Fernandez static uint32_t mp25_flexgen[DT_FLEXGEN_CLK_MAX]; 338928c10f9eSGabriel Fernandez 339028c10f9eSGabriel Fernandez #define DT_BUS_CLK_MAX 6 339128c10f9eSGabriel Fernandez static uint32_t mp25_busclk[DT_BUS_CLK_MAX]; 339228c10f9eSGabriel Fernandez 339328c10f9eSGabriel Fernandez #define DT_KERNEL_CLK_MAX 20 339428c10f9eSGabriel Fernandez static uint32_t mp25_kernelclk[DT_KERNEL_CLK_MAX]; 339528c10f9eSGabriel Fernandez 339628c10f9eSGabriel Fernandez static struct stm32_clk_platdata stm32mp25_clock_pdata = { 339728c10f9eSGabriel Fernandez .osci = mp25_osci, 339828c10f9eSGabriel Fernandez .nosci = NB_OSCILLATOR, 339928c10f9eSGabriel Fernandez .pll = mp25_pll, 340028c10f9eSGabriel Fernandez .npll = PLL_NB, 340128c10f9eSGabriel Fernandez .opp = &mp25_clk_opp, 340228c10f9eSGabriel Fernandez .busclk = mp25_busclk, 340328c10f9eSGabriel Fernandez .nbusclk = DT_BUS_CLK_MAX, 340428c10f9eSGabriel Fernandez .kernelclk = mp25_kernelclk, 340528c10f9eSGabriel Fernandez .nkernelclk = DT_KERNEL_CLK_MAX, 340628c10f9eSGabriel Fernandez .flexgen = mp25_flexgen, 340728c10f9eSGabriel Fernandez .nflexgen = DT_FLEXGEN_CLK_MAX, 340828c10f9eSGabriel Fernandez }; 340928c10f9eSGabriel Fernandez 341028c10f9eSGabriel Fernandez static struct clk_stm32_priv stm32mp25_clock_data = { 341128c10f9eSGabriel Fernandez .muxes = parent_mp25, 341228c10f9eSGabriel Fernandez .nb_muxes = ARRAY_SIZE(parent_mp25), 341328c10f9eSGabriel Fernandez .gates = gates_mp25, 341428c10f9eSGabriel Fernandez .nb_gates = ARRAY_SIZE(gates_mp25), 341528c10f9eSGabriel Fernandez .div = dividers_mp25, 341628c10f9eSGabriel Fernandez .nb_div = ARRAY_SIZE(dividers_mp25), 341728c10f9eSGabriel Fernandez .pdata = &stm32mp25_clock_pdata, 341828c10f9eSGabriel Fernandez .nb_clk_refs = STM32MP25_ALL_CLK_NB, 341928c10f9eSGabriel Fernandez .clk_refs = stm32mp25_clk_provided, 342028c10f9eSGabriel Fernandez .is_critical = clk_stm32_clock_is_critical, 342128c10f9eSGabriel Fernandez }; 342228c10f9eSGabriel Fernandez 342328c10f9eSGabriel Fernandez static TEE_Result stm32mp2_clk_probe(const void *fdt, int node, 342428c10f9eSGabriel Fernandez const void *compat_data __unused) 342528c10f9eSGabriel Fernandez { 342628c10f9eSGabriel Fernandez TEE_Result res = TEE_ERROR_GENERIC; 342728c10f9eSGabriel Fernandez int fdt_rc = 0; 342828c10f9eSGabriel Fernandez int rc = 0; 342928c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = &stm32mp25_clock_data; 343028c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata; 343128c10f9eSGabriel Fernandez 343228c10f9eSGabriel Fernandez fdt_rc = stm32_clk_parse_fdt(fdt, node, pdata); 343328c10f9eSGabriel Fernandez if (fdt_rc) { 343428c10f9eSGabriel Fernandez EMSG("Failed to parse clock node %s: %d", 343528c10f9eSGabriel Fernandez fdt_get_name(fdt, node, NULL), fdt_rc); 343628c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 343728c10f9eSGabriel Fernandez } 343828c10f9eSGabriel Fernandez 343928c10f9eSGabriel Fernandez rc = clk_stm32_init(priv, stm32_rcc_base()); 344028c10f9eSGabriel Fernandez if (rc) 344128c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 344228c10f9eSGabriel Fernandez 344328c10f9eSGabriel Fernandez stm32mp2_init_clock_tree(priv, pdata); 344428c10f9eSGabriel Fernandez 344528c10f9eSGabriel Fernandez clk_stm32_init_oscillators(fdt, node); 344628c10f9eSGabriel Fernandez 344728c10f9eSGabriel Fernandez res = clk_stm32_apply_rcc_config(pdata); 344828c10f9eSGabriel Fernandez if (res) 344928c10f9eSGabriel Fernandez panic("Error when applying RCC config"); 345028c10f9eSGabriel Fernandez 345128c10f9eSGabriel Fernandez stm32mp_clk_provider_probe_final(fdt, node, priv); 345228c10f9eSGabriel Fernandez 345328c10f9eSGabriel Fernandez if (IS_ENABLED(CFG_STM32_CLK_DEBUG)) 345428c10f9eSGabriel Fernandez clk_print_tree(); 345528c10f9eSGabriel Fernandez 345628c10f9eSGabriel Fernandez return TEE_SUCCESS; 345728c10f9eSGabriel Fernandez } 345828c10f9eSGabriel Fernandez 345928c10f9eSGabriel Fernandez CLK_DT_DECLARE(stm32mp25_clk, "st,stm32mp25-rcc", stm32mp2_clk_probe); 3460