pwm: pxa: Set duty cycle to 0 when disabling PWM
When disabling PWM, the duty cycle needs to be set to 0. This prevents the previous duty cycle from showing up momentarily when the clock is re-enabled next time. Because the clock has to be running in order to configure the duty cycle, unconditionally enable it early in pxa_pwm_apply and account for the correct enable count at the end. Suggested-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Doug Brown <doug@schmorgal.com> Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Link: https://lore.kernel.org/r/20221113233639.24244-3-doug@schmorgal.com Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
f956b83893
commit
152f2d1def
@ -105,24 +105,31 @@ static int pxa_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
const struct pwm_state *state)
|
||||
{
|
||||
struct pxa_pwm_chip *pc = to_pxa_pwm_chip(chip);
|
||||
u64 duty_cycle;
|
||||
int err;
|
||||
|
||||
if (state->polarity != PWM_POLARITY_NORMAL)
|
||||
return -EINVAL;
|
||||
|
||||
if (!state->enabled) {
|
||||
if (pwm->state.enabled)
|
||||
clk_disable_unprepare(pc->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = pxa_pwm_config(chip, pwm, state->duty_cycle, state->period);
|
||||
err = clk_prepare_enable(pc->clk);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!pwm->state.enabled)
|
||||
return clk_prepare_enable(pc->clk);
|
||||
duty_cycle = state->enabled ? state->duty_cycle : 0;
|
||||
|
||||
err = pxa_pwm_config(chip, pwm, duty_cycle, state->period);
|
||||
if (err) {
|
||||
clk_disable_unprepare(pc->clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (state->enabled && !pwm->state.enabled)
|
||||
return 0;
|
||||
|
||||
clk_disable_unprepare(pc->clk);
|
||||
|
||||
if (!state->enabled && pwm->state.enabled)
|
||||
clk_disable_unprepare(pc->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user