Merge 5.0-rc2 into tty-next
We need the tty core fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Este cometimento está contido em:
@@ -85,6 +85,18 @@ config SERIAL_EARLYCON_ARM_SEMIHOST
|
||||
with "earlycon=smh" on the kernel command line. The console is
|
||||
enabled when early_param is processed.
|
||||
|
||||
config SERIAL_EARLYCON_RISCV_SBI
|
||||
bool "Early console using RISC-V SBI"
|
||||
depends on RISCV
|
||||
select SERIAL_CORE
|
||||
select SERIAL_CORE_CONSOLE
|
||||
select SERIAL_EARLYCON
|
||||
help
|
||||
Support for early debug console using RISC-V SBI. This enables
|
||||
the console before standard serial driver is probed. This is enabled
|
||||
with "earlycon=sbi" on the kernel command line. The console is
|
||||
enabled when early_param is processed.
|
||||
|
||||
config SERIAL_SB1250_DUART
|
||||
tristate "BCM1xxx on-chip DUART serial support"
|
||||
depends on SIBYTE_SB1xxx_SOC=y
|
||||
|
@@ -7,6 +7,7 @@ obj-$(CONFIG_SERIAL_CORE) += serial_core.o
|
||||
|
||||
obj-$(CONFIG_SERIAL_EARLYCON) += earlycon.o
|
||||
obj-$(CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST) += earlycon-arm-semihost.o
|
||||
obj-$(CONFIG_SERIAL_EARLYCON_RISCV_SBI) += earlycon-riscv-sbi.o
|
||||
|
||||
# These Sparc drivers have to appear before others such as 8250
|
||||
# which share ttySx minor node space. Otherwise console device
|
||||
|
28
drivers/tty/serial/earlycon-riscv-sbi.c
Ficheiro normal
28
drivers/tty/serial/earlycon-riscv-sbi.c
Ficheiro normal
@@ -0,0 +1,28 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* RISC-V SBI based earlycon
|
||||
*
|
||||
* Copyright (C) 2018 Anup Patel <anup@brainfault.org>
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <asm/sbi.h>
|
||||
|
||||
static void sbi_console_write(struct console *con,
|
||||
const char *s, unsigned int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n; ++i)
|
||||
sbi_console_putchar(s[i]);
|
||||
}
|
||||
|
||||
static int __init early_sbi_setup(struct earlycon_device *device,
|
||||
const char *opt)
|
||||
{
|
||||
device->con->write = sbi_console_write;
|
||||
return 0;
|
||||
}
|
||||
EARLYCON_DECLARE(sbi, early_sbi_setup);
|
@@ -114,9 +114,9 @@ struct ltq_uart_port {
|
||||
|
||||
static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
|
||||
{
|
||||
u32 tmp = readl(reg);
|
||||
u32 tmp = __raw_readl(reg);
|
||||
|
||||
writel((tmp & ~clear) | set, reg);
|
||||
__raw_writel((tmp & ~clear) | set, reg);
|
||||
}
|
||||
|
||||
static inline struct
|
||||
@@ -144,7 +144,7 @@ lqasc_start_tx(struct uart_port *port)
|
||||
static void
|
||||
lqasc_stop_rx(struct uart_port *port)
|
||||
{
|
||||
writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
|
||||
__raw_writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -153,11 +153,12 @@ lqasc_rx_chars(struct uart_port *port)
|
||||
struct tty_port *tport = &port->state->port;
|
||||
unsigned int ch = 0, rsr = 0, fifocnt;
|
||||
|
||||
fifocnt = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
|
||||
fifocnt = __raw_readl(port->membase + LTQ_ASC_FSTAT) &
|
||||
ASCFSTAT_RXFFLMASK;
|
||||
while (fifocnt--) {
|
||||
u8 flag = TTY_NORMAL;
|
||||
ch = readb(port->membase + LTQ_ASC_RBUF);
|
||||
rsr = (readl(port->membase + LTQ_ASC_STATE)
|
||||
rsr = (__raw_readl(port->membase + LTQ_ASC_STATE)
|
||||
& ASCSTATE_ANY) | UART_DUMMY_UER_RX;
|
||||
tty_flip_buffer_push(tport);
|
||||
port->icount.rx++;
|
||||
@@ -217,7 +218,7 @@ lqasc_tx_chars(struct uart_port *port)
|
||||
return;
|
||||
}
|
||||
|
||||
while (((readl(port->membase + LTQ_ASC_FSTAT) &
|
||||
while (((__raw_readl(port->membase + LTQ_ASC_FSTAT) &
|
||||
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
|
||||
if (port->x_char) {
|
||||
writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
|
||||
@@ -245,7 +246,7 @@ lqasc_tx_int(int irq, void *_port)
|
||||
unsigned long flags;
|
||||
struct uart_port *port = (struct uart_port *)_port;
|
||||
spin_lock_irqsave(<q_asc_lock, flags);
|
||||
writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
|
||||
__raw_writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
|
||||
spin_unlock_irqrestore(<q_asc_lock, flags);
|
||||
lqasc_start_tx(port);
|
||||
return IRQ_HANDLED;
|
||||
@@ -270,7 +271,7 @@ lqasc_rx_int(int irq, void *_port)
|
||||
unsigned long flags;
|
||||
struct uart_port *port = (struct uart_port *)_port;
|
||||
spin_lock_irqsave(<q_asc_lock, flags);
|
||||
writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
|
||||
__raw_writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
|
||||
lqasc_rx_chars(port);
|
||||
spin_unlock_irqrestore(<q_asc_lock, flags);
|
||||
return IRQ_HANDLED;
|
||||
@@ -280,7 +281,8 @@ static unsigned int
|
||||
lqasc_tx_empty(struct uart_port *port)
|
||||
{
|
||||
int status;
|
||||
status = readl(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
|
||||
status = __raw_readl(port->membase + LTQ_ASC_FSTAT) &
|
||||
ASCFSTAT_TXFFLMASK;
|
||||
return status ? 0 : TIOCSER_TEMT;
|
||||
}
|
||||
|
||||
@@ -313,12 +315,12 @@ lqasc_startup(struct uart_port *port)
|
||||
asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
|
||||
port->membase + LTQ_ASC_CLC);
|
||||
|
||||
writel(0, port->membase + LTQ_ASC_PISEL);
|
||||
writel(
|
||||
__raw_writel(0, port->membase + LTQ_ASC_PISEL);
|
||||
__raw_writel(
|
||||
((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
|
||||
ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
|
||||
port->membase + LTQ_ASC_TXFCON);
|
||||
writel(
|
||||
__raw_writel(
|
||||
((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
|
||||
| ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
|
||||
port->membase + LTQ_ASC_RXFCON);
|
||||
@@ -350,7 +352,7 @@ lqasc_startup(struct uart_port *port)
|
||||
goto err2;
|
||||
}
|
||||
|
||||
writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
|
||||
__raw_writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
|
||||
port->membase + LTQ_ASC_IRNREN);
|
||||
return 0;
|
||||
|
||||
@@ -369,7 +371,7 @@ lqasc_shutdown(struct uart_port *port)
|
||||
free_irq(ltq_port->rx_irq, port);
|
||||
free_irq(ltq_port->err_irq, port);
|
||||
|
||||
writel(0, port->membase + LTQ_ASC_CON);
|
||||
__raw_writel(0, port->membase + LTQ_ASC_CON);
|
||||
asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
|
||||
port->membase + LTQ_ASC_RXFCON);
|
||||
asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
|
||||
@@ -461,13 +463,13 @@ lqasc_set_termios(struct uart_port *port,
|
||||
asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
|
||||
|
||||
/* now we can write the new baudrate into the register */
|
||||
writel(divisor, port->membase + LTQ_ASC_BG);
|
||||
__raw_writel(divisor, port->membase + LTQ_ASC_BG);
|
||||
|
||||
/* turn the baudrate generator back on */
|
||||
asc_update_bits(0, ASCCON_R, port->membase + LTQ_ASC_CON);
|
||||
|
||||
/* enable rx */
|
||||
writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE);
|
||||
__raw_writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE);
|
||||
|
||||
spin_unlock_irqrestore(<q_asc_lock, flags);
|
||||
|
||||
@@ -578,7 +580,7 @@ lqasc_console_putchar(struct uart_port *port, int ch)
|
||||
return;
|
||||
|
||||
do {
|
||||
fifofree = (readl(port->membase + LTQ_ASC_FSTAT)
|
||||
fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT)
|
||||
& ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF;
|
||||
} while (fifofree == 0);
|
||||
writeb(ch, port->membase + LTQ_ASC_TBUF);
|
||||
|
@@ -1256,7 +1256,8 @@ static void tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *
|
||||
static int tty_reopen(struct tty_struct *tty)
|
||||
{
|
||||
struct tty_driver *driver = tty->driver;
|
||||
int retval;
|
||||
struct tty_ldisc *ld;
|
||||
int retval = 0;
|
||||
|
||||
if (driver->type == TTY_DRIVER_TYPE_PTY &&
|
||||
driver->subtype == PTY_TYPE_MASTER)
|
||||
@@ -1268,13 +1269,18 @@ static int tty_reopen(struct tty_struct *tty)
|
||||
if (test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
|
||||
return -EBUSY;
|
||||
|
||||
retval = tty_ldisc_lock(tty, 5 * HZ);
|
||||
if (retval)
|
||||
return retval;
|
||||
ld = tty_ldisc_ref_wait(tty);
|
||||
if (ld) {
|
||||
tty_ldisc_deref(ld);
|
||||
} else {
|
||||
retval = tty_ldisc_lock(tty, 5 * HZ);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (!tty->ldisc)
|
||||
retval = tty_ldisc_reinit(tty, tty->termios.c_line);
|
||||
tty_ldisc_unlock(tty);
|
||||
if (!tty->ldisc)
|
||||
retval = tty_ldisc_reinit(tty, tty->termios.c_line);
|
||||
tty_ldisc_unlock(tty);
|
||||
}
|
||||
|
||||
if (retval == 0)
|
||||
tty->count++;
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador