mirror of
https://github.com/OpenVoiceOS/OpenVoiceOS
synced 2025-02-21 14:20:45 +01:00
167 lines
5.6 KiB
Diff
167 lines
5.6 KiB
Diff
From e9cac43e4c052afc1b2a76f9e1c6c5f44fbea884 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Thu, 14 Sep 2023 20:43:42 +0206
|
|
Subject: [PATCH 051/196] serial: dz: 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-26-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/dz.c | 32 ++++++++++++++++----------------
|
|
1 file changed, 16 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/drivers/tty/serial/dz.c b/drivers/tty/serial/dz.c
|
|
index 667f52e83277..6df7af9edc1c 100644
|
|
--- a/drivers/tty/serial/dz.c
|
|
+++ b/drivers/tty/serial/dz.c
|
|
@@ -268,9 +268,9 @@ static inline void dz_transmit_chars(struct dz_mux *mux)
|
|
}
|
|
/* If nothing to do or stopped or hardware stopped. */
|
|
if (uart_circ_empty(xmit) || uart_tx_stopped(&dport->port)) {
|
|
- spin_lock(&dport->port.lock);
|
|
+ uart_port_lock(&dport->port);
|
|
dz_stop_tx(&dport->port);
|
|
- spin_unlock(&dport->port.lock);
|
|
+ uart_port_unlock(&dport->port);
|
|
return;
|
|
}
|
|
|
|
@@ -287,9 +287,9 @@ static inline void dz_transmit_chars(struct dz_mux *mux)
|
|
|
|
/* Are we are done. */
|
|
if (uart_circ_empty(xmit)) {
|
|
- spin_lock(&dport->port.lock);
|
|
+ uart_port_lock(&dport->port);
|
|
dz_stop_tx(&dport->port);
|
|
- spin_unlock(&dport->port.lock);
|
|
+ uart_port_unlock(&dport->port);
|
|
}
|
|
}
|
|
|
|
@@ -415,14 +415,14 @@ static int dz_startup(struct uart_port *uport)
|
|
return ret;
|
|
}
|
|
|
|
- spin_lock_irqsave(&dport->port.lock, flags);
|
|
+ uart_port_lock_irqsave(&dport->port, &flags);
|
|
|
|
/* Enable interrupts. */
|
|
tmp = dz_in(dport, DZ_CSR);
|
|
tmp |= DZ_RIE | DZ_TIE;
|
|
dz_out(dport, DZ_CSR, tmp);
|
|
|
|
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
|
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
|
|
|
return 0;
|
|
}
|
|
@@ -443,9 +443,9 @@ static void dz_shutdown(struct uart_port *uport)
|
|
int irq_guard;
|
|
u16 tmp;
|
|
|
|
- spin_lock_irqsave(&dport->port.lock, flags);
|
|
+ uart_port_lock_irqsave(&dport->port, &flags);
|
|
dz_stop_tx(&dport->port);
|
|
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
|
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
|
|
|
irq_guard = atomic_add_return(-1, &mux->irq_guard);
|
|
if (!irq_guard) {
|
|
@@ -491,14 +491,14 @@ static void dz_break_ctl(struct uart_port *uport, int break_state)
|
|
unsigned long flags;
|
|
unsigned short tmp, mask = 1 << dport->port.line;
|
|
|
|
- spin_lock_irqsave(&uport->lock, flags);
|
|
+ uart_port_lock_irqsave(uport, &flags);
|
|
tmp = dz_in(dport, DZ_TCR);
|
|
if (break_state)
|
|
tmp |= mask;
|
|
else
|
|
tmp &= ~mask;
|
|
dz_out(dport, DZ_TCR, tmp);
|
|
- spin_unlock_irqrestore(&uport->lock, flags);
|
|
+ uart_port_unlock_irqrestore(uport, flags);
|
|
}
|
|
|
|
static int dz_encode_baud_rate(unsigned int baud)
|
|
@@ -608,7 +608,7 @@ static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
|
|
if (termios->c_cflag & CREAD)
|
|
cflag |= DZ_RXENAB;
|
|
|
|
- spin_lock_irqsave(&dport->port.lock, flags);
|
|
+ uart_port_lock_irqsave(&dport->port, &flags);
|
|
|
|
uart_update_timeout(uport, termios->c_cflag, baud);
|
|
|
|
@@ -631,7 +631,7 @@ static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
|
|
if (termios->c_iflag & IGNBRK)
|
|
dport->port.ignore_status_mask |= DZ_BREAK;
|
|
|
|
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
|
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
|
}
|
|
|
|
/*
|
|
@@ -645,12 +645,12 @@ static void dz_pm(struct uart_port *uport, unsigned int state,
|
|
struct dz_port *dport = to_dport(uport);
|
|
unsigned long flags;
|
|
|
|
- spin_lock_irqsave(&dport->port.lock, flags);
|
|
+ uart_port_lock_irqsave(&dport->port, &flags);
|
|
if (state < 3)
|
|
dz_start_tx(&dport->port);
|
|
else
|
|
dz_stop_tx(&dport->port);
|
|
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
|
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
|
}
|
|
|
|
|
|
@@ -811,7 +811,7 @@ static void dz_console_putchar(struct uart_port *uport, unsigned char ch)
|
|
unsigned short csr, tcr, trdy, mask;
|
|
int loops = 10000;
|
|
|
|
- spin_lock_irqsave(&dport->port.lock, flags);
|
|
+ uart_port_lock_irqsave(&dport->port, &flags);
|
|
csr = dz_in(dport, DZ_CSR);
|
|
dz_out(dport, DZ_CSR, csr & ~DZ_TIE);
|
|
tcr = dz_in(dport, DZ_TCR);
|
|
@@ -819,7 +819,7 @@ static void dz_console_putchar(struct uart_port *uport, unsigned char ch)
|
|
mask = tcr;
|
|
dz_out(dport, DZ_TCR, mask);
|
|
iob();
|
|
- spin_unlock_irqrestore(&dport->port.lock, flags);
|
|
+ uart_port_unlock_irqrestore(&dport->port, flags);
|
|
|
|
do {
|
|
trdy = dz_in(dport, DZ_CSR);
|
|
--
|
|
2.45.1
|
|
|