|
@@ -1556,6 +1556,32 @@ static void pl011_write_lcr_h(struct uart_amba_port *uap, unsigned int lcr_h)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int pl011_allocate_irq(struct uart_amba_port *uap)
|
|
|
+{
|
|
|
+ writew(uap->im, uap->port.membase + UART011_IMSC);
|
|
|
+
|
|
|
+ return request_irq(uap->port.irq, pl011_int, 0, "uart-pl011", uap);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Enable interrupts, only timeouts when using DMA
|
|
|
+ * if initial RX DMA job failed, start in interrupt mode
|
|
|
+ * as well.
|
|
|
+ */
|
|
|
+static void pl011_enable_interrupts(struct uart_amba_port *uap)
|
|
|
+{
|
|
|
+ spin_lock_irq(&uap->port.lock);
|
|
|
+
|
|
|
+ /* Clear out any spuriously appearing RX interrupts */
|
|
|
+ writew(UART011_RTIS | UART011_RXIS,
|
|
|
+ uap->port.membase + UART011_ICR);
|
|
|
+ uap->im = UART011_RTIM;
|
|
|
+ if (!pl011_dma_rx_running(uap))
|
|
|
+ uap->im |= UART011_RXIM;
|
|
|
+ writew(uap->im, uap->port.membase + UART011_IMSC);
|
|
|
+ spin_unlock_irq(&uap->port.lock);
|
|
|
+}
|
|
|
+
|
|
|
static int pl011_startup(struct uart_port *port)
|
|
|
{
|
|
|
struct uart_amba_port *uap =
|
|
@@ -1567,12 +1593,7 @@ static int pl011_startup(struct uart_port *port)
|
|
|
if (retval)
|
|
|
goto clk_dis;
|
|
|
|
|
|
- writew(uap->im, uap->port.membase + UART011_IMSC);
|
|
|
-
|
|
|
- /*
|
|
|
- * Allocate the IRQ
|
|
|
- */
|
|
|
- retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011", uap);
|
|
|
+ retval = pl011_allocate_irq(uap);
|
|
|
if (retval)
|
|
|
goto clk_dis;
|
|
|
|
|
@@ -1595,20 +1616,7 @@ static int pl011_startup(struct uart_port *port)
|
|
|
/* Startup DMA */
|
|
|
pl011_dma_startup(uap);
|
|
|
|
|
|
- /*
|
|
|
- * Finally, enable interrupts, only timeouts when using DMA
|
|
|
- * if initial RX DMA job failed, start in interrupt mode
|
|
|
- * as well.
|
|
|
- */
|
|
|
- spin_lock_irq(&uap->port.lock);
|
|
|
- /* Clear out any spuriously appearing RX interrupts */
|
|
|
- writew(UART011_RTIS | UART011_RXIS,
|
|
|
- uap->port.membase + UART011_ICR);
|
|
|
- uap->im = UART011_RTIM;
|
|
|
- if (!pl011_dma_rx_running(uap))
|
|
|
- uap->im |= UART011_RXIM;
|
|
|
- writew(uap->im, uap->port.membase + UART011_IMSC);
|
|
|
- spin_unlock_irq(&uap->port.lock);
|
|
|
+ pl011_enable_interrupts(uap);
|
|
|
|
|
|
return 0;
|
|
|
|