]> git.baikalelectronics.ru Git - kernel.git/commit
pwm: bcm2835: Improve period and duty cycle calculation
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 14 Jan 2021 20:48:04 +0000 (21:48 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Mon, 22 Mar 2021 10:48:07 +0000 (11:48 +0100)
commit396448ebde22e450e6137b01f9b0c1b6a22728e1
treee80ce9c3b4fda243f785b559b358a8d3a5af4281
parent219c9076286fd92026e818ab1375558e5b20649f
pwm: bcm2835: Improve period and duty cycle calculation

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: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
Tested-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-bcm2835.c