Commit 6e14f7c1 authored by Soren Brinkmann's avatar Soren Brinkmann Committed by Greg Kroah-Hartman

tty: xuartps: Improve startup function

The startup function is supposed to initialize the UART for receiving.
Hence, don't enable the TX part. Also, protect HW accesses with the port
lock.
Signed-off-by: default avatarSoren Brinkmann <soren.brinkmann@xilinx.com>
Reviewed-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent aea8f3dd
...@@ -758,6 +758,7 @@ static void cdns_uart_set_termios(struct uart_port *port, ...@@ -758,6 +758,7 @@ static void cdns_uart_set_termios(struct uart_port *port,
*/ */
static int cdns_uart_startup(struct uart_port *port) static int cdns_uart_startup(struct uart_port *port)
{ {
unsigned long flags;
unsigned int retval = 0, status = 0; unsigned int retval = 0, status = 0;
retval = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, retval = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME,
...@@ -765,6 +766,8 @@ static int cdns_uart_startup(struct uart_port *port) ...@@ -765,6 +766,8 @@ static int cdns_uart_startup(struct uart_port *port)
if (retval) if (retval)
return retval; return retval;
spin_lock_irqsave(&port->lock, flags);
/* Disable the TX and RX */ /* Disable the TX and RX */
writel(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS, writel(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS,
port->membase + CDNS_UART_CR_OFFSET); port->membase + CDNS_UART_CR_OFFSET);
...@@ -775,15 +778,14 @@ static int cdns_uart_startup(struct uart_port *port) ...@@ -775,15 +778,14 @@ static int cdns_uart_startup(struct uart_port *port)
writel(CDNS_UART_CR_TXRST | CDNS_UART_CR_RXRST, writel(CDNS_UART_CR_TXRST | CDNS_UART_CR_RXRST,
port->membase + CDNS_UART_CR_OFFSET); port->membase + CDNS_UART_CR_OFFSET);
status = readl(port->membase + CDNS_UART_CR_OFFSET); /*
* Clear the RX disable bit and then set the RX enable bit to enable
/* Clear the RX disable and TX disable bits and then set the TX enable * the receiver.
* bit and RX enable bit to enable the transmitter and receiver.
*/ */
writel((status & ~(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS)) status = readl(port->membase + CDNS_UART_CR_OFFSET);
| (CDNS_UART_CR_TX_EN | CDNS_UART_CR_RX_EN | status &= CDNS_UART_CR_RX_DIS;
CDNS_UART_CR_STOPBRK), status |= CDNS_UART_CR_RX_EN;
port->membase + CDNS_UART_CR_OFFSET); writel(status, port->membase + CDNS_UART_CR_OFFSET);
/* Set the Mode Register with normal mode,8 data bits,1 stop bit, /* Set the Mode Register with normal mode,8 data bits,1 stop bit,
* no parity. * no parity.
...@@ -814,6 +816,8 @@ static int cdns_uart_startup(struct uart_port *port) ...@@ -814,6 +816,8 @@ static int cdns_uart_startup(struct uart_port *port)
CDNS_UART_IXR_RXTRIG | CDNS_UART_IXR_TOUT, CDNS_UART_IXR_RXTRIG | CDNS_UART_IXR_TOUT,
port->membase + CDNS_UART_IER_OFFSET); port->membase + CDNS_UART_IER_OFFSET);
spin_unlock_irqrestore(&port->lock, flags);
return retval; return retval;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment