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