lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 481/717] pwm: imx27: Fix overflow for bigger periods
    Date
    From: Uwe Kleine-König <uwe@kleine-koenig.org>

    [ Upstream commit 1ce65396e6b2386b4fd54f87beff0647a772e1cd ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pwm/pwm-imx27.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c
    index c50d453552bd4..86bcafd23e4f6 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
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:24    [W:4.181 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site