From patchwork Mon May 30 09:33:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 9140791 X-Patchwork-Delegate: rjw@sisk.pl Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 91AFA60759 for ; Mon, 30 May 2016 09:33:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8210F281B4 for ; Mon, 30 May 2016 09:33:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 76E8728212; Mon, 30 May 2016 09:33:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 15A88281B4 for ; Mon, 30 May 2016 09:33:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932332AbcE3Jdb (ORCPT ); Mon, 30 May 2016 05:33:31 -0400 Received: from mail-lf0-f48.google.com ([209.85.215.48]:34644 "EHLO mail-lf0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932219AbcE3Jdb (ORCPT ); Mon, 30 May 2016 05:33:31 -0400 Received: by mail-lf0-f48.google.com with SMTP id k98so69927876lfi.1 for ; Mon, 30 May 2016 02:33:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mswl0DbSdaOm5jNUFSeYHYtOM3qInj0Du95f6i7TOSg=; b=XeDwdQWHLPyj8iPs3QfUnk9/B9A7ZVE3OcXB+EqdJEsBIkGsiHDYpnu5uJySYY4bqh XZDnXrzhm6iPGCLpgLgJ7qhg2Myla4xN/RpHYf1nFfrHxc15cLbwwTh4hW6W7ucad9QS 5CMy/aU74DHHGR97AqtzZIKXCviqQzDTQL5T4= 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:in-reply-to :references; bh=mswl0DbSdaOm5jNUFSeYHYtOM3qInj0Du95f6i7TOSg=; b=aTy54HE8kq/thuWmDCB6YW2lFDT0dkyy9tdZbhYtwNUbOfeT64tLjY+26aseBLfCPw zCde7GAiHBnhNBaC5hUXJ5LlYKckLK3LdiqJzqsxbEIAYKfXAUtoxtzKRRt/JQXAJBKq X0d266Fy076od65lC2j0/U6pyz16ZQBBy/qlug9y0BpC7rgfY1P+7OK6H8vRaSHcGnbk UntwhCGqXQri7SRQ1tXc+y8s/B+xIb98oUZpsEQiBiH8AM3jfsEOdKkmRXXn9xg26LlZ rFfLvtxHls4PgvufnTb6XL2etR200ZcYyECr7jPkB6ayxylThXm2o7++KN00LIDUB2cG HTYg== X-Gm-Message-State: ALyK8tKoMSwyPL5hoA3ImKRDmyPdovkHtX1Qu6CHclzgkXK+7FgFuWqcxTK/Gdv4exjOpGpp X-Received: by 10.25.29.138 with SMTP id d132mr8254149lfd.142.1464600809231; Mon, 30 May 2016 02:33:29 -0700 (PDT) Received: from uffe-Latitude-E6430s.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id 75sm4596853lfw.25.2016.05.30.02.33.27 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 30 May 2016 02:33:28 -0700 (PDT) From: Ulf Hansson To: "Rafael J. Wysocki" , Kevin Hilman , Ulf Hansson , linux-pm@vger.kernel.org Cc: Len Brown , Pavel Machek , Geert Uytterhoeven , Lina Iyer , Axel Haslam , Marek Szyprowski , Jon Hunter , Andy Gross , Laurent Pinchart Subject: [PATCH v2 4/5] PM / Domains: Stop/start devices during system PM suspend/resume in genpd Date: Mon, 30 May 2016 11:33:14 +0200 Message-Id: <1464600795-26307-5-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1464600795-26307-1-git-send-email-ulf.hansson@linaro.org> References: <1464600795-26307-1-git-send-email-ulf.hansson@linaro.org> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Not all subsystems/drivers that manages devices attached to a genpd, makes use of the pm_runtime_force_suspend|resume() helper functions to deal with system PM suspend/resume. In cases like these and when genpd's ->stop|start() callbacks are being used for the device, invoke the pm_runtime_force_suspend|resume() helper functions from genpd's "noirq" system PM callbacks. In this way we make sure to "stop" the device on suspend and to "start" it on resume. Signed-off-by: Ulf Hansson Reviewed-by: Kevin Hilman --- Changes in v2: - New patch. Implements the second part of the earlier version of [PATCH 3/4] PM / Domains: Allow runtime PM during system PM phases --- drivers/base/power/domain.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 4cb57f3..9193aac 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -761,6 +761,7 @@ static int pm_genpd_prepare(struct device *dev) static int pm_genpd_suspend_noirq(struct device *dev) { struct generic_pm_domain *genpd; + int ret; dev_dbg(dev, "%s()\n", __func__); @@ -771,6 +772,12 @@ static int pm_genpd_suspend_noirq(struct device *dev) if (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev)) return 0; + if (genpd->dev_ops.stop && genpd->dev_ops.start) { + ret = pm_runtime_force_suspend(dev); + if (ret) + return ret; + } + /* * Since all of the "noirq" callbacks are executed sequentially, it is * guaranteed that this function will never run twice in parallel for @@ -791,6 +798,7 @@ static int pm_genpd_suspend_noirq(struct device *dev) static int pm_genpd_resume_noirq(struct device *dev) { struct generic_pm_domain *genpd; + int ret = 0; dev_dbg(dev, "%s()\n", __func__); @@ -809,7 +817,10 @@ static int pm_genpd_resume_noirq(struct device *dev) pm_genpd_sync_poweron(genpd, true); genpd->suspended_count--; - return 0; + if (genpd->dev_ops.stop && genpd->dev_ops.start) + ret = pm_runtime_force_resume(dev); + + return ret; } /** @@ -824,6 +835,7 @@ static int pm_genpd_resume_noirq(struct device *dev) static int pm_genpd_freeze_noirq(struct device *dev) { struct generic_pm_domain *genpd; + int ret = 0; dev_dbg(dev, "%s()\n", __func__); @@ -831,7 +843,10 @@ static int pm_genpd_freeze_noirq(struct device *dev) if (IS_ERR(genpd)) return -EINVAL; - return 0; + if (genpd->dev_ops.stop && genpd->dev_ops.start) + ret = pm_runtime_force_suspend(dev); + + return ret; } /** @@ -844,6 +859,7 @@ static int pm_genpd_freeze_noirq(struct device *dev) static int pm_genpd_thaw_noirq(struct device *dev) { struct generic_pm_domain *genpd; + int ret = 0; dev_dbg(dev, "%s()\n", __func__); @@ -851,7 +867,10 @@ static int pm_genpd_thaw_noirq(struct device *dev) if (IS_ERR(genpd)) return -EINVAL; - return 0; + if (genpd->dev_ops.stop && genpd->dev_ops.start) + ret = pm_runtime_force_resume(dev); + + return ret; } /** @@ -864,6 +883,7 @@ static int pm_genpd_thaw_noirq(struct device *dev) static int pm_genpd_restore_noirq(struct device *dev) { struct generic_pm_domain *genpd; + int ret = 0; dev_dbg(dev, "%s()\n", __func__); @@ -889,7 +909,10 @@ static int pm_genpd_restore_noirq(struct device *dev) pm_genpd_sync_poweron(genpd, true); - return 0; + if (genpd->dev_ops.stop && genpd->dev_ops.start) + ret = pm_runtime_force_resume(dev); + + return ret; } /**