From: Phil Elwell Date: Fri, 24 Jan 2020 11:38:28 +0000 (+0000) Subject: tty: amba-pl011: Add un/throttle support X-Git-Tag: accepted/tizen/unified/20230118.172025~1512 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=159f4c6402fadc30c984cc13e6e19e7d233a77b9;p=platform%2Fkernel%2Flinux-rpi.git tty: amba-pl011: Add un/throttle support The PL011 driver lacks throttle and unthrottle methods. As a result, sending more data to the Pi than it can immediately sink while CRTSCTS is enabled causes a NULL pointer to be followed. Add a throttle handler that disables the RX interrupts, and an unthrottle handler that reenables them. Signed-off-by: Phil Elwell --- diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 2304975..6c122d2 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -1355,6 +1355,32 @@ static void pl011_start_tx(struct uart_port *port) pl011_start_tx_pio(uap); } +static void pl011_throttle(struct uart_port *port) +{ + struct uart_amba_port *uap = + container_of(port, struct uart_amba_port, port); + unsigned long flags; + + spin_lock_irqsave(&uap->port.lock, flags); + uap->im &= ~(UART011_RTIM | UART011_RXIM); + pl011_write(uap->im, uap, REG_IMSC); + spin_unlock_irqrestore(&uap->port.lock, flags); +} + +static void pl011_unthrottle(struct uart_port *port) +{ + struct uart_amba_port *uap = + container_of(port, struct uart_amba_port, port); + unsigned long flags; + + spin_lock_irqsave(&uap->port.lock, flags); + uap->im |= UART011_RTIM; + if (!pl011_dma_rx_running(uap)) + uap->im |= UART011_RXIM; + pl011_write(uap->im, uap, REG_IMSC); + spin_unlock_irqrestore(&uap->port.lock, flags); +} + static void pl011_stop_rx(struct uart_port *port) { struct uart_amba_port *uap = @@ -2271,6 +2297,8 @@ static const struct uart_ops amba_pl011_pops = { .stop_tx = pl011_stop_tx, .start_tx = pl011_start_tx, .stop_rx = pl011_stop_rx, + .throttle = pl011_throttle, + .unthrottle = pl011_unthrottle, .enable_ms = pl011_enable_ms, .break_ctl = pl011_break_ctl, .startup = pl011_startup,