From patchwork Mon Oct 14 07:21:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 3034551 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 69DD19F2B7 for ; Mon, 14 Oct 2013 07:21:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A03CC20253 for ; Mon, 14 Oct 2013 07:21:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0891420237 for ; Mon, 14 Oct 2013 07:21:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752074Ab3JNHVO (ORCPT ); Mon, 14 Oct 2013 03:21:14 -0400 Received: from mail-la0-f54.google.com ([209.85.215.54]:49782 "EHLO mail-la0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752094Ab3JNHVM (ORCPT ); Mon, 14 Oct 2013 03:21:12 -0400 Received: by mail-la0-f54.google.com with SMTP id ea20so5356437lab.13 for ; Mon, 14 Oct 2013 00:21:11 -0700 (PDT) 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=2AgGiJnayytr7PeRmZTDkTbqdeIWb+VGUhTeUGLHus0=; b=BvVOB/CvfN+XrFnkWOsgRwS49vSJb7UXc0QmNFSvKsA58xTnl62ib/16CYE2c/qUhj LVReaKKBWhNE+LBG34mFrZbUDVM+PpW/btCTfR9b5DIXmOpgP/90ahtVj4A6M/8B9t4B tddvbDyEc0KGERvPJFwhmmvShnbSqEAGS4Y1JEqqk+yUehE/b3oxRSXNN4EsJ6y0TaaA 1Xh6+ymfHAo1pyve0AGxiAQiDUQmTrjshZhz09GFlNA23EzwrQiCgnCRoM3U2RV7NPAW oMbcmon1YEo7Sx3J0NLuFKLL168F+cejt/KgbYJlbNx8SE8aAMZvqs1SZ75hR2hPM0h+ XvIA== X-Gm-Message-State: ALoCoQkp4vBCCp/OLPdlJXQXezbjYP4G/jchsijpwiABu+hh1PAMmHeMhcZWr0csw95xS5To6Bph X-Received: by 10.152.180.139 with SMTP id do11mr19635559lac.23.1381735270905; Mon, 14 Oct 2013 00:21:10 -0700 (PDT) Received: from linaro-ulf.lan (90-231-160-185-no158.tbcn.telia.com. [90.231.160.185]) by mx.google.com with ESMTPSA id oc1sm42851429lbb.3.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Oct 2013 00:21:09 -0700 (PDT) From: Ulf Hansson To: "Rafael J. Wysocki" , Len Brown , Pavel Machek , linux-pm@vger.kernel.org Cc: Ulf Hansson , Alan Stern , Mika Westerberg , Kevin Hilman , Rob Landley , Chris Ball , linux-mmc@vger.kernel.org Subject: [PATCH V2] PM / Runtime: Respect autosuspend when idle triggers suspend Date: Mon, 14 Oct 2013 09:21:04 +0200 Message-Id: <1381735264-3077-1-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_HI, 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 which don't have a .runtime_idle callback or if it returns 0, rpm_idle will end up in triggering a call to rpm_suspend, thus trying to carry out a runtime_suspend directly from runtime_idle. In the above situation we want to respect devices which has enabled autosuspend, we therfore append the flag sent to rpm_suspend with RPM_AUTO. Do note that driver's still needs to update the device last busy mark, to control the delay for this circumstance. Updated runtime PM documentation accordingly. Cc: Alan Stern Cc: Mika Westerberg Cc: Kevin Hilman Cc: Rob Landley Cc: Chris Ball Cc: linux-mmc@vger.kernel.org Signed-off-by: Ulf Hansson Acked-by: Kevin Hilman --- Documentation/power/runtime_pm.txt | 13 +++++++------ drivers/base/power/runtime.c | 6 ++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 71d8fe4..236d9f4 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt @@ -145,11 +145,12 @@ The action performed by the idle callback is totally dependent on the subsystem if the device can be suspended (i.e. if all of the conditions necessary for suspending the device are satisfied) and to queue up a suspend request for the device in that case. If there is no idle callback, or if the callback returns -0, then the PM core will attempt to carry out a runtime suspend of the device; -in essence, it will call pm_runtime_suspend() directly. To prevent this (for -example, if the callback routine has started a delayed suspend), the routine -should return a non-zero value. Negative error return codes are ignored by the -PM core. +0, then the PM core will attempt to carry out a runtime suspend of the device, +also respecting devices configured for autosuspend. In essence it means a call +to pm_runtime_autosuspend(). Do note that driver's still needs to update the +device last busy mark (pm_runtime_mark_last_busy), to control the delay under +this circumstance. To prevent this, the routine must return a non-zero value. +Negative error return codes are ignored by the PM core. The helper functions provided by the PM core, described in Section 4, guarantee that the following constraints are met with respect to runtime PM callbacks for @@ -308,7 +309,7 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: - execute the subsystem-level idle callback for the device; returns an error code on failure, where -EINPROGRESS means that ->runtime_idle() is already being executed; if there is no callback or the callback returns 0 - then run pm_runtime_suspend(dev) and return its result + then run pm_runtime_autosuspend(dev) and return its result int pm_runtime_suspend(struct device *dev); - execute the subsystem-level suspend callback for the device; returns 0 on diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 268a350..e6867d4 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -258,7 +258,9 @@ static int __rpm_callback(int (*cb)(struct device *), struct device *dev) * Check if the device's runtime PM status allows it to be suspended. If * another idle notification has been started earlier, return immediately. If * the RPM_ASYNC flag is set then queue an idle-notification request; otherwise - * run the ->runtime_idle() callback directly. + * run the ->runtime_idle() callback directly. If the ->runtime_idle callback + * doesn't exist or if it returns 0, run rpm_suspend with RPM_AUTO flag to + * respect drivers using autosuspend. * * This function must be called under dev->power.lock with interrupts disabled. */ @@ -331,7 +333,7 @@ static int rpm_idle(struct device *dev, int rpmflags) out: trace_rpm_return_int(dev, _THIS_IP_, retval); - return retval ? retval : rpm_suspend(dev, rpmflags); + return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO); } /**