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:
Jiri Slaby 2021-06-18 08:15:05 +02:00 committed by Greg Kroah-Hartman
parent be4866671f
commit 740165f7ac

View File

@ -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)