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 <clamo...@gmail.com>
> [jo...@kwiboo.se: use autoset func, only probe with always/boot-on prop]
> Signed-off-by: Jonas Karlman <jo...@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),
>  };

Reply via email to