serial: bcm63xx-uart: add polling support

The tty framework can support polling console to allow operation
in situations where interrupts are turned off. Adding polling mode
support allows using KGDB over serial console,

Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Link: https://lore.kernel.org/r/20230322223956.84647-1-arend.vanspriel@broadcom.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Arend van Spriel 2023-03-22 23:39:56 +01:00 committed by Greg Kroah-Hartman
parent f1d81e3cf0
commit 945de8be2f

View File

@ -596,6 +596,40 @@ static int bcm_uart_verify_port(struct uart_port *port,
return 0;
}
#ifdef CONFIG_CONSOLE_POLL
/*
* return true when outstanding tx equals fifo size
*/
static bool bcm_uart_tx_full(struct uart_port *port)
{
unsigned int val;
val = bcm_uart_readl(port, UART_MCTL_REG);
val = (val & UART_MCTL_TXFIFOFILL_MASK) >> UART_MCTL_TXFIFOFILL_SHIFT;
return !(port->fifosize - val);
}
static int bcm_uart_poll_get_char(struct uart_port *port)
{
unsigned int iestat;
iestat = bcm_uart_readl(port, UART_IR_REG);
if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY)))
return NO_POLL_CHAR;
return bcm_uart_readl(port, UART_FIFO_REG);
}
static void bcm_uart_poll_put_char(struct uart_port *port, unsigned char c)
{
while (bcm_uart_tx_full(port)) {
cpu_relax();
}
bcm_uart_writel(port, c, UART_FIFO_REG);
}
#endif
/* serial core callbacks */
static const struct uart_ops bcm_uart_ops = {
.tx_empty = bcm_uart_tx_empty,
@ -614,6 +648,10 @@ static const struct uart_ops bcm_uart_ops = {
.request_port = bcm_uart_request_port,
.config_port = bcm_uart_config_port,
.verify_port = bcm_uart_verify_port,
#ifdef CONFIG_CONSOLE_POLL
.poll_get_char = bcm_uart_poll_get_char,
.poll_put_char = bcm_uart_poll_put_char,
#endif
};