]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pwm: mediatek: Ensure to disable clocks in error path
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Fri, 4 Jul 2025 17:27:27 +0000 (19:27 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Jul 2025 16:30:50 +0000 (18:30 +0200)
commit 505b730ede7f5c4083ff212aa955155b5b92e574 upstream.

After enabling the clocks each error path must disable the clocks again.
One of them failed to do so. Unify the error paths to use goto to make it
harder for future changes to add a similar bug.

Fixes: 7ca59947b5fc ("pwm: mediatek: Prevent divide-by-zero in pwm_mediatek_config()")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/20250704172728.626815-2-u.kleine-koenig@baylibre.com
Cc: stable@vger.kernel.org
[ukleinek: backported to 5.15.y]
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pwm/pwm-mediatek.c

index bb764428bfe76e2f2d2f31531c89f3d78cab2be7..d8a80b06a6f2eea4c5b8283e01b31fbe8a0cb283 100644 (file)
@@ -129,8 +129,10 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm,
                return ret;
 
        clk_rate = clk_get_rate(pc->clk_pwms[pwm->hwpwm]);
-       if (!clk_rate)
-               return -EINVAL;
+       if (!clk_rate) {
+               ret = -EINVAL;
+               goto out;
+       }
 
        /* Make sure we use the bus clock and not the 26MHz clock */
        if (pc->soc->has_ck_26m_sel)
@@ -149,9 +151,9 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm,
        }
 
        if (clkdiv > PWM_CLK_DIV_MAX) {
-               pwm_mediatek_clk_disable(chip, pwm);
-               dev_err(chip->dev, "period %d not supported\n", period_ns);
-               return -EINVAL;
+               dev_err(chip->dev, "period of %d ns not supported\n", period_ns);
+               ret = -EINVAL;
+               goto out;
        }
 
        if (pc->soc->pwm45_fixup && pwm->hwpwm > 2) {
@@ -168,9 +170,10 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm,
        pwm_mediatek_writel(pc, pwm->hwpwm, reg_width, cnt_period);
        pwm_mediatek_writel(pc, pwm->hwpwm, reg_thres, cnt_duty);
 
+out:
        pwm_mediatek_clk_disable(chip, pwm);
 
-       return 0;
+       return ret;
 }
 
 static int pwm_mediatek_enable(struct pwm_chip *chip, struct pwm_device *pwm)