hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/base/power/runtime.c
....@@ -464,7 +464,10 @@
464464 /* Pending requests need to be canceled. */
465465 dev->power.request = RPM_REQ_NONE;
466466
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)
468471 goto out;
469472
470473 /* Carry out an asynchronous or a synchronous idle notification. */
....@@ -480,10 +483,17 @@
480483
481484 dev->power.idle_notification = true;
482485
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);
484490
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);
487497
488498 dev->power.idle_notification = false;
489499 wake_up_all(&dev->power.wait_queue);
....@@ -665,6 +675,8 @@
665675 if (retval)
666676 goto fail;
667677
678
+ dev_pm_enable_wake_irq_complete(dev);
679
+
668680 no_callback:
669681 __update_runtime_status(dev, RPM_SUSPENDED);
670682 pm_runtime_deactivate_timer(dev);
....@@ -710,7 +722,7 @@
710722 return retval;
711723
712724 fail:
713
- dev_pm_disable_wake_irq_check(dev);
725
+ dev_pm_disable_wake_irq_check(dev, true);
714726 __update_runtime_status(dev, RPM_ACTIVE);
715727 dev->power.deferred_resume = false;
716728 wake_up_all(&dev->power.wait_queue);
....@@ -893,7 +905,7 @@
893905
894906 callback = RPM_GET_CALLBACK(dev, runtime_resume);
895907
896
- dev_pm_disable_wake_irq_check(dev);
908
+ dev_pm_disable_wake_irq_check(dev, false);
897909 retval = rpm_callback(callback, dev);
898910 if (retval) {
899911 __update_runtime_status(dev, RPM_SUSPENDED);