Skip to content
  • Boris Brezillon's avatar
    pwm: rockchip: Fix period and duty cycle approximation · 12f9ce4a
    Boris Brezillon authored and Thierry Reding's avatar Thierry Reding committed
    
    
    The current implementation always round down the duty and period values,
    while it would be better to round them to the closest integer.
    
    These changes are needed in preparation of atomic update support to
    prevent a period/duty cycle drift when executing several times the
    'pwm_get_state() / modify / pwm_apply_state()' sequence.
    
    Say you have an expected period of 3.333 us and a clk rate of
    112.666667 MHz -- the clock frequency doesn't divide evenly, so the
    period (stashed in nanoseconds) shrinks when we convert to the register
    value and back, as follows:
    
      pwm_apply_state(): register = period * 112666667 / 1000000000;
      pwm_get_state(): period = register * 1000000000 / 112666667;
    
    or in other words:
    
      period = period * 112666667 / 1000000000 * 1000000000 / 112666667;
    
    which yields a sequence like:
    
      3333 -> 3328
      3328 -> 3319
      3319 -> 3310
      3310 -> 3301
      3301 -> 3292
      3292 -> ... (etc) ...
    
    With this patch, we'd see instead:
    
      period = div_round_closest(period * 112666667, 1000000000) *
                       1000000000 / 112666667;
    
    which yields a stable sequence:
    
      3333 -> 3337
      3337 -> 3337
      3337 -> ... (etc) ...
    
    Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
    Reviewed-by: default avatarBrian Norris <briannorris@chromium.org>
    Tested-by: default avatarBrian Norris <briannorris@chromium.org>
    Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    12f9ce4a