diff options
Diffstat (limited to 'drivers/pwm/pwm-pxa.c')
| -rw-r--r-- | drivers/pwm/pwm-pxa.c | 25 | 
1 files changed, 16 insertions, 9 deletions
| 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); +	err = clk_prepare_enable(pc->clk); +	if (err) +		return err; -		return 0; -	} +	duty_cycle = state->enabled ? state->duty_cycle : 0; -	err = pxa_pwm_config(chip, pwm, state->duty_cycle, state->period); -	if (err) +	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 (!pwm->state.enabled) -		return clk_prepare_enable(pc->clk); +	if (!state->enabled && pwm->state.enabled) +		clk_disable_unprepare(pc->clk);  	return 0;  } | 
