aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2012-08-06 19:11:14 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2012-09-03 19:36:53 -0400
commit8bc0251de2932e603f8ed73b76ba2d64b2dc1d18 (patch)
treea29341739203de17f76c4044e5ad24b095e758f5
parentfb7268be9f72bed6ae48554f00f2dcb2ef333bfc (diff)
PM / Domains: Add power-on function using names to identify domains
It sometimes is necessary to turn on a given PM domain when only the name of it is known and the domain pointer is not readily available. For this reason, add a new helper function, pm_genpd_name_poweron(), allowing the caller to turn on a PM domain using its name for identification. To avoid code duplication, move the domain lookup code to a separate function. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
-rw-r--r--drivers/base/power/domain.c46
-rw-r--r--include/linux/pm_domain.h5
2 files changed, 36 insertions, 15 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index cddf818f493c..4d633406f375 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -53,6 +53,24 @@
53static LIST_HEAD(gpd_list); 53static LIST_HEAD(gpd_list);
54static DEFINE_MUTEX(gpd_list_lock); 54static DEFINE_MUTEX(gpd_list_lock);
55 55
56static struct generic_pm_domain *pm_genpd_lookup_name(const char *domain_name)
57{
58 struct generic_pm_domain *genpd = NULL, *gpd;
59
60 if (IS_ERR_OR_NULL(domain_name))
61 return NULL;
62
63 mutex_lock(&gpd_list_lock);
64 list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
65 if (!strcmp(gpd->name, domain_name)) {
66 genpd = gpd;
67 break;
68 }
69 }
70 mutex_unlock(&gpd_list_lock);
71 return genpd;
72}
73
56#ifdef CONFIG_PM 74#ifdef CONFIG_PM
57 75
58struct generic_pm_domain *dev_to_genpd(struct device *dev) 76struct generic_pm_domain *dev_to_genpd(struct device *dev)
@@ -262,6 +280,18 @@ int pm_genpd_poweron(struct generic_pm_domain *genpd)
262 return ret; 280 return ret;
263} 281}
264 282
283/**
284 * pm_genpd_name_poweron - Restore power to a given PM domain and its masters.
285 * @domain_name: Name of the PM domain to power up.
286 */
287int pm_genpd_name_poweron(const char *domain_name)
288{
289 struct generic_pm_domain *genpd;
290
291 genpd = pm_genpd_lookup_name(domain_name);
292 return genpd ? pm_genpd_poweron(genpd) : -EINVAL;
293}
294
265#endif /* CONFIG_PM */ 295#endif /* CONFIG_PM */
266 296
267#ifdef CONFIG_PM_RUNTIME 297#ifdef CONFIG_PM_RUNTIME
@@ -1475,21 +1505,7 @@ int __pm_genpd_of_add_device(struct device_node *genpd_node, struct device *dev,
1475int __pm_genpd_name_add_device(const char *domain_name, struct device *dev, 1505int __pm_genpd_name_add_device(const char *domain_name, struct device *dev,
1476 struct gpd_timing_data *td) 1506 struct gpd_timing_data *td)
1477{ 1507{
1478 struct generic_pm_domain *genpd = NULL, *gpd; 1508 return __pm_genpd_add_device(pm_genpd_lookup_name(domain_name), dev, td);
1479
1480 if (IS_ERR_OR_NULL(domain_name) || IS_ERR_OR_NULL(dev))
1481 return -EINVAL;
1482
1483 mutex_lock(&gpd_list_lock);
1484 list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
1485 if (!strcmp(gpd->name, domain_name)) {
1486 genpd = gpd;
1487 break;
1488 }
1489 }
1490 mutex_unlock(&gpd_list_lock);
1491
1492 return __pm_genpd_add_device(genpd, dev, td);
1493} 1509}
1494 1510
1495/** 1511/**
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index 8dbf48b8336f..d9d60835c29b 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -161,6 +161,7 @@ extern void pm_genpd_init(struct generic_pm_domain *genpd,
161 struct dev_power_governor *gov, bool is_off); 161 struct dev_power_governor *gov, bool is_off);
162 162
163extern int pm_genpd_poweron(struct generic_pm_domain *genpd); 163extern int pm_genpd_poweron(struct generic_pm_domain *genpd);
164extern int pm_genpd_name_poweron(const char *domain_name);
164 165
165extern bool default_stop_ok(struct device *dev); 166extern bool default_stop_ok(struct device *dev);
166 167
@@ -240,6 +241,10 @@ static inline int pm_genpd_poweron(struct generic_pm_domain *genpd)
240{ 241{
241 return -ENOSYS; 242 return -ENOSYS;
242} 243}
244static inline int pm_genpd_name_poweron(const char *domain_name)
245{
246 return -ENOSYS;
247}
243static inline bool default_stop_ok(struct device *dev) 248static inline bool default_stop_ok(struct device *dev)
244{ 249{
245 return false; 250 return false;