diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-20 12:03:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-20 12:03:55 -0400 |
commit | 46ee9645094ad1eb5b4888882ecaa1fb87dcd2a3 (patch) | |
tree | d0a48e993568b6a2415cfc21fc06eaa2fd886429 /drivers | |
parent | fa5312d9e87e7222c6c384c4e930dc149bc1178d (diff) | |
parent | 25f3a5a2854dce8b8413fd24cc9d5b9e3632be54 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
PM: PM QOS update fix
Freezer / cgroup freezer: Update stale locking comments
PM / platform_bus: Allow runtime PM by default
i2c: Fix bus-level power management callbacks
PM QOS update
PM / Hibernate: Fix block_io.c printk warning
PM / Hibernate: Group swap ops
PM / Hibernate: Move the first_sector out of swsusp_write
PM / Hibernate: Separate block_io
PM / Hibernate: Snapshot cleanup
FS / libfs: Implement simple_write_to_buffer
PM / Hibernate: document open(/dev/snapshot) side effects
PM / Runtime: Add sysfs debug files
PM: Improve device power management document
PM: Update device power management document
PM: Allow runtime_suspend methods to call pm_schedule_suspend()
PM: pm_wakeup - switch to using bool
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/acpi/processor_idle.c | 2 | ||||
-rw-r--r-- | drivers/base/platform.c | 6 | ||||
-rw-r--r-- | drivers/base/power/runtime.c | 10 | ||||
-rw-r--r-- | drivers/base/power/sysfs.c | 65 | ||||
-rw-r--r-- | drivers/cpuidle/governors/ladder.c | 2 | ||||
-rw-r--r-- | drivers/cpuidle/governors/menu.c | 2 | ||||
-rw-r--r-- | drivers/i2c/i2c-core.c | 166 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 22 | ||||
-rw-r--r-- | drivers/net/igbvf/netdev.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2100.c | 11 |
10 files changed, 192 insertions, 100 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 5939e7f7d8e9..c3817e1f32c7 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -698,7 +698,7 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) | |||
698 | "max_cstate: C%d\n" | 698 | "max_cstate: C%d\n" |
699 | "maximum allowed latency: %d usec\n", | 699 | "maximum allowed latency: %d usec\n", |
700 | pr->power.state ? pr->power.state - pr->power.states : 0, | 700 | pr->power.state ? pr->power.state - pr->power.states : 0, |
701 | max_cstate, pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)); | 701 | max_cstate, pm_qos_request(PM_QOS_CPU_DMA_LATENCY)); |
702 | 702 | ||
703 | seq_puts(seq, "states:\n"); | 703 | seq_puts(seq, "states:\n"); |
704 | 704 | ||
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 765bcf0df3bb..ada6397c23a5 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -967,17 +967,17 @@ static int platform_pm_restore_noirq(struct device *dev) | |||
967 | 967 | ||
968 | int __weak platform_pm_runtime_suspend(struct device *dev) | 968 | int __weak platform_pm_runtime_suspend(struct device *dev) |
969 | { | 969 | { |
970 | return -ENOSYS; | 970 | return pm_generic_runtime_suspend(dev); |
971 | }; | 971 | }; |
972 | 972 | ||
973 | int __weak platform_pm_runtime_resume(struct device *dev) | 973 | int __weak platform_pm_runtime_resume(struct device *dev) |
974 | { | 974 | { |
975 | return -ENOSYS; | 975 | return pm_generic_runtime_resume(dev); |
976 | }; | 976 | }; |
977 | 977 | ||
978 | int __weak platform_pm_runtime_idle(struct device *dev) | 978 | int __weak platform_pm_runtime_idle(struct device *dev) |
979 | { | 979 | { |
980 | return -ENOSYS; | 980 | return pm_generic_runtime_idle(dev); |
981 | }; | 981 | }; |
982 | 982 | ||
983 | #else /* !CONFIG_PM_RUNTIME */ | 983 | #else /* !CONFIG_PM_RUNTIME */ |
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 626dd147b75f..b0ec0e9f27e9 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
@@ -229,14 +229,16 @@ int __pm_runtime_suspend(struct device *dev, bool from_wq) | |||
229 | 229 | ||
230 | if (retval) { | 230 | if (retval) { |
231 | dev->power.runtime_status = RPM_ACTIVE; | 231 | dev->power.runtime_status = RPM_ACTIVE; |
232 | pm_runtime_cancel_pending(dev); | ||
233 | |||
234 | if (retval == -EAGAIN || retval == -EBUSY) { | 232 | if (retval == -EAGAIN || retval == -EBUSY) { |
235 | notify = true; | 233 | if (dev->power.timer_expires == 0) |
234 | notify = true; | ||
236 | dev->power.runtime_error = 0; | 235 | dev->power.runtime_error = 0; |
236 | } else { | ||
237 | pm_runtime_cancel_pending(dev); | ||
237 | } | 238 | } |
238 | } else { | 239 | } else { |
239 | dev->power.runtime_status = RPM_SUSPENDED; | 240 | dev->power.runtime_status = RPM_SUSPENDED; |
241 | pm_runtime_deactivate_timer(dev); | ||
240 | 242 | ||
241 | if (dev->parent) { | 243 | if (dev->parent) { |
242 | parent = dev->parent; | 244 | parent = dev->parent; |
@@ -659,8 +661,6 @@ int pm_schedule_suspend(struct device *dev, unsigned int delay) | |||
659 | 661 | ||
660 | if (dev->power.runtime_status == RPM_SUSPENDED) | 662 | if (dev->power.runtime_status == RPM_SUSPENDED) |
661 | retval = 1; | 663 | retval = 1; |
662 | else if (dev->power.runtime_status == RPM_SUSPENDING) | ||
663 | retval = -EINPROGRESS; | ||
664 | else if (atomic_read(&dev->power.usage_count) > 0 | 664 | else if (atomic_read(&dev->power.usage_count) > 0 |
665 | || dev->power.disable_depth > 0) | 665 | || dev->power.disable_depth > 0) |
666 | retval = -EAGAIN; | 666 | retval = -EAGAIN; |
diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index 86fd9373447e..a4c33bc51257 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/device.h> | 5 | #include <linux/device.h> |
6 | #include <linux/string.h> | 6 | #include <linux/string.h> |
7 | #include <linux/pm_runtime.h> | 7 | #include <linux/pm_runtime.h> |
8 | #include <asm/atomic.h> | ||
8 | #include "power.h" | 9 | #include "power.h" |
9 | 10 | ||
10 | /* | 11 | /* |
@@ -143,7 +144,59 @@ wake_store(struct device * dev, struct device_attribute *attr, | |||
143 | 144 | ||
144 | static DEVICE_ATTR(wakeup, 0644, wake_show, wake_store); | 145 | static DEVICE_ATTR(wakeup, 0644, wake_show, wake_store); |
145 | 146 | ||
146 | #ifdef CONFIG_PM_SLEEP_ADVANCED_DEBUG | 147 | #ifdef CONFIG_PM_ADVANCED_DEBUG |
148 | #ifdef CONFIG_PM_RUNTIME | ||
149 | |||
150 | static ssize_t rtpm_usagecount_show(struct device *dev, | ||
151 | struct device_attribute *attr, char *buf) | ||
152 | { | ||
153 | return sprintf(buf, "%d\n", atomic_read(&dev->power.usage_count)); | ||
154 | } | ||
155 | |||
156 | static ssize_t rtpm_children_show(struct device *dev, | ||
157 | struct device_attribute *attr, char *buf) | ||
158 | { | ||
159 | return sprintf(buf, "%d\n", dev->power.ignore_children ? | ||
160 | 0 : atomic_read(&dev->power.child_count)); | ||
161 | } | ||
162 | |||
163 | static ssize_t rtpm_enabled_show(struct device *dev, | ||
164 | struct device_attribute *attr, char *buf) | ||
165 | { | ||
166 | if ((dev->power.disable_depth) && (dev->power.runtime_auto == false)) | ||
167 | return sprintf(buf, "disabled & forbidden\n"); | ||
168 | else if (dev->power.disable_depth) | ||
169 | return sprintf(buf, "disabled\n"); | ||
170 | else if (dev->power.runtime_auto == false) | ||
171 | return sprintf(buf, "forbidden\n"); | ||
172 | return sprintf(buf, "enabled\n"); | ||
173 | } | ||
174 | |||
175 | static ssize_t rtpm_status_show(struct device *dev, | ||
176 | struct device_attribute *attr, char *buf) | ||
177 | { | ||
178 | if (dev->power.runtime_error) | ||
179 | return sprintf(buf, "error\n"); | ||
180 | switch (dev->power.runtime_status) { | ||
181 | case RPM_SUSPENDED: | ||
182 | return sprintf(buf, "suspended\n"); | ||
183 | case RPM_SUSPENDING: | ||
184 | return sprintf(buf, "suspending\n"); | ||
185 | case RPM_RESUMING: | ||
186 | return sprintf(buf, "resuming\n"); | ||
187 | case RPM_ACTIVE: | ||
188 | return sprintf(buf, "active\n"); | ||
189 | } | ||
190 | return -EIO; | ||
191 | } | ||
192 | |||
193 | static DEVICE_ATTR(runtime_usage, 0444, rtpm_usagecount_show, NULL); | ||
194 | static DEVICE_ATTR(runtime_active_kids, 0444, rtpm_children_show, NULL); | ||
195 | static DEVICE_ATTR(runtime_status, 0444, rtpm_status_show, NULL); | ||
196 | static DEVICE_ATTR(runtime_enabled, 0444, rtpm_enabled_show, NULL); | ||
197 | |||
198 | #endif | ||
199 | |||
147 | static ssize_t async_show(struct device *dev, struct device_attribute *attr, | 200 | static ssize_t async_show(struct device *dev, struct device_attribute *attr, |
148 | char *buf) | 201 | char *buf) |
149 | { | 202 | { |
@@ -170,15 +223,21 @@ static ssize_t async_store(struct device *dev, struct device_attribute *attr, | |||
170 | } | 223 | } |
171 | 224 | ||
172 | static DEVICE_ATTR(async, 0644, async_show, async_store); | 225 | static DEVICE_ATTR(async, 0644, async_show, async_store); |
173 | #endif /* CONFIG_PM_SLEEP_ADVANCED_DEBUG */ | 226 | #endif /* CONFIG_PM_ADVANCED_DEBUG */ |
174 | 227 | ||
175 | static struct attribute * power_attrs[] = { | 228 | static struct attribute * power_attrs[] = { |
176 | #ifdef CONFIG_PM_RUNTIME | 229 | #ifdef CONFIG_PM_RUNTIME |
177 | &dev_attr_control.attr, | 230 | &dev_attr_control.attr, |
178 | #endif | 231 | #endif |
179 | &dev_attr_wakeup.attr, | 232 | &dev_attr_wakeup.attr, |
180 | #ifdef CONFIG_PM_SLEEP_ADVANCED_DEBUG | 233 | #ifdef CONFIG_PM_ADVANCED_DEBUG |
181 | &dev_attr_async.attr, | 234 | &dev_attr_async.attr, |
235 | #ifdef CONFIG_PM_RUNTIME | ||
236 | &dev_attr_runtime_usage.attr, | ||
237 | &dev_attr_runtime_active_kids.attr, | ||
238 | &dev_attr_runtime_status.attr, | ||
239 | &dev_attr_runtime_enabled.attr, | ||
240 | #endif | ||
182 | #endif | 241 | #endif |
183 | NULL, | 242 | NULL, |
184 | }; | 243 | }; |
diff --git a/drivers/cpuidle/governors/ladder.c b/drivers/cpuidle/governors/ladder.c index 1c1ceb4f218f..12c98900dcf8 100644 --- a/drivers/cpuidle/governors/ladder.c +++ b/drivers/cpuidle/governors/ladder.c | |||
@@ -67,7 +67,7 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
67 | struct ladder_device *ldev = &__get_cpu_var(ladder_devices); | 67 | struct ladder_device *ldev = &__get_cpu_var(ladder_devices); |
68 | struct ladder_device_state *last_state; | 68 | struct ladder_device_state *last_state; |
69 | int last_residency, last_idx = ldev->last_state_idx; | 69 | int last_residency, last_idx = ldev->last_state_idx; |
70 | int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); | 70 | int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); |
71 | 71 | ||
72 | /* Special case when user has set very strict latency requirement */ | 72 | /* Special case when user has set very strict latency requirement */ |
73 | if (unlikely(latency_req == 0)) { | 73 | if (unlikely(latency_req == 0)) { |
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index f8e57c6303f2..b81ad9c731ae 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
@@ -182,7 +182,7 @@ static u64 div_round64(u64 dividend, u32 divisor) | |||
182 | static int menu_select(struct cpuidle_device *dev) | 182 | static int menu_select(struct cpuidle_device *dev) |
183 | { | 183 | { |
184 | struct menu_device *data = &__get_cpu_var(menu_devices); | 184 | struct menu_device *data = &__get_cpu_var(menu_devices); |
185 | int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); | 185 | int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); |
186 | int i; | 186 | int i; |
187 | int multiplier; | 187 | int multiplier; |
188 | 188 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index c2258a51fe0c..7c469a62c3c1 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -159,107 +159,131 @@ static void i2c_device_shutdown(struct device *dev) | |||
159 | driver->shutdown(client); | 159 | driver->shutdown(client); |
160 | } | 160 | } |
161 | 161 | ||
162 | #ifdef CONFIG_SUSPEND | 162 | #ifdef CONFIG_PM_SLEEP |
163 | static int i2c_device_pm_suspend(struct device *dev) | 163 | static int i2c_legacy_suspend(struct device *dev, pm_message_t mesg) |
164 | { | 164 | { |
165 | const struct dev_pm_ops *pm; | 165 | struct i2c_client *client = i2c_verify_client(dev); |
166 | struct i2c_driver *driver; | ||
166 | 167 | ||
167 | if (!dev->driver) | 168 | if (!client || !dev->driver) |
168 | return 0; | 169 | return 0; |
169 | pm = dev->driver->pm; | 170 | driver = to_i2c_driver(dev->driver); |
170 | if (!pm || !pm->suspend) | 171 | if (!driver->suspend) |
171 | return 0; | 172 | return 0; |
172 | return pm->suspend(dev); | 173 | return driver->suspend(client, mesg); |
173 | } | 174 | } |
174 | 175 | ||
175 | static int i2c_device_pm_resume(struct device *dev) | 176 | static int i2c_legacy_resume(struct device *dev) |
176 | { | 177 | { |
177 | const struct dev_pm_ops *pm; | 178 | struct i2c_client *client = i2c_verify_client(dev); |
179 | struct i2c_driver *driver; | ||
178 | 180 | ||
179 | if (!dev->driver) | 181 | if (!client || !dev->driver) |
180 | return 0; | 182 | return 0; |
181 | pm = dev->driver->pm; | 183 | driver = to_i2c_driver(dev->driver); |
182 | if (!pm || !pm->resume) | 184 | if (!driver->resume) |
183 | return 0; | 185 | return 0; |
184 | return pm->resume(dev); | 186 | return driver->resume(client); |
185 | } | 187 | } |
186 | #else | ||
187 | #define i2c_device_pm_suspend NULL | ||
188 | #define i2c_device_pm_resume NULL | ||
189 | #endif | ||
190 | 188 | ||
191 | #ifdef CONFIG_PM_RUNTIME | 189 | static int i2c_device_pm_suspend(struct device *dev) |
192 | static int i2c_device_runtime_suspend(struct device *dev) | ||
193 | { | 190 | { |
194 | const struct dev_pm_ops *pm; | 191 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
195 | 192 | ||
196 | if (!dev->driver) | 193 | if (pm_runtime_suspended(dev)) |
197 | return 0; | ||
198 | pm = dev->driver->pm; | ||
199 | if (!pm || !pm->runtime_suspend) | ||
200 | return 0; | 194 | return 0; |
201 | return pm->runtime_suspend(dev); | ||
202 | } | ||
203 | 195 | ||
204 | static int i2c_device_runtime_resume(struct device *dev) | 196 | if (pm) |
205 | { | 197 | return pm->suspend ? pm->suspend(dev) : 0; |
206 | const struct dev_pm_ops *pm; | ||
207 | 198 | ||
208 | if (!dev->driver) | 199 | return i2c_legacy_suspend(dev, PMSG_SUSPEND); |
209 | return 0; | ||
210 | pm = dev->driver->pm; | ||
211 | if (!pm || !pm->runtime_resume) | ||
212 | return 0; | ||
213 | return pm->runtime_resume(dev); | ||
214 | } | 200 | } |
215 | 201 | ||
216 | static int i2c_device_runtime_idle(struct device *dev) | 202 | static int i2c_device_pm_resume(struct device *dev) |
217 | { | 203 | { |
218 | const struct dev_pm_ops *pm = NULL; | 204 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
219 | int ret; | 205 | int ret; |
220 | 206 | ||
221 | if (dev->driver) | 207 | if (pm) |
222 | pm = dev->driver->pm; | 208 | ret = pm->resume ? pm->resume(dev) : 0; |
223 | if (pm && pm->runtime_idle) { | 209 | else |
224 | ret = pm->runtime_idle(dev); | 210 | ret = i2c_legacy_resume(dev); |
225 | if (ret) | 211 | |
226 | return ret; | 212 | if (!ret) { |
213 | pm_runtime_disable(dev); | ||
214 | pm_runtime_set_active(dev); | ||
215 | pm_runtime_enable(dev); | ||
227 | } | 216 | } |
228 | 217 | ||
229 | return pm_runtime_suspend(dev); | 218 | return ret; |
230 | } | 219 | } |
231 | #else | ||
232 | #define i2c_device_runtime_suspend NULL | ||
233 | #define i2c_device_runtime_resume NULL | ||
234 | #define i2c_device_runtime_idle NULL | ||
235 | #endif | ||
236 | 220 | ||
237 | static int i2c_device_suspend(struct device *dev, pm_message_t mesg) | 221 | static int i2c_device_pm_freeze(struct device *dev) |
238 | { | 222 | { |
239 | struct i2c_client *client = i2c_verify_client(dev); | 223 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
240 | struct i2c_driver *driver; | ||
241 | 224 | ||
242 | if (!client || !dev->driver) | 225 | if (pm_runtime_suspended(dev)) |
243 | return 0; | 226 | return 0; |
244 | driver = to_i2c_driver(dev->driver); | 227 | |
245 | if (!driver->suspend) | 228 | if (pm) |
246 | return 0; | 229 | return pm->freeze ? pm->freeze(dev) : 0; |
247 | return driver->suspend(client, mesg); | 230 | |
231 | return i2c_legacy_suspend(dev, PMSG_FREEZE); | ||
248 | } | 232 | } |
249 | 233 | ||
250 | static int i2c_device_resume(struct device *dev) | 234 | static int i2c_device_pm_thaw(struct device *dev) |
251 | { | 235 | { |
252 | struct i2c_client *client = i2c_verify_client(dev); | 236 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
253 | struct i2c_driver *driver; | ||
254 | 237 | ||
255 | if (!client || !dev->driver) | 238 | if (pm_runtime_suspended(dev)) |
256 | return 0; | 239 | return 0; |
257 | driver = to_i2c_driver(dev->driver); | 240 | |
258 | if (!driver->resume) | 241 | if (pm) |
242 | return pm->thaw ? pm->thaw(dev) : 0; | ||
243 | |||
244 | return i2c_legacy_resume(dev); | ||
245 | } | ||
246 | |||
247 | static int i2c_device_pm_poweroff(struct device *dev) | ||
248 | { | ||
249 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; | ||
250 | |||
251 | if (pm_runtime_suspended(dev)) | ||
259 | return 0; | 252 | return 0; |
260 | return driver->resume(client); | 253 | |
254 | if (pm) | ||
255 | return pm->poweroff ? pm->poweroff(dev) : 0; | ||
256 | |||
257 | return i2c_legacy_suspend(dev, PMSG_HIBERNATE); | ||
261 | } | 258 | } |
262 | 259 | ||
260 | static int i2c_device_pm_restore(struct device *dev) | ||
261 | { | ||
262 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; | ||
263 | int ret; | ||
264 | |||
265 | if (pm) | ||
266 | ret = pm->restore ? pm->restore(dev) : 0; | ||
267 | else | ||
268 | ret = i2c_legacy_resume(dev); | ||
269 | |||
270 | if (!ret) { | ||
271 | pm_runtime_disable(dev); | ||
272 | pm_runtime_set_active(dev); | ||
273 | pm_runtime_enable(dev); | ||
274 | } | ||
275 | |||
276 | return ret; | ||
277 | } | ||
278 | #else /* !CONFIG_PM_SLEEP */ | ||
279 | #define i2c_device_pm_suspend NULL | ||
280 | #define i2c_device_pm_resume NULL | ||
281 | #define i2c_device_pm_freeze NULL | ||
282 | #define i2c_device_pm_thaw NULL | ||
283 | #define i2c_device_pm_poweroff NULL | ||
284 | #define i2c_device_pm_restore NULL | ||
285 | #endif /* !CONFIG_PM_SLEEP */ | ||
286 | |||
263 | static void i2c_client_dev_release(struct device *dev) | 287 | static void i2c_client_dev_release(struct device *dev) |
264 | { | 288 | { |
265 | kfree(to_i2c_client(dev)); | 289 | kfree(to_i2c_client(dev)); |
@@ -301,9 +325,15 @@ static const struct attribute_group *i2c_dev_attr_groups[] = { | |||
301 | static const struct dev_pm_ops i2c_device_pm_ops = { | 325 | static const struct dev_pm_ops i2c_device_pm_ops = { |
302 | .suspend = i2c_device_pm_suspend, | 326 | .suspend = i2c_device_pm_suspend, |
303 | .resume = i2c_device_pm_resume, | 327 | .resume = i2c_device_pm_resume, |
304 | .runtime_suspend = i2c_device_runtime_suspend, | 328 | .freeze = i2c_device_pm_freeze, |
305 | .runtime_resume = i2c_device_runtime_resume, | 329 | .thaw = i2c_device_pm_thaw, |
306 | .runtime_idle = i2c_device_runtime_idle, | 330 | .poweroff = i2c_device_pm_poweroff, |
331 | .restore = i2c_device_pm_restore, | ||
332 | SET_RUNTIME_PM_OPS( | ||
333 | pm_generic_runtime_suspend, | ||
334 | pm_generic_runtime_resume, | ||
335 | pm_generic_runtime_idle | ||
336 | ) | ||
307 | }; | 337 | }; |
308 | 338 | ||
309 | struct bus_type i2c_bus_type = { | 339 | struct bus_type i2c_bus_type = { |
@@ -312,8 +342,6 @@ struct bus_type i2c_bus_type = { | |||
312 | .probe = i2c_device_probe, | 342 | .probe = i2c_device_probe, |
313 | .remove = i2c_device_remove, | 343 | .remove = i2c_device_remove, |
314 | .shutdown = i2c_device_shutdown, | 344 | .shutdown = i2c_device_shutdown, |
315 | .suspend = i2c_device_suspend, | ||
316 | .resume = i2c_device_resume, | ||
317 | .pm = &i2c_device_pm_ops, | 345 | .pm = &i2c_device_pm_ops, |
318 | }; | 346 | }; |
319 | EXPORT_SYMBOL_GPL(i2c_bus_type); | 347 | EXPORT_SYMBOL_GPL(i2c_bus_type); |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index dbf81788bb40..d5d55c6a373f 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -2524,12 +2524,12 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) | |||
2524 | * excessive C-state transition latencies result in | 2524 | * excessive C-state transition latencies result in |
2525 | * dropped transactions. | 2525 | * dropped transactions. |
2526 | */ | 2526 | */ |
2527 | pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, | 2527 | pm_qos_update_request( |
2528 | adapter->netdev->name, 55); | 2528 | adapter->netdev->pm_qos_req, 55); |
2529 | } else { | 2529 | } else { |
2530 | pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, | 2530 | pm_qos_update_request( |
2531 | adapter->netdev->name, | 2531 | adapter->netdev->pm_qos_req, |
2532 | PM_QOS_DEFAULT_VALUE); | 2532 | PM_QOS_DEFAULT_VALUE); |
2533 | } | 2533 | } |
2534 | } | 2534 | } |
2535 | 2535 | ||
@@ -2824,8 +2824,8 @@ int e1000e_up(struct e1000_adapter *adapter) | |||
2824 | 2824 | ||
2825 | /* DMA latency requirement to workaround early-receive/jumbo issue */ | 2825 | /* DMA latency requirement to workaround early-receive/jumbo issue */ |
2826 | if (adapter->flags & FLAG_HAS_ERT) | 2826 | if (adapter->flags & FLAG_HAS_ERT) |
2827 | pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, | 2827 | adapter->netdev->pm_qos_req = |
2828 | adapter->netdev->name, | 2828 | pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY, |
2829 | PM_QOS_DEFAULT_VALUE); | 2829 | PM_QOS_DEFAULT_VALUE); |
2830 | 2830 | ||
2831 | /* hardware has been reset, we need to reload some things */ | 2831 | /* hardware has been reset, we need to reload some things */ |
@@ -2887,9 +2887,11 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
2887 | e1000_clean_tx_ring(adapter); | 2887 | e1000_clean_tx_ring(adapter); |
2888 | e1000_clean_rx_ring(adapter); | 2888 | e1000_clean_rx_ring(adapter); |
2889 | 2889 | ||
2890 | if (adapter->flags & FLAG_HAS_ERT) | 2890 | if (adapter->flags & FLAG_HAS_ERT) { |
2891 | pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, | 2891 | pm_qos_remove_request( |
2892 | adapter->netdev->name); | 2892 | adapter->netdev->pm_qos_req); |
2893 | adapter->netdev->pm_qos_req = NULL; | ||
2894 | } | ||
2893 | 2895 | ||
2894 | /* | 2896 | /* |
2895 | * TODO: for power management, we could drop the link and | 2897 | * TODO: for power management, we could drop the link and |
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c index 1b1edad1eb5e..f16e981812a9 100644 --- a/drivers/net/igbvf/netdev.c +++ b/drivers/net/igbvf/netdev.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #define DRV_VERSION "1.0.0-k0" | 48 | #define DRV_VERSION "1.0.0-k0" |
49 | char igbvf_driver_name[] = "igbvf"; | 49 | char igbvf_driver_name[] = "igbvf"; |
50 | const char igbvf_driver_version[] = DRV_VERSION; | 50 | const char igbvf_driver_version[] = DRV_VERSION; |
51 | struct pm_qos_request_list *igbvf_driver_pm_qos_req; | ||
51 | static const char igbvf_driver_string[] = | 52 | static const char igbvf_driver_string[] = |
52 | "Intel(R) Virtual Function Network Driver"; | 53 | "Intel(R) Virtual Function Network Driver"; |
53 | static const char igbvf_copyright[] = "Copyright (c) 2009 Intel Corporation."; | 54 | static const char igbvf_copyright[] = "Copyright (c) 2009 Intel Corporation."; |
@@ -2899,7 +2900,7 @@ static int __init igbvf_init_module(void) | |||
2899 | printk(KERN_INFO "%s\n", igbvf_copyright); | 2900 | printk(KERN_INFO "%s\n", igbvf_copyright); |
2900 | 2901 | ||
2901 | ret = pci_register_driver(&igbvf_driver); | 2902 | ret = pci_register_driver(&igbvf_driver); |
2902 | pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, igbvf_driver_name, | 2903 | igbvf_driver_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY, |
2903 | PM_QOS_DEFAULT_VALUE); | 2904 | PM_QOS_DEFAULT_VALUE); |
2904 | 2905 | ||
2905 | return ret; | 2906 | return ret; |
@@ -2915,7 +2916,8 @@ module_init(igbvf_init_module); | |||
2915 | static void __exit igbvf_exit_module(void) | 2916 | static void __exit igbvf_exit_module(void) |
2916 | { | 2917 | { |
2917 | pci_unregister_driver(&igbvf_driver); | 2918 | pci_unregister_driver(&igbvf_driver); |
2918 | pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, igbvf_driver_name); | 2919 | pm_qos_remove_request(igbvf_driver_pm_qos_req); |
2920 | igbvf_driver_pm_qos_req = NULL; | ||
2919 | } | 2921 | } |
2920 | module_exit(igbvf_exit_module); | 2922 | module_exit(igbvf_exit_module); |
2921 | 2923 | ||
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 9b72c45a7748..2b05fe5e994c 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c | |||
@@ -174,6 +174,8 @@ that only one external action is invoked at a time. | |||
174 | #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver" | 174 | #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver" |
175 | #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" | 175 | #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" |
176 | 176 | ||
177 | struct pm_qos_request_list *ipw2100_pm_qos_req; | ||
178 | |||
177 | /* Debugging stuff */ | 179 | /* Debugging stuff */ |
178 | #ifdef CONFIG_IPW2100_DEBUG | 180 | #ifdef CONFIG_IPW2100_DEBUG |
179 | #define IPW2100_RX_DEBUG /* Reception debugging */ | 181 | #define IPW2100_RX_DEBUG /* Reception debugging */ |
@@ -1739,7 +1741,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) | |||
1739 | /* the ipw2100 hardware really doesn't want power management delays | 1741 | /* the ipw2100 hardware really doesn't want power management delays |
1740 | * longer than 175usec | 1742 | * longer than 175usec |
1741 | */ | 1743 | */ |
1742 | pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", 175); | 1744 | pm_qos_update_request(ipw2100_pm_qos_req, 175); |
1743 | 1745 | ||
1744 | /* If the interrupt is enabled, turn it off... */ | 1746 | /* If the interrupt is enabled, turn it off... */ |
1745 | spin_lock_irqsave(&priv->low_lock, flags); | 1747 | spin_lock_irqsave(&priv->low_lock, flags); |
@@ -1887,8 +1889,7 @@ static void ipw2100_down(struct ipw2100_priv *priv) | |||
1887 | ipw2100_disable_interrupts(priv); | 1889 | ipw2100_disable_interrupts(priv); |
1888 | spin_unlock_irqrestore(&priv->low_lock, flags); | 1890 | spin_unlock_irqrestore(&priv->low_lock, flags); |
1889 | 1891 | ||
1890 | pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", | 1892 | pm_qos_update_request(ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE); |
1891 | PM_QOS_DEFAULT_VALUE); | ||
1892 | 1893 | ||
1893 | /* We have to signal any supplicant if we are disassociating */ | 1894 | /* We have to signal any supplicant if we are disassociating */ |
1894 | if (associated) | 1895 | if (associated) |
@@ -6669,7 +6670,7 @@ static int __init ipw2100_init(void) | |||
6669 | if (ret) | 6670 | if (ret) |
6670 | goto out; | 6671 | goto out; |
6671 | 6672 | ||
6672 | pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", | 6673 | ipw2100_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY, |
6673 | PM_QOS_DEFAULT_VALUE); | 6674 | PM_QOS_DEFAULT_VALUE); |
6674 | #ifdef CONFIG_IPW2100_DEBUG | 6675 | #ifdef CONFIG_IPW2100_DEBUG |
6675 | ipw2100_debug_level = debug; | 6676 | ipw2100_debug_level = debug; |
@@ -6692,7 +6693,7 @@ static void __exit ipw2100_exit(void) | |||
6692 | &driver_attr_debug_level); | 6693 | &driver_attr_debug_level); |
6693 | #endif | 6694 | #endif |
6694 | pci_unregister_driver(&ipw2100_pci_driver); | 6695 | pci_unregister_driver(&ipw2100_pci_driver); |
6695 | pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100"); | 6696 | pm_qos_remove_request(ipw2100_pm_qos_req); |
6696 | } | 6697 | } |
6697 | 6698 | ||
6698 | module_init(ipw2100_init); | 6699 | module_init(ipw2100_init); |