mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-26 23:41:50 +00:00
power: regulator: Only run autoset once for each regulator
With the commit4fcba5d556
("regulator: implement basic reference counter"), keeping regulator enablement in balance become more important. Calling regulator_autoset multiple times on a fixed regulator increase the enable count for each call, resulting in an unbalanced enable count. Introduce a AUTOSET_DONE flag and use it to mark that autoset has run for the regulator. Return -EALREADY on any subsequent call to autoset. This fixes so that the enable count is only ever increased by one per regulator for autoset. Fixes:4fcba5d556
("regulator: implement basic reference counter") Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
This commit is contained in:
parent
a9e9445ea2
commit
d99fb64a98
2 changed files with 15 additions and 4 deletions
|
@ -293,6 +293,9 @@ int regulator_autoset(struct udevice *dev)
|
|||
|
||||
uc_pdata = dev_get_uclass_plat(dev);
|
||||
|
||||
if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_DONE)
|
||||
return -EALREADY;
|
||||
|
||||
ret = regulator_set_suspend_enable(dev, uc_pdata->suspend_on);
|
||||
if (ret == -ENOSYS)
|
||||
ret = 0;
|
||||
|
@ -306,11 +309,15 @@ int regulator_autoset(struct udevice *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (!uc_pdata->always_on && !uc_pdata->boot_on)
|
||||
return -EMEDIUMTYPE;
|
||||
if (!uc_pdata->always_on && !uc_pdata->boot_on) {
|
||||
ret = -EMEDIUMTYPE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (uc_pdata->type == REGULATOR_TYPE_FIXED)
|
||||
return regulator_set_enable(dev, true);
|
||||
if (uc_pdata->type == REGULATOR_TYPE_FIXED) {
|
||||
ret = regulator_set_enable(dev, true);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV)
|
||||
ret = regulator_set_value(dev, uc_pdata->min_uV);
|
||||
|
@ -322,6 +329,9 @@ int regulator_autoset(struct udevice *dev)
|
|||
if (!ret)
|
||||
ret = regulator_set_enable(dev, true);
|
||||
|
||||
out:
|
||||
uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_DONE;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -134,6 +134,7 @@ struct dm_regulator_mode {
|
|||
enum regulator_flag {
|
||||
REGULATOR_FLAG_AUTOSET_UV = 1 << 0,
|
||||
REGULATOR_FLAG_AUTOSET_UA = 1 << 1,
|
||||
REGULATOR_FLAG_AUTOSET_DONE = 1 << 2,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue