[PATCH] ARM: dts: stm32: Configure Buck3 voltage per PMIC NVM on Avenger96

Patrick DELAUNAY patrick.delaunay at foss.st.com
Fri May 20 09:20:29 CEST 2022


Hi,

On 5/17/22 14:39, Patrick DELAUNAY wrote:
> Hi,
>
> On 5/11/22 23:09, Marek Vasut wrote:
>> The Avenger96 board comes in multiple regulator configurations.
>>   - rev.100 or rev.200 have Buck3 preconfigured to 3V3 operation on
>>     boot and contains extra Enpirion EP53A8LQI DCDC converter which
>>     supplies the IO. Reduce Buck3 voltage to 2V9 to not waste power.
>>   - rev.200L have Buck3 preconfigured to 1V8 operation and have no
>>     Enpirion EP53A8LQI DCDC anymore, the IO is supplied from Buck3.
>>
>> Configure the Buck3 voltage on this board per PMIC NVM settings and
>> update buck3 voltage limits in DT passed to OS before booting OS to
>> prevent potential hardware damage.
>>
>> Signed-off-by: Marek Vasut <marex at denx.de>
>> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
>> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
>> ---
>>   arch/arm/dts/stm32mp15xx-dhcor-io1v8.dtsi |   2 +-
>>   board/dhelectronics/dh_stm32mp1/board.c   | 109 +++++++++++++++++++++-
>>   2 files changed, 107 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/dts/stm32mp15xx-dhcor-io1v8.dtsi 
>> b/arch/arm/dts/stm32mp15xx-dhcor-io1v8.dtsi
>> index 9937b28548c..e20917824bf 100644
>> --- a/arch/arm/dts/stm32mp15xx-dhcor-io1v8.dtsi
>> +++ b/arch/arm/dts/stm32mp15xx-dhcor-io1v8.dtsi
>> @@ -19,7 +19,7 @@
>>   };
>>     &vdd 
>> {http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/
>> -    regulator-min-microvolt = <2900000>;
>> +    regulator-min-microvolt = <1800000>;
>>       regulator-max-microvolt = <2900000>;
>>   };
>>   diff --git a/board/dhelectronics/dh_stm32mp1/board.c 
>> b/board/dhelectronics/dh_stm32mp1/board.c
>> index 67273f90992..d407f0bf592 100644
>> --- a/board/dhelectronics/dh_stm32mp1/board.c
>> +++ b/board/dhelectronics/dh_stm32mp1/board.c
>> @@ -594,14 +594,98 @@ static void board_init_fmc2(void)
>>       setbits_le32(STM32_FMC2_BASE + STM32_FMC2_BCR1, 
>> STM32_FMC2_BCRx_FMCEN);
>>   }
>>   +#ifdef CONFIG_DM_REGULATOR
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR 
>> http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/ 
>> 0xfc
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_1V2        0
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_1V8        1
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_3V0        2
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_3V3        3
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_MASK        GENMASK(1, 0)
>> +#define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_OFFSET(n)    ((((n) - 1) & 3) 
>> * 2)
>> +static int board_get_regulator_buck3_nvm_uv_av96(int *uv)
>> +{
>> +    const void *fdt = gd->fdt_blob;
>> +    struct udevice *dev;
>> +    u8 bucks_vout = 0;
>> +    const char *prop;
>> +    int len, ret;
>> +
>> +    /* Check whether this is Avenger96 board. */
>> +    prop = fdt_getprop(fdt, 0, "compatible", &len);
>
>
> This API is not compatible with CONFIG_OF_LIVE
>
> consider replacement with ofnode_read_prop or with 
> of_machine_is_compatible, for example
>
> if (!of_machine_is_compatible(prop, "arrow,stm32mp15xx-avenger96"))
>     return -EINVAL;
>
> See also
> http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/ 
>
>
>> +    if (!prop || !len)
>> +        return -ENODEV;
>> +
>> +    if (!strstr(prop, "avenger96"))
>> +        return -EINVAL;
>> +
>> +    /* Read out STPMIC1 NVM and determine default Buck3 voltage. */
>> +    ret = uclass_get_device_by_driver(UCLASS_MISC,
>> +                      DM_DRIVER_GET(stpmic1_nvm),
>> +                      &dev);
>> +    if (ret)
>> +        return ret;
>> +
>> +    ret = misc_read(dev, STPMIC_NVM_BUCKS_VOUT_SHR, &bucks_vout, 1);
>> +    if (ret != 1)
>> +        return -EINVAL;
>> +
>> +    bucks_vout >>= STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_OFFSET(3);
>> +    bucks_vout &= STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_MASK;
>> +
>> +    /*
>> +     * Avenger96 board comes in multiple regulator configurations:
>> +     * - rev.100 or rev.200 have Buck3 preconfigured to 3V3 
>> operation on
>> +     *   boot and contains extra Enpirion EP53A8LQI DCDC converter 
>> which
>> +     *   supplies the IO. Reduce Buck3 voltage to 2V9 to not waste 
>> power.
>> +     * - rev.200L have Buck3 preconfigured to 1V8 operation and have no
>> +     *   Enpirion EP53A8LQI DCDC anymore, 
>> http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/the 
>> IO is supplied from Buck3.
>> +     */
>> +    if (bucks_vout == STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_3V3)
>> +        *uv = 2900000;
>> +    else
>> +        *uv = 1800000;
>> +
>> +    return 0;
>> +}
>> +
>> +static void board_init_regulator_av96(void)
>> +{
>> +    struct udevice *rdev;
>> +    int ret, uv;
>> +
>> +    ret = board_get_regulator_buck3_nvm_uv_av96(&uv);
>> +    if (ret)    /* Not Avenger96 board. */
>> +        return;
>> +
>> +    ret = regulator_get_by_devname("buck3", &rdev);
>> +    if (ret)
>> +        return;
>> +
>> +    /* Adjust Buck3 per preconfigured PMIC voltage from NVM. */
>> +    regulator_set_value(rdev, uv);
>> +}
>> +
>> +static void board_init_regulator(void)
>> +{
>> +    board_init_regulator_av96();
>> +
>> + 
>> regulators_enable_boot_on(_DEBUG);http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/
>> +}
>> +#else
>> +static inline int board_get_regulator_buck3_nvm_uv_av96(int *uv)
>> +{
>> +    return -EINVAL;
>> +}
>> +
>> +static inline void board_init_regulator(void) {}
>> +#endif
>> +
>>   /* board dependent setup after realloc */
>>   int board_init(void)
>>   {
>>       board_key_check();
>> http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/
>> -#ifdef CONFIG_DM_REGULATOR
>> -    regulators_enable_boot_on(_DEBUG);
>> -#endif
>> +    board_init_regulator();
>>         sysconf_init();
>>   @@ -721,6 +805,25 @@ int board_interface_eth_init(struct udevice *dev,
>>   #if defined(CONFIG_OF_BOARD_SETUP)
>>   int ft_board_setup(void *blob, struct bd_info *bd)
>>   {
>> +    const char *buck3path = 
>> "/soc/i2c at 5c002000/stpmic at 33/regulators/buck3";
>> +    int buck3off, ret, uv;
>> +
>> +    ret = 
>> board_get_regulator_buck3_nvm_uvhttp://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/_av96(&uv);
>> +    if (ret)    /* Not Avenger96 board, do not patch Buck3 in DT. */
>> +        return 0;
>> +
>> +    buck3off = fdt_path_offset(blob, buck3path);
>> +    if (buck3off < 0)    /* No Buck3 regulator found. */
>> +        return 0;
>> +
>> +    ret = fdt_setprop_u32(blob, buck3off, "regulator-min-microvolt", 
>> uv);
>> +    if (ret < 0)
>> +        return ret;
>> +
>> +    ret = fdt_setprop_u32(blob, buck3off, "regulator-max-microvolt", 
>> uv);
>> +    if (ret < 0)
>> +        return ret;
>> +http://patchwork.ozlabs.org/project/uboot/patch/20220517143655.1.I4d61d5a725e965f1476b26412ed1e8329aa9ba98@changeid/ 
>>
>>       return 0;
>>   }
>>   #endif
>
>
> Reviewed-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
>
> Thanks
> Patrick
>


Applied to u-boot-stm/master, thanks!

Regards
Patrick



More information about the U-Boot mailing list