diff options
-rw-r--r-- | drivers/base/power/common.c | 52 | ||||
-rw-r--r-- | include/linux/pm.h | 11 |
2 files changed, 63 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); | ||
diff --git a/include/linux/pm.h b/include/linux/pm.h index 1022ba1eb4de..c4cbf485a5d6 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
@@ -622,6 +622,17 @@ struct dev_pm_domain { | |||
622 | void (*detach)(struct device *dev, bool power_off); | 622 | void (*detach)(struct device *dev, bool power_off); |
623 | }; | 623 | }; |
624 | 624 | ||
625 | #ifdef CONFIG_PM | ||
626 | extern int dev_pm_domain_attach(struct device *dev, bool power_on); | ||
627 | extern void dev_pm_domain_detach(struct device *dev, bool power_off); | ||
628 | #else | ||
629 | static inline int dev_pm_domain_attach(struct device *dev, bool power_on) | ||
630 | { | ||
631 | return -ENODEV; | ||
632 | } | ||
633 | static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {} | ||
634 | #endif | ||
635 | |||
625 | /* | 636 | /* |
626 | * The PM_EVENT_ messages are also used by drivers implementing the legacy | 637 | * The PM_EVENT_ messages are also used by drivers implementing the legacy |
627 | * suspend framework, based on the ->suspend() and ->resume() callbacks common | 638 | * suspend framework, based on the ->suspend() and ->resume() callbacks common |