• Uwe Kleine-König's avatar
    pwm: bcm2835: Improve period and duty cycle calculation · ca0d2fb7
    Uwe Kleine-König authored
    With an input clk rate bigger than 2000000000, scaler would have been
    zero which then would have resulted in a division by zero.
    
    Also the originally implemented algorithm divided by the result of a
    division. This nearly always looses precision. Consider a requested period
    of 1000000 ns. With an input clock frequency of 32786885 Hz the hardware
    was configured with an actual period of 983869.007 ns (PERIOD = 32258)
    while the hardware can provide 1000003.508 ns (PERIOD = 32787).
    And note if the input clock frequency was 32786886 Hz instead, the hardware
    was configured to 1016656.477 ns (PERIOD = 33333) while the optimal
    setting results in 1000003.477 ns (PERIOD = 32787).
    
    This patch implements proper range checking and only divides once for
    the calculation of period (and similar for duty_cycle).
    Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Reviewed-by: default avatarLino Sanfilippo <LinoSanfilippo@gmx.de>
    Tested-by: default avatarLino Sanfilippo <LinoSanfilippo@gmx.de>
    Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
    ca0d2fb7
pwm-bcm2835.c 5.11 KB