diff options
Diffstat (limited to 'drivers/tty/serial/pxa.c')
| -rw-r--r-- | drivers/tty/serial/pxa.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c index 5847a4b855f..9033fc6e0e4 100644 --- a/drivers/tty/serial/pxa.c +++ b/drivers/tty/serial/pxa.c @@ -670,9 +670,19 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)  {  	struct uart_pxa_port *up = serial_pxa_ports[co->index];  	unsigned int ier; +	unsigned long flags; +	int locked = 1;  	clk_prepare_enable(up->clk); +	local_irq_save(flags); +	if (up->port.sysrq) +		locked = 0; +	else if (oops_in_progress) +		locked = spin_trylock(&up->port.lock); +	else +		spin_lock(&up->port.lock); +  	/*  	 *	First save the IER then disable the interrupts  	 */ @@ -688,6 +698,10 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)  	wait_for_xmitr(up);  	serial_out(up, UART_IER, ier); +	if (locked) +		spin_unlock(&up->port.lock); +	local_irq_restore(flags); +  	clk_disable_unprepare(up->clk);  }  |