diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2012-08-06 19:11:14 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2012-09-03 19:36:53 -0400 |
commit | 8bc0251de2932e603f8ed73b76ba2d64b2dc1d18 (patch) | |
tree | a29341739203de17f76c4044e5ad24b095e758f5 | |
parent | fb7268be9f72bed6ae48554f00f2dcb2ef333bfc (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.c | 46 | ||||
-rw-r--r-- | include/linux/pm_domain.h | 5 |
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 @@ | |||
53 | static LIST_HEAD(gpd_list); | 53 | static LIST_HEAD(gpd_list); |
54 | static DEFINE_MUTEX(gpd_list_lock); | 54 | static DEFINE_MUTEX(gpd_list_lock); |
55 | 55 | ||
56 | static 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 | ||
58 | struct generic_pm_domain *dev_to_genpd(struct device *dev) | 76 | struct 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 | */ | ||
287 | int 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, | |||
1475 | int __pm_genpd_name_add_device(const char *domain_name, struct device *dev, | 1505 | int __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 | ||
163 | extern int pm_genpd_poweron(struct generic_pm_domain *genpd); | 163 | extern int pm_genpd_poweron(struct generic_pm_domain *genpd); |
164 | extern int pm_genpd_name_poweron(const char *domain_name); | ||
164 | 165 | ||
165 | extern bool default_stop_ok(struct device *dev); | 166 | extern 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 | } |
244 | static inline int pm_genpd_name_poweron(const char *domain_name) | ||
245 | { | ||
246 | return -ENOSYS; | ||
247 | } | ||
243 | static inline bool default_stop_ok(struct device *dev) | 248 | static inline bool default_stop_ok(struct device *dev) |
244 | { | 249 | { |
245 | return false; | 250 | return false; |