Skip to content

Commit c3e3ca0

Browse files
zevweissbroonie
authored andcommitted
regulator: core: Fix enable_count imbalance with EXCLUSIVE_GET
Since the introduction of regulator->enable_count, a driver that did an exclusive get on an already-enabled regulator would end up with enable_count initialized to 0 but rdev->use_count initialized to 1. With that starting point the regulator is effectively stuck enabled, because if the driver attempted to disable it it would fail the enable_count underflow check in _regulator_handle_consumer_disable(). The EXCLUSIVE_GET path in _regulator_get() now initializes enable_count along with rdev->use_count so that the regulator can be disabled without underflowing the former. Signed-off-by: Zev Weiss <[email protected]> Fixes: 5451781 ("regulator: core: Only count load for enabled consumers") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 6d435a9 commit c3e3ca0

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

drivers/regulator/core.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2133,10 +2133,13 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
21332133
rdev->exclusive = 1;
21342134

21352135
ret = _regulator_is_enabled(rdev);
2136-
if (ret > 0)
2136+
if (ret > 0) {
21372137
rdev->use_count = 1;
2138-
else
2138+
regulator->enable_count = 1;
2139+
} else {
21392140
rdev->use_count = 0;
2141+
regulator->enable_count = 0;
2142+
}
21402143
}
21412144

21422145
link = device_link_add(dev, &rdev->dev, DL_FLAG_STATELESS);

0 commit comments

Comments
 (0)