[PATCH v2 2/2] power: pmic: fix regulators behaviour
Svyatoslav Ryhel
clamor95 at gmail.com
Sun Jul 16 06:08:05 CEST 2023
16 липня 2023 р. 02:40:37 GMT+03:00, Simon Glass <sjg at chromium.org> написав(-ла):
>Hi Svyatoslav,
>
>On Sat, 15 Jul 2023 at 12:34, Svyatoslav Ryhel <clamor95 at gmail.com> 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>
>> ---
>> drivers/power/pmic/pmic-uclass.c | 18 ++++++++++++++++++
>> 1 file changed, 18 insertions(+)
>
>Can you add a test for this to test/dm/pmic.c ?
>
Sure, may you specify what I should add to tests/dm/pmic.c? Which behavior is needed?
>>
>> 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),
>> };
>> --
>> 2.39.2
>>
>
>Regards,
>Simon
More information about the U-Boot
mailing list