From patchwork Sat Jan 18 23:48:45 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 3509181 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E9F3EC02DC for ; Sun, 19 Jan 2014 11:39:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 269882011E for ; Sun, 19 Jan 2014 11:39:16 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 16F5B2011B for ; Sun, 19 Jan 2014 11:39:15 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1W4qhT-00045X-SC; Sun, 19 Jan 2014 11:38:00 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1W4qhG-000830-T7; Sun, 19 Jan 2014 11:37:46 +0000 Received: from mx1.redhat.com ([209.132.183.28]) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1W4fdr-0003JQ-Ty for linux-arm-kernel@lists.infradead.org; Sat, 18 Jan 2014 23:49:34 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s0INn7aN018834 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 18 Jan 2014 18:49:07 -0500 Received: from shalem.localdomain.com (vpn1-4-230.ams2.redhat.com [10.36.4.230]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s0INmuke020501; Sat, 18 Jan 2014 18:49:04 -0500 From: Hans de Goede To: Tejun Heo Subject: [RFC v3 03/13] ahci-platform: Fix clk enable/disable unbalance on suspend/resume Date: Sun, 19 Jan 2014 00:48:45 +0100 Message-Id: <1390088935-7193-4-git-send-email-hdegoede@redhat.com> In-Reply-To: <1390088935-7193-1-git-send-email-hdegoede@redhat.com> References: <1390088935-7193-1-git-send-email-hdegoede@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Bad-Reply: References and In-Reply-To but no 'Re:' in Subject. X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140118_184932_265153_E0E778A7 X-CRM114-Status: GOOD ( 15.36 ) X-Spam-Score: -7.3 (-------) X-Mailman-Approved-At: Sun, 19 Jan 2014 06:37:13 -0500 Cc: devicetree , Hans de Goede , linux-ide@vger.kernel.org, Oliver Schinagl , Richard Zhu , linux-sunxi@googlegroups.com, Maxime Ripard , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP For devices where ahci_platform_data provides suspend() there is an unbalance in clk enable/disable calls. The suspend path does not disable the clk, but the resume path enables it. This commit fixes it by always disabling the clk in the suspend path independent of there being an ahci_platform_data suspend method. On all drivers currently using a suspend method, the suspend method always succeeds, so change its return type to void, to avoid having the introduce somewhat complex error handling paths. The disabling of the clock on suspend is a functional change, to ensure this is ok I've audited all drivers using ahci_platform_data: arch/arm/mach-davinci/devices-da8xx.c: Does not use a suspend method arch/arm/mach-spear/spear1340.c: Does not use the clock framework drivers/ata/ahci_imx.c: Does have suspend and resume pdata methods, these disable / enable another clock, so likely it is ok to disable / enable the clock at of-node index 0 as well, I've ordered a wandboard to be able to test these changes. Signed-off-by: Hans de Goede --- arch/arm/mach-spear/spear1340.c | 6 ++---- drivers/ata/ahci_imx.c | 4 +--- drivers/ata/ahci_platform.c | 2 +- include/linux/ahci_platform.h | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-spear/spear1340.c b/arch/arm/mach-spear/spear1340.c index 3fb6834..c4cbbd2 100644 --- a/arch/arm/mach-spear/spear1340.c +++ b/arch/arm/mach-spear/spear1340.c @@ -107,14 +107,12 @@ void sata_miphy_exit(struct device *dev) msleep(20); } -int sata_suspend(struct device *dev) +void sata_suspend(struct device *dev) { if (dev->power.power_state.event == PM_EVENT_FREEZE) - return 0; + return; sata_miphy_exit(dev); - - return 0; } int sata_resume(struct device *dev) diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c index 3e23e99..30568d3 100644 --- a/drivers/ata/ahci_imx.c +++ b/drivers/ata/ahci_imx.c @@ -171,7 +171,7 @@ static void imx6q_sata_exit(struct device *dev) clk_disable_unprepare(imxpriv->sata_ref_clk); } -static int imx_ahci_suspend(struct device *dev) +static void imx_ahci_suspend(struct device *dev) { struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent); @@ -185,8 +185,6 @@ static int imx_ahci_suspend(struct device *dev) !IMX6Q_GPR13_SATA_MPLL_CLK_EN); clk_disable_unprepare(imxpriv->sata_ref_clk); } - - return 0; } static int imx_ahci_resume(struct device *dev) diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c index 4b231ba..dc1ef73 100644 --- a/drivers/ata/ahci_platform.c +++ b/drivers/ata/ahci_platform.c @@ -275,7 +275,7 @@ static int ahci_suspend(struct device *dev) return rc; if (pdata && pdata->suspend) - return pdata->suspend(dev); + pdata->suspend(dev); if (!IS_ERR(hpriv->clk)) clk_disable_unprepare(hpriv->clk); diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h index 73a2500..a641cb6 100644 --- a/include/linux/ahci_platform.h +++ b/include/linux/ahci_platform.h @@ -23,7 +23,7 @@ struct ata_port_info; struct ahci_platform_data { int (*init)(struct device *dev, void __iomem *addr); void (*exit)(struct device *dev); - int (*suspend)(struct device *dev); + void (*suspend)(struct device *dev); int (*resume)(struct device *dev); const struct ata_port_info *ata_port_info; unsigned int force_port_map;