• Max Kellermann's avatar
    pwm-sun4i: Calculate the delay without rounding down to jiffies · 8246b478
    Max Kellermann authored
    This fixes a problem that was supposed to be addressed by commit
    6eefb79d ("pwm: sun4i: Remove erroneous else branch") - backlight
    could not be switched off on some Allwinner A20.  The commit was
    correct, but was not a reliable fix for the problem, which was timing
    related.
    
    The real problem for the backlight switching problem was that sleeping
    for a full period did not work, because delay_us is always zero.
    
    It is zero because the period (plus 1 microsecond) is rounded down to
    the next "jiffies", but the period is less than one jiffy.
    
    On my Cubieboard 2, the period is 5ms, and 1 jiffy (at the default
    HZ=100) is 10ms, so nsecs_to_jiffies(10ms+1us)=0.
    
    The roundtrip from nanoseconds to jiffies and back to microseconds is
    an unnecessary loss of precision; always rounding down (via
    nsecs_to_jiffies()) then causes the breakage.
    
    This patch eliminates this roundtrip, and directly converts from
    nanoseconds to microseconds (for usleep_range()), using
    DIV_ROUND_UP_ULL() to force rounding up.  This way, the sleep time is
    never zero, and after the sleep, we are guaranteed to be in a
    different period, and the device is ready for another control command
    for sure.
    Signed-off-by: default avatarMax Kellermann <max.kellermann@gmail.com>
    Acked-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    8246b478
pwm-sun4i.c 12.8 KB