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

Patrick DELAUNAY patrick.delaunay at foss.st.com
Tue May 17 14:39:22 CEST 2022


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



More information about the U-Boot mailing list