diff options
| author | Maggie White <maggiewhite@google.com> | 2017-04-17 11:32:46 -0700 |
|---|---|---|
| committer | Michael Bestas <mkbestas@lineageos.org> | 2019-12-23 23:43:35 +0200 |
| commit | 5963c396815ed1e42386f179c19f497d03fcf732 (patch) | |
| tree | 05c0ba4a6eaafea4be68b5e977524b0dd54b5851 /drivers | |
| parent | c84c6fa6b63762567d6f29e4591d9d3597328636 (diff) | |
power: Add detailed suspend abort reason
Test: dumpsys batterystats
Bug: 30874086
(cherry picked from commit a9d6bead120dab67e00bfe5500a616f83b94cf44)
Change-Id: I9feae71693b4addd45550b19ecab7dfd7371c378
Signed-off-by: Maggie White <maggiewhite@google.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/power/main.c | 25 | ||||
| -rw-r--r-- | drivers/base/power/wakeup.c | 7 |
2 files changed, 22 insertions, 10 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 4192e46eda37..07d3de65e990 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -1058,11 +1058,13 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a } error = dpm_run_callback(callback, dev, state, info); - if (!error) + if (!error) { dev->power.is_noirq_suspended = true; - else + } else { + log_suspend_abort_reason("Callback failed on %s in %pF returned %d", + dev_name(dev), callback, error); async_error = error; - + } Complete: complete_all(&dev->power.completion); TRACE_SUSPEND(error); @@ -1205,10 +1207,13 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as } error = dpm_run_callback(callback, dev, state, info); - if (!error) + if (!error) { dev->power.is_late_suspended = true; - else + } else { + log_suspend_abort_reason("Callback failed on %s in %pF returned %d", + dev_name(dev), callback, error); async_error = error; + } Complete: TRACE_SUSPEND(error); @@ -1351,7 +1356,6 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) 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); @@ -1374,9 +1378,6 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) 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); dev->power.direct_complete = false; async_error = -EBUSY; goto Complete; @@ -1463,6 +1464,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) spin_unlock_irq(&parent->power.lock); } + } else { + log_suspend_abort_reason("Callback failed on %s in %pF returned %d", + dev_name(dev), callback, error); } device_unlock(dev); @@ -1666,6 +1670,9 @@ int dpm_prepare(pm_message_t state) printk(KERN_INFO "PM: Device %s not prepared " "for power transition: code %d\n", dev_name(dev), error); + log_suspend_abort_reason("Device %s not prepared " + "for power transition: code %d", + dev_name(dev), error); put_device(dev); break; } diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c index 37658ff761ed..5f3bd234c4be 100644 --- a/drivers/base/power/wakeup.c +++ b/drivers/base/power/wakeup.c @@ -16,6 +16,7 @@ #include <linux/debugfs.h> #include <linux/pm_wakeirq.h> #include <linux/types.h> +#include <linux/wakeup_reason.h> #include <trace/events/power.h> #include "power.h" @@ -884,6 +885,7 @@ bool pm_wakeup_pending(void) { unsigned long flags; bool ret = false; + char suspend_abort[MAX_SUSPEND_ABORT_LEN]; spin_lock_irqsave(&events_lock, flags); if (events_check_enabled) { @@ -897,7 +899,10 @@ bool pm_wakeup_pending(void) if (ret) { pr_info("PM: Wakeup pending, aborting suspend\n"); - pm_print_active_wakeup_sources(); + pm_get_active_wakeup_sources(suspend_abort, + MAX_SUSPEND_ABORT_LEN); + log_suspend_abort_reason(suspend_abort); + pr_info("PM: %s\n", suspend_abort); } return ret || pm_abort_suspend; |
