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)
committerUwe Kleine-König <ukleinek@kernel.org>
Mon, 7 Jul 2025 06:34:44 +0000 (08:34 +0200)
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
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/pwm-mediatek.c

index 7eaab58314995c64b4b8fcf022450ea3fd2d7841..33d3554b9197ab0bc8b99731a1d7be9f69d90f61 100644 (file)
@@ -130,8 +130,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)
@@ -150,9 +152,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(pwmchip_parent(chip), "period of %d ns not supported\n", period_ns);
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
 
        if (pc->soc->pwm45_fixup && pwm->hwpwm > 2) {
@@ -169,9 +171,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)