|
|
@@ -966,13 +966,13 @@ int __pm_runtime_idle(struct device *dev, int rpmflags)
|
|
|
unsigned long flags;
|
|
|
int retval;
|
|
|
|
|
|
- might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe);
|
|
|
-
|
|
|
if (rpmflags & RPM_GET_PUT) {
|
|
|
if (!atomic_dec_and_test(&dev->power.usage_count))
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe);
|
|
|
+
|
|
|
spin_lock_irqsave(&dev->power.lock, flags);
|
|
|
retval = rpm_idle(dev, rpmflags);
|
|
|
spin_unlock_irqrestore(&dev->power.lock, flags);
|
|
|
@@ -998,13 +998,13 @@ int __pm_runtime_suspend(struct device *dev, int rpmflags)
|
|
|
unsigned long flags;
|
|
|
int retval;
|
|
|
|
|
|
- might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe);
|
|
|
-
|
|
|
if (rpmflags & RPM_GET_PUT) {
|
|
|
if (!atomic_dec_and_test(&dev->power.usage_count))
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe);
|
|
|
+
|
|
|
spin_lock_irqsave(&dev->power.lock, flags);
|
|
|
retval = rpm_suspend(dev, rpmflags);
|
|
|
spin_unlock_irqrestore(&dev->power.lock, flags);
|
|
|
@@ -1029,7 +1029,8 @@ int __pm_runtime_resume(struct device *dev, int rpmflags)
|
|
|
unsigned long flags;
|
|
|
int retval;
|
|
|
|
|
|
- might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe);
|
|
|
+ might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe &&
|
|
|
+ dev->power.runtime_status != RPM_ACTIVE);
|
|
|
|
|
|
if (rpmflags & RPM_GET_PUT)
|
|
|
atomic_inc(&dev->power.usage_count);
|