From patchwork Wed Feb 19 14:33:38 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 3681391 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 52913BF13A for ; Wed, 19 Feb 2014 14:35:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6FBB320166 for ; Wed, 19 Feb 2014 14:35:33 +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 276DD20115 for ; Wed, 19 Feb 2014 14:35:32 +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 1WG8EQ-0006W9-Cy; Wed, 19 Feb 2014 14:34:39 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1WG8E5-0002jt-9U; Wed, 19 Feb 2014 14:34:17 +0000 Received: from mail-lb0-f169.google.com ([209.85.217.169]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WG8E2-0002iA-Kq for linux-arm-kernel@lists.infradead.org; Wed, 19 Feb 2014 14:34:15 +0000 Received: by mail-lb0-f169.google.com with SMTP id q8so349716lbi.0 for ; Wed, 19 Feb 2014 06:33:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=EUoaVoZCu9r6vME2MsolcWV0Td/a0B+6/BRAMaxd/wA=; b=FA6es0+34WP9S7RbOIgB2CVBUgPZ++bscg/L0nmNj0IEWg3xS7T6DNLgMygVDIomrw SiZJzUiBvq/D3Bl5Jykm4gNURJRZBMuHlRGaUYqGWu39s7Vfgjj0dUDlaiCakWPS716p T0fbn4VumjulsFC9zKrJ0cqPEXSxCGOKgMM7xN068cW1wUwOfg+DCb/Y/gfIIvOm2WzV 0lEJMmLG+EGfVE1HmsyBLvz6uaJrDBNvkJslmAOZZrZoej7YJGPExY3MxwHOo+k9nBUK uxQTlOq1KJBGQATbeifhV5UKFg4O0p8Jfry67XfH5QqKJK80nMcvrmDB6YTtMwjECF2l hkmA== X-Gm-Message-State: ALoCoQnh9JagkHojHok7m0ri2FD2c43L/N1AdyRW8Wd2oKetzlx4kJQDzRTQw352SGSoBpyL4Wbm X-Received: by 10.152.201.197 with SMTP id kc5mr652476lac.77.1392820432223; Wed, 19 Feb 2014 06:33:52 -0800 (PST) Received: from linaro-ulf.lan (90-231-160-185-no158.tbcn.telia.com. [90.231.160.185]) by mx.google.com with ESMTPSA id y2sm529715lal.10.2014.02.19.06.33.50 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 19 Feb 2014 06:33:51 -0800 (PST) From: Ulf Hansson To: Mark Brown , linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org Subject: [PATCH V2 07/17] spi: pl022: Don't ignore power domain and amba bus at system suspend Date: Wed, 19 Feb 2014 15:33:38 +0100 Message-Id: <1392820418-6972-1-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140219_093414_823916_43A6F6E2 X-CRM114-Status: GOOD ( 18.73 ) X-Spam-Score: -2.6 (--) Cc: Linus Walleij , Russell King , Ulf Hansson , linux-arm-kernel@lists.infradead.org, Wolfram Sang 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.8 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 Due to the available runtime PM callbacks for CONFIG_PM, we are now able to put the device into complete low power state at system suspend. Previously only the resources controlled by the driver were put into low power state at system suspend. Both the amba bus and a potential power domain were ignored, which now isn't the case any more. Moreover, putting the device into low power state couldn't be done without first bringing it back to full power. This constraint don't exists any more. Cc: Mark Brown Signed-off-by: Ulf Hansson --- Changes in v2: Rebased on top of latest spi-pl022 patches. Note, currently this patch shall not be applied since first we want to sort out the result from another patch to the PM core. http://marc.info/?l=linux-pm&m=139228211505423&w=2 --- drivers/spi/spi-pl022.c | 74 +++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 6dfcabf..7b016a2 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c @@ -2277,35 +2277,7 @@ pl022_remove(struct amba_device *adev) return 0; } -#ifdef CONFIG_PM -/* - * These two functions are used from both suspend/resume and - * the runtime counterparts to handle external resources like - * clocks, pins and regulators when going to sleep. - */ -static void pl022_suspend_resources(struct pl022 *pl022, bool runtime) -{ - clk_disable_unprepare(pl022->clk); - - if (runtime) - pinctrl_pm_select_idle_state(&pl022->adev->dev); - else - pinctrl_pm_select_sleep_state(&pl022->adev->dev); -} - -static void pl022_resume_resources(struct pl022 *pl022, bool runtime) -{ - /* First go to the default state */ - pinctrl_pm_select_default_state(&pl022->adev->dev); - if (!runtime) - /* Then let's idle the pins until the next transfer happens */ - pinctrl_pm_select_idle_state(&pl022->adev->dev); - - clk_prepare_enable(pl022->clk); -} -#endif - -#ifdef CONFIG_SUSPEND +#ifdef CONFIG_PM_SLEEP static int pl022_suspend(struct device *dev) { struct pl022 *pl022 = dev_get_drvdata(dev); @@ -2317,8 +2289,23 @@ static int pl022_suspend(struct device *dev) return ret; } - pm_runtime_get_sync(dev); - pl022_suspend_resources(pl022, false); + pm_runtime_disable(dev); + + if (!pm_runtime_status_suspended(dev)) { + if (dev->pm_domain && dev->pm_domain->ops.runtime_suspend) + ret = dev->pm_domain->ops.runtime_suspend(dev); + else + ret = dev->bus->pm->runtime_suspend(dev); + + if (ret) { + pm_runtime_enable(dev); + return ret; + } + + pm_runtime_set_suspended(dev); + } + + pinctrl_pm_select_sleep_state(dev); dev_dbg(dev, "suspended\n"); return 0; @@ -2327,10 +2314,19 @@ static int pl022_suspend(struct device *dev) static int pl022_resume(struct device *dev) { struct pl022 *pl022 = dev_get_drvdata(dev); - int ret; + int ret = 0; - pl022_resume_resources(pl022, false); - pm_runtime_put(dev); + if (dev->pm_domain && dev->pm_domain->ops.runtime_resume) + ret = dev->pm_domain->ops.runtime_resume(dev); + else + ret = dev->bus->pm->runtime_resume(dev); + + if (ret) + dev_err(dev, "problem resuming\n"); + else + pm_runtime_set_active(dev); + + pm_runtime_enable(dev); /* Start the queue running */ ret = spi_master_resume(pl022->master); @@ -2341,14 +2337,16 @@ static int pl022_resume(struct device *dev) return ret; } -#endif /* CONFIG_PM */ +#endif #ifdef CONFIG_PM static int pl022_runtime_suspend(struct device *dev) { struct pl022 *pl022 = dev_get_drvdata(dev); - pl022_suspend_resources(pl022, true); + clk_disable(pl022->clk); + pinctrl_pm_select_idle_state(dev); + return 0; } @@ -2356,7 +2354,9 @@ static int pl022_runtime_resume(struct device *dev) { struct pl022 *pl022 = dev_get_drvdata(dev); - pl022_resume_resources(pl022, true); + pinctrl_pm_select_default_state(dev); + clk_enable(pl022->clk); + return 0; } #endif