提交 0ba6a74f 编写于 作者: P Phil Elwell 提交者: Zheng Zengkai

tty: amba-pl011: Add un/throttle support

raspberrypi inclusion
category: feature
bugzilla: 50432

--------------------------------

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: NPhil Elwell <phil@raspberrypi.org>
Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 ca3392b6
...@@ -1317,6 +1317,32 @@ static void pl011_start_tx(struct uart_port *port) ...@@ -1317,6 +1317,32 @@ static void pl011_start_tx(struct uart_port *port)
pl011_start_tx_pio(uap); 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) static void pl011_stop_rx(struct uart_port *port)
{ {
struct uart_amba_port *uap = struct uart_amba_port *uap =
...@@ -2156,6 +2182,8 @@ static const struct uart_ops amba_pl011_pops = { ...@@ -2156,6 +2182,8 @@ static const struct uart_ops amba_pl011_pops = {
.stop_tx = pl011_stop_tx, .stop_tx = pl011_stop_tx,
.start_tx = pl011_start_tx, .start_tx = pl011_start_tx,
.stop_rx = pl011_stop_rx, .stop_rx = pl011_stop_rx,
.throttle = pl011_throttle,
.unthrottle = pl011_unthrottle,
.enable_ms = pl011_enable_ms, .enable_ms = pl011_enable_ms,
.break_ctl = pl011_break_ctl, .break_ctl = pl011_break_ctl,
.startup = pl011_startup, .startup = pl011_startup,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册