mirror of
https://github.com/OpenVoiceOS/OpenVoiceOS
synced 2025-02-12 18:00:45 +01:00
251 lines
8.4 KiB
Diff
251 lines
8.4 KiB
Diff
From cb8fcedea78ec07e196951f9f150242005406f50 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Thu, 14 Sep 2023 20:44:10 +0206
|
|
Subject: [PATCH 080/195] serial: samsung_tty: Use port lock wrappers
|
|
|
|
When a serial port is used for kernel console output, then all
|
|
modifications to the UART registers which are done from other contexts,
|
|
e.g. getty, termios, are interference points for the kernel console.
|
|
|
|
So far this has been ignored and the printk output is based on the
|
|
principle of hope. The rework of the console infrastructure which aims to
|
|
support threaded and atomic consoles, requires to mark sections which
|
|
modify the UART registers as unsafe. This allows the atomic write function
|
|
to make informed decisions and eventually to restore operational state. It
|
|
also allows to prevent the regular UART code from modifying UART registers
|
|
while printk output is in progress.
|
|
|
|
All modifications of UART registers are guarded by the UART port lock,
|
|
which provides an obvious synchronization point with the console
|
|
infrastructure.
|
|
|
|
To avoid adding this functionality to all UART drivers, wrap the
|
|
spin_[un]lock*() invocations for uart_port::lock into helper functions
|
|
which just contain the spin_[un]lock*() invocations for now. In a
|
|
subsequent step these helpers will gain the console synchronization
|
|
mechanisms.
|
|
|
|
Converted with coccinelle. No functional change.
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Signed-off-by: John Ogness <john.ogness@linutronix.de>
|
|
Link: https://lore.kernel.org/r/20230914183831.587273-54-john.ogness@linutronix.de
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
drivers/tty/serial/samsung_tty.c | 50 ++++++++++++++++----------------
|
|
1 file changed, 25 insertions(+), 25 deletions(-)
|
|
|
|
diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
|
|
index 07fb8a9dac63..ee51a0368a55 100644
|
|
--- a/drivers/tty/serial/samsung_tty.c
|
|
+++ b/drivers/tty/serial/samsung_tty.c
|
|
@@ -248,7 +248,7 @@ static void s3c24xx_serial_rx_enable(struct uart_port *port)
|
|
unsigned int ucon, ufcon;
|
|
int count = 10000;
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
while (--count && !s3c24xx_serial_txempty_nofifo(port))
|
|
udelay(100);
|
|
@@ -262,7 +262,7 @@ static void s3c24xx_serial_rx_enable(struct uart_port *port)
|
|
wr_regl(port, S3C2410_UCON, ucon);
|
|
|
|
ourport->rx_enabled = 1;
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
}
|
|
|
|
static void s3c24xx_serial_rx_disable(struct uart_port *port)
|
|
@@ -271,14 +271,14 @@ static void s3c24xx_serial_rx_disable(struct uart_port *port)
|
|
unsigned long flags;
|
|
unsigned int ucon;
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
ucon = rd_regl(port, S3C2410_UCON);
|
|
ucon &= ~S3C2410_UCON_RXIRQMODE;
|
|
wr_regl(port, S3C2410_UCON, ucon);
|
|
|
|
ourport->rx_enabled = 0;
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
}
|
|
|
|
static void s3c24xx_serial_stop_tx(struct uart_port *port)
|
|
@@ -344,7 +344,7 @@ static void s3c24xx_serial_tx_dma_complete(void *args)
|
|
dma->tx_transfer_addr, dma->tx_size,
|
|
DMA_TO_DEVICE);
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
uart_xmit_advance(port, count);
|
|
ourport->tx_in_progress = 0;
|
|
@@ -353,7 +353,7 @@ static void s3c24xx_serial_tx_dma_complete(void *args)
|
|
uart_write_wakeup(port);
|
|
|
|
s3c24xx_serial_start_next_tx(ourport);
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
}
|
|
|
|
static void enable_tx_dma(struct s3c24xx_uart_port *ourport)
|
|
@@ -619,7 +619,7 @@ static void s3c24xx_serial_rx_dma_complete(void *args)
|
|
received = dma->rx_bytes_requested - state.residue;
|
|
async_tx_ack(dma->rx_desc);
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
if (received)
|
|
s3c24xx_uart_copy_rx_to_tty(ourport, t, received);
|
|
@@ -631,7 +631,7 @@ static void s3c24xx_serial_rx_dma_complete(void *args)
|
|
|
|
s3c64xx_start_rx_dma(ourport);
|
|
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
}
|
|
|
|
static void s3c64xx_start_rx_dma(struct s3c24xx_uart_port *ourport)
|
|
@@ -722,7 +722,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_dma(void *dev_id)
|
|
utrstat = rd_regl(port, S3C2410_UTRSTAT);
|
|
rd_regl(port, S3C2410_UFSTAT);
|
|
|
|
- spin_lock(&port->lock);
|
|
+ uart_port_lock(port);
|
|
|
|
if (!(utrstat & S3C2410_UTRSTAT_TIMEOUT)) {
|
|
s3c64xx_start_rx_dma(ourport);
|
|
@@ -751,7 +751,7 @@ static irqreturn_t s3c24xx_serial_rx_chars_dma(void *dev_id)
|
|
wr_regl(port, S3C2410_UTRSTAT, S3C2410_UTRSTAT_TIMEOUT);
|
|
|
|
finish:
|
|
- spin_unlock(&port->lock);
|
|
+ uart_port_unlock(port);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
@@ -849,9 +849,9 @@ static irqreturn_t s3c24xx_serial_rx_chars_pio(void *dev_id)
|
|
struct s3c24xx_uart_port *ourport = dev_id;
|
|
struct uart_port *port = &ourport->port;
|
|
|
|
- spin_lock(&port->lock);
|
|
+ uart_port_lock(port);
|
|
s3c24xx_serial_rx_drain_fifo(ourport);
|
|
- spin_unlock(&port->lock);
|
|
+ uart_port_unlock(port);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
@@ -932,11 +932,11 @@ static irqreturn_t s3c24xx_serial_tx_irq(int irq, void *id)
|
|
struct s3c24xx_uart_port *ourport = id;
|
|
struct uart_port *port = &ourport->port;
|
|
|
|
- spin_lock(&port->lock);
|
|
+ uart_port_lock(port);
|
|
|
|
s3c24xx_serial_tx_chars(ourport);
|
|
|
|
- spin_unlock(&port->lock);
|
|
+ uart_port_unlock(port);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
@@ -1033,7 +1033,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
|
|
unsigned long flags;
|
|
unsigned int ucon;
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
ucon = rd_regl(port, S3C2410_UCON);
|
|
|
|
@@ -1044,7 +1044,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
|
|
|
|
wr_regl(port, S3C2410_UCON, ucon);
|
|
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
}
|
|
|
|
static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
|
|
@@ -1303,7 +1303,7 @@ static int s3c64xx_serial_startup(struct uart_port *port)
|
|
ourport->rx_enabled = 1;
|
|
ourport->tx_enabled = 0;
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
ufcon = rd_regl(port, S3C2410_UFCON);
|
|
ufcon |= S3C2410_UFCON_RESETRX | S5PV210_UFCON_RXTRIG8;
|
|
@@ -1313,7 +1313,7 @@ static int s3c64xx_serial_startup(struct uart_port *port)
|
|
|
|
enable_rx_pio(ourport);
|
|
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
|
|
/* Enable Rx Interrupt */
|
|
s3c24xx_clear_bit(port, S3C64XX_UINTM_RXD, S3C64XX_UINTM);
|
|
@@ -1341,7 +1341,7 @@ static int apple_s5l_serial_startup(struct uart_port *port)
|
|
ourport->rx_enabled = 1;
|
|
ourport->tx_enabled = 0;
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
ufcon = rd_regl(port, S3C2410_UFCON);
|
|
ufcon |= S3C2410_UFCON_RESETRX | S5PV210_UFCON_RXTRIG8;
|
|
@@ -1351,7 +1351,7 @@ static int apple_s5l_serial_startup(struct uart_port *port)
|
|
|
|
enable_rx_pio(ourport);
|
|
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
|
|
/* Enable Rx Interrupt */
|
|
s3c24xx_set_bit(port, APPLE_S5L_UCON_RXTHRESH_ENA, S3C2410_UCON);
|
|
@@ -1626,7 +1626,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
|
|
ulcon |= S3C2410_LCON_PNONE;
|
|
}
|
|
|
|
- spin_lock_irqsave(&port->lock, flags);
|
|
+ uart_port_lock_irqsave(port, &flags);
|
|
|
|
dev_dbg(port->dev,
|
|
"setting ulcon to %08x, brddiv to %d, udivslot %08x\n",
|
|
@@ -1684,7 +1684,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
|
|
if ((termios->c_cflag & CREAD) == 0)
|
|
port->ignore_status_mask |= RXSTAT_DUMMY_READ;
|
|
|
|
- spin_unlock_irqrestore(&port->lock, flags);
|
|
+ uart_port_unlock_irqrestore(port, flags);
|
|
}
|
|
|
|
static const char *s3c24xx_serial_type(struct uart_port *port)
|
|
@@ -2376,14 +2376,14 @@ s3c24xx_serial_console_write(struct console *co, const char *s,
|
|
if (cons_uart->sysrq)
|
|
locked = false;
|
|
else if (oops_in_progress)
|
|
- locked = spin_trylock_irqsave(&cons_uart->lock, flags);
|
|
+ locked = uart_port_trylock_irqsave(cons_uart, &flags);
|
|
else
|
|
- spin_lock_irqsave(&cons_uart->lock, flags);
|
|
+ uart_port_lock_irqsave(cons_uart, &flags);
|
|
|
|
uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar);
|
|
|
|
if (locked)
|
|
- spin_unlock_irqrestore(&cons_uart->lock, flags);
|
|
+ uart_port_unlock_irqrestore(cons_uart, flags);
|
|
}
|
|
|
|
/* Shouldn't be __init, as it can be instantiated from other module */
|
|
--
|
|
2.43.0
|
|
|