printk: Update the printk series.
This is an all-in-one update of the printk series. It updates from the previous version to the current development version which is under discussion plus the PREEMPT_RT bits for the atomic console. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
This commit is contained in:
@@ -185,14 +185,14 @@ static void serial21285_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int h_lcr;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
h_lcr = *CSR_H_UBRLCR;
|
||||
if (break_state)
|
||||
h_lcr |= H_UBRLCR_BREAK;
|
||||
else
|
||||
h_lcr &= ~H_UBRLCR_BREAK;
|
||||
*CSR_H_UBRLCR = h_lcr;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int serial21285_startup(struct uart_port *port)
|
||||
@@ -272,7 +272,7 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (port->fifosize)
|
||||
h_lcr |= H_UBRLCR_FIFO;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -309,7 +309,7 @@ serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
*CSR_H_UBRLCR = h_lcr;
|
||||
*CSR_UARTCON = 1;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *serial21285_type(struct uart_port *port)
|
||||
|
||||
@@ -176,271 +176,6 @@ static inline void serial_dl_write(struct uart_8250_port *up, u32 value)
|
||||
up->dl_write(up, value);
|
||||
}
|
||||
|
||||
static inline bool serial8250_is_console(struct uart_port *port)
|
||||
{
|
||||
return uart_console(port) && !hlist_unhashed_lockless(&port->cons->node);
|
||||
}
|
||||
|
||||
/**
|
||||
* serial8250_init_wctxt - Initialize a write context for
|
||||
* non-console-printing usage
|
||||
* @wctxt: The write context to initialize
|
||||
* @cons: The console to assign to the write context
|
||||
*
|
||||
* In order to mark an unsafe region, drivers must acquire the console. This
|
||||
* requires providing an initialized write context (even if that driver will
|
||||
* not be doing any printing).
|
||||
*
|
||||
* This function should not be used for console printing contexts.
|
||||
*/
|
||||
static inline void serial8250_init_wctxt(struct cons_write_context *wctxt,
|
||||
struct console *cons)
|
||||
{
|
||||
struct cons_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
|
||||
|
||||
memset(wctxt, 0, sizeof(*wctxt));
|
||||
ctxt->console = cons;
|
||||
ctxt->prio = CONS_PRIO_NORMAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* __serial8250_console_acquire - Acquire a console for
|
||||
* non-console-printing usage
|
||||
* @wctxt: An uninitialized write context to use for acquiring
|
||||
* @cons: The console to assign to the write context
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
* The caller is holding the console_srcu_read_lock.
|
||||
*
|
||||
* This function should not be used for console printing contexts.
|
||||
*/
|
||||
static inline void __serial8250_console_acquire(struct cons_write_context *wctxt,
|
||||
struct console *cons)
|
||||
{
|
||||
for (;;) {
|
||||
serial8250_init_wctxt(wctxt, cons);
|
||||
if (console_try_acquire(wctxt))
|
||||
break;
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* serial8250_enter_unsafe - Mark the beginning of an unsafe region for
|
||||
* non-console-printing usage
|
||||
* @up: The port that is entering the unsafe state
|
||||
*
|
||||
* The caller should ensure @up is a console before calling this function.
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
* This function takes the console_srcu_read_lock and becomes owner of the
|
||||
* console associated with @up.
|
||||
*
|
||||
* This function should not be used for console printing contexts.
|
||||
*/
|
||||
static inline void serial8250_enter_unsafe(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
|
||||
lockdep_assert_held_once(&port->lock);
|
||||
|
||||
for (;;) {
|
||||
up->cookie = console_srcu_read_lock();
|
||||
|
||||
__serial8250_console_acquire(&up->wctxt, port->cons);
|
||||
|
||||
if (console_enter_unsafe(&up->wctxt))
|
||||
break;
|
||||
|
||||
console_srcu_read_unlock(up->cookie);
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* serial8250_exit_unsafe - Mark the end of an unsafe region for
|
||||
* non-console-printing usage
|
||||
* @up: The port that is exiting the unsafe state
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
* This function releases ownership of the console associated with @up and
|
||||
* releases the console_srcu_read_lock.
|
||||
*
|
||||
* This function should not be used for console printing contexts.
|
||||
*/
|
||||
static inline void serial8250_exit_unsafe(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
|
||||
lockdep_assert_held_once(&port->lock);
|
||||
|
||||
if (console_exit_unsafe(&up->wctxt))
|
||||
console_release(&up->wctxt);
|
||||
|
||||
console_srcu_read_unlock(up->cookie);
|
||||
}
|
||||
|
||||
/**
|
||||
* serial8250_in_IER - Read the IER register for
|
||||
* non-console-printing usage
|
||||
* @up: The port to work on
|
||||
*
|
||||
* Returns: The value read from IER
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
*
|
||||
* This is the top-level function for non-console-printing contexts to
|
||||
* read the IER register. The caller does not need to care if @up is a
|
||||
* console before calling this function.
|
||||
*
|
||||
* This function should not be used for printing contexts.
|
||||
*/
|
||||
static inline int serial8250_in_IER(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
bool is_console;
|
||||
int ier;
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
ier = serial_in(up, UART_IER);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
|
||||
return ier;
|
||||
}
|
||||
|
||||
/**
|
||||
* __serial8250_set_IER - Directly write to the IER register
|
||||
* @up: The port to work on
|
||||
* @wctxt: The current write context
|
||||
* @ier: The value to write
|
||||
*
|
||||
* Returns: True if IER was written to. False otherwise
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
* The caller is holding the console_srcu_read_unlock.
|
||||
* The caller is the owner of the console associated with @up.
|
||||
*
|
||||
* This function should only be directly called within console printing
|
||||
* contexts. Other contexts should use serial8250_set_IER().
|
||||
*/
|
||||
static inline bool __serial8250_set_IER(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt,
|
||||
int ier)
|
||||
{
|
||||
if (wctxt && !console_can_proceed(wctxt))
|
||||
return false;
|
||||
serial_out(up, UART_IER, ier);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* serial8250_set_IER - Write a new value to the IER register for
|
||||
* non-console-printing usage
|
||||
* @up: The port to work on
|
||||
* @ier: The value to write
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
*
|
||||
* This is the top-level function for non-console-printing contexts to
|
||||
* write to the IER register. The caller does not need to care if @up is a
|
||||
* console before calling this function.
|
||||
*
|
||||
* This function should not be used for printing contexts.
|
||||
*/
|
||||
static inline void serial8250_set_IER(struct uart_8250_port *up, int ier)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
bool is_console;
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console) {
|
||||
serial8250_enter_unsafe(up);
|
||||
while (!__serial8250_set_IER(up, &up->wctxt, ier)) {
|
||||
console_srcu_read_unlock(up->cookie);
|
||||
console_enter_unsafe(&up->wctxt);
|
||||
}
|
||||
serial8250_exit_unsafe(up);
|
||||
} else {
|
||||
__serial8250_set_IER(up, NULL, ier);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* __serial8250_clear_IER - Directly clear the IER register
|
||||
* @up: The port to work on
|
||||
* @wctxt: The current write context
|
||||
* @prior: Gets set to the previous value of IER
|
||||
*
|
||||
* Returns: True if IER was cleared and @prior points to the previous
|
||||
* value of IER. False otherwise and @prior is invalid
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
* The caller is holding the console_srcu_read_unlock.
|
||||
* The caller is the owner of the console associated with @up.
|
||||
*
|
||||
* This function should only be directly called within console printing
|
||||
* contexts. Other contexts should use serial8250_clear_IER().
|
||||
*/
|
||||
static inline bool __serial8250_clear_IER(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt,
|
||||
int *prior)
|
||||
{
|
||||
unsigned int clearval = 0;
|
||||
|
||||
if (up->capabilities & UART_CAP_UUE)
|
||||
clearval = UART_IER_UUE;
|
||||
|
||||
*prior = serial_in(up, UART_IER);
|
||||
if (wctxt && !console_can_proceed(wctxt))
|
||||
return false;
|
||||
serial_out(up, UART_IER, clearval);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* serial8250_clear_IER - Clear the IER register for
|
||||
* non-console-printing usage
|
||||
* @up: The port to work on
|
||||
*
|
||||
* Returns: The previous value of IER
|
||||
*
|
||||
* The caller is holding the port->lock.
|
||||
*
|
||||
* This is the top-level function for non-console-printing contexts to
|
||||
* clear the IER register. The caller does not need to care if @up is a
|
||||
* console before calling this function.
|
||||
*
|
||||
* This function should not be used for printing contexts.
|
||||
*/
|
||||
static inline int serial8250_clear_IER(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
bool is_console;
|
||||
int prior;
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console) {
|
||||
serial8250_enter_unsafe(up);
|
||||
while (!__serial8250_clear_IER(up, &up->wctxt, &prior)) {
|
||||
console_srcu_read_unlock(up->cookie);
|
||||
console_enter_unsafe(&up->wctxt);
|
||||
}
|
||||
serial8250_exit_unsafe(up);
|
||||
} else {
|
||||
__serial8250_clear_IER(up, NULL, &prior);
|
||||
}
|
||||
|
||||
return prior;
|
||||
}
|
||||
|
||||
static inline bool serial8250_set_THRI(struct uart_8250_port *up)
|
||||
{
|
||||
/* Port locked to synchronize UART_IER access against the console. */
|
||||
@@ -449,7 +184,7 @@ static inline bool serial8250_set_THRI(struct uart_8250_port *up)
|
||||
if (up->ier & UART_IER_THRI)
|
||||
return false;
|
||||
up->ier |= UART_IER_THRI;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -461,7 +196,7 @@ static inline bool serial8250_clear_THRI(struct uart_8250_port *up)
|
||||
if (!(up->ier & UART_IER_THRI))
|
||||
return false;
|
||||
up->ier &= ~UART_IER_THRI;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -281,16 +281,16 @@ static void __aspeed_vuart_set_throttle(struct uart_8250_port *up,
|
||||
up->ier &= ~irqs;
|
||||
if (!throttle)
|
||||
up->ier |= irqs;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
}
|
||||
static void aspeed_vuart_set_throttle(struct uart_port *port, bool throttle)
|
||||
{
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
__aspeed_vuart_set_throttle(up, throttle);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void aspeed_vuart_throttle(struct uart_port *port)
|
||||
@@ -340,7 +340,7 @@ static int aspeed_vuart_handle_irq(struct uart_port *port)
|
||||
if (iir & UART_IIR_NO_INT)
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
lsr = serial_port_in(port, UART_LSR);
|
||||
|
||||
|
||||
@@ -567,7 +567,7 @@ static irqreturn_t brcmuart_isr(int irq, void *dev_id)
|
||||
if (interrupts == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
spin_lock_irqsave(&up->lock, flags);
|
||||
uart_port_lock_irqsave(up, &flags);
|
||||
|
||||
/* Clear all interrupts */
|
||||
udma_writel(priv, REGS_DMA_ISR, UDMA_INTR_CLEAR, interrupts);
|
||||
@@ -581,7 +581,7 @@ static irqreturn_t brcmuart_isr(int irq, void *dev_id)
|
||||
if ((rval | tval) == 0)
|
||||
dev_warn(dev, "Spurious interrupt: 0x%x\n", interrupts);
|
||||
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
uart_port_unlock_irqrestore(up, flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -608,10 +608,10 @@ static int brcmuart_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
up->ier &= ~UART_IER_RDI;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
spin_unlock_irq(&port->lock);
|
||||
serial_port_out(port, UART_IER, up->ier);
|
||||
uart_port_unlock_irq(port);
|
||||
|
||||
priv->tx_running = false;
|
||||
priv->dma.rx_dma = NULL;
|
||||
@@ -629,7 +629,7 @@ static void brcmuart_shutdown(struct uart_port *port)
|
||||
struct brcmuart_priv *priv = up->port.private_data;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
priv->shutdown = true;
|
||||
if (priv->dma_enabled) {
|
||||
stop_rx_dma(up);
|
||||
@@ -645,7 +645,7 @@ static void brcmuart_shutdown(struct uart_port *port)
|
||||
*/
|
||||
up->dma = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_do_shutdown(port);
|
||||
}
|
||||
|
||||
@@ -788,15 +788,9 @@ static int brcmuart_handle_irq(struct uart_port *p)
|
||||
* interrupt but there is no data ready.
|
||||
*/
|
||||
if (((iir & UART_IIR_ID) == UART_IIR_RX_TIMEOUT) && !(priv->shutdown)) {
|
||||
spin_lock_irqsave(&p->lock, flags);
|
||||
uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_port_in(p, UART_LSR);
|
||||
if ((status & UART_LSR_DR) == 0) {
|
||||
bool is_console;
|
||||
|
||||
is_console = serial8250_is_console(p);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
ier = serial_port_in(p, UART_IER);
|
||||
/*
|
||||
@@ -817,12 +811,9 @@ static int brcmuart_handle_irq(struct uart_port *p)
|
||||
serial_port_in(p, UART_RX);
|
||||
}
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
|
||||
handled = 1;
|
||||
}
|
||||
spin_unlock_irqrestore(&p->lock, flags);
|
||||
uart_port_unlock_irqrestore(p, flags);
|
||||
if (handled)
|
||||
return 1;
|
||||
}
|
||||
@@ -840,7 +831,7 @@ static enum hrtimer_restart brcmuart_hrtimer_func(struct hrtimer *t)
|
||||
if (priv->shutdown)
|
||||
return HRTIMER_NORESTART;
|
||||
|
||||
spin_lock_irqsave(&p->lock, flags);
|
||||
uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_port_in(p, UART_LSR);
|
||||
|
||||
/*
|
||||
@@ -857,24 +848,14 @@ static enum hrtimer_restart brcmuart_hrtimer_func(struct hrtimer *t)
|
||||
/* re-enable receive unless upper layer has disabled it */
|
||||
if ((up->ier & (UART_IER_RLSI | UART_IER_RDI)) ==
|
||||
(UART_IER_RLSI | UART_IER_RDI)) {
|
||||
bool is_console;
|
||||
|
||||
is_console = serial8250_is_console(p);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
status = serial_port_in(p, UART_IER);
|
||||
status |= (UART_IER_RLSI | UART_IER_RDI);
|
||||
serial_port_out(p, UART_IER, status);
|
||||
status = serial_port_in(p, UART_MCR);
|
||||
status |= UART_MCR_RTS;
|
||||
serial_port_out(p, UART_MCR, status);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
}
|
||||
spin_unlock_irqrestore(&p->lock, flags);
|
||||
uart_port_unlock_irqrestore(p, flags);
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
@@ -1173,10 +1154,10 @@ static int __maybe_unused brcmuart_suspend(struct device *dev)
|
||||
* This will prevent resume from enabling RTS before the
|
||||
* baud rate has been restored.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
priv->saved_mctrl = port->mctrl;
|
||||
port->mctrl &= ~TIOCM_RTS;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
serial8250_suspend_port(priv->line);
|
||||
clk_disable_unprepare(priv->baud_mux_clk);
|
||||
@@ -1215,10 +1196,10 @@ static int __maybe_unused brcmuart_resume(struct device *dev)
|
||||
|
||||
if (priv->saved_mctrl & TIOCM_RTS) {
|
||||
/* Restore RTS */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl |= TIOCM_RTS;
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -256,34 +256,18 @@ static void serial8250_timeout(struct timer_list *t)
|
||||
static void serial8250_backup_timeout(struct timer_list *t)
|
||||
{
|
||||
struct uart_8250_port *up = from_timer(up, t, timer);
|
||||
struct uart_port *port = &up->port;
|
||||
unsigned int iir, ier = 0, lsr;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Must disable interrupts or else we risk racing with the interrupt
|
||||
* based handler.
|
||||
*/
|
||||
if (up->port.irq) {
|
||||
bool is_console;
|
||||
|
||||
/*
|
||||
* Do not use serial8250_clear_IER() because this code
|
||||
* ignores capabilties.
|
||||
*/
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
ier = serial_in(up, UART_IER);
|
||||
serial_out(up, UART_IER, 0);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
}
|
||||
|
||||
iir = serial_in(up, UART_IIR);
|
||||
@@ -306,9 +290,9 @@ static void serial8250_backup_timeout(struct timer_list *t)
|
||||
serial8250_tx_chars(up);
|
||||
|
||||
if (up->port.irq)
|
||||
serial8250_set_IER(up, ier);
|
||||
serial_out(up, UART_IER, ier);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/* Standard timer interval plus 0.2s to keep the port running */
|
||||
mod_timer(&up->timer,
|
||||
@@ -608,30 +592,25 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev)
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
|
||||
static void univ8250_console_port_lock(struct console *con, bool do_lock, unsigned long *flags)
|
||||
static void univ8250_console_write(struct console *co, const char *s,
|
||||
unsigned int count)
|
||||
{
|
||||
struct uart_8250_port *up = &serial8250_ports[con->index];
|
||||
struct uart_8250_port *up = &serial8250_ports[co->index];
|
||||
|
||||
if (do_lock)
|
||||
spin_lock_irqsave(&up->port.lock, *flags);
|
||||
else
|
||||
spin_unlock_irqrestore(&up->port.lock, *flags);
|
||||
serial8250_console_write(up, s, count);
|
||||
}
|
||||
|
||||
static bool univ8250_console_write_atomic(struct console *co,
|
||||
struct cons_write_context *wctxt)
|
||||
struct nbcon_write_context *wctxt)
|
||||
{
|
||||
struct uart_8250_port *up = &serial8250_ports[co->index];
|
||||
|
||||
return serial8250_console_write_atomic(up, wctxt);
|
||||
}
|
||||
|
||||
static bool univ8250_console_write_thread(struct console *co,
|
||||
struct cons_write_context *wctxt)
|
||||
static struct uart_port *univ8250_console_uart_port(struct console *con)
|
||||
{
|
||||
struct uart_8250_port *up = &serial8250_ports[co->index];
|
||||
|
||||
return serial8250_console_write_thread(up, wctxt);
|
||||
return &serial8250_ports[con->index].port;
|
||||
}
|
||||
|
||||
static int univ8250_console_setup(struct console *co, char *options)
|
||||
@@ -732,14 +711,15 @@ static int univ8250_console_match(struct console *co, char *name, int idx,
|
||||
|
||||
static struct console univ8250_console = {
|
||||
.name = "ttyS",
|
||||
.write = univ8250_console_write,
|
||||
.write_atomic = univ8250_console_write_atomic,
|
||||
.write_thread = univ8250_console_write_thread,
|
||||
.port_lock = univ8250_console_port_lock,
|
||||
.write_thread = univ8250_console_write_atomic,
|
||||
.uart_port = univ8250_console_uart_port,
|
||||
.device = uart_console_device,
|
||||
.setup = univ8250_console_setup,
|
||||
.exit = univ8250_console_exit,
|
||||
.match = univ8250_console_match,
|
||||
.flags = CON_PRINTBUFFER | CON_ANYTIME | CON_NO_BKL,
|
||||
.flags = CON_PRINTBUFFER | CON_ANYTIME | CON_NBCON,
|
||||
.index = -1,
|
||||
.data = &serial8250_reg,
|
||||
};
|
||||
@@ -1028,11 +1008,11 @@ static void serial_8250_overrun_backoff_work(struct work_struct *work)
|
||||
struct uart_port *port = &up->port;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
up->port.read_status_mask |= UART_LSR_DR;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1230,9 +1210,9 @@ void serial8250_unregister_port(int line)
|
||||
if (uart->em485) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&uart->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uart->port, &flags);
|
||||
serial8250_em485_destroy(uart);
|
||||
spin_unlock_irqrestore(&uart->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uart->port, flags);
|
||||
}
|
||||
|
||||
uart_remove_one_port(&serial8250_reg, &uart->port);
|
||||
|
||||
@@ -22,7 +22,7 @@ static void __dma_tx_complete(void *param)
|
||||
dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr,
|
||||
UART_XMIT_SIZE, DMA_TO_DEVICE);
|
||||
|
||||
spin_lock_irqsave(&p->port.lock, flags);
|
||||
uart_port_lock_irqsave(&p->port, &flags);
|
||||
|
||||
dma->tx_running = 0;
|
||||
|
||||
@@ -35,7 +35,7 @@ static void __dma_tx_complete(void *param)
|
||||
if (ret || !dma->tx_running)
|
||||
serial8250_set_THRI(p);
|
||||
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
static void __dma_rx_complete(struct uart_8250_port *p)
|
||||
@@ -70,7 +70,7 @@ static void dma_rx_complete(void *param)
|
||||
struct uart_8250_dma *dma = p->dma;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&p->port.lock, flags);
|
||||
uart_port_lock_irqsave(&p->port, &flags);
|
||||
if (dma->rx_running)
|
||||
__dma_rx_complete(p);
|
||||
|
||||
@@ -80,7 +80,7 @@ static void dma_rx_complete(void *param)
|
||||
*/
|
||||
if (!dma->rx_running && (serial_lsr_in(p) & UART_LSR_DR))
|
||||
p->dma->rx_dma(p);
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
int serial8250_tx_dma(struct uart_8250_port *p)
|
||||
|
||||
@@ -263,20 +263,20 @@ static int dw8250_handle_irq(struct uart_port *p)
|
||||
* so we limit the workaround only to non-DMA mode.
|
||||
*/
|
||||
if (!up->dma && rx_timeout) {
|
||||
spin_lock_irqsave(&p->lock, flags);
|
||||
uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_lsr_in(up);
|
||||
|
||||
if (!(status & (UART_LSR_DR | UART_LSR_BI)))
|
||||
(void) p->serial_in(p, UART_RX);
|
||||
|
||||
spin_unlock_irqrestore(&p->lock, flags);
|
||||
uart_port_unlock_irqrestore(p, flags);
|
||||
}
|
||||
|
||||
/* Manually stop the Rx DMA transfer when acting as flow controller */
|
||||
if (quirks & DW_UART_QUIRK_IS_DMA_FC && up->dma && up->dma->rx_running && rx_timeout) {
|
||||
spin_lock_irqsave(&p->lock, flags);
|
||||
uart_port_lock_irqsave(p, &flags);
|
||||
status = serial_lsr_in(up);
|
||||
spin_unlock_irqrestore(&p->lock, flags);
|
||||
uart_port_unlock_irqrestore(p, flags);
|
||||
|
||||
if (status & (UART_LSR_DR | UART_LSR_BI)) {
|
||||
dw8250_writel_ext(p, RZN1_UART_RDMACR, 0);
|
||||
|
||||
@@ -189,10 +189,6 @@ static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud,
|
||||
|
||||
static int xr17v35x_startup(struct uart_port *port)
|
||||
{
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
|
||||
spin_lock_irq(&port->lock);
|
||||
|
||||
/*
|
||||
* First enable access to IER [7:5], ISR [5:4], FCR [5:4],
|
||||
* MCR [7:5] and MSR [7:0]
|
||||
@@ -205,9 +201,9 @@ static int xr17v35x_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irq(&port->lock);
|
||||
serial8250_set_IER(up, 0);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
uart_port_unlock_irq(port);
|
||||
|
||||
return serial8250_do_startup(port);
|
||||
}
|
||||
|
||||
@@ -30,11 +30,11 @@ int fsl8250_handle_irq(struct uart_port *port)
|
||||
unsigned int iir;
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
iir = port->serial_in(port, UART_IIR);
|
||||
if (iir & UART_IIR_NO_INT) {
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ int fsl8250_handle_irq(struct uart_port *port)
|
||||
if (unlikely(up->lsr_saved_flags & UART_LSR_BI)) {
|
||||
up->lsr_saved_flags &= ~UART_LSR_BI;
|
||||
port->serial_in(port, UART_RX);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -70,8 +70,7 @@ int fsl8250_handle_irq(struct uart_port *port)
|
||||
if ((orig_lsr & UART_LSR_OE) && (up->overrun_backoff_time_ms > 0)) {
|
||||
unsigned long delay;
|
||||
|
||||
up->ier = serial8250_in_IER(up);
|
||||
|
||||
up->ier = port->serial_in(port, UART_IER);
|
||||
if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) {
|
||||
port->ops->stop_rx(port);
|
||||
} else {
|
||||
|
||||
@@ -102,7 +102,7 @@ static void mtk8250_dma_rx_complete(void *param)
|
||||
if (data->rx_status == DMA_RX_SHUTDOWN)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
|
||||
total = dma->rx_size - state.residue;
|
||||
@@ -128,7 +128,7 @@ static void mtk8250_dma_rx_complete(void *param)
|
||||
|
||||
mtk8250_rx_dma(up);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void mtk8250_rx_dma(struct uart_8250_port *up)
|
||||
@@ -222,44 +222,18 @@ static void mtk8250_shutdown(struct uart_port *port)
|
||||
|
||||
static void mtk8250_disable_intrs(struct uart_8250_port *up, int mask)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
bool is_console;
|
||||
int ier;
|
||||
|
||||
/* Port locked to synchronize UART_IER access against the console. */
|
||||
lockdep_assert_held_once(&up->port.lock);
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
ier = serial_in(up, UART_IER);
|
||||
serial_out(up, UART_IER, ier & (~mask));
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
serial_out(up, UART_IER, serial_in(up, UART_IER) & (~mask));
|
||||
}
|
||||
|
||||
static void mtk8250_enable_intrs(struct uart_8250_port *up, int mask)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
bool is_console;
|
||||
int ier;
|
||||
|
||||
/* Port locked to synchronize UART_IER access against the console. */
|
||||
lockdep_assert_held_once(&up->port.lock);
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
ier = serial_in(up, UART_IER);
|
||||
serial_out(up, UART_IER, ier | mask);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
serial_out(up, UART_IER, serial_in(up, UART_IER) | mask);
|
||||
}
|
||||
|
||||
static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
|
||||
@@ -394,7 +368,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -442,7 +416,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (uart_console(port))
|
||||
up->port.cons->cflag = termios->c_cflag;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
/* Don't rewrite B0 */
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
@@ -338,7 +338,8 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
|
||||
|
||||
/* drop TCR + TLR access, we setup XON/XOFF later */
|
||||
serial8250_out_MCR(up, mcr);
|
||||
serial8250_set_IER(up, up->ier);
|
||||
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
|
||||
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_dl_write(up, priv->quot);
|
||||
@@ -400,7 +401,7 @@ static void omap_8250_set_termios(struct uart_port *port,
|
||||
* interrupts disabled.
|
||||
*/
|
||||
pm_runtime_get_sync(port->dev);
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -503,7 +504,7 @@ static void omap_8250_set_termios(struct uart_port *port,
|
||||
}
|
||||
omap8250_restore_regs(up);
|
||||
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
|
||||
@@ -528,19 +529,19 @@ static void omap_8250_pm(struct uart_port *port, unsigned int state,
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
|
||||
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
efr = serial_in(up, UART_EFR);
|
||||
serial_out(up, UART_EFR, efr | UART_EFR_ECB);
|
||||
serial_out(up, UART_LCR, 0);
|
||||
|
||||
serial8250_set_IER(up, (state != 0) ? UART_IERX_SLEEP : 0);
|
||||
serial_out(up, UART_IER, (state != 0) ? UART_IERX_SLEEP : 0);
|
||||
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_out(up, UART_EFR, efr);
|
||||
serial_out(up, UART_LCR, 0);
|
||||
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
@@ -659,7 +660,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
|
||||
unsigned long delay;
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
up->ier = port->serial_in(port, UART_IER);
|
||||
if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) {
|
||||
port->ops->stop_rx(port);
|
||||
@@ -669,7 +670,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
|
||||
*/
|
||||
cancel_delayed_work(&up->overrun_backoff);
|
||||
}
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
delay = msecs_to_jiffies(up->overrun_backoff_time_ms);
|
||||
schedule_delayed_work(&up->overrun_backoff, delay);
|
||||
@@ -716,10 +717,10 @@ static int omap_8250_startup(struct uart_port *port)
|
||||
}
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
up->ier = UART_IER_RLSI | UART_IER_RDI;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
spin_unlock_irq(&port->lock);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
uart_port_unlock_irq(port);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
up->capabilities |= UART_CAP_RPM;
|
||||
@@ -732,9 +733,9 @@ static int omap_8250_startup(struct uart_port *port)
|
||||
serial_out(up, UART_OMAP_WER, priv->wer);
|
||||
|
||||
if (up->dma && !(priv->habit & UART_HAS_EFR2)) {
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
up->dma->rx_dma(up);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
}
|
||||
|
||||
enable_irq(up->port.irq);
|
||||
@@ -760,10 +761,10 @@ static void omap_8250_shutdown(struct uart_port *port)
|
||||
serial_out(up, UART_OMAP_EFR2, 0x0);
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
up->ier = 0;
|
||||
serial8250_set_IER(up, 0);
|
||||
spin_unlock_irq(&port->lock);
|
||||
serial_out(up, UART_IER, 0);
|
||||
uart_port_unlock_irq(port);
|
||||
disable_irq_nosync(up->port.irq);
|
||||
dev_pm_clear_wake_irq(port->dev);
|
||||
|
||||
@@ -788,10 +789,10 @@ static void omap_8250_throttle(struct uart_port *port)
|
||||
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
port->ops->stop_rx(port);
|
||||
priv->throttled = true;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
@@ -806,14 +807,14 @@ static void omap_8250_unthrottle(struct uart_port *port)
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
priv->throttled = false;
|
||||
if (up->dma)
|
||||
up->dma->rx_dma(up);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
port->read_status_mask |= UART_LSR_DR;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
pm_runtime_mark_last_busy(port->dev);
|
||||
pm_runtime_put_autosuspend(port->dev);
|
||||
@@ -957,7 +958,7 @@ static void __dma_rx_complete(void *param)
|
||||
unsigned long flags;
|
||||
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irqsave(&p->port.lock, flags);
|
||||
uart_port_lock_irqsave(&p->port, &flags);
|
||||
|
||||
/*
|
||||
* If the tx status is not DMA_COMPLETE, then this is a delayed
|
||||
@@ -966,18 +967,18 @@ static void __dma_rx_complete(void *param)
|
||||
*/
|
||||
if (dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state) !=
|
||||
DMA_COMPLETE) {
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
return;
|
||||
}
|
||||
__dma_rx_do_complete(p);
|
||||
if (!priv->throttled) {
|
||||
p->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
serial8250_set_IER(p, p->ier);
|
||||
serial_out(p, UART_IER, p->ier);
|
||||
if (!(priv->habit & UART_HAS_EFR2))
|
||||
omap_8250_rx_dma(p);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
|
||||
@@ -1032,7 +1033,7 @@ static int omap_8250_rx_dma(struct uart_8250_port *p)
|
||||
* callback to run.
|
||||
*/
|
||||
p->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
|
||||
serial8250_set_IER(p, p->ier);
|
||||
serial_out(p, UART_IER, p->ier);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
@@ -1082,7 +1083,7 @@ static void omap_8250_dma_tx_complete(void *param)
|
||||
dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr,
|
||||
UART_XMIT_SIZE, DMA_TO_DEVICE);
|
||||
|
||||
spin_lock_irqsave(&p->port.lock, flags);
|
||||
uart_port_lock_irqsave(&p->port, &flags);
|
||||
|
||||
dma->tx_running = 0;
|
||||
|
||||
@@ -1111,7 +1112,7 @@ static void omap_8250_dma_tx_complete(void *param)
|
||||
serial8250_set_THRI(p);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
}
|
||||
|
||||
static int omap_8250_tx_dma(struct uart_8250_port *p)
|
||||
@@ -1248,12 +1249,12 @@ static void am654_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir,
|
||||
* periodic timeouts, re-enable interrupts.
|
||||
*/
|
||||
up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
omap_8250_rx_dma_flush(up);
|
||||
serial_in(up, UART_IIR);
|
||||
serial_out(up, UART_OMAP_EFR2, 0x0);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1277,7 +1278,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
status = serial_port_in(port, UART_LSR);
|
||||
|
||||
@@ -1760,15 +1761,15 @@ static int omap8250_runtime_resume(struct device *dev)
|
||||
up = serial8250_get_port(priv->line);
|
||||
|
||||
if (up && omap8250_lost_context(up)) {
|
||||
spin_lock_irq(&up->port.lock);
|
||||
uart_port_lock_irq(&up->port);
|
||||
omap8250_restore_regs(up);
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
|
||||
if (up && up->dma && up->dma->rxchan && !(priv->habit & UART_HAS_EFR2)) {
|
||||
spin_lock_irq(&up->port.lock);
|
||||
uart_port_lock_irq(&up->port);
|
||||
omap_8250_rx_dma(up);
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
|
||||
priv->latency = priv->calc_latency;
|
||||
|
||||
@@ -225,10 +225,10 @@ static bool pci1xxxx_port_suspend(int line)
|
||||
if (port->suspended == 0 && port->dev) {
|
||||
wakeup_mask = readb(up->port.membase + UART_WAKE_MASK_REG);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl &= ~TIOCM_OUT2;
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = (wakeup_mask & UART_WAKE_SRCS) != UART_WAKE_SRCS;
|
||||
}
|
||||
@@ -251,10 +251,10 @@ static void pci1xxxx_port_resume(int line)
|
||||
writeb(UART_WAKE_SRCS, port->membase + UART_WAKE_REG);
|
||||
|
||||
if (port->suspended == 0) {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl |= TIOCM_OUT2;
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
mutex_unlock(&tport->mutex);
|
||||
}
|
||||
|
||||
+158
-312
@@ -689,7 +689,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
|
||||
if (p->capabilities & UART_CAP_SLEEP) {
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&p->port.lock);
|
||||
uart_port_lock_irq(&p->port);
|
||||
if (p->capabilities & UART_CAP_EFR) {
|
||||
lcr = serial_in(p, UART_LCR);
|
||||
efr = serial_in(p, UART_EFR);
|
||||
@@ -697,18 +697,29 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
serial_out(p, UART_EFR, UART_EFR_ECB);
|
||||
serial_out(p, UART_LCR, 0);
|
||||
}
|
||||
serial8250_set_IER(p, sleep ? UART_IERX_SLEEP : 0);
|
||||
serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
|
||||
if (p->capabilities & UART_CAP_EFR) {
|
||||
serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_out(p, UART_EFR, efr);
|
||||
serial_out(p, UART_LCR, lcr);
|
||||
}
|
||||
spin_unlock_irq(&p->port.lock);
|
||||
uart_port_unlock_irq(&p->port);
|
||||
}
|
||||
|
||||
serial8250_rpm_put(p);
|
||||
}
|
||||
|
||||
static void serial8250_clear_IER(struct uart_8250_port *up)
|
||||
{
|
||||
/* Port locked to synchronize UART_IER access against the console. */
|
||||
lockdep_assert_held_once(&up->port.lock);
|
||||
|
||||
if (up->capabilities & UART_CAP_UUE)
|
||||
serial_out(up, UART_IER, UART_IER_UUE);
|
||||
else
|
||||
serial_out(up, UART_IER, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_RSA
|
||||
/*
|
||||
* Attempts to turn on the RSA FIFO. Returns zero on failure.
|
||||
@@ -738,9 +749,9 @@ static void enable_rsa(struct uart_8250_port *up)
|
||||
{
|
||||
if (up->port.type == PORT_RSA) {
|
||||
if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
|
||||
spin_lock_irq(&up->port.lock);
|
||||
uart_port_lock_irq(&up->port);
|
||||
__enable_rsa(up);
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
|
||||
serial_out(up, UART_RSA_FRR, 0);
|
||||
@@ -760,7 +771,7 @@ static void disable_rsa(struct uart_8250_port *up)
|
||||
|
||||
if (up->port.type == PORT_RSA &&
|
||||
up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
|
||||
spin_lock_irq(&up->port.lock);
|
||||
uart_port_lock_irq(&up->port);
|
||||
|
||||
mode = serial_in(up, UART_RSA_MSR);
|
||||
result = !(mode & UART_RSA_MSR_FIFO);
|
||||
@@ -773,7 +784,7 @@ static void disable_rsa(struct uart_8250_port *up)
|
||||
|
||||
if (result)
|
||||
up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_SERIAL_8250_RSA */
|
||||
@@ -972,10 +983,8 @@ static int broken_efr(struct uart_8250_port *up)
|
||||
*/
|
||||
static void autoconfig_16550a(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
unsigned char status1, status2;
|
||||
unsigned int iersave;
|
||||
bool is_console;
|
||||
|
||||
/* Port locked to synchronize UART_IER access against the console. */
|
||||
lockdep_assert_held_once(&up->port.lock);
|
||||
@@ -1094,11 +1103,6 @@ static void autoconfig_16550a(struct uart_8250_port *up)
|
||||
return;
|
||||
}
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
/*
|
||||
* Try writing and reading the UART_IER_UUE bit (b6).
|
||||
* If it works, this is probably one of the Xscale platform's
|
||||
@@ -1134,9 +1138,6 @@ static void autoconfig_16550a(struct uart_8250_port *up)
|
||||
}
|
||||
serial_out(up, UART_IER, iersave);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
|
||||
/*
|
||||
* We distinguish between 16550A and U6 16550A by counting
|
||||
* how many bytes are in the FIFO.
|
||||
@@ -1174,19 +1175,12 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
up->capabilities = 0;
|
||||
up->bugs = 0;
|
||||
|
||||
if (!(port->flags & UPF_BUGGY_UART)) {
|
||||
bool is_console;
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
|
||||
/*
|
||||
* Do a simple existence test first; if we fail this,
|
||||
* there's no point trying anything else.
|
||||
@@ -1216,15 +1210,11 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
#endif
|
||||
scratch3 = serial_in(up, UART_IER) & UART_IER_ALL_INTR;
|
||||
serial_out(up, UART_IER, scratch);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
|
||||
if (scratch2 != 0 || scratch3 != UART_IER_ALL_INTR) {
|
||||
/*
|
||||
* We failed; there's nothing here
|
||||
*/
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
|
||||
scratch2, scratch3);
|
||||
goto out;
|
||||
@@ -1248,7 +1238,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
status1 = serial_in(up, UART_MSR) & UART_MSR_STATUS_BITS;
|
||||
serial8250_out_MCR(up, save_mcr);
|
||||
if (status1 != (UART_MSR_DCD | UART_MSR_CTS)) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
DEBUG_AUTOCONF("LOOP test failed (%02x) ",
|
||||
status1);
|
||||
goto out;
|
||||
@@ -1317,7 +1307,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* Check if the device is a Fintek F81216A
|
||||
@@ -1341,7 +1331,6 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
unsigned char save_ICP = 0;
|
||||
unsigned int ICP = 0;
|
||||
unsigned long irqs;
|
||||
bool is_console;
|
||||
int irq;
|
||||
|
||||
if (port->flags & UPF_FOURPORT) {
|
||||
@@ -1351,20 +1340,16 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
inb_p(ICP);
|
||||
}
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (is_console) {
|
||||
if (uart_console(port))
|
||||
console_lock();
|
||||
serial8250_enter_unsafe(up);
|
||||
}
|
||||
|
||||
/* forget possible initially masked and pending IRQ */
|
||||
probe_irq_off(probe_irq_on());
|
||||
save_mcr = serial8250_in_MCR(up);
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
save_ier = serial_in(up, UART_IER);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
serial8250_out_MCR(up, UART_MCR_OUT1 | UART_MCR_OUT2);
|
||||
|
||||
irqs = probe_irq_on();
|
||||
@@ -1377,9 +1362,9 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
|
||||
}
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
serial_out(up, UART_IER, UART_IER_ALL_INTR);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
serial_in(up, UART_LSR);
|
||||
serial_in(up, UART_RX);
|
||||
serial_in(up, UART_IIR);
|
||||
@@ -1390,17 +1375,15 @@ static void autoconfig_irq(struct uart_8250_port *up)
|
||||
|
||||
serial8250_out_MCR(up, save_mcr);
|
||||
/* Synchronize UART_IER access against the console. */
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
serial_out(up, UART_IER, save_ier);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
|
||||
if (port->flags & UPF_FOURPORT)
|
||||
outb_p(save_ICP, ICP);
|
||||
|
||||
if (is_console) {
|
||||
serial8250_exit_unsafe(up);
|
||||
if (uart_console(port))
|
||||
console_unlock();
|
||||
}
|
||||
|
||||
port->irq = (irq > 0) ? irq : 0;
|
||||
}
|
||||
@@ -1416,7 +1399,7 @@ static void serial8250_stop_rx(struct uart_port *port)
|
||||
|
||||
up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
|
||||
up->port.read_status_mask &= ~UART_LSR_DR;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_port_out(port, UART_IER, up->ier);
|
||||
|
||||
serial8250_rpm_put(up);
|
||||
}
|
||||
@@ -1449,7 +1432,7 @@ void serial8250_em485_stop_tx(struct uart_8250_port *p)
|
||||
serial8250_clear_and_reinit_fifos(p);
|
||||
|
||||
p->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
serial8250_set_IER(p, p->ier);
|
||||
serial_port_out(&p->port, UART_IER, p->ier);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx);
|
||||
@@ -1462,13 +1445,13 @@ static enum hrtimer_restart serial8250_em485_handle_stop_tx(struct hrtimer *t)
|
||||
unsigned long flags;
|
||||
|
||||
serial8250_rpm_get(p);
|
||||
spin_lock_irqsave(&p->port.lock, flags);
|
||||
uart_port_lock_irqsave(&p->port, &flags);
|
||||
if (em485->active_timer == &em485->stop_tx_timer) {
|
||||
p->rs485_stop_tx(p);
|
||||
em485->active_timer = NULL;
|
||||
em485->tx_stopped = true;
|
||||
}
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
serial8250_rpm_put(p);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
@@ -1650,12 +1633,12 @@ static enum hrtimer_restart serial8250_em485_handle_start_tx(struct hrtimer *t)
|
||||
struct uart_8250_port *p = em485->port;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&p->port.lock, flags);
|
||||
uart_port_lock_irqsave(&p->port, &flags);
|
||||
if (em485->active_timer == &em485->start_tx_timer) {
|
||||
__start_tx(&p->port);
|
||||
em485->active_timer = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&p->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&p->port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -1705,7 +1688,7 @@ static void serial8250_disable_ms(struct uart_port *port)
|
||||
mctrl_gpio_disable_ms(up->gpios);
|
||||
|
||||
up->ier &= ~UART_IER_MSI;
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_port_out(port, UART_IER, up->ier);
|
||||
}
|
||||
|
||||
static void serial8250_enable_ms(struct uart_port *port)
|
||||
@@ -1724,7 +1707,7 @@ static void serial8250_enable_ms(struct uart_port *port)
|
||||
up->ier |= UART_IER_MSI;
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_port_out(port, UART_IER, up->ier);
|
||||
serial8250_rpm_put(up);
|
||||
}
|
||||
|
||||
@@ -1938,7 +1921,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
|
||||
if (iir & UART_IIR_NO_INT)
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = serial_lsr_in(up);
|
||||
|
||||
@@ -2008,9 +1991,9 @@ static int serial8250_tx_threshold_handle_irq(struct uart_port *port)
|
||||
if ((iir & UART_IIR_ID) == UART_IIR_THRI) {
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
serial8250_tx_chars(up);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
iir = serial_port_in(port, UART_IIR);
|
||||
@@ -2025,10 +2008,10 @@ static unsigned int serial8250_tx_empty(struct uart_port *port)
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (!serial8250_tx_dma_running(up) && uart_lsr_tx_empty(serial_lsr_in(up)))
|
||||
result = TIOCSER_TEMT;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
serial8250_rpm_put(up);
|
||||
|
||||
@@ -2090,13 +2073,13 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_port_out(port, UART_LCR, up->lcr);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_rpm_put(up);
|
||||
}
|
||||
|
||||
@@ -2184,10 +2167,9 @@ static void serial8250_put_poll_char(struct uart_port *port,
|
||||
serial8250_rpm_get(up);
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
*
|
||||
* Best-effort IER access because other CPUs are quiesced.
|
||||
*/
|
||||
__serial8250_clear_IER(up, NULL, &ier);
|
||||
ier = serial_port_in(port, UART_IER);
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
|
||||
/*
|
||||
@@ -2200,7 +2182,7 @@ static void serial8250_put_poll_char(struct uart_port *port,
|
||||
* and restore the IER
|
||||
*/
|
||||
wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
|
||||
__serial8250_set_IER(up, NULL, ier);
|
||||
serial_port_out(port, UART_IER, ier);
|
||||
serial8250_rpm_put(up);
|
||||
}
|
||||
|
||||
@@ -2211,7 +2193,6 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
unsigned long flags;
|
||||
unsigned char iir;
|
||||
bool is_console;
|
||||
int retval;
|
||||
u16 lsr;
|
||||
|
||||
@@ -2233,17 +2214,17 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
up->acr = 0;
|
||||
serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_port_out(port, UART_EFR, UART_EFR_ECB);
|
||||
serial8250_set_IER(up, 0);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
serial_port_out(port, UART_LCR, 0);
|
||||
serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
|
||||
serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
serial_port_out(port, UART_EFR, UART_EFR_ECB);
|
||||
serial_port_out(port, UART_LCR, 0);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
if (port->type == PORT_DA830) {
|
||||
@@ -2252,10 +2233,10 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
serial8250_set_IER(up, 0);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
serial_port_out(port, UART_DA830_PWREMU_MGMT, 0);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
mdelay(10);
|
||||
|
||||
/* Enable Tx, Rx and free run mode */
|
||||
@@ -2353,8 +2334,6 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
is_console = serial8250_is_console(port);
|
||||
|
||||
if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) {
|
||||
unsigned char iir1;
|
||||
|
||||
@@ -2371,10 +2350,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_THRE);
|
||||
serial_port_out_sync(port, UART_IER, UART_IER_THRI);
|
||||
@@ -2386,10 +2362,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
iir = serial_port_in(port, UART_IIR);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (port->irqflags & IRQF_SHARED)
|
||||
enable_irq(port->irq);
|
||||
@@ -2412,7 +2385,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
*/
|
||||
serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (up->port.flags & UPF_FOURPORT) {
|
||||
if (!up->port.irq)
|
||||
up->port.mctrl |= TIOCM_OUT1;
|
||||
@@ -2443,14 +2416,10 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
* Do a quick test to see if we receive an interrupt when we enable
|
||||
* the TX irq.
|
||||
*/
|
||||
if (is_console)
|
||||
serial8250_enter_unsafe(up);
|
||||
serial_port_out(port, UART_IER, UART_IER_THRI);
|
||||
lsr = serial_port_in(port, UART_LSR);
|
||||
iir = serial_port_in(port, UART_IIR);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
if (is_console)
|
||||
serial8250_exit_unsafe(up);
|
||||
|
||||
if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
|
||||
if (!(up->bugs & UART_BUG_TXEN)) {
|
||||
@@ -2462,7 +2431,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
}
|
||||
|
||||
dont_test_tx_en:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* Clear the interrupt registers again for luck, and clear the
|
||||
@@ -2482,7 +2451,7 @@ dont_test_tx_en:
|
||||
if (up->dma) {
|
||||
const char *msg = NULL;
|
||||
|
||||
if (is_console)
|
||||
if (uart_console(port))
|
||||
msg = "forbid DMA for kernel console";
|
||||
else if (serial8250_request_dma(up))
|
||||
msg = "failed to request DMA";
|
||||
@@ -2533,17 +2502,17 @@ void serial8250_do_shutdown(struct uart_port *port)
|
||||
*
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
up->ier = 0;
|
||||
serial8250_set_IER(up, 0);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
synchronize_irq(port->irq);
|
||||
|
||||
if (up->dma)
|
||||
serial8250_release_dma(up);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (port->flags & UPF_FOURPORT) {
|
||||
/* reset interrupts on the AST Fourport board */
|
||||
inb((port->iobase & 0xfe0) | 0x1f);
|
||||
@@ -2552,7 +2521,7 @@ void serial8250_do_shutdown(struct uart_port *port)
|
||||
port->mctrl &= ~TIOCM_OUT2;
|
||||
|
||||
serial8250_set_mctrl(port, port->mctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -2788,14 +2757,14 @@ void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk)
|
||||
quot = serial8250_get_divisor(port, baud, &frac);
|
||||
|
||||
serial8250_rpm_get(up);
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
serial8250_set_divisor(port, baud, quot, frac);
|
||||
serial_port_out(port, UART_LCR, up->lcr);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_rpm_put(up);
|
||||
|
||||
out_unlock:
|
||||
@@ -2832,7 +2801,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Synchronize UART_IER access against the console.
|
||||
*/
|
||||
serial8250_rpm_get(up);
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
up->lcr = cval; /* Save computed LCR */
|
||||
|
||||
@@ -2899,7 +2868,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (up->capabilities & UART_CAP_RTOIE)
|
||||
up->ier |= UART_IER_RTOIE;
|
||||
|
||||
serial8250_set_IER(up, up->ier);
|
||||
serial_port_out(port, UART_IER, up->ier);
|
||||
|
||||
if (up->capabilities & UART_CAP_EFR) {
|
||||
unsigned char efr = 0;
|
||||
@@ -2935,7 +2904,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
serial_port_out(port, UART_FCR, up->fcr); /* set fcr */
|
||||
}
|
||||
serial8250_set_mctrl(port, port->mctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
serial8250_rpm_put(up);
|
||||
|
||||
/* Don't rewrite B0 */
|
||||
@@ -2958,15 +2927,15 @@ void serial8250_do_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
{
|
||||
if (termios->c_line == N_PPS) {
|
||||
port->flags |= UPF_HARDPPS_CD;
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
serial8250_enable_ms(port);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
} else {
|
||||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
if (!UART_ENABLE_MS(port, termios->c_cflag)) {
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
serial8250_disable_ms(port);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3356,21 +3325,12 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults);
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
|
||||
static bool serial8250_console_putchar(struct uart_port *port, unsigned char ch,
|
||||
struct cons_write_context *wctxt)
|
||||
static void serial8250_console_putchar(struct uart_port *port, unsigned char ch)
|
||||
{
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_THRE);
|
||||
if (!console_can_proceed(wctxt))
|
||||
return false;
|
||||
serial_port_out(port, UART_TX, ch);
|
||||
if (ch == '\n')
|
||||
up->console_newline_needed = false;
|
||||
else
|
||||
up->console_newline_needed = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3399,119 +3359,33 @@ static void serial8250_console_restore(struct uart_8250_port *up)
|
||||
serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
|
||||
}
|
||||
|
||||
static bool __serial8250_console_write(struct uart_port *port, struct cons_write_context *wctxt,
|
||||
const char *s, unsigned int count,
|
||||
bool (*putchar)(struct uart_port *, unsigned char, struct cons_write_context *))
|
||||
/*
|
||||
* Print a string to the serial port using the device FIFO
|
||||
*
|
||||
* It sends fifosize bytes and then waits for the fifo
|
||||
* to get empty.
|
||||
*/
|
||||
static void serial8250_console_fifo_write(struct uart_8250_port *up,
|
||||
const char *s, unsigned int count)
|
||||
{
|
||||
bool finished = false;
|
||||
unsigned int i;
|
||||
int i;
|
||||
const char *end = s + count;
|
||||
unsigned int fifosize = up->tx_loadsz;
|
||||
bool cr_sent = false;
|
||||
|
||||
for (i = 0; i < count; i++, s++) {
|
||||
if (*s == '\n') {
|
||||
if (!putchar(port, '\r', wctxt))
|
||||
goto out;
|
||||
while (s != end) {
|
||||
wait_for_lsr(up, UART_LSR_THRE);
|
||||
|
||||
for (i = 0; i < fifosize && s != end; ++i) {
|
||||
if (*s == '\n' && !cr_sent) {
|
||||
serial_out(up, UART_TX, '\r');
|
||||
cr_sent = true;
|
||||
} else {
|
||||
serial_out(up, UART_TX, *s++);
|
||||
cr_sent = false;
|
||||
}
|
||||
}
|
||||
if (!putchar(port, *s, wctxt))
|
||||
goto out;
|
||||
}
|
||||
finished = true;
|
||||
out:
|
||||
return finished;
|
||||
}
|
||||
|
||||
static bool serial8250_console_write(struct uart_port *port, struct cons_write_context *wctxt,
|
||||
const char *s, unsigned int count,
|
||||
bool (*putchar)(struct uart_port *, unsigned char, struct cons_write_context *))
|
||||
{
|
||||
return __serial8250_console_write(port, wctxt, s, count, putchar);
|
||||
}
|
||||
|
||||
static bool atomic_print_line(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
|
||||
if (up->console_newline_needed &&
|
||||
!__serial8250_console_write(port, wctxt, "\n", 1, serial8250_console_putchar)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return __serial8250_console_write(port, wctxt, wctxt->outbuf, wctxt->len,
|
||||
serial8250_console_putchar);
|
||||
}
|
||||
|
||||
static void atomic_console_reacquire(struct cons_write_context *wctxt,
|
||||
struct cons_write_context *wctxt_init)
|
||||
{
|
||||
memcpy(wctxt, wctxt_init, sizeof(*wctxt));
|
||||
while (!console_try_acquire(wctxt)) {
|
||||
cpu_relax();
|
||||
memcpy(wctxt, wctxt_init, sizeof(*wctxt));
|
||||
}
|
||||
}
|
||||
|
||||
bool serial8250_console_write_atomic(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt)
|
||||
{
|
||||
struct cons_write_context wctxt_init = { };
|
||||
struct cons_context *ctxt_init = &ACCESS_PRIVATE(&wctxt_init, ctxt);
|
||||
struct cons_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
|
||||
bool finished = false;
|
||||
unsigned int ier;
|
||||
|
||||
touch_nmi_watchdog();
|
||||
|
||||
/* With write_atomic, another context may hold the port->lock. */
|
||||
|
||||
ctxt_init->console = ctxt->console;
|
||||
ctxt_init->prio = ctxt->prio;
|
||||
ctxt_init->thread = ctxt->thread;
|
||||
|
||||
/*
|
||||
* Enter unsafe in order to disable interrupts. If the console is
|
||||
* lost before the interrupts are disabled, bail out because another
|
||||
* context took over the printing. If the console is lost after the
|
||||
* interrutps are disabled, the console must be reacquired in order
|
||||
* to re-enable the interrupts. However in that case no printing is
|
||||
* allowed because another context took over the printing.
|
||||
*/
|
||||
|
||||
if (!console_enter_unsafe(wctxt))
|
||||
return false;
|
||||
|
||||
if (!__serial8250_clear_IER(up, wctxt, &ier))
|
||||
return false;
|
||||
|
||||
if (!console_exit_unsafe(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
|
||||
if (!atomic_print_line(up, wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
|
||||
finished = true;
|
||||
enable_irq:
|
||||
/*
|
||||
* Enter unsafe in order to enable interrupts. If the console is
|
||||
* lost before the interrupts are enabled, the console must be
|
||||
* reacquired in order to re-enable the interrupts.
|
||||
*/
|
||||
for (;;) {
|
||||
if (console_enter_unsafe(wctxt) &&
|
||||
__serial8250_set_IER(up, wctxt, ier)) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* HW-IRQs still disabled. Reacquire to enable them. */
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
}
|
||||
console_exit_unsafe(wctxt);
|
||||
|
||||
return finished;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3523,116 +3397,71 @@ enable_irq:
|
||||
* Doing runtime PM is really a bad idea for the kernel console.
|
||||
* Thus, we assume the function is called when device is powered up.
|
||||
*/
|
||||
bool serial8250_console_write_thread(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt)
|
||||
static void __serial8250_console_write(struct uart_8250_port *up, const char *s,
|
||||
unsigned int count)
|
||||
{
|
||||
struct cons_write_context wctxt_init = { };
|
||||
struct cons_context *ctxt_init = &ACCESS_PRIVATE(&wctxt_init, ctxt);
|
||||
struct cons_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
|
||||
struct uart_8250_em485 *em485 = up->em485;
|
||||
struct uart_port *port = &up->port;
|
||||
unsigned int count = wctxt->len;
|
||||
const char *s = wctxt->outbuf;
|
||||
bool rs485_started = false;
|
||||
bool finished = false;
|
||||
unsigned int ier;
|
||||
unsigned int ier, use_fifo;
|
||||
|
||||
ctxt_init->console = ctxt->console;
|
||||
ctxt_init->prio = ctxt->prio;
|
||||
ctxt_init->thread = ctxt->thread;
|
||||
touch_nmi_watchdog();
|
||||
|
||||
/*
|
||||
* Enter unsafe in order to disable interrupts. If the console is
|
||||
* lost before the interrupts are disabled, bail out because another
|
||||
* context took over the printing. If the console is lost after the
|
||||
* interrutps are disabled, the console must be reacquired in order
|
||||
* to re-enable the interrupts. However in that case no printing is
|
||||
* allowed because another context took over the printing.
|
||||
* First save the IER then disable the interrupts
|
||||
*/
|
||||
|
||||
if (!console_enter_unsafe(wctxt))
|
||||
return false;
|
||||
|
||||
if (!__serial8250_clear_IER(up, wctxt, &ier))
|
||||
return false;
|
||||
|
||||
if (!console_exit_unsafe(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
ier = serial_port_in(port, UART_IER);
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
/* check scratch reg to see if port powered off during system sleep */
|
||||
if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) {
|
||||
if (!console_enter_unsafe(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
serial8250_console_restore(up);
|
||||
if (!console_exit_unsafe(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
up->canary = 0;
|
||||
}
|
||||
|
||||
if (em485) {
|
||||
if (em485->tx_stopped) {
|
||||
if (!console_enter_unsafe(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
if (em485->tx_stopped)
|
||||
up->rs485_start_tx(up);
|
||||
rs485_started = true;
|
||||
if (!console_exit_unsafe(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
}
|
||||
if (port->rs485.delay_rts_before_send) {
|
||||
mdelay(port->rs485.delay_rts_before_send);
|
||||
if (!console_can_proceed(wctxt)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
}
|
||||
mdelay(port->rs485.delay_rts_before_send);
|
||||
}
|
||||
|
||||
if (!serial8250_console_write(port, wctxt, s, count, serial8250_console_putchar)) {
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
goto enable_irq;
|
||||
}
|
||||
use_fifo = (up->capabilities & UART_CAP_FIFO) &&
|
||||
/*
|
||||
* BCM283x requires to check the fifo
|
||||
* after each byte.
|
||||
*/
|
||||
!(up->capabilities & UART_CAP_MINI) &&
|
||||
/*
|
||||
* tx_loadsz contains the transmit fifo size
|
||||
*/
|
||||
up->tx_loadsz > 1 &&
|
||||
(up->fcr & UART_FCR_ENABLE_FIFO) &&
|
||||
port->state &&
|
||||
test_bit(TTY_PORT_INITIALIZED, &port->state->port.iflags) &&
|
||||
/*
|
||||
* After we put a data in the fifo, the controller will send
|
||||
* it regardless of the CTS state. Therefore, only use fifo
|
||||
* if we don't use control flow.
|
||||
*/
|
||||
!(up->port.flags & UPF_CONS_FLOW);
|
||||
|
||||
if (likely(use_fifo))
|
||||
serial8250_console_fifo_write(up, s, count);
|
||||
else
|
||||
uart_console_write(port, s, count, serial8250_console_putchar);
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
|
||||
finished = true;
|
||||
enable_irq:
|
||||
/*
|
||||
* Enter unsafe in order to stop rs485_tx. If the console is
|
||||
* lost before the rs485_tx is stopped, the console must be
|
||||
* reacquired in order to stop rs485_tx.
|
||||
* Finally, wait for transmitter to become empty
|
||||
* and restore the IER
|
||||
*/
|
||||
wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
|
||||
|
||||
if (em485) {
|
||||
mdelay(port->rs485.delay_rts_after_send);
|
||||
if (em485->tx_stopped && rs485_started) {
|
||||
while (!console_enter_unsafe(wctxt))
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
if (em485->tx_stopped)
|
||||
up->rs485_stop_tx(up);
|
||||
if (!console_exit_unsafe(wctxt))
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Enter unsafe in order to enable interrupts. If the console is
|
||||
* lost before the interrupts are enabled, the console must be
|
||||
* reacquired in order to re-enable the interrupts.
|
||||
*/
|
||||
for (;;) {
|
||||
if (console_enter_unsafe(wctxt) &&
|
||||
__serial8250_set_IER(up, wctxt, ier)) {
|
||||
break;
|
||||
}
|
||||
atomic_console_reacquire(wctxt, &wctxt_init);
|
||||
}
|
||||
serial_port_out(port, UART_IER, ier);
|
||||
|
||||
/*
|
||||
* The receive handling will happen properly because the
|
||||
@@ -3643,10 +3472,30 @@ enable_irq:
|
||||
*/
|
||||
if (up->msr_saved_flags)
|
||||
serial8250_modem_status(up);
|
||||
}
|
||||
|
||||
console_exit_unsafe(wctxt);
|
||||
void serial8250_console_write(struct uart_8250_port *up, const char *s,
|
||||
unsigned int count)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
unsigned long flags;
|
||||
|
||||
return finished;
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
__serial8250_console_write(up, s, count);
|
||||
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
bool serial8250_console_write_atomic(struct uart_8250_port *up,
|
||||
struct nbcon_write_context *wctxt)
|
||||
{
|
||||
if (!nbcon_enter_unsafe(wctxt))
|
||||
return false;
|
||||
|
||||
__serial8250_console_write(up, wctxt->outbuf, wctxt->len);
|
||||
|
||||
return nbcon_exit_unsafe(wctxt);
|
||||
}
|
||||
|
||||
static unsigned int probe_baud(struct uart_port *port)
|
||||
@@ -3666,7 +3515,6 @@ static unsigned int probe_baud(struct uart_port *port)
|
||||
|
||||
int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
|
||||
{
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
int baud = 9600;
|
||||
int bits = 8;
|
||||
int parity = 'n';
|
||||
@@ -3676,8 +3524,6 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
|
||||
if (!port->iobase && !port->membase)
|
||||
return -ENODEV;
|
||||
|
||||
up->console_newline_needed = false;
|
||||
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
else if (probe)
|
||||
|
||||
@@ -9,7 +9,6 @@ config SERIAL_8250
|
||||
depends on !S390
|
||||
select SERIAL_CORE
|
||||
select SERIAL_MCTRL_GPIO if GPIOLIB
|
||||
select HAVE_ATOMIC_CONSOLE
|
||||
help
|
||||
This selects whether you want to include the driver for the standard
|
||||
serial ports. The standard answer is Y. People who might say N
|
||||
|
||||
@@ -147,14 +147,14 @@ static irqreturn_t altera_jtaguart_interrupt(int irq, void *data)
|
||||
isr = (readl(port->membase + ALTERA_JTAGUART_CONTROL_REG) >>
|
||||
ALTERA_JTAGUART_CONTROL_RI_OFF) & port->read_status_mask;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
if (isr & ALTERA_JTAGUART_CONTROL_RE_MSK)
|
||||
altera_jtaguart_rx_chars(port);
|
||||
if (isr & ALTERA_JTAGUART_CONTROL_WE_MSK)
|
||||
altera_jtaguart_tx_chars(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
}
|
||||
@@ -180,14 +180,14 @@ static int altera_jtaguart_startup(struct uart_port *port)
|
||||
return ret;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Enable RX interrupts now */
|
||||
port->read_status_mask = ALTERA_JTAGUART_CONTROL_RE_MSK;
|
||||
writel(port->read_status_mask,
|
||||
port->membase + ALTERA_JTAGUART_CONTROL_REG);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -196,14 +196,14 @@ static void altera_jtaguart_shutdown(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable all interrupts now */
|
||||
port->read_status_mask = 0;
|
||||
writel(port->read_status_mask,
|
||||
port->membase + ALTERA_JTAGUART_CONTROL_REG);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -264,33 +264,33 @@ static void altera_jtaguart_console_putc(struct uart_port *port, unsigned char c
|
||||
unsigned long flags;
|
||||
u32 status;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
while (!altera_jtaguart_tx_space(port, &status)) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if ((status & ALTERA_JTAGUART_CONTROL_AC_MSK) == 0) {
|
||||
return; /* no connection activity */
|
||||
}
|
||||
|
||||
cpu_relax();
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
}
|
||||
writel(c, port->membase + ALTERA_JTAGUART_DATA_REG);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#else
|
||||
static void altera_jtaguart_console_putc(struct uart_port *port, unsigned char c)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
while (!altera_jtaguart_tx_space(port, NULL)) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
cpu_relax();
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
}
|
||||
writel(c, port->membase + ALTERA_JTAGUART_DATA_REG);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -164,13 +164,13 @@ static void altera_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
struct altera_uart *pp = container_of(port, struct altera_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (break_state == -1)
|
||||
pp->imr |= ALTERA_UART_CONTROL_TRBK_MSK;
|
||||
else
|
||||
pp->imr &= ~ALTERA_UART_CONTROL_TRBK_MSK;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void altera_uart_set_termios(struct uart_port *port,
|
||||
@@ -187,10 +187,10 @@ static void altera_uart_set_termios(struct uart_port *port,
|
||||
tty_termios_copy_hw(termios, old);
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
altera_uart_writel(port, baudclk, ALTERA_UART_DIVISOR_REG);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* FIXME: port->read_status_mask and port->ignore_status_mask
|
||||
@@ -264,12 +264,12 @@ static irqreturn_t altera_uart_interrupt(int irq, void *data)
|
||||
|
||||
isr = altera_uart_readl(port, ALTERA_UART_STATUS_REG) & pp->imr;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (isr & ALTERA_UART_STATUS_RRDY_MSK)
|
||||
altera_uart_rx_chars(port);
|
||||
if (isr & ALTERA_UART_STATUS_TRDY_MSK)
|
||||
altera_uart_tx_chars(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
}
|
||||
@@ -313,13 +313,13 @@ static int altera_uart_startup(struct uart_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Enable RX interrupts now */
|
||||
pp->imr = ALTERA_UART_CONTROL_RRDY_MSK;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -329,13 +329,13 @@ static void altera_uart_shutdown(struct uart_port *port)
|
||||
struct altera_uart *pp = container_of(port, struct altera_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable all interrupts now */
|
||||
pp->imr = 0;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (port->irq)
|
||||
free_irq(port->irq, port);
|
||||
|
||||
@@ -207,7 +207,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id)
|
||||
unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
|
||||
int handled = 0;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
status = readb(port->membase + UART010_IIR);
|
||||
if (status) {
|
||||
@@ -228,7 +228,7 @@ static irqreturn_t pl010_int(int irq, void *dev_id)
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -270,14 +270,14 @@ static void pl010_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int lcr_h;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
lcr_h = readb(port->membase + UART010_LCRH);
|
||||
if (break_state == -1)
|
||||
lcr_h |= UART01x_LCRH_BRK;
|
||||
else
|
||||
lcr_h &= ~UART01x_LCRH_BRK;
|
||||
writel(lcr_h, port->membase + UART010_LCRH);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int pl010_startup(struct uart_port *port)
|
||||
@@ -385,7 +385,7 @@ pl010_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (port->fifosize > 1)
|
||||
lcr_h |= UART01x_LCRH_FEN;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -438,22 +438,22 @@ pl010_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
writel(lcr_h, port->membase + UART010_LCRH);
|
||||
writel(old_cr, port->membase + UART010_CR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void pl010_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
{
|
||||
if (termios->c_line == N_PPS) {
|
||||
port->flags |= UPF_HARDPPS_CD;
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
pl010_enable_ms(port);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
} else {
|
||||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
if (!UART_ENABLE_MS(port, termios->c_cflag)) {
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
pl010_disable_ms(port);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -345,9 +345,9 @@ static int pl011_fifo_to_tty(struct uart_amba_port *uap)
|
||||
flag = TTY_FRAME;
|
||||
}
|
||||
|
||||
spin_unlock(&uap->port.lock);
|
||||
uart_port_unlock(&uap->port);
|
||||
sysrq = uart_handle_sysrq_char(&uap->port, ch & 255);
|
||||
spin_lock(&uap->port.lock);
|
||||
uart_port_lock(&uap->port);
|
||||
|
||||
if (!sysrq)
|
||||
uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag);
|
||||
@@ -550,7 +550,7 @@ static void pl011_dma_tx_callback(void *data)
|
||||
unsigned long flags;
|
||||
u16 dmacr;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
if (uap->dmatx.queued)
|
||||
dma_unmap_sg(dmatx->chan->device->dev, &dmatx->sg, 1,
|
||||
DMA_TO_DEVICE);
|
||||
@@ -571,7 +571,7 @@ static void pl011_dma_tx_callback(void *data)
|
||||
if (!(dmacr & UART011_TXDMAE) || uart_tx_stopped(&uap->port) ||
|
||||
uart_circ_empty(&uap->port.state->xmit)) {
|
||||
uap->dmatx.queued = false;
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -582,7 +582,7 @@ static void pl011_dma_tx_callback(void *data)
|
||||
*/
|
||||
pl011_start_tx_pio(uap);
|
||||
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1009,7 +1009,7 @@ static void pl011_dma_rx_callback(void *data)
|
||||
* routine to flush out the secondary DMA buffer while
|
||||
* we immediately trigger the next DMA job.
|
||||
*/
|
||||
spin_lock_irq(&uap->port.lock);
|
||||
uart_port_lock_irq(&uap->port);
|
||||
/*
|
||||
* Rx data can be taken by the UART interrupts during
|
||||
* the DMA irq handler. So we check the residue here.
|
||||
@@ -1025,7 +1025,7 @@ static void pl011_dma_rx_callback(void *data)
|
||||
ret = pl011_dma_rx_trigger_dma(uap);
|
||||
|
||||
pl011_dma_rx_chars(uap, pending, lastbuf, false);
|
||||
spin_unlock_irq(&uap->port.lock);
|
||||
uart_port_unlock_irq(&uap->port);
|
||||
/*
|
||||
* Do this check after we picked the DMA chars so we don't
|
||||
* get some IRQ immediately from RX.
|
||||
@@ -1091,11 +1091,11 @@ static void pl011_dma_rx_poll(struct timer_list *t)
|
||||
if (jiffies_to_msecs(jiffies - dmarx->last_jiffies)
|
||||
> uap->dmarx.poll_timeout) {
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
pl011_dma_rx_stop(uap);
|
||||
uap->im |= UART011_RXIM;
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
uap->dmarx.running = false;
|
||||
dmaengine_terminate_all(rxchan);
|
||||
@@ -1191,10 +1191,10 @@ static void pl011_dma_shutdown(struct uart_amba_port *uap)
|
||||
while (pl011_read(uap, REG_FR) & uap->vendor->fr_busy)
|
||||
cpu_relax();
|
||||
|
||||
spin_lock_irq(&uap->port.lock);
|
||||
uart_port_lock_irq(&uap->port);
|
||||
uap->dmacr &= ~(UART011_DMAONERR | UART011_RXDMAE | UART011_TXDMAE);
|
||||
pl011_write(uap->dmacr, uap, REG_DMACR);
|
||||
spin_unlock_irq(&uap->port.lock);
|
||||
uart_port_unlock_irq(&uap->port);
|
||||
|
||||
if (uap->using_tx_dma) {
|
||||
/* In theory, this should already be done by pl011_dma_flush_buffer */
|
||||
@@ -1374,9 +1374,9 @@ static void pl011_throttle_rx(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
pl011_stop_rx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void pl011_enable_ms(struct uart_port *port)
|
||||
@@ -1394,7 +1394,7 @@ __acquires(&uap->port.lock)
|
||||
{
|
||||
pl011_fifo_to_tty(uap);
|
||||
|
||||
spin_unlock(&uap->port.lock);
|
||||
uart_port_unlock(&uap->port);
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
/*
|
||||
* If we were temporarily out of DMA mode for a while,
|
||||
@@ -1419,7 +1419,7 @@ __acquires(&uap->port.lock)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
spin_lock(&uap->port.lock);
|
||||
uart_port_lock(&uap->port);
|
||||
}
|
||||
|
||||
static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c,
|
||||
@@ -1555,7 +1555,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
|
||||
unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
|
||||
int handled = 0;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
status = pl011_read(uap, REG_RIS) & uap->im;
|
||||
if (status) {
|
||||
do {
|
||||
@@ -1585,7 +1585,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -1657,14 +1657,14 @@ static void pl011_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int lcr_h;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
lcr_h = pl011_read(uap, REG_LCRH_TX);
|
||||
if (break_state == -1)
|
||||
lcr_h |= UART01x_LCRH_BRK;
|
||||
else
|
||||
lcr_h &= ~UART01x_LCRH_BRK;
|
||||
pl011_write(lcr_h, uap, REG_LCRH_TX);
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CONSOLE_POLL
|
||||
@@ -1803,7 +1803,7 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap)
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
|
||||
/* Clear out any spuriously appearing RX interrupts */
|
||||
pl011_write(UART011_RTIS | UART011_RXIS, uap, REG_ICR);
|
||||
@@ -1825,7 +1825,7 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap)
|
||||
if (!pl011_dma_rx_running(uap))
|
||||
uap->im |= UART011_RXIM;
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
static void pl011_unthrottle_rx(struct uart_port *port)
|
||||
@@ -1833,7 +1833,7 @@ static void pl011_unthrottle_rx(struct uart_port *port)
|
||||
struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
|
||||
uap->im = UART011_RTIM;
|
||||
if (!pl011_dma_rx_running(uap))
|
||||
@@ -1841,7 +1841,7 @@ static void pl011_unthrottle_rx(struct uart_port *port)
|
||||
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
static int pl011_startup(struct uart_port *port)
|
||||
@@ -1861,7 +1861,7 @@ static int pl011_startup(struct uart_port *port)
|
||||
|
||||
pl011_write(uap->vendor->ifls, uap, REG_IFLS);
|
||||
|
||||
spin_lock_irq(&uap->port.lock);
|
||||
uart_port_lock_irq(&uap->port);
|
||||
|
||||
cr = pl011_read(uap, REG_CR);
|
||||
cr &= UART011_CR_RTS | UART011_CR_DTR;
|
||||
@@ -1872,7 +1872,7 @@ static int pl011_startup(struct uart_port *port)
|
||||
|
||||
pl011_write(cr, uap, REG_CR);
|
||||
|
||||
spin_unlock_irq(&uap->port.lock);
|
||||
uart_port_unlock_irq(&uap->port);
|
||||
|
||||
/*
|
||||
* initialise the old status of the modem signals
|
||||
@@ -1933,12 +1933,12 @@ static void pl011_disable_uart(struct uart_amba_port *uap)
|
||||
unsigned int cr;
|
||||
|
||||
uap->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
|
||||
spin_lock_irq(&uap->port.lock);
|
||||
uart_port_lock_irq(&uap->port);
|
||||
cr = pl011_read(uap, REG_CR);
|
||||
cr &= UART011_CR_RTS | UART011_CR_DTR;
|
||||
cr |= UART01x_CR_UARTEN | UART011_CR_TXE;
|
||||
pl011_write(cr, uap, REG_CR);
|
||||
spin_unlock_irq(&uap->port.lock);
|
||||
uart_port_unlock_irq(&uap->port);
|
||||
|
||||
/*
|
||||
* disable break condition and fifos
|
||||
@@ -1950,14 +1950,14 @@ static void pl011_disable_uart(struct uart_amba_port *uap)
|
||||
|
||||
static void pl011_disable_interrupts(struct uart_amba_port *uap)
|
||||
{
|
||||
spin_lock_irq(&uap->port.lock);
|
||||
uart_port_lock_irq(&uap->port);
|
||||
|
||||
/* mask all interrupts and clear all pending ones */
|
||||
uap->im = 0;
|
||||
pl011_write(uap->im, uap, REG_IMSC);
|
||||
pl011_write(0xffff, uap, REG_ICR);
|
||||
|
||||
spin_unlock_irq(&uap->port.lock);
|
||||
uart_port_unlock_irq(&uap->port);
|
||||
}
|
||||
|
||||
static void pl011_shutdown(struct uart_port *port)
|
||||
@@ -2102,7 +2102,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
bits = tty_get_frame_size(termios->c_cflag);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -2176,7 +2176,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
old_cr |= UART011_CR_RXE;
|
||||
pl011_write(old_cr, uap, REG_CR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2194,10 +2194,10 @@ sbsa_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
termios->c_cflag &= ~(CMSPAR | CRTSCTS);
|
||||
termios->c_cflag |= CS8 | CLOCAL;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
uart_update_timeout(port, CS8, uap->fixed_baud);
|
||||
pl011_setup_status_masks(port, termios);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *pl011_type(struct uart_port *port)
|
||||
@@ -2327,24 +2327,15 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)
|
||||
{
|
||||
struct uart_amba_port *uap = amba_ports[co->index];
|
||||
unsigned int old_cr = 0, new_cr;
|
||||
unsigned long flags = 0;
|
||||
unsigned long flags;
|
||||
int locked = 1;
|
||||
|
||||
clk_enable(uap->clk);
|
||||
|
||||
/*
|
||||
* local_irq_save(flags);
|
||||
*
|
||||
* This local_irq_save() is nonsense. If we come in via sysrq
|
||||
* handling then interrupts are already disabled. Aside of
|
||||
* that the port.sysrq check is racy on SMP regardless.
|
||||
*/
|
||||
if (uap->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&uap->port.lock, flags);
|
||||
if (uap->port.sysrq || oops_in_progress)
|
||||
locked = uart_port_trylock_irqsave(&uap->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_trylock_irqsave(&uap->port, &flags);
|
||||
|
||||
/*
|
||||
* First save the CR then disable the interrupts
|
||||
@@ -2370,7 +2361,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)
|
||||
pl011_write(old_cr, uap, REG_CR);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
clk_disable(uap->clk);
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ static irqreturn_t apbuart_int(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned int status;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
status = UART_GET_STATUS(port);
|
||||
if (status & UART_STATUS_DR)
|
||||
@@ -141,7 +141,7 @@ static irqreturn_t apbuart_int(int irq, void *dev_id)
|
||||
if (status & UART_STATUS_THE)
|
||||
apbuart_tx_chars(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -228,7 +228,7 @@ static void apbuart_set_termios(struct uart_port *port,
|
||||
if (termios->c_cflag & CRTSCTS)
|
||||
cr |= UART_CTRL_FL;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Update the per-port timeout. */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
@@ -251,7 +251,7 @@ static void apbuart_set_termios(struct uart_port *port,
|
||||
UART_PUT_SCAL(port, quot);
|
||||
UART_PUT_CTRL(port, cr);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *apbuart_type(struct uart_port *port)
|
||||
|
||||
@@ -133,9 +133,9 @@ static unsigned int ar933x_uart_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int rdata;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
rdata = ar933x_uart_read(up, AR933X_UART_DATA_REG);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return (rdata & AR933X_UART_DATA_TX_CSR) ? 0 : TIOCSER_TEMT;
|
||||
}
|
||||
@@ -220,14 +220,14 @@ static void ar933x_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
container_of(port, struct ar933x_uart_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_TX_BREAK);
|
||||
else
|
||||
ar933x_uart_rmw_clear(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_TX_BREAK);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -318,7 +318,7 @@ static void ar933x_uart_set_termios(struct uart_port *port,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/* disable the UART */
|
||||
ar933x_uart_rmw_clear(up, AR933X_UART_CS_REG,
|
||||
@@ -352,7 +352,7 @@ static void ar933x_uart_set_termios(struct uart_port *port,
|
||||
AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S,
|
||||
AR933X_UART_CS_IF_MODE_DCE << AR933X_UART_CS_IF_MODE_S);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
if (tty_termios_baud_rate(new))
|
||||
tty_termios_encode_baud_rate(new, baud, baud);
|
||||
@@ -450,7 +450,7 @@ static irqreturn_t ar933x_uart_interrupt(int irq, void *dev_id)
|
||||
if ((status & AR933X_UART_CS_HOST_INT) == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
|
||||
status = ar933x_uart_read(up, AR933X_UART_INT_REG);
|
||||
status &= ar933x_uart_read(up, AR933X_UART_INT_EN_REG);
|
||||
@@ -468,7 +468,7 @@ static irqreturn_t ar933x_uart_interrupt(int irq, void *dev_id)
|
||||
ar933x_uart_tx_chars(up);
|
||||
}
|
||||
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -485,7 +485,7 @@ static int ar933x_uart_startup(struct uart_port *port)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/* Enable HOST interrupts */
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
@@ -498,7 +498,7 @@ static int ar933x_uart_startup(struct uart_port *port)
|
||||
/* Enable RX interrupts */
|
||||
ar933x_uart_start_rx_interrupt(up);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -632,9 +632,9 @@ static void ar933x_uart_console_write(struct console *co, const char *s,
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&up->port.lock);
|
||||
locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -654,7 +654,7 @@ static void ar933x_uart_console_write(struct console *co, const char *s,
|
||||
ar933x_uart_write(up, AR933X_UART_INT_REG, AR933X_UART_INT_ALLINTS);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
@@ -279,9 +279,9 @@ static irqreturn_t arc_serial_isr(int irq, void *dev_id)
|
||||
if (status & RXIENB) {
|
||||
|
||||
/* already in ISR, no need of xx_irqsave */
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
arc_serial_rx_chars(port, status);
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
}
|
||||
|
||||
if ((status & TXIENB) && (status & TXEMPTY)) {
|
||||
@@ -291,12 +291,12 @@ static irqreturn_t arc_serial_isr(int irq, void *dev_id)
|
||||
*/
|
||||
UART_TX_IRQ_DISABLE(port);
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
if (!uart_tx_stopped(port))
|
||||
arc_serial_tx_chars(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -366,7 +366,7 @@ arc_serial_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
uartl = hw_val & 0xFF;
|
||||
uarth = (hw_val >> 8) & 0xFF;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
UART_ALL_IRQ_DISABLE(port);
|
||||
|
||||
@@ -391,7 +391,7 @@ arc_serial_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *arc_serial_type(struct uart_port *port)
|
||||
@@ -521,9 +521,9 @@ static void arc_serial_console_write(struct console *co, const char *s,
|
||||
struct uart_port *port = &arc_uart_ports[co->index].port;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
uart_console_write(port, s, count, arc_serial_console_putchar);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static struct console arc_console = {
|
||||
|
||||
@@ -861,7 +861,7 @@ static void atmel_complete_tx_dma(void *arg)
|
||||
struct dma_chan *chan = atmel_port->chan_tx;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (chan)
|
||||
dmaengine_terminate_all(chan);
|
||||
@@ -893,7 +893,7 @@ static void atmel_complete_tx_dma(void *arg)
|
||||
atmel_port->tx_done_mask);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void atmel_release_tx_dma(struct uart_port *port)
|
||||
@@ -1711,9 +1711,9 @@ static void atmel_tasklet_rx_func(struct tasklet_struct *t)
|
||||
struct uart_port *port = &atmel_port->uart;
|
||||
|
||||
/* The interrupt handler does not take the lock */
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
atmel_port->schedule_rx(port);
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
}
|
||||
|
||||
static void atmel_tasklet_tx_func(struct tasklet_struct *t)
|
||||
@@ -1723,9 +1723,9 @@ static void atmel_tasklet_tx_func(struct tasklet_struct *t)
|
||||
struct uart_port *port = &atmel_port->uart;
|
||||
|
||||
/* The interrupt handler does not take the lock */
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
atmel_port->schedule_tx(port);
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
}
|
||||
|
||||
static void atmel_init_property(struct atmel_uart_port *atmel_port,
|
||||
@@ -2175,7 +2175,7 @@ static void atmel_set_termios(struct uart_port *port,
|
||||
} else
|
||||
mode |= ATMEL_US_PAR_NONE;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = ATMEL_US_OVRE;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -2377,22 +2377,22 @@ gclk_fail:
|
||||
else
|
||||
atmel_disable_ms(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void atmel_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
{
|
||||
if (termios->c_line == N_PPS) {
|
||||
port->flags |= UPF_HARDPPS_CD;
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
atmel_enable_ms(port);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
} else {
|
||||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
if (!UART_ENABLE_MS(port, termios->c_cflag)) {
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
atmel_disable_ms(port);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ static void bcm_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = bcm_uart_readl(port, UART_CTL_REG);
|
||||
if (ctl)
|
||||
@@ -210,7 +210,7 @@ static void bcm_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
val &= ~UART_CTL_XMITBRK_MASK;
|
||||
bcm_uart_writel(port, val, UART_CTL_REG);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -332,7 +332,7 @@ static irqreturn_t bcm_uart_interrupt(int irq, void *dev_id)
|
||||
unsigned int irqstat;
|
||||
|
||||
port = dev_id;
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
irqstat = bcm_uart_readl(port, UART_IR_REG);
|
||||
if (irqstat & UART_RX_INT_STAT)
|
||||
@@ -353,7 +353,7 @@ static irqreturn_t bcm_uart_interrupt(int irq, void *dev_id)
|
||||
estat & UART_EXTINP_DCD_MASK);
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -451,9 +451,9 @@ static void bcm_uart_shutdown(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
bcm_uart_writel(port, 0, UART_IR_REG);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
bcm_uart_disable(port);
|
||||
bcm_uart_flush(port);
|
||||
@@ -470,7 +470,7 @@ static void bcm_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
unsigned long flags;
|
||||
int tries;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Drain the hot tub fully before we power it off for the winter. */
|
||||
for (tries = 3; !bcm_uart_tx_empty(port) && tries; tries--)
|
||||
@@ -546,7 +546,7 @@ static void bcm_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
bcm_uart_enable(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -712,9 +712,9 @@ static void bcm_console_write(struct console *co, const char *s,
|
||||
/* bcm_uart_interrupt() already took the lock */
|
||||
locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
locked = spin_trylock(&port->lock);
|
||||
locked = uart_port_trylock(port);
|
||||
} else {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -725,7 +725,7 @@ static void bcm_console_write(struct console *co, const char *s,
|
||||
wait_for_xmitr(port);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -569,7 +569,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
if ((termios->c_cflag & CREAD) == 0)
|
||||
port->read_status_mask &= ~BD_SC_EMPTY;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (IS_SMC(pinfo)) {
|
||||
unsigned int bits = tty_get_frame_size(termios->c_cflag);
|
||||
@@ -609,7 +609,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
clk_set_rate(pinfo->clk, baud);
|
||||
else
|
||||
cpm_setbrg(pinfo->brg - 1, baud);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *cpm_uart_type(struct uart_port *port)
|
||||
@@ -1386,9 +1386,9 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
local_irq_restore(flags);
|
||||
} else {
|
||||
spin_lock_irqsave(&pinfo->port.lock, flags);
|
||||
uart_port_lock_irqsave(&pinfo->port, &flags);
|
||||
cpm_uart_early_write(pinfo, s, count, true);
|
||||
spin_unlock_irqrestore(&pinfo->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&pinfo->port, flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ static void digicolor_uart_rx(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
while (1) {
|
||||
u8 status, ch, ch_flag;
|
||||
@@ -172,7 +172,7 @@ static void digicolor_uart_rx(struct uart_port *port)
|
||||
ch_flag);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
tty_flip_buffer_push(&port->state->port);
|
||||
}
|
||||
@@ -185,7 +185,7 @@ static void digicolor_uart_tx(struct uart_port *port)
|
||||
if (digicolor_uart_tx_full(port))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (port->x_char) {
|
||||
writeb_relaxed(port->x_char, port->membase + UA_EMI_REC);
|
||||
@@ -211,7 +211,7 @@ static void digicolor_uart_tx(struct uart_port *port)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static irqreturn_t digicolor_uart_int(int irq, void *dev_id)
|
||||
@@ -333,7 +333,7 @@ static void digicolor_uart_set_termios(struct uart_port *port,
|
||||
port->ignore_status_mask |= UA_STATUS_OVERRUN_ERR
|
||||
| UA_STATUS_PARITY_ERR | UA_STATUS_FRAME_ERR;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
@@ -341,7 +341,7 @@ static void digicolor_uart_set_termios(struct uart_port *port,
|
||||
writeb_relaxed(divisor & 0xff, port->membase + UA_HBAUD_LO);
|
||||
writeb_relaxed(divisor >> 8, port->membase + UA_HBAUD_HI);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *digicolor_uart_type(struct uart_port *port)
|
||||
@@ -398,14 +398,14 @@ static void digicolor_uart_console_write(struct console *co, const char *c,
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_console_write(port, c, n, digicolor_uart_console_putchar);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Wait for transmitter to become empty */
|
||||
do {
|
||||
|
||||
+16
-16
@@ -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);
|
||||
|
||||
@@ -203,7 +203,7 @@ static irqreturn_t linflex_txint(int irq, void *dev_id)
|
||||
struct circ_buf *xmit = &sport->state->xmit;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->lock, flags);
|
||||
uart_port_lock_irqsave(sport, &flags);
|
||||
|
||||
if (sport->x_char) {
|
||||
linflex_put_char(sport, sport->x_char);
|
||||
@@ -217,7 +217,7 @@ static irqreturn_t linflex_txint(int irq, void *dev_id)
|
||||
|
||||
linflex_transmit_buffer(sport);
|
||||
out:
|
||||
spin_unlock_irqrestore(&sport->lock, flags);
|
||||
uart_port_unlock_irqrestore(sport, flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
||||
unsigned char rx;
|
||||
bool brk;
|
||||
|
||||
spin_lock_irqsave(&sport->lock, flags);
|
||||
uart_port_lock_irqsave(sport, &flags);
|
||||
|
||||
status = readl(sport->membase + UARTSR);
|
||||
while (status & LINFLEXD_UARTSR_RMB) {
|
||||
@@ -266,7 +266,7 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&sport->lock, flags);
|
||||
uart_port_unlock_irqrestore(sport, flags);
|
||||
|
||||
tty_flip_buffer_push(port);
|
||||
|
||||
@@ -369,11 +369,11 @@ static int linflex_startup(struct uart_port *port)
|
||||
int ret = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
linflex_setup_watermark(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = devm_request_irq(port->dev, port->irq, linflex_int, 0,
|
||||
DRIVER_NAME, port);
|
||||
@@ -386,14 +386,14 @@ static void linflex_shutdown(struct uart_port *port)
|
||||
unsigned long ier;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* disable interrupts */
|
||||
ier = readl(port->membase + LINIER);
|
||||
ier &= ~(LINFLEXD_LINIER_DRIE | LINFLEXD_LINIER_DTIE);
|
||||
writel(ier, port->membase + LINIER);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
devm_free_irq(port->dev, port->irq, port);
|
||||
}
|
||||
@@ -474,7 +474,7 @@ linflex_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
cr &= ~LINFLEXD_UARTCR_PCE;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = 0;
|
||||
|
||||
@@ -507,7 +507,7 @@ linflex_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
writel(cr1, port->membase + LINCR1);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *linflex_type(struct uart_port *port)
|
||||
@@ -646,14 +646,14 @@ linflex_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (sport->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&sport->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(sport, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&sport->lock, flags);
|
||||
uart_port_lock_irqsave(sport, &flags);
|
||||
|
||||
linflex_string_write(sport, s, count);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&sport->lock, flags);
|
||||
uart_port_unlock_irqrestore(sport, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -532,9 +532,9 @@ static void lpuart_dma_tx_complete(void *arg)
|
||||
struct dma_chan *chan = sport->dma_tx_chan;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (!sport->dma_tx_in_progress) {
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -543,7 +543,7 @@ static void lpuart_dma_tx_complete(void *arg)
|
||||
|
||||
uart_xmit_advance(&sport->port, sport->dma_tx_bytes);
|
||||
sport->dma_tx_in_progress = false;
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(&sport->port);
|
||||
@@ -553,12 +553,12 @@ static void lpuart_dma_tx_complete(void *arg)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
if (!lpuart_stopped_or_empty(&sport->port))
|
||||
lpuart_dma_tx(sport);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static dma_addr_t lpuart_dma_datareg_addr(struct lpuart_port *sport)
|
||||
@@ -651,7 +651,7 @@ static int lpuart_poll_init(struct uart_port *port)
|
||||
|
||||
sport->port.fifosize = 0;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
/* Disable Rx & Tx */
|
||||
writeb(0, sport->port.membase + UARTCR2);
|
||||
|
||||
@@ -675,7 +675,7 @@ static int lpuart_poll_init(struct uart_port *port)
|
||||
|
||||
/* Enable Rx and Tx */
|
||||
writeb(UARTCR2_RE | UARTCR2_TE, sport->port.membase + UARTCR2);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -703,7 +703,7 @@ static int lpuart32_poll_init(struct uart_port *port)
|
||||
|
||||
sport->port.fifosize = 0;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* Disable Rx & Tx */
|
||||
lpuart32_write(&sport->port, 0, UARTCTRL);
|
||||
@@ -724,7 +724,7 @@ static int lpuart32_poll_init(struct uart_port *port)
|
||||
|
||||
/* Enable Rx and Tx */
|
||||
lpuart32_write(&sport->port, UARTCTRL_RE | UARTCTRL_TE, UARTCTRL);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -879,9 +879,9 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
|
||||
|
||||
static void lpuart_txint(struct lpuart_port *sport)
|
||||
{
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
lpuart_transmit_buffer(sport);
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
}
|
||||
|
||||
static void lpuart_rxint(struct lpuart_port *sport)
|
||||
@@ -890,7 +890,7 @@ static void lpuart_rxint(struct lpuart_port *sport)
|
||||
struct tty_port *port = &sport->port.state->port;
|
||||
unsigned char rx, sr;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
|
||||
while (!(readb(sport->port.membase + UARTSFIFO) & UARTSFIFO_RXEMPT)) {
|
||||
flg = TTY_NORMAL;
|
||||
@@ -956,9 +956,9 @@ out:
|
||||
|
||||
static void lpuart32_txint(struct lpuart_port *sport)
|
||||
{
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
lpuart32_transmit_buffer(sport);
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
}
|
||||
|
||||
static void lpuart32_rxint(struct lpuart_port *sport)
|
||||
@@ -968,7 +968,7 @@ static void lpuart32_rxint(struct lpuart_port *sport)
|
||||
unsigned long rx, sr;
|
||||
bool is_break;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
|
||||
while (!(lpuart32_read(&sport->port, UARTFIFO) & UARTFIFO_RXEMPT)) {
|
||||
flg = TTY_NORMAL;
|
||||
@@ -1170,12 +1170,12 @@ static void lpuart_copy_rx_to_tty(struct lpuart_port *sport)
|
||||
|
||||
async_tx_ack(sport->dma_rx_desc);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
dmastat = dmaengine_tx_status(chan, sport->dma_rx_cookie, &state);
|
||||
if (dmastat == DMA_ERROR) {
|
||||
dev_err(sport->port.dev, "Rx DMA transfer failed!\n");
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1244,7 +1244,7 @@ exit:
|
||||
dma_sync_sg_for_device(chan->device->dev, &sport->rx_sgl, 1,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
tty_flip_buffer_push(port);
|
||||
if (!sport->dma_idle_int)
|
||||
@@ -1335,9 +1335,9 @@ static void lpuart_timer_func(struct timer_list *t)
|
||||
mod_timer(&sport->lpuart_timer,
|
||||
jiffies + sport->dma_rx_timeout);
|
||||
|
||||
if (spin_trylock_irqsave(&sport->port.lock, flags)) {
|
||||
if (uart_port_trylock_irqsave(&sport->port, &flags)) {
|
||||
sport->last_residue = state.residue;
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1802,14 +1802,14 @@ static void lpuart_hw_setup(struct lpuart_port *sport)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
lpuart_setup_watermark_enable(sport);
|
||||
|
||||
lpuart_rx_dma_startup(sport);
|
||||
lpuart_tx_dma_startup(sport);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static int lpuart_startup(struct uart_port *port)
|
||||
@@ -1859,7 +1859,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
lpuart32_hw_disable(sport);
|
||||
|
||||
@@ -1869,7 +1869,7 @@ static void lpuart32_hw_setup(struct lpuart_port *sport)
|
||||
lpuart32_setup_watermark_enable(sport);
|
||||
lpuart32_configure(sport);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static int lpuart32_startup(struct uart_port *port)
|
||||
@@ -1932,7 +1932,7 @@ static void lpuart_shutdown(struct uart_port *port)
|
||||
unsigned char temp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* disable Rx/Tx and interrupts */
|
||||
temp = readb(port->membase + UARTCR2);
|
||||
@@ -1940,7 +1940,7 @@ static void lpuart_shutdown(struct uart_port *port)
|
||||
UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
|
||||
writeb(temp, port->membase + UARTCR2);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
lpuart_dma_shutdown(sport);
|
||||
}
|
||||
@@ -1952,7 +1952,7 @@ static void lpuart32_shutdown(struct uart_port *port)
|
||||
unsigned long temp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* clear status */
|
||||
temp = lpuart32_read(&sport->port, UARTSTAT);
|
||||
@@ -1969,7 +1969,7 @@ static void lpuart32_shutdown(struct uart_port *port)
|
||||
UARTCTRL_TIE | UARTCTRL_TCIE | UARTCTRL_RIE | UARTCTRL_SBK);
|
||||
lpuart32_write(port, temp, UARTCTRL);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
lpuart_dma_shutdown(sport);
|
||||
}
|
||||
@@ -2069,7 +2069,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (old && sport->lpuart_dma_rx_use)
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
sport->port.read_status_mask = 0;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -2124,7 +2124,7 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
sport->lpuart_dma_rx_use = false;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void __lpuart32_serial_setbrg(struct uart_port *port,
|
||||
@@ -2304,7 +2304,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (old && sport->lpuart_dma_rx_use)
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
sport->port.read_status_mask = 0;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -2359,7 +2359,7 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
sport->lpuart_dma_rx_use = false;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static const char *lpuart_type(struct uart_port *port)
|
||||
@@ -2477,9 +2477,9 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&sport->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&sport->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* first save CR2 and then disable interrupts */
|
||||
cr2 = old_cr2 = readb(sport->port.membase + UARTCR2);
|
||||
@@ -2495,7 +2495,7 @@ lpuart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
writeb(old_cr2, sport->port.membase + UARTCR2);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2507,9 +2507,9 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count)
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&sport->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&sport->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* first save CR2 and then disable interrupts */
|
||||
cr = old_cr = lpuart32_read(&sport->port, UARTCTRL);
|
||||
@@ -2525,7 +2525,7 @@ lpuart32_console_write(struct console *co, const char *s, unsigned int count)
|
||||
lpuart32_write(&sport->port, old_cr, UARTCTRL);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3089,7 +3089,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
uart_suspend_port(&lpuart_reg, &sport->port);
|
||||
|
||||
if (lpuart_uport_is_active(sport)) {
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (lpuart_is_32(sport)) {
|
||||
/* disable Rx/Tx and interrupts */
|
||||
temp = lpuart32_read(&sport->port, UARTCTRL);
|
||||
@@ -3101,7 +3101,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
temp &= ~(UARTCR2_TE | UARTCR2_TIE | UARTCR2_TCIE);
|
||||
writeb(temp, sport->port.membase + UARTCR2);
|
||||
}
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
if (sport->lpuart_dma_rx_use) {
|
||||
/*
|
||||
@@ -3114,7 +3114,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
|
||||
/* Disable Rx DMA to use UART port as wakeup source */
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (lpuart_is_32(sport)) {
|
||||
temp = lpuart32_read(&sport->port, UARTBAUD);
|
||||
lpuart32_write(&sport->port, temp & ~UARTBAUD_RDMAE,
|
||||
@@ -3123,11 +3123,11 @@ static int lpuart_suspend(struct device *dev)
|
||||
writeb(readb(sport->port.membase + UARTCR5) &
|
||||
~UARTCR5_RDMAS, sport->port.membase + UARTCR5);
|
||||
}
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
if (sport->lpuart_dma_tx_use) {
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (lpuart_is_32(sport)) {
|
||||
temp = lpuart32_read(&sport->port, UARTBAUD);
|
||||
temp &= ~UARTBAUD_TDMAE;
|
||||
@@ -3137,7 +3137,7 @@ static int lpuart_suspend(struct device *dev)
|
||||
temp &= ~UARTCR5_TDMAS;
|
||||
writeb(temp, sport->port.membase + UARTCR5);
|
||||
}
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
sport->dma_tx_in_progress = false;
|
||||
dmaengine_terminate_sync(sport->dma_tx_chan);
|
||||
}
|
||||
|
||||
+13
-13
@@ -929,7 +929,7 @@ static inline void check_modem_status(struct icom_port *icom_port)
|
||||
char delta_status;
|
||||
unsigned char status;
|
||||
|
||||
spin_lock(&icom_port->uart_port.lock);
|
||||
uart_port_lock(&icom_port->uart_port);
|
||||
|
||||
/*modem input register */
|
||||
status = readb(&icom_port->dram->isr);
|
||||
@@ -951,7 +951,7 @@ static inline void check_modem_status(struct icom_port *icom_port)
|
||||
port.delta_msr_wait);
|
||||
old_status = status;
|
||||
}
|
||||
spin_unlock(&icom_port->uart_port.lock);
|
||||
uart_port_unlock(&icom_port->uart_port);
|
||||
}
|
||||
|
||||
static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
|
||||
@@ -1093,7 +1093,7 @@ static void process_interrupt(u16 port_int_reg,
|
||||
struct icom_port *icom_port)
|
||||
{
|
||||
|
||||
spin_lock(&icom_port->uart_port.lock);
|
||||
uart_port_lock(&icom_port->uart_port);
|
||||
trace(icom_port, "INTERRUPT", port_int_reg);
|
||||
|
||||
if (port_int_reg & (INT_XMIT_COMPLETED | INT_XMIT_DISABLED))
|
||||
@@ -1102,7 +1102,7 @@ static void process_interrupt(u16 port_int_reg,
|
||||
if (port_int_reg & INT_RCV_COMPLETED)
|
||||
recv_interrupt(port_int_reg, icom_port);
|
||||
|
||||
spin_unlock(&icom_port->uart_port.lock);
|
||||
uart_port_unlock(&icom_port->uart_port);
|
||||
}
|
||||
|
||||
static irqreturn_t icom_interrupt(int irq, void *dev_id)
|
||||
@@ -1186,14 +1186,14 @@ static unsigned int icom_tx_empty(struct uart_port *port)
|
||||
int ret;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
|
||||
SA_FLAGS_READY_TO_XMIT)
|
||||
ret = TIOCSER_TEMT;
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1276,7 +1276,7 @@ static void icom_send_xchar(struct uart_port *port, char ch)
|
||||
|
||||
/* wait .1 sec to send char */
|
||||
for (index = 0; index < 10; index++) {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
xdata = readb(&icom_port->dram->xchar);
|
||||
if (xdata == 0x00) {
|
||||
trace(icom_port, "QUICK_WRITE", 0);
|
||||
@@ -1284,10 +1284,10 @@ static void icom_send_xchar(struct uart_port *port, char ch)
|
||||
|
||||
/* flush write operation */
|
||||
xdata = readb(&icom_port->dram->xchar);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
msleep(10);
|
||||
}
|
||||
}
|
||||
@@ -1307,7 +1307,7 @@ static void icom_break(struct uart_port *port, int break_state)
|
||||
unsigned char cmdReg;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
trace(icom_port, "BREAK", 0);
|
||||
cmdReg = readb(&icom_port->dram->CmdReg);
|
||||
if (break_state == -1) {
|
||||
@@ -1315,7 +1315,7 @@ static void icom_break(struct uart_port *port, int break_state)
|
||||
} else {
|
||||
writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int icom_open(struct uart_port *port)
|
||||
@@ -1365,7 +1365,7 @@ static void icom_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned long offset;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
trace(icom_port, "CHANGE_SPEED", 0);
|
||||
|
||||
cflag = termios->c_cflag;
|
||||
@@ -1516,7 +1516,7 @@ static void icom_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
trace(icom_port, "XR_ENAB", 0);
|
||||
writeb(CMD_XMIT_RCV_ENABLE, &icom_port->dram->CmdReg);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *icom_type(struct uart_port *port)
|
||||
|
||||
+42
-42
@@ -575,7 +575,7 @@ static void imx_uart_dma_tx_callback(void *data)
|
||||
unsigned long flags;
|
||||
u32 ucr1;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
dma_unmap_sg(sport->port.dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE);
|
||||
|
||||
@@ -600,7 +600,7 @@ static void imx_uart_dma_tx_callback(void *data)
|
||||
imx_uart_writel(sport, ucr4, UCR4);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/* called with port.lock taken and irqs off */
|
||||
@@ -766,11 +766,11 @@ static irqreturn_t imx_uart_rtsint(int irq, void *dev_id)
|
||||
struct imx_port *sport = dev_id;
|
||||
irqreturn_t ret;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
|
||||
ret = __imx_uart_rtsint(irq, dev_id);
|
||||
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -779,9 +779,9 @@ static irqreturn_t imx_uart_txint(int irq, void *dev_id)
|
||||
{
|
||||
struct imx_port *sport = dev_id;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
imx_uart_transmit_buffer(sport);
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -895,11 +895,11 @@ static irqreturn_t imx_uart_rxint(int irq, void *dev_id)
|
||||
struct imx_port *sport = dev_id;
|
||||
irqreturn_t ret;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
|
||||
ret = __imx_uart_rxint(irq, dev_id);
|
||||
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -962,7 +962,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
||||
unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
|
||||
usr1 = imx_uart_readl(sport, USR1);
|
||||
usr2 = imx_uart_readl(sport, USR2);
|
||||
@@ -1032,7 +1032,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1115,7 +1115,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
u32 ucr1;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
ucr1 = imx_uart_readl(sport, UCR1) & ~UCR1_SNDBRK;
|
||||
|
||||
@@ -1124,7 +1124,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1137,9 +1137,9 @@ static void imx_uart_timeout(struct timer_list *t)
|
||||
unsigned long flags;
|
||||
|
||||
if (sport->port.state) {
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
imx_uart_mctrl_check(sport);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
mod_timer(&sport->timer, jiffies + MCTRL_TIMEOUT);
|
||||
}
|
||||
@@ -1169,9 +1169,9 @@ static void imx_uart_dma_rx_callback(void *data)
|
||||
status = dmaengine_tx_status(chan, sport->rx_cookie, &state);
|
||||
|
||||
if (status == DMA_ERROR) {
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
imx_uart_clear_rx_errors(sport);
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1200,9 +1200,9 @@ static void imx_uart_dma_rx_callback(void *data)
|
||||
r_bytes = rx_ring->head - rx_ring->tail;
|
||||
|
||||
/* If we received something, check for 0xff flood */
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
imx_uart_check_flood(sport, imx_uart_readl(sport, USR2));
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
|
||||
if (!(sport->port.ignore_status_mask & URXD_DUMMY_READ)) {
|
||||
|
||||
@@ -1460,7 +1460,7 @@ static int imx_uart_startup(struct uart_port *port)
|
||||
if (!uart_console(port) && imx_uart_dma_init(sport) == 0)
|
||||
dma_is_inited = 1;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/* Reset fifo's and state machines */
|
||||
imx_uart_soft_reset(sport);
|
||||
@@ -1533,7 +1533,7 @@ static int imx_uart_startup(struct uart_port *port)
|
||||
|
||||
imx_uart_disable_loopback_rs485(sport);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1558,21 +1558,21 @@ static void imx_uart_shutdown(struct uart_port *port)
|
||||
sport->dma_is_rxing = 0;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
imx_uart_stop_tx(port);
|
||||
imx_uart_stop_rx(port);
|
||||
imx_uart_disable_dma(sport);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
imx_uart_dma_exit(sport);
|
||||
}
|
||||
|
||||
mctrl_gpio_disable_ms(sport->gpios);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
ucr2 = imx_uart_readl(sport, UCR2);
|
||||
ucr2 &= ~(UCR2_TXEN | UCR2_ATEN);
|
||||
imx_uart_writel(sport, ucr2, UCR2);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
/*
|
||||
* Stop our timer.
|
||||
@@ -1583,7 +1583,7 @@ static void imx_uart_shutdown(struct uart_port *port)
|
||||
* Disable all interrupts, port and break condition.
|
||||
*/
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~(UCR1_TRDYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_RXDMAEN |
|
||||
@@ -1605,7 +1605,7 @@ static void imx_uart_shutdown(struct uart_port *port)
|
||||
ucr4 &= ~UCR4_TCEN;
|
||||
imx_uart_writel(sport, ucr4, UCR4);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
clk_disable_unprepare(sport->clk_per);
|
||||
clk_disable_unprepare(sport->clk_ipg);
|
||||
@@ -1668,7 +1668,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16);
|
||||
quot = uart_get_divisor(port, baud);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/*
|
||||
* Read current UCR2 and save it for future use, then clear all the bits
|
||||
@@ -1796,7 +1796,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (UART_ENABLE_MS(&sport->port, termios->c_cflag))
|
||||
imx_uart_enable_ms(&sport->port);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static const char *imx_uart_type(struct uart_port *port)
|
||||
@@ -1858,7 +1858,7 @@ static int imx_uart_poll_init(struct uart_port *port)
|
||||
|
||||
imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/*
|
||||
* Be careful about the order of enabling bits here. First enable the
|
||||
@@ -1886,7 +1886,7 @@ static int imx_uart_poll_init(struct uart_port *port)
|
||||
imx_uart_writel(sport, ucr1 | UCR1_RRDYEN, UCR1);
|
||||
imx_uart_writel(sport, ucr2 | UCR2_ATEN, UCR2);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2005,9 +2005,9 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (sport->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&sport->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&sport->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
/*
|
||||
* First, save UCR1/2/3 and then disable interrupts
|
||||
@@ -2035,7 +2035,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
||||
imx_uart_ucrs_restore(sport, &old_ucr);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2193,10 +2193,10 @@ static enum hrtimer_restart imx_trigger_start_tx(struct hrtimer *t)
|
||||
struct imx_port *sport = container_of(t, struct imx_port, trigger_start_tx);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (sport->tx_state == WAIT_AFTER_RTS)
|
||||
imx_uart_start_tx(&sport->port);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -2206,10 +2206,10 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t)
|
||||
struct imx_port *sport = container_of(t, struct imx_port, trigger_stop_tx);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (sport->tx_state == WAIT_AFTER_SEND)
|
||||
imx_uart_stop_tx(&sport->port);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -2482,9 +2482,9 @@ static void imx_uart_restore_context(struct imx_port *sport)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
if (!sport->context_saved) {
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2499,7 +2499,7 @@ static void imx_uart_restore_context(struct imx_port *sport)
|
||||
imx_uart_writel(sport, sport->saved_reg[2], UCR3);
|
||||
imx_uart_writel(sport, sport->saved_reg[3], UCR4);
|
||||
sport->context_saved = false;
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void imx_uart_save_context(struct imx_port *sport)
|
||||
@@ -2507,7 +2507,7 @@ static void imx_uart_save_context(struct imx_port *sport)
|
||||
unsigned long flags;
|
||||
|
||||
/* Save necessary regs */
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
sport->saved_reg[0] = imx_uart_readl(sport, UCR1);
|
||||
sport->saved_reg[1] = imx_uart_readl(sport, UCR2);
|
||||
sport->saved_reg[2] = imx_uart_readl(sport, UCR3);
|
||||
@@ -2519,7 +2519,7 @@ static void imx_uart_save_context(struct imx_port *sport)
|
||||
sport->saved_reg[8] = imx_uart_readl(sport, UBMR);
|
||||
sport->saved_reg[9] = imx_uart_readl(sport, IMX21_UTS);
|
||||
sport->context_saved = true;
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static void imx_uart_enable_wakeup(struct imx_port *sport, bool on)
|
||||
|
||||
@@ -432,7 +432,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
unsigned char r3;
|
||||
bool push = false;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
r3 = read_zsreg(channel, R3);
|
||||
|
||||
/* Channel A */
|
||||
@@ -448,7 +448,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHATxIP)
|
||||
ip22zilog_transmit_chars(up, channel);
|
||||
}
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
if (push)
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
@@ -458,7 +458,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
|
||||
push = false;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
|
||||
writeb(RES_H_IUS, &channel->control);
|
||||
ZSDELAY();
|
||||
@@ -471,7 +471,7 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHBTxIP)
|
||||
ip22zilog_transmit_chars(up, channel);
|
||||
}
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
if (push)
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
@@ -504,11 +504,11 @@ static unsigned int ip22zilog_tx_empty(struct uart_port *port)
|
||||
unsigned char status;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = ip22zilog_read_channel_status(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (status & Tx_BUF_EMP)
|
||||
ret = TIOCSER_TEMT;
|
||||
@@ -664,7 +664,7 @@ static void ip22zilog_break_ctl(struct uart_port *port, int break_state)
|
||||
else
|
||||
clear_bits |= SND_BRK;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
new_reg = (up->curregs[R5] | set_bits) & ~clear_bits;
|
||||
if (new_reg != up->curregs[R5]) {
|
||||
@@ -674,7 +674,7 @@ static void ip22zilog_break_ctl(struct uart_port *port, int break_state)
|
||||
write_zsreg(channel, R5, up->curregs[R5]);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void __ip22zilog_reset(struct uart_ip22zilog_port *up)
|
||||
@@ -735,9 +735,9 @@ static int ip22zilog_startup(struct uart_port *port)
|
||||
if (ZS_IS_CONS(up))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
__ip22zilog_startup(up);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -775,7 +775,7 @@ static void ip22zilog_shutdown(struct uart_port *port)
|
||||
if (ZS_IS_CONS(up))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(port);
|
||||
|
||||
@@ -788,7 +788,7 @@ static void ip22zilog_shutdown(struct uart_port *port)
|
||||
up->curregs[R5] &= ~SND_BRK;
|
||||
ip22zilog_maybe_update_regs(up, channel);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Shared by TTY driver and serial console setup. The port lock is held
|
||||
@@ -880,7 +880,7 @@ ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 1200, 76800);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
|
||||
|
||||
@@ -894,7 +894,7 @@ ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
ip22zilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(port));
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static const char *ip22zilog_type(struct uart_port *port)
|
||||
@@ -1016,10 +1016,10 @@ ip22zilog_console_write(struct console *con, const char *s, unsigned int count)
|
||||
struct uart_ip22zilog_port *up = &ip22zilog_port_table[con->index];
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
uart_console_write(&up->port, s, count, ip22zilog_put_char);
|
||||
udelay(2);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int __init ip22zilog_console_setup(struct console *con, char *options)
|
||||
@@ -1034,13 +1034,13 @@ static int __init ip22zilog_console_setup(struct console *con, char *options)
|
||||
|
||||
printk(KERN_INFO "Console: ttyS%d (IP22-Zilog)\n", con->index);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
up->curregs[R15] |= BRKIE;
|
||||
|
||||
__ip22zilog_startup(up);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
|
||||
@@ -816,9 +816,9 @@ static void neo_parse_isr(struct jsm_board *brd, u32 port)
|
||||
/* Parse any modem signal changes */
|
||||
jsm_dbg(INTR, &ch->ch_bd->pci_dev,
|
||||
"MOD_STAT: sending to parse_modem_sigs\n");
|
||||
spin_lock_irqsave(&ch->uart_port.lock, lock_flags);
|
||||
uart_port_lock_irqsave(&ch->uart_port, &lock_flags);
|
||||
neo_parse_modem(ch, readb(&ch->ch_neo_uart->msr));
|
||||
spin_unlock_irqrestore(&ch->uart_port.lock, lock_flags);
|
||||
uart_port_unlock_irqrestore(&ch->uart_port, lock_flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -152,14 +152,14 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch)
|
||||
container_of(port, struct jsm_channel, uart_port);
|
||||
struct ktermios *termios;
|
||||
|
||||
spin_lock_irqsave(&port->lock, lock_flags);
|
||||
uart_port_lock_irqsave(port, &lock_flags);
|
||||
termios = &port->state->port.tty->termios;
|
||||
if (ch == termios->c_cc[VSTART])
|
||||
channel->ch_bd->bd_ops->send_start_character(channel);
|
||||
|
||||
if (ch == termios->c_cc[VSTOP])
|
||||
channel->ch_bd->bd_ops->send_stop_character(channel);
|
||||
spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
uart_port_unlock_irqrestore(port, lock_flags);
|
||||
}
|
||||
|
||||
static void jsm_tty_stop_rx(struct uart_port *port)
|
||||
@@ -176,13 +176,13 @@ static void jsm_tty_break(struct uart_port *port, int break_state)
|
||||
struct jsm_channel *channel =
|
||||
container_of(port, struct jsm_channel, uart_port);
|
||||
|
||||
spin_lock_irqsave(&port->lock, lock_flags);
|
||||
uart_port_lock_irqsave(port, &lock_flags);
|
||||
if (break_state == -1)
|
||||
channel->ch_bd->bd_ops->send_break(channel);
|
||||
else
|
||||
channel->ch_bd->bd_ops->clear_break(channel);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
uart_port_unlock_irqrestore(port, lock_flags);
|
||||
}
|
||||
|
||||
static int jsm_tty_open(struct uart_port *port)
|
||||
@@ -241,7 +241,7 @@ static int jsm_tty_open(struct uart_port *port)
|
||||
channel->ch_cached_lsr = 0;
|
||||
channel->ch_stops_sent = 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, lock_flags);
|
||||
uart_port_lock_irqsave(port, &lock_flags);
|
||||
termios = &port->state->port.tty->termios;
|
||||
channel->ch_c_cflag = termios->c_cflag;
|
||||
channel->ch_c_iflag = termios->c_iflag;
|
||||
@@ -261,7 +261,7 @@ static int jsm_tty_open(struct uart_port *port)
|
||||
jsm_carrier(channel);
|
||||
|
||||
channel->ch_open_count++;
|
||||
spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
uart_port_unlock_irqrestore(port, lock_flags);
|
||||
|
||||
jsm_dbg(OPEN, &channel->ch_bd->pci_dev, "finish\n");
|
||||
return 0;
|
||||
@@ -307,7 +307,7 @@ static void jsm_tty_set_termios(struct uart_port *port,
|
||||
struct jsm_channel *channel =
|
||||
container_of(port, struct jsm_channel, uart_port);
|
||||
|
||||
spin_lock_irqsave(&port->lock, lock_flags);
|
||||
uart_port_lock_irqsave(port, &lock_flags);
|
||||
channel->ch_c_cflag = termios->c_cflag;
|
||||
channel->ch_c_iflag = termios->c_iflag;
|
||||
channel->ch_c_oflag = termios->c_oflag;
|
||||
@@ -317,7 +317,7 @@ static void jsm_tty_set_termios(struct uart_port *port,
|
||||
|
||||
channel->ch_bd->bd_ops->param(channel);
|
||||
jsm_carrier(channel);
|
||||
spin_unlock_irqrestore(&port->lock, lock_flags);
|
||||
uart_port_unlock_irqrestore(port, lock_flags);
|
||||
}
|
||||
|
||||
static const char *jsm_tty_type(struct uart_port *port)
|
||||
|
||||
@@ -139,13 +139,13 @@ static irqreturn_t liteuart_interrupt(int irq, void *data)
|
||||
* if polling, the context would be "in_serving_softirq", so use
|
||||
* irq[save|restore] spin_lock variants to cover all possibilities
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
isr = litex_read8(port->membase + OFF_EV_PENDING) & uart->irq_reg;
|
||||
if (isr & EV_RX)
|
||||
liteuart_rx_chars(port);
|
||||
if (isr & EV_TX)
|
||||
liteuart_tx_chars(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
}
|
||||
@@ -195,10 +195,10 @@ static int liteuart_startup(struct uart_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
/* only enabling rx irqs during startup */
|
||||
liteuart_update_irq_reg(port, true, EV_RX);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (!port->irq) {
|
||||
timer_setup(&uart->timer, liteuart_timer, 0);
|
||||
@@ -213,9 +213,9 @@ static void liteuart_shutdown(struct uart_port *port)
|
||||
struct liteuart_port *uart = to_liteuart_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
liteuart_update_irq_reg(port, false, EV_RX | EV_TX);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (port->irq)
|
||||
free_irq(port->irq, port);
|
||||
@@ -229,13 +229,13 @@ static void liteuart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
unsigned int baud;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* update baudrate */
|
||||
baud = uart_get_baud_rate(port, new, old, 0, 460800);
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *liteuart_type(struct uart_port *port)
|
||||
@@ -382,9 +382,9 @@ static void liteuart_console_write(struct console *co, const char *s,
|
||||
uart = (struct liteuart_port *)xa_load(&liteuart_array, co->index);
|
||||
port = &uart->port;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
uart_console_write(port, s, count, liteuart_putchar);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int liteuart_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -140,15 +140,15 @@ static void lpc32xx_hsuart_console_write(struct console *co, const char *s,
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&up->port.lock);
|
||||
locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
|
||||
uart_console_write(&up->port, s, count, lpc32xx_hsuart_console_putchar);
|
||||
wait_for_xmit_empty(&up->port);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
@@ -298,7 +298,7 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
||||
struct tty_port *tport = &port->state->port;
|
||||
u32 status;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
/* Read UART status and clear latched interrupts */
|
||||
status = readl(LPC32XX_HSUART_IIR(port->membase));
|
||||
@@ -333,7 +333,7 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
|
||||
__serial_lpc32xx_tx(port);
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -404,14 +404,14 @@ static void serial_lpc32xx_break_ctl(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
u32 tmp;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
|
||||
if (break_state != 0)
|
||||
tmp |= LPC32XX_HSU_BREAK;
|
||||
else
|
||||
tmp &= ~LPC32XX_HSU_BREAK;
|
||||
writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* port->lock is not held. */
|
||||
@@ -421,7 +421,7 @@ static int serial_lpc32xx_startup(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
u32 tmp;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
__serial_uart_flush(port);
|
||||
|
||||
@@ -441,7 +441,7 @@ static int serial_lpc32xx_startup(struct uart_port *port)
|
||||
|
||||
lpc32xx_loopback_set(port->mapbase, 0); /* get out of loopback mode */
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
retval = request_irq(port->irq, serial_lpc32xx_interrupt,
|
||||
0, MODNAME, port);
|
||||
@@ -458,7 +458,7 @@ static void serial_lpc32xx_shutdown(struct uart_port *port)
|
||||
u32 tmp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
|
||||
LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B;
|
||||
@@ -466,7 +466,7 @@ static void serial_lpc32xx_shutdown(struct uart_port *port)
|
||||
|
||||
lpc32xx_loopback_set(port->mapbase, 1); /* go to loopback mode */
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -491,7 +491,7 @@ static void serial_lpc32xx_set_termios(struct uart_port *port,
|
||||
|
||||
quot = __serial_get_clock_div(port->uartclk, baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Ignore characters? */
|
||||
tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
|
||||
@@ -505,7 +505,7 @@ static void serial_lpc32xx_set_termios(struct uart_port *port,
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Don't rewrite B0 */
|
||||
if (tty_termios_baud_rate(termios))
|
||||
|
||||
@@ -269,16 +269,16 @@ static void receive_chars(struct uart_ma35d1_port *up)
|
||||
if (uart_handle_sysrq_char(&up->port, ch))
|
||||
continue;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
uart_insert_char(&up->port, fsr, MA35_FSR_RX_OVER_IF, ch, flag);
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
fsr = serial_in(up, MA35_FSR_REG);
|
||||
} while (!(fsr & MA35_FSR_RX_EMPTY) && (max_count-- > 0));
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
}
|
||||
|
||||
static irqreturn_t ma35d1serial_interrupt(int irq, void *dev_id)
|
||||
@@ -364,14 +364,14 @@ static void ma35d1serial_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
u32 lcr;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
lcr = serial_in(up, MA35_LCR_REG);
|
||||
if (break_state != 0)
|
||||
lcr |= MA35_LCR_BREAK;
|
||||
else
|
||||
lcr &= ~MA35_LCR_BREAK;
|
||||
serial_out(up, MA35_LCR_REG, lcr);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int ma35d1serial_startup(struct uart_port *port)
|
||||
@@ -441,7 +441,7 @@ static void ma35d1serial_set_termios(struct uart_port *port,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
up->port.read_status_mask = MA35_FSR_RX_OVER_IF;
|
||||
if (termios->c_iflag & INPCK)
|
||||
@@ -475,7 +475,7 @@ static void ma35d1serial_set_termios(struct uart_port *port,
|
||||
|
||||
serial_out(up, MA35_LCR_REG, lcr);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static const char *ma35d1serial_type(struct uart_port *port)
|
||||
@@ -560,9 +560,9 @@ static void ma35d1serial_console_write(struct console *co, const char *s, u32 co
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&up->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -576,7 +576,7 @@ static void ma35d1serial_console_write(struct console *co, const char *s, u32 co
|
||||
serial_out(up, MA35_IER_REG, ier);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int __init ma35d1serial_console_setup(struct console *co, char *options)
|
||||
|
||||
+10
-10
@@ -135,12 +135,12 @@ static void mcf_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (break_state == -1)
|
||||
writeb(MCFUART_UCR_CMDBREAKSTART, port->membase + MCFUART_UCR);
|
||||
else
|
||||
writeb(MCFUART_UCR_CMDBREAKSTOP, port->membase + MCFUART_UCR);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -150,7 +150,7 @@ static int mcf_startup(struct uart_port *port)
|
||||
struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Reset UART, get it into known state... */
|
||||
writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR);
|
||||
@@ -164,7 +164,7 @@ static int mcf_startup(struct uart_port *port)
|
||||
pp->imr = MCFUART_UIR_RXREADY;
|
||||
writeb(pp->imr, port->membase + MCFUART_UIMR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -176,7 +176,7 @@ static void mcf_shutdown(struct uart_port *port)
|
||||
struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable all interrupts now */
|
||||
pp->imr = 0;
|
||||
@@ -186,7 +186,7 @@ static void mcf_shutdown(struct uart_port *port)
|
||||
writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR);
|
||||
writeb(MCFUART_UCR_CMDRESETTX, port->membase + MCFUART_UCR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -252,7 +252,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
mr2 |= MCFUART_MR2_TXCTS;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (port->rs485.flags & SER_RS485_ENABLED) {
|
||||
dev_dbg(port->dev, "Setting UART to RS485\n");
|
||||
mr2 |= MCFUART_MR2_TXRTS;
|
||||
@@ -273,7 +273,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
port->membase + MCFUART_UCSR);
|
||||
writeb(MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE,
|
||||
port->membase + MCFUART_UCR);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -350,7 +350,7 @@ static irqreturn_t mcf_interrupt(int irq, void *data)
|
||||
|
||||
isr = readb(port->membase + MCFUART_UISR) & pp->imr;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
if (isr & MCFUART_UIR_RXREADY) {
|
||||
mcf_rx_chars(pp);
|
||||
ret = IRQ_HANDLED;
|
||||
@@ -359,7 +359,7 @@ static irqreturn_t mcf_interrupt(int irq, void *data)
|
||||
mcf_tx_chars(pp);
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -392,7 +392,7 @@ static irqreturn_t men_z135_intr(int irq, void *data)
|
||||
if (!irq_id)
|
||||
goto out;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
/* It's save to write to IIR[7:6] RXC[9:8] */
|
||||
iowrite8(irq_id, port->membase + MEN_Z135_STAT_REG);
|
||||
|
||||
@@ -418,7 +418,7 @@ static irqreturn_t men_z135_intr(int irq, void *data)
|
||||
handled = true;
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
out:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -708,7 +708,7 @@ static void men_z135_set_termios(struct uart_port *port,
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, uart_freq / 16);
|
||||
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
@@ -716,7 +716,7 @@ static void men_z135_set_termios(struct uart_port *port,
|
||||
iowrite32(bd_reg, port->membase + MEN_Z135_BAUD_REG);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
}
|
||||
|
||||
static const char *men_z135_type(struct uart_port *port)
|
||||
|
||||
@@ -129,14 +129,14 @@ static void meson_uart_shutdown(struct uart_port *port)
|
||||
|
||||
free_irq(port->irq, port);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = readl(port->membase + AML_UART_CONTROL);
|
||||
val &= ~AML_UART_RX_EN;
|
||||
val &= ~(AML_UART_RX_INT_EN | AML_UART_TX_INT_EN);
|
||||
writel(val, port->membase + AML_UART_CONTROL);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void meson_uart_start_tx(struct uart_port *port)
|
||||
@@ -238,7 +238,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = (struct uart_port *)dev_id;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
if (!(readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY))
|
||||
meson_receive_chars(port);
|
||||
@@ -248,7 +248,7 @@ static irqreturn_t meson_uart_interrupt(int irq, void *dev_id)
|
||||
meson_uart_start_tx(port);
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -284,7 +284,7 @@ static int meson_uart_startup(struct uart_port *port)
|
||||
u32 val;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = readl(port->membase + AML_UART_CONTROL);
|
||||
val |= AML_UART_CLEAR_ERR;
|
||||
@@ -301,7 +301,7 @@ static int meson_uart_startup(struct uart_port *port)
|
||||
val = (AML_UART_RECV_IRQ(1) | AML_UART_XMIT_IRQ(port->fifosize / 2));
|
||||
writel(val, port->membase + AML_UART_MISC);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = request_irq(port->irq, meson_uart_interrupt, 0,
|
||||
port->name, port);
|
||||
@@ -341,7 +341,7 @@ static void meson_uart_set_termios(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
cflags = termios->c_cflag;
|
||||
iflags = termios->c_iflag;
|
||||
@@ -401,7 +401,7 @@ static void meson_uart_set_termios(struct uart_port *port,
|
||||
AML_UART_FRAME_ERR;
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int meson_uart_verify_port(struct uart_port *port,
|
||||
@@ -460,14 +460,14 @@ static int meson_uart_poll_get_char(struct uart_port *port)
|
||||
u32 c;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (readl(port->membase + AML_UART_STATUS) & AML_UART_RX_EMPTY)
|
||||
c = NO_POLL_CHAR;
|
||||
else
|
||||
c = readl(port->membase + AML_UART_RFIFO);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return c;
|
||||
}
|
||||
@@ -478,7 +478,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c)
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Wait until FIFO is empty or timeout */
|
||||
ret = readl_poll_timeout_atomic(port->membase + AML_UART_STATUS, reg,
|
||||
@@ -502,7 +502,7 @@ static void meson_uart_poll_put_char(struct uart_port *port, unsigned char c)
|
||||
dev_err(port->dev, "Timeout waiting for UART TX EMPTY\n");
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CONSOLE_POLL */
|
||||
@@ -559,9 +559,9 @@ static void meson_serial_port_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq) {
|
||||
locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
locked = spin_trylock(&port->lock);
|
||||
locked = uart_port_trylock(port);
|
||||
} else {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -573,7 +573,7 @@ static void meson_serial_port_write(struct uart_port *port, const char *s,
|
||||
writel(val, port->membase + AML_UART_CONTROL);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -207,9 +207,9 @@ static irqreturn_t mlb_usio_rx_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = dev_id;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
mlb_usio_rx_chars(port);
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -218,10 +218,10 @@ static irqreturn_t mlb_usio_tx_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct uart_port *port = dev_id;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
if (readb(port->membase + MLB_USIO_REG_SSR) & MLB_USIO_SSR_TBI)
|
||||
mlb_usio_tx_chars(port);
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -267,7 +267,7 @@ static int mlb_usio_startup(struct uart_port *port)
|
||||
escr = readb(port->membase + MLB_USIO_REG_ESCR);
|
||||
if (of_property_read_bool(port->dev->of_node, "auto-flow-control"))
|
||||
escr |= MLB_USIO_ESCR_FLWEN;
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
writeb(0, port->membase + MLB_USIO_REG_SCR);
|
||||
writeb(escr, port->membase + MLB_USIO_REG_ESCR);
|
||||
writeb(MLB_USIO_SCR_UPCL, port->membase + MLB_USIO_REG_SCR);
|
||||
@@ -282,7 +282,7 @@ static int mlb_usio_startup(struct uart_port *port)
|
||||
|
||||
writeb(MLB_USIO_SCR_TXE | MLB_USIO_SCR_RIE | MLB_USIO_SCR_TBIE |
|
||||
MLB_USIO_SCR_RXE, port->membase + MLB_USIO_REG_SCR);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -337,7 +337,7 @@ static void mlb_usio_set_termios(struct uart_port *port,
|
||||
else
|
||||
quot = 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
port->read_status_mask = MLB_USIO_SSR_ORE | MLB_USIO_SSR_RDRF |
|
||||
MLB_USIO_SSR_TDRE;
|
||||
@@ -367,7 +367,7 @@ static void mlb_usio_set_termios(struct uart_port *port,
|
||||
writew(BIT(12), port->membase + MLB_USIO_REG_FBYTE);
|
||||
writeb(MLB_USIO_SCR_RIE | MLB_USIO_SCR_RXE | MLB_USIO_SCR_TBIE |
|
||||
MLB_USIO_SCR_TXE, port->membase + MLB_USIO_REG_SCR);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *mlb_usio_type(struct uart_port *port)
|
||||
|
||||
@@ -1096,14 +1096,14 @@ static void
|
||||
mpc52xx_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (ctl == -1)
|
||||
psc_ops->command(port, MPC52xx_PSC_START_BRK);
|
||||
else
|
||||
psc_ops->command(port, MPC52xx_PSC_STOP_BRK);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1214,7 +1214,7 @@ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
}
|
||||
|
||||
/* Get the lock */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Do our best to flush TX & RX, so we don't lose anything */
|
||||
/* But we don't wait indefinitely ! */
|
||||
@@ -1250,7 +1250,7 @@ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
psc_ops->command(port, MPC52xx_PSC_RX_ENABLE);
|
||||
|
||||
/* We're all set, release the lock */
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *
|
||||
@@ -1477,11 +1477,11 @@ mpc52xx_uart_int(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
irqreturn_t ret;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
ret = psc_ops->handle_irq(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -188,12 +188,12 @@ static irqreturn_t mps2_uart_rxirq(int irq, void *data)
|
||||
if (unlikely(!(irqflag & UARTn_INT_RX)))
|
||||
return IRQ_NONE;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
mps2_uart_write8(port, UARTn_INT_RX, UARTn_INT);
|
||||
mps2_uart_rx_chars(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -206,12 +206,12 @@ static irqreturn_t mps2_uart_txirq(int irq, void *data)
|
||||
if (unlikely(!(irqflag & UARTn_INT_TX)))
|
||||
return IRQ_NONE;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
mps2_uart_write8(port, UARTn_INT_TX, UARTn_INT);
|
||||
mps2_uart_tx_chars(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -222,7 +222,7 @@ static irqreturn_t mps2_uart_oerrirq(int irq, void *data)
|
||||
struct uart_port *port = data;
|
||||
u8 irqflag = mps2_uart_read8(port, UARTn_INT);
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
if (irqflag & UARTn_INT_RX_OVERRUN) {
|
||||
struct tty_port *tport = &port->state->port;
|
||||
@@ -244,7 +244,7 @@ static irqreturn_t mps2_uart_oerrirq(int irq, void *data)
|
||||
handled = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return handled;
|
||||
}
|
||||
@@ -356,12 +356,12 @@ mps2_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
bauddiv = DIV_ROUND_CLOSEST(port->uartclk, baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
mps2_uart_write32(port, bauddiv, UARTn_BAUDDIV);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
@@ -444,7 +444,7 @@ static void msm_complete_tx_dma(void *args)
|
||||
unsigned int count;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Already stopped */
|
||||
if (!dma->count)
|
||||
@@ -476,7 +476,7 @@ static void msm_complete_tx_dma(void *args)
|
||||
|
||||
msm_handle_tx(port);
|
||||
done:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int msm_handle_tx_dma(struct msm_port *msm_port, unsigned int count)
|
||||
@@ -549,7 +549,7 @@ static void msm_complete_rx_dma(void *args)
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Already stopped */
|
||||
if (!dma->count)
|
||||
@@ -587,16 +587,16 @@ static void msm_complete_rx_dma(void *args)
|
||||
if (!(port->read_status_mask & MSM_UART_SR_RX_BREAK))
|
||||
flag = TTY_NORMAL;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
sysrq = uart_handle_sysrq_char(port, dma->virt[i]);
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (!sysrq)
|
||||
tty_insert_flip_char(tport, dma->virt[i], flag);
|
||||
}
|
||||
|
||||
msm_start_rx_dma(msm_port);
|
||||
done:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (count)
|
||||
tty_flip_buffer_push(tport);
|
||||
@@ -762,9 +762,9 @@ static void msm_handle_rx_dm(struct uart_port *port, unsigned int misr)
|
||||
if (!(port->read_status_mask & MSM_UART_SR_RX_BREAK))
|
||||
flag = TTY_NORMAL;
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
sysrq = uart_handle_sysrq_char(port, buf[i]);
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
if (!sysrq)
|
||||
tty_insert_flip_char(tport, buf[i], flag);
|
||||
}
|
||||
@@ -824,9 +824,9 @@ static void msm_handle_rx(struct uart_port *port)
|
||||
else if (sr & MSM_UART_SR_PAR_FRAME_ERR)
|
||||
flag = TTY_FRAME;
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
sysrq = uart_handle_sysrq_char(port, c);
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
if (!sysrq)
|
||||
tty_insert_flip_char(tport, c, flag);
|
||||
}
|
||||
@@ -951,7 +951,7 @@ static irqreturn_t msm_uart_irq(int irq, void *dev_id)
|
||||
unsigned int misr;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
misr = msm_read(port, MSM_UART_MISR);
|
||||
msm_write(port, 0, MSM_UART_IMR); /* disable interrupt */
|
||||
|
||||
@@ -983,7 +983,7 @@ static irqreturn_t msm_uart_irq(int irq, void *dev_id)
|
||||
msm_handle_delta_cts(port);
|
||||
|
||||
msm_write(port, msm_port->imr, MSM_UART_IMR); /* restore interrupt */
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1128,13 +1128,13 @@ static int msm_set_baud_rate(struct uart_port *port, unsigned int baud,
|
||||
unsigned long flags, rate;
|
||||
|
||||
flags = *saved_flags;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
entry = msm_find_best_baud(port, baud, &rate);
|
||||
clk_set_rate(msm_port->clk, rate);
|
||||
baud = rate / 16 / entry->divisor;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
*saved_flags = flags;
|
||||
port->uartclk = rate;
|
||||
|
||||
@@ -1266,7 +1266,7 @@ static void msm_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned long flags;
|
||||
unsigned int baud, mr;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (dma->chan) /* Terminate if any */
|
||||
msm_stop_dma(port, dma);
|
||||
@@ -1338,7 +1338,7 @@ static void msm_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
/* Try to use DMA */
|
||||
msm_start_rx_dma(msm_port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *msm_type(struct uart_port *port)
|
||||
@@ -1620,9 +1620,9 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&port->lock);
|
||||
locked = uart_port_trylock(port);
|
||||
else
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
if (is_uartdm)
|
||||
msm_reset_dm_count(port, count);
|
||||
@@ -1661,7 +1661,7 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
}
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
@@ -187,9 +187,9 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int st;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
st = readl(port->membase + UART_STAT);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return (st & STAT_TX_EMP) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
@@ -249,14 +249,14 @@ static void mvebu_uart_break_ctl(struct uart_port *port, int brk)
|
||||
unsigned int ctl;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ctl = readl(port->membase + UART_CTRL(port));
|
||||
if (brk == -1)
|
||||
ctl |= CTRL_SND_BRK_SEQ;
|
||||
else
|
||||
ctl &= ~CTRL_SND_BRK_SEQ;
|
||||
writel(ctl, port->membase + UART_CTRL(port));
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void mvebu_uart_rx_chars(struct uart_port *port, unsigned int status)
|
||||
@@ -540,7 +540,7 @@ static void mvebu_uart_set_termios(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
unsigned int baud, min_baud, max_baud;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = STAT_RX_RDY(port) | STAT_OVR_ERR |
|
||||
STAT_TX_RDY(port) | STAT_TX_FIFO_FUL;
|
||||
@@ -589,7 +589,7 @@ static void mvebu_uart_set_termios(struct uart_port *port,
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *mvebu_uart_type(struct uart_port *port)
|
||||
@@ -735,9 +735,9 @@ static void mvebu_uart_console_write(struct console *co, const char *s,
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
ier = readl(port->membase + UART_CTRL(port)) & CTRL_BRK_INT;
|
||||
intr = readl(port->membase + UART_INTR(port)) &
|
||||
@@ -758,7 +758,7 @@ static void mvebu_uart_console_write(struct console *co, const char *s,
|
||||
}
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int mvebu_uart_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -390,10 +390,10 @@ static void serial_omap_throttle(struct uart_port *port)
|
||||
struct uart_omap_port *up = to_uart_omap_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void serial_omap_unthrottle(struct uart_port *port)
|
||||
@@ -401,10 +401,10 @@ static void serial_omap_unthrottle(struct uart_port *port)
|
||||
struct uart_omap_port *up = to_uart_omap_port(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->ier |= UART_IER_RLSI | UART_IER_RDI;
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static unsigned int check_modem_status(struct uart_omap_port *up)
|
||||
@@ -527,7 +527,7 @@ static irqreturn_t serial_omap_irq(int irq, void *dev_id)
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
int max_count = 256;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
|
||||
do {
|
||||
iir = serial_in(up, UART_IIR);
|
||||
@@ -563,7 +563,7 @@ static irqreturn_t serial_omap_irq(int irq, void *dev_id)
|
||||
}
|
||||
} while (max_count--);
|
||||
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
tty_flip_buffer_push(&up->port.state->port);
|
||||
|
||||
@@ -579,9 +579,9 @@ static unsigned int serial_omap_tx_empty(struct uart_port *port)
|
||||
unsigned int ret = 0;
|
||||
|
||||
dev_dbg(up->port.dev, "serial_omap_tx_empty+%d\n", up->port.line);
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -647,13 +647,13 @@ static void serial_omap_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(up->port.dev, "serial_omap_break_ctl+%d\n", up->port.line);
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_out(up, UART_LCR, up->lcr);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int serial_omap_startup(struct uart_port *port)
|
||||
@@ -701,13 +701,13 @@ static int serial_omap_startup(struct uart_port *port)
|
||||
* Now, initialize the UART
|
||||
*/
|
||||
serial_out(up, UART_LCR, UART_LCR_WLEN8);
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
/*
|
||||
* Most PC uarts need OUT2 raised to enable interrupts.
|
||||
*/
|
||||
up->port.mctrl |= TIOCM_OUT2;
|
||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
up->msr_saved_flags = 0;
|
||||
/*
|
||||
@@ -742,10 +742,10 @@ static void serial_omap_shutdown(struct uart_port *port)
|
||||
up->ier = 0;
|
||||
serial_out(up, UART_IER, 0);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->port.mctrl &= ~TIOCM_OUT2;
|
||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -815,7 +815,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -1013,7 +1013,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
serial_omap_set_mctrl(&up->port, up->port.mctrl);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line);
|
||||
}
|
||||
|
||||
@@ -1213,9 +1213,9 @@ serial_omap_console_write(struct console *co, const char *s,
|
||||
int locked = 1;
|
||||
|
||||
if (up->port.sysrq || oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&up->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -1242,7 +1242,7 @@ serial_omap_console_write(struct console *co, const char *s,
|
||||
check_modem_status(up);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int __init
|
||||
|
||||
@@ -125,12 +125,12 @@ static unsigned int owl_uart_tx_empty(struct uart_port *port)
|
||||
u32 val;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = owl_uart_read(port, OWL_UART_STAT);
|
||||
ret = (val & OWL_UART_STAT_TFES) ? TIOCSER_TEMT : 0;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -232,7 +232,7 @@ static irqreturn_t owl_uart_irq(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
u32 stat;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
stat = owl_uart_read(port, OWL_UART_STAT);
|
||||
|
||||
@@ -246,7 +246,7 @@ static irqreturn_t owl_uart_irq(int irq, void *dev_id)
|
||||
stat |= OWL_UART_STAT_RIP | OWL_UART_STAT_TIP;
|
||||
owl_uart_write(port, stat, OWL_UART_STAT);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -256,14 +256,14 @@ static void owl_uart_shutdown(struct uart_port *port)
|
||||
u32 val;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = owl_uart_read(port, OWL_UART_CTL);
|
||||
val &= ~(OWL_UART_CTL_TXIE | OWL_UART_CTL_RXIE
|
||||
| OWL_UART_CTL_TXDE | OWL_UART_CTL_RXDE | OWL_UART_CTL_EN);
|
||||
owl_uart_write(port, val, OWL_UART_CTL);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -279,7 +279,7 @@ static int owl_uart_startup(struct uart_port *port)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = owl_uart_read(port, OWL_UART_STAT);
|
||||
val |= OWL_UART_STAT_RIP | OWL_UART_STAT_TIP
|
||||
@@ -291,7 +291,7 @@ static int owl_uart_startup(struct uart_port *port)
|
||||
val |= OWL_UART_CTL_EN;
|
||||
owl_uart_write(port, val, OWL_UART_CTL);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -311,7 +311,7 @@ static void owl_uart_set_termios(struct uart_port *port,
|
||||
u32 ctl;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
ctl = owl_uart_read(port, OWL_UART_CTL);
|
||||
|
||||
@@ -371,7 +371,7 @@ static void owl_uart_set_termios(struct uart_port *port,
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void owl_uart_release_port(struct uart_port *port)
|
||||
@@ -515,9 +515,9 @@ static void owl_uart_port_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&port->lock);
|
||||
locked = uart_port_trylock(port);
|
||||
else {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -541,7 +541,7 @@ static void owl_uart_port_write(struct uart_port *port, const char *s,
|
||||
owl_uart_write(port, old_ctl, OWL_UART_CTL);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
@@ -1347,7 +1347,7 @@ static void pch_uart_set_termios(struct uart_port *port,
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
rtn = pch_uart_hal_set_line(priv, baud, parity, bits, stb);
|
||||
@@ -1360,7 +1360,7 @@ static void pch_uart_set_termios(struct uart_port *port,
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
out:
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
@@ -1581,10 +1581,10 @@ pch_console_write(struct console *co, const char *s, unsigned int count)
|
||||
port_locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
priv_locked = spin_trylock(&priv->lock);
|
||||
port_locked = spin_trylock(&priv->port.lock);
|
||||
port_locked = uart_port_trylock(&priv->port);
|
||||
} else {
|
||||
spin_lock(&priv->lock);
|
||||
spin_lock(&priv->port.lock);
|
||||
uart_port_lock(&priv->port);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1604,7 +1604,7 @@ pch_console_write(struct console *co, const char *s, unsigned int count)
|
||||
iowrite8(ier, priv->membase + UART_IER);
|
||||
|
||||
if (port_locked)
|
||||
spin_unlock(&priv->port.lock);
|
||||
uart_port_unlock(&priv->port);
|
||||
if (priv_locked)
|
||||
spin_unlock(&priv->lock);
|
||||
local_irq_restore(flags);
|
||||
|
||||
@@ -243,7 +243,7 @@ static void pic32_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
struct pic32_sport *sport = to_pic32_sport(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
if (ctl)
|
||||
pic32_uart_writel(sport, PIC32_SET(PIC32_UART_STA),
|
||||
@@ -252,7 +252,7 @@ static void pic32_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
pic32_uart_writel(sport, PIC32_CLR(PIC32_UART_STA),
|
||||
PIC32_UART_STA_UTXBRK);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* get port type in string format */
|
||||
@@ -274,7 +274,7 @@ static void pic32_uart_do_rx(struct uart_port *port)
|
||||
*/
|
||||
max_count = PIC32_UART_RX_FIFO_DEPTH;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
tty = &port->state->port;
|
||||
|
||||
@@ -331,7 +331,7 @@ static void pic32_uart_do_rx(struct uart_port *port)
|
||||
|
||||
} while (--max_count);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
}
|
||||
@@ -410,9 +410,9 @@ static irqreturn_t pic32_uart_tx_interrupt(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
pic32_uart_do_tx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -580,9 +580,9 @@ static void pic32_uart_shutdown(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
|
||||
/* disable uart */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
pic32_uart_dsbl_and_mask(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
clk_disable_unprepare(sport->clk);
|
||||
|
||||
/* free all 3 interrupts for this UART */
|
||||
@@ -604,7 +604,7 @@ static void pic32_uart_set_termios(struct uart_port *port,
|
||||
unsigned int quot;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* disable uart and mask all interrupts while changing speed */
|
||||
pic32_uart_dsbl_and_mask(port);
|
||||
@@ -672,7 +672,7 @@ static void pic32_uart_set_termios(struct uart_port *port,
|
||||
/* enable uart */
|
||||
pic32_uart_en_and_unmask(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* serial core request to claim uart iomem */
|
||||
|
||||
@@ -246,9 +246,9 @@ static bool pmz_receive_chars(struct uart_pmac_port *uap)
|
||||
#endif /* USE_CTRL_O_SYSRQ */
|
||||
if (uap->port.sysrq) {
|
||||
int swallow;
|
||||
spin_unlock(&uap->port.lock);
|
||||
uart_port_unlock(&uap->port);
|
||||
swallow = uart_handle_sysrq_char(&uap->port, ch);
|
||||
spin_lock(&uap->port.lock);
|
||||
uart_port_lock(&uap->port);
|
||||
if (swallow)
|
||||
goto next_char;
|
||||
}
|
||||
@@ -435,7 +435,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
uap_a = pmz_get_port_A(uap);
|
||||
uap_b = uap_a->mate;
|
||||
|
||||
spin_lock(&uap_a->port.lock);
|
||||
uart_port_lock(&uap_a->port);
|
||||
r3 = read_zsreg(uap_a, R3);
|
||||
|
||||
/* Channel A */
|
||||
@@ -456,14 +456,14 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
rc = IRQ_HANDLED;
|
||||
}
|
||||
skip_a:
|
||||
spin_unlock(&uap_a->port.lock);
|
||||
uart_port_unlock(&uap_a->port);
|
||||
if (push)
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
|
||||
if (!uap_b)
|
||||
goto out;
|
||||
|
||||
spin_lock(&uap_b->port.lock);
|
||||
uart_port_lock(&uap_b->port);
|
||||
push = false;
|
||||
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
|
||||
if (!ZS_IS_OPEN(uap_b)) {
|
||||
@@ -481,7 +481,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
|
||||
rc = IRQ_HANDLED;
|
||||
}
|
||||
skip_b:
|
||||
spin_unlock(&uap_b->port.lock);
|
||||
uart_port_unlock(&uap_b->port);
|
||||
if (push)
|
||||
tty_flip_buffer_push(&uap->port.state->port);
|
||||
|
||||
@@ -497,9 +497,9 @@ static inline u8 pmz_peek_status(struct uart_pmac_port *uap)
|
||||
unsigned long flags;
|
||||
u8 status;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
status = read_zsreg(uap, R0);
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -685,7 +685,7 @@ static void pmz_break_ctl(struct uart_port *port, int break_state)
|
||||
else
|
||||
clear_bits |= SND_BRK;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
new_reg = (uap->curregs[R5] | set_bits) & ~clear_bits;
|
||||
if (new_reg != uap->curregs[R5]) {
|
||||
@@ -693,7 +693,7 @@ static void pmz_break_ctl(struct uart_port *port, int break_state)
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
@@ -865,18 +865,18 @@ static void pmz_irda_reset(struct uart_pmac_port *uap)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
uap->curregs[R5] |= DTR;
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
zssync(uap);
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
msleep(110);
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
uap->curregs[R5] &= ~DTR;
|
||||
write_zsreg(uap, R5, uap->curregs[R5]);
|
||||
zssync(uap);
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
@@ -896,9 +896,9 @@ static int pmz_startup(struct uart_port *port)
|
||||
* initialize the chip
|
||||
*/
|
||||
if (!ZS_IS_CONS(uap)) {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
pwr_delay = __pmz_startup(uap);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
sprintf(uap->irq_name, PMACZILOG_NAME"%d", uap->port.line);
|
||||
if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED,
|
||||
@@ -921,9 +921,9 @@ static int pmz_startup(struct uart_port *port)
|
||||
pmz_irda_reset(uap);
|
||||
|
||||
/* Enable interrupt requests for the channel */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
pmz_interrupt_control(uap, 1);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -933,7 +933,7 @@ static void pmz_shutdown(struct uart_port *port)
|
||||
struct uart_pmac_port *uap = to_pmz(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable interrupt requests for the channel */
|
||||
pmz_interrupt_control(uap, 0);
|
||||
@@ -948,19 +948,19 @@ static void pmz_shutdown(struct uart_port *port)
|
||||
pmz_maybe_update_regs(uap);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Release interrupt handler */
|
||||
free_irq(uap->port.irq, uap);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uap->flags &= ~PMACZILOG_FLAG_IS_OPEN;
|
||||
|
||||
if (!ZS_IS_CONS(uap))
|
||||
pmz_set_scc_power(uap, 0); /* Shut the chip down */
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Shared by TTY driver and serial console setup. The port lock is held
|
||||
@@ -1247,7 +1247,7 @@ static void pmz_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct uart_pmac_port *uap = to_pmz(port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable IRQs on the port */
|
||||
pmz_interrupt_control(uap, 0);
|
||||
@@ -1259,7 +1259,7 @@ static void pmz_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (ZS_IS_OPEN(uap))
|
||||
pmz_interrupt_control(uap, 1);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *pmz_type(struct uart_port *port)
|
||||
@@ -1896,7 +1896,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c
|
||||
struct uart_pmac_port *uap = &pmz_ports[con->index];
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&uap->port.lock, flags);
|
||||
uart_port_lock_irqsave(&uap->port, &flags);
|
||||
|
||||
/* Turn of interrupts and enable the transmitter. */
|
||||
write_zsreg(uap, R1, uap->curregs[1] & ~TxINT_ENAB);
|
||||
@@ -1908,7 +1908,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c
|
||||
write_zsreg(uap, R1, uap->curregs[1]);
|
||||
/* Don't disable the transmitter. */
|
||||
|
||||
spin_unlock_irqrestore(&uap->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&uap->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+15
-15
@@ -225,14 +225,14 @@ static inline irqreturn_t serial_pxa_irq(int irq, void *dev_id)
|
||||
iir = serial_in(up, UART_IIR);
|
||||
if (iir & UART_IIR_NO_INT)
|
||||
return IRQ_NONE;
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
lsr = serial_in(up, UART_LSR);
|
||||
if (lsr & UART_LSR_DR)
|
||||
receive_chars(up, &lsr);
|
||||
check_modem_status(up);
|
||||
if (lsr & UART_LSR_THRE)
|
||||
transmit_chars(up);
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -242,9 +242,9 @@ static unsigned int serial_pxa_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -295,13 +295,13 @@ static void serial_pxa_break_ctl(struct uart_port *port, int break_state)
|
||||
struct uart_pxa_port *up = (struct uart_pxa_port *)port;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_out(up, UART_LCR, up->lcr);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int serial_pxa_startup(struct uart_port *port)
|
||||
@@ -346,10 +346,10 @@ static int serial_pxa_startup(struct uart_port *port)
|
||||
*/
|
||||
serial_out(up, UART_LCR, UART_LCR_WLEN8);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->port.mctrl |= TIOCM_OUT2;
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Finally, enable interrupts. Note: Modem status interrupts
|
||||
@@ -383,10 +383,10 @@ static void serial_pxa_shutdown(struct uart_port *port)
|
||||
up->ier = 0;
|
||||
serial_out(up, UART_IER, 0);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->port.mctrl &= ~TIOCM_OUT2;
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -434,7 +434,7 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Ensure the port will be enabled.
|
||||
@@ -504,7 +504,7 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
up->lcr = cval; /* Save LCR */
|
||||
serial_pxa_set_mctrl(&up->port, up->port.mctrl);
|
||||
serial_out(up, UART_FCR, fcr);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -608,9 +608,9 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&up->port.lock);
|
||||
locked = uart_port_trylock(&up->port);
|
||||
else
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -628,7 +628,7 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
|
||||
serial_out(up, UART_IER, ier);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
local_irq_restore(flags);
|
||||
clk_disable(up->clk);
|
||||
|
||||
|
||||
@@ -482,9 +482,9 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s,
|
||||
|
||||
uport = &port->uport;
|
||||
if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&uport->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(uport, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&uport->lock, flags);
|
||||
uart_port_lock_irqsave(uport, &flags);
|
||||
|
||||
geni_status = readl(uport->membase + SE_GENI_STATUS);
|
||||
|
||||
@@ -520,7 +520,7 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s,
|
||||
qcom_geni_serial_setup_tx(uport, port->tx_remaining);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&uport->lock, flags);
|
||||
uart_port_unlock_irqrestore(uport, flags);
|
||||
}
|
||||
|
||||
static void handle_rx_console(struct uart_port *uport, u32 bytes, bool drop)
|
||||
@@ -970,7 +970,7 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev)
|
||||
if (uport->suspended)
|
||||
return IRQ_NONE;
|
||||
|
||||
spin_lock(&uport->lock);
|
||||
uart_port_lock(uport);
|
||||
|
||||
m_irq_status = readl(uport->membase + SE_GENI_M_IRQ_STATUS);
|
||||
s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS);
|
||||
|
||||
@@ -139,12 +139,12 @@ static unsigned int rda_uart_tx_empty(struct uart_port *port)
|
||||
unsigned int ret;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = rda_uart_read(port, RDA_UART_STATUS);
|
||||
ret = (val & RDA_UART_TX_FIFO_MASK) ? TIOCSER_TEMT : 0;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -246,7 +246,7 @@ static void rda_uart_set_termios(struct uart_port *port,
|
||||
unsigned int baud;
|
||||
u32 irq_mask;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 9600, port->uartclk / 4);
|
||||
rda_uart_change_baudrate(rda_port, baud);
|
||||
@@ -325,7 +325,7 @@ static void rda_uart_set_termios(struct uart_port *port,
|
||||
/* update the per-port timeout */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void rda_uart_send_chars(struct uart_port *port)
|
||||
@@ -408,7 +408,7 @@ static irqreturn_t rda_interrupt(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
u32 val, irq_mask;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Clear IRQ cause */
|
||||
val = rda_uart_read(port, RDA_UART_IRQ_CAUSE);
|
||||
@@ -425,7 +425,7 @@ static irqreturn_t rda_interrupt(int irq, void *dev_id)
|
||||
rda_uart_send_chars(port);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -436,16 +436,16 @@ static int rda_uart_startup(struct uart_port *port)
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
rda_uart_write(port, 0, RDA_UART_IRQ_MASK);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = request_irq(port->irq, rda_interrupt, IRQF_NO_SUSPEND,
|
||||
"rda-uart", port);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
val = rda_uart_read(port, RDA_UART_CTRL);
|
||||
val |= RDA_UART_ENABLE;
|
||||
@@ -456,7 +456,7 @@ static int rda_uart_startup(struct uart_port *port)
|
||||
val |= (RDA_UART_RX_DATA_AVAILABLE | RDA_UART_RX_TIMEOUT);
|
||||
rda_uart_write(port, val, RDA_UART_IRQ_MASK);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -466,7 +466,7 @@ static void rda_uart_shutdown(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
rda_uart_stop_tx(port);
|
||||
rda_uart_stop_rx(port);
|
||||
@@ -475,7 +475,7 @@ static void rda_uart_shutdown(struct uart_port *port)
|
||||
val &= ~RDA_UART_ENABLE;
|
||||
rda_uart_write(port, val, RDA_UART_CTRL);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *rda_uart_type(struct uart_port *port)
|
||||
@@ -515,7 +515,7 @@ static void rda_uart_config_port(struct uart_port *port, int flags)
|
||||
rda_uart_request_port(port);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, irq_flags);
|
||||
uart_port_lock_irqsave(port, &irq_flags);
|
||||
|
||||
/* Clear mask, so no surprise interrupts. */
|
||||
rda_uart_write(port, 0, RDA_UART_IRQ_MASK);
|
||||
@@ -523,7 +523,7 @@ static void rda_uart_config_port(struct uart_port *port, int flags)
|
||||
/* Clear status register */
|
||||
rda_uart_write(port, 0, RDA_UART_STATUS);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, irq_flags);
|
||||
uart_port_unlock_irqrestore(port, irq_flags);
|
||||
}
|
||||
|
||||
static void rda_uart_release_port(struct uart_port *port)
|
||||
@@ -597,9 +597,9 @@ static void rda_uart_port_write(struct uart_port *port, const char *s,
|
||||
if (port->sysrq) {
|
||||
locked = 0;
|
||||
} else if (oops_in_progress) {
|
||||
locked = spin_trylock(&port->lock);
|
||||
locked = uart_port_trylock(port);
|
||||
} else {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
@@ -615,7 +615,7 @@ static void rda_uart_port_write(struct uart_port *port, const char *s,
|
||||
rda_uart_write(port, old_irq_mask, RDA_UART_IRQ_MASK);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
+10
-10
@@ -276,9 +276,9 @@ static unsigned int rp2_uart_tx_empty(struct uart_port *port)
|
||||
* But the TXEMPTY bit doesn't seem to work unless the TX IRQ is
|
||||
* enabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
tx_fifo_bytes = readw(up->base + RP2_TX_FIFO_COUNT);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return tx_fifo_bytes ? 0 : TIOCSER_TEMT;
|
||||
}
|
||||
@@ -323,10 +323,10 @@ static void rp2_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
rp2_rmw(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_BREAK_m,
|
||||
break_state ? RP2_TXRX_CTL_BREAK_m : 0);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void rp2_uart_enable_ms(struct uart_port *port)
|
||||
@@ -383,7 +383,7 @@ static void rp2_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
if (tty_termios_baud_rate(new))
|
||||
tty_termios_encode_baud_rate(new, baud, baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* ignore all characters if CREAD is not set */
|
||||
port->ignore_status_mask = (new->c_cflag & CREAD) ? 0 : RP2_DUMMY_READ;
|
||||
@@ -391,7 +391,7 @@ static void rp2_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
__rp2_uart_set_termios(up, new->c_cflag, new->c_iflag, baud_div);
|
||||
uart_update_timeout(port, new->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void rp2_rx_chars(struct rp2_uart_port *up)
|
||||
@@ -440,7 +440,7 @@ static void rp2_ch_interrupt(struct rp2_uart_port *up)
|
||||
{
|
||||
u32 status;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
|
||||
/*
|
||||
* The IRQ status bits are clear-on-write. Other status bits in
|
||||
@@ -456,7 +456,7 @@ static void rp2_ch_interrupt(struct rp2_uart_port *up)
|
||||
if (status & RP2_CHAN_STAT_MS_CHANGED_MASK)
|
||||
wake_up_interruptible(&up->port.state->port.delta_msr_wait);
|
||||
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
}
|
||||
|
||||
static int rp2_asic_interrupt(struct rp2_card *card, unsigned int asic_id)
|
||||
@@ -516,10 +516,10 @@ static void rp2_uart_shutdown(struct uart_port *port)
|
||||
|
||||
rp2_uart_break_ctl(port, 0);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
rp2_mask_ch_irq(up, up->idx, 0);
|
||||
rp2_rmw(up, RP2_CHAN_STAT, 0, 0);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *rp2_uart_type(struct uart_port *port)
|
||||
|
||||
+10
-10
@@ -115,9 +115,9 @@ static void sa1100_timeout(struct timer_list *t)
|
||||
unsigned long flags;
|
||||
|
||||
if (sport->port.state) {
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
sa1100_mctrl_check(sport);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
|
||||
mod_timer(&sport->timer, jiffies + MCTRL_TIMEOUT);
|
||||
}
|
||||
@@ -247,7 +247,7 @@ static irqreturn_t sa1100_int(int irq, void *dev_id)
|
||||
struct sa1100_port *sport = dev_id;
|
||||
unsigned int status, pass_counter = 0;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
uart_port_lock(&sport->port);
|
||||
status = UART_GET_UTSR0(sport);
|
||||
status &= SM_TO_UTSR0(sport->port.read_status_mask) | ~UTSR0_TFS;
|
||||
do {
|
||||
@@ -276,7 +276,7 @@ static irqreturn_t sa1100_int(int irq, void *dev_id)
|
||||
status &= SM_TO_UTSR0(sport->port.read_status_mask) |
|
||||
~UTSR0_TFS;
|
||||
} while (status & (UTSR0_TFS | UTSR0_RFS | UTSR0_RID));
|
||||
spin_unlock(&sport->port.lock);
|
||||
uart_port_unlock(&sport->port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -321,14 +321,14 @@ static void sa1100_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned int utcr3;
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
utcr3 = UART_GET_UTCR3(sport);
|
||||
if (break_state == -1)
|
||||
utcr3 |= UTCR3_BRK;
|
||||
else
|
||||
utcr3 &= ~UTCR3_BRK;
|
||||
UART_PUT_UTCR3(sport, utcr3);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static int sa1100_startup(struct uart_port *port)
|
||||
@@ -354,9 +354,9 @@ static int sa1100_startup(struct uart_port *port)
|
||||
/*
|
||||
* Enable modem status interrupts
|
||||
*/
|
||||
spin_lock_irq(&sport->port.lock);
|
||||
uart_port_lock_irq(&sport->port);
|
||||
sa1100_enable_ms(&sport->port);
|
||||
spin_unlock_irq(&sport->port.lock);
|
||||
uart_port_unlock_irq(&sport->port);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -423,7 +423,7 @@ sa1100_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
del_timer_sync(&sport->timer);
|
||||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
uart_port_lock_irqsave(&sport->port, &flags);
|
||||
|
||||
sport->port.read_status_mask &= UTSR0_TO_SM(UTSR0_TFS);
|
||||
sport->port.read_status_mask |= UTSR1_TO_SM(UTSR1_ROR);
|
||||
@@ -485,7 +485,7 @@ sa1100_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
if (UART_ENABLE_MS(&sport->port, termios->c_cflag))
|
||||
sa1100_enable_ms(&sport->port);
|
||||
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&sport->port, flags);
|
||||
}
|
||||
|
||||
static const char *sa1100_type(struct uart_port *port)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -610,7 +610,7 @@ static void sbd_set_termios(struct uart_port *uport, struct ktermios *termios,
|
||||
else
|
||||
aux &= ~M_DUART_CTS_CHNG_ENA;
|
||||
|
||||
spin_lock(&uport->lock);
|
||||
uart_port_lock(uport);
|
||||
|
||||
if (sport->tx_stopped)
|
||||
command |= M_DUART_TX_DIS;
|
||||
@@ -632,7 +632,7 @@ static void sbd_set_termios(struct uart_port *uport, struct ktermios *termios,
|
||||
|
||||
write_sbdchn(sport, R_DUART_CMD, command);
|
||||
|
||||
spin_unlock(&uport->lock);
|
||||
uart_port_unlock(uport);
|
||||
}
|
||||
|
||||
|
||||
@@ -839,22 +839,22 @@ static void sbd_console_write(struct console *co, const char *s,
|
||||
unsigned int mask;
|
||||
|
||||
/* Disable transmit interrupts and enable the transmitter. */
|
||||
spin_lock_irqsave(&uport->lock, flags);
|
||||
uart_port_lock_irqsave(uport, &flags);
|
||||
mask = read_sbdshr(sport, R_DUART_IMRREG((uport->line) % 2));
|
||||
write_sbdshr(sport, R_DUART_IMRREG((uport->line) % 2),
|
||||
mask & ~M_DUART_IMR_TX);
|
||||
write_sbdchn(sport, R_DUART_CMD, M_DUART_TX_EN);
|
||||
spin_unlock_irqrestore(&uport->lock, flags);
|
||||
uart_port_unlock_irqrestore(uport, flags);
|
||||
|
||||
uart_console_write(&sport->port, s, count, sbd_console_putchar);
|
||||
|
||||
/* Restore transmit interrupts and the transmitter enable. */
|
||||
spin_lock_irqsave(&uport->lock, flags);
|
||||
uart_port_lock_irqsave(uport, &flags);
|
||||
sbd_line_drain(sport);
|
||||
if (sport->tx_stopped)
|
||||
write_sbdchn(sport, R_DUART_CMD, M_DUART_TX_DIS);
|
||||
write_sbdshr(sport, R_DUART_IMRREG((uport->line) % 2), mask);
|
||||
spin_unlock_irqrestore(&uport->lock, flags);
|
||||
uart_port_unlock_irqrestore(uport, flags);
|
||||
}
|
||||
|
||||
static int __init sbd_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -667,9 +667,9 @@ static void sc16is7xx_handle_tx(struct uart_port *port)
|
||||
}
|
||||
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sc16is7xx_stop_tx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -695,13 +695,13 @@ static void sc16is7xx_handle_tx(struct uart_port *port)
|
||||
sc16is7xx_fifo_write(port, to_send);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
if (uart_circ_empty(xmit))
|
||||
sc16is7xx_stop_tx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static unsigned int sc16is7xx_get_hwmctrl(struct uart_port *port)
|
||||
@@ -733,7 +733,7 @@ static void sc16is7xx_update_mlines(struct sc16is7xx_one *one)
|
||||
|
||||
one->old_mctrl = status;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if ((changed & TIOCM_RNG) && (status & TIOCM_RNG))
|
||||
port->icount.rng++;
|
||||
if (changed & TIOCM_DSR)
|
||||
@@ -744,7 +744,7 @@ static void sc16is7xx_update_mlines(struct sc16is7xx_one *one)
|
||||
uart_handle_cts_change(port, status & TIOCM_CTS);
|
||||
|
||||
wake_up_interruptible(&port->state->port.delta_msr_wait);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static bool sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno)
|
||||
@@ -823,9 +823,9 @@ static void sc16is7xx_tx_proc(struct kthread_work *ws)
|
||||
sc16is7xx_handle_tx(port);
|
||||
mutex_unlock(&s->efr_lock);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sc16is7xx_ier_set(port, SC16IS7XX_IER_THRI_BIT);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void sc16is7xx_reconf_rs485(struct uart_port *port)
|
||||
@@ -836,14 +836,14 @@ static void sc16is7xx_reconf_rs485(struct uart_port *port)
|
||||
struct serial_rs485 *rs485 = &port->rs485;
|
||||
unsigned long irqflags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, irqflags);
|
||||
uart_port_lock_irqsave(port, &irqflags);
|
||||
if (rs485->flags & SER_RS485_ENABLED) {
|
||||
efcr |= SC16IS7XX_EFCR_AUTO_RS485_BIT;
|
||||
|
||||
if (rs485->flags & SER_RS485_RTS_AFTER_SEND)
|
||||
efcr |= SC16IS7XX_EFCR_RTS_INVERT_BIT;
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, irqflags);
|
||||
uart_port_unlock_irqrestore(port, irqflags);
|
||||
|
||||
sc16is7xx_port_update(port, SC16IS7XX_EFCR_REG, mask, efcr);
|
||||
}
|
||||
@@ -854,10 +854,10 @@ static void sc16is7xx_reg_proc(struct kthread_work *ws)
|
||||
struct sc16is7xx_one_config config;
|
||||
unsigned long irqflags;
|
||||
|
||||
spin_lock_irqsave(&one->port.lock, irqflags);
|
||||
uart_port_lock_irqsave(&one->port, &irqflags);
|
||||
config = one->config;
|
||||
memset(&one->config, 0, sizeof(one->config));
|
||||
spin_unlock_irqrestore(&one->port.lock, irqflags);
|
||||
uart_port_unlock_irqrestore(&one->port, irqflags);
|
||||
|
||||
if (config.flags & SC16IS7XX_RECONF_MD) {
|
||||
u8 mcr = 0;
|
||||
@@ -963,18 +963,18 @@ static void sc16is7xx_throttle(struct uart_port *port)
|
||||
* value set in MCR register. Stop reading data from RX FIFO so the
|
||||
* AutoRTS feature will de-activate RTS output.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sc16is7xx_ier_clear(port, SC16IS7XX_IER_RDI_BIT);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void sc16is7xx_unthrottle(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sc16is7xx_ier_set(port, SC16IS7XX_IER_RDI_BIT);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static unsigned int sc16is7xx_tx_empty(struct uart_port *port)
|
||||
@@ -1113,7 +1113,7 @@ static void sc16is7xx_set_termios(struct uart_port *port,
|
||||
/* Setup baudrate generator */
|
||||
baud = sc16is7xx_set_baud(port, baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Update timeout according to new baud rate */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
@@ -1121,7 +1121,7 @@ static void sc16is7xx_set_termios(struct uart_port *port,
|
||||
if (UART_ENABLE_MS(port, termios->c_cflag))
|
||||
sc16is7xx_enable_ms(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int sc16is7xx_config_rs485(struct uart_port *port, struct ktermios *termios,
|
||||
@@ -1208,9 +1208,9 @@ static int sc16is7xx_startup(struct uart_port *port)
|
||||
sc16is7xx_port_write(port, SC16IS7XX_IER_REG, val);
|
||||
|
||||
/* Enable modem status polling */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sc16is7xx_enable_ms(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -411,7 +411,7 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
|
||||
divisor = DIV_ROUND_CLOSEST(rate, baud * 16);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&tup->uport.lock, flags);
|
||||
uart_port_lock_irqsave(&tup->uport, &flags);
|
||||
lcr = tup->lcr_shadow;
|
||||
lcr |= UART_LCR_DLAB;
|
||||
tegra_uart_write(tup, lcr, UART_LCR);
|
||||
@@ -424,7 +424,7 @@ static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
|
||||
|
||||
/* Dummy read to ensure the write is posted */
|
||||
tegra_uart_read(tup, UART_SCR);
|
||||
spin_unlock_irqrestore(&tup->uport.lock, flags);
|
||||
uart_port_unlock_irqrestore(&tup->uport, flags);
|
||||
|
||||
tup->current_baud = baud;
|
||||
|
||||
@@ -522,13 +522,13 @@ static void tegra_uart_tx_dma_complete(void *args)
|
||||
dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
|
||||
count = tup->tx_bytes_requested - state.residue;
|
||||
async_tx_ack(tup->tx_dma_desc);
|
||||
spin_lock_irqsave(&tup->uport.lock, flags);
|
||||
uart_port_lock_irqsave(&tup->uport, &flags);
|
||||
uart_xmit_advance(&tup->uport, count);
|
||||
tup->tx_in_progress = 0;
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(&tup->uport);
|
||||
tegra_uart_start_next_tx(tup);
|
||||
spin_unlock_irqrestore(&tup->uport.lock, flags);
|
||||
uart_port_unlock_irqrestore(&tup->uport, flags);
|
||||
}
|
||||
|
||||
static int tegra_uart_start_tx_dma(struct tegra_uart_port *tup,
|
||||
@@ -598,13 +598,13 @@ static unsigned int tegra_uart_tx_empty(struct uart_port *u)
|
||||
unsigned int ret = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&u->lock, flags);
|
||||
uart_port_lock_irqsave(u, &flags);
|
||||
if (!tup->tx_in_progress) {
|
||||
unsigned long lsr = tegra_uart_read(tup, UART_LSR);
|
||||
if ((lsr & TX_EMPTY_STATUS) == TX_EMPTY_STATUS)
|
||||
ret = TIOCSER_TEMT;
|
||||
}
|
||||
spin_unlock_irqrestore(&u->lock, flags);
|
||||
uart_port_unlock_irqrestore(u, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -727,7 +727,7 @@ static void tegra_uart_rx_dma_complete(void *args)
|
||||
struct dma_tx_state state;
|
||||
enum dma_status status;
|
||||
|
||||
spin_lock_irqsave(&u->lock, flags);
|
||||
uart_port_lock_irqsave(u, &flags);
|
||||
|
||||
status = dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
|
||||
|
||||
@@ -749,7 +749,7 @@ static void tegra_uart_rx_dma_complete(void *args)
|
||||
set_rts(tup, true);
|
||||
|
||||
done:
|
||||
spin_unlock_irqrestore(&u->lock, flags);
|
||||
uart_port_unlock_irqrestore(u, flags);
|
||||
}
|
||||
|
||||
static void tegra_uart_terminate_rx_dma(struct tegra_uart_port *tup)
|
||||
@@ -836,7 +836,7 @@ static irqreturn_t tegra_uart_isr(int irq, void *data)
|
||||
bool is_rx_int = false;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&u->lock, flags);
|
||||
uart_port_lock_irqsave(u, &flags);
|
||||
while (1) {
|
||||
iir = tegra_uart_read(tup, UART_IIR);
|
||||
if (iir & UART_IIR_NO_INT) {
|
||||
@@ -852,7 +852,7 @@ static irqreturn_t tegra_uart_isr(int irq, void *data)
|
||||
} else if (is_rx_start) {
|
||||
tegra_uart_start_rx_dma(tup);
|
||||
}
|
||||
spin_unlock_irqrestore(&u->lock, flags);
|
||||
uart_port_unlock_irqrestore(u, flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -969,11 +969,11 @@ static void tegra_uart_hw_deinit(struct tegra_uart_port *tup)
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&tup->uport.lock, flags);
|
||||
uart_port_lock_irqsave(&tup->uport, &flags);
|
||||
/* Reset the Rx and Tx FIFOs */
|
||||
tegra_uart_fifo_reset(tup, UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);
|
||||
tup->current_baud = 0;
|
||||
spin_unlock_irqrestore(&tup->uport.lock, flags);
|
||||
uart_port_unlock_irqrestore(&tup->uport, flags);
|
||||
|
||||
tup->rx_in_progress = 0;
|
||||
tup->tx_in_progress = 0;
|
||||
@@ -1292,7 +1292,7 @@ static void tegra_uart_set_termios(struct uart_port *u,
|
||||
int ret;
|
||||
|
||||
max_divider *= 16;
|
||||
spin_lock_irqsave(&u->lock, flags);
|
||||
uart_port_lock_irqsave(u, &flags);
|
||||
|
||||
/* Changing configuration, it is safe to stop any rx now */
|
||||
if (tup->rts_active)
|
||||
@@ -1341,7 +1341,7 @@ static void tegra_uart_set_termios(struct uart_port *u,
|
||||
baud = uart_get_baud_rate(u, termios, oldtermios,
|
||||
parent_clk_rate/max_divider,
|
||||
parent_clk_rate/16);
|
||||
spin_unlock_irqrestore(&u->lock, flags);
|
||||
uart_port_unlock_irqrestore(u, flags);
|
||||
ret = tegra_set_baudrate(tup, baud);
|
||||
if (ret < 0) {
|
||||
dev_err(tup->uport.dev, "Failed to set baud rate\n");
|
||||
@@ -1349,7 +1349,7 @@ static void tegra_uart_set_termios(struct uart_port *u,
|
||||
}
|
||||
if (tty_termios_baud_rate(termios))
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
spin_lock_irqsave(&u->lock, flags);
|
||||
uart_port_lock_irqsave(u, &flags);
|
||||
|
||||
/* Flow control */
|
||||
if (termios->c_cflag & CRTSCTS) {
|
||||
@@ -1382,7 +1382,7 @@ static void tegra_uart_set_termios(struct uart_port *u,
|
||||
if (termios->c_iflag & IGNBRK)
|
||||
tup->uport.ignore_status_mask |= UART_LSR_BI;
|
||||
|
||||
spin_unlock_irqrestore(&u->lock, flags);
|
||||
uart_port_unlock_irqrestore(u, flags);
|
||||
}
|
||||
|
||||
static const char *tegra_uart_type(struct uart_port *u)
|
||||
|
||||
@@ -79,7 +79,7 @@ static inline void uart_port_deref(struct uart_port *uport)
|
||||
({ \
|
||||
struct uart_port *__uport = uart_port_ref(state); \
|
||||
if (__uport) \
|
||||
spin_lock_irqsave(&__uport->lock, flags); \
|
||||
uart_port_lock_irqsave(__uport, &flags); \
|
||||
__uport; \
|
||||
})
|
||||
|
||||
@@ -87,7 +87,7 @@ static inline void uart_port_deref(struct uart_port *uport)
|
||||
({ \
|
||||
struct uart_port *__uport = uport; \
|
||||
if (__uport) { \
|
||||
spin_unlock_irqrestore(&__uport->lock, flags); \
|
||||
uart_port_unlock_irqrestore(__uport, flags); \
|
||||
uart_port_deref(__uport); \
|
||||
} \
|
||||
})
|
||||
@@ -179,12 +179,12 @@ uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
|
||||
unsigned long flags;
|
||||
unsigned int old;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
old = port->mctrl;
|
||||
port->mctrl = (old & ~clear) | set;
|
||||
if (old != port->mctrl && !(port->rs485.flags & SER_RS485_ENABLED))
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
#define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0)
|
||||
@@ -219,7 +219,7 @@ static void uart_change_line_settings(struct tty_struct *tty, struct uart_state
|
||||
/*
|
||||
* Set modem status enables based on termios cflag
|
||||
*/
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
if (termios->c_cflag & CRTSCTS)
|
||||
uport->status |= UPSTAT_CTS_ENABLE;
|
||||
else
|
||||
@@ -240,7 +240,7 @@ static void uart_change_line_settings(struct tty_struct *tty, struct uart_state
|
||||
else
|
||||
__uart_start(state);
|
||||
}
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -702,11 +702,11 @@ static void uart_send_xchar(struct tty_struct *tty, char ch)
|
||||
if (port->ops->send_xchar)
|
||||
port->ops->send_xchar(port, ch);
|
||||
else {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
port->x_char = ch;
|
||||
if (ch)
|
||||
port->ops->start_tx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
uart_port_deref(port);
|
||||
}
|
||||
@@ -1085,9 +1085,9 @@ static int uart_tiocmget(struct tty_struct *tty)
|
||||
|
||||
if (!tty_io_error(tty)) {
|
||||
result = uport->mctrl;
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
result |= uport->ops->get_mctrl(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&port->mutex);
|
||||
@@ -1223,16 +1223,16 @@ static int uart_wait_modem_status(struct uart_state *state, unsigned long arg)
|
||||
uport = uart_port_ref(state);
|
||||
if (!uport)
|
||||
return -EIO;
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
|
||||
uart_enable_ms(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
|
||||
add_wait_queue(&port->delta_msr_wait, &wait);
|
||||
for (;;) {
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
@@ -1277,9 +1277,9 @@ static int uart_get_icount(struct tty_struct *tty,
|
||||
uport = uart_port_ref(state);
|
||||
if (!uport)
|
||||
return -EIO;
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
uart_port_deref(uport);
|
||||
|
||||
icount->cts = cnow.cts;
|
||||
@@ -1422,9 +1422,9 @@ static int uart_get_rs485_config(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
struct serial_rs485 aux;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
aux = port->rs485;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (copy_to_user(rs485, &aux, sizeof(aux)))
|
||||
return -EFAULT;
|
||||
@@ -1451,7 +1451,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port,
|
||||
uart_sanitize_serial_rs485(port, &rs485);
|
||||
uart_set_rs485_termination(port, &rs485);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ret = port->rs485_config(port, &tty->termios, &rs485);
|
||||
if (!ret) {
|
||||
port->rs485 = rs485;
|
||||
@@ -1460,7 +1460,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port,
|
||||
if (!(rs485.flags & SER_RS485_ENABLED))
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1479,9 +1479,9 @@ static int uart_get_iso7816_config(struct uart_port *port,
|
||||
if (!port->iso7816_config)
|
||||
return -ENOTTY;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
aux = port->iso7816;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (copy_to_user(iso7816, &aux, sizeof(aux)))
|
||||
return -EFAULT;
|
||||
@@ -1510,9 +1510,9 @@ static int uart_set_iso7816_config(struct uart_port *port,
|
||||
if (iso7816.reserved[i])
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ret = port->iso7816_config(port, &iso7816);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1729,9 +1729,9 @@ static void uart_tty_port_shutdown(struct tty_port *port)
|
||||
if (WARN(!uport, "detached port still initialized!\n"))
|
||||
return;
|
||||
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
uport->ops->stop_rx(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
|
||||
uart_port_shutdown(port);
|
||||
|
||||
@@ -1745,10 +1745,10 @@ static void uart_tty_port_shutdown(struct tty_port *port)
|
||||
/*
|
||||
* Free the transmit buffer.
|
||||
*/
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
buf = state->xmit.buf;
|
||||
state->xmit.buf = NULL;
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
|
||||
free_page((unsigned long)buf);
|
||||
|
||||
@@ -1891,10 +1891,10 @@ static bool uart_carrier_raised(struct tty_port *port)
|
||||
*/
|
||||
if (WARN_ON(!uport))
|
||||
return true;
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
uart_enable_ms(uport);
|
||||
mctrl = uport->ops->get_mctrl(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
uart_port_deref(uport);
|
||||
|
||||
return mctrl & TIOCM_CAR;
|
||||
@@ -2011,9 +2011,9 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
|
||||
pm_state = state->pm_state;
|
||||
if (pm_state != UART_PM_STATE_ON)
|
||||
uart_change_pm(state, UART_PM_STATE_ON);
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
status = uport->ops->get_mctrl(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
if (pm_state != UART_PM_STATE_ON)
|
||||
uart_change_pm(state, pm_state);
|
||||
|
||||
@@ -2352,9 +2352,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
|
||||
*/
|
||||
if (!console_suspend_enabled && uart_console(uport)) {
|
||||
if (uport->ops->start_rx) {
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
uport->ops->stop_rx(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
}
|
||||
goto unlock;
|
||||
}
|
||||
@@ -2369,7 +2369,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
|
||||
tty_port_set_suspended(port, true);
|
||||
tty_port_set_initialized(port, false);
|
||||
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
ops->stop_tx(uport);
|
||||
if (!(uport->rs485.flags & SER_RS485_ENABLED))
|
||||
ops->set_mctrl(uport, 0);
|
||||
@@ -2377,7 +2377,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
|
||||
mctrl = uport->mctrl;
|
||||
uport->mctrl = 0;
|
||||
ops->stop_rx(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
|
||||
/*
|
||||
* Wait for the transmitter to empty.
|
||||
@@ -2449,9 +2449,9 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
|
||||
uart_change_pm(state, UART_PM_STATE_ON);
|
||||
uport->ops->set_termios(uport, &termios, NULL);
|
||||
if (!console_suspend_enabled && uport->ops->start_rx) {
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
uport->ops->start_rx(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
}
|
||||
if (console_suspend_enabled)
|
||||
console_start(uport->cons);
|
||||
@@ -2462,10 +2462,10 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
|
||||
int ret;
|
||||
|
||||
uart_change_pm(state, UART_PM_STATE_ON);
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
if (!(uport->rs485.flags & SER_RS485_ENABLED))
|
||||
ops->set_mctrl(uport, 0);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
if (console_suspend_enabled || !uart_console(uport)) {
|
||||
/* Protected by port mutex for now */
|
||||
struct tty_struct *tty = port->tty;
|
||||
@@ -2474,13 +2474,13 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
|
||||
if (ret == 0) {
|
||||
if (tty)
|
||||
uart_change_line_settings(tty, state, NULL);
|
||||
spin_lock_irq(&uport->lock);
|
||||
uart_port_lock_irq(uport);
|
||||
if (!(uport->rs485.flags & SER_RS485_ENABLED))
|
||||
ops->set_mctrl(uport, uport->mctrl);
|
||||
else
|
||||
uart_rs485_config(uport);
|
||||
ops->start_tx(uport);
|
||||
spin_unlock_irq(&uport->lock);
|
||||
uart_port_unlock_irq(uport);
|
||||
tty_port_set_initialized(port, true);
|
||||
} else {
|
||||
/*
|
||||
@@ -2583,13 +2583,13 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
|
||||
* keep the DTR setting that is set in uart_set_options()
|
||||
* We probably don't need a spinlock around this, but
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
port->mctrl &= TIOCM_DTR;
|
||||
if (!(port->rs485.flags & SER_RS485_ENABLED))
|
||||
port->ops->set_mctrl(port, port->mctrl);
|
||||
else
|
||||
uart_rs485_config(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/*
|
||||
* If this driver supports console, and it hasn't been
|
||||
|
||||
@@ -184,7 +184,7 @@ static irqreturn_t mctrl_gpio_irq_handle(int irq, void *context)
|
||||
|
||||
mctrl_gpio_get(gpios, &mctrl);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
mctrl_diff = mctrl ^ gpios->mctrl_prev;
|
||||
gpios->mctrl_prev = mctrl;
|
||||
@@ -205,7 +205,7 @@ static irqreturn_t mctrl_gpio_irq_handle(int irq, void *context)
|
||||
wake_up_interruptible(&port->state->port.delta_msr_wait);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -35,10 +35,10 @@ static int serial_port_runtime_resume(struct device *dev)
|
||||
goto out;
|
||||
|
||||
/* Flush any pending TX for the port */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (__serial_port_busy(port))
|
||||
port->ops->start_tx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
out:
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
|
||||
@@ -335,13 +335,13 @@ static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id)
|
||||
unsigned int status;
|
||||
|
||||
while (1) {
|
||||
spin_lock(&up->lock);
|
||||
uart_port_lock(up);
|
||||
status = sio_in(up, TXX9_SIDISR);
|
||||
if (!(sio_in(up, TXX9_SIDICR) & TXX9_SIDICR_TIE))
|
||||
status &= ~TXX9_SIDISR_TDIS;
|
||||
if (!(status & (TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS |
|
||||
TXX9_SIDISR_TOUT))) {
|
||||
spin_unlock(&up->lock);
|
||||
uart_port_unlock(up);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -353,7 +353,7 @@ static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id)
|
||||
sio_mask(up, TXX9_SIDISR,
|
||||
TXX9_SIDISR_TDIS | TXX9_SIDISR_RDIS |
|
||||
TXX9_SIDISR_TOUT);
|
||||
spin_unlock(&up->lock);
|
||||
uart_port_unlock(up);
|
||||
|
||||
if (pass_counter++ > PASS_LIMIT)
|
||||
break;
|
||||
@@ -367,9 +367,9 @@ static unsigned int serial_txx9_tx_empty(struct uart_port *up)
|
||||
unsigned long flags;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&up->lock, flags);
|
||||
uart_port_lock_irqsave(up, &flags);
|
||||
ret = (sio_in(up, TXX9_SICISR) & TXX9_SICISR_TXALS) ? TIOCSER_TEMT : 0;
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
uart_port_unlock_irqrestore(up, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -399,12 +399,12 @@ static void serial_txx9_break_ctl(struct uart_port *up, int break_state)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->lock, flags);
|
||||
uart_port_lock_irqsave(up, &flags);
|
||||
if (break_state == -1)
|
||||
sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
|
||||
else
|
||||
sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_TBRK);
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
uart_port_unlock_irqrestore(up, flags);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SERIAL_TXX9_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
|
||||
@@ -517,9 +517,9 @@ static int serial_txx9_startup(struct uart_port *up)
|
||||
/*
|
||||
* Now, initialize the UART
|
||||
*/
|
||||
spin_lock_irqsave(&up->lock, flags);
|
||||
uart_port_lock_irqsave(up, &flags);
|
||||
serial_txx9_set_mctrl(up, up->mctrl);
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
uart_port_unlock_irqrestore(up, flags);
|
||||
|
||||
/* Enable RX/TX */
|
||||
sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_RSDE | TXX9_SIFLCR_TSDE);
|
||||
@@ -541,9 +541,9 @@ static void serial_txx9_shutdown(struct uart_port *up)
|
||||
*/
|
||||
sio_out(up, TXX9_SIDICR, 0); /* disable all intrs */
|
||||
|
||||
spin_lock_irqsave(&up->lock, flags);
|
||||
uart_port_lock_irqsave(up, &flags);
|
||||
serial_txx9_set_mctrl(up, up->mctrl);
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
uart_port_unlock_irqrestore(up, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition
|
||||
@@ -625,7 +625,7 @@ serial_txx9_set_termios(struct uart_port *up, struct ktermios *termios,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->lock, flags);
|
||||
uart_port_lock_irqsave(up, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -676,7 +676,7 @@ serial_txx9_set_termios(struct uart_port *up, struct ktermios *termios,
|
||||
sio_out(up, TXX9_SIFCR, fcr);
|
||||
|
||||
serial_txx9_set_mctrl(up, up->mctrl);
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
uart_port_unlock_irqrestore(up, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
+34
-34
@@ -1205,7 +1205,7 @@ static void sci_dma_tx_complete(void *arg)
|
||||
|
||||
dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_xmit_advance(port, s->tx_dma_len);
|
||||
|
||||
@@ -1229,7 +1229,7 @@ static void sci_dma_tx_complete(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Locking: called with port lock held */
|
||||
@@ -1320,7 +1320,7 @@ static void sci_dma_rx_complete(void *arg)
|
||||
dev_dbg(port->dev, "%s(%d) active cookie %d\n", __func__, port->line,
|
||||
s->active_rx);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
active = sci_dma_rx_find_active(s);
|
||||
if (active >= 0)
|
||||
@@ -1347,20 +1347,20 @@ static void sci_dma_rx_complete(void *arg)
|
||||
|
||||
dma_async_issue_pending(chan);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
dev_dbg(port->dev, "%s: cookie %d #%d, new active cookie %d\n",
|
||||
__func__, s->cookie_rx[active], active, s->active_rx);
|
||||
return;
|
||||
|
||||
fail:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
dev_warn(port->dev, "Failed submitting Rx DMA descriptor\n");
|
||||
/* Switch to PIO */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
dmaengine_terminate_async(chan);
|
||||
sci_dma_rx_chan_invalidate(s);
|
||||
sci_dma_rx_reenable_irq(s);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void sci_dma_tx_release(struct sci_port *s)
|
||||
@@ -1409,13 +1409,13 @@ static int sci_dma_rx_submit(struct sci_port *s, bool port_lock_held)
|
||||
fail:
|
||||
/* Switch to PIO */
|
||||
if (!port_lock_held)
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
if (i)
|
||||
dmaengine_terminate_async(chan);
|
||||
sci_dma_rx_chan_invalidate(s);
|
||||
sci_start_rx(port);
|
||||
if (!port_lock_held)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
@@ -1437,14 +1437,14 @@ static void sci_dma_tx_work_fn(struct work_struct *work)
|
||||
* transmit till the end, and then the rest. Take the port lock to get a
|
||||
* consistent xmit buffer state.
|
||||
*/
|
||||
spin_lock_irq(&port->lock);
|
||||
uart_port_lock_irq(port);
|
||||
head = xmit->head;
|
||||
tail = xmit->tail;
|
||||
buf = s->tx_dma_addr + tail;
|
||||
s->tx_dma_len = CIRC_CNT_TO_END(head, tail, UART_XMIT_SIZE);
|
||||
if (!s->tx_dma_len) {
|
||||
/* Transmit buffer has been flushed */
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1452,7 +1452,7 @@ static void sci_dma_tx_work_fn(struct work_struct *work)
|
||||
DMA_MEM_TO_DEV,
|
||||
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||
if (!desc) {
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
dev_warn(port->dev, "Failed preparing Tx DMA descriptor\n");
|
||||
goto switch_to_pio;
|
||||
}
|
||||
@@ -1464,12 +1464,12 @@ static void sci_dma_tx_work_fn(struct work_struct *work)
|
||||
desc->callback_param = s;
|
||||
s->cookie_tx = dmaengine_submit(desc);
|
||||
if (dma_submit_error(s->cookie_tx)) {
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n");
|
||||
goto switch_to_pio;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&port->lock);
|
||||
uart_port_unlock_irq(port);
|
||||
dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n",
|
||||
__func__, xmit->buf, tail, head, s->cookie_tx);
|
||||
|
||||
@@ -1477,10 +1477,10 @@ static void sci_dma_tx_work_fn(struct work_struct *work)
|
||||
return;
|
||||
|
||||
switch_to_pio:
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
s->chan_tx = NULL;
|
||||
sci_start_tx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1497,17 +1497,17 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t)
|
||||
|
||||
dev_dbg(port->dev, "DMA Rx timed out\n");
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
active = sci_dma_rx_find_active(s);
|
||||
if (active < 0) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
status = dmaengine_tx_status(s->chan_rx, s->active_rx, &state);
|
||||
if (status == DMA_COMPLETE) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
dev_dbg(port->dev, "Cookie %d #%d has already completed\n",
|
||||
s->active_rx, active);
|
||||
|
||||
@@ -1525,7 +1525,7 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t)
|
||||
*/
|
||||
status = dmaengine_tx_status(s->chan_rx, s->active_rx, &state);
|
||||
if (status == DMA_COMPLETE) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
dev_dbg(port->dev, "Transaction complete after DMA engine was stopped");
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -1546,7 +1546,7 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t)
|
||||
|
||||
sci_dma_rx_reenable_irq(s);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
@@ -1770,9 +1770,9 @@ static irqreturn_t sci_tx_interrupt(int irq, void *ptr)
|
||||
struct uart_port *port = ptr;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sci_transmit_chars(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1786,11 +1786,11 @@ static irqreturn_t sci_tx_end_interrupt(int irq, void *ptr)
|
||||
if (port->type != PORT_SCI)
|
||||
return sci_tx_interrupt(irq, ptr);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ctrl = serial_port_in(port, SCSCR);
|
||||
ctrl &= ~(SCSCR_TE | SCSCR_TEIE);
|
||||
serial_port_out(port, SCSCR, ctrl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -2187,7 +2187,7 @@ static void sci_break_ctl(struct uart_port *port, int break_state)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
scsptr = serial_port_in(port, SCSPTR);
|
||||
scscr = serial_port_in(port, SCSCR);
|
||||
|
||||
@@ -2201,7 +2201,7 @@ static void sci_break_ctl(struct uart_port *port, int break_state)
|
||||
|
||||
serial_port_out(port, SCSPTR, scsptr);
|
||||
serial_port_out(port, SCSCR, scscr);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int sci_startup(struct uart_port *port)
|
||||
@@ -2233,7 +2233,7 @@ static void sci_shutdown(struct uart_port *port)
|
||||
s->autorts = false;
|
||||
mctrl_gpio_disable_ms(to_sci_port(port)->gpios);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
sci_stop_rx(port);
|
||||
sci_stop_tx(port);
|
||||
/*
|
||||
@@ -2243,7 +2243,7 @@ static void sci_shutdown(struct uart_port *port)
|
||||
scr = serial_port_in(port, SCSCR);
|
||||
serial_port_out(port, SCSCR, scr &
|
||||
(SCSCR_CKE1 | SCSCR_CKE0 | s->hscif_tot));
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
#ifdef CONFIG_SERIAL_SH_SCI_DMA
|
||||
if (s->chan_rx_saved) {
|
||||
@@ -2545,7 +2545,7 @@ done:
|
||||
serial_port_out(port, SCCKS, sccks);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
sci_reset(port);
|
||||
|
||||
@@ -2667,7 +2667,7 @@ done:
|
||||
if ((termios->c_cflag & CREAD) != 0)
|
||||
sci_start_rx(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
sci_port_disable(s);
|
||||
|
||||
@@ -3052,9 +3052,9 @@ static void serial_console_write(struct console *co, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* first save SCSCR then disable interrupts, keep clock source */
|
||||
ctrl = serial_port_in(port, SCSCR);
|
||||
@@ -3074,7 +3074,7 @@ static void serial_console_write(struct console *co, const char *s,
|
||||
serial_port_out(port, SCSCR, ctrl);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int serial_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -521,11 +521,11 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id)
|
||||
struct sifive_serial_port *ssp = dev_id;
|
||||
u32 ip;
|
||||
|
||||
spin_lock(&ssp->port.lock);
|
||||
uart_port_lock(&ssp->port);
|
||||
|
||||
ip = __ssp_readl(ssp, SIFIVE_SERIAL_IP_OFFS);
|
||||
if (!ip) {
|
||||
spin_unlock(&ssp->port.lock);
|
||||
uart_port_unlock(&ssp->port);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
@@ -534,7 +534,7 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id)
|
||||
if (ip & SIFIVE_SERIAL_IP_TXWM_MASK)
|
||||
__ssp_transmit_chars(ssp);
|
||||
|
||||
spin_unlock(&ssp->port.lock);
|
||||
uart_port_unlock(&ssp->port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -653,7 +653,7 @@ static void sifive_serial_set_termios(struct uart_port *port,
|
||||
ssp->port.uartclk / 16);
|
||||
__ssp_update_baud_rate(ssp, rate);
|
||||
|
||||
spin_lock_irqsave(&ssp->port.lock, flags);
|
||||
uart_port_lock_irqsave(&ssp->port, &flags);
|
||||
|
||||
/* Update the per-port timeout */
|
||||
uart_update_timeout(port, termios->c_cflag, rate);
|
||||
@@ -670,7 +670,7 @@ static void sifive_serial_set_termios(struct uart_port *port,
|
||||
if (v != old_v)
|
||||
__ssp_writel(v, SIFIVE_SERIAL_RXCTRL_OFFS, ssp);
|
||||
|
||||
spin_unlock_irqrestore(&ssp->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&ssp->port, flags);
|
||||
}
|
||||
|
||||
static void sifive_serial_release_port(struct uart_port *port)
|
||||
@@ -795,9 +795,9 @@ static void sifive_serial_console_write(struct console *co, const char *s,
|
||||
if (ssp->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&ssp->port.lock);
|
||||
locked = uart_port_trylock(&ssp->port);
|
||||
else
|
||||
spin_lock(&ssp->port.lock);
|
||||
uart_port_lock(&ssp->port);
|
||||
|
||||
ier = __ssp_readl(ssp, SIFIVE_SERIAL_IE_OFFS);
|
||||
__ssp_writel(0, SIFIVE_SERIAL_IE_OFFS, ssp);
|
||||
@@ -807,7 +807,7 @@ static void sifive_serial_console_write(struct console *co, const char *s,
|
||||
__ssp_writel(ier, SIFIVE_SERIAL_IE_OFFS, ssp);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&ssp->port.lock);
|
||||
uart_port_unlock(&ssp->port);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -247,7 +247,7 @@ static void sprd_complete_tx_dma(void *data)
|
||||
struct circ_buf *xmit = &port->state->xmit;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
dma_unmap_single(port->dev, sp->tx_dma.phys_addr,
|
||||
sp->tx_dma.trans_len, DMA_TO_DEVICE);
|
||||
|
||||
@@ -260,7 +260,7 @@ static void sprd_complete_tx_dma(void *data)
|
||||
sprd_tx_dma_config(port))
|
||||
sp->tx_dma.trans_len = 0;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int sprd_uart_dma_submit(struct uart_port *port,
|
||||
@@ -429,13 +429,13 @@ static void sprd_complete_rx_dma(void *data)
|
||||
enum dma_status status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = dmaengine_tx_status(sp->rx_dma.chn,
|
||||
sp->rx_dma.cookie, &state);
|
||||
if (status != DMA_COMPLETE) {
|
||||
sprd_stop_rx(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -449,7 +449,7 @@ static void sprd_complete_rx_dma(void *data)
|
||||
if (sprd_start_dma_rx(port))
|
||||
sprd_stop_rx(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int sprd_start_dma_rx(struct uart_port *port)
|
||||
@@ -638,12 +638,12 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned int ims;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
ims = serial_in(port, SPRD_IMSR);
|
||||
|
||||
if (!ims) {
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
@@ -660,7 +660,7 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
|
||||
if (ims & SPRD_IMSR_TX_FIFO_EMPTY)
|
||||
sprd_tx(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -727,13 +727,13 @@ static int sprd_startup(struct uart_port *port)
|
||||
serial_out(port, SPRD_CTL1, fc);
|
||||
|
||||
/* enable interrupt */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ien = serial_in(port, SPRD_IEN);
|
||||
ien |= SPRD_IEN_BREAK_DETECT | SPRD_IEN_TIMEOUT;
|
||||
if (!sp->rx_dma.enable)
|
||||
ien |= SPRD_IEN_RX_FULL;
|
||||
serial_out(port, SPRD_IEN, ien);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -793,7 +793,7 @@ static void sprd_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
lcr |= SPRD_LCR_EVEN_PAR;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* update the per-port timeout */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
@@ -837,7 +837,7 @@ static void sprd_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
fc |= RX_TOUT_THLD_DEF | RX_HFC_THLD_DEF;
|
||||
serial_out(port, SPRD_CTL1, fc);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Don't rewrite B0 */
|
||||
if (tty_termios_baud_rate(termios))
|
||||
@@ -974,9 +974,9 @@ static void sprd_console_write(struct console *co, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_console_write(port, s, count, sprd_console_putchar);
|
||||
|
||||
@@ -984,7 +984,7 @@ static void sprd_console_write(struct console *co, const char *s,
|
||||
wait_for_xmitr(port);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int sprd_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -319,7 +319,7 @@ static irqreturn_t asc_interrupt(int irq, void *ptr)
|
||||
struct uart_port *port = ptr;
|
||||
u32 status;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
status = asc_in(port, ASC_STA);
|
||||
|
||||
@@ -334,7 +334,7 @@ static irqreturn_t asc_interrupt(int irq, void *ptr)
|
||||
asc_transmit_chars(port);
|
||||
}
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -452,10 +452,10 @@ static void asc_pm(struct uart_port *port, unsigned int state,
|
||||
* we can come to turning it off. Note this is not called with
|
||||
* the port spinlock held.
|
||||
*/
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ctl = asc_in(port, ASC_CTL) & ~ASC_CTL_RUN;
|
||||
asc_out(port, ASC_CTL, ctl);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
clk_disable_unprepare(ascport->clk);
|
||||
break;
|
||||
}
|
||||
@@ -480,7 +480,7 @@ static void asc_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
|
||||
cflag = termios->c_cflag;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* read control register */
|
||||
ctrl_val = asc_in(port, ASC_CTL);
|
||||
@@ -594,7 +594,7 @@ static void asc_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
/* write final value and enable port */
|
||||
asc_out(port, ASC_CTL, (ctrl_val | ASC_CTL_RUN));
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *asc_type(struct uart_port *port)
|
||||
@@ -849,9 +849,9 @@ static void asc_console_write(struct console *co, const char *s, unsigned count)
|
||||
if (port->sysrq)
|
||||
locked = 0; /* asc_interrupt has already claimed the lock */
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Disable interrupts so we don't get the IRQ line bouncing
|
||||
@@ -869,7 +869,7 @@ static void asc_console_write(struct console *co, const char *s, unsigned count)
|
||||
asc_out(port, ASC_INTEN, intenable);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int asc_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -537,7 +537,7 @@ static void stm32_usart_rx_dma_complete(void *arg)
|
||||
unsigned int size;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
size = stm32_usart_receive_chars(port, false);
|
||||
uart_unlock_and_check_sysrq_irqrestore(port, flags);
|
||||
if (size)
|
||||
@@ -643,9 +643,9 @@ static void stm32_usart_tx_dma_complete(void *arg)
|
||||
stm32_usart_tx_dma_terminate(stm32port);
|
||||
|
||||
/* Let's see if we have pending data to send */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
stm32_usart_transmit_chars(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void stm32_usart_tx_interrupt_enable(struct uart_port *port)
|
||||
@@ -889,7 +889,7 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr)
|
||||
if (!stm32_port->throttled) {
|
||||
if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_started(stm32_port)) ||
|
||||
((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_started(stm32_port))) {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
size = stm32_usart_receive_chars(port, false);
|
||||
uart_unlock_and_check_sysrq(port);
|
||||
if (size)
|
||||
@@ -898,14 +898,14 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr)
|
||||
}
|
||||
|
||||
if ((sr & USART_SR_TXE) && !(stm32_port->tx_ch)) {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
stm32_usart_transmit_chars(port);
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
}
|
||||
|
||||
/* Receiver timeout irq for DMA RX */
|
||||
if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) {
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
size = stm32_usart_receive_chars(port, false);
|
||||
uart_unlock_and_check_sysrq(port);
|
||||
if (size)
|
||||
@@ -993,7 +993,7 @@ static void stm32_usart_throttle(struct uart_port *port)
|
||||
const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/*
|
||||
* Pause DMA transfer, so the RX data gets queued into the FIFO.
|
||||
@@ -1006,7 +1006,7 @@ static void stm32_usart_throttle(struct uart_port *port)
|
||||
stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq);
|
||||
|
||||
stm32_port->throttled = true;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Unthrottle the remote, the input buffer can now accept data. */
|
||||
@@ -1016,7 +1016,7 @@ static void stm32_usart_unthrottle(struct uart_port *port)
|
||||
const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
stm32_usart_set_bits(port, ofs->cr1, stm32_port->cr1_irq);
|
||||
if (stm32_port->cr3_irq)
|
||||
stm32_usart_set_bits(port, ofs->cr3, stm32_port->cr3_irq);
|
||||
@@ -1030,7 +1030,7 @@ static void stm32_usart_unthrottle(struct uart_port *port)
|
||||
if (stm32_port->rx_ch)
|
||||
stm32_usart_rx_dma_start_or_resume(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Receive stop */
|
||||
@@ -1158,7 +1158,7 @@ static void stm32_usart_set_termios(struct uart_port *port,
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 8);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr,
|
||||
isr,
|
||||
@@ -1349,7 +1349,7 @@ static void stm32_usart_set_termios(struct uart_port *port,
|
||||
writel_relaxed(cr1, port->membase + ofs->cr1);
|
||||
|
||||
stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
/* Handle modem control interrupts */
|
||||
if (UART_ENABLE_MS(port, termios->c_cflag))
|
||||
@@ -1399,9 +1399,9 @@ static void stm32_usart_pm(struct uart_port *port, unsigned int state,
|
||||
pm_runtime_get_sync(port->dev);
|
||||
break;
|
||||
case UART_PM_STATE_OFF:
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
pm_runtime_put_sync(port->dev);
|
||||
break;
|
||||
}
|
||||
@@ -1884,9 +1884,9 @@ static void stm32_usart_console_write(struct console *co, const char *s,
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Save and disable interrupts, enable the transmitter */
|
||||
old_cr1 = readl_relaxed(port->membase + ofs->cr1);
|
||||
@@ -1900,7 +1900,7 @@ static void stm32_usart_console_write(struct console *co, const char *s,
|
||||
writel_relaxed(old_cr1, port->membase + ofs->cr1);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int stm32_usart_console_setup(struct console *co, char *options)
|
||||
@@ -2035,7 +2035,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port,
|
||||
* low-power mode.
|
||||
*/
|
||||
if (stm32_port->rx_ch) {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
/* Poll data from DMA RX buffer if any */
|
||||
if (!stm32_usart_rx_dma_pause(stm32_port))
|
||||
size += stm32_usart_receive_chars(port, true);
|
||||
|
||||
+14
-14
@@ -217,10 +217,10 @@ static irqreturn_t sunhv_interrupt(int irq, void *dev_id)
|
||||
struct tty_port *tport;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
tport = receive_chars(port);
|
||||
transmit_chars(port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (tport)
|
||||
tty_flip_buffer_push(tport);
|
||||
@@ -271,7 +271,7 @@ static void sunhv_send_xchar(struct uart_port *port, char ch)
|
||||
if (ch == __DISABLED_CHAR)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
while (limit-- > 0) {
|
||||
long status = sun4v_con_putchar(ch);
|
||||
@@ -280,7 +280,7 @@ static void sunhv_send_xchar(struct uart_port *port, char ch)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* port->lock held by caller. */
|
||||
@@ -295,7 +295,7 @@ static void sunhv_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
int limit = 10000;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
while (limit-- > 0) {
|
||||
long status = sun4v_con_putchar(CON_BREAK);
|
||||
@@ -304,7 +304,7 @@ static void sunhv_break_ctl(struct uart_port *port, int break_state)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -328,7 +328,7 @@ static void sunhv_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned int iflag, cflag;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
iflag = termios->c_iflag;
|
||||
cflag = termios->c_cflag;
|
||||
@@ -343,7 +343,7 @@ static void sunhv_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
uart_update_timeout(port, cflag,
|
||||
(port->uartclk / (16 * quot)));
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *sunhv_type(struct uart_port *port)
|
||||
@@ -437,9 +437,9 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign
|
||||
int locked = 1;
|
||||
|
||||
if (port->sysrq || oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
while (n > 0) {
|
||||
unsigned long ra = __pa(con_write_page);
|
||||
@@ -470,7 +470,7 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign
|
||||
}
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static inline void sunhv_console_putchar(struct uart_port *port, char c)
|
||||
@@ -492,9 +492,9 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig
|
||||
int i, locked = 1;
|
||||
|
||||
if (port->sysrq || oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
if (*s == '\n')
|
||||
@@ -503,7 +503,7 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig
|
||||
}
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static struct console sunhv_console = {
|
||||
|
||||
@@ -184,7 +184,7 @@ static void sunplus_break_ctl(struct uart_port *port, int ctl)
|
||||
unsigned long flags;
|
||||
unsigned int lcr;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
lcr = readl(port->membase + SUP_UART_LCR);
|
||||
|
||||
@@ -195,7 +195,7 @@ static void sunplus_break_ctl(struct uart_port *port, int ctl)
|
||||
|
||||
writel(lcr, port->membase + SUP_UART_LCR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void transmit_chars(struct uart_port *port)
|
||||
@@ -277,7 +277,7 @@ static irqreturn_t sunplus_uart_irq(int irq, void *args)
|
||||
struct uart_port *port = args;
|
||||
unsigned int isc;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
isc = readl(port->membase + SUP_UART_ISC);
|
||||
|
||||
@@ -287,7 +287,7 @@ static irqreturn_t sunplus_uart_irq(int irq, void *args)
|
||||
if (isc & SUP_UART_ISC_TX)
|
||||
transmit_chars(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -302,14 +302,14 @@ static int sunplus_startup(struct uart_port *port)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
/* isc define Bit[7:4] int setting, Bit[3:0] int status
|
||||
* isc register will clean Bit[3:0] int status after read
|
||||
* only do a write to Bit[7:4] int setting
|
||||
*/
|
||||
isc |= SUP_UART_ISC_RXM;
|
||||
writel(isc, port->membase + SUP_UART_ISC);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -318,13 +318,13 @@ static void sunplus_shutdown(struct uart_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
/* isc define Bit[7:4] int setting, Bit[3:0] int status
|
||||
* isc register will clean Bit[3:0] int status after read
|
||||
* only do a write to Bit[7:4] int setting
|
||||
*/
|
||||
writel(0, port->membase + SUP_UART_ISC); /* disable all interrupt */
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -372,7 +372,7 @@ static void sunplus_set_termios(struct uart_port *port,
|
||||
lcr |= UART_LCR_EPAR;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
@@ -407,7 +407,7 @@ static void sunplus_set_termios(struct uart_port *port,
|
||||
writel(div_l, port->membase + SUP_UART_DIV_L);
|
||||
writel(lcr, port->membase + SUP_UART_LCR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void sunplus_set_ldisc(struct uart_port *port, struct ktermios *termios)
|
||||
@@ -517,15 +517,15 @@ static void sunplus_console_write(struct console *co,
|
||||
if (sunplus_console_ports[co->index]->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&sunplus_console_ports[co->index]->port.lock);
|
||||
locked = uart_port_trylock(&sunplus_console_ports[co->index]->port);
|
||||
else
|
||||
spin_lock(&sunplus_console_ports[co->index]->port.lock);
|
||||
uart_port_lock(&sunplus_console_ports[co->index]->port);
|
||||
|
||||
uart_console_write(&sunplus_console_ports[co->index]->port, s, count,
|
||||
sunplus_uart_console_putchar);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&sunplus_console_ports[co->index]->port.lock);
|
||||
uart_port_unlock(&sunplus_console_ports[co->index]->port);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
+17
-17
@@ -310,7 +310,7 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
unsigned char gis;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
status.stat = 0;
|
||||
gis = readb(&up->regs->r.gis) >> up->gis_shift;
|
||||
@@ -331,7 +331,7 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id)
|
||||
transmit_chars(up, &status);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
if (port)
|
||||
tty_flip_buffer_push(port);
|
||||
@@ -473,12 +473,12 @@ static void sunsab_send_xchar(struct uart_port *port, char ch)
|
||||
if (ch == __DISABLED_CHAR)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
sunsab_tec_wait(up);
|
||||
writeb(ch, &up->regs->w.tic);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
/* port->lock held by caller. */
|
||||
@@ -499,7 +499,7 @@ static void sunsab_break_ctl(struct uart_port *port, int break_state)
|
||||
unsigned long flags;
|
||||
unsigned char val;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
val = up->cached_dafo;
|
||||
if (break_state)
|
||||
@@ -512,7 +512,7 @@ static void sunsab_break_ctl(struct uart_port *port, int break_state)
|
||||
if (test_bit(SAB82532_XPR, &up->irqflags))
|
||||
sunsab_tx_idle(up);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
/* port->lock is not held. */
|
||||
@@ -527,7 +527,7 @@ static int sunsab_startup(struct uart_port *port)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Wait for any commands or immediate characters
|
||||
@@ -582,7 +582,7 @@ static int sunsab_startup(struct uart_port *port)
|
||||
set_bit(SAB82532_ALLS, &up->irqflags);
|
||||
set_bit(SAB82532_XPR, &up->irqflags);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -594,7 +594,7 @@ static void sunsab_shutdown(struct uart_port *port)
|
||||
container_of(port, struct uart_sunsab_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/* Disable Interrupts */
|
||||
up->interrupt_mask0 = 0xff;
|
||||
@@ -628,7 +628,7 @@ static void sunsab_shutdown(struct uart_port *port)
|
||||
writeb(tmp, &up->regs->rw.ccr0);
|
||||
#endif
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
free_irq(up->port.irq, up);
|
||||
}
|
||||
|
||||
@@ -779,9 +779,9 @@ static void sunsab_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
unsigned int baud = uart_get_baud_rate(port, termios, old, 0, 4000000);
|
||||
unsigned int quot = uart_get_divisor(port, baud);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
sunsab_convert_to_sab(up, termios->c_cflag, termios->c_iflag, baud, quot);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static const char *sunsab_type(struct uart_port *port)
|
||||
@@ -857,15 +857,15 @@ static void sunsab_console_write(struct console *con, const char *s, unsigned n)
|
||||
int locked = 1;
|
||||
|
||||
if (up->port.sysrq || oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&up->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
uart_console_write(&up->port, s, n, sunsab_console_putchar);
|
||||
sunsab_tec_wait(up);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int sunsab_console_setup(struct console *con, char *options)
|
||||
@@ -914,7 +914,7 @@ static int sunsab_console_setup(struct console *con, char *options)
|
||||
*/
|
||||
sunsab_startup(&up->port);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Finally, enable interrupts
|
||||
@@ -932,7 +932,7 @@ static int sunsab_console_setup(struct console *con, char *options)
|
||||
sunsab_convert_to_sab(up, con->cflag, 0, baud, quot);
|
||||
sunsab_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+23
-23
@@ -212,9 +212,9 @@ static void enable_rsa(struct uart_sunsu_port *up)
|
||||
{
|
||||
if (up->port.type == PORT_RSA) {
|
||||
if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
|
||||
spin_lock_irq(&up->port.lock);
|
||||
uart_port_lock_irq(&up->port);
|
||||
__enable_rsa(up);
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
|
||||
serial_outp(up, UART_RSA_FRR, 0);
|
||||
@@ -234,7 +234,7 @@ static void disable_rsa(struct uart_sunsu_port *up)
|
||||
|
||||
if (up->port.type == PORT_RSA &&
|
||||
up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
|
||||
spin_lock_irq(&up->port.lock);
|
||||
uart_port_lock_irq(&up->port);
|
||||
|
||||
mode = serial_inp(up, UART_RSA_MSR);
|
||||
result = !(mode & UART_RSA_MSR_FIFO);
|
||||
@@ -247,7 +247,7 @@ static void disable_rsa(struct uart_sunsu_port *up)
|
||||
|
||||
if (result)
|
||||
up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
|
||||
spin_unlock_irq(&up->port.lock);
|
||||
uart_port_unlock_irq(&up->port);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_SERIAL_8250_RSA */
|
||||
@@ -311,10 +311,10 @@ static void sunsu_enable_ms(struct uart_port *port)
|
||||
container_of(port, struct uart_sunsu_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
up->ier |= UART_IER_MSI;
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -456,7 +456,7 @@ static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
unsigned char status;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
do {
|
||||
status = serial_inp(up, UART_LSR);
|
||||
@@ -470,7 +470,7 @@ static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id)
|
||||
|
||||
} while (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT));
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -545,9 +545,9 @@ static unsigned int sunsu_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -599,13 +599,13 @@ static void sunsu_break_ctl(struct uart_port *port, int break_state)
|
||||
container_of(port, struct uart_sunsu_port, port);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (break_state == -1)
|
||||
up->lcr |= UART_LCR_SBC;
|
||||
else
|
||||
up->lcr &= ~UART_LCR_SBC;
|
||||
serial_out(up, UART_LCR, up->lcr);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int sunsu_startup(struct uart_port *port)
|
||||
@@ -683,12 +683,12 @@ static int sunsu_startup(struct uart_port *port)
|
||||
*/
|
||||
serial_outp(up, UART_LCR, UART_LCR_WLEN8);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
up->port.mctrl |= TIOCM_OUT2;
|
||||
|
||||
sunsu_set_mctrl(&up->port, up->port.mctrl);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Finally, enable interrupts. Note: Modem status interrupts
|
||||
@@ -731,7 +731,7 @@ static void sunsu_shutdown(struct uart_port *port)
|
||||
up->ier = 0;
|
||||
serial_outp(up, UART_IER, 0);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (up->port.flags & UPF_FOURPORT) {
|
||||
/* reset interrupts on the AST Fourport board */
|
||||
inb((up->port.iobase & 0xfe0) | 0x1f);
|
||||
@@ -740,7 +740,7 @@ static void sunsu_shutdown(struct uart_port *port)
|
||||
up->port.mctrl &= ~TIOCM_OUT2;
|
||||
|
||||
sunsu_set_mctrl(&up->port, up->port.mctrl);
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
/*
|
||||
* Disable break condition and FIFOs
|
||||
@@ -826,7 +826,7 @@ sunsu_change_speed(struct uart_port *port, unsigned int cflag,
|
||||
* Ok, we're now changing the port state. Do it with
|
||||
* interrupts disabled.
|
||||
*/
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* Update the per-port timeout.
|
||||
@@ -891,7 +891,7 @@ sunsu_change_speed(struct uart_port *port, unsigned int cflag,
|
||||
|
||||
up->cflag = cflag;
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1038,7 +1038,7 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
|
||||
up->type_probed = PORT_UNKNOWN;
|
||||
up->port.iotype = UPIO_MEM;
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
if (!(up->port.flags & UPF_BUGGY_UART)) {
|
||||
/*
|
||||
@@ -1173,7 +1173,7 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
|
||||
serial_outp(up, UART_IER, 0);
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static struct uart_driver sunsu_reg = {
|
||||
@@ -1298,9 +1298,9 @@ static void sunsu_console_write(struct console *co, const char *s,
|
||||
int locked = 1;
|
||||
|
||||
if (up->port.sysrq || oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&up->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
/*
|
||||
* First save the UER then disable the interrupts
|
||||
@@ -1318,7 +1318,7 @@ static void sunsu_console_write(struct console *co, const char *s,
|
||||
serial_out(up, UART_IER, ier);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -531,7 +531,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
|
||||
struct tty_port *port;
|
||||
unsigned char r3;
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
r3 = read_zsreg(channel, R3);
|
||||
|
||||
/* Channel A */
|
||||
@@ -548,7 +548,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHATxIP)
|
||||
sunzilog_transmit_chars(up, channel);
|
||||
}
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
if (port)
|
||||
tty_flip_buffer_push(port);
|
||||
@@ -557,7 +557,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
|
||||
up = up->next;
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
|
||||
|
||||
spin_lock(&up->port.lock);
|
||||
uart_port_lock(&up->port);
|
||||
port = NULL;
|
||||
if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
|
||||
writeb(RES_H_IUS, &channel->control);
|
||||
@@ -571,7 +571,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
|
||||
if (r3 & CHBTxIP)
|
||||
sunzilog_transmit_chars(up, channel);
|
||||
}
|
||||
spin_unlock(&up->port.lock);
|
||||
uart_port_unlock(&up->port);
|
||||
|
||||
if (port)
|
||||
tty_flip_buffer_push(port);
|
||||
@@ -604,11 +604,11 @@ static unsigned int sunzilog_tx_empty(struct uart_port *port)
|
||||
unsigned char status;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = sunzilog_read_channel_status(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (status & Tx_BUF_EMP)
|
||||
ret = TIOCSER_TEMT;
|
||||
@@ -764,7 +764,7 @@ static void sunzilog_break_ctl(struct uart_port *port, int break_state)
|
||||
else
|
||||
clear_bits |= SND_BRK;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
new_reg = (up->curregs[R5] | set_bits) & ~clear_bits;
|
||||
if (new_reg != up->curregs[R5]) {
|
||||
@@ -774,7 +774,7 @@ static void sunzilog_break_ctl(struct uart_port *port, int break_state)
|
||||
write_zsreg(channel, R5, up->curregs[R5]);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static void __sunzilog_startup(struct uart_sunzilog_port *up)
|
||||
@@ -800,9 +800,9 @@ static int sunzilog_startup(struct uart_port *port)
|
||||
if (ZS_IS_CONS(up))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
__sunzilog_startup(up);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -840,7 +840,7 @@ static void sunzilog_shutdown(struct uart_port *port)
|
||||
if (ZS_IS_CONS(up))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(port);
|
||||
|
||||
@@ -853,7 +853,7 @@ static void sunzilog_shutdown(struct uart_port *port)
|
||||
up->curregs[R5] &= ~SND_BRK;
|
||||
sunzilog_maybe_update_regs(up, channel);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/* Shared by TTY driver and serial console setup. The port lock is held
|
||||
@@ -945,7 +945,7 @@ sunzilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 1200, 76800);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
|
||||
|
||||
@@ -962,7 +962,7 @@ sunzilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static const char *sunzilog_type(struct uart_port *port)
|
||||
@@ -1201,15 +1201,15 @@ sunzilog_console_write(struct console *con, const char *s, unsigned int count)
|
||||
int locked = 1;
|
||||
|
||||
if (up->port.sysrq || oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
locked = uart_port_trylock_irqsave(&up->port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
uart_console_write(&up->port, s, count, sunzilog_putchar);
|
||||
udelay(2);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
}
|
||||
|
||||
static int __init sunzilog_console_setup(struct console *con, char *options)
|
||||
@@ -1244,7 +1244,7 @@ static int __init sunzilog_console_setup(struct console *con, char *options)
|
||||
|
||||
brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
|
||||
up->curregs[R15] |= BRKIE;
|
||||
sunzilog_convert_to_zs(up, con->cflag, 0, brg);
|
||||
@@ -1252,7 +1252,7 @@ static int __init sunzilog_console_setup(struct console *con, char *options)
|
||||
sunzilog_set_mctrl(&up->port, TIOCM_DTR | TIOCM_RTS);
|
||||
__sunzilog_startup(up);
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1333,7 +1333,7 @@ static void sunzilog_init_hw(struct uart_sunzilog_port *up)
|
||||
|
||||
channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
|
||||
|
||||
spin_lock_irqsave(&up->port.lock, flags);
|
||||
uart_port_lock_irqsave(&up->port, &flags);
|
||||
if (ZS_IS_CHANNEL_A(up)) {
|
||||
write_zsreg(channel, R9, FHWRES);
|
||||
ZSDELAY_LONG();
|
||||
@@ -1383,7 +1383,7 @@ static void sunzilog_init_hw(struct uart_sunzilog_port *up)
|
||||
write_zsreg(channel, R9, up->curregs[R9]);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
uart_port_unlock_irqrestore(&up->port, flags);
|
||||
|
||||
#ifdef CONFIG_SERIO
|
||||
if (up->flags & (SUNZILOG_FLAG_CONS_KEYB |
|
||||
|
||||
@@ -174,7 +174,7 @@ static void timbuart_tasklet(struct tasklet_struct *t)
|
||||
struct timbuart_port *uart = from_tasklet(uart, t, tasklet);
|
||||
u32 isr, ier = 0;
|
||||
|
||||
spin_lock(&uart->port.lock);
|
||||
uart_port_lock(&uart->port);
|
||||
|
||||
isr = ioread32(uart->port.membase + TIMBUART_ISR);
|
||||
dev_dbg(uart->port.dev, "%s ISR: %x\n", __func__, isr);
|
||||
@@ -189,7 +189,7 @@ static void timbuart_tasklet(struct tasklet_struct *t)
|
||||
|
||||
iowrite32(ier, uart->port.membase + TIMBUART_IER);
|
||||
|
||||
spin_unlock(&uart->port.lock);
|
||||
uart_port_unlock(&uart->port);
|
||||
dev_dbg(uart->port.dev, "%s leaving\n", __func__);
|
||||
}
|
||||
|
||||
@@ -295,10 +295,10 @@ static void timbuart_set_termios(struct uart_port *port,
|
||||
tty_termios_copy_hw(termios, old);
|
||||
tty_termios_encode_baud_rate(termios, baud, baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
iowrite8((u8)bindex, port->membase + TIMBUART_BAUDRATE);
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *timbuart_type(struct uart_port *port)
|
||||
|
||||
@@ -216,11 +216,11 @@ static irqreturn_t ulite_isr(int irq, void *dev_id)
|
||||
unsigned long flags;
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
stat = uart_in32(ULITE_STATUS, port);
|
||||
busy = ulite_receive(port, stat);
|
||||
busy |= ulite_transmit(port, stat);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
n++;
|
||||
} while (busy);
|
||||
|
||||
@@ -238,9 +238,9 @@ static unsigned int ulite_tx_empty(struct uart_port *port)
|
||||
unsigned long flags;
|
||||
unsigned int ret;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
ret = uart_in32(ULITE_STATUS, port);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return ret & ULITE_STATUS_TXEMPTY ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
@@ -323,7 +323,7 @@ static void ulite_set_termios(struct uart_port *port,
|
||||
termios->c_cflag |= pdata->cflags & (PARENB | PARODD | CSIZE);
|
||||
tty_termios_encode_baud_rate(termios, pdata->baud, pdata->baud);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
port->read_status_mask = ULITE_STATUS_RXVALID | ULITE_STATUS_OVERRUN
|
||||
| ULITE_STATUS_TXFULL;
|
||||
@@ -346,7 +346,7 @@ static void ulite_set_termios(struct uart_port *port,
|
||||
/* update timeout */
|
||||
uart_update_timeout(port, termios->c_cflag, pdata->baud);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *ulite_type(struct uart_port *port)
|
||||
@@ -495,9 +495,9 @@ static void ulite_console_write(struct console *co, const char *s,
|
||||
int locked = 1;
|
||||
|
||||
if (oops_in_progress) {
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
} else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* save and disable interrupt */
|
||||
ier = uart_in32(ULITE_STATUS, port) & ULITE_STATUS_IE;
|
||||
@@ -512,7 +512,7 @@ static void ulite_console_write(struct console *co, const char *s,
|
||||
uart_out32(ULITE_CONTROL_IE, ULITE_CONTROL, port);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static int ulite_console_setup(struct console *co, char *options)
|
||||
|
||||
@@ -931,7 +931,7 @@ static void qe_uart_set_termios(struct uart_port *port,
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
|
||||
|
||||
/* Do we really need a spinlock here? */
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Update the per-port timeout. */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
@@ -949,7 +949,7 @@ static void qe_uart_set_termios(struct uart_port *port,
|
||||
qe_setbrg(qe_port->us_info.tx_clock, baud, 16);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -227,7 +227,7 @@ static irqreturn_t vt8500_irq(int irq, void *dev_id)
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned long isr;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
isr = vt8500_read(port, VT8500_URISR);
|
||||
|
||||
/* Acknowledge active status bits */
|
||||
@@ -240,7 +240,7 @@ static irqreturn_t vt8500_irq(int irq, void *dev_id)
|
||||
if (isr & TCTS)
|
||||
handle_delta_cts(port);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -342,7 +342,7 @@ static void vt8500_set_termios(struct uart_port *port,
|
||||
unsigned int baud, lcr;
|
||||
unsigned int loops = 1000;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* calculate and set baud rate */
|
||||
baud = uart_get_baud_rate(port, termios, old, 900, 921600);
|
||||
@@ -410,7 +410,7 @@ static void vt8500_set_termios(struct uart_port *port,
|
||||
vt8500_write(&vt8500_port->uart, 0x881, VT8500_URFCR);
|
||||
vt8500_write(&vt8500_port->uart, vt8500_port->ier, VT8500_URIER);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
static const char *vt8500_type(struct uart_port *port)
|
||||
|
||||
@@ -346,7 +346,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
|
||||
struct uart_port *port = (struct uart_port *)dev_id;
|
||||
unsigned int isrstatus;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
uart_port_lock(port);
|
||||
|
||||
/* Read the interrupt status register to determine which
|
||||
* interrupt(s) is/are active and clear them.
|
||||
@@ -369,7 +369,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
|
||||
!(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))
|
||||
cdns_uart_handle_rx(dev_id, isrstatus);
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -506,14 +506,14 @@ static int cdns_uart_clk_notifier_cb(struct notifier_block *nb,
|
||||
return NOTIFY_BAD;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&cdns_uart->port->lock, flags);
|
||||
uart_port_lock_irqsave(cdns_uart->port, &flags);
|
||||
|
||||
/* Disable the TX and RX to set baud rate */
|
||||
ctrl_reg = readl(port->membase + CDNS_UART_CR);
|
||||
ctrl_reg |= CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS;
|
||||
writel(ctrl_reg, port->membase + CDNS_UART_CR);
|
||||
|
||||
spin_unlock_irqrestore(&cdns_uart->port->lock, flags);
|
||||
uart_port_unlock_irqrestore(cdns_uart->port, flags);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
@@ -523,7 +523,7 @@ static int cdns_uart_clk_notifier_cb(struct notifier_block *nb,
|
||||
* frequency.
|
||||
*/
|
||||
|
||||
spin_lock_irqsave(&cdns_uart->port->lock, flags);
|
||||
uart_port_lock_irqsave(cdns_uart->port, &flags);
|
||||
|
||||
locked = 1;
|
||||
port->uartclk = ndata->new_rate;
|
||||
@@ -533,7 +533,7 @@ static int cdns_uart_clk_notifier_cb(struct notifier_block *nb,
|
||||
fallthrough;
|
||||
case ABORT_RATE_CHANGE:
|
||||
if (!locked)
|
||||
spin_lock_irqsave(&cdns_uart->port->lock, flags);
|
||||
uart_port_lock_irqsave(cdns_uart->port, &flags);
|
||||
|
||||
/* Set TX/RX Reset */
|
||||
ctrl_reg = readl(port->membase + CDNS_UART_CR);
|
||||
@@ -555,7 +555,7 @@ static int cdns_uart_clk_notifier_cb(struct notifier_block *nb,
|
||||
ctrl_reg |= CDNS_UART_CR_TX_EN | CDNS_UART_CR_RX_EN;
|
||||
writel(ctrl_reg, port->membase + CDNS_UART_CR);
|
||||
|
||||
spin_unlock_irqrestore(&cdns_uart->port->lock, flags);
|
||||
uart_port_unlock_irqrestore(cdns_uart->port, flags);
|
||||
|
||||
return NOTIFY_OK;
|
||||
default:
|
||||
@@ -652,7 +652,7 @@ static void cdns_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
unsigned int status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
status = readl(port->membase + CDNS_UART_CR);
|
||||
|
||||
@@ -664,7 +664,7 @@ static void cdns_uart_break_ctl(struct uart_port *port, int ctl)
|
||||
writel(CDNS_UART_CR_STOPBRK | status,
|
||||
port->membase + CDNS_UART_CR);
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -683,7 +683,7 @@ static void cdns_uart_set_termios(struct uart_port *port,
|
||||
unsigned long flags;
|
||||
unsigned int ctrl_reg, mode_reg;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable the TX and RX to set baud rate */
|
||||
ctrl_reg = readl(port->membase + CDNS_UART_CR);
|
||||
@@ -794,7 +794,7 @@ static void cdns_uart_set_termios(struct uart_port *port,
|
||||
cval &= ~CDNS_UART_MODEMCR_FCM;
|
||||
writel(cval, port->membase + CDNS_UART_MODEMCR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -813,7 +813,7 @@ static int cdns_uart_startup(struct uart_port *port)
|
||||
|
||||
is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable the TX and RX */
|
||||
writel(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS,
|
||||
@@ -861,7 +861,7 @@ static int cdns_uart_startup(struct uart_port *port)
|
||||
writel(readl(port->membase + CDNS_UART_ISR),
|
||||
port->membase + CDNS_UART_ISR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
ret = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, port);
|
||||
if (ret) {
|
||||
@@ -889,7 +889,7 @@ static void cdns_uart_shutdown(struct uart_port *port)
|
||||
int status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Disable interrupts */
|
||||
status = readl(port->membase + CDNS_UART_IMR);
|
||||
@@ -900,7 +900,7 @@ static void cdns_uart_shutdown(struct uart_port *port)
|
||||
writel(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS,
|
||||
port->membase + CDNS_UART_CR);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
free_irq(port->irq, port);
|
||||
}
|
||||
@@ -1050,7 +1050,7 @@ static int cdns_uart_poll_get_char(struct uart_port *port)
|
||||
int c;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Check if FIFO is empty */
|
||||
if (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY)
|
||||
@@ -1058,7 +1058,7 @@ static int cdns_uart_poll_get_char(struct uart_port *port)
|
||||
else /* Read a character */
|
||||
c = (unsigned char) readl(port->membase + CDNS_UART_FIFO);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
return c;
|
||||
}
|
||||
@@ -1067,7 +1067,7 @@ static void cdns_uart_poll_put_char(struct uart_port *port, unsigned char c)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Wait until FIFO is empty */
|
||||
while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY))
|
||||
@@ -1080,7 +1080,7 @@ static void cdns_uart_poll_put_char(struct uart_port *port, unsigned char c)
|
||||
while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY))
|
||||
cpu_relax();
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1232,9 +1232,9 @@ static void cdns_uart_console_write(struct console *co, const char *s,
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
locked = uart_port_trylock_irqsave(port, &flags);
|
||||
else
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* save and disable interrupt */
|
||||
imr = readl(port->membase + CDNS_UART_IMR);
|
||||
@@ -1257,7 +1257,7 @@ static void cdns_uart_console_write(struct console *co, const char *s,
|
||||
writel(imr, port->membase + CDNS_UART_IER);
|
||||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1325,7 +1325,7 @@ static int cdns_uart_suspend(struct device *device)
|
||||
if (console_suspend_enabled && uart_console(port) && may_wake) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
/* Empty the receive FIFO 1st before making changes */
|
||||
while (!(readl(port->membase + CDNS_UART_SR) &
|
||||
CDNS_UART_SR_RXEMPTY))
|
||||
@@ -1334,7 +1334,7 @@ static int cdns_uart_suspend(struct device *device)
|
||||
writel(1, port->membase + CDNS_UART_RXWM);
|
||||
/* disable RX timeout interrups */
|
||||
writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1372,7 +1372,7 @@ static int cdns_uart_resume(struct device *device)
|
||||
return ret;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
|
||||
/* Set TX/RX Reset */
|
||||
ctrl_reg = readl(port->membase + CDNS_UART_CR);
|
||||
@@ -1392,14 +1392,14 @@ static int cdns_uart_resume(struct device *device)
|
||||
|
||||
clk_disable(cdns_uart->uartclk);
|
||||
clk_disable(cdns_uart->pclk);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
} else {
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
uart_port_lock_irqsave(port, &flags);
|
||||
/* restore original rx trigger level */
|
||||
writel(rx_trigger_level, port->membase + CDNS_UART_RXWM);
|
||||
/* enable RX timeout interrupt */
|
||||
writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IER);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
|
||||
return uart_resume_port(cdns_uart->cdns_uart_driver, port);
|
||||
|
||||
@@ -3540,9 +3540,11 @@ static ssize_t show_cons_active(struct device *dev,
|
||||
for_each_console(c) {
|
||||
if (!c->device)
|
||||
continue;
|
||||
if (c->flags & CON_NO_BKL) {
|
||||
if (!(c->write_thread || c->write_atomic))
|
||||
if (c->flags & CON_NBCON) {
|
||||
if (!c->write_atomic &&
|
||||
!(c->write_thread && c->kthread)) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (!c->write)
|
||||
continue;
|
||||
|
||||
+3
-3
@@ -21,7 +21,7 @@ static int show_console_dev(struct seq_file *m, void *v)
|
||||
{ CON_ENABLED, 'E' },
|
||||
{ CON_CONSDEV, 'C' },
|
||||
{ CON_BOOT, 'B' },
|
||||
{ CON_NO_BKL, 'N' },
|
||||
{ CON_NBCON, 'N' },
|
||||
{ CON_PRINTBUFFER, 'p' },
|
||||
{ CON_BRL, 'b' },
|
||||
{ CON_ANYTIME, 'a' },
|
||||
@@ -59,8 +59,8 @@ static int show_console_dev(struct seq_file *m, void *v)
|
||||
seq_setwidth(m, 21 - 1);
|
||||
seq_printf(m, "%s%d", con->name, con->index);
|
||||
seq_pad(m, ' ');
|
||||
if (con->flags & CON_NO_BKL) {
|
||||
if (con->write_thread || con->write_atomic)
|
||||
if (con->flags & CON_NBCON) {
|
||||
if (con->write_atomic || con->write_thread)
|
||||
con_write = 'W';
|
||||
} else {
|
||||
if (con->write)
|
||||
|
||||
+104
-131
@@ -158,7 +158,7 @@ static inline int con_debug_leave(void)
|
||||
* /dev/kmesg which requires a larger output buffer.
|
||||
* @CON_SUSPENDED: Indicates if a console is suspended. If true, the
|
||||
* printing callbacks must not be called.
|
||||
* @CON_NO_BKL: Console can operate outside of the BKL style console_lock
|
||||
* @CON_NBCON: Console can operate outside of the legacy style console_lock
|
||||
* constraints.
|
||||
*/
|
||||
enum cons_flags {
|
||||
@@ -170,132 +170,113 @@ enum cons_flags {
|
||||
CON_BRL = BIT(5),
|
||||
CON_EXTENDED = BIT(6),
|
||||
CON_SUSPENDED = BIT(7),
|
||||
CON_NO_BKL = BIT(8),
|
||||
CON_NBCON = BIT(8),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cons_state - console state for NOBKL consoles
|
||||
* struct nbcon_state - console state for nbcon consoles
|
||||
* @atom: Compound of the state fields for atomic operations
|
||||
* @seq: Sequence for record tracking (64bit only)
|
||||
* @bits: Compound of the state bits below
|
||||
*
|
||||
* @locked: Console is locked by a writer
|
||||
* @unsafe: Console is busy in a non takeover region
|
||||
* @thread: Current owner is the printk thread
|
||||
* @cur_prio: The priority of the current output
|
||||
* @req_prio: The priority of a handover request
|
||||
* @cpu: The CPU on which the writer runs
|
||||
* @req_prio: The priority of a handover request
|
||||
* @prio: The priority of the current owner
|
||||
* @unsafe: Console is busy in a non takeover region
|
||||
* @unsafe_takeover: A hostile takeover in an unsafe state happened in the
|
||||
* past. The console cannot be safe until re-initialized.
|
||||
* @cpu: The CPU on which the owner runs
|
||||
*
|
||||
* To be used for state read and preparation of atomic_long_cmpxchg()
|
||||
* operations.
|
||||
* To be used for reading and preparing of the value stored in the nbcon
|
||||
* state variable @console::nbcon_state.
|
||||
*
|
||||
* The @req_prio field is particularly important to allow spin-waiting to
|
||||
* timeout and give up without the risk of it being assigned the lock
|
||||
* after giving up. The @req_prio field has a nice side-effect that it
|
||||
* also makes it possible for a single read+cmpxchg in the common case of
|
||||
* acquire and release.
|
||||
* The @prio and @req_prio fields are particularly important to allow
|
||||
* spin-waiting to timeout and give up without the risk of a waiter being
|
||||
* assigned the lock after giving up.
|
||||
*/
|
||||
struct cons_state {
|
||||
struct nbcon_state {
|
||||
union {
|
||||
unsigned long atom;
|
||||
unsigned int atom;
|
||||
struct {
|
||||
#ifdef CONFIG_64BIT
|
||||
u32 seq;
|
||||
#endif
|
||||
union {
|
||||
u32 bits;
|
||||
struct {
|
||||
u32 locked : 1;
|
||||
u32 unsafe : 1;
|
||||
u32 thread : 1;
|
||||
u32 cur_prio : 2;
|
||||
u32 req_prio : 2;
|
||||
u32 cpu : 18;
|
||||
};
|
||||
};
|
||||
unsigned int prio : 2;
|
||||
unsigned int req_prio : 2;
|
||||
unsigned int unsafe : 1;
|
||||
unsigned int unsafe_takeover : 1;
|
||||
unsigned int cpu : 24;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* cons_prio - console writer priority for NOBKL consoles
|
||||
* @CONS_PRIO_NONE: Unused
|
||||
* @CONS_PRIO_NORMAL: Regular printk
|
||||
* @CONS_PRIO_EMERGENCY: Emergency output (WARN/OOPS...)
|
||||
* @CONS_PRIO_PANIC: Panic output
|
||||
* @CONS_PRIO_MAX: The number of priority levels
|
||||
*
|
||||
* Emergency output can carefully takeover the console even without consent
|
||||
* of the owner, ideally only when @cons_state::unsafe is not set. Panic
|
||||
* output can ignore the unsafe flag as a last resort. If panic output is
|
||||
* active no takeover is possible until the panic output releases the
|
||||
* console.
|
||||
/*
|
||||
* The nbcon_state struct is used to easily create and interpret values that
|
||||
* are stored in the @console::nbcon_state variable. Ensure this struct stays
|
||||
* within the size boundaries of the atomic variable's underlying type in
|
||||
* order to avoid any accidental truncation.
|
||||
*/
|
||||
enum cons_prio {
|
||||
CONS_PRIO_NONE = 0,
|
||||
CONS_PRIO_NORMAL,
|
||||
CONS_PRIO_EMERGENCY,
|
||||
CONS_PRIO_PANIC,
|
||||
CONS_PRIO_MAX,
|
||||
static_assert(sizeof(struct nbcon_state) <= sizeof(int));
|
||||
|
||||
/**
|
||||
* nbcon_prio - console owner priority for nbcon consoles
|
||||
* @NBCON_PRIO_NONE: Unused
|
||||
* @NBCON_PRIO_NORMAL: Normal (non-emergency) usage
|
||||
* @NBCON_PRIO_EMERGENCY: Emergency output (WARN/OOPS...)
|
||||
* @NBCON_PRIO_PANIC: Panic output
|
||||
* @NBCON_PRIO_MAX: The number of priority levels
|
||||
*
|
||||
* A higher priority context can takeover the console when it is
|
||||
* in the safe state. The final attempt to flush consoles in panic()
|
||||
* can be allowed to do so even in an unsafe state (Hope and pray).
|
||||
*/
|
||||
enum nbcon_prio {
|
||||
NBCON_PRIO_NONE = 0,
|
||||
NBCON_PRIO_NORMAL,
|
||||
NBCON_PRIO_EMERGENCY,
|
||||
NBCON_PRIO_PANIC,
|
||||
NBCON_PRIO_MAX,
|
||||
};
|
||||
|
||||
struct console;
|
||||
struct printk_buffers;
|
||||
|
||||
/**
|
||||
* struct cons_context - Context for console acquire/release
|
||||
* @console: The associated console
|
||||
* @state: The state at acquire time
|
||||
* @old_state: The old state when try_acquire() failed for analysis
|
||||
* by the caller
|
||||
* @hov_state: The handover state for spin and cleanup
|
||||
* @req_state: The request state for spin and cleanup
|
||||
* @spinwait_max_us: Limit for spinwait acquire
|
||||
* @oldseq: The sequence number at acquire()
|
||||
* @newseq: The sequence number for progress
|
||||
* @prio: Priority of the context
|
||||
* @pbufs: Pointer to the text buffer for this context
|
||||
* @dropped: Dropped counter for the current context
|
||||
* @thread: The acquire is printk thread context
|
||||
* @hostile: Hostile takeover requested. Cleared on normal
|
||||
* acquire or friendly handover
|
||||
* @spinwait: Spinwait on acquire if possible
|
||||
* @backlog: Ringbuffer has pending records
|
||||
* struct nbcon_context - Context for console acquire/release
|
||||
* @console: The associated console
|
||||
* @spinwait_max_us: Limit for spin-wait acquire
|
||||
* @prio: Priority of the context
|
||||
* @allow_unsafe_takeover: Allow performing takeover even if unsafe. Can
|
||||
* be used only with NBCON_PRIO_PANIC @prio. It
|
||||
* might cause a system freeze when the console
|
||||
* is used later.
|
||||
* @backlog: Ringbuffer has pending records
|
||||
* @pbufs: Pointer to the text buffer for this context
|
||||
* @seq: The sequence number to print for this context
|
||||
*/
|
||||
struct cons_context {
|
||||
struct nbcon_context {
|
||||
/* members set by caller */
|
||||
struct console *console;
|
||||
struct cons_state state;
|
||||
struct cons_state old_state;
|
||||
struct cons_state hov_state;
|
||||
struct cons_state req_state;
|
||||
u64 oldseq;
|
||||
u64 newseq;
|
||||
unsigned int spinwait_max_us;
|
||||
enum cons_prio prio;
|
||||
enum nbcon_prio prio;
|
||||
unsigned int allow_unsafe_takeover : 1;
|
||||
|
||||
/* members set by emit */
|
||||
unsigned int backlog : 1;
|
||||
|
||||
/* members set by acquire */
|
||||
struct printk_buffers *pbufs;
|
||||
unsigned long dropped;
|
||||
unsigned int thread : 1;
|
||||
unsigned int hostile : 1;
|
||||
unsigned int spinwait : 1;
|
||||
unsigned int backlog : 1;
|
||||
u64 seq;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cons_write_context - Context handed to the write callbacks
|
||||
* @ctxt: The core console context
|
||||
* @outbuf: Pointer to the text buffer for output
|
||||
* @len: Length to write
|
||||
* @unsafe: Invoked in unsafe state due to force takeover
|
||||
* struct nbcon_write_context - Context handed to the nbcon write callbacks
|
||||
* @ctxt: The core console context
|
||||
* @outbuf: Pointer to the text buffer for output
|
||||
* @len: Length to write
|
||||
* @unsafe_takeover: If a hostile takeover in an unsafe state has occurred
|
||||
*/
|
||||
struct cons_write_context {
|
||||
struct cons_context __private ctxt;
|
||||
struct nbcon_write_context {
|
||||
struct nbcon_context __private ctxt;
|
||||
char *outbuf;
|
||||
unsigned int len;
|
||||
bool unsafe;
|
||||
bool unsafe_takeover;
|
||||
};
|
||||
|
||||
struct cons_context_data;
|
||||
|
||||
/**
|
||||
* struct console - The console descriptor structure
|
||||
* @name: The name of the console driver
|
||||
@@ -316,17 +297,16 @@ struct cons_context_data;
|
||||
* @data: Driver private data
|
||||
* @node: hlist node for the console list
|
||||
*
|
||||
* @atomic_state: State array for NOBKL consoles; real and handover
|
||||
* @atomic_seq: Sequence for record tracking (32bit only)
|
||||
* @thread_pbufs: Pointer to thread private buffer
|
||||
* @kthread: Pointer to kernel thread
|
||||
* @rcuwait: RCU wait for the kernel thread
|
||||
* @irq_work: IRQ work for thread wakeup
|
||||
* @kthread_waiting: Indicator whether the kthread is waiting to be woken
|
||||
* @write_atomic: Write callback for atomic context
|
||||
* @write_thread: Write callback for printk threaded printing
|
||||
* @port_lock: Callback to lock/unlock the port lock
|
||||
* @pcpu_data: Pointer to percpu context data
|
||||
* @write_thread: Write callback for non-atomic context
|
||||
* @uart_port: Callback to provide the associated uart port
|
||||
* @nbcon_state: State for nbcon consoles
|
||||
* @nbcon_seq: Sequence number of the next record for nbcon to print
|
||||
* @pbufs: Pointer to nbcon private buffer
|
||||
* @locked_port: True, if the port lock is locked by nbcon
|
||||
* @kthread: Printer kthread for this console
|
||||
* @rcuwait: RCU-safe wait object for @kthread waking
|
||||
* @irq_work: Defer @kthread waking to IRQ work context
|
||||
*/
|
||||
struct console {
|
||||
char name[16];
|
||||
@@ -347,22 +327,19 @@ struct console {
|
||||
void *data;
|
||||
struct hlist_node node;
|
||||
|
||||
/* NOBKL console specific members */
|
||||
atomic_long_t __private atomic_state[2];
|
||||
#ifndef CONFIG_64BIT
|
||||
atomic_t __private atomic_seq;
|
||||
#endif
|
||||
struct printk_buffers *thread_pbufs;
|
||||
/* nbcon console specific members */
|
||||
bool (*write_atomic)(struct console *con,
|
||||
struct nbcon_write_context *wctxt);
|
||||
bool (*write_thread)(struct console *con,
|
||||
struct nbcon_write_context *wctxt);
|
||||
struct uart_port * (*uart_port)(struct console *con);
|
||||
atomic_t __private nbcon_state;
|
||||
atomic_long_t __private nbcon_seq;
|
||||
struct printk_buffers *pbufs;
|
||||
bool locked_port;
|
||||
struct task_struct *kthread;
|
||||
struct rcuwait rcuwait;
|
||||
struct irq_work irq_work;
|
||||
atomic_t kthread_waiting;
|
||||
|
||||
bool (*write_atomic)(struct console *con, struct cons_write_context *wctxt);
|
||||
bool (*write_thread)(struct console *con, struct cons_write_context *wctxt);
|
||||
void (*port_lock)(struct console *con, bool do_lock, unsigned long *flags);
|
||||
|
||||
struct cons_context_data __percpu *pcpu_data;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
@@ -490,21 +467,17 @@ static inline bool console_is_registered(const struct console *con)
|
||||
hlist_for_each_entry(con, &console_list, node)
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
extern enum cons_prio cons_atomic_enter(enum cons_prio prio);
|
||||
extern void cons_atomic_exit(enum cons_prio prio, enum cons_prio prev_prio);
|
||||
extern bool console_can_proceed(struct cons_write_context *wctxt);
|
||||
extern bool console_enter_unsafe(struct cons_write_context *wctxt);
|
||||
extern bool console_exit_unsafe(struct cons_write_context *wctxt);
|
||||
extern bool console_try_acquire(struct cons_write_context *wctxt);
|
||||
extern bool console_release(struct cons_write_context *wctxt);
|
||||
extern enum nbcon_prio nbcon_atomic_enter(enum nbcon_prio prio);
|
||||
extern void nbcon_atomic_exit(enum nbcon_prio prio, enum nbcon_prio prev_prio);
|
||||
extern bool nbcon_can_proceed(struct nbcon_write_context *wctxt);
|
||||
extern bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt);
|
||||
extern bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt);
|
||||
#else
|
||||
static inline enum cons_prio cons_atomic_enter(enum cons_prio prio) { return CONS_PRIO_NONE; }
|
||||
static inline void cons_atomic_exit(enum cons_prio prio, enum cons_prio prev_prio) { }
|
||||
static inline bool console_can_proceed(struct cons_write_context *wctxt) { return false; }
|
||||
static inline bool console_enter_unsafe(struct cons_write_context *wctxt) { return false; }
|
||||
static inline bool console_exit_unsafe(struct cons_write_context *wctxt) { return false; }
|
||||
static inline bool console_try_acquire(struct cons_write_context *wctxt) { return false; }
|
||||
static inline bool console_release(struct cons_write_context *wctxt) { return false; }
|
||||
static inline enum nbcon_prio nbcon_atomic_enter(enum nbcon_prio prio) { return NBCON_PRIO_NONE; }
|
||||
static inline void nbcon_atomic_exit(enum nbcon_prio prio, enum nbcon_prio prev_prio) { }
|
||||
static inline bool nbcon_can_proceed(struct nbcon_write_context *wctxt) { return false; }
|
||||
static inline bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt) { return false; }
|
||||
static inline bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt) { return false; }
|
||||
#endif
|
||||
|
||||
extern int console_set_on_cmdline;
|
||||
|
||||
+17
-7
@@ -9,6 +9,8 @@
|
||||
#include <linux/ratelimit_types.h>
|
||||
#include <linux/once_lite.h>
|
||||
|
||||
struct uart_port;
|
||||
|
||||
extern const char linux_banner[];
|
||||
extern const char linux_proc_banner[];
|
||||
|
||||
@@ -139,7 +141,6 @@ void early_printk(const char *s, ...) { }
|
||||
#endif
|
||||
|
||||
struct dev_printk_info;
|
||||
struct cons_write_context;
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
asmlinkage __printf(4, 0)
|
||||
@@ -158,10 +159,11 @@ int _printk(const char *fmt, ...);
|
||||
*/
|
||||
__printf(1, 2) __cold int _printk_deferred(const char *fmt, ...);
|
||||
|
||||
extern void __printk_safe_enter(unsigned long *flags);
|
||||
extern void __printk_safe_exit(unsigned long *flags);
|
||||
extern void __printk_safe_enter(void);
|
||||
extern void __printk_safe_exit(void);
|
||||
extern void __printk_deferred_enter(void);
|
||||
extern void __printk_deferred_exit(void);
|
||||
|
||||
/*
|
||||
* The printk_deferred_enter/exit macros are available only as a hack for
|
||||
* some code paths that need to defer all printk console printing. Interrupts
|
||||
@@ -195,8 +197,9 @@ void show_regs_print_info(const char *log_lvl);
|
||||
extern asmlinkage void dump_stack_lvl(const char *log_lvl) __cold;
|
||||
extern asmlinkage void dump_stack(void) __cold;
|
||||
void printk_trigger_flush(void);
|
||||
extern void cons_atomic_flush(struct cons_write_context *printk_caller_wctxt,
|
||||
bool skip_unsafe);
|
||||
extern void nbcon_atomic_flush_all(void);
|
||||
extern void nbcon_handle_port_lock(struct uart_port *up);
|
||||
extern void nbcon_handle_port_unlock(struct uart_port *up);
|
||||
#else
|
||||
static inline __printf(1, 0)
|
||||
int vprintk(const char *s, va_list args)
|
||||
@@ -277,8 +280,15 @@ static inline void printk_trigger_flush(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void cons_atomic_flush(struct cons_write_context *printk_caller_wctxt,
|
||||
bool skip_unsafe)
|
||||
static inline void nbcon_atomic_flush_all(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void nbcon_handle_port_lock(struct uart_port *up)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void nbcon_handle_port_unlock(struct uart_port *up)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -153,8 +153,6 @@ struct uart_8250_port {
|
||||
#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
|
||||
unsigned char msr_saved_flags;
|
||||
|
||||
bool console_newline_needed;
|
||||
|
||||
struct uart_8250_dma *dma;
|
||||
const struct uart_8250_ops *ops;
|
||||
|
||||
@@ -169,9 +167,6 @@ struct uart_8250_port {
|
||||
/* Serial port overrun backoff */
|
||||
struct delayed_work overrun_backoff;
|
||||
u32 overrun_backoff_time_ms;
|
||||
|
||||
struct cons_write_context wctxt;
|
||||
int cookie;
|
||||
};
|
||||
|
||||
static inline struct uart_8250_port *up_to_u8250p(struct uart_port *up)
|
||||
@@ -207,10 +202,10 @@ void serial8250_tx_chars(struct uart_8250_port *up);
|
||||
unsigned int serial8250_modem_status(struct uart_8250_port *up);
|
||||
void serial8250_init_port(struct uart_8250_port *up);
|
||||
void serial8250_set_defaults(struct uart_8250_port *up);
|
||||
void serial8250_console_write(struct uart_8250_port *up, const char *s,
|
||||
unsigned int count);
|
||||
bool serial8250_console_write_atomic(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt);
|
||||
bool serial8250_console_write_thread(struct uart_8250_port *up,
|
||||
struct cons_write_context *wctxt);
|
||||
struct nbcon_write_context *wctxt);
|
||||
int serial8250_console_setup(struct uart_port *port, char *options, bool probe);
|
||||
int serial8250_console_exit(struct uart_port *port);
|
||||
|
||||
|
||||
@@ -588,6 +588,99 @@ struct uart_port {
|
||||
void *private_data; /* generic platform data pointer */
|
||||
};
|
||||
|
||||
/**
|
||||
* uart_port_lock - Lock the UART port
|
||||
* @up: Pointer to UART port structure
|
||||
*/
|
||||
static inline void uart_port_lock(struct uart_port *up)
|
||||
{
|
||||
spin_lock(&up->lock);
|
||||
nbcon_handle_port_lock(up);
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_lock_irq - Lock the UART port and disable interrupts
|
||||
* @up: Pointer to UART port structure
|
||||
*/
|
||||
static inline void uart_port_lock_irq(struct uart_port *up)
|
||||
{
|
||||
spin_lock_irq(&up->lock);
|
||||
nbcon_handle_port_lock(up);
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_lock_irqsave - Lock the UART port, save and disable interrupts
|
||||
* @up: Pointer to UART port structure
|
||||
* @flags: Pointer to interrupt flags storage
|
||||
*/
|
||||
static inline void uart_port_lock_irqsave(struct uart_port *up, unsigned long *flags)
|
||||
{
|
||||
spin_lock_irqsave(&up->lock, *flags);
|
||||
nbcon_handle_port_lock(up);
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_trylock - Try to lock the UART port
|
||||
* @up: Pointer to UART port structure
|
||||
*
|
||||
* Returns: True if lock was acquired, false otherwise
|
||||
*/
|
||||
static inline bool uart_port_trylock(struct uart_port *up)
|
||||
{
|
||||
if (!spin_trylock(&up->lock))
|
||||
return false;
|
||||
|
||||
nbcon_handle_port_lock(up);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_trylock_irqsave - Try to lock the UART port, save and disable interrupts
|
||||
* @up: Pointer to UART port structure
|
||||
* @flags: Pointer to interrupt flags storage
|
||||
*
|
||||
* Returns: True if lock was acquired, false otherwise
|
||||
*/
|
||||
static inline bool uart_port_trylock_irqsave(struct uart_port *up, unsigned long *flags)
|
||||
{
|
||||
if (!spin_trylock_irqsave(&up->lock, *flags))
|
||||
return false;
|
||||
|
||||
nbcon_handle_port_lock(up);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_unlock - Unlock the UART port
|
||||
* @up: Pointer to UART port structure
|
||||
*/
|
||||
static inline void uart_port_unlock(struct uart_port *up)
|
||||
{
|
||||
nbcon_handle_port_unlock(up);
|
||||
spin_unlock(&up->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_unlock_irq - Unlock the UART port and re-enable interrupts
|
||||
* @up: Pointer to UART port structure
|
||||
*/
|
||||
static inline void uart_port_unlock_irq(struct uart_port *up)
|
||||
{
|
||||
nbcon_handle_port_unlock(up);
|
||||
spin_unlock_irq(&up->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* uart_port_lock_irqrestore - Unlock the UART port, restore interrupts
|
||||
* @up: Pointer to UART port structure
|
||||
* @flags: The saved interrupt flags for restore
|
||||
*/
|
||||
static inline void uart_port_unlock_irqrestore(struct uart_port *up, unsigned long flags)
|
||||
{
|
||||
nbcon_handle_port_unlock(up);
|
||||
spin_unlock_irqrestore(&up->lock, flags);
|
||||
}
|
||||
|
||||
static inline int serial_port_in(struct uart_port *up, int offset)
|
||||
{
|
||||
return up->serial_in(up, offset);
|
||||
@@ -956,14 +1049,14 @@ static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
|
||||
u8 sysrq_ch;
|
||||
|
||||
if (!port->has_sysrq) {
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
return;
|
||||
}
|
||||
|
||||
sysrq_ch = port->sysrq_ch;
|
||||
port->sysrq_ch = 0;
|
||||
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
|
||||
if (sysrq_ch)
|
||||
handle_sysrq(sysrq_ch);
|
||||
@@ -975,14 +1068,14 @@ static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port
|
||||
u8 sysrq_ch;
|
||||
|
||||
if (!port->has_sysrq) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
sysrq_ch = port->sysrq_ch;
|
||||
port->sysrq_ch = 0;
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
|
||||
if (sysrq_ch)
|
||||
handle_sysrq(sysrq_ch);
|
||||
@@ -998,12 +1091,12 @@ static inline int uart_prepare_sysrq_char(struct uart_port *port, u8 ch)
|
||||
}
|
||||
static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
|
||||
{
|
||||
spin_unlock(&port->lock);
|
||||
uart_port_unlock(port);
|
||||
}
|
||||
static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port,
|
||||
unsigned long flags)
|
||||
{
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
uart_port_unlock_irqrestore(port, flags);
|
||||
}
|
||||
#endif /* CONFIG_MAGIC_SYSRQ_SERIAL */
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/context_tracking.h>
|
||||
#include <linux/console.h>
|
||||
|
||||
#include <asm/sections.h>
|
||||
|
||||
@@ -3967,9 +3968,13 @@ static void
|
||||
print_usage_bug(struct task_struct *curr, struct held_lock *this,
|
||||
enum lock_usage_bit prev_bit, enum lock_usage_bit new_bit)
|
||||
{
|
||||
enum nbcon_prio prev_prio;
|
||||
|
||||
if (!debug_locks_off() || debug_locks_silent)
|
||||
return;
|
||||
|
||||
prev_prio = nbcon_atomic_enter(NBCON_PRIO_EMERGENCY);
|
||||
|
||||
pr_warn("\n");
|
||||
pr_warn("================================\n");
|
||||
pr_warn("WARNING: inconsistent lock state\n");
|
||||
@@ -3998,6 +4003,8 @@ print_usage_bug(struct task_struct *curr, struct held_lock *this,
|
||||
|
||||
pr_warn("\nstack backtrace:\n");
|
||||
dump_stack();
|
||||
|
||||
nbcon_atomic_exit(NBCON_PRIO_EMERGENCY, prev_prio);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+66
-10
@@ -275,7 +275,7 @@ static void panic_other_cpus_shutdown(bool crash_kexec)
|
||||
*/
|
||||
void panic(const char *fmt, ...)
|
||||
{
|
||||
enum cons_prio prev_prio;
|
||||
enum nbcon_prio prev_prio;
|
||||
static char buf[1024];
|
||||
va_list args;
|
||||
long i, i_next = 0, len;
|
||||
@@ -323,7 +323,7 @@ void panic(const char *fmt, ...)
|
||||
if (old_cpu != PANIC_CPU_INVALID && old_cpu != this_cpu)
|
||||
panic_smp_self_stop();
|
||||
|
||||
prev_prio = cons_atomic_enter(CONS_PRIO_PANIC);
|
||||
prev_prio = nbcon_atomic_enter(NBCON_PRIO_PANIC);
|
||||
|
||||
console_verbose();
|
||||
bust_spinlocks(1);
|
||||
@@ -385,7 +385,7 @@ void panic(const char *fmt, ...)
|
||||
if (_crash_kexec_post_notifiers)
|
||||
__crash_kexec(NULL);
|
||||
|
||||
cons_atomic_flush(NULL, true);
|
||||
nbcon_atomic_flush_all();
|
||||
|
||||
console_unblank();
|
||||
|
||||
@@ -411,7 +411,7 @@ void panic(const char *fmt, ...)
|
||||
* We can't use the "normal" timers since we just panicked.
|
||||
*/
|
||||
pr_emerg("Rebooting in %d seconds..\n", panic_timeout);
|
||||
cons_atomic_flush(NULL, true);
|
||||
nbcon_atomic_flush_all();
|
||||
|
||||
for (i = 0; i < panic_timeout * 1000; i += PANIC_TIMER_STEP) {
|
||||
touch_nmi_watchdog();
|
||||
@@ -430,7 +430,7 @@ void panic(const char *fmt, ...)
|
||||
*/
|
||||
if (panic_reboot_mode != REBOOT_UNDEFINED)
|
||||
reboot_mode = panic_reboot_mode;
|
||||
cons_atomic_flush(NULL, true);
|
||||
nbcon_atomic_flush_all();
|
||||
emergency_restart();
|
||||
}
|
||||
#ifdef __sparc__
|
||||
@@ -443,7 +443,7 @@ void panic(const char *fmt, ...)
|
||||
}
|
||||
#endif
|
||||
#if defined(CONFIG_S390)
|
||||
cons_atomic_flush(NULL, true);
|
||||
nbcon_atomic_flush_all();
|
||||
disabled_wait();
|
||||
#endif
|
||||
pr_emerg("---[ end Kernel panic - not syncing: %s ]---\n", buf);
|
||||
@@ -451,7 +451,7 @@ void panic(const char *fmt, ...)
|
||||
/* Do not scroll important messages printed above */
|
||||
suppress_printk = 1;
|
||||
|
||||
cons_atomic_exit(CONS_PRIO_PANIC, prev_prio);
|
||||
nbcon_atomic_exit(NBCON_PRIO_PANIC, prev_prio);
|
||||
|
||||
local_irq_enable();
|
||||
for (i = 0; ; i += PANIC_TIMER_STEP) {
|
||||
@@ -614,6 +614,10 @@ bool oops_may_print(void)
|
||||
return pause_on_oops_flag == 0;
|
||||
}
|
||||
|
||||
static int oops_printing_cpu = -1;
|
||||
static int oops_nesting;
|
||||
static enum nbcon_prio oops_prev_prio;
|
||||
|
||||
/*
|
||||
* Called when the architecture enters its oops handler, before it prints
|
||||
* anything. If this is the first CPU to oops, and it's oopsing the first
|
||||
@@ -630,6 +634,38 @@ bool oops_may_print(void)
|
||||
*/
|
||||
void oops_enter(void)
|
||||
{
|
||||
enum nbcon_prio prev_prio;
|
||||
int cur_cpu = get_cpu();
|
||||
int old_cpu = -1;
|
||||
|
||||
/*
|
||||
* If this turns out to be the first CPU in oops, this is the
|
||||
* beginning of the outermost atomic printing section. Otherwise
|
||||
* it is the beginning of an inner atomic printing section.
|
||||
*/
|
||||
prev_prio = nbcon_atomic_enter(NBCON_PRIO_EMERGENCY);
|
||||
|
||||
old_cpu = cmpxchg(&oops_printing_cpu, old_cpu, cur_cpu);
|
||||
if (old_cpu == -1) {
|
||||
/*
|
||||
* This is the first CPU in oops so it will be the printer.
|
||||
* Save the outermost @prev_prio in order to restore it on the
|
||||
* outermost matching oops_exit(), when @oops_nesting == 0.
|
||||
*/
|
||||
oops_prev_prio = prev_prio;
|
||||
|
||||
/*
|
||||
* Enter an inner atomic printing section that ends at the end
|
||||
* of this function. In this case, the nbcon_atomic_enter()
|
||||
* above began the outermost atomic printing section.
|
||||
*/
|
||||
prev_prio = nbcon_atomic_enter(NBCON_PRIO_EMERGENCY);
|
||||
}
|
||||
|
||||
/* Track nesting when this CPU is the printer. */
|
||||
if (old_cpu == -1 || old_cpu == cur_cpu)
|
||||
oops_nesting++;
|
||||
|
||||
tracing_off();
|
||||
/* can't trust the integrity of the kernel anymore: */
|
||||
debug_locks_off();
|
||||
@@ -637,6 +673,9 @@ void oops_enter(void)
|
||||
|
||||
if (sysctl_oops_all_cpu_backtrace)
|
||||
trigger_all_cpu_backtrace();
|
||||
|
||||
/* Exit inner atomic printing section. */
|
||||
nbcon_atomic_exit(NBCON_PRIO_EMERGENCY, prev_prio);
|
||||
}
|
||||
|
||||
static void print_oops_end_marker(void)
|
||||
@@ -652,6 +691,23 @@ void oops_exit(void)
|
||||
{
|
||||
do_oops_enter_exit();
|
||||
print_oops_end_marker();
|
||||
|
||||
/*
|
||||
* Reading @oops_printing_cpu is a data race if this CPU is not the
|
||||
* printer. But that is OK because in that situation the condition
|
||||
* will correctly evaluate to false regardless which value was read.
|
||||
*/
|
||||
if (oops_printing_cpu == smp_processor_id()) {
|
||||
oops_nesting--;
|
||||
if (oops_nesting == 0) {
|
||||
oops_printing_cpu = -1;
|
||||
|
||||
/* Exit outermost atomic printing section. */
|
||||
nbcon_atomic_exit(NBCON_PRIO_EMERGENCY, oops_prev_prio);
|
||||
}
|
||||
}
|
||||
put_cpu();
|
||||
|
||||
kmsg_dump(KMSG_DUMP_OOPS);
|
||||
}
|
||||
|
||||
@@ -663,9 +719,9 @@ struct warn_args {
|
||||
void __warn(const char *file, int line, void *caller, unsigned taint,
|
||||
struct pt_regs *regs, struct warn_args *args)
|
||||
{
|
||||
enum cons_prio prev_prio;
|
||||
enum nbcon_prio prev_prio;
|
||||
|
||||
prev_prio = cons_atomic_enter(CONS_PRIO_EMERGENCY);
|
||||
prev_prio = nbcon_atomic_enter(NBCON_PRIO_EMERGENCY);
|
||||
|
||||
disable_trace_on_warning();
|
||||
|
||||
@@ -698,7 +754,7 @@ void __warn(const char *file, int line, void *caller, unsigned taint,
|
||||
/* Just a warning, don't kill lockdep. */
|
||||
add_taint(taint, LOCKDEP_STILL_OK);
|
||||
|
||||
cons_atomic_exit(CONS_PRIO_EMERGENCY, prev_prio);
|
||||
nbcon_atomic_exit(NBCON_PRIO_EMERGENCY, prev_prio);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-y = printk.o
|
||||
obj-$(CONFIG_PRINTK) += printk_safe.o printk_nobkl.o
|
||||
obj-$(CONFIG_PRINTK) += printk_safe.o nbcon.o
|
||||
obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o
|
||||
obj-$(CONFIG_PRINTK_INDEX) += index.o
|
||||
|
||||
|
||||
+75
-78
@@ -16,11 +16,12 @@ int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write,
|
||||
|
||||
#define con_printk(lvl, con, fmt, ...) \
|
||||
printk(lvl pr_fmt("%s%sconsole [%s%d] " fmt), \
|
||||
(con->flags & CON_NO_BKL) ? "" : "legacy ", \
|
||||
(con->flags & CON_BOOT) ? "boot" : "", \
|
||||
con->name, con->index, ##__VA_ARGS__)
|
||||
(con->flags & CON_NBCON) ? "" : "legacy ", \
|
||||
(con->flags & CON_BOOT) ? "boot" : "", \
|
||||
con->name, con->index, ##__VA_ARGS__)
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
||||
#ifdef CONFIG_PRINTK_CALLER
|
||||
#define PRINTK_PREFIX_MAX 48
|
||||
#else
|
||||
@@ -43,11 +44,18 @@ enum printk_info_flags {
|
||||
};
|
||||
|
||||
extern struct printk_ringbuffer *prb;
|
||||
extern bool have_bkl_console;
|
||||
extern bool printk_threads_enabled;
|
||||
|
||||
extern bool have_legacy_console;
|
||||
extern bool have_boot_console;
|
||||
|
||||
/*
|
||||
* Specifies if the console lock/unlock dance is needed for console
|
||||
* printing. If @have_boot_console is true, the nbcon consoles will
|
||||
* be printed serially along with the legacy consoles because nbcon
|
||||
* consoles cannot print simultaneously with boot consoles.
|
||||
*/
|
||||
#define serialized_printing (have_legacy_console || have_boot_console)
|
||||
|
||||
__printf(4, 0)
|
||||
int vprintk_store(int facility, int level,
|
||||
const struct dev_printk_info *dev_info,
|
||||
@@ -58,24 +66,16 @@ __printf(1, 0) int vprintk_deferred(const char *fmt, va_list args);
|
||||
|
||||
bool printk_percpu_data_ready(void);
|
||||
|
||||
/*
|
||||
* The printk_safe_enter()/_exit() macros mark code blocks using locks that
|
||||
* would lead to deadlock if an interrupting context were to call printk()
|
||||
* while the interrupted context was within such code blocks.
|
||||
*
|
||||
* When a CPU is in such a code block, an interrupting context calling
|
||||
* printk() will only log the new message to the lockless ringbuffer and
|
||||
* then trigger console printing using irqwork.
|
||||
*/
|
||||
|
||||
#define printk_safe_enter_irqsave(flags) \
|
||||
do { \
|
||||
__printk_safe_enter(&flags); \
|
||||
local_irq_save(flags); \
|
||||
__printk_safe_enter(); \
|
||||
} while (0)
|
||||
|
||||
#define printk_safe_exit_irqrestore(flags) \
|
||||
do { \
|
||||
__printk_safe_exit(&flags); \
|
||||
__printk_safe_exit(); \
|
||||
local_irq_restore(flags); \
|
||||
} while (0)
|
||||
|
||||
void defer_console_output(void);
|
||||
@@ -83,22 +83,23 @@ void defer_console_output(void);
|
||||
u16 printk_parse_prefix(const char *text, int *level,
|
||||
enum printk_info_flags *flags);
|
||||
|
||||
u64 cons_read_seq(struct console *con);
|
||||
void cons_nobkl_cleanup(struct console *con);
|
||||
bool cons_nobkl_init(struct console *con);
|
||||
bool cons_alloc_percpu_data(struct console *con);
|
||||
void cons_kthread_create(struct console *con);
|
||||
void cons_wake_threads(void);
|
||||
void cons_force_seq(struct console *con, u64 seq);
|
||||
void console_bkl_kthread_create(void);
|
||||
u64 nbcon_seq_read(struct console *con);
|
||||
void nbcon_seq_force(struct console *con, u64 seq);
|
||||
bool nbcon_alloc(struct console *con);
|
||||
void nbcon_init(struct console *con);
|
||||
void nbcon_free(struct console *con);
|
||||
bool nbcon_console_emit_next_record(struct console *con);
|
||||
void nbcon_kthread_create(struct console *con);
|
||||
void nbcon_wake_threads(void);
|
||||
void nbcon_legacy_kthread_create(void);
|
||||
|
||||
/*
|
||||
* Check if the given console is currently capable and allowed to print
|
||||
* records. If the caller only works with certain types of consoles, the
|
||||
* caller is responsible for checking the console type before calling
|
||||
* this function.
|
||||
* records. Note that this function does not consider the current context,
|
||||
* which can also play a role in deciding if @con can be used to print
|
||||
* records.
|
||||
*/
|
||||
static inline bool console_is_usable(struct console *con, short flags)
|
||||
static inline bool console_is_usable(struct console *con, short flags, bool use_atomic)
|
||||
{
|
||||
if (!(flags & CON_ENABLED))
|
||||
return false;
|
||||
@@ -106,38 +107,48 @@ static inline bool console_is_usable(struct console *con, short flags)
|
||||
if ((flags & CON_SUSPENDED))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* The usability of a console varies depending on whether
|
||||
* it is a NOBKL console or not.
|
||||
*/
|
||||
|
||||
if (flags & CON_NO_BKL) {
|
||||
if (have_boot_console)
|
||||
return false;
|
||||
|
||||
if (flags & CON_NBCON) {
|
||||
if (use_atomic) {
|
||||
if (!con->write_atomic)
|
||||
return false;
|
||||
} else {
|
||||
if (!con->write_thread || !con->kthread)
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!con->write)
|
||||
return false;
|
||||
/*
|
||||
* Console drivers may assume that per-cpu resources have
|
||||
* been allocated. So unless they're explicitly marked as
|
||||
* being able to cope (CON_ANYTIME) don't call them until
|
||||
* this CPU is officially up.
|
||||
*/
|
||||
if (!cpu_online(raw_smp_processor_id()) && !(flags & CON_ANYTIME))
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Console drivers may assume that per-cpu resources have been
|
||||
* allocated. So unless they're explicitly marked as being able to
|
||||
* cope (CON_ANYTIME) don't call them until this CPU is officially up.
|
||||
*/
|
||||
if (!cpu_online(raw_smp_processor_id()) && !(flags & CON_ANYTIME))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* cons_kthread_wake - Wake up a printk thread
|
||||
* nbcon_kthread_wake - Wake up a printk thread
|
||||
* @con: Console to operate on
|
||||
*/
|
||||
static inline void cons_kthread_wake(struct console *con)
|
||||
static inline void nbcon_kthread_wake(struct console *con)
|
||||
{
|
||||
rcuwait_wake_up(&con->rcuwait);
|
||||
/*
|
||||
* Guarantee any new records can be seen by tasks preparing to wait
|
||||
* before this context checks if the rcuwait is empty.
|
||||
*
|
||||
* The full memory barrier in rcuwait_wake_up() pairs with the full
|
||||
* memory barrier within set_current_state() of
|
||||
* ___rcuwait_wait_event(), which is called after prepare_to_rcuwait()
|
||||
* adds the waiter but before it has checked the wait condition.
|
||||
*
|
||||
* This pairs with nbcon_kthread_func:A.
|
||||
*/
|
||||
rcuwait_wake_up(&con->rcuwait); /* LMM(nbcon_kthread_wake:A) */
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -146,9 +157,10 @@ static inline void cons_kthread_wake(struct console *con)
|
||||
#define PRINTK_MESSAGE_MAX 0
|
||||
#define PRINTKRB_RECORD_MAX 0
|
||||
|
||||
static inline void cons_kthread_wake(struct console *con) { }
|
||||
static inline void cons_kthread_create(struct console *con) { }
|
||||
#define printk_threads_enabled (false)
|
||||
static inline void nbcon_kthread_wake(struct console *con) { }
|
||||
static inline void nbcon_kthread_create(struct console *con) { }
|
||||
#define printk_threads_enabled (false)
|
||||
#define serialized_printing (false)
|
||||
|
||||
/*
|
||||
* In !PRINTK builds we still export console_sem
|
||||
@@ -159,14 +171,18 @@ static inline void cons_kthread_create(struct console *con) { }
|
||||
#define printk_safe_exit_irqrestore(flags) local_irq_restore(flags)
|
||||
|
||||
static inline bool printk_percpu_data_ready(void) { return false; }
|
||||
static inline bool cons_nobkl_init(struct console *con) { return true; }
|
||||
static inline void cons_nobkl_cleanup(struct console *con) { }
|
||||
static inline bool console_is_usable(struct console *con, short flags) { return false; }
|
||||
static inline void cons_force_seq(struct console *con, u64 seq) { }
|
||||
static inline u64 nbcon_seq_read(struct console *con) { return 0; }
|
||||
static inline void nbcon_seq_force(struct console *con, u64 seq) { }
|
||||
static inline bool nbcon_alloc(struct console *con) { return false; }
|
||||
static inline void nbcon_init(struct console *con) { }
|
||||
static inline void nbcon_free(struct console *con) { }
|
||||
static bool nbcon_console_emit_next_record(struct console *con) { return false; }
|
||||
|
||||
static inline bool console_is_usable(struct console *con, short flags, bool use_atomic) { return false; }
|
||||
|
||||
#endif /* CONFIG_PRINTK */
|
||||
|
||||
extern bool have_boot_console;
|
||||
extern struct printk_buffers printk_shared_pbufs;
|
||||
|
||||
/**
|
||||
* struct printk_buffers - Buffers to read/format/output printk messages.
|
||||
@@ -194,29 +210,10 @@ struct printk_message {
|
||||
unsigned long dropped;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cons_context_data - console context data
|
||||
* @wctxt: Write context per priority level
|
||||
* @pbufs: Buffer for storing the text
|
||||
*
|
||||
* Used for early boot and for per CPU data.
|
||||
*
|
||||
* The write contexts are allocated to avoid having them on stack, e.g. in
|
||||
* warn() or panic().
|
||||
*/
|
||||
struct cons_context_data {
|
||||
struct cons_write_context wctxt[CONS_PRIO_MAX];
|
||||
struct printk_buffers pbufs;
|
||||
};
|
||||
|
||||
bool other_cpu_in_panic(void);
|
||||
bool printk_get_next_message(struct printk_message *pmsg, u64 seq,
|
||||
bool is_extended, bool may_supress);
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
||||
void console_prepend_dropped(struct printk_message *pmsg,
|
||||
unsigned long dropped);
|
||||
|
||||
void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped);
|
||||
#endif
|
||||
|
||||
bool other_cpu_in_panic(void);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+265
-230
@@ -102,12 +102,6 @@ DEFINE_STATIC_SRCU(console_srcu);
|
||||
*/
|
||||
int __read_mostly suppress_printk;
|
||||
|
||||
/*
|
||||
* During panic, heavy printk by other CPUs can delay the
|
||||
* panic and risk deadlock on console resources.
|
||||
*/
|
||||
static int __read_mostly suppress_panic_printk;
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
static struct lockdep_map console_lock_dep_map = {
|
||||
.name = "console_lock"
|
||||
@@ -445,22 +439,28 @@ static int console_msg_format = MSG_FORMAT_DEFAULT;
|
||||
static DEFINE_MUTEX(syslog_lock);
|
||||
|
||||
/*
|
||||
* Specifies if a BKL console was ever registered. Used to determine if the
|
||||
* console lock/unlock dance is needed for console printing.
|
||||
* Specifies if a legacy console is registered. See serialized_printing
|
||||
* for details.
|
||||
*/
|
||||
bool have_bkl_console;
|
||||
bool have_legacy_console;
|
||||
|
||||
/*
|
||||
* Specifies if a boot console is registered. Used to determine if NOBKL
|
||||
* consoles may be used since NOBKL consoles cannot synchronize with boot
|
||||
* consoles.
|
||||
* Specifies if a boot console is registered. See serialized_printing
|
||||
* for details.
|
||||
*/
|
||||
bool have_boot_console;
|
||||
|
||||
static int unregister_console_locked(struct console *console);
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
/*
|
||||
* During panic, heavy printk by other CPUs can delay the
|
||||
* panic and risk deadlock on console resources.
|
||||
*/
|
||||
static int __read_mostly suppress_panic_printk;
|
||||
|
||||
DECLARE_WAIT_QUEUE_HEAD(log_wait);
|
||||
|
||||
DECLARE_WAIT_QUEUE_HEAD(legacy_wait);
|
||||
|
||||
/* All 3 protected by @syslog_lock. */
|
||||
/* the next printk record to read by syslog(READ) or /proc/kmsg */
|
||||
static u64 syslog_seq;
|
||||
@@ -1103,19 +1103,7 @@ static inline void log_buf_add_cpu(void) {}
|
||||
|
||||
static void __init set_percpu_data_ready(void)
|
||||
{
|
||||
struct hlist_node *tmp;
|
||||
struct console *con;
|
||||
|
||||
console_list_lock();
|
||||
|
||||
hlist_for_each_entry_safe(con, tmp, &console_list, node) {
|
||||
if (!cons_alloc_percpu_data(con))
|
||||
unregister_console_locked(con);
|
||||
}
|
||||
|
||||
__printk_percpu_data_ready = true;
|
||||
|
||||
console_list_unlock();
|
||||
}
|
||||
|
||||
static unsigned int __init add_to_rb(struct printk_ringbuffer *rb,
|
||||
@@ -2291,9 +2279,8 @@ asmlinkage int vprintk_emit(int facility, int level,
|
||||
const struct dev_printk_info *dev_info,
|
||||
const char *fmt, va_list args)
|
||||
{
|
||||
struct cons_write_context wctxt = { };
|
||||
bool print_direct = serialized_printing && !IS_ENABLED(CONFIG_PREEMPT_RT);
|
||||
int printed_len;
|
||||
bool in_sched = false;
|
||||
|
||||
/* Suppress unimportant messages after panic happens */
|
||||
if (unlikely(suppress_printk))
|
||||
@@ -2305,32 +2292,25 @@ asmlinkage int vprintk_emit(int facility, int level,
|
||||
|
||||
if (level == LOGLEVEL_SCHED) {
|
||||
level = LOGLEVEL_DEFAULT;
|
||||
in_sched = true;
|
||||
/* If called from the scheduler, we can not call up(). */
|
||||
print_direct = false;
|
||||
}
|
||||
|
||||
printk_delay(level);
|
||||
|
||||
printed_len = vprintk_store(facility, level, dev_info, fmt, args);
|
||||
|
||||
/*
|
||||
* The caller may be holding system-critical or
|
||||
* timing-sensitive locks. Disable preemption during
|
||||
* printing of all remaining records to all consoles so that
|
||||
* this context can return as soon as possible. Hopefully
|
||||
* another printk() caller will take over the printing.
|
||||
*/
|
||||
preempt_disable();
|
||||
nbcon_wake_threads();
|
||||
|
||||
/*
|
||||
* Flush the non-BKL consoles. This only leads to direct atomic
|
||||
* printing for non-BKL consoles that do not have a printer
|
||||
* thread available. Otherwise the printer thread will perform
|
||||
* the printing.
|
||||
*/
|
||||
cons_atomic_flush(&wctxt, true);
|
||||
|
||||
/* If called from the scheduler, we can not call up(). */
|
||||
if (!in_sched && have_bkl_console && !IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
if (print_direct) {
|
||||
/*
|
||||
* The caller may be holding system-critical or
|
||||
* timing-sensitive locks. Disable preemption during
|
||||
* printing of all remaining records to all consoles so that
|
||||
* this context can return as soon as possible. Hopefully
|
||||
* another printk() caller will take over the printing.
|
||||
*/
|
||||
preempt_disable();
|
||||
/*
|
||||
* Try to acquire and then immediately release the console
|
||||
* semaphore. The release will print out buffers. With the
|
||||
@@ -2339,15 +2319,11 @@ asmlinkage int vprintk_emit(int facility, int level,
|
||||
*/
|
||||
if (console_trylock_spinning())
|
||||
console_unlock();
|
||||
}
|
||||
preempt_enable();
|
||||
|
||||
preempt_enable();
|
||||
|
||||
cons_wake_threads();
|
||||
if (in_sched)
|
||||
} else {
|
||||
defer_console_output();
|
||||
else
|
||||
wake_up_klogd();
|
||||
}
|
||||
|
||||
return printed_len;
|
||||
}
|
||||
@@ -2375,6 +2351,14 @@ EXPORT_SYMBOL(_printk);
|
||||
static bool pr_flush(int timeout_ms, bool reset_on_progress);
|
||||
static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progress);
|
||||
|
||||
static struct task_struct *nbcon_legacy_kthread;
|
||||
|
||||
static inline void wake_up_legacy_kthread(void)
|
||||
{
|
||||
if (nbcon_legacy_kthread)
|
||||
wake_up_interruptible(&legacy_wait);
|
||||
}
|
||||
|
||||
#else /* CONFIG_PRINTK */
|
||||
|
||||
#define printk_time false
|
||||
@@ -2385,25 +2369,10 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
|
||||
|
||||
static u64 syslog_seq;
|
||||
|
||||
static size_t record_print_text(const struct printk_record *r,
|
||||
bool syslog, bool time)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static ssize_t info_print_ext_header(char *buf, size_t size,
|
||||
struct printk_info *info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static ssize_t msg_print_ext_body(char *buf, size_t size,
|
||||
char *text, size_t text_len,
|
||||
struct dev_printk_info *dev_info) { return 0; }
|
||||
static void console_lock_spinning_enable(void) { }
|
||||
static int console_lock_spinning_disable_and_check(int cookie) { return 0; }
|
||||
static bool suppress_message_printing(int level) { return false; }
|
||||
static bool pr_flush(int timeout_ms, bool reset_on_progress) { return true; }
|
||||
static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progress) { return true; }
|
||||
|
||||
static inline void nbcon_legacy_kthread_create(void) { }
|
||||
static inline void wake_up_legacy_kthread(void) { }
|
||||
#endif /* CONFIG_PRINTK */
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
@@ -2629,16 +2598,20 @@ void resume_console(void)
|
||||
*/
|
||||
synchronize_srcu(&console_srcu);
|
||||
|
||||
/*
|
||||
* Since this runs in task context, wake the threaded printers
|
||||
* directly rather than scheduling irq_work to do it.
|
||||
*/
|
||||
|
||||
cookie = console_srcu_read_lock();
|
||||
for_each_console_srcu(con) {
|
||||
flags = console_srcu_read_flags(con);
|
||||
if (flags & CON_NO_BKL)
|
||||
cons_kthread_wake(con);
|
||||
if (flags & CON_NBCON)
|
||||
nbcon_kthread_wake(con);
|
||||
}
|
||||
console_srcu_read_unlock(cookie);
|
||||
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RT) && have_bkl_console)
|
||||
wake_up_interruptible(&log_wait);
|
||||
wake_up_legacy_kthread();
|
||||
|
||||
pr_flush(1000, true);
|
||||
}
|
||||
@@ -2654,7 +2627,8 @@ void resume_console(void)
|
||||
*/
|
||||
static int console_cpu_notify(unsigned int cpu)
|
||||
{
|
||||
if (!cpuhp_tasks_frozen && have_bkl_console) {
|
||||
if (!cpuhp_tasks_frozen && serialized_printing &&
|
||||
!IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
/* If trylock fails, someone else is doing the printing */
|
||||
if (console_trylock())
|
||||
console_unlock();
|
||||
@@ -2737,6 +2711,8 @@ static void __console_unlock(void)
|
||||
up_console_sem();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
||||
/*
|
||||
* Prepend the message in @pmsg->pbufs->outbuf with a "dropped message". This
|
||||
* is achieved by shifting the existing message over and inserting the dropped
|
||||
@@ -2751,7 +2727,6 @@ static void __console_unlock(void)
|
||||
*
|
||||
* If @pmsg->pbufs->outbuf is modified, @pmsg->outbuf_len is updated.
|
||||
*/
|
||||
#ifdef CONFIG_PRINTK
|
||||
void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped)
|
||||
{
|
||||
struct printk_buffers *pbufs = pmsg->pbufs;
|
||||
@@ -2783,10 +2758,6 @@ void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped)
|
||||
memcpy(outbuf, scratchbuf, len);
|
||||
pmsg->outbuf_len += len;
|
||||
}
|
||||
#else
|
||||
static inline void console_prepend_dropped(struct printk_message *pmsg,
|
||||
unsigned long dropped) { }
|
||||
#endif /* CONFIG_PRINTK */
|
||||
|
||||
/*
|
||||
* Read and format the specified record (or a later record if the specified
|
||||
@@ -2866,6 +2837,13 @@ out:
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used as the printk buffers for non-panic, serialized console printing.
|
||||
* This is for legacy (!CON_NBCON) as well as all boot (CON_BOOT) consoles.
|
||||
* Its usage requires the console_lock held.
|
||||
*/
|
||||
struct printk_buffers printk_shared_pbufs;
|
||||
|
||||
/*
|
||||
* Print one record for the given console. The record printed is whatever
|
||||
* record is the next available record for the given console.
|
||||
@@ -2883,12 +2861,10 @@ out:
|
||||
*/
|
||||
static bool console_emit_next_record(struct console *con, bool *handover, int cookie)
|
||||
{
|
||||
static struct printk_buffers pbufs;
|
||||
|
||||
bool is_extended = console_srcu_read_flags(con) & CON_EXTENDED;
|
||||
char *outbuf = &pbufs.outbuf[0];
|
||||
char *outbuf = &printk_shared_pbufs.outbuf[0];
|
||||
struct printk_message pmsg = {
|
||||
.pbufs = &pbufs,
|
||||
.pbufs = &printk_shared_pbufs,
|
||||
};
|
||||
unsigned long flags;
|
||||
|
||||
@@ -2910,35 +2886,52 @@ static bool console_emit_next_record(struct console *con, bool *handover, int co
|
||||
con->dropped = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* While actively printing out messages, if another printk()
|
||||
* were to occur on another CPU, it may wait for this one to
|
||||
* finish. This task can not be preempted if there is a
|
||||
* waiter waiting to take over.
|
||||
*
|
||||
* Interrupts are disabled because the hand over to a waiter
|
||||
* must not be interrupted until the hand over is completed
|
||||
* (@console_waiter is cleared).
|
||||
*/
|
||||
printk_safe_enter_irqsave(flags);
|
||||
console_lock_spinning_enable();
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
/*
|
||||
* While actively printing out messages, if another printk()
|
||||
* were to occur on another CPU, it may wait for this one to
|
||||
* finish. This task can not be preempted if there is a
|
||||
* waiter waiting to take over.
|
||||
*
|
||||
* Interrupts are disabled because the hand over to a waiter
|
||||
* must not be interrupted until the hand over is completed
|
||||
* (@console_waiter is cleared).
|
||||
*/
|
||||
printk_safe_enter_irqsave(flags);
|
||||
console_lock_spinning_enable();
|
||||
|
||||
/* Do not trace print latency. */
|
||||
stop_critical_timings();
|
||||
/* Do not trace print latency. */
|
||||
stop_critical_timings();
|
||||
}
|
||||
|
||||
/* Write everything out to the hardware. */
|
||||
con->write(con, outbuf, pmsg.outbuf_len);
|
||||
|
||||
start_critical_timings();
|
||||
|
||||
con->seq = pmsg.seq + 1;
|
||||
|
||||
*handover = console_lock_spinning_disable_and_check(cookie);
|
||||
printk_safe_exit_irqrestore(flags);
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
*handover = false;
|
||||
} else {
|
||||
start_critical_timings();
|
||||
|
||||
*handover = console_lock_spinning_disable_and_check(cookie);
|
||||
|
||||
printk_safe_exit_irqrestore(flags);
|
||||
}
|
||||
skip:
|
||||
return true;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static bool console_emit_next_record(struct console *con, bool *handover, int cookie)
|
||||
{
|
||||
*handover = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PRINTK */
|
||||
|
||||
/*
|
||||
* Print out all remaining records to all consoles.
|
||||
*
|
||||
@@ -2978,28 +2971,39 @@ static bool console_flush_all(bool do_cond_resched, u64 *next_seq, bool *handove
|
||||
cookie = console_srcu_read_lock();
|
||||
for_each_console_srcu(con) {
|
||||
short flags = console_srcu_read_flags(con);
|
||||
u64 printk_seq;
|
||||
bool progress;
|
||||
|
||||
/* console_flush_all() is only for legacy consoles. */
|
||||
if (flags & CON_NO_BKL)
|
||||
/*
|
||||
* console_flush_all() is only for legacy consoles,
|
||||
* unless the nbcon console has no kthread printer.
|
||||
*/
|
||||
if ((flags & CON_NBCON) && con->kthread)
|
||||
continue;
|
||||
|
||||
if (!console_is_usable(con, flags))
|
||||
if (!console_is_usable(con, flags, true))
|
||||
continue;
|
||||
any_usable = true;
|
||||
|
||||
progress = console_emit_next_record(con, handover, cookie);
|
||||
if (flags & CON_NBCON) {
|
||||
progress = nbcon_console_emit_next_record(con);
|
||||
printk_seq = nbcon_seq_read(con);
|
||||
} else {
|
||||
progress = console_emit_next_record(con, handover, cookie);
|
||||
|
||||
/*
|
||||
* If a handover has occurred, the SRCU read lock
|
||||
* is already released.
|
||||
*/
|
||||
if (*handover)
|
||||
return false;
|
||||
/*
|
||||
* If a handover has occurred, the SRCU read
|
||||
* lock is already released.
|
||||
*/
|
||||
if (*handover)
|
||||
return false;
|
||||
|
||||
printk_seq = con->seq;
|
||||
}
|
||||
|
||||
/* Track the next of the highest seq flushed. */
|
||||
if (con->seq > *next_seq)
|
||||
*next_seq = con->seq;
|
||||
if (printk_seq > *next_seq)
|
||||
*next_seq = printk_seq;
|
||||
|
||||
if (!progress)
|
||||
continue;
|
||||
@@ -3118,9 +3122,6 @@ void console_unblank(void)
|
||||
struct console *c;
|
||||
int cookie;
|
||||
|
||||
if (!have_bkl_console)
|
||||
return;
|
||||
|
||||
/*
|
||||
* First check if there are any consoles implementing the unblank()
|
||||
* callback. If not, there is no reason to continue and take the
|
||||
@@ -3185,32 +3186,8 @@ void console_unblank(void)
|
||||
*/
|
||||
void console_flush_on_panic(enum con_flush_mode mode)
|
||||
{
|
||||
struct console *c;
|
||||
bool handover;
|
||||
u64 next_seq;
|
||||
short flags;
|
||||
int cookie;
|
||||
u64 seq;
|
||||
|
||||
seq = prb_first_valid_seq(prb);
|
||||
|
||||
/*
|
||||
* Safely flush the atomic consoles before trying to flush any
|
||||
* BKL/legacy consoles.
|
||||
*/
|
||||
if (mode == CONSOLE_REPLAY_ALL) {
|
||||
cookie = console_srcu_read_lock();
|
||||
for_each_console_srcu(c) {
|
||||
flags = console_srcu_read_flags(c);
|
||||
if (flags & CON_NO_BKL)
|
||||
cons_force_seq(c, seq);
|
||||
}
|
||||
console_srcu_read_unlock(cookie);
|
||||
}
|
||||
cons_atomic_flush(NULL, true);
|
||||
|
||||
if (!have_bkl_console)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Ignore the console lock and flush out the messages. Attempting a
|
||||
@@ -3230,18 +3207,34 @@ void console_flush_on_panic(enum con_flush_mode mode)
|
||||
console_may_schedule = 0;
|
||||
|
||||
if (mode == CONSOLE_REPLAY_ALL) {
|
||||
struct console *c;
|
||||
short flags;
|
||||
int cookie;
|
||||
u64 seq;
|
||||
|
||||
seq = prb_first_valid_seq(prb);
|
||||
|
||||
cookie = console_srcu_read_lock();
|
||||
for_each_console_srcu(c) {
|
||||
/*
|
||||
* This is an unsynchronized assignment, but the
|
||||
* kernel is in "hope and pray" mode anyway.
|
||||
*/
|
||||
c->seq = seq;
|
||||
flags = console_srcu_read_flags(c);
|
||||
|
||||
if (flags & CON_NBCON) {
|
||||
nbcon_seq_force(c, seq);
|
||||
} else {
|
||||
/*
|
||||
* This is an unsynchronized assignment. On
|
||||
* panic legacy consoles are only best effort.
|
||||
*/
|
||||
c->seq = seq;
|
||||
}
|
||||
}
|
||||
console_srcu_read_unlock(cookie);
|
||||
}
|
||||
|
||||
console_flush_all(false, &next_seq, &handover);
|
||||
nbcon_atomic_flush_all();
|
||||
|
||||
if (serialized_printing)
|
||||
console_flush_all(false, &next_seq, &handover);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3312,17 +3305,16 @@ void console_start(struct console *console)
|
||||
*/
|
||||
synchronize_srcu(&console_srcu);
|
||||
|
||||
if (flags & CON_NO_BKL)
|
||||
cons_kthread_wake(console);
|
||||
else if (IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
wake_up_interruptible(&log_wait);
|
||||
if (flags & CON_NBCON)
|
||||
nbcon_kthread_wake(console);
|
||||
else
|
||||
wake_up_legacy_kthread();
|
||||
|
||||
__pr_flush(console, 1000, true);
|
||||
}
|
||||
EXPORT_SYMBOL(console_start);
|
||||
|
||||
static struct task_struct *console_bkl_kthread;
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
static bool printer_should_wake(u64 seq)
|
||||
{
|
||||
bool available = false;
|
||||
@@ -3336,9 +3328,9 @@ static bool printer_should_wake(u64 seq)
|
||||
for_each_console_srcu(con) {
|
||||
short flags = console_srcu_read_flags(con);
|
||||
|
||||
if (flags & CON_NO_BKL)
|
||||
if (flags & CON_NBCON)
|
||||
continue;
|
||||
if (!console_is_usable(con, flags))
|
||||
if (!console_is_usable(con, flags, true))
|
||||
continue;
|
||||
/*
|
||||
* It is safe to read @seq because only this
|
||||
@@ -3354,13 +3346,13 @@ static bool printer_should_wake(u64 seq)
|
||||
return available;
|
||||
}
|
||||
|
||||
static int console_bkl_kthread_func(void *unused)
|
||||
static int nbcon_legacy_kthread_func(void *unused)
|
||||
{
|
||||
u64 seq = 0;
|
||||
int error;
|
||||
|
||||
for (;;) {
|
||||
error = wait_event_interruptible(log_wait, printer_should_wake(seq));
|
||||
error = wait_event_interruptible(legacy_wait, printer_should_wake(seq));
|
||||
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
@@ -3374,38 +3366,33 @@ static int console_bkl_kthread_func(void *unused)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void console_bkl_kthread_create(void)
|
||||
void nbcon_legacy_kthread_create(void)
|
||||
{
|
||||
struct task_struct *kt;
|
||||
struct console *c;
|
||||
|
||||
lockdep_assert_held(&console_mutex);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
return;
|
||||
|
||||
if (!printk_threads_enabled || console_bkl_kthread)
|
||||
if (!printk_threads_enabled || nbcon_legacy_kthread)
|
||||
return;
|
||||
|
||||
for_each_console(c) {
|
||||
if (c->flags & CON_BOOT)
|
||||
return;
|
||||
}
|
||||
|
||||
kt = kthread_run(console_bkl_kthread_func, NULL, "pr/bkl");
|
||||
kt = kthread_run(nbcon_legacy_kthread_func, NULL, "pr/legacy");
|
||||
if (IS_ERR(kt)) {
|
||||
pr_err("unable to start BKL printing thread\n");
|
||||
pr_err("unable to start legacy printing thread\n");
|
||||
return;
|
||||
}
|
||||
|
||||
console_bkl_kthread = kt;
|
||||
nbcon_legacy_kthread = kt;
|
||||
|
||||
/*
|
||||
* It is important that console printing threads are scheduled
|
||||
* shortly after a printk call and with generous runtime budgets.
|
||||
*/
|
||||
sched_set_normal(console_bkl_kthread, -20);
|
||||
sched_set_normal(nbcon_legacy_kthread, -20);
|
||||
}
|
||||
#endif /* CONFIG_PRINTK */
|
||||
|
||||
static int __read_mostly keep_bootcon;
|
||||
|
||||
@@ -3554,6 +3541,8 @@ static void console_init_seq(struct console *newcon, bool bootcon_registered)
|
||||
#define console_first() \
|
||||
hlist_entry(console_list.first, struct console, node)
|
||||
|
||||
static int unregister_console_locked(struct console *console);
|
||||
|
||||
/*
|
||||
* The console driver calls this routine during kernel initialization
|
||||
* to register the console printing procedure with printk() and to
|
||||
@@ -3601,6 +3590,15 @@ void register_console(struct console *newcon)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (newcon->flags & CON_NBCON) {
|
||||
/*
|
||||
* Ensure the nbcon console buffers can be allocated
|
||||
* before modifying any global data.
|
||||
*/
|
||||
if (!nbcon_alloc(newcon))
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we want to enable this console driver by default.
|
||||
*
|
||||
@@ -3628,8 +3626,11 @@ void register_console(struct console *newcon)
|
||||
err = try_enable_preferred_console(newcon, false);
|
||||
|
||||
/* printk() messages are not printed to the Braille console. */
|
||||
if (err || newcon->flags & CON_BRL)
|
||||
if (err || newcon->flags & CON_BRL) {
|
||||
if (newcon->flags & CON_NBCON)
|
||||
nbcon_free(newcon);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have a bootconsole, and are switching to a real console,
|
||||
@@ -3645,11 +3646,11 @@ void register_console(struct console *newcon)
|
||||
newcon->dropped = 0;
|
||||
console_init_seq(newcon, bootcon_registered);
|
||||
|
||||
if (!(newcon->flags & CON_NO_BKL)) {
|
||||
have_bkl_console = true;
|
||||
console_bkl_kthread_create();
|
||||
} else if (!cons_nobkl_init(newcon)) {
|
||||
goto unlock;
|
||||
if (newcon->flags & CON_NBCON) {
|
||||
nbcon_init(newcon);
|
||||
} else {
|
||||
have_legacy_console = true;
|
||||
nbcon_legacy_kthread_create();
|
||||
}
|
||||
|
||||
if (newcon->flags & CON_BOOT)
|
||||
@@ -3698,9 +3699,6 @@ void register_console(struct console *newcon)
|
||||
if (con->flags & CON_BOOT)
|
||||
unregister_console_locked(con);
|
||||
}
|
||||
|
||||
/* All boot consoles have been unregistered. */
|
||||
have_boot_console = false;
|
||||
}
|
||||
unlock:
|
||||
console_list_unlock();
|
||||
@@ -3710,13 +3708,14 @@ EXPORT_SYMBOL(register_console);
|
||||
/* Must be called under console_list_lock(). */
|
||||
static int unregister_console_locked(struct console *console)
|
||||
{
|
||||
bool is_legacy_con = !(console->flags & CON_NBCON);
|
||||
bool is_boot_con = (console->flags & CON_BOOT);
|
||||
struct console *c;
|
||||
bool is_boot_con;
|
||||
int res;
|
||||
|
||||
lockdep_assert_console_list_lock_held();
|
||||
|
||||
is_boot_con = console->flags & CON_BOOT;
|
||||
con_printk(KERN_INFO, console, "disabled\n");
|
||||
|
||||
res = _braille_unregister_console(console);
|
||||
if (res < 0)
|
||||
@@ -3724,12 +3723,11 @@ static int unregister_console_locked(struct console *console)
|
||||
if (res > 0)
|
||||
return 0;
|
||||
|
||||
if (!console_is_registered_locked(console))
|
||||
return -ENODEV;
|
||||
|
||||
/* Disable it unconditionally */
|
||||
console_srcu_write_flags(console, console->flags & ~CON_ENABLED);
|
||||
|
||||
con_printk(KERN_INFO, console, "disabled\n");
|
||||
if (!console_is_registered_locked(console))
|
||||
return -ENODEV;
|
||||
|
||||
hlist_del_init_rcu(&console->node);
|
||||
|
||||
@@ -3752,8 +3750,8 @@ static int unregister_console_locked(struct console *console)
|
||||
*/
|
||||
synchronize_srcu(&console_srcu);
|
||||
|
||||
if (console->flags & CON_NO_BKL)
|
||||
cons_nobkl_cleanup(console);
|
||||
if (console->flags & CON_NBCON)
|
||||
nbcon_free(console);
|
||||
|
||||
console_sysfs_notify();
|
||||
|
||||
@@ -3761,14 +3759,41 @@ static int unregister_console_locked(struct console *console)
|
||||
res = console->exit(console);
|
||||
|
||||
/*
|
||||
* Each time a boot console unregisters, try to start up the printing
|
||||
* threads. They will only start if this was the last boot console.
|
||||
* If the current console was a boot and/or legacy console, the
|
||||
* related global flags might need to be updated.
|
||||
*/
|
||||
if (is_boot_con) {
|
||||
for_each_console(c)
|
||||
cons_kthread_create(c);
|
||||
if (is_boot_con || is_legacy_con) {
|
||||
bool found_boot_con = false;
|
||||
bool found_legacy_con = false;
|
||||
|
||||
for_each_console(c) {
|
||||
if (c->flags & CON_BOOT)
|
||||
found_boot_con = true;
|
||||
if (!(c->flags & CON_NBCON))
|
||||
found_legacy_con = true;
|
||||
}
|
||||
if (!found_boot_con)
|
||||
have_boot_console = false;
|
||||
if (!found_legacy_con)
|
||||
have_legacy_console = false;
|
||||
}
|
||||
|
||||
/*
|
||||
* When the last boot console unregisters, start up the
|
||||
* printing threads.
|
||||
*/
|
||||
if (is_boot_con && !have_boot_console) {
|
||||
for_each_console(c)
|
||||
nbcon_kthread_create(c);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
if (!serialized_printing && nbcon_legacy_kthread) {
|
||||
kthread_stop(nbcon_legacy_kthread);
|
||||
nbcon_legacy_kthread = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -3917,6 +3942,8 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
|
||||
struct console *c;
|
||||
u64 last_diff = 0;
|
||||
u64 printk_seq;
|
||||
short flags;
|
||||
bool locked;
|
||||
int cookie;
|
||||
u64 diff;
|
||||
u64 seq;
|
||||
@@ -3925,40 +3952,55 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
|
||||
|
||||
seq = prb_next_seq(prb);
|
||||
|
||||
/*
|
||||
* Flush the consoles so that records up to @seq are printed.
|
||||
* Otherwise this function will just wait for the threaded printers
|
||||
* to print up to @seq.
|
||||
*/
|
||||
if (serialized_printing && !IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
console_lock();
|
||||
console_unlock();
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
locked = false;
|
||||
diff = 0;
|
||||
|
||||
/*
|
||||
* Hold the console_lock to guarantee safe access to
|
||||
* console->seq.
|
||||
*/
|
||||
console_lock();
|
||||
if (serialized_printing) {
|
||||
/*
|
||||
* Hold the console_lock to guarantee safe access to
|
||||
* console->seq. Releasing console_lock flushes more
|
||||
* records in case @seq is still not printed on all
|
||||
* usable consoles.
|
||||
*/
|
||||
console_lock();
|
||||
locked = true;
|
||||
}
|
||||
|
||||
cookie = console_srcu_read_lock();
|
||||
for_each_console_srcu(c) {
|
||||
short flags;
|
||||
|
||||
if (con && con != c)
|
||||
continue;
|
||||
|
||||
flags = console_srcu_read_flags(c);
|
||||
|
||||
/*
|
||||
* If consoles are not usable, it cannot be expected
|
||||
* that they make forward progress, so only increment
|
||||
* @diff for usable consoles.
|
||||
*/
|
||||
|
||||
flags = console_srcu_read_flags(c);
|
||||
|
||||
if (!console_is_usable(c, flags))
|
||||
if (!console_is_usable(c, flags, true) &&
|
||||
!console_is_usable(c, flags, false)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Since the console is locked, use this opportunity
|
||||
* to update console->seq for NOBKL consoles.
|
||||
*/
|
||||
if (flags & CON_NO_BKL)
|
||||
c->seq = cons_read_seq(c);
|
||||
if (flags & CON_NBCON) {
|
||||
printk_seq = nbcon_seq_read(c);
|
||||
} else {
|
||||
WARN_ON_ONCE(!locked);
|
||||
printk_seq = c->seq;
|
||||
}
|
||||
|
||||
printk_seq = c->seq;
|
||||
if (printk_seq < seq)
|
||||
diff += seq - printk_seq;
|
||||
}
|
||||
@@ -3967,22 +4009,18 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
|
||||
if (diff != last_diff && reset_on_progress)
|
||||
remaining = timeout_ms;
|
||||
|
||||
console_unlock();
|
||||
if (locked)
|
||||
console_unlock();
|
||||
|
||||
/* Note: @diff is 0 if there are no usable consoles. */
|
||||
if (diff == 0 || remaining == 0)
|
||||
break;
|
||||
|
||||
if (remaining < 0) {
|
||||
/* no timeout limit */
|
||||
msleep(100);
|
||||
} else if (remaining < 100) {
|
||||
msleep(remaining);
|
||||
remaining = 0;
|
||||
} else {
|
||||
msleep(100);
|
||||
remaining -= 100;
|
||||
}
|
||||
msleep(1);
|
||||
|
||||
/* If @remaining < 0, there is no timeout limit. */
|
||||
if (remaining > 0)
|
||||
remaining--;
|
||||
|
||||
last_diff = diff;
|
||||
}
|
||||
@@ -4024,8 +4062,7 @@ static void wake_up_klogd_work_func(struct irq_work *irq_work)
|
||||
|
||||
if (pending & PRINTK_PENDING_OUTPUT) {
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
|
||||
/* The BKL thread waits on @log_wait. */
|
||||
pending |= PRINTK_PENDING_WAKEUP;
|
||||
wake_up_interruptible(&legacy_wait);
|
||||
} else {
|
||||
/*
|
||||
* If trylock fails, some other context
|
||||
@@ -4097,26 +4134,24 @@ void wake_up_klogd(void)
|
||||
*/
|
||||
void defer_console_output(void)
|
||||
{
|
||||
int val = PRINTK_PENDING_WAKEUP;
|
||||
|
||||
/*
|
||||
* New messages may have been added directly to the ringbuffer
|
||||
* using vprintk_store(), so wake any waiters as well.
|
||||
*/
|
||||
if (have_bkl_console)
|
||||
int val = PRINTK_PENDING_WAKEUP;
|
||||
|
||||
if (serialized_printing)
|
||||
val |= PRINTK_PENDING_OUTPUT;
|
||||
__wake_up_klogd(val);
|
||||
}
|
||||
|
||||
void printk_trigger_flush(void)
|
||||
{
|
||||
struct cons_write_context wctxt = { };
|
||||
|
||||
preempt_disable();
|
||||
cons_atomic_flush(&wctxt, true);
|
||||
nbcon_atomic_flush_all();
|
||||
preempt_enable();
|
||||
|
||||
cons_wake_threads();
|
||||
nbcon_wake_threads();
|
||||
defer_console_output();
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,41 +12,30 @@
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
struct printk_context {
|
||||
local_lock_t cpu;
|
||||
int recursion;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct printk_context, printk_context) = {
|
||||
.cpu = INIT_LOCAL_LOCK(cpu),
|
||||
};
|
||||
static DEFINE_PER_CPU(int, printk_context);
|
||||
|
||||
/* Can be preempted by NMI. */
|
||||
void __printk_safe_enter(unsigned long *flags)
|
||||
void __printk_safe_enter(void)
|
||||
{
|
||||
WARN_ON_ONCE(in_nmi());
|
||||
local_lock_irqsave(&printk_context.cpu, *flags);
|
||||
this_cpu_inc(printk_context.recursion);
|
||||
this_cpu_inc(printk_context);
|
||||
}
|
||||
|
||||
/* Can be preempted by NMI. */
|
||||
void __printk_safe_exit(unsigned long *flags)
|
||||
void __printk_safe_exit(void)
|
||||
{
|
||||
WARN_ON_ONCE(in_nmi());
|
||||
this_cpu_dec(printk_context.recursion);
|
||||
local_unlock_irqrestore(&printk_context.cpu, *flags);
|
||||
this_cpu_dec(printk_context);
|
||||
}
|
||||
|
||||
void __printk_deferred_enter(void)
|
||||
{
|
||||
cant_migrate();
|
||||
this_cpu_inc(printk_context.recursion);
|
||||
this_cpu_inc(printk_context);
|
||||
}
|
||||
|
||||
void __printk_deferred_exit(void)
|
||||
{
|
||||
cant_migrate();
|
||||
this_cpu_dec(printk_context.recursion);
|
||||
this_cpu_dec(printk_context);
|
||||
}
|
||||
|
||||
asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
@@ -61,7 +50,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
* Use the main logbuf even in NMI. But avoid calling console
|
||||
* drivers that might have their own locks.
|
||||
*/
|
||||
if (this_cpu_read(printk_context.recursion) || in_nmi())
|
||||
if (this_cpu_read(printk_context) || in_nmi())
|
||||
return vprintk_deferred(fmt, args);
|
||||
|
||||
/* No obstacles. */
|
||||
|
||||
@@ -583,7 +583,7 @@ static void rcu_check_gp_kthread_expired_fqs_timer(void)
|
||||
|
||||
static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
|
||||
{
|
||||
enum cons_prio prev_prio;
|
||||
enum nbcon_prio prev_prio;
|
||||
int cpu;
|
||||
unsigned long flags;
|
||||
unsigned long gpa;
|
||||
@@ -599,7 +599,7 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
|
||||
if (rcu_stall_is_suppressed())
|
||||
return;
|
||||
|
||||
prev_prio = cons_atomic_enter(CONS_PRIO_EMERGENCY);
|
||||
prev_prio = nbcon_atomic_enter(NBCON_PRIO_EMERGENCY);
|
||||
|
||||
/*
|
||||
* OK, time to rat on our buddy...
|
||||
@@ -656,7 +656,7 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
|
||||
|
||||
rcu_force_quiescent_state(); /* Kick them all. */
|
||||
|
||||
cons_atomic_exit(CONS_PRIO_EMERGENCY, prev_prio);
|
||||
nbcon_atomic_exit(NBCON_PRIO_EMERGENCY, prev_prio);
|
||||
}
|
||||
|
||||
static void print_cpu_stall(unsigned long gps)
|
||||
|
||||
Reference in New Issue
Block a user