[U-Boot] [PATCH] stm32f4: Support over-drive mode in standard code path
Stefan Berzl
stefanberzl at gmail.com
Mon Dec 11 23:04:45 UTC 2017
From 0d0ea4a15605080f0418d601e6539d6555266475 Mon Sep 17 00:00:00 2001
From: Stefan Berzl <stefanberzl at gmail.com>
Date: Mon, 11 Dec 2017 23:41:04 +0100
Subject: [PATCH] stm32f4: Support over-drive mode in standard code path
The datasheet for the stm32f429-discovery says that the clock rate of
180 Mhz is only attainable when the system is switched to over-drive,
so I added support for that.
Signed-off-by: Stefan Berzl <stefanberzl at gmail.com>
---
arch/arm/include/asm/arch-stm32f4/stm32.h | 5 ---
arch/arm/include/asm/arch-stm32f4/stm32_pwr.h | 4 +-
arch/arm/mach-stm32/stm32f4/clock.c | 55 +++++++++++++++++++--------
3 files changed, 41 insertions(+), 23 deletions(-)
diff --git a/arch/arm/include/asm/arch-stm32f4/stm32.h b/arch/arm/include/asm/arch-stm32f4/stm32.h
index e9f3aabb6f..f5bdaeb895 100644
--- a/arch/arm/include/asm/arch-stm32f4/stm32.h
+++ b/arch/arm/include/asm/arch-stm32f4/stm32.h
@@ -42,11 +42,6 @@ struct stm32_u_id_regs {
u32 u_id_high;
};
-struct stm32_pwr_regs {
- u32 cr;
- u32 csr;
-};
-
/*
* Registers access macros
*/
diff --git a/arch/arm/include/asm/arch-stm32f4/stm32_pwr.h b/arch/arm/include/asm/arch-stm32f4/stm32_pwr.h
index bfe54698b3..9fa5a5b06a 100644
--- a/arch/arm/include/asm/arch-stm32f4/stm32_pwr.h
+++ b/arch/arm/include/asm/arch-stm32f4/stm32_pwr.h
@@ -16,8 +16,8 @@
#define PWR_CSR1_ODSWRDY BIT(17)
struct stm32_pwr_regs {
- u32 cr1; /* power control register 1 */
- u32 csr1; /* power control/status register 2 */
+ u32 cr; /* power control register */
+ u32 csr; /* power control/status register */
};
#endif /* __STM32_PWR_H_ */
diff --git a/arch/arm/mach-stm32/stm32f4/clock.c b/arch/arm/mach-stm32/stm32f4/clock.c
index 774591d6a5..706d716fd2 100644
--- a/arch/arm/mach-stm32/stm32f4/clock.c
+++ b/arch/arm/mach-stm32/stm32f4/clock.c
@@ -13,6 +13,7 @@
#include <asm/io.h>
#include <asm/arch/stm32.h>
#include <asm/arch/stm32_periph.h>
+#include <asm/arch/stm32_pwr.h>
#define RCC_CR_HSION (1 << 0)
#define RCC_CR_HSEON (1 << 16)
@@ -88,25 +89,31 @@
#if (CONFIG_STM32_HSE_HZ == 8000000)
#if (CONFIG_SYS_CLK_FREQ == 180000000)
/* 180 MHz */
-struct pll_psc sys_pll_psc = {
- .pll_m = 8,
- .pll_n = 360,
- .pll_p = 2,
- .pll_q = 8,
- .ahb_psc = AHB_PSC_1,
- .apb1_psc = APB_PSC_4,
- .apb2_psc = APB_PSC_2
+struct stm32_clk_info stm32f4_clk_info = {
+ .sys_pll_psc = {
+ .pll_m = 8,
+ .pll_n = 360,
+ .pll_p = 2,
+ .pll_q = 8,
+ .ahb_psc = AHB_PSC_1,
+ .apb1_psc = APB_PSC_4,
+ .apb2_psc = APB_PSC_2,
+ },
+ .has_overdrive = true
};
#else
/* default 168 MHz */
-struct pll_psc sys_pll_psc = {
- .pll_m = 8,
- .pll_n = 336,
- .pll_p = 2,
- .pll_q = 7,
- .ahb_psc = AHB_PSC_1,
- .apb1_psc = APB_PSC_4,
- .apb2_psc = APB_PSC_2
+struct stm32_clk_info stm32f4_clk_info = {
+ .sys_pll_psc = {
+ .pll_m = 8,
+ .pll_n = 336,
+ .pll_p = 2,
+ .pll_q = 7,
+ .ahb_psc = AHB_PSC_1,
+ .apb1_psc = APB_PSC_4,
+ .apb2_psc = APB_PSC_2
+ },
+ .has_overdrive = false
};
#endif
#else
@@ -116,6 +123,8 @@ struct pll_psc sys_pll_psc = {
int configure_clocks(void)
{
+ struct pll_psc sys_pll_psc = stm32f4_clk_info.sys_pll_psc;
+
/* Reset RCC configuration */
setbits_le32(&STM32_RCC->cr, RCC_CR_HSION);
writel(0, &STM32_RCC->cfgr); /* Reset CFGR */
@@ -151,6 +160,20 @@ int configure_clocks(void)
while (!(readl(&STM32_RCC->cr) & RCC_CR_PLLRDY))
;
+ if (stm32f4_clk_info.has_overdrive) {
+ /* Enable Over-drive mode */
+ setbits_le32(&STM32_PWR->cr, PWR_CR1_ODEN);
+
+ while (!(readl(&STM32_PWR->csr) & PWR_CSR1_ODRDY))
+ ;
+
+ /* Enable the Over-drive switch */
+ setbits_le32(&STM32_PWR->cr, PWR_CR1_ODSWEN);
+
+ while (!(readl(&STM32_PWR->csr) & PWR_CSR1_ODSWRDY))
+ ;
+ }
+
stm32_flash_latency_cfg(5);
clrbits_le32(&STM32_RCC->cfgr, (RCC_CFGR_SW0 | RCC_CFGR_SW1));
setbits_le32(&STM32_RCC->cfgr, RCC_CFGR_SW_PLL);
--
2.15.1
More information about the U-Boot
mailing list