drivers: PL011: refactor pl011_startup()
Split the pl011_startup() function into smaller chunks to allow easier reuse later when adding SBSA support. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Tested-by: Mark Langsdorf <mlangsdo@redhat.com> Tested-by: Naresh Bhat <nbhat@cavium.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
49bb3c862c
commit
867b8e8e89
1 changed files with 28 additions and 20 deletions
|
@ -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)
|
static int pl011_startup(struct uart_port *port)
|
||||||
{
|
{
|
||||||
struct uart_amba_port *uap =
|
struct uart_amba_port *uap =
|
||||||
|
@ -1567,12 +1593,7 @@ static int pl011_startup(struct uart_port *port)
|
||||||
if (retval)
|
if (retval)
|
||||||
goto clk_dis;
|
goto clk_dis;
|
||||||
|
|
||||||
writew(uap->im, uap->port.membase + UART011_IMSC);
|
retval = pl011_allocate_irq(uap);
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate the IRQ
|
|
||||||
*/
|
|
||||||
retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011", uap);
|
|
||||||
if (retval)
|
if (retval)
|
||||||
goto clk_dis;
|
goto clk_dis;
|
||||||
|
|
||||||
|
@ -1595,20 +1616,7 @@ static int pl011_startup(struct uart_port *port)
|
||||||
/* Startup DMA */
|
/* Startup DMA */
|
||||||
pl011_dma_startup(uap);
|
pl011_dma_startup(uap);
|
||||||
|
|
||||||
/*
|
pl011_enable_interrupts(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);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue