diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2014-09-19 14:27:37 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-09-22 09:57:40 -0400 |
commit | 46420dd73b800f87a19af13af5883855cf38cb08 (patch) | |
tree | be10bd4b1d36b76fb776cc000a71c1f09ea96a42 /drivers/base/power/common.c | |
parent | aa42240ab2544a8bcb2efb400193826f57f3175e (diff) |
PM / Domains: Add APIs to attach/detach a PM domain for a device
To maintain scalability let's add common methods to attach and detach
a PM domain for a device, dev_pm_domain_attach|detach().
Typically dev_pm_domain_attach() shall be invoked from subsystem level
code at the probe phase to try to attach a device to its PM domain.
The reversed actions may be done a the remove phase and then by
invoking dev_pm_domain_detach().
When attachment succeeds, the attach function should assign its
corresponding detach function to a new ->detach() callback added in the
struct dev_pm_domain.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Kevin Hilman <khilman@linaro.org>
Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base/power/common.c')
-rw-r--r-- | drivers/base/power/common.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/base/power/common.c b/drivers/base/power/common.c index df2e5eeaeb05..b0f138806bbc 100644 --- a/drivers/base/power/common.c +++ b/drivers/base/power/common.c | |||
@@ -11,6 +11,8 @@ | |||
11 | #include <linux/export.h> | 11 | #include <linux/export.h> |
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/pm_clock.h> | 13 | #include <linux/pm_clock.h> |
14 | #include <linux/acpi.h> | ||
15 | #include <linux/pm_domain.h> | ||
14 | 16 | ||
15 | /** | 17 | /** |
16 | * dev_pm_get_subsys_data - Create or refcount power.subsys_data for device. | 18 | * dev_pm_get_subsys_data - Create or refcount power.subsys_data for device. |
@@ -82,3 +84,53 @@ int dev_pm_put_subsys_data(struct device *dev) | |||
82 | return ret; | 84 | return ret; |
83 | } | 85 | } |
84 | EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data); | 86 | EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data); |
87 | |||
88 | /** | ||
89 | * dev_pm_domain_attach - Attach a device to its PM domain. | ||
90 | * @dev: Device to attach. | ||
91 | * @power_on: Used to indicate whether we should power on the device. | ||
92 | * | ||
93 | * The @dev may only be attached to a single PM domain. By iterating through | ||
94 | * the available alternatives we try to find a valid PM domain for the device. | ||
95 | * As attachment succeeds, the ->detach() callback in the struct dev_pm_domain | ||
96 | * should be assigned by the corresponding attach function. | ||
97 | * | ||
98 | * This function should typically be invoked from subsystem level code during | ||
99 | * the probe phase. Especially for those that holds devices which requires | ||
100 | * power management through PM domains. | ||
101 | * | ||
102 | * Callers must ensure proper synchronization of this function with power | ||
103 | * management callbacks. | ||
104 | * | ||
105 | * Returns 0 on successfully attached PM domain or negative error code. | ||
106 | */ | ||
107 | int dev_pm_domain_attach(struct device *dev, bool power_on) | ||
108 | { | ||
109 | int ret; | ||
110 | |||
111 | ret = acpi_dev_pm_attach(dev, power_on); | ||
112 | if (ret) | ||
113 | ret = genpd_dev_pm_attach(dev); | ||
114 | |||
115 | return ret; | ||
116 | } | ||
117 | EXPORT_SYMBOL_GPL(dev_pm_domain_attach); | ||
118 | |||
119 | /** | ||
120 | * dev_pm_domain_detach - Detach a device from its PM domain. | ||
121 | * @dev: Device to attach. | ||
122 | * @power_off: Used to indicate whether we should power off the device. | ||
123 | * | ||
124 | * This functions will reverse the actions from dev_pm_domain_attach() and thus | ||
125 | * try to detach the @dev from its PM domain. Typically it should be invoked | ||
126 | * from subsystem level code during the remove phase. | ||
127 | * | ||
128 | * Callers must ensure proper synchronization of this function with power | ||
129 | * management callbacks. | ||
130 | */ | ||
131 | void dev_pm_domain_detach(struct device *dev, bool power_off) | ||
132 | { | ||
133 | if (dev->pm_domain && dev->pm_domain->detach) | ||
134 | dev->pm_domain->detach(dev, power_off); | ||
135 | } | ||
136 | EXPORT_SYMBOL_GPL(dev_pm_domain_detach); | ||