From b2de3c2db7da47490a66d8a2630a6aaa9f78ac60 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Thu, 14 Jun 2012 12:18:46 +0800 Subject: [PATCH] --- yaml --- r: 325595 b: refs/heads/master c: cfe275c2db6932e81ea23288a8a74f0b815c9513 h: refs/heads/master i: 325593: 11add41fc0a22c8e341018258a0e40fc8da50130 325591: cf939c28fe345de40a8e23a12cbe0f82a8666613 v: v3 --- [refs] | 2 +- trunk/drivers/tty/serial/pxa.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 1125690bf2da..366df768b1ac 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2fc46915ecfbc51afcf995901f6ade7c3d503a25 +refs/heads/master: cfe275c2db6932e81ea23288a8a74f0b815c9513 diff --git a/trunk/drivers/tty/serial/pxa.c b/trunk/drivers/tty/serial/pxa.c index 5847a4b855f7..9033fc6e0e4e 100644 --- a/trunk/drivers/tty/serial/pxa.c +++ b/trunk/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); }