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) 104728c10f9eSGabriel Fernandez return ret; 104828c10f9eSGabriel Fernandez 104928c10f9eSGabriel Fernandez if (strncmp(cchar, name, (size_t)ret) || 105028c10f9eSGabriel Fernandez fdt_get_status(fdt, subnode) == DT_STATUS_DISABLED) 105128c10f9eSGabriel Fernandez continue; 105228c10f9eSGabriel Fernandez 105328c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "clock-frequency", &ret); 105428c10f9eSGabriel Fernandez if (!cuint) 105528c10f9eSGabriel Fernandez return ret; 105628c10f9eSGabriel Fernandez 105728c10f9eSGabriel Fernandez osci->freq = fdt32_to_cpu(*cuint); 105828c10f9eSGabriel Fernandez 105928c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,bypass", NULL)) 106028c10f9eSGabriel Fernandez osci->bypass = true; 106128c10f9eSGabriel Fernandez 106228c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,digbypass", NULL)) 106328c10f9eSGabriel Fernandez osci->digbyp = true; 106428c10f9eSGabriel Fernandez 106528c10f9eSGabriel Fernandez if (fdt_getprop(fdt, subnode, "st,css", NULL)) 106628c10f9eSGabriel Fernandez osci->css = true; 106728c10f9eSGabriel Fernandez 106828c10f9eSGabriel Fernandez osci->drive = fdt_read_uint32_default(fdt, subnode, "st,drive", 106928c10f9eSGabriel Fernandez LSEDRV_MEDIUM_HIGH); 107028c10f9eSGabriel Fernandez 107128c10f9eSGabriel Fernandez return 0; 107228c10f9eSGabriel Fernandez } 107328c10f9eSGabriel Fernandez 107428c10f9eSGabriel Fernandez return 0; 107528c10f9eSGabriel Fernandez } 107628c10f9eSGabriel Fernandez 107728c10f9eSGabriel Fernandez static const char *stm32_clk_get_oscillator_name(enum stm32_osc id) 107828c10f9eSGabriel Fernandez { 107928c10f9eSGabriel Fernandez if (id < NB_OSCILLATOR) 108028c10f9eSGabriel Fernandez return stm32mp25_osc_data[id].name; 108128c10f9eSGabriel Fernandez 108228c10f9eSGabriel Fernandez return NULL; 108328c10f9eSGabriel Fernandez } 108428c10f9eSGabriel Fernandez 108528c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_oscillator(const void *fdt, 108628c10f9eSGabriel Fernandez int node __unused, 108728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 108828c10f9eSGabriel Fernandez { 108928c10f9eSGabriel Fernandez int fdt_err = 0; 109028c10f9eSGabriel Fernandez size_t i = 0; 109128c10f9eSGabriel Fernandez int osc_node = 0; 109228c10f9eSGabriel Fernandez 109328c10f9eSGabriel Fernandez osc_node = fdt_path_offset(fdt, "/clocks"); 109428c10f9eSGabriel Fernandez if (osc_node < 0) 109528c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND; 109628c10f9eSGabriel Fernandez 109728c10f9eSGabriel Fernandez for (i = 0; i < pdata->nosci; i++) { 109828c10f9eSGabriel Fernandez const char *name = NULL; 109928c10f9eSGabriel Fernandez 110028c10f9eSGabriel Fernandez name = stm32_clk_get_oscillator_name((enum stm32_osc)i); 110128c10f9eSGabriel Fernandez if (!name) 110228c10f9eSGabriel Fernandez continue; 110328c10f9eSGabriel Fernandez 110428c10f9eSGabriel Fernandez fdt_err = stm32_clk_parse_oscillator_fdt(fdt, osc_node, name, 110528c10f9eSGabriel Fernandez &pdata->osci[i]); 110628c10f9eSGabriel Fernandez if (fdt_err < 0) 110728c10f9eSGabriel Fernandez panic(); 110828c10f9eSGabriel Fernandez } 110928c10f9eSGabriel Fernandez 111028c10f9eSGabriel Fernandez return 0; 111128c10f9eSGabriel Fernandez } 111228c10f9eSGabriel Fernandez 111328c10f9eSGabriel Fernandez static int clk_stm32_parse_pll_fdt(const void *fdt, int subnode, 111428c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll) 111528c10f9eSGabriel Fernandez { 111628c10f9eSGabriel Fernandez const fdt32_t *cuint = NULL; 111728c10f9eSGabriel Fernandez int subnode_pll = 0; 111828c10f9eSGabriel Fernandez int err = 0; 111928c10f9eSGabriel Fernandez 112028c10f9eSGabriel Fernandez cuint = fdt_getprop(fdt, subnode, "st,pll", NULL); 112128c10f9eSGabriel Fernandez if (!cuint) 112228c10f9eSGabriel Fernandez return 0; 112328c10f9eSGabriel Fernandez 112428c10f9eSGabriel Fernandez subnode_pll = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint)); 112528c10f9eSGabriel Fernandez if (subnode_pll < 0) 112628c10f9eSGabriel Fernandez return -FDT_ERR_NOTFOUND; 112728c10f9eSGabriel Fernandez 112828c10f9eSGabriel Fernandez if (fdt_read_uint32_array(fdt, subnode_pll, "cfg", pll->cfg, 112928c10f9eSGabriel Fernandez PLLCFG_NB) != 0) 113028c10f9eSGabriel Fernandez panic("cfg property is mandatory"); 113128c10f9eSGabriel Fernandez 113228c10f9eSGabriel Fernandez err = fdt_read_uint32_array(fdt, subnode_pll, "csg", pll->csg, 113328c10f9eSGabriel Fernandez PLLCSG_NB); 113428c10f9eSGabriel Fernandez 113528c10f9eSGabriel Fernandez pll->csg_enabled = (err == 0); 113628c10f9eSGabriel Fernandez 113728c10f9eSGabriel Fernandez if (err == -FDT_ERR_NOTFOUND) 113828c10f9eSGabriel Fernandez err = 0; 113928c10f9eSGabriel Fernandez 114028c10f9eSGabriel Fernandez if (err != 0) 114128c10f9eSGabriel Fernandez return err; 114228c10f9eSGabriel Fernandez 114328c10f9eSGabriel Fernandez pll->enabled = true; 114428c10f9eSGabriel Fernandez 114528c10f9eSGabriel Fernandez pll->frac = fdt_read_uint32_default(fdt, subnode_pll, "frac", 0); 114628c10f9eSGabriel Fernandez 114728c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode_pll, "src", &pll->src)) 114828c10f9eSGabriel Fernandez panic("src property is mandatory"); 114928c10f9eSGabriel Fernandez 115028c10f9eSGabriel Fernandez return 0; 115128c10f9eSGabriel Fernandez } 115228c10f9eSGabriel Fernandez 115328c10f9eSGabriel Fernandez #define RCC_PLL_NAME_SIZE 20 115428c10f9eSGabriel Fernandez 115528c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_pll(const void *fdt, int node, 115628c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 115728c10f9eSGabriel Fernandez { 115828c10f9eSGabriel Fernandez unsigned int i = 0; 115928c10f9eSGabriel Fernandez 116028c10f9eSGabriel Fernandez for (i = 0; i < pdata->npll; i++) { 116128c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll = pdata->pll + i; 116228c10f9eSGabriel Fernandez char name[RCC_PLL_NAME_SIZE] = { }; 116328c10f9eSGabriel Fernandez int subnode = 0; 116428c10f9eSGabriel Fernandez 116528c10f9eSGabriel Fernandez snprintf(name, sizeof(name), "st,pll-%u", i + 1); 116628c10f9eSGabriel Fernandez 116728c10f9eSGabriel Fernandez subnode = fdt_subnode_offset(fdt, node, name); 116828c10f9eSGabriel Fernandez if (subnode < 0) 116928c10f9eSGabriel Fernandez continue; 117028c10f9eSGabriel Fernandez 117128c10f9eSGabriel Fernandez if (clk_stm32_parse_pll_fdt(fdt, subnode, pll)) 117228c10f9eSGabriel Fernandez panic(); 117328c10f9eSGabriel Fernandez } 117428c10f9eSGabriel Fernandez 117528c10f9eSGabriel Fernandez return 0; 117628c10f9eSGabriel Fernandez } 117728c10f9eSGabriel Fernandez 117828c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_opp(const void *fdt, int node, 117928c10f9eSGabriel Fernandez const char *opp_name, 118028c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp_cfg) 118128c10f9eSGabriel Fernandez { 118228c10f9eSGabriel Fernandez int subnode = 0; 118328c10f9eSGabriel Fernandez int nb_opp = 0; 118428c10f9eSGabriel Fernandez int ret = 0; 118528c10f9eSGabriel Fernandez 118628c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, opp_name); 118728c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND) 118828c10f9eSGabriel Fernandez return 0; 118928c10f9eSGabriel Fernandez 119028c10f9eSGabriel Fernandez if (node < 0) 119128c10f9eSGabriel Fernandez return node; 119228c10f9eSGabriel Fernandez 119328c10f9eSGabriel Fernandez fdt_for_each_subnode(subnode, fdt, node) { 119428c10f9eSGabriel Fernandez assert(nb_opp <= MAX_OPP); 119528c10f9eSGabriel Fernandez 119628c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "hz", &opp_cfg->frq)) 119728c10f9eSGabriel Fernandez panic("hz property is mandatory"); 119828c10f9eSGabriel Fernandez 119928c10f9eSGabriel Fernandez if (fdt_read_uint32(fdt, subnode, "st,clksrc", &opp_cfg->src)) 120028c10f9eSGabriel Fernandez panic("st,clksrc property is mandatory"); 120128c10f9eSGabriel Fernandez 120228c10f9eSGabriel Fernandez ret = clk_stm32_parse_pll_fdt(fdt, subnode, &opp_cfg->pll_cfg); 120328c10f9eSGabriel Fernandez if (ret < 0) 120428c10f9eSGabriel Fernandez return ret; 120528c10f9eSGabriel Fernandez 120628c10f9eSGabriel Fernandez opp_cfg++; 120728c10f9eSGabriel Fernandez nb_opp++; 120828c10f9eSGabriel Fernandez } 120928c10f9eSGabriel Fernandez 121028c10f9eSGabriel Fernandez return 0; 121128c10f9eSGabriel Fernandez } 121228c10f9eSGabriel Fernandez 121328c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt_all_opp(const void *fdt, int node, 121428c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 121528c10f9eSGabriel Fernandez { 121628c10f9eSGabriel Fernandez struct stm32_clk_opp_dt_cfg *opp = pdata->opp; 121728c10f9eSGabriel Fernandez 121828c10f9eSGabriel Fernandez node = fdt_subnode_offset(fdt, node, "st,clk_opp"); 121928c10f9eSGabriel Fernandez if (node == -FDT_ERR_NOTFOUND) 122028c10f9eSGabriel Fernandez return 0; 122128c10f9eSGabriel Fernandez 122228c10f9eSGabriel Fernandez if (node < 0) 122328c10f9eSGabriel Fernandez return node; 122428c10f9eSGabriel Fernandez 122528c10f9eSGabriel Fernandez return stm32_clk_parse_fdt_opp(fdt, node, "st,ck_cpu1", opp->cpu1_opp); 122628c10f9eSGabriel Fernandez } 122728c10f9eSGabriel Fernandez 122828c10f9eSGabriel Fernandez static int stm32_clk_parse_fdt(const void *fdt, int node, 122928c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 123028c10f9eSGabriel Fernandez { 1231b5f8fc36SGatien Chevallier const fdt32_t *cuint = NULL; 1232b5f8fc36SGatien Chevallier unsigned int i = 0; 1233b5f8fc36SGatien Chevallier int lenp = 0; 123428c10f9eSGabriel Fernandez int err = 0; 123528c10f9eSGabriel Fernandez 123628c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_oscillator(fdt, node, pdata); 123728c10f9eSGabriel Fernandez if (err != 0) 123828c10f9eSGabriel Fernandez return err; 123928c10f9eSGabriel Fernandez 124028c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_pll(fdt, node, pdata); 124128c10f9eSGabriel Fernandez if (err != 0) 124228c10f9eSGabriel Fernandez return err; 124328c10f9eSGabriel Fernandez 124428c10f9eSGabriel Fernandez err = stm32_clk_parse_fdt_all_opp(fdt, node, pdata); 124528c10f9eSGabriel Fernandez if (err != 0) 124628c10f9eSGabriel Fernandez return err; 124728c10f9eSGabriel Fernandez 124828c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,busclk", 124928c10f9eSGabriel Fernandez pdata->busclk, 125028c10f9eSGabriel Fernandez &pdata->nbusclk); 125128c10f9eSGabriel Fernandez if (err != 0) 125228c10f9eSGabriel Fernandez return err; 125328c10f9eSGabriel Fernandez 125428c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,flexgen", 125528c10f9eSGabriel Fernandez pdata->flexgen, 125628c10f9eSGabriel Fernandez &pdata->nflexgen); 125728c10f9eSGabriel Fernandez if (err != 0) 125828c10f9eSGabriel Fernandez return err; 125928c10f9eSGabriel Fernandez 126028c10f9eSGabriel Fernandez err = clk_stm32_parse_fdt_by_name(fdt, node, "st,kerclk", 126128c10f9eSGabriel Fernandez pdata->kernelclk, 126228c10f9eSGabriel Fernandez &pdata->nkernelclk); 126328c10f9eSGabriel Fernandez if (err != 0) 126428c10f9eSGabriel Fernandez return err; 126528c10f9eSGabriel Fernandez 126628c10f9eSGabriel Fernandez pdata->c1msrd = fdt_read_uint32_default(fdt, node, "st,c1msrd", 0); 126728c10f9eSGabriel Fernandez 126828c10f9eSGabriel Fernandez if (fdt_getprop(fdt, node, "st,safe_rst", NULL)) 126928c10f9eSGabriel Fernandez pdata->safe_rst = true; 127028c10f9eSGabriel Fernandez 127128c10f9eSGabriel Fernandez pdata->rcc_base = stm32_rcc_base(); 127228c10f9eSGabriel Fernandez 1273b5f8fc36SGatien Chevallier cuint = fdt_getprop(fdt, node, "st,protreg", &lenp); 1274b5f8fc36SGatien Chevallier if (lenp < 0) { 1275b5f8fc36SGatien Chevallier if (lenp != -FDT_ERR_NOTFOUND) 1276b5f8fc36SGatien Chevallier return lenp; 1277b5f8fc36SGatien Chevallier 1278b5f8fc36SGatien Chevallier lenp = 0; 1279b5f8fc36SGatien Chevallier DMSG("No RIF configuration available"); 1280b5f8fc36SGatien Chevallier } 1281b5f8fc36SGatien Chevallier 1282b5f8fc36SGatien Chevallier pdata->nb_res = (unsigned int)(lenp / sizeof(uint32_t)); 1283b5f8fc36SGatien Chevallier 1284b5f8fc36SGatien Chevallier assert(pdata->nb_res <= RCC_NB_RIF_RES); 1285b5f8fc36SGatien Chevallier 1286b5f8fc36SGatien Chevallier pdata->conf_data.cid_confs = calloc(RCC_NB_RIF_RES, sizeof(uint32_t)); 1287b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t)); 1288b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t)); 1289b5f8fc36SGatien Chevallier pdata->conf_data.lock_conf = calloc(RCC_NB_CONFS, sizeof(uint32_t)); 1290b5f8fc36SGatien Chevallier pdata->conf_data.access_mask = calloc(RCC_NB_CONFS, sizeof(uint32_t)); 1291b5f8fc36SGatien Chevallier if (!pdata->conf_data.cid_confs || !pdata->conf_data.sec_conf || 1292b5f8fc36SGatien Chevallier !pdata->conf_data.priv_conf || !pdata->conf_data.access_mask || 1293b5f8fc36SGatien Chevallier !pdata->conf_data.lock_conf) 1294b5f8fc36SGatien Chevallier panic("Missing memory capacity for RCC RIF configuration"); 1295b5f8fc36SGatien Chevallier 1296b5f8fc36SGatien Chevallier for (i = 0; i < pdata->nb_res; i++) 1297b5f8fc36SGatien Chevallier stm32_rif_parse_cfg(fdt32_to_cpu(cuint[i]), &pdata->conf_data, 1298b5f8fc36SGatien Chevallier RCC_NB_RIF_RES); 1299b5f8fc36SGatien Chevallier 130028c10f9eSGabriel Fernandez return 0; 130128c10f9eSGabriel Fernandez } 130228c10f9eSGabriel Fernandez 1303*7b8c7554SGabriel Fernandez static void stm32mp2_a35_ss_on_bypass(void) 130428c10f9eSGabriel Fernandez { 130528c10f9eSGabriel Fernandez uint64_t timeout = 0; 1306*7b8c7554SGabriel Fernandez uint32_t chgclkreq = stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ); 130728c10f9eSGabriel Fernandez 1308*7b8c7554SGabriel Fernandez if (chgclkreq & A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) { 1309*7b8c7554SGabriel Fernandez /* Nothing to do, clock source is already set on bypass clock */ 131028c10f9eSGabriel Fernandez return; 1311*7b8c7554SGabriel Fernandez } 1312*7b8c7554SGabriel Fernandez 1313*7b8c7554SGabriel Fernandez /* 1314*7b8c7554SGabriel Fernandez * for clkext2f frequency at 400MHZ, the default flexgen63 config, 1315*7b8c7554SGabriel Fernandez * divider by 2 is required with ARM_DIVSEL=0 1316*7b8c7554SGabriel Fernandez */ 1317*7b8c7554SGabriel Fernandez if (chgclkreq & A35SS_SSC_CHGCLKREQ_ARM_DIVSEL) { 1318*7b8c7554SGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 1319*7b8c7554SGabriel Fernandez 0U, 1320*7b8c7554SGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_DIVSEL); 1321*7b8c7554SGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 1322*7b8c7554SGabriel Fernandez while (!timeout_elapsed(timeout)) 1323*7b8c7554SGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1324*7b8c7554SGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_DIVSELACK)) 1325*7b8c7554SGabriel Fernandez break; 1326*7b8c7554SGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 1327*7b8c7554SGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_DIVSELACK) 1328*7b8c7554SGabriel Fernandez panic("Cannot set div on A35 bypass clock"); 1329*7b8c7554SGabriel Fernandez } 133028c10f9eSGabriel Fernandez 133128c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 133228c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_EN, 133328c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK); 133428c10f9eSGabriel Fernandez 133528c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 133628c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 133728c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 133828c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) 133928c10f9eSGabriel Fernandez break; 134028c10f9eSGabriel Fernandez 134128c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 134228c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)) 134328c10f9eSGabriel Fernandez panic("Cannot switch A35 to bypass clock"); 134428c10f9eSGabriel Fernandez 134528c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 134628c10f9eSGabriel Fernandez 0, 134728c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK); 134828c10f9eSGabriel Fernandez } 134928c10f9eSGabriel Fernandez 135028c10f9eSGabriel Fernandez static void stm32mp2_clk_xbar_on_hsi(struct clk_stm32_priv *priv) 135128c10f9eSGabriel Fernandez { 135228c10f9eSGabriel Fernandez uintptr_t xbar0cfgr = priv->base + RCC_XBAR0CFGR; 135328c10f9eSGabriel Fernandez uint32_t i = 0; 135428c10f9eSGabriel Fernandez 135528c10f9eSGabriel Fernandez for (i = 0; i < XBAR_ROOT_CHANNEL_NB; i++) 135628c10f9eSGabriel Fernandez io_clrsetbits32(xbar0cfgr + (0x4 * i), 135728c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, XBAR_SRC_HSI); 135828c10f9eSGabriel Fernandez } 135928c10f9eSGabriel Fernandez 136028c10f9eSGabriel Fernandez static int stm32mp2_a35_pll1_start(void) 136128c10f9eSGabriel Fernandez { 136228c10f9eSGabriel Fernandez uint64_t timeout = 0; 136328c10f9eSGabriel Fernandez 136428c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 136528c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_PD_EN, 136628c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_PD_EN); 136728c10f9eSGabriel Fernandez 136828c10f9eSGabriel Fernandez /* Wait PLL lock */ 136928c10f9eSGabriel Fernandez timeout = timeout_init_us(PLLRDY_TIMEOUT); 137028c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 137128c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_PLL_EN) & 137228c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_LOCKP_MASK) 137328c10f9eSGabriel Fernandez break; 137428c10f9eSGabriel Fernandez 137528c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_PLL_EN) & 137628c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_LOCKP_MASK)) { 137728c10f9eSGabriel Fernandez EMSG("PLL1 not locked"); 137828c10f9eSGabriel Fernandez return -1; 137928c10f9eSGabriel Fernandez } 138028c10f9eSGabriel Fernandez 138128c10f9eSGabriel Fernandez /* De-assert reset on PLL output clock path */ 138228c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_EN, 138328c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_EN, 138428c10f9eSGabriel Fernandez A35SS_SSC_PLL_ENABLE_NRESET_SWPLL_FF_MASK); 138528c10f9eSGabriel Fernandez 138628c10f9eSGabriel Fernandez /* Switch CPU clock to PLL clock */ 138728c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_CHGCLKREQ, 138828c10f9eSGabriel Fernandez 0, 138928c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKREQ_MASK); 139028c10f9eSGabriel Fernandez 139128c10f9eSGabriel Fernandez /* Wait for clock change acknowledge */ 139228c10f9eSGabriel Fernandez timeout = timeout_init_us(CLKSRC_TIMEOUT); 139328c10f9eSGabriel Fernandez while (!timeout_elapsed(timeout)) 139428c10f9eSGabriel Fernandez if (!(stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 139528c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK)) 139628c10f9eSGabriel Fernandez break; 139728c10f9eSGabriel Fernandez 139828c10f9eSGabriel Fernandez if (stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ) & 139928c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) { 140028c10f9eSGabriel Fernandez EMSG("A35 switch to PLL1 failed"); 140128c10f9eSGabriel Fernandez return -1; 140228c10f9eSGabriel Fernandez } 140328c10f9eSGabriel Fernandez 140428c10f9eSGabriel Fernandez return 0; 140528c10f9eSGabriel Fernandez } 140628c10f9eSGabriel Fernandez 140728c10f9eSGabriel Fernandez static void stm32mp2_a35_pll1_config(uint32_t fbdiv, uint32_t refdiv, 140828c10f9eSGabriel Fernandez uint32_t postdiv1, uint32_t postdiv2) 140928c10f9eSGabriel Fernandez { 141028c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ1, 141128c10f9eSGabriel Fernandez SHIFT_U32(refdiv, 141228c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT) | 141328c10f9eSGabriel Fernandez SHIFT_U32(fbdiv, A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT), 141428c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_MASK); 141528c10f9eSGabriel Fernandez 141628c10f9eSGabriel Fernandez stm32mp_syscfg_write(A35SS_SSC_PLL_FREQ2, 141728c10f9eSGabriel Fernandez SHIFT_U32(postdiv1, 141828c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT) | 141928c10f9eSGabriel Fernandez SHIFT_U32(postdiv2, 142028c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT), 142128c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_MASK); 142228c10f9eSGabriel Fernandez } 142328c10f9eSGabriel Fernandez 142428c10f9eSGabriel Fernandez static void clk_stm32_pll_config_output(struct clk_stm32_priv *priv, 142528c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll, 142628c10f9eSGabriel Fernandez uint32_t pllsrc, 142728c10f9eSGabriel Fernandez uint32_t *pllcfg, 142828c10f9eSGabriel Fernandez uint32_t fracv) 142928c10f9eSGabriel Fernandez { 143028c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 143128c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2; 143228c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 143328c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 143428c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6; 143528c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7; 143628c10f9eSGabriel Fernandez int sel = (pllsrc & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 143728c10f9eSGabriel Fernandez unsigned long refclk = clk_stm32_pll_get_oscillator_rate(sel); 143828c10f9eSGabriel Fernandez 143928c10f9eSGabriel Fernandez if (fracv == 0) { 144028c10f9eSGabriel Fernandez /* PLL in integer mode */ 144128c10f9eSGabriel Fernandez 144228c10f9eSGabriel Fernandez /* 144328c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks 144428c10f9eSGabriel Fernandez * will always be less than 1.2GHz 144528c10f9eSGabriel Fernandez */ 144628c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN) 144728c10f9eSGabriel Fernandez panic(); 144828c10f9eSGabriel Fernandez 144928c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK); 145028c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 145128c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN); 145228c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 145328c10f9eSGabriel Fernandez io_setbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST); 145428c10f9eSGabriel Fernandez } else { 145528c10f9eSGabriel Fernandez /* PLL in frac mode */ 145628c10f9eSGabriel Fernandez 145728c10f9eSGabriel Fernandez /* 145828c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks 145928c10f9eSGabriel Fernandez * will always be less than 1.2GHz 146028c10f9eSGabriel Fernandez */ 146128c10f9eSGabriel Fernandez if (refclk < PLL_FRAC_REFCLK_MIN) 146228c10f9eSGabriel Fernandez panic(); 146328c10f9eSGabriel Fernandez 146428c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr3, RCC_PLLxCFGR3_FRACIN_MASK, 146528c10f9eSGabriel Fernandez fracv & RCC_PLLxCFGR3_FRACIN_MASK); 146628c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 146728c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 146828c10f9eSGabriel Fernandez } 146928c10f9eSGabriel Fernandez 147028c10f9eSGabriel Fernandez assert(pllcfg[REFDIV]); 147128c10f9eSGabriel Fernandez 147228c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FBDIV_MASK, 147328c10f9eSGabriel Fernandez SHIFT_U32(pllcfg[FBDIV], RCC_PLLxCFGR2_FBDIV_SHIFT) & 147428c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_MASK); 147528c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr2, RCC_PLLxCFGR2_FREFDIV_MASK, 147628c10f9eSGabriel Fernandez pllcfg[REFDIV] & RCC_PLLxCFGR2_FREFDIV_MASK); 147728c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr6, RCC_PLLxCFGR6_POSTDIV1_MASK, 147828c10f9eSGabriel Fernandez pllcfg[POSTDIV1] & RCC_PLLxCFGR6_POSTDIV1_MASK); 147928c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr7, RCC_PLLxCFGR7_POSTDIV2_MASK, 148028c10f9eSGabriel Fernandez pllcfg[POSTDIV2] & RCC_PLLxCFGR7_POSTDIV2_MASK); 148128c10f9eSGabriel Fernandez 148228c10f9eSGabriel Fernandez if (pllcfg[POSTDIV1] == 0 || pllcfg[POSTDIV2] == 0) { 148328c10f9eSGabriel Fernandez /* Bypass mode */ 148428c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS); 148528c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN); 148628c10f9eSGabriel Fernandez } else { 148728c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr4, RCC_PLLxCFGR4_BYPASS); 148828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_FOUTPOSTDIVEN); 148928c10f9eSGabriel Fernandez } 149028c10f9eSGabriel Fernandez } 149128c10f9eSGabriel Fernandez 149228c10f9eSGabriel Fernandez static void clk_stm32_pll_config_csg(struct clk_stm32_priv *priv, 149328c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll, 149428c10f9eSGabriel Fernandez uint32_t *csg) 149528c10f9eSGabriel Fernandez { 149628c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 149728c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 149828c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 149928c10f9eSGabriel Fernandez uintptr_t pllxcfgr5 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR5; 150028c10f9eSGabriel Fernandez 150128c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_DIVVAL_MASK, 150228c10f9eSGabriel Fernandez csg[DIVVAL] & RCC_PLLxCFGR5_DIVVAL_MASK); 150328c10f9eSGabriel Fernandez io_clrsetbits32(pllxcfgr5, RCC_PLLxCFGR5_SPREAD_MASK, 150428c10f9eSGabriel Fernandez SHIFT_U32(csg[SPREAD], RCC_PLLxCFGR5_SPREAD_SHIFT) & 150528c10f9eSGabriel Fernandez RCC_PLLxCFGR5_SPREAD_MASK); 150628c10f9eSGabriel Fernandez 150728c10f9eSGabriel Fernandez if (csg[DOWNSPREAD] != 0) 150828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD); 150928c10f9eSGabriel Fernandez else 151028c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_DOWNSPREAD); 151128c10f9eSGabriel Fernandez 151228c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr3, RCC_PLLxCFGR3_SSCGDIS); 151328c10f9eSGabriel Fernandez 151428c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_PLLEN); 151528c10f9eSGabriel Fernandez udelay(1); 151628c10f9eSGabriel Fernandez 151728c10f9eSGabriel Fernandez io_setbits32(pllxcfgr4, RCC_PLLxCFGR4_DSMEN); 151828c10f9eSGabriel Fernandez io_setbits32(pllxcfgr3, RCC_PLLxCFGR3_DACEN); 151928c10f9eSGabriel Fernandez } 152028c10f9eSGabriel Fernandez 152128c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg *clk_stm32_pll_get_pdata(unsigned int pll_idx) 152228c10f9eSGabriel Fernandez { 152328c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 152428c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 152528c10f9eSGabriel Fernandez 152628c10f9eSGabriel Fernandez assert(pll_idx < pdata->npll); 152728c10f9eSGabriel Fernandez 152828c10f9eSGabriel Fernandez return &pdata->pll[pll_idx]; 152928c10f9eSGabriel Fernandez } 153028c10f9eSGabriel Fernandez 153128c10f9eSGabriel Fernandez static int clk_stm32_pll_set_mux(struct clk_stm32_priv *priv __unused, 153228c10f9eSGabriel Fernandez uint32_t src) 153328c10f9eSGabriel Fernandez { 153428c10f9eSGabriel Fernandez int mux = (src & MUX_ID_MASK) >> MUX_ID_SHIFT; 153528c10f9eSGabriel Fernandez int sel = (src & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 153628c10f9eSGabriel Fernandez 15376efa483fSEtienne Carriere if (stm32_mux_set_parent(mux, sel)) 15386efa483fSEtienne Carriere return -1; 15396efa483fSEtienne Carriere else 15406efa483fSEtienne Carriere return 0; 15416efa483fSEtienne Carriere 154228c10f9eSGabriel Fernandez } 154328c10f9eSGabriel Fernandez 154428c10f9eSGabriel Fernandez static void clk_stm32_pll1_init(struct clk_stm32_priv *priv, 154528c10f9eSGabriel Fernandez int pll_idx __unused, 154628c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf) 154728c10f9eSGabriel Fernandez { 154828c10f9eSGabriel Fernandez int sel = (pll_conf->src & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 154928c10f9eSGabriel Fernandez unsigned long refclk = 0; 155028c10f9eSGabriel Fernandez 155128c10f9eSGabriel Fernandez /* 155228c10f9eSGabriel Fernandez * TODO: check if pll has already good parameters or if we could make 155328c10f9eSGabriel Fernandez * a configuration on the fly. 155428c10f9eSGabriel Fernandez */ 155528c10f9eSGabriel Fernandez 1556*7b8c7554SGabriel Fernandez stm32mp2_a35_ss_on_bypass(); 155728c10f9eSGabriel Fernandez 155828c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src)) 155928c10f9eSGabriel Fernandez panic(); 156028c10f9eSGabriel Fernandez 156128c10f9eSGabriel Fernandez refclk = clk_stm32_pll_get_oscillator_rate(sel); 156228c10f9eSGabriel Fernandez 156328c10f9eSGabriel Fernandez /* 156428c10f9eSGabriel Fernandez * No need to check max clock, as oscillator reference clocks will 156528c10f9eSGabriel Fernandez * always be less than 1.2GHz 156628c10f9eSGabriel Fernandez */ 156728c10f9eSGabriel Fernandez if (refclk < PLL_REFCLK_MIN) 156828c10f9eSGabriel Fernandez panic(); 156928c10f9eSGabriel Fernandez 157028c10f9eSGabriel Fernandez stm32mp2_a35_pll1_config(pll_conf->cfg[FBDIV], 157128c10f9eSGabriel Fernandez pll_conf->cfg[REFDIV], 157228c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV1], 157328c10f9eSGabriel Fernandez pll_conf->cfg[POSTDIV2]); 157428c10f9eSGabriel Fernandez 157528c10f9eSGabriel Fernandez if (stm32mp2_a35_pll1_start()) 157628c10f9eSGabriel Fernandez panic(); 157728c10f9eSGabriel Fernandez } 157828c10f9eSGabriel Fernandez 157928c10f9eSGabriel Fernandez static void clk_stm32_pll_init(struct clk_stm32_priv *priv, int pll_idx, 158028c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf) 158128c10f9eSGabriel Fernandez { 158228c10f9eSGabriel Fernandez const struct stm32_clk_pll *pll = clk_stm32_pll_data(pll_idx); 158328c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + pll->reg_pllxcfgr1; 158428c10f9eSGabriel Fernandez bool spread_spectrum = false; 158528c10f9eSGabriel Fernandez 158628c10f9eSGabriel Fernandez /* 158728c10f9eSGabriel Fernandez * TODO: check if pll has already good parameters or if we could make 158828c10f9eSGabriel Fernandez * a configuration on the fly. 158928c10f9eSGabriel Fernandez */ 159028c10f9eSGabriel Fernandez 15912604f62dSEtienne Carriere if (stm32_gate_rdy_disable(pll->gate_id)) 15922604f62dSEtienne Carriere panic(); 159328c10f9eSGabriel Fernandez 159428c10f9eSGabriel Fernandez if (clk_stm32_pll_set_mux(priv, pll_conf->src)) 159528c10f9eSGabriel Fernandez panic(); 159628c10f9eSGabriel Fernandez 159728c10f9eSGabriel Fernandez clk_stm32_pll_config_output(priv, pll, pll_conf->src, 159828c10f9eSGabriel Fernandez pll_conf->cfg, pll_conf->frac); 159928c10f9eSGabriel Fernandez 160028c10f9eSGabriel Fernandez if (pll_conf->csg_enabled) { 160128c10f9eSGabriel Fernandez clk_stm32_pll_config_csg(priv, pll, pll_conf->csg); 160228c10f9eSGabriel Fernandez spread_spectrum = true; 160328c10f9eSGabriel Fernandez } 160428c10f9eSGabriel Fernandez 16052604f62dSEtienne Carriere if (stm32_gate_rdy_enable(pll->gate_id)) 16062604f62dSEtienne Carriere panic(); 160728c10f9eSGabriel Fernandez 160828c10f9eSGabriel Fernandez if (spread_spectrum) 160928c10f9eSGabriel Fernandez io_clrbits32(pllxcfgr1, RCC_PLLxCFGR1_SSMODRST); 161028c10f9eSGabriel Fernandez } 161128c10f9eSGabriel Fernandez 161228c10f9eSGabriel Fernandez static int stm32_clk_pll_configure(struct clk_stm32_priv *priv) 161328c10f9eSGabriel Fernandez { 161428c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL; 161528c10f9eSGabriel Fernandez size_t i = 0; 161628c10f9eSGabriel Fernandez 161728c10f9eSGabriel Fernandez for (i = 0; i < PLL_NB; i++) { 161828c10f9eSGabriel Fernandez pll_conf = clk_stm32_pll_get_pdata(i); 161928c10f9eSGabriel Fernandez 162028c10f9eSGabriel Fernandez if (pll_conf->enabled) { 162128c10f9eSGabriel Fernandez /* Skip the pll3 (need GPU regulator to configure) */ 162228c10f9eSGabriel Fernandez if (i == PLL3_ID) 162328c10f9eSGabriel Fernandez continue; 162428c10f9eSGabriel Fernandez 162528c10f9eSGabriel Fernandez /* Skip the pll2 (reserved to DDR) */ 162628c10f9eSGabriel Fernandez if (i == PLL2_ID) 162728c10f9eSGabriel Fernandez continue; 162828c10f9eSGabriel Fernandez 162928c10f9eSGabriel Fernandez if (i == PLL1_ID) 163028c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, i, pll_conf); 163128c10f9eSGabriel Fernandez else 163228c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, i, pll_conf); 163328c10f9eSGabriel Fernandez } 163428c10f9eSGabriel Fernandez } 163528c10f9eSGabriel Fernandez 163628c10f9eSGabriel Fernandez return 0; 163728c10f9eSGabriel Fernandez } 163828c10f9eSGabriel Fernandez 163928c10f9eSGabriel Fernandez #define __WORD_BIT 32 164028c10f9eSGabriel Fernandez 164128c10f9eSGabriel Fernandez static int wait_predivsr(uint16_t channel) 164228c10f9eSGabriel Fernandez { 164328c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 164428c10f9eSGabriel Fernandez uintptr_t previvsr = 0; 164528c10f9eSGabriel Fernandez uint32_t channel_bit = 0; 164628c10f9eSGabriel Fernandez uint32_t value = 0; 164728c10f9eSGabriel Fernandez 164828c10f9eSGabriel Fernandez if (channel < __WORD_BIT) { 164928c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR1; 165028c10f9eSGabriel Fernandez channel_bit = BIT(channel); 165128c10f9eSGabriel Fernandez } else { 165228c10f9eSGabriel Fernandez previvsr = rcc_base + RCC_PREDIVSR2; 165328c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT); 165428c10f9eSGabriel Fernandez } 165528c10f9eSGabriel Fernandez 165628c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(previvsr, value, !(value & channel_bit), 0, 165728c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 165828c10f9eSGabriel Fernandez EMSG("Pre divider status: %#"PRIx32, io_read32(previvsr)); 165928c10f9eSGabriel Fernandez return -1; 166028c10f9eSGabriel Fernandez } 166128c10f9eSGabriel Fernandez 166228c10f9eSGabriel Fernandez return 0; 166328c10f9eSGabriel Fernandez } 166428c10f9eSGabriel Fernandez 166528c10f9eSGabriel Fernandez static int wait_findivsr(uint16_t channel) 166628c10f9eSGabriel Fernandez { 166728c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 166828c10f9eSGabriel Fernandez uintptr_t finvivsr = 0; 166928c10f9eSGabriel Fernandez uint32_t channel_bit = 0; 167028c10f9eSGabriel Fernandez uint32_t value = 0; 167128c10f9eSGabriel Fernandez 167228c10f9eSGabriel Fernandez if (channel < __WORD_BIT) { 167328c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR1; 167428c10f9eSGabriel Fernandez channel_bit = BIT(channel); 167528c10f9eSGabriel Fernandez } else { 167628c10f9eSGabriel Fernandez finvivsr = rcc_base + RCC_FINDIVSR2; 167728c10f9eSGabriel Fernandez channel_bit = BIT(channel - __WORD_BIT); 167828c10f9eSGabriel Fernandez } 167928c10f9eSGabriel Fernandez 168028c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(finvivsr, value, !(value & channel_bit), 0, 168128c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 168228c10f9eSGabriel Fernandez EMSG("Final divider status: %#"PRIx32, io_read32(finvivsr)); 168328c10f9eSGabriel Fernandez return -1; 168428c10f9eSGabriel Fernandez } 168528c10f9eSGabriel Fernandez 168628c10f9eSGabriel Fernandez return 0; 168728c10f9eSGabriel Fernandez } 168828c10f9eSGabriel Fernandez 168928c10f9eSGabriel Fernandez static int wait_xbar_sts(uint16_t channel) 169028c10f9eSGabriel Fernandez { 169128c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 169228c10f9eSGabriel Fernandez uintptr_t xbar_cfgr = rcc_base + RCC_XBAR0CFGR + (0x4 * channel); 169328c10f9eSGabriel Fernandez uint32_t value = 0; 169428c10f9eSGabriel Fernandez 169528c10f9eSGabriel Fernandez if (IO_READ32_POLL_TIMEOUT(xbar_cfgr, value, 169628c10f9eSGabriel Fernandez !(value & RCC_XBAR0CFGR_XBAR0STS), 0, 169728c10f9eSGabriel Fernandez CLKDIV_TIMEOUT)) { 169828c10f9eSGabriel Fernandez EMSG("XBAR%"PRIu16"CFGR: %#"PRIx32, channel, 169928c10f9eSGabriel Fernandez io_read32(xbar_cfgr)); 170028c10f9eSGabriel Fernandez return -1; 170128c10f9eSGabriel Fernandez } 170228c10f9eSGabriel Fernandez 170328c10f9eSGabriel Fernandez return 0; 170428c10f9eSGabriel Fernandez } 170528c10f9eSGabriel Fernandez 17061f2e0a3fSGatien Chevallier static TEE_Result flexclkgen_search_config(uint16_t channel, 17071f2e0a3fSGatien Chevallier unsigned int *clk_src, 17081f2e0a3fSGatien Chevallier unsigned int *prediv, 17091f2e0a3fSGatien Chevallier unsigned int *findiv) 17101f2e0a3fSGatien Chevallier { 17111f2e0a3fSGatien Chevallier struct clk_stm32_priv *priv = clk_stm32_get_priv(); 17121f2e0a3fSGatien Chevallier struct stm32_clk_platdata *pdata = priv->pdata; 17131f2e0a3fSGatien Chevallier unsigned int flex_id = U(0); 17141f2e0a3fSGatien Chevallier uint32_t dt_cfg = U(0); 17151f2e0a3fSGatien Chevallier uint32_t i = U(0); 17161f2e0a3fSGatien Chevallier 17171f2e0a3fSGatien Chevallier assert(clk_src && prediv && findiv); 17181f2e0a3fSGatien Chevallier 17191f2e0a3fSGatien Chevallier /* 17201f2e0a3fSGatien Chevallier * pdata->flexgen is the array of all the flexgen configuration from 17211f2e0a3fSGatien Chevallier * the device tree. 17221f2e0a3fSGatien Chevallier * The binding does not enforce the description of all flexgen nor 17231f2e0a3fSGatien Chevallier * the order it which they are listed. 17241f2e0a3fSGatien Chevallier */ 17251f2e0a3fSGatien Chevallier for (i = 0; i < pdata->nflexgen; i++) { 17261f2e0a3fSGatien Chevallier dt_cfg = pdata->flexgen[i]; 17271f2e0a3fSGatien Chevallier 17281f2e0a3fSGatien Chevallier flex_id = (dt_cfg & FLEX_ID_MASK) >> FLEX_ID_SHIFT; 17291f2e0a3fSGatien Chevallier if (flex_id == channel) { 17301f2e0a3fSGatien Chevallier *clk_src = (dt_cfg & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT; 17311f2e0a3fSGatien Chevallier *prediv = (dt_cfg & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT; 17321f2e0a3fSGatien Chevallier *findiv = (dt_cfg & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT; 17331f2e0a3fSGatien Chevallier 17341f2e0a3fSGatien Chevallier return TEE_SUCCESS; 17351f2e0a3fSGatien Chevallier } 17361f2e0a3fSGatien Chevallier } 17371f2e0a3fSGatien Chevallier 17381f2e0a3fSGatien Chevallier return TEE_ERROR_ITEM_NOT_FOUND; 17391f2e0a3fSGatien Chevallier } 17401f2e0a3fSGatien Chevallier 174128c10f9eSGabriel Fernandez static void flexclkgen_config_channel(uint16_t channel, unsigned int clk_src, 174228c10f9eSGabriel Fernandez unsigned int prediv, unsigned int findiv) 174328c10f9eSGabriel Fernandez { 174428c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 174528c10f9eSGabriel Fernandez 174628c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 174728c10f9eSGabriel Fernandez panic(); 174828c10f9eSGabriel Fernandez 174928c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel), 175028c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, prediv); 175128c10f9eSGabriel Fernandez 175228c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 175328c10f9eSGabriel Fernandez panic(); 175428c10f9eSGabriel Fernandez 175528c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 175628c10f9eSGabriel Fernandez panic(); 175728c10f9eSGabriel Fernandez 175828c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 175928c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK, 176028c10f9eSGabriel Fernandez findiv); 176128c10f9eSGabriel Fernandez 176228c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 176328c10f9eSGabriel Fernandez panic(); 176428c10f9eSGabriel Fernandez 176528c10f9eSGabriel Fernandez if (wait_xbar_sts(channel) != 0) 176628c10f9eSGabriel Fernandez panic(); 176728c10f9eSGabriel Fernandez 176828c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel), 176928c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, 177028c10f9eSGabriel Fernandez clk_src); 177128c10f9eSGabriel Fernandez 177228c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_XBAR0CFGR + (0x4 * channel), 177328c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0EN); 177428c10f9eSGabriel Fernandez 177528c10f9eSGabriel Fernandez if (wait_xbar_sts(channel) != 0) 177628c10f9eSGabriel Fernandez panic(); 177728c10f9eSGabriel Fernandez } 177828c10f9eSGabriel Fernandez 177928c10f9eSGabriel Fernandez static int stm32mp2_clk_flexgen_configure(struct clk_stm32_priv *priv) 178028c10f9eSGabriel Fernandez { 178128c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 178228c10f9eSGabriel Fernandez uint32_t i = 0; 178328c10f9eSGabriel Fernandez 178428c10f9eSGabriel Fernandez for (i = 0; i < pdata->nflexgen; i++) { 178528c10f9eSGabriel Fernandez uint32_t val = pdata->flexgen[i]; 178628c10f9eSGabriel Fernandez uint32_t cmd = 0; 178728c10f9eSGabriel Fernandez uint32_t cmd_data = 0; 178828c10f9eSGabriel Fernandez unsigned int channel = 0; 178928c10f9eSGabriel Fernandez unsigned int clk_src = 0; 179028c10f9eSGabriel Fernandez unsigned int pdiv = 0; 179128c10f9eSGabriel Fernandez unsigned int fdiv = 0; 179228c10f9eSGabriel Fernandez 179328c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT; 179428c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK; 179528c10f9eSGabriel Fernandez 179628c10f9eSGabriel Fernandez if (cmd != CMD_FLEXGEN) 179728c10f9eSGabriel Fernandez continue; 179828c10f9eSGabriel Fernandez 179928c10f9eSGabriel Fernandez channel = (cmd_data & FLEX_ID_MASK) >> FLEX_ID_SHIFT; 180028c10f9eSGabriel Fernandez 180128c10f9eSGabriel Fernandez /* 180228c10f9eSGabriel Fernandez * Skip ck_ker_stgen configuration, will be done by 180328c10f9eSGabriel Fernandez * stgen driver. 180428c10f9eSGabriel Fernandez */ 180528c10f9eSGabriel Fernandez if (channel == FLEX_STGEN) 180628c10f9eSGabriel Fernandez continue; 180728c10f9eSGabriel Fernandez 180828c10f9eSGabriel Fernandez clk_src = (cmd_data & FLEX_SEL_MASK) >> FLEX_SEL_SHIFT; 180928c10f9eSGabriel Fernandez pdiv = (cmd_data & FLEX_PDIV_MASK) >> FLEX_PDIV_SHIFT; 181028c10f9eSGabriel Fernandez fdiv = (cmd_data & FLEX_FDIV_MASK) >> FLEX_FDIV_SHIFT; 181128c10f9eSGabriel Fernandez 181228c10f9eSGabriel Fernandez flexclkgen_config_channel(channel, clk_src, pdiv, fdiv); 181328c10f9eSGabriel Fernandez } 181428c10f9eSGabriel Fernandez 181528c10f9eSGabriel Fernandez return 0; 181628c10f9eSGabriel Fernandez } 181728c10f9eSGabriel Fernandez 181828c10f9eSGabriel Fernandez static int stm32_clk_configure_div(struct clk_stm32_priv *priv __unused, 181928c10f9eSGabriel Fernandez uint32_t data) 182028c10f9eSGabriel Fernandez { 182128c10f9eSGabriel Fernandez uint32_t div_id = 0; 182228c10f9eSGabriel Fernandez uint32_t div_n = 0; 182328c10f9eSGabriel Fernandez 182428c10f9eSGabriel Fernandez div_id = (data & DIV_ID_MASK) >> DIV_ID_SHIFT; 182528c10f9eSGabriel Fernandez div_n = (data & DIV_DIVN_MASK) >> DIV_DIVN_SHIFT; 182628c10f9eSGabriel Fernandez 182728c10f9eSGabriel Fernandez return stm32_div_set_value(div_id, div_n); 182828c10f9eSGabriel Fernandez } 182928c10f9eSGabriel Fernandez 183028c10f9eSGabriel Fernandez static int stm32_clk_configure_mux(struct clk_stm32_priv *priv __unused, 183128c10f9eSGabriel Fernandez uint32_t data) 183228c10f9eSGabriel Fernandez { 183328c10f9eSGabriel Fernandez int mux = (data & MUX_ID_MASK) >> MUX_ID_SHIFT; 183428c10f9eSGabriel Fernandez int sel = (data & MUX_SEL_MASK) >> MUX_SEL_SHIFT; 183528c10f9eSGabriel Fernandez 18366efa483fSEtienne Carriere if (stm32_mux_set_parent(mux, sel)) 18376efa483fSEtienne Carriere return -1; 18386efa483fSEtienne Carriere else 18396efa483fSEtienne Carriere return 0; 184028c10f9eSGabriel Fernandez } 184128c10f9eSGabriel Fernandez 184228c10f9eSGabriel Fernandez static int stm32_clk_configure_by_addr_val(struct clk_stm32_priv *priv, 184328c10f9eSGabriel Fernandez uint32_t data) 184428c10f9eSGabriel Fernandez { 184528c10f9eSGabriel Fernandez uint32_t addr = data >> CLK_ADDR_SHIFT; 184628c10f9eSGabriel Fernandez uint32_t val = data & CLK_ADDR_VAL_MASK; 184728c10f9eSGabriel Fernandez 184828c10f9eSGabriel Fernandez io_setbits32(priv->base + addr, val); 184928c10f9eSGabriel Fernandez 185028c10f9eSGabriel Fernandez return 0; 185128c10f9eSGabriel Fernandez } 185228c10f9eSGabriel Fernandez 185328c10f9eSGabriel Fernandez static void stm32_clk_configure_obs(struct clk_stm32_priv *priv, 185428c10f9eSGabriel Fernandez uint32_t data) 185528c10f9eSGabriel Fernandez { 185628c10f9eSGabriel Fernandez uint32_t id = (data & OBS_ID_MASK) >> OBS_ID_SHIFT; 185728c10f9eSGabriel Fernandez uint32_t status = (data & OBS_STATUS_MASK) >> OBS_STATUS_SHIFT; 185828c10f9eSGabriel Fernandez uint32_t int_ext = (data & OBS_INTEXT_MASK) >> OBS_INTEXT_SHIFT; 185928c10f9eSGabriel Fernandez uint32_t div = (data & OBS_DIV_MASK) >> OBS_DIV_SHIFT; 186028c10f9eSGabriel Fernandez uint32_t inv = (data & OBS_INV_MASK) >> OBS_INV_SHIFT; 186128c10f9eSGabriel Fernandez uint32_t sel = (data & OBS_SEL_MASK) >> OBS_SEL_SHIFT; 186228c10f9eSGabriel Fernandez uint32_t reg = 0; 186328c10f9eSGabriel Fernandez uint32_t val = 0; 186428c10f9eSGabriel Fernandez 186528c10f9eSGabriel Fernandez if (!id) 186628c10f9eSGabriel Fernandez reg = RCC_FCALCOBS0CFGR; 186728c10f9eSGabriel Fernandez else 186828c10f9eSGabriel Fernandez reg = RCC_FCALCOBS1CFGR; 186928c10f9eSGabriel Fernandez 187028c10f9eSGabriel Fernandez if (status) 187128c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEN; 187228c10f9eSGabriel Fernandez 187328c10f9eSGabriel Fernandez if (int_ext == OBS_EXT) { 187428c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSEXTSEL; 187528c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKEXTSEL_SHIFT); 187628c10f9eSGabriel Fernandez } else { 187728c10f9eSGabriel Fernandez val |= SHIFT_U32(sel, RCC_FCALCOBS0CFGR_CKINTSEL_SHIFT); 187828c10f9eSGabriel Fernandez } 187928c10f9eSGabriel Fernandez 188028c10f9eSGabriel Fernandez if (inv) 188128c10f9eSGabriel Fernandez val |= RCC_FCALCOBS0CFGR_CKOBSINV; 188228c10f9eSGabriel Fernandez 188328c10f9eSGabriel Fernandez val |= SHIFT_U32(div, RCC_FCALCOBS0CFGR_CKOBSDIV_SHIFT); 188428c10f9eSGabriel Fernandez 188528c10f9eSGabriel Fernandez io_write32(priv->base + reg, val); 188628c10f9eSGabriel Fernandez } 188728c10f9eSGabriel Fernandez 188828c10f9eSGabriel Fernandez static int stm32_clk_configure(struct clk_stm32_priv *priv, uint32_t val) 188928c10f9eSGabriel Fernandez { 189028c10f9eSGabriel Fernandez uint32_t cmd_data = 0; 189128c10f9eSGabriel Fernandez uint32_t cmd = 0; 189228c10f9eSGabriel Fernandez int ret = 0; 189328c10f9eSGabriel Fernandez 189428c10f9eSGabriel Fernandez if (val & CMD_ADDR_BIT) { 189528c10f9eSGabriel Fernandez cmd_data = val & ~CMD_ADDR_BIT; 189628c10f9eSGabriel Fernandez 189728c10f9eSGabriel Fernandez return stm32_clk_configure_by_addr_val(priv, cmd_data); 189828c10f9eSGabriel Fernandez } 189928c10f9eSGabriel Fernandez 190028c10f9eSGabriel Fernandez cmd = (val & CMD_MASK) >> CMD_SHIFT; 190128c10f9eSGabriel Fernandez cmd_data = val & ~CMD_MASK; 190228c10f9eSGabriel Fernandez 190328c10f9eSGabriel Fernandez switch (cmd) { 190428c10f9eSGabriel Fernandez case CMD_DIV: 190528c10f9eSGabriel Fernandez ret = stm32_clk_configure_div(priv, cmd_data); 190628c10f9eSGabriel Fernandez break; 190728c10f9eSGabriel Fernandez 190828c10f9eSGabriel Fernandez case CMD_MUX: 190928c10f9eSGabriel Fernandez ret = stm32_clk_configure_mux(priv, cmd_data); 191028c10f9eSGabriel Fernandez break; 191128c10f9eSGabriel Fernandez 191228c10f9eSGabriel Fernandez case CMD_OBS: 191328c10f9eSGabriel Fernandez stm32_clk_configure_obs(priv, cmd_data); 191428c10f9eSGabriel Fernandez break; 191528c10f9eSGabriel Fernandez 191628c10f9eSGabriel Fernandez default: 191728c10f9eSGabriel Fernandez EMSG("cmd unknown ! : %#"PRIx32, val); 191828c10f9eSGabriel Fernandez ret = -1; 191928c10f9eSGabriel Fernandez } 192028c10f9eSGabriel Fernandez 192128c10f9eSGabriel Fernandez return ret; 192228c10f9eSGabriel Fernandez } 192328c10f9eSGabriel Fernandez 192428c10f9eSGabriel Fernandez static int stm32_clk_bus_configure(struct clk_stm32_priv *priv) 192528c10f9eSGabriel Fernandez { 192628c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 192728c10f9eSGabriel Fernandez uint32_t i = 0; 192828c10f9eSGabriel Fernandez 192928c10f9eSGabriel Fernandez for (i = 0; i < pdata->nbusclk; i++) { 193028c10f9eSGabriel Fernandez int ret = 0; 193128c10f9eSGabriel Fernandez 193228c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->busclk[i]); 193328c10f9eSGabriel Fernandez if (ret != 0) 193428c10f9eSGabriel Fernandez return ret; 193528c10f9eSGabriel Fernandez } 193628c10f9eSGabriel Fernandez 193728c10f9eSGabriel Fernandez return 0; 193828c10f9eSGabriel Fernandez } 193928c10f9eSGabriel Fernandez 194028c10f9eSGabriel Fernandez static int stm32_clk_kernel_configure(struct clk_stm32_priv *priv) 194128c10f9eSGabriel Fernandez { 194228c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 194328c10f9eSGabriel Fernandez uint32_t i = 0; 194428c10f9eSGabriel Fernandez 194528c10f9eSGabriel Fernandez for (i = 0; i < pdata->nkernelclk; i++) { 194628c10f9eSGabriel Fernandez int ret = 0; 194728c10f9eSGabriel Fernandez 194828c10f9eSGabriel Fernandez ret = stm32_clk_configure(priv, pdata->kernelclk[i]); 194928c10f9eSGabriel Fernandez if (ret != 0) 195028c10f9eSGabriel Fernandez return ret; 195128c10f9eSGabriel Fernandez } 195228c10f9eSGabriel Fernandez 195328c10f9eSGabriel Fernandez return 0; 195428c10f9eSGabriel Fernandez } 195528c10f9eSGabriel Fernandez 195628c10f9eSGabriel Fernandez static void stm32mp2_init_clock_tree(struct clk_stm32_priv *priv, 195728c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata) 195828c10f9eSGabriel Fernandez { 195928c10f9eSGabriel Fernandez stm32_clk_oscillators_enable(priv, pdata); 196028c10f9eSGabriel Fernandez 196128c10f9eSGabriel Fernandez /* Come back to HSI for flexgen */ 196228c10f9eSGabriel Fernandez stm32mp2_clk_xbar_on_hsi(priv); 196328c10f9eSGabriel Fernandez 196428c10f9eSGabriel Fernandez if (stm32_clk_pll_configure(priv)) 196528c10f9eSGabriel Fernandez panic("Cannot configure plls"); 196628c10f9eSGabriel Fernandez 196728c10f9eSGabriel Fernandez /* Wait LSE ready before to use it */ 196828c10f9eSGabriel Fernandez if (stm32_clk_oscillators_wait_lse_ready(priv, pdata)) 196928c10f9eSGabriel Fernandez panic("Timeout: to enable LSE"); 197028c10f9eSGabriel Fernandez 197128c10f9eSGabriel Fernandez if (stm32mp2_clk_flexgen_configure(priv)) 197228c10f9eSGabriel Fernandez panic("Cannot configure flexgen"); 197328c10f9eSGabriel Fernandez 197428c10f9eSGabriel Fernandez if (stm32_clk_bus_configure(priv)) 197528c10f9eSGabriel Fernandez panic("Cannot config bus clocks"); 197628c10f9eSGabriel Fernandez 197728c10f9eSGabriel Fernandez if (stm32_clk_kernel_configure(priv)) 197828c10f9eSGabriel Fernandez panic("Cannot configure kernel clocks"); 197928c10f9eSGabriel Fernandez 198028c10f9eSGabriel Fernandez /* Configure LSE css after RTC source configuration */ 198128c10f9eSGabriel Fernandez stm32_clk_oscillators_lse_set_css(priv, pdata); 198228c10f9eSGabriel Fernandez } 198328c10f9eSGabriel Fernandez 198428c10f9eSGabriel Fernandez static TEE_Result clk_stm32_osc_enable(struct clk *clk) 198528c10f9eSGabriel Fernandez { 198628c10f9eSGabriel Fernandez return clk_stm32_gate_ready_ops.enable(clk); 198728c10f9eSGabriel Fernandez } 198828c10f9eSGabriel Fernandez 198928c10f9eSGabriel Fernandez static void clk_stm32_osc_disable(struct clk *clk) 199028c10f9eSGabriel Fernandez { 199128c10f9eSGabriel Fernandez clk_stm32_gate_ready_ops.disable(clk); 199228c10f9eSGabriel Fernandez } 199328c10f9eSGabriel Fernandez 199428c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_osc_ops = { 199528c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable, 199628c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable, 199728c10f9eSGabriel Fernandez }; 199828c10f9eSGabriel Fernandez 199928c10f9eSGabriel Fernandez static unsigned long clk_stm32_msi_get_rate(struct clk *clk __unused, 200028c10f9eSGabriel Fernandez unsigned long prate __unused) 200128c10f9eSGabriel Fernandez { 200228c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 200328c10f9eSGabriel Fernandez uintptr_t address = priv->base + RCC_BDCR; 200428c10f9eSGabriel Fernandez 200528c10f9eSGabriel Fernandez if ((io_read32(address) & RCC_BDCR_MSIFREQSEL)) 200628c10f9eSGabriel Fernandez return RCC_16_MHZ; 200728c10f9eSGabriel Fernandez 200828c10f9eSGabriel Fernandez return RCC_4_MHZ; 200928c10f9eSGabriel Fernandez } 201028c10f9eSGabriel Fernandez 201128c10f9eSGabriel Fernandez static TEE_Result clk_stm32_msi_set_rate(struct clk *clk __unused, 201228c10f9eSGabriel Fernandez unsigned long rate, 201328c10f9eSGabriel Fernandez unsigned long prate __unused) 201428c10f9eSGabriel Fernandez { 201528c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 201628c10f9eSGabriel Fernandez 201728c10f9eSGabriel Fernandez return clk_stm32_osc_msi_set_rate(priv, rate); 201828c10f9eSGabriel Fernandez } 201928c10f9eSGabriel Fernandez 202028c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_oscillator_msi_ops = { 202128c10f9eSGabriel Fernandez .enable = clk_stm32_osc_enable, 202228c10f9eSGabriel Fernandez .disable = clk_stm32_osc_disable, 202328c10f9eSGabriel Fernandez .get_rate = clk_stm32_msi_get_rate, 202428c10f9eSGabriel Fernandez .set_rate = clk_stm32_msi_set_rate, 202528c10f9eSGabriel Fernandez }; 202628c10f9eSGabriel Fernandez 202728c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hse_div_set_rate(struct clk *clk, 202828c10f9eSGabriel Fernandez unsigned long rate, 202928c10f9eSGabriel Fernandez unsigned long parent_rate) 203028c10f9eSGabriel Fernandez { 203128c10f9eSGabriel Fernandez return clk_stm32_divider_set_rate(clk, rate, parent_rate); 203228c10f9eSGabriel Fernandez } 203328c10f9eSGabriel Fernandez 203428c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_hse_div_ops = { 203528c10f9eSGabriel Fernandez .get_rate = clk_stm32_divider_get_rate, 203628c10f9eSGabriel Fernandez .set_rate = clk_stm32_hse_div_set_rate, 203728c10f9eSGabriel Fernandez }; 203828c10f9eSGabriel Fernandez 203928c10f9eSGabriel Fernandez static TEE_Result clk_stm32_hsediv2_enable(struct clk *clk) 204028c10f9eSGabriel Fernandez { 204128c10f9eSGabriel Fernandez return clk_stm32_gate_ops.enable(clk); 204228c10f9eSGabriel Fernandez } 204328c10f9eSGabriel Fernandez 204428c10f9eSGabriel Fernandez static void clk_stm32_hsediv2_disable(struct clk *clk) 204528c10f9eSGabriel Fernandez { 204628c10f9eSGabriel Fernandez clk_stm32_gate_ops.disable(clk); 204728c10f9eSGabriel Fernandez } 204828c10f9eSGabriel Fernandez 204928c10f9eSGabriel Fernandez static unsigned long clk_stm32_hsediv2_get_rate(struct clk *clk __unused, 205028c10f9eSGabriel Fernandez unsigned long prate) 205128c10f9eSGabriel Fernandez { 205228c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 205328c10f9eSGabriel Fernandez uintptr_t addr = priv->base + RCC_OCENSETR; 205428c10f9eSGabriel Fernandez 205528c10f9eSGabriel Fernandez if (io_read32(addr) & RCC_OCENSETR_HSEDIV2BYP) 205628c10f9eSGabriel Fernandez return prate; 205728c10f9eSGabriel Fernandez 205828c10f9eSGabriel Fernandez return prate / 2; 205928c10f9eSGabriel Fernandez } 206028c10f9eSGabriel Fernandez 206128c10f9eSGabriel Fernandez static const struct clk_ops clk_hsediv2_ops = { 206228c10f9eSGabriel Fernandez .enable = clk_stm32_hsediv2_enable, 206328c10f9eSGabriel Fernandez .disable = clk_stm32_hsediv2_disable, 206428c10f9eSGabriel Fernandez .get_rate = clk_stm32_hsediv2_get_rate, 206528c10f9eSGabriel Fernandez }; 206628c10f9eSGabriel Fernandez 206728c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg { 206828c10f9eSGabriel Fernandez uint32_t pll_offset; 206928c10f9eSGabriel Fernandez int gate_id; 207028c10f9eSGabriel Fernandez int mux_id; 207128c10f9eSGabriel Fernandez }; 207228c10f9eSGabriel Fernandez 207328c10f9eSGabriel Fernandez static unsigned long clk_get_pll1_fvco_rate(unsigned long refclk) 207428c10f9eSGabriel Fernandez { 207528c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ1); 207628c10f9eSGabriel Fernandez uint32_t fbdiv = 0; 207728c10f9eSGabriel Fernandez uint32_t refdiv = 0; 207828c10f9eSGabriel Fernandez unsigned long freq = 0; 207928c10f9eSGabriel Fernandez 208028c10f9eSGabriel Fernandez fbdiv = (reg & A35SS_SSC_PLL_FREQ1_FBDIV_MASK) >> 208128c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_FBDIV_SHIFT; 208228c10f9eSGabriel Fernandez 208328c10f9eSGabriel Fernandez refdiv = (reg & A35SS_SSC_PLL_FREQ1_REFDIV_MASK) >> 208428c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ1_REFDIV_SHIFT; 208528c10f9eSGabriel Fernandez 208628c10f9eSGabriel Fernandez if (!refdiv || MUL_OVERFLOW(refclk, fbdiv, &freq)) 208728c10f9eSGabriel Fernandez panic(); 208828c10f9eSGabriel Fernandez 208928c10f9eSGabriel Fernandez return freq / refdiv; 209028c10f9eSGabriel Fernandez } 209128c10f9eSGabriel Fernandez 209228c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll1_get_rate(struct clk *clk __unused, 209328c10f9eSGabriel Fernandez unsigned long prate) 209428c10f9eSGabriel Fernandez { 209528c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_PLL_FREQ2); 209628c10f9eSGabriel Fernandez unsigned long dfout = 0; 209728c10f9eSGabriel Fernandez uint32_t postdiv1 = 0; 209828c10f9eSGabriel Fernandez uint32_t postdiv2 = 0; 209928c10f9eSGabriel Fernandez 210028c10f9eSGabriel Fernandez postdiv1 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV1_MASK) >> 210128c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV1_SHIFT; 210228c10f9eSGabriel Fernandez 210328c10f9eSGabriel Fernandez postdiv2 = (reg & A35SS_SSC_PLL_FREQ2_POSTDIV2_MASK) >> 210428c10f9eSGabriel Fernandez A35SS_SSC_PLL_FREQ2_POSTDIV2_SHIFT; 210528c10f9eSGabriel Fernandez 210628c10f9eSGabriel Fernandez if (postdiv1 == 0 || postdiv2 == 0) 210728c10f9eSGabriel Fernandez dfout = prate; 210828c10f9eSGabriel Fernandez else 210928c10f9eSGabriel Fernandez dfout = clk_get_pll1_fvco_rate(prate) / (postdiv1 * postdiv2); 211028c10f9eSGabriel Fernandez 211128c10f9eSGabriel Fernandez return dfout; 211228c10f9eSGabriel Fernandez } 211328c10f9eSGabriel Fernandez 211428c10f9eSGabriel Fernandez static struct stm32_clk_opp_cfg * 211528c10f9eSGabriel Fernandez clk_stm32_get_opp_config(struct stm32_clk_opp_cfg *opp_cfg, unsigned long rate) 211628c10f9eSGabriel Fernandez { 211728c10f9eSGabriel Fernandez unsigned int i = 0; 211828c10f9eSGabriel Fernandez 211928c10f9eSGabriel Fernandez for (i = 0; i < MAX_OPP && opp_cfg->frq; i++, opp_cfg++) 212028c10f9eSGabriel Fernandez if (opp_cfg->frq == rate) 212128c10f9eSGabriel Fernandez return opp_cfg; 212228c10f9eSGabriel Fernandez 212328c10f9eSGabriel Fernandez return NULL; 212428c10f9eSGabriel Fernandez } 212528c10f9eSGabriel Fernandez 212628c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll1_set_rate(struct clk *clk __unused, 212728c10f9eSGabriel Fernandez unsigned long rate, 212828c10f9eSGabriel Fernandez unsigned long parent_rate __unused) 212928c10f9eSGabriel Fernandez { 213028c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 213128c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = priv->pdata; 213228c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = NULL; 213328c10f9eSGabriel Fernandez struct stm32_clk_opp_cfg *opp = NULL; 213428c10f9eSGabriel Fernandez 213528c10f9eSGabriel Fernandez opp = clk_stm32_get_opp_config(pdata->opp->cpu1_opp, rate); 213628c10f9eSGabriel Fernandez if (!opp) 213728c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 213828c10f9eSGabriel Fernandez 213928c10f9eSGabriel Fernandez pll_conf = &opp->pll_cfg; 214028c10f9eSGabriel Fernandez 214128c10f9eSGabriel Fernandez clk_stm32_pll1_init(priv, PLL1_ID, pll_conf); 214228c10f9eSGabriel Fernandez 214328c10f9eSGabriel Fernandez return TEE_SUCCESS; 214428c10f9eSGabriel Fernandez } 214528c10f9eSGabriel Fernandez 214628c10f9eSGabriel Fernandez static size_t clk_stm32_pll_get_parent(struct clk *clk) 214728c10f9eSGabriel Fernandez { 214828c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 214928c10f9eSGabriel Fernandez 215028c10f9eSGabriel Fernandez return stm32_mux_get_parent(cfg->mux_id); 215128c10f9eSGabriel Fernandez } 215228c10f9eSGabriel Fernandez 215328c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll1_ops = { 215428c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 215528c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll1_get_rate, 215628c10f9eSGabriel Fernandez .set_rate = clk_stm32_pll1_set_rate, 215728c10f9eSGabriel Fernandez }; 215828c10f9eSGabriel Fernandez 215928c10f9eSGabriel Fernandez static unsigned long clk_get_pll_fvco(uint32_t offset_base, 216028c10f9eSGabriel Fernandez unsigned long prate) 216128c10f9eSGabriel Fernandez { 216228c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 216328c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + offset_base; 216428c10f9eSGabriel Fernandez uintptr_t pllxcfgr2 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR2; 216528c10f9eSGabriel Fernandez uintptr_t pllxcfgr3 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR3; 216628c10f9eSGabriel Fernandez unsigned long fvco = 0; 216728c10f9eSGabriel Fernandez uint32_t fracin = 0; 216828c10f9eSGabriel Fernandez uint32_t fbdiv = 0; 216928c10f9eSGabriel Fernandez uint32_t refdiv = 0; 217028c10f9eSGabriel Fernandez 217128c10f9eSGabriel Fernandez fracin = io_read32(pllxcfgr3) & RCC_PLLxCFGR3_FRACIN_MASK; 217228c10f9eSGabriel Fernandez fbdiv = (io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FBDIV_MASK) >> 217328c10f9eSGabriel Fernandez RCC_PLLxCFGR2_FBDIV_SHIFT; 217428c10f9eSGabriel Fernandez 217528c10f9eSGabriel Fernandez refdiv = io_read32(pllxcfgr2) & RCC_PLLxCFGR2_FREFDIV_MASK; 217628c10f9eSGabriel Fernandez 217728c10f9eSGabriel Fernandez assert(refdiv); 217828c10f9eSGabriel Fernandez 217928c10f9eSGabriel Fernandez if (fracin) { 218028c10f9eSGabriel Fernandez unsigned long long numerator = 0; 218128c10f9eSGabriel Fernandez unsigned long long denominator = 0; 218228c10f9eSGabriel Fernandez 218328c10f9eSGabriel Fernandez numerator = SHIFT_U64(fbdiv, 24) + fracin; 218428c10f9eSGabriel Fernandez numerator = prate * numerator; 218528c10f9eSGabriel Fernandez denominator = SHIFT_U64(refdiv, 24); 218628c10f9eSGabriel Fernandez fvco = (unsigned long)(numerator / denominator); 218728c10f9eSGabriel Fernandez } else { 218828c10f9eSGabriel Fernandez fvco = (unsigned long)(prate * fbdiv / refdiv); 218928c10f9eSGabriel Fernandez } 219028c10f9eSGabriel Fernandez 219128c10f9eSGabriel Fernandez return fvco; 219228c10f9eSGabriel Fernandez } 219328c10f9eSGabriel Fernandez 219428c10f9eSGabriel Fernandez static unsigned long clk_stm32_pll_get_rate(struct clk *clk __unused, 219528c10f9eSGabriel Fernandez unsigned long prate) 219628c10f9eSGabriel Fernandez { 219728c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 219828c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 219928c10f9eSGabriel Fernandez uintptr_t pllxcfgr1 = priv->base + cfg->pll_offset; 220028c10f9eSGabriel Fernandez uintptr_t pllxcfgr4 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR4; 220128c10f9eSGabriel Fernandez uintptr_t pllxcfgr6 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR6; 220228c10f9eSGabriel Fernandez uintptr_t pllxcfgr7 = pllxcfgr1 + RCC_OFFSET_PLLXCFGR7; 220328c10f9eSGabriel Fernandez unsigned long dfout = 0; 220428c10f9eSGabriel Fernandez uint32_t postdiv1 = 0; 220528c10f9eSGabriel Fernandez uint32_t postdiv2 = 0; 220628c10f9eSGabriel Fernandez 220728c10f9eSGabriel Fernandez postdiv1 = io_read32(pllxcfgr6) & RCC_PLLxCFGR6_POSTDIV1_MASK; 220828c10f9eSGabriel Fernandez postdiv2 = io_read32(pllxcfgr7) & RCC_PLLxCFGR7_POSTDIV2_MASK; 220928c10f9eSGabriel Fernandez 221028c10f9eSGabriel Fernandez if ((io_read32(pllxcfgr4) & RCC_PLLxCFGR4_BYPASS) || 221128c10f9eSGabriel Fernandez !postdiv1 || !postdiv2) 221228c10f9eSGabriel Fernandez dfout = prate; 221328c10f9eSGabriel Fernandez else 221428c10f9eSGabriel Fernandez dfout = clk_get_pll_fvco(cfg->pll_offset, 221528c10f9eSGabriel Fernandez prate) / (postdiv1 * postdiv2); 221628c10f9eSGabriel Fernandez 221728c10f9eSGabriel Fernandez return dfout; 221828c10f9eSGabriel Fernandez } 221928c10f9eSGabriel Fernandez 222028c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll_enable(struct clk *clk) 222128c10f9eSGabriel Fernandez { 222228c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 222328c10f9eSGabriel Fernandez 222428c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) { 222528c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 222628c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT; 222728c10f9eSGabriel Fernandez } 222828c10f9eSGabriel Fernandez 222928c10f9eSGabriel Fernandez return TEE_SUCCESS; 223028c10f9eSGabriel Fernandez } 223128c10f9eSGabriel Fernandez 223228c10f9eSGabriel Fernandez static void clk_stm32_pll_disable(struct clk *clk) 223328c10f9eSGabriel Fernandez { 223428c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 223528c10f9eSGabriel Fernandez 223628c10f9eSGabriel Fernandez if (stm32_gate_rdy_disable(cfg->gate_id)) { 223728c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 223828c10f9eSGabriel Fernandez panic(); 223928c10f9eSGabriel Fernandez } 224028c10f9eSGabriel Fernandez } 224128c10f9eSGabriel Fernandez 224228c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll_ops = { 224328c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 224428c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate, 224528c10f9eSGabriel Fernandez .enable = clk_stm32_pll_enable, 224628c10f9eSGabriel Fernandez .disable = clk_stm32_pll_disable, 224728c10f9eSGabriel Fernandez }; 224828c10f9eSGabriel Fernandez 224928c10f9eSGabriel Fernandez static TEE_Result clk_stm32_pll3_enable(struct clk *clk) 225028c10f9eSGabriel Fernandez { 225128c10f9eSGabriel Fernandez struct clk_stm32_pll_cfg *cfg = clk->priv; 225228c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = clk_stm32_get_priv(); 225328c10f9eSGabriel Fernandez struct stm32_pll_dt_cfg *pll_conf = clk_stm32_pll_get_pdata(PLL3_ID); 225428c10f9eSGabriel Fernandez struct clk *parent = NULL; 225528c10f9eSGabriel Fernandez size_t pidx = 0; 225628c10f9eSGabriel Fernandez 225728c10f9eSGabriel Fernandez /* ck_icn_p_gpu activate */ 225828c10f9eSGabriel Fernandez stm32_gate_enable(GATE_GPU); 225928c10f9eSGabriel Fernandez 226028c10f9eSGabriel Fernandez clk_stm32_pll_init(priv, PLL3_ID, pll_conf); 226128c10f9eSGabriel Fernandez 226228c10f9eSGabriel Fernandez if (stm32_gate_rdy_enable(cfg->gate_id)) { 226328c10f9eSGabriel Fernandez EMSG("%s timeout", clk_get_name(clk)); 226428c10f9eSGabriel Fernandez return TEE_ERROR_TIMEOUT; 226528c10f9eSGabriel Fernandez } 226628c10f9eSGabriel Fernandez 226728c10f9eSGabriel Fernandez /* Update parent */ 226828c10f9eSGabriel Fernandez pidx = clk_stm32_pll_get_parent(clk); 226928c10f9eSGabriel Fernandez parent = clk_get_parent_by_index(clk, pidx); 227028c10f9eSGabriel Fernandez 227128c10f9eSGabriel Fernandez clk->parent = parent; 227228c10f9eSGabriel Fernandez 227328c10f9eSGabriel Fernandez return TEE_SUCCESS; 227428c10f9eSGabriel Fernandez } 227528c10f9eSGabriel Fernandez 227628c10f9eSGabriel Fernandez static void clk_stm32_pll3_disable(struct clk *clk) 227728c10f9eSGabriel Fernandez { 227828c10f9eSGabriel Fernandez clk_stm32_pll_disable(clk); 227928c10f9eSGabriel Fernandez stm32_gate_disable(GATE_GPU); 228028c10f9eSGabriel Fernandez } 228128c10f9eSGabriel Fernandez 228228c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_pll3_ops = { 228328c10f9eSGabriel Fernandez .get_parent = clk_stm32_pll_get_parent, 228428c10f9eSGabriel Fernandez .get_rate = clk_stm32_pll_get_rate, 228528c10f9eSGabriel Fernandez .enable = clk_stm32_pll3_enable, 228628c10f9eSGabriel Fernandez .disable = clk_stm32_pll3_disable, 228728c10f9eSGabriel Fernandez }; 228828c10f9eSGabriel Fernandez 228928c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg { 229028c10f9eSGabriel Fernandez int flex_id; 229128c10f9eSGabriel Fernandez }; 229228c10f9eSGabriel Fernandez 229328c10f9eSGabriel Fernandez static size_t clk_stm32_flexgen_get_parent(struct clk *clk) 229428c10f9eSGabriel Fernandez { 229528c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 229628c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 229728c10f9eSGabriel Fernandez uint32_t address = 0; 229828c10f9eSGabriel Fernandez 229928c10f9eSGabriel Fernandez address = rcc_base + RCC_XBAR0CFGR + (cfg->flex_id * 4); 230028c10f9eSGabriel Fernandez 230128c10f9eSGabriel Fernandez return io_read32(address) & RCC_XBAR0CFGR_XBAR0SEL_MASK; 230228c10f9eSGabriel Fernandez } 230328c10f9eSGabriel Fernandez 230428c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_parent(struct clk *clk, size_t pidx) 230528c10f9eSGabriel Fernandez { 230628c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 230728c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 230828c10f9eSGabriel Fernandez uint16_t channel = cfg->flex_id * 4; 230928c10f9eSGabriel Fernandez 231028c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_XBAR0CFGR + (channel), 231128c10f9eSGabriel Fernandez RCC_XBAR0CFGR_XBAR0SEL_MASK, pidx); 231228c10f9eSGabriel Fernandez 231328c10f9eSGabriel Fernandez if (wait_xbar_sts(channel)) 231428c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 231528c10f9eSGabriel Fernandez 231628c10f9eSGabriel Fernandez return TEE_SUCCESS; 231728c10f9eSGabriel Fernandez } 231828c10f9eSGabriel Fernandez 231928c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_rate(struct clk *clk __unused, 232028c10f9eSGabriel Fernandez unsigned long prate) 232128c10f9eSGabriel Fernandez { 232228c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 232328c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 232428c10f9eSGabriel Fernandez uint32_t prediv = 0; 232528c10f9eSGabriel Fernandez uint32_t findiv = 0; 232628c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 232728c10f9eSGabriel Fernandez unsigned long freq = prate; 232828c10f9eSGabriel Fernandez 232928c10f9eSGabriel Fernandez prediv = io_read32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel)) & 233028c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK; 233128c10f9eSGabriel Fernandez findiv = io_read32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel)) & 233228c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK; 233328c10f9eSGabriel Fernandez 233428c10f9eSGabriel Fernandez if (freq == 0) 233528c10f9eSGabriel Fernandez return 0; 233628c10f9eSGabriel Fernandez 233728c10f9eSGabriel Fernandez switch (prediv) { 233828c10f9eSGabriel Fernandez case 0x0: 233928c10f9eSGabriel Fernandez break; 234028c10f9eSGabriel Fernandez 234128c10f9eSGabriel Fernandez case 0x1: 234228c10f9eSGabriel Fernandez freq /= 2; 234328c10f9eSGabriel Fernandez break; 234428c10f9eSGabriel Fernandez 234528c10f9eSGabriel Fernandez case 0x3: 234628c10f9eSGabriel Fernandez freq /= 4; 234728c10f9eSGabriel Fernandez break; 234828c10f9eSGabriel Fernandez 234928c10f9eSGabriel Fernandez case 0x3FF: 235028c10f9eSGabriel Fernandez freq /= 1024; 235128c10f9eSGabriel Fernandez break; 235228c10f9eSGabriel Fernandez 235328c10f9eSGabriel Fernandez default: 235428c10f9eSGabriel Fernandez EMSG("Unsupported PREDIV value (%#"PRIx32")", prediv); 235528c10f9eSGabriel Fernandez panic(); 235628c10f9eSGabriel Fernandez break; 235728c10f9eSGabriel Fernandez } 235828c10f9eSGabriel Fernandez 235928c10f9eSGabriel Fernandez freq /= findiv + 1; 236028c10f9eSGabriel Fernandez 236128c10f9eSGabriel Fernandez return freq; 236228c10f9eSGabriel Fernandez } 236328c10f9eSGabriel Fernandez 236428c10f9eSGabriel Fernandez static unsigned long clk_stm32_flexgen_get_round_rate(unsigned long rate, 236528c10f9eSGabriel Fernandez unsigned long prate, 236628c10f9eSGabriel Fernandez unsigned int *prediv, 236728c10f9eSGabriel Fernandez unsigned int *findiv) 236828c10f9eSGabriel Fernandez { 236928c10f9eSGabriel Fernandez unsigned int pre_val[] = { 0x0, 0x1, 0x3, 0x3FF }; 237028c10f9eSGabriel Fernandez unsigned int pre_div[] = { 1, 2, 4, 1024 }; 237128c10f9eSGabriel Fernandez long best_diff = LONG_MAX; 237228c10f9eSGabriel Fernandez unsigned int i = 0; 237328c10f9eSGabriel Fernandez 237428c10f9eSGabriel Fernandez *prediv = 0; 237528c10f9eSGabriel Fernandez *findiv = 0; 237628c10f9eSGabriel Fernandez 237728c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(pre_div); i++) { 237828c10f9eSGabriel Fernandez unsigned long freq = 0; 237928c10f9eSGabriel Fernandez unsigned long ratio = 0; 238028c10f9eSGabriel Fernandez long diff = 0L; 238128c10f9eSGabriel Fernandez 238228c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)prate, pre_div[i]); 238328c10f9eSGabriel Fernandez ratio = UDIV_ROUND_NEAREST((uint64_t)freq, rate); 238428c10f9eSGabriel Fernandez 238528c10f9eSGabriel Fernandez if (ratio == 0) 238628c10f9eSGabriel Fernandez ratio = 1; 238728c10f9eSGabriel Fernandez else if (ratio > 64) 238828c10f9eSGabriel Fernandez ratio = 64; 238928c10f9eSGabriel Fernandez 239028c10f9eSGabriel Fernandez freq = UDIV_ROUND_NEAREST((uint64_t)freq, ratio); 239128c10f9eSGabriel Fernandez if (freq < rate) 239228c10f9eSGabriel Fernandez diff = rate - freq; 239328c10f9eSGabriel Fernandez else 239428c10f9eSGabriel Fernandez diff = freq - rate; 239528c10f9eSGabriel Fernandez 239628c10f9eSGabriel Fernandez if (diff < best_diff) { 239728c10f9eSGabriel Fernandez best_diff = diff; 239828c10f9eSGabriel Fernandez *prediv = pre_val[i]; 239928c10f9eSGabriel Fernandez *findiv = ratio - 1; 240028c10f9eSGabriel Fernandez 240128c10f9eSGabriel Fernandez if (diff == 0) 240228c10f9eSGabriel Fernandez break; 240328c10f9eSGabriel Fernandez } 240428c10f9eSGabriel Fernandez } 240528c10f9eSGabriel Fernandez 240628c10f9eSGabriel Fernandez return (prate / (*prediv + 1)) / (*findiv + 1); 240728c10f9eSGabriel Fernandez } 240828c10f9eSGabriel Fernandez 240928c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_set_rate(struct clk *clk, 241028c10f9eSGabriel Fernandez unsigned long rate, 241128c10f9eSGabriel Fernandez unsigned long parent_rate) 241228c10f9eSGabriel Fernandez { 241328c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 241428c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 241528c10f9eSGabriel Fernandez uintptr_t rcc_base = stm32_rcc_base(); 241628c10f9eSGabriel Fernandez unsigned int prediv = 0; 241728c10f9eSGabriel Fernandez unsigned int findiv = 0; 241828c10f9eSGabriel Fernandez 241928c10f9eSGabriel Fernandez clk_stm32_flexgen_get_round_rate(rate, parent_rate, &prediv, &findiv); 242028c10f9eSGabriel Fernandez 242128c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 242228c10f9eSGabriel Fernandez panic(); 242328c10f9eSGabriel Fernandez 242428c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_PREDIV0CFGR + (0x4 * channel), 242528c10f9eSGabriel Fernandez RCC_PREDIV0CFGR_PREDIV0_MASK, 242628c10f9eSGabriel Fernandez prediv); 242728c10f9eSGabriel Fernandez 242828c10f9eSGabriel Fernandez if (wait_predivsr(channel) != 0) 242928c10f9eSGabriel Fernandez panic(); 243028c10f9eSGabriel Fernandez 243128c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 243228c10f9eSGabriel Fernandez panic(); 243328c10f9eSGabriel Fernandez 243428c10f9eSGabriel Fernandez io_clrsetbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 243528c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0_MASK, 243628c10f9eSGabriel Fernandez findiv); 243728c10f9eSGabriel Fernandez 243828c10f9eSGabriel Fernandez if (wait_findivsr(channel) != 0) 243928c10f9eSGabriel Fernandez panic(); 244028c10f9eSGabriel Fernandez 244128c10f9eSGabriel Fernandez return TEE_SUCCESS; 244228c10f9eSGabriel Fernandez } 244328c10f9eSGabriel Fernandez 244428c10f9eSGabriel Fernandez static TEE_Result clk_stm32_flexgen_enable(struct clk *clk) 244528c10f9eSGabriel Fernandez { 244628c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 244728c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 24481f2e0a3fSGatien Chevallier TEE_Result ret = TEE_ERROR_GENERIC; 244928c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 245028c10f9eSGabriel Fernandez 24511f2e0a3fSGatien Chevallier /* 24521f2e0a3fSGatien Chevallier * Configure flexgen of STGEN since it has been skipped during 24531f2e0a3fSGatien Chevallier * flexgen configuration. 24541f2e0a3fSGatien Chevallier */ 24551f2e0a3fSGatien Chevallier if (channel == FLEX_STGEN) { 24561f2e0a3fSGatien Chevallier unsigned int clk_src = U(0); 24571f2e0a3fSGatien Chevallier unsigned int pdiv = U(0); 24581f2e0a3fSGatien Chevallier unsigned int fdiv = U(0); 24591f2e0a3fSGatien Chevallier 24601f2e0a3fSGatien Chevallier ret = flexclkgen_search_config(channel, &clk_src, &pdiv, &fdiv); 24611f2e0a3fSGatien Chevallier if (ret) { 24621f2e0a3fSGatien Chevallier EMSG("Error %#"PRIx32" when getting STGEN flexgen conf", 24631f2e0a3fSGatien Chevallier ret); 24641f2e0a3fSGatien Chevallier return ret; 24651f2e0a3fSGatien Chevallier } 24661f2e0a3fSGatien Chevallier 24671f2e0a3fSGatien Chevallier flexclkgen_config_channel(channel, clk_src, pdiv, fdiv); 24681f2e0a3fSGatien Chevallier 24691f2e0a3fSGatien Chevallier /* Update parent */ 24701f2e0a3fSGatien Chevallier clk->parent = clk_get_parent_by_index(clk, clk_src); 24711f2e0a3fSGatien Chevallier } 24721f2e0a3fSGatien Chevallier 247328c10f9eSGabriel Fernandez io_setbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 247428c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN); 247528c10f9eSGabriel Fernandez 247628c10f9eSGabriel Fernandez return TEE_SUCCESS; 247728c10f9eSGabriel Fernandez } 247828c10f9eSGabriel Fernandez 247928c10f9eSGabriel Fernandez static void clk_stm32_flexgen_disable(struct clk *clk) 248028c10f9eSGabriel Fernandez { 248128c10f9eSGabriel Fernandez struct clk_stm32_flexgen_cfg *cfg = clk->priv; 248228c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 248328c10f9eSGabriel Fernandez uint8_t channel = cfg->flex_id; 248428c10f9eSGabriel Fernandez 248528c10f9eSGabriel Fernandez io_clrbits32(rcc_base + RCC_FINDIV0CFGR + (0x4 * channel), 248628c10f9eSGabriel Fernandez RCC_FINDIV0CFGR_FINDIV0EN); 248728c10f9eSGabriel Fernandez } 248828c10f9eSGabriel Fernandez 248928c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_flexgen_ops = { 249028c10f9eSGabriel Fernandez .get_rate = clk_stm32_flexgen_get_rate, 249128c10f9eSGabriel Fernandez .set_rate = clk_stm32_flexgen_set_rate, 249228c10f9eSGabriel Fernandez .get_parent = clk_stm32_flexgen_get_parent, 249328c10f9eSGabriel Fernandez .set_parent = clk_stm32_flexgen_set_parent, 249428c10f9eSGabriel Fernandez .enable = clk_stm32_flexgen_enable, 249528c10f9eSGabriel Fernandez .disable = clk_stm32_flexgen_disable, 249628c10f9eSGabriel Fernandez }; 249728c10f9eSGabriel Fernandez 249828c10f9eSGabriel Fernandez static size_t clk_cpu1_get_parent(struct clk *clk __unused) 249928c10f9eSGabriel Fernandez { 250028c10f9eSGabriel Fernandez uint32_t reg = stm32mp_syscfg_read(A35SS_SSC_CHGCLKREQ); 250128c10f9eSGabriel Fernandez 250228c10f9eSGabriel Fernandez return (reg & A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_MASK) >> 250328c10f9eSGabriel Fernandez A35SS_SSC_CHGCLKREQ_ARM_CHGCLKACK_SHIFT; 250428c10f9eSGabriel Fernandez } 250528c10f9eSGabriel Fernandez 250628c10f9eSGabriel Fernandez static const struct clk_ops clk_stm32_cpu1_ops = { 250728c10f9eSGabriel Fernandez .get_parent = clk_cpu1_get_parent, 250828c10f9eSGabriel Fernandez }; 250928c10f9eSGabriel Fernandez 251028c10f9eSGabriel Fernandez #define APB_DIV_MASK GENMASK_32(2, 0) 251128c10f9eSGabriel Fernandez #define TIM_PRE_MASK BIT(0) 251228c10f9eSGabriel Fernandez 251328c10f9eSGabriel Fernandez static unsigned long ck_timer_get_rate_ops(struct clk *clk, unsigned long prate) 251428c10f9eSGabriel Fernandez { 251528c10f9eSGabriel Fernandez struct clk_stm32_timer_cfg *cfg = clk->priv; 251628c10f9eSGabriel Fernandez uintptr_t rcc_base = clk_stm32_get_rcc_base(); 251728c10f9eSGabriel Fernandez uint32_t prescaler = 0; 251828c10f9eSGabriel Fernandez uint32_t timpre = 0; 251928c10f9eSGabriel Fernandez 252028c10f9eSGabriel Fernandez prescaler = io_read32(rcc_base + cfg->apbdiv) & APB_DIV_MASK; 252128c10f9eSGabriel Fernandez 252228c10f9eSGabriel Fernandez timpre = io_read32(rcc_base + cfg->timpre) & TIM_PRE_MASK; 252328c10f9eSGabriel Fernandez 252428c10f9eSGabriel Fernandez if (prescaler == 0) 252528c10f9eSGabriel Fernandez return prate; 252628c10f9eSGabriel Fernandez 252728c10f9eSGabriel Fernandez return prate * (timpre + 1) * 2; 252828c10f9eSGabriel Fernandez }; 252928c10f9eSGabriel Fernandez 253028c10f9eSGabriel Fernandez static const struct clk_ops ck_timer_ops = { 253128c10f9eSGabriel Fernandez .get_rate = ck_timer_get_rate_ops, 253228c10f9eSGabriel Fernandez }; 253328c10f9eSGabriel Fernandez 253428c10f9eSGabriel Fernandez #define PLL_PARENTS { &ck_hsi, &ck_hse, &ck_msi } 253528c10f9eSGabriel Fernandez #define PLL_NUM_PATENTS 3 253628c10f9eSGabriel Fernandez 253728c10f9eSGabriel Fernandez #define STM32_OSC(_name, _flags, _gate_id)\ 253828c10f9eSGabriel Fernandez struct clk _name = {\ 253928c10f9eSGabriel Fernandez .ops = &clk_stm32_osc_ops,\ 254028c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 254128c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 254228c10f9eSGabriel Fernandez },\ 254328c10f9eSGabriel Fernandez .name = #_name,\ 254428c10f9eSGabriel Fernandez .flags = (_flags),\ 254528c10f9eSGabriel Fernandez .num_parents = 1,\ 254628c10f9eSGabriel Fernandez .parents = { NULL },\ 254728c10f9eSGabriel Fernandez } 254828c10f9eSGabriel Fernandez 254928c10f9eSGabriel Fernandez #define STM32_OSC_MSI(_name, _flags, _gate_id)\ 255028c10f9eSGabriel Fernandez struct clk _name = {\ 255128c10f9eSGabriel Fernandez .ops = &clk_stm32_oscillator_msi_ops,\ 255228c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 255328c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 255428c10f9eSGabriel Fernandez },\ 255528c10f9eSGabriel Fernandez .name = #_name,\ 255628c10f9eSGabriel Fernandez .flags = (_flags),\ 255728c10f9eSGabriel Fernandez .num_parents = 1,\ 255828c10f9eSGabriel Fernandez .parents = { NULL },\ 255928c10f9eSGabriel Fernandez } 256028c10f9eSGabriel Fernandez 256128c10f9eSGabriel Fernandez #define STM32_HSE_DIV2(_name, _parent, _flags, _gate_id)\ 256228c10f9eSGabriel Fernandez struct clk _name = {\ 256328c10f9eSGabriel Fernandez .ops = &clk_hsediv2_ops,\ 256428c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_gate_cfg){\ 256528c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 256628c10f9eSGabriel Fernandez },\ 256728c10f9eSGabriel Fernandez .name = #_name,\ 256828c10f9eSGabriel Fernandez .flags = (_flags),\ 256928c10f9eSGabriel Fernandez .num_parents = 1,\ 257028c10f9eSGabriel Fernandez .parents = { (_parent) },\ 257128c10f9eSGabriel Fernandez } 257228c10f9eSGabriel Fernandez 257328c10f9eSGabriel Fernandez #define STM32_HSE_RTC(_name, _parent, _flags, _div_id)\ 257428c10f9eSGabriel Fernandez struct clk _name = {\ 257528c10f9eSGabriel Fernandez .ops = &clk_stm32_hse_div_ops,\ 257628c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_div_cfg){\ 257728c10f9eSGabriel Fernandez .div_id = (_div_id),\ 257828c10f9eSGabriel Fernandez },\ 257928c10f9eSGabriel Fernandez .name = #_name,\ 258028c10f9eSGabriel Fernandez .flags = (_flags),\ 258128c10f9eSGabriel Fernandez .num_parents = 1,\ 258228c10f9eSGabriel Fernandez .parents = { (_parent) },\ 258328c10f9eSGabriel Fernandez } 258428c10f9eSGabriel Fernandez 258528c10f9eSGabriel Fernandez #define STM32_PLL1(_name, _flags, _mux_id)\ 258628c10f9eSGabriel Fernandez struct clk _name = {\ 258728c10f9eSGabriel Fernandez .ops = &clk_stm32_pll1_ops,\ 258828c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 258928c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 259028c10f9eSGabriel Fernandez },\ 259128c10f9eSGabriel Fernandez .name = #_name,\ 259228c10f9eSGabriel Fernandez .flags = (_flags),\ 259328c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 259428c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 259528c10f9eSGabriel Fernandez } 259628c10f9eSGabriel Fernandez 259728c10f9eSGabriel Fernandez #define STM32_PLL2(_name, _flags, _reg, _gate_id, _mux_id)\ 259828c10f9eSGabriel Fernandez struct clk _name = {\ 259928c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\ 260028c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 260128c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 260228c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 260328c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 260428c10f9eSGabriel Fernandez },\ 260528c10f9eSGabriel Fernandez .name = #_name,\ 260628c10f9eSGabriel Fernandez .flags = (_flags),\ 260728c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 260828c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 260928c10f9eSGabriel Fernandez } 261028c10f9eSGabriel Fernandez 261128c10f9eSGabriel Fernandez #define STM32_PLL3(_name, _flags, _reg, _gate_id, _mux_id)\ 261228c10f9eSGabriel Fernandez struct clk _name = {\ 261328c10f9eSGabriel Fernandez .ops = &clk_stm32_pll3_ops,\ 261428c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 261528c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 261628c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 261728c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 261828c10f9eSGabriel Fernandez },\ 261928c10f9eSGabriel Fernandez .name = #_name,\ 262028c10f9eSGabriel Fernandez .flags = (_flags),\ 262128c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 262228c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 262328c10f9eSGabriel Fernandez } 262428c10f9eSGabriel Fernandez 262528c10f9eSGabriel Fernandez #define STM32_PLLS(_name, _flags, _reg, _gate_id, _mux_id)\ 262628c10f9eSGabriel Fernandez struct clk _name = {\ 262728c10f9eSGabriel Fernandez .ops = &clk_stm32_pll_ops,\ 262828c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_pll_cfg){\ 262928c10f9eSGabriel Fernandez .pll_offset = (_reg),\ 263028c10f9eSGabriel Fernandez .gate_id = (_gate_id),\ 263128c10f9eSGabriel Fernandez .mux_id = (_mux_id),\ 263228c10f9eSGabriel Fernandez },\ 263328c10f9eSGabriel Fernandez .name = #_name,\ 263428c10f9eSGabriel Fernandez .flags = (_flags),\ 263528c10f9eSGabriel Fernandez .num_parents = PLL_NUM_PATENTS,\ 263628c10f9eSGabriel Fernandez .parents = PLL_PARENTS,\ 263728c10f9eSGabriel Fernandez } 263828c10f9eSGabriel Fernandez 263928c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_off, RCC_0_MHZ); 264028c10f9eSGabriel Fernandez 264128c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser0, 0); 264228c10f9eSGabriel Fernandez static STM32_FIXED_RATE(ck_obser1, 0); 264328c10f9eSGabriel Fernandez static STM32_FIXED_RATE(spdifsymb, 0); 264428c10f9eSGabriel Fernandez static STM32_FIXED_RATE(txbyteclk, 27000000); 264528c10f9eSGabriel Fernandez 264628c10f9eSGabriel Fernandez /* Oscillator clocks */ 264728c10f9eSGabriel Fernandez static STM32_OSC(ck_hsi, 0, GATE_HSI); 264828c10f9eSGabriel Fernandez static STM32_OSC(ck_hse, 0, GATE_HSE); 264928c10f9eSGabriel Fernandez static STM32_OSC_MSI(ck_msi, 0, GATE_MSI); 265028c10f9eSGabriel Fernandez static STM32_OSC(ck_lsi, 0, GATE_LSI); 265128c10f9eSGabriel Fernandez static STM32_OSC(ck_lse, 0, GATE_LSE); 265228c10f9eSGabriel Fernandez 265328c10f9eSGabriel Fernandez static STM32_HSE_DIV2(ck_hse_div2, &ck_hse, 0, GATE_HSEDIV2); 265428c10f9eSGabriel Fernandez static STM32_HSE_RTC(ck_hse_rtc, &ck_hse, 0, DIV_RTC); 265528c10f9eSGabriel Fernandez 265628c10f9eSGabriel Fernandez static STM32_FIXED_FACTOR(i2sckin, NULL, 0, 1, 1); 265728c10f9eSGabriel Fernandez 265828c10f9eSGabriel Fernandez static STM32_PLL1(ck_pll1, 0, MUX_MUXSEL5); 265928c10f9eSGabriel Fernandez static STM32_PLL2(ck_pll2, 0, RCC_PLL2CFGR1, GATE_PLL2, MUX_MUXSEL6); 266028c10f9eSGabriel Fernandez static STM32_PLL3(ck_pll3, 0, RCC_PLL3CFGR1, GATE_PLL3, MUX_MUXSEL7); 266128c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll4, 0, RCC_PLL4CFGR1, GATE_PLL4, MUX_MUXSEL0); 266228c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll5, 0, RCC_PLL5CFGR1, GATE_PLL5, MUX_MUXSEL1); 266328c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll6, 0, RCC_PLL6CFGR1, GATE_PLL6, MUX_MUXSEL2); 266428c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll7, 0, RCC_PLL7CFGR1, GATE_PLL7, MUX_MUXSEL3); 266528c10f9eSGabriel Fernandez static STM32_PLLS(ck_pll8, 0, RCC_PLL8CFGR1, GATE_PLL8, MUX_MUXSEL4); 266628c10f9eSGabriel Fernandez 266728c10f9eSGabriel Fernandez #define STM32_FLEXGEN(_name, _flags, _flex_id)\ 266828c10f9eSGabriel Fernandez struct clk _name = {\ 266928c10f9eSGabriel Fernandez .ops = &clk_stm32_flexgen_ops,\ 267028c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_flexgen_cfg){\ 267128c10f9eSGabriel Fernandez .flex_id = (_flex_id),\ 267228c10f9eSGabriel Fernandez },\ 267328c10f9eSGabriel Fernandez .name = #_name,\ 267428c10f9eSGabriel Fernandez .flags = (_flags) | CLK_SET_RATE_UNGATE,\ 267528c10f9eSGabriel Fernandez .num_parents = 15,\ 267628c10f9eSGabriel Fernandez .parents = {\ 267728c10f9eSGabriel Fernandez &ck_pll4, &ck_pll5, &ck_pll6, &ck_pll7, &ck_pll8,\ 267828c10f9eSGabriel Fernandez &ck_hsi, &ck_hse, &ck_msi, &ck_hsi, &ck_hse, &ck_msi,\ 267928c10f9eSGabriel Fernandez &spdifsymb, &i2sckin, &ck_lsi, &ck_lse\ 268028c10f9eSGabriel Fernandez },\ 268128c10f9eSGabriel Fernandez } 268228c10f9eSGabriel Fernandez 268328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hs_mcu, 0, 0); 268428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_sdmmc, 0, 1); 268528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_ddr, 0, 2); 268628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_display, 0, 3); 268728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_hsl, 0, 4); 268828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_nic, 0, 5); 268928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_icn_vid, 0, 6); 269028c10f9eSGabriel Fernandez 269128c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_ls_mcu, &ck_icn_hs_mcu, 0, DIV_LSMCU); 269228c10f9eSGabriel Fernandez 269328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_07, 0, 7); 269428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_08, 0, 8); 269528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_09, 0, 9); 269628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_10, 0, 10); 269728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_11, 0, 11); 269828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_12, 0, 12); 269928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_13, 0, 13); 270028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_14, 0, 14); 270128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_15, 0, 15); 270228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_16, 0, 16); 270328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_17, 0, 17); 270428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_18, 0, 18); 270528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_19, 0, 19); 270628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_20, 0, 20); 270728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_21, 0, 21); 270828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_22, 0, 22); 270928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_23, 0, 23); 271028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_24, 0, 24); 271128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_25, 0, 25); 271228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_26, 0, 26); 271328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_27, 0, 27); 271428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_28, 0, 28); 271528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_29, 0, 29); 271628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_30, 0, 30); 271728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_31, 0, 31); 271828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_32, 0, 32); 271928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_33, 0, 33); 272028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_34, 0, 34); 272128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_35, 0, 35); 272228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_36, 0, 36); 272328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_37, 0, 37); 272428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_38, 0, 38); 272528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_39, 0, 39); 272628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_40, 0, 40); 272728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_41, 0, 41); 272828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_42, 0, 42); 272928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_43, 0, 43); 273028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_44, 0, 44); 273128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_45, 0, 45); 273228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_46, 0, 46); 273328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_47, 0, 47); 273428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_48, 0, 48); 273528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_49, 0, 49); 273628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_50, 0, 50); 273728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_51, 0, 51); 273828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_52, 0, 52); 273928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_53, 0, 53); 274028c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_54, 0, 54); 274128c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_55, 0, 55); 274228c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_56, 0, 56); 274328c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_57, 0, 57); 274428c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_58, 0, 58); 274528c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_59, 0, 59); 274628c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_60, 0, 60); 274728c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_61, 0, 61); 274828c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_62, 0, 62); 274928c10f9eSGabriel Fernandez static STM32_FLEXGEN(ck_flexgen_63, 0, 63); 275028c10f9eSGabriel Fernandez 275128c10f9eSGabriel Fernandez static struct clk ck_cpu1 = { 275228c10f9eSGabriel Fernandez .ops = &clk_stm32_cpu1_ops, 275328c10f9eSGabriel Fernandez .name = "ck_cpu1", 275428c10f9eSGabriel Fernandez .flags = CLK_SET_RATE_PARENT, 275528c10f9eSGabriel Fernandez .num_parents = 2, 275628c10f9eSGabriel Fernandez .parents = { &ck_pll1, &ck_flexgen_63 }, 275728c10f9eSGabriel Fernandez }; 275828c10f9eSGabriel Fernandez 275928c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb1, &ck_icn_ls_mcu, 0, DIV_APB1); 276028c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb2, &ck_icn_ls_mcu, 0, DIV_APB2); 276128c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb3, &ck_icn_ls_mcu, 0, DIV_APB3); 276228c10f9eSGabriel Fernandez static STM32_DIVIDER(ck_icn_apb4, &ck_icn_ls_mcu, 0, DIV_APB4); 276328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_icn_apbdbg, 1, { &ck_icn_ls_mcu }, 0, 276428c10f9eSGabriel Fernandez GATE_DBG, DIV_APBDBG, NO_MUX); 276528c10f9eSGabriel Fernandez 276628c10f9eSGabriel Fernandez #define STM32_TIMER(_name, _parent, _flags, _apbdiv, _timpre)\ 276728c10f9eSGabriel Fernandez struct clk _name = {\ 276828c10f9eSGabriel Fernandez .ops = &ck_timer_ops,\ 276928c10f9eSGabriel Fernandez .priv = &(struct clk_stm32_timer_cfg){\ 277028c10f9eSGabriel Fernandez .apbdiv = (_apbdiv),\ 277128c10f9eSGabriel Fernandez .timpre = (_timpre),\ 277228c10f9eSGabriel Fernandez },\ 277328c10f9eSGabriel Fernandez .name = #_name,\ 277428c10f9eSGabriel Fernandez .flags = (_flags),\ 277528c10f9eSGabriel Fernandez .num_parents = 1,\ 277628c10f9eSGabriel Fernandez .parents = { _parent },\ 277728c10f9eSGabriel Fernandez } 277828c10f9eSGabriel Fernandez 277928c10f9eSGabriel Fernandez /* Kernel Timers */ 278028c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg1, &ck_icn_apb1, 0, RCC_APB1DIVR, RCC_TIMG1PRER); 278128c10f9eSGabriel Fernandez static STM32_TIMER(ck_timg2, &ck_icn_apb2, 0, RCC_APB2DIVR, RCC_TIMG2PRER); 278228c10f9eSGabriel Fernandez 278328c10f9eSGabriel Fernandez /* Clocks under RCC RIF protection */ 278428c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_dbg, &ck_icn_apbdbg, 0, GATE_DBG); 278528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stm, &ck_icn_apbdbg, 0, GATE_STM); 278628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_stm, &ck_icn_ls_mcu, 0, GATE_STM); 278728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tsdbg, &ck_flexgen_43, 0, GATE_DBG); 278828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tpiu, &ck_flexgen_44, 0, GATE_TRACE); 278928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_etr, &ck_icn_apbdbg, 0, GATE_ETR); 279028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_etr, &ck_flexgen_45, 0, GATE_ETR); 279128c10f9eSGabriel Fernandez static STM32_GATE(ck_sys_atb, &ck_flexgen_45, 0, GATE_DBG); 279228c10f9eSGabriel Fernandez 279328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sysram, &ck_icn_hs_mcu, 0, GATE_SYSRAM); 279428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_vderam, &ck_icn_hs_mcu, 0, GATE_VDERAM); 279528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_retram, &ck_icn_hs_mcu, 0, GATE_RETRAM); 279628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_bkpsram, &ck_icn_ls_mcu, 0, GATE_BKPSRAM); 279728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram1, &ck_icn_hs_mcu, 0, GATE_SRAM1); 279828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_sram2, &ck_icn_hs_mcu, 0, GATE_SRAM2); 279928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram1, &ck_icn_ls_mcu, 0, GATE_LPSRAM1); 280028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram2, &ck_icn_ls_mcu, 0, GATE_LPSRAM2); 280128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_lpsram3, &ck_icn_ls_mcu, 0, GATE_LPSRAM3); 280228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma1, &ck_icn_ls_mcu, 0, GATE_HPDMA1); 280328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma2, &ck_icn_ls_mcu, 0, GATE_HPDMA2); 280428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hpdma3, &ck_icn_ls_mcu, 0, GATE_HPDMA3); 280528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpdma, &ck_icn_ls_mcu, 0, GATE_LPDMA); 280628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc1, &ck_icn_ls_mcu, 0, GATE_IPCC1); 280728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ipcc2, &ck_icn_ls_mcu, 0, GATE_IPCC2); 280828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hsem, &ck_icn_ls_mcu, 0, GATE_HSEM); 280928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioa, &ck_icn_ls_mcu, 0, GATE_GPIOA); 281028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiob, &ck_icn_ls_mcu, 0, GATE_GPIOB); 281128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioc, &ck_icn_ls_mcu, 0, GATE_GPIOC); 281228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiod, &ck_icn_ls_mcu, 0, GATE_GPIOD); 281328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioe, &ck_icn_ls_mcu, 0, GATE_GPIOE); 281428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiof, &ck_icn_ls_mcu, 0, GATE_GPIOF); 281528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiog, &ck_icn_ls_mcu, 0, GATE_GPIOG); 281628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioh, &ck_icn_ls_mcu, 0, GATE_GPIOH); 281728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioi, &ck_icn_ls_mcu, 0, GATE_GPIOI); 281828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioj, &ck_icn_ls_mcu, 0, GATE_GPIOJ); 281928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpiok, &ck_icn_ls_mcu, 0, GATE_GPIOK); 282028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gpioz, &ck_icn_ls_mcu, 0, GATE_GPIOZ); 282128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rtc, &ck_icn_ls_mcu, 0, GATE_RTC); 282228c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_rtc, 4, 282328c10f9eSGabriel Fernandez PARENT(&ck_off, &ck_lse, &ck_lsi, &ck_hse_rtc), 282428c10f9eSGabriel Fernandez 0, GATE_RTCCK, NO_DIV, MUX_RTC); 282528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_bsec, &ck_icn_apb3, 0, GATE_BSEC); 282628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrphyc, &ck_icn_ls_mcu, 0, GATE_DDRPHYCAPB); 282728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_risaf4, &ck_icn_ls_mcu, 0, GATE_DDRCP); 282828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ddr, &ck_icn_ddr, 0, GATE_DDRCP); 282928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrc, &ck_icn_apb4, 0, GATE_DDRCAPB); 283028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ddrcfg, &ck_icn_apb4, 0, GATE_DDRCFG); 283128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_syscpu1, &ck_icn_ls_mcu, 0, GATE_SYSCPU1); 283228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_is2m, &ck_icn_apb3, 0, GATE_IS2M); 283328c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco1, 2, PARENT(&ck_flexgen_61, &ck_obser0), 0, 283428c10f9eSGabriel Fernandez GATE_MCO1, NO_DIV, MUX_MCO1); 283528c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_mco2, 2, PARENT(&ck_flexgen_62, &ck_obser1), 0, 283628c10f9eSGabriel Fernandez GATE_MCO2, NO_DIV, MUX_MCO2); 283728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi1, &ck_icn_hs_mcu, 0, GATE_OSPI1); 283828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi1, &ck_flexgen_48, 0, GATE_OSPI1); 283928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_s_ospi2, &ck_icn_hs_mcu, 0, GATE_OSPI2); 284028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ospi2, &ck_flexgen_49, 0, GATE_OSPI2); 284128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fmc, &ck_icn_ls_mcu, 0, GATE_FMC); 284228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fmc, &ck_flexgen_50, 0, GATE_FMC); 284328c10f9eSGabriel Fernandez 284428c10f9eSGabriel Fernandez /* Kernel Clocks */ 284528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cci, &ck_icn_ls_mcu, 0, GATE_CCI); 284628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_crc, &ck_icn_ls_mcu, 0, GATE_CRC); 284728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ospiiom, &ck_icn_ls_mcu, 0, GATE_OSPIIOM); 284828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hash, &ck_icn_ls_mcu, 0, GATE_HASH); 284928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_rng, &ck_icn_ls_mcu, 0, GATE_RNG); 285028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp1, &ck_icn_ls_mcu, 0, GATE_CRYP1); 285128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_cryp2, &ck_icn_ls_mcu, 0, GATE_CRYP2); 285228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_saes, &ck_icn_ls_mcu, 0, GATE_SAES); 285328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pka, &ck_icn_ls_mcu, 0, GATE_PKA); 285428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adf1, &ck_icn_ls_mcu, 0, GATE_ADF1); 285528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg5, &ck_icn_ls_mcu, 0, GATE_IWDG5); 285628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg2, &ck_icn_ls_mcu, 0, GATE_WWDG2); 285728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth1, &ck_icn_ls_mcu, 0, GATE_ETH1); 285828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ethsw, &ck_icn_ls_mcu, 0, GATE_ETHSWMAC); 285928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_eth2, &ck_icn_ls_mcu, 0, GATE_ETH2); 286028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_pcie, &ck_icn_ls_mcu, 0, GATE_PCIE); 286128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc12, &ck_icn_ls_mcu, 0, GATE_ADC12); 286228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_adc3, &ck_icn_ls_mcu, 0, GATE_ADC3); 286328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_mdf1, &ck_icn_ls_mcu, 0, GATE_MDF1); 286428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi8, &ck_icn_ls_mcu, 0, GATE_SPI8); 286528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lpuart1, &ck_icn_ls_mcu, 0, GATE_LPUART1); 286628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c8, &ck_icn_ls_mcu, 0, GATE_I2C8); 286728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim3, &ck_icn_ls_mcu, 0, GATE_LPTIM3); 286828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim4, &ck_icn_ls_mcu, 0, GATE_LPTIM4); 286928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim5, &ck_icn_ls_mcu, 0, GATE_LPTIM5); 287028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc1, &ck_icn_sdmmc, 0, GATE_SDMMC1); 287128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc2, &ck_icn_sdmmc, 0, GATE_SDMMC2); 287228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_sdmmc3, &ck_icn_sdmmc, 0, GATE_SDMMC3); 287328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ohci, &ck_icn_hsl, 0, GATE_USB2); 287428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb2ehci, &ck_icn_hsl, 0, GATE_USB2); 287528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_usb3dr, &ck_icn_hsl, 0, GATE_USB3DR); 287628c10f9eSGabriel Fernandez 287728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim2, &ck_icn_apb1, 0, GATE_TIM2); 287828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim3, &ck_icn_apb1, 0, GATE_TIM3); 287928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim4, &ck_icn_apb1, 0, GATE_TIM4); 288028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim5, &ck_icn_apb1, 0, GATE_TIM5); 288128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim6, &ck_icn_apb1, 0, GATE_TIM6); 288228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim7, &ck_icn_apb1, 0, GATE_TIM7); 288328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim10, &ck_icn_apb1, 0, GATE_TIM10); 288428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim11, &ck_icn_apb1, 0, GATE_TIM11); 288528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim12, &ck_icn_apb1, 0, GATE_TIM12); 288628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim13, &ck_icn_apb1, 0, GATE_TIM13); 288728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim14, &ck_icn_apb1, 0, GATE_TIM14); 288828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim1, &ck_icn_apb1, 0, GATE_LPTIM1); 288928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lptim2, &ck_icn_apb1, 0, GATE_LPTIM2); 289028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi2, &ck_icn_apb1, 0, GATE_SPI2); 289128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi3, &ck_icn_apb1, 0, GATE_SPI3); 289228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spdifrx, &ck_icn_apb1, 0, GATE_SPDIFRX); 289328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart2, &ck_icn_apb1, 0, GATE_USART2); 289428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart3, &ck_icn_apb1, 0, GATE_USART3); 289528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart4, &ck_icn_apb1, 0, GATE_UART4); 289628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart5, &ck_icn_apb1, 0, GATE_UART5); 289728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c1, &ck_icn_apb1, 0, GATE_I2C1); 289828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c2, &ck_icn_apb1, 0, GATE_I2C2); 289928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c3, &ck_icn_apb1, 0, GATE_I2C3); 290028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c4, &ck_icn_apb1, 0, GATE_I2C4); 290128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c5, &ck_icn_apb1, 0, GATE_I2C5); 290228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c6, &ck_icn_apb1, 0, GATE_I2C6); 290328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i2c7, &ck_icn_apb1, 0, GATE_I2C7); 290428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c1, &ck_icn_apb1, 0, GATE_I3C1); 290528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c2, &ck_icn_apb1, 0, GATE_I3C2); 290628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c3, &ck_icn_apb1, 0, GATE_I3C3); 290728c10f9eSGabriel Fernandez 290828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_i3c4, &ck_icn_ls_mcu, 0, GATE_I3C4); 290928c10f9eSGabriel Fernandez 291028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim1, &ck_icn_apb2, 0, GATE_TIM1); 291128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim8, &ck_icn_apb2, 0, GATE_TIM8); 291228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim15, &ck_icn_apb2, 0, GATE_TIM15); 291328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim16, &ck_icn_apb2, 0, GATE_TIM16); 291428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim17, &ck_icn_apb2, 0, GATE_TIM17); 291528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_tim20, &ck_icn_apb2, 0, GATE_TIM20); 291628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai1, &ck_icn_apb2, 0, GATE_SAI1); 291728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai2, &ck_icn_apb2, 0, GATE_SAI2); 291828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai3, &ck_icn_apb2, 0, GATE_SAI3); 291928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_sai4, &ck_icn_apb2, 0, GATE_SAI4); 292028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart1, &ck_icn_apb2, 0, GATE_USART1); 292128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usart6, &ck_icn_apb2, 0, GATE_USART6); 292228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart7, &ck_icn_apb2, 0, GATE_UART7); 292328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart8, &ck_icn_apb2, 0, GATE_UART8); 292428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_uart9, &ck_icn_apb2, 0, GATE_UART9); 292528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_fdcan, &ck_icn_apb2, 0, GATE_FDCAN); 292628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi1, &ck_icn_apb2, 0, GATE_SPI1); 292728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi4, &ck_icn_apb2, 0, GATE_SPI4); 292828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi5, &ck_icn_apb2, 0, GATE_SPI5); 292928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi6, &ck_icn_apb2, 0, GATE_SPI6); 293028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_spi7, &ck_icn_apb2, 0, GATE_SPI7); 293128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg1, &ck_icn_apb3, 0, GATE_IWDG1); 293228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg2, &ck_icn_apb3, 0, GATE_IWDG2); 293328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg3, &ck_icn_apb3, 0, GATE_IWDG3); 293428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_iwdg4, &ck_icn_apb3, 0, GATE_IWDG4); 293528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_wwdg1, &ck_icn_apb3, 0, GATE_WWDG1); 293628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vref, &ck_icn_apb3, 0, GATE_VREF); 293728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dts, &ck_icn_apb3, 0, GATE_DTS); 293828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_serc, &ck_icn_apb3, 0, GATE_SERC); 293928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_hdp, &ck_icn_apb3, 0, GATE_HDP); 294028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dsi, &ck_icn_apb4, 0, GATE_DSI); 294128c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_ltdc, &ck_icn_apb4, 0, GATE_LTDC); 294228c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_csi, &ck_icn_apb4, 0, GATE_CSI); 294328c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_dcmipp, &ck_icn_apb4, 0, GATE_DCMIPP); 294428c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_lvds, &ck_icn_apb4, 0, GATE_LVDS); 294528c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_gicv2m, &ck_icn_apb4, 0, GATE_GICV2M); 294628c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usbtc, &ck_icn_apb4, 0, GATE_USBTC); 294728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_usb3pciephy, &ck_icn_apb4, 0, GATE_USB3PCIEPHY); 294828c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_stgen, &ck_icn_apb4, 0, GATE_STGEN); 294928c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_vdec, &ck_icn_apb4, 0, GATE_VDEC); 295028c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_p_venc, &ck_icn_apb4, 0, GATE_VENC); 295128c10f9eSGabriel Fernandez 295228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim2, &ck_timg1, 0, GATE_TIM2); 295328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim3, &ck_timg1, 0, GATE_TIM3); 295428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim4, &ck_timg1, 0, GATE_TIM4); 295528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim5, &ck_timg1, 0, GATE_TIM5); 295628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim6, &ck_timg1, 0, GATE_TIM6); 295728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim7, &ck_timg1, 0, GATE_TIM7); 295828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim10, &ck_timg1, 0, GATE_TIM10); 295928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim11, &ck_timg1, 0, GATE_TIM11); 296028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim12, &ck_timg1, 0, GATE_TIM12); 296128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim13, &ck_timg1, 0, GATE_TIM13); 296228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim14, &ck_timg1, 0, GATE_TIM14); 296328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim1, &ck_timg2, 0, GATE_TIM1); 296428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim8, &ck_timg2, 0, GATE_TIM8); 296528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim15, &ck_timg2, 0, GATE_TIM15); 296628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim16, &ck_timg2, 0, GATE_TIM16); 296728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim17, &ck_timg2, 0, GATE_TIM17); 296828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_tim20, &ck_timg2, 0, GATE_TIM20); 296928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim1, &ck_flexgen_07, 0, GATE_LPTIM1); 297028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim2, &ck_flexgen_07, 0, GATE_LPTIM2); 297128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart2, &ck_flexgen_08, 0, GATE_USART2); 297228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart4, &ck_flexgen_08, 0, GATE_UART4); 297328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart3, &ck_flexgen_09, 0, GATE_USART3); 297428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart5, &ck_flexgen_09, 0, GATE_UART5); 297528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi2, &ck_flexgen_10, 0, GATE_SPI2); 297628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi3, &ck_flexgen_10, 0, GATE_SPI3); 297728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spdifrx, &ck_flexgen_11, 0, GATE_SPDIFRX); 297828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c1, &ck_flexgen_12, 0, GATE_I2C1); 297928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c2, &ck_flexgen_12, 0, GATE_I2C2); 298028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c1, &ck_flexgen_12, 0, GATE_I3C1); 298128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c2, &ck_flexgen_12, 0, GATE_I3C2); 298228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c3, &ck_flexgen_13, 0, GATE_I2C3); 298328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c5, &ck_flexgen_13, 0, GATE_I2C5); 298428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c3, &ck_flexgen_13, 0, GATE_I3C3); 298528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c4, &ck_flexgen_14, 0, GATE_I2C4); 298628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c6, &ck_flexgen_14, 0, GATE_I2C6); 298728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c7, &ck_flexgen_15, 0, GATE_I2C7); 298828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi1, &ck_flexgen_16, 0, GATE_SPI1); 298928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi4, &ck_flexgen_17, 0, GATE_SPI4); 299028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi5, &ck_flexgen_17, 0, GATE_SPI5); 299128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi6, &ck_flexgen_18, 0, GATE_SPI6); 299228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi7, &ck_flexgen_18, 0, GATE_SPI7); 299328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart1, &ck_flexgen_19, 0, GATE_USART1); 299428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usart6, &ck_flexgen_20, 0, GATE_USART6); 299528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart7, &ck_flexgen_21, 0, GATE_UART7); 299628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart8, &ck_flexgen_21, 0, GATE_UART8); 299728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_uart9, &ck_flexgen_22, 0, GATE_UART9); 299828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_mdf1, &ck_flexgen_23, 0, GATE_MDF1); 299928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai1, &ck_flexgen_23, 0, GATE_SAI1); 300028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai2, &ck_flexgen_24, 0, GATE_SAI2); 300128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai3, &ck_flexgen_25, 0, GATE_SAI3); 300228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sai4, &ck_flexgen_25, 0, GATE_SAI4); 300328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_fdcan, &ck_flexgen_26, 0, GATE_FDCAN); 300428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csi, &ck_flexgen_29, 0, GATE_CSI); 300528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csitxesc, &ck_flexgen_30, 0, GATE_CSI); 300628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_csiphy, &ck_flexgen_31, 0, GATE_CSI); 300728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_stgen, &ck_flexgen_33, CLK_SET_RATE_PARENT, 300828c10f9eSGabriel Fernandez GATE_STGEN); 300928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usbtc, &ck_flexgen_35, 0, GATE_USBTC); 301028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i3c4, &ck_flexgen_36, 0, GATE_I3C4); 301128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_spi8, &ck_flexgen_37, 0, GATE_SPI8); 301228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_i2c8, &ck_flexgen_38, 0, GATE_I2C8); 301328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lpuart1, &ck_flexgen_39, 0, GATE_LPUART1); 301428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim3, &ck_flexgen_40, 0, GATE_LPTIM3); 301528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim4, &ck_flexgen_41, 0, GATE_LPTIM4); 301628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_lptim5, &ck_flexgen_41, 0, GATE_LPTIM5); 301728c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_adf1, &ck_flexgen_42, 0, GATE_ADF1); 301828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc1, &ck_flexgen_51, 0, GATE_SDMMC1); 301928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc2, &ck_flexgen_52, 0, GATE_SDMMC2); 302028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_sdmmc3, &ck_flexgen_53, 0, GATE_SDMMC3); 302128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1, &ck_flexgen_54, 0, GATE_ETH1); 302228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethsw, &ck_flexgen_54, 0, GATE_ETHSW); 302328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2, &ck_flexgen_55, 0, GATE_ETH2); 302428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1ptp, &ck_flexgen_56, 0, GATE_ETH1); 302528c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2ptp, &ck_flexgen_56, 0, GATE_ETH2); 302628c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_usb2phy2, &ck_flexgen_58, 0, GATE_USB3DR); 302728c10f9eSGabriel Fernandez static STM32_GATE(ck_icn_m_gpu, &ck_flexgen_59, 0, GATE_GPU); 302828c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_gpu, &ck_pll3, 0, GATE_GPU); 302928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ethswref, &ck_flexgen_60, 0, GATE_ETHSWREF); 303028c10f9eSGabriel Fernandez 303128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1stp, &ck_icn_ls_mcu, 0, GATE_ETH1STP); 303228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2stp, &ck_icn_ls_mcu, 0, GATE_ETH2STP); 303328c10f9eSGabriel Fernandez 303428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_ltdc, &ck_flexgen_27, CLK_SET_RATE_PARENT, 303528c10f9eSGabriel Fernandez GATE_LTDC); 303628c10f9eSGabriel Fernandez 303728c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc12, 2, PARENT(&ck_flexgen_46, &ck_icn_ls_mcu), 303828c10f9eSGabriel Fernandez 0, GATE_ADC12, NO_DIV, MUX_ADC12); 303928c10f9eSGabriel Fernandez 304028c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_adc3, 3, PARENT(&ck_flexgen_47, &ck_icn_ls_mcu, 304128c10f9eSGabriel Fernandez &ck_flexgen_46), 304228c10f9eSGabriel Fernandez 0, GATE_ADC3, NO_DIV, MUX_ADC3); 304328c10f9eSGabriel Fernandez 304428c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy1, 2, PARENT(&ck_flexgen_57, 304528c10f9eSGabriel Fernandez &ck_hse_div2), 304628c10f9eSGabriel Fernandez 0, GATE_USB2PHY1, NO_DIV, MUX_USB2PHY1); 304728c10f9eSGabriel Fernandez 304828c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb2phy2_en, 2, PARENT(&ck_flexgen_58, 304928c10f9eSGabriel Fernandez &ck_hse_div2), 305028c10f9eSGabriel Fernandez 0, GATE_USB2PHY2, NO_DIV, MUX_USB2PHY2); 305128c10f9eSGabriel Fernandez 305228c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_usb3pciephy, 2, PARENT(&ck_flexgen_34, 305328c10f9eSGabriel Fernandez &ck_hse_div2), 305428c10f9eSGabriel Fernandez 0, GATE_USB3PCIEPHY, NO_DIV, MUX_USB3PCIEPHY); 305528c10f9eSGabriel Fernandez 305628c10f9eSGabriel Fernandez static STM32_COMPOSITE(clk_lanebyte, 2, PARENT(&txbyteclk, &ck_ker_ltdc), 305728c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIBLANE); 305828c10f9eSGabriel Fernandez 305928c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_phy_dsi, 2, PARENT(&ck_flexgen_28, &ck_hse), 306028c10f9eSGabriel Fernandez 0, GATE_DSI, NO_DIV, MUX_DSIPHY); 306128c10f9eSGabriel Fernandez 306228c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_lvdsphy, 2, PARENT(&ck_flexgen_32, &ck_hse), 306328c10f9eSGabriel Fernandez 0, GATE_LVDS, NO_DIV, MUX_LVDSPHY); 306428c10f9eSGabriel Fernandez 306528c10f9eSGabriel Fernandez static STM32_COMPOSITE(ck_ker_dts, 3, PARENT(&ck_hsi, &ck_hse, &ck_msi), 306628c10f9eSGabriel Fernandez 0, GATE_DTS, NO_DIV, MUX_DTS); 306728c10f9eSGabriel Fernandez 306828c10f9eSGabriel Fernandez enum { 306928c10f9eSGabriel Fernandez CK_OFF = STM32MP25_LAST_CLK, 307028c10f9eSGabriel Fernandez I2SCKIN, 307128c10f9eSGabriel Fernandez SPDIFSYMB, 307228c10f9eSGabriel Fernandez CK_HSE_RTC, 307328c10f9eSGabriel Fernandez TXBYTECLK, 307428c10f9eSGabriel Fernandez CK_OBSER0, 307528c10f9eSGabriel Fernandez CK_OBSER1, 307628c10f9eSGabriel Fernandez STM32MP25_ALL_CLK_NB 307728c10f9eSGabriel Fernandez }; 307828c10f9eSGabriel Fernandez 307928c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1mac, &ck_icn_ls_mcu, 0, GATE_ETH1MAC); 308028c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1tx, &ck_icn_ls_mcu, 0, GATE_ETH1TX); 308128c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth1rx, &ck_icn_ls_mcu, 0, GATE_ETH1RX); 308228c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2mac, &ck_icn_ls_mcu, 0, GATE_ETH2MAC); 308328c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2tx, &ck_icn_ls_mcu, 0, GATE_ETH2TX); 308428c10f9eSGabriel Fernandez static STM32_GATE(ck_ker_eth2rx, &ck_icn_ls_mcu, 0, GATE_ETH2RX); 308528c10f9eSGabriel Fernandez 308628c10f9eSGabriel Fernandez static struct clk *stm32mp25_clk_provided[STM32MP25_ALL_CLK_NB] = { 308728c10f9eSGabriel Fernandez [HSI_CK] = &ck_hsi, 308828c10f9eSGabriel Fernandez [HSE_CK] = &ck_hse, 308928c10f9eSGabriel Fernandez [MSI_CK] = &ck_msi, 309028c10f9eSGabriel Fernandez [LSI_CK] = &ck_lsi, 309128c10f9eSGabriel Fernandez [LSE_CK] = &ck_lse, 309228c10f9eSGabriel Fernandez 309328c10f9eSGabriel Fernandez [HSE_DIV2_CK] = &ck_hse_div2, 309428c10f9eSGabriel Fernandez 309528c10f9eSGabriel Fernandez [PLL1_CK] = &ck_pll1, 309628c10f9eSGabriel Fernandez [PLL2_CK] = &ck_pll2, 309728c10f9eSGabriel Fernandez [PLL3_CK] = &ck_pll3, 309828c10f9eSGabriel Fernandez [PLL4_CK] = &ck_pll4, 309928c10f9eSGabriel Fernandez [PLL5_CK] = &ck_pll5, 310028c10f9eSGabriel Fernandez [PLL6_CK] = &ck_pll6, 310128c10f9eSGabriel Fernandez [PLL7_CK] = &ck_pll7, 310228c10f9eSGabriel Fernandez [PLL8_CK] = &ck_pll8, 310328c10f9eSGabriel Fernandez 310428c10f9eSGabriel Fernandez [CK_ICN_HS_MCU] = &ck_icn_hs_mcu, 310528c10f9eSGabriel Fernandez [CK_ICN_LS_MCU] = &ck_icn_ls_mcu, 310628c10f9eSGabriel Fernandez 310728c10f9eSGabriel Fernandez [CK_ICN_SDMMC] = &ck_icn_sdmmc, 310828c10f9eSGabriel Fernandez [CK_ICN_DDR] = &ck_icn_ddr, 310928c10f9eSGabriel Fernandez [CK_ICN_DISPLAY] = &ck_icn_display, 311028c10f9eSGabriel Fernandez [CK_ICN_HSL] = &ck_icn_hsl, 311128c10f9eSGabriel Fernandez [CK_ICN_NIC] = &ck_icn_nic, 311228c10f9eSGabriel Fernandez [CK_ICN_VID] = &ck_icn_vid, 311328c10f9eSGabriel Fernandez [CK_FLEXGEN_07] = &ck_flexgen_07, 311428c10f9eSGabriel Fernandez [CK_FLEXGEN_08] = &ck_flexgen_08, 311528c10f9eSGabriel Fernandez [CK_FLEXGEN_09] = &ck_flexgen_09, 311628c10f9eSGabriel Fernandez [CK_FLEXGEN_10] = &ck_flexgen_10, 311728c10f9eSGabriel Fernandez [CK_FLEXGEN_11] = &ck_flexgen_11, 311828c10f9eSGabriel Fernandez [CK_FLEXGEN_12] = &ck_flexgen_12, 311928c10f9eSGabriel Fernandez [CK_FLEXGEN_13] = &ck_flexgen_13, 312028c10f9eSGabriel Fernandez [CK_FLEXGEN_14] = &ck_flexgen_14, 312128c10f9eSGabriel Fernandez [CK_FLEXGEN_15] = &ck_flexgen_15, 312228c10f9eSGabriel Fernandez [CK_FLEXGEN_16] = &ck_flexgen_16, 312328c10f9eSGabriel Fernandez [CK_FLEXGEN_17] = &ck_flexgen_17, 312428c10f9eSGabriel Fernandez [CK_FLEXGEN_18] = &ck_flexgen_18, 312528c10f9eSGabriel Fernandez [CK_FLEXGEN_19] = &ck_flexgen_19, 312628c10f9eSGabriel Fernandez [CK_FLEXGEN_20] = &ck_flexgen_20, 312728c10f9eSGabriel Fernandez [CK_FLEXGEN_21] = &ck_flexgen_21, 312828c10f9eSGabriel Fernandez [CK_FLEXGEN_22] = &ck_flexgen_22, 312928c10f9eSGabriel Fernandez [CK_FLEXGEN_23] = &ck_flexgen_23, 313028c10f9eSGabriel Fernandez [CK_FLEXGEN_24] = &ck_flexgen_24, 313128c10f9eSGabriel Fernandez [CK_FLEXGEN_25] = &ck_flexgen_25, 313228c10f9eSGabriel Fernandez [CK_FLEXGEN_26] = &ck_flexgen_26, 313328c10f9eSGabriel Fernandez [CK_FLEXGEN_27] = &ck_flexgen_27, 313428c10f9eSGabriel Fernandez [CK_FLEXGEN_28] = &ck_flexgen_28, 313528c10f9eSGabriel Fernandez [CK_FLEXGEN_29] = &ck_flexgen_29, 313628c10f9eSGabriel Fernandez [CK_FLEXGEN_30] = &ck_flexgen_30, 313728c10f9eSGabriel Fernandez [CK_FLEXGEN_31] = &ck_flexgen_31, 313828c10f9eSGabriel Fernandez [CK_FLEXGEN_32] = &ck_flexgen_32, 313928c10f9eSGabriel Fernandez [CK_FLEXGEN_33] = &ck_flexgen_33, 314028c10f9eSGabriel Fernandez [CK_FLEXGEN_34] = &ck_flexgen_34, 314128c10f9eSGabriel Fernandez [CK_FLEXGEN_35] = &ck_flexgen_35, 314228c10f9eSGabriel Fernandez [CK_FLEXGEN_36] = &ck_flexgen_36, 314328c10f9eSGabriel Fernandez [CK_FLEXGEN_37] = &ck_flexgen_37, 314428c10f9eSGabriel Fernandez [CK_FLEXGEN_38] = &ck_flexgen_38, 314528c10f9eSGabriel Fernandez [CK_FLEXGEN_39] = &ck_flexgen_39, 314628c10f9eSGabriel Fernandez [CK_FLEXGEN_40] = &ck_flexgen_40, 314728c10f9eSGabriel Fernandez [CK_FLEXGEN_41] = &ck_flexgen_41, 314828c10f9eSGabriel Fernandez [CK_FLEXGEN_42] = &ck_flexgen_42, 314928c10f9eSGabriel Fernandez [CK_FLEXGEN_43] = &ck_flexgen_43, 315028c10f9eSGabriel Fernandez [CK_FLEXGEN_44] = &ck_flexgen_44, 315128c10f9eSGabriel Fernandez [CK_FLEXGEN_45] = &ck_flexgen_45, 315228c10f9eSGabriel Fernandez [CK_FLEXGEN_46] = &ck_flexgen_46, 315328c10f9eSGabriel Fernandez [CK_FLEXGEN_47] = &ck_flexgen_47, 315428c10f9eSGabriel Fernandez [CK_FLEXGEN_48] = &ck_flexgen_48, 315528c10f9eSGabriel Fernandez [CK_FLEXGEN_49] = &ck_flexgen_49, 315628c10f9eSGabriel Fernandez [CK_FLEXGEN_50] = &ck_flexgen_50, 315728c10f9eSGabriel Fernandez [CK_FLEXGEN_51] = &ck_flexgen_51, 315828c10f9eSGabriel Fernandez [CK_FLEXGEN_52] = &ck_flexgen_52, 315928c10f9eSGabriel Fernandez [CK_FLEXGEN_53] = &ck_flexgen_53, 316028c10f9eSGabriel Fernandez [CK_FLEXGEN_54] = &ck_flexgen_54, 316128c10f9eSGabriel Fernandez [CK_FLEXGEN_55] = &ck_flexgen_55, 316228c10f9eSGabriel Fernandez [CK_FLEXGEN_56] = &ck_flexgen_56, 316328c10f9eSGabriel Fernandez [CK_FLEXGEN_57] = &ck_flexgen_57, 316428c10f9eSGabriel Fernandez [CK_FLEXGEN_58] = &ck_flexgen_58, 316528c10f9eSGabriel Fernandez [CK_FLEXGEN_59] = &ck_flexgen_59, 316628c10f9eSGabriel Fernandez [CK_FLEXGEN_60] = &ck_flexgen_60, 316728c10f9eSGabriel Fernandez [CK_FLEXGEN_61] = &ck_flexgen_61, 316828c10f9eSGabriel Fernandez [CK_FLEXGEN_62] = &ck_flexgen_62, 316928c10f9eSGabriel Fernandez [CK_FLEXGEN_63] = &ck_flexgen_63, 317028c10f9eSGabriel Fernandez 317128c10f9eSGabriel Fernandez [CK_CPU1] = &ck_cpu1, 317228c10f9eSGabriel Fernandez 317328c10f9eSGabriel Fernandez [CK_ICN_APB1] = &ck_icn_apb1, 317428c10f9eSGabriel Fernandez [CK_ICN_APB2] = &ck_icn_apb2, 317528c10f9eSGabriel Fernandez [CK_ICN_APB3] = &ck_icn_apb3, 317628c10f9eSGabriel Fernandez [CK_ICN_APB4] = &ck_icn_apb4, 317728c10f9eSGabriel Fernandez [CK_ICN_APBDBG] = &ck_icn_apbdbg, 317828c10f9eSGabriel Fernandez 317928c10f9eSGabriel Fernandez [TIMG1_CK] = &ck_timg1, 318028c10f9eSGabriel Fernandez [TIMG2_CK] = &ck_timg2, 318128c10f9eSGabriel Fernandez 318228c10f9eSGabriel Fernandez [CK_BUS_SYSRAM] = &ck_icn_s_sysram, 318328c10f9eSGabriel Fernandez [CK_BUS_VDERAM] = &ck_icn_s_vderam, 318428c10f9eSGabriel Fernandez [CK_BUS_RETRAM] = &ck_icn_s_retram, 318528c10f9eSGabriel Fernandez [CK_BUS_SRAM1] = &ck_icn_s_sram1, 318628c10f9eSGabriel Fernandez [CK_BUS_SRAM2] = &ck_icn_s_sram2, 318728c10f9eSGabriel Fernandez [CK_BUS_OSPI1] = &ck_icn_s_ospi1, 318828c10f9eSGabriel Fernandez [CK_BUS_OSPI2] = &ck_icn_s_ospi2, 318928c10f9eSGabriel Fernandez [CK_BUS_BKPSRAM] = &ck_icn_s_bkpsram, 319028c10f9eSGabriel Fernandez [CK_BUS_DDRPHYC] = &ck_icn_p_ddrphyc, 319128c10f9eSGabriel Fernandez [CK_BUS_SYSCPU1] = &ck_icn_p_syscpu1, 319228c10f9eSGabriel Fernandez [CK_BUS_HPDMA1] = &ck_icn_p_hpdma1, 319328c10f9eSGabriel Fernandez [CK_BUS_HPDMA2] = &ck_icn_p_hpdma2, 319428c10f9eSGabriel Fernandez [CK_BUS_HPDMA3] = &ck_icn_p_hpdma3, 319528c10f9eSGabriel Fernandez [CK_BUS_IPCC1] = &ck_icn_p_ipcc1, 319628c10f9eSGabriel Fernandez [CK_BUS_IPCC2] = &ck_icn_p_ipcc2, 319728c10f9eSGabriel Fernandez [CK_BUS_CCI] = &ck_icn_p_cci, 319828c10f9eSGabriel Fernandez [CK_BUS_CRC] = &ck_icn_p_crc, 319928c10f9eSGabriel Fernandez [CK_BUS_OSPIIOM] = &ck_icn_p_ospiiom, 320028c10f9eSGabriel Fernandez [CK_BUS_HASH] = &ck_icn_p_hash, 320128c10f9eSGabriel Fernandez [CK_BUS_RNG] = &ck_icn_p_rng, 320228c10f9eSGabriel Fernandez [CK_BUS_CRYP1] = &ck_icn_p_cryp1, 320328c10f9eSGabriel Fernandez [CK_BUS_CRYP2] = &ck_icn_p_cryp2, 320428c10f9eSGabriel Fernandez [CK_BUS_SAES] = &ck_icn_p_saes, 320528c10f9eSGabriel Fernandez [CK_BUS_PKA] = &ck_icn_p_pka, 320628c10f9eSGabriel Fernandez [CK_BUS_GPIOA] = &ck_icn_p_gpioa, 320728c10f9eSGabriel Fernandez [CK_BUS_GPIOB] = &ck_icn_p_gpiob, 320828c10f9eSGabriel Fernandez [CK_BUS_GPIOC] = &ck_icn_p_gpioc, 320928c10f9eSGabriel Fernandez [CK_BUS_GPIOD] = &ck_icn_p_gpiod, 321028c10f9eSGabriel Fernandez [CK_BUS_GPIOE] = &ck_icn_p_gpioe, 321128c10f9eSGabriel Fernandez [CK_BUS_GPIOF] = &ck_icn_p_gpiof, 321228c10f9eSGabriel Fernandez [CK_BUS_GPIOG] = &ck_icn_p_gpiog, 321328c10f9eSGabriel Fernandez [CK_BUS_GPIOH] = &ck_icn_p_gpioh, 321428c10f9eSGabriel Fernandez [CK_BUS_GPIOI] = &ck_icn_p_gpioi, 321528c10f9eSGabriel Fernandez [CK_BUS_GPIOJ] = &ck_icn_p_gpioj, 321628c10f9eSGabriel Fernandez [CK_BUS_GPIOK] = &ck_icn_p_gpiok, 321728c10f9eSGabriel Fernandez [CK_BUS_LPSRAM1] = &ck_icn_s_lpsram1, 321828c10f9eSGabriel Fernandez [CK_BUS_LPSRAM2] = &ck_icn_s_lpsram2, 321928c10f9eSGabriel Fernandez [CK_BUS_LPSRAM3] = &ck_icn_s_lpsram3, 322028c10f9eSGabriel Fernandez [CK_BUS_GPIOZ] = &ck_icn_p_gpioz, 322128c10f9eSGabriel Fernandez [CK_BUS_LPDMA] = &ck_icn_p_lpdma, 322228c10f9eSGabriel Fernandez [CK_BUS_ADF1] = &ck_icn_p_adf1, 322328c10f9eSGabriel Fernandez [CK_BUS_HSEM] = &ck_icn_p_hsem, 322428c10f9eSGabriel Fernandez [CK_BUS_RTC] = &ck_icn_p_rtc, 322528c10f9eSGabriel Fernandez [CK_BUS_IWDG5] = &ck_icn_p_iwdg5, 322628c10f9eSGabriel Fernandez [CK_BUS_WWDG2] = &ck_icn_p_wwdg2, 322728c10f9eSGabriel Fernandez [CK_BUS_STM] = &ck_icn_p_stm, 322828c10f9eSGabriel Fernandez [CK_KER_STM] = &ck_icn_s_stm, 322928c10f9eSGabriel Fernandez [CK_BUS_FMC] = &ck_icn_p_fmc, 323028c10f9eSGabriel Fernandez [CK_BUS_ETH1] = &ck_icn_p_eth1, 323128c10f9eSGabriel Fernandez [CK_BUS_ETHSW] = &ck_icn_p_ethsw, 323228c10f9eSGabriel Fernandez [CK_BUS_ETH2] = &ck_icn_p_eth2, 323328c10f9eSGabriel Fernandez [CK_BUS_PCIE] = &ck_icn_p_pcie, 323428c10f9eSGabriel Fernandez [CK_BUS_ADC12] = &ck_icn_p_adc12, 323528c10f9eSGabriel Fernandez [CK_BUS_ADC3] = &ck_icn_p_adc3, 323628c10f9eSGabriel Fernandez [CK_BUS_MDF1] = &ck_icn_p_mdf1, 323728c10f9eSGabriel Fernandez [CK_BUS_SPI8] = &ck_icn_p_spi8, 323828c10f9eSGabriel Fernandez [CK_BUS_LPUART1] = &ck_icn_p_lpuart1, 323928c10f9eSGabriel Fernandez [CK_BUS_I2C8] = &ck_icn_p_i2c8, 324028c10f9eSGabriel Fernandez [CK_BUS_LPTIM3] = &ck_icn_p_lptim3, 324128c10f9eSGabriel Fernandez [CK_BUS_LPTIM4] = &ck_icn_p_lptim4, 324228c10f9eSGabriel Fernandez [CK_BUS_LPTIM5] = &ck_icn_p_lptim5, 324328c10f9eSGabriel Fernandez [CK_BUS_RISAF4] = &ck_icn_p_risaf4, 324428c10f9eSGabriel Fernandez [CK_BUS_SDMMC1] = &ck_icn_m_sdmmc1, 324528c10f9eSGabriel Fernandez [CK_BUS_SDMMC2] = &ck_icn_m_sdmmc2, 324628c10f9eSGabriel Fernandez [CK_BUS_SDMMC3] = &ck_icn_m_sdmmc3, 324728c10f9eSGabriel Fernandez [CK_BUS_DDR] = &ck_icn_s_ddr, 324828c10f9eSGabriel Fernandez [CK_BUS_USB2OHCI] = &ck_icn_m_usb2ohci, 324928c10f9eSGabriel Fernandez [CK_BUS_USB2EHCI] = &ck_icn_m_usb2ehci, 325028c10f9eSGabriel Fernandez [CK_BUS_USB3DR] = &ck_icn_m_usb3dr, 325128c10f9eSGabriel Fernandez [CK_BUS_TIM2] = &ck_icn_p_tim2, 325228c10f9eSGabriel Fernandez [CK_BUS_TIM3] = &ck_icn_p_tim3, 325328c10f9eSGabriel Fernandez [CK_BUS_TIM4] = &ck_icn_p_tim4, 325428c10f9eSGabriel Fernandez [CK_BUS_TIM5] = &ck_icn_p_tim5, 325528c10f9eSGabriel Fernandez [CK_BUS_TIM6] = &ck_icn_p_tim6, 325628c10f9eSGabriel Fernandez [CK_BUS_TIM7] = &ck_icn_p_tim7, 325728c10f9eSGabriel Fernandez [CK_BUS_TIM10] = &ck_icn_p_tim10, 325828c10f9eSGabriel Fernandez [CK_BUS_TIM11] = &ck_icn_p_tim11, 325928c10f9eSGabriel Fernandez [CK_BUS_TIM12] = &ck_icn_p_tim12, 326028c10f9eSGabriel Fernandez [CK_BUS_TIM13] = &ck_icn_p_tim13, 326128c10f9eSGabriel Fernandez [CK_BUS_TIM14] = &ck_icn_p_tim14, 326228c10f9eSGabriel Fernandez [CK_BUS_LPTIM1] = &ck_icn_p_lptim1, 326328c10f9eSGabriel Fernandez [CK_BUS_LPTIM2] = &ck_icn_p_lptim2, 326428c10f9eSGabriel Fernandez [CK_BUS_SPI2] = &ck_icn_p_spi2, 326528c10f9eSGabriel Fernandez [CK_BUS_SPI3] = &ck_icn_p_spi3, 326628c10f9eSGabriel Fernandez [CK_BUS_SPDIFRX] = &ck_icn_p_spdifrx, 326728c10f9eSGabriel Fernandez [CK_BUS_USART2] = &ck_icn_p_usart2, 326828c10f9eSGabriel Fernandez [CK_BUS_USART3] = &ck_icn_p_usart3, 326928c10f9eSGabriel Fernandez [CK_BUS_UART4] = &ck_icn_p_uart4, 327028c10f9eSGabriel Fernandez [CK_BUS_UART5] = &ck_icn_p_uart5, 327128c10f9eSGabriel Fernandez [CK_BUS_I2C1] = &ck_icn_p_i2c1, 327228c10f9eSGabriel Fernandez [CK_BUS_I2C2] = &ck_icn_p_i2c2, 327328c10f9eSGabriel Fernandez [CK_BUS_I2C3] = &ck_icn_p_i2c3, 327428c10f9eSGabriel Fernandez [CK_BUS_I2C4] = &ck_icn_p_i2c4, 327528c10f9eSGabriel Fernandez [CK_BUS_I2C5] = &ck_icn_p_i2c5, 327628c10f9eSGabriel Fernandez [CK_BUS_I2C6] = &ck_icn_p_i2c6, 327728c10f9eSGabriel Fernandez [CK_BUS_I2C7] = &ck_icn_p_i2c7, 327828c10f9eSGabriel Fernandez [CK_BUS_I3C1] = &ck_icn_p_i3c1, 327928c10f9eSGabriel Fernandez [CK_BUS_I3C2] = &ck_icn_p_i3c2, 328028c10f9eSGabriel Fernandez [CK_BUS_I3C3] = &ck_icn_p_i3c3, 328128c10f9eSGabriel Fernandez [CK_BUS_I3C4] = &ck_icn_p_i3c4, 328228c10f9eSGabriel Fernandez [CK_BUS_TIM1] = &ck_icn_p_tim1, 328328c10f9eSGabriel Fernandez [CK_BUS_TIM8] = &ck_icn_p_tim8, 328428c10f9eSGabriel Fernandez [CK_BUS_TIM15] = &ck_icn_p_tim15, 328528c10f9eSGabriel Fernandez [CK_BUS_TIM16] = &ck_icn_p_tim16, 328628c10f9eSGabriel Fernandez [CK_BUS_TIM17] = &ck_icn_p_tim17, 328728c10f9eSGabriel Fernandez [CK_BUS_TIM20] = &ck_icn_p_tim20, 328828c10f9eSGabriel Fernandez [CK_BUS_SAI1] = &ck_icn_p_sai1, 328928c10f9eSGabriel Fernandez [CK_BUS_SAI2] = &ck_icn_p_sai2, 329028c10f9eSGabriel Fernandez [CK_BUS_SAI3] = &ck_icn_p_sai3, 329128c10f9eSGabriel Fernandez [CK_BUS_SAI4] = &ck_icn_p_sai4, 329228c10f9eSGabriel Fernandez [CK_BUS_USART1] = &ck_icn_p_usart1, 329328c10f9eSGabriel Fernandez [CK_BUS_USART6] = &ck_icn_p_usart6, 329428c10f9eSGabriel Fernandez [CK_BUS_UART7] = &ck_icn_p_uart7, 329528c10f9eSGabriel Fernandez [CK_BUS_UART8] = &ck_icn_p_uart8, 329628c10f9eSGabriel Fernandez [CK_BUS_UART9] = &ck_icn_p_uart9, 329728c10f9eSGabriel Fernandez [CK_BUS_FDCAN] = &ck_icn_p_fdcan, 329828c10f9eSGabriel Fernandez [CK_BUS_SPI1] = &ck_icn_p_spi1, 329928c10f9eSGabriel Fernandez [CK_BUS_SPI4] = &ck_icn_p_spi4, 330028c10f9eSGabriel Fernandez [CK_BUS_SPI5] = &ck_icn_p_spi5, 330128c10f9eSGabriel Fernandez [CK_BUS_SPI6] = &ck_icn_p_spi6, 330228c10f9eSGabriel Fernandez [CK_BUS_SPI7] = &ck_icn_p_spi7, 330328c10f9eSGabriel Fernandez [CK_BUS_BSEC] = &ck_icn_p_bsec, 330428c10f9eSGabriel Fernandez [CK_BUS_IWDG1] = &ck_icn_p_iwdg1, 330528c10f9eSGabriel Fernandez [CK_BUS_IWDG2] = &ck_icn_p_iwdg2, 330628c10f9eSGabriel Fernandez [CK_BUS_IWDG3] = &ck_icn_p_iwdg3, 330728c10f9eSGabriel Fernandez [CK_BUS_IWDG4] = &ck_icn_p_iwdg4, 330828c10f9eSGabriel Fernandez [CK_BUS_WWDG1] = &ck_icn_p_wwdg1, 330928c10f9eSGabriel Fernandez [CK_BUS_VREF] = &ck_icn_p_vref, 331028c10f9eSGabriel Fernandez [CK_BUS_SERC] = &ck_icn_p_serc, 331128c10f9eSGabriel Fernandez [CK_BUS_DTS] = &ck_icn_p_dts, 331228c10f9eSGabriel Fernandez [CK_BUS_HDP] = &ck_icn_p_hdp, 331328c10f9eSGabriel Fernandez [CK_BUS_IS2M] = &ck_icn_p_is2m, 331428c10f9eSGabriel Fernandez [CK_BUS_DSI] = &ck_icn_p_dsi, 331528c10f9eSGabriel Fernandez [CK_BUS_LTDC] = &ck_icn_p_ltdc, 331628c10f9eSGabriel Fernandez [CK_BUS_CSI] = &ck_icn_p_csi, 331728c10f9eSGabriel Fernandez [CK_BUS_DCMIPP] = &ck_icn_p_dcmipp, 331828c10f9eSGabriel Fernandez [CK_BUS_DDRC] = &ck_icn_p_ddrc, 331928c10f9eSGabriel Fernandez [CK_BUS_DDRCFG] = &ck_icn_p_ddrcfg, 332028c10f9eSGabriel Fernandez [CK_BUS_LVDS] = &ck_icn_p_lvds, 332128c10f9eSGabriel Fernandez [CK_BUS_GICV2M] = &ck_icn_p_gicv2m, 332228c10f9eSGabriel Fernandez [CK_BUS_USBTC] = &ck_icn_p_usbtc, 332328c10f9eSGabriel Fernandez [CK_BUS_USB3PCIEPHY] = &ck_icn_p_usb3pciephy, 332428c10f9eSGabriel Fernandez [CK_BUS_STGEN] = &ck_icn_p_stgen, 332528c10f9eSGabriel Fernandez [CK_BUS_VDEC] = &ck_icn_p_vdec, 332628c10f9eSGabriel Fernandez [CK_BUS_VENC] = &ck_icn_p_venc, 332728c10f9eSGabriel Fernandez [CK_SYSDBG] = &ck_sys_dbg, 332828c10f9eSGabriel Fernandez [CK_KER_TIM2] = &ck_ker_tim2, 332928c10f9eSGabriel Fernandez [CK_KER_TIM3] = &ck_ker_tim3, 333028c10f9eSGabriel Fernandez [CK_KER_TIM4] = &ck_ker_tim4, 333128c10f9eSGabriel Fernandez [CK_KER_TIM5] = &ck_ker_tim5, 333228c10f9eSGabriel Fernandez [CK_KER_TIM6] = &ck_ker_tim6, 333328c10f9eSGabriel Fernandez [CK_KER_TIM7] = &ck_ker_tim7, 333428c10f9eSGabriel Fernandez [CK_KER_TIM10] = &ck_ker_tim10, 333528c10f9eSGabriel Fernandez [CK_KER_TIM11] = &ck_ker_tim11, 333628c10f9eSGabriel Fernandez [CK_KER_TIM12] = &ck_ker_tim12, 333728c10f9eSGabriel Fernandez [CK_KER_TIM13] = &ck_ker_tim13, 333828c10f9eSGabriel Fernandez [CK_KER_TIM14] = &ck_ker_tim14, 333928c10f9eSGabriel Fernandez [CK_KER_TIM1] = &ck_ker_tim1, 334028c10f9eSGabriel Fernandez [CK_KER_TIM8] = &ck_ker_tim8, 334128c10f9eSGabriel Fernandez [CK_KER_TIM15] = &ck_ker_tim15, 334228c10f9eSGabriel Fernandez [CK_KER_TIM16] = &ck_ker_tim16, 334328c10f9eSGabriel Fernandez [CK_KER_TIM17] = &ck_ker_tim17, 334428c10f9eSGabriel Fernandez [CK_KER_TIM20] = &ck_ker_tim20, 334528c10f9eSGabriel Fernandez [CK_KER_LPTIM1] = &ck_ker_lptim1, 334628c10f9eSGabriel Fernandez [CK_KER_LPTIM2] = &ck_ker_lptim2, 334728c10f9eSGabriel Fernandez [CK_KER_USART2] = &ck_ker_usart2, 334828c10f9eSGabriel Fernandez [CK_KER_UART4] = &ck_ker_uart4, 334928c10f9eSGabriel Fernandez [CK_KER_USART3] = &ck_ker_usart3, 335028c10f9eSGabriel Fernandez [CK_KER_UART5] = &ck_ker_uart5, 335128c10f9eSGabriel Fernandez [CK_KER_SPI2] = &ck_ker_spi2, 335228c10f9eSGabriel Fernandez [CK_KER_SPI3] = &ck_ker_spi3, 335328c10f9eSGabriel Fernandez [CK_KER_SPDIFRX] = &ck_ker_spdifrx, 335428c10f9eSGabriel Fernandez [CK_KER_I2C1] = &ck_ker_i2c1, 335528c10f9eSGabriel Fernandez [CK_KER_I2C2] = &ck_ker_i2c2, 335628c10f9eSGabriel Fernandez [CK_KER_I3C1] = &ck_ker_i3c1, 335728c10f9eSGabriel Fernandez [CK_KER_I3C2] = &ck_ker_i3c2, 335828c10f9eSGabriel Fernandez [CK_KER_I2C3] = &ck_ker_i2c3, 335928c10f9eSGabriel Fernandez [CK_KER_I2C5] = &ck_ker_i2c5, 336028c10f9eSGabriel Fernandez [CK_KER_I3C3] = &ck_ker_i3c3, 336128c10f9eSGabriel Fernandez [CK_KER_I2C4] = &ck_ker_i2c4, 336228c10f9eSGabriel Fernandez [CK_KER_I2C6] = &ck_ker_i2c6, 336328c10f9eSGabriel Fernandez [CK_KER_I2C7] = &ck_ker_i2c7, 336428c10f9eSGabriel Fernandez [CK_KER_SPI1] = &ck_ker_spi1, 336528c10f9eSGabriel Fernandez [CK_KER_SPI4] = &ck_ker_spi4, 336628c10f9eSGabriel Fernandez [CK_KER_SPI5] = &ck_ker_spi5, 336728c10f9eSGabriel Fernandez [CK_KER_SPI6] = &ck_ker_spi6, 336828c10f9eSGabriel Fernandez [CK_KER_SPI7] = &ck_ker_spi7, 336928c10f9eSGabriel Fernandez [CK_KER_USART1] = &ck_ker_usart1, 337028c10f9eSGabriel Fernandez [CK_KER_USART6] = &ck_ker_usart6, 337128c10f9eSGabriel Fernandez [CK_KER_UART7] = &ck_ker_uart7, 337228c10f9eSGabriel Fernandez [CK_KER_UART8] = &ck_ker_uart8, 337328c10f9eSGabriel Fernandez [CK_KER_UART9] = &ck_ker_uart9, 337428c10f9eSGabriel Fernandez [CK_KER_MDF1] = &ck_ker_mdf1, 337528c10f9eSGabriel Fernandez [CK_KER_SAI1] = &ck_ker_sai1, 337628c10f9eSGabriel Fernandez [CK_KER_SAI2] = &ck_ker_sai2, 337728c10f9eSGabriel Fernandez [CK_KER_SAI3] = &ck_ker_sai3, 337828c10f9eSGabriel Fernandez [CK_KER_SAI4] = &ck_ker_sai4, 337928c10f9eSGabriel Fernandez [CK_KER_FDCAN] = &ck_ker_fdcan, 338028c10f9eSGabriel Fernandez [CK_KER_CSI] = &ck_ker_csi, 338128c10f9eSGabriel Fernandez [CK_KER_CSITXESC] = &ck_ker_csitxesc, 338228c10f9eSGabriel Fernandez [CK_KER_CSIPHY] = &ck_ker_csiphy, 338328c10f9eSGabriel Fernandez [CK_KER_STGEN] = &ck_ker_stgen, 338428c10f9eSGabriel Fernandez [CK_KER_USBTC] = &ck_ker_usbtc, 338528c10f9eSGabriel Fernandez [CK_KER_I3C4] = &ck_ker_i3c4, 338628c10f9eSGabriel Fernandez [CK_KER_SPI8] = &ck_ker_spi8, 338728c10f9eSGabriel Fernandez [CK_KER_I2C8] = &ck_ker_i2c8, 338828c10f9eSGabriel Fernandez [CK_KER_LPUART1] = &ck_ker_lpuart1, 338928c10f9eSGabriel Fernandez [CK_KER_LPTIM3] = &ck_ker_lptim3, 339028c10f9eSGabriel Fernandez [CK_KER_LPTIM4] = &ck_ker_lptim4, 339128c10f9eSGabriel Fernandez [CK_KER_LPTIM5] = &ck_ker_lptim5, 339228c10f9eSGabriel Fernandez [CK_KER_ADF1] = &ck_ker_adf1, 339328c10f9eSGabriel Fernandez [CK_KER_TSDBG] = &ck_ker_tsdbg, 339428c10f9eSGabriel Fernandez [CK_KER_TPIU] = &ck_ker_tpiu, 339528c10f9eSGabriel Fernandez [CK_BUS_ETR] = &ck_icn_p_etr, 339628c10f9eSGabriel Fernandez [CK_KER_ETR] = &ck_icn_m_etr, 339728c10f9eSGabriel Fernandez [CK_BUS_SYSATB] = &ck_sys_atb, 339828c10f9eSGabriel Fernandez [CK_KER_OSPI1] = &ck_ker_ospi1, 339928c10f9eSGabriel Fernandez [CK_KER_OSPI2] = &ck_ker_ospi2, 340028c10f9eSGabriel Fernandez [CK_KER_FMC] = &ck_ker_fmc, 340128c10f9eSGabriel Fernandez [CK_KER_SDMMC1] = &ck_ker_sdmmc1, 340228c10f9eSGabriel Fernandez [CK_KER_SDMMC2] = &ck_ker_sdmmc2, 340328c10f9eSGabriel Fernandez [CK_KER_SDMMC3] = &ck_ker_sdmmc3, 340428c10f9eSGabriel Fernandez [CK_KER_ETH1] = &ck_ker_eth1, 340528c10f9eSGabriel Fernandez [CK_ETH1_STP] = &ck_ker_eth1stp, 340628c10f9eSGabriel Fernandez [CK_KER_ETHSW] = &ck_ker_ethsw, 340728c10f9eSGabriel Fernandez [CK_KER_ETH2] = &ck_ker_eth2, 340828c10f9eSGabriel Fernandez [CK_ETH2_STP] = &ck_ker_eth2stp, 340928c10f9eSGabriel Fernandez [CK_KER_ETH1PTP] = &ck_ker_eth1ptp, 341028c10f9eSGabriel Fernandez [CK_KER_ETH2PTP] = &ck_ker_eth2ptp, 341128c10f9eSGabriel Fernandez [CK_BUS_GPU] = &ck_icn_m_gpu, 341228c10f9eSGabriel Fernandez [CK_KER_GPU] = &ck_ker_gpu, 341328c10f9eSGabriel Fernandez [CK_KER_ETHSWREF] = &ck_ker_ethswref, 341428c10f9eSGabriel Fernandez 341528c10f9eSGabriel Fernandez [CK_MCO1] = &ck_mco1, 341628c10f9eSGabriel Fernandez [CK_MCO2] = &ck_mco2, 341728c10f9eSGabriel Fernandez [CK_KER_ADC12] = &ck_ker_adc12, 341828c10f9eSGabriel Fernandez [CK_KER_ADC3] = &ck_ker_adc3, 341928c10f9eSGabriel Fernandez [CK_KER_USB2PHY1] = &ck_ker_usb2phy1, 342028c10f9eSGabriel Fernandez [CK_KER_USB2PHY2] = &ck_ker_usb2phy2, 342128c10f9eSGabriel Fernandez [CK_KER_USB2PHY2EN] = &ck_ker_usb2phy2_en, 342228c10f9eSGabriel Fernandez [CK_KER_USB3PCIEPHY] = &ck_ker_usb3pciephy, 342328c10f9eSGabriel Fernandez [CK_KER_LTDC] = &ck_ker_ltdc, 342428c10f9eSGabriel Fernandez [CK_KER_DSIBLANE] = &clk_lanebyte, 342528c10f9eSGabriel Fernandez [CK_KER_DSIPHY] = &ck_phy_dsi, 342628c10f9eSGabriel Fernandez [CK_KER_LVDSPHY] = &ck_ker_lvdsphy, 342728c10f9eSGabriel Fernandez [CK_KER_DTS] = &ck_ker_dts, 342828c10f9eSGabriel Fernandez [RTC_CK] = &ck_rtc, 342928c10f9eSGabriel Fernandez 343028c10f9eSGabriel Fernandez [CK_ETH1_MAC] = &ck_ker_eth1mac, 343128c10f9eSGabriel Fernandez [CK_ETH1_TX] = &ck_ker_eth1tx, 343228c10f9eSGabriel Fernandez [CK_ETH1_RX] = &ck_ker_eth1rx, 343328c10f9eSGabriel Fernandez [CK_ETH2_MAC] = &ck_ker_eth2mac, 343428c10f9eSGabriel Fernandez [CK_ETH2_TX] = &ck_ker_eth2tx, 343528c10f9eSGabriel Fernandez [CK_ETH2_RX] = &ck_ker_eth2rx, 343628c10f9eSGabriel Fernandez 343728c10f9eSGabriel Fernandez [CK_HSE_RTC] = &ck_hse_rtc, 343828c10f9eSGabriel Fernandez [CK_OBSER0] = &ck_obser0, 343928c10f9eSGabriel Fernandez [CK_OBSER1] = &ck_obser1, 344028c10f9eSGabriel Fernandez [CK_OFF] = &ck_off, 344128c10f9eSGabriel Fernandez [I2SCKIN] = &i2sckin, 344228c10f9eSGabriel Fernandez [SPDIFSYMB] = &spdifsymb, 344328c10f9eSGabriel Fernandez [TXBYTECLK] = &txbyteclk, 344428c10f9eSGabriel Fernandez }; 344528c10f9eSGabriel Fernandez 344628c10f9eSGabriel Fernandez static bool clk_stm32_clock_is_critical(struct clk *clk) 344728c10f9eSGabriel Fernandez { 344828c10f9eSGabriel Fernandez struct clk *clk_criticals[] = { 344928c10f9eSGabriel Fernandez &ck_hsi, 345028c10f9eSGabriel Fernandez &ck_hse, 345128c10f9eSGabriel Fernandez &ck_msi, 345228c10f9eSGabriel Fernandez &ck_lsi, 345328c10f9eSGabriel Fernandez &ck_lse, 345428c10f9eSGabriel Fernandez &ck_cpu1, 345528c10f9eSGabriel Fernandez &ck_icn_p_syscpu1, 345628c10f9eSGabriel Fernandez &ck_icn_s_ddr, 345728c10f9eSGabriel Fernandez &ck_icn_p_ddrc, 345828c10f9eSGabriel Fernandez &ck_icn_p_ddrcfg, 345928c10f9eSGabriel Fernandez &ck_icn_p_ddrphyc, 346028c10f9eSGabriel Fernandez &ck_icn_s_sysram, 346128c10f9eSGabriel Fernandez &ck_icn_s_bkpsram, 346228c10f9eSGabriel Fernandez &ck_ker_fmc, 346328c10f9eSGabriel Fernandez &ck_ker_ospi1, 346428c10f9eSGabriel Fernandez &ck_ker_ospi2, 346528c10f9eSGabriel Fernandez &ck_icn_s_vderam, 346628c10f9eSGabriel Fernandez &ck_icn_s_lpsram1, 346728c10f9eSGabriel Fernandez &ck_icn_s_lpsram2, 346828c10f9eSGabriel Fernandez &ck_icn_s_lpsram3, 346928c10f9eSGabriel Fernandez &ck_icn_p_hpdma1, 347028c10f9eSGabriel Fernandez &ck_icn_p_hpdma2, 347128c10f9eSGabriel Fernandez &ck_icn_p_hpdma3, 347228c10f9eSGabriel Fernandez &ck_icn_p_gpioa, 347328c10f9eSGabriel Fernandez &ck_icn_p_gpiob, 347428c10f9eSGabriel Fernandez &ck_icn_p_gpioc, 347528c10f9eSGabriel Fernandez &ck_icn_p_gpiod, 347628c10f9eSGabriel Fernandez &ck_icn_p_gpioe, 347728c10f9eSGabriel Fernandez &ck_icn_p_gpiof, 347828c10f9eSGabriel Fernandez &ck_icn_p_gpiog, 347928c10f9eSGabriel Fernandez &ck_icn_p_gpioh, 348028c10f9eSGabriel Fernandez &ck_icn_p_gpioi, 348128c10f9eSGabriel Fernandez &ck_icn_p_gpioj, 348228c10f9eSGabriel Fernandez &ck_icn_p_gpiok, 348328c10f9eSGabriel Fernandez &ck_icn_p_gpioz, 348428c10f9eSGabriel Fernandez &ck_icn_p_ipcc1, 348528c10f9eSGabriel Fernandez &ck_icn_p_ipcc2, 348628c10f9eSGabriel Fernandez &ck_icn_p_gicv2m, 348728c10f9eSGabriel Fernandez &ck_icn_p_rtc 348828c10f9eSGabriel Fernandez }; 348928c10f9eSGabriel Fernandez size_t i = 0; 349028c10f9eSGabriel Fernandez 349128c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clk_criticals); i++) 349228c10f9eSGabriel Fernandez if (clk == clk_criticals[i]) 349328c10f9eSGabriel Fernandez return true; 349428c10f9eSGabriel Fernandez return false; 349528c10f9eSGabriel Fernandez } 349628c10f9eSGabriel Fernandez 349728c10f9eSGabriel Fernandez static void clk_stm32_init_oscillators(const void *fdt, int node) 349828c10f9eSGabriel Fernandez { 349928c10f9eSGabriel Fernandez size_t i = 0; 350028c10f9eSGabriel Fernandez static const char * const name[] = { 350128c10f9eSGabriel Fernandez "clk-hse", "clk-hsi", "clk-lse", 350228c10f9eSGabriel Fernandez "clk-lsi", "clk-msi", "clk-i2sin" 350328c10f9eSGabriel Fernandez }; 350428c10f9eSGabriel Fernandez struct clk *clks[ARRAY_SIZE(name)] = { 350528c10f9eSGabriel Fernandez &ck_hse, &ck_hsi, &ck_lse, 350628c10f9eSGabriel Fernandez &ck_lsi, &ck_msi, &i2sckin 350728c10f9eSGabriel Fernandez }; 350828c10f9eSGabriel Fernandez 350928c10f9eSGabriel Fernandez for (i = 0; i < ARRAY_SIZE(clks); i++) { 351028c10f9eSGabriel Fernandez struct clk *clk = NULL; 351128c10f9eSGabriel Fernandez 351228c10f9eSGabriel Fernandez if (clk_dt_get_by_name(fdt, node, name[i], &clk)) 351328c10f9eSGabriel Fernandez panic(); 351428c10f9eSGabriel Fernandez 351528c10f9eSGabriel Fernandez clks[i]->parents[0] = clk; 351628c10f9eSGabriel Fernandez } 351728c10f9eSGabriel Fernandez } 351828c10f9eSGabriel Fernandez 351928c10f9eSGabriel Fernandez static TEE_Result clk_stm32_apply_rcc_config(struct stm32_clk_platdata *pdata) 352028c10f9eSGabriel Fernandez { 352128c10f9eSGabriel Fernandez if (pdata->safe_rst) 352228c10f9eSGabriel Fernandez stm32mp25_syscfg_set_safe_reset(true); 352328c10f9eSGabriel Fernandez 352428c10f9eSGabriel Fernandez return TEE_SUCCESS; 352528c10f9eSGabriel Fernandez } 352628c10f9eSGabriel Fernandez 352728c10f9eSGabriel Fernandez static struct stm32_pll_dt_cfg mp25_pll[PLL_NB]; 352828c10f9eSGabriel Fernandez static struct stm32_clk_opp_dt_cfg mp25_clk_opp; 352928c10f9eSGabriel Fernandez static struct stm32_osci_dt_cfg mp25_osci[NB_OSCILLATOR]; 353028c10f9eSGabriel Fernandez 353128c10f9eSGabriel Fernandez #define DT_FLEXGEN_CLK_MAX 64 353228c10f9eSGabriel Fernandez static uint32_t mp25_flexgen[DT_FLEXGEN_CLK_MAX]; 353328c10f9eSGabriel Fernandez 353428c10f9eSGabriel Fernandez #define DT_BUS_CLK_MAX 6 353528c10f9eSGabriel Fernandez static uint32_t mp25_busclk[DT_BUS_CLK_MAX]; 353628c10f9eSGabriel Fernandez 353728c10f9eSGabriel Fernandez #define DT_KERNEL_CLK_MAX 20 353828c10f9eSGabriel Fernandez static uint32_t mp25_kernelclk[DT_KERNEL_CLK_MAX]; 353928c10f9eSGabriel Fernandez 354028c10f9eSGabriel Fernandez static struct stm32_clk_platdata stm32mp25_clock_pdata = { 354128c10f9eSGabriel Fernandez .osci = mp25_osci, 354228c10f9eSGabriel Fernandez .nosci = NB_OSCILLATOR, 354328c10f9eSGabriel Fernandez .pll = mp25_pll, 354428c10f9eSGabriel Fernandez .npll = PLL_NB, 354528c10f9eSGabriel Fernandez .opp = &mp25_clk_opp, 354628c10f9eSGabriel Fernandez .busclk = mp25_busclk, 354728c10f9eSGabriel Fernandez .nbusclk = DT_BUS_CLK_MAX, 354828c10f9eSGabriel Fernandez .kernelclk = mp25_kernelclk, 354928c10f9eSGabriel Fernandez .nkernelclk = DT_KERNEL_CLK_MAX, 355028c10f9eSGabriel Fernandez .flexgen = mp25_flexgen, 355128c10f9eSGabriel Fernandez .nflexgen = DT_FLEXGEN_CLK_MAX, 355228c10f9eSGabriel Fernandez }; 355328c10f9eSGabriel Fernandez 355428c10f9eSGabriel Fernandez static struct clk_stm32_priv stm32mp25_clock_data = { 355528c10f9eSGabriel Fernandez .muxes = parent_mp25, 355628c10f9eSGabriel Fernandez .nb_muxes = ARRAY_SIZE(parent_mp25), 355728c10f9eSGabriel Fernandez .gates = gates_mp25, 355828c10f9eSGabriel Fernandez .nb_gates = ARRAY_SIZE(gates_mp25), 355928c10f9eSGabriel Fernandez .div = dividers_mp25, 356028c10f9eSGabriel Fernandez .nb_div = ARRAY_SIZE(dividers_mp25), 356128c10f9eSGabriel Fernandez .pdata = &stm32mp25_clock_pdata, 356228c10f9eSGabriel Fernandez .nb_clk_refs = STM32MP25_ALL_CLK_NB, 356328c10f9eSGabriel Fernandez .clk_refs = stm32mp25_clk_provided, 356428c10f9eSGabriel Fernandez .is_critical = clk_stm32_clock_is_critical, 356528c10f9eSGabriel Fernandez }; 356628c10f9eSGabriel Fernandez 3567b5f8fc36SGatien Chevallier static TEE_Result handle_available_semaphores(void) 3568b5f8fc36SGatien Chevallier { 3569b5f8fc36SGatien Chevallier struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata; 3570b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_GENERIC; 3571b5f8fc36SGatien Chevallier unsigned int index = 0; 3572b5f8fc36SGatien Chevallier uint32_t cidcfgr = 0; 3573b5f8fc36SGatien Chevallier unsigned int i = 0; 3574b5f8fc36SGatien Chevallier 3575b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) { 3576b5f8fc36SGatien Chevallier vaddr_t reg_offset = pdata->rcc_base + RCC_SEMCR(i); 3577b5f8fc36SGatien Chevallier 3578b5f8fc36SGatien Chevallier index = i / 32; 3579b5f8fc36SGatien Chevallier 3580b5f8fc36SGatien Chevallier if (!(BIT(i % 32) & pdata->conf_data.access_mask[index])) 3581b5f8fc36SGatien Chevallier continue; 3582b5f8fc36SGatien Chevallier 3583b5f8fc36SGatien Chevallier cidcfgr = io_read32(pdata->rcc_base + RCC_CIDCFGR(i)); 3584b5f8fc36SGatien Chevallier 3585b5f8fc36SGatien Chevallier if (!stm32_rif_semaphore_enabled_and_ok(cidcfgr, RIF_CID1)) 3586b5f8fc36SGatien Chevallier continue; 3587b5f8fc36SGatien Chevallier 3588b5f8fc36SGatien Chevallier if (!(io_read32(pdata->rcc_base + RCC_SECCFGR(index)) & 3589b5f8fc36SGatien Chevallier BIT(i % 32))) { 3590b5f8fc36SGatien Chevallier res = stm32_rif_release_semaphore(reg_offset, 3591b5f8fc36SGatien Chevallier MAX_CID_SUPPORTED); 3592b5f8fc36SGatien Chevallier if (res) { 3593b5f8fc36SGatien Chevallier EMSG("Cannot release semaphore for res %u", i); 3594b5f8fc36SGatien Chevallier return res; 3595b5f8fc36SGatien Chevallier } 3596b5f8fc36SGatien Chevallier } else { 3597b5f8fc36SGatien Chevallier res = stm32_rif_acquire_semaphore(reg_offset, 3598b5f8fc36SGatien Chevallier MAX_CID_SUPPORTED); 3599b5f8fc36SGatien Chevallier if (res) { 3600b5f8fc36SGatien Chevallier EMSG("Cannot acquire semaphore for res %u", i); 3601b5f8fc36SGatien Chevallier return res; 3602b5f8fc36SGatien Chevallier } 3603b5f8fc36SGatien Chevallier } 3604b5f8fc36SGatien Chevallier } 3605b5f8fc36SGatien Chevallier 3606b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3607b5f8fc36SGatien Chevallier } 3608b5f8fc36SGatien Chevallier 3609b5f8fc36SGatien Chevallier static TEE_Result apply_rcc_rif_config(bool is_tdcid) 3610b5f8fc36SGatien Chevallier { 3611b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_ACCESS_DENIED; 3612b5f8fc36SGatien Chevallier struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata; 3613b5f8fc36SGatien Chevallier unsigned int i = 0; 3614b5f8fc36SGatien Chevallier unsigned int index = 0; 3615b5f8fc36SGatien Chevallier 3616b5f8fc36SGatien Chevallier if (is_tdcid) { 3617b5f8fc36SGatien Chevallier /* 3618b5f8fc36SGatien Chevallier * When TDCID, OP-TEE should be the one to set the CID 3619b5f8fc36SGatien Chevallier * filtering configuration. Clearing previous configuration 3620b5f8fc36SGatien Chevallier * prevents undesired events during the only legitimate 3621b5f8fc36SGatien Chevallier * configuration. 3622b5f8fc36SGatien Chevallier */ 3623b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) { 3624b5f8fc36SGatien Chevallier if (BIT(i % 32) & pdata->conf_data.access_mask[i / 32]) 3625b5f8fc36SGatien Chevallier io_clrbits32(pdata->rcc_base + RCC_CIDCFGR(i), 3626b5f8fc36SGatien Chevallier RCC_CIDCFGR_CONF_MASK); 3627b5f8fc36SGatien Chevallier } 3628b5f8fc36SGatien Chevallier } else { 3629b5f8fc36SGatien Chevallier res = handle_available_semaphores(); 3630b5f8fc36SGatien Chevallier if (res) 3631b5f8fc36SGatien Chevallier panic(); 3632b5f8fc36SGatien Chevallier } 3633b5f8fc36SGatien Chevallier 3634b5f8fc36SGatien Chevallier /* Security and privilege RIF configuration */ 3635b5f8fc36SGatien Chevallier for (index = 0; index < RCC_NB_CONFS; index++) { 3636b5f8fc36SGatien Chevallier io_clrsetbits32(pdata->rcc_base + RCC_PRIVCFGR(index), 3637b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index], 3638b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf[index]); 3639b5f8fc36SGatien Chevallier io_clrsetbits32(pdata->rcc_base + RCC_SECCFGR(index), 3640b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index], 3641b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf[index]); 3642b5f8fc36SGatien Chevallier } 3643b5f8fc36SGatien Chevallier 3644b5f8fc36SGatien Chevallier if (!is_tdcid) 3645b5f8fc36SGatien Chevallier goto end; 3646b5f8fc36SGatien Chevallier 3647b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) { 3648b5f8fc36SGatien Chevallier if (BIT(i % 32) & pdata->conf_data.access_mask[i / 32]) 3649b5f8fc36SGatien Chevallier io_clrsetbits32(pdata->rcc_base + RCC_CIDCFGR(i), 3650b5f8fc36SGatien Chevallier RCC_CIDCFGR_CONF_MASK, 3651b5f8fc36SGatien Chevallier pdata->conf_data.cid_confs[i]); 3652b5f8fc36SGatien Chevallier } 3653b5f8fc36SGatien Chevallier 3654b5f8fc36SGatien Chevallier for (index = 0; index < RCC_NB_CONFS; index++) 3655b5f8fc36SGatien Chevallier io_setbits32(pdata->rcc_base + RCC_RCFGLOCKR(index), 3656b5f8fc36SGatien Chevallier pdata->conf_data.lock_conf[index]); 3657b5f8fc36SGatien Chevallier 3658b5f8fc36SGatien Chevallier res = handle_available_semaphores(); 3659b5f8fc36SGatien Chevallier if (res) 3660b5f8fc36SGatien Chevallier panic(); 3661b5f8fc36SGatien Chevallier end: 3662b5f8fc36SGatien Chevallier if (IS_ENABLED(CFG_TEE_CORE_DEBUG)) { 3663b5f8fc36SGatien Chevallier for (index = 0; index < RCC_NB_CONFS; index++) { 3664b5f8fc36SGatien Chevallier /* Check that RIF config are applied, panic otherwise */ 3665b5f8fc36SGatien Chevallier if ((io_read32(pdata->rcc_base + RCC_PRIVCFGR(index)) & 3666b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index]) != 3667b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf[index]) 3668b5f8fc36SGatien Chevallier panic("rcc resource prv conf is incorrect"); 3669b5f8fc36SGatien Chevallier 3670b5f8fc36SGatien Chevallier if ((io_read32(pdata->rcc_base + RCC_SECCFGR(index)) & 3671b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[index]) != 3672b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf[index]) 3673b5f8fc36SGatien Chevallier panic("rcc resource sec conf is incorrect"); 3674b5f8fc36SGatien Chevallier } 3675b5f8fc36SGatien Chevallier } 3676b5f8fc36SGatien Chevallier 3677b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3678b5f8fc36SGatien Chevallier } 3679b5f8fc36SGatien Chevallier 3680b5f8fc36SGatien Chevallier static TEE_Result stm32_rcc_rif_pm_suspend(void) 3681b5f8fc36SGatien Chevallier { 3682b5f8fc36SGatien Chevallier struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata; 3683b5f8fc36SGatien Chevallier unsigned int i = 0; 3684b5f8fc36SGatien Chevallier 3685b5f8fc36SGatien Chevallier if (!pdata->nb_res) 3686b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3687b5f8fc36SGatien Chevallier 3688b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_RIF_RES; i++) 3689b5f8fc36SGatien Chevallier pdata->conf_data.cid_confs[i] = io_read32(pdata->rcc_base + 3690b5f8fc36SGatien Chevallier RCC_CIDCFGR(i)); 3691b5f8fc36SGatien Chevallier 3692b5f8fc36SGatien Chevallier for (i = 0; i < RCC_NB_CONFS; i++) { 3693b5f8fc36SGatien Chevallier pdata->conf_data.priv_conf[i] = io_read32(pdata->rcc_base + 3694b5f8fc36SGatien Chevallier RCC_PRIVCFGR(i)); 3695b5f8fc36SGatien Chevallier pdata->conf_data.sec_conf[i] = io_read32(pdata->rcc_base + 3696b5f8fc36SGatien Chevallier RCC_SECCFGR(i)); 3697b5f8fc36SGatien Chevallier pdata->conf_data.lock_conf[i] = io_read32(pdata->rcc_base + 3698b5f8fc36SGatien Chevallier RCC_RCFGLOCKR(i)); 3699b5f8fc36SGatien Chevallier pdata->conf_data.access_mask[i] = GENMASK_32(31, 0); 3700b5f8fc36SGatien Chevallier } 3701b5f8fc36SGatien Chevallier 3702b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3703b5f8fc36SGatien Chevallier } 3704b5f8fc36SGatien Chevallier 3705b5f8fc36SGatien Chevallier static TEE_Result stm32_rcc_rif_pm(enum pm_op op, unsigned int pm_hint, 3706b5f8fc36SGatien Chevallier const struct pm_callback_handle *h __unused) 3707b5f8fc36SGatien Chevallier { 3708b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_GENERIC; 3709b5f8fc36SGatien Chevallier bool is_tdcid = false; 3710b5f8fc36SGatien Chevallier 3711b5f8fc36SGatien Chevallier if (!PM_HINT_IS_STATE(pm_hint, CONTEXT)) 3712b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3713b5f8fc36SGatien Chevallier 3714b5f8fc36SGatien Chevallier res = stm32_rifsc_check_tdcid(&is_tdcid); 3715b5f8fc36SGatien Chevallier if (res) 3716b5f8fc36SGatien Chevallier return res; 3717b5f8fc36SGatien Chevallier 3718b5f8fc36SGatien Chevallier if (op == PM_OP_RESUME) { 3719b5f8fc36SGatien Chevallier if (is_tdcid) 3720b5f8fc36SGatien Chevallier res = apply_rcc_rif_config(true); 3721b5f8fc36SGatien Chevallier else 3722b5f8fc36SGatien Chevallier res = handle_available_semaphores(); 3723b5f8fc36SGatien Chevallier } else { 3724b5f8fc36SGatien Chevallier if (!is_tdcid) 3725b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3726b5f8fc36SGatien Chevallier 3727b5f8fc36SGatien Chevallier res = stm32_rcc_rif_pm_suspend(); 3728b5f8fc36SGatien Chevallier } 3729b5f8fc36SGatien Chevallier 3730b5f8fc36SGatien Chevallier return res; 3731b5f8fc36SGatien Chevallier } 3732b5f8fc36SGatien Chevallier 3733b5f8fc36SGatien Chevallier static TEE_Result rcc_rif_config(void) 3734b5f8fc36SGatien Chevallier { 3735b5f8fc36SGatien Chevallier TEE_Result res = TEE_ERROR_ACCESS_DENIED; 3736b5f8fc36SGatien Chevallier bool is_tdcid = false; 3737b5f8fc36SGatien Chevallier 3738b5f8fc36SGatien Chevallier /* Not expected to fail at this stage */ 3739b5f8fc36SGatien Chevallier res = stm32_rifsc_check_tdcid(&is_tdcid); 3740b5f8fc36SGatien Chevallier if (res) 3741b5f8fc36SGatien Chevallier panic(); 3742b5f8fc36SGatien Chevallier 3743b5f8fc36SGatien Chevallier res = apply_rcc_rif_config(is_tdcid); 3744b5f8fc36SGatien Chevallier if (res) 3745b5f8fc36SGatien Chevallier panic(); 3746b5f8fc36SGatien Chevallier 3747b5f8fc36SGatien Chevallier register_pm_core_service_cb(stm32_rcc_rif_pm, NULL, "stm32-rcc-rif"); 3748b5f8fc36SGatien Chevallier 3749b5f8fc36SGatien Chevallier return TEE_SUCCESS; 3750b5f8fc36SGatien Chevallier } 3751b5f8fc36SGatien Chevallier 3752b5f8fc36SGatien Chevallier driver_init_late(rcc_rif_config); 3753b5f8fc36SGatien Chevallier 375428c10f9eSGabriel Fernandez static TEE_Result stm32mp2_clk_probe(const void *fdt, int node, 375528c10f9eSGabriel Fernandez const void *compat_data __unused) 375628c10f9eSGabriel Fernandez { 375728c10f9eSGabriel Fernandez TEE_Result res = TEE_ERROR_GENERIC; 375828c10f9eSGabriel Fernandez int fdt_rc = 0; 375928c10f9eSGabriel Fernandez int rc = 0; 376028c10f9eSGabriel Fernandez struct clk_stm32_priv *priv = &stm32mp25_clock_data; 376128c10f9eSGabriel Fernandez struct stm32_clk_platdata *pdata = &stm32mp25_clock_pdata; 376228c10f9eSGabriel Fernandez 376328c10f9eSGabriel Fernandez fdt_rc = stm32_clk_parse_fdt(fdt, node, pdata); 376428c10f9eSGabriel Fernandez if (fdt_rc) { 376528c10f9eSGabriel Fernandez EMSG("Failed to parse clock node %s: %d", 376628c10f9eSGabriel Fernandez fdt_get_name(fdt, node, NULL), fdt_rc); 376728c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 376828c10f9eSGabriel Fernandez } 376928c10f9eSGabriel Fernandez 377028c10f9eSGabriel Fernandez rc = clk_stm32_init(priv, stm32_rcc_base()); 377128c10f9eSGabriel Fernandez if (rc) 377228c10f9eSGabriel Fernandez return TEE_ERROR_GENERIC; 377328c10f9eSGabriel Fernandez 377428c10f9eSGabriel Fernandez stm32mp2_init_clock_tree(priv, pdata); 377528c10f9eSGabriel Fernandez 377628c10f9eSGabriel Fernandez clk_stm32_init_oscillators(fdt, node); 377728c10f9eSGabriel Fernandez 377828c10f9eSGabriel Fernandez res = clk_stm32_apply_rcc_config(pdata); 377928c10f9eSGabriel Fernandez if (res) 378028c10f9eSGabriel Fernandez panic("Error when applying RCC config"); 378128c10f9eSGabriel Fernandez 378228c10f9eSGabriel Fernandez stm32mp_clk_provider_probe_final(fdt, node, priv); 378328c10f9eSGabriel Fernandez 378428c10f9eSGabriel Fernandez if (IS_ENABLED(CFG_STM32_CLK_DEBUG)) 378528c10f9eSGabriel Fernandez clk_print_tree(); 378628c10f9eSGabriel Fernandez 378728c10f9eSGabriel Fernandez return TEE_SUCCESS; 378828c10f9eSGabriel Fernandez } 378928c10f9eSGabriel Fernandez 379028c10f9eSGabriel Fernandez CLK_DT_DECLARE(stm32mp25_clk, "st,stm32mp25-rcc", stm32mp2_clk_probe); 3791