Skip to content

Commit

Permalink
regulator: core: factor out delay function from _regulator_do_enable
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Guodong Xu authored and Mark Brown committed Aug 16, 2014
1 parent 272e231 commit 79fd114
Showing 1 changed file with 40 additions and 34 deletions.
74 changes: 40 additions & 34 deletions drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1759,6 +1759,45 @@ static int regulator_ena_gpio_ctrl(struct regulator_dev *rdev, bool enable)
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)
{
int ret, delay;
Expand Down Expand Up @@ -1792,40 +1831,7 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
* together. */
trace_regulator_enable_delay(rdev_get_name(rdev));

/*
* 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);
}
_regulator_enable_delay(delay);

trace_regulator_enable_complete(rdev_get_name(rdev));

Expand Down

0 comments on commit 79fd114

Please sign in to comment.