[PATCH v2 2/2] power: pmic: fix regulators behaviour

Jaehoon Chung jh80.chung at samsung.com
Tue Oct 31 06:03:17 CET 2023


On 7/16/23 03:34, Svyatoslav Ryhel wrote:
> Currently device tree entries of regulators are completely
> ignored and regulators are probed only if they are called
> by the device which uses it. This results into two issues:
> regulators which must run under boot-on or always-on mode
> are ignored and not enabled; dts props like voltage are
> not applied to the regulator so the regulator may be enabled
> with random actual voltage, which may have unexpected
> consequences.
> 
> This patch changes this behavior. Post-probe function is
> introduced which performs probing of each pmics child and if
> it is a regulator, regulator_autoset function is called, which
> handles always-on and boot-on regulators, but if none of those
> props are set, the regulator is disabled.
> 
> Later disabled regulators can be re-enabled by devices which
> use them without issues.
> 
> Signed-off-by: Svyatoslav Ryhel <clamor95 at gmail.com>

Reviewed-by: Jaehoon Chung <jh80.chung at samsung.com>

Best Regards,
Jaehoon Chung

> ---
>  drivers/power/pmic/pmic-uclass.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/drivers/power/pmic/pmic-uclass.c b/drivers/power/pmic/pmic-uclass.c
> index 0e2f5e1f41..8a26b519c9 100644
> --- a/drivers/power/pmic/pmic-uclass.c
> +++ b/drivers/power/pmic/pmic-uclass.c
> @@ -16,6 +16,7 @@
>  #include <dm/device-internal.h>
>  #include <dm/uclass-internal.h>
>  #include <power/pmic.h>
> +#include <power/regulator.h>
>  #include <linux/ctype.h>
>  
>  #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
> @@ -198,9 +199,26 @@ static int pmic_pre_probe(struct udevice *dev)
>  	return 0;
>  }
>  
> +static int pmic_post_probe(struct udevice *dev)
> +{
> +	struct udevice *child;
> +	int ret;
> +
> +	device_foreach_child_probe(child, dev) {
> +		if (device_get_uclass_id(child) == UCLASS_REGULATOR) {
> +			ret = regulator_autoset(child);
> +			if (ret == -EMEDIUMTYPE)
> +				regulator_set_enable(child, false);
> +		};
> +	};
> +
> +	return 0;
> +}
> +
>  UCLASS_DRIVER(pmic) = {
>  	.id		= UCLASS_PMIC,
>  	.name		= "pmic",
>  	.pre_probe	= pmic_pre_probe,
> +	.post_probe	= pmic_post_probe,
>  	.per_device_auto	= sizeof(struct uc_pmic_priv),
>  };



More information about the U-Boot mailing list