firmware/br-ext-chip-allwinner/board/v83x/kernel/patches/00000-drivers_base_power_ma...

63 lines
1.9 KiB
Diff

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 <linux/cpufreq.h>
#include <linux/cpuidle.h>
#include <linux/timer.h>
+#include <linux/wakeup_reason.h>
#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;
}