diff --git a/drivers/pwm/pwm-pxa.c b/drivers/pwm/pwm-pxa.c index 0ac052652c62..9ee9b41d62b8 100644 --- a/drivers/pwm/pwm-pxa.c +++ b/drivers/pwm/pwm-pxa.c @@ -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; }