From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97646C33C99 for ; Fri, 10 Jan 2020 07:13:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7215A2080D for ; Fri, 10 Jan 2020 07:13:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725835AbgAJHNP (ORCPT ); Fri, 10 Jan 2020 02:13:15 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:41045 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725881AbgAJHNO (ORCPT ); Fri, 10 Jan 2020 02:13:14 -0500 Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ipoTj-0001U6-9h; Fri, 10 Jan 2020 08:13:07 +0100 Received: from ukl by ptx.hi.pengutronix.de with local (Exim 4.89) (envelope-from ) id 1ipoTi-00020H-LB; Fri, 10 Jan 2020 08:13:06 +0100 Date: Fri, 10 Jan 2020 08:13:06 +0100 From: Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= To: =?iso-8859-1?Q?Cl=E9ment_P=E9ron?= Cc: Thierry Reding , linux-pwm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Alex Mobigo , Vasily Khoruzhick , Michael Turquette , Stephen Boyd , linux-clk@vger.kernel.org Subject: Re: [PATCH] [RFC] pwm: sun4i: Move pwm_calculate out of spin_lock Message-ID: <20200110071306.uyqcyftb4bt7b2gw@pengutronix.de> References: <20200109233106.17060-1-peron.clem@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20200109233106.17060-1-peron.clem@gmail.com> User-Agent: NeoMutt/20170113 (1.7.2) X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::c0 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-clk@vger.kernel.org Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Hello Clément, On Fri, Jan 10, 2020 at 12:31:06AM +0100, Clément Péron wrote: > pwm_calculate calls clk_get_rate while holding a spin_lock. > > This create an issue as clk_get_rate() may sleep. Slightly orthogonal to this issue, it might be a good idea to add a might_sleep() to clk_get_rate(). (Added clk maintainers to Cc: for this suggestion.) > Move pwm_calculate out of this spin_lock. > > Fixes: c32c5c50d4fe ("pwm: sun4i: Switch to atomic PWM") > Reported-by: Alex Mobigo > Suggested-by: Vasily Khoruzhick > Signed-off-by: Clément Péron > --- > > Hi, > > this issue has been reported on linux-sunxi Google groups. > > I don't have a board with PWM to confirm it. > > Please wait a tested-by. > > Thanks, > Clément > > drivers/pwm/pwm-sun4i.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c > index 1afd41ebd3fd..6b230029dc49 100644 > --- a/drivers/pwm/pwm-sun4i.c > +++ b/drivers/pwm/pwm-sun4i.c > @@ -248,19 +248,18 @@ static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, > } > } > > - spin_lock(&sun4i_pwm->ctrl_lock); > - ctrl = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG); > - > ret = sun4i_pwm_calculate(sun4i_pwm, state, &duty, &period, &prescaler, > &bypass); > if (ret) { > dev_err(chip->dev, "period exceeds the maximum value\n"); > - spin_unlock(&sun4i_pwm->ctrl_lock); > if (!cstate.enabled) > clk_disable_unprepare(sun4i_pwm->clk); > return ret; > } > > + spin_lock(&sun4i_pwm->ctrl_lock); > + ctrl = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG); > + > if (sun4i_pwm->data->has_direct_mod_clk_output) { > if (bypass) { > ctrl |= BIT_CH(PWM_BYPASS, pwm->hwpwm); As sun4i_pwm_calculate does nothing that depends on (or modifies) hardware state (apart from clk_get_rate(sun4i_pwm->clk) which can be assumed to be constant) the change looks good. Reviewed-by: Uwe Kleine-König Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |