From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: pm list <linux-pm@lists.linux-foundation.org>
Cc: Alan Stern <stern@rowland.harvard.edu>,
David Brownell <david-b@pacbell.net>, Pavel Machek <pavel@ucw.cz>,
linux acpi <linux-acpi@vger.kernel.org>,
Len Brown <len.brown@intel.com>,
Shaohua Li <shaohua.li@intel.com>,
Johannes Berg <johannes@sipsolutions.net>,
Igor Stoppa <igor.stoppa@nokia.com>
Subject: [RFC/RFT][PATCH -mm 3/8] ACPI: Add acpi_pm_device_sleep_state helper routine (updated)
Date: Tue, 26 Jun 2007 12:00:28 +0200 [thread overview]
Message-ID: <200706261200.29421.rjw@sisk.pl> (raw)
In-Reply-To: <200706260045.51039.rjw@sisk.pl>
[The previous version wouldn't work correctly.]
---
From: Shaohua Li <shaohua.li@intel.com>, Rafael J. Wysocki <rjw@sisk.pl>
Based on the David Brownell's patch at
http://marc.info/?l=linux-acpi&m=117873972806360&w=2
Add a helper routine returning the lowest power (highest number) ACPI device
power state that given device can be in while the system is in the sleep state
indicated by acpi_target_sleep_state .
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/acpi/sleep/main.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
include/acpi/acpi_bus.h | 2 +
2 files changed, 53 insertions(+)
Index: linux-2.6.22-rc6/drivers/acpi/sleep/main.c
===================================================================
--- linux-2.6.22-rc6.orig/drivers/acpi/sleep/main.c
+++ linux-2.6.22-rc6/drivers/acpi/sleep/main.c
@@ -262,6 +262,57 @@ static struct hibernation_ops acpi_hiber
};
#endif /* CONFIG_SOFTWARE_SUSPEND */
+/**
+ * acpi_pm_device_sleep_state - return the lowest power (highest number)
+ * ACPI device power state given device can be
+ * in while the system is in the sleep state
+ * indicated by %acpi_target_sleep_state
+ * @handle: Represents the device the state is evaluated for
+ */
+
+int acpi_pm_device_sleep_state(acpi_handle handle)
+{
+ char acpi_method[] = "_SxD";
+ unsigned long d_min, d_max;
+ struct acpi_device *dev;
+
+ if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev)))
+ printk(KERN_ERR "ACPI handle has no context!\n");
+ return -ENODEV;
+ }
+ acpi_method[2] = '0' + acpi_target_sleep_state;
+ /*
+ * If the sleep state is S0, we will return D3, but if the device has
+ * _S0W, we will use the value from _S0W
+ */
+ d_min = ACPI_STATE_D3;
+ d_max = ACPI_STATE_D3;
+ /*
+ * If present, _SxD methods give the minimum D-state we may use
+ * for each S-state ... with lowest latency state switching.
+ *
+ * We rely on acpi_evaluate_integer() not clobbering the integer
+ * provided -- that's our fault recovery, we ignore retval.
+ */
+ if (acpi_target_sleep_state > ACPI_STATE_S0)
+ acpi_evaluate_integer(handle, acpi_method, NULL, &d_min);
+
+ /*
+ * If _PRW says we can wake from the upcoming system state, the _SxD
+ * value can wake ... and we'll assume a wakeup-aware driver. If _SxW
+ * methods exist (ACPI 3.x), they give the lowest power D-state that
+ * can also wake the system. _S0W can be valid.
+ */
+ if (acpi_target_sleep_state == ACPI_STATE_S0 ||
+ (dev->wakeup.state.enabled &&
+ dev->wakeup.sleep_state <= acpi_target_sleep_state)) {
+ d_max = d_min;
+ acpi_method[3] = 'W';
+ acpi_evaluate_integer(handle, acpi_method, NULL, &d_max);
+ }
+ return d_max;
+}
+
/*
* Toshiba fails to preserve interrupts over S1, reinitialization
* of 8259 is needed after S1 resume.
Index: linux-2.6.22-rc6/include/acpi/acpi_bus.h
===================================================================
--- linux-2.6.22-rc6.orig/include/acpi/acpi_bus.h
+++ linux-2.6.22-rc6/include/acpi/acpi_bus.h
@@ -364,6 +364,8 @@ acpi_handle acpi_get_child(acpi_handle,
acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
+int acpi_pm_device_sleep_state(acpi_handle handle);
+
#endif /* CONFIG_ACPI */
#endif /*__ACPI_BUS_H__*/
next prev parent reply other threads:[~2007-06-26 9:53 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-24 20:39 [RFC/RFT][PATCH -mm 0/4] PM: Rework struct pm_ops and related things Rafael J. Wysocki
2007-06-24 20:40 ` [RFC/RFT][PATCH -mm 1/4] PM: Introduce set_target method in pm_ops Rafael J. Wysocki
2007-06-24 20:40 ` Rafael J. Wysocki
2007-06-25 2:11 ` David Brownell
2007-06-25 22:06 ` Rafael J. Wysocki
2007-06-25 22:06 ` Rafael J. Wysocki
2007-06-25 2:11 ` David Brownell
2007-06-25 21:28 ` Johannes Berg
2007-06-26 8:55 ` Pavel Machek
2007-06-26 9:41 ` Rafael J. Wysocki
2007-06-26 17:19 ` David Brownell
2007-06-26 20:14 ` Rafael J. Wysocki
2007-06-26 20:14 ` Rafael J. Wysocki
2007-06-26 17:19 ` David Brownell
2007-06-26 9:41 ` Rafael J. Wysocki
2007-06-25 21:28 ` Johannes Berg
2007-06-24 20:41 ` [RFC/RFT][PATCH -mm 2/4] PM: Move definition of struct pm_ops to suspend.h Rafael J. Wysocki
2007-06-24 20:41 ` Rafael J. Wysocki
2007-06-25 19:33 ` Pavel Machek
2007-06-25 19:33 ` Pavel Machek
2007-06-24 20:42 ` [RFC/RFT][PATCH -mm 3/4] PM: Rename struct pm_ops and related things Rafael J. Wysocki
2007-06-24 20:42 ` Rafael J. Wysocki
2007-06-25 4:12 ` David Brownell
2007-06-25 4:12 ` David Brownell
2007-06-25 19:34 ` Pavel Machek
2007-06-25 19:34 ` Pavel Machek
2007-06-24 20:44 ` [RFC/RFT][PATCH -mm 4/4] PM: Rework struct platform_suspend_operations Rafael J. Wysocki
2007-06-24 20:44 ` Rafael J. Wysocki
2007-06-25 21:30 ` Johannes Berg
2007-06-25 21:30 ` Johannes Berg
2007-06-25 22:39 ` [RFC/RFT][PATCH -mm 0/8] PM: Rework struct pm_ops and related things (take 2) Rafael J. Wysocki
2007-06-25 22:41 ` [RFC/RFT][PATCH -mm 1/8][bugfix] PM: Introduce set_target method in pm_ops Rafael J. Wysocki
2007-06-27 20:27 ` Rafael J. Wysocki
2007-06-27 20:27 ` Rafael J. Wysocki
2007-06-27 20:41 ` David Brownell
2007-06-27 20:41 ` David Brownell
2007-06-27 20:55 ` Rafael J. Wysocki
2007-06-27 20:55 ` Rafael J. Wysocki
2007-06-25 22:41 ` Rafael J. Wysocki
2007-06-25 22:43 ` [RFC/RFT][PATCH -mm 2/8] ACPI: Implement the set_target() callback from pm_ops Rafael J. Wysocki
2007-06-25 22:43 ` Rafael J. Wysocki
2007-06-25 22:45 ` [RFC/RFT][PATCH -mm 3/8] ACPI: Add acpi_pm_device_sleep_state helper routine Rafael J. Wysocki
2007-06-25 22:45 ` Rafael J. Wysocki
2007-06-26 10:00 ` Rafael J. Wysocki [this message]
2007-06-26 10:34 ` [RFC/RFT][PATCH -mm 3/8] ACPI: Add acpi_pm_device_sleep_state helper routine (updated 2x) Rafael J. Wysocki
2007-06-26 10:34 ` Rafael J. Wysocki
2007-06-26 10:00 ` [RFC/RFT][PATCH -mm 3/8] ACPI: Add acpi_pm_device_sleep_state helper routine (updated) Rafael J. Wysocki
2007-06-25 22:47 ` [RFC/RFT][PATCH -mm 4/8] PM: Move definition of struct pm_ops to suspend.h Rafael J. Wysocki
2007-06-25 22:47 ` Rafael J. Wysocki
2007-06-25 22:48 ` [RFC/RFT][PATCH -mm 5/8] PM: Rename struct pm_ops and related things Rafael J. Wysocki
2007-06-25 22:48 ` Rafael J. Wysocki
2007-06-25 22:49 ` [RFC/RFT][PATCH -mm 6/8] PM: Rework struct platform_suspend_operations Rafael J. Wysocki
2007-06-25 22:49 ` Rafael J. Wysocki
2007-06-26 8:52 ` Pavel Machek
2007-06-26 8:52 ` Pavel Machek
2007-06-25 22:51 ` [RFC/RFT][PATCH -mm 7/8] PM: Rework struct hibernation_ops Rafael J. Wysocki
2007-06-25 22:51 ` Rafael J. Wysocki
2007-06-25 22:52 ` [RFC/RFT][PATCH -mm 8/8] PM: Rename hibernation_ops to platform_hibernation_operations Rafael J. Wysocki
2007-06-26 8:54 ` Pavel Machek
2007-06-27 15:19 ` Rafael J. Wysocki
2007-06-27 15:19 ` Rafael J. Wysocki
2007-06-25 22:52 ` Rafael J. Wysocki
2007-06-25 22:39 ` [RFC/RFT][PATCH -mm 0/8] PM: Rework struct pm_ops and related things (take 2) 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=200706261200.29421.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=david-b@pacbell.net \
--cc=igor.stoppa@nokia.com \
--cc=johannes@sipsolutions.net \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=pavel@ucw.cz \
--cc=shaohua.li@intel.com \
--cc=stern@rowland.harvard.edu \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.