.. | .. |
---|
464 | 464 | /* Pending requests need to be canceled. */ |
---|
465 | 465 | dev->power.request = RPM_REQ_NONE; |
---|
466 | 466 | |
---|
467 | | - if (dev->power.no_callbacks) |
---|
| 467 | + callback = RPM_GET_CALLBACK(dev, runtime_idle); |
---|
| 468 | + |
---|
| 469 | + /* If no callback assume success. */ |
---|
| 470 | + if (!callback || dev->power.no_callbacks) |
---|
468 | 471 | goto out; |
---|
469 | 472 | |
---|
470 | 473 | /* Carry out an asynchronous or a synchronous idle notification. */ |
---|
.. | .. |
---|
480 | 483 | |
---|
481 | 484 | dev->power.idle_notification = true; |
---|
482 | 485 | |
---|
483 | | - callback = RPM_GET_CALLBACK(dev, runtime_idle); |
---|
| 486 | + if (dev->power.irq_safe) |
---|
| 487 | + spin_unlock(&dev->power.lock); |
---|
| 488 | + else |
---|
| 489 | + spin_unlock_irq(&dev->power.lock); |
---|
484 | 490 | |
---|
485 | | - if (callback) |
---|
486 | | - retval = __rpm_callback(callback, dev); |
---|
| 491 | + retval = callback(dev); |
---|
| 492 | + |
---|
| 493 | + if (dev->power.irq_safe) |
---|
| 494 | + spin_lock(&dev->power.lock); |
---|
| 495 | + else |
---|
| 496 | + spin_lock_irq(&dev->power.lock); |
---|
487 | 497 | |
---|
488 | 498 | dev->power.idle_notification = false; |
---|
489 | 499 | wake_up_all(&dev->power.wait_queue); |
---|
.. | .. |
---|
665 | 675 | if (retval) |
---|
666 | 676 | goto fail; |
---|
667 | 677 | |
---|
| 678 | + dev_pm_enable_wake_irq_complete(dev); |
---|
| 679 | + |
---|
668 | 680 | no_callback: |
---|
669 | 681 | __update_runtime_status(dev, RPM_SUSPENDED); |
---|
670 | 682 | pm_runtime_deactivate_timer(dev); |
---|
.. | .. |
---|
710 | 722 | return retval; |
---|
711 | 723 | |
---|
712 | 724 | fail: |
---|
713 | | - dev_pm_disable_wake_irq_check(dev); |
---|
| 725 | + dev_pm_disable_wake_irq_check(dev, true); |
---|
714 | 726 | __update_runtime_status(dev, RPM_ACTIVE); |
---|
715 | 727 | dev->power.deferred_resume = false; |
---|
716 | 728 | wake_up_all(&dev->power.wait_queue); |
---|
.. | .. |
---|
893 | 905 | |
---|
894 | 906 | callback = RPM_GET_CALLBACK(dev, runtime_resume); |
---|
895 | 907 | |
---|
896 | | - dev_pm_disable_wake_irq_check(dev); |
---|
| 908 | + dev_pm_disable_wake_irq_check(dev, false); |
---|
897 | 909 | retval = rpm_callback(callback, dev); |
---|
898 | 910 | if (retval) { |
---|
899 | 911 | __update_runtime_status(dev, RPM_SUSPENDED); |
---|