mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-29 18:41:30 +00:00
clk: clk_stm32f: Fix stm32_clk_get_rate()
Wrong parameter was passed to stm32_clk_pll48clk_rate(). sysclk (PLL_p output value) was passed instead of VCO value. Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
This commit is contained in:
parent
167f2c90f6
commit
aa230be4bf
1 changed files with 7 additions and 5 deletions
|
@ -230,7 +230,7 @@ static int configure_clocks(struct udevice *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long stm32_clk_pll48clk_rate(struct stm32_clk *priv,
|
static unsigned long stm32_clk_pll48clk_rate(struct stm32_clk *priv,
|
||||||
u32 sysclk)
|
u32 vco)
|
||||||
{
|
{
|
||||||
struct stm32_rcc_regs *regs = priv->base;
|
struct stm32_rcc_regs *regs = priv->base;
|
||||||
u16 pllq, pllm, pllsain, pllsaip;
|
u16 pllq, pllm, pllsain, pllsaip;
|
||||||
|
@ -254,7 +254,7 @@ static unsigned long stm32_clk_pll48clk_rate(struct stm32_clk *priv,
|
||||||
return ((priv->hse_rate / pllm) * pllsain) / pllsaip;
|
return ((priv->hse_rate / pllm) * pllsain) / pllsaip;
|
||||||
}
|
}
|
||||||
/* PLL48CLK is selected from PLLQ */
|
/* PLL48CLK is selected from PLLQ */
|
||||||
return sysclk / pllq;
|
return vco / pllq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool stm32_get_timpre(struct stm32_clk *priv)
|
static bool stm32_get_timpre(struct stm32_clk *priv)
|
||||||
|
@ -337,6 +337,7 @@ static ulong stm32_clk_get_rate(struct clk *clk)
|
||||||
struct stm32_clk *priv = dev_get_priv(clk->dev);
|
struct stm32_clk *priv = dev_get_priv(clk->dev);
|
||||||
struct stm32_rcc_regs *regs = priv->base;
|
struct stm32_rcc_regs *regs = priv->base;
|
||||||
u32 sysclk = 0;
|
u32 sysclk = 0;
|
||||||
|
u32 vco;
|
||||||
u16 pllm, plln, pllp;
|
u16 pllm, plln, pllp;
|
||||||
|
|
||||||
if ((readl(®s->cfgr) & RCC_CFGR_SWS_MASK) ==
|
if ((readl(®s->cfgr) & RCC_CFGR_SWS_MASK) ==
|
||||||
|
@ -346,7 +347,8 @@ static ulong stm32_clk_get_rate(struct clk *clk)
|
||||||
>> RCC_PLLCFGR_PLLN_SHIFT);
|
>> RCC_PLLCFGR_PLLN_SHIFT);
|
||||||
pllp = ((((readl(®s->pllcfgr) & RCC_PLLCFGR_PLLP_MASK)
|
pllp = ((((readl(®s->pllcfgr) & RCC_PLLCFGR_PLLP_MASK)
|
||||||
>> RCC_PLLCFGR_PLLP_SHIFT) + 1) << 1);
|
>> RCC_PLLCFGR_PLLP_SHIFT) + 1) << 1);
|
||||||
sysclk = ((priv->hse_rate / pllm) * plln) / pllp;
|
vco = (priv->hse_rate / pllm) * plln;
|
||||||
|
sysclk = vco / pllp;
|
||||||
} else {
|
} else {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -388,14 +390,14 @@ static ulong stm32_clk_get_rate(struct clk *clk)
|
||||||
/* System clock is selected as SDMMC1 clock */
|
/* System clock is selected as SDMMC1 clock */
|
||||||
return sysclk;
|
return sysclk;
|
||||||
else
|
else
|
||||||
return stm32_clk_pll48clk_rate(priv, sysclk);
|
return stm32_clk_pll48clk_rate(priv, vco);
|
||||||
break;
|
break;
|
||||||
case STM32F7_APB2_CLOCK(SDMMC2):
|
case STM32F7_APB2_CLOCK(SDMMC2):
|
||||||
if (readl(®s->dckcfgr2) & RCC_DCKCFGR2_SDMMC2SEL)
|
if (readl(®s->dckcfgr2) & RCC_DCKCFGR2_SDMMC2SEL)
|
||||||
/* System clock is selected as SDMMC2 clock */
|
/* System clock is selected as SDMMC2 clock */
|
||||||
return sysclk;
|
return sysclk;
|
||||||
else
|
else
|
||||||
return stm32_clk_pll48clk_rate(priv, sysclk);
|
return stm32_clk_pll48clk_rate(priv, vco);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* For timer clock, an additionnal prescaler is used*/
|
/* For timer clock, an additionnal prescaler is used*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue