diff options
Diffstat (limited to 'drivers/pwm/pwm-atmel-tcb.c')
| -rw-r--r-- | drivers/pwm/pwm-atmel-tcb.c | 42 | 
1 files changed, 29 insertions, 13 deletions
| diff --git a/drivers/pwm/pwm-atmel-tcb.c b/drivers/pwm/pwm-atmel-tcb.c index 5ccc3e7420e9..8451d3e846be 100644 --- a/drivers/pwm/pwm-atmel-tcb.c +++ b/drivers/pwm/pwm-atmel-tcb.c @@ -362,20 +362,37 @@ static int atmel_tcb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,  	tcbpwm->div = i;  	tcbpwm->duty = duty; -	/* If the PWM is enabled, call enable to apply the new conf */ -	if (pwm_is_enabled(pwm)) -		atmel_tcb_pwm_enable(chip, pwm); -  	return 0;  } +static int atmel_tcb_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, +			       const struct pwm_state *state) +{ +	int duty_cycle, period; +	int ret; + +	/* This function only sets a flag in driver data */ +	atmel_tcb_pwm_set_polarity(chip, pwm, state->polarity); + +	if (!state->enabled) { +		atmel_tcb_pwm_disable(chip, pwm); +		return 0; +	} + +	period = state->period < INT_MAX ? state->period : INT_MAX; +	duty_cycle = state->duty_cycle < INT_MAX ? state->duty_cycle : INT_MAX; + +	ret = atmel_tcb_pwm_config(chip, pwm, duty_cycle, period); +	if (ret) +		return ret; + +	return atmel_tcb_pwm_enable(chip, pwm); +} +  static const struct pwm_ops atmel_tcb_pwm_ops = {  	.request = atmel_tcb_pwm_request,  	.free = atmel_tcb_pwm_free, -	.config = atmel_tcb_pwm_config, -	.set_polarity = atmel_tcb_pwm_set_polarity, -	.enable = atmel_tcb_pwm_enable, -	.disable = atmel_tcb_pwm_disable, +	.apply = atmel_tcb_pwm_apply,  	.owner = THIS_MODULE,  }; @@ -454,7 +471,6 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)  	tcbpwm->chip.ops = &atmel_tcb_pwm_ops;  	tcbpwm->chip.of_xlate = of_pwm_xlate_with_flags;  	tcbpwm->chip.of_pwm_n_cells = 3; -	tcbpwm->chip.base = -1;  	tcbpwm->chip.npwm = NPWM;  	tcbpwm->channel = channel;  	tcbpwm->regmap = regmap; @@ -491,14 +507,14 @@ static int atmel_tcb_pwm_remove(struct platform_device *pdev)  	struct atmel_tcb_pwm_chip *tcbpwm = platform_get_drvdata(pdev);  	int err; -	clk_disable_unprepare(tcbpwm->slow_clk); -	clk_put(tcbpwm->slow_clk); -	clk_put(tcbpwm->clk); -  	err = pwmchip_remove(&tcbpwm->chip);  	if (err < 0)  		return err; +	clk_disable_unprepare(tcbpwm->slow_clk); +	clk_put(tcbpwm->slow_clk); +	clk_put(tcbpwm->clk); +  	return 0;  } | 
