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 <clamo...@gmail.com>
Reviewed-by: Jaehoon Chung <jh80.ch...@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), > };