pwm: atmel: Fix disabling of PWM channels
When disabling a PWM channel, the PWM clock was being stopped immediately after writing to PWM_DIS. As a result, the disabling of the PWM channel did not complete properly, and the PWM output might be left at the wrong level. Fix this by waiting for the channel to be effectively disabled (by checking the PWM_SR register) before disabling the clock. Signed-off-by: Guillermo Rodriguez <guille.rodriguez@gmail.com> Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
396d502c51
commit
f718c54c1a
|
@ -271,6 +271,16 @@ static void atmel_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
|
|||
mutex_unlock(&atmel_pwm->isr_lock);
|
||||
atmel_pwm_writel(atmel_pwm, PWM_DIS, 1 << pwm->hwpwm);
|
||||
|
||||
/*
|
||||
* Wait for the PWM channel disable operation to be effective before
|
||||
* stopping the clock.
|
||||
*/
|
||||
timeout = jiffies + 2 * HZ;
|
||||
|
||||
while ((atmel_pwm_readl(atmel_pwm, PWM_SR) & (1 << pwm->hwpwm)) &&
|
||||
time_before(jiffies, timeout))
|
||||
usleep_range(10, 100);
|
||||
|
||||
clk_disable(atmel_pwm->clk);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue