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

Svyatoslav Ryhel clamor95 at gmail.com
Tue Oct 31 06:09:52 CET 2023



31 жовтня 2023 р. 07:03:17 GMT+02:00, Jaehoon Chung <jh80.chung at samsung.com> написав(-ла):
>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

power: pmic: add TPS65913 support patchset is outdated already and should not be applied!

>> ---
>>  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