]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
board: stm32mp1: update vddcore in SPL
authorPatrick Delaunay <patrick.delaunay@st.com>
Mon, 25 May 2020 10:19:47 +0000 (12:19 +0200)
committerPatrick Delaunay <patrick.delaunay@st.com>
Tue, 7 Jul 2020 14:01:23 +0000 (16:01 +0200)
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>
board/dhelectronics/dh_stm32mp1/board.c
board/st/common/stpmic1.c
board/st/common/stpmic1.h
board/st/stm32mp1/spl.c

index 0e745ec73360d09353a7e9f1173e145b4a3970cf..b2b4f3974d22baabd1c19318763f63e2be13dc64 100644 (file)
@@ -140,6 +140,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)
 {
@@ -197,10 +198,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;
index 85f950575f3ad18d2fd696d1c74f2840407e400f..3aa379e8a50f8de820c18bd52a7e3170fd097efc 100644 (file)
@@ -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,
index ecc327669703bfb31d492afc21b205a481f71188..b17d6f16338184dc7f69ec9a63401132f5efcafc 100644 (file)
@@ -3,4 +3,4 @@
  * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
  */
 
-void stpmic1_init(void);
+void stpmic1_init(u32 voltage_mv);
index fa25cefd28046db82cac3911bb4ec123a50464a7..9a83da8fd30c6914e6071ab76c5eb21d62d6b530 100644 (file)
@@ -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;
 }