ARM: PL011: Separate hardware FIFO size from TTY FIFO size
authorRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 22 Dec 2010 17:13:05 +0000 (17:13 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 5 Jan 2011 16:58:45 +0000 (16:58 +0000)
With DMA support, we need to tell the TTY subsystem that the DMA buffer
is the size of the FIFO, otherwise things like tty_wait_until_sent()
will time out too early.  Keep (and use) the hardware value separately
from the port->fifosize.

This was part of a larger patch from Linus Walleij, with a little
modification.

Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/serial/amba-pl011.c

index 6afdd9b..f9b6b82 100644 (file)
@@ -97,6 +97,7 @@ struct uart_amba_port {
        const struct vendor_data *vendor;
        unsigned int            im;             /* interrupt mask */
        unsigned int            old_status;
+       unsigned int            fifosize;       /* vendor-specific */
        unsigned int            lcrh_tx;        /* vendor-specific */
        unsigned int            lcrh_rx;        /* vendor-specific */
        bool                    autorts;
@@ -203,7 +204,7 @@ static void pl011_tx_chars(struct uart_amba_port *uap)
                return;
        }
 
-       count = uap->port.fifosize >> 1;
+       count = uap->fifosize >> 1;
        do {
                writew(xmit->buf[xmit->tail], uap->port.membase + UART01x_DR);
                xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
@@ -541,7 +542,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
                if (!(termios->c_cflag & PARODD))
                        lcr_h |= UART01x_LCRH_EPS;
        }
-       if (port->fifosize > 1)
+       if (uap->fifosize > 1)
                lcr_h |= UART01x_LCRH_FEN;
 
        spin_lock_irqsave(&port->lock, flags);
@@ -871,12 +872,13 @@ static int pl011_probe(struct amba_device *dev, struct amba_id *id)
        uap->vendor = vendor;
        uap->lcrh_rx = vendor->lcrh_rx;
        uap->lcrh_tx = vendor->lcrh_tx;
+       uap->fifosize = vendor->fifosize;
        uap->port.dev = &dev->dev;
        uap->port.mapbase = dev->res.start;
        uap->port.membase = base;
        uap->port.iotype = UPIO_MEM;
        uap->port.irq = dev->irq[0];
-       uap->port.fifosize = vendor->fifosize;
+       uap->port.fifosize = uap->fifosize;
        uap->port.ops = &amba_pl011_pops;
        uap->port.flags = UPF_BOOT_AUTOCONF;
        uap->port.line = i;