Merge branch 'fixes' into for-next
This commit is contained in:
commit
bcedaba104
@ -457,7 +457,8 @@ int pwm_apply_state(struct pwm_device *pwm, struct pwm_state *state)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!pwm)
|
||||
if (!pwm || !state || !state->period ||
|
||||
state->duty_cycle > state->period)
|
||||
return -EINVAL;
|
||||
|
||||
if (!memcmp(state, &pwm->state, sizeof(*state)))
|
||||
|
@ -272,7 +272,7 @@ static int atmel_hlcdc_pwm_probe(struct platform_device *pdev)
|
||||
chip->chip.of_pwm_n_cells = 3;
|
||||
chip->chip.can_sleep = 1;
|
||||
|
||||
ret = pwmchip_add(&chip->chip);
|
||||
ret = pwmchip_add_with_polarity(&chip->chip, PWM_POLARITY_INVERSED);
|
||||
if (ret) {
|
||||
clk_disable_unprepare(hlcdc->periph_clk);
|
||||
return ret;
|
||||
|
@ -152,7 +152,7 @@ static ssize_t enable_store(struct device *child,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
pwm_apply_state(pwm, &state);
|
||||
ret = pwm_apply_state(pwm, &state);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&export->lock);
|
||||
|
@ -235,6 +235,9 @@ static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
|
||||
if (!pwm)
|
||||
return -EINVAL;
|
||||
|
||||
if (duty_ns < 0 || period_ns < 0)
|
||||
return -EINVAL;
|
||||
|
||||
pwm_get_state(pwm, &state);
|
||||
if (state.duty_cycle == duty_ns && state.period == period_ns)
|
||||
return 0;
|
||||
@ -461,6 +464,8 @@ static inline bool pwm_can_sleep(struct pwm_device *pwm)
|
||||
|
||||
static inline void pwm_apply_args(struct pwm_device *pwm)
|
||||
{
|
||||
struct pwm_state state = { };
|
||||
|
||||
/*
|
||||
* PWM users calling pwm_apply_args() expect to have a fresh config
|
||||
* where the polarity and period are set according to pwm_args info.
|
||||
@ -473,18 +478,20 @@ static inline void pwm_apply_args(struct pwm_device *pwm)
|
||||
* at startup (even if they are actually enabled), thus authorizing
|
||||
* polarity setting.
|
||||
*
|
||||
* Instead of setting ->enabled to false, we call pwm_disable()
|
||||
* before pwm_set_polarity() to ensure that everything is configured
|
||||
* as expected, and the PWM is really disabled when the user request
|
||||
* it.
|
||||
* To fulfill this requirement, we apply a new state which disables
|
||||
* the PWM device and set the reference period and polarity config.
|
||||
*
|
||||
* Note that PWM users requiring a smooth handover between the
|
||||
* bootloader and the kernel (like critical regulators controlled by
|
||||
* PWM devices) will have to switch to the atomic API and avoid calling
|
||||
* pwm_apply_args().
|
||||
*/
|
||||
pwm_disable(pwm);
|
||||
pwm_set_polarity(pwm, pwm->args.polarity);
|
||||
|
||||
state.enabled = false;
|
||||
state.polarity = pwm->args.polarity;
|
||||
state.period = pwm->args.period;
|
||||
|
||||
pwm_apply_state(pwm, &state);
|
||||
}
|
||||
|
||||
struct pwm_lookup {
|
||||
|
Loading…
Reference in New Issue
Block a user