Home | History | Annotate | Download | only in clk
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
      4  * Author(s): Vikas Manocha, <vikas.manocha (at) st.com> for STMicroelectronics.
      5  */
      6 
      7 #include <common.h>
      8 #include <clk-uclass.h>
      9 #include <dm.h>
     10 #include <stm32_rcc.h>
     11 
     12 #include <asm/io.h>
     13 #include <asm/arch/stm32.h>
     14 #include <asm/arch/stm32_pwr.h>
     15 
     16 #include <dt-bindings/mfd/stm32f7-rcc.h>
     17 
     18 #define RCC_CR_HSION			BIT(0)
     19 #define RCC_CR_HSEON			BIT(16)
     20 #define RCC_CR_HSERDY			BIT(17)
     21 #define RCC_CR_HSEBYP			BIT(18)
     22 #define RCC_CR_CSSON			BIT(19)
     23 #define RCC_CR_PLLON			BIT(24)
     24 #define RCC_CR_PLLRDY			BIT(25)
     25 #define RCC_CR_PLLSAION			BIT(28)
     26 #define RCC_CR_PLLSAIRDY		BIT(29)
     27 
     28 #define RCC_PLLCFGR_PLLM_MASK		GENMASK(5, 0)
     29 #define RCC_PLLCFGR_PLLN_MASK		GENMASK(14, 6)
     30 #define RCC_PLLCFGR_PLLP_MASK		GENMASK(17, 16)
     31 #define RCC_PLLCFGR_PLLQ_MASK		GENMASK(27, 24)
     32 #define RCC_PLLCFGR_PLLSRC		BIT(22)
     33 #define RCC_PLLCFGR_PLLM_SHIFT		0
     34 #define RCC_PLLCFGR_PLLN_SHIFT		6
     35 #define RCC_PLLCFGR_PLLP_SHIFT		16
     36 #define RCC_PLLCFGR_PLLQ_SHIFT		24
     37 
     38 #define RCC_CFGR_AHB_PSC_MASK		GENMASK(7, 4)
     39 #define RCC_CFGR_APB1_PSC_MASK		GENMASK(12, 10)
     40 #define RCC_CFGR_APB2_PSC_MASK		GENMASK(15, 13)
     41 #define RCC_CFGR_SW0			BIT(0)
     42 #define RCC_CFGR_SW1			BIT(1)
     43 #define RCC_CFGR_SW_MASK		GENMASK(1, 0)
     44 #define RCC_CFGR_SW_HSI			0
     45 #define RCC_CFGR_SW_HSE			RCC_CFGR_SW0
     46 #define RCC_CFGR_SW_PLL			RCC_CFGR_SW1
     47 #define RCC_CFGR_SWS0			BIT(2)
     48 #define RCC_CFGR_SWS1			BIT(3)
     49 #define RCC_CFGR_SWS_MASK		GENMASK(3, 2)
     50 #define RCC_CFGR_SWS_HSI		0
     51 #define RCC_CFGR_SWS_HSE		RCC_CFGR_SWS0
     52 #define RCC_CFGR_SWS_PLL		RCC_CFGR_SWS1
     53 #define RCC_CFGR_HPRE_SHIFT		4
     54 #define RCC_CFGR_PPRE1_SHIFT		10
     55 #define RCC_CFGR_PPRE2_SHIFT		13
     56 
     57 #define RCC_PLLSAICFGR_PLLSAIN_MASK	GENMASK(14, 6)
     58 #define RCC_PLLSAICFGR_PLLSAIP_MASK	GENMASK(17, 16)
     59 #define RCC_PLLSAICFGR_PLLSAIQ_MASK	GENMASK(27, 24)
     60 #define RCC_PLLSAICFGR_PLLSAIR_MASK	GENMASK(30, 28)
     61 #define RCC_PLLSAICFGR_PLLSAIN_SHIFT	6
     62 #define RCC_PLLSAICFGR_PLLSAIP_SHIFT	16
     63 #define RCC_PLLSAICFGR_PLLSAIQ_SHIFT	24
     64 #define RCC_PLLSAICFGR_PLLSAIR_SHIFT	28
     65 #define RCC_PLLSAICFGR_PLLSAIP_4	BIT(16)
     66 #define RCC_PLLSAICFGR_PLLSAIQ_4	BIT(26)
     67 #define RCC_PLLSAICFGR_PLLSAIR_3	BIT(29) | BIT(28)
     68 
     69 #define RCC_DCKCFGRX_TIMPRE		BIT(24)
     70 #define RCC_DCKCFGRX_CK48MSEL		BIT(27)
     71 #define RCC_DCKCFGRX_SDMMC1SEL		BIT(28)
     72 #define RCC_DCKCFGR2_SDMMC2SEL		BIT(29)
     73 
     74 #define RCC_DCKCFGR_PLLSAIDIVR_SHIFT    16
     75 #define RCC_DCKCFGR_PLLSAIDIVR_MASK	GENMASK(17, 16)
     76 #define RCC_DCKCFGR_PLLSAIDIVR_2	0
     77 
     78 /*
     79  * RCC AHB1ENR specific definitions
     80  */
     81 #define RCC_AHB1ENR_ETHMAC_EN		BIT(25)
     82 #define RCC_AHB1ENR_ETHMAC_TX_EN	BIT(26)
     83 #define RCC_AHB1ENR_ETHMAC_RX_EN	BIT(27)
     84 
     85 /*
     86  * RCC APB1ENR specific definitions
     87  */
     88 #define RCC_APB1ENR_TIM2EN		BIT(0)
     89 #define RCC_APB1ENR_PWREN		BIT(28)
     90 
     91 /*
     92  * RCC APB2ENR specific definitions
     93  */
     94 #define RCC_APB2ENR_SYSCFGEN		BIT(14)
     95 #define RCC_APB2ENR_SAI1EN		BIT(22)
     96 
     97 enum pllsai_div {
     98 	PLLSAIP,
     99 	PLLSAIQ,
    100 	PLLSAIR,
    101 };
    102 
    103 static const struct stm32_clk_info stm32f4_clk_info = {
    104 	/* 180 MHz */
    105 	.sys_pll_psc = {
    106 		.pll_n = 360,
    107 		.pll_p = 2,
    108 		.pll_q = 8,
    109 		.ahb_psc = AHB_PSC_1,
    110 		.apb1_psc = APB_PSC_4,
    111 		.apb2_psc = APB_PSC_2,
    112 	},
    113 	.has_overdrive = false,
    114 	.v2 = false,
    115 };
    116 
    117 static const struct stm32_clk_info stm32f7_clk_info = {
    118 	/* 200 MHz */
    119 	.sys_pll_psc = {
    120 		.pll_n = 400,
    121 		.pll_p = 2,
    122 		.pll_q = 8,
    123 		.ahb_psc = AHB_PSC_1,
    124 		.apb1_psc = APB_PSC_4,
    125 		.apb2_psc = APB_PSC_2,
    126 	},
    127 	.has_overdrive = true,
    128 	.v2 = true,
    129 };
    130 
    131 struct stm32_clk {
    132 	struct stm32_rcc_regs *base;
    133 	struct stm32_pwr_regs *pwr_regs;
    134 	struct stm32_clk_info info;
    135 	unsigned long hse_rate;
    136 	bool pllsaip;
    137 };
    138 
    139 #ifdef CONFIG_VIDEO_STM32
    140 static const u8 plldivr_table[] = { 0, 0, 2, 3, 4, 5, 6, 7 };
    141 #endif
    142 static const u8 pllsaidivr_table[] = { 2, 4, 8, 16 };
    143 
    144 static int configure_clocks(struct udevice *dev)
    145 {
    146 	struct stm32_clk *priv = dev_get_priv(dev);
    147 	struct stm32_rcc_regs *regs = priv->base;
    148 	struct stm32_pwr_regs *pwr = priv->pwr_regs;
    149 	struct pll_psc *sys_pll_psc = &priv->info.sys_pll_psc;
    150 
    151 	/* Reset RCC configuration */
    152 	setbits_le32(&regs->cr, RCC_CR_HSION);
    153 	writel(0, &regs->cfgr); /* Reset CFGR */
    154 	clrbits_le32(&regs->cr, (RCC_CR_HSEON | RCC_CR_CSSON
    155 		| RCC_CR_PLLON | RCC_CR_PLLSAION));
    156 	writel(0x24003010, &regs->pllcfgr); /* Reset value from RM */
    157 	clrbits_le32(&regs->cr, RCC_CR_HSEBYP);
    158 	writel(0, &regs->cir); /* Disable all interrupts */
    159 
    160 	/* Configure for HSE+PLL operation */
    161 	setbits_le32(&regs->cr, RCC_CR_HSEON);
    162 	while (!(readl(&regs->cr) & RCC_CR_HSERDY))
    163 		;
    164 
    165 	setbits_le32(&regs->cfgr, ((
    166 		sys_pll_psc->ahb_psc << RCC_CFGR_HPRE_SHIFT)
    167 		| (sys_pll_psc->apb1_psc << RCC_CFGR_PPRE1_SHIFT)
    168 		| (sys_pll_psc->apb2_psc << RCC_CFGR_PPRE2_SHIFT)));
    169 
    170 	/* Configure the main PLL */
    171 	setbits_le32(&regs->pllcfgr, RCC_PLLCFGR_PLLSRC); /* pll source HSE */
    172 	clrsetbits_le32(&regs->pllcfgr, RCC_PLLCFGR_PLLM_MASK,
    173 			sys_pll_psc->pll_m << RCC_PLLCFGR_PLLM_SHIFT);
    174 	clrsetbits_le32(&regs->pllcfgr, RCC_PLLCFGR_PLLN_MASK,
    175 			sys_pll_psc->pll_n << RCC_PLLCFGR_PLLN_SHIFT);
    176 	clrsetbits_le32(&regs->pllcfgr, RCC_PLLCFGR_PLLP_MASK,
    177 			((sys_pll_psc->pll_p >> 1) - 1) << RCC_PLLCFGR_PLLP_SHIFT);
    178 	clrsetbits_le32(&regs->pllcfgr, RCC_PLLCFGR_PLLQ_MASK,
    179 			sys_pll_psc->pll_q << RCC_PLLCFGR_PLLQ_SHIFT);
    180 
    181 	/* configure SDMMC clock */
    182 	if (priv->info.v2) { /*stm32f7 case */
    183 		if (priv->pllsaip)
    184 			/* select PLLSAIP as 48MHz clock source */
    185 			setbits_le32(&regs->dckcfgr2, RCC_DCKCFGRX_CK48MSEL);
    186 		else
    187 			/* select PLLQ as 48MHz clock source */
    188 			clrbits_le32(&regs->dckcfgr2, RCC_DCKCFGRX_CK48MSEL);
    189 
    190 		/* select 48MHz as SDMMC1 clock source */
    191 		clrbits_le32(&regs->dckcfgr2, RCC_DCKCFGRX_SDMMC1SEL);
    192 
    193 		/* select 48MHz as SDMMC2 clock source */
    194 		clrbits_le32(&regs->dckcfgr2, RCC_DCKCFGR2_SDMMC2SEL);
    195 	} else  { /* stm32f4 case */
    196 		if (priv->pllsaip)
    197 			/* select PLLSAIP as 48MHz clock source */
    198 			setbits_le32(&regs->dckcfgr, RCC_DCKCFGRX_CK48MSEL);
    199 		else
    200 			/* select PLLQ as 48MHz clock source */
    201 			clrbits_le32(&regs->dckcfgr, RCC_DCKCFGRX_CK48MSEL);
    202 
    203 		/* select 48MHz as SDMMC1 clock source */
    204 		clrbits_le32(&regs->dckcfgr, RCC_DCKCFGRX_SDMMC1SEL);
    205 	}
    206 
    207 	/*
    208 	 * Configure the SAI PLL to generate LTDC pixel clock and
    209 	 * 48 Mhz for SDMMC and USB
    210 	 */
    211 	clrsetbits_le32(&regs->pllsaicfgr, RCC_PLLSAICFGR_PLLSAIP_MASK,
    212 			RCC_PLLSAICFGR_PLLSAIP_4);
    213 	clrsetbits_le32(&regs->pllsaicfgr, RCC_PLLSAICFGR_PLLSAIR_MASK,
    214 			RCC_PLLSAICFGR_PLLSAIR_3);
    215 	clrsetbits_le32(&regs->pllsaicfgr, RCC_PLLSAICFGR_PLLSAIN_MASK,
    216 			195 << RCC_PLLSAICFGR_PLLSAIN_SHIFT);
    217 
    218 	clrsetbits_le32(&regs->dckcfgr, RCC_DCKCFGR_PLLSAIDIVR_MASK,
    219 			RCC_DCKCFGR_PLLSAIDIVR_2 << RCC_DCKCFGR_PLLSAIDIVR_SHIFT);
    220 
    221 	/* Enable the main PLL */
    222 	setbits_le32(&regs->cr, RCC_CR_PLLON);
    223 	while (!(readl(&regs->cr) & RCC_CR_PLLRDY))
    224 		;
    225 
    226 	/* Enable the SAI PLL */
    227 	setbits_le32(&regs->cr, RCC_CR_PLLSAION);
    228 	while (!(readl(&regs->cr) & RCC_CR_PLLSAIRDY))
    229 		;
    230 	setbits_le32(&regs->apb1enr, RCC_APB1ENR_PWREN);
    231 
    232 	if (priv->info.has_overdrive) {
    233 		/*
    234 		 * Enable high performance mode
    235 		 * System frequency up to 200 MHz
    236 		 */
    237 		setbits_le32(&pwr->cr1, PWR_CR1_ODEN);
    238 		/* Infinite wait! */
    239 		while (!(readl(&pwr->csr1) & PWR_CSR1_ODRDY))
    240 			;
    241 		/* Enable the Over-drive switch */
    242 		setbits_le32(&pwr->cr1, PWR_CR1_ODSWEN);
    243 		/* Infinite wait! */
    244 		while (!(readl(&pwr->csr1) & PWR_CSR1_ODSWRDY))
    245 			;
    246 	}
    247 
    248 	stm32_flash_latency_cfg(5);
    249 	clrbits_le32(&regs->cfgr, (RCC_CFGR_SW0 | RCC_CFGR_SW1));
    250 	setbits_le32(&regs->cfgr, RCC_CFGR_SW_PLL);
    251 
    252 	while ((readl(&regs->cfgr) & RCC_CFGR_SWS_MASK) !=
    253 			RCC_CFGR_SWS_PLL)
    254 		;
    255 
    256 #ifdef CONFIG_ETH_DESIGNWARE
    257 	/* gate the SYSCFG clock, needed to set RMII ethernet interface */
    258 	setbits_le32(&regs->apb2enr, RCC_APB2ENR_SYSCFGEN);
    259 #endif
    260 
    261 	return 0;
    262 }
    263 
    264 static bool stm32_clk_get_ck48msel(struct stm32_clk *priv)
    265 {
    266 	struct stm32_rcc_regs *regs = priv->base;
    267 
    268 	if (priv->info.v2) /*stm32f7 case */
    269 		return readl(&regs->dckcfgr2) & RCC_DCKCFGRX_CK48MSEL;
    270 	else
    271 
    272 		return readl(&regs->dckcfgr) & RCC_DCKCFGRX_CK48MSEL;
    273 }
    274 
    275 static unsigned long stm32_clk_get_pllsai_vco_rate(struct stm32_clk *priv)
    276 {
    277 	struct stm32_rcc_regs *regs = priv->base;
    278 	u16 pllm, pllsain;
    279 
    280 	pllm = (readl(&regs->pllcfgr) & RCC_PLLCFGR_PLLM_MASK);
    281 	pllsain = ((readl(&regs->pllsaicfgr) & RCC_PLLSAICFGR_PLLSAIN_MASK)
    282 		  >> RCC_PLLSAICFGR_PLLSAIN_SHIFT);
    283 
    284 	return ((priv->hse_rate / pllm) * pllsain);
    285 }
    286 
    287 static unsigned long stm32_clk_get_pllsai_rate(struct stm32_clk *priv,
    288 					       enum pllsai_div output)
    289 {
    290 	struct stm32_rcc_regs *regs = priv->base;
    291 	u16 pll_div_output;
    292 
    293 	switch (output) {
    294 	case PLLSAIP:
    295 		pll_div_output = ((((readl(&regs->pllsaicfgr)
    296 				  & RCC_PLLSAICFGR_PLLSAIP_MASK)
    297 				  >> RCC_PLLSAICFGR_PLLSAIP_SHIFT) + 1) << 1);
    298 		break;
    299 	case PLLSAIQ:
    300 		pll_div_output = (readl(&regs->pllsaicfgr)
    301 				  & RCC_PLLSAICFGR_PLLSAIQ_MASK)
    302 				  >> RCC_PLLSAICFGR_PLLSAIQ_SHIFT;
    303 		break;
    304 	case PLLSAIR:
    305 		pll_div_output = (readl(&regs->pllsaicfgr)
    306 				  & RCC_PLLSAICFGR_PLLSAIR_MASK)
    307 				  >> RCC_PLLSAICFGR_PLLSAIR_SHIFT;
    308 		break;
    309 	default:
    310 		pr_err("incorrect PLLSAI output %d\n", output);
    311 		return -EINVAL;
    312 	}
    313 
    314 	return (stm32_clk_get_pllsai_vco_rate(priv) / pll_div_output);
    315 }
    316 
    317 static bool stm32_get_timpre(struct stm32_clk *priv)
    318 {
    319 	struct stm32_rcc_regs *regs = priv->base;
    320 	u32 val;
    321 
    322 	if (priv->info.v2) /*stm32f7 case */
    323 		val = readl(&regs->dckcfgr2);
    324 	else
    325 		val = readl(&regs->dckcfgr);
    326 	/* get timer prescaler */
    327 	return !!(val & RCC_DCKCFGRX_TIMPRE);
    328 }
    329 
    330 static u32 stm32_get_hclk_rate(struct stm32_rcc_regs *regs, u32 sysclk)
    331 {
    332 	u8 shift;
    333 	/* Prescaler table lookups for clock computation */
    334 	u8 ahb_psc_table[16] = {
    335 		0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9
    336 	};
    337 
    338 	shift = ahb_psc_table[(
    339 		(readl(&regs->cfgr) & RCC_CFGR_AHB_PSC_MASK)
    340 		>> RCC_CFGR_HPRE_SHIFT)];
    341 
    342 	return sysclk >> shift;
    343 };
    344 
    345 static u8 stm32_get_apb_shift(struct stm32_rcc_regs *regs, enum apb apb)
    346 {
    347 	/* Prescaler table lookups for clock computation */
    348 	u8 apb_psc_table[8] = {
    349 		0, 0, 0, 0, 1, 2, 3, 4
    350 	};
    351 
    352 	if (apb == APB1)
    353 		return apb_psc_table[(
    354 		       (readl(&regs->cfgr) & RCC_CFGR_APB1_PSC_MASK)
    355 		       >> RCC_CFGR_PPRE1_SHIFT)];
    356 	else /* APB2 */
    357 		return apb_psc_table[(
    358 		       (readl(&regs->cfgr) & RCC_CFGR_APB2_PSC_MASK)
    359 		       >> RCC_CFGR_PPRE2_SHIFT)];
    360 };
    361 
    362 static u32 stm32_get_timer_rate(struct stm32_clk *priv, u32 sysclk,
    363 				enum apb apb)
    364 {
    365 	struct stm32_rcc_regs *regs = priv->base;
    366 	u8 shift = stm32_get_apb_shift(regs, apb);
    367 
    368 	if (stm32_get_timpre(priv))
    369 		/*
    370 		 * if APB prescaler is configured to a
    371 		 * division factor of 1, 2 or 4
    372 		 */
    373 		switch (shift) {
    374 		case 0:
    375 		case 1:
    376 		case 2:
    377 			return stm32_get_hclk_rate(regs, sysclk);
    378 		default:
    379 			return (sysclk >> shift) * 4;
    380 		}
    381 	else
    382 		/*
    383 		 * if APB prescaler is configured to a
    384 		 * division factor of 1
    385 		 */
    386 		if (shift == 0)
    387 			return sysclk;
    388 		else
    389 			return (sysclk >> shift) * 2;
    390 };
    391 
    392 static ulong stm32_clk_get_rate(struct clk *clk)
    393 {
    394 	struct stm32_clk *priv = dev_get_priv(clk->dev);
    395 	struct stm32_rcc_regs *regs = priv->base;
    396 	u32 sysclk = 0;
    397 	u32 vco;
    398 	u32 sdmmcxsel_bit;
    399 	u32 saidivr;
    400 	u32 pllsai_rate;
    401 	u16 pllm, plln, pllp, pllq;
    402 
    403 	if ((readl(&regs->cfgr) & RCC_CFGR_SWS_MASK) ==
    404 			RCC_CFGR_SWS_PLL) {
    405 		pllm = (readl(&regs->pllcfgr) & RCC_PLLCFGR_PLLM_MASK);
    406 		plln = ((readl(&regs->pllcfgr) & RCC_PLLCFGR_PLLN_MASK)
    407 			>> RCC_PLLCFGR_PLLN_SHIFT);
    408 		pllp = ((((readl(&regs->pllcfgr) & RCC_PLLCFGR_PLLP_MASK)
    409 			>> RCC_PLLCFGR_PLLP_SHIFT) + 1) << 1);
    410 		pllq = ((readl(&regs->pllcfgr) & RCC_PLLCFGR_PLLQ_MASK)
    411 			>> RCC_PLLCFGR_PLLQ_SHIFT);
    412 		vco = (priv->hse_rate / pllm) * plln;
    413 		sysclk = vco / pllp;
    414 	} else {
    415 		return -EINVAL;
    416 	}
    417 
    418 	switch (clk->id) {
    419 	/*
    420 	 * AHB CLOCK: 3 x 32 bits consecutive registers are used :
    421 	 * AHB1, AHB2 and AHB3
    422 	 */
    423 	case STM32F7_AHB1_CLOCK(GPIOA) ... STM32F7_AHB3_CLOCK(QSPI):
    424 		return stm32_get_hclk_rate(regs, sysclk);
    425 	/* APB1 CLOCK */
    426 	case STM32F7_APB1_CLOCK(TIM2) ... STM32F7_APB1_CLOCK(UART8):
    427 		/* For timer clock, an additionnal prescaler is used*/
    428 		switch (clk->id) {
    429 		case STM32F7_APB1_CLOCK(TIM2):
    430 		case STM32F7_APB1_CLOCK(TIM3):
    431 		case STM32F7_APB1_CLOCK(TIM4):
    432 		case STM32F7_APB1_CLOCK(TIM5):
    433 		case STM32F7_APB1_CLOCK(TIM6):
    434 		case STM32F7_APB1_CLOCK(TIM7):
    435 		case STM32F7_APB1_CLOCK(TIM12):
    436 		case STM32F7_APB1_CLOCK(TIM13):
    437 		case STM32F7_APB1_CLOCK(TIM14):
    438 			return stm32_get_timer_rate(priv, sysclk, APB1);
    439 		}
    440 		return (sysclk >> stm32_get_apb_shift(regs, APB1));
    441 
    442 	/* APB2 CLOCK */
    443 	case STM32F7_APB2_CLOCK(TIM1) ... STM32F7_APB2_CLOCK(DSI):
    444 		switch (clk->id) {
    445 		/*
    446 		 * particular case for SDMMC1 and SDMMC2 :
    447 		 * 48Mhz source clock can be from main PLL or from
    448 		 * PLLSAIP
    449 		 */
    450 		case STM32F7_APB2_CLOCK(SDMMC1):
    451 		case STM32F7_APB2_CLOCK(SDMMC2):
    452 			if (clk->id == STM32F7_APB2_CLOCK(SDMMC1))
    453 				sdmmcxsel_bit = RCC_DCKCFGRX_SDMMC1SEL;
    454 			else
    455 				sdmmcxsel_bit = RCC_DCKCFGR2_SDMMC2SEL;
    456 
    457 			if (readl(&regs->dckcfgr2) & sdmmcxsel_bit)
    458 				/* System clock is selected as SDMMC1 clock */
    459 				return sysclk;
    460 			/*
    461 			 * 48 MHz can be generated by either PLLSAIP
    462 			 * or by PLLQ depending of CK48MSEL bit of RCC_DCKCFGR
    463 			 */
    464 			if (stm32_clk_get_ck48msel(priv))
    465 				return stm32_clk_get_pllsai_rate(priv, PLLSAIP);
    466 			else
    467 				return (vco / pllq);
    468 			break;
    469 
    470 		/* For timer clock, an additionnal prescaler is used*/
    471 		case STM32F7_APB2_CLOCK(TIM1):
    472 		case STM32F7_APB2_CLOCK(TIM8):
    473 		case STM32F7_APB2_CLOCK(TIM9):
    474 		case STM32F7_APB2_CLOCK(TIM10):
    475 		case STM32F7_APB2_CLOCK(TIM11):
    476 			return stm32_get_timer_rate(priv, sysclk, APB2);
    477 		break;
    478 
    479 		/* particular case for LTDC clock */
    480 		case STM32F7_APB2_CLOCK(LTDC):
    481 			saidivr = readl(&regs->dckcfgr);
    482 			saidivr = (saidivr & RCC_DCKCFGR_PLLSAIDIVR_MASK)
    483 				  >> RCC_DCKCFGR_PLLSAIDIVR_SHIFT;
    484 			pllsai_rate = stm32_clk_get_pllsai_rate(priv, PLLSAIR);
    485 
    486 			return pllsai_rate / pllsaidivr_table[saidivr];
    487 		}
    488 		return (sysclk >> stm32_get_apb_shift(regs, APB2));
    489 
    490 	default:
    491 		pr_err("clock index %ld out of range\n", clk->id);
    492 		return -EINVAL;
    493 	}
    494 }
    495 
    496 static ulong stm32_set_rate(struct clk *clk, ulong rate)
    497 {
    498 #ifdef CONFIG_VIDEO_STM32
    499 	struct stm32_clk *priv = dev_get_priv(clk->dev);
    500 	struct stm32_rcc_regs *regs = priv->base;
    501 	u32 pllsair_rate, pllsai_vco_rate, current_rate;
    502 	u32 best_div, best_diff, diff;
    503 	u16 div;
    504 	u8 best_plldivr, best_pllsaidivr;
    505 	u8 i, j;
    506 	bool found = false;
    507 
    508 	/* Only set_rate for LTDC clock is implemented */
    509 	if (clk->id != STM32F7_APB2_CLOCK(LTDC)) {
    510 		pr_err("set_rate not implemented for clock index %ld\n",
    511 		       clk->id);
    512 		return 0;
    513 	}
    514 
    515 	if (rate == stm32_clk_get_rate(clk))
    516 		/* already set to requested rate */
    517 		return rate;
    518 
    519 	/* get the current PLLSAIR output freq */
    520 	pllsair_rate = stm32_clk_get_pllsai_rate(priv, PLLSAIR);
    521 	best_div = pllsair_rate / rate;
    522 
    523 	/* look into pllsaidivr_table if this divider is available*/
    524 	for (i = 0 ; i < sizeof(pllsaidivr_table); i++)
    525 		if (best_div == pllsaidivr_table[i]) {
    526 			/* set pll_saidivr with found value */
    527 			clrsetbits_le32(&regs->dckcfgr,
    528 					RCC_DCKCFGR_PLLSAIDIVR_MASK,
    529 					pllsaidivr_table[i]);
    530 			return rate;
    531 		}
    532 
    533 	/*
    534 	 * As no pllsaidivr value is suitable to obtain requested freq,
    535 	 * test all combination of pllsaidivr * pllsair and find the one
    536 	 * which give freq closest to requested rate.
    537 	 */
    538 
    539 	pllsai_vco_rate = stm32_clk_get_pllsai_vco_rate(priv);
    540 	best_diff = ULONG_MAX;
    541 	best_pllsaidivr = 0;
    542 	best_plldivr = 0;
    543 	/*
    544 	 * start at index 2 of plldivr_table as divider value at index 0
    545 	 * and 1 are 0)
    546 	 */
    547 	for (i = 2; i < sizeof(plldivr_table); i++) {
    548 		for (j = 0; j < sizeof(pllsaidivr_table); j++) {
    549 			div = plldivr_table[i] * pllsaidivr_table[j];
    550 			current_rate = pllsai_vco_rate / div;
    551 			/* perfect combination is found ? */
    552 			if (current_rate == rate) {
    553 				best_pllsaidivr = j;
    554 				best_plldivr = i;
    555 				found = true;
    556 				break;
    557 			}
    558 
    559 			diff = (current_rate > rate) ?
    560 			       current_rate - rate : rate - current_rate;
    561 
    562 			/* found a better combination ? */
    563 			if (diff < best_diff) {
    564 				best_diff = diff;
    565 				best_pllsaidivr = j;
    566 				best_plldivr = i;
    567 			}
    568 		}
    569 
    570 		if (found)
    571 			break;
    572 	}
    573 
    574 	/* Disable the SAI PLL */
    575 	clrbits_le32(&regs->cr, RCC_CR_PLLSAION);
    576 
    577 	/* set pll_saidivr with found value */
    578 	clrsetbits_le32(&regs->dckcfgr, RCC_DCKCFGR_PLLSAIDIVR_MASK,
    579 			best_pllsaidivr << RCC_DCKCFGR_PLLSAIDIVR_SHIFT);
    580 
    581 	/* set pllsair with found value */
    582 	clrsetbits_le32(&regs->pllsaicfgr, RCC_PLLSAICFGR_PLLSAIR_MASK,
    583 			plldivr_table[best_plldivr]
    584 			<< RCC_PLLSAICFGR_PLLSAIR_SHIFT);
    585 
    586 	/* Enable the SAI PLL */
    587 	setbits_le32(&regs->cr, RCC_CR_PLLSAION);
    588 	while (!(readl(&regs->cr) & RCC_CR_PLLSAIRDY))
    589 		;
    590 
    591 	div = plldivr_table[best_plldivr] * pllsaidivr_table[best_pllsaidivr];
    592 	return pllsai_vco_rate / div;
    593 #else
    594 	return 0;
    595 #endif
    596 }
    597 
    598 static int stm32_clk_enable(struct clk *clk)
    599 {
    600 	struct stm32_clk *priv = dev_get_priv(clk->dev);
    601 	struct stm32_rcc_regs *regs = priv->base;
    602 	u32 offset = clk->id / 32;
    603 	u32 bit_index = clk->id % 32;
    604 
    605 	debug("%s: clkid = %ld, offset from AHB1ENR is %d, bit_index = %d\n",
    606 	      __func__, clk->id, offset, bit_index);
    607 	setbits_le32(&regs->ahb1enr + offset, BIT(bit_index));
    608 
    609 	return 0;
    610 }
    611 
    612 static int stm32_clk_probe(struct udevice *dev)
    613 {
    614 	struct ofnode_phandle_args args;
    615 	struct udevice *fixed_clock_dev = NULL;
    616 	struct clk clk;
    617 	int err;
    618 
    619 	debug("%s\n", __func__);
    620 
    621 	struct stm32_clk *priv = dev_get_priv(dev);
    622 	fdt_addr_t addr;
    623 
    624 	addr = dev_read_addr(dev);
    625 	if (addr == FDT_ADDR_T_NONE)
    626 		return -EINVAL;
    627 
    628 	priv->base = (struct stm32_rcc_regs *)addr;
    629 	priv->pllsaip = true;
    630 
    631 	switch (dev_get_driver_data(dev)) {
    632 	case STM32F42X:
    633 		priv->pllsaip = false;
    634 		/* fallback into STM32F469 case */
    635 	case STM32F469:
    636 		memcpy(&priv->info, &stm32f4_clk_info,
    637 		       sizeof(struct stm32_clk_info));
    638 		break;
    639 
    640 	case STM32F7:
    641 		memcpy(&priv->info, &stm32f7_clk_info,
    642 		       sizeof(struct stm32_clk_info));
    643 		break;
    644 	default:
    645 		return -EINVAL;
    646 	}
    647 
    648 	/* retrieve HSE frequency (external oscillator) */
    649 	err = uclass_get_device_by_name(UCLASS_CLK, "clk-hse",
    650 					&fixed_clock_dev);
    651 
    652 	if (err) {
    653 		pr_err("Can't find fixed clock (%d)", err);
    654 		return err;
    655 	}
    656 
    657 	err = clk_request(fixed_clock_dev, &clk);
    658 	if (err) {
    659 		pr_err("Can't request %s clk (%d)", fixed_clock_dev->name,
    660 		       err);
    661 		return err;
    662 	}
    663 
    664 	/*
    665 	 * set pllm factor accordingly to the external oscillator
    666 	 * frequency (HSE). For STM32F4 and STM32F7, we want VCO
    667 	 * freq at 1MHz
    668 	 * if input PLL frequency is 25Mhz, divide it by 25
    669 	 */
    670 	clk.id = 0;
    671 	priv->hse_rate = clk_get_rate(&clk);
    672 
    673 	if (priv->hse_rate < 1000000) {
    674 		pr_err("%s: unexpected HSE clock rate = %ld \"n", __func__,
    675 		       priv->hse_rate);
    676 		return -EINVAL;
    677 	}
    678 
    679 	priv->info.sys_pll_psc.pll_m = priv->hse_rate / 1000000;
    680 
    681 	if (priv->info.has_overdrive) {
    682 		err = dev_read_phandle_with_args(dev, "st,syscfg", NULL, 0, 0,
    683 						 &args);
    684 		if (err) {
    685 			debug("%s: can't find syscon device (%d)\n", __func__,
    686 			      err);
    687 			return err;
    688 		}
    689 
    690 		priv->pwr_regs = (struct stm32_pwr_regs *)ofnode_get_addr(args.node);
    691 	}
    692 
    693 	configure_clocks(dev);
    694 
    695 	return 0;
    696 }
    697 
    698 static int stm32_clk_of_xlate(struct clk *clk, struct ofnode_phandle_args *args)
    699 {
    700 	debug("%s(clk=%p)\n", __func__, clk);
    701 
    702 	if (args->args_count != 2) {
    703 		debug("Invaild args_count: %d\n", args->args_count);
    704 		return -EINVAL;
    705 	}
    706 
    707 	if (args->args_count)
    708 		clk->id = args->args[1];
    709 	else
    710 		clk->id = 0;
    711 
    712 	return 0;
    713 }
    714 
    715 static struct clk_ops stm32_clk_ops = {
    716 	.of_xlate	= stm32_clk_of_xlate,
    717 	.enable		= stm32_clk_enable,
    718 	.get_rate	= stm32_clk_get_rate,
    719 	.set_rate	= stm32_set_rate,
    720 };
    721 
    722 U_BOOT_DRIVER(stm32fx_clk) = {
    723 	.name			= "stm32fx_rcc_clock",
    724 	.id			= UCLASS_CLK,
    725 	.ops			= &stm32_clk_ops,
    726 	.probe			= stm32_clk_probe,
    727 	.priv_auto_alloc_size	= sizeof(struct stm32_clk),
    728 	.flags			= DM_FLAG_PRE_RELOC,
    729 };
    730