]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pwm: jz4740: Force TCU2 channels to return to their init level
authorPaul Cercueil <paul@crapouillou.net>
Fri, 7 Jun 2019 15:44:09 +0000 (17:44 +0200)
committerThierry Reding <thierry.reding@gmail.com>
Wed, 26 Jun 2019 09:39:05 +0000 (11:39 +0200)
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 <paul@crapouillou.net>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-jz4740.c

index e73ee72df09d07bcaff331f847c7d319c941d439..2e4ecc061dd2d3c1dc6ce150bdc6ecad91673d87 100644 (file)
@@ -72,7 +72,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.
         */