When the PWM mode of TCU2 channels is disabled, their corresponding pin
does not always return to its initial level. Force this by using a small
trick: we set duty > period, which is an invalid configuration for the
hardware, which then correctly resets the pin to the initial level.

Signed-off-by: Paul Cercueil <p...@crapouillou.net>
---

Notes:
    v2: New patch

 drivers/pwm/pwm-jz4740.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/pwm/pwm-jz4740.c b/drivers/pwm/pwm-jz4740.c
index 75254360621c..f901e8a0d33d 100644
--- a/drivers/pwm/pwm-jz4740.c
+++ b/drivers/pwm/pwm-jz4740.c
@@ -63,7 +63,15 @@ static void jz4740_pwm_disable(struct pwm_chip *chip, struct 
pwm_device *pwm)
 {
        uint32_t ctrl = jz4740_timer_get_ctrl(pwm->hwpwm);
 
-       /* Disable PWM output.
+       /*
+        * Set duty > period. This trick allows the TCU channels in TCU2 mode to
+        * properly return to their init level.
+        */
+       jz4740_timer_set_duty(pwm->hwpwm, 0xffff);
+       jz4740_timer_set_period(pwm->hwpwm, 0x0);
+
+       /*
+        * Disable PWM output.
         * In TCU2 mode (channel 1/2 on JZ4750+), this must be done before the
         * counter is stopped, while in TCU1 mode the order does not matter.
         */
-- 
2.21.0.593.g511ec345e18

Reply via email to