Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755451AbbFOXWi (ORCPT ); Mon, 15 Jun 2015 19:22:38 -0400 Received: from mail-gw3-out.broadcom.com ([216.31.210.64]:10019 "EHLO mail-gw3-out.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751454AbbFOXWa (ORCPT ); Mon, 15 Jun 2015 19:22:30 -0400 X-IronPort-AV: E=Sophos;i="5.13,622,1427785200"; d="scan'208";a="67351395" Message-ID: <557F5E33.2050706@broadcom.com> Date: Mon, 15 Jun 2015 16:22:27 -0700 From: Jonathan Richardson User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Jonathan Richardson CC: Tim Kryger , Dmitry Torokhov , Anatol Pomazau , Arun Ramamurthy , Thierry Reding , Scott Branden , bcm-kernel-feedback-list , , Subject: Re: [PATCH v9 2/2] pwm: core: Set enable state properly on failed call to enable References: <1434403262-24198-1-git-send-email-jonathar@broadcom.com> <1434403262-24198-3-git-send-email-jonathar@broadcom.com> In-Reply-To: <1434403262-24198-3-git-send-email-jonathar@broadcom.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2025 Lines: 63 On 15-06-15 02:21 PM, 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 > Reviewed-by: Dmitry Torokhov > Signed-off-by: Jonathan Richardson > --- > drivers/pwm/core.c | 19 ++++++++++++++++--- > include/linux/pwm.h | 2 ++ > 2 files changed, 18 insertions(+), 3 deletions(-) > > diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c > index 76b0386..c255267 100644 > --- a/drivers/pwm/core.c > +++ b/drivers/pwm/core.c > @@ -263,6 +263,7 @@ int pwmchip_add_with_polarity(struct pwm_chip *chip, > pwm->pwm = chip->base + i; > pwm->hwpwm = i; > pwm->polarity = polarity; > + mutex_init(&pwm->lock); > > radix_tree_insert(&pwm_tree, pwm->pwm, pwm); > } > @@ -474,10 +475,22 @@ 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 = 0; > > - return pwm ? 0 : -EINVAL; > + if (!pwm) > + return -EINVAL; > + > + mutex_lock(&pwm->lock); > + > + 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); > + } > + > + mutex_unlock(&pwm->lock); > + > + return err; > } > EXPORT_SYMBOL_GPL(pwm_enable); I meant to add the mutex check in disable also, but what about when PWMF_ENABLED is checked in pwm_set_polarity() and pwm_dbg_show()? Thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/