diff mbox series

[v2,7/9] board: stm32mp1: update vddcore in SPL

Message ID 20200525101949.15944-8-patrick.delaunay@st.com
State Accepted
Commit 2f238327b7273656eb7670804fdb16de097b39b9
Headers show
Series stm32mp1: use OPP information for PLL1 settings in SPL | expand

Commit Message

Patrick Delaunay May 25, 2020, 10:19 a.m. UTC
For board using STPMIC1, the vddcore is provided by BUCK1 of STPMIC1
and need to be updated for 800MHz support and only after the clock
tree initialization.

The VDDCORE voltage value is provided by clock driver, saved in global
variable opp_voltage_mv and udpated in SPL board_early_init_f(),
just after clock tree initialization.

Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
---

Changes in v2:
- stmpic_buck1_set is a static function called in stpmic1_init
  (with new parameter for vddcore value)
- update also dh_stm32mp1 board

 board/dhelectronics/dh_stm32mp1/board.c |  9 ++++++++-
 board/st/common/stpmic1.c               | 23 ++++++++++++++++++++++-
 board/st/common/stpmic1.h               |  2 +-
 board/st/stm32mp1/spl.c                 | 11 ++++++++++-
 4 files changed, 41 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/board/dhelectronics/dh_stm32mp1/board.c b/board/dhelectronics/dh_stm32mp1/board.c
index df0810dbda..2ae97f677b 100644
--- a/board/dhelectronics/dh_stm32mp1/board.c
+++ b/board/dhelectronics/dh_stm32mp1/board.c
@@ -136,6 +136,7 @@  int checkboard(void)
 static u8 brdcode __section("data");
 static u8 ddr3code __section("data");
 static u8 somcode __section("data");
+static u32 opp_voltage_mv __section(".data");
 
 static void board_get_coding_straps(void)
 {
@@ -193,10 +194,16 @@  int board_stm32mp1_ddr_config_name_match(struct udevice *dev,
 	return -EINVAL;
 }
 
+void board_vddcore_init(u32 voltage_mv)
+{
+	if (IS_ENABLED(CONFIG_SPL_BUILD))
+		opp_voltage_mv = voltage_mv;
+}
+
 int board_early_init_f(void)
 {
 	if (IS_ENABLED(CONFIG_SPL_BUILD))
-		stpmic1_init();
+		stpmic1_init(opp_voltage_mv);
 	board_get_coding_straps();
 
 	return 0;
diff --git a/board/st/common/stpmic1.c b/board/st/common/stpmic1.c
index 64f24f1f6f..47f9d95c29 100644
--- a/board/st/common/stpmic1.c
+++ b/board/st/common/stpmic1.c
@@ -162,8 +162,25 @@  int board_ddr_power_init(enum ddr_type ddr_type)
 	return 0;
 }
 
+static int stmpic_buck1_set(struct udevice *dev, u32 voltage_mv)
+{
+	u32 value;
+
+	/* VDDCORE= STMPCI1 BUCK1 ramp=+25mV, 5 => 725mV, 36 => 1500mV */
+	value = ((voltage_mv - 725) / 25) + 5;
+	if (value < 5)
+		value = 5;
+	if (value > 36)
+		value = 36;
+
+	return pmic_clrsetbits(dev,
+			       STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK1),
+			       STPMIC1_BUCK_VOUT_MASK,
+			       STPMIC1_BUCK_VOUT(value));
+}
+
 /* early init of PMIC */
-void stpmic1_init(void)
+void stpmic1_init(u32 voltage_mv)
 {
 	struct udevice *dev;
 
@@ -171,6 +188,10 @@  void stpmic1_init(void)
 					DM_GET_DRIVER(pmic_stpmic1), &dev))
 		return;
 
+	/* update VDDCORE = BUCK1 */
+	if (voltage_mv)
+		stmpic_buck1_set(dev, voltage_mv);
+
 	/* Keep vdd on during the reset cycle */
 	pmic_clrsetbits(dev,
 			STPMIC1_BUCKS_MRST_CR,
diff --git a/board/st/common/stpmic1.h b/board/st/common/stpmic1.h
index ecc3276697..b17d6f1633 100644
--- a/board/st/common/stpmic1.h
+++ b/board/st/common/stpmic1.h
@@ -3,4 +3,4 @@ 
  * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
  */
 
-void stpmic1_init(void);
+void stpmic1_init(u32 voltage_mv);
diff --git a/board/st/stm32mp1/spl.c b/board/st/stm32mp1/spl.c
index 28efc5c0ae..96ab671169 100644
--- a/board/st/stm32mp1/spl.c
+++ b/board/st/stm32mp1/spl.c
@@ -7,10 +7,19 @@ 
 #include <common.h>
 #include "../common/stpmic1.h"
 
+/* board early initialisation in board_f: need to use global variable */
+static u32 opp_voltage_mv __section(".data");
+
+void board_vddcore_init(u32 voltage_mv)
+{
+	if (IS_ENABLED(CONFIG_PMIC_STPMIC1) && CONFIG_IS_ENABLED(POWER_SUPPORT))
+		opp_voltage_mv = voltage_mv;
+}
+
 int board_early_init_f(void)
 {
 	if (IS_ENABLED(CONFIG_PMIC_STPMIC1) && CONFIG_IS_ENABLED(POWER_SUPPORT))
-		stpmic1_init();
+		stpmic1_init(opp_voltage_mv);
 
 	return 0;
 }