regulator: core: Fix off_on_delay handling
authorVincent Whitchurch <vincent.whitchurch@axis.com>
Fri, 23 Apr 2021 11:45:24 +0000 (13:45 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 23 Apr 2021 12:18:35 +0000 (13:18 +0100)
commita8ce7bd89689997537dd22dcbced46cf23dc19da
tree31999ac54eb10e97371a06f1620db06b9eb0320e
parent41a36ffc182ad7d0da1121d67eb2fd8f9ee28ec8
regulator: core: Fix off_on_delay handling

The jiffies-based off_on_delay implementation has a couple of problems
that cause it to sometimes not actually delay for the required time:

 (1) If, for example, the off_on_delay time is equivalent to one jiffy,
     and the ->last_off_jiffy is set just before a new jiffy starts,
     then _regulator_do_enable() does not wait at all since it checks
     using time_before().

 (2) When jiffies overflows, the value of "remaining" becomes higher
     than "max_delay" and the code simply proceeds without waiting.

Fix these problems by changing it to use ktime_t instead.

[Note that since jiffies doesn't start at zero but at INITIAL_JIFFIES
 ("-5 minutes"), (2) above also led to the code not delaying if
 the first regulator_enable() is called when the ->last_off_jiffy is not
 initialised, such as for regulators with ->constraints->boot_on set.
 It's not clear to me if this was intended or not, but I've preserved
 this behaviour explicitly with the check for a non-zero ->last_off.]

Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Link: https://lore.kernel.org/r/20210423114524.26414-1-vincent.whitchurch@axis.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/core.c
include/linux/regulator/driver.h