diff options
-rw-r--r-- | drivers/tty/serial/imx.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 27e14b3cce9a..e10068b785a3 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -2314,9 +2314,12 @@ static int serial_imx_remove(struct platform_device *pdev) static void serial_imx_restore_context(struct imx_port *sport) { + unsigned long flags = 0; + if (!sport->context_saved) return; + spin_lock_irqsave(&sport->port.lock, flags); writel(sport->saved_reg[4], sport->port.membase + UFCR); writel(sport->saved_reg[5], sport->port.membase + UESC); writel(sport->saved_reg[6], sport->port.membase + UTIM); @@ -2328,11 +2331,15 @@ static void serial_imx_restore_context(struct imx_port *sport) writel(sport->saved_reg[2], sport->port.membase + UCR3); writel(sport->saved_reg[3], sport->port.membase + UCR4); sport->context_saved = false; + spin_unlock_irqrestore(&sport->port.lock, flags); } static void serial_imx_save_context(struct imx_port *sport) { + unsigned long flags = 0; + /* Save necessary regs */ + spin_lock_irqsave(&sport->port.lock, flags); sport->saved_reg[0] = readl(sport->port.membase + UCR1); sport->saved_reg[1] = readl(sport->port.membase + UCR2); sport->saved_reg[2] = readl(sport->port.membase + UCR3); @@ -2344,6 +2351,10 @@ static void serial_imx_save_context(struct imx_port *sport) sport->saved_reg[8] = readl(sport->port.membase + UBMR); sport->saved_reg[9] = readl(sport->port.membase + IMX21_UTS); sport->context_saved = true; + + if (uart_console(&sport->port) && sport->port.sysrq) + sport->saved_reg[0] |= UCR1_RRDYEN; + spin_unlock_irqrestore(&sport->port.lock, flags); } static void serial_imx_enable_wakeup(struct imx_port *sport, bool on) |