summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-04-29 00:36:53 +0200
committerRafael J. Wysocki <rjw@sisk.pl>2011-04-29 00:36:53 +0200
commit1d2b71f61b6a10216274e27b717becf9ae101fc7 (patch)
tree9a2c7c3411cfcf485f17fec985c646ee90390d02
parent638080c37ae08fd0c44cec13d7948ca5385ae851 (diff)
PM / Runtime: Add subsystem data field to struct dev_pm_info
Some subsystems need to attach PM-related data to struct device and they need to use devres for this purpose. For their convenience and to make code more straightforward, add a new field called subsys_data to struct dev_pm_info and let subsystems use it for attaching PM-related information to devices. Convert the ARM shmobile platform to using the new field. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
-rw-r--r--arch/arm/mach-shmobile/pm_runtime.c34
-rw-r--r--include/linux/pm.h1
2 files changed, 18 insertions, 17 deletions
diff --git a/arch/arm/mach-shmobile/pm_runtime.c b/arch/arm/mach-shmobile/pm_runtime.c
index 12bb504c7f49..30bbe9a99ae1 100644
--- a/arch/arm/mach-shmobile/pm_runtime.c
+++ b/arch/arm/mach-shmobile/pm_runtime.c
@@ -18,6 +18,7 @@
#include <linux/clk.h>
#include <linux/sh_clk.h>
#include <linux/bitmap.h>
+#include <linux/slab.h>
#ifdef CONFIG_PM_RUNTIME
#define BIT_ONCE 0
@@ -29,22 +30,9 @@ struct pm_runtime_data {
struct clk *clk;
};
-static void __devres_release(struct device *dev, void *res)
-{
- struct pm_runtime_data *prd = res;
-
- dev_dbg(dev, "__devres_release()\n");
-
- if (test_bit(BIT_CLK_ENABLED, &prd->flags))
- clk_disable(prd->clk);
-
- if (test_bit(BIT_ACTIVE, &prd->flags))
- clk_put(prd->clk);
-}
-
static struct pm_runtime_data *__to_prd(struct device *dev)
{
- return devres_find(dev, __devres_release, NULL, NULL);
+ return dev ? dev->power.subsys_data : NULL;
}
static void platform_pm_runtime_init(struct device *dev,
@@ -121,14 +109,26 @@ static int platform_bus_notify(struct notifier_block *nb,
dev_dbg(dev, "platform_bus_notify() %ld !\n", action);
- if (action == BUS_NOTIFY_BIND_DRIVER) {
- prd = devres_alloc(__devres_release, sizeof(*prd), GFP_KERNEL);
+ switch (action) {
+ case BUS_NOTIFY_BIND_DRIVER:
+ prd = kzalloc(sizeof(*prd), GFP_KERNEL);
if (prd) {
- devres_add(dev, prd);
+ dev->power.subsys_data = prd;
dev->pwr_domain = &default_power_domain;
} else {
dev_err(dev, "unable to alloc memory for runtime pm\n");
}
+ break;
+ case BUS_NOTIFY_UNBOUND_DRIVER:
+ prd = __to_prd(dev);
+ if (prd) {
+ if (test_bit(BIT_CLK_ENABLED, &prd->flags))
+ clk_disable(prd->clk);
+
+ if (test_bit(BIT_ACTIVE, &prd->flags))
+ clk_put(prd->clk);
+ }
+ break;
}
return 0;
diff --git a/include/linux/pm.h b/include/linux/pm.h
index 512e09177e57..f4167d0faa67 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -460,6 +460,7 @@ struct dev_pm_info {
unsigned long active_jiffies;
unsigned long suspended_jiffies;
unsigned long accounting_timestamp;
+ void *subsys_data; /* Owned by the subsystem. */
#endif
};