summaryrefslogtreecommitdiffstats
path: root/drivers/pwm/pwm-imx27.c
diff options
context:
space:
mode:
authorUwe Kleine-König <uwe@kleine-koenig.org>2020-12-07 15:13:24 +0100
committerThierry Reding <thierry.reding@gmail.com>2020-12-17 14:19:01 +0100
commit1ce65396e6b2386b4fd54f87beff0647a772e1cd (patch)
treecca99627399743fa0652c4a2186c20d80e7c7639 /drivers/pwm/pwm-imx27.c
parent2f81b51d0d02074502ad27424c228ca760823668 (diff)
downloadlinux-stable-1ce65396e6b2386b4fd54f87beff0647a772e1cd.tar.gz
linux-stable-1ce65396e6b2386b4fd54f87beff0647a772e1cd.tar.bz2
linux-stable-1ce65396e6b2386b4fd54f87beff0647a772e1cd.zip
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 <uwe@kleine-koenig.org> Tested-by: Johannes Pointner <johannes.pointner@br-automation.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Diffstat (limited to 'drivers/pwm/pwm-imx27.c')
-rw-r--r--drivers/pwm/pwm-imx27.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c
index ceaed0378de7..18055326a2f3 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