summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-08-25 15:34:12 +0200
committerRafael J. Wysocki <rjw@sisk.pl>2011-08-25 15:34:12 +0200
commit4605ab653c1f9d7cc2dda8033de215c9cee325f4 (patch)
tree8f55aa3137973ce2a3ef0ed49c44304e148d50fe /include
parentPM: Reference counting of power.subsys_data (diff)
downloadlinux-4605ab653c1f9d7cc2dda8033de215c9cee325f4.tar.xz
linux-4605ab653c1f9d7cc2dda8033de215c9cee325f4.zip
PM / Domains: Use power.sybsys_data to reduce overhead
Currently pm_genpd_runtime_resume() has to walk the list of devices from the device's PM domain to find the corresponding device list object containing the need_restore field to check if the driver's .runtime_resume() callback should be executed for the device. This is suboptimal and can be simplified by using power.sybsys_data to store device information used by the generic PM domains code. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'include')
-rw-r--r--include/linux/pm.h9
-rw-r--r--include/linux/pm_domain.h6
-rw-r--r--include/linux/pm_runtime.h10
3 files changed, 19 insertions, 6 deletions
diff --git a/include/linux/pm.h b/include/linux/pm.h
index c6b5a0a41ab3..ed10f24d5259 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -421,12 +421,21 @@ enum rpm_request {
struct wakeup_source;
+struct pm_domain_data {
+ struct list_head list_node;
+ struct device *dev;
+ bool need_restore;
+};
+
struct pm_subsys_data {
spinlock_t lock;
unsigned int refcount;
#ifdef CONFIG_PM_CLK
struct list_head clock_list;
#endif
+#ifdef CONFIG_PM_GENERIC_DOMAINS
+ struct pm_domain_data domain_data;
+#endif
};
struct dev_pm_info {
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index bf679f59f9a8..5cce46c2d926 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -61,12 +61,6 @@ struct gpd_link {
struct list_head slave_node;
};
-struct dev_list_entry {
- struct list_head node;
- struct device *dev;
- bool need_restore;
-};
-
#ifdef CONFIG_PM_GENERIC_DOMAINS
extern int pm_genpd_add_device(struct generic_pm_domain *genpd,
struct device *dev);
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index 6b90630e3c98..a5a41a850efb 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -258,6 +258,12 @@ struct pm_clk_notifier_block {
};
#ifdef CONFIG_PM_CLK
+static inline bool pm_clk_no_clocks(struct device *dev)
+{
+ return dev && dev->power.subsys_data
+ && list_empty(&dev->power.subsys_data->clock_list);
+}
+
extern void pm_clk_init(struct device *dev);
extern int pm_clk_create(struct device *dev);
extern void pm_clk_destroy(struct device *dev);
@@ -266,6 +272,10 @@ extern void pm_clk_remove(struct device *dev, const char *con_id);
extern int pm_clk_suspend(struct device *dev);
extern int pm_clk_resume(struct device *dev);
#else
+static inline bool pm_clk_no_clocks(struct device *dev)
+{
+ return true;
+}
static inline void pm_clk_init(struct device *dev)
{
}