diff -drupN a/drivers/base/power/main.c b/drivers/base/power/main.c --- a/drivers/base/power/main.c 2018-08-06 17:23:04.000000000 +0300 +++ b/drivers/base/power/main.c 2022-06-12 05:28:14.000000000 +0300 @@ -33,6 +33,7 @@ #include #include #include +#include #include "../base.h" #include "power.h" @@ -95,6 +96,7 @@ void device_pm_sleep_init(struct device dev->power.is_suspended = false; dev->power.is_noirq_suspended = false; dev->power.is_late_suspended = false; + dev->power.is_runtime_disabled = false; init_completion(&dev->power.completion); complete_all(&dev->power.completion); dev->power.wakeup = NULL; @@ -746,7 +748,10 @@ static int device_resume(struct device * if (dev->power.direct_complete) { /* Match the pm_runtime_disable() in __device_suspend(). */ - pm_runtime_enable(dev); + if (dev->power.is_runtime_disabled == true) { + pm_runtime_enable(dev); + dev->power.is_runtime_disabled = false; + } goto Complete; } @@ -1353,6 +1358,7 @@ static int __device_suspend(struct devic pm_callback_t callback = NULL; char *info = NULL; int error = 0; + char suspend_abort[MAX_SUSPEND_ABORT_LEN]; DECLARE_DPM_WATCHDOG_ON_STACK(wd); TRACE_DEVICE(dev); @@ -1373,6 +1379,9 @@ static int __device_suspend(struct devic pm_wakeup_event(dev, 0); if (pm_wakeup_pending()) { + pm_get_active_wakeup_sources(suspend_abort, + MAX_SUSPEND_ABORT_LEN); + log_suspend_abort_reason(suspend_abort); async_error = -EBUSY; goto Complete; } @@ -1383,10 +1392,12 @@ static int __device_suspend(struct devic if (dev->power.direct_complete) { if (pm_runtime_status_suspended(dev)) { pm_runtime_disable(dev); + dev->power.is_runtime_disabled = true; if (pm_runtime_status_suspended(dev)) goto Complete; pm_runtime_enable(dev); + dev->power.is_runtime_disabled = false; } dev->power.direct_complete = false; }