|
@@ -1751,9 +1751,19 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)
|
|
|
{
|
|
|
struct uart_amba_port *uap = amba_ports[co->index];
|
|
|
unsigned int status, old_cr, new_cr;
|
|
|
+ unsigned long flags;
|
|
|
+ int locked = 1;
|
|
|
|
|
|
clk_enable(uap->clk);
|
|
|
|
|
|
+ local_irq_save(flags);
|
|
|
+ if (uap->port.sysrq)
|
|
|
+ locked = 0;
|
|
|
+ else if (oops_in_progress)
|
|
|
+ locked = spin_trylock(&uap->port.lock);
|
|
|
+ else
|
|
|
+ spin_lock(&uap->port.lock);
|
|
|
+
|
|
|
/*
|
|
|
* First save the CR then disable the interrupts
|
|
|
*/
|
|
@@ -1773,6 +1783,10 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)
|
|
|
} while (status & UART01x_FR_BUSY);
|
|
|
writew(old_cr, uap->port.membase + UART011_CR);
|
|
|
|
|
|
+ if (locked)
|
|
|
+ spin_unlock(&uap->port.lock);
|
|
|
+ local_irq_restore(flags);
|
|
|
+
|
|
|
clk_disable(uap->clk);
|
|
|
}
|
|
|
|