Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5df529d4 authored by Thierry Reding's avatar Thierry Reding Committed by Mark Brown
Browse files

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: default avatarThierry Reding <treding@nvidia.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 043c998f
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -1740,11 +1740,39 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
	 * together.  */
	trace_regulator_enable_delay(rdev_get_name(rdev));

	if (delay >= 1000) {
		mdelay(delay / 1000);
		udelay(delay % 1000);
	} else if (delay) {
		udelay(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));