From: Uwe Kleine-König Date: Mon, 7 Dec 2020 14:13:24 +0000 (+0100) Subject: pwm: imx27: Fix overflow for bigger periods X-Git-Tag: v5.15~1631^2~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ce65396e6b2386b4fd54f87beff0647a772e1cd;p=platform%2Fkernel%2Flinux-starfive.git pwm: imx27: Fix overflow for bigger periods The second parameter of do_div is an u32 and NSEC_PER_SEC * prescale overflows this for bigger periods. Assuming the usual pwm input clk rate of 66 MHz this happens starting at requested period > 606060 ns. Splitting the division into two operations doesn't loose any precision. It doesn't need to be feared that c / NSEC_PER_SEC doesn't fit into the unsigned long variable "duty_cycles" because in this case the assignment above to period_cycles would already have been overflowing as period >= duty_cycle and then the calculation is moot anyhow. Fixes: aef1a3799b5c ("pwm: imx27: Fix rounding behavior") Signed-off-by: Uwe Kleine-König Tested-by: Johannes Pointner Signed-off-by: Thierry Reding --- diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c index ceaed03..1805532 100644 --- a/drivers/pwm/pwm-imx27.c +++ b/drivers/pwm/pwm-imx27.c @@ -235,8 +235,9 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm, period_cycles /= prescale; c = clkrate * state->duty_cycle; - do_div(c, NSEC_PER_SEC * prescale); + do_div(c, NSEC_PER_SEC); duty_cycles = c; + duty_cycles /= prescale; /* * according to imx pwm RM, the real period value should be PERIOD