]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pwm: mediatek: Handle hardware enable and clock enable separately
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Fri, 22 Aug 2025 19:01:32 +0000 (15:01 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:22:56 +0000 (16:22 +0200)
[ Upstream commit 704d918341c378c5f9505dfdf32d315e256d3846 ]

Stop handling the clocks in pwm_mediatek_enable() and
pwm_mediatek_disable(). This is a preparing change for the next commit
that requires that clocks and the enable bit are handled separately.

Also move these two functions a bit further up in the source file to
make them usable in pwm_mediatek_config(), which is needed in the next
commit, too.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/55c94fe2917ece152ee1e998f4675642a7716f13.1753717973.git.u.kleine-koenig@baylibre.com
Cc: stable@vger.kernel.org
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
Stable-dep-of: f21d136caf81 ("pwm: mediatek: Fix duty and period setting")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pwm/pwm-mediatek.c

index ea9161b967959c50d4c4ef2115fd6b10f5d66f77..a86e5637c74273e6fd8eea1558f2f61c64ace59d 100644 (file)
@@ -120,6 +120,26 @@ static inline void pwm_mediatek_writel(struct pwm_mediatek_chip *chip,
        writel(value, chip->regs + pwm_mediatek_reg_offset[num] + offset);
 }
 
+static void pwm_mediatek_enable(struct pwm_chip *chip, struct pwm_device *pwm)
+{
+       struct pwm_mediatek_chip *pc = to_pwm_mediatek_chip(chip);
+       u32 value;
+
+       value = readl(pc->regs);
+       value |= BIT(pwm->hwpwm);
+       writel(value, pc->regs);
+}
+
+static void pwm_mediatek_disable(struct pwm_chip *chip, struct pwm_device *pwm)
+{
+       struct pwm_mediatek_chip *pc = to_pwm_mediatek_chip(chip);
+       u32 value;
+
+       value = readl(pc->regs);
+       value &= ~BIT(pwm->hwpwm);
+       writel(value, pc->regs);
+}
+
 static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm,
                               int duty_ns, int period_ns)
 {
@@ -182,35 +202,6 @@ out:
        return ret;
 }
 
-static int pwm_mediatek_enable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       struct pwm_mediatek_chip *pc = to_pwm_mediatek_chip(chip);
-       u32 value;
-       int ret;
-
-       ret = pwm_mediatek_clk_enable(chip, pwm);
-       if (ret < 0)
-               return ret;
-
-       value = readl(pc->regs);
-       value |= BIT(pwm->hwpwm);
-       writel(value, pc->regs);
-
-       return 0;
-}
-
-static void pwm_mediatek_disable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       struct pwm_mediatek_chip *pc = to_pwm_mediatek_chip(chip);
-       u32 value;
-
-       value = readl(pc->regs);
-       value &= ~BIT(pwm->hwpwm);
-       writel(value, pc->regs);
-
-       pwm_mediatek_clk_disable(chip, pwm);
-}
-
 static int pwm_mediatek_apply(struct pwm_chip *chip, struct pwm_device *pwm,
                              const struct pwm_state *state)
 {
@@ -220,8 +211,10 @@ static int pwm_mediatek_apply(struct pwm_chip *chip, struct pwm_device *pwm,
                return -EINVAL;
 
        if (!state->enabled) {
-               if (pwm->state.enabled)
+               if (pwm->state.enabled) {
                        pwm_mediatek_disable(chip, pwm);
+                       pwm_mediatek_clk_disable(chip, pwm);
+               }
 
                return 0;
        }
@@ -230,8 +223,11 @@ static int pwm_mediatek_apply(struct pwm_chip *chip, struct pwm_device *pwm,
        if (err)
                return err;
 
-       if (!pwm->state.enabled)
-               err = pwm_mediatek_enable(chip, pwm);
+       if (!pwm->state.enabled) {
+               err = pwm_mediatek_clk_enable(chip, pwm);
+               if (!err)
+                       pwm_mediatek_enable(chip, pwm);
+       }
 
        return err;
 }