gpio: mvebu: improve pwm period calculation accuracy
authorBaruch Siach <baruch@tkos.co.il>
Wed, 20 Jan 2021 16:16:25 +0000 (18:16 +0200)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Mon, 15 Feb 2021 10:43:30 +0000 (11:43 +0100)
Change 'off' register value calculation from

  $off = (period - duty_cycle) * clkrate / NSEC_PER_SEC

to

  $off = (period * clkrate / NSEC_PER_SEC) - $on

That is, divide the full period value to reduce rounding error.

Reported-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
drivers/gpio/gpio-mvebu.c

index a912a8fed197ac32bb393a87ba17c63421f12184..c424d88e9e2bbdaee2705eb55bdad87b00897768 100644 (file)
@@ -715,9 +715,9 @@ static int mvebu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
        else
                on = 1;
 
-       val = (unsigned long long) mvpwm->clk_rate *
-               (state->period - state->duty_cycle);
+       val = (unsigned long long) mvpwm->clk_rate * state->period;
        do_div(val, NSEC_PER_SEC);
+       val -= on;
        if (val > UINT_MAX)
                return -EINVAL;
        if (val)