mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
sparc,sunzilog: Add console polling support for sunzilog serial driver
Allow kgdboc to work on sparc hardware with the Zilog serial chips. Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Acked-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3f255eb37e
commit
6d45a1aed3
1 changed files with 50 additions and 0 deletions
|
@ -102,6 +102,8 @@ struct uart_sunzilog_port {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void sunzilog_putchar(struct uart_port *port, int ch);
|
||||||
|
|
||||||
#define ZILOG_CHANNEL_FROM_PORT(PORT) ((struct zilog_channel __iomem *)((PORT)->membase))
|
#define ZILOG_CHANNEL_FROM_PORT(PORT) ((struct zilog_channel __iomem *)((PORT)->membase))
|
||||||
#define UART_ZILOG(PORT) ((struct uart_sunzilog_port *)(PORT))
|
#define UART_ZILOG(PORT) ((struct uart_sunzilog_port *)(PORT))
|
||||||
|
|
||||||
|
@ -996,6 +998,50 @@ static int sunzilog_verify_port(struct uart_port *port, struct serial_struct *se
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CONSOLE_POLL
|
||||||
|
static int sunzilog_get_poll_char(struct uart_port *port)
|
||||||
|
{
|
||||||
|
unsigned char ch, r1;
|
||||||
|
struct uart_sunzilog_port *up = (struct uart_sunzilog_port *) port;
|
||||||
|
struct zilog_channel __iomem *channel
|
||||||
|
= ZILOG_CHANNEL_FROM_PORT(&up->port);
|
||||||
|
|
||||||
|
|
||||||
|
r1 = read_zsreg(channel, R1);
|
||||||
|
if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) {
|
||||||
|
writeb(ERR_RES, &channel->control);
|
||||||
|
ZSDELAY();
|
||||||
|
ZS_WSYNC(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
ch = readb(&channel->control);
|
||||||
|
ZSDELAY();
|
||||||
|
|
||||||
|
/* This funny hack depends upon BRK_ABRT not interfering
|
||||||
|
* with the other bits we care about in R1.
|
||||||
|
*/
|
||||||
|
if (ch & BRK_ABRT)
|
||||||
|
r1 |= BRK_ABRT;
|
||||||
|
|
||||||
|
if (!(ch & Rx_CH_AV))
|
||||||
|
return NO_POLL_CHAR;
|
||||||
|
|
||||||
|
ch = readb(&channel->data);
|
||||||
|
ZSDELAY();
|
||||||
|
|
||||||
|
ch &= up->parity_mask;
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sunzilog_put_poll_char(struct uart_port *port,
|
||||||
|
unsigned char ch)
|
||||||
|
{
|
||||||
|
struct uart_sunzilog_port *up = (struct uart_sunzilog_port *)port;
|
||||||
|
|
||||||
|
sunzilog_putchar(&up->port, ch);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_CONSOLE_POLL */
|
||||||
|
|
||||||
static struct uart_ops sunzilog_pops = {
|
static struct uart_ops sunzilog_pops = {
|
||||||
.tx_empty = sunzilog_tx_empty,
|
.tx_empty = sunzilog_tx_empty,
|
||||||
.set_mctrl = sunzilog_set_mctrl,
|
.set_mctrl = sunzilog_set_mctrl,
|
||||||
|
@ -1013,6 +1059,10 @@ static struct uart_ops sunzilog_pops = {
|
||||||
.request_port = sunzilog_request_port,
|
.request_port = sunzilog_request_port,
|
||||||
.config_port = sunzilog_config_port,
|
.config_port = sunzilog_config_port,
|
||||||
.verify_port = sunzilog_verify_port,
|
.verify_port = sunzilog_verify_port,
|
||||||
|
#ifdef CONFIG_CONSOLE_POLL
|
||||||
|
.poll_get_char = sunzilog_get_poll_char,
|
||||||
|
.poll_put_char = sunzilog_put_poll_char,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static int uart_chip_count;
|
static int uart_chip_count;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue