• V
    regulator: core: Fix off_on_delay handling · a8ce7bd8
    Vincent Whitchurch 提交于
    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: NVincent Whitchurch <vincent.whitchurch@axis.com>
    Link: https://lore.kernel.org/r/20210423114524.26414-1-vincent.whitchurch@axis.comSigned-off-by: NMark Brown <broonie@kernel.org>
    a8ce7bd8
driver.h 21.3 KB