From 9999e48639b3cecb08ffb37358bcba3b48161b29 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 08:50:17 +0000
Subject: [PATCH] add ax88772_rst
---
kernel/kernel/power/wakeup_reason.c | 75 +++++++++++++++++--------------------
1 files changed, 34 insertions(+), 41 deletions(-)
diff --git a/kernel/kernel/power/wakeup_reason.c b/kernel/kernel/power/wakeup_reason.c
index 0a5f97a..8fefaa3 100644
--- a/kernel/kernel/power/wakeup_reason.c
+++ b/kernel/kernel/power/wakeup_reason.c
@@ -27,9 +27,6 @@
#include <linux/notifier.h>
#include <linux/suspend.h>
#include <linux/slab.h>
-#if defined(CONFIG_ROCKCHIP_SIP)
-#include <linux/rockchip/rockchip_sip.h>
-#endif
/*
* struct wakeup_irq_node - stores data and relationships for IRQs logged as
@@ -44,6 +41,13 @@
const char *irq_name;
};
+enum wakeup_reason_flag {
+ RESUME_NONE = 0,
+ RESUME_IRQ,
+ RESUME_ABORT,
+ RESUME_ABNORMAL,
+};
+
static DEFINE_SPINLOCK(wakeup_reason_lock);
static LIST_HEAD(leaf_irqs); /* kept in ascending IRQ sorted order */
@@ -56,8 +60,7 @@
static struct kobject *kobj;
static bool capture_reasons;
-static bool suspend_abort;
-static bool abnormal_wake;
+static int wakeup_reason;
static char non_irq_wake_reason[MAX_SUSPEND_ABORT_LEN];
static ktime_t last_monotime; /* monotonic time before last suspend */
@@ -150,6 +153,10 @@
unsigned long flags;
spin_lock_irqsave(&wakeup_reason_lock, flags);
+ if (wakeup_reason == RESUME_ABNORMAL || wakeup_reason == RESUME_ABORT) {
+ spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+ return;
+ }
if (!capture_reasons) {
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
@@ -159,6 +166,7 @@
if (find_node_in_list(&parent_irqs, irq) == NULL)
add_sibling_node_sorted(&leaf_irqs, irq);
+ wakeup_reason = RESUME_IRQ;
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}
@@ -179,6 +187,11 @@
spin_lock_irqsave(&wakeup_reason_lock, flags);
+ if (wakeup_reason == RESUME_ABNORMAL || wakeup_reason == RESUME_ABORT) {
+ spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+ return;
+ }
+
if (!capture_reasons || (find_node_in_list(&leaf_irqs, irq) != NULL)) {
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
@@ -198,6 +211,7 @@
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
}
+EXPORT_SYMBOL_GPL(log_threaded_irq_wakeup_reason);
static void __log_abort_or_abnormal_wake(bool abort, const char *fmt,
va_list args)
@@ -207,13 +221,16 @@
spin_lock_irqsave(&wakeup_reason_lock, flags);
/* Suspend abort or abnormal wake reason has already been logged. */
- if (suspend_abort || abnormal_wake) {
+ if (wakeup_reason != RESUME_NONE) {
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
}
- suspend_abort = abort;
- abnormal_wake = !abort;
+ if (abort)
+ wakeup_reason = RESUME_ABORT;
+ else
+ wakeup_reason = RESUME_ABNORMAL;
+
vsnprintf(non_irq_wake_reason, MAX_SUSPEND_ABORT_LEN, fmt, args);
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
@@ -227,6 +244,7 @@
__log_abort_or_abnormal_wake(true, fmt, args);
va_end(args);
}
+EXPORT_SYMBOL_GPL(log_suspend_abort_reason);
void log_abnormal_wakeup_reason(const char *fmt, ...)
{
@@ -236,6 +254,7 @@
__log_abort_or_abnormal_wake(false, fmt, args);
va_end(args);
}
+EXPORT_SYMBOL_GPL(log_abnormal_wakeup_reason);
void clear_wakeup_reasons(void)
{
@@ -245,8 +264,7 @@
delete_list(&leaf_irqs);
delete_list(&parent_irqs);
- suspend_abort = false;
- abnormal_wake = false;
+ wakeup_reason = RESUME_NONE;
capture_reasons = true;
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
@@ -261,17 +279,17 @@
capture_reasons = false;
- if (suspend_abort) {
+ if (wakeup_reason == RESUME_ABORT) {
pr_info("Abort: %s\n", non_irq_wake_reason);
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return;
}
- if (!list_empty(&leaf_irqs))
+ if (wakeup_reason == RESUME_IRQ && !list_empty(&leaf_irqs))
list_for_each_entry(n, &leaf_irqs, siblings)
pr_info("Resume caused by IRQ %d, %s\n", n->irq,
n->irq_name);
- else if (abnormal_wake)
+ else if (wakeup_reason == RESUME_ABNORMAL)
pr_info("Resume caused by %s\n", non_irq_wake_reason);
else
pr_info("Resume cause unknown\n");
@@ -288,19 +306,19 @@
spin_lock_irqsave(&wakeup_reason_lock, flags);
- if (suspend_abort) {
+ if (wakeup_reason == RESUME_ABORT) {
buf_offset = scnprintf(buf, PAGE_SIZE, "Abort: %s",
non_irq_wake_reason);
spin_unlock_irqrestore(&wakeup_reason_lock, flags);
return buf_offset;
}
- if (!list_empty(&leaf_irqs))
+ if (wakeup_reason == RESUME_IRQ && !list_empty(&leaf_irqs))
list_for_each_entry(n, &leaf_irqs, siblings)
buf_offset += scnprintf(buf + buf_offset,
PAGE_SIZE - buf_offset,
"%d %s\n", n->irq, n->irq_name);
- else if (abnormal_wake)
+ else if (wakeup_reason == RESUME_ABNORMAL)
buf_offset = scnprintf(buf, PAGE_SIZE, "-1 %s",
non_irq_wake_reason);
@@ -340,37 +358,12 @@
sleep_time.tv_nsec);
}
-#if defined(CONFIG_ROCKCHIP_SIP)
-static ssize_t total_suspend_wfi_time_show(struct kobject *kobj,
- struct kobj_attribute *attr,
- char *buf)
-{
- struct arm_smccc_res res;
- unsigned long wfi_time_ms;
-
- res = sip_smc_get_suspend_info(SUSPEND_WFI_TIME_MS);
- if (res.a0)
- wfi_time_ms = 0;
- else
- wfi_time_ms = res.a1;
-
- return sprintf(buf, "%lu.%02lu\n", wfi_time_ms / MSEC_PER_SEC,
- (wfi_time_ms % MSEC_PER_SEC) / 10);
-}
-#endif
-
static struct kobj_attribute resume_reason = __ATTR_RO(last_resume_reason);
static struct kobj_attribute suspend_time = __ATTR_RO(last_suspend_time);
-#if defined(CONFIG_ROCKCHIP_SIP)
-static struct kobj_attribute suspend_wfi_time = __ATTR_RO(total_suspend_wfi_time);
-#endif
static struct attribute *attrs[] = {
&resume_reason.attr,
&suspend_time.attr,
-#if defined(CONFIG_ROCKCHIP_SIP)
- &suspend_wfi_time.attr,
-#endif
NULL,
};
static struct attribute_group attr_group = {
--
Gitblit v1.6.2