regulator: core: Reduce busy-wait looping
Keep busy-wait looping to a minimum while waiting for a regulator to ramp-up to the target voltage. This follows the guidelines set forth in Documentation/timers/timers-howto.txt and assumes that regulators are never enabled in atomic context. Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
043c998f95
commit
5df529d440
1 changed files with 33 additions and 5 deletions
|
@ -1740,11 +1740,39 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
|
||||||
* together. */
|
* together. */
|
||||||
trace_regulator_enable_delay(rdev_get_name(rdev));
|
trace_regulator_enable_delay(rdev_get_name(rdev));
|
||||||
|
|
||||||
if (delay >= 1000) {
|
/*
|
||||||
mdelay(delay / 1000);
|
* Delay for the requested amount of time as per the guidelines in:
|
||||||
udelay(delay % 1000);
|
*
|
||||||
} else if (delay) {
|
* Documentation/timers/timers-howto.txt
|
||||||
udelay(delay);
|
*
|
||||||
|
* The assumption here is that regulators will never be enabled in
|
||||||
|
* atomic context and therefore sleeping functions can be used.
|
||||||
|
*/
|
||||||
|
if (delay) {
|
||||||
|
unsigned int ms = delay / 1000;
|
||||||
|
unsigned int us = delay % 1000;
|
||||||
|
|
||||||
|
if (ms > 0) {
|
||||||
|
/*
|
||||||
|
* For small enough values, handle super-millisecond
|
||||||
|
* delays in the usleep_range() call below.
|
||||||
|
*/
|
||||||
|
if (ms < 20)
|
||||||
|
us += ms * 1000;
|
||||||
|
else
|
||||||
|
msleep(ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Give the scheduler some room to coalesce with any other
|
||||||
|
* wakeup sources. For delays shorter than 10 us, don't even
|
||||||
|
* bother setting up high-resolution timers and just busy-
|
||||||
|
* loop.
|
||||||
|
*/
|
||||||
|
if (us >= 10)
|
||||||
|
usleep_range(us, us + 100);
|
||||||
|
else
|
||||||
|
udelay(us);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_regulator_enable_complete(rdev_get_name(rdev));
|
trace_regulator_enable_complete(rdev_get_name(rdev));
|
||||||
|
|
Loading…
Add table
Reference in a new issue