aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/tty/serial/of-serial.txt3
-rw-r--r--drivers/tty/serial/8250/8250.c52
-rw-r--r--drivers/tty/serial/8250/8250_pci.c21
-rw-r--r--drivers/tty/serial/8250/8250_pnp.c12
-rw-r--r--drivers/tty/serial/Kconfig4
-rw-r--r--drivers/tty/serial/bcm63xx_uart.c8
-rw-r--r--drivers/tty/serial/mpc52xx_uart.c2
-rw-r--r--drivers/tty/serial/of_serial.c6
-rw-r--r--drivers/tty/serial/vt8500_serial.c9
-rw-r--r--drivers/tty/tty_buffer.c2
-rw-r--r--include/uapi/linux/serial_core.h5
11 files changed, 91 insertions, 33 deletions
diff --git a/Documentation/devicetree/bindings/tty/serial/of-serial.txt b/Documentation/devicetree/bindings/tty/serial/of-serial.txt
index 1e1145ca4f3c..8f01cb190f25 100644
--- a/Documentation/devicetree/bindings/tty/serial/of-serial.txt
+++ b/Documentation/devicetree/bindings/tty/serial/of-serial.txt
@@ -11,6 +11,9 @@ Required properties:
11 - "nvidia,tegra20-uart" 11 - "nvidia,tegra20-uart"
12 - "nxp,lpc3220-uart" 12 - "nxp,lpc3220-uart"
13 - "ibm,qpace-nwp-serial" 13 - "ibm,qpace-nwp-serial"
14 - "altr,16550-FIFO32"
15 - "altr,16550-FIFO64"
16 - "altr,16550-FIFO128"
14 - "serial" if the port type is unknown. 17 - "serial" if the port type is unknown.
15- reg : offset and length of the register set for the device. 18- reg : offset and length of the register set for the device.
16- interrupts : should contain uart interrupt. 19- interrupts : should contain uart interrupt.
diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c
index 0efc815a4968..cf6a5383748a 100644
--- a/drivers/tty/serial/8250/8250.c
+++ b/drivers/tty/serial/8250/8250.c
@@ -301,7 +301,28 @@ static const struct serial8250_config uart_config[] = {
301 }, 301 },
302 [PORT_8250_CIR] = { 302 [PORT_8250_CIR] = {
303 .name = "CIR port" 303 .name = "CIR port"
304 } 304 },
305 [PORT_ALTR_16550_F32] = {
306 .name = "Altera 16550 FIFO32",
307 .fifo_size = 32,
308 .tx_loadsz = 32,
309 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
310 .flags = UART_CAP_FIFO | UART_CAP_AFE,
311 },
312 [PORT_ALTR_16550_F64] = {
313 .name = "Altera 16550 FIFO64",
314 .fifo_size = 64,
315 .tx_loadsz = 64,
316 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
317 .flags = UART_CAP_FIFO | UART_CAP_AFE,
318 },
319 [PORT_ALTR_16550_F128] = {
320 .name = "Altera 16550 FIFO128",
321 .fifo_size = 128,
322 .tx_loadsz = 128,
323 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
324 .flags = UART_CAP_FIFO | UART_CAP_AFE,
325 },
305}; 326};
306 327
307/* Uart divisor latch read */ 328/* Uart divisor latch read */
@@ -3396,3 +3417,32 @@ module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3396MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA"); 3417MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3397#endif 3418#endif
3398MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR); 3419MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);
3420
3421#ifndef MODULE
3422/* This module was renamed to 8250_core in 3.7. Keep the old "8250" name
3423 * working as well for the module options so we don't break people. We
3424 * need to keep the names identical and the convenient macros will happily
3425 * refuse to let us do that by failing the build with redefinition errors
3426 * of global variables. So we stick them inside a dummy function to avoid
3427 * those conflicts. The options still get parsed, and the redefined
3428 * MODULE_PARAM_PREFIX lets us keep the "8250." syntax alive.
3429 *
3430 * This is hacky. I'm sorry.
3431 */
3432static void __used s8250_options(void)
3433{
3434#undef MODULE_PARAM_PREFIX
3435#define MODULE_PARAM_PREFIX "8250."
3436
3437 module_param_cb(share_irqs, &param_ops_uint, &share_irqs, 0644);
3438 module_param_cb(nr_uarts, &param_ops_uint, &nr_uarts, 0644);
3439 module_param_cb(skip_txen_test, &param_ops_uint, &skip_txen_test, 0644);
3440#ifdef CONFIG_SERIAL_8250_RSA
3441 __module_param_call(MODULE_PARAM_PREFIX, probe_rsa,
3442 &param_array_ops, .arr = &__param_arr_probe_rsa,
3443 0444, -1);
3444#endif
3445}
3446#else
3447MODULE_ALIAS("8250");
3448#endif
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
index 791c5a77ec61..aa76825229dc 100644
--- a/drivers/tty/serial/8250/8250_pci.c
+++ b/drivers/tty/serial/8250/8250_pci.c
@@ -1571,6 +1571,7 @@ pci_wch_ch353_setup(struct serial_private *priv,
1571 1571
1572/* Unknown vendors/cards - this should not be in linux/pci_ids.h */ 1572/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
1573#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 1573#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
1574#define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588
1574 1575
1575/* 1576/*
1576 * Master list of serial port init/setup/exit quirks. 1577 * Master list of serial port init/setup/exit quirks.
@@ -1852,15 +1853,6 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
1852 }, 1853 },
1853 { 1854 {
1854 .vendor = PCI_VENDOR_ID_PLX, 1855 .vendor = PCI_VENDOR_ID_PLX,
1855 .device = PCI_DEVICE_ID_PLX_9050,
1856 .subvendor = PCI_VENDOR_ID_PLX,
1857 .subdevice = PCI_SUBDEVICE_ID_UNKNOWN_0x1584,
1858 .init = pci_plx9050_init,
1859 .setup = pci_default_setup,
1860 .exit = pci_plx9050_exit,
1861 },
1862 {
1863 .vendor = PCI_VENDOR_ID_PLX,
1864 .device = PCI_DEVICE_ID_PLX_ROMULUS, 1856 .device = PCI_DEVICE_ID_PLX_ROMULUS,
1865 .subvendor = PCI_VENDOR_ID_PLX, 1857 .subvendor = PCI_VENDOR_ID_PLX,
1866 .subdevice = PCI_DEVICE_ID_PLX_ROMULUS, 1858 .subdevice = PCI_DEVICE_ID_PLX_ROMULUS,
@@ -3733,7 +3725,12 @@ static struct pci_device_id serial_pci_tbl[] = {
3733 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, 3725 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
3734 PCI_VENDOR_ID_PLX, 3726 PCI_VENDOR_ID_PLX,
3735 PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0, 3727 PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0,
3736 pbn_b0_4_115200 }, 3728 pbn_b2_4_115200 },
3729 /* Unknown card - subdevice 0x1588 */
3730 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
3731 PCI_VENDOR_ID_PLX,
3732 PCI_SUBDEVICE_ID_UNKNOWN_0x1588, 0, 0,
3733 pbn_b2_8_115200 },
3737 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, 3734 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
3738 PCI_SUBVENDOR_ID_KEYSPAN, 3735 PCI_SUBVENDOR_ID_KEYSPAN,
3739 PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0, 3736 PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0,
@@ -4791,6 +4788,10 @@ static struct pci_device_id serial_pci_tbl[] = {
4791 PCI_VENDOR_ID_IBM, 0x0299, 4788 PCI_VENDOR_ID_IBM, 0x0299,
4792 0, 0, pbn_b0_bt_2_115200 }, 4789 0, 0, pbn_b0_bt_2_115200 },
4793 4790
4791 { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
4792 0x1000, 0x0012,
4793 0, 0, pbn_b0_bt_2_115200 },
4794
4794 { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9901, 4795 { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9901,
4795 0xA000, 0x1000, 4796 0xA000, 0x1000,
4796 0, 0, pbn_b0_1_115200 }, 4797 0, 0, pbn_b0_1_115200 },
diff --git a/drivers/tty/serial/8250/8250_pnp.c b/drivers/tty/serial/8250/8250_pnp.c
index 35d9ab95c5cb..b3455a970a1d 100644
--- a/drivers/tty/serial/8250/8250_pnp.c
+++ b/drivers/tty/serial/8250/8250_pnp.c
@@ -429,6 +429,7 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
429{ 429{
430 struct uart_8250_port uart; 430 struct uart_8250_port uart;
431 int ret, line, flags = dev_id->driver_data; 431 int ret, line, flags = dev_id->driver_data;
432 struct resource *res = NULL;
432 433
433 if (flags & UNKNOWN_DEV) { 434 if (flags & UNKNOWN_DEV) {
434 ret = serial_pnp_guess_board(dev); 435 ret = serial_pnp_guess_board(dev);
@@ -439,11 +440,12 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
439 memset(&uart, 0, sizeof(uart)); 440 memset(&uart, 0, sizeof(uart));
440 if (pnp_irq_valid(dev, 0)) 441 if (pnp_irq_valid(dev, 0))
441 uart.port.irq = pnp_irq(dev, 0); 442 uart.port.irq = pnp_irq(dev, 0);
442 if ((flags & CIR_PORT) && pnp_port_valid(dev, 2)) { 443 if ((flags & CIR_PORT) && pnp_port_valid(dev, 2))
443 uart.port.iobase = pnp_port_start(dev, 2); 444 res = pnp_get_resource(dev, IORESOURCE_IO, 2);
444 uart.port.iotype = UPIO_PORT; 445 else if (pnp_port_valid(dev, 0))
445 } else if (pnp_port_valid(dev, 0)) { 446 res = pnp_get_resource(dev, IORESOURCE_IO, 0);
446 uart.port.iobase = pnp_port_start(dev, 0); 447 if (pnp_resource_enabled(res)) {
448 uart.port.iobase = res->start;
447 uart.port.iotype = UPIO_PORT; 449 uart.port.iotype = UPIO_PORT;
448 } else if (pnp_mem_valid(dev, 0)) { 450 } else if (pnp_mem_valid(dev, 0)) {
449 uart.port.mapbase = pnp_mem_start(dev, 0); 451 uart.port.mapbase = pnp_mem_start(dev, 0);
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index cf9210db9fa9..7e7006fd404e 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -211,14 +211,14 @@ config SERIAL_SAMSUNG
211config SERIAL_SAMSUNG_UARTS_4 211config SERIAL_SAMSUNG_UARTS_4
212 bool 212 bool
213 depends on PLAT_SAMSUNG 213 depends on PLAT_SAMSUNG
214 default y if !(CPU_S3C2410 || SERIAL_S3C2412 || CPU_S3C2440 || CPU_S3C2442) 214 default y if !(CPU_S3C2410 || CPU_S3C2412 || CPU_S3C2440 || CPU_S3C2442)
215 help 215 help
216 Internal node for the common case of 4 Samsung compatible UARTs 216 Internal node for the common case of 4 Samsung compatible UARTs
217 217
218config SERIAL_SAMSUNG_UARTS 218config SERIAL_SAMSUNG_UARTS
219 int 219 int
220 depends on PLAT_SAMSUNG 220 depends on PLAT_SAMSUNG
221 default 6 if ARCH_S5P6450 221 default 6 if CPU_S5P6450
222 default 4 if SERIAL_SAMSUNG_UARTS_4 || CPU_S3C2416 222 default 4 if SERIAL_SAMSUNG_UARTS_4 || CPU_S3C2416
223 default 3 223 default 3
224 help 224 help
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c
index 719594e5fc21..52a3ecd40421 100644
--- a/drivers/tty/serial/bcm63xx_uart.c
+++ b/drivers/tty/serial/bcm63xx_uart.c
@@ -235,7 +235,7 @@ static const char *bcm_uart_type(struct uart_port *port)
235 */ 235 */
236static void bcm_uart_do_rx(struct uart_port *port) 236static void bcm_uart_do_rx(struct uart_port *port)
237{ 237{
238 struct tty_port *port = &port->state->port; 238 struct tty_port *tty_port = &port->state->port;
239 unsigned int max_count; 239 unsigned int max_count;
240 240
241 /* limit number of char read in interrupt, should not be 241 /* limit number of char read in interrupt, should not be
@@ -260,7 +260,7 @@ static void bcm_uart_do_rx(struct uart_port *port)
260 bcm_uart_writel(port, val, UART_CTL_REG); 260 bcm_uart_writel(port, val, UART_CTL_REG);
261 261
262 port->icount.overrun++; 262 port->icount.overrun++;
263 tty_insert_flip_char(port, 0, TTY_OVERRUN); 263 tty_insert_flip_char(tty_port, 0, TTY_OVERRUN);
264 } 264 }
265 265
266 if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY))) 266 if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY)))
@@ -299,11 +299,11 @@ static void bcm_uart_do_rx(struct uart_port *port)
299 299
300 300
301 if ((cstat & port->ignore_status_mask) == 0) 301 if ((cstat & port->ignore_status_mask) == 0)
302 tty_insert_flip_char(port, c, flag); 302 tty_insert_flip_char(tty_port, c, flag);
303 303
304 } while (--max_count); 304 } while (--max_count);
305 305
306 tty_flip_buffer_push(port); 306 tty_flip_buffer_push(tty_port);
307} 307}
308 308
309/* 309/*
diff --git a/drivers/tty/serial/mpc52xx_uart.c b/drivers/tty/serial/mpc52xx_uart.c
index c0e1fad51be7..018bad922554 100644
--- a/drivers/tty/serial/mpc52xx_uart.c
+++ b/drivers/tty/serial/mpc52xx_uart.c
@@ -550,7 +550,7 @@ static int mpc512x_psc_clock(struct uart_port *port, int enable)
550 return 0; 550 return 0;
551 551
552 psc_num = (port->mapbase & 0xf00) >> 8; 552 psc_num = (port->mapbase & 0xf00) >> 8;
553 snprintf(clk_name, sizeof(clk_name), "psc%d_clk", psc_num); 553 snprintf(clk_name, sizeof(clk_name), "psc%d_mclk", psc_num);
554 psc_clk = clk_get(port->dev, clk_name); 554 psc_clk = clk_get(port->dev, clk_name);
555 if (IS_ERR(psc_clk)) { 555 if (IS_ERR(psc_clk)) {
556 dev_err(port->dev, "Failed to get PSC clock entry!\n"); 556 dev_err(port->dev, "Failed to get PSC clock entry!\n");
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c
index d5874605682b..b025d5438275 100644
--- a/drivers/tty/serial/of_serial.c
+++ b/drivers/tty/serial/of_serial.c
@@ -241,6 +241,12 @@ static struct of_device_id of_platform_serial_table[] = {
241 { .compatible = "ns16850", .data = (void *)PORT_16850, }, 241 { .compatible = "ns16850", .data = (void *)PORT_16850, },
242 { .compatible = "nvidia,tegra20-uart", .data = (void *)PORT_TEGRA, }, 242 { .compatible = "nvidia,tegra20-uart", .data = (void *)PORT_TEGRA, },
243 { .compatible = "nxp,lpc3220-uart", .data = (void *)PORT_LPC3220, }, 243 { .compatible = "nxp,lpc3220-uart", .data = (void *)PORT_LPC3220, },
244 { .compatible = "altr,16550-FIFO32",
245 .data = (void *)PORT_ALTR_16550_F32, },
246 { .compatible = "altr,16550-FIFO64",
247 .data = (void *)PORT_ALTR_16550_F64, },
248 { .compatible = "altr,16550-FIFO128",
249 .data = (void *)PORT_ALTR_16550_F128, },
244#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL 250#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL
245 { .compatible = "ibm,qpace-nwp-serial", 251 { .compatible = "ibm,qpace-nwp-serial",
246 .data = (void *)PORT_NWPSERIAL, }, 252 .data = (void *)PORT_NWPSERIAL, },
diff --git a/drivers/tty/serial/vt8500_serial.c b/drivers/tty/serial/vt8500_serial.c
index a3f9dd5c9dff..705240e6c4ec 100644
--- a/drivers/tty/serial/vt8500_serial.c
+++ b/drivers/tty/serial/vt8500_serial.c
@@ -611,14 +611,7 @@ static int vt8500_serial_probe(struct platform_device *pdev)
611 vt8500_port->uart.dev = &pdev->dev; 611 vt8500_port->uart.dev = &pdev->dev;
612 vt8500_port->uart.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF; 612 vt8500_port->uart.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
613 613
614 vt8500_port->clk = of_clk_get(pdev->dev.of_node, 0); 614 vt8500_port->uart.uartclk = clk_get_rate(vt8500_port->clk);
615 if (!IS_ERR(vt8500_port->clk)) {
616 vt8500_port->uart.uartclk = clk_get_rate(vt8500_port->clk);
617 } else {
618 /* use the default of 24Mhz if not specified and warn */
619 pr_warn("%s: serial clock source not specified\n", __func__);
620 vt8500_port->uart.uartclk = 24000000;
621 }
622 615
623 snprintf(vt8500_port->name, sizeof(vt8500_port->name), 616 snprintf(vt8500_port->name, sizeof(vt8500_port->name),
624 "VT8500 UART%d", pdev->id); 617 "VT8500 UART%d", pdev->id);
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index bb119934e76c..578aa7594b11 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -425,7 +425,7 @@ static void flush_to_ldisc(struct work_struct *work)
425 struct tty_ldisc *disc; 425 struct tty_ldisc *disc;
426 426
427 tty = port->itty; 427 tty = port->itty;
428 if (WARN_RATELIMIT(tty == NULL, "tty is NULL\n")) 428 if (tty == NULL)
429 return; 429 return;
430 430
431 disc = tty_ldisc_ref(tty); 431 disc = tty_ldisc_ref(tty);
diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h
index b6a23a483d74..74c2bf7211f8 100644
--- a/include/uapi/linux/serial_core.h
+++ b/include/uapi/linux/serial_core.h
@@ -51,7 +51,10 @@
51#define PORT_8250_CIR 23 /* CIR infrared port, has its own driver */ 51#define PORT_8250_CIR 23 /* CIR infrared port, has its own driver */
52#define PORT_XR17V35X 24 /* Exar XR17V35x UARTs */ 52#define PORT_XR17V35X 24 /* Exar XR17V35x UARTs */
53#define PORT_BRCM_TRUMANAGE 25 53#define PORT_BRCM_TRUMANAGE 25
54#define PORT_MAX_8250 25 /* max port ID */ 54#define PORT_ALTR_16550_F32 26 /* Altera 16550 UART with 32 FIFOs */
55#define PORT_ALTR_16550_F64 27 /* Altera 16550 UART with 64 FIFOs */
56#define PORT_ALTR_16550_F128 28 /* Altera 16550 UART with 128 FIFOs */
57#define PORT_MAX_8250 28 /* max port ID */
55 58
56/* 59/*
57 * ARM specific type numbers. These are not currently guaranteed 60 * ARM specific type numbers. These are not currently guaranteed