Skip to content

Commit

Permalink
power: regulator: Only run autoset once for each regulator
Browse files Browse the repository at this point in the history
With the commit 4fcba5d ("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: 4fcba5d ("regulator: implement basic reference counter")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
  • Loading branch information
Kwiboo authored and frank-w committed Oct 2, 2023
1 parent ea08363 commit f101bb5
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
18 changes: 14 additions & 4 deletions drivers/power/regulator/regulator-uclass.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions include/power/regulator.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

/**
Expand Down

0 comments on commit f101bb5

Please sign in to comment.