[PATCH v4 3/4] power: regulator: Perform regulator setup inside uclass

Jonas Karlman jonas at kwiboo.se
Tue Oct 3 16:05:59 CEST 2023


On 2023-10-03 08:21, Svyatoslav Ryhel wrote:
> Regulators initial setup was previously dependent on board call.
> To move from this behaviour next solution is proposed: on post_bind
> boot-on/always-on properties are checked, all regulators with
> such props will be probed just after binding which ensures that
> essential regulators are set, then in the post probe regulator
> autoset is called so that correct regulator state according to
> device tree is reached.
> 
> Signed-off-by: Svyatoslav Ryhel <clamor95 at gmail.com>
> [jonas at kwiboo.se: use autoset func, only probe with always/boot-on prop]
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
> ---
>  drivers/power/regulator/regulator-uclass.c | 30 ++++++++++++++++++----
>  1 file changed, 25 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/power/regulator/regulator-uclass.c b/drivers/power/regulator/regulator-uclass.c
> index 4b2c6c2964..69d6d6428d 100644
> --- a/drivers/power/regulator/regulator-uclass.c
> +++ b/drivers/power/regulator/regulator-uclass.c
> @@ -473,6 +473,7 @@ static int regulator_post_bind(struct udevice *dev)
>  {
>  	struct dm_regulator_uclass_plat *uc_pdata;
>  	const char *property = "regulator-name";
> +	int ret;
>  
>  	uc_pdata = dev_get_uclass_plat(dev);
>  
> @@ -486,13 +487,20 @@ static int regulator_post_bind(struct udevice *dev)
>  			return -EINVAL;
>  	}
>  
> -	if (regulator_name_is_unique(dev, uc_pdata->name))
> -		return 0;
> +	ret = regulator_name_is_unique(dev, uc_pdata->name);
> +	if (!ret) {
> +		debug("'%s' of dev: '%s', has nonunique value: '%s'\n",
> +		      property, dev->name, uc_pdata->name);
> +		return -EINVAL;
> +	}
>  
> -	debug("'%s' of dev: '%s', has nonunique value: '%s\n",
> -	      property, dev->name, uc_pdata->name);
> +	uc_pdata->always_on = dev_read_bool(dev, "regulator-always-on");
> +	uc_pdata->boot_on = dev_read_bool(dev, "regulator-boot-on");
>  
> -	return -EINVAL;
> +	if (uc_pdata->always_on || uc_pdata->boot_on)
> +		dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
> +
> +	return 0;
>  }
>  
>  static int regulator_pre_probe(struct udevice *dev)
> @@ -546,6 +554,17 @@ static int regulator_pre_probe(struct udevice *dev)
>  	return 0;
>  }
>  
> +static int regulator_post_probe(struct udevice *dev)
> +{
> +	int ret;
> +
> +	ret = regulator_autoset(dev);
> +	if (ret == -EMEDIUMTYPE || ret == -ENOSYS)

Would be good to also check for || ret == -EALREADY here.

Following pending patch extend regulator_autoset to also return
-EALREADY when it has already been called for a regulator.

power: regulator: Only run autoset once for each regulator
https://patchwork.ozlabs.org/patch/1823770/

Regards,
Jonas

> +		return 0;
> +
> +	return ret;
> +}
> +
>  int regulators_enable_boot_on(bool verbose)
>  {
>  	struct udevice *dev;
> @@ -603,5 +622,6 @@ UCLASS_DRIVER(regulator) = {
>  	.name		= "regulator",
>  	.post_bind	= regulator_post_bind,
>  	.pre_probe	= regulator_pre_probe,
> +	.post_probe	= regulator_post_probe,
>  	.per_device_plat_auto	= sizeof(struct dm_regulator_uclass_plat),
>  };



More information about the U-Boot mailing list