On Tue, May 26, 2015 at 01:08:20PM -0700, Jonathan Richardson wrote: > The pwm_enable function didn't clear the enabled bit if a call to a > clients enable function returned an error. The result was that the state > of the pwm core was wrong. Clearing the bit when enable returns an error > ensures the state is properly set. > > Tested-by: Jonathan Richardson <jonat...@broadcom.com> > Reviewed-by: Dmitry Torokhov <dmitry.torok...@gmail.com> > Signed-off-by: Jonathan Richardson <jonat...@broadcom.com> > --- > drivers/pwm/core.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c > index 224645f..18f5ac4 100644 > --- a/drivers/pwm/core.c > +++ b/drivers/pwm/core.c > @@ -477,10 +477,20 @@ EXPORT_SYMBOL_GPL(pwm_set_polarity); > */ > int pwm_enable(struct pwm_device *pwm) > { > - if (pwm && !test_and_set_bit(PWMF_ENABLED, &pwm->flags)) > - return pwm->chip->ops->enable(pwm->chip, pwm); > + int err; > + > + if (!pwm) > + return -EINVAL; > + > + if (!test_and_set_bit(PWMF_ENABLED, &pwm->flags)) { > + err = pwm->chip->ops->enable(pwm->chip, pwm); > + if (err) { > + clear_bit(PWMF_ENABLED, &pwm->flags); > + return err; > + } > + }
I think with this new pattern we're now actually going to need a lock to make sure pwm->flags doesn't change between the test_and_set_bit() and clear_bit() calls. Thierry
pgpYDoTbAdPAZ.pgp
Description: PGP signature