Commit 7b9528c2 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

serial: fsl_linflexuart: deduplicate character sending



Introduce a new linflex_put_char() helper to send a character. And use
it on both places this code was duplicated.

Cc: Stefan-gabriel Mirea <stefan-gabriel.mirea@nxp.com>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20220124071430.14907-9-jslaby@suse.cz


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 32330c83
Loading
Loading
Loading
Loading
+17 −25
Original line number Diff line number Diff line
@@ -157,14 +157,10 @@ static void linflex_stop_rx(struct uart_port *port)
	writel(ier & ~LINFLEXD_LINIER_DRIE, port->membase + LINIER);
}

static inline void linflex_transmit_buffer(struct uart_port *sport)
static void linflex_put_char(struct uart_port *sport, unsigned char c)
{
	struct circ_buf *xmit = &sport->state->xmit;
	unsigned char c;
	unsigned long status;

	while (!uart_circ_empty(xmit)) {
		c = xmit->buf[xmit->tail];
	writeb(c, sport->membase + BDRL);

	/* Waiting for data transmission completed. */
@@ -173,11 +169,17 @@ static inline void linflex_transmit_buffer(struct uart_port *sport)
				LINFLEXD_UARTSR_DTFTFF)
		;

	writel(status | LINFLEXD_UARTSR_DTFTFF, sport->membase + UARTSR);
}

static inline void linflex_transmit_buffer(struct uart_port *sport)
{
	struct circ_buf *xmit = &sport->state->xmit;

	while (!uart_circ_empty(xmit)) {
		linflex_put_char(sport, xmit->buf[xmit->tail]);
		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
		sport->icount.tx++;

		writel(status | LINFLEXD_UARTSR_DTFTFF,
		       sport->membase + UARTSR);
	}

	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
@@ -201,21 +203,11 @@ static irqreturn_t linflex_txint(int irq, void *dev_id)
	struct uart_port *sport = dev_id;
	struct circ_buf *xmit = &sport->state->xmit;
	unsigned long flags;
	unsigned long status;

	spin_lock_irqsave(&sport->lock, flags);

	if (sport->x_char) {
		writeb(sport->x_char, sport->membase + BDRL);

		/* waiting for data transmission completed */
		while (((status = readl(sport->membase + UARTSR)) &
			LINFLEXD_UARTSR_DTFTFF) != LINFLEXD_UARTSR_DTFTFF)
			;

		writel(status | LINFLEXD_UARTSR_DTFTFF,
		       sport->membase + UARTSR);

		linflex_put_char(sport, sport->x_char);
		goto out;
	}