mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 00:32:00 +00:00
Merge branch 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
This commit is contained in:
commit
df76ea4760
@ -83,6 +83,11 @@ properties:
|
||||
|
||||
- const: renesas,scif-r9a09g057 # RZ/V2H(P)
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,scif-r9a09g047 # RZ/G3E
|
||||
- const: renesas,scif-r9a09g057 # RZ/V2H fallback
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
|
@ -266,10 +266,14 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
|
||||
{ 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c },
|
||||
|
||||
/* WCH CARDS */
|
||||
{ 0x4348, 0x5053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, wch_ch353_1s1p},
|
||||
{ 0x4348, 0x7053, 0x4348, 0x3253, 0, 0, wch_ch353_2s1p},
|
||||
{ 0x1c00, 0x3050, 0x1c00, 0x3050, 0, 0, wch_ch382_0s1p},
|
||||
{ 0x1c00, 0x3250, 0x1c00, 0x3250, 0, 0, wch_ch382_2s1p},
|
||||
{ PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_1S1P,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, wch_ch353_1s1p },
|
||||
{ PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_2S1P,
|
||||
0x4348, 0x3253, 0, 0, wch_ch353_2s1p },
|
||||
{ PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_0S1P,
|
||||
0x1c00, 0x3050, 0, 0, wch_ch382_0s1p },
|
||||
{ PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_2S1P,
|
||||
0x1c00, 0x3250, 0, 0, wch_ch382_2s1p },
|
||||
|
||||
/* BrainBoxes PX272/PX306 MIO card */
|
||||
{ PCI_VENDOR_ID_INTASHIELD, 0x4100,
|
||||
|
@ -64,23 +64,17 @@
|
||||
#define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6
|
||||
#define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
|
||||
#define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
|
||||
#define PCI_VENDOR_ID_WCH 0x4348
|
||||
#define PCI_DEVICE_ID_WCH_CH352_2S 0x3253
|
||||
#define PCI_DEVICE_ID_WCH_CH353_4S 0x3453
|
||||
#define PCI_DEVICE_ID_WCH_CH353_2S1PF 0x5046
|
||||
#define PCI_DEVICE_ID_WCH_CH353_1S1P 0x5053
|
||||
#define PCI_DEVICE_ID_WCH_CH353_2S1P 0x7053
|
||||
#define PCI_DEVICE_ID_WCH_CH355_4S 0x7173
|
||||
|
||||
#define PCI_DEVICE_ID_WCHCN_CH352_2S 0x3253
|
||||
#define PCI_DEVICE_ID_WCHCN_CH355_4S 0x7173
|
||||
|
||||
#define PCI_VENDOR_ID_AGESTAR 0x5372
|
||||
#define PCI_DEVICE_ID_AGESTAR_9375 0x6872
|
||||
#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
|
||||
#define PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800 0x818e
|
||||
|
||||
#define PCIE_VENDOR_ID_WCH 0x1c00
|
||||
#define PCIE_DEVICE_ID_WCH_CH382_2S1P 0x3250
|
||||
#define PCIE_DEVICE_ID_WCH_CH384_4S 0x3470
|
||||
#define PCIE_DEVICE_ID_WCH_CH384_8S 0x3853
|
||||
#define PCIE_DEVICE_ID_WCH_CH382_2S 0x3253
|
||||
#define PCI_DEVICE_ID_WCHIC_CH384_4S 0x3470
|
||||
#define PCI_DEVICE_ID_WCHIC_CH384_8S 0x3853
|
||||
|
||||
#define PCI_DEVICE_ID_MOXA_CP102E 0x1024
|
||||
#define PCI_DEVICE_ID_MOXA_CP102EL 0x1025
|
||||
@ -2817,80 +2811,80 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
|
||||
},
|
||||
/* WCH CH353 1S1P card (16550 clone) */
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_WCH,
|
||||
.device = PCI_DEVICE_ID_WCH_CH353_1S1P,
|
||||
.vendor = PCI_VENDOR_ID_WCHCN,
|
||||
.device = PCI_DEVICE_ID_WCHCN_CH353_1S1P,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch353_setup,
|
||||
},
|
||||
/* WCH CH353 2S1P card (16550 clone) */
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_WCH,
|
||||
.device = PCI_DEVICE_ID_WCH_CH353_2S1P,
|
||||
.vendor = PCI_VENDOR_ID_WCHCN,
|
||||
.device = PCI_DEVICE_ID_WCHCN_CH353_2S1P,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch353_setup,
|
||||
},
|
||||
/* WCH CH353 4S card (16550 clone) */
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_WCH,
|
||||
.device = PCI_DEVICE_ID_WCH_CH353_4S,
|
||||
.vendor = PCI_VENDOR_ID_WCHCN,
|
||||
.device = PCI_DEVICE_ID_WCHCN_CH353_4S,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch353_setup,
|
||||
},
|
||||
/* WCH CH353 2S1PF card (16550 clone) */
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_WCH,
|
||||
.device = PCI_DEVICE_ID_WCH_CH353_2S1PF,
|
||||
.vendor = PCI_VENDOR_ID_WCHCN,
|
||||
.device = PCI_DEVICE_ID_WCHCN_CH353_2S1PF,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch353_setup,
|
||||
},
|
||||
/* WCH CH352 2S card (16550 clone) */
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_WCH,
|
||||
.device = PCI_DEVICE_ID_WCH_CH352_2S,
|
||||
.vendor = PCI_VENDOR_ID_WCHCN,
|
||||
.device = PCI_DEVICE_ID_WCHCN_CH352_2S,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch353_setup,
|
||||
},
|
||||
/* WCH CH355 4S card (16550 clone) */
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_WCH,
|
||||
.device = PCI_DEVICE_ID_WCH_CH355_4S,
|
||||
.vendor = PCI_VENDOR_ID_WCHCN,
|
||||
.device = PCI_DEVICE_ID_WCHCN_CH355_4S,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch355_setup,
|
||||
},
|
||||
/* WCH CH382 2S card (16850 clone) */
|
||||
{
|
||||
.vendor = PCIE_VENDOR_ID_WCH,
|
||||
.device = PCIE_DEVICE_ID_WCH_CH382_2S,
|
||||
.vendor = PCI_VENDOR_ID_WCHIC,
|
||||
.device = PCI_DEVICE_ID_WCHIC_CH382_2S,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch38x_setup,
|
||||
},
|
||||
/* WCH CH382 2S1P card (16850 clone) */
|
||||
{
|
||||
.vendor = PCIE_VENDOR_ID_WCH,
|
||||
.device = PCIE_DEVICE_ID_WCH_CH382_2S1P,
|
||||
.vendor = PCI_VENDOR_ID_WCHIC,
|
||||
.device = PCI_DEVICE_ID_WCHIC_CH382_2S1P,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch38x_setup,
|
||||
},
|
||||
/* WCH CH384 4S card (16850 clone) */
|
||||
{
|
||||
.vendor = PCIE_VENDOR_ID_WCH,
|
||||
.device = PCIE_DEVICE_ID_WCH_CH384_4S,
|
||||
.vendor = PCI_VENDOR_ID_WCHIC,
|
||||
.device = PCI_DEVICE_ID_WCHIC_CH384_4S,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.setup = pci_wch_ch38x_setup,
|
||||
},
|
||||
/* WCH CH384 8S card (16850 clone) */
|
||||
{
|
||||
.vendor = PCIE_VENDOR_ID_WCH,
|
||||
.device = PCIE_DEVICE_ID_WCH_CH384_8S,
|
||||
.vendor = PCI_VENDOR_ID_WCHIC,
|
||||
.device = PCI_DEVICE_ID_WCHIC_CH384_8S,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.init = pci_wch_ch38x_init,
|
||||
@ -3967,11 +3961,11 @@ static const struct pci_device_id blacklist[] = {
|
||||
|
||||
/* multi-io cards handled by parport_serial */
|
||||
/* WCH CH353 2S1P */
|
||||
{ PCI_DEVICE(0x4348, 0x7053), 0, 0, REPORT_CONFIG(PARPORT_SERIAL), },
|
||||
{ PCI_VDEVICE(WCHCN, 0x7053), REPORT_CONFIG(PARPORT_SERIAL), },
|
||||
/* WCH CH353 1S1P */
|
||||
{ PCI_DEVICE(0x4348, 0x5053), 0, 0, REPORT_CONFIG(PARPORT_SERIAL), },
|
||||
{ PCI_VDEVICE(WCHCN, 0x5053), REPORT_CONFIG(PARPORT_SERIAL), },
|
||||
/* WCH CH382 2S1P */
|
||||
{ PCI_DEVICE(0x1c00, 0x3250), 0, 0, REPORT_CONFIG(PARPORT_SERIAL), },
|
||||
{ PCI_VDEVICE(WCHIC, 0x3250), REPORT_CONFIG(PARPORT_SERIAL), },
|
||||
|
||||
/* Intel platforms with MID UART */
|
||||
{ PCI_VDEVICE(INTEL, 0x081b), REPORT_8250_CONFIG(MID), },
|
||||
@ -6044,27 +6038,27 @@ static const struct pci_device_id serial_pci_tbl[] = {
|
||||
* WCH CH353 series devices: The 2S1P is handled by parport_serial
|
||||
* so not listed here.
|
||||
*/
|
||||
{ PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S,
|
||||
{ PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_4S,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_b0_bt_4_115200 },
|
||||
|
||||
{ PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF,
|
||||
{ PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH353_2S1PF,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_b0_bt_2_115200 },
|
||||
|
||||
{ PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH355_4S,
|
||||
{ PCI_VENDOR_ID_WCHCN, PCI_DEVICE_ID_WCHCN_CH355_4S,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_b0_bt_4_115200 },
|
||||
|
||||
{ PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH382_2S,
|
||||
{ PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH382_2S,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_wch382_2 },
|
||||
|
||||
{ PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_4S,
|
||||
{ PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH384_4S,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_wch384_4 },
|
||||
|
||||
{ PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_8S,
|
||||
{ PCI_VENDOR_ID_WCHIC, PCI_DEVICE_ID_WCHIC_CH384_8S,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
0, 0, pbn_wch384_8 },
|
||||
/*
|
||||
|
@ -3250,7 +3250,7 @@ void serial8250_init_port(struct uart_8250_port *up)
|
||||
port->ops = &serial8250_pops;
|
||||
port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
|
||||
|
||||
up->cur_iotype = 0xFF;
|
||||
up->cur_iotype = UPIO_UNKNOWN;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(serial8250_init_port);
|
||||
|
||||
|
@ -24,8 +24,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/altera_jtaguart.h>
|
||||
|
||||
#define DRV_NAME "altera_jtaguart"
|
||||
|
||||
/*
|
||||
* Altera JTAG UART register definitions according to the Altera JTAG UART
|
||||
* datasheet: https://www.altera.com/literature/hb/nios2/n2cpu_nii51009.pdf
|
||||
@ -173,7 +171,7 @@ static int altera_jtaguart_startup(struct uart_port *port)
|
||||
int ret;
|
||||
|
||||
ret = request_irq(port->irq, altera_jtaguart_interrupt, 0,
|
||||
DRV_NAME, port);
|
||||
dev_name(port->dev), port);
|
||||
if (ret) {
|
||||
dev_err(port->dev, "unable to attach Altera JTAG UART %d interrupt vector=%d\n",
|
||||
port->line, port->irq);
|
||||
@ -365,7 +363,7 @@ OF_EARLYCON_DECLARE(juart, "altr,juart-1.0", altera_jtaguart_earlycon_setup);
|
||||
|
||||
static struct uart_driver altera_jtaguart_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.driver_name = "altera_jtaguart",
|
||||
.driver_name = KBUILD_MODNAME,
|
||||
.dev_name = "ttyJ",
|
||||
.major = ALTERA_JTAGUART_MAJOR,
|
||||
.minor = ALTERA_JTAGUART_MINOR,
|
||||
@ -451,7 +449,7 @@ static struct platform_driver altera_jtaguart_platform_driver = {
|
||||
.probe = altera_jtaguart_probe,
|
||||
.remove = altera_jtaguart_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.name = KBUILD_MODNAME,
|
||||
.of_match_table = of_match_ptr(altera_jtaguart_match),
|
||||
},
|
||||
};
|
||||
@ -481,4 +479,4 @@ module_exit(altera_jtaguart_exit);
|
||||
MODULE_DESCRIPTION("Altera JTAG UART driver");
|
||||
MODULE_AUTHOR("Thomas Chou <thomas@wytron.com.tw>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
MODULE_ALIAS("platform:" KBUILD_MODNAME);
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/altera_uart.h>
|
||||
|
||||
#define DRV_NAME "altera_uart"
|
||||
#define SERIAL_ALTERA_MAJOR 204
|
||||
#define SERIAL_ALTERA_MINOR 213
|
||||
|
||||
@ -518,7 +517,7 @@ OF_EARLYCON_DECLARE(uart, "altr,uart-1.0", altera_uart_earlycon_setup);
|
||||
*/
|
||||
static struct uart_driver altera_uart_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.driver_name = DRV_NAME,
|
||||
.driver_name = KBUILD_MODNAME,
|
||||
.dev_name = "ttyAL",
|
||||
.major = SERIAL_ALTERA_MAJOR,
|
||||
.minor = SERIAL_ALTERA_MINOR,
|
||||
@ -619,7 +618,7 @@ static struct platform_driver altera_uart_platform_driver = {
|
||||
.probe = altera_uart_probe,
|
||||
.remove = altera_uart_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.name = KBUILD_MODNAME,
|
||||
.of_match_table = of_match_ptr(altera_uart_match),
|
||||
},
|
||||
};
|
||||
@ -649,5 +648,5 @@ module_exit(altera_uart_exit);
|
||||
MODULE_DESCRIPTION("Altera UART driver");
|
||||
MODULE_AUTHOR("Thomas Chou <thomas@wytron.com.tw>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
MODULE_ALIAS("platform:" KBUILD_MODNAME);
|
||||
MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_ALTERA_MAJOR);
|
||||
|
@ -1621,7 +1621,7 @@ mpc52xx_console_setup(struct console *co, char *options)
|
||||
(void *)port->mapbase, port->membase,
|
||||
port->irq, port->uartclk);
|
||||
|
||||
/* Setup the port parameters accoding to options */
|
||||
/* Setup the port parameters according to options */
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
else
|
||||
|
@ -790,7 +790,6 @@ static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
|
||||
{
|
||||
struct uart_state *state = container_of(port, struct uart_state, port);
|
||||
struct uart_port *uport;
|
||||
int ret = -ENODEV;
|
||||
|
||||
/* Initialize structure in case we error out later to prevent any stack info leakage. */
|
||||
*retinfo = (struct serial_struct){};
|
||||
@ -799,10 +798,10 @@ static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
|
||||
* Ensure the state we copy is consistent and no hardware changes
|
||||
* occur as we go
|
||||
*/
|
||||
mutex_lock(&port->mutex);
|
||||
guard(mutex)(&port->mutex);
|
||||
uport = uart_port_check(state);
|
||||
if (!uport)
|
||||
goto out;
|
||||
return -ENODEV;
|
||||
|
||||
retinfo->type = uport->type;
|
||||
retinfo->line = uport->line;
|
||||
@ -823,10 +822,7 @@ static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
|
||||
retinfo->iomem_reg_shift = uport->regshift;
|
||||
retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
mutex_unlock(&port->mutex);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uart_get_info_user(struct tty_struct *tty,
|
||||
@ -838,6 +834,61 @@ static int uart_get_info_user(struct tty_struct *tty,
|
||||
return uart_get_info(port, ss) < 0 ? -EIO : 0;
|
||||
}
|
||||
|
||||
static int uart_change_port(struct uart_port *uport,
|
||||
const struct serial_struct *new_info,
|
||||
unsigned long new_port)
|
||||
{
|
||||
unsigned long old_iobase, old_mapbase;
|
||||
unsigned int old_type, old_iotype, old_hub6, old_shift;
|
||||
int retval;
|
||||
|
||||
old_iobase = uport->iobase;
|
||||
old_mapbase = uport->mapbase;
|
||||
old_type = uport->type;
|
||||
old_hub6 = uport->hub6;
|
||||
old_iotype = uport->iotype;
|
||||
old_shift = uport->regshift;
|
||||
|
||||
if (old_type != PORT_UNKNOWN && uport->ops->release_port)
|
||||
uport->ops->release_port(uport);
|
||||
|
||||
uport->iobase = new_port;
|
||||
uport->type = new_info->type;
|
||||
uport->hub6 = new_info->hub6;
|
||||
uport->iotype = new_info->io_type;
|
||||
uport->regshift = new_info->iomem_reg_shift;
|
||||
uport->mapbase = (unsigned long)new_info->iomem_base;
|
||||
|
||||
if (uport->type == PORT_UNKNOWN || !uport->ops->request_port)
|
||||
return 0;
|
||||
|
||||
retval = uport->ops->request_port(uport);
|
||||
if (retval == 0)
|
||||
return 0; /* succeeded => done */
|
||||
|
||||
/*
|
||||
* If we fail to request resources for the new port, try to restore the
|
||||
* old settings.
|
||||
*/
|
||||
uport->iobase = old_iobase;
|
||||
uport->type = old_type;
|
||||
uport->hub6 = old_hub6;
|
||||
uport->iotype = old_iotype;
|
||||
uport->regshift = old_shift;
|
||||
uport->mapbase = old_mapbase;
|
||||
|
||||
if (old_type == PORT_UNKNOWN)
|
||||
return retval;
|
||||
|
||||
retval = uport->ops->request_port(uport);
|
||||
/* If we failed to restore the old settings, we fail like this. */
|
||||
if (retval)
|
||||
uport->type = PORT_UNKNOWN;
|
||||
|
||||
/* We failed anyway. */
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
struct uart_state *state,
|
||||
struct serial_struct *new_info)
|
||||
@ -847,7 +898,7 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
unsigned int change_irq, change_port, closing_wait;
|
||||
unsigned int old_custom_divisor, close_delay;
|
||||
upf_t old_flags, new_flags;
|
||||
int retval = 0;
|
||||
int retval;
|
||||
|
||||
if (!uport)
|
||||
return -EIO;
|
||||
@ -886,13 +937,10 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
if (!(uport->flags & UPF_FIXED_PORT)) {
|
||||
unsigned int uartclk = new_info->baud_base * 16;
|
||||
/* check needs to be done here before other settings made */
|
||||
if (uartclk == 0) {
|
||||
retval = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
if (uartclk == 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
retval = -EPERM;
|
||||
if (change_irq || change_port ||
|
||||
(new_info->baud_base != uport->uartclk / 16) ||
|
||||
(close_delay != port->close_delay) ||
|
||||
@ -900,7 +948,7 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
(new_info->xmit_fifo_size &&
|
||||
new_info->xmit_fifo_size != uport->fifosize) ||
|
||||
(((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
|
||||
goto exit;
|
||||
return -EPERM;
|
||||
uport->flags = ((uport->flags & ~UPF_USR_MASK) |
|
||||
(new_flags & UPF_USR_MASK));
|
||||
uport->custom_divisor = new_info->custom_divisor;
|
||||
@ -910,30 +958,24 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
if (change_irq || change_port) {
|
||||
retval = security_locked_down(LOCKDOWN_TIOCSSERIAL);
|
||||
if (retval)
|
||||
goto exit;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ask the low level driver to verify the settings.
|
||||
*/
|
||||
if (uport->ops->verify_port)
|
||||
/* Ask the low level driver to verify the settings. */
|
||||
if (uport->ops->verify_port) {
|
||||
retval = uport->ops->verify_port(uport, new_info);
|
||||
if (retval)
|
||||
return retval;
|
||||
}
|
||||
|
||||
if ((new_info->irq >= irq_get_nr_irqs()) || (new_info->irq < 0) ||
|
||||
(new_info->baud_base < 9600))
|
||||
retval = -EINVAL;
|
||||
|
||||
if (retval)
|
||||
goto exit;
|
||||
return -EINVAL;
|
||||
|
||||
if (change_port || change_irq) {
|
||||
retval = -EBUSY;
|
||||
|
||||
/*
|
||||
* Make sure that we are the sole user of this port.
|
||||
*/
|
||||
/* Make sure that we are the sole user of this port. */
|
||||
if (tty_port_users(port) > 1)
|
||||
goto exit;
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
* We need to shutdown the serial port at the old
|
||||
@ -943,69 +985,9 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
}
|
||||
|
||||
if (change_port) {
|
||||
unsigned long old_iobase, old_mapbase;
|
||||
unsigned int old_type, old_iotype, old_hub6, old_shift;
|
||||
|
||||
old_iobase = uport->iobase;
|
||||
old_mapbase = uport->mapbase;
|
||||
old_type = uport->type;
|
||||
old_hub6 = uport->hub6;
|
||||
old_iotype = uport->iotype;
|
||||
old_shift = uport->regshift;
|
||||
|
||||
/*
|
||||
* Free and release old regions
|
||||
*/
|
||||
if (old_type != PORT_UNKNOWN && uport->ops->release_port)
|
||||
uport->ops->release_port(uport);
|
||||
|
||||
uport->iobase = new_port;
|
||||
uport->type = new_info->type;
|
||||
uport->hub6 = new_info->hub6;
|
||||
uport->iotype = new_info->io_type;
|
||||
uport->regshift = new_info->iomem_reg_shift;
|
||||
uport->mapbase = (unsigned long)new_info->iomem_base;
|
||||
|
||||
/*
|
||||
* Claim and map the new regions
|
||||
*/
|
||||
if (uport->type != PORT_UNKNOWN && uport->ops->request_port) {
|
||||
retval = uport->ops->request_port(uport);
|
||||
} else {
|
||||
/* Always success - Jean II */
|
||||
retval = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we fail to request resources for the
|
||||
* new port, try to restore the old settings.
|
||||
*/
|
||||
if (retval) {
|
||||
uport->iobase = old_iobase;
|
||||
uport->type = old_type;
|
||||
uport->hub6 = old_hub6;
|
||||
uport->iotype = old_iotype;
|
||||
uport->regshift = old_shift;
|
||||
uport->mapbase = old_mapbase;
|
||||
|
||||
if (old_type != PORT_UNKNOWN) {
|
||||
retval = uport->ops->request_port(uport);
|
||||
/*
|
||||
* If we failed to restore the old settings,
|
||||
* we fail like this.
|
||||
*/
|
||||
if (retval)
|
||||
uport->type = PORT_UNKNOWN;
|
||||
|
||||
/*
|
||||
* We failed anyway.
|
||||
*/
|
||||
retval = -EBUSY;
|
||||
}
|
||||
|
||||
/* Added to return the correct error -Ram Gupta */
|
||||
goto exit;
|
||||
}
|
||||
retval = uart_change_port(uport, new_info, new_port);
|
||||
if (retval)
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (change_irq)
|
||||
@ -1021,9 +1003,9 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
uport->fifosize = new_info->xmit_fifo_size;
|
||||
|
||||
check_and_exit:
|
||||
retval = 0;
|
||||
if (uport->type == PORT_UNKNOWN)
|
||||
goto exit;
|
||||
return 0;
|
||||
|
||||
if (tty_port_initialized(port)) {
|
||||
if (((old_flags ^ uport->flags) & UPF_SPD_MASK) ||
|
||||
old_custom_divisor != uport->custom_divisor) {
|
||||
@ -1039,15 +1021,17 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
||||
}
|
||||
uart_change_line_settings(tty, state, NULL);
|
||||
}
|
||||
} else {
|
||||
retval = uart_startup(tty, state, true);
|
||||
if (retval == 0)
|
||||
tty_port_set_initialized(port, true);
|
||||
if (retval > 0)
|
||||
retval = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
exit:
|
||||
return retval;
|
||||
|
||||
retval = uart_startup(tty, state, true);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
if (retval == 0)
|
||||
tty_port_set_initialized(port, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uart_set_info_user(struct tty_struct *tty, struct serial_struct *ss)
|
||||
@ -3061,26 +3045,25 @@ static ssize_t console_store(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&port->mutex);
|
||||
guard(mutex)(&port->mutex);
|
||||
uport = uart_port_check(state);
|
||||
if (uport) {
|
||||
oldconsole = uart_console_registered(uport);
|
||||
if (oldconsole && !newconsole) {
|
||||
ret = unregister_console(uport->cons);
|
||||
} else if (!oldconsole && newconsole) {
|
||||
if (uart_console(uport)) {
|
||||
uport->console_reinit = 1;
|
||||
register_console(uport->cons);
|
||||
} else {
|
||||
ret = -ENOENT;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ret = -ENXIO;
|
||||
}
|
||||
mutex_unlock(&port->mutex);
|
||||
if (!uport)
|
||||
return -ENXIO;
|
||||
|
||||
return ret < 0 ? ret : count;
|
||||
oldconsole = uart_console_registered(uport);
|
||||
if (oldconsole && !newconsole) {
|
||||
ret = unregister_console(uport->cons);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else if (!oldconsole && newconsole) {
|
||||
if (!uart_console(uport))
|
||||
return -ENOENT;
|
||||
|
||||
uport->console_reinit = 1;
|
||||
register_console(uport->cons);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RO(uartclk);
|
||||
@ -3136,7 +3119,6 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u
|
||||
{
|
||||
struct uart_state *state;
|
||||
struct tty_port *port;
|
||||
int ret = 0;
|
||||
struct device *tty_dev;
|
||||
int num_groups;
|
||||
|
||||
@ -3146,11 +3128,9 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u
|
||||
state = drv->state + uport->line;
|
||||
port = &state->port;
|
||||
|
||||
mutex_lock(&port->mutex);
|
||||
if (state->uart_port) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
guard(mutex)(&port->mutex);
|
||||
if (state->uart_port)
|
||||
return -EINVAL;
|
||||
|
||||
/* Link the port to the driver state table and vice versa */
|
||||
atomic_set(&state->refcount, 1);
|
||||
@ -3170,10 +3150,8 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u
|
||||
uport->minor = drv->tty_driver->minor_start + uport->line;
|
||||
uport->name = kasprintf(GFP_KERNEL, "%s%d", drv->dev_name,
|
||||
drv->tty_driver->name_base + uport->line);
|
||||
if (!uport->name) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (!uport->name)
|
||||
return -ENOMEM;
|
||||
|
||||
if (uport->cons && uport->dev)
|
||||
of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
|
||||
@ -3189,10 +3167,9 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u
|
||||
|
||||
uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),
|
||||
GFP_KERNEL);
|
||||
if (!uport->tty_groups) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (!uport->tty_groups)
|
||||
return -ENOMEM;
|
||||
|
||||
uport->tty_groups[0] = &tty_dev_attr_group;
|
||||
if (uport->attr_group)
|
||||
uport->tty_groups[1] = uport->attr_group;
|
||||
@ -3215,10 +3192,7 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u
|
||||
uport->line);
|
||||
}
|
||||
|
||||
out:
|
||||
mutex_unlock(&port->mutex);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3384,7 +3358,7 @@ int serial_core_register_port(struct uart_driver *drv, struct uart_port *port)
|
||||
struct serial_ctrl_device *ctrl_dev, *new_ctrl_dev = NULL;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&port_mutex);
|
||||
guard(mutex)(&port_mutex);
|
||||
|
||||
/*
|
||||
* Prevent serial_port_runtime_resume() from trying to use the port
|
||||
@ -3396,10 +3370,8 @@ int serial_core_register_port(struct uart_driver *drv, struct uart_port *port)
|
||||
ctrl_dev = serial_core_ctrl_find(drv, port->dev, port->ctrl_id);
|
||||
if (!ctrl_dev) {
|
||||
new_ctrl_dev = serial_core_ctrl_device_add(port);
|
||||
if (IS_ERR(new_ctrl_dev)) {
|
||||
ret = PTR_ERR(new_ctrl_dev);
|
||||
goto err_unlock;
|
||||
}
|
||||
if (IS_ERR(new_ctrl_dev))
|
||||
return PTR_ERR(new_ctrl_dev);
|
||||
ctrl_dev = new_ctrl_dev;
|
||||
}
|
||||
|
||||
@ -3420,8 +3392,6 @@ int serial_core_register_port(struct uart_driver *drv, struct uart_port *port)
|
||||
if (ret)
|
||||
goto err_unregister_port_dev;
|
||||
|
||||
mutex_unlock(&port_mutex);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unregister_port_dev:
|
||||
@ -3430,9 +3400,6 @@ int serial_core_register_port(struct uart_driver *drv, struct uart_port *port)
|
||||
err_unregister_ctrl_dev:
|
||||
serial_base_ctrl_device_remove(new_ctrl_dev);
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&port_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -3571,7 +3571,7 @@ static int __init early_console_setup(struct earlycon_device *device,
|
||||
return -ENODEV;
|
||||
|
||||
device->port.type = type;
|
||||
memcpy(&sci_ports[0].port, &device->port, sizeof(struct uart_port));
|
||||
sci_ports[0].port = device->port;
|
||||
port_cfg.type = type;
|
||||
sci_ports[0].cfg = &port_cfg;
|
||||
sci_ports[0].params = sci_probe_regmap(&port_cfg);
|
||||
|
@ -3618,7 +3618,7 @@ void console_sysfs_notify(void)
|
||||
sysfs_notify(&consdev->kobj, NULL, "active");
|
||||
}
|
||||
|
||||
static struct ctl_table tty_table[] = {
|
||||
static const struct ctl_table tty_table[] = {
|
||||
{
|
||||
.procname = "legacy_tiocsti",
|
||||
.data = &tty_legacy_tiocsti,
|
||||
|
@ -2593,6 +2593,11 @@
|
||||
|
||||
#define PCI_VENDOR_ID_REDHAT 0x1b36
|
||||
|
||||
#define PCI_VENDOR_ID_WCHIC 0x1c00
|
||||
#define PCI_DEVICE_ID_WCHIC_CH382_0S1P 0x3050
|
||||
#define PCI_DEVICE_ID_WCHIC_CH382_2S1P 0x3250
|
||||
#define PCI_DEVICE_ID_WCHIC_CH382_2S 0x3253
|
||||
|
||||
#define PCI_VENDOR_ID_SILICOM_DENMARK 0x1c2c
|
||||
|
||||
#define PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS 0x1c36
|
||||
@ -2647,6 +2652,12 @@
|
||||
#define PCI_VENDOR_ID_AKS 0x416c
|
||||
#define PCI_DEVICE_ID_AKS_ALADDINCARD 0x0100
|
||||
|
||||
#define PCI_VENDOR_ID_WCHCN 0x4348
|
||||
#define PCI_DEVICE_ID_WCHCN_CH353_4S 0x3453
|
||||
#define PCI_DEVICE_ID_WCHCN_CH353_2S1PF 0x5046
|
||||
#define PCI_DEVICE_ID_WCHCN_CH353_1S1P 0x5053
|
||||
#define PCI_DEVICE_ID_WCHCN_CH353_2S1P 0x7053
|
||||
|
||||
#define PCI_VENDOR_ID_ACCESSIO 0x494f
|
||||
#define PCI_DEVICE_ID_ACCESSIO_WDG_CSM 0x22c0
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user