diff options
Diffstat (limited to 'include/linux/serial_core.h')
| -rw-r--r-- | include/linux/serial_core.h | 38 | 
1 files changed, 37 insertions, 1 deletions
| diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 047fa67d039b..5fe2b037e833 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -22,6 +22,7 @@  #include <linux/bitops.h>  #include <linux/compiler.h> +#include <linux/console.h>  #include <linux/interrupt.h>  #include <linux/circ_buf.h>  #include <linux/spinlock.h> @@ -175,6 +176,7 @@ struct uart_port {  	struct console		*cons;			/* struct console, if any */  #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)  	unsigned long		sysrq;			/* sysrq timeout */ +	unsigned int		sysrq_ch;		/* char for sysrq */  #endif  	/* flags must be updated while holding port mutex */ @@ -485,8 +487,42 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)  	}  	return 0;  } +static inline int +uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) +{ +	if (port->sysrq) { +		if (ch && time_before(jiffies, port->sysrq)) { +			port->sysrq_ch = ch; +			port->sysrq = 0; +			return 1; +		} +		port->sysrq = 0; +	} +	return 0; +} +static inline void +uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags) +{ +	int sysrq_ch; + +	sysrq_ch = port->sysrq_ch; +	port->sysrq_ch = 0; + +	spin_unlock_irqrestore(&port->lock, irqflags); + +	if (sysrq_ch) +		handle_sysrq(sysrq_ch); +}  #else -#define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; }) +static inline int +uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; } +static inline int +uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; } +static inline void +uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags) +{ +	spin_unlock_irqrestore(&port->lock, irqflags); +}  #endif  /* | 
