Skip to content

Commit

Permalink
tty: amba-pl011: Add un/throttle support
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Phil Elwell committed Jan 24, 2020
1 parent 7869962 commit 63739af
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions drivers/tty/serial/amba-pl011.c
Original file line number Diff line number Diff line change
Expand Up @@ -1323,6 +1323,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 =
Expand Down Expand Up @@ -2165,6 +2191,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,
Expand Down

0 comments on commit 63739af

Please sign in to comment.