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 <rjw@sisk.pl>
This commit is contained in:
@@ -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 {
|
||||
|
Viittaa uudesa ongelmassa
Block a user