linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Linux PM list <linux-pm@vger.kernel.org>,
	ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	Aaron Lu <aaron.lu@intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Kevin Hilman <khilman@linaro.org>,
	Ulf Hansson <ulf.hansson@linaro.org>
Subject: [PATCH 3/3][update] ACPI / PM: Avoid resuming devices in ACPI PM domain during system suspend
Date: Sat, 17 May 2014 00:18:13 +0200	[thread overview]
Message-ID: <37853320.Ciz4qVIJCi@vostro.rjw.lan> (raw)
In-Reply-To: <1523744.XGJjEBjYbG@vostro.rjw.lan>

From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Subject: ACPI / PM: Avoid resuming devices in ACPI PM domain during system suspend

Rework the ACPI PM domain's PM callbacks to avoid resuming devices
during system suspend (in order to modify their wakeup settings etc.)
if that isn't necessary.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---

I sent an outdated patch previously, sorry about that.  This is what was meant
to be sent.

Thanks!

---
 drivers/acpi/device_pm.c |   43 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 36 insertions(+), 7 deletions(-)

Index: linux-pm/include/acpi/acpi_bus.h
===================================================================
--- linux-pm.orig/include/acpi/acpi_bus.h
+++ linux-pm/include/acpi/acpi_bus.h
@@ -261,7 +261,8 @@ struct acpi_device_power_flags {
 	u32 inrush_current:1;	/* Serialize Dx->D0 */
 	u32 power_removed:1;	/* Optimize Dx->D0 */
 	u32 ignore_parent:1;	/* Power is independent of parent power state */
-	u32 reserved:27;
+	u32 dsw_present:1;	/* _DSW present? */
+	u32 reserved:26;
 };
 
 struct acpi_device_power_state {
Index: linux-pm/drivers/acpi/scan.c
===================================================================
--- linux-pm.orig/drivers/acpi/scan.c
+++ linux-pm/drivers/acpi/scan.c
@@ -1551,9 +1551,13 @@ static void acpi_bus_get_power_flags(str
 	 */
 	if (acpi_has_method(device->handle, "_PSC"))
 		device->power.flags.explicit_get = 1;
+
 	if (acpi_has_method(device->handle, "_IRC"))
 		device->power.flags.inrush_current = 1;
 
+	if (acpi_has_method(device->handle, "_DSW"))
+		device->power.flags.dsw_present = 1;
+
 	/*
 	 * Enumerate supported power management states
 	 */
Index: linux-pm/drivers/acpi/device_pm.c
===================================================================
--- linux-pm.orig/drivers/acpi/device_pm.c
+++ linux-pm/drivers/acpi/device_pm.c
@@ -900,18 +900,46 @@ EXPORT_SYMBOL_GPL(acpi_dev_resume_early)
  */
 int acpi_subsys_prepare(struct device *dev)
 {
-	/*
-	 * Devices having power.ignore_children set may still be necessary for
-	 * suspending their children in the next phase of device suspend.
-	 */
-	if (dev->power.ignore_children)
-		pm_runtime_resume(dev);
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+	u32 sys_target;
+	int ret, state;
+
+	ret = pm_generic_prepare(dev);
+	if (ret < 0)
+		return ret;
+
+	if (!adev || !pm_runtime_suspended(dev)
+	    || device_may_wakeup(dev) != !!adev->wakeup.prepare_count)
+		return 0;
+
+	sys_target = acpi_target_system_state();
+	if (sys_target == ACPI_STATE_S0)
+		return 1;
+
+	if (adev->power.flags.dsw_present)
+		return 0;
 
-	return pm_generic_prepare(dev);
+	ret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);
+	return !ret && state == adev->power.state;
 }
 EXPORT_SYMBOL_GPL(acpi_subsys_prepare);
 
 /**
+ * acpi_subsys_complete - Finalize device's resume during system resume.
+ * @dev: Device to handle.
+ */
+void acpi_subsys_complete(struct device *dev)
+{
+	/*
+	 * If the device had been runtime-suspended before the system went into
+	 * the sleep state it is going out of and it has never been resumed till
+	 * now, resume it in case the firmware powered it up.
+	 */
+	if (dev->power.direct_complete)
+		pm_request_resume(dev);
+}
+
+/**
  * acpi_subsys_suspend - Run the device driver's suspend callback.
  * @dev: Device to handle.
  *
@@ -979,6 +1007,7 @@ static struct dev_pm_domain acpi_general
 #endif
 #ifdef CONFIG_PM_SLEEP
 		.prepare = acpi_subsys_prepare,
+		.complete = acpi_subsys_complete,
 		.suspend = acpi_subsys_suspend,
 		.suspend_late = acpi_subsys_suspend_late,
 		.resume_early = acpi_subsys_resume_early,


  reply	other threads:[~2014-05-16 22:01 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-13  1:02 [RFC][PATCH 0/3] PM / sleep: Avoid resuming runtime-suspended devices during system suspend Rafael J. Wysocki
2014-05-13  1:03 ` [RFC][PATCH 1/3] PM / sleep: Move runtime PM barrier invocation to device_prepare() Rafael J. Wysocki
2014-05-13  9:16   ` Ulf Hansson
2014-05-13 10:35     ` Rafael J. Wysocki
2014-05-13 10:59       ` Ulf Hansson
2014-05-13 15:07         ` Rafael J. Wysocki
2014-05-13 15:19           ` Rafael J. Wysocki
2014-05-13  1:10 ` [RFC][PATCH 2/3] PM / sleep: Mechanism to avoid resuming runtime-suspended devices unnecessarily Rafael J. Wysocki
2014-05-13  9:30   ` Ulf Hansson
2014-05-13 14:49   ` Alan Stern
2014-05-13 15:13     ` Rafael J. Wysocki
2014-05-13 15:12       ` Alan Stern
2014-05-13 15:43         ` Rafael J. Wysocki
2014-05-13 15:46           ` Alan Stern
2014-05-13 16:16             ` Rafael J. Wysocki
2014-05-13 16:19               ` Alan Stern
2014-05-13 21:29                 ` Rafael J. Wysocki
2014-05-14 14:53                   ` Alan Stern
2014-05-15 11:13                     ` Rafael J. Wysocki
2014-05-16  0:45                       ` [PATCH 0/3] (was: Re: PM / sleep: Mechanism to avoid resuming runtime-suspended devices unnecessarily) Rafael J. Wysocki
2014-05-16  0:46                         ` [PATCH 1/3] PM / sleep: Mechanism to avoid resuming runtime-suspended devices unnecessarily Rafael J. Wysocki
2014-05-16 14:27                           ` Alan Stern
2014-05-16 21:10                             ` Rafael J. Wysocki
2014-05-16  0:47                         ` [PATCH 2/3] PM / sleep: Update device PM documentation to cover direct_complete Rafael J. Wysocki
2014-05-16  0:48                         ` [PATCH 3/3][Resend] ACPI / PM: Avoid resuming devices in ACPI PM domain during system suspend Rafael J. Wysocki
2014-05-16 22:18                           ` Rafael J. Wysocki [this message]
2014-05-15 12:06                     ` [RFC][PATCH 2/3] PM / sleep: Mechanism to avoid resuming runtime-suspended devices unnecessarily Ulf Hansson
2014-05-15 12:55                       ` Rafael J. Wysocki
2014-05-15 17:35             ` Kevin Hilman
2014-05-14 22:24   ` Jacob Pan
2014-05-15 11:11     ` Rafael J. Wysocki
2014-05-15 13:09       ` Jacob Pan
2014-05-15 14:29         ` Alan Stern
2014-05-15  7:03           ` Jacob Pan
2014-05-15 15:58             ` Alan Stern
2014-05-16 15:20               ` Jacob Pan
2014-05-16 21:08                 ` Rafael J. Wysocki
2014-05-19  9:18                   ` Jacob Pan
2014-05-19 19:53                     ` Alan Stern
2014-05-19 20:13                       ` Rafael J. Wysocki
2014-05-19 20:20                     ` Rafael J. Wysocki
2014-05-13  1:10 ` [RFC][PATCH 3/3] ACPI / PM: Avoid resuming devices in ACPI PM domain during system suspend Rafael J. Wysocki
2014-05-13 14:45 ` [RFC][PATCH 0/3] PM / sleep: Avoid resuming runtime-suspended devices " Alan Stern
2014-05-13 15:25   ` Rafael J. Wysocki
2014-05-13 15:25     ` Alan Stern
2014-05-13 15:46       ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=37853320.Ciz4qVIJCi@vostro.rjw.lan \
    --to=rjw@rjwysocki.net \
    --cc=aaron.lu@intel.com \
    --cc=khilman@linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=stern@rowland.harvard.edu \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).