]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pwm: fsl-ftm: Handle clk_get_rate() returning 0
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Tue, 1 Apr 2025 10:29:01 +0000 (12:29 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 May 2025 05:39:13 +0000 (07:39 +0200)
[ Upstream commit 928446a5302eee30ebb32075c0db5dda5a138fb7 ]

Considering that the driver doesn't enable the used clocks (and also
that clk_get_rate() returns 0 if CONFIG_HAVE_CLK is unset) better check
the return value of clk_get_rate() for being non-zero before dividing by
it.

Fixes: 3479bbd1e1f8 ("pwm: fsl-ftm: More relaxed permissions for updating period")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/b68351a51017035651bc62ad3146afcb706874f0.1743501688.git.u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pwm/pwm-fsl-ftm.c

index 59272a92047933b3c87b12f392ab3e9fa04d40bc..8221f286f5828aa98b6460f152a8a5e9ba149611 100644 (file)
@@ -123,6 +123,9 @@ static unsigned int fsl_pwm_ticks_to_ns(struct fsl_pwm_chip *fpc,
        unsigned long long exval;
 
        rate = clk_get_rate(fpc->clk[fpc->period.clk_select]);
+       if (rate >> fpc->period.clk_ps == 0)
+               return 0;
+
        exval = ticks;
        exval *= 1000000000UL;
        do_div(exval, rate >> fpc->period.clk_ps);
@@ -195,6 +198,9 @@ static unsigned int fsl_pwm_calculate_duty(struct fsl_pwm_chip *fpc,
        unsigned int period = fpc->period.mod_period + 1;
        unsigned int period_ns = fsl_pwm_ticks_to_ns(fpc, period);
 
+       if (!period_ns)
+               return 0;
+
        duty = (unsigned long long)duty_ns * period;
        do_div(duty, period_ns);