From patchwork Tue Oct 15 20:25:08 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 21045 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f200.google.com (mail-ie0-f200.google.com [209.85.223.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 6993A20D9F for ; Tue, 15 Oct 2013 20:25:18 +0000 (UTC) Received: by mail-ie0-f200.google.com with SMTP id aq17sf11416151iec.3 for ; Tue, 15 Oct 2013 13:25:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:x-gm-message-state:delivered-to:from:to:cc:subject :date:message-id:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-unsubscribe; bh=SrXCTwtrKCV//2p6l8eT/oRGzggJ7I516qg34qXR5Hw=; b=cFKiHhH5KWFIOtFRaOL4xlFacSmANZMobvc9atEvLPSE40zQzMLMIRc6+hqcDJ+0vC vQ+G+iOP1YCQ0Glc/KPK4oaO/sQcsgaXSkf29Y30A2ix0iB0vJhiM1/+/YoEO6zjMnk7 U3Szqiggb5E3Bhi5HP3n57FWn2cy4Py4NtV/hQOMmawm65cY1ZSEd3U5gR2GH/kiWSRo IzqFYkPUTxvylNzyI6WK21DwYch+qKkrQzfi/K9EtAt1WU4+ydUw21Znx1GIqG48dE39 UQ++liOb0oh2CBTnubmmSI1pUSuvlVwnm1trU6NcITqQPOaCIzieclTbBnWfUdl25O76 87qA== X-Received: by 10.43.44.6 with SMTP id ue6mr16396545icb.11.1381868717595; Tue, 15 Oct 2013 13:25:17 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.49.133.100 with SMTP id pb4ls272488qeb.44.gmail; Tue, 15 Oct 2013 13:25:17 -0700 (PDT) X-Received: by 10.52.32.37 with SMTP id f5mr34248696vdi.17.1381868717041; Tue, 15 Oct 2013 13:25:17 -0700 (PDT) Received: from mail-ve0-f176.google.com (mail-ve0-f176.google.com [209.85.128.176]) by mx.google.com with ESMTPS id m10si1256438vcy.18.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 15 Oct 2013 13:25:16 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.128.176 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.128.176; Received: by mail-ve0-f176.google.com with SMTP id jz11so969087veb.7 for ; Tue, 15 Oct 2013 13:25:16 -0700 (PDT) X-Gm-Message-State: ALoCoQmnpRY4EwfD0bnNpFkfSx+bjySgUFw5hFfRI860NV5lJTQEtMK7nw2WDn4z6vhE2vuvtcwu X-Received: by 10.58.254.200 with SMTP id ak8mr13850873ved.12.1381868716516; Tue, 15 Oct 2013 13:25:16 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.174.196 with SMTP id u4csp326197vcz; Tue, 15 Oct 2013 13:25:15 -0700 (PDT) X-Received: by 10.152.22.131 with SMTP id d3mr3486544laf.35.1381868714711; Tue, 15 Oct 2013 13:25:14 -0700 (PDT) Received: from mail-la0-f43.google.com (mail-la0-f43.google.com [209.85.215.43]) by mx.google.com with ESMTPS id jk7si32268547lbc.85.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 15 Oct 2013 13:25:14 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.215.43 is neither permitted nor denied by best guess record for domain of ulf.hansson@linaro.org) client-ip=209.85.215.43; Received: by mail-la0-f43.google.com with SMTP id ec20so1158224lab.16 for ; Tue, 15 Oct 2013 13:25:14 -0700 (PDT) X-Received: by 10.152.9.36 with SMTP id w4mr3777728laa.34.1381868714112; Tue, 15 Oct 2013 13:25:14 -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 vx8sm48620980lbb.8.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 15 Oct 2013 13:25:13 -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 V3] PM / Runtime: Respect autosuspend when idle triggers suspend Date: Tue, 15 Oct 2013 22:25:08 +0200 Message-Id: <1381868708-4792-1-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.7.9.5 X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: ulf.hansson@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.128.176 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , 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 drivers 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 | 14 ++++++++------ drivers/base/power/runtime.c | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 71d8fe4..0f54333 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt @@ -145,11 +145,13 @@ 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 this means a +call to pm_runtime_autosuspend() (do note that drivers needs to update the +device last busy mark, pm_runtime_mark_last_busy(), to control the delay under +this circumstance). To prevent this (for example, if the callback routine has +started a delayed suspend), 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 +310,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..72e00e6 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -258,7 +258,8 @@ 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, call rpm_suspend with the RPM_AUTO flag. * * This function must be called under dev->power.lock with interrupts disabled. */ @@ -331,7 +332,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); } /**