mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
PM / Runtime: Use device type and device class callbacks
The power management of some devices is handled through device types and device classes rather than through bus types. Since these devices may also benefit from using the run-time power management core, extend it so that the device type and device class run-time PM callbacks can be taken into consideration by it if the bus type callback is not defined. Update the run-time PM core documentation to reflect this change. Signed-off-by: Rafael J. Wysocki <[email protected]>
This commit is contained in:
parent
aa0baaef97
commit
a6ab7aa9f4
2 changed files with 132 additions and 86 deletions
|
|
@ -84,6 +84,19 @@ static int __pm_runtime_idle(struct device *dev)
|
|||
|
||||
dev->bus->pm->runtime_idle(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
} else if (dev->type && dev->type->pm && dev->type->pm->runtime_idle) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
dev->type->pm->runtime_idle(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
} else if (dev->class && dev->class->pm
|
||||
&& dev->class->pm->runtime_idle) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
dev->class->pm->runtime_idle(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
}
|
||||
|
||||
|
|
@ -192,6 +205,22 @@ int __pm_runtime_suspend(struct device *dev, bool from_wq)
|
|||
|
||||
retval = dev->bus->pm->runtime_suspend(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.runtime_error = retval;
|
||||
} else if (dev->type && dev->type->pm
|
||||
&& dev->type->pm->runtime_suspend) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
retval = dev->type->pm->runtime_suspend(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.runtime_error = retval;
|
||||
} else if (dev->class && dev->class->pm
|
||||
&& dev->class->pm->runtime_suspend) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
retval = dev->class->pm->runtime_suspend(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.runtime_error = retval;
|
||||
} else {
|
||||
|
|
@ -357,6 +386,22 @@ int __pm_runtime_resume(struct device *dev, bool from_wq)
|
|||
|
||||
retval = dev->bus->pm->runtime_resume(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.runtime_error = retval;
|
||||
} else if (dev->type && dev->type->pm
|
||||
&& dev->type->pm->runtime_resume) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
retval = dev->type->pm->runtime_resume(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.runtime_error = retval;
|
||||
} else if (dev->class && dev->class->pm
|
||||
&& dev->class->pm->runtime_resume) {
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
retval = dev->class->pm->runtime_resume(dev);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
dev->power.runtime_error = retval;
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in a new issue