mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
a50130f1be
Introduce a config item, CONFIG_DEDUCE_WAKEUP_REASONS, disabled by default. Make CONFIG_PARTUALRESUME select it. Change-Id: I7d831ff0a9dfe0a504824f4bc65ba55c4d92546b Signed-off-by: Iliyan Malchev <malchev@google.com>
104 lines
3.1 KiB
C
104 lines
3.1 KiB
C
/*
|
|
* include/linux/wakeup_reason.h
|
|
*
|
|
* Logs the reason which caused the kernel to resume
|
|
* from the suspend mode.
|
|
*
|
|
* Copyright (C) 2014 Google, Inc.
|
|
* This software is licensed under the terms of the GNU General Public
|
|
* License version 2, as published by the Free Software Foundation, and
|
|
* may be copied, distributed, and modified under those terms.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef _LINUX_WAKEUP_REASON_H
|
|
#define _LINUX_WAKEUP_REASON_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/completion.h>
|
|
|
|
#define MAX_SUSPEND_ABORT_LEN 256
|
|
|
|
struct wakeup_irq_node {
|
|
/* @leaf is a linked list of all leaf nodes in the interrupts trees.
|
|
*/
|
|
struct list_head next;
|
|
/* @irq: IRQ number of this node.
|
|
*/
|
|
int irq;
|
|
struct irq_desc *desc;
|
|
|
|
/* @siblings contains the list of irq nodes at the same depth; at a
|
|
* depth of zero, this is the list of base wakeup interrupts.
|
|
*/
|
|
struct list_head siblings;
|
|
/* @parent: only one node in a siblings list has a pointer to the
|
|
* parent; that node is the head of the list of siblings.
|
|
*/
|
|
struct wakeup_irq_node *parent;
|
|
/* @child: any node can have one child
|
|
*/
|
|
struct wakeup_irq_node *child;
|
|
/* @handled: this flag is set to true when the interrupt handler (one of
|
|
* handle_.*_irq in kernel/irq/handle.c) for this node gets called; it is set
|
|
* to false otherwise. We use this flag to determine whether a subtree rooted
|
|
* at a node has been handled. When all trees rooted at
|
|
* base-wakeup-interrupt nodes have been handled, we stop logging
|
|
* potential wakeup interrupts, and construct the list of actual
|
|
* wakeups from the leaves of these trees.
|
|
*/
|
|
bool handled;
|
|
};
|
|
|
|
#ifdef CONFIG_DEDUCE_WAKEUP_REASONS
|
|
|
|
/* Called in the resume path, with interrupts and nonboot cpus disabled; on
|
|
* need for a spinlock.
|
|
*/
|
|
static inline void start_logging_wakeup_reasons(void)
|
|
{
|
|
extern bool log_wakeups;
|
|
extern struct completion wakeups_completion;
|
|
ACCESS_ONCE(log_wakeups) = true;
|
|
init_completion(&wakeups_completion);
|
|
}
|
|
|
|
static inline bool logging_wakeup_reasons_nosync(void)
|
|
{
|
|
extern bool log_wakeups;
|
|
return ACCESS_ONCE(log_wakeups);
|
|
}
|
|
|
|
static inline bool logging_wakeup_reasons(void)
|
|
{
|
|
smp_rmb();
|
|
return logging_wakeup_reasons_nosync();
|
|
}
|
|
|
|
bool log_possible_wakeup_reason(int irq,
|
|
struct irq_desc *desc,
|
|
bool (*handler)(unsigned int, struct irq_desc *));
|
|
|
|
#else
|
|
|
|
static inline void start_logging_wakeup_reasons(void) {}
|
|
static inline bool logging_wakeup_reasons_nosync(void) { return false; }
|
|
static inline bool logging_wakeup_reasons(void) { return false; }
|
|
static inline bool log_possible_wakeup_reason(int irq,
|
|
struct irq_desc *desc,
|
|
bool (*handler)(unsigned int, struct irq_desc *)) { return true; }
|
|
|
|
#endif
|
|
|
|
const struct list_head*
|
|
get_wakeup_reasons(unsigned long timeout, struct list_head *unfinished);
|
|
void log_base_wakeup_reason(int irq);
|
|
void clear_wakeup_reasons(void);
|
|
void log_suspend_abort_reason(const char *fmt, ...);
|
|
int check_wakeup_reason(int irq);
|
|
|
|
#endif /* _LINUX_WAKEUP_REASON_H */
|