mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
mxser: introduce and use start/stop_tx helpers
Starting and stopping TX is performed on many places in the driver. It is repeated outb and info->IER modification. Create few helpers (__mxser_start_tx, mxser_start_tx, __mxser_stop_tx) and use them in the code instead of open coding. This should be a base for an uart driver for this device in the future. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Link: https://lore.kernel.org/r/20210618061516.662-60-jslaby@suse.cz Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
be4866671f
commit
740165f7ac
@ -418,6 +418,28 @@ static void mxser_process_txrx_fifo(struct mxser_port *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __mxser_start_tx(struct mxser_port *info)
|
||||||
|
{
|
||||||
|
outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
|
||||||
|
info->IER |= UART_IER_THRI;
|
||||||
|
outb(info->IER, info->ioaddr + UART_IER);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mxser_start_tx(struct mxser_port *info)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&info->slock, flags);
|
||||||
|
__mxser_start_tx(info);
|
||||||
|
spin_unlock_irqrestore(&info->slock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __mxser_stop_tx(struct mxser_port *info)
|
||||||
|
{
|
||||||
|
info->IER &= ~UART_IER_THRI;
|
||||||
|
outb(info->IER, info->ioaddr + UART_IER);
|
||||||
|
}
|
||||||
|
|
||||||
static int mxser_carrier_raised(struct tty_port *port)
|
static int mxser_carrier_raised(struct tty_port *port)
|
||||||
{
|
{
|
||||||
struct mxser_port *mp = container_of(port, struct mxser_port, port);
|
struct mxser_port *mp = container_of(port, struct mxser_port, port);
|
||||||
@ -516,12 +538,8 @@ static void mxser_handle_cts(struct tty_struct *tty, struct mxser_port *info,
|
|||||||
tty->hw_stopped = 0;
|
tty->hw_stopped = 0;
|
||||||
|
|
||||||
if (info->type != PORT_16550A &&
|
if (info->type != PORT_16550A &&
|
||||||
!info->board->must_hwid) {
|
!info->board->must_hwid)
|
||||||
outb(info->IER & ~UART_IER_THRI,
|
__mxser_start_tx(info);
|
||||||
info->ioaddr + UART_IER);
|
|
||||||
info->IER |= UART_IER_THRI;
|
|
||||||
outb(info->IER, info->ioaddr + UART_IER);
|
|
||||||
}
|
|
||||||
tty_wakeup(tty);
|
tty_wakeup(tty);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -529,10 +547,8 @@ static void mxser_handle_cts(struct tty_struct *tty, struct mxser_port *info,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
tty->hw_stopped = 1;
|
tty->hw_stopped = 1;
|
||||||
if (info->type != PORT_16550A && !info->board->must_hwid) {
|
if (info->type != PORT_16550A && !info->board->must_hwid)
|
||||||
info->IER &= ~UART_IER_THRI;
|
__mxser_stop_tx(info);
|
||||||
outb(info->IER, info->ioaddr + UART_IER);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -947,16 +963,9 @@ static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int cou
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (info->xmit_cnt && !tty->flow.stopped) {
|
if (info->xmit_cnt && !tty->flow.stopped) {
|
||||||
if (!tty->hw_stopped ||
|
if (!tty->hw_stopped || info->type == PORT_16550A ||
|
||||||
(info->type == PORT_16550A) ||
|
info->board->must_hwid)
|
||||||
(info->board->must_hwid)) {
|
mxser_start_tx(info);
|
||||||
spin_lock_irqsave(&info->slock, flags);
|
|
||||||
outb(info->IER & ~UART_IER_THRI, info->ioaddr +
|
|
||||||
UART_IER);
|
|
||||||
info->IER |= UART_IER_THRI;
|
|
||||||
outb(info->IER, info->ioaddr + UART_IER);
|
|
||||||
spin_unlock_irqrestore(&info->slock, flags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
@ -985,20 +994,13 @@ static int mxser_put_char(struct tty_struct *tty, unsigned char ch)
|
|||||||
static void mxser_flush_chars(struct tty_struct *tty)
|
static void mxser_flush_chars(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct mxser_port *info = tty->driver_data;
|
struct mxser_port *info = tty->driver_data;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
if (info->xmit_cnt <= 0 || tty->flow.stopped || !info->port.xmit_buf ||
|
if (info->xmit_cnt <= 0 || tty->flow.stopped || !info->port.xmit_buf ||
|
||||||
(tty->hw_stopped && info->type != PORT_16550A &&
|
(tty->hw_stopped && info->type != PORT_16550A &&
|
||||||
!info->board->must_hwid))
|
!info->board->must_hwid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spin_lock_irqsave(&info->slock, flags);
|
mxser_start_tx(info);
|
||||||
|
|
||||||
outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
|
|
||||||
info->IER |= UART_IER_THRI;
|
|
||||||
outb(info->IER, info->ioaddr + UART_IER);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&info->slock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int mxser_write_room(struct tty_struct *tty)
|
static unsigned int mxser_write_room(struct tty_struct *tty)
|
||||||
@ -1399,10 +1401,8 @@ static void mxser_stop(struct tty_struct *tty)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&info->slock, flags);
|
spin_lock_irqsave(&info->slock, flags);
|
||||||
if (info->IER & UART_IER_THRI) {
|
if (info->IER & UART_IER_THRI)
|
||||||
info->IER &= ~UART_IER_THRI;
|
__mxser_stop_tx(info);
|
||||||
outb(info->IER, info->ioaddr + UART_IER);
|
|
||||||
}
|
|
||||||
spin_unlock_irqrestore(&info->slock, flags);
|
spin_unlock_irqrestore(&info->slock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1412,11 +1412,8 @@ static void mxser_start(struct tty_struct *tty)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&info->slock, flags);
|
spin_lock_irqsave(&info->slock, flags);
|
||||||
if (info->xmit_cnt && info->port.xmit_buf) {
|
if (info->xmit_cnt && info->port.xmit_buf)
|
||||||
outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
|
__mxser_start_tx(info);
|
||||||
info->IER |= UART_IER_THRI;
|
|
||||||
outb(info->IER, info->ioaddr + UART_IER);
|
|
||||||
}
|
|
||||||
spin_unlock_irqrestore(&info->slock, flags);
|
spin_unlock_irqrestore(&info->slock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1659,8 +1656,7 @@ static void mxser_transmit_chars(struct tty_struct *tty, struct mxser_port *port
|
|||||||
(tty->hw_stopped &&
|
(tty->hw_stopped &&
|
||||||
(port->type != PORT_16550A) &&
|
(port->type != PORT_16550A) &&
|
||||||
(!port->board->must_hwid))) {
|
(!port->board->must_hwid))) {
|
||||||
port->IER &= ~UART_IER_THRI;
|
__mxser_stop_tx(port);
|
||||||
outb(port->IER, port->ioaddr + UART_IER);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1679,10 +1675,8 @@ static void mxser_transmit_chars(struct tty_struct *tty, struct mxser_port *port
|
|||||||
if (port->xmit_cnt < WAKEUP_CHARS)
|
if (port->xmit_cnt < WAKEUP_CHARS)
|
||||||
tty_wakeup(tty);
|
tty_wakeup(tty);
|
||||||
|
|
||||||
if (port->xmit_cnt <= 0) {
|
if (port->xmit_cnt <= 0)
|
||||||
port->IER &= ~UART_IER_THRI;
|
__mxser_stop_tx(port);
|
||||||
outb(port->IER, port->ioaddr + UART_IER);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mxser_port_isr(struct mxser_port *port)
|
static bool mxser_port_isr(struct mxser_port *port)
|
||||||
|
Loading…
Reference in New Issue
Block a user