From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linux PM list <linux-pm@vger.kernel.org>
Cc: ACPI Devel Mailing List <linux-acpi@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>, Len Brown <lenb@kernel.org>,
Matthew Garrett <mjg59@srcf.ucam.org>,
platform-driver-x86@vger.kernel.org,
Eric Piel <eric.piel@tremplin-utc.net>,
Mattia Dongili <malattia@linux.it>,
Harald Welte <laforge@gnumonks.org>
Subject: [PATCH 3/21] ACPI / PM: Make acpi_bus_type use driver struct dev_pm_ops callbacks
Date: Sat, 23 Jun 2012 23:09:42 +0200 [thread overview]
Message-ID: <201206232309.42554.rjw@sisk.pl> (raw)
In-Reply-To: <201206232306.06602.rjw@sisk.pl>
From: Rafael J. Wysocki <rjw@sisk.pl>
Modify acpi_bus_type so that it executes PM callbacks provided
by drivers through their struct dev_pm_ops objects, if present,
while still allowing the legacy ACPI PM callbacks to take precedence.
This will make it possible to convert ACPI drivers one by one to
handling PM through struct dev_pm_ops instead of the legacy way.
The code added by this change is temporary and will be removed
when all of the drivers in question have been switched over to
the PM handling based on struct dev_pm_ops.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
drivers/acpi/scan.c | 60 ++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 47 insertions(+), 13 deletions(-)
Index: linux/drivers/acpi/scan.c
===================================================================
--- linux.orig/drivers/acpi/scan.c
+++ linux/drivers/acpi/scan.c
@@ -290,27 +290,61 @@ static void acpi_device_release(struct d
kfree(acpi_dev);
}
-static int acpi_device_suspend(struct device *dev)
+#define ACPI_DEV_PM_CALLBACK(dev, callback, legacy_cb) \
+({ \
+ struct acpi_device *__acpi_dev = to_acpi_device(dev); \
+ struct acpi_driver *__acpi_drv = __acpi_dev->driver; \
+ struct device_driver *__drv = dev->driver; \
+ int __ret; \
+ \
+ if (__acpi_drv && __acpi_drv->ops.legacy_cb) \
+ __ret = __acpi_drv->ops.legacy_cb(__acpi_dev); \
+ else if (__drv && __drv->pm && __drv->pm->callback) \
+ __ret = __drv->pm->callback(dev); \
+ else \
+ __ret = 0; \
+ \
+ __ret; \
+})
+
+static int acpi_pm_suspend(struct device *dev)
{
- struct acpi_device *acpi_dev = to_acpi_device(dev);
- struct acpi_driver *acpi_drv = acpi_dev->driver;
+ return ACPI_DEV_PM_CALLBACK(dev, suspend, suspend);
+}
- if (acpi_drv && acpi_drv->ops.suspend)
- return acpi_drv->ops.suspend(acpi_dev);
- return 0;
+static int acpi_pm_resume(struct device *dev)
+{
+ return ACPI_DEV_PM_CALLBACK(dev, resume, resume);
}
-static int acpi_device_resume(struct device *dev)
+static int acpi_pm_freeze(struct device *dev)
{
- struct acpi_device *acpi_dev = to_acpi_device(dev);
- struct acpi_driver *acpi_drv = acpi_dev->driver;
+ return ACPI_DEV_PM_CALLBACK(dev, freeze, suspend);
+}
- if (acpi_drv && acpi_drv->ops.resume)
- return acpi_drv->ops.resume(acpi_dev);
- return 0;
+static int acpi_pm_thaw(struct device *dev)
+{
+ return ACPI_DEV_PM_CALLBACK(dev, thaw, resume);
+}
+
+static int acpi_pm_poweroff(struct device *dev)
+{
+ return ACPI_DEV_PM_CALLBACK(dev, poweroff, suspend);
+}
+
+static int acpi_pm_restore(struct device *dev)
+{
+ return ACPI_DEV_PM_CALLBACK(dev, restore, resume);
}
-static SIMPLE_DEV_PM_OPS(acpi_bus_pm, acpi_device_suspend, acpi_device_resume);
+static const struct dev_pm_ops acpi_bus_pm = {
+ .suspend = acpi_pm_suspend,
+ .resume = acpi_pm_resume,
+ .freeze = acpi_pm_freeze,
+ .thaw = acpi_pm_thaw,
+ .poweroff = acpi_pm_poweroff,
+ .restore = acpi_pm_restore,
+};
static int acpi_bus_match(struct device *dev, struct device_driver *drv)
{
next prev parent reply other threads:[~2012-06-23 21:17 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-23 21:06 [PATCH 0/21] ACPI / PM: Switch ACPI bus type and drivers to dev_pm_ops Rafael J. Wysocki
2012-06-23 21:08 ` [PATCH 1/21] ACPI / PM: Drop pm_message_t argument from device suspend callback Rafael J. Wysocki
2012-06-23 21:08 ` [PATCH 2/21] ACPI / PM: Make acpi_bus_type use struct dev_pm_ops for PM handling Rafael J. Wysocki
2012-06-23 21:09 ` Rafael J. Wysocki [this message]
2012-06-23 21:10 ` [PATCH 4/21] ACPI: Use struct dev_pm_ops for power management in the fan driver Rafael J. Wysocki
2012-06-23 21:11 ` [PATCH 5/21] ACPI: Use struct dev_pm_ops for power management in the thermal driver Rafael J. Wysocki
2012-06-23 21:11 ` [PATCH 6/21] ACPI: Use struct dev_pm_ops for power management in processor driver Rafael J. Wysocki
2012-06-23 21:12 ` [PATCH 7/21] ACPI: Use struct dev_pm_ops for power management in the AC driver Rafael J. Wysocki
2012-06-23 21:13 ` [PATCH 8/21] ACPI: Use struct dev_pm_ops for power management in the battery driver Rafael J. Wysocki
2012-06-23 21:13 ` [PATCH 9/21] ACPI: Use struct dev_pm_ops for power management in the button driver Rafael J. Wysocki
2012-06-23 21:14 ` [PATCH 10/21] ACPI: Use struct dev_pm_ops for power management in the power driver Rafael J. Wysocki
2012-06-23 21:14 ` [PATCH 11/21] ACPI: Use struct dev_pm_ops for power management in the SBS driver Rafael J. Wysocki
2012-06-23 21:15 ` [PATCH 12/21] toshiba_acpi: Use struct dev_pm_ops for power management Rafael J. Wysocki
2012-06-23 21:16 ` [PATCH 13/21] hp_accel: " Rafael J. Wysocki
2012-06-24 20:00 ` Éric Piel
2012-06-24 20:14 ` Rafael J. Wysocki
2012-06-23 21:17 ` [PATCH 14/21] sony-laptop: " Rafael J. Wysocki
2012-06-23 21:17 ` [PATCH 15/21] panasonic-laptop: " Rafael J. Wysocki
2012-06-23 21:18 ` [PATCH 16/21] toshiba_bluetooth: " Rafael J. Wysocki
2012-06-24 12:40 ` Vikram Dhillon
2012-06-24 20:00 ` Rafael J. Wysocki
2012-06-23 21:18 ` [PATCH 17/21] xo15-ebook: " Rafael J. Wysocki
2012-06-23 21:19 ` [PATCH 18/21] acpi_power_meter: " Rafael J. Wysocki
2012-06-23 21:20 ` [PATCH 19/21] ACPI / PM: Do not execute legacy driver PM callbacks Rafael J. Wysocki
2012-06-23 21:21 ` [PATCH 20/21] ACPI / PM: Drop legacy driver PM callbacks that are not used any more Rafael J. Wysocki
2012-06-23 21:22 ` [PATCH 21/21] ACPI / PM: Drop PM callbacks from the ACPI bus type Rafael J. Wysocki
2012-06-28 22:11 ` [PATCH missing/21] classmate-laptop: Use struct dev_pm_ops for power management Rafael J. Wysocki
2012-06-29 11:39 ` Thadeu Cascardo
2012-06-29 21:52 ` Rafael J. Wysocki
2012-06-28 22:26 ` [PATCH missing 2/21] fujitsu-tablet: " Rafael J. Wysocki
2012-07-19 5:04 ` [PATCH 0/21] ACPI / PM: Switch ACPI bus type and drivers to dev_pm_ops Len Brown
2012-07-19 9:11 ` 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=201206232309.42554.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=eric.piel@tremplin-utc.net \
--cc=laforge@gnumonks.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=malattia@linux.it \
--cc=mjg59@srcf.ucam.org \
--cc=platform-driver-x86@vger.kernel.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