summaryrefslogtreecommitdiff
path: root/board/st
diff options
context:
space:
mode:
authorPatrick Delaunay <patrick.delaunay@st.com>2020-05-25 13:19:47 +0300
committerPatrick Delaunay <patrick.delaunay@st.com>2020-07-07 17:01:23 +0300
commit2f238327b7273656eb7670804fdb16de097b39b9 (patch)
treeaa22d1365631b15a64d8e8459ddd8371b8079521 /board/st
parentd1a4b09de6431fbc2f6a9dc53efe8d84cdd31134 (diff)
downloadu-boot-2f238327b7273656eb7670804fdb16de097b39b9.tar.xz
board: stm32mp1: update vddcore in SPL
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@st.com> Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
Diffstat (limited to 'board/st')
-rw-r--r--board/st/common/stpmic1.c23
-rw-r--r--board/st/common/stpmic1.h2
-rw-r--r--board/st/stm32mp1/spl.c11
3 files changed, 33 insertions, 3 deletions
diff --git a/board/st/common/stpmic1.c b/board/st/common/stpmic1.c
index 85f950575f..3aa379e8a5 100644
--- a/board/st/common/stpmic1.c
+++ b/board/st/common/stpmic1.c
@@ -164,8 +164,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;
@@ -173,6 +190,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 fa25cefd28..9a83da8fd3 100644
--- a/board/st/stm32mp1/spl.c
+++ b/board/st/stm32mp1/spl.c
@@ -9,10 +9,19 @@
#include <asm/arch/sys_proto.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;
}