regulator: core: factor out delay function from _regulator_do_enable

A common delay function can be helpful when implementing new features. Factor
it out to maximize code reusability.

Signed-off-by: Guodong Xu <guodong.xu@linaro.org>
Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
Guodong Xu 2014-08-13 19:33:39 +08:00 committed by Mark Brown
parent 272e2315fa
commit 79fd114161
1 changed files with 40 additions and 34 deletions

View File

@ -1759,6 +1759,45 @@ static int regulator_ena_gpio_ctrl(struct regulator_dev *rdev, bool enable)
return 0; return 0;
} }
/**
* _regulator_enable_delay - a delay helper function
* @delay: time to delay in microseconds
*
* Delay for the requested amount of time as per the guidelines in:
*
* Documentation/timers/timers-howto.txt
*
* The assumption here is that regulators will never be enabled in
* atomic context and therefore sleeping functions can be used.
*/
static void _regulator_enable_delay(unsigned int 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);
}
static int _regulator_do_enable(struct regulator_dev *rdev) static int _regulator_do_enable(struct regulator_dev *rdev)
{ {
int ret, delay; int ret, delay;
@ -1792,40 +1831,7 @@ 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));
/* _regulator_enable_delay(delay);
* Delay for the requested amount of time as per the guidelines in:
*
* Documentation/timers/timers-howto.txt
*
* 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));