Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp5717380ybl; Tue, 14 Jan 2020 13:49:42 -0800 (PST) X-Google-Smtp-Source: APXvYqyysdu57rrarAlyvs/iHscJ4QTmpm9+u99d4W0pByX25RNQLSPhxpe2dvrd76bN8uncUlOj X-Received: by 2002:a9d:53cb:: with SMTP id i11mr386111oth.158.1579038582095; Tue, 14 Jan 2020 13:49:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579038582; cv=none; d=google.com; s=arc-20160816; b=hDqTNQyX8R9wE3e7wO2f0gtgU6e5nWccSncPuMRTJWoMUiyVeY7KCrtkQN7asAS+5D b4v63sa4YII5K9Z+4MMCoLQdElOkp+yuPHfvpum4PRsq0UOfY1KBNm1MxTDsw6nJFOld GkY0/npfMPMw45flgH64E8KbT35f+czOS1zsajwz2LbW7AxZb/NQrS7mK2sIyyoJUgNh 5StzK45LC7Gcv3V0b6tnIC7eAwXo07Di+JrMrYAc10lzS59KPPAiqJSmUuzHYW1xJ3tb 9fu0OwWbturUvtmMHaGy7X0eZJyw0PxX7B0nPi0ipBVoupjZJYSf5Eq8hBMaClrOmYqe SYAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=ykR3kcJNgxgI3HqlgJTB8bvxvMbHlzRHa3NkDo3wHrA=; b=iKDDqVPCSX9k7t7AjagS2XWD5Md2VKklZCBXRWT489kRMnJ6sPVheamU9TgelvPzmi 4CWpXolR6WbvOJDIwemj87IQDO6zJ9y3d9RGCtIRUEp9N7qmVFR6myKvn1uqe2lcI8yy wW4eLjVs0xSdwGEk7pzBmsMO5u2so47ZIWZocx+3nFRy7/MMpmmGwQRvAaCp94FCnm9p 7rQZOlLUz2l1qdmVyZV0k4NgwbrOfc0TWPXptx3bOYCeO9pHC8eVEOdVIxNOk/D/1bNZ 03RtfeFz+0NsolcnN339n48EtdgpX2guhiBYv9tqHBbPU1Db1azggVQNLun843tNS3h0 s67Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z25si7310729oic.23.2020.01.14.13.49.29; Tue, 14 Jan 2020 13:49:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728925AbgANVsc (ORCPT + 99 others); Tue, 14 Jan 2020 16:48:32 -0500 Received: from inva021.nxp.com ([92.121.34.21]:54948 "EHLO inva021.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728890AbgANVs2 (ORCPT ); Tue, 14 Jan 2020 16:48:28 -0500 Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 3BB9A2004FC; Tue, 14 Jan 2020 22:48:26 +0100 (CET) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 102542000EA; Tue, 14 Jan 2020 22:48:20 +0100 (CET) Received: from localhost.localdomain (shlinux2.ap.freescale.net [10.192.224.44]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 90B72402AF; Wed, 15 Jan 2020 05:48:12 +0800 (SGT) From: Han Xu To: vkoul@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, esben@geanix.com, boris.brezillon@collabora.com Cc: festevam@gmail.com, linux-imx@nxp.com, dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, han.xu@nxp.com, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/6] mtd: rawnand: gpmi: refine the runtime pm ops Date: Wed, 15 Jan 2020 05:44:02 +0800 Message-Id: <1579038243-28550-6-git-send-email-han.xu@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1579038243-28550-1-git-send-email-han.xu@nxp.com> References: <1579038243-28550-1-git-send-email-han.xu@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org several changes for runtime code in gpmi-nand driver - Always invoke runtime get/put in same function to balance the usage counter. - leverage the runtime pm for system pm, move acquire dma to runtime pm to acquire dma only when needed. - add pm_runtime_dont_use_autosuspend in err path. If driver failed to probe before runtime pm timeout, such as NAND not mounted in socket, runtime suspend won't be called without the change. Signed-off-by: Han Xu --- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 56 +++++++++++----------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index fcc7325f2a10..73644c96fa9b 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -183,7 +183,6 @@ static int gpmi_init(struct gpmi_nand_data *this) */ writel(BM_GPMI_CTRL1_DECOUPLE_CS, r->gpmi_regs + HW_GPMI_CTRL1_SET); - return 0; err_out: pm_runtime_mark_last_busy(this->dev); pm_runtime_put_autosuspend(this->dev); @@ -556,7 +555,6 @@ static int bch_set_geometry(struct gpmi_nand_data *this) /* Set *all* chip selects to use layout 0. */ writel(0, r->bch_regs + HW_BCH_LAYOUTSELECT); - ret = 0; err_out: pm_runtime_mark_last_busy(this->dev); pm_runtime_put_autosuspend(this->dev); @@ -1213,10 +1211,6 @@ static int acquire_resources(struct gpmi_nand_data *this) if (ret) goto exit_regs; - ret = acquire_dma_channels(this); - if (ret) - goto exit_regs; - ret = gpmi_get_clks(this); if (ret) goto exit_clock; @@ -2656,15 +2650,9 @@ static int gpmi_nand_probe(struct platform_device *pdev) if (ret) goto exit_acquire_resources; - ret = __gpmi_enable_clk(this, true); - if (ret) - goto exit_nfc_init; - + pm_runtime_enable(&pdev->dev); pm_runtime_set_autosuspend_delay(&pdev->dev, 500); pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_active(&pdev->dev); - pm_runtime_enable(&pdev->dev); - pm_runtime_get_sync(&pdev->dev); ret = gpmi_init(this); if (ret) @@ -2674,15 +2662,12 @@ static int gpmi_nand_probe(struct platform_device *pdev) if (ret) goto exit_nfc_init; - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); - dev_info(this->dev, "driver registered.\n"); return 0; exit_nfc_init: - pm_runtime_put(&pdev->dev); + pm_runtime_dont_use_autosuspend(&pdev->dev); pm_runtime_disable(&pdev->dev); release_resources(this); exit_acquire_resources: @@ -2694,7 +2679,6 @@ static int gpmi_nand_remove(struct platform_device *pdev) { struct gpmi_nand_data *this = platform_get_drvdata(pdev); - pm_runtime_put_sync(&pdev->dev); pm_runtime_disable(&pdev->dev); nand_release(&this->nand); @@ -2706,10 +2690,11 @@ static int gpmi_nand_remove(struct platform_device *pdev) #ifdef CONFIG_PM_SLEEP static int gpmi_pm_suspend(struct device *dev) { - struct gpmi_nand_data *this = dev_get_drvdata(dev); + int ret; - release_dma_channels(this); - return 0; + ret = pm_runtime_force_suspend(dev); + + return ret; } static int gpmi_pm_resume(struct device *dev) @@ -2717,9 +2702,11 @@ static int gpmi_pm_resume(struct device *dev) struct gpmi_nand_data *this = dev_get_drvdata(dev); int ret; - ret = acquire_dma_channels(this); - if (ret < 0) + ret = pm_runtime_force_resume(dev); + if (ret) { + dev_err(this->dev, "Error in resume %d\n", ret); return ret; + } /* re-init the GPMI registers */ ret = gpmi_init(this); @@ -2743,18 +2730,33 @@ static int gpmi_pm_resume(struct device *dev) } #endif /* CONFIG_PM_SLEEP */ -static int __maybe_unused gpmi_runtime_suspend(struct device *dev) +#define gpmi_enable_clk(x) __gpmi_enable_clk(x, true) +#define gpmi_disable_clk(x) __gpmi_enable_clk(x, false) + +static int gpmi_runtime_suspend(struct device *dev) { struct gpmi_nand_data *this = dev_get_drvdata(dev); - return __gpmi_enable_clk(this, false); + gpmi_disable_clk(this); + release_dma_channels(this); + + return 0; } -static int __maybe_unused gpmi_runtime_resume(struct device *dev) +static int gpmi_runtime_resume(struct device *dev) { struct gpmi_nand_data *this = dev_get_drvdata(dev); + int ret; - return __gpmi_enable_clk(this, true); + ret = gpmi_enable_clk(this); + if (ret) + return ret; + + ret = acquire_dma_channels(this); + if (ret < 0) + return ret; + + return 0; } static const struct dev_pm_ops gpmi_pm_ops = { -- 2.17.1