aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt14
-rw-r--r--Documentation/devicetree/bindings/tty/serial/of-serial.txt2
-rw-r--r--arch/ia64/hp/sim/simserial.c2
-rw-r--r--drivers/bluetooth/hci_ath.c2
-rw-r--r--drivers/char/mwave/mwavedd.c16
-rw-r--r--drivers/char/pcmcia/synclink_cs.c24
-rw-r--r--drivers/isdn/gigaset/interface.c4
-rw-r--r--drivers/isdn/i4l/isdn_tty.c16
-rw-r--r--drivers/misc/ibmasm/uart.c16
-rw-r--r--drivers/mmc/card/sdio_uart.c20
-rw-r--r--drivers/net/ethernet/sgi/ioc3-eth.c22
-rw-r--r--drivers/net/irda/irtty-sir.c10
-rw-r--r--drivers/net/usb/hso.c12
-rw-r--r--drivers/tty/amiserial.c20
-rw-r--r--drivers/tty/cyclades.c82
-rw-r--r--drivers/tty/hvc/hvsi_lib.c2
-rw-r--r--drivers/tty/isicom.c8
-rw-r--r--drivers/tty/moxa.c10
-rw-r--r--drivers/tty/mxser.c20
-rw-r--r--drivers/tty/n_gsm.c8
-rw-r--r--drivers/tty/n_tty.c8
-rw-r--r--drivers/tty/pty.c169
-rw-r--r--drivers/tty/rocket.c18
-rw-r--r--drivers/tty/serial/8250/8250.c80
-rw-r--r--drivers/tty/serial/8250/8250.h31
-rw-r--r--drivers/tty/serial/8250/8250_acorn.c22
-rw-r--r--drivers/tty/serial/8250/8250_dw.c38
-rw-r--r--drivers/tty/serial/8250/8250_gsc.c26
-rw-r--r--drivers/tty/serial/8250/8250_hp300.c26
-rw-r--r--drivers/tty/serial/8250/8250_pci.c126
-rw-r--r--drivers/tty/serial/8250/8250_pnp.c28
-rw-r--r--drivers/tty/serial/8250/serial_cs.c30
-rw-r--r--drivers/tty/serial/Kconfig19
-rw-r--r--drivers/tty/serial/Makefile1
-rw-r--r--drivers/tty/serial/amba-pl011.c34
-rw-r--r--drivers/tty/serial/bfin_uart.c2
-rw-r--r--drivers/tty/serial/crisv10.c26
-rw-r--r--drivers/tty/serial/imx.c2
-rw-r--r--drivers/tty/serial/ioc4_serial.c2
-rw-r--r--drivers/tty/serial/jsm/jsm_tty.c8
-rw-r--r--drivers/tty/serial/lpc32xx_hs.c823
-rw-r--r--drivers/tty/serial/of_serial.c13
-rw-r--r--drivers/tty/serial/pxa.c14
-rw-r--r--drivers/tty/serial/samsung.c26
-rw-r--r--drivers/tty/serial/serial_core.c28
-rw-r--r--drivers/tty/synclink.c36
-rw-r--r--drivers/tty/synclink_gt.c24
-rw-r--r--drivers/tty/synclinkmp.c24
-rw-r--r--drivers/tty/tty_io.c122
-rw-r--r--drivers/tty/tty_ioctl.c100
-rw-r--r--drivers/tty/tty_ldisc.c13
-rw-r--r--drivers/tty/tty_port.c23
-rw-r--r--drivers/tty/vt/keyboard.c50
-rw-r--r--drivers/tty/vt/vt.c63
-rw-r--r--drivers/usb/class/cdc-acm.c2
-rw-r--r--drivers/usb/serial/ark3116.c4
-rw-r--r--drivers/usb/serial/belkin_sa.c2
-rw-r--r--drivers/usb/serial/cp210x.c8
-rw-r--r--drivers/usb/serial/cypress_m8.c40
-rw-r--r--drivers/usb/serial/digi_acceleport.c14
-rw-r--r--drivers/usb/serial/empeg.c2
-rw-r--r--drivers/usb/serial/f81232.c3
-rw-r--r--drivers/usb/serial/ftdi_sio.c2
-rw-r--r--drivers/usb/serial/io_edgeport.c12
-rw-r--r--drivers/usb/serial/io_ti.c12
-rw-r--r--drivers/usb/serial/ir-usb.c2
-rw-r--r--drivers/usb/serial/iuu_phoenix.c28
-rw-r--r--drivers/usb/serial/keyspan.c6
-rw-r--r--drivers/usb/serial/keyspan_pda.c4
-rw-r--r--drivers/usb/serial/kl5kusb105.c18
-rw-r--r--drivers/usb/serial/kobil_sct.c14
-rw-r--r--drivers/usb/serial/mct_u232.c4
-rw-r--r--drivers/usb/serial/metro-usb.c8
-rw-r--r--drivers/usb/serial/mos7720.c14
-rw-r--r--drivers/usb/serial/mos7840.c12
-rw-r--r--drivers/usb/serial/oti6858.c10
-rw-r--r--drivers/usb/serial/pl2303.c6
-rw-r--r--drivers/usb/serial/quatech2.c4
-rw-r--r--drivers/usb/serial/sierra.c2
-rw-r--r--drivers/usb/serial/spcp8x5.c12
-rw-r--r--drivers/usb/serial/ssu100.c4
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.c10
-rw-r--r--drivers/usb/serial/usb-serial.c7
-rw-r--r--drivers/usb/serial/usb_wwan.c2
-rw-r--r--drivers/usb/serial/whiteheat.c2
-rw-r--r--include/linux/Kbuild3
-rw-r--r--include/linux/cd1400.h292
-rw-r--r--include/linux/cdk.h486
-rw-r--r--include/linux/comstats.h119
-rw-r--r--include/linux/generic_serial.h35
-rw-r--r--include/linux/istallion.h123
-rw-r--r--include/linux/kbd_kern.h13
-rw-r--r--include/linux/sc26198.h533
-rw-r--r--include/linux/serial167.h157
-rw-r--r--include/linux/serial_8250.h33
-rw-r--r--include/linux/stallion.h147
-rw-r--r--include/linux/tty.h52
-rw-r--r--include/linux/tty_driver.h12
-rw-r--r--include/net/irda/ircomm_tty.h17
-rw-r--r--net/bluetooth/rfcomm/tty.c2
-rw-r--r--net/irda/ircomm/ircomm_param.c5
-rw-r--r--net/irda/ircomm/ircomm_tty.c281
-rw-r--r--net/irda/ircomm/ircomm_tty_attach.c40
-rw-r--r--net/irda/ircomm/ircomm_tty_ioctl.c33
104 files changed, 1998 insertions, 3020 deletions
diff --git a/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt b/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt
new file mode 100644
index 000000000000..0d439dfc1aa5
--- /dev/null
+++ b/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt
@@ -0,0 +1,14 @@
1* NXP LPC32xx SoC High Speed UART
2
3Required properties:
4- compatible: Should be "nxp,lpc3220-hsuart"
5- reg: Should contain registers location and length
6- interrupts: Should contain interrupt
7
8Example:
9
10 uart1: serial@40014000 {
11 compatible = "nxp,lpc3220-hsuart";
12 reg = <0x40014000 0x1000>;
13 interrupts = <26 0>;
14 };
diff --git a/Documentation/devicetree/bindings/tty/serial/of-serial.txt b/Documentation/devicetree/bindings/tty/serial/of-serial.txt
index 0847fdeee11a..ba385f2e0ddc 100644
--- a/Documentation/devicetree/bindings/tty/serial/of-serial.txt
+++ b/Documentation/devicetree/bindings/tty/serial/of-serial.txt
@@ -25,6 +25,8 @@ Optional properties:
25 accesses to the UART (e.g. TI davinci). 25 accesses to the UART (e.g. TI davinci).
26- used-by-rtas : set to indicate that the port is in use by the OpenFirmware 26- used-by-rtas : set to indicate that the port is in use by the OpenFirmware
27 RTAS and should not be registered. 27 RTAS and should not be registered.
28- no-loopback-test: set to indicate that the port does not implements loopback
29 test mode
28 30
29Example: 31Example:
30 32
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c
index c34785dca92b..1ce97f497d23 100644
--- a/arch/ia64/hp/sim/simserial.c
+++ b/arch/ia64/hp/sim/simserial.c
@@ -338,7 +338,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
338{ 338{
339 /* Handle turning off CRTSCTS */ 339 /* Handle turning off CRTSCTS */
340 if ((old_termios->c_cflag & CRTSCTS) && 340 if ((old_termios->c_cflag & CRTSCTS) &&
341 !(tty->termios->c_cflag & CRTSCTS)) { 341 !(tty->termios.c_cflag & CRTSCTS)) {
342 tty->hw_stopped = 0; 342 tty->hw_stopped = 0;
343 } 343 }
344} 344}
diff --git a/drivers/bluetooth/hci_ath.c b/drivers/bluetooth/hci_ath.c
index 12172a6a95c4..0bc8a6a6a148 100644
--- a/drivers/bluetooth/hci_ath.c
+++ b/drivers/bluetooth/hci_ath.c
@@ -58,7 +58,7 @@ static int ath_wakeup_ar3k(struct tty_struct *tty)
58 return status; 58 return status;
59 59
60 /* Disable Automatic RTSCTS */ 60 /* Disable Automatic RTSCTS */
61 memcpy(&ktermios, tty->termios, sizeof(ktermios)); 61 ktermios = tty->termios;
62 ktermios.c_cflag &= ~CRTSCTS; 62 ktermios.c_cflag &= ~CRTSCTS;
63 tty_set_termios(tty, &ktermios); 63 tty_set_termios(tty, &ktermios);
64 64
diff --git a/drivers/char/mwave/mwavedd.c b/drivers/char/mwave/mwavedd.c
index 1d82d5838f0c..164544afd680 100644
--- a/drivers/char/mwave/mwavedd.c
+++ b/drivers/char/mwave/mwavedd.c
@@ -430,7 +430,7 @@ static ssize_t mwave_write(struct file *file, const char __user *buf,
430 430
431static int register_serial_portandirq(unsigned int port, int irq) 431static int register_serial_portandirq(unsigned int port, int irq)
432{ 432{
433 struct uart_port uart; 433 struct uart_8250_port uart;
434 434
435 switch ( port ) { 435 switch ( port ) {
436 case 0x3f8: 436 case 0x3f8:
@@ -462,14 +462,14 @@ static int register_serial_portandirq(unsigned int port, int irq)
462 } /* switch */ 462 } /* switch */
463 /* irq is okay */ 463 /* irq is okay */
464 464
465 memset(&uart, 0, sizeof(struct uart_port)); 465 memset(&uart, 0, sizeof(uart));
466 466
467 uart.uartclk = 1843200; 467 uart.port.uartclk = 1843200;
468 uart.iobase = port; 468 uart.port.iobase = port;
469 uart.irq = irq; 469 uart.port.irq = irq;
470 uart.iotype = UPIO_PORT; 470 uart.port.iotype = UPIO_PORT;
471 uart.flags = UPF_SHARE_IRQ; 471 uart.port.flags = UPF_SHARE_IRQ;
472 return serial8250_register_port(&uart); 472 return serial8250_register_8250_port(&uart);
473} 473}
474 474
475 475
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 0a484b4a1b02..d0cbd29ecfd7 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -1344,7 +1344,7 @@ static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty)
1344 /* TODO:disable interrupts instead of reset to preserve signal states */ 1344 /* TODO:disable interrupts instead of reset to preserve signal states */
1345 reset_device(info); 1345 reset_device(info);
1346 1346
1347 if (!tty || tty->termios->c_cflag & HUPCL) { 1347 if (!tty || tty->termios.c_cflag & HUPCL) {
1348 info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); 1348 info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
1349 set_signals(info); 1349 set_signals(info);
1350 } 1350 }
@@ -1385,7 +1385,7 @@ static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty)
1385 port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI); 1385 port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI);
1386 get_signals(info); 1386 get_signals(info);
1387 1387
1388 if (info->netcount || (tty && (tty->termios->c_cflag & CREAD))) 1388 if (info->netcount || (tty && (tty->termios.c_cflag & CREAD)))
1389 rx_start(info); 1389 rx_start(info);
1390 1390
1391 spin_unlock_irqrestore(&info->lock,flags); 1391 spin_unlock_irqrestore(&info->lock,flags);
@@ -1398,14 +1398,14 @@ static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty)
1398 unsigned cflag; 1398 unsigned cflag;
1399 int bits_per_char; 1399 int bits_per_char;
1400 1400
1401 if (!tty || !tty->termios) 1401 if (!tty)
1402 return; 1402 return;
1403 1403
1404 if (debug_level >= DEBUG_LEVEL_INFO) 1404 if (debug_level >= DEBUG_LEVEL_INFO)
1405 printk("%s(%d):mgslpc_change_params(%s)\n", 1405 printk("%s(%d):mgslpc_change_params(%s)\n",
1406 __FILE__,__LINE__, info->device_name ); 1406 __FILE__,__LINE__, info->device_name );
1407 1407
1408 cflag = tty->termios->c_cflag; 1408 cflag = tty->termios.c_cflag;
1409 1409
1410 /* if B0 rate (hangup) specified then negate DTR and RTS */ 1410 /* if B0 rate (hangup) specified then negate DTR and RTS */
1411 /* otherwise assert DTR and RTS */ 1411 /* otherwise assert DTR and RTS */
@@ -1728,7 +1728,7 @@ static void mgslpc_throttle(struct tty_struct * tty)
1728 if (I_IXOFF(tty)) 1728 if (I_IXOFF(tty))
1729 mgslpc_send_xchar(tty, STOP_CHAR(tty)); 1729 mgslpc_send_xchar(tty, STOP_CHAR(tty));
1730 1730
1731 if (tty->termios->c_cflag & CRTSCTS) { 1731 if (tty->termios.c_cflag & CRTSCTS) {
1732 spin_lock_irqsave(&info->lock,flags); 1732 spin_lock_irqsave(&info->lock,flags);
1733 info->serial_signals &= ~SerialSignal_RTS; 1733 info->serial_signals &= ~SerialSignal_RTS;
1734 set_signals(info); 1734 set_signals(info);
@@ -1757,7 +1757,7 @@ static void mgslpc_unthrottle(struct tty_struct * tty)
1757 mgslpc_send_xchar(tty, START_CHAR(tty)); 1757 mgslpc_send_xchar(tty, START_CHAR(tty));
1758 } 1758 }
1759 1759
1760 if (tty->termios->c_cflag & CRTSCTS) { 1760 if (tty->termios.c_cflag & CRTSCTS) {
1761 spin_lock_irqsave(&info->lock,flags); 1761 spin_lock_irqsave(&info->lock,flags);
1762 info->serial_signals |= SerialSignal_RTS; 1762 info->serial_signals |= SerialSignal_RTS;
1763 set_signals(info); 1763 set_signals(info);
@@ -2293,8 +2293,8 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
2293 tty->driver->name ); 2293 tty->driver->name );
2294 2294
2295 /* just return if nothing has changed */ 2295 /* just return if nothing has changed */
2296 if ((tty->termios->c_cflag == old_termios->c_cflag) 2296 if ((tty->termios.c_cflag == old_termios->c_cflag)
2297 && (RELEVANT_IFLAG(tty->termios->c_iflag) 2297 && (RELEVANT_IFLAG(tty->termios.c_iflag)
2298 == RELEVANT_IFLAG(old_termios->c_iflag))) 2298 == RELEVANT_IFLAG(old_termios->c_iflag)))
2299 return; 2299 return;
2300 2300
@@ -2302,7 +2302,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
2302 2302
2303 /* Handle transition to B0 status */ 2303 /* Handle transition to B0 status */
2304 if (old_termios->c_cflag & CBAUD && 2304 if (old_termios->c_cflag & CBAUD &&
2305 !(tty->termios->c_cflag & CBAUD)) { 2305 !(tty->termios.c_cflag & CBAUD)) {
2306 info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); 2306 info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
2307 spin_lock_irqsave(&info->lock,flags); 2307 spin_lock_irqsave(&info->lock,flags);
2308 set_signals(info); 2308 set_signals(info);
@@ -2311,9 +2311,9 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
2311 2311
2312 /* Handle transition away from B0 status */ 2312 /* Handle transition away from B0 status */
2313 if (!(old_termios->c_cflag & CBAUD) && 2313 if (!(old_termios->c_cflag & CBAUD) &&
2314 tty->termios->c_cflag & CBAUD) { 2314 tty->termios.c_cflag & CBAUD) {
2315 info->serial_signals |= SerialSignal_DTR; 2315 info->serial_signals |= SerialSignal_DTR;
2316 if (!(tty->termios->c_cflag & CRTSCTS) || 2316 if (!(tty->termios.c_cflag & CRTSCTS) ||
2317 !test_bit(TTY_THROTTLED, &tty->flags)) { 2317 !test_bit(TTY_THROTTLED, &tty->flags)) {
2318 info->serial_signals |= SerialSignal_RTS; 2318 info->serial_signals |= SerialSignal_RTS;
2319 } 2319 }
@@ -2324,7 +2324,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
2324 2324
2325 /* Handle turning off CRTSCTS */ 2325 /* Handle turning off CRTSCTS */
2326 if (old_termios->c_cflag & CRTSCTS && 2326 if (old_termios->c_cflag & CRTSCTS &&
2327 !(tty->termios->c_cflag & CRTSCTS)) { 2327 !(tty->termios.c_cflag & CRTSCTS)) {
2328 tty->hw_stopped = 0; 2328 tty->hw_stopped = 0;
2329 tx_release(tty); 2329 tx_release(tty);
2330 } 2330 }
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c
index a6d9fd2858f7..f9aab7490868 100644
--- a/drivers/isdn/gigaset/interface.c
+++ b/drivers/isdn/gigaset/interface.c
@@ -446,8 +446,8 @@ static void if_set_termios(struct tty_struct *tty, struct ktermios *old)
446 goto out; 446 goto out;
447 } 447 }
448 448
449 iflag = tty->termios->c_iflag; 449 iflag = tty->termios.c_iflag;
450 cflag = tty->termios->c_cflag; 450 cflag = tty->termios.c_cflag;
451 old_cflag = old ? old->c_cflag : cflag; 451 old_cflag = old ? old->c_cflag : cflag;
452 gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x", 452 gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x",
453 cs->minor_index, iflag, cflag, old_cflag); 453 cs->minor_index, iflag, cflag, old_cflag);
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c
index 7bc50670d7d9..7a61ef6cffaa 100644
--- a/drivers/isdn/i4l/isdn_tty.c
+++ b/drivers/isdn/i4l/isdn_tty.c
@@ -1009,15 +1009,15 @@ isdn_tty_change_speed(modem_info *info)
1009 quot; 1009 quot;
1010 int i; 1010 int i;
1011 1011
1012 if (!port->tty || !port->tty->termios) 1012 if (!port->tty)
1013 return; 1013 return;
1014 cflag = port->tty->termios->c_cflag; 1014 cflag = port->tty->termios.c_cflag;
1015 1015
1016 quot = i = cflag & CBAUD; 1016 quot = i = cflag & CBAUD;
1017 if (i & CBAUDEX) { 1017 if (i & CBAUDEX) {
1018 i &= ~CBAUDEX; 1018 i &= ~CBAUDEX;
1019 if (i < 1 || i > 2) 1019 if (i < 1 || i > 2)
1020 port->tty->termios->c_cflag &= ~CBAUDEX; 1020 port->tty->termios.c_cflag &= ~CBAUDEX;
1021 else 1021 else
1022 i += 15; 1022 i += 15;
1023 } 1023 }
@@ -1097,7 +1097,7 @@ isdn_tty_shutdown(modem_info *info)
1097#endif 1097#endif
1098 isdn_unlock_drivers(); 1098 isdn_unlock_drivers();
1099 info->msr &= ~UART_MSR_RI; 1099 info->msr &= ~UART_MSR_RI;
1100 if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) { 1100 if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
1101 info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); 1101 info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS);
1102 if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) { 1102 if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) {
1103 isdn_tty_modem_reset_regs(info, 0); 1103 isdn_tty_modem_reset_regs(info, 0);
@@ -1469,13 +1469,13 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1469 if (!old_termios) 1469 if (!old_termios)
1470 isdn_tty_change_speed(info); 1470 isdn_tty_change_speed(info);
1471 else { 1471 else {
1472 if (tty->termios->c_cflag == old_termios->c_cflag && 1472 if (tty->termios.c_cflag == old_termios->c_cflag &&
1473 tty->termios->c_ispeed == old_termios->c_ispeed && 1473 tty->termios.c_ispeed == old_termios->c_ispeed &&
1474 tty->termios->c_ospeed == old_termios->c_ospeed) 1474 tty->termios.c_ospeed == old_termios->c_ospeed)
1475 return; 1475 return;
1476 isdn_tty_change_speed(info); 1476 isdn_tty_change_speed(info);
1477 if ((old_termios->c_cflag & CRTSCTS) && 1477 if ((old_termios->c_cflag & CRTSCTS) &&
1478 !(tty->termios->c_cflag & CRTSCTS)) 1478 !(tty->termios.c_cflag & CRTSCTS))
1479 tty->hw_stopped = 0; 1479 tty->hw_stopped = 0;
1480 } 1480 }
1481} 1481}
diff --git a/drivers/misc/ibmasm/uart.c b/drivers/misc/ibmasm/uart.c
index 1dcb9ae1905a..01e2b0d7e590 100644
--- a/drivers/misc/ibmasm/uart.c
+++ b/drivers/misc/ibmasm/uart.c
@@ -33,7 +33,7 @@
33 33
34void ibmasm_register_uart(struct service_processor *sp) 34void ibmasm_register_uart(struct service_processor *sp)
35{ 35{
36 struct uart_port uport; 36 struct uart_8250_port uart;
37 void __iomem *iomem_base; 37 void __iomem *iomem_base;
38 38
39 iomem_base = sp->base_address + SCOUT_COM_B_BASE; 39 iomem_base = sp->base_address + SCOUT_COM_B_BASE;
@@ -47,14 +47,14 @@ void ibmasm_register_uart(struct service_processor *sp)
47 return; 47 return;
48 } 48 }
49 49
50 memset(&uport, 0, sizeof(struct uart_port)); 50 memset(&uart, 0, sizeof(uart));
51 uport.irq = sp->irq; 51 uart.port.irq = sp->irq;
52 uport.uartclk = 3686400; 52 uart.port.uartclk = 3686400;
53 uport.flags = UPF_SHARE_IRQ; 53 uart.port.flags = UPF_SHARE_IRQ;
54 uport.iotype = UPIO_MEM; 54 uart.port.iotype = UPIO_MEM;
55 uport.membase = iomem_base; 55 uart.port.membase = iomem_base;
56 56
57 sp->serial_line = serial8250_register_port(&uport); 57 sp->serial_line = serial8250_register_8250_port(&uart);
58 if (sp->serial_line < 0) { 58 if (sp->serial_line < 0) {
59 dev_err(sp->dev, "Failed to register serial port\n"); 59 dev_err(sp->dev, "Failed to register serial port\n");
60 return; 60 return;
diff --git a/drivers/mmc/card/sdio_uart.c b/drivers/mmc/card/sdio_uart.c
index 5a2cbfac66d2..372c0325c149 100644
--- a/drivers/mmc/card/sdio_uart.c
+++ b/drivers/mmc/card/sdio_uart.c
@@ -518,7 +518,7 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
518 if (status & UART_MSR_DCTS) { 518 if (status & UART_MSR_DCTS) {
519 port->icount.cts++; 519 port->icount.cts++;
520 tty = tty_port_tty_get(&port->port); 520 tty = tty_port_tty_get(&port->port);
521 if (tty && (tty->termios->c_cflag & CRTSCTS)) { 521 if (tty && (tty->termios.c_cflag & CRTSCTS)) {
522 int cts = (status & UART_MSR_CTS); 522 int cts = (status & UART_MSR_CTS);
523 if (tty->hw_stopped) { 523 if (tty->hw_stopped) {
524 if (cts) { 524 if (cts) {
@@ -671,12 +671,12 @@ static int sdio_uart_activate(struct tty_port *tport, struct tty_struct *tty)
671 port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE; 671 port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE;
672 port->mctrl = TIOCM_OUT2; 672 port->mctrl = TIOCM_OUT2;
673 673
674 sdio_uart_change_speed(port, tty->termios, NULL); 674 sdio_uart_change_speed(port, &tty->termios, NULL);
675 675
676 if (tty->termios->c_cflag & CBAUD) 676 if (tty->termios.c_cflag & CBAUD)
677 sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR); 677 sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
678 678
679 if (tty->termios->c_cflag & CRTSCTS) 679 if (tty->termios.c_cflag & CRTSCTS)
680 if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) 680 if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS))
681 tty->hw_stopped = 1; 681 tty->hw_stopped = 1;
682 682
@@ -850,7 +850,7 @@ static void sdio_uart_throttle(struct tty_struct *tty)
850{ 850{
851 struct sdio_uart_port *port = tty->driver_data; 851 struct sdio_uart_port *port = tty->driver_data;
852 852
853 if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS)) 853 if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS))
854 return; 854 return;
855 855
856 if (sdio_uart_claim_func(port) != 0) 856 if (sdio_uart_claim_func(port) != 0)
@@ -861,7 +861,7 @@ static void sdio_uart_throttle(struct tty_struct *tty)
861 sdio_uart_start_tx(port); 861 sdio_uart_start_tx(port);
862 } 862 }
863 863
864 if (tty->termios->c_cflag & CRTSCTS) 864 if (tty->termios.c_cflag & CRTSCTS)
865 sdio_uart_clear_mctrl(port, TIOCM_RTS); 865 sdio_uart_clear_mctrl(port, TIOCM_RTS);
866 866
867 sdio_uart_irq(port->func); 867 sdio_uart_irq(port->func);
@@ -872,7 +872,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty)
872{ 872{
873 struct sdio_uart_port *port = tty->driver_data; 873 struct sdio_uart_port *port = tty->driver_data;
874 874
875 if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS)) 875 if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS))
876 return; 876 return;
877 877
878 if (sdio_uart_claim_func(port) != 0) 878 if (sdio_uart_claim_func(port) != 0)
@@ -887,7 +887,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty)
887 } 887 }
888 } 888 }
889 889
890 if (tty->termios->c_cflag & CRTSCTS) 890 if (tty->termios.c_cflag & CRTSCTS)
891 sdio_uart_set_mctrl(port, TIOCM_RTS); 891 sdio_uart_set_mctrl(port, TIOCM_RTS);
892 892
893 sdio_uart_irq(port->func); 893 sdio_uart_irq(port->func);
@@ -898,12 +898,12 @@ static void sdio_uart_set_termios(struct tty_struct *tty,
898 struct ktermios *old_termios) 898 struct ktermios *old_termios)
899{ 899{
900 struct sdio_uart_port *port = tty->driver_data; 900 struct sdio_uart_port *port = tty->driver_data;
901 unsigned int cflag = tty->termios->c_cflag; 901 unsigned int cflag = tty->termios.c_cflag;
902 902
903 if (sdio_uart_claim_func(port) != 0) 903 if (sdio_uart_claim_func(port) != 0)
904 return; 904 return;
905 905
906 sdio_uart_change_speed(port, tty->termios, old_termios); 906 sdio_uart_change_speed(port, &tty->termios, old_termios);
907 907
908 /* Handle transition to B0 status */ 908 /* Handle transition to B0 status */
909 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) 909 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index b5ba3084c7fc..3e5519a0acc7 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -1147,15 +1147,17 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart)
1147{ 1147{
1148#define COSMISC_CONSTANT 6 1148#define COSMISC_CONSTANT 6
1149 1149
1150 struct uart_port port = { 1150 struct uart_8250_port port = {
1151 .irq = 0, 1151 .port = {
1152 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, 1152 .irq = 0,
1153 .iotype = UPIO_MEM, 1153 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
1154 .regshift = 0, 1154 .iotype = UPIO_MEM,
1155 .uartclk = (22000000 << 1) / COSMISC_CONSTANT, 1155 .regshift = 0,
1156 1156 .uartclk = (22000000 << 1) / COSMISC_CONSTANT,
1157 .membase = (unsigned char __iomem *) uart, 1157
1158 .mapbase = (unsigned long) uart, 1158 .membase = (unsigned char __iomem *) uart,
1159 .mapbase = (unsigned long) uart,
1160 }
1159 }; 1161 };
1160 unsigned char lcr; 1162 unsigned char lcr;
1161 1163
@@ -1164,7 +1166,7 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart)
1164 uart->iu_scr = COSMISC_CONSTANT, 1166 uart->iu_scr = COSMISC_CONSTANT,
1165 uart->iu_lcr = lcr; 1167 uart->iu_lcr = lcr;
1166 uart->iu_lcr; 1168 uart->iu_lcr;
1167 serial8250_register_port(&port); 1169 serial8250_register_8250_port(&port);
1168} 1170}
1169 1171
1170static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) 1172static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3)
diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c
index 3352b2443e58..30087ca23a0f 100644
--- a/drivers/net/irda/irtty-sir.c
+++ b/drivers/net/irda/irtty-sir.c
@@ -124,8 +124,8 @@ static int irtty_change_speed(struct sir_dev *dev, unsigned speed)
124 tty = priv->tty; 124 tty = priv->tty;
125 125
126 mutex_lock(&tty->termios_mutex); 126 mutex_lock(&tty->termios_mutex);
127 old_termios = *(tty->termios); 127 old_termios = tty->termios;
128 cflag = tty->termios->c_cflag; 128 cflag = tty->termios.c_cflag;
129 tty_encode_baud_rate(tty, speed, speed); 129 tty_encode_baud_rate(tty, speed, speed);
130 if (tty->ops->set_termios) 130 if (tty->ops->set_termios)
131 tty->ops->set_termios(tty, &old_termios); 131 tty->ops->set_termios(tty, &old_termios);
@@ -281,15 +281,15 @@ static inline void irtty_stop_receiver(struct tty_struct *tty, int stop)
281 int cflag; 281 int cflag;
282 282
283 mutex_lock(&tty->termios_mutex); 283 mutex_lock(&tty->termios_mutex);
284 old_termios = *(tty->termios); 284 old_termios = tty->termios;
285 cflag = tty->termios->c_cflag; 285 cflag = tty->termios.c_cflag;
286 286
287 if (stop) 287 if (stop)
288 cflag &= ~CREAD; 288 cflag &= ~CREAD;
289 else 289 else
290 cflag |= CREAD; 290 cflag |= CREAD;
291 291
292 tty->termios->c_cflag = cflag; 292 tty->termios.c_cflag = cflag;
293 if (tty->ops->set_termios) 293 if (tty->ops->set_termios)
294 tty->ops->set_termios(tty, &old_termios); 294 tty->ops->set_termios(tty, &old_termios);
295 mutex_unlock(&tty->termios_mutex); 295 mutex_unlock(&tty->termios_mutex);
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 62f30b46fa42..7736af75e12b 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -1107,7 +1107,6 @@ static void _hso_serial_set_termios(struct tty_struct *tty,
1107 struct ktermios *old) 1107 struct ktermios *old)
1108{ 1108{
1109 struct hso_serial *serial = tty->driver_data; 1109 struct hso_serial *serial = tty->driver_data;
1110 struct ktermios *termios;
1111 1110
1112 if (!serial) { 1111 if (!serial) {
1113 printk(KERN_ERR "%s: no tty structures", __func__); 1112 printk(KERN_ERR "%s: no tty structures", __func__);
@@ -1119,16 +1118,15 @@ static void _hso_serial_set_termios(struct tty_struct *tty,
1119 /* 1118 /*
1120 * Fix up unsupported bits 1119 * Fix up unsupported bits
1121 */ 1120 */
1122 termios = tty->termios; 1121 tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
1123 termios->c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
1124 1122
1125 termios->c_cflag &= 1123 tty->termios.c_cflag &=
1126 ~(CSIZE /* no size */ 1124 ~(CSIZE /* no size */
1127 | PARENB /* disable parity bit */ 1125 | PARENB /* disable parity bit */
1128 | CBAUD /* clear current baud rate */ 1126 | CBAUD /* clear current baud rate */
1129 | CBAUDEX); /* clear current buad rate */ 1127 | CBAUDEX); /* clear current buad rate */
1130 1128
1131 termios->c_cflag |= CS8; /* character size 8 bits */ 1129 tty->termios.c_cflag |= CS8; /* character size 8 bits */
1132 1130
1133 /* baud rate 115200 */ 1131 /* baud rate 115200 */
1134 tty_encode_baud_rate(tty, 115200, 115200); 1132 tty_encode_baud_rate(tty, 115200, 115200);
@@ -1425,14 +1423,14 @@ static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old)
1425 1423
1426 if (old) 1424 if (old)
1427 D5("Termios called with: cflags new[%d] - old[%d]", 1425 D5("Termios called with: cflags new[%d] - old[%d]",
1428 tty->termios->c_cflag, old->c_cflag); 1426 tty->termios.c_cflag, old->c_cflag);
1429 1427
1430 /* the actual setup */ 1428 /* the actual setup */
1431 spin_lock_irqsave(&serial->serial_lock, flags); 1429 spin_lock_irqsave(&serial->serial_lock, flags);
1432 if (serial->port.count) 1430 if (serial->port.count)
1433 _hso_serial_set_termios(tty, old); 1431 _hso_serial_set_termios(tty, old);
1434 else 1432 else
1435 tty->termios = old; 1433 tty->termios = *old;
1436 spin_unlock_irqrestore(&serial->serial_lock, flags); 1434 spin_unlock_irqrestore(&serial->serial_lock, flags);
1437 1435
1438 /* done */ 1436 /* done */
diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
index 6cc4358f68c1..0e8441e73ee0 100644
--- a/drivers/tty/amiserial.c
+++ b/drivers/tty/amiserial.c
@@ -646,7 +646,7 @@ static void shutdown(struct tty_struct *tty, struct serial_state *info)
646 custom.adkcon = AC_UARTBRK; 646 custom.adkcon = AC_UARTBRK;
647 mb(); 647 mb();
648 648
649 if (tty->termios->c_cflag & HUPCL) 649 if (tty->termios.c_cflag & HUPCL)
650 info->MCR &= ~(SER_DTR|SER_RTS); 650 info->MCR &= ~(SER_DTR|SER_RTS);
651 rtsdtr_ctrl(info->MCR); 651 rtsdtr_ctrl(info->MCR);
652 652
@@ -670,7 +670,7 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info,
670 int bits; 670 int bits;
671 unsigned long flags; 671 unsigned long flags;
672 672
673 cflag = tty->termios->c_cflag; 673 cflag = tty->termios.c_cflag;
674 674
675 /* Byte size is always 8 bits plus parity bit if requested */ 675 /* Byte size is always 8 bits plus parity bit if requested */
676 676
@@ -707,8 +707,8 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info,
707 /* If the quotient is zero refuse the change */ 707 /* If the quotient is zero refuse the change */
708 if (!quot && old_termios) { 708 if (!quot && old_termios) {
709 /* FIXME: Will need updating for new tty in the end */ 709 /* FIXME: Will need updating for new tty in the end */
710 tty->termios->c_cflag &= ~CBAUD; 710 tty->termios.c_cflag &= ~CBAUD;
711 tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD); 711 tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD);
712 baud = tty_get_baud_rate(tty); 712 baud = tty_get_baud_rate(tty);
713 if (!baud) 713 if (!baud)
714 baud = 9600; 714 baud = 9600;
@@ -984,7 +984,7 @@ static void rs_throttle(struct tty_struct * tty)
984 if (I_IXOFF(tty)) 984 if (I_IXOFF(tty))
985 rs_send_xchar(tty, STOP_CHAR(tty)); 985 rs_send_xchar(tty, STOP_CHAR(tty));
986 986
987 if (tty->termios->c_cflag & CRTSCTS) 987 if (tty->termios.c_cflag & CRTSCTS)
988 info->MCR &= ~SER_RTS; 988 info->MCR &= ~SER_RTS;
989 989
990 local_irq_save(flags); 990 local_irq_save(flags);
@@ -1012,7 +1012,7 @@ static void rs_unthrottle(struct tty_struct * tty)
1012 else 1012 else
1013 rs_send_xchar(tty, START_CHAR(tty)); 1013 rs_send_xchar(tty, START_CHAR(tty));
1014 } 1014 }
1015 if (tty->termios->c_cflag & CRTSCTS) 1015 if (tty->termios.c_cflag & CRTSCTS)
1016 info->MCR |= SER_RTS; 1016 info->MCR |= SER_RTS;
1017 local_irq_save(flags); 1017 local_irq_save(flags);
1018 rtsdtr_ctrl(info->MCR); 1018 rtsdtr_ctrl(info->MCR);
@@ -1330,7 +1330,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1330{ 1330{
1331 struct serial_state *info = tty->driver_data; 1331 struct serial_state *info = tty->driver_data;
1332 unsigned long flags; 1332 unsigned long flags;
1333 unsigned int cflag = tty->termios->c_cflag; 1333 unsigned int cflag = tty->termios.c_cflag;
1334 1334
1335 change_speed(tty, info, old_termios); 1335 change_speed(tty, info, old_termios);
1336 1336
@@ -1347,7 +1347,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1347 if (!(old_termios->c_cflag & CBAUD) && 1347 if (!(old_termios->c_cflag & CBAUD) &&
1348 (cflag & CBAUD)) { 1348 (cflag & CBAUD)) {
1349 info->MCR |= SER_DTR; 1349 info->MCR |= SER_DTR;
1350 if (!(tty->termios->c_cflag & CRTSCTS) || 1350 if (!(tty->termios.c_cflag & CRTSCTS) ||
1351 !test_bit(TTY_THROTTLED, &tty->flags)) { 1351 !test_bit(TTY_THROTTLED, &tty->flags)) {
1352 info->MCR |= SER_RTS; 1352 info->MCR |= SER_RTS;
1353 } 1353 }
@@ -1358,7 +1358,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1358 1358
1359 /* Handle turning off CRTSCTS */ 1359 /* Handle turning off CRTSCTS */
1360 if ((old_termios->c_cflag & CRTSCTS) && 1360 if ((old_termios->c_cflag & CRTSCTS) &&
1361 !(tty->termios->c_cflag & CRTSCTS)) { 1361 !(tty->termios.c_cflag & CRTSCTS)) {
1362 tty->hw_stopped = 0; 1362 tty->hw_stopped = 0;
1363 rs_start(tty); 1363 rs_start(tty);
1364 } 1364 }
@@ -1371,7 +1371,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1371 * or not. Hence, this may change..... 1371 * or not. Hence, this may change.....
1372 */ 1372 */
1373 if (!(old_termios->c_cflag & CLOCAL) && 1373 if (!(old_termios->c_cflag & CLOCAL) &&
1374 (tty->termios->c_cflag & CLOCAL)) 1374 (tty->termios.c_cflag & CLOCAL))
1375 wake_up_interruptible(&info->open_wait); 1375 wake_up_interruptible(&info->open_wait);
1376#endif 1376#endif
1377} 1377}
diff --git a/drivers/tty/cyclades.c b/drivers/tty/cyclades.c
index e61cabdd69df..e77db714ab26 100644
--- a/drivers/tty/cyclades.c
+++ b/drivers/tty/cyclades.c
@@ -1459,7 +1459,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty)
1459 info->port.xmit_buf = NULL; 1459 info->port.xmit_buf = NULL;
1460 free_page((unsigned long)temp); 1460 free_page((unsigned long)temp);
1461 } 1461 }
1462 if (tty->termios->c_cflag & HUPCL) 1462 if (tty->termios.c_cflag & HUPCL)
1463 cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR); 1463 cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR);
1464 1464
1465 cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR); 1465 cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR);
@@ -1488,7 +1488,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty)
1488 free_page((unsigned long)temp); 1488 free_page((unsigned long)temp);
1489 } 1489 }
1490 1490
1491 if (tty->termios->c_cflag & HUPCL) 1491 if (tty->termios.c_cflag & HUPCL)
1492 tty_port_lower_dtr_rts(&info->port); 1492 tty_port_lower_dtr_rts(&info->port);
1493 1493
1494 set_bit(TTY_IO_ERROR, &tty->flags); 1494 set_bit(TTY_IO_ERROR, &tty->flags);
@@ -1999,14 +1999,11 @@ static void cy_set_line_char(struct cyclades_port *info, struct tty_struct *tty)
1999 int baud, baud_rate = 0; 1999 int baud, baud_rate = 0;
2000 int i; 2000 int i;
2001 2001
2002 if (!tty->termios) /* XXX can this happen at all? */
2003 return;
2004
2005 if (info->line == -1) 2002 if (info->line == -1)
2006 return; 2003 return;
2007 2004
2008 cflag = tty->termios->c_cflag; 2005 cflag = tty->termios.c_cflag;
2009 iflag = tty->termios->c_iflag; 2006 iflag = tty->termios.c_iflag;
2010 2007
2011 /* 2008 /*
2012 * Set up the tty->alt_speed kludge 2009 * Set up the tty->alt_speed kludge
@@ -2825,7 +2822,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
2825 cy_set_line_char(info, tty); 2822 cy_set_line_char(info, tty);
2826 2823
2827 if ((old_termios->c_cflag & CRTSCTS) && 2824 if ((old_termios->c_cflag & CRTSCTS) &&
2828 !(tty->termios->c_cflag & CRTSCTS)) { 2825 !(tty->termios.c_cflag & CRTSCTS)) {
2829 tty->hw_stopped = 0; 2826 tty->hw_stopped = 0;
2830 cy_start(tty); 2827 cy_start(tty);
2831 } 2828 }
@@ -2837,7 +2834,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
2837 * or not. Hence, this may change..... 2834 * or not. Hence, this may change.....
2838 */ 2835 */
2839 if (!(old_termios->c_cflag & CLOCAL) && 2836 if (!(old_termios->c_cflag & CLOCAL) &&
2840 (tty->termios->c_cflag & CLOCAL)) 2837 (tty->termios.c_cflag & CLOCAL))
2841 wake_up_interruptible(&info->port.open_wait); 2838 wake_up_interruptible(&info->port.open_wait);
2842#endif 2839#endif
2843} /* cy_set_termios */ 2840} /* cy_set_termios */
@@ -2899,7 +2896,7 @@ static void cy_throttle(struct tty_struct *tty)
2899 info->throttle = 1; 2896 info->throttle = 1;
2900 } 2897 }
2901 2898
2902 if (tty->termios->c_cflag & CRTSCTS) { 2899 if (tty->termios.c_cflag & CRTSCTS) {
2903 if (!cy_is_Z(card)) { 2900 if (!cy_is_Z(card)) {
2904 spin_lock_irqsave(&card->card_lock, flags); 2901 spin_lock_irqsave(&card->card_lock, flags);
2905 cyy_change_rts_dtr(info, 0, TIOCM_RTS); 2902 cyy_change_rts_dtr(info, 0, TIOCM_RTS);
@@ -2938,7 +2935,7 @@ static void cy_unthrottle(struct tty_struct *tty)
2938 cy_send_xchar(tty, START_CHAR(tty)); 2935 cy_send_xchar(tty, START_CHAR(tty));
2939 } 2936 }
2940 2937
2941 if (tty->termios->c_cflag & CRTSCTS) { 2938 if (tty->termios.c_cflag & CRTSCTS) {
2942 card = info->card; 2939 card = info->card;
2943 if (!cy_is_Z(card)) { 2940 if (!cy_is_Z(card)) {
2944 spin_lock_irqsave(&card->card_lock, flags); 2941 spin_lock_irqsave(&card->card_lock, flags);
@@ -3289,6 +3286,7 @@ static unsigned short __devinit cyy_init_card(void __iomem *true_base_addr,
3289static int __init cy_detect_isa(void) 3286static int __init cy_detect_isa(void)
3290{ 3287{
3291#ifdef CONFIG_ISA 3288#ifdef CONFIG_ISA
3289 struct cyclades_card *card;
3292 unsigned short cy_isa_irq, nboard; 3290 unsigned short cy_isa_irq, nboard;
3293 void __iomem *cy_isa_address; 3291 void __iomem *cy_isa_address;
3294 unsigned short i, j, cy_isa_nchan; 3292 unsigned short i, j, cy_isa_nchan;
@@ -3349,7 +3347,8 @@ static int __init cy_detect_isa(void)
3349 } 3347 }
3350 /* fill the next cy_card structure available */ 3348 /* fill the next cy_card structure available */
3351 for (j = 0; j < NR_CARDS; j++) { 3349 for (j = 0; j < NR_CARDS; j++) {
3352 if (cy_card[j].base_addr == NULL) 3350 card = &cy_card[j];
3351 if (card->base_addr == NULL)
3353 break; 3352 break;
3354 } 3353 }
3355 if (j == NR_CARDS) { /* no more cy_cards available */ 3354 if (j == NR_CARDS) { /* no more cy_cards available */
@@ -3363,7 +3362,7 @@ static int __init cy_detect_isa(void)
3363 3362
3364 /* allocate IRQ */ 3363 /* allocate IRQ */
3365 if (request_irq(cy_isa_irq, cyy_interrupt, 3364 if (request_irq(cy_isa_irq, cyy_interrupt,
3366 0, "Cyclom-Y", &cy_card[j])) { 3365 0, "Cyclom-Y", card)) {
3367 printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but " 3366 printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but "
3368 "could not allocate IRQ#%d.\n", 3367 "could not allocate IRQ#%d.\n",
3369 (unsigned long)cy_isa_address, cy_isa_irq); 3368 (unsigned long)cy_isa_address, cy_isa_irq);
@@ -3372,16 +3371,16 @@ static int __init cy_detect_isa(void)
3372 } 3371 }
3373 3372
3374 /* set cy_card */ 3373 /* set cy_card */
3375 cy_card[j].base_addr = cy_isa_address; 3374 card->base_addr = cy_isa_address;
3376 cy_card[j].ctl_addr.p9050 = NULL; 3375 card->ctl_addr.p9050 = NULL;
3377 cy_card[j].irq = (int)cy_isa_irq; 3376 card->irq = (int)cy_isa_irq;
3378 cy_card[j].bus_index = 0; 3377 card->bus_index = 0;
3379 cy_card[j].first_line = cy_next_channel; 3378 card->first_line = cy_next_channel;
3380 cy_card[j].num_chips = cy_isa_nchan / CyPORTS_PER_CHIP; 3379 card->num_chips = cy_isa_nchan / CyPORTS_PER_CHIP;
3381 cy_card[j].nports = cy_isa_nchan; 3380 card->nports = cy_isa_nchan;
3382 if (cy_init_card(&cy_card[j])) { 3381 if (cy_init_card(card)) {
3383 cy_card[j].base_addr = NULL; 3382 card->base_addr = NULL;
3384 free_irq(cy_isa_irq, &cy_card[j]); 3383 free_irq(cy_isa_irq, card);
3385 iounmap(cy_isa_address); 3384 iounmap(cy_isa_address);
3386 continue; 3385 continue;
3387 } 3386 }
@@ -3695,6 +3694,7 @@ err:
3695static int __devinit cy_pci_probe(struct pci_dev *pdev, 3694static int __devinit cy_pci_probe(struct pci_dev *pdev,
3696 const struct pci_device_id *ent) 3695 const struct pci_device_id *ent)
3697{ 3696{
3697 struct cyclades_card *card;
3698 void __iomem *addr0 = NULL, *addr2 = NULL; 3698 void __iomem *addr0 = NULL, *addr2 = NULL;
3699 char *card_name = NULL; 3699 char *card_name = NULL;
3700 u32 uninitialized_var(mailbox); 3700 u32 uninitialized_var(mailbox);
@@ -3829,7 +3829,8 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
3829 } 3829 }
3830 /* fill the next cy_card structure available */ 3830 /* fill the next cy_card structure available */
3831 for (card_no = 0; card_no < NR_CARDS; card_no++) { 3831 for (card_no = 0; card_no < NR_CARDS; card_no++) {
3832 if (cy_card[card_no].base_addr == NULL) 3832 card = &cy_card[card_no];
3833 if (card->base_addr == NULL)
3833 break; 3834 break;
3834 } 3835 }
3835 if (card_no == NR_CARDS) { /* no more cy_cards available */ 3836 if (card_no == NR_CARDS) { /* no more cy_cards available */
@@ -3843,27 +3844,26 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
3843 device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { 3844 device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
3844 /* allocate IRQ */ 3845 /* allocate IRQ */
3845 retval = request_irq(irq, cyy_interrupt, 3846 retval = request_irq(irq, cyy_interrupt,
3846 IRQF_SHARED, "Cyclom-Y", &cy_card[card_no]); 3847 IRQF_SHARED, "Cyclom-Y", card);
3847 if (retval) { 3848 if (retval) {
3848 dev_err(&pdev->dev, "could not allocate IRQ\n"); 3849 dev_err(&pdev->dev, "could not allocate IRQ\n");
3849 goto err_unmap; 3850 goto err_unmap;
3850 } 3851 }
3851 cy_card[card_no].num_chips = nchan / CyPORTS_PER_CHIP; 3852 card->num_chips = nchan / CyPORTS_PER_CHIP;
3852 } else { 3853 } else {
3853 struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS; 3854 struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS;
3854 struct ZFW_CTRL __iomem *zfw_ctrl; 3855 struct ZFW_CTRL __iomem *zfw_ctrl;
3855 3856
3856 zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff); 3857 zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3857 3858
3858 cy_card[card_no].hw_ver = mailbox; 3859 card->hw_ver = mailbox;
3859 cy_card[card_no].num_chips = (unsigned int)-1; 3860 card->num_chips = (unsigned int)-1;
3860 cy_card[card_no].board_ctrl = &zfw_ctrl->board_ctrl; 3861 card->board_ctrl = &zfw_ctrl->board_ctrl;
3861#ifdef CONFIG_CYZ_INTR 3862#ifdef CONFIG_CYZ_INTR
3862 /* allocate IRQ only if board has an IRQ */ 3863 /* allocate IRQ only if board has an IRQ */
3863 if (irq != 0 && irq != 255) { 3864 if (irq != 0 && irq != 255) {
3864 retval = request_irq(irq, cyz_interrupt, 3865 retval = request_irq(irq, cyz_interrupt,
3865 IRQF_SHARED, "Cyclades-Z", 3866 IRQF_SHARED, "Cyclades-Z", card);
3866 &cy_card[card_no]);
3867 if (retval) { 3867 if (retval) {
3868 dev_err(&pdev->dev, "could not allocate IRQ\n"); 3868 dev_err(&pdev->dev, "could not allocate IRQ\n");
3869 goto err_unmap; 3869 goto err_unmap;
@@ -3873,17 +3873,17 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
3873 } 3873 }
3874 3874
3875 /* set cy_card */ 3875 /* set cy_card */
3876 cy_card[card_no].base_addr = addr2; 3876 card->base_addr = addr2;
3877 cy_card[card_no].ctl_addr.p9050 = addr0; 3877 card->ctl_addr.p9050 = addr0;
3878 cy_card[card_no].irq = irq; 3878 card->irq = irq;
3879 cy_card[card_no].bus_index = 1; 3879 card->bus_index = 1;
3880 cy_card[card_no].first_line = cy_next_channel; 3880 card->first_line = cy_next_channel;
3881 cy_card[card_no].nports = nchan; 3881 card->nports = nchan;
3882 retval = cy_init_card(&cy_card[card_no]); 3882 retval = cy_init_card(card);
3883 if (retval) 3883 if (retval)
3884 goto err_null; 3884 goto err_null;
3885 3885
3886 pci_set_drvdata(pdev, &cy_card[card_no]); 3886 pci_set_drvdata(pdev, card);
3887 3887
3888 if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo || 3888 if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
3889 device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { 3889 device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
@@ -3915,8 +3915,8 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
3915 3915
3916 return 0; 3916 return 0;
3917err_null: 3917err_null:
3918 cy_card[card_no].base_addr = NULL; 3918 card->base_addr = NULL;
3919 free_irq(irq, &cy_card[card_no]); 3919 free_irq(irq, card);
3920err_unmap: 3920err_unmap:
3921 iounmap(addr0); 3921 iounmap(addr0);
3922 if (addr2) 3922 if (addr2)
diff --git a/drivers/tty/hvc/hvsi_lib.c b/drivers/tty/hvc/hvsi_lib.c
index 59c135dd5d20..3396eb9d57a3 100644
--- a/drivers/tty/hvc/hvsi_lib.c
+++ b/drivers/tty/hvc/hvsi_lib.c
@@ -400,7 +400,7 @@ void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp)
400 spin_unlock_irqrestore(&hp->lock, flags); 400 spin_unlock_irqrestore(&hp->lock, flags);
401 401
402 /* Clear our own DTR */ 402 /* Clear our own DTR */
403 if (!pv->tty || (pv->tty->termios->c_cflag & HUPCL)) 403 if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL))
404 hvsilib_write_mctrl(pv, 0); 404 hvsilib_write_mctrl(pv, 0);
405 405
406 /* Tear down the connection */ 406 /* Tear down the connection */
diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c
index e1235accab74..d593a7d18ad5 100644
--- a/drivers/tty/isicom.c
+++ b/drivers/tty/isicom.c
@@ -702,7 +702,7 @@ static void isicom_config_port(struct tty_struct *tty)
702 702
703 /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */ 703 /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */
704 if (baud < 1 || baud > 4) 704 if (baud < 1 || baud > 4)
705 tty->termios->c_cflag &= ~CBAUDEX; 705 tty->termios.c_cflag &= ~CBAUDEX;
706 else 706 else
707 baud += 15; 707 baud += 15;
708 } 708 }
@@ -1196,8 +1196,8 @@ static void isicom_set_termios(struct tty_struct *tty,
1196 if (isicom_paranoia_check(port, tty->name, "isicom_set_termios")) 1196 if (isicom_paranoia_check(port, tty->name, "isicom_set_termios"))
1197 return; 1197 return;
1198 1198
1199 if (tty->termios->c_cflag == old_termios->c_cflag && 1199 if (tty->termios.c_cflag == old_termios->c_cflag &&
1200 tty->termios->c_iflag == old_termios->c_iflag) 1200 tty->termios.c_iflag == old_termios->c_iflag)
1201 return; 1201 return;
1202 1202
1203 spin_lock_irqsave(&port->card->card_lock, flags); 1203 spin_lock_irqsave(&port->card->card_lock, flags);
@@ -1205,7 +1205,7 @@ static void isicom_set_termios(struct tty_struct *tty,
1205 spin_unlock_irqrestore(&port->card->card_lock, flags); 1205 spin_unlock_irqrestore(&port->card->card_lock, flags);
1206 1206
1207 if ((old_termios->c_cflag & CRTSCTS) && 1207 if ((old_termios->c_cflag & CRTSCTS) &&
1208 !(tty->termios->c_cflag & CRTSCTS)) { 1208 !(tty->termios.c_cflag & CRTSCTS)) {
1209 tty->hw_stopped = 0; 1209 tty->hw_stopped = 0;
1210 isicom_start(tty); 1210 isicom_start(tty);
1211 } 1211 }
diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c
index 324467d28a54..89cc9344325b 100644
--- a/drivers/tty/moxa.c
+++ b/drivers/tty/moxa.c
@@ -367,10 +367,10 @@ static int moxa_ioctl(struct tty_struct *tty,
367 tmp.dcd = 1; 367 tmp.dcd = 1;
368 368
369 ttyp = tty_port_tty_get(&p->port); 369 ttyp = tty_port_tty_get(&p->port);
370 if (!ttyp || !ttyp->termios) 370 if (!ttyp)
371 tmp.cflag = p->cflag; 371 tmp.cflag = p->cflag;
372 else 372 else
373 tmp.cflag = ttyp->termios->c_cflag; 373 tmp.cflag = ttyp->termios.c_cflag;
374 tty_kref_put(ttyp); 374 tty_kref_put(ttyp);
375copy: 375copy:
376 if (copy_to_user(argm, &tmp, sizeof(tmp))) 376 if (copy_to_user(argm, &tmp, sizeof(tmp)))
@@ -1178,7 +1178,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
1178 mutex_lock(&ch->port.mutex); 1178 mutex_lock(&ch->port.mutex);
1179 if (!(ch->port.flags & ASYNC_INITIALIZED)) { 1179 if (!(ch->port.flags & ASYNC_INITIALIZED)) {
1180 ch->statusflags = 0; 1180 ch->statusflags = 0;
1181 moxa_set_tty_param(tty, tty->termios); 1181 moxa_set_tty_param(tty, &tty->termios);
1182 MoxaPortLineCtrl(ch, 1, 1); 1182 MoxaPortLineCtrl(ch, 1, 1);
1183 MoxaPortEnable(ch); 1183 MoxaPortEnable(ch);
1184 MoxaSetFifo(ch, ch->type == PORT_16550A); 1184 MoxaSetFifo(ch, ch->type == PORT_16550A);
@@ -1193,7 +1193,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
1193static void moxa_close(struct tty_struct *tty, struct file *filp) 1193static void moxa_close(struct tty_struct *tty, struct file *filp)
1194{ 1194{
1195 struct moxa_port *ch = tty->driver_data; 1195 struct moxa_port *ch = tty->driver_data;
1196 ch->cflag = tty->termios->c_cflag; 1196 ch->cflag = tty->termios.c_cflag;
1197 tty_port_close(&ch->port, tty, filp); 1197 tty_port_close(&ch->port, tty, filp);
1198} 1198}
1199 1199
@@ -1464,7 +1464,7 @@ static void moxa_poll(unsigned long ignored)
1464 1464
1465static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) 1465static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios)
1466{ 1466{
1467 register struct ktermios *ts = tty->termios; 1467 register struct ktermios *ts = &tty->termios;
1468 struct moxa_port *ch = tty->driver_data; 1468 struct moxa_port *ch = tty->driver_data;
1469 int rts, cts, txflow, rxflow, xany, baud; 1469 int rts, cts, txflow, rxflow, xany, baud;
1470 1470
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
index 90cc680c4f0e..c162ee931167 100644
--- a/drivers/tty/mxser.c
+++ b/drivers/tty/mxser.c
@@ -643,7 +643,7 @@ static int mxser_change_speed(struct tty_struct *tty,
643 int ret = 0; 643 int ret = 0;
644 unsigned char status; 644 unsigned char status;
645 645
646 cflag = tty->termios->c_cflag; 646 cflag = tty->termios.c_cflag;
647 if (!info->ioaddr) 647 if (!info->ioaddr)
648 return ret; 648 return ret;
649 649
@@ -1520,10 +1520,10 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
1520 1520
1521 tty = tty_port_tty_get(port); 1521 tty = tty_port_tty_get(port);
1522 1522
1523 if (!tty || !tty->termios) 1523 if (!tty)
1524 ms.cflag = ip->normal_termios.c_cflag; 1524 ms.cflag = ip->normal_termios.c_cflag;
1525 else 1525 else
1526 ms.cflag = tty->termios->c_cflag; 1526 ms.cflag = tty->termios.c_cflag;
1527 tty_kref_put(tty); 1527 tty_kref_put(tty);
1528 spin_lock_irq(&ip->slock); 1528 spin_lock_irq(&ip->slock);
1529 status = inb(ip->ioaddr + UART_MSR); 1529 status = inb(ip->ioaddr + UART_MSR);
@@ -1589,13 +1589,13 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
1589 1589
1590 tty = tty_port_tty_get(&ip->port); 1590 tty = tty_port_tty_get(&ip->port);
1591 1591
1592 if (!tty || !tty->termios) { 1592 if (!tty) {
1593 cflag = ip->normal_termios.c_cflag; 1593 cflag = ip->normal_termios.c_cflag;
1594 iflag = ip->normal_termios.c_iflag; 1594 iflag = ip->normal_termios.c_iflag;
1595 me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios); 1595 me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios);
1596 } else { 1596 } else {
1597 cflag = tty->termios->c_cflag; 1597 cflag = tty->termios.c_cflag;
1598 iflag = tty->termios->c_iflag; 1598 iflag = tty->termios.c_iflag;
1599 me->baudrate[p] = tty_get_baud_rate(tty); 1599 me->baudrate[p] = tty_get_baud_rate(tty);
1600 } 1600 }
1601 tty_kref_put(tty); 1601 tty_kref_put(tty);
@@ -1853,7 +1853,7 @@ static void mxser_stoprx(struct tty_struct *tty)
1853 } 1853 }
1854 } 1854 }
1855 1855
1856 if (tty->termios->c_cflag & CRTSCTS) { 1856 if (tty->termios.c_cflag & CRTSCTS) {
1857 info->MCR &= ~UART_MCR_RTS; 1857 info->MCR &= ~UART_MCR_RTS;
1858 outb(info->MCR, info->ioaddr + UART_MCR); 1858 outb(info->MCR, info->ioaddr + UART_MCR);
1859 } 1859 }
@@ -1890,7 +1890,7 @@ static void mxser_unthrottle(struct tty_struct *tty)
1890 } 1890 }
1891 } 1891 }
1892 1892
1893 if (tty->termios->c_cflag & CRTSCTS) { 1893 if (tty->termios.c_cflag & CRTSCTS) {
1894 info->MCR |= UART_MCR_RTS; 1894 info->MCR |= UART_MCR_RTS;
1895 outb(info->MCR, info->ioaddr + UART_MCR); 1895 outb(info->MCR, info->ioaddr + UART_MCR);
1896 } 1896 }
@@ -1939,14 +1939,14 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi
1939 spin_unlock_irqrestore(&info->slock, flags); 1939 spin_unlock_irqrestore(&info->slock, flags);
1940 1940
1941 if ((old_termios->c_cflag & CRTSCTS) && 1941 if ((old_termios->c_cflag & CRTSCTS) &&
1942 !(tty->termios->c_cflag & CRTSCTS)) { 1942 !(tty->termios.c_cflag & CRTSCTS)) {
1943 tty->hw_stopped = 0; 1943 tty->hw_stopped = 0;
1944 mxser_start(tty); 1944 mxser_start(tty);
1945 } 1945 }
1946 1946
1947 /* Handle sw stopped */ 1947 /* Handle sw stopped */
1948 if ((old_termios->c_iflag & IXON) && 1948 if ((old_termios->c_iflag & IXON) &&
1949 !(tty->termios->c_iflag & IXON)) { 1949 !(tty->termios.c_iflag & IXON)) {
1950 tty->stopped = 0; 1950 tty->stopped = 0;
1951 1951
1952 if (info->board->chip_flag) { 1952 if (info->board->chip_flag) {
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
index c43b683b6eb8..7a4bf3053a15 100644
--- a/drivers/tty/n_gsm.c
+++ b/drivers/tty/n_gsm.c
@@ -1061,7 +1061,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
1061 /* Carrier drop -> hangup */ 1061 /* Carrier drop -> hangup */
1062 if (tty) { 1062 if (tty) {
1063 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD)) 1063 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD))
1064 if (!(tty->termios->c_cflag & CLOCAL)) 1064 if (!(tty->termios.c_cflag & CLOCAL))
1065 tty_hangup(tty); 1065 tty_hangup(tty);
1066 if (brk & 0x01) 1066 if (brk & 0x01)
1067 tty_insert_flip_char(tty, 0, TTY_BREAK); 1067 tty_insert_flip_char(tty, 0, TTY_BREAK);
@@ -3043,13 +3043,13 @@ static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old)
3043 the RPN control message. This however rapidly gets nasty as we 3043 the RPN control message. This however rapidly gets nasty as we
3044 then have to remap modem signals each way according to whether 3044 then have to remap modem signals each way according to whether
3045 our virtual cable is null modem etc .. */ 3045 our virtual cable is null modem etc .. */
3046 tty_termios_copy_hw(tty->termios, old); 3046 tty_termios_copy_hw(&tty->termios, old);
3047} 3047}
3048 3048
3049static void gsmtty_throttle(struct tty_struct *tty) 3049static void gsmtty_throttle(struct tty_struct *tty)
3050{ 3050{
3051 struct gsm_dlci *dlci = tty->driver_data; 3051 struct gsm_dlci *dlci = tty->driver_data;
3052 if (tty->termios->c_cflag & CRTSCTS) 3052 if (tty->termios.c_cflag & CRTSCTS)
3053 dlci->modem_tx &= ~TIOCM_DTR; 3053 dlci->modem_tx &= ~TIOCM_DTR;
3054 dlci->throttled = 1; 3054 dlci->throttled = 1;
3055 /* Send an MSC with DTR cleared */ 3055 /* Send an MSC with DTR cleared */
@@ -3059,7 +3059,7 @@ static void gsmtty_throttle(struct tty_struct *tty)
3059static void gsmtty_unthrottle(struct tty_struct *tty) 3059static void gsmtty_unthrottle(struct tty_struct *tty)
3060{ 3060{
3061 struct gsm_dlci *dlci = tty->driver_data; 3061 struct gsm_dlci *dlci = tty->driver_data;
3062 if (tty->termios->c_cflag & CRTSCTS) 3062 if (tty->termios.c_cflag & CRTSCTS)
3063 dlci->modem_tx |= TIOCM_DTR; 3063 dlci->modem_tx |= TIOCM_DTR;
3064 dlci->throttled = 0; 3064 dlci->throttled = 0;
3065 /* Send an MSC with DTR set */ 3065 /* Send an MSC with DTR set */
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
index ee1c268f5f9d..101790cea4ae 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -1432,6 +1432,12 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1432 */ 1432 */
1433 if (tty->receive_room < TTY_THRESHOLD_THROTTLE) 1433 if (tty->receive_room < TTY_THRESHOLD_THROTTLE)
1434 tty_throttle(tty); 1434 tty_throttle(tty);
1435
1436 /* FIXME: there is a tiny race here if the receive room check runs
1437 before the other work executes and empties the buffer (upping
1438 the receiving room and unthrottling. We then throttle and get
1439 stuck. This has been observed and traced down by Vincent Pillet/
1440 We need to address this when we sort out out the rx path locking */
1435} 1441}
1436 1442
1437int is_ignored(int sig) 1443int is_ignored(int sig)
@@ -1460,7 +1466,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
1460 BUG_ON(!tty); 1466 BUG_ON(!tty);
1461 1467
1462 if (old) 1468 if (old)
1463 canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON; 1469 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
1464 if (canon_change) { 1470 if (canon_change) {
1465 memset(&tty->read_flags, 0, sizeof tty->read_flags); 1471 memset(&tty->read_flags, 0, sizeof tty->read_flags);
1466 tty->canon_head = tty->read_tail; 1472 tty->canon_head = tty->read_tail;
diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c
index 5505ffc91da4..d6579a9064c4 100644
--- a/drivers/tty/pty.c
+++ b/drivers/tty/pty.c
@@ -231,8 +231,8 @@ out:
231static void pty_set_termios(struct tty_struct *tty, 231static void pty_set_termios(struct tty_struct *tty,
232 struct ktermios *old_termios) 232 struct ktermios *old_termios)
233{ 233{
234 tty->termios->c_cflag &= ~(CSIZE | PARENB); 234 tty->termios.c_cflag &= ~(CSIZE | PARENB);
235 tty->termios->c_cflag |= (CS8 | CREAD); 235 tty->termios.c_cflag |= (CS8 | CREAD);
236} 236}
237 237
238/** 238/**
@@ -282,60 +282,107 @@ done:
282 return 0; 282 return 0;
283} 283}
284 284
285/* Traditional BSD devices */ 285/**
286#ifdef CONFIG_LEGACY_PTYS 286 * pty_common_install - set up the pty pair
287 287 * @driver: the pty driver
288static int pty_install(struct tty_driver *driver, struct tty_struct *tty) 288 * @tty: the tty being instantiated
289 * @bool: legacy, true if this is BSD style
290 *
291 * Perform the initial set up for the tty/pty pair. Called from the
292 * tty layer when the port is first opened.
293 *
294 * Locking: the caller must hold the tty_mutex
295 */
296static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
297 bool legacy)
289{ 298{
290 struct tty_struct *o_tty; 299 struct tty_struct *o_tty;
300 struct tty_port *ports[2];
291 int idx = tty->index; 301 int idx = tty->index;
292 int retval; 302 int retval = -ENOMEM;
293 303
294 o_tty = alloc_tty_struct(); 304 o_tty = alloc_tty_struct();
295 if (!o_tty) 305 ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
296 return -ENOMEM; 306 ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
307 if (!o_tty || !ports[0] || !ports[1])
308 goto err_free_tty;
297 if (!try_module_get(driver->other->owner)) { 309 if (!try_module_get(driver->other->owner)) {
298 /* This cannot in fact currently happen */ 310 /* This cannot in fact currently happen */
299 retval = -ENOMEM;
300 goto err_free_tty; 311 goto err_free_tty;
301 } 312 }
302 initialize_tty_struct(o_tty, driver->other, idx); 313 initialize_tty_struct(o_tty, driver->other, idx);
303 314
304 /* We always use new tty termios data so we can do this 315 if (legacy) {
305 the easy way .. */ 316 /* We always use new tty termios data so we can do this
306 retval = tty_init_termios(tty); 317 the easy way .. */
307 if (retval) 318 retval = tty_init_termios(tty);
308 goto err_deinit_tty; 319 if (retval)
309 320 goto err_deinit_tty;
310 retval = tty_init_termios(o_tty); 321
311 if (retval) 322 retval = tty_init_termios(o_tty);
312 goto err_free_termios; 323 if (retval)
324 goto err_free_termios;
325
326 driver->other->ttys[idx] = o_tty;
327 driver->ttys[idx] = tty;
328 } else {
329 memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
330 tty->termios = driver->init_termios;
331 memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
332 o_tty->termios = driver->other->init_termios;
333 }
313 334
314 /* 335 /*
315 * Everything allocated ... set up the o_tty structure. 336 * Everything allocated ... set up the o_tty structure.
316 */ 337 */
317 driver->other->ttys[idx] = o_tty;
318 tty_driver_kref_get(driver->other); 338 tty_driver_kref_get(driver->other);
319 if (driver->subtype == PTY_TYPE_MASTER) 339 if (driver->subtype == PTY_TYPE_MASTER)
320 o_tty->count++; 340 o_tty->count++;
321 /* Establish the links in both directions */ 341 /* Establish the links in both directions */
322 tty->link = o_tty; 342 tty->link = o_tty;
323 o_tty->link = tty; 343 o_tty->link = tty;
344 tty_port_init(ports[0]);
345 tty_port_init(ports[1]);
346 o_tty->port = ports[0];
347 tty->port = ports[1];
324 348
325 tty_driver_kref_get(driver); 349 tty_driver_kref_get(driver);
326 tty->count++; 350 tty->count++;
327 driver->ttys[idx] = tty;
328 return 0; 351 return 0;
329err_free_termios: 352err_free_termios:
330 tty_free_termios(tty); 353 if (legacy)
354 tty_free_termios(tty);
331err_deinit_tty: 355err_deinit_tty:
332 deinitialize_tty_struct(o_tty); 356 deinitialize_tty_struct(o_tty);
333 module_put(o_tty->driver->owner); 357 module_put(o_tty->driver->owner);
334err_free_tty: 358err_free_tty:
359 kfree(ports[0]);
360 kfree(ports[1]);
335 free_tty_struct(o_tty); 361 free_tty_struct(o_tty);
336 return retval; 362 return retval;
337} 363}
338 364
365static void pty_cleanup(struct tty_struct *tty)
366{
367 kfree(tty->port);
368}
369
370/* Traditional BSD devices */
371#ifdef CONFIG_LEGACY_PTYS
372
373static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
374{
375 return pty_common_install(driver, tty, true);
376}
377
378static void pty_remove(struct tty_driver *driver, struct tty_struct *tty)
379{
380 struct tty_struct *pair = tty->link;
381 driver->ttys[tty->index] = NULL;
382 if (pair)
383 pair->driver->ttys[pair->index] = NULL;
384}
385
339static int pty_bsd_ioctl(struct tty_struct *tty, 386static int pty_bsd_ioctl(struct tty_struct *tty,
340 unsigned int cmd, unsigned long arg) 387 unsigned int cmd, unsigned long arg)
341{ 388{
@@ -366,7 +413,9 @@ static const struct tty_operations master_pty_ops_bsd = {
366 .unthrottle = pty_unthrottle, 413 .unthrottle = pty_unthrottle,
367 .set_termios = pty_set_termios, 414 .set_termios = pty_set_termios,
368 .ioctl = pty_bsd_ioctl, 415 .ioctl = pty_bsd_ioctl,
369 .resize = pty_resize 416 .cleanup = pty_cleanup,
417 .resize = pty_resize,
418 .remove = pty_remove
370}; 419};
371 420
372static const struct tty_operations slave_pty_ops_bsd = { 421static const struct tty_operations slave_pty_ops_bsd = {
@@ -379,7 +428,9 @@ static const struct tty_operations slave_pty_ops_bsd = {
379 .chars_in_buffer = pty_chars_in_buffer, 428 .chars_in_buffer = pty_chars_in_buffer,
380 .unthrottle = pty_unthrottle, 429 .unthrottle = pty_unthrottle,
381 .set_termios = pty_set_termios, 430 .set_termios = pty_set_termios,
382 .resize = pty_resize 431 .cleanup = pty_cleanup,
432 .resize = pty_resize,
433 .remove = pty_remove
383}; 434};
384 435
385static void __init legacy_pty_init(void) 436static void __init legacy_pty_init(void)
@@ -497,78 +548,22 @@ static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
497 return tty; 548 return tty;
498} 549}
499 550
500static void pty_unix98_shutdown(struct tty_struct *tty)
501{
502 tty_driver_remove_tty(tty->driver, tty);
503 /* We have our own method as we don't use the tty index */
504 kfree(tty->termios);
505}
506
507/* We have no need to install and remove our tty objects as devpts does all 551/* We have no need to install and remove our tty objects as devpts does all
508 the work for us */ 552 the work for us */
509 553
510static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) 554static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
511{ 555{
512 struct tty_struct *o_tty; 556 return pty_common_install(driver, tty, false);
513 int idx = tty->index;
514
515 o_tty = alloc_tty_struct();
516 if (!o_tty)
517 return -ENOMEM;
518 if (!try_module_get(driver->other->owner)) {
519 /* This cannot in fact currently happen */
520 goto err_free_tty;
521 }
522 initialize_tty_struct(o_tty, driver->other, idx);
523
524 tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
525 if (tty->termios == NULL)
526 goto err_free_mem;
527 *tty->termios = driver->init_termios;
528 tty->termios_locked = tty->termios + 1;
529
530 o_tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
531 if (o_tty->termios == NULL)
532 goto err_free_mem;
533 *o_tty->termios = driver->other->init_termios;
534 o_tty->termios_locked = o_tty->termios + 1;
535
536 tty_driver_kref_get(driver->other);
537 if (driver->subtype == PTY_TYPE_MASTER)
538 o_tty->count++;
539 /* Establish the links in both directions */
540 tty->link = o_tty;
541 o_tty->link = tty;
542 /*
543 * All structures have been allocated, so now we install them.
544 * Failures after this point use release_tty to clean up, so
545 * there's no need to null out the local pointers.
546 */
547 tty_driver_kref_get(driver);
548 tty->count++;
549 return 0;
550err_free_mem:
551 deinitialize_tty_struct(o_tty);
552 kfree(o_tty->termios);
553 kfree(tty->termios);
554 module_put(o_tty->driver->owner);
555err_free_tty:
556 free_tty_struct(o_tty);
557 return -ENOMEM;
558}
559
560static void ptm_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
561{
562} 557}
563 558
564static void pts_unix98_remove(struct tty_driver *driver, struct tty_struct *tty) 559static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
565{ 560{
566} 561}
567 562
568static const struct tty_operations ptm_unix98_ops = { 563static const struct tty_operations ptm_unix98_ops = {
569 .lookup = ptm_unix98_lookup, 564 .lookup = ptm_unix98_lookup,
570 .install = pty_unix98_install, 565 .install = pty_unix98_install,
571 .remove = ptm_unix98_remove, 566 .remove = pty_unix98_remove,
572 .open = pty_open, 567 .open = pty_open,
573 .close = pty_close, 568 .close = pty_close,
574 .write = pty_write, 569 .write = pty_write,
@@ -578,14 +573,14 @@ static const struct tty_operations ptm_unix98_ops = {
578 .unthrottle = pty_unthrottle, 573 .unthrottle = pty_unthrottle,
579 .set_termios = pty_set_termios, 574 .set_termios = pty_set_termios,
580 .ioctl = pty_unix98_ioctl, 575 .ioctl = pty_unix98_ioctl,
581 .shutdown = pty_unix98_shutdown, 576 .resize = pty_resize,
582 .resize = pty_resize 577 .cleanup = pty_cleanup
583}; 578};
584 579
585static const struct tty_operations pty_unix98_ops = { 580static const struct tty_operations pty_unix98_ops = {
586 .lookup = pts_unix98_lookup, 581 .lookup = pts_unix98_lookup,
587 .install = pty_unix98_install, 582 .install = pty_unix98_install,
588 .remove = pts_unix98_remove, 583 .remove = pty_unix98_remove,
589 .open = pty_open, 584 .open = pty_open,
590 .close = pty_close, 585 .close = pty_close,
591 .write = pty_write, 586 .write = pty_write,
@@ -594,7 +589,7 @@ static const struct tty_operations pty_unix98_ops = {
594 .chars_in_buffer = pty_chars_in_buffer, 589 .chars_in_buffer = pty_chars_in_buffer,
595 .unthrottle = pty_unthrottle, 590 .unthrottle = pty_unthrottle,
596 .set_termios = pty_set_termios, 591 .set_termios = pty_set_termios,
597 .shutdown = pty_unix98_shutdown 592 .cleanup = pty_cleanup,
598}; 593};
599 594
600/** 595/**
diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c
index 777d5f9cf6cc..016984a460e0 100644
--- a/drivers/tty/rocket.c
+++ b/drivers/tty/rocket.c
@@ -720,7 +720,7 @@ static void configure_r_port(struct tty_struct *tty, struct r_port *info,
720 unsigned rocketMode; 720 unsigned rocketMode;
721 int bits, baud, divisor; 721 int bits, baud, divisor;
722 CHANNEL_t *cp; 722 CHANNEL_t *cp;
723 struct ktermios *t = tty->termios; 723 struct ktermios *t = &tty->termios;
724 724
725 cp = &info->channel; 725 cp = &info->channel;
726 cflag = t->c_cflag; 726 cflag = t->c_cflag;
@@ -978,7 +978,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp)
978 tty->alt_speed = 460800; 978 tty->alt_speed = 460800;
979 979
980 configure_r_port(tty, info, NULL); 980 configure_r_port(tty, info, NULL);
981 if (tty->termios->c_cflag & CBAUD) { 981 if (tty->termios.c_cflag & CBAUD) {
982 sSetDTR(cp); 982 sSetDTR(cp);
983 sSetRTS(cp); 983 sSetRTS(cp);
984 } 984 }
@@ -1089,35 +1089,35 @@ static void rp_set_termios(struct tty_struct *tty,
1089 if (rocket_paranoia_check(info, "rp_set_termios")) 1089 if (rocket_paranoia_check(info, "rp_set_termios"))
1090 return; 1090 return;
1091 1091
1092 cflag = tty->termios->c_cflag; 1092 cflag = tty->termios.c_cflag;
1093 1093
1094 /* 1094 /*
1095 * This driver doesn't support CS5 or CS6 1095 * This driver doesn't support CS5 or CS6
1096 */ 1096 */
1097 if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6)) 1097 if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6))
1098 tty->termios->c_cflag = 1098 tty->termios.c_cflag =
1099 ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE)); 1099 ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE));
1100 /* Or CMSPAR */ 1100 /* Or CMSPAR */
1101 tty->termios->c_cflag &= ~CMSPAR; 1101 tty->termios.c_cflag &= ~CMSPAR;
1102 1102
1103 configure_r_port(tty, info, old_termios); 1103 configure_r_port(tty, info, old_termios);
1104 1104
1105 cp = &info->channel; 1105 cp = &info->channel;
1106 1106
1107 /* Handle transition to B0 status */ 1107 /* Handle transition to B0 status */
1108 if ((old_termios->c_cflag & CBAUD) && !(tty->termios->c_cflag & CBAUD)) { 1108 if ((old_termios->c_cflag & CBAUD) && !(tty->termios.c_cflag & CBAUD)) {
1109 sClrDTR(cp); 1109 sClrDTR(cp);
1110 sClrRTS(cp); 1110 sClrRTS(cp);
1111 } 1111 }
1112 1112
1113 /* Handle transition away from B0 status */ 1113 /* Handle transition away from B0 status */
1114 if (!(old_termios->c_cflag & CBAUD) && (tty->termios->c_cflag & CBAUD)) { 1114 if (!(old_termios->c_cflag & CBAUD) && (tty->termios.c_cflag & CBAUD)) {
1115 if (!tty->hw_stopped || !(tty->termios->c_cflag & CRTSCTS)) 1115 if (!tty->hw_stopped || !(tty->termios.c_cflag & CRTSCTS))
1116 sSetRTS(cp); 1116 sSetRTS(cp);
1117 sSetDTR(cp); 1117 sSetDTR(cp);
1118 } 1118 }
1119 1119
1120 if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) { 1120 if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios.c_cflag & CRTSCTS)) {
1121 tty->hw_stopped = 0; 1121 tty->hw_stopped = 0;
1122 rp_start(tty); 1122 rp_start(tty);
1123 } 1123 }
diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c
index 8123f784bcda..44f52c6f15b9 100644
--- a/drivers/tty/serial/8250/8250.c
+++ b/drivers/tty/serial/8250/8250.c
@@ -2202,6 +2202,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2202 unsigned char cval, fcr = 0; 2202 unsigned char cval, fcr = 0;
2203 unsigned long flags; 2203 unsigned long flags;
2204 unsigned int baud, quot; 2204 unsigned int baud, quot;
2205 int fifo_bug = 0;
2205 2206
2206 switch (termios->c_cflag & CSIZE) { 2207 switch (termios->c_cflag & CSIZE) {
2207 case CS5: 2208 case CS5:
@@ -2221,8 +2222,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2221 2222
2222 if (termios->c_cflag & CSTOPB) 2223 if (termios->c_cflag & CSTOPB)
2223 cval |= UART_LCR_STOP; 2224 cval |= UART_LCR_STOP;
2224 if (termios->c_cflag & PARENB) 2225 if (termios->c_cflag & PARENB) {
2225 cval |= UART_LCR_PARITY; 2226 cval |= UART_LCR_PARITY;
2227 if (up->bugs & UART_BUG_PARITY)
2228 fifo_bug = 1;
2229 }
2226 if (!(termios->c_cflag & PARODD)) 2230 if (!(termios->c_cflag & PARODD))
2227 cval |= UART_LCR_EPAR; 2231 cval |= UART_LCR_EPAR;
2228#ifdef CMSPAR 2232#ifdef CMSPAR
@@ -2246,7 +2250,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2246 2250
2247 if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) { 2251 if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
2248 fcr = uart_config[port->type].fcr; 2252 fcr = uart_config[port->type].fcr;
2249 if (baud < 2400) { 2253 if (baud < 2400 || fifo_bug) {
2250 fcr &= ~UART_FCR_TRIGGER_MASK; 2254 fcr &= ~UART_FCR_TRIGGER_MASK;
2251 fcr |= UART_FCR_TRIGGER_1; 2255 fcr |= UART_FCR_TRIGGER_1;
2252 } 2256 }
@@ -2979,36 +2983,36 @@ void serial8250_resume_port(int line)
2979static int __devinit serial8250_probe(struct platform_device *dev) 2983static int __devinit serial8250_probe(struct platform_device *dev)
2980{ 2984{
2981 struct plat_serial8250_port *p = dev->dev.platform_data; 2985 struct plat_serial8250_port *p = dev->dev.platform_data;
2982 struct uart_port port; 2986 struct uart_8250_port uart;
2983 int ret, i, irqflag = 0; 2987 int ret, i, irqflag = 0;
2984 2988
2985 memset(&port, 0, sizeof(struct uart_port)); 2989 memset(&uart, 0, sizeof(uart));
2986 2990
2987 if (share_irqs) 2991 if (share_irqs)
2988 irqflag = IRQF_SHARED; 2992 irqflag = IRQF_SHARED;
2989 2993
2990 for (i = 0; p && p->flags != 0; p++, i++) { 2994 for (i = 0; p && p->flags != 0; p++, i++) {
2991 port.iobase = p->iobase; 2995 uart.port.iobase = p->iobase;
2992 port.membase = p->membase; 2996 uart.port.membase = p->membase;
2993 port.irq = p->irq; 2997 uart.port.irq = p->irq;
2994 port.irqflags = p->irqflags; 2998 uart.port.irqflags = p->irqflags;
2995 port.uartclk = p->uartclk; 2999 uart.port.uartclk = p->uartclk;
2996 port.regshift = p->regshift; 3000 uart.port.regshift = p->regshift;
2997 port.iotype = p->iotype; 3001 uart.port.iotype = p->iotype;
2998 port.flags = p->flags; 3002 uart.port.flags = p->flags;
2999 port.mapbase = p->mapbase; 3003 uart.port.mapbase = p->mapbase;
3000 port.hub6 = p->hub6; 3004 uart.port.hub6 = p->hub6;
3001 port.private_data = p->private_data; 3005 uart.port.private_data = p->private_data;
3002 port.type = p->type; 3006 uart.port.type = p->type;
3003 port.serial_in = p->serial_in; 3007 uart.port.serial_in = p->serial_in;
3004 port.serial_out = p->serial_out; 3008 uart.port.serial_out = p->serial_out;
3005 port.handle_irq = p->handle_irq; 3009 uart.port.handle_irq = p->handle_irq;
3006 port.handle_break = p->handle_break; 3010 uart.port.handle_break = p->handle_break;
3007 port.set_termios = p->set_termios; 3011 uart.port.set_termios = p->set_termios;
3008 port.pm = p->pm; 3012 uart.port.pm = p->pm;
3009 port.dev = &dev->dev; 3013 uart.port.dev = &dev->dev;
3010 port.irqflags |= irqflag; 3014 uart.port.irqflags |= irqflag;
3011 ret = serial8250_register_port(&port); 3015 ret = serial8250_register_8250_port(&uart);
3012 if (ret < 0) { 3016 if (ret < 0) {
3013 dev_err(&dev->dev, "unable to register port at index %d " 3017 dev_err(&dev->dev, "unable to register port at index %d "
3014 "(IO%lx MEM%llx IRQ%d): %d\n", i, 3018 "(IO%lx MEM%llx IRQ%d): %d\n", i,
@@ -3081,7 +3085,7 @@ static struct platform_driver serial8250_isa_driver = {
3081static struct platform_device *serial8250_isa_devs; 3085static struct platform_device *serial8250_isa_devs;
3082 3086
3083/* 3087/*
3084 * serial8250_register_port and serial8250_unregister_port allows for 3088 * serial8250_register_8250_port and serial8250_unregister_port allows for
3085 * 16x50 serial ports to be configured at run-time, to support PCMCIA 3089 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3086 * modems and PCI multiport cards. 3090 * modems and PCI multiport cards.
3087 */ 3091 */
@@ -3155,6 +3159,7 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
3155 uart->port.regshift = up->port.regshift; 3159 uart->port.regshift = up->port.regshift;
3156 uart->port.iotype = up->port.iotype; 3160 uart->port.iotype = up->port.iotype;
3157 uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF; 3161 uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF;
3162 uart->bugs = up->bugs;
3158 uart->port.mapbase = up->port.mapbase; 3163 uart->port.mapbase = up->port.mapbase;
3159 uart->port.private_data = up->port.private_data; 3164 uart->port.private_data = up->port.private_data;
3160 if (up->port.dev) 3165 if (up->port.dev)
@@ -3198,29 +3203,6 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
3198EXPORT_SYMBOL(serial8250_register_8250_port); 3203EXPORT_SYMBOL(serial8250_register_8250_port);
3199 3204
3200/** 3205/**
3201 * serial8250_register_port - register a serial port
3202 * @port: serial port template
3203 *
3204 * Configure the serial port specified by the request. If the
3205 * port exists and is in use, it is hung up and unregistered
3206 * first.
3207 *
3208 * The port is then probed and if necessary the IRQ is autodetected
3209 * If this fails an error is returned.
3210 *
3211 * On success the port is ready to use and the line number is returned.
3212 */
3213int serial8250_register_port(struct uart_port *port)
3214{
3215 struct uart_8250_port up;
3216
3217 memset(&up, 0, sizeof(up));
3218 memcpy(&up.port, port, sizeof(*port));
3219 return serial8250_register_8250_port(&up);
3220}
3221EXPORT_SYMBOL(serial8250_register_port);
3222
3223/**
3224 * serial8250_unregister_port - remove a 16x50 serial port at runtime 3206 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3225 * @line: serial line number 3207 * @line: serial line number
3226 * 3208 *
diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h
index f9719d167c8d..972b5212b58c 100644
--- a/drivers/tty/serial/8250/8250.h
+++ b/drivers/tty/serial/8250/8250.h
@@ -13,36 +13,6 @@
13 13
14#include <linux/serial_8250.h> 14#include <linux/serial_8250.h>
15 15
16struct uart_8250_port {
17 struct uart_port port;
18 struct timer_list timer; /* "no irq" timer */
19 struct list_head list; /* ports on this IRQ */
20 unsigned short capabilities; /* port capabilities */
21 unsigned short bugs; /* port bugs */
22 unsigned int tx_loadsz; /* transmit fifo load size */
23 unsigned char acr;
24 unsigned char ier;
25 unsigned char lcr;
26 unsigned char mcr;
27 unsigned char mcr_mask; /* mask of user bits */
28 unsigned char mcr_force; /* mask of forced bits */
29 unsigned char cur_iotype; /* Running I/O type */
30
31 /*
32 * Some bits in registers are cleared on a read, so they must
33 * be saved whenever the register is read but the bits will not
34 * be immediately processed.
35 */
36#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
37 unsigned char lsr_saved_flags;
38#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
39 unsigned char msr_saved_flags;
40
41 /* 8250 specific callbacks */
42 int (*dl_read)(struct uart_8250_port *);
43 void (*dl_write)(struct uart_8250_port *, int);
44};
45
46struct old_serial_port { 16struct old_serial_port {
47 unsigned int uart; 17 unsigned int uart;
48 unsigned int baud_base; 18 unsigned int baud_base;
@@ -78,6 +48,7 @@ struct serial8250_config {
78#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ 48#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
79#define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ 49#define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */
80#define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ 50#define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */
51#define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */
81 52
82#define PROBE_RSA (1 << 0) 53#define PROBE_RSA (1 << 0)
83#define PROBE_ANY (~0) 54#define PROBE_ANY (~0)
diff --git a/drivers/tty/serial/8250/8250_acorn.c b/drivers/tty/serial/8250/8250_acorn.c
index b0ce8c56f1a4..857498312a9a 100644
--- a/drivers/tty/serial/8250/8250_acorn.c
+++ b/drivers/tty/serial/8250/8250_acorn.c
@@ -43,7 +43,7 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id)
43{ 43{
44 struct serial_card_info *info; 44 struct serial_card_info *info;
45 struct serial_card_type *type = id->data; 45 struct serial_card_type *type = id->data;
46 struct uart_port port; 46 struct uart_8250_port uart;
47 unsigned long bus_addr; 47 unsigned long bus_addr;
48 unsigned int i; 48 unsigned int i;
49 49
@@ -62,19 +62,19 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id)
62 62
63 ecard_set_drvdata(ec, info); 63 ecard_set_drvdata(ec, info);
64 64
65 memset(&port, 0, sizeof(struct uart_port)); 65 memset(&uart, 0, sizeof(struct uart_8250_port));
66 port.irq = ec->irq; 66 uart.port.irq = ec->irq;
67 port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 67 uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
68 port.uartclk = type->uartclk; 68 uart.port.uartclk = type->uartclk;
69 port.iotype = UPIO_MEM; 69 uart.port.iotype = UPIO_MEM;
70 port.regshift = 2; 70 uart.port.regshift = 2;
71 port.dev = &ec->dev; 71 uart.port.dev = &ec->dev;
72 72
73 for (i = 0; i < info->num_ports; i ++) { 73 for (i = 0; i < info->num_ports; i ++) {
74 port.membase = info->vaddr + type->offset[i]; 74 uart.port.membase = info->vaddr + type->offset[i];
75 port.mapbase = bus_addr + type->offset[i]; 75 uart.port.mapbase = bus_addr + type->offset[i];
76 76
77 info->ports[i] = serial8250_register_port(&port); 77 info->ports[i] = serial8250_register_8250_port(&uart);
78 } 78 }
79 79
80 return 0; 80 return 0;
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index f574eef3075f..c3b2ec0c8c0b 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -89,7 +89,7 @@ static int dw8250_handle_irq(struct uart_port *p)
89 89
90static int __devinit dw8250_probe(struct platform_device *pdev) 90static int __devinit dw8250_probe(struct platform_device *pdev)
91{ 91{
92 struct uart_port port = {}; 92 struct uart_8250_port uart = {};
93 struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 93 struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
94 struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 94 struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
95 struct device_node *np = pdev->dev.of_node; 95 struct device_node *np = pdev->dev.of_node;
@@ -104,28 +104,28 @@ static int __devinit dw8250_probe(struct platform_device *pdev)
104 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); 104 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
105 if (!data) 105 if (!data)
106 return -ENOMEM; 106 return -ENOMEM;
107 port.private_data = data; 107 uart.port.private_data = data;
108 108
109 spin_lock_init(&port.lock); 109 spin_lock_init(&uart.port.lock);
110 port.mapbase = regs->start; 110 uart.port.mapbase = regs->start;
111 port.irq = irq->start; 111 uart.port.irq = irq->start;
112 port.handle_irq = dw8250_handle_irq; 112 uart.port.handle_irq = dw8250_handle_irq;
113 port.type = PORT_8250; 113 uart.port.type = PORT_8250;
114 port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | 114 uart.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP |
115 UPF_FIXED_PORT | UPF_FIXED_TYPE; 115 UPF_FIXED_PORT | UPF_FIXED_TYPE;
116 port.dev = &pdev->dev; 116 uart.port.dev = &pdev->dev;
117 117
118 port.iotype = UPIO_MEM; 118 uart.port.iotype = UPIO_MEM;
119 port.serial_in = dw8250_serial_in; 119 uart.port.serial_in = dw8250_serial_in;
120 port.serial_out = dw8250_serial_out; 120 uart.port.serial_out = dw8250_serial_out;
121 if (!of_property_read_u32(np, "reg-io-width", &val)) { 121 if (!of_property_read_u32(np, "reg-io-width", &val)) {
122 switch (val) { 122 switch (val) {
123 case 1: 123 case 1:
124 break; 124 break;
125 case 4: 125 case 4:
126 port.iotype = UPIO_MEM32; 126 uart.port.iotype = UPIO_MEM32;
127 port.serial_in = dw8250_serial_in32; 127 uart.port.serial_in = dw8250_serial_in32;
128 port.serial_out = dw8250_serial_out32; 128 uart.port.serial_out = dw8250_serial_out32;
129 break; 129 break;
130 default: 130 default:
131 dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n", 131 dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n",
@@ -135,15 +135,15 @@ static int __devinit dw8250_probe(struct platform_device *pdev)
135 } 135 }
136 136
137 if (!of_property_read_u32(np, "reg-shift", &val)) 137 if (!of_property_read_u32(np, "reg-shift", &val))
138 port.regshift = val; 138 uart.port.regshift = val;
139 139
140 if (of_property_read_u32(np, "clock-frequency", &val)) { 140 if (of_property_read_u32(np, "clock-frequency", &val)) {
141 dev_err(&pdev->dev, "no clock-frequency property set\n"); 141 dev_err(&pdev->dev, "no clock-frequency property set\n");
142 return -EINVAL; 142 return -EINVAL;
143 } 143 }
144 port.uartclk = val; 144 uart.port.uartclk = val;
145 145
146 data->line = serial8250_register_port(&port); 146 data->line = serial8250_register_8250_port(&uart);
147 if (data->line < 0) 147 if (data->line < 0)
148 return data->line; 148 return data->line;
149 149
diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c
index d8c0ffbfa6e3..097dff9c08ad 100644
--- a/drivers/tty/serial/8250/8250_gsc.c
+++ b/drivers/tty/serial/8250/8250_gsc.c
@@ -26,7 +26,7 @@
26 26
27static int __init serial_init_chip(struct parisc_device *dev) 27static int __init serial_init_chip(struct parisc_device *dev)
28{ 28{
29 struct uart_port port; 29 struct uart_8250_port uart;
30 unsigned long address; 30 unsigned long address;
31 int err; 31 int err;
32 32
@@ -48,21 +48,21 @@ static int __init serial_init_chip(struct parisc_device *dev)
48 if (dev->id.sversion != 0x8d) 48 if (dev->id.sversion != 0x8d)
49 address += 0x800; 49 address += 0x800;
50 50
51 memset(&port, 0, sizeof(port)); 51 memset(&uart, 0, sizeof(uart));
52 port.iotype = UPIO_MEM; 52 uart.port.iotype = UPIO_MEM;
53 /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ 53 /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */
54 port.uartclk = 7272727; 54 uart.port.uartclk = 7272727;
55 port.mapbase = address; 55 uart.port.mapbase = address;
56 port.membase = ioremap_nocache(address, 16); 56 uart.port.membase = ioremap_nocache(address, 16);
57 port.irq = dev->irq; 57 uart.port.irq = dev->irq;
58 port.flags = UPF_BOOT_AUTOCONF; 58 uart.port.flags = UPF_BOOT_AUTOCONF;
59 port.dev = &dev->dev; 59 uart.port.dev = &dev->dev;
60 60
61 err = serial8250_register_port(&port); 61 err = serial8250_register_8250_port(&uart);
62 if (err < 0) { 62 if (err < 0) {
63 printk(KERN_WARNING 63 printk(KERN_WARNING
64 "serial8250_register_port returned error %d\n", err); 64 "serial8250_register_8250_port returned error %d\n", err);
65 iounmap(port.membase); 65 iounmap(uart.port.membase);
66 return err; 66 return err;
67 } 67 }
68 68
diff --git a/drivers/tty/serial/8250/8250_hp300.c b/drivers/tty/serial/8250/8250_hp300.c
index c13438c93012..8f1dd2cc00a8 100644
--- a/drivers/tty/serial/8250/8250_hp300.c
+++ b/drivers/tty/serial/8250/8250_hp300.c
@@ -171,7 +171,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d,
171 return 0; 171 return 0;
172 } 172 }
173#endif 173#endif
174 memset(&port, 0, sizeof(struct uart_port)); 174 memset(&uart, 0, sizeof(uart));
175 175
176 /* Memory mapped I/O */ 176 /* Memory mapped I/O */
177 port.iotype = UPIO_MEM; 177 port.iotype = UPIO_MEM;
@@ -182,7 +182,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d,
182 port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE); 182 port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE);
183 port.regshift = 1; 183 port.regshift = 1;
184 port.dev = &d->dev; 184 port.dev = &d->dev;
185 line = serial8250_register_port(&port); 185 line = serial8250_register_8250_port(&uart);
186 186
187 if (line < 0) { 187 if (line < 0) {
188 printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d" 188 printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d"
@@ -210,7 +210,7 @@ static int __init hp300_8250_init(void)
210#ifdef CONFIG_HPAPCI 210#ifdef CONFIG_HPAPCI
211 int line; 211 int line;
212 unsigned long base; 212 unsigned long base;
213 struct uart_port uport; 213 struct uart_8250_port uart;
214 struct hp300_port *port; 214 struct hp300_port *port;
215 int i; 215 int i;
216#endif 216#endif
@@ -248,26 +248,26 @@ static int __init hp300_8250_init(void)
248 if (!port) 248 if (!port)
249 return -ENOMEM; 249 return -ENOMEM;
250 250
251 memset(&uport, 0, sizeof(struct uart_port)); 251 memset(&uart, 0, sizeof(uart));
252 252
253 base = (FRODO_BASE + FRODO_APCI_OFFSET(i)); 253 base = (FRODO_BASE + FRODO_APCI_OFFSET(i));
254 254
255 /* Memory mapped I/O */ 255 /* Memory mapped I/O */
256 uport.iotype = UPIO_MEM; 256 uart.port.iotype = UPIO_MEM;
257 uport.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \ 257 uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \
258 | UPF_BOOT_AUTOCONF; 258 | UPF_BOOT_AUTOCONF;
259 /* XXX - no interrupt support yet */ 259 /* XXX - no interrupt support yet */
260 uport.irq = 0; 260 uart.port.irq = 0;
261 uport.uartclk = HPAPCI_BAUD_BASE * 16; 261 uart.port.uartclk = HPAPCI_BAUD_BASE * 16;
262 uport.mapbase = base; 262 uart.port.mapbase = base;
263 uport.membase = (char *)(base + DIO_VIRADDRBASE); 263 uart.port.membase = (char *)(base + DIO_VIRADDRBASE);
264 uport.regshift = 2; 264 uart.port.regshift = 2;
265 265
266 line = serial8250_register_port(&uport); 266 line = serial8250_register_8250_port(&uart);
267 267
268 if (line < 0) { 268 if (line < 0) {
269 printk(KERN_NOTICE "8250_hp300: register_serial() APCI" 269 printk(KERN_NOTICE "8250_hp300: register_serial() APCI"
270 " %d irq %d failed\n", i, uport.irq); 270 " %d irq %d failed\n", i, uart.port.irq);
271 kfree(port); 271 kfree(port);
272 continue; 272 continue;
273 } 273 }
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
index 28e7c7cce893..62e10fe747a8 100644
--- a/drivers/tty/serial/8250/8250_pci.c
+++ b/drivers/tty/serial/8250/8250_pci.c
@@ -44,7 +44,7 @@ struct pci_serial_quirk {
44 int (*init)(struct pci_dev *dev); 44 int (*init)(struct pci_dev *dev);
45 int (*setup)(struct serial_private *, 45 int (*setup)(struct serial_private *,
46 const struct pciserial_board *, 46 const struct pciserial_board *,
47 struct uart_port *, int); 47 struct uart_8250_port *, int);
48 void (*exit)(struct pci_dev *dev); 48 void (*exit)(struct pci_dev *dev);
49}; 49};
50 50
@@ -59,7 +59,7 @@ struct serial_private {
59}; 59};
60 60
61static int pci_default_setup(struct serial_private*, 61static int pci_default_setup(struct serial_private*,
62 const struct pciserial_board*, struct uart_port*, int); 62 const struct pciserial_board*, struct uart_8250_port *, int);
63 63
64static void moan_device(const char *str, struct pci_dev *dev) 64static void moan_device(const char *str, struct pci_dev *dev)
65{ 65{
@@ -74,7 +74,7 @@ static void moan_device(const char *str, struct pci_dev *dev)
74} 74}
75 75
76static int 76static int
77setup_port(struct serial_private *priv, struct uart_port *port, 77setup_port(struct serial_private *priv, struct uart_8250_port *port,
78 int bar, int offset, int regshift) 78 int bar, int offset, int regshift)
79{ 79{
80 struct pci_dev *dev = priv->dev; 80 struct pci_dev *dev = priv->dev;
@@ -93,17 +93,17 @@ setup_port(struct serial_private *priv, struct uart_port *port,
93 if (!priv->remapped_bar[bar]) 93 if (!priv->remapped_bar[bar])
94 return -ENOMEM; 94 return -ENOMEM;
95 95
96 port->iotype = UPIO_MEM; 96 port->port.iotype = UPIO_MEM;
97 port->iobase = 0; 97 port->port.iobase = 0;
98 port->mapbase = base + offset; 98 port->port.mapbase = base + offset;
99 port->membase = priv->remapped_bar[bar] + offset; 99 port->port.membase = priv->remapped_bar[bar] + offset;
100 port->regshift = regshift; 100 port->port.regshift = regshift;
101 } else { 101 } else {
102 port->iotype = UPIO_PORT; 102 port->port.iotype = UPIO_PORT;
103 port->iobase = base + offset; 103 port->port.iobase = base + offset;
104 port->mapbase = 0; 104 port->port.mapbase = 0;
105 port->membase = NULL; 105 port->port.membase = NULL;
106 port->regshift = 0; 106 port->port.regshift = 0;
107 } 107 }
108 return 0; 108 return 0;
109} 109}
@@ -113,7 +113,7 @@ setup_port(struct serial_private *priv, struct uart_port *port,
113 */ 113 */
114static int addidata_apci7800_setup(struct serial_private *priv, 114static int addidata_apci7800_setup(struct serial_private *priv,
115 const struct pciserial_board *board, 115 const struct pciserial_board *board,
116 struct uart_port *port, int idx) 116 struct uart_8250_port *port, int idx)
117{ 117{
118 unsigned int bar = 0, offset = board->first_offset; 118 unsigned int bar = 0, offset = board->first_offset;
119 bar = FL_GET_BASE(board->flags); 119 bar = FL_GET_BASE(board->flags);
@@ -140,7 +140,7 @@ static int addidata_apci7800_setup(struct serial_private *priv,
140 */ 140 */
141static int 141static int
142afavlab_setup(struct serial_private *priv, const struct pciserial_board *board, 142afavlab_setup(struct serial_private *priv, const struct pciserial_board *board,
143 struct uart_port *port, int idx) 143 struct uart_8250_port *port, int idx)
144{ 144{
145 unsigned int bar, offset = board->first_offset; 145 unsigned int bar, offset = board->first_offset;
146 146
@@ -195,7 +195,7 @@ static int pci_hp_diva_init(struct pci_dev *dev)
195static int 195static int
196pci_hp_diva_setup(struct serial_private *priv, 196pci_hp_diva_setup(struct serial_private *priv,
197 const struct pciserial_board *board, 197 const struct pciserial_board *board,
198 struct uart_port *port, int idx) 198 struct uart_8250_port *port, int idx)
199{ 199{
200 unsigned int offset = board->first_offset; 200 unsigned int offset = board->first_offset;
201 unsigned int bar = FL_GET_BASE(board->flags); 201 unsigned int bar = FL_GET_BASE(board->flags);
@@ -370,7 +370,7 @@ static void __devexit pci_ni8430_exit(struct pci_dev *dev)
370/* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */ 370/* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
371static int 371static int
372sbs_setup(struct serial_private *priv, const struct pciserial_board *board, 372sbs_setup(struct serial_private *priv, const struct pciserial_board *board,
373 struct uart_port *port, int idx) 373 struct uart_8250_port *port, int idx)
374{ 374{
375 unsigned int bar, offset = board->first_offset; 375 unsigned int bar, offset = board->first_offset;
376 376
@@ -525,7 +525,7 @@ static int pci_siig_init(struct pci_dev *dev)
525 525
526static int pci_siig_setup(struct serial_private *priv, 526static int pci_siig_setup(struct serial_private *priv,
527 const struct pciserial_board *board, 527 const struct pciserial_board *board,
528 struct uart_port *port, int idx) 528 struct uart_8250_port *port, int idx)
529{ 529{
530 unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0; 530 unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0;
531 531
@@ -619,7 +619,7 @@ static int pci_timedia_init(struct pci_dev *dev)
619static int 619static int
620pci_timedia_setup(struct serial_private *priv, 620pci_timedia_setup(struct serial_private *priv,
621 const struct pciserial_board *board, 621 const struct pciserial_board *board,
622 struct uart_port *port, int idx) 622 struct uart_8250_port *port, int idx)
623{ 623{
624 unsigned int bar = 0, offset = board->first_offset; 624 unsigned int bar = 0, offset = board->first_offset;
625 625
@@ -653,7 +653,7 @@ pci_timedia_setup(struct serial_private *priv,
653static int 653static int
654titan_400l_800l_setup(struct serial_private *priv, 654titan_400l_800l_setup(struct serial_private *priv,
655 const struct pciserial_board *board, 655 const struct pciserial_board *board,
656 struct uart_port *port, int idx) 656 struct uart_8250_port *port, int idx)
657{ 657{
658 unsigned int bar, offset = board->first_offset; 658 unsigned int bar, offset = board->first_offset;
659 659
@@ -754,7 +754,7 @@ static int pci_ni8430_init(struct pci_dev *dev)
754static int 754static int
755pci_ni8430_setup(struct serial_private *priv, 755pci_ni8430_setup(struct serial_private *priv,
756 const struct pciserial_board *board, 756 const struct pciserial_board *board,
757 struct uart_port *port, int idx) 757 struct uart_8250_port *port, int idx)
758{ 758{
759 void __iomem *p; 759 void __iomem *p;
760 unsigned long base, len; 760 unsigned long base, len;
@@ -781,7 +781,7 @@ pci_ni8430_setup(struct serial_private *priv,
781 781
782static int pci_netmos_9900_setup(struct serial_private *priv, 782static int pci_netmos_9900_setup(struct serial_private *priv,
783 const struct pciserial_board *board, 783 const struct pciserial_board *board,
784 struct uart_port *port, int idx) 784 struct uart_8250_port *port, int idx)
785{ 785{
786 unsigned int bar; 786 unsigned int bar;
787 787
@@ -1032,10 +1032,17 @@ static int pci_oxsemi_tornado_init(struct pci_dev *dev)
1032 return number_uarts; 1032 return number_uarts;
1033} 1033}
1034 1034
1035static int 1035static int pci_asix_setup(struct serial_private *priv,
1036pci_default_setup(struct serial_private *priv, 1036 const struct pciserial_board *board,
1037 struct uart_8250_port *port, int idx)
1038{
1039 port->bugs |= UART_BUG_PARITY;
1040 return pci_default_setup(priv, board, port, idx);
1041}
1042
1043static int pci_default_setup(struct serial_private *priv,
1037 const struct pciserial_board *board, 1044 const struct pciserial_board *board,
1038 struct uart_port *port, int idx) 1045 struct uart_8250_port *port, int idx)
1039{ 1046{
1040 unsigned int bar, offset = board->first_offset, maxnr; 1047 unsigned int bar, offset = board->first_offset, maxnr;
1041 1048
@@ -1057,15 +1064,15 @@ pci_default_setup(struct serial_private *priv,
1057static int 1064static int
1058ce4100_serial_setup(struct serial_private *priv, 1065ce4100_serial_setup(struct serial_private *priv,
1059 const struct pciserial_board *board, 1066 const struct pciserial_board *board,
1060 struct uart_port *port, int idx) 1067 struct uart_8250_port *port, int idx)
1061{ 1068{
1062 int ret; 1069 int ret;
1063 1070
1064 ret = setup_port(priv, port, 0, 0, board->reg_shift); 1071 ret = setup_port(priv, port, 0, 0, board->reg_shift);
1065 port->iotype = UPIO_MEM32; 1072 port->port.iotype = UPIO_MEM32;
1066 port->type = PORT_XSCALE; 1073 port->port.type = PORT_XSCALE;
1067 port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE); 1074 port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
1068 port->regshift = 2; 1075 port->port.regshift = 2;
1069 1076
1070 return ret; 1077 return ret;
1071} 1078}
@@ -1073,16 +1080,16 @@ ce4100_serial_setup(struct serial_private *priv,
1073static int 1080static int
1074pci_omegapci_setup(struct serial_private *priv, 1081pci_omegapci_setup(struct serial_private *priv,
1075 const struct pciserial_board *board, 1082 const struct pciserial_board *board,
1076 struct uart_port *port, int idx) 1083 struct uart_8250_port *port, int idx)
1077{ 1084{
1078 return setup_port(priv, port, 2, idx * 8, 0); 1085 return setup_port(priv, port, 2, idx * 8, 0);
1079} 1086}
1080 1087
1081static int skip_tx_en_setup(struct serial_private *priv, 1088static int skip_tx_en_setup(struct serial_private *priv,
1082 const struct pciserial_board *board, 1089 const struct pciserial_board *board,
1083 struct uart_port *port, int idx) 1090 struct uart_8250_port *port, int idx)
1084{ 1091{
1085 port->flags |= UPF_NO_TXEN_TEST; 1092 port->port.flags |= UPF_NO_TXEN_TEST;
1086 printk(KERN_DEBUG "serial8250: skipping TxEn test for device " 1093 printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
1087 "[%04x:%04x] subsystem [%04x:%04x]\n", 1094 "[%04x:%04x] subsystem [%04x:%04x]\n",
1088 priv->dev->vendor, 1095 priv->dev->vendor,
@@ -1131,11 +1138,11 @@ static unsigned int kt_serial_in(struct uart_port *p, int offset)
1131 1138
1132static int kt_serial_setup(struct serial_private *priv, 1139static int kt_serial_setup(struct serial_private *priv,
1133 const struct pciserial_board *board, 1140 const struct pciserial_board *board,
1134 struct uart_port *port, int idx) 1141 struct uart_8250_port *port, int idx)
1135{ 1142{
1136 port->flags |= UPF_BUG_THRE; 1143 port->port.flags |= UPF_BUG_THRE;
1137 port->serial_in = kt_serial_in; 1144 port->port.serial_in = kt_serial_in;
1138 port->handle_break = kt_handle_break; 1145 port->port.handle_break = kt_handle_break;
1139 return skip_tx_en_setup(priv, board, port, idx); 1146 return skip_tx_en_setup(priv, board, port, idx);
1140} 1147}
1141 1148
@@ -1151,9 +1158,9 @@ static int pci_eg20t_init(struct pci_dev *dev)
1151static int 1158static int
1152pci_xr17c154_setup(struct serial_private *priv, 1159pci_xr17c154_setup(struct serial_private *priv,
1153 const struct pciserial_board *board, 1160 const struct pciserial_board *board,
1154 struct uart_port *port, int idx) 1161 struct uart_8250_port *port, int idx)
1155{ 1162{
1156 port->flags |= UPF_EXAR_EFR; 1163 port->port.flags |= UPF_EXAR_EFR;
1157 return pci_default_setup(priv, board, port, idx); 1164 return pci_default_setup(priv, board, port, idx);
1158} 1165}
1159 1166
@@ -1187,6 +1194,7 @@ pci_xr17c154_setup(struct serial_private *priv,
1187#define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 1194#define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6
1188#define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 1195#define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
1189#define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d 1196#define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
1197#define PCI_VENDOR_ID_ASIX 0x9710
1190 1198
1191/* Unknown vendors/cards - this should not be in linux/pci_ids.h */ 1199/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
1192#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 1200#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
@@ -1726,7 +1734,17 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
1726 .subvendor = PCI_ANY_ID, 1734 .subvendor = PCI_ANY_ID,
1727 .subdevice = PCI_ANY_ID, 1735 .subdevice = PCI_ANY_ID,
1728 .setup = pci_omegapci_setup, 1736 .setup = pci_omegapci_setup,
1729 }, 1737 },
1738 /*
1739 * ASIX devices with FIFO bug
1740 */
1741 {
1742 .vendor = PCI_VENDOR_ID_ASIX,
1743 .device = PCI_ANY_ID,
1744 .subvendor = PCI_ANY_ID,
1745 .subdevice = PCI_ANY_ID,
1746 .setup = pci_asix_setup,
1747 },
1730 /* 1748 /*
1731 * Default "match everything" terminator entry 1749 * Default "match everything" terminator entry
1732 */ 1750 */
@@ -1887,7 +1905,6 @@ enum pci_board_num_t {
1887 pbn_panacom, 1905 pbn_panacom,
1888 pbn_panacom2, 1906 pbn_panacom2,
1889 pbn_panacom4, 1907 pbn_panacom4,
1890 pbn_exsys_4055,
1891 pbn_plx_romulus, 1908 pbn_plx_romulus,
1892 pbn_oxsemi, 1909 pbn_oxsemi,
1893 pbn_oxsemi_1_4000000, 1910 pbn_oxsemi_1_4000000,
@@ -2393,13 +2410,6 @@ static struct pciserial_board pci_boards[] __devinitdata = {
2393 .reg_shift = 7, 2410 .reg_shift = 7,
2394 }, 2411 },
2395 2412
2396 [pbn_exsys_4055] = {
2397 .flags = FL_BASE2,
2398 .num_ports = 4,
2399 .base_baud = 115200,
2400 .uart_offset = 8,
2401 },
2402
2403 /* I think this entry is broken - the first_offset looks wrong --rmk */ 2413 /* I think this entry is broken - the first_offset looks wrong --rmk */
2404 [pbn_plx_romulus] = { 2414 [pbn_plx_romulus] = {
2405 .flags = FL_BASE2, 2415 .flags = FL_BASE2,
@@ -2728,7 +2738,7 @@ serial_pci_matches(const struct pciserial_board *board,
2728struct serial_private * 2738struct serial_private *
2729pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) 2739pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
2730{ 2740{
2731 struct uart_port serial_port; 2741 struct uart_8250_port uart;
2732 struct serial_private *priv; 2742 struct serial_private *priv;
2733 struct pci_serial_quirk *quirk; 2743 struct pci_serial_quirk *quirk;
2734 int rc, nr_ports, i; 2744 int rc, nr_ports, i;
@@ -2768,22 +2778,22 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
2768 priv->dev = dev; 2778 priv->dev = dev;
2769 priv->quirk = quirk; 2779 priv->quirk = quirk;
2770 2780
2771 memset(&serial_port, 0, sizeof(struct uart_port)); 2781 memset(&uart, 0, sizeof(uart));
2772 serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 2782 uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
2773 serial_port.uartclk = board->base_baud * 16; 2783 uart.port.uartclk = board->base_baud * 16;
2774 serial_port.irq = get_pci_irq(dev, board); 2784 uart.port.irq = get_pci_irq(dev, board);
2775 serial_port.dev = &dev->dev; 2785 uart.port.dev = &dev->dev;
2776 2786
2777 for (i = 0; i < nr_ports; i++) { 2787 for (i = 0; i < nr_ports; i++) {
2778 if (quirk->setup(priv, board, &serial_port, i)) 2788 if (quirk->setup(priv, board, &uart, i))
2779 break; 2789 break;
2780 2790
2781#ifdef SERIAL_DEBUG_PCI 2791#ifdef SERIAL_DEBUG_PCI
2782 printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n", 2792 printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n",
2783 serial_port.iobase, serial_port.irq, serial_port.iotype); 2793 uart.port.iobase, uart.port.irq, uart.port.iotype);
2784#endif 2794#endif
2785 2795
2786 priv->line[i] = serial8250_register_port(&serial_port); 2796 priv->line[i] = serial8250_register_8250_port(&uart);
2787 if (priv->line[i] < 0) { 2797 if (priv->line[i] < 0) {
2788 printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); 2798 printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]);
2789 break; 2799 break;
@@ -3193,7 +3203,7 @@ static struct pci_device_id serial_pci_tbl[] = {
3193 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, 3203 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
3194 PCI_SUBVENDOR_ID_EXSYS, 3204 PCI_SUBVENDOR_ID_EXSYS,
3195 PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0, 3205 PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
3196 pbn_exsys_4055 }, 3206 pbn_b2_4_115200 },
3197 /* 3207 /*
3198 * Megawolf Romulus PCI Serial Card, from Mike Hudson 3208 * Megawolf Romulus PCI Serial Card, from Mike Hudson
3199 * (Exoray@isys.ca) 3209 * (Exoray@isys.ca)
diff --git a/drivers/tty/serial/8250/8250_pnp.c b/drivers/tty/serial/8250/8250_pnp.c
index a2f236510ff1..fde5aa60d51e 100644
--- a/drivers/tty/serial/8250/8250_pnp.c
+++ b/drivers/tty/serial/8250/8250_pnp.c
@@ -424,7 +424,7 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags)
424static int __devinit 424static int __devinit
425serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) 425serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
426{ 426{
427 struct uart_port port; 427 struct uart_8250_port uart;
428 int ret, line, flags = dev_id->driver_data; 428 int ret, line, flags = dev_id->driver_data;
429 429
430 if (flags & UNKNOWN_DEV) { 430 if (flags & UNKNOWN_DEV) {
@@ -433,32 +433,32 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
433 return ret; 433 return ret;
434 } 434 }
435 435
436 memset(&port, 0, sizeof(struct uart_port)); 436 memset(&uart, 0, sizeof(uart));
437 if (pnp_irq_valid(dev, 0)) 437 if (pnp_irq_valid(dev, 0))
438 port.irq = pnp_irq(dev, 0); 438 uart.port.irq = pnp_irq(dev, 0);
439 if (pnp_port_valid(dev, 0)) { 439 if (pnp_port_valid(dev, 0)) {
440 port.iobase = pnp_port_start(dev, 0); 440 uart.port.iobase = pnp_port_start(dev, 0);
441 port.iotype = UPIO_PORT; 441 uart.port.iotype = UPIO_PORT;
442 } else if (pnp_mem_valid(dev, 0)) { 442 } else if (pnp_mem_valid(dev, 0)) {
443 port.mapbase = pnp_mem_start(dev, 0); 443 uart.port.mapbase = pnp_mem_start(dev, 0);
444 port.iotype = UPIO_MEM; 444 uart.port.iotype = UPIO_MEM;
445 port.flags = UPF_IOREMAP; 445 uart.port.flags = UPF_IOREMAP;
446 } else 446 } else
447 return -ENODEV; 447 return -ENODEV;
448 448
449#ifdef SERIAL_DEBUG_PNP 449#ifdef SERIAL_DEBUG_PNP
450 printk(KERN_DEBUG 450 printk(KERN_DEBUG
451 "Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n", 451 "Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
452 port.iobase, port.mapbase, port.irq, port.iotype); 452 uart.port.iobase, uart.port.mapbase, uart.port.irq, uart.port.iotype);
453#endif 453#endif
454 454
455 port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; 455 uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
456 if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE) 456 if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
457 port.flags |= UPF_SHARE_IRQ; 457 uart.port.flags |= UPF_SHARE_IRQ;
458 port.uartclk = 1843200; 458 uart.port.uartclk = 1843200;
459 port.dev = &dev->dev; 459 uart.port.dev = &dev->dev;
460 460
461 line = serial8250_register_port(&port); 461 line = serial8250_register_8250_port(&uart);
462 if (line < 0) 462 if (line < 0)
463 return -ENODEV; 463 return -ENODEV;
464 464
diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c
index 29b695d041ec..b7d48b346393 100644
--- a/drivers/tty/serial/8250/serial_cs.c
+++ b/drivers/tty/serial/8250/serial_cs.c
@@ -73,7 +73,7 @@ struct serial_quirk {
73 unsigned int prodid; 73 unsigned int prodid;
74 int multi; /* 1 = multifunction, > 1 = # ports */ 74 int multi; /* 1 = multifunction, > 1 = # ports */
75 void (*config)(struct pcmcia_device *); 75 void (*config)(struct pcmcia_device *);
76 void (*setup)(struct pcmcia_device *, struct uart_port *); 76 void (*setup)(struct pcmcia_device *, struct uart_8250_port *);
77 void (*wakeup)(struct pcmcia_device *); 77 void (*wakeup)(struct pcmcia_device *);
78 int (*post)(struct pcmcia_device *); 78 int (*post)(struct pcmcia_device *);
79}; 79};
@@ -105,9 +105,9 @@ struct serial_cfg_mem {
105 * Elan VPU16551 UART with 14.7456MHz oscillator 105 * Elan VPU16551 UART with 14.7456MHz oscillator
106 * manfid 0x015D, 0x4C45 106 * manfid 0x015D, 0x4C45
107 */ 107 */
108static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) 108static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart)
109{ 109{
110 port->uartclk = 14745600; 110 uart->port.uartclk = 14745600;
111} 111}
112 112
113static int quirk_post_ibm(struct pcmcia_device *link) 113static int quirk_post_ibm(struct pcmcia_device *link)
@@ -343,25 +343,25 @@ static void serial_detach(struct pcmcia_device *link)
343static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, 343static int setup_serial(struct pcmcia_device *handle, struct serial_info * info,
344 unsigned int iobase, int irq) 344 unsigned int iobase, int irq)
345{ 345{
346 struct uart_port port; 346 struct uart_8250_port uart;
347 int line; 347 int line;
348 348
349 memset(&port, 0, sizeof (struct uart_port)); 349 memset(&uart, 0, sizeof(uart));
350 port.iobase = iobase; 350 uart.port.iobase = iobase;
351 port.irq = irq; 351 uart.port.irq = irq;
352 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; 352 uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
353 port.uartclk = 1843200; 353 uart.port.uartclk = 1843200;
354 port.dev = &handle->dev; 354 uart.port.dev = &handle->dev;
355 if (buggy_uart) 355 if (buggy_uart)
356 port.flags |= UPF_BUGGY_UART; 356 uart.port.flags |= UPF_BUGGY_UART;
357 357
358 if (info->quirk && info->quirk->setup) 358 if (info->quirk && info->quirk->setup)
359 info->quirk->setup(handle, &port); 359 info->quirk->setup(handle, &uart);
360 360
361 line = serial8250_register_port(&port); 361 line = serial8250_register_8250_port(&uart);
362 if (line < 0) { 362 if (line < 0) {
363 printk(KERN_NOTICE "serial_cs: serial8250_register_port() at " 363 pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n",
364 "0x%04lx, irq %d failed\n", (u_long)iobase, irq); 364 (unsigned long)iobase, irq);
365 return -EINVAL; 365 return -EINVAL;
366 } 366 }
367 367
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 070b442c1f81..00207865ec55 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -704,6 +704,25 @@ config SERIAL_PNX8XXX_CONSOLE
704 If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330 704 If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
705 and you want to use serial console, say Y. Otherwise, say N. 705 and you want to use serial console, say Y. Otherwise, say N.
706 706
707config SERIAL_HS_LPC32XX
708 tristate "LPC32XX high speed serial port support"
709 depends on ARCH_LPC32XX && OF
710 select SERIAL_CORE
711 help
712 Support for the LPC32XX high speed serial ports (up to 900kbps).
713 Those are UARTs completely different from the Standard UARTs on the
714 LPC32XX SoC.
715 Choose M or Y here to build this driver.
716
717config SERIAL_HS_LPC32XX_CONSOLE
718 bool "Enable LPC32XX high speed UART serial console"
719 depends on SERIAL_HS_LPC32XX
720 select SERIAL_CORE_CONSOLE
721 help
722 If you would like to be able to use one of the high speed serial
723 ports on the LPC32XX as the console, you can do so by answering
724 Y to this option.
725
707config SERIAL_CORE 726config SERIAL_CORE
708 tristate 727 tristate
709 728
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile
index 7257c5d898ae..8a5df3804e5f 100644
--- a/drivers/tty/serial/Makefile
+++ b/drivers/tty/serial/Makefile
@@ -34,6 +34,7 @@ obj-$(CONFIG_SERIAL_MUX) += mux.o
34obj-$(CONFIG_SERIAL_68328) += 68328serial.o 34obj-$(CONFIG_SERIAL_68328) += 68328serial.o
35obj-$(CONFIG_SERIAL_MCF) += mcf.o 35obj-$(CONFIG_SERIAL_MCF) += mcf.o
36obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o 36obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o
37obj-$(CONFIG_SERIAL_HS_LPC32XX) += lpc32xx_hs.o
37obj-$(CONFIG_SERIAL_DZ) += dz.o 38obj-$(CONFIG_SERIAL_DZ) += dz.o
38obj-$(CONFIG_SERIAL_ZS) += zs.o 39obj-$(CONFIG_SERIAL_ZS) += zs.o
39obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o 40obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index d3553b5d3fca..92b1ac8db63d 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -1215,14 +1215,14 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
1215 return IRQ_RETVAL(handled); 1215 return IRQ_RETVAL(handled);
1216} 1216}
1217 1217
1218static unsigned int pl01x_tx_empty(struct uart_port *port) 1218static unsigned int pl011_tx_empty(struct uart_port *port)
1219{ 1219{
1220 struct uart_amba_port *uap = (struct uart_amba_port *)port; 1220 struct uart_amba_port *uap = (struct uart_amba_port *)port;
1221 unsigned int status = readw(uap->port.membase + UART01x_FR); 1221 unsigned int status = readw(uap->port.membase + UART01x_FR);
1222 return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT; 1222 return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT;
1223} 1223}
1224 1224
1225static unsigned int pl01x_get_mctrl(struct uart_port *port) 1225static unsigned int pl011_get_mctrl(struct uart_port *port)
1226{ 1226{
1227 struct uart_amba_port *uap = (struct uart_amba_port *)port; 1227 struct uart_amba_port *uap = (struct uart_amba_port *)port;
1228 unsigned int result = 0; 1228 unsigned int result = 0;
@@ -1285,7 +1285,7 @@ static void pl011_break_ctl(struct uart_port *port, int break_state)
1285} 1285}
1286 1286
1287#ifdef CONFIG_CONSOLE_POLL 1287#ifdef CONFIG_CONSOLE_POLL
1288static int pl010_get_poll_char(struct uart_port *port) 1288static int pl011_get_poll_char(struct uart_port *port)
1289{ 1289{
1290 struct uart_amba_port *uap = (struct uart_amba_port *)port; 1290 struct uart_amba_port *uap = (struct uart_amba_port *)port;
1291 unsigned int status; 1291 unsigned int status;
@@ -1297,7 +1297,7 @@ static int pl010_get_poll_char(struct uart_port *port)
1297 return readw(uap->port.membase + UART01x_DR); 1297 return readw(uap->port.membase + UART01x_DR);
1298} 1298}
1299 1299
1300static void pl010_put_poll_char(struct uart_port *port, 1300static void pl011_put_poll_char(struct uart_port *port,
1301 unsigned char ch) 1301 unsigned char ch)
1302{ 1302{
1303 struct uart_amba_port *uap = (struct uart_amba_port *)port; 1303 struct uart_amba_port *uap = (struct uart_amba_port *)port;
@@ -1637,7 +1637,7 @@ static const char *pl011_type(struct uart_port *port)
1637/* 1637/*
1638 * Release the memory region(s) being used by 'port' 1638 * Release the memory region(s) being used by 'port'
1639 */ 1639 */
1640static void pl010_release_port(struct uart_port *port) 1640static void pl011_release_port(struct uart_port *port)
1641{ 1641{
1642 release_mem_region(port->mapbase, SZ_4K); 1642 release_mem_region(port->mapbase, SZ_4K);
1643} 1643}
@@ -1645,7 +1645,7 @@ static void pl010_release_port(struct uart_port *port)
1645/* 1645/*
1646 * Request the memory region(s) being used by 'port' 1646 * Request the memory region(s) being used by 'port'
1647 */ 1647 */
1648static int pl010_request_port(struct uart_port *port) 1648static int pl011_request_port(struct uart_port *port)
1649{ 1649{
1650 return request_mem_region(port->mapbase, SZ_4K, "uart-pl011") 1650 return request_mem_region(port->mapbase, SZ_4K, "uart-pl011")
1651 != NULL ? 0 : -EBUSY; 1651 != NULL ? 0 : -EBUSY;
@@ -1654,18 +1654,18 @@ static int pl010_request_port(struct uart_port *port)
1654/* 1654/*
1655 * Configure/autoconfigure the port. 1655 * Configure/autoconfigure the port.
1656 */ 1656 */
1657static void pl010_config_port(struct uart_port *port, int flags) 1657static void pl011_config_port(struct uart_port *port, int flags)
1658{ 1658{
1659 if (flags & UART_CONFIG_TYPE) { 1659 if (flags & UART_CONFIG_TYPE) {
1660 port->type = PORT_AMBA; 1660 port->type = PORT_AMBA;
1661 pl010_request_port(port); 1661 pl011_request_port(port);
1662 } 1662 }
1663} 1663}
1664 1664
1665/* 1665/*
1666 * verify the new serial_struct (for TIOCSSERIAL). 1666 * verify the new serial_struct (for TIOCSSERIAL).
1667 */ 1667 */
1668static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser) 1668static int pl011_verify_port(struct uart_port *port, struct serial_struct *ser)
1669{ 1669{
1670 int ret = 0; 1670 int ret = 0;
1671 if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA) 1671 if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA)
@@ -1678,9 +1678,9 @@ static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser)
1678} 1678}
1679 1679
1680static struct uart_ops amba_pl011_pops = { 1680static struct uart_ops amba_pl011_pops = {
1681 .tx_empty = pl01x_tx_empty, 1681 .tx_empty = pl011_tx_empty,
1682 .set_mctrl = pl011_set_mctrl, 1682 .set_mctrl = pl011_set_mctrl,
1683 .get_mctrl = pl01x_get_mctrl, 1683 .get_mctrl = pl011_get_mctrl,
1684 .stop_tx = pl011_stop_tx, 1684 .stop_tx = pl011_stop_tx,
1685 .start_tx = pl011_start_tx, 1685 .start_tx = pl011_start_tx,
1686 .stop_rx = pl011_stop_rx, 1686 .stop_rx = pl011_stop_rx,
@@ -1691,13 +1691,13 @@ static struct uart_ops amba_pl011_pops = {
1691 .flush_buffer = pl011_dma_flush_buffer, 1691 .flush_buffer = pl011_dma_flush_buffer,
1692 .set_termios = pl011_set_termios, 1692 .set_termios = pl011_set_termios,
1693 .type = pl011_type, 1693 .type = pl011_type,
1694 .release_port = pl010_release_port, 1694 .release_port = pl011_release_port,
1695 .request_port = pl010_request_port, 1695 .request_port = pl011_request_port,
1696 .config_port = pl010_config_port, 1696 .config_port = pl011_config_port,
1697 .verify_port = pl010_verify_port, 1697 .verify_port = pl011_verify_port,
1698#ifdef CONFIG_CONSOLE_POLL 1698#ifdef CONFIG_CONSOLE_POLL
1699 .poll_get_char = pl010_get_poll_char, 1699 .poll_get_char = pl011_get_poll_char,
1700 .poll_put_char = pl010_put_poll_char, 1700 .poll_put_char = pl011_put_poll_char,
1701#endif 1701#endif
1702}; 1702};
1703 1703
diff --git a/drivers/tty/serial/bfin_uart.c b/drivers/tty/serial/bfin_uart.c
index bd97db23985b..9242d56ba267 100644
--- a/drivers/tty/serial/bfin_uart.c
+++ b/drivers/tty/serial/bfin_uart.c
@@ -182,7 +182,7 @@ static void bfin_serial_start_tx(struct uart_port *port)
182 * To avoid losting RX interrupt, we reset IR function 182 * To avoid losting RX interrupt, we reset IR function
183 * before sending data. 183 * before sending data.
184 */ 184 */
185 if (tty->termios->c_line == N_IRDA) 185 if (tty->termios.c_line == N_IRDA)
186 bfin_serial_reset_irda(port); 186 bfin_serial_reset_irda(port);
187 187
188#ifdef CONFIG_SERIAL_BFIN_DMA 188#ifdef CONFIG_SERIAL_BFIN_DMA
diff --git a/drivers/tty/serial/crisv10.c b/drivers/tty/serial/crisv10.c
index 80b6b1b1f725..6b705b243522 100644
--- a/drivers/tty/serial/crisv10.c
+++ b/drivers/tty/serial/crisv10.c
@@ -955,7 +955,7 @@ static const struct control_pins e100_modem_pins[NR_PORTS] =
955/* Calculate the chartime depending on baudrate, numbor of bits etc. */ 955/* Calculate the chartime depending on baudrate, numbor of bits etc. */
956static void update_char_time(struct e100_serial * info) 956static void update_char_time(struct e100_serial * info)
957{ 957{
958 tcflag_t cflags = info->port.tty->termios->c_cflag; 958 tcflag_t cflags = info->port.tty->termios.c_cflag;
959 int bits; 959 int bits;
960 960
961 /* calc. number of bits / data byte */ 961 /* calc. number of bits / data byte */
@@ -1473,7 +1473,7 @@ rs_stop(struct tty_struct *tty)
1473 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, 1473 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char,
1474 STOP_CHAR(info->port.tty)); 1474 STOP_CHAR(info->port.tty));
1475 xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop); 1475 xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop);
1476 if (tty->termios->c_iflag & IXON ) { 1476 if (tty->termios.c_iflag & IXON ) {
1477 xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); 1477 xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
1478 } 1478 }
1479 1479
@@ -1496,7 +1496,7 @@ rs_start(struct tty_struct *tty)
1496 info->xmit.tail,SERIAL_XMIT_SIZE))); 1496 info->xmit.tail,SERIAL_XMIT_SIZE)));
1497 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty)); 1497 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty));
1498 xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); 1498 xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
1499 if (tty->termios->c_iflag & IXON ) { 1499 if (tty->termios.c_iflag & IXON ) {
1500 xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); 1500 xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
1501 } 1501 }
1502 1502
@@ -2929,7 +2929,7 @@ shutdown(struct e100_serial * info)
2929 descr[i].buf = 0; 2929 descr[i].buf = 0;
2930 } 2930 }
2931 2931
2932 if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) { 2932 if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
2933 /* hang up DTR and RTS if HUPCL is enabled */ 2933 /* hang up DTR and RTS if HUPCL is enabled */
2934 e100_dtr(info, 0); 2934 e100_dtr(info, 0);
2935 e100_rts(info, 0); /* could check CRTSCTS before doing this */ 2935 e100_rts(info, 0); /* could check CRTSCTS before doing this */
@@ -2953,12 +2953,12 @@ change_speed(struct e100_serial *info)
2953 unsigned long flags; 2953 unsigned long flags;
2954 /* first some safety checks */ 2954 /* first some safety checks */
2955 2955
2956 if (!info->port.tty || !info->port.tty->termios) 2956 if (!info->port.tty)
2957 return; 2957 return;
2958 if (!info->ioport) 2958 if (!info->ioport)
2959 return; 2959 return;
2960 2960
2961 cflag = info->port.tty->termios->c_cflag; 2961 cflag = info->port.tty->termios.c_cflag;
2962 2962
2963 /* possibly, the tx/rx should be disabled first to do this safely */ 2963 /* possibly, the tx/rx should be disabled first to do this safely */
2964 2964
@@ -3088,7 +3088,7 @@ change_speed(struct e100_serial *info)
3088 info->ioport[REG_REC_CTRL] = info->rx_ctrl; 3088 info->ioport[REG_REC_CTRL] = info->rx_ctrl;
3089 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); 3089 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty));
3090 xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); 3090 xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
3091 if (info->port.tty->termios->c_iflag & IXON ) { 3091 if (info->port.tty->termios.c_iflag & IXON ) {
3092 DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n", 3092 DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n",
3093 STOP_CHAR(info->port.tty))); 3093 STOP_CHAR(info->port.tty)));
3094 xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); 3094 xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
@@ -3355,7 +3355,7 @@ rs_throttle(struct tty_struct * tty)
3355 DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty))); 3355 DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty)));
3356 3356
3357 /* Do RTS before XOFF since XOFF might take some time */ 3357 /* Do RTS before XOFF since XOFF might take some time */
3358 if (tty->termios->c_cflag & CRTSCTS) { 3358 if (tty->termios.c_cflag & CRTSCTS) {
3359 /* Turn off RTS line */ 3359 /* Turn off RTS line */
3360 e100_rts(info, 0); 3360 e100_rts(info, 0);
3361 } 3361 }
@@ -3377,7 +3377,7 @@ rs_unthrottle(struct tty_struct * tty)
3377 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty))); 3377 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty)));
3378 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count)); 3378 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count));
3379 /* Do RTS before XOFF since XOFF might take some time */ 3379 /* Do RTS before XOFF since XOFF might take some time */
3380 if (tty->termios->c_cflag & CRTSCTS) { 3380 if (tty->termios.c_cflag & CRTSCTS) {
3381 /* Assert RTS line */ 3381 /* Assert RTS line */
3382 e100_rts(info, 1); 3382 e100_rts(info, 1);
3383 } 3383 }
@@ -3748,7 +3748,7 @@ rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
3748 3748
3749 /* Handle turning off CRTSCTS */ 3749 /* Handle turning off CRTSCTS */
3750 if ((old_termios->c_cflag & CRTSCTS) && 3750 if ((old_termios->c_cflag & CRTSCTS) &&
3751 !(tty->termios->c_cflag & CRTSCTS)) { 3751 !(tty->termios.c_cflag & CRTSCTS)) {
3752 tty->hw_stopped = 0; 3752 tty->hw_stopped = 0;
3753 rs_start(tty); 3753 rs_start(tty);
3754 } 3754 }
@@ -3815,7 +3815,7 @@ rs_close(struct tty_struct *tty, struct file * filp)
3815 * separate termios for callout and dialin. 3815 * separate termios for callout and dialin.
3816 */ 3816 */
3817 if (info->flags & ASYNC_NORMAL_ACTIVE) 3817 if (info->flags & ASYNC_NORMAL_ACTIVE)
3818 info->normal_termios = *tty->termios; 3818 info->normal_termios = tty->termios;
3819 /* 3819 /*
3820 * Now we wait for the transmit buffer to clear; and we notify 3820 * Now we wait for the transmit buffer to clear; and we notify
3821 * the line discipline to only process XON/XOFF characters. 3821 * the line discipline to only process XON/XOFF characters.
@@ -3998,7 +3998,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
3998 return 0; 3998 return 0;
3999 } 3999 }
4000 4000
4001 if (tty->termios->c_cflag & CLOCAL) { 4001 if (tty->termios.c_cflag & CLOCAL) {
4002 do_clocal = 1; 4002 do_clocal = 1;
4003 } 4003 }
4004 4004
@@ -4219,7 +4219,7 @@ rs_open(struct tty_struct *tty, struct file * filp)
4219 } 4219 }
4220 4220
4221 if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) { 4221 if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) {
4222 *tty->termios = info->normal_termios; 4222 tty->termios = info->normal_termios;
4223 change_speed(info); 4223 change_speed(info);
4224 } 4224 }
4225 4225
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index d5c689d6217e..20e911724027 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -206,7 +206,7 @@ struct imx_port {
206 unsigned short trcv_delay; /* transceiver delay */ 206 unsigned short trcv_delay; /* transceiver delay */
207 struct clk *clk_ipg; 207 struct clk *clk_ipg;
208 struct clk *clk_per; 208 struct clk *clk_per;
209 struct imx_uart_data *devdata; 209 const struct imx_uart_data *devdata;
210}; 210};
211 211
212struct imx_port_ucrs { 212struct imx_port_ucrs {
diff --git a/drivers/tty/serial/ioc4_serial.c b/drivers/tty/serial/ioc4_serial.c
index e16894fb2ca3..cc5aca78ad9b 100644
--- a/drivers/tty/serial/ioc4_serial.c
+++ b/drivers/tty/serial/ioc4_serial.c
@@ -1803,7 +1803,7 @@ static inline int ic4_startup_local(struct uart_port *the_port)
1803 ioc4_set_proto(port, the_port->mapbase); 1803 ioc4_set_proto(port, the_port->mapbase);
1804 1804
1805 /* set the speed of the serial port */ 1805 /* set the speed of the serial port */
1806 ioc4_change_speed(the_port, state->port.tty->termios, 1806 ioc4_change_speed(the_port, &state->port.tty->termios,
1807 (struct ktermios *)0); 1807 (struct ktermios *)0);
1808 1808
1809 return 0; 1809 return 0;
diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c
index 434bd881fcae..71397961773c 100644
--- a/drivers/tty/serial/jsm/jsm_tty.c
+++ b/drivers/tty/serial/jsm/jsm_tty.c
@@ -161,7 +161,7 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch)
161 struct ktermios *termios; 161 struct ktermios *termios;
162 162
163 spin_lock_irqsave(&port->lock, lock_flags); 163 spin_lock_irqsave(&port->lock, lock_flags);
164 termios = port->state->port.tty->termios; 164 termios = &port->state->port.tty->termios;
165 if (ch == termios->c_cc[VSTART]) 165 if (ch == termios->c_cc[VSTART])
166 channel->ch_bd->bd_ops->send_start_character(channel); 166 channel->ch_bd->bd_ops->send_start_character(channel);
167 167
@@ -250,7 +250,7 @@ static int jsm_tty_open(struct uart_port *port)
250 channel->ch_cached_lsr = 0; 250 channel->ch_cached_lsr = 0;
251 channel->ch_stops_sent = 0; 251 channel->ch_stops_sent = 0;
252 252
253 termios = port->state->port.tty->termios; 253 termios = &port->state->port.tty->termios;
254 channel->ch_c_cflag = termios->c_cflag; 254 channel->ch_c_cflag = termios->c_cflag;
255 channel->ch_c_iflag = termios->c_iflag; 255 channel->ch_c_iflag = termios->c_iflag;
256 channel->ch_c_oflag = termios->c_oflag; 256 channel->ch_c_oflag = termios->c_oflag;
@@ -283,7 +283,7 @@ static void jsm_tty_close(struct uart_port *port)
283 jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n"); 283 jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n");
284 284
285 bd = channel->ch_bd; 285 bd = channel->ch_bd;
286 ts = port->state->port.tty->termios; 286 ts = &port->state->port.tty->termios;
287 287
288 channel->ch_flags &= ~(CH_STOPI); 288 channel->ch_flags &= ~(CH_STOPI);
289 289
@@ -567,7 +567,7 @@ void jsm_input(struct jsm_channel *ch)
567 *input data and return immediately. 567 *input data and return immediately.
568 */ 568 */
569 if (!tp || 569 if (!tp ||
570 !(tp->termios->c_cflag & CREAD) ) { 570 !(tp->termios.c_cflag & CREAD) ) {
571 571
572 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, 572 jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
573 "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum); 573 "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum);
diff --git a/drivers/tty/serial/lpc32xx_hs.c b/drivers/tty/serial/lpc32xx_hs.c
new file mode 100644
index 000000000000..ba3af3bf6d43
--- /dev/null
+++ b/drivers/tty/serial/lpc32xx_hs.c
@@ -0,0 +1,823 @@
1/*
2 * High Speed Serial Ports on NXP LPC32xx SoC
3 *
4 * Authors: Kevin Wells <kevin.wells@nxp.com>
5 * Roland Stigge <stigge@antcom.de>
6 *
7 * Copyright (C) 2010 NXP Semiconductors
8 * Copyright (C) 2012 Roland Stigge
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 */
20
21#include <linux/module.h>
22#include <linux/ioport.h>
23#include <linux/init.h>
24#include <linux/console.h>
25#include <linux/sysrq.h>
26#include <linux/tty.h>
27#include <linux/tty_flip.h>
28#include <linux/serial_core.h>
29#include <linux/serial.h>
30#include <linux/platform_device.h>
31#include <linux/delay.h>
32#include <linux/nmi.h>
33#include <linux/io.h>
34#include <linux/irq.h>
35#include <linux/gpio.h>
36#include <linux/of.h>
37#include <mach/platform.h>
38#include <mach/hardware.h>
39
40/*
41 * High Speed UART register offsets
42 */
43#define LPC32XX_HSUART_FIFO(x) ((x) + 0x00)
44#define LPC32XX_HSUART_LEVEL(x) ((x) + 0x04)
45#define LPC32XX_HSUART_IIR(x) ((x) + 0x08)
46#define LPC32XX_HSUART_CTRL(x) ((x) + 0x0C)
47#define LPC32XX_HSUART_RATE(x) ((x) + 0x10)
48
49#define LPC32XX_HSU_BREAK_DATA (1 << 10)
50#define LPC32XX_HSU_ERROR_DATA (1 << 9)
51#define LPC32XX_HSU_RX_EMPTY (1 << 8)
52
53#define LPC32XX_HSU_TX_LEV(n) (((n) >> 8) & 0xFF)
54#define LPC32XX_HSU_RX_LEV(n) ((n) & 0xFF)
55
56#define LPC32XX_HSU_TX_INT_SET (1 << 6)
57#define LPC32XX_HSU_RX_OE_INT (1 << 5)
58#define LPC32XX_HSU_BRK_INT (1 << 4)
59#define LPC32XX_HSU_FE_INT (1 << 3)
60#define LPC32XX_HSU_RX_TIMEOUT_INT (1 << 2)
61#define LPC32XX_HSU_RX_TRIG_INT (1 << 1)
62#define LPC32XX_HSU_TX_INT (1 << 0)
63
64#define LPC32XX_HSU_HRTS_INV (1 << 21)
65#define LPC32XX_HSU_HRTS_TRIG_8B (0x0 << 19)
66#define LPC32XX_HSU_HRTS_TRIG_16B (0x1 << 19)
67#define LPC32XX_HSU_HRTS_TRIG_32B (0x2 << 19)
68#define LPC32XX_HSU_HRTS_TRIG_48B (0x3 << 19)
69#define LPC32XX_HSU_HRTS_EN (1 << 18)
70#define LPC32XX_HSU_TMO_DISABLED (0x0 << 16)
71#define LPC32XX_HSU_TMO_INACT_4B (0x1 << 16)
72#define LPC32XX_HSU_TMO_INACT_8B (0x2 << 16)
73#define LPC32XX_HSU_TMO_INACT_16B (0x3 << 16)
74#define LPC32XX_HSU_HCTS_INV (1 << 15)
75#define LPC32XX_HSU_HCTS_EN (1 << 14)
76#define LPC32XX_HSU_OFFSET(n) ((n) << 9)
77#define LPC32XX_HSU_BREAK (1 << 8)
78#define LPC32XX_HSU_ERR_INT_EN (1 << 7)
79#define LPC32XX_HSU_RX_INT_EN (1 << 6)
80#define LPC32XX_HSU_TX_INT_EN (1 << 5)
81#define LPC32XX_HSU_RX_TL1B (0x0 << 2)
82#define LPC32XX_HSU_RX_TL4B (0x1 << 2)
83#define LPC32XX_HSU_RX_TL8B (0x2 << 2)
84#define LPC32XX_HSU_RX_TL16B (0x3 << 2)
85#define LPC32XX_HSU_RX_TL32B (0x4 << 2)
86#define LPC32XX_HSU_RX_TL48B (0x5 << 2)
87#define LPC32XX_HSU_TX_TLEMPTY (0x0 << 0)
88#define LPC32XX_HSU_TX_TL0B (0x0 << 0)
89#define LPC32XX_HSU_TX_TL4B (0x1 << 0)
90#define LPC32XX_HSU_TX_TL8B (0x2 << 0)
91#define LPC32XX_HSU_TX_TL16B (0x3 << 0)
92
93#define MODNAME "lpc32xx_hsuart"
94
95struct lpc32xx_hsuart_port {
96 struct uart_port port;
97};
98
99#define FIFO_READ_LIMIT 128
100#define MAX_PORTS 3
101#define LPC32XX_TTY_NAME "ttyTX"
102static struct lpc32xx_hsuart_port lpc32xx_hs_ports[MAX_PORTS];
103
104#ifdef CONFIG_SERIAL_HS_LPC32XX_CONSOLE
105static void wait_for_xmit_empty(struct uart_port *port)
106{
107 unsigned int timeout = 10000;
108
109 do {
110 if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(
111 port->membase))) == 0)
112 break;
113 if (--timeout == 0)
114 break;
115 udelay(1);
116 } while (1);
117}
118
119static void wait_for_xmit_ready(struct uart_port *port)
120{
121 unsigned int timeout = 10000;
122
123 while (1) {
124 if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(
125 port->membase))) < 32)
126 break;
127 if (--timeout == 0)
128 break;
129 udelay(1);
130 }
131}
132
133static void lpc32xx_hsuart_console_putchar(struct uart_port *port, int ch)
134{
135 wait_for_xmit_ready(port);
136 writel((u32)ch, LPC32XX_HSUART_FIFO(port->membase));
137}
138
139static void lpc32xx_hsuart_console_write(struct console *co, const char *s,
140 unsigned int count)
141{
142 struct lpc32xx_hsuart_port *up = &lpc32xx_hs_ports[co->index];
143 unsigned long flags;
144 int locked = 1;
145
146 touch_nmi_watchdog();
147 local_irq_save(flags);
148 if (up->port.sysrq)
149 locked = 0;
150 else if (oops_in_progress)
151 locked = spin_trylock(&up->port.lock);
152 else
153 spin_lock(&up->port.lock);
154
155 uart_console_write(&up->port, s, count, lpc32xx_hsuart_console_putchar);
156 wait_for_xmit_empty(&up->port);
157
158 if (locked)
159 spin_unlock(&up->port.lock);
160 local_irq_restore(flags);
161}
162
163static int __init lpc32xx_hsuart_console_setup(struct console *co,
164 char *options)
165{
166 struct uart_port *port;
167 int baud = 115200;
168 int bits = 8;
169 int parity = 'n';
170 int flow = 'n';
171
172 if (co->index >= MAX_PORTS)
173 co->index = 0;
174
175 port = &lpc32xx_hs_ports[co->index].port;
176 if (!port->membase)
177 return -ENODEV;
178
179 if (options)
180 uart_parse_options(options, &baud, &parity, &bits, &flow);
181
182 return uart_set_options(port, co, baud, parity, bits, flow);
183}
184
185static struct uart_driver lpc32xx_hsuart_reg;
186static struct console lpc32xx_hsuart_console = {
187 .name = LPC32XX_TTY_NAME,
188 .write = lpc32xx_hsuart_console_write,
189 .device = uart_console_device,
190 .setup = lpc32xx_hsuart_console_setup,
191 .flags = CON_PRINTBUFFER,
192 .index = -1,
193 .data = &lpc32xx_hsuart_reg,
194};
195
196static int __init lpc32xx_hsuart_console_init(void)
197{
198 register_console(&lpc32xx_hsuart_console);
199 return 0;
200}
201console_initcall(lpc32xx_hsuart_console_init);
202
203#define LPC32XX_HSUART_CONSOLE (&lpc32xx_hsuart_console)
204#else
205#define LPC32XX_HSUART_CONSOLE NULL
206#endif
207
208static struct uart_driver lpc32xx_hs_reg = {
209 .owner = THIS_MODULE,
210 .driver_name = MODNAME,
211 .dev_name = LPC32XX_TTY_NAME,
212 .nr = MAX_PORTS,
213 .cons = LPC32XX_HSUART_CONSOLE,
214};
215static int uarts_registered;
216
217static unsigned int __serial_get_clock_div(unsigned long uartclk,
218 unsigned long rate)
219{
220 u32 div, goodrate, hsu_rate, l_hsu_rate, comprate;
221 u32 rate_diff;
222
223 /* Find the closest divider to get the desired clock rate */
224 div = uartclk / rate;
225 goodrate = hsu_rate = (div / 14) - 1;
226 if (hsu_rate != 0)
227 hsu_rate--;
228
229 /* Tweak divider */
230 l_hsu_rate = hsu_rate + 3;
231 rate_diff = 0xFFFFFFFF;
232
233 while (hsu_rate < l_hsu_rate) {
234 comprate = uartclk / ((hsu_rate + 1) * 14);
235 if (abs(comprate - rate) < rate_diff) {
236 goodrate = hsu_rate;
237 rate_diff = abs(comprate - rate);
238 }
239
240 hsu_rate++;
241 }
242 if (hsu_rate > 0xFF)
243 hsu_rate = 0xFF;
244
245 return goodrate;
246}
247
248static void __serial_uart_flush(struct uart_port *port)
249{
250 u32 tmp;
251 int cnt = 0;
252
253 while ((readl(LPC32XX_HSUART_LEVEL(port->membase)) > 0) &&
254 (cnt++ < FIFO_READ_LIMIT))
255 tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
256}
257
258static void __serial_lpc32xx_rx(struct uart_port *port)
259{
260 unsigned int tmp, flag;
261 struct tty_struct *tty = tty_port_tty_get(&port->state->port);
262
263 if (!tty) {
264 /* Discard data: no tty available */
265 while (!(readl(LPC32XX_HSUART_FIFO(port->membase)) &
266 LPC32XX_HSU_RX_EMPTY))
267 ;
268
269 return;
270 }
271
272 /* Read data from FIFO and push into terminal */
273 tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
274 while (!(tmp & LPC32XX_HSU_RX_EMPTY)) {
275 flag = TTY_NORMAL;
276 port->icount.rx++;
277
278 if (tmp & LPC32XX_HSU_ERROR_DATA) {
279 /* Framing error */
280 writel(LPC32XX_HSU_FE_INT,
281 LPC32XX_HSUART_IIR(port->membase));
282 port->icount.frame++;
283 flag = TTY_FRAME;
284 tty_insert_flip_char(tty, 0, TTY_FRAME);
285 }
286
287 tty_insert_flip_char(tty, (tmp & 0xFF), flag);
288
289 tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
290 }
291 tty_flip_buffer_push(tty);
292 tty_kref_put(tty);
293}
294
295static void __serial_lpc32xx_tx(struct uart_port *port)
296{
297 struct circ_buf *xmit = &port->state->xmit;
298 unsigned int tmp;
299
300 if (port->x_char) {
301 writel((u32)port->x_char, LPC32XX_HSUART_FIFO(port->membase));
302 port->icount.tx++;
303 port->x_char = 0;
304 return;
305 }
306
307 if (uart_circ_empty(xmit) || uart_tx_stopped(port))
308 goto exit_tx;
309
310 /* Transfer data */
311 while (LPC32XX_HSU_TX_LEV(readl(
312 LPC32XX_HSUART_LEVEL(port->membase))) < 64) {
313 writel((u32) xmit->buf[xmit->tail],
314 LPC32XX_HSUART_FIFO(port->membase));
315 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
316 port->icount.tx++;
317 if (uart_circ_empty(xmit))
318 break;
319 }
320
321 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
322 uart_write_wakeup(port);
323
324exit_tx:
325 if (uart_circ_empty(xmit)) {
326 tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
327 tmp &= ~LPC32XX_HSU_TX_INT_EN;
328 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
329 }
330}
331
332static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
333{
334 struct uart_port *port = dev_id;
335 struct tty_struct *tty = tty_port_tty_get(&port->state->port);
336 u32 status;
337
338 spin_lock(&port->lock);
339
340 /* Read UART status and clear latched interrupts */
341 status = readl(LPC32XX_HSUART_IIR(port->membase));
342
343 if (status & LPC32XX_HSU_BRK_INT) {
344 /* Break received */
345 writel(LPC32XX_HSU_BRK_INT, LPC32XX_HSUART_IIR(port->membase));
346 port->icount.brk++;
347 uart_handle_break(port);
348 }
349
350 /* Framing error */
351 if (status & LPC32XX_HSU_FE_INT)
352 writel(LPC32XX_HSU_FE_INT, LPC32XX_HSUART_IIR(port->membase));
353
354 if (status & LPC32XX_HSU_RX_OE_INT) {
355 /* Receive FIFO overrun */
356 writel(LPC32XX_HSU_RX_OE_INT,
357 LPC32XX_HSUART_IIR(port->membase));
358 port->icount.overrun++;
359 if (tty) {
360 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
361 tty_schedule_flip(tty);
362 }
363 }
364
365 /* Data received? */
366 if (status & (LPC32XX_HSU_RX_TIMEOUT_INT | LPC32XX_HSU_RX_TRIG_INT)) {
367 __serial_lpc32xx_rx(port);
368 if (tty)
369 tty_flip_buffer_push(tty);
370 }
371
372 /* Transmit data request? */
373 if ((status & LPC32XX_HSU_TX_INT) && (!uart_tx_stopped(port))) {
374 writel(LPC32XX_HSU_TX_INT, LPC32XX_HSUART_IIR(port->membase));
375 __serial_lpc32xx_tx(port);
376 }
377
378 spin_unlock(&port->lock);
379 tty_kref_put(tty);
380
381 return IRQ_HANDLED;
382}
383
384/* port->lock is not held. */
385static unsigned int serial_lpc32xx_tx_empty(struct uart_port *port)
386{
387 unsigned int ret = 0;
388
389 if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(port->membase))) == 0)
390 ret = TIOCSER_TEMT;
391
392 return ret;
393}
394
395/* port->lock held by caller. */
396static void serial_lpc32xx_set_mctrl(struct uart_port *port,
397 unsigned int mctrl)
398{
399 /* No signals are supported on HS UARTs */
400}
401
402/* port->lock is held by caller and interrupts are disabled. */
403static unsigned int serial_lpc32xx_get_mctrl(struct uart_port *port)
404{
405 /* No signals are supported on HS UARTs */
406 return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
407}
408
409/* port->lock held by caller. */
410static void serial_lpc32xx_stop_tx(struct uart_port *port)
411{
412 u32 tmp;
413
414 tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
415 tmp &= ~LPC32XX_HSU_TX_INT_EN;
416 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
417}
418
419/* port->lock held by caller. */
420static void serial_lpc32xx_start_tx(struct uart_port *port)
421{
422 u32 tmp;
423
424 __serial_lpc32xx_tx(port);
425 tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
426 tmp |= LPC32XX_HSU_TX_INT_EN;
427 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
428}
429
430/* port->lock held by caller. */
431static void serial_lpc32xx_stop_rx(struct uart_port *port)
432{
433 u32 tmp;
434
435 tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
436 tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN);
437 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
438
439 writel((LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT |
440 LPC32XX_HSU_FE_INT), LPC32XX_HSUART_IIR(port->membase));
441}
442
443/* port->lock held by caller. */
444static void serial_lpc32xx_enable_ms(struct uart_port *port)
445{
446 /* Modem status is not supported */
447}
448
449/* port->lock is not held. */
450static void serial_lpc32xx_break_ctl(struct uart_port *port,
451 int break_state)
452{
453 unsigned long flags;
454 u32 tmp;
455
456 spin_lock_irqsave(&port->lock, flags);
457 tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
458 if (break_state != 0)
459 tmp |= LPC32XX_HSU_BREAK;
460 else
461 tmp &= ~LPC32XX_HSU_BREAK;
462 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
463 spin_unlock_irqrestore(&port->lock, flags);
464}
465
466/* LPC3250 Errata HSUART.1: Hang workaround via loopback mode on inactivity */
467static void lpc32xx_loopback_set(resource_size_t mapbase, int state)
468{
469 int bit;
470 u32 tmp;
471
472 switch (mapbase) {
473 case LPC32XX_HS_UART1_BASE:
474 bit = 0;
475 break;
476 case LPC32XX_HS_UART2_BASE:
477 bit = 1;
478 break;
479 case LPC32XX_HS_UART7_BASE:
480 bit = 6;
481 break;
482 default:
483 WARN(1, "lpc32xx_hs: Warning: Unknown port at %08x\n", mapbase);
484 return;
485 }
486
487 tmp = readl(LPC32XX_UARTCTL_CLOOP);
488 if (state)
489 tmp |= (1 << bit);
490 else
491 tmp &= ~(1 << bit);
492 writel(tmp, LPC32XX_UARTCTL_CLOOP);
493}
494
495/* port->lock is not held. */
496static int serial_lpc32xx_startup(struct uart_port *port)
497{
498 int retval;
499 unsigned long flags;
500 u32 tmp;
501
502 spin_lock_irqsave(&port->lock, flags);
503
504 __serial_uart_flush(port);
505
506 writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT |
507 LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT),
508 LPC32XX_HSUART_IIR(port->membase));
509
510 writel(0xFF, LPC32XX_HSUART_RATE(port->membase));
511
512 /*
513 * Set receiver timeout, HSU offset of 20, no break, no interrupts,
514 * and default FIFO trigger levels
515 */
516 tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
517 LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B;
518 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
519
520 lpc32xx_loopback_set(port->mapbase, 0); /* get out of loopback mode */
521
522 spin_unlock_irqrestore(&port->lock, flags);
523
524 retval = request_irq(port->irq, serial_lpc32xx_interrupt,
525 0, MODNAME, port);
526 if (!retval)
527 writel((tmp | LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN),
528 LPC32XX_HSUART_CTRL(port->membase));
529
530 return retval;
531}
532
533/* port->lock is not held. */
534static void serial_lpc32xx_shutdown(struct uart_port *port)
535{
536 u32 tmp;
537 unsigned long flags;
538
539 spin_lock_irqsave(&port->lock, flags);
540
541 tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
542 LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B;
543 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
544
545 lpc32xx_loopback_set(port->mapbase, 1); /* go to loopback mode */
546
547 spin_unlock_irqrestore(&port->lock, flags);
548
549 free_irq(port->irq, port);
550}
551
552/* port->lock is not held. */
553static void serial_lpc32xx_set_termios(struct uart_port *port,
554 struct ktermios *termios,
555 struct ktermios *old)
556{
557 unsigned long flags;
558 unsigned int baud, quot;
559 u32 tmp;
560
561 /* Always 8-bit, no parity, 1 stop bit */
562 termios->c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD);
563 termios->c_cflag |= CS8;
564
565 termios->c_cflag &= ~(HUPCL | CMSPAR | CLOCAL | CRTSCTS);
566
567 baud = uart_get_baud_rate(port, termios, old, 0,
568 port->uartclk / 14);
569
570 quot = __serial_get_clock_div(port->uartclk, baud);
571
572 spin_lock_irqsave(&port->lock, flags);
573
574 /* Ignore characters? */
575 tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
576 if ((termios->c_cflag & CREAD) == 0)
577 tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN);
578 else
579 tmp |= LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN;
580 writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
581
582 writel(quot, LPC32XX_HSUART_RATE(port->membase));
583
584 uart_update_timeout(port, termios->c_cflag, baud);
585
586 spin_unlock_irqrestore(&port->lock, flags);
587
588 /* Don't rewrite B0 */
589 if (tty_termios_baud_rate(termios))
590 tty_termios_encode_baud_rate(termios, baud, baud);
591}
592
593static const char *serial_lpc32xx_type(struct uart_port *port)
594{
595 return MODNAME;
596}
597
598static void serial_lpc32xx_release_port(struct uart_port *port)
599{
600 if ((port->iotype == UPIO_MEM32) && (port->mapbase)) {
601 if (port->flags & UPF_IOREMAP) {
602 iounmap(port->membase);
603 port->membase = NULL;
604 }
605
606 release_mem_region(port->mapbase, SZ_4K);
607 }
608}
609
610static int serial_lpc32xx_request_port(struct uart_port *port)
611{
612 int ret = -ENODEV;
613
614 if ((port->iotype == UPIO_MEM32) && (port->mapbase)) {
615 ret = 0;
616
617 if (!request_mem_region(port->mapbase, SZ_4K, MODNAME))
618 ret = -EBUSY;
619 else if (port->flags & UPF_IOREMAP) {
620 port->membase = ioremap(port->mapbase, SZ_4K);
621 if (!port->membase) {
622 release_mem_region(port->mapbase, SZ_4K);
623 ret = -ENOMEM;
624 }
625 }
626 }
627
628 return ret;
629}
630
631static void serial_lpc32xx_config_port(struct uart_port *port, int uflags)
632{
633 int ret;
634
635 ret = serial_lpc32xx_request_port(port);
636 if (ret < 0)
637 return;
638 port->type = PORT_UART00;
639 port->fifosize = 64;
640
641 __serial_uart_flush(port);
642
643 writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT |
644 LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT),
645 LPC32XX_HSUART_IIR(port->membase));
646
647 writel(0xFF, LPC32XX_HSUART_RATE(port->membase));
648
649 /* Set receiver timeout, HSU offset of 20, no break, no interrupts,
650 and default FIFO trigger levels */
651 writel(LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
652 LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B,
653 LPC32XX_HSUART_CTRL(port->membase));
654}
655
656static int serial_lpc32xx_verify_port(struct uart_port *port,
657 struct serial_struct *ser)
658{
659 int ret = 0;
660
661 if (ser->type != PORT_UART00)
662 ret = -EINVAL;
663
664 return ret;
665}
666
667static struct uart_ops serial_lpc32xx_pops = {
668 .tx_empty = serial_lpc32xx_tx_empty,
669 .set_mctrl = serial_lpc32xx_set_mctrl,
670 .get_mctrl = serial_lpc32xx_get_mctrl,
671 .stop_tx = serial_lpc32xx_stop_tx,
672 .start_tx = serial_lpc32xx_start_tx,
673 .stop_rx = serial_lpc32xx_stop_rx,
674 .enable_ms = serial_lpc32xx_enable_ms,
675 .break_ctl = serial_lpc32xx_break_ctl,
676 .startup = serial_lpc32xx_startup,
677 .shutdown = serial_lpc32xx_shutdown,
678 .set_termios = serial_lpc32xx_set_termios,
679 .type = serial_lpc32xx_type,
680 .release_port = serial_lpc32xx_release_port,
681 .request_port = serial_lpc32xx_request_port,
682 .config_port = serial_lpc32xx_config_port,
683 .verify_port = serial_lpc32xx_verify_port,
684};
685
686/*
687 * Register a set of serial devices attached to a platform device
688 */
689static int __devinit serial_hs_lpc32xx_probe(struct platform_device *pdev)
690{
691 struct lpc32xx_hsuart_port *p = &lpc32xx_hs_ports[uarts_registered];
692 int ret = 0;
693 struct resource *res;
694
695 if (uarts_registered >= MAX_PORTS) {
696 dev_err(&pdev->dev,
697 "Error: Number of possible ports exceeded (%d)!\n",
698 uarts_registered + 1);
699 return -ENXIO;
700 }
701
702 memset(p, 0, sizeof(*p));
703
704 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
705 if (!res) {
706 dev_err(&pdev->dev,
707 "Error getting mem resource for HS UART port %d\n",
708 uarts_registered);
709 return -ENXIO;
710 }
711 p->port.mapbase = res->start;
712 p->port.membase = NULL;
713
714 p->port.irq = platform_get_irq(pdev, 0);
715 if (p->port.irq < 0) {
716 dev_err(&pdev->dev, "Error getting irq for HS UART port %d\n",
717 uarts_registered);
718 return p->port.irq;
719 }
720
721 p->port.iotype = UPIO_MEM32;
722 p->port.uartclk = LPC32XX_MAIN_OSC_FREQ;
723 p->port.regshift = 2;
724 p->port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP;
725 p->port.dev = &pdev->dev;
726 p->port.ops = &serial_lpc32xx_pops;
727 p->port.line = uarts_registered++;
728 spin_lock_init(&p->port.lock);
729
730 /* send port to loopback mode by default */
731 lpc32xx_loopback_set(p->port.mapbase, 1);
732
733 ret = uart_add_one_port(&lpc32xx_hs_reg, &p->port);
734
735 platform_set_drvdata(pdev, p);
736
737 return ret;
738}
739
740/*
741 * Remove serial ports registered against a platform device.
742 */
743static int __devexit serial_hs_lpc32xx_remove(struct platform_device *pdev)
744{
745 struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev);
746
747 uart_remove_one_port(&lpc32xx_hs_reg, &p->port);
748
749 return 0;
750}
751
752
753#ifdef CONFIG_PM
754static int serial_hs_lpc32xx_suspend(struct platform_device *pdev,
755 pm_message_t state)
756{
757 struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev);
758
759 uart_suspend_port(&lpc32xx_hs_reg, &p->port);
760
761 return 0;
762}
763
764static int serial_hs_lpc32xx_resume(struct platform_device *pdev)
765{
766 struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev);
767
768 uart_resume_port(&lpc32xx_hs_reg, &p->port);
769
770 return 0;
771}
772#else
773#define serial_hs_lpc32xx_suspend NULL
774#define serial_hs_lpc32xx_resume NULL
775#endif
776
777static const struct of_device_id serial_hs_lpc32xx_dt_ids[] = {
778 { .compatible = "nxp,lpc3220-hsuart" },
779 { /* sentinel */ }
780};
781
782MODULE_DEVICE_TABLE(of, serial_hs_lpc32xx_dt_ids);
783
784static struct platform_driver serial_hs_lpc32xx_driver = {
785 .probe = serial_hs_lpc32xx_probe,
786 .remove = __devexit_p(serial_hs_lpc32xx_remove),
787 .suspend = serial_hs_lpc32xx_suspend,
788 .resume = serial_hs_lpc32xx_resume,
789 .driver = {
790 .name = MODNAME,
791 .owner = THIS_MODULE,
792 .of_match_table = serial_hs_lpc32xx_dt_ids,
793 },
794};
795
796static int __init lpc32xx_hsuart_init(void)
797{
798 int ret;
799
800 ret = uart_register_driver(&lpc32xx_hs_reg);
801 if (ret)
802 return ret;
803
804 ret = platform_driver_register(&serial_hs_lpc32xx_driver);
805 if (ret)
806 uart_unregister_driver(&lpc32xx_hs_reg);
807
808 return ret;
809}
810
811static void __exit lpc32xx_hsuart_exit(void)
812{
813 platform_driver_unregister(&serial_hs_lpc32xx_driver);
814 uart_unregister_driver(&lpc32xx_hs_reg);
815}
816
817module_init(lpc32xx_hsuart_init);
818module_exit(lpc32xx_hsuart_exit);
819
820MODULE_AUTHOR("Kevin Wells <kevin.wells@nxp.com>");
821MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");
822MODULE_DESCRIPTION("NXP LPC32XX High Speed UART driver");
823MODULE_LICENSE("GPL");
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c
index 34e71874a892..df443b908ca3 100644
--- a/drivers/tty/serial/of_serial.c
+++ b/drivers/tty/serial/of_serial.c
@@ -105,6 +105,10 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev,
105 port->uartclk = clk; 105 port->uartclk = clk;
106 port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP 106 port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
107 | UPF_FIXED_PORT | UPF_FIXED_TYPE; 107 | UPF_FIXED_PORT | UPF_FIXED_TYPE;
108
109 if (of_find_property(np, "no-loopback-test", NULL))
110 port->flags |= UPF_SKIP_TEST;
111
108 port->dev = &ofdev->dev; 112 port->dev = &ofdev->dev;
109 113
110 if (type == PORT_TEGRA) 114 if (type == PORT_TEGRA)
@@ -144,8 +148,15 @@ static int __devinit of_platform_serial_probe(struct platform_device *ofdev)
144 switch (port_type) { 148 switch (port_type) {
145#ifdef CONFIG_SERIAL_8250 149#ifdef CONFIG_SERIAL_8250
146 case PORT_8250 ... PORT_MAX_8250: 150 case PORT_8250 ... PORT_MAX_8250:
147 ret = serial8250_register_port(&port); 151 {
152 /* For now the of bindings don't support the extra
153 8250 specific bits */
154 struct uart_8250_port port8250;
155 memset(&port8250, 0, sizeof(port8250));
156 port8250.port = port;
157 ret = serial8250_register_8250_port(&port8250);
148 break; 158 break;
159 }
149#endif 160#endif
150#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL 161#ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL
151 case PORT_NWPSERIAL: 162 case PORT_NWPSERIAL:
diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c
index 5847a4b855f7..9033fc6e0e4e 100644
--- a/drivers/tty/serial/pxa.c
+++ b/drivers/tty/serial/pxa.c
@@ -670,9 +670,19 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
670{ 670{
671 struct uart_pxa_port *up = serial_pxa_ports[co->index]; 671 struct uart_pxa_port *up = serial_pxa_ports[co->index];
672 unsigned int ier; 672 unsigned int ier;
673 unsigned long flags;
674 int locked = 1;
673 675
674 clk_prepare_enable(up->clk); 676 clk_prepare_enable(up->clk);
675 677
678 local_irq_save(flags);
679 if (up->port.sysrq)
680 locked = 0;
681 else if (oops_in_progress)
682 locked = spin_trylock(&up->port.lock);
683 else
684 spin_lock(&up->port.lock);
685
676 /* 686 /*
677 * First save the IER then disable the interrupts 687 * First save the IER then disable the interrupts
678 */ 688 */
@@ -688,6 +698,10 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
688 wait_for_xmitr(up); 698 wait_for_xmitr(up);
689 serial_out(up, UART_IER, ier); 699 serial_out(up, UART_IER, ier);
690 700
701 if (locked)
702 spin_unlock(&up->port.lock);
703 local_irq_restore(flags);
704
691 clk_disable_unprepare(up->clk); 705 clk_disable_unprepare(up->clk);
692} 706}
693 707
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index 02d07bfcfa8a..5c5e7e09f23e 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
@@ -529,7 +529,7 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level,
529 529
530 switch (level) { 530 switch (level) {
531 case 3: 531 case 3:
532 if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL) 532 if (!IS_ERR(ourport->baudclk))
533 clk_disable(ourport->baudclk); 533 clk_disable(ourport->baudclk);
534 534
535 clk_disable(ourport->clk); 535 clk_disable(ourport->clk);
@@ -538,7 +538,7 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level,
538 case 0: 538 case 0:
539 clk_enable(ourport->clk); 539 clk_enable(ourport->clk);
540 540
541 if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL) 541 if (!IS_ERR(ourport->baudclk))
542 clk_enable(ourport->baudclk); 542 clk_enable(ourport->baudclk);
543 543
544 break; 544 break;
@@ -604,7 +604,6 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
604 char clkname[MAX_CLK_NAME_LENGTH]; 604 char clkname[MAX_CLK_NAME_LENGTH];
605 int calc_deviation, deviation = (1 << 30) - 1; 605 int calc_deviation, deviation = (1 << 30) - 1;
606 606
607 *best_clk = NULL;
608 clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel : 607 clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel :
609 ourport->info->def_clk_sel; 608 ourport->info->def_clk_sel;
610 for (cnt = 0; cnt < info->num_clks; cnt++) { 609 for (cnt = 0; cnt < info->num_clks; cnt++) {
@@ -613,7 +612,7 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
613 612
614 sprintf(clkname, "clk_uart_baud%d", cnt); 613 sprintf(clkname, "clk_uart_baud%d", cnt);
615 clk = clk_get(ourport->port.dev, clkname); 614 clk = clk_get(ourport->port.dev, clkname);
616 if (IS_ERR_OR_NULL(clk)) 615 if (IS_ERR(clk))
617 continue; 616 continue;
618 617
619 rate = clk_get_rate(clk); 618 rate = clk_get_rate(clk);
@@ -684,7 +683,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
684{ 683{
685 struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port); 684 struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port);
686 struct s3c24xx_uart_port *ourport = to_ourport(port); 685 struct s3c24xx_uart_port *ourport = to_ourport(port);
687 struct clk *clk = NULL; 686 struct clk *clk = ERR_PTR(-EINVAL);
688 unsigned long flags; 687 unsigned long flags;
689 unsigned int baud, quot, clk_sel = 0; 688 unsigned int baud, quot, clk_sel = 0;
690 unsigned int ulcon; 689 unsigned int ulcon;
@@ -705,7 +704,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
705 quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel); 704 quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel);
706 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST) 705 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
707 quot = port->custom_divisor; 706 quot = port->custom_divisor;
708 if (!clk) 707 if (IS_ERR(clk))
709 return; 708 return;
710 709
711 /* check to see if we need to change clock source */ 710 /* check to see if we need to change clock source */
@@ -713,9 +712,9 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
713 if (ourport->baudclk != clk) { 712 if (ourport->baudclk != clk) {
714 s3c24xx_serial_setsource(port, clk_sel); 713 s3c24xx_serial_setsource(port, clk_sel);
715 714
716 if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) { 715 if (!IS_ERR(ourport->baudclk)) {
717 clk_disable(ourport->baudclk); 716 clk_disable(ourport->baudclk);
718 ourport->baudclk = NULL; 717 ourport->baudclk = ERR_PTR(-EINVAL);
719 } 718 }
720 719
721 clk_enable(clk); 720 clk_enable(clk);
@@ -1036,7 +1035,7 @@ static int s3c24xx_serial_cpufreq_transition(struct notifier_block *nb,
1036 if (tty == NULL) 1035 if (tty == NULL)
1037 goto exit; 1036 goto exit;
1038 1037
1039 termios = tty->termios; 1038 termios = &tty->termios;
1040 1039
1041 if (termios == NULL) { 1040 if (termios == NULL) {
1042 printk(KERN_WARNING "%s: no termios?\n", __func__); 1041 printk(KERN_WARNING "%s: no termios?\n", __func__);
@@ -1160,7 +1159,11 @@ static ssize_t s3c24xx_serial_show_clksrc(struct device *dev,
1160 struct uart_port *port = s3c24xx_dev_to_port(dev); 1159 struct uart_port *port = s3c24xx_dev_to_port(dev);
1161 struct s3c24xx_uart_port *ourport = to_ourport(port); 1160 struct s3c24xx_uart_port *ourport = to_ourport(port);
1162 1161
1163 return snprintf(buf, PAGE_SIZE, "* %s\n", ourport->baudclk->name); 1162 if (IS_ERR(ourport->baudclk))
1163 return -EINVAL;
1164
1165 return snprintf(buf, PAGE_SIZE, "* %s\n",
1166 ourport->baudclk->name ?: "(null)");
1164} 1167}
1165 1168
1166static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL); 1169static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL);
@@ -1200,6 +1203,7 @@ static int s3c24xx_serial_probe(struct platform_device *pdev)
1200 return -ENODEV; 1203 return -ENODEV;
1201 } 1204 }
1202 1205
1206 ourport->baudclk = ERR_PTR(-EINVAL);
1203 ourport->info = ourport->drv_data->info; 1207 ourport->info = ourport->drv_data->info;
1204 ourport->cfg = (pdev->dev.platform_data) ? 1208 ourport->cfg = (pdev->dev.platform_data) ?
1205 (struct s3c2410_uartcfg *)pdev->dev.platform_data : 1209 (struct s3c2410_uartcfg *)pdev->dev.platform_data :
@@ -1387,7 +1391,7 @@ s3c24xx_serial_get_options(struct uart_port *port, int *baud,
1387 sprintf(clk_name, "clk_uart_baud%d", clk_sel); 1391 sprintf(clk_name, "clk_uart_baud%d", clk_sel);
1388 1392
1389 clk = clk_get(port->dev, clk_name); 1393 clk = clk_get(port->dev, clk_name);
1390 if (!IS_ERR(clk) && clk != NULL) 1394 if (!IS_ERR(clk))
1391 rate = clk_get_rate(clk); 1395 rate = clk_get_rate(clk);
1392 else 1396 else
1393 rate = 1; 1397 rate = 1;
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index a21dc8e3b7c0..d98b1bd407f6 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -159,7 +159,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
159 retval = uport->ops->startup(uport); 159 retval = uport->ops->startup(uport);
160 if (retval == 0) { 160 if (retval == 0) {
161 if (uart_console(uport) && uport->cons->cflag) { 161 if (uart_console(uport) && uport->cons->cflag) {
162 tty->termios->c_cflag = uport->cons->cflag; 162 tty->termios.c_cflag = uport->cons->cflag;
163 uport->cons->cflag = 0; 163 uport->cons->cflag = 0;
164 } 164 }
165 /* 165 /*
@@ -172,7 +172,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
172 * Setup the RTS and DTR signals once the 172 * Setup the RTS and DTR signals once the
173 * port is open and ready to respond. 173 * port is open and ready to respond.
174 */ 174 */
175 if (tty->termios->c_cflag & CBAUD) 175 if (tty->termios.c_cflag & CBAUD)
176 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR); 176 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
177 } 177 }
178 178
@@ -240,7 +240,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
240 /* 240 /*
241 * Turn off DTR and RTS early. 241 * Turn off DTR and RTS early.
242 */ 242 */
243 if (!tty || (tty->termios->c_cflag & HUPCL)) 243 if (!tty || (tty->termios.c_cflag & HUPCL))
244 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); 244 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
245 245
246 uart_port_shutdown(port); 246 uart_port_shutdown(port);
@@ -440,10 +440,10 @@ static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
440 * If we have no tty, termios, or the port does not exist, 440 * If we have no tty, termios, or the port does not exist,
441 * then we can't set the parameters for this port. 441 * then we can't set the parameters for this port.
442 */ 442 */
443 if (!tty || !tty->termios || uport->type == PORT_UNKNOWN) 443 if (!tty || uport->type == PORT_UNKNOWN)
444 return; 444 return;
445 445
446 termios = tty->termios; 446 termios = &tty->termios;
447 447
448 /* 448 /*
449 * Set flags based on termios cflag 449 * Set flags based on termios cflag
@@ -614,7 +614,7 @@ static void uart_throttle(struct tty_struct *tty)
614 if (I_IXOFF(tty)) 614 if (I_IXOFF(tty))
615 uart_send_xchar(tty, STOP_CHAR(tty)); 615 uart_send_xchar(tty, STOP_CHAR(tty));
616 616
617 if (tty->termios->c_cflag & CRTSCTS) 617 if (tty->termios.c_cflag & CRTSCTS)
618 uart_clear_mctrl(state->uart_port, TIOCM_RTS); 618 uart_clear_mctrl(state->uart_port, TIOCM_RTS);
619} 619}
620 620
@@ -630,7 +630,7 @@ static void uart_unthrottle(struct tty_struct *tty)
630 uart_send_xchar(tty, START_CHAR(tty)); 630 uart_send_xchar(tty, START_CHAR(tty));
631 } 631 }
632 632
633 if (tty->termios->c_cflag & CRTSCTS) 633 if (tty->termios.c_cflag & CRTSCTS)
634 uart_set_mctrl(port, TIOCM_RTS); 634 uart_set_mctrl(port, TIOCM_RTS);
635} 635}
636 636
@@ -1187,7 +1187,7 @@ static void uart_set_ldisc(struct tty_struct *tty)
1187 struct uart_port *uport = state->uart_port; 1187 struct uart_port *uport = state->uart_port;
1188 1188
1189 if (uport->ops->set_ldisc) 1189 if (uport->ops->set_ldisc)
1190 uport->ops->set_ldisc(uport, tty->termios->c_line); 1190 uport->ops->set_ldisc(uport, tty->termios.c_line);
1191} 1191}
1192 1192
1193static void uart_set_termios(struct tty_struct *tty, 1193static void uart_set_termios(struct tty_struct *tty,
@@ -1195,7 +1195,7 @@ static void uart_set_termios(struct tty_struct *tty,
1195{ 1195{
1196 struct uart_state *state = tty->driver_data; 1196 struct uart_state *state = tty->driver_data;
1197 unsigned long flags; 1197 unsigned long flags;
1198 unsigned int cflag = tty->termios->c_cflag; 1198 unsigned int cflag = tty->termios.c_cflag;
1199 1199
1200 1200
1201 /* 1201 /*
@@ -1206,9 +1206,9 @@ static void uart_set_termios(struct tty_struct *tty,
1206 */ 1206 */
1207#define RELEVANT_IFLAG(iflag) ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) 1207#define RELEVANT_IFLAG(iflag) ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
1208 if ((cflag ^ old_termios->c_cflag) == 0 && 1208 if ((cflag ^ old_termios->c_cflag) == 0 &&
1209 tty->termios->c_ospeed == old_termios->c_ospeed && 1209 tty->termios.c_ospeed == old_termios->c_ospeed &&
1210 tty->termios->c_ispeed == old_termios->c_ispeed && 1210 tty->termios.c_ispeed == old_termios->c_ispeed &&
1211 RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) { 1211 RELEVANT_IFLAG(tty->termios.c_iflag ^ old_termios->c_iflag) == 0) {
1212 return; 1212 return;
1213 } 1213 }
1214 1214
@@ -1960,8 +1960,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
1960 /* 1960 /*
1961 * If that's unset, use the tty termios setting. 1961 * If that's unset, use the tty termios setting.
1962 */ 1962 */
1963 if (port->tty && port->tty->termios && termios.c_cflag == 0) 1963 if (port->tty && termios.c_cflag == 0)
1964 termios = *(port->tty->termios); 1964 termios = port->tty->termios;
1965 1965
1966 if (console_suspend_enabled) 1966 if (console_suspend_enabled)
1967 uart_change_pm(state, 0); 1967 uart_change_pm(state, 0);
diff --git a/drivers/tty/synclink.c b/drivers/tty/synclink.c
index 593d40ad0a6b..bdeeb3133f62 100644
--- a/drivers/tty/synclink.c
+++ b/drivers/tty/synclink.c
@@ -1840,22 +1840,22 @@ static void shutdown(struct mgsl_struct * info)
1840 usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS + 1840 usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS +
1841 TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC ); 1841 TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC );
1842 usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE); 1842 usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE);
1843 1843
1844 /* Disable DMAEN (Port 7, Bit 14) */ 1844 /* Disable DMAEN (Port 7, Bit 14) */
1845 /* This disconnects the DMA request signal from the ISA bus */ 1845 /* This disconnects the DMA request signal from the ISA bus */
1846 /* on the ISA adapter. This has no effect for the PCI adapter */ 1846 /* on the ISA adapter. This has no effect for the PCI adapter */
1847 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14)); 1847 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14));
1848 1848
1849 /* Disable INTEN (Port 6, Bit12) */ 1849 /* Disable INTEN (Port 6, Bit12) */
1850 /* This disconnects the IRQ request signal to the ISA bus */ 1850 /* This disconnects the IRQ request signal to the ISA bus */
1851 /* on the ISA adapter. This has no effect for the PCI adapter */ 1851 /* on the ISA adapter. This has no effect for the PCI adapter */
1852 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12)); 1852 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12));
1853 1853
1854 if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { 1854 if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
1855 info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); 1855 info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
1856 usc_set_serial_signals(info); 1856 usc_set_serial_signals(info);
1857 } 1857 }
1858 1858
1859 spin_unlock_irqrestore(&info->irq_spinlock,flags); 1859 spin_unlock_irqrestore(&info->irq_spinlock,flags);
1860 1860
1861 mgsl_release_resources(info); 1861 mgsl_release_resources(info);
@@ -1895,7 +1895,7 @@ static void mgsl_program_hw(struct mgsl_struct *info)
1895 usc_EnableInterrupts(info, IO_PIN); 1895 usc_EnableInterrupts(info, IO_PIN);
1896 usc_get_serial_signals(info); 1896 usc_get_serial_signals(info);
1897 1897
1898 if (info->netcount || info->port.tty->termios->c_cflag & CREAD) 1898 if (info->netcount || info->port.tty->termios.c_cflag & CREAD)
1899 usc_start_receiver(info); 1899 usc_start_receiver(info);
1900 1900
1901 spin_unlock_irqrestore(&info->irq_spinlock,flags); 1901 spin_unlock_irqrestore(&info->irq_spinlock,flags);
@@ -1908,14 +1908,14 @@ static void mgsl_change_params(struct mgsl_struct *info)
1908 unsigned cflag; 1908 unsigned cflag;
1909 int bits_per_char; 1909 int bits_per_char;
1910 1910
1911 if (!info->port.tty || !info->port.tty->termios) 1911 if (!info->port.tty)
1912 return; 1912 return;
1913 1913
1914 if (debug_level >= DEBUG_LEVEL_INFO) 1914 if (debug_level >= DEBUG_LEVEL_INFO)
1915 printk("%s(%d):mgsl_change_params(%s)\n", 1915 printk("%s(%d):mgsl_change_params(%s)\n",
1916 __FILE__,__LINE__, info->device_name ); 1916 __FILE__,__LINE__, info->device_name );
1917 1917
1918 cflag = info->port.tty->termios->c_cflag; 1918 cflag = info->port.tty->termios.c_cflag;
1919 1919
1920 /* if B0 rate (hangup) specified then negate DTR and RTS */ 1920 /* if B0 rate (hangup) specified then negate DTR and RTS */
1921 /* otherwise assert DTR and RTS */ 1921 /* otherwise assert DTR and RTS */
@@ -2367,8 +2367,8 @@ static void mgsl_throttle(struct tty_struct * tty)
2367 2367
2368 if (I_IXOFF(tty)) 2368 if (I_IXOFF(tty))
2369 mgsl_send_xchar(tty, STOP_CHAR(tty)); 2369 mgsl_send_xchar(tty, STOP_CHAR(tty));
2370 2370
2371 if (tty->termios->c_cflag & CRTSCTS) { 2371 if (tty->termios.c_cflag & CRTSCTS) {
2372 spin_lock_irqsave(&info->irq_spinlock,flags); 2372 spin_lock_irqsave(&info->irq_spinlock,flags);
2373 info->serial_signals &= ~SerialSignal_RTS; 2373 info->serial_signals &= ~SerialSignal_RTS;
2374 usc_set_serial_signals(info); 2374 usc_set_serial_signals(info);
@@ -2401,8 +2401,8 @@ static void mgsl_unthrottle(struct tty_struct * tty)
2401 else 2401 else
2402 mgsl_send_xchar(tty, START_CHAR(tty)); 2402 mgsl_send_xchar(tty, START_CHAR(tty));
2403 } 2403 }
2404 2404
2405 if (tty->termios->c_cflag & CRTSCTS) { 2405 if (tty->termios.c_cflag & CRTSCTS) {
2406 spin_lock_irqsave(&info->irq_spinlock,flags); 2406 spin_lock_irqsave(&info->irq_spinlock,flags);
2407 info->serial_signals |= SerialSignal_RTS; 2407 info->serial_signals |= SerialSignal_RTS;
2408 usc_set_serial_signals(info); 2408 usc_set_serial_signals(info);
@@ -3045,7 +3045,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
3045 3045
3046 /* Handle transition to B0 status */ 3046 /* Handle transition to B0 status */
3047 if (old_termios->c_cflag & CBAUD && 3047 if (old_termios->c_cflag & CBAUD &&
3048 !(tty->termios->c_cflag & CBAUD)) { 3048 !(tty->termios.c_cflag & CBAUD)) {
3049 info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); 3049 info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
3050 spin_lock_irqsave(&info->irq_spinlock,flags); 3050 spin_lock_irqsave(&info->irq_spinlock,flags);
3051 usc_set_serial_signals(info); 3051 usc_set_serial_signals(info);
@@ -3054,9 +3054,9 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
3054 3054
3055 /* Handle transition away from B0 status */ 3055 /* Handle transition away from B0 status */
3056 if (!(old_termios->c_cflag & CBAUD) && 3056 if (!(old_termios->c_cflag & CBAUD) &&
3057 tty->termios->c_cflag & CBAUD) { 3057 tty->termios.c_cflag & CBAUD) {
3058 info->serial_signals |= SerialSignal_DTR; 3058 info->serial_signals |= SerialSignal_DTR;
3059 if (!(tty->termios->c_cflag & CRTSCTS) || 3059 if (!(tty->termios.c_cflag & CRTSCTS) ||
3060 !test_bit(TTY_THROTTLED, &tty->flags)) { 3060 !test_bit(TTY_THROTTLED, &tty->flags)) {
3061 info->serial_signals |= SerialSignal_RTS; 3061 info->serial_signals |= SerialSignal_RTS;
3062 } 3062 }
@@ -3067,7 +3067,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
3067 3067
3068 /* Handle turning off CRTSCTS */ 3068 /* Handle turning off CRTSCTS */
3069 if (old_termios->c_cflag & CRTSCTS && 3069 if (old_termios->c_cflag & CRTSCTS &&
3070 !(tty->termios->c_cflag & CRTSCTS)) { 3070 !(tty->termios.c_cflag & CRTSCTS)) {
3071 tty->hw_stopped = 0; 3071 tty->hw_stopped = 0;
3072 mgsl_start(tty); 3072 mgsl_start(tty);
3073 } 3073 }
@@ -3287,7 +3287,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
3287 return 0; 3287 return 0;
3288 } 3288 }
3289 3289
3290 if (tty->termios->c_cflag & CLOCAL) 3290 if (tty->termios.c_cflag & CLOCAL)
3291 do_clocal = true; 3291 do_clocal = true;
3292 3292
3293 /* Wait for carrier detect and the line to become 3293 /* Wait for carrier detect and the line to become
@@ -3313,7 +3313,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
3313 port->blocked_open++; 3313 port->blocked_open++;
3314 3314
3315 while (1) { 3315 while (1) {
3316 if (tty->termios->c_cflag & CBAUD) 3316 if (tty->termios.c_cflag & CBAUD)
3317 tty_port_raise_dtr_rts(port); 3317 tty_port_raise_dtr_rts(port);
3318 3318
3319 set_current_state(TASK_INTERRUPTIBLE); 3319 set_current_state(TASK_INTERRUPTIBLE);
diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c
index aa1debf97cc7..f02d18a391e5 100644
--- a/drivers/tty/synclink_gt.c
+++ b/drivers/tty/synclink_gt.c
@@ -785,7 +785,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
785 785
786 /* Handle transition to B0 status */ 786 /* Handle transition to B0 status */
787 if (old_termios->c_cflag & CBAUD && 787 if (old_termios->c_cflag & CBAUD &&
788 !(tty->termios->c_cflag & CBAUD)) { 788 !(tty->termios.c_cflag & CBAUD)) {
789 info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR); 789 info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
790 spin_lock_irqsave(&info->lock,flags); 790 spin_lock_irqsave(&info->lock,flags);
791 set_signals(info); 791 set_signals(info);
@@ -794,9 +794,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
794 794
795 /* Handle transition away from B0 status */ 795 /* Handle transition away from B0 status */
796 if (!(old_termios->c_cflag & CBAUD) && 796 if (!(old_termios->c_cflag & CBAUD) &&
797 tty->termios->c_cflag & CBAUD) { 797 tty->termios.c_cflag & CBAUD) {
798 info->signals |= SerialSignal_DTR; 798 info->signals |= SerialSignal_DTR;
799 if (!(tty->termios->c_cflag & CRTSCTS) || 799 if (!(tty->termios.c_cflag & CRTSCTS) ||
800 !test_bit(TTY_THROTTLED, &tty->flags)) { 800 !test_bit(TTY_THROTTLED, &tty->flags)) {
801 info->signals |= SerialSignal_RTS; 801 info->signals |= SerialSignal_RTS;
802 } 802 }
@@ -807,7 +807,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
807 807
808 /* Handle turning off CRTSCTS */ 808 /* Handle turning off CRTSCTS */
809 if (old_termios->c_cflag & CRTSCTS && 809 if (old_termios->c_cflag & CRTSCTS &&
810 !(tty->termios->c_cflag & CRTSCTS)) { 810 !(tty->termios.c_cflag & CRTSCTS)) {
811 tty->hw_stopped = 0; 811 tty->hw_stopped = 0;
812 tx_release(tty); 812 tx_release(tty);
813 } 813 }
@@ -1372,7 +1372,7 @@ static void throttle(struct tty_struct * tty)
1372 DBGINFO(("%s throttle\n", info->device_name)); 1372 DBGINFO(("%s throttle\n", info->device_name));
1373 if (I_IXOFF(tty)) 1373 if (I_IXOFF(tty))
1374 send_xchar(tty, STOP_CHAR(tty)); 1374 send_xchar(tty, STOP_CHAR(tty));
1375 if (tty->termios->c_cflag & CRTSCTS) { 1375 if (tty->termios.c_cflag & CRTSCTS) {
1376 spin_lock_irqsave(&info->lock,flags); 1376 spin_lock_irqsave(&info->lock,flags);
1377 info->signals &= ~SerialSignal_RTS; 1377 info->signals &= ~SerialSignal_RTS;
1378 set_signals(info); 1378 set_signals(info);
@@ -1397,7 +1397,7 @@ static void unthrottle(struct tty_struct * tty)
1397 else 1397 else
1398 send_xchar(tty, START_CHAR(tty)); 1398 send_xchar(tty, START_CHAR(tty));
1399 } 1399 }
1400 if (tty->termios->c_cflag & CRTSCTS) { 1400 if (tty->termios.c_cflag & CRTSCTS) {
1401 spin_lock_irqsave(&info->lock,flags); 1401 spin_lock_irqsave(&info->lock,flags);
1402 info->signals |= SerialSignal_RTS; 1402 info->signals |= SerialSignal_RTS;
1403 set_signals(info); 1403 set_signals(info);
@@ -2493,7 +2493,7 @@ static void shutdown(struct slgt_info *info)
2493 2493
2494 slgt_irq_off(info, IRQ_ALL | IRQ_MASTER); 2494 slgt_irq_off(info, IRQ_ALL | IRQ_MASTER);
2495 2495
2496 if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { 2496 if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
2497 info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS); 2497 info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
2498 set_signals(info); 2498 set_signals(info);
2499 } 2499 }
@@ -2534,7 +2534,7 @@ static void program_hw(struct slgt_info *info)
2534 get_signals(info); 2534 get_signals(info);
2535 2535
2536 if (info->netcount || 2536 if (info->netcount ||
2537 (info->port.tty && info->port.tty->termios->c_cflag & CREAD)) 2537 (info->port.tty && info->port.tty->termios.c_cflag & CREAD))
2538 rx_start(info); 2538 rx_start(info);
2539 2539
2540 spin_unlock_irqrestore(&info->lock,flags); 2540 spin_unlock_irqrestore(&info->lock,flags);
@@ -2548,11 +2548,11 @@ static void change_params(struct slgt_info *info)
2548 unsigned cflag; 2548 unsigned cflag;
2549 int bits_per_char; 2549 int bits_per_char;
2550 2550
2551 if (!info->port.tty || !info->port.tty->termios) 2551 if (!info->port.tty)
2552 return; 2552 return;
2553 DBGINFO(("%s change_params\n", info->device_name)); 2553 DBGINFO(("%s change_params\n", info->device_name));
2554 2554
2555 cflag = info->port.tty->termios->c_cflag; 2555 cflag = info->port.tty->termios.c_cflag;
2556 2556
2557 /* if B0 rate (hangup) specified then negate DTR and RTS */ 2557 /* if B0 rate (hangup) specified then negate DTR and RTS */
2558 /* otherwise assert DTR and RTS */ 2558 /* otherwise assert DTR and RTS */
@@ -3292,7 +3292,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
3292 return 0; 3292 return 0;
3293 } 3293 }
3294 3294
3295 if (tty->termios->c_cflag & CLOCAL) 3295 if (tty->termios.c_cflag & CLOCAL)
3296 do_clocal = true; 3296 do_clocal = true;
3297 3297
3298 /* Wait for carrier detect and the line to become 3298 /* Wait for carrier detect and the line to become
@@ -3314,7 +3314,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
3314 port->blocked_open++; 3314 port->blocked_open++;
3315 3315
3316 while (1) { 3316 while (1) {
3317 if ((tty->termios->c_cflag & CBAUD)) 3317 if ((tty->termios.c_cflag & CBAUD))
3318 tty_port_raise_dtr_rts(port); 3318 tty_port_raise_dtr_rts(port);
3319 3319
3320 set_current_state(TASK_INTERRUPTIBLE); 3320 set_current_state(TASK_INTERRUPTIBLE);
diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c
index a3dddc12d2fe..ae75a3c21fd3 100644
--- a/drivers/tty/synclinkmp.c
+++ b/drivers/tty/synclinkmp.c
@@ -873,7 +873,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
873 873
874 /* Handle transition to B0 status */ 874 /* Handle transition to B0 status */
875 if (old_termios->c_cflag & CBAUD && 875 if (old_termios->c_cflag & CBAUD &&
876 !(tty->termios->c_cflag & CBAUD)) { 876 !(tty->termios.c_cflag & CBAUD)) {
877 info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR); 877 info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
878 spin_lock_irqsave(&info->lock,flags); 878 spin_lock_irqsave(&info->lock,flags);
879 set_signals(info); 879 set_signals(info);
@@ -882,9 +882,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
882 882
883 /* Handle transition away from B0 status */ 883 /* Handle transition away from B0 status */
884 if (!(old_termios->c_cflag & CBAUD) && 884 if (!(old_termios->c_cflag & CBAUD) &&
885 tty->termios->c_cflag & CBAUD) { 885 tty->termios.c_cflag & CBAUD) {
886 info->serial_signals |= SerialSignal_DTR; 886 info->serial_signals |= SerialSignal_DTR;
887 if (!(tty->termios->c_cflag & CRTSCTS) || 887 if (!(tty->termios.c_cflag & CRTSCTS) ||
888 !test_bit(TTY_THROTTLED, &tty->flags)) { 888 !test_bit(TTY_THROTTLED, &tty->flags)) {
889 info->serial_signals |= SerialSignal_RTS; 889 info->serial_signals |= SerialSignal_RTS;
890 } 890 }
@@ -895,7 +895,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
895 895
896 /* Handle turning off CRTSCTS */ 896 /* Handle turning off CRTSCTS */
897 if (old_termios->c_cflag & CRTSCTS && 897 if (old_termios->c_cflag & CRTSCTS &&
898 !(tty->termios->c_cflag & CRTSCTS)) { 898 !(tty->termios.c_cflag & CRTSCTS)) {
899 tty->hw_stopped = 0; 899 tty->hw_stopped = 0;
900 tx_release(tty); 900 tx_release(tty);
901 } 901 }
@@ -1473,7 +1473,7 @@ static void throttle(struct tty_struct * tty)
1473 if (I_IXOFF(tty)) 1473 if (I_IXOFF(tty))
1474 send_xchar(tty, STOP_CHAR(tty)); 1474 send_xchar(tty, STOP_CHAR(tty));
1475 1475
1476 if (tty->termios->c_cflag & CRTSCTS) { 1476 if (tty->termios.c_cflag & CRTSCTS) {
1477 spin_lock_irqsave(&info->lock,flags); 1477 spin_lock_irqsave(&info->lock,flags);
1478 info->serial_signals &= ~SerialSignal_RTS; 1478 info->serial_signals &= ~SerialSignal_RTS;
1479 set_signals(info); 1479 set_signals(info);
@@ -1502,7 +1502,7 @@ static void unthrottle(struct tty_struct * tty)
1502 send_xchar(tty, START_CHAR(tty)); 1502 send_xchar(tty, START_CHAR(tty));
1503 } 1503 }
1504 1504
1505 if (tty->termios->c_cflag & CRTSCTS) { 1505 if (tty->termios.c_cflag & CRTSCTS) {
1506 spin_lock_irqsave(&info->lock,flags); 1506 spin_lock_irqsave(&info->lock,flags);
1507 info->serial_signals |= SerialSignal_RTS; 1507 info->serial_signals |= SerialSignal_RTS;
1508 set_signals(info); 1508 set_signals(info);
@@ -2708,7 +2708,7 @@ static void shutdown(SLMP_INFO * info)
2708 2708
2709 reset_port(info); 2709 reset_port(info);
2710 2710
2711 if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) { 2711 if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
2712 info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS); 2712 info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
2713 set_signals(info); 2713 set_signals(info);
2714 } 2714 }
@@ -2749,7 +2749,7 @@ static void program_hw(SLMP_INFO *info)
2749 2749
2750 get_signals(info); 2750 get_signals(info);
2751 2751
2752 if (info->netcount || (info->port.tty && info->port.tty->termios->c_cflag & CREAD) ) 2752 if (info->netcount || (info->port.tty && info->port.tty->termios.c_cflag & CREAD) )
2753 rx_start(info); 2753 rx_start(info);
2754 2754
2755 spin_unlock_irqrestore(&info->lock,flags); 2755 spin_unlock_irqrestore(&info->lock,flags);
@@ -2762,14 +2762,14 @@ static void change_params(SLMP_INFO *info)
2762 unsigned cflag; 2762 unsigned cflag;
2763 int bits_per_char; 2763 int bits_per_char;
2764 2764
2765 if (!info->port.tty || !info->port.tty->termios) 2765 if (!info->port.tty)
2766 return; 2766 return;
2767 2767
2768 if (debug_level >= DEBUG_LEVEL_INFO) 2768 if (debug_level >= DEBUG_LEVEL_INFO)
2769 printk("%s(%d):%s change_params()\n", 2769 printk("%s(%d):%s change_params()\n",
2770 __FILE__,__LINE__, info->device_name ); 2770 __FILE__,__LINE__, info->device_name );
2771 2771
2772 cflag = info->port.tty->termios->c_cflag; 2772 cflag = info->port.tty->termios.c_cflag;
2773 2773
2774 /* if B0 rate (hangup) specified then negate DTR and RTS */ 2774 /* if B0 rate (hangup) specified then negate DTR and RTS */
2775 /* otherwise assert DTR and RTS */ 2775 /* otherwise assert DTR and RTS */
@@ -3306,7 +3306,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
3306 return 0; 3306 return 0;
3307 } 3307 }
3308 3308
3309 if (tty->termios->c_cflag & CLOCAL) 3309 if (tty->termios.c_cflag & CLOCAL)
3310 do_clocal = true; 3310 do_clocal = true;
3311 3311
3312 /* Wait for carrier detect and the line to become 3312 /* Wait for carrier detect and the line to become
@@ -3332,7 +3332,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
3332 port->blocked_open++; 3332 port->blocked_open++;
3333 3333
3334 while (1) { 3334 while (1) {
3335 if (tty->termios->c_cflag & CBAUD) 3335 if (tty->termios.c_cflag & CBAUD)
3336 tty_port_raise_dtr_rts(port); 3336 tty_port_raise_dtr_rts(port);
3337 3337
3338 set_current_state(TASK_INTERRUPTIBLE); 3338 set_current_state(TASK_INTERRUPTIBLE);
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index b425c79675ad..c6f4d711771b 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -1249,21 +1249,19 @@ int tty_init_termios(struct tty_struct *tty)
1249 struct ktermios *tp; 1249 struct ktermios *tp;
1250 int idx = tty->index; 1250 int idx = tty->index;
1251 1251
1252 tp = tty->driver->termios[idx]; 1252 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
1253 if (tp == NULL) { 1253 tty->termios = tty->driver->init_termios;
1254 tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); 1254 else {
1255 if (tp == NULL) 1255 /* Check for lazy saved data */
1256 return -ENOMEM; 1256 tp = tty->driver->termios[idx];
1257 memcpy(tp, &tty->driver->init_termios, 1257 if (tp != NULL)
1258 sizeof(struct ktermios)); 1258 tty->termios = *tp;
1259 tty->driver->termios[idx] = tp; 1259 else
1260 tty->termios = tty->driver->init_termios;
1260 } 1261 }
1261 tty->termios = tp;
1262 tty->termios_locked = tp + 1;
1263
1264 /* Compatibility until drivers always set this */ 1262 /* Compatibility until drivers always set this */
1265 tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); 1263 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
1266 tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); 1264 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
1267 return 0; 1265 return 0;
1268} 1266}
1269EXPORT_SYMBOL_GPL(tty_init_termios); 1267EXPORT_SYMBOL_GPL(tty_init_termios);
@@ -1407,6 +1405,9 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
1407 if (retval < 0) 1405 if (retval < 0)
1408 goto err_deinit_tty; 1406 goto err_deinit_tty;
1409 1407
1408 if (!tty->port)
1409 tty->port = driver->ports[idx];
1410
1410 /* 1411 /*
1411 * Structures all installed ... call the ldisc open routines. 1412 * Structures all installed ... call the ldisc open routines.
1412 * If we fail here just call release_tty to clean up. No need 1413 * If we fail here just call release_tty to clean up. No need
@@ -1436,22 +1437,24 @@ void tty_free_termios(struct tty_struct *tty)
1436{ 1437{
1437 struct ktermios *tp; 1438 struct ktermios *tp;
1438 int idx = tty->index; 1439 int idx = tty->index;
1439 /* Kill this flag and push into drivers for locking etc */ 1440
1440 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { 1441 /* If the port is going to reset then it has no termios to save */
1441 /* FIXME: Locking on ->termios array */ 1442 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
1442 tp = tty->termios; 1443 return;
1443 tty->driver->termios[idx] = NULL; 1444
1444 kfree(tp); 1445 /* Stash the termios data */
1446 tp = tty->driver->termios[idx];
1447 if (tp == NULL) {
1448 tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
1449 if (tp == NULL) {
1450 pr_warn("tty: no memory to save termios state.\n");
1451 return;
1452 }
1445 } 1453 }
1454 *tp = tty->termios;
1446} 1455}
1447EXPORT_SYMBOL(tty_free_termios); 1456EXPORT_SYMBOL(tty_free_termios);
1448 1457
1449void tty_shutdown(struct tty_struct *tty)
1450{
1451 tty_driver_remove_tty(tty->driver, tty);
1452 tty_free_termios(tty);
1453}
1454EXPORT_SYMBOL(tty_shutdown);
1455 1458
1456/** 1459/**
1457 * release_one_tty - release tty structure memory 1460 * release_one_tty - release tty structure memory
@@ -1462,7 +1465,6 @@ EXPORT_SYMBOL(tty_shutdown);
1462 * in use. It also gets called when setup of a device fails. 1465 * in use. It also gets called when setup of a device fails.
1463 * 1466 *
1464 * Locking: 1467 * Locking:
1465 * tty_mutex - sometimes only
1466 * takes the file list lock internally when working on the list 1468 * takes the file list lock internally when working on the list
1467 * of ttys that the driver keeps. 1469 * of ttys that the driver keeps.
1468 * 1470 *
@@ -1495,11 +1497,6 @@ static void queue_release_one_tty(struct kref *kref)
1495{ 1497{
1496 struct tty_struct *tty = container_of(kref, struct tty_struct, kref); 1498 struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
1497 1499
1498 if (tty->ops->shutdown)
1499 tty->ops->shutdown(tty);
1500 else
1501 tty_shutdown(tty);
1502
1503 /* The hangup queue is now free so we can reuse it rather than 1500 /* The hangup queue is now free so we can reuse it rather than
1504 waste a chunk of memory for each port */ 1501 waste a chunk of memory for each port */
1505 INIT_WORK(&tty->hangup_work, release_one_tty); 1502 INIT_WORK(&tty->hangup_work, release_one_tty);
@@ -1528,16 +1525,20 @@ EXPORT_SYMBOL(tty_kref_put);
1528 * and decrement the refcount of the backing module. 1525 * and decrement the refcount of the backing module.
1529 * 1526 *
1530 * Locking: 1527 * Locking:
1531 * tty_mutex - sometimes only 1528 * tty_mutex
1532 * takes the file list lock internally when working on the list 1529 * takes the file list lock internally when working on the list
1533 * of ttys that the driver keeps. 1530 * of ttys that the driver keeps.
1534 * FIXME: should we require tty_mutex is held here ??
1535 * 1531 *
1536 */ 1532 */
1537static void release_tty(struct tty_struct *tty, int idx) 1533static void release_tty(struct tty_struct *tty, int idx)
1538{ 1534{
1539 /* This should always be true but check for the moment */ 1535 /* This should always be true but check for the moment */
1540 WARN_ON(tty->index != idx); 1536 WARN_ON(tty->index != idx);
1537 WARN_ON(!mutex_is_locked(&tty_mutex));
1538 if (tty->ops->shutdown)
1539 tty->ops->shutdown(tty);
1540 tty_free_termios(tty);
1541 tty_driver_remove_tty(tty->driver, tty);
1541 1542
1542 if (tty->link) 1543 if (tty->link)
1543 tty_kref_put(tty->link); 1544 tty_kref_put(tty->link);
@@ -1572,22 +1573,12 @@ static int tty_release_checks(struct tty_struct *tty, struct tty_struct *o_tty,
1572 __func__, idx, tty->name); 1573 __func__, idx, tty->name);
1573 return -1; 1574 return -1;
1574 } 1575 }
1575 if (tty->termios != tty->driver->termios[idx]) {
1576 printk(KERN_DEBUG "%s: driver.termios[%d] not termios for (%s)\n",
1577 __func__, idx, tty->name);
1578 return -1;
1579 }
1580 if (tty->driver->other) { 1576 if (tty->driver->other) {
1581 if (o_tty != tty->driver->other->ttys[idx]) { 1577 if (o_tty != tty->driver->other->ttys[idx]) {
1582 printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n", 1578 printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n",
1583 __func__, idx, tty->name); 1579 __func__, idx, tty->name);
1584 return -1; 1580 return -1;
1585 } 1581 }
1586 if (o_tty->termios != tty->driver->other->termios[idx]) {
1587 printk(KERN_DEBUG "%s: other->termios[%d] not o_termios for (%s)\n",
1588 __func__, idx, tty->name);
1589 return -1;
1590 }
1591 if (o_tty->link != tty) { 1582 if (o_tty->link != tty) {
1592 printk(KERN_DEBUG "%s: bad pty pointers\n", __func__); 1583 printk(KERN_DEBUG "%s: bad pty pointers\n", __func__);
1593 return -1; 1584 return -1;
@@ -1715,6 +1706,9 @@ int tty_release(struct inode *inode, struct file *filp)
1715 * The closing flags are now consistent with the open counts on 1706 * The closing flags are now consistent with the open counts on
1716 * both sides, and we've completed the last operation that could 1707 * both sides, and we've completed the last operation that could
1717 * block, so it's safe to proceed with closing. 1708 * block, so it's safe to proceed with closing.
1709 *
1710 * We must *not* drop the tty_mutex until we ensure that a further
1711 * entry into tty_open can not pick up this tty.
1718 */ 1712 */
1719 if (pty_master) { 1713 if (pty_master) {
1720 if (--o_tty->count < 0) { 1714 if (--o_tty->count < 0) {
@@ -1766,12 +1760,13 @@ int tty_release(struct inode *inode, struct file *filp)
1766 } 1760 }
1767 1761
1768 mutex_unlock(&tty_mutex); 1762 mutex_unlock(&tty_mutex);
1763 tty_unlock();
1764 /* At this point the TTY_CLOSING flag should ensure a dead tty
1765 cannot be re-opened by a racing opener */
1769 1766
1770 /* check whether both sides are closing ... */ 1767 /* check whether both sides are closing ... */
1771 if (!tty_closing || (o_tty && !o_tty_closing)) { 1768 if (!tty_closing || (o_tty && !o_tty_closing))
1772 tty_unlock();
1773 return 0; 1769 return 0;
1774 }
1775 1770
1776#ifdef TTY_DEBUG_HANGUP 1771#ifdef TTY_DEBUG_HANGUP
1777 printk(KERN_DEBUG "%s: freeing tty structure...\n", __func__); 1772 printk(KERN_DEBUG "%s: freeing tty structure...\n", __func__);
@@ -1784,12 +1779,14 @@ int tty_release(struct inode *inode, struct file *filp)
1784 * The release_tty function takes care of the details of clearing 1779 * The release_tty function takes care of the details of clearing
1785 * the slots and preserving the termios structure. 1780 * the slots and preserving the termios structure.
1786 */ 1781 */
1782 mutex_lock(&tty_mutex);
1787 release_tty(tty, idx); 1783 release_tty(tty, idx);
1784 mutex_unlock(&tty_mutex);
1788 1785
1789 /* Make this pty number available for reallocation */ 1786 /* Make this pty number available for reallocation */
1790 if (devpts) 1787 if (devpts)
1791 devpts_kill_index(inode, idx); 1788 devpts_kill_index(inode, idx);
1792 tty_unlock(); 1789
1793 return 0; 1790 return 0;
1794} 1791}
1795 1792
@@ -3094,6 +3091,7 @@ static void destruct_tty_driver(struct kref *kref)
3094 kfree(p); 3091 kfree(p);
3095 cdev_del(&driver->cdev); 3092 cdev_del(&driver->cdev);
3096 } 3093 }
3094 kfree(driver->ports);
3097 kfree(driver); 3095 kfree(driver);
3098} 3096}
3099 3097
@@ -3132,6 +3130,18 @@ int tty_register_driver(struct tty_driver *driver)
3132 if (!p) 3130 if (!p)
3133 return -ENOMEM; 3131 return -ENOMEM;
3134 } 3132 }
3133 /*
3134 * There is too many lines in PTY and we won't need the array there
3135 * since it has an ->install hook where it assigns ports properly.
3136 */
3137 if (driver->type != TTY_DRIVER_TYPE_PTY) {
3138 driver->ports = kcalloc(driver->num, sizeof(struct tty_port *),
3139 GFP_KERNEL);
3140 if (!driver->ports) {
3141 error = -ENOMEM;
3142 goto err_free_p;
3143 }
3144 }
3135 3145
3136 if (!driver->major) { 3146 if (!driver->major) {
3137 error = alloc_chrdev_region(&dev, driver->minor_start, 3147 error = alloc_chrdev_region(&dev, driver->minor_start,
@@ -3144,10 +3154,8 @@ int tty_register_driver(struct tty_driver *driver)
3144 dev = MKDEV(driver->major, driver->minor_start); 3154 dev = MKDEV(driver->major, driver->minor_start);
3145 error = register_chrdev_region(dev, driver->num, driver->name); 3155 error = register_chrdev_region(dev, driver->num, driver->name);
3146 } 3156 }
3147 if (error < 0) { 3157 if (error < 0)
3148 kfree(p); 3158 goto err_free_p;
3149 return error;
3150 }
3151 3159
3152 if (p) { 3160 if (p) {
3153 driver->ttys = (struct tty_struct **)p; 3161 driver->ttys = (struct tty_struct **)p;
@@ -3160,13 +3168,8 @@ int tty_register_driver(struct tty_driver *driver)
3160 cdev_init(&driver->cdev, &tty_fops); 3168 cdev_init(&driver->cdev, &tty_fops);
3161 driver->cdev.owner = driver->owner; 3169 driver->cdev.owner = driver->owner;
3162 error = cdev_add(&driver->cdev, dev, driver->num); 3170 error = cdev_add(&driver->cdev, dev, driver->num);
3163 if (error) { 3171 if (error)
3164 unregister_chrdev_region(dev, driver->num); 3172 goto err_unreg_char;
3165 driver->ttys = NULL;
3166 driver->termios = NULL;
3167 kfree(p);
3168 return error;
3169 }
3170 3173
3171 mutex_lock(&tty_mutex); 3174 mutex_lock(&tty_mutex);
3172 list_add(&driver->tty_drivers, &tty_drivers); 3175 list_add(&driver->tty_drivers, &tty_drivers);
@@ -3193,13 +3196,14 @@ err:
3193 list_del(&driver->tty_drivers); 3196 list_del(&driver->tty_drivers);
3194 mutex_unlock(&tty_mutex); 3197 mutex_unlock(&tty_mutex);
3195 3198
3199err_unreg_char:
3196 unregister_chrdev_region(dev, driver->num); 3200 unregister_chrdev_region(dev, driver->num);
3197 driver->ttys = NULL; 3201 driver->ttys = NULL;
3198 driver->termios = NULL; 3202 driver->termios = NULL;
3203err_free_p: /* destruct_tty_driver will free driver->ports */
3199 kfree(p); 3204 kfree(p);
3200 return error; 3205 return error;
3201} 3206}
3202
3203EXPORT_SYMBOL(tty_register_driver); 3207EXPORT_SYMBOL(tty_register_driver);
3204 3208
3205/* 3209/*
diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c
index a1b9a2f68567..12b1fa0f4f86 100644
--- a/drivers/tty/tty_ioctl.c
+++ b/drivers/tty/tty_ioctl.c
@@ -410,7 +410,7 @@ EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
410 410
411void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud) 411void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
412{ 412{
413 tty_termios_encode_baud_rate(tty->termios, ibaud, obaud); 413 tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud);
414} 414}
415EXPORT_SYMBOL_GPL(tty_encode_baud_rate); 415EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
416 416
@@ -427,7 +427,7 @@ EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
427 427
428speed_t tty_get_baud_rate(struct tty_struct *tty) 428speed_t tty_get_baud_rate(struct tty_struct *tty)
429{ 429{
430 speed_t baud = tty_termios_baud_rate(tty->termios); 430 speed_t baud = tty_termios_baud_rate(&tty->termios);
431 431
432 if (baud == 38400 && tty->alt_speed) { 432 if (baud == 38400 && tty->alt_speed) {
433 if (!tty->warned) { 433 if (!tty->warned) {
@@ -509,14 +509,14 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
509 /* FIXME: we need to decide on some locking/ordering semantics 509 /* FIXME: we need to decide on some locking/ordering semantics
510 for the set_termios notification eventually */ 510 for the set_termios notification eventually */
511 mutex_lock(&tty->termios_mutex); 511 mutex_lock(&tty->termios_mutex);
512 old_termios = *tty->termios; 512 old_termios = tty->termios;
513 *tty->termios = *new_termios; 513 tty->termios = *new_termios;
514 unset_locked_termios(tty->termios, &old_termios, tty->termios_locked); 514 unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked);
515 515
516 /* See if packet mode change of state. */ 516 /* See if packet mode change of state. */
517 if (tty->link && tty->link->packet) { 517 if (tty->link && tty->link->packet) {
518 int extproc = (old_termios.c_lflag & EXTPROC) | 518 int extproc = (old_termios.c_lflag & EXTPROC) |
519 (tty->termios->c_lflag & EXTPROC); 519 (tty->termios.c_lflag & EXTPROC);
520 int old_flow = ((old_termios.c_iflag & IXON) && 520 int old_flow = ((old_termios.c_iflag & IXON) &&
521 (old_termios.c_cc[VSTOP] == '\023') && 521 (old_termios.c_cc[VSTOP] == '\023') &&
522 (old_termios.c_cc[VSTART] == '\021')); 522 (old_termios.c_cc[VSTART] == '\021'));
@@ -542,7 +542,7 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
542 if (tty->ops->set_termios) 542 if (tty->ops->set_termios)
543 (*tty->ops->set_termios)(tty, &old_termios); 543 (*tty->ops->set_termios)(tty, &old_termios);
544 else 544 else
545 tty_termios_copy_hw(tty->termios, &old_termios); 545 tty_termios_copy_hw(&tty->termios, &old_termios);
546 546
547 ld = tty_ldisc_ref(tty); 547 ld = tty_ldisc_ref(tty);
548 if (ld != NULL) { 548 if (ld != NULL) {
@@ -578,7 +578,7 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
578 return retval; 578 return retval;
579 579
580 mutex_lock(&tty->termios_mutex); 580 mutex_lock(&tty->termios_mutex);
581 memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios)); 581 tmp_termios = tty->termios;
582 mutex_unlock(&tty->termios_mutex); 582 mutex_unlock(&tty->termios_mutex);
583 583
584 if (opt & TERMIOS_TERMIO) { 584 if (opt & TERMIOS_TERMIO) {
@@ -632,14 +632,14 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
632static void copy_termios(struct tty_struct *tty, struct ktermios *kterm) 632static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
633{ 633{
634 mutex_lock(&tty->termios_mutex); 634 mutex_lock(&tty->termios_mutex);
635 memcpy(kterm, tty->termios, sizeof(struct ktermios)); 635 *kterm = tty->termios;
636 mutex_unlock(&tty->termios_mutex); 636 mutex_unlock(&tty->termios_mutex);
637} 637}
638 638
639static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm) 639static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
640{ 640{
641 mutex_lock(&tty->termios_mutex); 641 mutex_lock(&tty->termios_mutex);
642 memcpy(kterm, tty->termios_locked, sizeof(struct ktermios)); 642 *kterm = tty->termios_locked;
643 mutex_unlock(&tty->termios_mutex); 643 mutex_unlock(&tty->termios_mutex);
644} 644}
645 645
@@ -707,16 +707,16 @@ static int get_sgflags(struct tty_struct *tty)
707{ 707{
708 int flags = 0; 708 int flags = 0;
709 709
710 if (!(tty->termios->c_lflag & ICANON)) { 710 if (!(tty->termios.c_lflag & ICANON)) {
711 if (tty->termios->c_lflag & ISIG) 711 if (tty->termios.c_lflag & ISIG)
712 flags |= 0x02; /* cbreak */ 712 flags |= 0x02; /* cbreak */
713 else 713 else
714 flags |= 0x20; /* raw */ 714 flags |= 0x20; /* raw */
715 } 715 }
716 if (tty->termios->c_lflag & ECHO) 716 if (tty->termios.c_lflag & ECHO)
717 flags |= 0x08; /* echo */ 717 flags |= 0x08; /* echo */
718 if (tty->termios->c_oflag & OPOST) 718 if (tty->termios.c_oflag & OPOST)
719 if (tty->termios->c_oflag & ONLCR) 719 if (tty->termios.c_oflag & ONLCR)
720 flags |= 0x10; /* crmod */ 720 flags |= 0x10; /* crmod */
721 return flags; 721 return flags;
722} 722}
@@ -726,10 +726,10 @@ static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
726 struct sgttyb tmp; 726 struct sgttyb tmp;
727 727
728 mutex_lock(&tty->termios_mutex); 728 mutex_lock(&tty->termios_mutex);
729 tmp.sg_ispeed = tty->termios->c_ispeed; 729 tmp.sg_ispeed = tty->termios.c_ispeed;
730 tmp.sg_ospeed = tty->termios->c_ospeed; 730 tmp.sg_ospeed = tty->termios.c_ospeed;
731 tmp.sg_erase = tty->termios->c_cc[VERASE]; 731 tmp.sg_erase = tty->termios.c_cc[VERASE];
732 tmp.sg_kill = tty->termios->c_cc[VKILL]; 732 tmp.sg_kill = tty->termios.c_cc[VKILL];
733 tmp.sg_flags = get_sgflags(tty); 733 tmp.sg_flags = get_sgflags(tty);
734 mutex_unlock(&tty->termios_mutex); 734 mutex_unlock(&tty->termios_mutex);
735 735
@@ -787,7 +787,7 @@ static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
787 return -EFAULT; 787 return -EFAULT;
788 788
789 mutex_lock(&tty->termios_mutex); 789 mutex_lock(&tty->termios_mutex);
790 termios = *tty->termios; 790 termios = tty->termios;
791 termios.c_cc[VERASE] = tmp.sg_erase; 791 termios.c_cc[VERASE] = tmp.sg_erase;
792 termios.c_cc[VKILL] = tmp.sg_kill; 792 termios.c_cc[VKILL] = tmp.sg_kill;
793 set_sgflags(&termios, tmp.sg_flags); 793 set_sgflags(&termios, tmp.sg_flags);
@@ -808,12 +808,12 @@ static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
808 struct tchars tmp; 808 struct tchars tmp;
809 809
810 mutex_lock(&tty->termios_mutex); 810 mutex_lock(&tty->termios_mutex);
811 tmp.t_intrc = tty->termios->c_cc[VINTR]; 811 tmp.t_intrc = tty->termios.c_cc[VINTR];
812 tmp.t_quitc = tty->termios->c_cc[VQUIT]; 812 tmp.t_quitc = tty->termios.c_cc[VQUIT];
813 tmp.t_startc = tty->termios->c_cc[VSTART]; 813 tmp.t_startc = tty->termios.c_cc[VSTART];
814 tmp.t_stopc = tty->termios->c_cc[VSTOP]; 814 tmp.t_stopc = tty->termios.c_cc[VSTOP];
815 tmp.t_eofc = tty->termios->c_cc[VEOF]; 815 tmp.t_eofc = tty->termios.c_cc[VEOF];
816 tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */ 816 tmp.t_brkc = tty->termios.c_cc[VEOL2]; /* what is brkc anyway? */
817 mutex_unlock(&tty->termios_mutex); 817 mutex_unlock(&tty->termios_mutex);
818 return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; 818 return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
819} 819}
@@ -825,12 +825,12 @@ static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
825 if (copy_from_user(&tmp, tchars, sizeof(tmp))) 825 if (copy_from_user(&tmp, tchars, sizeof(tmp)))
826 return -EFAULT; 826 return -EFAULT;
827 mutex_lock(&tty->termios_mutex); 827 mutex_lock(&tty->termios_mutex);
828 tty->termios->c_cc[VINTR] = tmp.t_intrc; 828 tty->termios.c_cc[VINTR] = tmp.t_intrc;
829 tty->termios->c_cc[VQUIT] = tmp.t_quitc; 829 tty->termios.c_cc[VQUIT] = tmp.t_quitc;
830 tty->termios->c_cc[VSTART] = tmp.t_startc; 830 tty->termios.c_cc[VSTART] = tmp.t_startc;
831 tty->termios->c_cc[VSTOP] = tmp.t_stopc; 831 tty->termios.c_cc[VSTOP] = tmp.t_stopc;
832 tty->termios->c_cc[VEOF] = tmp.t_eofc; 832 tty->termios.c_cc[VEOF] = tmp.t_eofc;
833 tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */ 833 tty->termios.c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */
834 mutex_unlock(&tty->termios_mutex); 834 mutex_unlock(&tty->termios_mutex);
835 return 0; 835 return 0;
836} 836}
@@ -842,14 +842,14 @@ static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
842 struct ltchars tmp; 842 struct ltchars tmp;
843 843
844 mutex_lock(&tty->termios_mutex); 844 mutex_lock(&tty->termios_mutex);
845 tmp.t_suspc = tty->termios->c_cc[VSUSP]; 845 tmp.t_suspc = tty->termios.c_cc[VSUSP];
846 /* what is dsuspc anyway? */ 846 /* what is dsuspc anyway? */
847 tmp.t_dsuspc = tty->termios->c_cc[VSUSP]; 847 tmp.t_dsuspc = tty->termios.c_cc[VSUSP];
848 tmp.t_rprntc = tty->termios->c_cc[VREPRINT]; 848 tmp.t_rprntc = tty->termios.c_cc[VREPRINT];
849 /* what is flushc anyway? */ 849 /* what is flushc anyway? */
850 tmp.t_flushc = tty->termios->c_cc[VEOL2]; 850 tmp.t_flushc = tty->termios.c_cc[VEOL2];
851 tmp.t_werasc = tty->termios->c_cc[VWERASE]; 851 tmp.t_werasc = tty->termios.c_cc[VWERASE];
852 tmp.t_lnextc = tty->termios->c_cc[VLNEXT]; 852 tmp.t_lnextc = tty->termios.c_cc[VLNEXT];
853 mutex_unlock(&tty->termios_mutex); 853 mutex_unlock(&tty->termios_mutex);
854 return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; 854 return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
855} 855}
@@ -862,14 +862,14 @@ static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
862 return -EFAULT; 862 return -EFAULT;
863 863
864 mutex_lock(&tty->termios_mutex); 864 mutex_lock(&tty->termios_mutex);
865 tty->termios->c_cc[VSUSP] = tmp.t_suspc; 865 tty->termios.c_cc[VSUSP] = tmp.t_suspc;
866 /* what is dsuspc anyway? */ 866 /* what is dsuspc anyway? */
867 tty->termios->c_cc[VEOL2] = tmp.t_dsuspc; 867 tty->termios.c_cc[VEOL2] = tmp.t_dsuspc;
868 tty->termios->c_cc[VREPRINT] = tmp.t_rprntc; 868 tty->termios.c_cc[VREPRINT] = tmp.t_rprntc;
869 /* what is flushc anyway? */ 869 /* what is flushc anyway? */
870 tty->termios->c_cc[VEOL2] = tmp.t_flushc; 870 tty->termios.c_cc[VEOL2] = tmp.t_flushc;
871 tty->termios->c_cc[VWERASE] = tmp.t_werasc; 871 tty->termios.c_cc[VWERASE] = tmp.t_werasc;
872 tty->termios->c_cc[VLNEXT] = tmp.t_lnextc; 872 tty->termios.c_cc[VLNEXT] = tmp.t_lnextc;
873 mutex_unlock(&tty->termios_mutex); 873 mutex_unlock(&tty->termios_mutex);
874 return 0; 874 return 0;
875} 875}
@@ -920,12 +920,12 @@ static int tty_change_softcar(struct tty_struct *tty, int arg)
920 struct ktermios old; 920 struct ktermios old;
921 921
922 mutex_lock(&tty->termios_mutex); 922 mutex_lock(&tty->termios_mutex);
923 old = *tty->termios; 923 old = tty->termios;
924 tty->termios->c_cflag &= ~CLOCAL; 924 tty->termios.c_cflag &= ~CLOCAL;
925 tty->termios->c_cflag |= bit; 925 tty->termios.c_cflag |= bit;
926 if (tty->ops->set_termios) 926 if (tty->ops->set_termios)
927 tty->ops->set_termios(tty, &old); 927 tty->ops->set_termios(tty, &old);
928 if ((tty->termios->c_cflag & CLOCAL) != bit) 928 if ((tty->termios.c_cflag & CLOCAL) != bit)
929 ret = -EINVAL; 929 ret = -EINVAL;
930 mutex_unlock(&tty->termios_mutex); 930 mutex_unlock(&tty->termios_mutex);
931 return ret; 931 return ret;
@@ -1031,7 +1031,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
1031 (struct termios __user *) arg)) 1031 (struct termios __user *) arg))
1032 return -EFAULT; 1032 return -EFAULT;
1033 mutex_lock(&real_tty->termios_mutex); 1033 mutex_lock(&real_tty->termios_mutex);
1034 memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios)); 1034 real_tty->termios_locked = kterm;
1035 mutex_unlock(&real_tty->termios_mutex); 1035 mutex_unlock(&real_tty->termios_mutex);
1036 return 0; 1036 return 0;
1037#else 1037#else
@@ -1048,7 +1048,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
1048 (struct termios __user *) arg)) 1048 (struct termios __user *) arg))
1049 return -EFAULT; 1049 return -EFAULT;
1050 mutex_lock(&real_tty->termios_mutex); 1050 mutex_lock(&real_tty->termios_mutex);
1051 memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios)); 1051 real_tty->termios_locked = kterm;
1052 mutex_unlock(&real_tty->termios_mutex); 1052 mutex_unlock(&real_tty->termios_mutex);
1053 return ret; 1053 return ret;
1054#endif 1054#endif
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
index 6f99c9959f0c..3d0687197d09 100644
--- a/drivers/tty/tty_ldisc.c
+++ b/drivers/tty/tty_ldisc.c
@@ -413,7 +413,7 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush);
413static void tty_set_termios_ldisc(struct tty_struct *tty, int num) 413static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
414{ 414{
415 mutex_lock(&tty->termios_mutex); 415 mutex_lock(&tty->termios_mutex);
416 tty->termios->c_line = num; 416 tty->termios.c_line = num;
417 mutex_unlock(&tty->termios_mutex); 417 mutex_unlock(&tty->termios_mutex);
418} 418}
419 419
@@ -722,9 +722,9 @@ enable:
722static void tty_reset_termios(struct tty_struct *tty) 722static void tty_reset_termios(struct tty_struct *tty)
723{ 723{
724 mutex_lock(&tty->termios_mutex); 724 mutex_lock(&tty->termios_mutex);
725 *tty->termios = tty->driver->init_termios; 725 tty->termios = tty->driver->init_termios;
726 tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); 726 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
727 tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); 727 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
728 mutex_unlock(&tty->termios_mutex); 728 mutex_unlock(&tty->termios_mutex);
729} 729}
730 730
@@ -846,7 +846,7 @@ retry:
846 846
847 if (reset == 0) { 847 if (reset == 0) {
848 848
849 if (!tty_ldisc_reinit(tty, tty->termios->c_line)) 849 if (!tty_ldisc_reinit(tty, tty->termios.c_line))
850 err = tty_ldisc_open(tty, tty->ldisc); 850 err = tty_ldisc_open(tty, tty->ldisc);
851 else 851 else
852 err = 1; 852 err = 1;
@@ -912,7 +912,6 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
912 * race with the set_ldisc code path. 912 * race with the set_ldisc code path.
913 */ 913 */
914 914
915 tty_unlock();
916 tty_ldisc_halt(tty); 915 tty_ldisc_halt(tty);
917 tty_ldisc_flush_works(tty); 916 tty_ldisc_flush_works(tty);
918 tty_lock(); 917 tty_lock();
@@ -930,6 +929,8 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
930 tty_set_termios_ldisc(tty, N_TTY); 929 tty_set_termios_ldisc(tty, N_TTY);
931 mutex_unlock(&tty->ldisc_mutex); 930 mutex_unlock(&tty->ldisc_mutex);
932 931
932 tty_unlock();
933
933 /* This will need doing differently if we need to lock */ 934 /* This will need doing differently if we need to lock */
934 if (o_tty) 935 if (o_tty)
935 tty_ldisc_release(o_tty, NULL); 936 tty_ldisc_release(o_tty, NULL);
diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c
index bf6e238146ae..edcb827c1286 100644
--- a/drivers/tty/tty_port.c
+++ b/drivers/tty/tty_port.c
@@ -33,6 +33,15 @@ void tty_port_init(struct tty_port *port)
33} 33}
34EXPORT_SYMBOL(tty_port_init); 34EXPORT_SYMBOL(tty_port_init);
35 35
36struct device *tty_port_register_device(struct tty_port *port,
37 struct tty_driver *driver, unsigned index,
38 struct device *device)
39{
40 driver->ports[index] = port;
41 return tty_register_device(driver, index, device);
42}
43EXPORT_SYMBOL_GPL(tty_port_register_device);
44
36int tty_port_alloc_xmit_buf(struct tty_port *port) 45int tty_port_alloc_xmit_buf(struct tty_port *port)
37{ 46{
38 /* We may sleep in get_zeroed_page() */ 47 /* We may sleep in get_zeroed_page() */
@@ -246,7 +255,7 @@ int tty_port_block_til_ready(struct tty_port *port,
246 } 255 }
247 if (filp->f_flags & O_NONBLOCK) { 256 if (filp->f_flags & O_NONBLOCK) {
248 /* Indicate we are open */ 257 /* Indicate we are open */
249 if (tty->termios->c_cflag & CBAUD) 258 if (tty->termios.c_cflag & CBAUD)
250 tty_port_raise_dtr_rts(port); 259 tty_port_raise_dtr_rts(port);
251 port->flags |= ASYNC_NORMAL_ACTIVE; 260 port->flags |= ASYNC_NORMAL_ACTIVE;
252 return 0; 261 return 0;
@@ -270,7 +279,7 @@ int tty_port_block_til_ready(struct tty_port *port,
270 279
271 while (1) { 280 while (1) {
272 /* Indicate we are open */ 281 /* Indicate we are open */
273 if (tty->termios->c_cflag & CBAUD) 282 if (tty->termios.c_cflag & CBAUD)
274 tty_port_raise_dtr_rts(port); 283 tty_port_raise_dtr_rts(port);
275 284
276 prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE); 285 prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
@@ -369,7 +378,7 @@ int tty_port_close_start(struct tty_port *port,
369 378
370 /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to 379 /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to
371 hang up the line */ 380 hang up the line */
372 if (tty->termios->c_cflag & HUPCL) 381 if (tty->termios.c_cflag & HUPCL)
373 tty_port_lower_dtr_rts(port); 382 tty_port_lower_dtr_rts(port);
374 383
375 /* Don't call port->drop for the last reference. Callers will want 384 /* Don't call port->drop for the last reference. Callers will want
@@ -413,6 +422,14 @@ void tty_port_close(struct tty_port *port, struct tty_struct *tty,
413} 422}
414EXPORT_SYMBOL(tty_port_close); 423EXPORT_SYMBOL(tty_port_close);
415 424
425int tty_port_install(struct tty_port *port, struct tty_driver *driver,
426 struct tty_struct *tty)
427{
428 tty->port = port;
429 return tty_standard_install(driver, tty);
430}
431EXPORT_SYMBOL_GPL(tty_port_install);
432
416int tty_port_open(struct tty_port *port, struct tty_struct *tty, 433int tty_port_open(struct tty_port *port, struct tty_struct *tty,
417 struct file *filp) 434 struct file *filp)
418{ 435{
diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
index 48cc6f25cfd3..681765baef69 100644
--- a/drivers/tty/vt/keyboard.c
+++ b/drivers/tty/vt/keyboard.c
@@ -119,6 +119,7 @@ static const int NR_TYPES = ARRAY_SIZE(max_vals);
119 119
120static struct input_handler kbd_handler; 120static struct input_handler kbd_handler;
121static DEFINE_SPINLOCK(kbd_event_lock); 121static DEFINE_SPINLOCK(kbd_event_lock);
122static DEFINE_SPINLOCK(led_lock);
122static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; /* keyboard key bitmap */ 123static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; /* keyboard key bitmap */
123static unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */ 124static unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */
124static bool dead_key_next; 125static bool dead_key_next;
@@ -310,7 +311,7 @@ static void put_queue(struct vc_data *vc, int ch)
310 311
311 if (tty) { 312 if (tty) {
312 tty_insert_flip_char(tty, ch, 0); 313 tty_insert_flip_char(tty, ch, 0);
313 con_schedule_flip(tty); 314 tty_schedule_flip(tty);
314 } 315 }
315} 316}
316 317
@@ -325,7 +326,7 @@ static void puts_queue(struct vc_data *vc, char *cp)
325 tty_insert_flip_char(tty, *cp, 0); 326 tty_insert_flip_char(tty, *cp, 0);
326 cp++; 327 cp++;
327 } 328 }
328 con_schedule_flip(tty); 329 tty_schedule_flip(tty);
329} 330}
330 331
331static void applkey(struct vc_data *vc, int key, char mode) 332static void applkey(struct vc_data *vc, int key, char mode)
@@ -586,7 +587,7 @@ static void fn_send_intr(struct vc_data *vc)
586 if (!tty) 587 if (!tty)
587 return; 588 return;
588 tty_insert_flip_char(tty, 0, TTY_BREAK); 589 tty_insert_flip_char(tty, 0, TTY_BREAK);
589 con_schedule_flip(tty); 590 tty_schedule_flip(tty);
590} 591}
591 592
592static void fn_scroll_forw(struct vc_data *vc) 593static void fn_scroll_forw(struct vc_data *vc)
@@ -984,7 +985,7 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag)
984 * or (ii) whatever pattern of lights people want to show using KDSETLED, 985 * or (ii) whatever pattern of lights people want to show using KDSETLED,
985 * or (iii) specified bits of specified words in kernel memory. 986 * or (iii) specified bits of specified words in kernel memory.
986 */ 987 */
987unsigned char getledstate(void) 988static unsigned char getledstate(void)
988{ 989{
989 return ledstate; 990 return ledstate;
990} 991}
@@ -992,7 +993,7 @@ unsigned char getledstate(void)
992void setledstate(struct kbd_struct *kbd, unsigned int led) 993void setledstate(struct kbd_struct *kbd, unsigned int led)
993{ 994{
994 unsigned long flags; 995 unsigned long flags;
995 spin_lock_irqsave(&kbd_event_lock, flags); 996 spin_lock_irqsave(&led_lock, flags);
996 if (!(led & ~7)) { 997 if (!(led & ~7)) {
997 ledioctl = led; 998 ledioctl = led;
998 kbd->ledmode = LED_SHOW_IOCTL; 999 kbd->ledmode = LED_SHOW_IOCTL;
@@ -1000,7 +1001,7 @@ void setledstate(struct kbd_struct *kbd, unsigned int led)
1000 kbd->ledmode = LED_SHOW_FLAGS; 1001 kbd->ledmode = LED_SHOW_FLAGS;
1001 1002
1002 set_leds(); 1003 set_leds();
1003 spin_unlock_irqrestore(&kbd_event_lock, flags); 1004 spin_unlock_irqrestore(&led_lock, flags);
1004} 1005}
1005 1006
1006static inline unsigned char getleds(void) 1007static inline unsigned char getleds(void)
@@ -1049,13 +1050,13 @@ static int kbd_update_leds_helper(struct input_handle *handle, void *data)
1049 */ 1050 */
1050int vt_get_leds(int console, int flag) 1051int vt_get_leds(int console, int flag)
1051{ 1052{
1052 unsigned long flags;
1053 struct kbd_struct * kbd = kbd_table + console; 1053 struct kbd_struct * kbd = kbd_table + console;
1054 int ret; 1054 int ret;
1055 unsigned long flags;
1055 1056
1056 spin_lock_irqsave(&kbd_event_lock, flags); 1057 spin_lock_irqsave(&led_lock, flags);
1057 ret = vc_kbd_led(kbd, flag); 1058 ret = vc_kbd_led(kbd, flag);
1058 spin_unlock_irqrestore(&kbd_event_lock, flags); 1059 spin_unlock_irqrestore(&led_lock, flags);
1059 1060
1060 return ret; 1061 return ret;
1061} 1062}
@@ -1091,11 +1092,11 @@ void vt_set_led_state(int console, int leds)
1091void vt_kbd_con_start(int console) 1092void vt_kbd_con_start(int console)
1092{ 1093{
1093 struct kbd_struct * kbd = kbd_table + console; 1094 struct kbd_struct * kbd = kbd_table + console;
1094/* unsigned long flags; */ 1095 unsigned long flags;
1095/* spin_lock_irqsave(&kbd_event_lock, flags); */ 1096 spin_lock_irqsave(&led_lock, flags);
1096 clr_vc_kbd_led(kbd, VC_SCROLLOCK); 1097 clr_vc_kbd_led(kbd, VC_SCROLLOCK);
1097 set_leds(); 1098 set_leds();
1098/* spin_unlock_irqrestore(&kbd_event_lock, flags); */ 1099 spin_unlock_irqrestore(&led_lock, flags);
1099} 1100}
1100 1101
1101/** 1102/**
@@ -1104,21 +1105,15 @@ void vt_kbd_con_start(int console)
1104 * 1105 *
1105 * Handle console stop. This is a wrapper for the VT layer 1106 * Handle console stop. This is a wrapper for the VT layer
1106 * so that we can keep kbd knowledge internal 1107 * so that we can keep kbd knowledge internal
1107 *
1108 * FIXME: We eventually need to hold the kbd lock here to protect
1109 * the LED updating. We can't do it yet because fn_hold calls stop_tty
1110 * and start_tty under the kbd_event_lock, while normal tty paths
1111 * don't hold the lock. We probably need to split out an LED lock
1112 * but not during an -rc release!
1113 */ 1108 */
1114void vt_kbd_con_stop(int console) 1109void vt_kbd_con_stop(int console)
1115{ 1110{
1116 struct kbd_struct * kbd = kbd_table + console; 1111 struct kbd_struct * kbd = kbd_table + console;
1117/* unsigned long flags; */ 1112 unsigned long flags;
1118/* spin_lock_irqsave(&kbd_event_lock, flags); */ 1113 spin_lock_irqsave(&led_lock, flags);
1119 set_vc_kbd_led(kbd, VC_SCROLLOCK); 1114 set_vc_kbd_led(kbd, VC_SCROLLOCK);
1120 set_leds(); 1115 set_leds();
1121/* spin_unlock_irqrestore(&kbd_event_lock, flags); */ 1116 spin_unlock_irqrestore(&led_lock, flags);
1122} 1117}
1123 1118
1124/* 1119/*
@@ -1130,7 +1125,12 @@ void vt_kbd_con_stop(int console)
1130 */ 1125 */
1131static void kbd_bh(unsigned long dummy) 1126static void kbd_bh(unsigned long dummy)
1132{ 1127{
1133 unsigned char leds = getleds(); 1128 unsigned char leds;
1129 unsigned long flags;
1130
1131 spin_lock_irqsave(&led_lock, flags);
1132 leds = getleds();
1133 spin_unlock_irqrestore(&led_lock, flags);
1134 1134
1135 if (leds != ledstate) { 1135 if (leds != ledstate) {
1136 input_handler_for_each_handle(&kbd_handler, &leds, 1136 input_handler_for_each_handle(&kbd_handler, &leds,
@@ -2035,11 +2035,11 @@ int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm)
2035 return -EPERM; 2035 return -EPERM;
2036 if (arg & ~0x77) 2036 if (arg & ~0x77)
2037 return -EINVAL; 2037 return -EINVAL;
2038 spin_lock_irqsave(&kbd_event_lock, flags); 2038 spin_lock_irqsave(&led_lock, flags);
2039 kbd->ledflagstate = (arg & 7); 2039 kbd->ledflagstate = (arg & 7);
2040 kbd->default_ledflagstate = ((arg >> 4) & 7); 2040 kbd->default_ledflagstate = ((arg >> 4) & 7);
2041 set_leds(); 2041 set_leds();
2042 spin_unlock_irqrestore(&kbd_event_lock, flags); 2042 spin_unlock_irqrestore(&led_lock, flags);
2043 return 0; 2043 return 0;
2044 2044
2045 /* the ioctls below only set the lights, not the functions */ 2045 /* the ioctls below only set the lights, not the functions */
@@ -2134,8 +2134,10 @@ void vt_reset_keyboard(int console)
2134 clr_vc_kbd_mode(kbd, VC_CRLF); 2134 clr_vc_kbd_mode(kbd, VC_CRLF);
2135 kbd->lockstate = 0; 2135 kbd->lockstate = 0;
2136 kbd->slockstate = 0; 2136 kbd->slockstate = 0;
2137 spin_lock(&led_lock);
2137 kbd->ledmode = LED_SHOW_FLAGS; 2138 kbd->ledmode = LED_SHOW_FLAGS;
2138 kbd->ledflagstate = kbd->default_ledflagstate; 2139 kbd->ledflagstate = kbd->default_ledflagstate;
2140 spin_unlock(&led_lock);
2139 /* do not do set_leds here because this causes an endless tasklet loop 2141 /* do not do set_leds here because this causes an endless tasklet loop
2140 when the keyboard hasn't been initialized yet */ 2142 when the keyboard hasn't been initialized yet */
2141 spin_unlock_irqrestore(&kbd_event_lock, flags); 2143 spin_unlock_irqrestore(&kbd_event_lock, flags);
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 84cbf298c094..e07ded30fc7f 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1380,7 +1380,7 @@ static void respond_string(const char *p, struct tty_struct *tty)
1380 tty_insert_flip_char(tty, *p, 0); 1380 tty_insert_flip_char(tty, *p, 0);
1381 p++; 1381 p++;
1382 } 1382 }
1383 con_schedule_flip(tty); 1383 tty_schedule_flip(tty);
1384} 1384}
1385 1385
1386static void cursor_report(struct vc_data *vc, struct tty_struct *tty) 1386static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
@@ -2792,41 +2792,52 @@ static void con_flush_chars(struct tty_struct *tty)
2792/* 2792/*
2793 * Allocate the console screen memory. 2793 * Allocate the console screen memory.
2794 */ 2794 */
2795static int con_open(struct tty_struct *tty, struct file *filp) 2795static int con_install(struct tty_driver *driver, struct tty_struct *tty)
2796{ 2796{
2797 unsigned int currcons = tty->index; 2797 unsigned int currcons = tty->index;
2798 int ret = 0; 2798 struct vc_data *vc;
2799 int ret;
2799 2800
2800 console_lock(); 2801 console_lock();
2801 if (tty->driver_data == NULL) { 2802 ret = vc_allocate(currcons);
2802 ret = vc_allocate(currcons); 2803 if (ret)
2803 if (ret == 0) { 2804 goto unlock;
2804 struct vc_data *vc = vc_cons[currcons].d;
2805 2805
2806 /* Still being freed */ 2806 vc = vc_cons[currcons].d;
2807 if (vc->port.tty) {
2808 console_unlock();
2809 return -ERESTARTSYS;
2810 }
2811 tty->driver_data = vc;
2812 vc->port.tty = tty;
2813 2807
2814 if (!tty->winsize.ws_row && !tty->winsize.ws_col) { 2808 /* Still being freed */
2815 tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; 2809 if (vc->port.tty) {
2816 tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; 2810 ret = -ERESTARTSYS;
2817 } 2811 goto unlock;
2818 if (vc->vc_utf)
2819 tty->termios->c_iflag |= IUTF8;
2820 else
2821 tty->termios->c_iflag &= ~IUTF8;
2822 console_unlock();
2823 return ret;
2824 }
2825 } 2812 }
2813
2814 ret = tty_port_install(&vc->port, driver, tty);
2815 if (ret)
2816 goto unlock;
2817
2818 tty->driver_data = vc;
2819 vc->port.tty = tty;
2820
2821 if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
2822 tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
2823 tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
2824 }
2825 if (vc->vc_utf)
2826 tty->termios.c_iflag |= IUTF8;
2827 else
2828 tty->termios.c_iflag &= ~IUTF8;
2829unlock:
2826 console_unlock(); 2830 console_unlock();
2827 return ret; 2831 return ret;
2828} 2832}
2829 2833
2834static int con_open(struct tty_struct *tty, struct file *filp)
2835{
2836 /* everything done in install */
2837 return 0;
2838}
2839
2840
2830static void con_close(struct tty_struct *tty, struct file *filp) 2841static void con_close(struct tty_struct *tty, struct file *filp)
2831{ 2842{
2832 /* Nothing to do - we defer to shutdown */ 2843 /* Nothing to do - we defer to shutdown */
@@ -2839,7 +2850,6 @@ static void con_shutdown(struct tty_struct *tty)
2839 console_lock(); 2850 console_lock();
2840 vc->port.tty = NULL; 2851 vc->port.tty = NULL;
2841 console_unlock(); 2852 console_unlock();
2842 tty_shutdown(tty);
2843} 2853}
2844 2854
2845static int default_italic_color = 2; // green (ASCII) 2855static int default_italic_color = 2; // green (ASCII)
@@ -2947,6 +2957,7 @@ static int __init con_init(void)
2947console_initcall(con_init); 2957console_initcall(con_init);
2948 2958
2949static const struct tty_operations con_ops = { 2959static const struct tty_operations con_ops = {
2960 .install = con_install,
2950 .open = con_open, 2961 .open = con_open,
2951 .close = con_close, 2962 .close = con_close,
2952 .write = con_write, 2963 .write = con_write,
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 56d6bf668488..18f4e62aaa75 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -826,7 +826,7 @@ static void acm_tty_set_termios(struct tty_struct *tty,
826 struct ktermios *termios_old) 826 struct ktermios *termios_old)
827{ 827{
828 struct acm *acm = tty->driver_data; 828 struct acm *acm = tty->driver_data;
829 struct ktermios *termios = tty->termios; 829 struct ktermios *termios = &tty->termios;
830 struct usb_cdc_line_coding newline; 830 struct usb_cdc_line_coding newline;
831 int newctrl = acm->ctrlout; 831 int newctrl = acm->ctrlout;
832 832
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
index f8ce97d8b0ad..3b98fb733362 100644
--- a/drivers/usb/serial/ark3116.c
+++ b/drivers/usb/serial/ark3116.c
@@ -215,7 +215,7 @@ static void ark3116_release(struct usb_serial *serial)
215 215
216static void ark3116_init_termios(struct tty_struct *tty) 216static void ark3116_init_termios(struct tty_struct *tty)
217{ 217{
218 struct ktermios *termios = tty->termios; 218 struct ktermios *termios = &tty->termios;
219 *termios = tty_std_termios; 219 *termios = tty_std_termios;
220 termios->c_cflag = B9600 | CS8 220 termios->c_cflag = B9600 | CS8
221 | CREAD | HUPCL | CLOCAL; 221 | CREAD | HUPCL | CLOCAL;
@@ -229,7 +229,7 @@ static void ark3116_set_termios(struct tty_struct *tty,
229{ 229{
230 struct usb_serial *serial = port->serial; 230 struct usb_serial *serial = port->serial;
231 struct ark3116_private *priv = usb_get_serial_port_data(port); 231 struct ark3116_private *priv = usb_get_serial_port_data(port);
232 struct ktermios *termios = tty->termios; 232 struct ktermios *termios = &tty->termios;
233 unsigned int cflag = termios->c_cflag; 233 unsigned int cflag = termios->c_cflag;
234 int bps = tty_get_baud_rate(tty); 234 int bps = tty_get_baud_rate(tty);
235 int quot; 235 int quot;
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
index 6b7365632951..a46df73ee96e 100644
--- a/drivers/usb/serial/belkin_sa.c
+++ b/drivers/usb/serial/belkin_sa.c
@@ -307,7 +307,7 @@ static void belkin_sa_set_termios(struct tty_struct *tty,
307 unsigned long control_state; 307 unsigned long control_state;
308 int bad_flow_control; 308 int bad_flow_control;
309 speed_t baud; 309 speed_t baud;
310 struct ktermios *termios = tty->termios; 310 struct ktermios *termios = &tty->termios;
311 311
312 iflag = termios->c_iflag; 312 iflag = termios->c_iflag;
313 cflag = termios->c_cflag; 313 cflag = termios->c_cflag;
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index 1e71079ce33b..ba5e07e188a0 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -469,7 +469,7 @@ static void cp210x_get_termios(struct tty_struct *tty,
469 469
470 if (tty) { 470 if (tty) {
471 cp210x_get_termios_port(tty->driver_data, 471 cp210x_get_termios_port(tty->driver_data,
472 &tty->termios->c_cflag, &baud); 472 &tty->termios.c_cflag, &baud);
473 tty_encode_baud_rate(tty, baud, baud); 473 tty_encode_baud_rate(tty, baud, baud);
474 } 474 }
475 475
@@ -631,7 +631,7 @@ static void cp210x_change_speed(struct tty_struct *tty,
631{ 631{
632 u32 baud; 632 u32 baud;
633 633
634 baud = tty->termios->c_ospeed; 634 baud = tty->termios.c_ospeed;
635 635
636 /* This maps the requested rate to a rate valid on cp2102 or cp2103, 636 /* This maps the requested rate to a rate valid on cp2102 or cp2103,
637 * or to an arbitrary rate in [1M,2M]. 637 * or to an arbitrary rate in [1M,2M].
@@ -665,10 +665,10 @@ static void cp210x_set_termios(struct tty_struct *tty,
665 if (!tty) 665 if (!tty)
666 return; 666 return;
667 667
668 cflag = tty->termios->c_cflag; 668 cflag = tty->termios.c_cflag;
669 old_cflag = old_termios->c_cflag; 669 old_cflag = old_termios->c_cflag;
670 670
671 if (tty->termios->c_ospeed != old_termios->c_ospeed) 671 if (tty->termios.c_ospeed != old_termios->c_ospeed)
672 cp210x_change_speed(tty, port, old_termios); 672 cp210x_change_speed(tty, port, old_termios);
673 673
674 /* If the number of data bits is to be updated */ 674 /* If the number of data bits is to be updated */
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index b78c34eb5d3f..be34f153e566 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -922,38 +922,38 @@ static void cypress_set_termios(struct tty_struct *tty,
922 early enough */ 922 early enough */
923 if (!priv->termios_initialized) { 923 if (!priv->termios_initialized) {
924 if (priv->chiptype == CT_EARTHMATE) { 924 if (priv->chiptype == CT_EARTHMATE) {
925 *(tty->termios) = tty_std_termios; 925 tty->termios = tty_std_termios;
926 tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | 926 tty->termios.c_cflag = B4800 | CS8 | CREAD | HUPCL |
927 CLOCAL; 927 CLOCAL;
928 tty->termios->c_ispeed = 4800; 928 tty->termios.c_ispeed = 4800;
929 tty->termios->c_ospeed = 4800; 929 tty->termios.c_ospeed = 4800;
930 } else if (priv->chiptype == CT_CYPHIDCOM) { 930 } else if (priv->chiptype == CT_CYPHIDCOM) {
931 *(tty->termios) = tty_std_termios; 931 tty->termios = tty_std_termios;
932 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | 932 tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
933 CLOCAL; 933 CLOCAL;
934 tty->termios->c_ispeed = 9600; 934 tty->termios.c_ispeed = 9600;
935 tty->termios->c_ospeed = 9600; 935 tty->termios.c_ospeed = 9600;
936 } else if (priv->chiptype == CT_CA42V2) { 936 } else if (priv->chiptype == CT_CA42V2) {
937 *(tty->termios) = tty_std_termios; 937 tty->termios = tty_std_termios;
938 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | 938 tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
939 CLOCAL; 939 CLOCAL;
940 tty->termios->c_ispeed = 9600; 940 tty->termios.c_ispeed = 9600;
941 tty->termios->c_ospeed = 9600; 941 tty->termios.c_ospeed = 9600;
942 } 942 }
943 priv->termios_initialized = 1; 943 priv->termios_initialized = 1;
944 } 944 }
945 spin_unlock_irqrestore(&priv->lock, flags); 945 spin_unlock_irqrestore(&priv->lock, flags);
946 946
947 /* Unsupported features need clearing */ 947 /* Unsupported features need clearing */
948 tty->termios->c_cflag &= ~(CMSPAR|CRTSCTS); 948 tty->termios.c_cflag &= ~(CMSPAR|CRTSCTS);
949 949
950 cflag = tty->termios->c_cflag; 950 cflag = tty->termios.c_cflag;
951 iflag = tty->termios->c_iflag; 951 iflag = tty->termios.c_iflag;
952 952
953 /* check if there are new settings */ 953 /* check if there are new settings */
954 if (old_termios) { 954 if (old_termios) {
955 spin_lock_irqsave(&priv->lock, flags); 955 spin_lock_irqsave(&priv->lock, flags);
956 priv->tmp_termios = *(tty->termios); 956 priv->tmp_termios = tty->termios;
957 spin_unlock_irqrestore(&priv->lock, flags); 957 spin_unlock_irqrestore(&priv->lock, flags);
958 } 958 }
959 959
@@ -1021,7 +1021,7 @@ static void cypress_set_termios(struct tty_struct *tty,
1021 "4800bps."); 1021 "4800bps.");
1022 /* define custom termios settings for NMEA protocol */ 1022 /* define custom termios settings for NMEA protocol */
1023 1023
1024 tty->termios->c_iflag /* input modes - */ 1024 tty->termios.c_iflag /* input modes - */
1025 &= ~(IGNBRK /* disable ignore break */ 1025 &= ~(IGNBRK /* disable ignore break */
1026 | BRKINT /* disable break causes interrupt */ 1026 | BRKINT /* disable break causes interrupt */
1027 | PARMRK /* disable mark parity errors */ 1027 | PARMRK /* disable mark parity errors */
@@ -1031,10 +1031,10 @@ static void cypress_set_termios(struct tty_struct *tty,
1031 | ICRNL /* disable translate CR to NL */ 1031 | ICRNL /* disable translate CR to NL */
1032 | IXON); /* disable enable XON/XOFF flow control */ 1032 | IXON); /* disable enable XON/XOFF flow control */
1033 1033
1034 tty->termios->c_oflag /* output modes */ 1034 tty->termios.c_oflag /* output modes */
1035 &= ~OPOST; /* disable postprocess output char */ 1035 &= ~OPOST; /* disable postprocess output char */
1036 1036
1037 tty->termios->c_lflag /* line discipline modes */ 1037 tty->termios.c_lflag /* line discipline modes */
1038 &= ~(ECHO /* disable echo input characters */ 1038 &= ~(ECHO /* disable echo input characters */
1039 | ECHONL /* disable echo new line */ 1039 | ECHONL /* disable echo new line */
1040 | ICANON /* disable erase, kill, werase, and rprnt 1040 | ICANON /* disable erase, kill, werase, and rprnt
@@ -1200,7 +1200,7 @@ static void cypress_read_int_callback(struct urb *urb)
1200 1200
1201 /* hangup, as defined in acm.c... this might be a bad place for it 1201 /* hangup, as defined in acm.c... this might be a bad place for it
1202 * though */ 1202 * though */
1203 if (tty && !(tty->termios->c_cflag & CLOCAL) && 1203 if (tty && !(tty->termios.c_cflag & CLOCAL) &&
1204 !(priv->current_status & UART_CD)) { 1204 !(priv->current_status & UART_CD)) {
1205 dbg("%s - calling hangup", __func__); 1205 dbg("%s - calling hangup", __func__);
1206 tty_hangup(tty); 1206 tty_hangup(tty);
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
index b5cd838093ef..afd9d2ec577b 100644
--- a/drivers/usb/serial/digi_acceleport.c
+++ b/drivers/usb/serial/digi_acceleport.c
@@ -687,8 +687,8 @@ static void digi_set_termios(struct tty_struct *tty,
687 struct usb_serial_port *port, struct ktermios *old_termios) 687 struct usb_serial_port *port, struct ktermios *old_termios)
688{ 688{
689 struct digi_port *priv = usb_get_serial_port_data(port); 689 struct digi_port *priv = usb_get_serial_port_data(port);
690 unsigned int iflag = tty->termios->c_iflag; 690 unsigned int iflag = tty->termios.c_iflag;
691 unsigned int cflag = tty->termios->c_cflag; 691 unsigned int cflag = tty->termios.c_cflag;
692 unsigned int old_iflag = old_termios->c_iflag; 692 unsigned int old_iflag = old_termios->c_iflag;
693 unsigned int old_cflag = old_termios->c_cflag; 693 unsigned int old_cflag = old_termios->c_cflag;
694 unsigned char buf[32]; 694 unsigned char buf[32];
@@ -709,7 +709,7 @@ static void digi_set_termios(struct tty_struct *tty,
709 /* don't set RTS if using hardware flow control */ 709 /* don't set RTS if using hardware flow control */
710 /* and throttling input */ 710 /* and throttling input */
711 modem_signals = TIOCM_DTR; 711 modem_signals = TIOCM_DTR;
712 if (!(tty->termios->c_cflag & CRTSCTS) || 712 if (!(tty->termios.c_cflag & CRTSCTS) ||
713 !test_bit(TTY_THROTTLED, &tty->flags)) 713 !test_bit(TTY_THROTTLED, &tty->flags))
714 modem_signals |= TIOCM_RTS; 714 modem_signals |= TIOCM_RTS;
715 digi_set_modem_signals(port, modem_signals, 1); 715 digi_set_modem_signals(port, modem_signals, 1);
@@ -748,7 +748,7 @@ static void digi_set_termios(struct tty_struct *tty,
748 } 748 }
749 } 749 }
750 /* set parity */ 750 /* set parity */
751 tty->termios->c_cflag &= ~CMSPAR; 751 tty->termios.c_cflag &= ~CMSPAR;
752 752
753 if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) { 753 if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) {
754 if (cflag&PARENB) { 754 if (cflag&PARENB) {
@@ -1124,8 +1124,8 @@ static int digi_open(struct tty_struct *tty, struct usb_serial_port *port)
1124 1124
1125 /* set termios settings */ 1125 /* set termios settings */
1126 if (tty) { 1126 if (tty) {
1127 not_termios.c_cflag = ~tty->termios->c_cflag; 1127 not_termios.c_cflag = ~tty->termios.c_cflag;
1128 not_termios.c_iflag = ~tty->termios->c_iflag; 1128 not_termios.c_iflag = ~tty->termios.c_iflag;
1129 digi_set_termios(tty, port, &not_termios); 1129 digi_set_termios(tty, port, &not_termios);
1130 } 1130 }
1131 return 0; 1131 return 0;
@@ -1500,7 +1500,7 @@ static int digi_read_oob_callback(struct urb *urb)
1500 1500
1501 rts = 0; 1501 rts = 0;
1502 if (tty) 1502 if (tty)
1503 rts = tty->termios->c_cflag & CRTSCTS; 1503 rts = tty->termios.c_cflag & CRTSCTS;
1504 1504
1505 if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) { 1505 if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
1506 spin_lock(&priv->dp_port_lock); 1506 spin_lock(&priv->dp_port_lock);
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
index cdf61dd07318..34e86383090a 100644
--- a/drivers/usb/serial/empeg.c
+++ b/drivers/usb/serial/empeg.c
@@ -87,7 +87,7 @@ static int empeg_startup(struct usb_serial *serial)
87 87
88static void empeg_init_termios(struct tty_struct *tty) 88static void empeg_init_termios(struct tty_struct *tty)
89{ 89{
90 struct ktermios *termios = tty->termios; 90 struct ktermios *termios = &tty->termios;
91 91
92 /* 92 /*
93 * The empeg-car player wants these particular tty settings. 93 * The empeg-car player wants these particular tty settings.
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c
index 499b15fd82f1..79451ee12ca0 100644
--- a/drivers/usb/serial/f81232.c
+++ b/drivers/usb/serial/f81232.c
@@ -173,10 +173,11 @@ static void f81232_set_termios(struct tty_struct *tty,
173 /* FIXME - Stubbed out for now */ 173 /* FIXME - Stubbed out for now */
174 174
175 /* Don't change anything if nothing has changed */ 175 /* Don't change anything if nothing has changed */
176 if (!tty_termios_hw_change(tty->termios, old_termios)) 176 if (!tty_termios_hw_change(&tty->termios, old_termios))
177 return; 177 return;
178 178
179 /* Do the real work here... */ 179 /* Do the real work here... */
180 tty_termios_copy_hw(&tty->termios, old_termios);
180} 181}
181 182
182static int f81232_tiocmget(struct tty_struct *tty) 183static int f81232_tiocmget(struct tty_struct *tty)
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index bc912e5a3beb..4b8b41a3351f 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -2081,7 +2081,7 @@ static void ftdi_set_termios(struct tty_struct *tty,
2081{ 2081{
2082 struct usb_device *dev = port->serial->dev; 2082 struct usb_device *dev = port->serial->dev;
2083 struct ftdi_private *priv = usb_get_serial_port_data(port); 2083 struct ftdi_private *priv = usb_get_serial_port_data(port);
2084 struct ktermios *termios = tty->termios; 2084 struct ktermios *termios = &tty->termios;
2085 unsigned int cflag = termios->c_cflag; 2085 unsigned int cflag = termios->c_cflag;
2086 __u16 urb_value; /* will hold the new flags */ 2086 __u16 urb_value; /* will hold the new flags */
2087 2087
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index e1f5ccd1e8f8..f435575c4e6e 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -1458,7 +1458,7 @@ static void edge_throttle(struct tty_struct *tty)
1458 } 1458 }
1459 1459
1460 /* if we are implementing RTS/CTS, toggle that line */ 1460 /* if we are implementing RTS/CTS, toggle that line */
1461 if (tty->termios->c_cflag & CRTSCTS) { 1461 if (tty->termios.c_cflag & CRTSCTS) {
1462 edge_port->shadowMCR &= ~MCR_RTS; 1462 edge_port->shadowMCR &= ~MCR_RTS;
1463 status = send_cmd_write_uart_register(edge_port, MCR, 1463 status = send_cmd_write_uart_register(edge_port, MCR,
1464 edge_port->shadowMCR); 1464 edge_port->shadowMCR);
@@ -1497,7 +1497,7 @@ static void edge_unthrottle(struct tty_struct *tty)
1497 return; 1497 return;
1498 } 1498 }
1499 /* if we are implementing RTS/CTS, toggle that line */ 1499 /* if we are implementing RTS/CTS, toggle that line */
1500 if (tty->termios->c_cflag & CRTSCTS) { 1500 if (tty->termios.c_cflag & CRTSCTS) {
1501 edge_port->shadowMCR |= MCR_RTS; 1501 edge_port->shadowMCR |= MCR_RTS;
1502 send_cmd_write_uart_register(edge_port, MCR, 1502 send_cmd_write_uart_register(edge_port, MCR,
1503 edge_port->shadowMCR); 1503 edge_port->shadowMCR);
@@ -1516,9 +1516,9 @@ static void edge_set_termios(struct tty_struct *tty,
1516 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 1516 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1517 unsigned int cflag; 1517 unsigned int cflag;
1518 1518
1519 cflag = tty->termios->c_cflag; 1519 cflag = tty->termios.c_cflag;
1520 dbg("%s - clfag %08x iflag %08x", __func__, 1520 dbg("%s - clfag %08x iflag %08x", __func__,
1521 tty->termios->c_cflag, tty->termios->c_iflag); 1521 tty->termios.c_cflag, tty->termios.c_iflag);
1522 dbg("%s - old clfag %08x old iflag %08x", __func__, 1522 dbg("%s - old clfag %08x old iflag %08x", __func__,
1523 old_termios->c_cflag, old_termios->c_iflag); 1523 old_termios->c_cflag, old_termios->c_iflag);
1524 1524
@@ -1987,7 +1987,7 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,
1987 tty = tty_port_tty_get(&edge_port->port->port); 1987 tty = tty_port_tty_get(&edge_port->port->port);
1988 if (tty) { 1988 if (tty) {
1989 change_port_settings(tty, 1989 change_port_settings(tty,
1990 edge_port, tty->termios); 1990 edge_port, &tty->termios);
1991 tty_kref_put(tty); 1991 tty_kref_put(tty);
1992 } 1992 }
1993 1993
@@ -2570,7 +2570,7 @@ static void change_port_settings(struct tty_struct *tty,
2570 return; 2570 return;
2571 } 2571 }
2572 2572
2573 cflag = tty->termios->c_cflag; 2573 cflag = tty->termios.c_cflag;
2574 2574
2575 switch (cflag & CSIZE) { 2575 switch (cflag & CSIZE) {
2576 case CS5: 2576 case CS5:
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
index 3936904c6419..765978ae752e 100644
--- a/drivers/usb/serial/io_ti.c
+++ b/drivers/usb/serial/io_ti.c
@@ -1870,7 +1870,7 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port)
1870 1870
1871 /* set up the port settings */ 1871 /* set up the port settings */
1872 if (tty) 1872 if (tty)
1873 edge_set_termios(tty, port, tty->termios); 1873 edge_set_termios(tty, port, &tty->termios);
1874 1874
1875 /* open up the port */ 1875 /* open up the port */
1876 1876
@@ -2272,13 +2272,13 @@ static void change_port_settings(struct tty_struct *tty,
2272 2272
2273 config = kmalloc (sizeof (*config), GFP_KERNEL); 2273 config = kmalloc (sizeof (*config), GFP_KERNEL);
2274 if (!config) { 2274 if (!config) {
2275 *tty->termios = *old_termios; 2275 tty->termios = *old_termios;
2276 dev_err(&edge_port->port->dev, "%s - out of memory\n", 2276 dev_err(&edge_port->port->dev, "%s - out of memory\n",
2277 __func__); 2277 __func__);
2278 return; 2278 return;
2279 } 2279 }
2280 2280
2281 cflag = tty->termios->c_cflag; 2281 cflag = tty->termios.c_cflag;
2282 2282
2283 config->wFlags = 0; 2283 config->wFlags = 0;
2284 2284
@@ -2362,7 +2362,7 @@ static void change_port_settings(struct tty_struct *tty,
2362 } else 2362 } else
2363 dbg("%s - OUTBOUND XON/XOFF is disabled", __func__); 2363 dbg("%s - OUTBOUND XON/XOFF is disabled", __func__);
2364 2364
2365 tty->termios->c_cflag &= ~CMSPAR; 2365 tty->termios.c_cflag &= ~CMSPAR;
2366 2366
2367 /* Round the baud rate */ 2367 /* Round the baud rate */
2368 baud = tty_get_baud_rate(tty); 2368 baud = tty_get_baud_rate(tty);
@@ -2408,10 +2408,10 @@ static void edge_set_termios(struct tty_struct *tty,
2408 struct edgeport_port *edge_port = usb_get_serial_port_data(port); 2408 struct edgeport_port *edge_port = usb_get_serial_port_data(port);
2409 unsigned int cflag; 2409 unsigned int cflag;
2410 2410
2411 cflag = tty->termios->c_cflag; 2411 cflag = tty->termios.c_cflag;
2412 2412
2413 dbg("%s - clfag %08x iflag %08x", __func__, 2413 dbg("%s - clfag %08x iflag %08x", __func__,
2414 tty->termios->c_cflag, tty->termios->c_iflag); 2414 tty->termios.c_cflag, tty->termios.c_iflag);
2415 dbg("%s - old clfag %08x old iflag %08x", __func__, 2415 dbg("%s - old clfag %08x old iflag %08x", __func__,
2416 old_termios->c_cflag, old_termios->c_iflag); 2416 old_termios->c_cflag, old_termios->c_iflag);
2417 dbg("%s - port %d", __func__, port->number); 2417 dbg("%s - port %d", __func__, port->number);
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
index fc09414c960f..5a96692b12a2 100644
--- a/drivers/usb/serial/ir-usb.c
+++ b/drivers/usb/serial/ir-usb.c
@@ -381,7 +381,7 @@ static void ir_set_termios(struct tty_struct *tty,
381 ir_xbof = ir_xbof_change(xbof) ; 381 ir_xbof = ir_xbof_change(xbof) ;
382 382
383 /* Only speed changes are supported */ 383 /* Only speed changes are supported */
384 tty_termios_copy_hw(tty->termios, old_termios); 384 tty_termios_copy_hw(&tty->termios, old_termios);
385 tty_encode_baud_rate(tty, baud, baud); 385 tty_encode_baud_rate(tty, baud, baud);
386 386
387 /* 387 /*
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
index 22b1eb5040b7..bf3864045c18 100644
--- a/drivers/usb/serial/iuu_phoenix.c
+++ b/drivers/usb/serial/iuu_phoenix.c
@@ -921,7 +921,7 @@ static void iuu_set_termios(struct tty_struct *tty,
921{ 921{
922 const u32 supported_mask = CMSPAR|PARENB|PARODD; 922 const u32 supported_mask = CMSPAR|PARENB|PARODD;
923 struct iuu_private *priv = usb_get_serial_port_data(port); 923 struct iuu_private *priv = usb_get_serial_port_data(port);
924 unsigned int cflag = tty->termios->c_cflag; 924 unsigned int cflag = tty->termios.c_cflag;
925 int status; 925 int status;
926 u32 actual; 926 u32 actual;
927 u32 parity; 927 u32 parity;
@@ -930,7 +930,7 @@ static void iuu_set_termios(struct tty_struct *tty,
930 u32 newval = cflag & supported_mask; 930 u32 newval = cflag & supported_mask;
931 931
932 /* Just use the ospeed. ispeed should be the same. */ 932 /* Just use the ospeed. ispeed should be the same. */
933 baud = tty->termios->c_ospeed; 933 baud = tty->termios.c_ospeed;
934 934
935 dbg("%s - enter c_ospeed or baud=%d", __func__, baud); 935 dbg("%s - enter c_ospeed or baud=%d", __func__, baud);
936 936
@@ -961,13 +961,13 @@ static void iuu_set_termios(struct tty_struct *tty,
961 * settings back over and then adjust them 961 * settings back over and then adjust them
962 */ 962 */
963 if (old_termios) 963 if (old_termios)
964 tty_termios_copy_hw(tty->termios, old_termios); 964 tty_termios_copy_hw(&tty->termios, old_termios);
965 if (status != 0) /* Set failed - return old bits */ 965 if (status != 0) /* Set failed - return old bits */
966 return; 966 return;
967 /* Re-encode speed, parity and csize */ 967 /* Re-encode speed, parity and csize */
968 tty_encode_baud_rate(tty, baud, baud); 968 tty_encode_baud_rate(tty, baud, baud);
969 tty->termios->c_cflag &= ~(supported_mask|CSIZE); 969 tty->termios.c_cflag &= ~(supported_mask|CSIZE);
970 tty->termios->c_cflag |= newval | csize; 970 tty->termios.c_cflag |= newval | csize;
971} 971}
972 972
973static void iuu_close(struct usb_serial_port *port) 973static void iuu_close(struct usb_serial_port *port)
@@ -993,14 +993,14 @@ static void iuu_close(struct usb_serial_port *port)
993 993
994static void iuu_init_termios(struct tty_struct *tty) 994static void iuu_init_termios(struct tty_struct *tty)
995{ 995{
996 *(tty->termios) = tty_std_termios; 996 tty->termios = tty_std_termios;
997 tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600 997 tty->termios.c_cflag = CLOCAL | CREAD | CS8 | B9600
998 | TIOCM_CTS | CSTOPB | PARENB; 998 | TIOCM_CTS | CSTOPB | PARENB;
999 tty->termios->c_ispeed = 9600; 999 tty->termios.c_ispeed = 9600;
1000 tty->termios->c_ospeed = 9600; 1000 tty->termios.c_ospeed = 9600;
1001 tty->termios->c_lflag = 0; 1001 tty->termios.c_lflag = 0;
1002 tty->termios->c_oflag = 0; 1002 tty->termios.c_oflag = 0;
1003 tty->termios->c_iflag = 0; 1003 tty->termios.c_iflag = 0;
1004} 1004}
1005 1005
1006static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port) 1006static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port)
@@ -1012,8 +1012,8 @@ static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port)
1012 u32 actual; 1012 u32 actual;
1013 struct iuu_private *priv = usb_get_serial_port_data(port); 1013 struct iuu_private *priv = usb_get_serial_port_data(port);
1014 1014
1015 baud = tty->termios->c_ospeed; 1015 baud = tty->termios.c_ospeed;
1016 tty->termios->c_ispeed = baud; 1016 tty->termios.c_ispeed = baud;
1017 /* Re-encode speed */ 1017 /* Re-encode speed */
1018 tty_encode_baud_rate(tty, baud, baud); 1018 tty_encode_baud_rate(tty, baud, baud);
1019 1019
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index af0b70eaf032..7bcbb47e1449 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -158,7 +158,7 @@ static void keyspan_set_termios(struct tty_struct *tty,
158 158
159 p_priv = usb_get_serial_port_data(port); 159 p_priv = usb_get_serial_port_data(port);
160 d_details = p_priv->device_details; 160 d_details = p_priv->device_details;
161 cflag = tty->termios->c_cflag; 161 cflag = tty->termios.c_cflag;
162 device_port = port->number - port->serial->minor; 162 device_port = port->number - port->serial->minor;
163 163
164 /* Baud rate calculation takes baud rate as an integer 164 /* Baud rate calculation takes baud rate as an integer
@@ -179,7 +179,7 @@ static void keyspan_set_termios(struct tty_struct *tty,
179 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none; 179 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
180 180
181 /* Mark/Space not supported */ 181 /* Mark/Space not supported */
182 tty->termios->c_cflag &= ~CMSPAR; 182 tty->termios.c_cflag &= ~CMSPAR;
183 183
184 keyspan_send_setup(port, 0); 184 keyspan_send_setup(port, 0);
185} 185}
@@ -1086,7 +1086,7 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
1086 1086
1087 device_port = port->number - port->serial->minor; 1087 device_port = port->number - port->serial->minor;
1088 if (tty) { 1088 if (tty) {
1089 cflag = tty->termios->c_cflag; 1089 cflag = tty->termios.c_cflag;
1090 /* Baud rate calculation takes baud rate as an integer 1090 /* Baud rate calculation takes baud rate as an integer
1091 so other rates can be generated if desired. */ 1091 so other rates can be generated if desired. */
1092 baud_rate = tty_get_baud_rate(tty); 1092 baud_rate = tty_get_baud_rate(tty);
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
index a4ac3cfeffc4..dcada8615fcf 100644
--- a/drivers/usb/serial/keyspan_pda.c
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -338,7 +338,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty,
338 7[EOMS]1: 10 bit, b0/b7 is parity 338 7[EOMS]1: 10 bit, b0/b7 is parity
339 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?) 339 7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)
340 340
341 HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS 341 HW flow control is dictated by the tty->termios.c_cflags & CRTSCTS
342 bit. 342 bit.
343 343
344 For now, just do baud. */ 344 For now, just do baud. */
@@ -353,7 +353,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty,
353 } 353 }
354 /* Only speed can change so copy the old h/w parameters 354 /* Only speed can change so copy the old h/w parameters
355 then encode the new speed */ 355 then encode the new speed */
356 tty_termios_copy_hw(tty->termios, old_termios); 356 tty_termios_copy_hw(&tty->termios, old_termios);
357 tty_encode_baud_rate(tty, speed, speed); 357 tty_encode_baud_rate(tty, speed, speed);
358} 358}
359 359
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
index 5bed59cd5776..def9ad258715 100644
--- a/drivers/usb/serial/kl5kusb105.c
+++ b/drivers/usb/serial/kl5kusb105.c
@@ -311,12 +311,12 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
311 311
312 /* set up termios structure */ 312 /* set up termios structure */
313 spin_lock_irqsave(&priv->lock, flags); 313 spin_lock_irqsave(&priv->lock, flags);
314 priv->termios.c_iflag = tty->termios->c_iflag; 314 priv->termios.c_iflag = tty->termios.c_iflag;
315 priv->termios.c_oflag = tty->termios->c_oflag; 315 priv->termios.c_oflag = tty->termios.c_oflag;
316 priv->termios.c_cflag = tty->termios->c_cflag; 316 priv->termios.c_cflag = tty->termios.c_cflag;
317 priv->termios.c_lflag = tty->termios->c_lflag; 317 priv->termios.c_lflag = tty->termios.c_lflag;
318 for (i = 0; i < NCCS; i++) 318 for (i = 0; i < NCCS; i++)
319 priv->termios.c_cc[i] = tty->termios->c_cc[i]; 319 priv->termios.c_cc[i] = tty->termios.c_cc[i];
320 priv->cfg.pktlen = cfg->pktlen; 320 priv->cfg.pktlen = cfg->pktlen;
321 priv->cfg.baudrate = cfg->baudrate; 321 priv->cfg.baudrate = cfg->baudrate;
322 priv->cfg.databits = cfg->databits; 322 priv->cfg.databits = cfg->databits;
@@ -445,9 +445,9 @@ static void klsi_105_set_termios(struct tty_struct *tty,
445 struct ktermios *old_termios) 445 struct ktermios *old_termios)
446{ 446{
447 struct klsi_105_private *priv = usb_get_serial_port_data(port); 447 struct klsi_105_private *priv = usb_get_serial_port_data(port);
448 unsigned int iflag = tty->termios->c_iflag; 448 unsigned int iflag = tty->termios.c_iflag;
449 unsigned int old_iflag = old_termios->c_iflag; 449 unsigned int old_iflag = old_termios->c_iflag;
450 unsigned int cflag = tty->termios->c_cflag; 450 unsigned int cflag = tty->termios.c_cflag;
451 unsigned int old_cflag = old_termios->c_cflag; 451 unsigned int old_cflag = old_termios->c_cflag;
452 struct klsi_105_port_settings *cfg; 452 struct klsi_105_port_settings *cfg;
453 unsigned long flags; 453 unsigned long flags;
@@ -560,7 +560,7 @@ static void klsi_105_set_termios(struct tty_struct *tty,
560 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD)) 560 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
561 || (cflag & CSTOPB) != (old_cflag & CSTOPB)) { 561 || (cflag & CSTOPB) != (old_cflag & CSTOPB)) {
562 /* Not currently supported */ 562 /* Not currently supported */
563 tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB); 563 tty->termios.c_cflag &= ~(PARENB|PARODD|CSTOPB);
564#if 0 564#if 0
565 priv->last_lcr = 0; 565 priv->last_lcr = 0;
566 566
@@ -587,7 +587,7 @@ static void klsi_105_set_termios(struct tty_struct *tty,
587 || (iflag & IXON) != (old_iflag & IXON) 587 || (iflag & IXON) != (old_iflag & IXON)
588 || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { 588 || (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
589 /* Not currently supported */ 589 /* Not currently supported */
590 tty->termios->c_cflag &= ~CRTSCTS; 590 tty->termios.c_cflag &= ~CRTSCTS;
591 /* Drop DTR/RTS if no flow control otherwise assert */ 591 /* Drop DTR/RTS if no flow control otherwise assert */
592#if 0 592#if 0
593 if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS)) 593 if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS))
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
index fafeabb64c55..bf5c74965d34 100644
--- a/drivers/usb/serial/kobil_sct.c
+++ b/drivers/usb/serial/kobil_sct.c
@@ -191,11 +191,11 @@ static void kobil_release(struct usb_serial *serial)
191static void kobil_init_termios(struct tty_struct *tty) 191static void kobil_init_termios(struct tty_struct *tty)
192{ 192{
193 /* Default to echo off and other sane device settings */ 193 /* Default to echo off and other sane device settings */
194 tty->termios->c_lflag = 0; 194 tty->termios.c_lflag = 0;
195 tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE); 195 tty->termios.c_iflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
196 tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF; 196 tty->termios.c_iflag |= IGNBRK | IGNPAR | IXOFF;
197 /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */ 197 /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */
198 tty->termios->c_oflag &= ~ONLCR; 198 tty->termios.c_oflag &= ~ONLCR;
199} 199}
200 200
201static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port) 201static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port)
@@ -581,14 +581,14 @@ static void kobil_set_termios(struct tty_struct *tty,
581 struct kobil_private *priv; 581 struct kobil_private *priv;
582 int result; 582 int result;
583 unsigned short urb_val = 0; 583 unsigned short urb_val = 0;
584 int c_cflag = tty->termios->c_cflag; 584 int c_cflag = tty->termios.c_cflag;
585 speed_t speed; 585 speed_t speed;
586 586
587 priv = usb_get_serial_port_data(port); 587 priv = usb_get_serial_port_data(port);
588 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID || 588 if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID ||
589 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) { 589 priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
590 /* This device doesn't support ioctl calls */ 590 /* This device doesn't support ioctl calls */
591 *tty->termios = *old; 591 tty_termios_copy_hw(&tty->termios, old);
592 return; 592 return;
593 } 593 }
594 594
@@ -612,7 +612,7 @@ static void kobil_set_termios(struct tty_struct *tty,
612 urb_val |= SUSBCR_SPASB_EvenParity; 612 urb_val |= SUSBCR_SPASB_EvenParity;
613 } else 613 } else
614 urb_val |= SUSBCR_SPASB_NoParity; 614 urb_val |= SUSBCR_SPASB_NoParity;
615 tty->termios->c_cflag &= ~CMSPAR; 615 tty->termios.c_cflag &= ~CMSPAR;
616 tty_encode_baud_rate(tty, speed, speed); 616 tty_encode_baud_rate(tty, speed, speed);
617 617
618 result = usb_control_msg(port->serial->dev, 618 result = usb_control_msg(port->serial->dev,
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
index a71fa0aa0406..df98cffdba65 100644
--- a/drivers/usb/serial/mct_u232.c
+++ b/drivers/usb/serial/mct_u232.c
@@ -454,7 +454,7 @@ static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port)
454 * either. 454 * either.
455 */ 455 */
456 spin_lock_irqsave(&priv->lock, flags); 456 spin_lock_irqsave(&priv->lock, flags);
457 if (tty && (tty->termios->c_cflag & CBAUD)) 457 if (tty && (tty->termios.c_cflag & CBAUD))
458 priv->control_state = TIOCM_DTR | TIOCM_RTS; 458 priv->control_state = TIOCM_DTR | TIOCM_RTS;
459 else 459 else
460 priv->control_state = 0; 460 priv->control_state = 0;
@@ -634,7 +634,7 @@ static void mct_u232_set_termios(struct tty_struct *tty,
634{ 634{
635 struct usb_serial *serial = port->serial; 635 struct usb_serial *serial = port->serial;
636 struct mct_u232_private *priv = usb_get_serial_port_data(port); 636 struct mct_u232_private *priv = usb_get_serial_port_data(port);
637 struct ktermios *termios = tty->termios; 637 struct ktermios *termios = &tty->termios;
638 unsigned int cflag = termios->c_cflag; 638 unsigned int cflag = termios->c_cflag;
639 unsigned int old_cflag = old_termios->c_cflag; 639 unsigned int old_cflag = old_termios->c_cflag;
640 unsigned long flags; 640 unsigned long flags;
diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c
index d47eb06fe463..7ae9af6b2a54 100644
--- a/drivers/usb/serial/metro-usb.c
+++ b/drivers/usb/serial/metro-usb.c
@@ -130,20 +130,14 @@ static void metrousb_read_int_callback(struct urb *urb)
130 130
131 /* Set the data read from the usb port into the serial port buffer. */ 131 /* Set the data read from the usb port into the serial port buffer. */
132 tty = tty_port_tty_get(&port->port); 132 tty = tty_port_tty_get(&port->port);
133 if (!tty) {
134 dev_err(&port->dev, "%s - bad tty pointer - exiting\n",
135 __func__);
136 return;
137 }
138
139 if (tty && urb->actual_length) { 133 if (tty && urb->actual_length) {
140 /* Loop through the data copying each byte to the tty layer. */ 134 /* Loop through the data copying each byte to the tty layer. */
141 tty_insert_flip_string(tty, data, urb->actual_length); 135 tty_insert_flip_string(tty, data, urb->actual_length);
142 136
143 /* Force the data to the tty layer. */ 137 /* Force the data to the tty layer. */
144 tty_flip_buffer_push(tty); 138 tty_flip_buffer_push(tty);
139 tty_kref_put(tty);
145 } 140 }
146 tty_kref_put(tty);
147 141
148 /* Set any port variables. */ 142 /* Set any port variables. */
149 spin_lock_irqsave(&metro_priv->lock, flags); 143 spin_lock_irqsave(&metro_priv->lock, flags);
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index a07dd3c8cfef..012f67b2e4cc 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -1349,7 +1349,7 @@ static void mos7720_throttle(struct tty_struct *tty)
1349 } 1349 }
1350 1350
1351 /* if we are implementing RTS/CTS, toggle that line */ 1351 /* if we are implementing RTS/CTS, toggle that line */
1352 if (tty->termios->c_cflag & CRTSCTS) { 1352 if (tty->termios.c_cflag & CRTSCTS) {
1353 mos7720_port->shadowMCR &= ~UART_MCR_RTS; 1353 mos7720_port->shadowMCR &= ~UART_MCR_RTS;
1354 write_mos_reg(port->serial, port->number - port->serial->minor, 1354 write_mos_reg(port->serial, port->number - port->serial->minor,
1355 MCR, mos7720_port->shadowMCR); 1355 MCR, mos7720_port->shadowMCR);
@@ -1383,7 +1383,7 @@ static void mos7720_unthrottle(struct tty_struct *tty)
1383 } 1383 }
1384 1384
1385 /* if we are implementing RTS/CTS, toggle that line */ 1385 /* if we are implementing RTS/CTS, toggle that line */
1386 if (tty->termios->c_cflag & CRTSCTS) { 1386 if (tty->termios.c_cflag & CRTSCTS) {
1387 mos7720_port->shadowMCR |= UART_MCR_RTS; 1387 mos7720_port->shadowMCR |= UART_MCR_RTS;
1388 write_mos_reg(port->serial, port->number - port->serial->minor, 1388 write_mos_reg(port->serial, port->number - port->serial->minor,
1389 MCR, mos7720_port->shadowMCR); 1389 MCR, mos7720_port->shadowMCR);
@@ -1604,8 +1604,8 @@ static void change_port_settings(struct tty_struct *tty,
1604 lStop = 0x00; /* 1 stop bit */ 1604 lStop = 0x00; /* 1 stop bit */
1605 lParity = 0x00; /* No parity */ 1605 lParity = 0x00; /* No parity */
1606 1606
1607 cflag = tty->termios->c_cflag; 1607 cflag = tty->termios.c_cflag;
1608 iflag = tty->termios->c_iflag; 1608 iflag = tty->termios.c_iflag;
1609 1609
1610 /* Change the number of bits */ 1610 /* Change the number of bits */
1611 switch (cflag & CSIZE) { 1611 switch (cflag & CSIZE) {
@@ -1753,11 +1753,11 @@ static void mos7720_set_termios(struct tty_struct *tty,
1753 1753
1754 dbg("%s\n", "setting termios - ASPIRE"); 1754 dbg("%s\n", "setting termios - ASPIRE");
1755 1755
1756 cflag = tty->termios->c_cflag; 1756 cflag = tty->termios.c_cflag;
1757 1757
1758 dbg("%s - cflag %08x iflag %08x", __func__, 1758 dbg("%s - cflag %08x iflag %08x", __func__,
1759 tty->termios->c_cflag, 1759 tty->termios.c_cflag,
1760 RELEVANT_IFLAG(tty->termios->c_iflag)); 1760 RELEVANT_IFLAG(tty->termios.c_iflag));
1761 1761
1762 dbg("%s - old cflag %08x old iflag %08x", __func__, 1762 dbg("%s - old cflag %08x old iflag %08x", __func__,
1763 old_termios->c_cflag, 1763 old_termios->c_cflag,
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 57eca2448424..d2f2b5d65732 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -1649,7 +1649,7 @@ static void mos7840_throttle(struct tty_struct *tty)
1649 return; 1649 return;
1650 } 1650 }
1651 /* if we are implementing RTS/CTS, toggle that line */ 1651 /* if we are implementing RTS/CTS, toggle that line */
1652 if (tty->termios->c_cflag & CRTSCTS) { 1652 if (tty->termios.c_cflag & CRTSCTS) {
1653 mos7840_port->shadowMCR &= ~MCR_RTS; 1653 mos7840_port->shadowMCR &= ~MCR_RTS;
1654 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 1654 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1655 mos7840_port->shadowMCR); 1655 mos7840_port->shadowMCR);
@@ -1692,7 +1692,7 @@ static void mos7840_unthrottle(struct tty_struct *tty)
1692 } 1692 }
1693 1693
1694 /* if we are implementing RTS/CTS, toggle that line */ 1694 /* if we are implementing RTS/CTS, toggle that line */
1695 if (tty->termios->c_cflag & CRTSCTS) { 1695 if (tty->termios.c_cflag & CRTSCTS) {
1696 mos7840_port->shadowMCR |= MCR_RTS; 1696 mos7840_port->shadowMCR |= MCR_RTS;
1697 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 1697 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1698 mos7840_port->shadowMCR); 1698 mos7840_port->shadowMCR);
@@ -1998,8 +1998,8 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
1998 lStop = LCR_STOP_1; 1998 lStop = LCR_STOP_1;
1999 lParity = LCR_PAR_NONE; 1999 lParity = LCR_PAR_NONE;
2000 2000
2001 cflag = tty->termios->c_cflag; 2001 cflag = tty->termios.c_cflag;
2002 iflag = tty->termios->c_iflag; 2002 iflag = tty->termios.c_iflag;
2003 2003
2004 /* Change the number of bits */ 2004 /* Change the number of bits */
2005 if (cflag & CSIZE) { 2005 if (cflag & CSIZE) {
@@ -2159,10 +2159,10 @@ static void mos7840_set_termios(struct tty_struct *tty,
2159 2159
2160 dbg("%s", "setting termios - "); 2160 dbg("%s", "setting termios - ");
2161 2161
2162 cflag = tty->termios->c_cflag; 2162 cflag = tty->termios.c_cflag;
2163 2163
2164 dbg("%s - clfag %08x iflag %08x", __func__, 2164 dbg("%s - clfag %08x iflag %08x", __func__,
2165 tty->termios->c_cflag, RELEVANT_IFLAG(tty->termios->c_iflag)); 2165 tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag));
2166 dbg("%s - old clfag %08x old iflag %08x", __func__, 2166 dbg("%s - old clfag %08x old iflag %08x", __func__,
2167 old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag)); 2167 old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag));
2168 dbg("%s - port %d", __func__, port->number); 2168 dbg("%s - port %d", __func__, port->number);
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c
index 5976b65ab6ee..9f555560bfbf 100644
--- a/drivers/usb/serial/oti6858.c
+++ b/drivers/usb/serial/oti6858.c
@@ -404,10 +404,10 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty)
404 404
405static void oti6858_init_termios(struct tty_struct *tty) 405static void oti6858_init_termios(struct tty_struct *tty)
406{ 406{
407 *(tty->termios) = tty_std_termios; 407 tty->termios = tty_std_termios;
408 tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL; 408 tty->termios.c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
409 tty->termios->c_ispeed = 38400; 409 tty->termios.c_ispeed = 38400;
410 tty->termios->c_ospeed = 38400; 410 tty->termios.c_ospeed = 38400;
411} 411}
412 412
413static void oti6858_set_termios(struct tty_struct *tty, 413static void oti6858_set_termios(struct tty_struct *tty,
@@ -425,7 +425,7 @@ static void oti6858_set_termios(struct tty_struct *tty,
425 return; 425 return;
426 } 426 }
427 427
428 cflag = tty->termios->c_cflag; 428 cflag = tty->termios.c_cflag;
429 429
430 spin_lock_irqsave(&priv->lock, flags); 430 spin_lock_irqsave(&priv->lock, flags);
431 divisor = priv->pending_setup.divisor; 431 divisor = priv->pending_setup.divisor;
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 13b8dd6481f5..2b9108a8ea64 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -260,16 +260,16 @@ static void pl2303_set_termios(struct tty_struct *tty,
260 serial settings even to the same values as before. Thus 260 serial settings even to the same values as before. Thus
261 we actually need to filter in this specific case */ 261 we actually need to filter in this specific case */
262 262
263 if (!tty_termios_hw_change(tty->termios, old_termios)) 263 if (!tty_termios_hw_change(&tty->termios, old_termios))
264 return; 264 return;
265 265
266 cflag = tty->termios->c_cflag; 266 cflag = tty->termios.c_cflag;
267 267
268 buf = kzalloc(7, GFP_KERNEL); 268 buf = kzalloc(7, GFP_KERNEL);
269 if (!buf) { 269 if (!buf) {
270 dev_err(&port->dev, "%s - out of memory.\n", __func__); 270 dev_err(&port->dev, "%s - out of memory.\n", __func__);
271 /* Report back no change occurred */ 271 /* Report back no change occurred */
272 *tty->termios = *old_termios; 272 tty->termios = *old_termios;
273 return; 273 return;
274 } 274 }
275 275
diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c
index 151670b6b72a..7df9cdb053ed 100644
--- a/drivers/usb/serial/quatech2.c
+++ b/drivers/usb/serial/quatech2.c
@@ -275,7 +275,7 @@ static void qt2_set_termios(struct tty_struct *tty,
275{ 275{
276 struct usb_device *dev = port->serial->dev; 276 struct usb_device *dev = port->serial->dev;
277 struct qt2_port_private *port_priv; 277 struct qt2_port_private *port_priv;
278 struct ktermios *termios = tty->termios; 278 struct ktermios *termios = &tty->termios;
279 u16 baud; 279 u16 baud;
280 unsigned int cflag = termios->c_cflag; 280 unsigned int cflag = termios->c_cflag;
281 u16 new_lcr = 0; 281 u16 new_lcr = 0;
@@ -406,7 +406,7 @@ static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port)
406 port_priv->device_port = (u8) device_port; 406 port_priv->device_port = (u8) device_port;
407 407
408 if (tty) 408 if (tty)
409 qt2_set_termios(tty, port, tty->termios); 409 qt2_set_termios(tty, port, &tty->termios);
410 410
411 return 0; 411 return 0;
412 412
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index 0274710cced5..b14ebbd73567 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -382,7 +382,7 @@ static int sierra_send_setup(struct usb_serial_port *port)
382static void sierra_set_termios(struct tty_struct *tty, 382static void sierra_set_termios(struct tty_struct *tty,
383 struct usb_serial_port *port, struct ktermios *old_termios) 383 struct usb_serial_port *port, struct ktermios *old_termios)
384{ 384{
385 tty_termios_copy_hw(tty->termios, old_termios); 385 tty_termios_copy_hw(&tty->termios, old_termios);
386 sierra_send_setup(port); 386 sierra_send_setup(port);
387} 387}
388 388
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
index cad608984710..ab68a4d74d61 100644
--- a/drivers/usb/serial/spcp8x5.c
+++ b/drivers/usb/serial/spcp8x5.c
@@ -316,10 +316,10 @@ static void spcp8x5_dtr_rts(struct usb_serial_port *port, int on)
316static void spcp8x5_init_termios(struct tty_struct *tty) 316static void spcp8x5_init_termios(struct tty_struct *tty)
317{ 317{
318 /* for the 1st time call this function */ 318 /* for the 1st time call this function */
319 *(tty->termios) = tty_std_termios; 319 tty->termios = tty_std_termios;
320 tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; 320 tty->termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
321 tty->termios->c_ispeed = 115200; 321 tty->termios.c_ispeed = 115200;
322 tty->termios->c_ospeed = 115200; 322 tty->termios.c_ospeed = 115200;
323} 323}
324 324
325/* set the serial param for transfer. we should check if we really need to 325/* set the serial param for transfer. we should check if we really need to
@@ -330,7 +330,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
330 struct usb_serial *serial = port->serial; 330 struct usb_serial *serial = port->serial;
331 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 331 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
332 unsigned long flags; 332 unsigned long flags;
333 unsigned int cflag = tty->termios->c_cflag; 333 unsigned int cflag = tty->termios.c_cflag;
334 unsigned int old_cflag = old_termios->c_cflag; 334 unsigned int old_cflag = old_termios->c_cflag;
335 unsigned short uartdata; 335 unsigned short uartdata;
336 unsigned char buf[2] = {0, 0}; 336 unsigned char buf[2] = {0, 0};
@@ -340,7 +340,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
340 340
341 341
342 /* check that they really want us to change something */ 342 /* check that they really want us to change something */
343 if (!tty_termios_hw_change(tty->termios, old_termios)) 343 if (!tty_termios_hw_change(&tty->termios, old_termios))
344 return; 344 return;
345 345
346 /* set DTR/RTS active */ 346 /* set DTR/RTS active */
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c
index 3fee23bf0c14..cf2d30cf7588 100644
--- a/drivers/usb/serial/ssu100.c
+++ b/drivers/usb/serial/ssu100.c
@@ -216,7 +216,7 @@ static void ssu100_set_termios(struct tty_struct *tty,
216 struct ktermios *old_termios) 216 struct ktermios *old_termios)
217{ 217{
218 struct usb_device *dev = port->serial->dev; 218 struct usb_device *dev = port->serial->dev;
219 struct ktermios *termios = tty->termios; 219 struct ktermios *termios = &tty->termios;
220 u16 baud, divisor, remainder; 220 u16 baud, divisor, remainder;
221 unsigned int cflag = termios->c_cflag; 221 unsigned int cflag = termios->c_cflag;
222 u16 urb_value = 0; /* will hold the new flags */ 222 u16 urb_value = 0; /* will hold the new flags */
@@ -322,7 +322,7 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port)
322 dbg("%s - set uart failed", __func__); 322 dbg("%s - set uart failed", __func__);
323 323
324 if (tty) 324 if (tty)
325 ssu100_set_termios(tty, port, tty->termios); 325 ssu100_set_termios(tty, port, &tty->termios);
326 326
327 return usb_serial_generic_open(tty, port); 327 return usb_serial_generic_open(tty, port);
328} 328}
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
index a4404f5ad68e..f502a16aac21 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -520,7 +520,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port)
520 } 520 }
521 521
522 if (tty) 522 if (tty)
523 ti_set_termios(tty, port, tty->termios); 523 ti_set_termios(tty, port, &tty->termios);
524 524
525 dbg("%s - sending TI_OPEN_PORT", __func__); 525 dbg("%s - sending TI_OPEN_PORT", __func__);
526 status = ti_command_out_sync(tdev, TI_OPEN_PORT, 526 status = ti_command_out_sync(tdev, TI_OPEN_PORT,
@@ -562,7 +562,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port)
562 usb_clear_halt(dev, port->read_urb->pipe); 562 usb_clear_halt(dev, port->read_urb->pipe);
563 563
564 if (tty) 564 if (tty)
565 ti_set_termios(tty, port, tty->termios); 565 ti_set_termios(tty, port, &tty->termios);
566 566
567 dbg("%s - sending TI_OPEN_PORT (2)", __func__); 567 dbg("%s - sending TI_OPEN_PORT (2)", __func__);
568 status = ti_command_out_sync(tdev, TI_OPEN_PORT, 568 status = ti_command_out_sync(tdev, TI_OPEN_PORT,
@@ -831,8 +831,8 @@ static void ti_set_termios(struct tty_struct *tty,
831 int port_number = port->number - port->serial->minor; 831 int port_number = port->number - port->serial->minor;
832 unsigned int mcr; 832 unsigned int mcr;
833 833
834 cflag = tty->termios->c_cflag; 834 cflag = tty->termios.c_cflag;
835 iflag = tty->termios->c_iflag; 835 iflag = tty->termios.c_iflag;
836 836
837 dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag); 837 dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag);
838 dbg("%s - old clfag %08x, old iflag %08x", __func__, 838 dbg("%s - old clfag %08x, old iflag %08x", __func__,
@@ -871,7 +871,7 @@ static void ti_set_termios(struct tty_struct *tty,
871 } 871 }
872 872
873 /* CMSPAR isn't supported by this driver */ 873 /* CMSPAR isn't supported by this driver */
874 tty->termios->c_cflag &= ~CMSPAR; 874 tty->termios.c_cflag &= ~CMSPAR;
875 875
876 if (cflag & PARENB) { 876 if (cflag & PARENB) {
877 if (cflag & PARODD) { 877 if (cflag & PARODD) {
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 27483f91a4a3..aa4b0d775992 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -207,7 +207,7 @@ static int serial_install(struct tty_driver *driver, struct tty_struct *tty)
207 if (retval) 207 if (retval)
208 goto error_get_interface; 208 goto error_get_interface;
209 209
210 retval = tty_standard_install(driver, tty); 210 retval = tty_port_install(&port->port, driver, tty);
211 if (retval) 211 if (retval)
212 goto error_init_termios; 212 goto error_init_termios;
213 213
@@ -305,8 +305,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
305 * Do the resource freeing and refcount dropping for the port. 305 * Do the resource freeing and refcount dropping for the port.
306 * Avoid freeing the console. 306 * Avoid freeing the console.
307 * 307 *
308 * Called asynchronously after the last tty kref is dropped, 308 * Called asynchronously after the last tty kref is dropped.
309 * and the tty layer has already done the tty_shutdown(tty);
310 */ 309 */
311static void serial_cleanup(struct tty_struct *tty) 310static void serial_cleanup(struct tty_struct *tty)
312{ 311{
@@ -423,7 +422,7 @@ static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
423 if (port->serial->type->set_termios) 422 if (port->serial->type->set_termios)
424 port->serial->type->set_termios(tty, port, old); 423 port->serial->type->set_termios(tty, port, old);
425 else 424 else
426 tty_termios_copy_hw(tty->termios, old); 425 tty_termios_copy_hw(&tty->termios, old);
427} 426}
428 427
429static int serial_break(struct tty_struct *tty, int break_state) 428static int serial_break(struct tty_struct *tty, int break_state)
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c
index f35971dff4a5..7c3db9e6f324 100644
--- a/drivers/usb/serial/usb_wwan.c
+++ b/drivers/usb/serial/usb_wwan.c
@@ -67,7 +67,7 @@ void usb_wwan_set_termios(struct tty_struct *tty,
67 struct usb_wwan_intf_private *intfdata = port->serial->private; 67 struct usb_wwan_intf_private *intfdata = port->serial->private;
68 68
69 /* Doesn't support option setting */ 69 /* Doesn't support option setting */
70 tty_termios_copy_hw(tty->termios, old_termios); 70 tty_termios_copy_hw(&tty->termios, old_termios);
71 71
72 if (intfdata->send_setup) 72 if (intfdata->send_setup)
73 intfdata->send_setup(port); 73 intfdata->send_setup(port);
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
index 473635e7f5db..b36077de72b9 100644
--- a/drivers/usb/serial/whiteheat.c
+++ b/drivers/usb/serial/whiteheat.c
@@ -724,7 +724,7 @@ static void firm_setup_port(struct tty_struct *tty)
724{ 724{
725 struct usb_serial_port *port = tty->driver_data; 725 struct usb_serial_port *port = tty->driver_data;
726 struct whiteheat_port_settings port_settings; 726 struct whiteheat_port_settings port_settings;
727 unsigned int cflag = tty->termios->c_cflag; 727 unsigned int cflag = tty->termios.c_cflag;
728 728
729 port_settings.port = port->number + 1; 729 port_settings.port = port->number + 1;
730 730
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
index d9a754474878..28ea2b4d1b45 100644
--- a/include/linux/Kbuild
+++ b/include/linux/Kbuild
@@ -84,7 +84,6 @@ header-y += capability.h
84header-y += capi.h 84header-y += capi.h
85header-y += cciss_defs.h 85header-y += cciss_defs.h
86header-y += cciss_ioctl.h 86header-y += cciss_ioctl.h
87header-y += cdk.h
88header-y += cdrom.h 87header-y += cdrom.h
89header-y += cgroupstats.h 88header-y += cgroupstats.h
90header-y += chio.h 89header-y += chio.h
@@ -93,7 +92,6 @@ header-y += cn_proc.h
93header-y += coda.h 92header-y += coda.h
94header-y += coda_psdev.h 93header-y += coda_psdev.h
95header-y += coff.h 94header-y += coff.h
96header-y += comstats.h
97header-y += connector.h 95header-y += connector.h
98header-y += const.h 96header-y += const.h
99header-y += cramfs_fs.h 97header-y += cramfs_fs.h
@@ -140,7 +138,6 @@ header-y += fuse.h
140header-y += futex.h 138header-y += futex.h
141header-y += gameport.h 139header-y += gameport.h
142header-y += gen_stats.h 140header-y += gen_stats.h
143header-y += generic_serial.h
144header-y += genetlink.h 141header-y += genetlink.h
145header-y += gfs2_ondisk.h 142header-y += gfs2_ondisk.h
146header-y += gigaset_dev.h 143header-y += gigaset_dev.h
diff --git a/include/linux/cd1400.h b/include/linux/cd1400.h
deleted file mode 100644
index 1dc3ab0523fd..000000000000
--- a/include/linux/cd1400.h
+++ /dev/null
@@ -1,292 +0,0 @@
1/*****************************************************************************/
2
3/*
4 * cd1400.h -- cd1400 UART hardware info.
5 *
6 * Copyright (C) 1996-1998 Stallion Technologies
7 * Copyright (C) 1994-1996 Greg Ungerer.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24/*****************************************************************************/
25#ifndef _CD1400_H
26#define _CD1400_H
27/*****************************************************************************/
28
29/*
30 * Define the number of async ports per cd1400 uart chip.
31 */
32#define CD1400_PORTS 4
33
34/*
35 * Define the cd1400 uarts internal FIFO sizes.
36 */
37#define CD1400_TXFIFOSIZE 12
38#define CD1400_RXFIFOSIZE 12
39
40/*
41 * Local RX FIFO thresh hold level. Also define the RTS thresh hold
42 * based on the RX thresh hold.
43 */
44#define FIFO_RXTHRESHOLD 6
45#define FIFO_RTSTHRESHOLD 7
46
47/*****************************************************************************/
48
49/*
50 * Define the cd1400 register addresses. These are all the valid
51 * registers with the cd1400. Some are global, some virtual, some
52 * per port.
53 */
54#define GFRCR 0x40
55#define CAR 0x68
56#define GCR 0x4b
57#define SVRR 0x67
58#define RICR 0x44
59#define TICR 0x45
60#define MICR 0x46
61#define RIR 0x6b
62#define TIR 0x6a
63#define MIR 0x69
64#define PPR 0x7e
65
66#define RIVR 0x43
67#define TIVR 0x42
68#define MIVR 0x41
69#define TDR 0x63
70#define RDSR 0x62
71#define MISR 0x4c
72#define EOSRR 0x60
73
74#define LIVR 0x18
75#define CCR 0x05
76#define SRER 0x06
77#define COR1 0x08
78#define COR2 0x09
79#define COR3 0x0a
80#define COR4 0x1e
81#define COR5 0x1f
82#define CCSR 0x0b
83#define RDCR 0x0e
84#define SCHR1 0x1a
85#define SCHR2 0x1b
86#define SCHR3 0x1c
87#define SCHR4 0x1d
88#define SCRL 0x22
89#define SCRH 0x23
90#define LNC 0x24
91#define MCOR1 0x15
92#define MCOR2 0x16
93#define RTPR 0x21
94#define MSVR1 0x6c
95#define MSVR2 0x6d
96#define PSVR 0x6f
97#define RBPR 0x78
98#define RCOR 0x7c
99#define TBPR 0x72
100#define TCOR 0x76
101
102/*****************************************************************************/
103
104/*
105 * Define the set of baud rate clock divisors.
106 */
107#define CD1400_CLK0 8
108#define CD1400_CLK1 32
109#define CD1400_CLK2 128
110#define CD1400_CLK3 512
111#define CD1400_CLK4 2048
112
113#define CD1400_NUMCLKS 5
114
115/*****************************************************************************/
116
117/*
118 * Define the clock pre-scalar value to be a 5 ms clock. This should be
119 * OK for now. It would probably be better to make it 10 ms, but we
120 * can't fit that divisor into 8 bits!
121 */
122#define PPR_SCALAR 244
123
124/*****************************************************************************/
125
126/*
127 * Define values used to set character size options.
128 */
129#define COR1_CHL5 0x00
130#define COR1_CHL6 0x01
131#define COR1_CHL7 0x02
132#define COR1_CHL8 0x03
133
134/*
135 * Define values used to set the number of stop bits.
136 */
137#define COR1_STOP1 0x00
138#define COR1_STOP15 0x04
139#define COR1_STOP2 0x08
140
141/*
142 * Define values used to set the parity scheme in use.
143 */
144#define COR1_PARNONE 0x00
145#define COR1_PARFORCE 0x20
146#define COR1_PARENB 0x40
147#define COR1_PARIGNORE 0x10
148
149#define COR1_PARODD 0x80
150#define COR1_PAREVEN 0x00
151
152#define COR2_IXM 0x80
153#define COR2_TXIBE 0x40
154#define COR2_ETC 0x20
155#define COR2_LLM 0x10
156#define COR2_RLM 0x08
157#define COR2_RTSAO 0x04
158#define COR2_CTSAE 0x02
159
160#define COR3_SCDRNG 0x80
161#define COR3_SCD34 0x40
162#define COR3_FCT 0x20
163#define COR3_SCD12 0x10
164
165/*
166 * Define values used by COR4.
167 */
168#define COR4_BRKINT 0x08
169#define COR4_IGNBRK 0x18
170
171/*****************************************************************************/
172
173/*
174 * Define the modem control register values.
175 * Note that the actual hardware is a little different to the conventional
176 * pin names on the cd1400.
177 */
178#define MSVR1_DTR 0x01
179#define MSVR1_DSR 0x10
180#define MSVR1_RI 0x20
181#define MSVR1_CTS 0x40
182#define MSVR1_DCD 0x80
183
184#define MSVR2_RTS 0x02
185#define MSVR2_DSR 0x10
186#define MSVR2_RI 0x20
187#define MSVR2_CTS 0x40
188#define MSVR2_DCD 0x80
189
190#define MCOR1_DCD 0x80
191#define MCOR1_CTS 0x40
192#define MCOR1_RI 0x20
193#define MCOR1_DSR 0x10
194
195#define MCOR2_DCD 0x80
196#define MCOR2_CTS 0x40
197#define MCOR2_RI 0x20
198#define MCOR2_DSR 0x10
199
200/*****************************************************************************/
201
202/*
203 * Define the bits used with the service (interrupt) enable register.
204 */
205#define SRER_NNDT 0x01
206#define SRER_TXEMPTY 0x02
207#define SRER_TXDATA 0x04
208#define SRER_RXDATA 0x10
209#define SRER_MODEM 0x80
210
211/*****************************************************************************/
212
213/*
214 * Define operational commands for the command register.
215 */
216#define CCR_RESET 0x80
217#define CCR_CORCHANGE 0x4e
218#define CCR_SENDCH 0x20
219#define CCR_CHANCTRL 0x10
220
221#define CCR_TXENABLE (CCR_CHANCTRL | 0x08)
222#define CCR_TXDISABLE (CCR_CHANCTRL | 0x04)
223#define CCR_RXENABLE (CCR_CHANCTRL | 0x02)
224#define CCR_RXDISABLE (CCR_CHANCTRL | 0x01)
225
226#define CCR_SENDSCHR1 (CCR_SENDCH | 0x01)
227#define CCR_SENDSCHR2 (CCR_SENDCH | 0x02)
228#define CCR_SENDSCHR3 (CCR_SENDCH | 0x03)
229#define CCR_SENDSCHR4 (CCR_SENDCH | 0x04)
230
231#define CCR_RESETCHAN (CCR_RESET | 0x00)
232#define CCR_RESETFULL (CCR_RESET | 0x01)
233#define CCR_TXFLUSHFIFO (CCR_RESET | 0x02)
234
235#define CCR_MAXWAIT 10000
236
237/*****************************************************************************/
238
239/*
240 * Define the valid acknowledgement types (for hw ack cycle).
241 */
242#define ACK_TYPMASK 0x07
243#define ACK_TYPTX 0x02
244#define ACK_TYPMDM 0x01
245#define ACK_TYPRXGOOD 0x03
246#define ACK_TYPRXBAD 0x07
247
248#define SVRR_RX 0x01
249#define SVRR_TX 0x02
250#define SVRR_MDM 0x04
251
252#define ST_OVERRUN 0x01
253#define ST_FRAMING 0x02
254#define ST_PARITY 0x04
255#define ST_BREAK 0x08
256#define ST_SCHAR1 0x10
257#define ST_SCHAR2 0x20
258#define ST_SCHAR3 0x30
259#define ST_SCHAR4 0x40
260#define ST_RANGE 0x70
261#define ST_SCHARMASK 0x70
262#define ST_TIMEOUT 0x80
263
264#define MISR_DCD 0x80
265#define MISR_CTS 0x40
266#define MISR_RI 0x20
267#define MISR_DSR 0x10
268
269/*****************************************************************************/
270
271/*
272 * Defines for the CCSR status register.
273 */
274#define CCSR_RXENABLED 0x80
275#define CCSR_RXFLOWON 0x40
276#define CCSR_RXFLOWOFF 0x20
277#define CCSR_TXENABLED 0x08
278#define CCSR_TXFLOWON 0x04
279#define CCSR_TXFLOWOFF 0x02
280
281/*****************************************************************************/
282
283/*
284 * Define the embedded commands.
285 */
286#define ETC_CMD 0x00
287#define ETC_STARTBREAK 0x81
288#define ETC_DELAY 0x82
289#define ETC_STOPBREAK 0x83
290
291/*****************************************************************************/
292#endif
diff --git a/include/linux/cdk.h b/include/linux/cdk.h
deleted file mode 100644
index 80093a8d4f64..000000000000
--- a/include/linux/cdk.h
+++ /dev/null
@@ -1,486 +0,0 @@
1/*****************************************************************************/
2
3/*
4 * cdk.h -- CDK interface definitions.
5 *
6 * Copyright (C) 1996-1998 Stallion Technologies
7 * Copyright (C) 1994-1996 Greg Ungerer.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24/*****************************************************************************/
25#ifndef _CDK_H
26#define _CDK_H
27/*****************************************************************************/
28
29#pragma pack(2)
30
31/*
32 * The following set of definitions is used to communicate with the
33 * shared memory interface of the Stallion intelligent multiport serial
34 * boards. The definitions in this file are taken directly from the
35 * document titled "Generic Stackable Interface, Downloader and
36 * Communications Development Kit".
37 */
38
39/*
40 * Define the set of important shared memory addresses. These are
41 * required to initialize the board and get things started. All of these
42 * addresses are relative to the start of the shared memory.
43 */
44#define CDK_SIGADDR 0x200
45#define CDK_FEATADDR 0x280
46#define CDK_CDKADDR 0x300
47#define CDK_RDYADDR 0x262
48
49#define CDK_ALIVEMARKER 13
50
51/*
52 * On hardware power up the ROMs located on the EasyConnection 8/64 will
53 * fill out the following signature information into shared memory. This
54 * way the host system can quickly determine that the board is present
55 * and is operational.
56 */
57typedef struct cdkecpsig {
58 unsigned long magic;
59 unsigned short romver;
60 unsigned short cputype;
61 unsigned char panelid[8];
62} cdkecpsig_t;
63
64#define ECP_MAGIC 0x21504345
65
66/*
67 * On hardware power up the ROMs located on the ONboard, Stallion and
68 * Brumbys will fill out the following signature information into shared
69 * memory. This way the host system can quickly determine that the board
70 * is present and is operational.
71 */
72typedef struct cdkonbsig {
73 unsigned short magic0;
74 unsigned short magic1;
75 unsigned short magic2;
76 unsigned short magic3;
77 unsigned short romver;
78 unsigned short memoff;
79 unsigned short memseg;
80 unsigned short amask0;
81 unsigned short pic;
82 unsigned short status;
83 unsigned short btype;
84 unsigned short clkticks;
85 unsigned short clkspeed;
86 unsigned short amask1;
87 unsigned short amask2;
88} cdkonbsig_t;
89
90#define ONB_MAGIC0 0xf2a7
91#define ONB_MAGIC1 0xa149
92#define ONB_MAGIC2 0x6352
93#define ONB_MAGIC3 0xf121
94
95/*
96 * Define the feature area structure. The feature area is the set of
97 * startup parameters used by the slave image when it starts executing.
98 * They allow for the specification of buffer sizes, debug trace, etc.
99 */
100typedef struct cdkfeature {
101 unsigned long debug;
102 unsigned long banner;
103 unsigned long etype;
104 unsigned long nrdevs;
105 unsigned long brdspec;
106 unsigned long txrqsize;
107 unsigned long rxrqsize;
108 unsigned long flags;
109} cdkfeature_t;
110
111#define ETYP_DDK 0
112#define ETYP_CDK 1
113
114/*
115 * Define the CDK header structure. This is the info that the slave
116 * environment sets up after it has been downloaded and started. It
117 * essentially provides a memory map for the shared memory interface.
118 */
119typedef struct cdkhdr {
120 unsigned short command;
121 unsigned short status;
122 unsigned short port;
123 unsigned short mode;
124 unsigned long cmd_buf[14];
125 unsigned short alive_cnt;
126 unsigned short intrpt_mode;
127 unsigned char intrpt_id[8];
128 unsigned char ver_release;
129 unsigned char ver_modification;
130 unsigned char ver_fix;
131 unsigned char deadman_restart;
132 unsigned short deadman;
133 unsigned short nrdevs;
134 unsigned long memp;
135 unsigned long hostp;
136 unsigned long slavep;
137 unsigned char hostreq;
138 unsigned char slavereq;
139 unsigned char cmd_reserved[30];
140} cdkhdr_t;
141
142#define MODE_DDK 0
143#define MODE_CDK 1
144
145#define IMD_INTR 0x0
146#define IMD_PPINTR 0x1
147#define IMD_POLL 0xff
148
149/*
150 * Define the memory mapping structure. This structure is pointed to by
151 * the memp field in the stlcdkhdr struct. As many as these structures
152 * as required are laid out in shared memory to define how the rest of
153 * shared memory is divided up. There will be one for each port.
154 */
155typedef struct cdkmem {
156 unsigned short dtype;
157 unsigned long offset;
158} cdkmem_t;
159
160#define TYP_UNDEFINED 0x0
161#define TYP_ASYNCTRL 0x1
162#define TYP_ASYNC 0x20
163#define TYP_PARALLEL 0x40
164#define TYP_SYNCX21 0x60
165
166/*****************************************************************************/
167
168/*
169 * Following is a set of defines and structures used to actually deal
170 * with the serial ports on the board. Firstly is the set of commands
171 * that can be applied to ports.
172 */
173#define ASYCMD (((unsigned long) 'a') << 8)
174
175#define A_NULL (ASYCMD | 0)
176#define A_FLUSH (ASYCMD | 1)
177#define A_BREAK (ASYCMD | 2)
178#define A_GETPORT (ASYCMD | 3)
179#define A_SETPORT (ASYCMD | 4)
180#define A_SETPORTF (ASYCMD | 5)
181#define A_SETPORTFTX (ASYCMD | 6)
182#define A_SETPORTFRX (ASYCMD | 7)
183#define A_GETSIGNALS (ASYCMD | 8)
184#define A_SETSIGNALS (ASYCMD | 9)
185#define A_SETSIGNALSF (ASYCMD | 10)
186#define A_SETSIGNALSFTX (ASYCMD | 11)
187#define A_SETSIGNALSFRX (ASYCMD | 12)
188#define A_GETNOTIFY (ASYCMD | 13)
189#define A_SETNOTIFY (ASYCMD | 14)
190#define A_NOTIFY (ASYCMD | 15)
191#define A_PORTCTRL (ASYCMD | 16)
192#define A_GETSTATS (ASYCMD | 17)
193#define A_RQSTATE (ASYCMD | 18)
194#define A_FLOWSTATE (ASYCMD | 19)
195#define A_CLEARSTATS (ASYCMD | 20)
196
197/*
198 * Define those arguments used for simple commands.
199 */
200#define FLUSHRX 0x1
201#define FLUSHTX 0x2
202
203#define BREAKON -1
204#define BREAKOFF -2
205
206/*
207 * Define the port setting structure, and all those defines that go along
208 * with it. Basically this structure defines the characteristics of this
209 * port: baud rate, chars, parity, input/output char cooking etc.
210 */
211typedef struct asyport {
212 unsigned long baudout;
213 unsigned long baudin;
214 unsigned long iflag;
215 unsigned long oflag;
216 unsigned long lflag;
217 unsigned long pflag;
218 unsigned long flow;
219 unsigned long spare1;
220 unsigned short vtime;
221 unsigned short vmin;
222 unsigned short txlo;
223 unsigned short txhi;
224 unsigned short rxlo;
225 unsigned short rxhi;
226 unsigned short rxhog;
227 unsigned short spare2;
228 unsigned char csize;
229 unsigned char stopbs;
230 unsigned char parity;
231 unsigned char stopin;
232 unsigned char startin;
233 unsigned char stopout;
234 unsigned char startout;
235 unsigned char parmark;
236 unsigned char brkmark;
237 unsigned char cc[11];
238} asyport_t;
239
240#define PT_STOP1 0x0
241#define PT_STOP15 0x1
242#define PT_STOP2 0x2
243
244#define PT_NOPARITY 0x0
245#define PT_ODDPARITY 0x1
246#define PT_EVENPARITY 0x2
247#define PT_MARKPARITY 0x3
248#define PT_SPACEPARITY 0x4
249
250#define F_NONE 0x0
251#define F_IXON 0x1
252#define F_IXOFF 0x2
253#define F_IXANY 0x4
254#define F_IOXANY 0x8
255#define F_RTSFLOW 0x10
256#define F_CTSFLOW 0x20
257#define F_DTRFLOW 0x40
258#define F_DCDFLOW 0x80
259#define F_DSROFLOW 0x100
260#define F_DSRIFLOW 0x200
261
262#define FI_NORX 0x1
263#define FI_RAW 0x2
264#define FI_ISTRIP 0x4
265#define FI_UCLC 0x8
266#define FI_INLCR 0x10
267#define FI_ICRNL 0x20
268#define FI_IGNCR 0x40
269#define FI_IGNBREAK 0x80
270#define FI_DSCRDBREAK 0x100
271#define FI_1MARKBREAK 0x200
272#define FI_2MARKBREAK 0x400
273#define FI_XCHNGBREAK 0x800
274#define FI_IGNRXERRS 0x1000
275#define FI_DSCDRXERRS 0x2000
276#define FI_1MARKRXERRS 0x4000
277#define FI_2MARKRXERRS 0x8000
278#define FI_XCHNGRXERRS 0x10000
279#define FI_DSCRDNULL 0x20000
280
281#define FO_OLCUC 0x1
282#define FO_ONLCR 0x2
283#define FO_OOCRNL 0x4
284#define FO_ONOCR 0x8
285#define FO_ONLRET 0x10
286#define FO_ONL 0x20
287#define FO_OBS 0x40
288#define FO_OVT 0x80
289#define FO_OFF 0x100
290#define FO_OTAB1 0x200
291#define FO_OTAB2 0x400
292#define FO_OTAB3 0x800
293#define FO_OCR1 0x1000
294#define FO_OCR2 0x2000
295#define FO_OCR3 0x4000
296#define FO_OFILL 0x8000
297#define FO_ODELL 0x10000
298
299#define P_RTSLOCK 0x1
300#define P_CTSLOCK 0x2
301#define P_MAPRTS 0x4
302#define P_MAPCTS 0x8
303#define P_LOOPBACK 0x10
304#define P_DTRFOLLOW 0x20
305#define P_FAKEDCD 0x40
306
307#define P_RXIMIN 0x10000
308#define P_RXITIME 0x20000
309#define P_RXTHOLD 0x40000
310
311/*
312 * Define a structure to communicate serial port signal and data state
313 * information.
314 */
315typedef struct asysigs {
316 unsigned long data;
317 unsigned long signal;
318 unsigned long sigvalue;
319} asysigs_t;
320
321#define DT_TXBUSY 0x1
322#define DT_TXEMPTY 0x2
323#define DT_TXLOW 0x4
324#define DT_TXHIGH 0x8
325#define DT_TXFULL 0x10
326#define DT_TXHOG 0x20
327#define DT_TXFLOWED 0x40
328#define DT_TXBREAK 0x80
329
330#define DT_RXBUSY 0x100
331#define DT_RXEMPTY 0x200
332#define DT_RXLOW 0x400
333#define DT_RXHIGH 0x800
334#define DT_RXFULL 0x1000
335#define DT_RXHOG 0x2000
336#define DT_RXFLOWED 0x4000
337#define DT_RXBREAK 0x8000
338
339#define SG_DTR 0x1
340#define SG_DCD 0x2
341#define SG_RTS 0x4
342#define SG_CTS 0x8
343#define SG_DSR 0x10
344#define SG_RI 0x20
345
346/*
347 * Define the notification setting structure. This is used to tell the
348 * port what events we want to be informed about. Fields here use the
349 * same defines as for the asysigs structure above.
350 */
351typedef struct asynotify {
352 unsigned long ctrl;
353 unsigned long data;
354 unsigned long signal;
355 unsigned long sigvalue;
356} asynotify_t;
357
358/*
359 * Define the port control structure. It is used to do fine grain
360 * control operations on the port.
361 */
362typedef struct {
363 unsigned long rxctrl;
364 unsigned long txctrl;
365 char rximdch;
366 char tximdch;
367 char spare1;
368 char spare2;
369} asyctrl_t;
370
371#define CT_ENABLE 0x1
372#define CT_DISABLE 0x2
373#define CT_STOP 0x4
374#define CT_START 0x8
375#define CT_STARTFLOW 0x10
376#define CT_STOPFLOW 0x20
377#define CT_SENDCHR 0x40
378
379/*
380 * Define the stats structure kept for each port. This is a useful set
381 * of data collected for each port on the slave. The A_GETSTATS command
382 * is used to retrieve this data from the slave.
383 */
384typedef struct asystats {
385 unsigned long opens;
386 unsigned long txchars;
387 unsigned long rxchars;
388 unsigned long txringq;
389 unsigned long rxringq;
390 unsigned long txmsgs;
391 unsigned long rxmsgs;
392 unsigned long txflushes;
393 unsigned long rxflushes;
394 unsigned long overruns;
395 unsigned long framing;
396 unsigned long parity;
397 unsigned long ringover;
398 unsigned long lost;
399 unsigned long rxstart;
400 unsigned long rxstop;
401 unsigned long txstart;
402 unsigned long txstop;
403 unsigned long dcdcnt;
404 unsigned long dtrcnt;
405 unsigned long ctscnt;
406 unsigned long rtscnt;
407 unsigned long dsrcnt;
408 unsigned long ricnt;
409 unsigned long txbreaks;
410 unsigned long rxbreaks;
411 unsigned long signals;
412 unsigned long state;
413 unsigned long hwid;
414} asystats_t;
415
416/*****************************************************************************/
417
418/*
419 * All command and control communication with a device on the slave is
420 * via a control block in shared memory. Each device has its own control
421 * block, defined by the following structure. The control block allows
422 * the host to open, close and control the device on the slave.
423 */
424typedef struct cdkctrl {
425 unsigned char open;
426 unsigned char close;
427 unsigned long openarg;
428 unsigned long closearg;
429 unsigned long cmd;
430 unsigned long status;
431 unsigned long args[32];
432} cdkctrl_t;
433
434/*
435 * Each device on the slave passes data to and from the host via a ring
436 * queue in shared memory. Define a ring queue structure to hold the
437 * vital information about each ring queue. Two ring queues will be
438 * allocated for each port, one for receive data and one for transmit
439 * data.
440 */
441typedef struct cdkasyrq {
442 unsigned long offset;
443 unsigned short size;
444 unsigned short head;
445 unsigned short tail;
446} cdkasyrq_t;
447
448/*
449 * Each asynchronous port is defined in shared memory by the following
450 * structure. It contains a control block to command a device, and also
451 * the necessary data channel information as well.
452 */
453typedef struct cdkasy {
454 cdkctrl_t ctrl;
455 unsigned short notify;
456 asynotify_t changed;
457 unsigned short receive;
458 cdkasyrq_t rxq;
459 unsigned short transmit;
460 cdkasyrq_t txq;
461} cdkasy_t;
462
463#pragma pack()
464
465/*****************************************************************************/
466
467/*
468 * Define the set of ioctls used by the driver to do special things
469 * to the board. These include interrupting it, and initializing
470 * the driver after board startup and shutdown.
471 */
472#include <linux/ioctl.h>
473
474#define STL_BINTR _IO('s',20)
475#define STL_BSTART _IO('s',21)
476#define STL_BSTOP _IO('s',22)
477#define STL_BRESET _IO('s',23)
478
479/*
480 * Define a set of ioctl extensions, used to get at special stuff.
481 */
482#define STL_GETPFLAG _IO('s',80)
483#define STL_SETPFLAG _IO('s',81)
484
485/*****************************************************************************/
486#endif
diff --git a/include/linux/comstats.h b/include/linux/comstats.h
deleted file mode 100644
index 3f5ea8e8026d..000000000000
--- a/include/linux/comstats.h
+++ /dev/null
@@ -1,119 +0,0 @@
1/*****************************************************************************/
2
3/*
4 * comstats.h -- Serial Port Stats.
5 *
6 * Copyright (C) 1996-1998 Stallion Technologies
7 * Copyright (C) 1994-1996 Greg Ungerer.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24/*****************************************************************************/
25#ifndef _COMSTATS_H
26#define _COMSTATS_H
27/*****************************************************************************/
28
29/*
30 * Serial port stats structure. The structure itself is UART
31 * independent, but some fields may be UART/driver specific (for
32 * example state).
33 */
34
35typedef struct {
36 unsigned long brd;
37 unsigned long panel;
38 unsigned long port;
39 unsigned long hwid;
40 unsigned long type;
41 unsigned long txtotal;
42 unsigned long rxtotal;
43 unsigned long txbuffered;
44 unsigned long rxbuffered;
45 unsigned long rxoverrun;
46 unsigned long rxparity;
47 unsigned long rxframing;
48 unsigned long rxlost;
49 unsigned long txbreaks;
50 unsigned long rxbreaks;
51 unsigned long txxon;
52 unsigned long txxoff;
53 unsigned long rxxon;
54 unsigned long rxxoff;
55 unsigned long txctson;
56 unsigned long txctsoff;
57 unsigned long rxrtson;
58 unsigned long rxrtsoff;
59 unsigned long modem;
60 unsigned long state;
61 unsigned long flags;
62 unsigned long ttystate;
63 unsigned long cflags;
64 unsigned long iflags;
65 unsigned long oflags;
66 unsigned long lflags;
67 unsigned long signals;
68} comstats_t;
69
70
71/*
72 * Board stats structure. Returns useful info about the board.
73 */
74
75#define COM_MAXPANELS 8
76
77typedef struct {
78 unsigned long panel;
79 unsigned long type;
80 unsigned long hwid;
81 unsigned long nrports;
82} companel_t;
83
84typedef struct {
85 unsigned long brd;
86 unsigned long type;
87 unsigned long hwid;
88 unsigned long state;
89 unsigned long ioaddr;
90 unsigned long ioaddr2;
91 unsigned long memaddr;
92 unsigned long irq;
93 unsigned long nrpanels;
94 unsigned long nrports;
95 companel_t panels[COM_MAXPANELS];
96} combrd_t;
97
98
99/*
100 * Define the ioctl operations for stats stuff.
101 */
102#include <linux/ioctl.h>
103
104#define COM_GETPORTSTATS _IO('c',30)
105#define COM_CLRPORTSTATS _IO('c',31)
106#define COM_GETBRDSTATS _IO('c',32)
107
108
109/*
110 * Define the set of ioctls that give user level access to the
111 * private port, panel and board structures. The argument required
112 * will be driver dependent!
113 */
114#define COM_READPORT _IO('c',40)
115#define COM_READBOARD _IO('c',41)
116#define COM_READPANEL _IO('c',42)
117
118/*****************************************************************************/
119#endif
diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h
deleted file mode 100644
index 79b3eb37243a..000000000000
--- a/include/linux/generic_serial.h
+++ /dev/null
@@ -1,35 +0,0 @@
1/*
2 * generic_serial.h
3 *
4 * Copyright (C) 1998 R.E.Wolff@BitWizard.nl
5 *
6 * written for the SX serial driver.
7 *
8 * Version 0.1 -- December, 1998.
9 */
10
11#ifndef GENERIC_SERIAL_H
12#define GENERIC_SERIAL_H
13
14#warning Use of this header is deprecated.
15#warning Since nobody sets the constants defined here for you, you should not, in any case, use them. Including the header is thus pointless.
16
17/* Flags */
18/* Warning: serial.h defines some ASYNC_ flags, they say they are "only"
19 used in serial.c, but they are also used in all other serial drivers.
20 Make sure they don't clash with these here... */
21#define GS_TX_INTEN 0x00800000
22#define GS_RX_INTEN 0x00400000
23#define GS_ACTIVE 0x00200000
24
25#define GS_TYPE_NORMAL 1
26
27#define GS_DEBUG_FLUSH 0x00000001
28#define GS_DEBUG_BTR 0x00000002
29#define GS_DEBUG_TERMIOS 0x00000004
30#define GS_DEBUG_STUFF 0x00000008
31#define GS_DEBUG_CLOSE 0x00000010
32#define GS_DEBUG_FLOW 0x00000020
33#define GS_DEBUG_WRITE 0x00000040
34
35#endif
diff --git a/include/linux/istallion.h b/include/linux/istallion.h
deleted file mode 100644
index ad700a60c158..000000000000
--- a/include/linux/istallion.h
+++ /dev/null
@@ -1,123 +0,0 @@
1/*****************************************************************************/
2
3/*
4 * istallion.h -- stallion intelligent multiport serial driver.
5 *
6 * Copyright (C) 1996-1998 Stallion Technologies
7 * Copyright (C) 1994-1996 Greg Ungerer.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24/*****************************************************************************/
25#ifndef _ISTALLION_H
26#define _ISTALLION_H
27/*****************************************************************************/
28
29/*
30 * Define important driver constants here.
31 */
32#define STL_MAXBRDS 4
33#define STL_MAXPANELS 4
34#define STL_MAXPORTS 64
35#define STL_MAXCHANS (STL_MAXPORTS + 1)
36#define STL_MAXDEVS (STL_MAXBRDS * STL_MAXPORTS)
37
38
39/*
40 * Define a set of structures to hold all the board/panel/port info
41 * for our ports. These will be dynamically allocated as required at
42 * driver initialization time.
43 */
44
45/*
46 * Port and board structures to hold status info about each object.
47 * The board structure contains pointers to structures for each port
48 * connected to it. Panels are not distinguished here, since
49 * communication with the slave board will always be on a per port
50 * basis.
51 */
52struct stliport {
53 unsigned long magic;
54 struct tty_port port;
55 unsigned int portnr;
56 unsigned int panelnr;
57 unsigned int brdnr;
58 unsigned long state;
59 unsigned int devnr;
60 int baud_base;
61 int custom_divisor;
62 int closing_wait;
63 int rc;
64 int argsize;
65 void *argp;
66 unsigned int rxmarkmsk;
67 wait_queue_head_t raw_wait;
68 struct asysigs asig;
69 unsigned long addr;
70 unsigned long rxoffset;
71 unsigned long txoffset;
72 unsigned long sigs;
73 unsigned long pflag;
74 unsigned int rxsize;
75 unsigned int txsize;
76 unsigned char reqbit;
77 unsigned char portidx;
78 unsigned char portbit;
79};
80
81/*
82 * Use a structure of function pointers to do board level operations.
83 * These include, enable/disable, paging shared memory, interrupting, etc.
84 */
85struct stlibrd {
86 unsigned long magic;
87 unsigned int brdnr;
88 unsigned int brdtype;
89 unsigned long state;
90 unsigned int nrpanels;
91 unsigned int nrports;
92 unsigned int nrdevs;
93 unsigned int iobase;
94 int iosize;
95 unsigned long memaddr;
96 void __iomem *membase;
97 unsigned long memsize;
98 int pagesize;
99 int hostoffset;
100 int slaveoffset;
101 int bitsize;
102 int enabval;
103 unsigned int panels[STL_MAXPANELS];
104 int panelids[STL_MAXPANELS];
105 void (*init)(struct stlibrd *brdp);
106 void (*enable)(struct stlibrd *brdp);
107 void (*reenable)(struct stlibrd *brdp);
108 void (*disable)(struct stlibrd *brdp);
109 void __iomem *(*getmemptr)(struct stlibrd *brdp, unsigned long offset, int line);
110 void (*intr)(struct stlibrd *brdp);
111 void (*reset)(struct stlibrd *brdp);
112 struct stliport *ports[STL_MAXPORTS];
113};
114
115
116/*
117 * Define MAGIC numbers used for above structures.
118 */
119#define STLI_PORTMAGIC 0xe671c7a1
120#define STLI_BOARDMAGIC 0x4bc6c825
121
122/*****************************************************************************/
123#endif
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h
index daf4a3a40ee0..b7c8cdc1d422 100644
--- a/include/linux/kbd_kern.h
+++ b/include/linux/kbd_kern.h
@@ -65,7 +65,6 @@ struct kbd_struct {
65 65
66extern int kbd_init(void); 66extern int kbd_init(void);
67 67
68extern unsigned char getledstate(void);
69extern void setledstate(struct kbd_struct *kbd, unsigned int led); 68extern void setledstate(struct kbd_struct *kbd, unsigned int led);
70 69
71extern int do_poke_blanked_console; 70extern int do_poke_blanked_console;
@@ -145,16 +144,4 @@ void compute_shiftstate(void);
145 144
146extern unsigned int keymap_count; 145extern unsigned int keymap_count;
147 146
148/* console.c */
149
150static inline void con_schedule_flip(struct tty_struct *t)
151{
152 unsigned long flags;
153 spin_lock_irqsave(&t->buf.lock, flags);
154 if (t->buf.tail != NULL)
155 t->buf.tail->commit = t->buf.tail->used;
156 spin_unlock_irqrestore(&t->buf.lock, flags);
157 schedule_work(&t->buf.work);
158}
159
160#endif 147#endif
diff --git a/include/linux/sc26198.h b/include/linux/sc26198.h
deleted file mode 100644
index 7ca35abad387..000000000000
--- a/include/linux/sc26198.h
+++ /dev/null
@@ -1,533 +0,0 @@
1/*****************************************************************************/
2
3/*
4 * sc26198.h -- SC26198 UART hardware info.
5 *
6 * Copyright (C) 1995-1998 Stallion Technologies
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23/*****************************************************************************/
24#ifndef _SC26198_H
25#define _SC26198_H
26/*****************************************************************************/
27
28/*
29 * Define the number of async ports per sc26198 uart device.
30 */
31#define SC26198_PORTS 8
32
33/*
34 * Baud rate timing clocks. All derived from a master 14.7456 MHz clock.
35 */
36#define SC26198_MASTERCLOCK 14745600L
37#define SC26198_DCLK (SC26198_MASTERCLOCK)
38#define SC26198_CCLK (SC26198_MASTERCLOCK / 2)
39#define SC26198_BCLK (SC26198_MASTERCLOCK / 4)
40
41/*
42 * Define internal FIFO sizes for the 26198 ports.
43 */
44#define SC26198_TXFIFOSIZE 16
45#define SC26198_RXFIFOSIZE 16
46
47/*****************************************************************************/
48
49/*
50 * Global register definitions. These registers are global to each 26198
51 * device, not specific ports on it.
52 */
53#define TSTR 0x0d
54#define GCCR 0x0f
55#define ICR 0x1b
56#define WDTRCR 0x1d
57#define IVR 0x1f
58#define BRGTRUA 0x84
59#define GPOSR 0x87
60#define GPOC 0x8b
61#define UCIR 0x8c
62#define CIR 0x8c
63#define BRGTRUB 0x8d
64#define GRXFIFO 0x8e
65#define GTXFIFO 0x8e
66#define GCCR2 0x8f
67#define BRGTRLA 0x94
68#define GPOR 0x97
69#define GPOD 0x9b
70#define BRGTCR 0x9c
71#define GICR 0x9c
72#define BRGTRLB 0x9d
73#define GIBCR 0x9d
74#define GITR 0x9f
75
76/*
77 * Per port channel registers. These are the register offsets within
78 * the port address space, so need to have the port address (0 to 7)
79 * inserted in bit positions 4:6.
80 */
81#define MR0 0x00
82#define MR1 0x01
83#define IOPCR 0x02
84#define BCRBRK 0x03
85#define BCRCOS 0x04
86#define BCRX 0x06
87#define BCRA 0x07
88#define XONCR 0x08
89#define XOFFCR 0x09
90#define ARCR 0x0a
91#define RXCSR 0x0c
92#define TXCSR 0x0e
93#define MR2 0x80
94#define SR 0x81
95#define SCCR 0x81
96#define ISR 0x82
97#define IMR 0x82
98#define TXFIFO 0x83
99#define RXFIFO 0x83
100#define IPR 0x84
101#define IOPIOR 0x85
102#define XISR 0x86
103
104/*
105 * For any given port calculate the address to use to access a specified
106 * register. This is only used for unusual access, mostly this is done
107 * through the assembler access routines.
108 */
109#define SC26198_PORTREG(port,reg) ((((port) & 0x07) << 4) | (reg))
110
111/*****************************************************************************/
112
113/*
114 * Global configuration control register bit definitions.
115 */
116#define GCCR_NOACK 0x00
117#define GCCR_IVRACK 0x02
118#define GCCR_IVRCHANACK 0x04
119#define GCCR_IVRTYPCHANACK 0x06
120#define GCCR_ASYNCCYCLE 0x00
121#define GCCR_SYNCCYCLE 0x40
122
123/*****************************************************************************/
124
125/*
126 * Mode register 0 bit definitions.
127 */
128#define MR0_ADDRNONE 0x00
129#define MR0_AUTOWAKE 0x01
130#define MR0_AUTODOZE 0x02
131#define MR0_AUTOWAKEDOZE 0x03
132#define MR0_SWFNONE 0x00
133#define MR0_SWFTX 0x04
134#define MR0_SWFRX 0x08
135#define MR0_SWFRXTX 0x0c
136#define MR0_TXMASK 0x30
137#define MR0_TXEMPTY 0x00
138#define MR0_TXHIGH 0x10
139#define MR0_TXHALF 0x20
140#define MR0_TXRDY 0x00
141#define MR0_ADDRNT 0x00
142#define MR0_ADDRT 0x40
143#define MR0_SWFNT 0x00
144#define MR0_SWFT 0x80
145
146/*
147 * Mode register 1 bit definitions.
148 */
149#define MR1_CS5 0x00
150#define MR1_CS6 0x01
151#define MR1_CS7 0x02
152#define MR1_CS8 0x03
153#define MR1_PAREVEN 0x00
154#define MR1_PARODD 0x04
155#define MR1_PARENB 0x00
156#define MR1_PARFORCE 0x08
157#define MR1_PARNONE 0x10
158#define MR1_PARSPECIAL 0x18
159#define MR1_ERRCHAR 0x00
160#define MR1_ERRBLOCK 0x20
161#define MR1_ISRUNMASKED 0x00
162#define MR1_ISRMASKED 0x40
163#define MR1_AUTORTS 0x80
164
165/*
166 * Mode register 2 bit definitions.
167 */
168#define MR2_STOP1 0x00
169#define MR2_STOP15 0x01
170#define MR2_STOP2 0x02
171#define MR2_STOP916 0x03
172#define MR2_RXFIFORDY 0x00
173#define MR2_RXFIFOHALF 0x04
174#define MR2_RXFIFOHIGH 0x08
175#define MR2_RXFIFOFULL 0x0c
176#define MR2_AUTOCTS 0x10
177#define MR2_TXRTS 0x20
178#define MR2_MODENORM 0x00
179#define MR2_MODEAUTOECHO 0x40
180#define MR2_MODELOOP 0x80
181#define MR2_MODEREMECHO 0xc0
182
183/*****************************************************************************/
184
185/*
186 * Baud Rate Generator (BRG) selector values.
187 */
188#define BRG_50 0x00
189#define BRG_75 0x01
190#define BRG_150 0x02
191#define BRG_200 0x03
192#define BRG_300 0x04
193#define BRG_450 0x05
194#define BRG_600 0x06
195#define BRG_900 0x07
196#define BRG_1200 0x08
197#define BRG_1800 0x09
198#define BRG_2400 0x0a
199#define BRG_3600 0x0b
200#define BRG_4800 0x0c
201#define BRG_7200 0x0d
202#define BRG_9600 0x0e
203#define BRG_14400 0x0f
204#define BRG_19200 0x10
205#define BRG_28200 0x11
206#define BRG_38400 0x12
207#define BRG_57600 0x13
208#define BRG_115200 0x14
209#define BRG_230400 0x15
210#define BRG_GIN0 0x16
211#define BRG_GIN1 0x17
212#define BRG_CT0 0x18
213#define BRG_CT1 0x19
214#define BRG_RX2TX316 0x1b
215#define BRG_RX2TX31 0x1c
216
217#define SC26198_MAXBAUD 921600
218
219/*****************************************************************************/
220
221/*
222 * Command register command definitions.
223 */
224#define CR_NULL 0x04
225#define CR_ADDRNORMAL 0x0c
226#define CR_RXRESET 0x14
227#define CR_TXRESET 0x1c
228#define CR_CLEARRXERR 0x24
229#define CR_BREAKRESET 0x2c
230#define CR_TXSTARTBREAK 0x34
231#define CR_TXSTOPBREAK 0x3c
232#define CR_RTSON 0x44
233#define CR_RTSOFF 0x4c
234#define CR_ADDRINIT 0x5c
235#define CR_RXERRBLOCK 0x6c
236#define CR_TXSENDXON 0x84
237#define CR_TXSENDXOFF 0x8c
238#define CR_GANGXONSET 0x94
239#define CR_GANGXOFFSET 0x9c
240#define CR_GANGXONINIT 0xa4
241#define CR_GANGXOFFINIT 0xac
242#define CR_HOSTXON 0xb4
243#define CR_HOSTXOFF 0xbc
244#define CR_CANCELXOFF 0xc4
245#define CR_ADDRRESET 0xdc
246#define CR_RESETALLPORTS 0xf4
247#define CR_RESETALL 0xfc
248
249#define CR_RXENABLE 0x01
250#define CR_TXENABLE 0x02
251
252/*****************************************************************************/
253
254/*
255 * Channel status register.
256 */
257#define SR_RXRDY 0x01
258#define SR_RXFULL 0x02
259#define SR_TXRDY 0x04
260#define SR_TXEMPTY 0x08
261#define SR_RXOVERRUN 0x10
262#define SR_RXPARITY 0x20
263#define SR_RXFRAMING 0x40
264#define SR_RXBREAK 0x80
265
266#define SR_RXERRS (SR_RXPARITY | SR_RXFRAMING | SR_RXOVERRUN)
267
268/*****************************************************************************/
269
270/*
271 * Interrupt status register and interrupt mask register bit definitions.
272 */
273#define IR_TXRDY 0x01
274#define IR_RXRDY 0x02
275#define IR_RXBREAK 0x04
276#define IR_XONXOFF 0x10
277#define IR_ADDRRECOG 0x20
278#define IR_RXWATCHDOG 0x40
279#define IR_IOPORT 0x80
280
281/*****************************************************************************/
282
283/*
284 * Interrupt vector register field definitions.
285 */
286#define IVR_CHANMASK 0x07
287#define IVR_TYPEMASK 0x18
288#define IVR_CONSTMASK 0xc0
289
290#define IVR_RXDATA 0x10
291#define IVR_RXBADDATA 0x18
292#define IVR_TXDATA 0x08
293#define IVR_OTHER 0x00
294
295/*****************************************************************************/
296
297/*
298 * BRG timer control register bit definitions.
299 */
300#define BRGCTCR_DISABCLK0 0x00
301#define BRGCTCR_ENABCLK0 0x08
302#define BRGCTCR_DISABCLK1 0x00
303#define BRGCTCR_ENABCLK1 0x80
304
305#define BRGCTCR_0SCLK16 0x00
306#define BRGCTCR_0SCLK32 0x01
307#define BRGCTCR_0SCLK64 0x02
308#define BRGCTCR_0SCLK128 0x03
309#define BRGCTCR_0X1 0x04
310#define BRGCTCR_0X12 0x05
311#define BRGCTCR_0IO1A 0x06
312#define BRGCTCR_0GIN0 0x07
313
314#define BRGCTCR_1SCLK16 0x00
315#define BRGCTCR_1SCLK32 0x10
316#define BRGCTCR_1SCLK64 0x20
317#define BRGCTCR_1SCLK128 0x30
318#define BRGCTCR_1X1 0x40
319#define BRGCTCR_1X12 0x50
320#define BRGCTCR_1IO1B 0x60
321#define BRGCTCR_1GIN1 0x70
322
323/*****************************************************************************/
324
325/*
326 * Watch dog timer enable register.
327 */
328#define WDTRCR_ENABALL 0xff
329
330/*****************************************************************************/
331
332/*
333 * XON/XOFF interrupt status register.
334 */
335#define XISR_TXCHARMASK 0x03
336#define XISR_TXCHARNORMAL 0x00
337#define XISR_TXWAIT 0x01
338#define XISR_TXXOFFPEND 0x02
339#define XISR_TXXONPEND 0x03
340
341#define XISR_TXFLOWMASK 0x0c
342#define XISR_TXNORMAL 0x00
343#define XISR_TXSTOPPEND 0x04
344#define XISR_TXSTARTED 0x08
345#define XISR_TXSTOPPED 0x0c
346
347#define XISR_RXFLOWMASK 0x30
348#define XISR_RXFLOWNONE 0x00
349#define XISR_RXXONSENT 0x10
350#define XISR_RXXOFFSENT 0x20
351
352#define XISR_RXXONGOT 0x40
353#define XISR_RXXOFFGOT 0x80
354
355/*****************************************************************************/
356
357/*
358 * Current interrupt register.
359 */
360#define CIR_TYPEMASK 0xc0
361#define CIR_TYPEOTHER 0x00
362#define CIR_TYPETX 0x40
363#define CIR_TYPERXGOOD 0x80
364#define CIR_TYPERXBAD 0xc0
365
366#define CIR_RXDATA 0x80
367#define CIR_RXBADDATA 0x40
368#define CIR_TXDATA 0x40
369
370#define CIR_CHANMASK 0x07
371#define CIR_CNTMASK 0x38
372
373#define CIR_SUBTYPEMASK 0x38
374#define CIR_SUBNONE 0x00
375#define CIR_SUBCOS 0x08
376#define CIR_SUBADDR 0x10
377#define CIR_SUBXONXOFF 0x18
378#define CIR_SUBBREAK 0x28
379
380/*****************************************************************************/
381
382/*
383 * Global interrupting channel register.
384 */
385#define GICR_CHANMASK 0x07
386
387/*****************************************************************************/
388
389/*
390 * Global interrupting byte count register.
391 */
392#define GICR_COUNTMASK 0x0f
393
394/*****************************************************************************/
395
396/*
397 * Global interrupting type register.
398 */
399#define GITR_RXMASK 0xc0
400#define GITR_RXNONE 0x00
401#define GITR_RXBADDATA 0x80
402#define GITR_RXGOODDATA 0xc0
403#define GITR_TXDATA 0x20
404
405#define GITR_SUBTYPEMASK 0x07
406#define GITR_SUBNONE 0x00
407#define GITR_SUBCOS 0x01
408#define GITR_SUBADDR 0x02
409#define GITR_SUBXONXOFF 0x03
410#define GITR_SUBBREAK 0x05
411
412/*****************************************************************************/
413
414/*
415 * Input port change register.
416 */
417#define IPR_CTS 0x01
418#define IPR_DTR 0x02
419#define IPR_RTS 0x04
420#define IPR_DCD 0x08
421#define IPR_CTSCHANGE 0x10
422#define IPR_DTRCHANGE 0x20
423#define IPR_RTSCHANGE 0x40
424#define IPR_DCDCHANGE 0x80
425
426#define IPR_CHANGEMASK 0xf0
427
428/*****************************************************************************/
429
430/*
431 * IO port interrupt and output register.
432 */
433#define IOPR_CTS 0x01
434#define IOPR_DTR 0x02
435#define IOPR_RTS 0x04
436#define IOPR_DCD 0x08
437#define IOPR_CTSCOS 0x10
438#define IOPR_DTRCOS 0x20
439#define IOPR_RTSCOS 0x40
440#define IOPR_DCDCOS 0x80
441
442/*****************************************************************************/
443
444/*
445 * IO port configuration register.
446 */
447#define IOPCR_SETCTS 0x00
448#define IOPCR_SETDTR 0x04
449#define IOPCR_SETRTS 0x10
450#define IOPCR_SETDCD 0x00
451
452#define IOPCR_SETSIGS (IOPCR_SETRTS | IOPCR_SETRTS | IOPCR_SETDTR | IOPCR_SETDCD)
453
454/*****************************************************************************/
455
456/*
457 * General purpose output select register.
458 */
459#define GPORS_TXC1XA 0x08
460#define GPORS_TXC16XA 0x09
461#define GPORS_RXC16XA 0x0a
462#define GPORS_TXC16XB 0x0b
463#define GPORS_GPOR3 0x0c
464#define GPORS_GPOR2 0x0d
465#define GPORS_GPOR1 0x0e
466#define GPORS_GPOR0 0x0f
467
468/*****************************************************************************/
469
470/*
471 * General purpose output register.
472 */
473#define GPOR_0 0x01
474#define GPOR_1 0x02
475#define GPOR_2 0x04
476#define GPOR_3 0x08
477
478/*****************************************************************************/
479
480/*
481 * General purpose output clock register.
482 */
483#define GPORC_0NONE 0x00
484#define GPORC_0GIN0 0x01
485#define GPORC_0GIN1 0x02
486#define GPORC_0IO3A 0x02
487
488#define GPORC_1NONE 0x00
489#define GPORC_1GIN0 0x04
490#define GPORC_1GIN1 0x08
491#define GPORC_1IO3C 0x0c
492
493#define GPORC_2NONE 0x00
494#define GPORC_2GIN0 0x10
495#define GPORC_2GIN1 0x20
496#define GPORC_2IO3E 0x20
497
498#define GPORC_3NONE 0x00
499#define GPORC_3GIN0 0x40
500#define GPORC_3GIN1 0x80
501#define GPORC_3IO3G 0xc0
502
503/*****************************************************************************/
504
505/*
506 * General purpose output data register.
507 */
508#define GPOD_0MASK 0x03
509#define GPOD_0SET1 0x00
510#define GPOD_0SET0 0x01
511#define GPOD_0SETR0 0x02
512#define GPOD_0SETIO3B 0x03
513
514#define GPOD_1MASK 0x0c
515#define GPOD_1SET1 0x00
516#define GPOD_1SET0 0x04
517#define GPOD_1SETR0 0x08
518#define GPOD_1SETIO3D 0x0c
519
520#define GPOD_2MASK 0x30
521#define GPOD_2SET1 0x00
522#define GPOD_2SET0 0x10
523#define GPOD_2SETR0 0x20
524#define GPOD_2SETIO3F 0x30
525
526#define GPOD_3MASK 0xc0
527#define GPOD_3SET1 0x00
528#define GPOD_3SET0 0x40
529#define GPOD_3SETR0 0x80
530#define GPOD_3SETIO3H 0xc0
531
532/*****************************************************************************/
533#endif
diff --git a/include/linux/serial167.h b/include/linux/serial167.h
deleted file mode 100644
index 59c81b708562..000000000000
--- a/include/linux/serial167.h
+++ /dev/null
@@ -1,157 +0,0 @@
1/*
2 * serial167.h
3 *
4 * Richard Hirst [richard@sleepie.demon.co.uk]
5 *
6 * Based on cyclades.h
7 */
8
9struct cyclades_monitor {
10 unsigned long int_count;
11 unsigned long char_count;
12 unsigned long char_max;
13 unsigned long char_last;
14};
15
16/*
17 * This is our internal structure for each serial port's state.
18 *
19 * Many fields are paralleled by the structure used by the serial_struct
20 * structure.
21 *
22 * For definitions of the flags field, see tty.h
23 */
24
25struct cyclades_port {
26 int magic;
27 int type;
28 int card;
29 int line;
30 int flags; /* defined in tty.h */
31 struct tty_struct *tty;
32 int read_status_mask;
33 int timeout;
34 int xmit_fifo_size;
35 int cor1,cor2,cor3,cor4,cor5,cor6,cor7;
36 int tbpr,tco,rbpr,rco;
37 int ignore_status_mask;
38 int close_delay;
39 int IER; /* Interrupt Enable Register */
40 unsigned long last_active;
41 int count; /* # of fd on device */
42 int x_char; /* to be pushed out ASAP */
43 int x_break;
44 int blocked_open; /* # of blocked opens */
45 unsigned char *xmit_buf;
46 int xmit_head;
47 int xmit_tail;
48 int xmit_cnt;
49 int default_threshold;
50 int default_timeout;
51 wait_queue_head_t open_wait;
52 wait_queue_head_t close_wait;
53 struct cyclades_monitor mon;
54};
55
56#define CYCLADES_MAGIC 0x4359
57
58#define CYGETMON 0x435901
59#define CYGETTHRESH 0x435902
60#define CYSETTHRESH 0x435903
61#define CYGETDEFTHRESH 0x435904
62#define CYSETDEFTHRESH 0x435905
63#define CYGETTIMEOUT 0x435906
64#define CYSETTIMEOUT 0x435907
65#define CYGETDEFTIMEOUT 0x435908
66#define CYSETDEFTIMEOUT 0x435909
67
68#define CyMaxChipsPerCard 1
69
70/**** cd2401 registers ****/
71
72#define CyGFRCR (0x81)
73#define CyCCR (0x13)
74#define CyCLR_CHAN (0x40)
75#define CyINIT_CHAN (0x20)
76#define CyCHIP_RESET (0x10)
77#define CyENB_XMTR (0x08)
78#define CyDIS_XMTR (0x04)
79#define CyENB_RCVR (0x02)
80#define CyDIS_RCVR (0x01)
81#define CyCAR (0xee)
82#define CyIER (0x11)
83#define CyMdmCh (0x80)
84#define CyRxExc (0x20)
85#define CyRxData (0x08)
86#define CyTxMpty (0x02)
87#define CyTxRdy (0x01)
88#define CyLICR (0x26)
89#define CyRISR (0x89)
90#define CyTIMEOUT (0x80)
91#define CySPECHAR (0x70)
92#define CyOVERRUN (0x08)
93#define CyPARITY (0x04)
94#define CyFRAME (0x02)
95#define CyBREAK (0x01)
96#define CyREOIR (0x84)
97#define CyTEOIR (0x85)
98#define CyMEOIR (0x86)
99#define CyNOTRANS (0x08)
100#define CyRFOC (0x30)
101#define CyRDR (0xf8)
102#define CyTDR (0xf8)
103#define CyMISR (0x8b)
104#define CyRISR (0x89)
105#define CyTISR (0x8a)
106#define CyMSVR1 (0xde)
107#define CyMSVR2 (0xdf)
108#define CyDSR (0x80)
109#define CyDCD (0x40)
110#define CyCTS (0x20)
111#define CyDTR (0x02)
112#define CyRTS (0x01)
113#define CyRTPRL (0x25)
114#define CyRTPRH (0x24)
115#define CyCOR1 (0x10)
116#define CyPARITY_NONE (0x00)
117#define CyPARITY_E (0x40)
118#define CyPARITY_O (0xC0)
119#define Cy_5_BITS (0x04)
120#define Cy_6_BITS (0x05)
121#define Cy_7_BITS (0x06)
122#define Cy_8_BITS (0x07)
123#define CyCOR2 (0x17)
124#define CyETC (0x20)
125#define CyCtsAE (0x02)
126#define CyCOR3 (0x16)
127#define Cy_1_STOP (0x02)
128#define Cy_2_STOP (0x04)
129#define CyCOR4 (0x15)
130#define CyREC_FIFO (0x0F) /* Receive FIFO threshold */
131#define CyCOR5 (0x14)
132#define CyCOR6 (0x18)
133#define CyCOR7 (0x07)
134#define CyRBPR (0xcb)
135#define CyRCOR (0xc8)
136#define CyTBPR (0xc3)
137#define CyTCOR (0xc0)
138#define CySCHR1 (0x1f)
139#define CySCHR2 (0x1e)
140#define CyTPR (0xda)
141#define CyPILR1 (0xe3)
142#define CyPILR2 (0xe0)
143#define CyPILR3 (0xe1)
144#define CyCMR (0x1b)
145#define CyASYNC (0x02)
146#define CyLICR (0x26)
147#define CyLIVR (0x09)
148#define CySCRL (0x23)
149#define CySCRH (0x22)
150#define CyTFTC (0x80)
151
152
153/* max number of chars in the FIFO */
154
155#define CyMAX_CHAR_FIFO 12
156
157/***************************************************************************/
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index a416e92012ef..c174c90fb3fb 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -65,11 +65,38 @@ enum {
65 * platform device. Using these will make your driver 65 * platform device. Using these will make your driver
66 * dependent on the 8250 driver. 66 * dependent on the 8250 driver.
67 */ 67 */
68struct uart_port; 68
69struct uart_8250_port; 69struct uart_8250_port {
70 struct uart_port port;
71 struct timer_list timer; /* "no irq" timer */
72 struct list_head list; /* ports on this IRQ */
73 unsigned short capabilities; /* port capabilities */
74 unsigned short bugs; /* port bugs */
75 unsigned int tx_loadsz; /* transmit fifo load size */
76 unsigned char acr;
77 unsigned char ier;
78 unsigned char lcr;
79 unsigned char mcr;
80 unsigned char mcr_mask; /* mask of user bits */
81 unsigned char mcr_force; /* mask of forced bits */
82 unsigned char cur_iotype; /* Running I/O type */
83
84 /*
85 * Some bits in registers are cleared on a read, so they must
86 * be saved whenever the register is read but the bits will not
87 * be immediately processed.
88 */
89#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
90 unsigned char lsr_saved_flags;
91#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
92 unsigned char msr_saved_flags;
93
94 /* 8250 specific callbacks */
95 int (*dl_read)(struct uart_8250_port *);
96 void (*dl_write)(struct uart_8250_port *, int);
97};
70 98
71int serial8250_register_8250_port(struct uart_8250_port *); 99int serial8250_register_8250_port(struct uart_8250_port *);
72int serial8250_register_port(struct uart_port *);
73void serial8250_unregister_port(int line); 100void serial8250_unregister_port(int line);
74void serial8250_suspend_port(int line); 101void serial8250_suspend_port(int line);
75void serial8250_resume_port(int line); 102void serial8250_resume_port(int line);
diff --git a/include/linux/stallion.h b/include/linux/stallion.h
deleted file mode 100644
index 336af33c6ea4..000000000000
--- a/include/linux/stallion.h
+++ /dev/null
@@ -1,147 +0,0 @@
1/*****************************************************************************/
2
3/*
4 * stallion.h -- stallion multiport serial driver.
5 *
6 * Copyright (C) 1996-1998 Stallion Technologies
7 * Copyright (C) 1994-1996 Greg Ungerer.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24/*****************************************************************************/
25#ifndef _STALLION_H
26#define _STALLION_H
27/*****************************************************************************/
28
29/*
30 * Define important driver constants here.
31 */
32#define STL_MAXBRDS 4
33#define STL_MAXPANELS 4
34#define STL_MAXBANKS 8
35#define STL_PORTSPERPANEL 16
36#define STL_MAXPORTS 64
37#define STL_MAXDEVS (STL_MAXBRDS * STL_MAXPORTS)
38
39
40/*
41 * Define a set of structures to hold all the board/panel/port info
42 * for our ports. These will be dynamically allocated as required.
43 */
44
45/*
46 * Define a ring queue structure for each port. This will hold the
47 * TX data waiting to be output. Characters are fed into this buffer
48 * from the line discipline (or even direct from user space!) and
49 * then fed into the UARTs during interrupts. Will use a classic ring
50 * queue here for this. The good thing about this type of ring queue
51 * is that the head and tail pointers can be updated without interrupt
52 * protection - since "write" code only needs to change the head, and
53 * interrupt code only needs to change the tail.
54 */
55struct stlrq {
56 char *buf;
57 char *head;
58 char *tail;
59};
60
61/*
62 * Port, panel and board structures to hold status info about each.
63 * The board structure contains pointers to structures for each panel
64 * connected to it, and in turn each panel structure contains pointers
65 * for each port structure for each port on that panel. Note that
66 * the port structure also contains the board and panel number that it
67 * is associated with, this makes it (fairly) easy to get back to the
68 * board/panel info for a port.
69 */
70struct stlport {
71 unsigned long magic;
72 struct tty_port port;
73 unsigned int portnr;
74 unsigned int panelnr;
75 unsigned int brdnr;
76 int ioaddr;
77 int uartaddr;
78 unsigned int pagenr;
79 unsigned long istate;
80 int baud_base;
81 int custom_divisor;
82 int close_delay;
83 int closing_wait;
84 int openwaitcnt;
85 int brklen;
86 unsigned int sigs;
87 unsigned int rxignoremsk;
88 unsigned int rxmarkmsk;
89 unsigned int imr;
90 unsigned int crenable;
91 unsigned long clk;
92 unsigned long hwid;
93 void *uartp;
94 comstats_t stats;
95 struct stlrq tx;
96};
97
98struct stlpanel {
99 unsigned long magic;
100 unsigned int panelnr;
101 unsigned int brdnr;
102 unsigned int pagenr;
103 unsigned int nrports;
104 int iobase;
105 void *uartp;
106 void (*isr)(struct stlpanel *panelp, unsigned int iobase);
107 unsigned int hwid;
108 unsigned int ackmask;
109 struct stlport *ports[STL_PORTSPERPANEL];
110};
111
112struct stlbrd {
113 unsigned long magic;
114 unsigned int brdnr;
115 unsigned int brdtype;
116 unsigned int state;
117 unsigned int nrpanels;
118 unsigned int nrports;
119 unsigned int nrbnks;
120 int irq;
121 int irqtype;
122 int (*isr)(struct stlbrd *brdp);
123 unsigned int ioaddr1;
124 unsigned int ioaddr2;
125 unsigned int iosize1;
126 unsigned int iosize2;
127 unsigned int iostatus;
128 unsigned int ioctrl;
129 unsigned int ioctrlval;
130 unsigned int hwid;
131 unsigned long clk;
132 unsigned int bnkpageaddr[STL_MAXBANKS];
133 unsigned int bnkstataddr[STL_MAXBANKS];
134 struct stlpanel *bnk2panel[STL_MAXBANKS];
135 struct stlpanel *panels[STL_MAXPANELS];
136};
137
138
139/*
140 * Define MAGIC numbers used for above structures.
141 */
142#define STL_PORTMAGIC 0x5a7182c9
143#define STL_PANELMAGIC 0x7ef621a1
144#define STL_BOARDMAGIC 0xa2267f52
145
146/*****************************************************************************/
147#endif
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 9f47ab540f65..a39e72325e78 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -103,28 +103,28 @@ struct tty_bufhead {
103#define TTY_PARITY 3 103#define TTY_PARITY 3
104#define TTY_OVERRUN 4 104#define TTY_OVERRUN 4
105 105
106#define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR]) 106#define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR])
107#define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT]) 107#define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT])
108#define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE]) 108#define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE])
109#define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL]) 109#define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL])
110#define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF]) 110#define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF])
111#define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME]) 111#define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME])
112#define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN]) 112#define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN])
113#define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC]) 113#define SWTC_CHAR(tty) ((tty)->termios.c_cc[VSWTC])
114#define START_CHAR(tty) ((tty)->termios->c_cc[VSTART]) 114#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART])
115#define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP]) 115#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP])
116#define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP]) 116#define SUSP_CHAR(tty) ((tty)->termios.c_cc[VSUSP])
117#define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL]) 117#define EOL_CHAR(tty) ((tty)->termios.c_cc[VEOL])
118#define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT]) 118#define REPRINT_CHAR(tty) ((tty)->termios.c_cc[VREPRINT])
119#define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD]) 119#define DISCARD_CHAR(tty) ((tty)->termios.c_cc[VDISCARD])
120#define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE]) 120#define WERASE_CHAR(tty) ((tty)->termios.c_cc[VWERASE])
121#define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT]) 121#define LNEXT_CHAR(tty) ((tty)->termios.c_cc[VLNEXT])
122#define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2]) 122#define EOL2_CHAR(tty) ((tty)->termios.c_cc[VEOL2])
123 123
124#define _I_FLAG(tty, f) ((tty)->termios->c_iflag & (f)) 124#define _I_FLAG(tty, f) ((tty)->termios.c_iflag & (f))
125#define _O_FLAG(tty, f) ((tty)->termios->c_oflag & (f)) 125#define _O_FLAG(tty, f) ((tty)->termios.c_oflag & (f))
126#define _C_FLAG(tty, f) ((tty)->termios->c_cflag & (f)) 126#define _C_FLAG(tty, f) ((tty)->termios.c_cflag & (f))
127#define _L_FLAG(tty, f) ((tty)->termios->c_lflag & (f)) 127#define _L_FLAG(tty, f) ((tty)->termios.c_lflag & (f))
128 128
129#define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK) 129#define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK)
130#define I_BRKINT(tty) _I_FLAG((tty), BRKINT) 130#define I_BRKINT(tty) _I_FLAG((tty), BRKINT)
@@ -271,7 +271,7 @@ struct tty_struct {
271 struct mutex termios_mutex; 271 struct mutex termios_mutex;
272 spinlock_t ctrl_lock; 272 spinlock_t ctrl_lock;
273 /* Termios values are protected by the termios mutex */ 273 /* Termios values are protected by the termios mutex */
274 struct ktermios *termios, *termios_locked; 274 struct ktermios termios, termios_locked;
275 struct termiox *termiox; /* May be NULL for unsupported */ 275 struct termiox *termiox; /* May be NULL for unsupported */
276 char name[64]; 276 char name[64];
277 struct pid *pgrp; /* Protected by ctrl lock */ 277 struct pid *pgrp; /* Protected by ctrl lock */
@@ -423,7 +423,6 @@ extern void tty_unthrottle(struct tty_struct *tty);
423extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws); 423extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
424extern void tty_driver_remove_tty(struct tty_driver *driver, 424extern void tty_driver_remove_tty(struct tty_driver *driver,
425 struct tty_struct *tty); 425 struct tty_struct *tty);
426extern void tty_shutdown(struct tty_struct *tty);
427extern void tty_free_termios(struct tty_struct *tty); 426extern void tty_free_termios(struct tty_struct *tty);
428extern int is_current_pgrp_orphaned(void); 427extern int is_current_pgrp_orphaned(void);
429extern struct pid *tty_get_pgrp(struct tty_struct *tty); 428extern struct pid *tty_get_pgrp(struct tty_struct *tty);
@@ -497,6 +496,9 @@ extern int tty_write_lock(struct tty_struct *tty, int ndelay);
497#define tty_is_writelocked(tty) (mutex_is_locked(&tty->atomic_write_lock)) 496#define tty_is_writelocked(tty) (mutex_is_locked(&tty->atomic_write_lock))
498 497
499extern void tty_port_init(struct tty_port *port); 498extern void tty_port_init(struct tty_port *port);
499extern struct device *tty_port_register_device(struct tty_port *port,
500 struct tty_driver *driver, unsigned index,
501 struct device *device);
500extern int tty_port_alloc_xmit_buf(struct tty_port *port); 502extern int tty_port_alloc_xmit_buf(struct tty_port *port);
501extern void tty_port_free_xmit_buf(struct tty_port *port); 503extern void tty_port_free_xmit_buf(struct tty_port *port);
502extern void tty_port_put(struct tty_port *port); 504extern void tty_port_put(struct tty_port *port);
@@ -521,6 +523,8 @@ extern int tty_port_close_start(struct tty_port *port,
521extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty); 523extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty);
522extern void tty_port_close(struct tty_port *port, 524extern void tty_port_close(struct tty_port *port,
523 struct tty_struct *tty, struct file *filp); 525 struct tty_struct *tty, struct file *filp);
526extern int tty_port_install(struct tty_port *port, struct tty_driver *driver,
527 struct tty_struct *tty);
524extern int tty_port_open(struct tty_port *port, 528extern int tty_port_open(struct tty_port *port,
525 struct tty_struct *tty, struct file *filp); 529 struct tty_struct *tty, struct file *filp);
526static inline int tty_port_users(struct tty_port *port) 530static inline int tty_port_users(struct tty_port *port)
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index 6e6dbb7447b6..80e72dc564a5 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -45,14 +45,9 @@
45 * 45 *
46 * void (*shutdown)(struct tty_struct * tty); 46 * void (*shutdown)(struct tty_struct * tty);
47 * 47 *
48 * This routine is called synchronously when a particular tty device 48 * This routine is called under the tty lock when a particular tty device
49 * is closed for the last time freeing up the resources. 49 * is closed for the last time. It executes before the tty resources
50 * Note that tty_shutdown() is not called if ops->shutdown is defined. 50 * are freed so may execute while another function holds a tty kref.
51 * This means one is responsible to take care of calling ops->remove (e.g.
52 * via tty_driver_remove_tty) and releasing tty->termios.
53 * Note that this hook may be called from *all* the contexts where one
54 * uses tty refcounting (e.g. tty_port_tty_get).
55 *
56 * 51 *
57 * void (*cleanup)(struct tty_struct * tty); 52 * void (*cleanup)(struct tty_struct * tty);
58 * 53 *
@@ -313,6 +308,7 @@ struct tty_driver {
313 * Pointer to the tty data structures 308 * Pointer to the tty data structures
314 */ 309 */
315 struct tty_struct **ttys; 310 struct tty_struct **ttys;
311 struct tty_port **ports;
316 struct ktermios **termios; 312 struct ktermios **termios;
317 void *driver_state; 313 void *driver_state;
318 314
diff --git a/include/net/irda/ircomm_tty.h b/include/net/irda/ircomm_tty.h
index 59ba38bc400f..80ffde3bb164 100644
--- a/include/net/irda/ircomm_tty.h
+++ b/include/net/irda/ircomm_tty.h
@@ -52,21 +52,16 @@
52/* Same for payload size. See qos.c for the smallest max data size */ 52/* Same for payload size. See qos.c for the smallest max data size */
53#define IRCOMM_TTY_DATA_UNINITIALISED (64 - IRCOMM_TTY_HDR_UNINITIALISED) 53#define IRCOMM_TTY_DATA_UNINITIALISED (64 - IRCOMM_TTY_HDR_UNINITIALISED)
54 54
55/* Those are really defined in include/linux/serial.h - Jean II */
56#define ASYNC_B_INITIALIZED 31 /* Serial port was initialized */
57#define ASYNC_B_NORMAL_ACTIVE 29 /* Normal device is active */
58#define ASYNC_B_CLOSING 27 /* Serial port is closing */
59
60/* 55/*
61 * IrCOMM TTY driver state 56 * IrCOMM TTY driver state
62 */ 57 */
63struct ircomm_tty_cb { 58struct ircomm_tty_cb {
64 irda_queue_t queue; /* Must be first */ 59 irda_queue_t queue; /* Must be first */
60 struct tty_port port;
65 magic_t magic; 61 magic_t magic;
66 62
67 int state; /* Connect state */ 63 int state; /* Connect state */
68 64
69 struct tty_struct *tty;
70 struct ircomm_cb *ircomm; /* IrCOMM layer instance */ 65 struct ircomm_cb *ircomm; /* IrCOMM layer instance */
71 66
72 struct sk_buff *tx_skb; /* Transmit buffer */ 67 struct sk_buff *tx_skb; /* Transmit buffer */
@@ -80,7 +75,6 @@ struct ircomm_tty_cb {
80 LOCAL_FLOW flow; /* IrTTP flow status */ 75 LOCAL_FLOW flow; /* IrTTP flow status */
81 76
82 int line; 77 int line;
83 unsigned long flags;
84 78
85 __u8 dlsap_sel; 79 __u8 dlsap_sel;
86 __u8 slsap_sel; 80 __u8 slsap_sel;
@@ -97,19 +91,10 @@ struct ircomm_tty_cb {
97 void *skey; 91 void *skey;
98 void *ckey; 92 void *ckey;
99 93
100 wait_queue_head_t open_wait;
101 wait_queue_head_t close_wait;
102 struct timer_list watchdog_timer; 94 struct timer_list watchdog_timer;
103 struct work_struct tqueue; 95 struct work_struct tqueue;
104 96
105 unsigned short close_delay;
106 unsigned short closing_wait; /* time to wait before closing */
107
108 int open_count;
109 int blocked_open; /* # of blocked opens */
110
111 /* Protect concurent access to : 97 /* Protect concurent access to :
112 * o self->open_count
113 * o self->ctrl_skb 98 * o self->ctrl_skb
114 * o self->tx_skb 99 * o self->tx_skb
115 * Maybe other things may gain to be protected as well... 100 * Maybe other things may gain to be protected as well...
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index cb960773c002..87ddd051881b 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -861,7 +861,7 @@ static int rfcomm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned l
861 861
862static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old) 862static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
863{ 863{
864 struct ktermios *new = tty->termios; 864 struct ktermios *new = &tty->termios;
865 int old_baud_rate = tty_termios_baud_rate(old); 865 int old_baud_rate = tty_termios_baud_rate(old);
866 int new_baud_rate = tty_termios_baud_rate(new); 866 int new_baud_rate = tty_termios_baud_rate(new);
867 867
diff --git a/net/irda/ircomm/ircomm_param.c b/net/irda/ircomm/ircomm_param.c
index 8b915f3ac3b9..308939128359 100644
--- a/net/irda/ircomm/ircomm_param.c
+++ b/net/irda/ircomm/ircomm_param.c
@@ -99,7 +99,6 @@ pi_param_info_t ircomm_param_info = { pi_major_call_table, 3, 0x0f, 4 };
99 */ 99 */
100int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush) 100int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
101{ 101{
102 struct tty_struct *tty;
103 unsigned long flags; 102 unsigned long flags;
104 struct sk_buff *skb; 103 struct sk_buff *skb;
105 int count; 104 int count;
@@ -109,10 +108,6 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
109 IRDA_ASSERT(self != NULL, return -1;); 108 IRDA_ASSERT(self != NULL, return -1;);
110 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); 109 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
111 110
112 tty = self->tty;
113 if (!tty)
114 return 0;
115
116 /* Make sure we don't send parameters for raw mode */ 111 /* Make sure we don't send parameters for raw mode */
117 if (self->service_type == IRCOMM_3_WIRE_RAW) 112 if (self->service_type == IRCOMM_3_WIRE_RAW)
118 return 0; 113 return 0;
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c
index 6b9d5a0e42f9..7a0d6115d06f 100644
--- a/net/irda/ircomm/ircomm_tty.c
+++ b/net/irda/ircomm/ircomm_tty.c
@@ -104,6 +104,35 @@ static const struct tty_operations ops = {
104#endif /* CONFIG_PROC_FS */ 104#endif /* CONFIG_PROC_FS */
105}; 105};
106 106
107static void ircomm_port_raise_dtr_rts(struct tty_port *port, int raise)
108{
109 struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb,
110 port);
111 /*
112 * Here, we use to lock those two guys, but as ircomm_param_request()
113 * does it itself, I don't see the point (and I see the deadlock).
114 * Jean II
115 */
116 if (raise)
117 self->settings.dte |= IRCOMM_RTS | IRCOMM_DTR;
118 else
119 self->settings.dte &= ~(IRCOMM_RTS | IRCOMM_DTR);
120
121 ircomm_param_request(self, IRCOMM_DTE, TRUE);
122}
123
124static int ircomm_port_carrier_raised(struct tty_port *port)
125{
126 struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb,
127 port);
128 return self->settings.dce & IRCOMM_CD;
129}
130
131static const struct tty_port_operations ircomm_port_ops = {
132 .dtr_rts = ircomm_port_raise_dtr_rts,
133 .carrier_raised = ircomm_port_carrier_raised,
134};
135
107/* 136/*
108 * Function ircomm_tty_init() 137 * Function ircomm_tty_init()
109 * 138 *
@@ -194,7 +223,7 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self)
194 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); 223 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
195 224
196 /* Check if already open */ 225 /* Check if already open */
197 if (test_and_set_bit(ASYNC_B_INITIALIZED, &self->flags)) { 226 if (test_and_set_bit(ASYNCB_INITIALIZED, &self->port.flags)) {
198 IRDA_DEBUG(2, "%s(), already open so break out!\n", __func__ ); 227 IRDA_DEBUG(2, "%s(), already open so break out!\n", __func__ );
199 return 0; 228 return 0;
200 } 229 }
@@ -231,7 +260,7 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self)
231 260
232 return 0; 261 return 0;
233err: 262err:
234 clear_bit(ASYNC_B_INITIALIZED, &self->flags); 263 clear_bit(ASYNCB_INITIALIZED, &self->port.flags);
235 return ret; 264 return ret;
236} 265}
237 266
@@ -242,72 +271,62 @@ err:
242 * 271 *
243 */ 272 */
244static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, 273static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
245 struct file *filp) 274 struct tty_struct *tty, struct file *filp)
246{ 275{
276 struct tty_port *port = &self->port;
247 DECLARE_WAITQUEUE(wait, current); 277 DECLARE_WAITQUEUE(wait, current);
248 int retval; 278 int retval;
249 int do_clocal = 0, extra_count = 0; 279 int do_clocal = 0, extra_count = 0;
250 unsigned long flags; 280 unsigned long flags;
251 struct tty_struct *tty;
252 281
253 IRDA_DEBUG(2, "%s()\n", __func__ ); 282 IRDA_DEBUG(2, "%s()\n", __func__ );
254 283
255 tty = self->tty;
256
257 /* 284 /*
258 * If non-blocking mode is set, or the port is not enabled, 285 * If non-blocking mode is set, or the port is not enabled,
259 * then make the check up front and then exit. 286 * then make the check up front and then exit.
260 */ 287 */
261 if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){ 288 if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){
262 /* nonblock mode is set or port is not enabled */ 289 /* nonblock mode is set or port is not enabled */
263 self->flags |= ASYNC_NORMAL_ACTIVE; 290 port->flags |= ASYNC_NORMAL_ACTIVE;
264 IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ ); 291 IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ );
265 return 0; 292 return 0;
266 } 293 }
267 294
268 if (tty->termios->c_cflag & CLOCAL) { 295 if (tty->termios.c_cflag & CLOCAL) {
269 IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ ); 296 IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ );
270 do_clocal = 1; 297 do_clocal = 1;
271 } 298 }
272 299
273 /* Wait for carrier detect and the line to become 300 /* Wait for carrier detect and the line to become
274 * free (i.e., not in use by the callout). While we are in 301 * free (i.e., not in use by the callout). While we are in
275 * this loop, self->open_count is dropped by one, so that 302 * this loop, port->count is dropped by one, so that
276 * mgsl_close() knows when to free things. We restore it upon 303 * mgsl_close() knows when to free things. We restore it upon
277 * exit, either normal or abnormal. 304 * exit, either normal or abnormal.
278 */ 305 */
279 306
280 retval = 0; 307 retval = 0;
281 add_wait_queue(&self->open_wait, &wait); 308 add_wait_queue(&port->open_wait, &wait);
282 309
283 IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n", 310 IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n",
284 __FILE__,__LINE__, tty->driver->name, self->open_count ); 311 __FILE__, __LINE__, tty->driver->name, port->count);
285 312
286 /* As far as I can see, we protect open_count - Jean II */ 313 spin_lock_irqsave(&port->lock, flags);
287 spin_lock_irqsave(&self->spinlock, flags);
288 if (!tty_hung_up_p(filp)) { 314 if (!tty_hung_up_p(filp)) {
289 extra_count = 1; 315 extra_count = 1;
290 self->open_count--; 316 port->count--;
291 } 317 }
292 spin_unlock_irqrestore(&self->spinlock, flags); 318 spin_unlock_irqrestore(&port->lock, flags);
293 self->blocked_open++; 319 port->blocked_open++;
294 320
295 while (1) { 321 while (1) {
296 if (tty->termios->c_cflag & CBAUD) { 322 if (tty->termios.c_cflag & CBAUD)
297 /* Here, we use to lock those two guys, but 323 tty_port_raise_dtr_rts(port);
298 * as ircomm_param_request() does it itself,
299 * I don't see the point (and I see the deadlock).
300 * Jean II */
301 self->settings.dte |= IRCOMM_RTS + IRCOMM_DTR;
302
303 ircomm_param_request(self, IRCOMM_DTE, TRUE);
304 }
305 324
306 current->state = TASK_INTERRUPTIBLE; 325 current->state = TASK_INTERRUPTIBLE;
307 326
308 if (tty_hung_up_p(filp) || 327 if (tty_hung_up_p(filp) ||
309 !test_bit(ASYNC_B_INITIALIZED, &self->flags)) { 328 !test_bit(ASYNCB_INITIALIZED, &port->flags)) {
310 retval = (self->flags & ASYNC_HUP_NOTIFY) ? 329 retval = (port->flags & ASYNC_HUP_NOTIFY) ?
311 -EAGAIN : -ERESTARTSYS; 330 -EAGAIN : -ERESTARTSYS;
312 break; 331 break;
313 } 332 }
@@ -317,8 +336,8 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
317 * specified, we cannot return before the IrCOMM link is 336 * specified, we cannot return before the IrCOMM link is
318 * ready 337 * ready
319 */ 338 */
320 if (!test_bit(ASYNC_B_CLOSING, &self->flags) && 339 if (!test_bit(ASYNCB_CLOSING, &port->flags) &&
321 (do_clocal || (self->settings.dce & IRCOMM_CD)) && 340 (do_clocal || tty_port_carrier_raised(port)) &&
322 self->state == IRCOMM_TTY_READY) 341 self->state == IRCOMM_TTY_READY)
323 { 342 {
324 break; 343 break;
@@ -330,27 +349,27 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
330 } 349 }
331 350
332 IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n", 351 IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n",
333 __FILE__,__LINE__, tty->driver->name, self->open_count ); 352 __FILE__, __LINE__, tty->driver->name, port->count);
334 353
335 schedule(); 354 schedule();
336 } 355 }
337 356
338 __set_current_state(TASK_RUNNING); 357 __set_current_state(TASK_RUNNING);
339 remove_wait_queue(&self->open_wait, &wait); 358 remove_wait_queue(&port->open_wait, &wait);
340 359
341 if (extra_count) { 360 if (extra_count) {
342 /* ++ is not atomic, so this should be protected - Jean II */ 361 /* ++ is not atomic, so this should be protected - Jean II */
343 spin_lock_irqsave(&self->spinlock, flags); 362 spin_lock_irqsave(&port->lock, flags);
344 self->open_count++; 363 port->count++;
345 spin_unlock_irqrestore(&self->spinlock, flags); 364 spin_unlock_irqrestore(&port->lock, flags);
346 } 365 }
347 self->blocked_open--; 366 port->blocked_open--;
348 367
349 IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n", 368 IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n",
350 __FILE__,__LINE__, tty->driver->name, self->open_count); 369 __FILE__, __LINE__, tty->driver->name, port->count);
351 370
352 if (!retval) 371 if (!retval)
353 self->flags |= ASYNC_NORMAL_ACTIVE; 372 port->flags |= ASYNC_NORMAL_ACTIVE;
354 373
355 return retval; 374 return retval;
356} 375}
@@ -381,6 +400,8 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
381 return -ENOMEM; 400 return -ENOMEM;
382 } 401 }
383 402
403 tty_port_init(&self->port);
404 self->port.ops = &ircomm_port_ops;
384 self->magic = IRCOMM_TTY_MAGIC; 405 self->magic = IRCOMM_TTY_MAGIC;
385 self->flow = FLOW_STOP; 406 self->flow = FLOW_STOP;
386 407
@@ -388,13 +409,9 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
388 INIT_WORK(&self->tqueue, ircomm_tty_do_softint); 409 INIT_WORK(&self->tqueue, ircomm_tty_do_softint);
389 self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED; 410 self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED;
390 self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED; 411 self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED;
391 self->close_delay = 5*HZ/10;
392 self->closing_wait = 30*HZ;
393 412
394 /* Init some important stuff */ 413 /* Init some important stuff */
395 init_timer(&self->watchdog_timer); 414 init_timer(&self->watchdog_timer);
396 init_waitqueue_head(&self->open_wait);
397 init_waitqueue_head(&self->close_wait);
398 spin_lock_init(&self->spinlock); 415 spin_lock_init(&self->spinlock);
399 416
400 /* 417 /*
@@ -404,31 +421,32 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
404 * 421 *
405 * Note this is completely usafe and doesn't work properly 422 * Note this is completely usafe and doesn't work properly
406 */ 423 */
407 tty->termios->c_iflag = 0; 424 tty->termios.c_iflag = 0;
408 tty->termios->c_oflag = 0; 425 tty->termios.c_oflag = 0;
409 426
410 /* Insert into hash */ 427 /* Insert into hash */
428 /* FIXME there is a window from find to here */
411 hashbin_insert(ircomm_tty, (irda_queue_t *) self, line, NULL); 429 hashbin_insert(ircomm_tty, (irda_queue_t *) self, line, NULL);
412 } 430 }
413 /* ++ is not atomic, so this should be protected - Jean II */ 431 /* ++ is not atomic, so this should be protected - Jean II */
414 spin_lock_irqsave(&self->spinlock, flags); 432 spin_lock_irqsave(&self->port.lock, flags);
415 self->open_count++; 433 self->port.count++;
416 434
417 tty->driver_data = self; 435 tty->driver_data = self;
418 self->tty = tty; 436 spin_unlock_irqrestore(&self->port.lock, flags);
419 spin_unlock_irqrestore(&self->spinlock, flags); 437 tty_port_tty_set(&self->port, tty);
420 438
421 IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name, 439 IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name,
422 self->line, self->open_count); 440 self->line, self->port.count);
423 441
424 /* Not really used by us, but lets do it anyway */ 442 /* Not really used by us, but lets do it anyway */
425 self->tty->low_latency = (self->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 443 tty->low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
426 444
427 /* 445 /*
428 * If the port is the middle of closing, bail out now 446 * If the port is the middle of closing, bail out now
429 */ 447 */
430 if (tty_hung_up_p(filp) || 448 if (tty_hung_up_p(filp) ||
431 test_bit(ASYNC_B_CLOSING, &self->flags)) { 449 test_bit(ASYNCB_CLOSING, &self->port.flags)) {
432 450
433 /* Hm, why are we blocking on ASYNC_CLOSING if we 451 /* Hm, why are we blocking on ASYNC_CLOSING if we
434 * do return -EAGAIN/-ERESTARTSYS below anyway? 452 * do return -EAGAIN/-ERESTARTSYS below anyway?
@@ -438,14 +456,15 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
438 * probably better sleep uninterruptible? 456 * probably better sleep uninterruptible?
439 */ 457 */
440 458
441 if (wait_event_interruptible(self->close_wait, !test_bit(ASYNC_B_CLOSING, &self->flags))) { 459 if (wait_event_interruptible(self->port.close_wait,
460 !test_bit(ASYNCB_CLOSING, &self->port.flags))) {
442 IRDA_WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n", 461 IRDA_WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n",
443 __func__); 462 __func__);
444 return -ERESTARTSYS; 463 return -ERESTARTSYS;
445 } 464 }
446 465
447#ifdef SERIAL_DO_RESTART 466#ifdef SERIAL_DO_RESTART
448 return (self->flags & ASYNC_HUP_NOTIFY) ? 467 return (self->port.flags & ASYNC_HUP_NOTIFY) ?
449 -EAGAIN : -ERESTARTSYS; 468 -EAGAIN : -ERESTARTSYS;
450#else 469#else
451 return -EAGAIN; 470 return -EAGAIN;
@@ -469,7 +488,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
469 if (ret) 488 if (ret)
470 return ret; 489 return ret;
471 490
472 ret = ircomm_tty_block_til_ready(self, filp); 491 ret = ircomm_tty_block_til_ready(self, tty, filp);
473 if (ret) { 492 if (ret) {
474 IRDA_DEBUG(2, 493 IRDA_DEBUG(2,
475 "%s(), returning after block_til_ready with %d\n", __func__ , 494 "%s(), returning after block_til_ready with %d\n", __func__ ,
@@ -489,81 +508,22 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
489static void ircomm_tty_close(struct tty_struct *tty, struct file *filp) 508static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
490{ 509{
491 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; 510 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
492 unsigned long flags; 511 struct tty_port *port = &self->port;
493 512
494 IRDA_DEBUG(0, "%s()\n", __func__ ); 513 IRDA_DEBUG(0, "%s()\n", __func__ );
495 514
496 IRDA_ASSERT(self != NULL, return;); 515 IRDA_ASSERT(self != NULL, return;);
497 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); 516 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
498 517
499 spin_lock_irqsave(&self->spinlock, flags); 518 if (tty_port_close_start(port, tty, filp) == 0)
500
501 if (tty_hung_up_p(filp)) {
502 spin_unlock_irqrestore(&self->spinlock, flags);
503
504 IRDA_DEBUG(0, "%s(), returning 1\n", __func__ );
505 return;
506 }
507
508 if ((tty->count == 1) && (self->open_count != 1)) {
509 /*
510 * Uh, oh. tty->count is 1, which means that the tty
511 * structure will be freed. state->count should always
512 * be one in these conditions. If it's greater than
513 * one, we've got real problems, since it means the
514 * serial port won't be shutdown.
515 */
516 IRDA_DEBUG(0, "%s(), bad serial port count; "
517 "tty->count is 1, state->count is %d\n", __func__ ,
518 self->open_count);
519 self->open_count = 1;
520 }
521
522 if (--self->open_count < 0) {
523 IRDA_ERROR("%s(), bad serial port count for ttys%d: %d\n",
524 __func__, self->line, self->open_count);
525 self->open_count = 0;
526 }
527 if (self->open_count) {
528 spin_unlock_irqrestore(&self->spinlock, flags);
529
530 IRDA_DEBUG(0, "%s(), open count > 0\n", __func__ );
531 return; 519 return;
532 }
533
534 /* Hum... Should be test_and_set_bit ??? - Jean II */
535 set_bit(ASYNC_B_CLOSING, &self->flags);
536
537 /* We need to unlock here (we were unlocking at the end of this
538 * function), because tty_wait_until_sent() may schedule.
539 * I don't know if the rest should be protected somehow,
540 * so someone should check. - Jean II */
541 spin_unlock_irqrestore(&self->spinlock, flags);
542
543 /*
544 * Now we wait for the transmit buffer to clear; and we notify
545 * the line discipline to only process XON/XOFF characters.
546 */
547 tty->closing = 1;
548 if (self->closing_wait != ASYNC_CLOSING_WAIT_NONE)
549 tty_wait_until_sent_from_close(tty, self->closing_wait);
550 520
551 ircomm_tty_shutdown(self); 521 ircomm_tty_shutdown(self);
552 522
553 tty_driver_flush_buffer(tty); 523 tty_driver_flush_buffer(tty);
554 tty_ldisc_flush(tty);
555 524
556 tty->closing = 0; 525 tty_port_close_end(port, tty);
557 self->tty = NULL; 526 tty_port_tty_set(port, NULL);
558
559 if (self->blocked_open) {
560 if (self->close_delay)
561 schedule_timeout_interruptible(self->close_delay);
562 wake_up_interruptible(&self->open_wait);
563 }
564
565 self->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
566 wake_up_interruptible(&self->close_wait);
567} 527}
568 528
569/* 529/*
@@ -606,7 +566,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
606 if (!self || self->magic != IRCOMM_TTY_MAGIC) 566 if (!self || self->magic != IRCOMM_TTY_MAGIC)
607 return; 567 return;
608 568
609 tty = self->tty; 569 tty = tty_port_tty_get(&self->port);
610 if (!tty) 570 if (!tty)
611 return; 571 return;
612 572
@@ -627,7 +587,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
627 } 587 }
628 588
629 if (tty->hw_stopped) 589 if (tty->hw_stopped)
630 return; 590 goto put;
631 591
632 /* Unlink transmit buffer */ 592 /* Unlink transmit buffer */
633 spin_lock_irqsave(&self->spinlock, flags); 593 spin_lock_irqsave(&self->spinlock, flags);
@@ -646,6 +606,8 @@ static void ircomm_tty_do_softint(struct work_struct *work)
646 606
647 /* Check if user (still) wants to be waken up */ 607 /* Check if user (still) wants to be waken up */
648 tty_wakeup(tty); 608 tty_wakeup(tty);
609put:
610 tty_kref_put(tty);
649} 611}
650 612
651/* 613/*
@@ -880,7 +842,7 @@ static void ircomm_tty_throttle(struct tty_struct *tty)
880 ircomm_tty_send_xchar(tty, STOP_CHAR(tty)); 842 ircomm_tty_send_xchar(tty, STOP_CHAR(tty));
881 843
882 /* Hardware flow control? */ 844 /* Hardware flow control? */
883 if (tty->termios->c_cflag & CRTSCTS) { 845 if (tty->termios.c_cflag & CRTSCTS) {
884 self->settings.dte &= ~IRCOMM_RTS; 846 self->settings.dte &= ~IRCOMM_RTS;
885 self->settings.dte |= IRCOMM_DELTA_RTS; 847 self->settings.dte |= IRCOMM_DELTA_RTS;
886 848
@@ -912,7 +874,7 @@ static void ircomm_tty_unthrottle(struct tty_struct *tty)
912 } 874 }
913 875
914 /* Using hardware flow control? */ 876 /* Using hardware flow control? */
915 if (tty->termios->c_cflag & CRTSCTS) { 877 if (tty->termios.c_cflag & CRTSCTS) {
916 self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS); 878 self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS);
917 879
918 ircomm_param_request(self, IRCOMM_DTE, TRUE); 880 ircomm_param_request(self, IRCOMM_DTE, TRUE);
@@ -955,7 +917,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
955 917
956 IRDA_DEBUG(0, "%s()\n", __func__ ); 918 IRDA_DEBUG(0, "%s()\n", __func__ );
957 919
958 if (!test_and_clear_bit(ASYNC_B_INITIALIZED, &self->flags)) 920 if (!test_and_clear_bit(ASYNCB_INITIALIZED, &self->port.flags))
959 return; 921 return;
960 922
961 ircomm_tty_detach_cable(self); 923 ircomm_tty_detach_cable(self);
@@ -994,6 +956,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
994static void ircomm_tty_hangup(struct tty_struct *tty) 956static void ircomm_tty_hangup(struct tty_struct *tty)
995{ 957{
996 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; 958 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
959 struct tty_port *port = &self->port;
997 unsigned long flags; 960 unsigned long flags;
998 961
999 IRDA_DEBUG(0, "%s()\n", __func__ ); 962 IRDA_DEBUG(0, "%s()\n", __func__ );
@@ -1004,14 +967,17 @@ static void ircomm_tty_hangup(struct tty_struct *tty)
1004 /* ircomm_tty_flush_buffer(tty); */ 967 /* ircomm_tty_flush_buffer(tty); */
1005 ircomm_tty_shutdown(self); 968 ircomm_tty_shutdown(self);
1006 969
1007 /* I guess we need to lock here - Jean II */ 970 spin_lock_irqsave(&port->lock, flags);
1008 spin_lock_irqsave(&self->spinlock, flags); 971 port->flags &= ~ASYNC_NORMAL_ACTIVE;
1009 self->flags &= ~ASYNC_NORMAL_ACTIVE; 972 if (port->tty) {
1010 self->tty = NULL; 973 set_bit(TTY_IO_ERROR, &port->tty->flags);
1011 self->open_count = 0; 974 tty_kref_put(port->tty);
1012 spin_unlock_irqrestore(&self->spinlock, flags); 975 }
976 port->tty = NULL;
977 port->count = 0;
978 spin_unlock_irqrestore(&port->lock, flags);
1013 979
1014 wake_up_interruptible(&self->open_wait); 980 wake_up_interruptible(&port->open_wait);
1015} 981}
1016 982
1017/* 983/*
@@ -1071,20 +1037,20 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
1071 IRDA_ASSERT(self != NULL, return;); 1037 IRDA_ASSERT(self != NULL, return;);
1072 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); 1038 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
1073 1039
1074 tty = self->tty; 1040 tty = tty_port_tty_get(&self->port);
1075 1041
1076 status = self->settings.dce; 1042 status = self->settings.dce;
1077 1043
1078 if (status & IRCOMM_DCE_DELTA_ANY) { 1044 if (status & IRCOMM_DCE_DELTA_ANY) {
1079 /*wake_up_interruptible(&self->delta_msr_wait);*/ 1045 /*wake_up_interruptible(&self->delta_msr_wait);*/
1080 } 1046 }
1081 if ((self->flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) { 1047 if ((self->port.flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) {
1082 IRDA_DEBUG(2, 1048 IRDA_DEBUG(2,
1083 "%s(), ircomm%d CD now %s...\n", __func__ , self->line, 1049 "%s(), ircomm%d CD now %s...\n", __func__ , self->line,
1084 (status & IRCOMM_CD) ? "on" : "off"); 1050 (status & IRCOMM_CD) ? "on" : "off");
1085 1051
1086 if (status & IRCOMM_CD) { 1052 if (status & IRCOMM_CD) {
1087 wake_up_interruptible(&self->open_wait); 1053 wake_up_interruptible(&self->port.open_wait);
1088 } else { 1054 } else {
1089 IRDA_DEBUG(2, 1055 IRDA_DEBUG(2,
1090 "%s(), Doing serial hangup..\n", __func__ ); 1056 "%s(), Doing serial hangup..\n", __func__ );
@@ -1092,10 +1058,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
1092 tty_hangup(tty); 1058 tty_hangup(tty);
1093 1059
1094 /* Hangup will remote the tty, so better break out */ 1060 /* Hangup will remote the tty, so better break out */
1095 return; 1061 goto put;
1096 } 1062 }
1097 } 1063 }
1098 if (self->flags & ASYNC_CTS_FLOW) { 1064 if (tty && self->port.flags & ASYNC_CTS_FLOW) {
1099 if (tty->hw_stopped) { 1065 if (tty->hw_stopped) {
1100 if (status & IRCOMM_CTS) { 1066 if (status & IRCOMM_CTS) {
1101 IRDA_DEBUG(2, 1067 IRDA_DEBUG(2,
@@ -1103,10 +1069,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
1103 tty->hw_stopped = 0; 1069 tty->hw_stopped = 0;
1104 1070
1105 /* Wake up processes blocked on open */ 1071 /* Wake up processes blocked on open */
1106 wake_up_interruptible(&self->open_wait); 1072 wake_up_interruptible(&self->port.open_wait);
1107 1073
1108 schedule_work(&self->tqueue); 1074 schedule_work(&self->tqueue);
1109 return; 1075 goto put;
1110 } 1076 }
1111 } else { 1077 } else {
1112 if (!(status & IRCOMM_CTS)) { 1078 if (!(status & IRCOMM_CTS)) {
@@ -1116,6 +1082,8 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
1116 } 1082 }
1117 } 1083 }
1118 } 1084 }
1085put:
1086 tty_kref_put(tty);
1119} 1087}
1120 1088
1121/* 1089/*
@@ -1128,6 +1096,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
1128 struct sk_buff *skb) 1096 struct sk_buff *skb)
1129{ 1097{
1130 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; 1098 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
1099 struct tty_struct *tty;
1131 1100
1132 IRDA_DEBUG(2, "%s()\n", __func__ ); 1101 IRDA_DEBUG(2, "%s()\n", __func__ );
1133 1102
@@ -1135,7 +1104,8 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
1135 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); 1104 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
1136 IRDA_ASSERT(skb != NULL, return -1;); 1105 IRDA_ASSERT(skb != NULL, return -1;);
1137 1106
1138 if (!self->tty) { 1107 tty = tty_port_tty_get(&self->port);
1108 if (!tty) {
1139 IRDA_DEBUG(0, "%s(), no tty!\n", __func__ ); 1109 IRDA_DEBUG(0, "%s(), no tty!\n", __func__ );
1140 return 0; 1110 return 0;
1141 } 1111 }
@@ -1146,7 +1116,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
1146 * Devices like WinCE can do this, and since they don't send any 1116 * Devices like WinCE can do this, and since they don't send any
1147 * params, we can just as well declare the hardware for running. 1117 * params, we can just as well declare the hardware for running.
1148 */ 1118 */
1149 if (self->tty->hw_stopped && (self->flow == FLOW_START)) { 1119 if (tty->hw_stopped && (self->flow == FLOW_START)) {
1150 IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ ); 1120 IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ );
1151 ircomm_param_request(self, IRCOMM_POLL, TRUE); 1121 ircomm_param_request(self, IRCOMM_POLL, TRUE);
1152 1122
@@ -1159,8 +1129,9 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
1159 * Use flip buffer functions since the code may be called from interrupt 1129 * Use flip buffer functions since the code may be called from interrupt
1160 * context 1130 * context
1161 */ 1131 */
1162 tty_insert_flip_string(self->tty, skb->data, skb->len); 1132 tty_insert_flip_string(tty, skb->data, skb->len);
1163 tty_flip_buffer_push(self->tty); 1133 tty_flip_buffer_push(tty);
1134 tty_kref_put(tty);
1164 1135
1165 /* No need to kfree_skb - see ircomm_ttp_data_indication() */ 1136 /* No need to kfree_skb - see ircomm_ttp_data_indication() */
1166 1137
@@ -1211,12 +1182,13 @@ static void ircomm_tty_flow_indication(void *instance, void *sap,
1211 IRDA_ASSERT(self != NULL, return;); 1182 IRDA_ASSERT(self != NULL, return;);
1212 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); 1183 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
1213 1184
1214 tty = self->tty; 1185 tty = tty_port_tty_get(&self->port);
1215 1186
1216 switch (cmd) { 1187 switch (cmd) {
1217 case FLOW_START: 1188 case FLOW_START:
1218 IRDA_DEBUG(2, "%s(), hw start!\n", __func__ ); 1189 IRDA_DEBUG(2, "%s(), hw start!\n", __func__ );
1219 tty->hw_stopped = 0; 1190 if (tty)
1191 tty->hw_stopped = 0;
1220 1192
1221 /* ircomm_tty_do_softint will take care of the rest */ 1193 /* ircomm_tty_do_softint will take care of the rest */
1222 schedule_work(&self->tqueue); 1194 schedule_work(&self->tqueue);
@@ -1224,15 +1196,19 @@ static void ircomm_tty_flow_indication(void *instance, void *sap,
1224 default: /* If we get here, something is very wrong, better stop */ 1196 default: /* If we get here, something is very wrong, better stop */
1225 case FLOW_STOP: 1197 case FLOW_STOP:
1226 IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ ); 1198 IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ );
1227 tty->hw_stopped = 1; 1199 if (tty)
1200 tty->hw_stopped = 1;
1228 break; 1201 break;
1229 } 1202 }
1203
1204 tty_kref_put(tty);
1230 self->flow = cmd; 1205 self->flow = cmd;
1231} 1206}
1232 1207
1233#ifdef CONFIG_PROC_FS 1208#ifdef CONFIG_PROC_FS
1234static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m) 1209static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
1235{ 1210{
1211 struct tty_struct *tty;
1236 char sep; 1212 char sep;
1237 1213
1238 seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]); 1214 seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]);
@@ -1328,40 +1304,43 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
1328 1304
1329 seq_puts(m, "Flags:"); 1305 seq_puts(m, "Flags:");
1330 sep = ' '; 1306 sep = ' ';
1331 if (self->flags & ASYNC_CTS_FLOW) { 1307 if (self->port.flags & ASYNC_CTS_FLOW) {
1332 seq_printf(m, "%cASYNC_CTS_FLOW", sep); 1308 seq_printf(m, "%cASYNC_CTS_FLOW", sep);
1333 sep = '|'; 1309 sep = '|';
1334 } 1310 }
1335 if (self->flags & ASYNC_CHECK_CD) { 1311 if (self->port.flags & ASYNC_CHECK_CD) {
1336 seq_printf(m, "%cASYNC_CHECK_CD", sep); 1312 seq_printf(m, "%cASYNC_CHECK_CD", sep);
1337 sep = '|'; 1313 sep = '|';
1338 } 1314 }
1339 if (self->flags & ASYNC_INITIALIZED) { 1315 if (self->port.flags & ASYNC_INITIALIZED) {
1340 seq_printf(m, "%cASYNC_INITIALIZED", sep); 1316 seq_printf(m, "%cASYNC_INITIALIZED", sep);
1341 sep = '|'; 1317 sep = '|';
1342 } 1318 }
1343 if (self->flags & ASYNC_LOW_LATENCY) { 1319 if (self->port.flags & ASYNC_LOW_LATENCY) {
1344 seq_printf(m, "%cASYNC_LOW_LATENCY", sep); 1320 seq_printf(m, "%cASYNC_LOW_LATENCY", sep);
1345 sep = '|'; 1321 sep = '|';
1346 } 1322 }
1347 if (self->flags & ASYNC_CLOSING) { 1323 if (self->port.flags & ASYNC_CLOSING) {
1348 seq_printf(m, "%cASYNC_CLOSING", sep); 1324 seq_printf(m, "%cASYNC_CLOSING", sep);
1349 sep = '|'; 1325 sep = '|';
1350 } 1326 }
1351 if (self->flags & ASYNC_NORMAL_ACTIVE) { 1327 if (self->port.flags & ASYNC_NORMAL_ACTIVE) {
1352 seq_printf(m, "%cASYNC_NORMAL_ACTIVE", sep); 1328 seq_printf(m, "%cASYNC_NORMAL_ACTIVE", sep);
1353 sep = '|'; 1329 sep = '|';
1354 } 1330 }
1355 seq_putc(m, '\n'); 1331 seq_putc(m, '\n');
1356 1332
1357 seq_printf(m, "Role: %s\n", self->client ? "client" : "server"); 1333 seq_printf(m, "Role: %s\n", self->client ? "client" : "server");
1358 seq_printf(m, "Open count: %d\n", self->open_count); 1334 seq_printf(m, "Open count: %d\n", self->port.count);
1359 seq_printf(m, "Max data size: %d\n", self->max_data_size); 1335 seq_printf(m, "Max data size: %d\n", self->max_data_size);
1360 seq_printf(m, "Max header size: %d\n", self->max_header_size); 1336 seq_printf(m, "Max header size: %d\n", self->max_header_size);
1361 1337
1362 if (self->tty) 1338 tty = tty_port_tty_get(&self->port);
1339 if (tty) {
1363 seq_printf(m, "Hardware: %s\n", 1340 seq_printf(m, "Hardware: %s\n",
1364 self->tty->hw_stopped ? "Stopped" : "Running"); 1341 tty->hw_stopped ? "Stopped" : "Running");
1342 tty_kref_put(tty);
1343 }
1365} 1344}
1366 1345
1367static int ircomm_tty_proc_show(struct seq_file *m, void *v) 1346static int ircomm_tty_proc_show(struct seq_file *m, void *v)
diff --git a/net/irda/ircomm/ircomm_tty_attach.c b/net/irda/ircomm/ircomm_tty_attach.c
index b65d66e0d817..3ab70e7a0715 100644
--- a/net/irda/ircomm/ircomm_tty_attach.c
+++ b/net/irda/ircomm/ircomm_tty_attach.c
@@ -130,6 +130,8 @@ static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
130 */ 130 */
131int ircomm_tty_attach_cable(struct ircomm_tty_cb *self) 131int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
132{ 132{
133 struct tty_struct *tty;
134
133 IRDA_DEBUG(0, "%s()\n", __func__ ); 135 IRDA_DEBUG(0, "%s()\n", __func__ );
134 136
135 IRDA_ASSERT(self != NULL, return -1;); 137 IRDA_ASSERT(self != NULL, return -1;);
@@ -142,7 +144,11 @@ int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
142 } 144 }
143 145
144 /* Make sure nobody tries to write before the link is up */ 146 /* Make sure nobody tries to write before the link is up */
145 self->tty->hw_stopped = 1; 147 tty = tty_port_tty_get(&self->port);
148 if (tty) {
149 tty->hw_stopped = 1;
150 tty_kref_put(tty);
151 }
146 152
147 ircomm_tty_ias_register(self); 153 ircomm_tty_ias_register(self);
148 154
@@ -398,23 +404,26 @@ void ircomm_tty_disconnect_indication(void *instance, void *sap,
398 struct sk_buff *skb) 404 struct sk_buff *skb)
399{ 405{
400 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; 406 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
407 struct tty_struct *tty;
401 408
402 IRDA_DEBUG(2, "%s()\n", __func__ ); 409 IRDA_DEBUG(2, "%s()\n", __func__ );
403 410
404 IRDA_ASSERT(self != NULL, return;); 411 IRDA_ASSERT(self != NULL, return;);
405 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); 412 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
406 413
407 if (!self->tty) 414 tty = tty_port_tty_get(&self->port);
415 if (!tty)
408 return; 416 return;
409 417
410 /* This will stop control data transfers */ 418 /* This will stop control data transfers */
411 self->flow = FLOW_STOP; 419 self->flow = FLOW_STOP;
412 420
413 /* Stop data transfers */ 421 /* Stop data transfers */
414 self->tty->hw_stopped = 1; 422 tty->hw_stopped = 1;
415 423
416 ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL, 424 ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL,
417 NULL); 425 NULL);
426 tty_kref_put(tty);
418} 427}
419 428
420/* 429/*
@@ -550,12 +559,15 @@ void ircomm_tty_connect_indication(void *instance, void *sap,
550 */ 559 */
551void ircomm_tty_link_established(struct ircomm_tty_cb *self) 560void ircomm_tty_link_established(struct ircomm_tty_cb *self)
552{ 561{
562 struct tty_struct *tty;
563
553 IRDA_DEBUG(2, "%s()\n", __func__ ); 564 IRDA_DEBUG(2, "%s()\n", __func__ );
554 565
555 IRDA_ASSERT(self != NULL, return;); 566 IRDA_ASSERT(self != NULL, return;);
556 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); 567 IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
557 568
558 if (!self->tty) 569 tty = tty_port_tty_get(&self->port);
570 if (!tty)
559 return; 571 return;
560 572
561 del_timer(&self->watchdog_timer); 573 del_timer(&self->watchdog_timer);
@@ -566,19 +578,22 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
566 * will have to wait for the peer device (DCE) to raise the CTS 578 * will have to wait for the peer device (DCE) to raise the CTS
567 * line. 579 * line.
568 */ 580 */
569 if ((self->flags & ASYNC_CTS_FLOW) && ((self->settings.dce & IRCOMM_CTS) == 0)) { 581 if ((self->port.flags & ASYNC_CTS_FLOW) &&
582 ((self->settings.dce & IRCOMM_CTS) == 0)) {
570 IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ ); 583 IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ );
571 return; 584 goto put;
572 } else { 585 } else {
573 IRDA_DEBUG(1, "%s(), starting hardware!\n", __func__ ); 586 IRDA_DEBUG(1, "%s(), starting hardware!\n", __func__ );
574 587
575 self->tty->hw_stopped = 0; 588 tty->hw_stopped = 0;
576 589
577 /* Wake up processes blocked on open */ 590 /* Wake up processes blocked on open */
578 wake_up_interruptible(&self->open_wait); 591 wake_up_interruptible(&self->port.open_wait);
579 } 592 }
580 593
581 schedule_work(&self->tqueue); 594 schedule_work(&self->tqueue);
595put:
596 tty_kref_put(tty);
582} 597}
583 598
584/* 599/*
@@ -977,14 +992,17 @@ static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
977 ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); 992 ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH);
978 ircomm_tty_start_watchdog_timer(self, 3*HZ); 993 ircomm_tty_start_watchdog_timer(self, 3*HZ);
979 994
980 if (self->flags & ASYNC_CHECK_CD) { 995 if (self->port.flags & ASYNC_CHECK_CD) {
981 /* Drop carrier */ 996 /* Drop carrier */
982 self->settings.dce = IRCOMM_DELTA_CD; 997 self->settings.dce = IRCOMM_DELTA_CD;
983 ircomm_tty_check_modem_status(self); 998 ircomm_tty_check_modem_status(self);
984 } else { 999 } else {
1000 struct tty_struct *tty = tty_port_tty_get(&self->port);
985 IRDA_DEBUG(0, "%s(), hanging up!\n", __func__ ); 1001 IRDA_DEBUG(0, "%s(), hanging up!\n", __func__ );
986 if (self->tty) 1002 if (tty) {
987 tty_hangup(self->tty); 1003 tty_hangup(tty);
1004 tty_kref_put(tty);
1005 }
988 } 1006 }
989 break; 1007 break;
990 default: 1008 default:
diff --git a/net/irda/ircomm/ircomm_tty_ioctl.c b/net/irda/ircomm/ircomm_tty_ioctl.c
index d0667d68351d..b343f50dc8d7 100644
--- a/net/irda/ircomm/ircomm_tty_ioctl.c
+++ b/net/irda/ircomm/ircomm_tty_ioctl.c
@@ -52,17 +52,18 @@
52 * Change speed of the driver. If the remote device is a DCE, then this 52 * Change speed of the driver. If the remote device is a DCE, then this
53 * should make it change the speed of its serial port 53 * should make it change the speed of its serial port
54 */ 54 */
55static void ircomm_tty_change_speed(struct ircomm_tty_cb *self) 55static void ircomm_tty_change_speed(struct ircomm_tty_cb *self,
56 struct tty_struct *tty)
56{ 57{
57 unsigned int cflag, cval; 58 unsigned int cflag, cval;
58 int baud; 59 int baud;
59 60
60 IRDA_DEBUG(2, "%s()\n", __func__ ); 61 IRDA_DEBUG(2, "%s()\n", __func__ );
61 62
62 if (!self->tty || !self->tty->termios || !self->ircomm) 63 if (!self->ircomm)
63 return; 64 return;
64 65
65 cflag = self->tty->termios->c_cflag; 66 cflag = tty->termios.c_cflag;
66 67
67 /* byte size and parity */ 68 /* byte size and parity */
68 switch (cflag & CSIZE) { 69 switch (cflag & CSIZE) {
@@ -81,7 +82,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
81 cval |= IRCOMM_PARITY_EVEN; 82 cval |= IRCOMM_PARITY_EVEN;
82 83
83 /* Determine divisor based on baud rate */ 84 /* Determine divisor based on baud rate */
84 baud = tty_get_baud_rate(self->tty); 85 baud = tty_get_baud_rate(tty);
85 if (!baud) 86 if (!baud)
86 baud = 9600; /* B0 transition handled in rs_set_termios */ 87 baud = 9600; /* B0 transition handled in rs_set_termios */
87 88
@@ -90,19 +91,19 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
90 91
91 /* CTS flow control flag and modem status interrupts */ 92 /* CTS flow control flag and modem status interrupts */
92 if (cflag & CRTSCTS) { 93 if (cflag & CRTSCTS) {
93 self->flags |= ASYNC_CTS_FLOW; 94 self->port.flags |= ASYNC_CTS_FLOW;
94 self->settings.flow_control |= IRCOMM_RTS_CTS_IN; 95 self->settings.flow_control |= IRCOMM_RTS_CTS_IN;
95 /* This got me. Bummer. Jean II */ 96 /* This got me. Bummer. Jean II */
96 if (self->service_type == IRCOMM_3_WIRE_RAW) 97 if (self->service_type == IRCOMM_3_WIRE_RAW)
97 IRDA_WARNING("%s(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n", __func__); 98 IRDA_WARNING("%s(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n", __func__);
98 } else { 99 } else {
99 self->flags &= ~ASYNC_CTS_FLOW; 100 self->port.flags &= ~ASYNC_CTS_FLOW;
100 self->settings.flow_control &= ~IRCOMM_RTS_CTS_IN; 101 self->settings.flow_control &= ~IRCOMM_RTS_CTS_IN;
101 } 102 }
102 if (cflag & CLOCAL) 103 if (cflag & CLOCAL)
103 self->flags &= ~ASYNC_CHECK_CD; 104 self->port.flags &= ~ASYNC_CHECK_CD;
104 else 105 else
105 self->flags |= ASYNC_CHECK_CD; 106 self->port.flags |= ASYNC_CHECK_CD;
106#if 0 107#if 0
107 /* 108 /*
108 * Set up parity check flag 109 * Set up parity check flag
@@ -148,18 +149,18 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
148 struct ktermios *old_termios) 149 struct ktermios *old_termios)
149{ 150{
150 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; 151 struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
151 unsigned int cflag = tty->termios->c_cflag; 152 unsigned int cflag = tty->termios.c_cflag;
152 153
153 IRDA_DEBUG(2, "%s()\n", __func__ ); 154 IRDA_DEBUG(2, "%s()\n", __func__ );
154 155
155 if ((cflag == old_termios->c_cflag) && 156 if ((cflag == old_termios->c_cflag) &&
156 (RELEVANT_IFLAG(tty->termios->c_iflag) == 157 (RELEVANT_IFLAG(tty->termios.c_iflag) ==
157 RELEVANT_IFLAG(old_termios->c_iflag))) 158 RELEVANT_IFLAG(old_termios->c_iflag)))
158 { 159 {
159 return; 160 return;
160 } 161 }
161 162
162 ircomm_tty_change_speed(self); 163 ircomm_tty_change_speed(self, tty);
163 164
164 /* Handle transition to B0 status */ 165 /* Handle transition to B0 status */
165 if ((old_termios->c_cflag & CBAUD) && 166 if ((old_termios->c_cflag & CBAUD) &&
@@ -172,7 +173,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
172 if (!(old_termios->c_cflag & CBAUD) && 173 if (!(old_termios->c_cflag & CBAUD) &&
173 (cflag & CBAUD)) { 174 (cflag & CBAUD)) {
174 self->settings.dte |= IRCOMM_DTR; 175 self->settings.dte |= IRCOMM_DTR;
175 if (!(tty->termios->c_cflag & CRTSCTS) || 176 if (!(tty->termios.c_cflag & CRTSCTS) ||
176 !test_bit(TTY_THROTTLED, &tty->flags)) { 177 !test_bit(TTY_THROTTLED, &tty->flags)) {
177 self->settings.dte |= IRCOMM_RTS; 178 self->settings.dte |= IRCOMM_RTS;
178 } 179 }
@@ -181,7 +182,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
181 182
182 /* Handle turning off CRTSCTS */ 183 /* Handle turning off CRTSCTS */
183 if ((old_termios->c_cflag & CRTSCTS) && 184 if ((old_termios->c_cflag & CRTSCTS) &&
184 !(tty->termios->c_cflag & CRTSCTS)) 185 !(tty->termios.c_cflag & CRTSCTS))
185 { 186 {
186 tty->hw_stopped = 0; 187 tty->hw_stopped = 0;
187 ircomm_tty_start(tty); 188 ircomm_tty_start(tty);
@@ -270,10 +271,10 @@ static int ircomm_tty_get_serial_info(struct ircomm_tty_cb *self,
270 271
271 memset(&info, 0, sizeof(info)); 272 memset(&info, 0, sizeof(info));
272 info.line = self->line; 273 info.line = self->line;
273 info.flags = self->flags; 274 info.flags = self->port.flags;
274 info.baud_base = self->settings.data_rate; 275 info.baud_base = self->settings.data_rate;
275 info.close_delay = self->close_delay; 276 info.close_delay = self->port.close_delay;
276 info.closing_wait = self->closing_wait; 277 info.closing_wait = self->port.closing_wait;
277 278
278 /* For compatibility */ 279 /* For compatibility */
279 info.type = PORT_16550A; 280 info.type = PORT_16550A;