diff options
Diffstat (limited to 'drivers/base/power/runtime.c')
| -rw-r--r-- | drivers/base/power/runtime.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 40d7720a4b21..f8b044e8aef7 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
| @@ -85,6 +85,19 @@ static int __pm_runtime_idle(struct device *dev) | |||
| 85 | dev->bus->pm->runtime_idle(dev); | 85 | dev->bus->pm->runtime_idle(dev); |
| 86 | 86 | ||
| 87 | spin_lock_irq(&dev->power.lock); | 87 | spin_lock_irq(&dev->power.lock); |
| 88 | } else if (dev->type && dev->type->pm && dev->type->pm->runtime_idle) { | ||
| 89 | spin_unlock_irq(&dev->power.lock); | ||
| 90 | |||
| 91 | dev->type->pm->runtime_idle(dev); | ||
| 92 | |||
| 93 | spin_lock_irq(&dev->power.lock); | ||
| 94 | } else if (dev->class && dev->class->pm | ||
| 95 | && dev->class->pm->runtime_idle) { | ||
| 96 | spin_unlock_irq(&dev->power.lock); | ||
| 97 | |||
| 98 | dev->class->pm->runtime_idle(dev); | ||
| 99 | |||
| 100 | spin_lock_irq(&dev->power.lock); | ||
| 88 | } | 101 | } |
| 89 | 102 | ||
| 90 | dev->power.idle_notification = false; | 103 | dev->power.idle_notification = false; |
| @@ -194,6 +207,22 @@ int __pm_runtime_suspend(struct device *dev, bool from_wq) | |||
| 194 | 207 | ||
| 195 | spin_lock_irq(&dev->power.lock); | 208 | spin_lock_irq(&dev->power.lock); |
| 196 | dev->power.runtime_error = retval; | 209 | dev->power.runtime_error = retval; |
| 210 | } else if (dev->type && dev->type->pm | ||
| 211 | && dev->type->pm->runtime_suspend) { | ||
| 212 | spin_unlock_irq(&dev->power.lock); | ||
| 213 | |||
| 214 | retval = dev->type->pm->runtime_suspend(dev); | ||
| 215 | |||
| 216 | spin_lock_irq(&dev->power.lock); | ||
| 217 | dev->power.runtime_error = retval; | ||
| 218 | } else if (dev->class && dev->class->pm | ||
| 219 | && dev->class->pm->runtime_suspend) { | ||
| 220 | spin_unlock_irq(&dev->power.lock); | ||
| 221 | |||
| 222 | retval = dev->class->pm->runtime_suspend(dev); | ||
| 223 | |||
| 224 | spin_lock_irq(&dev->power.lock); | ||
| 225 | dev->power.runtime_error = retval; | ||
| 197 | } else { | 226 | } else { |
| 198 | retval = -ENOSYS; | 227 | retval = -ENOSYS; |
| 199 | } | 228 | } |
| @@ -359,6 +388,22 @@ int __pm_runtime_resume(struct device *dev, bool from_wq) | |||
| 359 | 388 | ||
| 360 | spin_lock_irq(&dev->power.lock); | 389 | spin_lock_irq(&dev->power.lock); |
| 361 | dev->power.runtime_error = retval; | 390 | dev->power.runtime_error = retval; |
| 391 | } else if (dev->type && dev->type->pm | ||
| 392 | && dev->type->pm->runtime_resume) { | ||
| 393 | spin_unlock_irq(&dev->power.lock); | ||
| 394 | |||
| 395 | retval = dev->type->pm->runtime_resume(dev); | ||
| 396 | |||
| 397 | spin_lock_irq(&dev->power.lock); | ||
| 398 | dev->power.runtime_error = retval; | ||
| 399 | } else if (dev->class && dev->class->pm | ||
| 400 | && dev->class->pm->runtime_resume) { | ||
| 401 | spin_unlock_irq(&dev->power.lock); | ||
| 402 | |||
| 403 | retval = dev->class->pm->runtime_resume(dev); | ||
| 404 | |||
| 405 | spin_lock_irq(&dev->power.lock); | ||
| 406 | dev->power.runtime_error = retval; | ||
| 362 | } else { | 407 | } else { |
| 363 | retval = -ENOSYS; | 408 | retval = -ENOSYS; |
| 364 | } | 409 | } |
