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=-13.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable 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 30852C4363D for ; Fri, 25 Sep 2020 15:55:23 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D66C121741 for ; Fri, 25 Sep 2020 15:55:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="zttoLH7z" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D66C121741 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=R2TokF3G1TsRd5r9XPKGTg67lOjlUgJGql56tWbn318=; b=zttoLH7zkkZ+n85e5fHG1uHf6 r3Gd/NScnpHbt4bnYu3D7Dk3SF43leWMpqP6ldnHAAilu0Lymg9BpfsP6o0ls9PNKfTPNSeNJKq1v HbWzMIsQl9DoVKU1EgsT1jVbOvemcnJYNkogesBaxscyqCxHw40rcAU8xs/e7NZpJ8NU9agxE2Z7F N8S9mfD6VGAHEE8PoBppKUQ+C35IILJU2eeUV2lRFZd7juBJvu9YVGDi38NPN5rfWhtCCds8lTyoA wOAnh1tWlCHMMEdku/8cGQ7H8f2Jf8qqRiD6maRSgYc9dgTyWkipF/eFkmfUMY/HeKL9OvOO/C/1g uQbSViTkg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLq33-0003Td-Nb; Fri, 25 Sep 2020 15:54:13 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLq2b-0003Lw-Lg for linux-arm-kernel@lists.infradead.org; Fri, 25 Sep 2020 15:53:47 +0000 Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kLq2S-0000oR-Kl; Fri, 25 Sep 2020 17:53:36 +0200 Received: from mfe by dude02.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1kLq2Q-0008QF-TQ; Fri, 25 Sep 2020 17:53:34 +0200 From: Marco Felsch To: thierry.reding@gmail.com, u.kleine-koenig@pengutronix.de, lee.jones@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, Anson.Huang@nxp.com, michal.vokac@ysoft.com, l.majewski@majess.pl Subject: [PATCH v2 2/5] pwm: imx27: move constant PWMCR register values into probe Date: Fri, 25 Sep 2020 17:53:27 +0200 Message-Id: <20200925155330.32301-3-m.felsch@pengutronix.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200925155330.32301-1-m.felsch@pengutronix.de> References: <20200925155330.32301-1-m.felsch@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28 X-SA-Exim-Mail-From: mfe@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200925_115345_794250_7BD1872D X-CRM114-Status: GOOD ( 17.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-pwm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The STOPEN, DOZEN, WAITEN, DBGEN and the CLKSRC bit values never change. So it should be safe to move this bit settings into probe() and change only the necessary bits during apply(). Therefore I added the pwm_imx27_update_bits() helper. Signed-off-by: Marco Felsch --- v2: - drop software reset from the logic - fix setting STOPEN, DOZEN, WAITEN and DBGEN bits in case the pwm is already enabled drivers/pwm/pwm-imx27.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c index 7edac4ac6395..b761764b8375 100644 --- a/drivers/pwm/pwm-imx27.c +++ b/drivers/pwm/pwm-imx27.c @@ -96,6 +96,16 @@ struct pwm_imx27_chip { #define to_pwm_imx27_chip(chip) container_of(chip, struct pwm_imx27_chip, chip) +static void pwm_imx27_update_bits(void __iomem *reg, u32 mask, u32 val) +{ + u32 tmp; + + tmp = readl(reg); + tmp &= ~mask; + tmp |= val & mask; + return writel(tmp, reg); +} + static int pwm_imx27_clk_prepare_enable(struct pwm_imx27_chip *imx) { int ret; @@ -221,7 +231,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm, unsigned long long c; unsigned long long clkrate; int ret; - u32 cr; + u32 cr, mask; ret = pwm_imx27_clk_prepare_enable(imx); if (ret) @@ -267,10 +277,7 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm, */ imx->duty_cycle = duty_cycles; - cr = MX3_PWMCR_PRESCALER_SET(prescale) | - MX3_PWMCR_STOPEN | MX3_PWMCR_DOZEN | MX3_PWMCR_WAITEN | - FIELD_PREP(MX3_PWMCR_CLKSRC, MX3_PWMCR_CLKSRC_IPG_HIGH) | - MX3_PWMCR_DBGEN; + cr = MX3_PWMCR_PRESCALER_SET(prescale); if (state->polarity == PWM_POLARITY_INVERSED) cr |= FIELD_PREP(MX3_PWMCR_POUTC, @@ -279,7 +286,9 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm, if (state->enabled) cr |= MX3_PWMCR_EN; - writel(cr, imx->mmio_base + MX3_PWMCR); + mask = MX3_PWMCR_PRESCALER | MX3_PWMCR_POUTC | MX3_PWMCR_EN; + + pwm_imx27_update_bits(imx->mmio_base + MX3_PWMCR, mask, cr); if (imx->enabled != state->enabled) { if (state->enabled) { @@ -314,7 +323,7 @@ static int pwm_imx27_probe(struct platform_device *pdev) { struct pwm_imx27_chip *imx; int ret; - u32 pwmcr; + u32 pwmcr, mask; imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL); if (imx == NULL) @@ -361,10 +370,20 @@ static int pwm_imx27_probe(struct platform_device *pdev) if (ret) return ret; - /* keep clks on if pwm is running */ + mask = MX3_PWMCR_STOPEN | MX3_PWMCR_DOZEN | MX3_PWMCR_WAITEN | + MX3_PWMCR_DBGEN; + pwmcr = MX3_PWMCR_STOPEN | MX3_PWMCR_DOZEN | MX3_PWMCR_WAITEN | + MX3_PWMCR_DBGEN; + pwm_imx27_update_bits(imx->mmio_base + MX3_PWMCR, mask, pwmcr); + + /* keep clks on and clk settings unchanged if pwm is running */ pwmcr = readl(imx->mmio_base + MX3_PWMCR); - if (!(pwmcr & MX3_PWMCR_EN)) + if (!(pwmcr & MX3_PWMCR_EN)) { + mask = MX3_PWMCR_CLKSRC; + pwmcr = FIELD_PREP(MX3_PWMCR_CLKSRC, MX3_PWMCR_CLKSRC_IPG_HIGH); + pwm_imx27_update_bits(imx->mmio_base + MX3_PWMCR, mask, pwmcr); pwm_imx27_clk_disable_unprepare(imx); + } return pwmchip_add(&imx->chip); } -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel