From: Baruch Siach Date: Wed, 20 Jan 2021 16:16:25 +0000 (+0200) Subject: gpio: mvebu: improve pwm period calculation accuracy X-Git-Tag: v5.12-rc1-dontuse~105^2~35 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=aa37e27f610fe3e7539c066d9c1f5304390086d6;p=linux-block.git gpio: mvebu: improve pwm period calculation accuracy 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 Reviewed-by: Uwe Kleine-König Reviewed-by: Linus Walleij Signed-off-by: Baruch Siach Signed-off-by: Bartosz Golaszewski --- diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c index a912a8fed197..c424d88e9e2b 100644 --- a/drivers/gpio/gpio-mvebu.c +++ b/drivers/gpio/gpio-mvebu.c @@ -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)