| .. | .. |
|---|
| 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); |
|---|