aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/serial/nvidia,tegra20-hsuart.txt24
-rw-r--r--Documentation/devicetree/bindings/tty/serial/arc-uart.txt26
-rw-r--r--Documentation/devicetree/bindings/tty/serial/efm32-uart.txt6
-rw-r--r--Documentation/serial/driver44
-rw-r--r--arch/alpha/Kconfig2
-rw-r--r--arch/alpha/kernel/srmcons.c18
-rw-r--r--arch/arm/boot/dts/vt8500.dtsi40
-rw-r--r--arch/arm/boot/dts/wm8505.dtsi60
-rw-r--r--arch/arm/boot/dts/wm8650.dtsi20
-rw-r--r--arch/arm/boot/dts/zynq-7000.dtsi4
-rw-r--r--arch/ia64/hp/sim/Kconfig1
-rw-r--r--arch/ia64/hp/sim/simserial.c21
-rw-r--r--arch/m68k/Kconfig.devices2
-rw-r--r--arch/mips/sni/a20r.c2
-rw-r--r--arch/mn10300/kernel/mn10300-serial.c20
-rw-r--r--arch/parisc/Kconfig1
-rw-r--r--arch/parisc/kernel/pdc_cons.c10
-rw-r--r--arch/tile/Kconfig1
-rw-r--r--arch/um/Kconfig.common1
-rw-r--r--arch/um/drivers/chan.h3
-rw-r--r--arch/um/drivers/chan_kern.c25
-rw-r--r--arch/um/drivers/line.c7
-rw-r--r--arch/xtensa/Kconfig1
-rw-r--r--arch/xtensa/platforms/iss/console.c10
-rw-r--r--drivers/bluetooth/Kconfig1
-rw-r--r--drivers/char/Kconfig7
-rw-r--r--drivers/char/pcmcia/Kconfig4
-rw-r--r--drivers/char/pcmcia/synclink_cs.c36
-rw-r--r--drivers/i2c/busses/Kconfig2
-rw-r--r--drivers/input/joystick/Kconfig4
-rw-r--r--drivers/input/keyboard/Kconfig10
-rw-r--r--drivers/input/mouse/Kconfig3
-rw-r--r--drivers/input/serio/Kconfig1
-rw-r--r--drivers/input/touchscreen/Kconfig22
-rw-r--r--drivers/ipack/devices/Kconfig2
-rw-r--r--drivers/ipack/devices/ipoctal.c19
-rw-r--r--drivers/isdn/Kconfig1
-rw-r--r--drivers/isdn/capi/Kconfig1
-rw-r--r--drivers/isdn/gigaset/Kconfig1
-rw-r--r--drivers/isdn/gigaset/interface.c14
-rw-r--r--drivers/isdn/hardware/mISDN/Kconfig1
-rw-r--r--drivers/isdn/i4l/isdn_common.c14
-rw-r--r--drivers/isdn/i4l/isdn_common.h2
-rw-r--r--drivers/isdn/i4l/isdn_tty.c59
-rw-r--r--drivers/lguest/Kconfig2
-rw-r--r--drivers/media/radio/wl128x/Kconfig2
-rw-r--r--drivers/misc/Kconfig2
-rw-r--r--drivers/misc/ti-st/Kconfig2
-rw-r--r--drivers/mmc/card/Kconfig1
-rw-r--r--drivers/mmc/card/sdio_uart.c13
-rw-r--r--drivers/net/caif/Kconfig2
-rw-r--r--drivers/net/caif/caif_serial.c2
-rw-r--r--drivers/net/can/Kconfig2
-rw-r--r--drivers/net/hamradio/Kconfig4
-rw-r--r--drivers/net/irda/Kconfig2
-rw-r--r--drivers/net/irda/irtty-sir.c2
-rw-r--r--drivers/net/ppp/Kconfig3
-rw-r--r--drivers/net/slip/Kconfig1
-rw-r--r--drivers/net/usb/Kconfig4
-rw-r--r--drivers/net/usb/hso.c32
-rw-r--r--drivers/net/wan/Kconfig2
-rw-r--r--drivers/pps/clients/Kconfig2
-rw-r--r--drivers/s390/char/Kconfig8
-rw-r--r--drivers/s390/char/con3215.c12
-rw-r--r--drivers/s390/char/keyboard.h16
-rw-r--r--drivers/s390/char/sclp_tty.c14
-rw-r--r--drivers/s390/char/sclp_vt220.c12
-rw-r--r--drivers/s390/char/tty3270.c4
-rw-r--r--drivers/staging/ccg/Kconfig2
-rw-r--r--drivers/staging/ccg/u_serial.c13
-rw-r--r--drivers/staging/dgrp/Kconfig2
-rw-r--r--drivers/staging/dgrp/dgrp_net_ops.c12
-rw-r--r--drivers/staging/fwserial/Kconfig2
-rw-r--r--drivers/staging/fwserial/fwserial.c51
-rw-r--r--drivers/staging/sb105x/Kconfig3
-rw-r--r--drivers/staging/serqt_usb2/serqt_usb2.c41
-rw-r--r--drivers/tty/Kconfig19
-rw-r--r--drivers/tty/Makefile3
-rw-r--r--drivers/tty/amiserial.c13
-rw-r--r--drivers/tty/bfin_jtag_comm.c22
-rw-r--r--drivers/tty/cyclades.c297
-rw-r--r--drivers/tty/ehv_bytechan.c13
-rw-r--r--drivers/tty/goldfish.c328
-rw-r--r--drivers/tty/hvc/Kconfig3
-rw-r--r--drivers/tty/hvc/hvc_console.c6
-rw-r--r--drivers/tty/hvc/hvcs.c6
-rw-r--r--drivers/tty/hvc/hvsi.c32
-rw-r--r--drivers/tty/ipwireless/tty.c12
-rw-r--r--drivers/tty/isicom.c12
-rw-r--r--drivers/tty/moxa.c10
-rw-r--r--drivers/tty/mxser.c8
-rw-r--r--drivers/tty/n_gsm.c78
-rw-r--r--drivers/tty/n_tty.c2
-rw-r--r--drivers/tty/nozomi.c37
-rw-r--r--drivers/tty/pty.c13
-rw-r--r--drivers/tty/rocket.c60
-rw-r--r--drivers/tty/serial/21285.c3
-rw-r--r--drivers/tty/serial/68328serial.c19
-rw-r--r--drivers/tty/serial/8250/8250.c126
-rw-r--r--drivers/tty/serial/8250/8250.h50
-rw-r--r--drivers/tty/serial/8250/8250_dma.c216
-rw-r--r--drivers/tty/serial/8250/8250_dw.c257
-rw-r--r--drivers/tty/serial/8250/8250_early.c2
-rw-r--r--drivers/tty/serial/8250/8250_pci.c309
-rw-r--r--drivers/tty/serial/8250/Kconfig19
-rw-r--r--drivers/tty/serial/8250/Makefile1
-rw-r--r--drivers/tty/serial/Kconfig39
-rw-r--r--drivers/tty/serial/Makefile2
-rw-r--r--drivers/tty/serial/altera_jtaguart.c2
-rw-r--r--drivers/tty/serial/altera_uart.c2
-rw-r--r--drivers/tty/serial/amba-pl010.c3
-rw-r--r--drivers/tty/serial/amba-pl011.c11
-rw-r--r--drivers/tty/serial/apbuart.c3
-rw-r--r--drivers/tty/serial/ar933x_uart.c15
-rw-r--r--drivers/tty/serial/arc_uart.c106
-rw-r--r--drivers/tty/serial/atmel_serial.c9
-rw-r--r--drivers/tty/serial/bcm63xx_uart.c9
-rw-r--r--drivers/tty/serial/bfin_sport_uart.c12
-rw-r--r--drivers/tty/serial/bfin_uart.c10
-rw-r--r--drivers/tty/serial/clps711x.c8
-rw-r--r--drivers/tty/serial/cpm_uart/cpm_uart_core.c10
-rw-r--r--drivers/tty/serial/crisv10.c35
-rw-r--r--drivers/tty/serial/dz.c4
-rw-r--r--drivers/tty/serial/efm32-uart.c52
-rw-r--r--drivers/tty/serial/icom.c10
-rw-r--r--drivers/tty/serial/ifx6x60.c11
-rw-r--r--drivers/tty/serial/imx.c269
-rw-r--r--drivers/tty/serial/ioc3_serial.c11
-rw-r--r--drivers/tty/serial/ioc4_serial.c13
-rw-r--r--drivers/tty/serial/ip22zilog.c30
-rw-r--r--drivers/tty/serial/jsm/jsm_tty.c18
-rw-r--r--drivers/tty/serial/kgdb_nmi.c12
-rw-r--r--drivers/tty/serial/lantiq.c20
-rw-r--r--drivers/tty/serial/lpc32xx_hs.c30
-rw-r--r--drivers/tty/serial/m32r_sio.c8
-rw-r--r--drivers/tty/serial/max3100.c10
-rw-r--r--drivers/tty/serial/max310x.c8
-rw-r--r--drivers/tty/serial/mcf.c73
-rw-r--r--drivers/tty/serial/mfd.c15
-rw-r--r--drivers/tty/serial/mpc52xx_uart.c8
-rw-r--r--drivers/tty/serial/mpsc.c15
-rw-r--r--drivers/tty/serial/mrst_max3110.c19
-rw-r--r--drivers/tty/serial/msm_serial.c16
-rw-r--r--drivers/tty/serial/msm_serial_hs.c19
-rw-r--r--drivers/tty/serial/msm_smd_tty.c4
-rw-r--r--drivers/tty/serial/mux.c9
-rw-r--r--drivers/tty/serial/mxs-auart.c11
-rw-r--r--drivers/tty/serial/netx-serial.c4
-rw-r--r--drivers/tty/serial/nwpserial.c6
-rw-r--r--drivers/tty/serial/omap-serial.c43
-rw-r--r--drivers/tty/serial/pch_uart.c90
-rw-r--r--drivers/tty/serial/pmac_zilog.c36
-rw-r--r--drivers/tty/serial/pnx8xxx_uart.c3
-rw-r--r--drivers/tty/serial/pxa.c17
-rw-r--r--drivers/tty/serial/rp2.c885
-rw-r--r--drivers/tty/serial/sa1100.c3
-rw-r--r--drivers/tty/serial/samsung.c15
-rw-r--r--drivers/tty/serial/sb1250-duart.c2
-rw-r--r--drivers/tty/serial/sc26xx.c29
-rw-r--r--drivers/tty/serial/sccnxp.c171
-rw-r--r--drivers/tty/serial/serial-tegra.c1402
-rw-r--r--drivers/tty/serial/serial_core.c70
-rw-r--r--drivers/tty/serial/serial_ks8695.c3
-rw-r--r--drivers/tty/serial/serial_txx9.c3
-rw-r--r--drivers/tty/serial/sh-sci.c52
-rw-r--r--drivers/tty/serial/sirfsoc_uart.c55
-rw-r--r--drivers/tty/serial/sirfsoc_uart.h3
-rw-r--r--drivers/tty/serial/sn_console.c16
-rw-r--r--drivers/tty/serial/sunhv.c33
-rw-r--r--drivers/tty/serial/sunsab.c28
-rw-r--r--drivers/tty/serial/sunsu.c18
-rw-r--r--drivers/tty/serial/sunzilog.c39
-rw-r--r--drivers/tty/serial/timbuart.c6
-rw-r--r--drivers/tty/serial/uartlite.c10
-rw-r--r--drivers/tty/serial/ucc_uart.c10
-rw-r--r--drivers/tty/serial/vr41xx_siu.c4
-rw-r--r--drivers/tty/serial/vt8500_serial.c52
-rw-r--r--drivers/tty/serial/xilinx_uartps.c50
-rw-r--r--drivers/tty/serial/zs.c2
-rw-r--r--drivers/tty/synclink.c24
-rw-r--r--drivers/tty/synclink_gt.c35
-rw-r--r--drivers/tty/synclinkmp.c63
-rw-r--r--drivers/tty/tty_buffer.c130
-rw-r--r--drivers/tty/tty_io.c2
-rw-r--r--drivers/tty/tty_ioctl.c8
-rw-r--r--drivers/tty/tty_ldisc.c14
-rw-r--r--drivers/tty/vt/Makefile4
-rw-r--r--drivers/tty/vt/keyboard.c25
-rw-r--r--drivers/tty/vt/vt.c16
-rw-r--r--drivers/usb/class/Kconfig2
-rw-r--r--drivers/usb/class/cdc-acm.c13
-rw-r--r--drivers/usb/gadget/Kconfig6
-rw-r--r--drivers/usb/gadget/u_serial.c15
-rw-r--r--drivers/usb/serial/Kconfig2
-rw-r--r--drivers/usb/serial/aircable.c17
-rw-r--r--drivers/usb/serial/ark3116.c12
-rw-r--r--drivers/usb/serial/belkin_sa.c12
-rw-r--r--drivers/usb/serial/cyberjack.c11
-rw-r--r--drivers/usb/serial/cypress_m8.c6
-rw-r--r--drivers/usb/serial/digi_acceleport.c14
-rw-r--r--drivers/usb/serial/f81232.c15
-rw-r--r--drivers/usb/serial/ftdi_sio.c21
-rw-r--r--drivers/usb/serial/garmin_gps.c9
-rw-r--r--drivers/usb/serial/generic.c12
-rw-r--r--drivers/usb/serial/io_edgeport.c39
-rw-r--r--drivers/usb/serial/io_ti.c32
-rw-r--r--drivers/usb/serial/ir-usb.c9
-rw-r--r--drivers/usb/serial/iuu_phoenix.c9
-rw-r--r--drivers/usb/serial/keyspan.c60
-rw-r--r--drivers/usb/serial/keyspan_pda.c9
-rw-r--r--drivers/usb/serial/kl5kusb105.c10
-rw-r--r--drivers/usb/serial/kobil_sct.c9
-rw-r--r--drivers/usb/serial/mct_u232.c11
-rw-r--r--drivers/usb/serial/metro-usb.c9
-rw-r--r--drivers/usb/serial/mos7720.c9
-rw-r--r--drivers/usb/serial/mos7840.c10
-rw-r--r--drivers/usb/serial/navman.c9
-rw-r--r--drivers/usb/serial/omninet.c10
-rw-r--r--drivers/usb/serial/opticon.c11
-rw-r--r--drivers/usb/serial/oti6858.c9
-rw-r--r--drivers/usb/serial/pl2303.c15
-rw-r--r--drivers/usb/serial/quatech2.c29
-rw-r--r--drivers/usb/serial/safe_serial.c15
-rw-r--r--drivers/usb/serial/sierra.c17
-rw-r--r--drivers/usb/serial/spcp8x5.c24
-rw-r--r--drivers/usb/serial/ssu100.c31
-rw-r--r--drivers/usb/serial/symbolserial.c9
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.c44
-rw-r--r--drivers/usb/serial/usb_wwan.c17
-rw-r--r--fs/proc/Makefile3
-rw-r--r--include/linux/console.h5
-rw-r--r--include/linux/pci_ids.h15
-rw-r--r--include/linux/platform_data/serial-sccnxp.h (renamed from include/linux/platform_data/sccnxp.h)6
-rw-r--r--include/linux/proc_fs.h5
-rw-r--r--include/linux/serial_8250.h4
-rw-r--r--include/linux/serial_core.h23
-rw-r--r--include/linux/tty.h50
-rw-r--r--include/linux/tty_flip.h28
-rw-r--r--include/uapi/linux/serial_core.h3
-rw-r--r--lib/Kconfig.kgdb1
-rw-r--r--net/bluetooth/rfcomm/Kconfig1
-rw-r--r--net/bluetooth/rfcomm/tty.c21
-rw-r--r--net/irda/ircomm/Kconfig2
-rw-r--r--net/irda/ircomm/ircomm_tty.c8
-rw-r--r--sound/soc/codecs/Kconfig3
245 files changed, 5751 insertions, 2303 deletions
diff --git a/Documentation/devicetree/bindings/serial/nvidia,tegra20-hsuart.txt b/Documentation/devicetree/bindings/serial/nvidia,tegra20-hsuart.txt
new file mode 100644
index 000000000000..392a4493eebd
--- /dev/null
+++ b/Documentation/devicetree/bindings/serial/nvidia,tegra20-hsuart.txt
@@ -0,0 +1,24 @@
1NVIDIA Tegra20/Tegra30 high speed (DMA based) UART controller driver.
2
3Required properties:
4- compatible : should be "nvidia,tegra30-hsuart", "nvidia,tegra20-hsuart".
5- reg: Should contain UART controller registers location and length.
6- interrupts: Should contain UART controller interrupts.
7- nvidia,dma-request-selector : The Tegra DMA controller's phandle and
8 request selector for this UART controller.
9
10Optional properties:
11- nvidia,enable-modem-interrupt: Enable modem interrupts. Should be enable
12 only if all 8 lines of UART controller are pinmuxed.
13
14Example:
15
16serial@70006000 {
17 compatible = "nvidia,tegra30-hsuart", "nvidia,tegra20-hsuart";
18 reg = <0x70006000 0x40>;
19 reg-shift = <2>;
20 interrupts = <0 36 0x04>;
21 nvidia,dma-request-selector = <&apbdma 8>;
22 nvidia,enable-modem-interrupt;
23 status = "disabled";
24};
diff --git a/Documentation/devicetree/bindings/tty/serial/arc-uart.txt b/Documentation/devicetree/bindings/tty/serial/arc-uart.txt
new file mode 100644
index 000000000000..c3bd8f9c9997
--- /dev/null
+++ b/Documentation/devicetree/bindings/tty/serial/arc-uart.txt
@@ -0,0 +1,26 @@
1* Synopsys ARC UART : Non standard UART used in some of the ARC FPGA boards
2
3Required properties:
4- compatible : "snps,arc-uart"
5- reg : offset and length of the register set for the device.
6- interrupts : device interrupt
7- clock-frequency : the input clock frequency for the UART
8- baud : baud rate for UART
9
10e.g.
11
12arcuart0: serial@c0fc1000 {
13 compatible = "snps,arc-uart";
14 reg = <0xc0fc1000 0x100>;
15 interrupts = <5>;
16 clock-frequency = <80000000>;
17 baud = <115200>;
18 status = "okay";
19};
20
21Note: Each port should have an alias correctly numbered in "aliases" node.
22
23e.g.
24aliases {
25 serial0 = &arcuart0;
26};
diff --git a/Documentation/devicetree/bindings/tty/serial/efm32-uart.txt b/Documentation/devicetree/bindings/tty/serial/efm32-uart.txt
index 6588b6950a7f..8e080b893b49 100644
--- a/Documentation/devicetree/bindings/tty/serial/efm32-uart.txt
+++ b/Documentation/devicetree/bindings/tty/serial/efm32-uart.txt
@@ -5,10 +5,16 @@ Required properties:
5- reg : Address and length of the register set 5- reg : Address and length of the register set
6- interrupts : Should contain uart interrupt 6- interrupts : Should contain uart interrupt
7 7
8Optional properties:
9- location : Decides the location of the USART I/O pins.
10 Allowed range : [0 .. 5]
11 Default: 0
12
8Example: 13Example:
9 14
10uart@0x4000c400 { 15uart@0x4000c400 {
11 compatible = "efm32,uart"; 16 compatible = "efm32,uart";
12 reg = <0x4000c400 0x400>; 17 reg = <0x4000c400 0x400>;
13 interrupts = <15>; 18 interrupts = <15>;
19 location = <0>;
14}; 20};
diff --git a/Documentation/serial/driver b/Documentation/serial/driver
index 0a25a9191864..067c47d46917 100644
--- a/Documentation/serial/driver
+++ b/Documentation/serial/driver
@@ -133,6 +133,16 @@ hardware.
133 Interrupts: locally disabled. 133 Interrupts: locally disabled.
134 This call must not sleep 134 This call must not sleep
135 135
136 send_xchar(port,ch)
137 Transmit a high priority character, even if the port is stopped.
138 This is used to implement XON/XOFF flow control and tcflow(). If
139 the serial driver does not implement this function, the tty core
140 will append the character to the circular buffer and then call
141 start_tx() / stop_tx() to flush the data out.
142
143 Locking: none.
144 Interrupts: caller dependent.
145
136 stop_rx(port) 146 stop_rx(port)
137 Stop receiving characters; the port is in the process of 147 Stop receiving characters; the port is in the process of
138 being closed. 148 being closed.
@@ -242,9 +252,8 @@ hardware.
242 252
243 pm(port,state,oldstate) 253 pm(port,state,oldstate)
244 Perform any power management related activities on the specified 254 Perform any power management related activities on the specified
245 port. State indicates the new state (defined by ACPI D0-D3), 255 port. State indicates the new state (defined by
246 oldstate indicates the previous state. Essentially, D0 means 256 enum uart_pm_state), oldstate indicates the previous state.
247 fully on, D3 means powered down.
248 257
249 This function should not be used to grab any resources. 258 This function should not be used to grab any resources.
250 259
@@ -255,6 +264,10 @@ hardware.
255 Locking: none. 264 Locking: none.
256 Interrupts: caller dependent. 265 Interrupts: caller dependent.
257 266
267 set_wake(port,state)
268 Enable/disable power management wakeup on serial activity. Not
269 currently implemented.
270
258 type(port) 271 type(port)
259 Return a pointer to a string constant describing the specified 272 Return a pointer to a string constant describing the specified
260 port, or return NULL, in which case the string 'unknown' is 273 port, or return NULL, in which case the string 'unknown' is
@@ -307,6 +320,31 @@ hardware.
307 Locking: none. 320 Locking: none.
308 Interrupts: caller dependent. 321 Interrupts: caller dependent.
309 322
323 poll_init(port)
324 Called by kgdb to perform the minimal hardware initialization needed
325 to support poll_put_char() and poll_get_char(). Unlike ->startup()
326 this should not request interrupts.
327
328 Locking: tty_mutex and tty_port->mutex taken.
329 Interrupts: n/a.
330
331 poll_put_char(port,ch)
332 Called by kgdb to write a single character directly to the serial
333 port. It can and should block until there is space in the TX FIFO.
334
335 Locking: none.
336 Interrupts: caller dependent.
337 This call must not sleep
338
339 poll_get_char(port)
340 Called by kgdb to read a single character directly from the serial
341 port. If data is available, it should be returned; otherwise
342 the function should return NO_POLL_CHAR immediately.
343
344 Locking: none.
345 Interrupts: caller dependent.
346 This call must not sleep
347
310Other functions 348Other functions
311--------------- 349---------------
312 350
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig
index 9d5904cc7712..1ef196ddadeb 100644
--- a/arch/alpha/Kconfig
+++ b/arch/alpha/Kconfig
@@ -125,6 +125,7 @@ choice
125 125
126config ALPHA_GENERIC 126config ALPHA_GENERIC
127 bool "Generic" 127 bool "Generic"
128 depends on TTY
128 help 129 help
129 A generic kernel will run on all supported Alpha hardware. 130 A generic kernel will run on all supported Alpha hardware.
130 131
@@ -491,6 +492,7 @@ config VGA_HOSE
491 492
492config ALPHA_SRM 493config ALPHA_SRM
493 bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME 494 bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME
495 depends on TTY
494 default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL 496 default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL
495 ---help--- 497 ---help---
496 There are two different types of booting firmware on Alphas: SRM, 498 There are two different types of booting firmware on Alphas: SRM,
diff --git a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c
index 59b7bbad8394..6f01d9ad7b81 100644
--- a/arch/alpha/kernel/srmcons.c
+++ b/arch/alpha/kernel/srmcons.c
@@ -44,7 +44,7 @@ typedef union _srmcons_result {
44 44
45/* called with callback_lock held */ 45/* called with callback_lock held */
46static int 46static int
47srmcons_do_receive_chars(struct tty_struct *tty) 47srmcons_do_receive_chars(struct tty_port *port)
48{ 48{
49 srmcons_result result; 49 srmcons_result result;
50 int count = 0, loops = 0; 50 int count = 0, loops = 0;
@@ -52,13 +52,13 @@ srmcons_do_receive_chars(struct tty_struct *tty)
52 do { 52 do {
53 result.as_long = callback_getc(0); 53 result.as_long = callback_getc(0);
54 if (result.bits.status < 2) { 54 if (result.bits.status < 2) {
55 tty_insert_flip_char(tty, (char)result.bits.c, 0); 55 tty_insert_flip_char(port, (char)result.bits.c, 0);
56 count++; 56 count++;
57 } 57 }
58 } while((result.bits.status & 1) && (++loops < 10)); 58 } while((result.bits.status & 1) && (++loops < 10));
59 59
60 if (count) 60 if (count)
61 tty_schedule_flip(tty); 61 tty_schedule_flip(port);
62 62
63 return count; 63 return count;
64} 64}
@@ -73,7 +73,7 @@ srmcons_receive_chars(unsigned long data)
73 73
74 local_irq_save(flags); 74 local_irq_save(flags);
75 if (spin_trylock(&srmcons_callback_lock)) { 75 if (spin_trylock(&srmcons_callback_lock)) {
76 if (!srmcons_do_receive_chars(port->tty)) 76 if (!srmcons_do_receive_chars(port))
77 incr = 100; 77 incr = 100;
78 spin_unlock(&srmcons_callback_lock); 78 spin_unlock(&srmcons_callback_lock);
79 } 79 }
@@ -88,7 +88,7 @@ srmcons_receive_chars(unsigned long data)
88 88
89/* called with callback_lock held */ 89/* called with callback_lock held */
90static int 90static int
91srmcons_do_write(struct tty_struct *tty, const char *buf, int count) 91srmcons_do_write(struct tty_port *port, const char *buf, int count)
92{ 92{
93 static char str_cr[1] = "\r"; 93 static char str_cr[1] = "\r";
94 long c, remaining = count; 94 long c, remaining = count;
@@ -113,10 +113,10 @@ srmcons_do_write(struct tty_struct *tty, const char *buf, int count)
113 cur += result.bits.c; 113 cur += result.bits.c;
114 114
115 /* 115 /*
116 * Check for pending input iff a tty was provided 116 * Check for pending input iff a tty port was provided
117 */ 117 */
118 if (tty) 118 if (port)
119 srmcons_do_receive_chars(tty); 119 srmcons_do_receive_chars(port);
120 } 120 }
121 121
122 while (need_cr) { 122 while (need_cr) {
@@ -135,7 +135,7 @@ srmcons_write(struct tty_struct *tty,
135 unsigned long flags; 135 unsigned long flags;
136 136
137 spin_lock_irqsave(&srmcons_callback_lock, flags); 137 spin_lock_irqsave(&srmcons_callback_lock, flags);
138 srmcons_do_write(tty, (const char *) buf, count); 138 srmcons_do_write(tty->port, (const char *) buf, count);
139 spin_unlock_irqrestore(&srmcons_callback_lock, flags); 139 spin_unlock_irqrestore(&srmcons_callback_lock, flags);
140 140
141 return count; 141 return count;
diff --git a/arch/arm/boot/dts/vt8500.dtsi b/arch/arm/boot/dts/vt8500.dtsi
index d8645e990b21..cf31ced46602 100644
--- a/arch/arm/boot/dts/vt8500.dtsi
+++ b/arch/arm/boot/dts/vt8500.dtsi
@@ -45,6 +45,38 @@
45 compatible = "fixed-clock"; 45 compatible = "fixed-clock";
46 clock-frequency = <24000000>; 46 clock-frequency = <24000000>;
47 }; 47 };
48
49 clkuart0: uart0 {
50 #clock-cells = <0>;
51 compatible = "via,vt8500-device-clock";
52 clocks = <&ref24>;
53 enable-reg = <0x250>;
54 enable-bit = <1>;
55 };
56
57 clkuart1: uart1 {
58 #clock-cells = <0>;
59 compatible = "via,vt8500-device-clock";
60 clocks = <&ref24>;
61 enable-reg = <0x250>;
62 enable-bit = <2>;
63 };
64
65 clkuart2: uart2 {
66 #clock-cells = <0>;
67 compatible = "via,vt8500-device-clock";
68 clocks = <&ref24>;
69 enable-reg = <0x250>;
70 enable-bit = <3>;
71 };
72
73 clkuart3: uart3 {
74 #clock-cells = <0>;
75 compatible = "via,vt8500-device-clock";
76 clocks = <&ref24>;
77 enable-reg = <0x250>;
78 enable-bit = <4>;
79 };
48 }; 80 };
49 }; 81 };
50 82
@@ -83,28 +115,28 @@
83 compatible = "via,vt8500-uart"; 115 compatible = "via,vt8500-uart";
84 reg = <0xd8200000 0x1040>; 116 reg = <0xd8200000 0x1040>;
85 interrupts = <32>; 117 interrupts = <32>;
86 clocks = <&ref24>; 118 clocks = <&clkuart0>;
87 }; 119 };
88 120
89 uart@d82b0000 { 121 uart@d82b0000 {
90 compatible = "via,vt8500-uart"; 122 compatible = "via,vt8500-uart";
91 reg = <0xd82b0000 0x1040>; 123 reg = <0xd82b0000 0x1040>;
92 interrupts = <33>; 124 interrupts = <33>;
93 clocks = <&ref24>; 125 clocks = <&clkuart1>;
94 }; 126 };
95 127
96 uart@d8210000 { 128 uart@d8210000 {
97 compatible = "via,vt8500-uart"; 129 compatible = "via,vt8500-uart";
98 reg = <0xd8210000 0x1040>; 130 reg = <0xd8210000 0x1040>;
99 interrupts = <47>; 131 interrupts = <47>;
100 clocks = <&ref24>; 132 clocks = <&clkuart2>;
101 }; 133 };
102 134
103 uart@d82c0000 { 135 uart@d82c0000 {
104 compatible = "via,vt8500-uart"; 136 compatible = "via,vt8500-uart";
105 reg = <0xd82c0000 0x1040>; 137 reg = <0xd82c0000 0x1040>;
106 interrupts = <50>; 138 interrupts = <50>;
107 clocks = <&ref24>; 139 clocks = <&clkuart3>;
108 }; 140 };
109 141
110 rtc@d8100000 { 142 rtc@d8100000 {
diff --git a/arch/arm/boot/dts/wm8505.dtsi b/arch/arm/boot/dts/wm8505.dtsi
index 330f833ac3b0..e74a1c0fb9a2 100644
--- a/arch/arm/boot/dts/wm8505.dtsi
+++ b/arch/arm/boot/dts/wm8505.dtsi
@@ -59,6 +59,54 @@
59 compatible = "fixed-clock"; 59 compatible = "fixed-clock";
60 clock-frequency = <24000000>; 60 clock-frequency = <24000000>;
61 }; 61 };
62
63 clkuart0: uart0 {
64 #clock-cells = <0>;
65 compatible = "via,vt8500-device-clock";
66 clocks = <&ref24>;
67 enable-reg = <0x250>;
68 enable-bit = <1>;
69 };
70
71 clkuart1: uart1 {
72 #clock-cells = <0>;
73 compatible = "via,vt8500-device-clock";
74 clocks = <&ref24>;
75 enable-reg = <0x250>;
76 enable-bit = <2>;
77 };
78
79 clkuart2: uart2 {
80 #clock-cells = <0>;
81 compatible = "via,vt8500-device-clock";
82 clocks = <&ref24>;
83 enable-reg = <0x250>;
84 enable-bit = <3>;
85 };
86
87 clkuart3: uart3 {
88 #clock-cells = <0>;
89 compatible = "via,vt8500-device-clock";
90 clocks = <&ref24>;
91 enable-reg = <0x250>;
92 enable-bit = <4>;
93 };
94
95 clkuart4: uart4 {
96 #clock-cells = <0>;
97 compatible = "via,vt8500-device-clock";
98 clocks = <&ref24>;
99 enable-reg = <0x250>;
100 enable-bit = <22>;
101 };
102
103 clkuart5: uart5 {
104 #clock-cells = <0>;
105 compatible = "via,vt8500-device-clock";
106 clocks = <&ref24>;
107 enable-reg = <0x250>;
108 enable-bit = <23>;
109 };
62 }; 110 };
63 }; 111 };
64 112
@@ -96,42 +144,42 @@
96 compatible = "via,vt8500-uart"; 144 compatible = "via,vt8500-uart";
97 reg = <0xd8200000 0x1040>; 145 reg = <0xd8200000 0x1040>;
98 interrupts = <32>; 146 interrupts = <32>;
99 clocks = <&ref24>; 147 clocks = <&clkuart0>;
100 }; 148 };
101 149
102 uart@d82b0000 { 150 uart@d82b0000 {
103 compatible = "via,vt8500-uart"; 151 compatible = "via,vt8500-uart";
104 reg = <0xd82b0000 0x1040>; 152 reg = <0xd82b0000 0x1040>;
105 interrupts = <33>; 153 interrupts = <33>;
106 clocks = <&ref24>; 154 clocks = <&clkuart1>;
107 }; 155 };
108 156
109 uart@d8210000 { 157 uart@d8210000 {
110 compatible = "via,vt8500-uart"; 158 compatible = "via,vt8500-uart";
111 reg = <0xd8210000 0x1040>; 159 reg = <0xd8210000 0x1040>;
112 interrupts = <47>; 160 interrupts = <47>;
113 clocks = <&ref24>; 161 clocks = <&clkuart2>;
114 }; 162 };
115 163
116 uart@d82c0000 { 164 uart@d82c0000 {
117 compatible = "via,vt8500-uart"; 165 compatible = "via,vt8500-uart";
118 reg = <0xd82c0000 0x1040>; 166 reg = <0xd82c0000 0x1040>;
119 interrupts = <50>; 167 interrupts = <50>;
120 clocks = <&ref24>; 168 clocks = <&clkuart3>;
121 }; 169 };
122 170
123 uart@d8370000 { 171 uart@d8370000 {
124 compatible = "via,vt8500-uart"; 172 compatible = "via,vt8500-uart";
125 reg = <0xd8370000 0x1040>; 173 reg = <0xd8370000 0x1040>;
126 interrupts = <31>; 174 interrupts = <31>;
127 clocks = <&ref24>; 175 clocks = <&clkuart4>;
128 }; 176 };
129 177
130 uart@d8380000 { 178 uart@d8380000 {
131 compatible = "via,vt8500-uart"; 179 compatible = "via,vt8500-uart";
132 reg = <0xd8380000 0x1040>; 180 reg = <0xd8380000 0x1040>;
133 interrupts = <30>; 181 interrupts = <30>;
134 clocks = <&ref24>; 182 clocks = <&clkuart5>;
135 }; 183 };
136 184
137 rtc@d8100000 { 185 rtc@d8100000 {
diff --git a/arch/arm/boot/dts/wm8650.dtsi b/arch/arm/boot/dts/wm8650.dtsi
index 83b9467559bb..db3c0a12e052 100644
--- a/arch/arm/boot/dts/wm8650.dtsi
+++ b/arch/arm/boot/dts/wm8650.dtsi
@@ -75,6 +75,22 @@
75 reg = <0x204>; 75 reg = <0x204>;
76 }; 76 };
77 77
78 clkuart0: uart0 {
79 #clock-cells = <0>;
80 compatible = "via,vt8500-device-clock";
81 clocks = <&ref24>;
82 enable-reg = <0x250>;
83 enable-bit = <1>;
84 };
85
86 clkuart1: uart1 {
87 #clock-cells = <0>;
88 compatible = "via,vt8500-device-clock";
89 clocks = <&ref24>;
90 enable-reg = <0x250>;
91 enable-bit = <2>;
92 };
93
78 arm: arm { 94 arm: arm {
79 #clock-cells = <0>; 95 #clock-cells = <0>;
80 compatible = "via,vt8500-device-clock"; 96 compatible = "via,vt8500-device-clock";
@@ -128,14 +144,14 @@
128 compatible = "via,vt8500-uart"; 144 compatible = "via,vt8500-uart";
129 reg = <0xd8200000 0x1040>; 145 reg = <0xd8200000 0x1040>;
130 interrupts = <32>; 146 interrupts = <32>;
131 clocks = <&ref24>; 147 clocks = <&clkuart0>;
132 }; 148 };
133 149
134 uart@d82b0000 { 150 uart@d82b0000 {
135 compatible = "via,vt8500-uart"; 151 compatible = "via,vt8500-uart";
136 reg = <0xd82b0000 0x1040>; 152 reg = <0xd82b0000 0x1040>;
137 interrupts = <33>; 153 interrupts = <33>;
138 clocks = <&ref24>; 154 clocks = <&clkuart1>;
139 }; 155 };
140 156
141 rtc@d8100000 { 157 rtc@d8100000 {
diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi
index 401c1262d4ed..5914b5654591 100644
--- a/arch/arm/boot/dts/zynq-7000.dtsi
+++ b/arch/arm/boot/dts/zynq-7000.dtsi
@@ -44,14 +44,14 @@
44 compatible = "xlnx,xuartps"; 44 compatible = "xlnx,xuartps";
45 reg = <0xE0000000 0x1000>; 45 reg = <0xE0000000 0x1000>;
46 interrupts = <0 27 4>; 46 interrupts = <0 27 4>;
47 clock = <50000000>; 47 clocks = <&uart_clk 0>;
48 }; 48 };
49 49
50 uart1: uart@e0001000 { 50 uart1: uart@e0001000 {
51 compatible = "xlnx,xuartps"; 51 compatible = "xlnx,xuartps";
52 reg = <0xE0001000 0x1000>; 52 reg = <0xE0001000 0x1000>;
53 interrupts = <0 50 4>; 53 interrupts = <0 50 4>;
54 clock = <50000000>; 54 clocks = <&uart_clk 1>;
55 }; 55 };
56 56
57 slcr: slcr@f8000000 { 57 slcr: slcr@f8000000 {
diff --git a/arch/ia64/hp/sim/Kconfig b/arch/ia64/hp/sim/Kconfig
index 8d513a8c5266..d84707d55203 100644
--- a/arch/ia64/hp/sim/Kconfig
+++ b/arch/ia64/hp/sim/Kconfig
@@ -8,6 +8,7 @@ config HP_SIMETH
8 8
9config HP_SIMSERIAL 9config HP_SIMSERIAL
10 bool "Simulated serial driver support" 10 bool "Simulated serial driver support"
11 depends on TTY
11 12
12config HP_SIMSERIAL_CONSOLE 13config HP_SIMSERIAL_CONSOLE
13 bool "Console for HP simulator" 14 bool "Console for HP simulator"
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c
index fc3924d18c1f..da2f319fb71d 100644
--- a/arch/ia64/hp/sim/simserial.c
+++ b/arch/ia64/hp/sim/simserial.c
@@ -53,7 +53,7 @@ struct tty_driver *hp_simserial_driver;
53 53
54static struct console *console; 54static struct console *console;
55 55
56static void receive_chars(struct tty_struct *tty) 56static void receive_chars(struct tty_port *port)
57{ 57{
58 unsigned char ch; 58 unsigned char ch;
59 static unsigned char seen_esc = 0; 59 static unsigned char seen_esc = 0;
@@ -81,10 +81,10 @@ static void receive_chars(struct tty_struct *tty)
81 } 81 }
82 seen_esc = 0; 82 seen_esc = 0;
83 83
84 if (tty_insert_flip_char(tty, ch, TTY_NORMAL) == 0) 84 if (tty_insert_flip_char(port, ch, TTY_NORMAL) == 0)
85 break; 85 break;
86 } 86 }
87 tty_flip_buffer_push(tty); 87 tty_flip_buffer_push(port);
88} 88}
89 89
90/* 90/*
@@ -93,18 +93,9 @@ static void receive_chars(struct tty_struct *tty)
93static irqreturn_t rs_interrupt_single(int irq, void *dev_id) 93static irqreturn_t rs_interrupt_single(int irq, void *dev_id)
94{ 94{
95 struct serial_state *info = dev_id; 95 struct serial_state *info = dev_id;
96 struct tty_struct *tty = tty_port_tty_get(&info->port);
97 96
98 if (!tty) { 97 receive_chars(&info->port);
99 printk(KERN_INFO "%s: tty=0 problem\n", __func__); 98
100 return IRQ_NONE;
101 }
102 /*
103 * pretty simple in our case, because we only get interrupts
104 * on inbound traffic
105 */
106 receive_chars(tty);
107 tty_kref_put(tty);
108 return IRQ_HANDLED; 99 return IRQ_HANDLED;
109} 100}
110 101
@@ -435,7 +426,7 @@ static int rs_open(struct tty_struct *tty, struct file * filp)
435 struct tty_port *port = &info->port; 426 struct tty_port *port = &info->port;
436 427
437 tty->driver_data = info; 428 tty->driver_data = info;
438 tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 429 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
439 430
440 /* 431 /*
441 * figure out which console to use (should be one already) 432 * figure out which console to use (should be one already)
diff --git a/arch/m68k/Kconfig.devices b/arch/m68k/Kconfig.devices
index c4cdfe444c64..4bc945dfe467 100644
--- a/arch/m68k/Kconfig.devices
+++ b/arch/m68k/Kconfig.devices
@@ -41,7 +41,7 @@ config NFBLOCK
41 41
42config NFCON 42config NFCON
43 tristate "NatFeat console driver" 43 tristate "NatFeat console driver"
44 depends on NATFEAT 44 depends on TTY && NATFEAT
45 help 45 help
46 Say Y to include support for the ARAnyM NatFeat console driver 46 Say Y to include support for the ARAnyM NatFeat console driver
47 which allows the console output to be redirected to the stderr 47 which allows the console output to be redirected to the stderr
diff --git a/arch/mips/sni/a20r.c b/arch/mips/sni/a20r.c
index 9cb9d43a3a0e..e05ad4da44d9 100644
--- a/arch/mips/sni/a20r.c
+++ b/arch/mips/sni/a20r.c
@@ -118,7 +118,7 @@ static struct resource sc26xx_rsrc[] = {
118 } 118 }
119}; 119};
120 120
121#include <linux/platform_data/sccnxp.h> 121#include <linux/platform_data/serial-sccnxp.h>
122 122
123static struct sccnxp_pdata sccnxp_data = { 123static struct sccnxp_pdata sccnxp_data = {
124 .reg_shift = 2, 124 .reg_shift = 2,
diff --git a/arch/mn10300/kernel/mn10300-serial.c b/arch/mn10300/kernel/mn10300-serial.c
index 81d5cb9b6569..bf6e949a2f87 100644
--- a/arch/mn10300/kernel/mn10300-serial.c
+++ b/arch/mn10300/kernel/mn10300-serial.c
@@ -524,7 +524,7 @@ static int mask_test_and_clear(volatile u8 *ptr, u8 mask)
524static void mn10300_serial_receive_interrupt(struct mn10300_serial_port *port) 524static void mn10300_serial_receive_interrupt(struct mn10300_serial_port *port)
525{ 525{
526 struct uart_icount *icount = &port->uart.icount; 526 struct uart_icount *icount = &port->uart.icount;
527 struct tty_struct *tty = port->uart.state->port.tty; 527 struct tty_port *tport = &port->uart.state->port;
528 unsigned ix; 528 unsigned ix;
529 int count; 529 int count;
530 u8 st, ch, push, status, overrun; 530 u8 st, ch, push, status, overrun;
@@ -534,10 +534,10 @@ static void mn10300_serial_receive_interrupt(struct mn10300_serial_port *port)
534 push = 0; 534 push = 0;
535 535
536 count = CIRC_CNT(port->rx_inp, port->rx_outp, MNSC_BUFFER_SIZE); 536 count = CIRC_CNT(port->rx_inp, port->rx_outp, MNSC_BUFFER_SIZE);
537 count = tty_buffer_request_room(tty, count); 537 count = tty_buffer_request_room(tport, count);
538 if (count == 0) { 538 if (count == 0) {
539 if (!tty->low_latency) 539 if (!tport->low_latency)
540 tty_flip_buffer_push(tty); 540 tty_flip_buffer_push(tport);
541 return; 541 return;
542 } 542 }
543 543
@@ -545,8 +545,8 @@ try_again:
545 /* pull chars out of the hat */ 545 /* pull chars out of the hat */
546 ix = ACCESS_ONCE(port->rx_outp); 546 ix = ACCESS_ONCE(port->rx_outp);
547 if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) { 547 if (CIRC_CNT(port->rx_inp, ix, MNSC_BUFFER_SIZE) == 0) {
548 if (push && !tty->low_latency) 548 if (push && !tport->low_latency)
549 tty_flip_buffer_push(tty); 549 tty_flip_buffer_push(tport);
550 return; 550 return;
551 } 551 }
552 552
@@ -666,19 +666,19 @@ insert:
666 else 666 else
667 flag = TTY_NORMAL; 667 flag = TTY_NORMAL;
668 668
669 tty_insert_flip_char(tty, ch, flag); 669 tty_insert_flip_char(tport, ch, flag);
670 } 670 }
671 671
672 /* overrun is special, since it's reported immediately, and doesn't 672 /* overrun is special, since it's reported immediately, and doesn't
673 * affect the current character 673 * affect the current character
674 */ 674 */
675 if (overrun) 675 if (overrun)
676 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 676 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
677 677
678 count--; 678 count--;
679 if (count <= 0) { 679 if (count <= 0) {
680 if (!tty->low_latency) 680 if (!tport->low_latency)
681 tty_flip_buffer_push(tty); 681 tty_flip_buffer_push(tport);
682 return; 682 return;
683 } 683 }
684 684
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index b77feffbadea..df5beb639760 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -23,6 +23,7 @@ config PARISC
23 select HAVE_MOD_ARCH_SPECIFIC 23 select HAVE_MOD_ARCH_SPECIFIC
24 select MODULES_USE_ELF_RELA 24 select MODULES_USE_ELF_RELA
25 select CLONE_BACKWARDS 25 select CLONE_BACKWARDS
26 select TTY # Needed for pdc_cons.c
26 27
27 help 28 help
28 The PA-RISC microprocessor is designed by Hewlett-Packard and used 29 The PA-RISC microprocessor is designed by Hewlett-Packard and used
diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c
index efc5e7d30530..d5cae55195ec 100644
--- a/arch/parisc/kernel/pdc_cons.c
+++ b/arch/parisc/kernel/pdc_cons.c
@@ -138,23 +138,17 @@ static const struct tty_operations pdc_console_tty_ops = {
138static void pdc_console_poll(unsigned long unused) 138static void pdc_console_poll(unsigned long unused)
139{ 139{
140 int data, count = 0; 140 int data, count = 0;
141 struct tty_struct *tty = tty_port_tty_get(&tty_port);
142
143 if (!tty)
144 return;
145 141
146 while (1) { 142 while (1) {
147 data = pdc_console_poll_key(NULL); 143 data = pdc_console_poll_key(NULL);
148 if (data == -1) 144 if (data == -1)
149 break; 145 break;
150 tty_insert_flip_char(tty, data & 0xFF, TTY_NORMAL); 146 tty_insert_flip_char(&tty_port, data & 0xFF, TTY_NORMAL);
151 count ++; 147 count ++;
152 } 148 }
153 149
154 if (count) 150 if (count)
155 tty_flip_buffer_push(tty); 151 tty_flip_buffer_push(&tty_port);
156
157 tty_kref_put(tty);
158 152
159 if (pdc_cons.flags & CON_ENABLED) 153 if (pdc_cons.flags & CON_ENABLED)
160 mod_timer(&pdc_console_timer, jiffies + PDC_CONS_POLL_DELAY); 154 mod_timer(&pdc_console_timer, jiffies + PDC_CONS_POLL_DELAY);
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig
index 875d008828b8..ae8a7ca67fa4 100644
--- a/arch/tile/Kconfig
+++ b/arch/tile/Kconfig
@@ -121,6 +121,7 @@ config DEBUG_COPY_FROM_USER
121 def_bool n 121 def_bool n
122 122
123config HVC_TILE 123config HVC_TILE
124 depends on TTY
124 select HVC_DRIVER 125 select HVC_DRIVER
125 def_bool y 126 def_bool y
126 127
diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common
index 648121b037d5..bceee6623b00 100644
--- a/arch/um/Kconfig.common
+++ b/arch/um/Kconfig.common
@@ -12,6 +12,7 @@ config UML
12 select GENERIC_CPU_DEVICES 12 select GENERIC_CPU_DEVICES
13 select GENERIC_IO 13 select GENERIC_IO
14 select GENERIC_CLOCKEVENTS 14 select GENERIC_CLOCKEVENTS
15 select TTY # Needed for line.c
15 16
16config MMU 17config MMU
17 bool 18 bool
diff --git a/arch/um/drivers/chan.h b/arch/um/drivers/chan.h
index 02b5a76e98d9..78f1b8999964 100644
--- a/arch/um/drivers/chan.h
+++ b/arch/um/drivers/chan.h
@@ -27,8 +27,7 @@ struct chan {
27 void *data; 27 void *data;
28}; 28};
29 29
30extern void chan_interrupt(struct line *line, 30extern void chan_interrupt(struct line *line, int irq);
31 struct tty_struct *tty, int irq);
32extern int parse_chan_pair(char *str, struct line *line, int device, 31extern int parse_chan_pair(char *str, struct line *line, int device,
33 const struct chan_opts *opts, char **error_out); 32 const struct chan_opts *opts, char **error_out);
34extern int write_chan(struct chan *chan, const char *buf, int len, 33extern int write_chan(struct chan *chan, const char *buf, int len,
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c
index e9a0abc6a32f..15c553c239a1 100644
--- a/arch/um/drivers/chan_kern.c
+++ b/arch/um/drivers/chan_kern.c
@@ -81,12 +81,6 @@ static const struct chan_ops not_configged_ops = {
81}; 81};
82#endif /* CONFIG_NOCONFIG_CHAN */ 82#endif /* CONFIG_NOCONFIG_CHAN */
83 83
84static void tty_receive_char(struct tty_struct *tty, char ch)
85{
86 if (tty)
87 tty_insert_flip_char(tty, ch, TTY_NORMAL);
88}
89
90static int open_one_chan(struct chan *chan) 84static int open_one_chan(struct chan *chan)
91{ 85{
92 int fd, err; 86 int fd, err;
@@ -137,11 +131,9 @@ void chan_enable_winch(struct chan *chan, struct tty_struct *tty)
137static void line_timer_cb(struct work_struct *work) 131static void line_timer_cb(struct work_struct *work)
138{ 132{
139 struct line *line = container_of(work, struct line, task.work); 133 struct line *line = container_of(work, struct line, task.work);
140 struct tty_struct *tty = tty_port_tty_get(&line->port);
141 134
142 if (!line->throttled) 135 if (!line->throttled)
143 chan_interrupt(line, tty, line->driver->read_irq); 136 chan_interrupt(line, line->driver->read_irq);
144 tty_kref_put(tty);
145} 137}
146 138
147int enable_chan(struct line *line) 139int enable_chan(struct line *line)
@@ -552,8 +544,9 @@ int parse_chan_pair(char *str, struct line *line, int device,
552 return 0; 544 return 0;
553} 545}
554 546
555void chan_interrupt(struct line *line, struct tty_struct *tty, int irq) 547void chan_interrupt(struct line *line, int irq)
556{ 548{
549 struct tty_port *port = &line->port;
557 struct chan *chan = line->chan_in; 550 struct chan *chan = line->chan_in;
558 int err; 551 int err;
559 char c; 552 char c;
@@ -562,21 +555,24 @@ void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
562 goto out; 555 goto out;
563 556
564 do { 557 do {
565 if (tty && !tty_buffer_request_room(tty, 1)) { 558 if (!tty_buffer_request_room(port, 1)) {
566 schedule_delayed_work(&line->task, 1); 559 schedule_delayed_work(&line->task, 1);
567 goto out; 560 goto out;
568 } 561 }
569 err = chan->ops->read(chan->fd, &c, chan->data); 562 err = chan->ops->read(chan->fd, &c, chan->data);
570 if (err > 0) 563 if (err > 0)
571 tty_receive_char(tty, c); 564 tty_insert_flip_char(port, c, TTY_NORMAL);
572 } while (err > 0); 565 } while (err > 0);
573 566
574 if (err == 0) 567 if (err == 0)
575 reactivate_fd(chan->fd, irq); 568 reactivate_fd(chan->fd, irq);
576 if (err == -EIO) { 569 if (err == -EIO) {
577 if (chan->primary) { 570 if (chan->primary) {
578 if (tty != NULL) 571 struct tty_struct *tty = tty_port_tty_get(&line->port);
572 if (tty != NULL) {
579 tty_hangup(tty); 573 tty_hangup(tty);
574 tty_kref_put(tty);
575 }
580 if (line->chan_out != chan) 576 if (line->chan_out != chan)
581 close_one_chan(line->chan_out, 1); 577 close_one_chan(line->chan_out, 1);
582 } 578 }
@@ -585,6 +581,5 @@ void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
585 return; 581 return;
586 } 582 }
587 out: 583 out:
588 if (tty) 584 tty_flip_buffer_push(port);
589 tty_flip_buffer_push(tty);
590} 585}
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
index 9ffc28bd4b7a..f1b38571f94e 100644
--- a/arch/um/drivers/line.c
+++ b/arch/um/drivers/line.c
@@ -19,11 +19,10 @@ static irqreturn_t line_interrupt(int irq, void *data)
19{ 19{
20 struct chan *chan = data; 20 struct chan *chan = data;
21 struct line *line = chan->line; 21 struct line *line = chan->line;
22 struct tty_struct *tty = tty_port_tty_get(&line->port);
23 22
24 if (line) 23 if (line)
25 chan_interrupt(line, tty, irq); 24 chan_interrupt(line, irq);
26 tty_kref_put(tty); 25
27 return IRQ_HANDLED; 26 return IRQ_HANDLED;
28} 27}
29 28
@@ -234,7 +233,7 @@ void line_unthrottle(struct tty_struct *tty)
234 struct line *line = tty->driver_data; 233 struct line *line = tty->driver_data;
235 234
236 line->throttled = 0; 235 line->throttled = 0;
237 chan_interrupt(line, tty, line->driver->read_irq); 236 chan_interrupt(line, line->driver->read_irq);
238 237
239 /* 238 /*
240 * Maybe there is enough stuff pending that calling the interrupt 239 * Maybe there is enough stuff pending that calling the interrupt
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 5aab1acabf1c..ad64c73b8675 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -132,6 +132,7 @@ choice
132 132
133config XTENSA_PLATFORM_ISS 133config XTENSA_PLATFORM_ISS
134 bool "ISS" 134 bool "ISS"
135 depends on TTY
135 select XTENSA_CALIBRATE_CCOUNT 136 select XTENSA_CALIBRATE_CCOUNT
136 select SERIAL_CONSOLE 137 select SERIAL_CONSOLE
137 select XTENSA_ISS_NETWORK 138 select XTENSA_ISS_NETWORK
diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c
index 8207a119eee9..da9866f7fecf 100644
--- a/arch/xtensa/platforms/iss/console.c
+++ b/arch/xtensa/platforms/iss/console.c
@@ -58,7 +58,8 @@ static int rs_open(struct tty_struct *tty, struct file * filp)
58 tty->port = &serial_port; 58 tty->port = &serial_port;
59 spin_lock(&timer_lock); 59 spin_lock(&timer_lock);
60 if (tty->count == 1) { 60 if (tty->count == 1) {
61 setup_timer(&serial_timer, rs_poll, (unsigned long)tty); 61 setup_timer(&serial_timer, rs_poll,
62 (unsigned long)&serial_port);
62 mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); 63 mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
63 } 64 }
64 spin_unlock(&timer_lock); 65 spin_unlock(&timer_lock);
@@ -97,8 +98,7 @@ static int rs_write(struct tty_struct * tty,
97 98
98static void rs_poll(unsigned long priv) 99static void rs_poll(unsigned long priv)
99{ 100{
100 struct tty_struct* tty = (struct tty_struct*) priv; 101 struct tty_port *port = (struct tty_port *)priv;
101
102 struct timeval tv = { .tv_sec = 0, .tv_usec = 0 }; 102 struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
103 int i = 0; 103 int i = 0;
104 unsigned char c; 104 unsigned char c;
@@ -107,12 +107,12 @@ static void rs_poll(unsigned long priv)
107 107
108 while (__simc(SYS_select_one, 0, XTISS_SELECT_ONE_READ, (int)&tv,0,0)){ 108 while (__simc(SYS_select_one, 0, XTISS_SELECT_ONE_READ, (int)&tv,0,0)){
109 __simc (SYS_read, 0, (unsigned long)&c, 1, 0, 0); 109 __simc (SYS_read, 0, (unsigned long)&c, 1, 0, 0);
110 tty_insert_flip_char(tty, c, TTY_NORMAL); 110 tty_insert_flip_char(port, c, TTY_NORMAL);
111 i++; 111 i++;
112 } 112 }
113 113
114 if (i) 114 if (i)
115 tty_flip_buffer_push(tty); 115 tty_flip_buffer_push(port);
116 116
117 117
118 mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); 118 mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index e9f203eadb1f..fdfd61a2d523 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -26,6 +26,7 @@ config BT_HCIBTSDIO
26 26
27config BT_HCIUART 27config BT_HCIUART
28 tristate "HCI UART driver" 28 tristate "HCI UART driver"
29 depends on TTY
29 help 30 help
30 Bluetooth HCI UART driver. 31 Bluetooth HCI UART driver.
31 This driver is required if you want to use Bluetooth devices with 32 This driver is required if you want to use Bluetooth devices with
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
index 72bedad6bf8c..3bb6fa3930be 100644
--- a/drivers/char/Kconfig
+++ b/drivers/char/Kconfig
@@ -53,7 +53,7 @@ source "drivers/tty/serial/Kconfig"
53 53
54config TTY_PRINTK 54config TTY_PRINTK
55 bool "TTY driver to output user messages via printk" 55 bool "TTY driver to output user messages via printk"
56 depends on EXPERT 56 depends on EXPERT && TTY
57 default n 57 default n
58 ---help--- 58 ---help---
59 If you say Y here, the support for writing user messages (i.e. 59 If you say Y here, the support for writing user messages (i.e.
@@ -159,7 +159,7 @@ source "drivers/tty/hvc/Kconfig"
159 159
160config VIRTIO_CONSOLE 160config VIRTIO_CONSOLE
161 tristate "Virtio console" 161 tristate "Virtio console"
162 depends on VIRTIO 162 depends on VIRTIO && TTY
163 select HVC_DRIVER 163 select HVC_DRIVER
164 help 164 help
165 Virtio console for use with lguest and other hypervisors. 165 Virtio console for use with lguest and other hypervisors.
@@ -392,6 +392,7 @@ config XILINX_HWICAP
392 392
393config R3964 393config R3964
394 tristate "Siemens R3964 line discipline" 394 tristate "Siemens R3964 line discipline"
395 depends on TTY
395 ---help--- 396 ---help---
396 This driver allows synchronous communication with devices using the 397 This driver allows synchronous communication with devices using the
397 Siemens R3964 packet protocol. Unless you are dealing with special 398 Siemens R3964 packet protocol. Unless you are dealing with special
@@ -439,7 +440,7 @@ source "drivers/char/pcmcia/Kconfig"
439 440
440config MWAVE 441config MWAVE
441 tristate "ACP Modem (Mwave) support" 442 tristate "ACP Modem (Mwave) support"
442 depends on X86 443 depends on X86 && TTY
443 select SERIAL_8250 444 select SERIAL_8250
444 ---help--- 445 ---help---
445 The ACP modem (Mwave) for Linux is a WinModem. It is composed of a 446 The ACP modem (Mwave) for Linux is a WinModem. It is composed of a
diff --git a/drivers/char/pcmcia/Kconfig b/drivers/char/pcmcia/Kconfig
index 6614416a8623..2a166d56738a 100644
--- a/drivers/char/pcmcia/Kconfig
+++ b/drivers/char/pcmcia/Kconfig
@@ -7,7 +7,7 @@ menu "PCMCIA character devices"
7 7
8config SYNCLINK_CS 8config SYNCLINK_CS
9 tristate "SyncLink PC Card support" 9 tristate "SyncLink PC Card support"
10 depends on PCMCIA 10 depends on PCMCIA && TTY
11 help 11 help
12 Enable support for the SyncLink PC Card serial adapter, running 12 Enable support for the SyncLink PC Card serial adapter, running
13 asynchronous and HDLC communications up to 512Kbps. The port is 13 asynchronous and HDLC communications up to 512Kbps. The port is
@@ -45,7 +45,7 @@ config CARDMAN_4040
45 45
46config IPWIRELESS 46config IPWIRELESS
47 tristate "IPWireless 3G UMTS PCMCIA card support" 47 tristate "IPWireless 3G UMTS PCMCIA card support"
48 depends on PCMCIA && NETDEVICES 48 depends on PCMCIA && NETDEVICES && TTY
49 select PPP 49 select PPP
50 help 50 help
51 This is a driver for 3G UMTS PCMCIA card from IPWireless company. In 51 This is a driver for 3G UMTS PCMCIA card from IPWireless company. In
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index b66eaa04f8cb..34e52ed0ea8c 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -210,7 +210,7 @@ typedef struct _mgslpc_info {
210 char testing_irq; 210 char testing_irq;
211 unsigned int init_error; /* startup error (DIAGS) */ 211 unsigned int init_error; /* startup error (DIAGS) */
212 212
213 char flag_buf[MAX_ASYNC_BUFFER_SIZE]; 213 char *flag_buf;
214 bool drop_rts_on_tx_done; 214 bool drop_rts_on_tx_done;
215 215
216 struct _input_signal_events input_signal_events; 216 struct _input_signal_events input_signal_events;
@@ -765,9 +765,6 @@ static void bh_handler(struct work_struct *work)
765 struct tty_struct *tty; 765 struct tty_struct *tty;
766 int action; 766 int action;
767 767
768 if (!info)
769 return;
770
771 if (debug_level >= DEBUG_LEVEL_BH) 768 if (debug_level >= DEBUG_LEVEL_BH)
772 printk( "%s(%d):bh_handler(%s) entry\n", 769 printk( "%s(%d):bh_handler(%s) entry\n",
773 __FILE__,__LINE__,info->device_name); 770 __FILE__,__LINE__,info->device_name);
@@ -886,21 +883,14 @@ static void rx_ready_hdlc(MGSLPC_INFO *info, int eom)
886 issue_command(info, CHA, CMD_RXFIFO); 883 issue_command(info, CHA, CMD_RXFIFO);
887} 884}
888 885
889static void rx_ready_async(MGSLPC_INFO *info, int tcd, struct tty_struct *tty) 886static void rx_ready_async(MGSLPC_INFO *info, int tcd)
890{ 887{
888 struct tty_port *port = &info->port;
891 unsigned char data, status, flag; 889 unsigned char data, status, flag;
892 int fifo_count; 890 int fifo_count;
893 int work = 0; 891 int work = 0;
894 struct mgsl_icount *icount = &info->icount; 892 struct mgsl_icount *icount = &info->icount;
895 893
896 if (!tty) {
897 /* tty is not available anymore */
898 issue_command(info, CHA, CMD_RXRESET);
899 if (debug_level >= DEBUG_LEVEL_ISR)
900 printk("%s(%d):rx_ready_async(tty=NULL)\n",__FILE__,__LINE__);
901 return;
902 }
903
904 if (tcd) { 894 if (tcd) {
905 /* early termination, get FIFO count from RBCL register */ 895 /* early termination, get FIFO count from RBCL register */
906 fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f); 896 fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f);
@@ -913,7 +903,7 @@ static void rx_ready_async(MGSLPC_INFO *info, int tcd, struct tty_struct *tty)
913 } else 903 } else
914 fifo_count = 32; 904 fifo_count = 32;
915 905
916 tty_buffer_request_room(tty, fifo_count); 906 tty_buffer_request_room(port, fifo_count);
917 /* Flush received async data to receive data buffer. */ 907 /* Flush received async data to receive data buffer. */
918 while (fifo_count) { 908 while (fifo_count) {
919 data = read_reg(info, CHA + RXFIFO); 909 data = read_reg(info, CHA + RXFIFO);
@@ -944,7 +934,7 @@ static void rx_ready_async(MGSLPC_INFO *info, int tcd, struct tty_struct *tty)
944 else if (status & BIT6) 934 else if (status & BIT6)
945 flag = TTY_FRAME; 935 flag = TTY_FRAME;
946 } 936 }
947 work += tty_insert_flip_char(tty, data, flag); 937 work += tty_insert_flip_char(port, data, flag);
948 } 938 }
949 issue_command(info, CHA, CMD_RXFIFO); 939 issue_command(info, CHA, CMD_RXFIFO);
950 940
@@ -957,7 +947,7 @@ static void rx_ready_async(MGSLPC_INFO *info, int tcd, struct tty_struct *tty)
957 } 947 }
958 948
959 if (work) 949 if (work)
960 tty_flip_buffer_push(tty); 950 tty_flip_buffer_push(port);
961} 951}
962 952
963 953
@@ -1217,7 +1207,7 @@ static irqreturn_t mgslpc_isr(int dummy, void *dev_id)
1217 if (info->params.mode == MGSL_MODE_HDLC) 1207 if (info->params.mode == MGSL_MODE_HDLC)
1218 rx_ready_hdlc(info, isr & IRQ_RXEOM); 1208 rx_ready_hdlc(info, isr & IRQ_RXEOM);
1219 else 1209 else
1220 rx_ready_async(info, isr & IRQ_RXEOM, tty); 1210 rx_ready_async(info, isr & IRQ_RXEOM);
1221 } 1211 }
1222 1212
1223 /* transmit IRQs */ 1213 /* transmit IRQs */
@@ -2521,7 +2511,7 @@ static int mgslpc_open(struct tty_struct *tty, struct file * filp)
2521 goto cleanup; 2511 goto cleanup;
2522 } 2512 }
2523 2513
2524 tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 2514 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
2525 2515
2526 spin_lock_irqsave(&info->netlock, flags); 2516 spin_lock_irqsave(&info->netlock, flags);
2527 if (info->netcount) { 2517 if (info->netcount) {
@@ -2674,6 +2664,14 @@ static int rx_alloc_buffers(MGSLPC_INFO *info)
2674 if (info->rx_buf == NULL) 2664 if (info->rx_buf == NULL)
2675 return -ENOMEM; 2665 return -ENOMEM;
2676 2666
2667 /* unused flag buffer to satisfy receive_buf calling interface */
2668 info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
2669 if (!info->flag_buf) {
2670 kfree(info->rx_buf);
2671 info->rx_buf = NULL;
2672 return -ENOMEM;
2673 }
2674
2677 rx_reset_buffers(info); 2675 rx_reset_buffers(info);
2678 return 0; 2676 return 0;
2679} 2677}
@@ -2682,6 +2680,8 @@ static void rx_free_buffers(MGSLPC_INFO *info)
2682{ 2680{
2683 kfree(info->rx_buf); 2681 kfree(info->rx_buf);
2684 info->rx_buf = NULL; 2682 info->rx_buf = NULL;
2683 kfree(info->flag_buf);
2684 info->flag_buf = NULL;
2685} 2685}
2686 2686
2687static int claim_resources(MGSLPC_INFO *info) 2687static int claim_resources(MGSLPC_INFO *info)
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index bdca5111eb9d..cf474b2df4ae 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -803,7 +803,7 @@ config I2C_PARPORT_LIGHT
803 803
804config I2C_TAOS_EVM 804config I2C_TAOS_EVM
805 tristate "TAOS evaluation module" 805 tristate "TAOS evaluation module"
806 depends on EXPERIMENTAL 806 depends on EXPERIMENTAL && TTY
807 select SERIO 807 select SERIO
808 select SERIO_SERPORT 808 select SERIO_SERPORT
809 default n 809 default n
diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig
index 56eb471b5576..055bcaba774c 100644
--- a/drivers/input/joystick/Kconfig
+++ b/drivers/input/joystick/Kconfig
@@ -132,6 +132,8 @@ config JOYSTICK_TMDC
132 132
133source "drivers/input/joystick/iforce/Kconfig" 133source "drivers/input/joystick/iforce/Kconfig"
134 134
135if TTY
136
135config JOYSTICK_WARRIOR 137config JOYSTICK_WARRIOR
136 tristate "Logitech WingMan Warrior joystick" 138 tristate "Logitech WingMan Warrior joystick"
137 select SERIO 139 select SERIO
@@ -205,6 +207,8 @@ config JOYSTICK_ZHENHUA
205 To compile this driver as a module, choose M here: the 207 To compile this driver as a module, choose M here: the
206 module will be called zhenhua. 208 module will be called zhenhua.
207 209
210endif # TTY
211
208config JOYSTICK_DB9 212config JOYSTICK_DB9
209 tristate "Multisystem, Sega Genesis, Saturn joysticks and gamepads" 213 tristate "Multisystem, Sega Genesis, Saturn joysticks and gamepads"
210 depends on PARPORT 214 depends on PARPORT
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 5a240c60342d..008f96aaf19e 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -69,6 +69,7 @@ config KEYBOARD_ATARI
69config KEYBOARD_ATKBD 69config KEYBOARD_ATKBD
70 tristate "AT keyboard" if EXPERT || !X86 70 tristate "AT keyboard" if EXPERT || !X86
71 default y 71 default y
72 depends on TTY
72 select SERIO 73 select SERIO
73 select SERIO_LIBPS2 74 select SERIO_LIBPS2
74 select SERIO_I8042 if X86 75 select SERIO_I8042 if X86
@@ -153,6 +154,7 @@ config KEYBOARD_BFIN
153 154
154config KEYBOARD_LKKBD 155config KEYBOARD_LKKBD
155 tristate "DECstation/VAXstation LK201/LK401 keyboard" 156 tristate "DECstation/VAXstation LK201/LK401 keyboard"
157 depends on TTY
156 select SERIO 158 select SERIO
157 help 159 help
158 Say Y here if you want to use a LK201 or LK401 style serial 160 Say Y here if you want to use a LK201 or LK401 style serial
@@ -268,7 +270,7 @@ config KEYBOARD_HIL_OLD
268 270
269config KEYBOARD_HIL 271config KEYBOARD_HIL
270 tristate "HP HIL keyboard/pointer support" 272 tristate "HP HIL keyboard/pointer support"
271 depends on GSC || HP300 273 depends on (GSC || HP300) && TTY
272 default y 274 default y
273 select HP_SDC 275 select HP_SDC
274 select HIL_MLC 276 select HIL_MLC
@@ -400,6 +402,7 @@ config KEYBOARD_IMX
400 402
401config KEYBOARD_NEWTON 403config KEYBOARD_NEWTON
402 tristate "Newton keyboard" 404 tristate "Newton keyboard"
405 depends on TTY
403 select SERIO 406 select SERIO
404 help 407 help
405 Say Y here if you have a Newton keyboard on a serial port. 408 Say Y here if you have a Newton keyboard on a serial port.
@@ -479,6 +482,8 @@ config KEYBOARD_SAMSUNG
479 To compile this driver as a module, choose M here: the 482 To compile this driver as a module, choose M here: the
480 module will be called samsung-keypad. 483 module will be called samsung-keypad.
481 484
485if TTY
486
482config KEYBOARD_STOWAWAY 487config KEYBOARD_STOWAWAY
483 tristate "Stowaway keyboard" 488 tristate "Stowaway keyboard"
484 select SERIO 489 select SERIO
@@ -501,6 +506,8 @@ config KEYBOARD_SUNKBD
501 To compile this driver as a module, choose M here: the 506 To compile this driver as a module, choose M here: the
502 module will be called sunkbd. 507 module will be called sunkbd.
503 508
509endif # TTY
510
504config KEYBOARD_SH_KEYSC 511config KEYBOARD_SH_KEYSC
505 tristate "SuperH KEYSC keypad support" 512 tristate "SuperH KEYSC keypad support"
506 depends on SUPERH || ARCH_SHMOBILE 513 depends on SUPERH || ARCH_SHMOBILE
@@ -597,6 +604,7 @@ config KEYBOARD_TWL4030
597 604
598config KEYBOARD_XTKBD 605config KEYBOARD_XTKBD
599 tristate "XT keyboard" 606 tristate "XT keyboard"
607 depends on TTY
600 select SERIO 608 select SERIO
601 help 609 help
602 Say Y here if you want to use the old IBM PC/XT keyboard (or 610 Say Y here if you want to use the old IBM PC/XT keyboard (or
diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig
index cd6268cf7cd5..fc160f72dc4e 100644
--- a/drivers/input/mouse/Kconfig
+++ b/drivers/input/mouse/Kconfig
@@ -14,6 +14,7 @@ if INPUT_MOUSE
14 14
15config MOUSE_PS2 15config MOUSE_PS2
16 tristate "PS/2 mouse" 16 tristate "PS/2 mouse"
17 depends on TTY
17 default y 18 default y
18 select SERIO 19 select SERIO
19 select SERIO_LIBPS2 20 select SERIO_LIBPS2
@@ -138,6 +139,7 @@ config MOUSE_PS2_OLPC
138 139
139config MOUSE_SERIAL 140config MOUSE_SERIAL
140 tristate "Serial mouse" 141 tristate "Serial mouse"
142 depends on TTY
141 select SERIO 143 select SERIO
142 help 144 help
143 Say Y here if you have a serial (RS-232, COM port) mouse connected 145 Say Y here if you have a serial (RS-232, COM port) mouse connected
@@ -262,6 +264,7 @@ config MOUSE_RISCPC
262 264
263config MOUSE_VSXXXAA 265config MOUSE_VSXXXAA
264 tristate "DEC VSXXX-AA/GA mouse and VSXXX-AB tablet" 266 tristate "DEC VSXXX-AA/GA mouse and VSXXX-AB tablet"
267 depends on TTY
265 select SERIO 268 select SERIO
266 help 269 help
267 Say Y (or M) if you want to use a DEC VSXXX-AA (hockey 270 Say Y (or M) if you want to use a DEC VSXXX-AA (hockey
diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig
index 4a4e182c33e7..81ee7551148e 100644
--- a/drivers/input/serio/Kconfig
+++ b/drivers/input/serio/Kconfig
@@ -4,6 +4,7 @@
4config SERIO 4config SERIO
5 tristate "Serial I/O support" if EXPERT || !X86 5 tristate "Serial I/O support" if EXPERT || !X86
6 default y 6 default y
7 depends on TTY
7 help 8 help
8 Say Yes here if you have any input device that uses serial I/O to 9 Say Yes here if you have any input device that uses serial I/O to
9 communicate with the system. This includes the 10 communicate with the system. This includes the
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 515cfe790543..3d6f548dd3d4 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -192,6 +192,8 @@ config TOUCHSCREEN_DA9052
192 To compile this driver as a module, choose M here: the 192 To compile this driver as a module, choose M here: the
193 module will be called da9052_tsi. 193 module will be called da9052_tsi.
194 194
195if TTY
196
195config TOUCHSCREEN_DYNAPRO 197config TOUCHSCREEN_DYNAPRO
196 tristate "Dynapro serial touchscreen" 198 tristate "Dynapro serial touchscreen"
197 select SERIO 199 select SERIO
@@ -216,6 +218,8 @@ config TOUCHSCREEN_HAMPSHIRE
216 To compile this driver as a module, choose M here: the 218 To compile this driver as a module, choose M here: the
217 module will be called hampshire. 219 module will be called hampshire.
218 220
221endif # TTY
222
219config TOUCHSCREEN_EETI 223config TOUCHSCREEN_EETI
220 tristate "EETI touchscreen panel support" 224 tristate "EETI touchscreen panel support"
221 depends on I2C 225 depends on I2C
@@ -237,6 +241,7 @@ config TOUCHSCREEN_EGALAX
237 241
238config TOUCHSCREEN_FUJITSU 242config TOUCHSCREEN_FUJITSU
239 tristate "Fujitsu serial touchscreen" 243 tristate "Fujitsu serial touchscreen"
244 depends on TTY
240 select SERIO 245 select SERIO
241 help 246 help
242 Say Y here if you have the Fujitsu touchscreen (such as one 247 Say Y here if you have the Fujitsu touchscreen (such as one
@@ -275,6 +280,8 @@ config TOUCHSCREEN_S3C2410
275 To compile this driver as a module, choose M here: the 280 To compile this driver as a module, choose M here: the
276 module will be called s3c2410_ts. 281 module will be called s3c2410_ts.
277 282
283if TTY
284
278config TOUCHSCREEN_GUNZE 285config TOUCHSCREEN_GUNZE
279 tristate "Gunze AHL-51S touchscreen" 286 tristate "Gunze AHL-51S touchscreen"
280 select SERIO 287 select SERIO
@@ -311,6 +318,8 @@ config TOUCHSCREEN_WACOM_W8001
311 To compile this driver as a module, choose M here: the 318 To compile this driver as a module, choose M here: the
312 module will be called wacom_w8001. 319 module will be called wacom_w8001.
313 320
321endif # TTY
322
314config TOUCHSCREEN_WACOM_I2C 323config TOUCHSCREEN_WACOM_I2C
315 tristate "Wacom Tablet support (I2C)" 324 tristate "Wacom Tablet support (I2C)"
316 depends on I2C 325 depends on I2C
@@ -369,6 +378,8 @@ config TOUCHSCREEN_MMS114
369 To compile this driver as a module, choose M here: the 378 To compile this driver as a module, choose M here: the
370 module will be called mms114. 379 module will be called mms114.
371 380
381if TTY
382
372config TOUCHSCREEN_MTOUCH 383config TOUCHSCREEN_MTOUCH
373 tristate "MicroTouch serial touchscreens" 384 tristate "MicroTouch serial touchscreens"
374 select SERIO 385 select SERIO
@@ -393,6 +404,8 @@ config TOUCHSCREEN_INEXIO
393 To compile this driver as a module, choose M here: the 404 To compile this driver as a module, choose M here: the
394 module will be called inexio. 405 module will be called inexio.
395 406
407endif # TTY
408
396config TOUCHSCREEN_INTEL_MID 409config TOUCHSCREEN_INTEL_MID
397 tristate "Intel MID platform resistive touchscreen" 410 tristate "Intel MID platform resistive touchscreen"
398 depends on INTEL_SCU_IPC 411 depends on INTEL_SCU_IPC
@@ -450,6 +463,7 @@ config TOUCHSCREEN_HTCPEN
450 463
451config TOUCHSCREEN_PENMOUNT 464config TOUCHSCREEN_PENMOUNT
452 tristate "Penmount serial touchscreen" 465 tristate "Penmount serial touchscreen"
466 depends on TTY
453 select SERIO 467 select SERIO
454 help 468 help
455 Say Y here if you have a Penmount serial touchscreen connected to 469 Say Y here if you have a Penmount serial touchscreen connected to
@@ -493,6 +507,8 @@ config TOUCHSCREEN_TNETV107X
493 To compile this driver as a module, choose M here: the 507 To compile this driver as a module, choose M here: the
494 module will be called tnetv107x-ts. 508 module will be called tnetv107x-ts.
495 509
510if TTY
511
496config TOUCHSCREEN_TOUCHRIGHT 512config TOUCHSCREEN_TOUCHRIGHT
497 tristate "Touchright serial touchscreen" 513 tristate "Touchright serial touchscreen"
498 select SERIO 514 select SERIO
@@ -517,6 +533,8 @@ config TOUCHSCREEN_TOUCHWIN
517 To compile this driver as a module, choose M here: the 533 To compile this driver as a module, choose M here: the
518 module will be called touchwin. 534 module will be called touchwin.
519 535
536endif # TTY
537
520config TOUCHSCREEN_TI_AM335X_TSC 538config TOUCHSCREEN_TI_AM335X_TSC
521 tristate "TI Touchscreen Interface" 539 tristate "TI Touchscreen Interface"
522 depends on MFD_TI_AM335X_TSCADC 540 depends on MFD_TI_AM335X_TSCADC
@@ -790,6 +808,8 @@ config TOUCHSCREEN_USB_EASYTOUCH
790 Say Y here if you have an EasyTouch USB Touch controller. 808 Say Y here if you have an EasyTouch USB Touch controller.
791 If unsure, say N. 809 If unsure, say N.
792 810
811if TTY
812
793config TOUCHSCREEN_TOUCHIT213 813config TOUCHSCREEN_TOUCHIT213
794 tristate "Sahara TouchIT-213 touchscreen" 814 tristate "Sahara TouchIT-213 touchscreen"
795 select SERIO 815 select SERIO
@@ -813,6 +833,8 @@ config TOUCHSCREEN_TSC_SERIO
813 To compile this driver as a module, choose M here: the 833 To compile this driver as a module, choose M here: the
814 module will be called tsc40. 834 module will be called tsc40.
815 835
836endif # TTY
837
816config TOUCHSCREEN_TSC2005 838config TOUCHSCREEN_TSC2005
817 tristate "TSC2005 based touchscreens" 839 tristate "TSC2005 based touchscreens"
818 depends on SPI_MASTER && GENERIC_HARDIRQS 840 depends on SPI_MASTER && GENERIC_HARDIRQS
diff --git a/drivers/ipack/devices/Kconfig b/drivers/ipack/devices/Kconfig
index 0b82fdc198c0..907a8cb48f2a 100644
--- a/drivers/ipack/devices/Kconfig
+++ b/drivers/ipack/devices/Kconfig
@@ -1,6 +1,6 @@
1config SERIAL_IPOCTAL 1config SERIAL_IPOCTAL
2 tristate "IndustryPack IP-OCTAL uart support" 2 tristate "IndustryPack IP-OCTAL uart support"
3 depends on IPACK_BUS 3 depends on IPACK_BUS && TTY
4 help 4 help
5 This driver supports the IPOCTAL serial port device for the IndustryPack bus. 5 This driver supports the IPOCTAL serial port device for the IndustryPack bus.
6 default n 6 default n
diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index 576d53d92677..ab20a0851dd2 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -133,9 +133,9 @@ static int ipoctal_get_icount(struct tty_struct *tty,
133 return 0; 133 return 0;
134} 134}
135 135
136static void ipoctal_irq_rx(struct ipoctal_channel *channel, 136static void ipoctal_irq_rx(struct ipoctal_channel *channel, u8 sr)
137 struct tty_struct *tty, u8 sr)
138{ 137{
138 struct tty_port *port = &channel->tty_port;
139 unsigned char value; 139 unsigned char value;
140 unsigned char flag = TTY_NORMAL; 140 unsigned char flag = TTY_NORMAL;
141 u8 isr; 141 u8 isr;
@@ -149,7 +149,7 @@ static void ipoctal_irq_rx(struct ipoctal_channel *channel,
149 if (sr & SR_OVERRUN_ERROR) { 149 if (sr & SR_OVERRUN_ERROR) {
150 channel->stats.overrun_err++; 150 channel->stats.overrun_err++;
151 /* Overrun doesn't affect the current character*/ 151 /* Overrun doesn't affect the current character*/
152 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 152 tty_insert_flip_char(port, 0, TTY_OVERRUN);
153 } 153 }
154 if (sr & SR_PARITY_ERROR) { 154 if (sr & SR_PARITY_ERROR) {
155 channel->stats.parity_err++; 155 channel->stats.parity_err++;
@@ -165,7 +165,7 @@ static void ipoctal_irq_rx(struct ipoctal_channel *channel,
165 flag = TTY_BREAK; 165 flag = TTY_BREAK;
166 } 166 }
167 } 167 }
168 tty_insert_flip_char(tty, value, flag); 168 tty_insert_flip_char(port, value, flag);
169 169
170 /* Check if there are more characters in RX FIFO 170 /* Check if there are more characters in RX FIFO
171 * If there are more, the isr register for this channel 171 * If there are more, the isr register for this channel
@@ -175,7 +175,7 @@ static void ipoctal_irq_rx(struct ipoctal_channel *channel,
175 sr = ioread8(&channel->regs->r.sr); 175 sr = ioread8(&channel->regs->r.sr);
176 } while (isr & channel->isr_rx_rdy_mask); 176 } while (isr & channel->isr_rx_rdy_mask);
177 177
178 tty_flip_buffer_push(tty); 178 tty_flip_buffer_push(port);
179} 179}
180 180
181static void ipoctal_irq_tx(struct ipoctal_channel *channel) 181static void ipoctal_irq_tx(struct ipoctal_channel *channel)
@@ -208,15 +208,11 @@ static void ipoctal_irq_tx(struct ipoctal_channel *channel)
208static void ipoctal_irq_channel(struct ipoctal_channel *channel) 208static void ipoctal_irq_channel(struct ipoctal_channel *channel)
209{ 209{
210 u8 isr, sr; 210 u8 isr, sr;
211 struct tty_struct *tty;
212 211
213 /* If there is no client, skip the check */ 212 /* If there is no client, skip the check */
214 if (!atomic_read(&channel->open)) 213 if (!atomic_read(&channel->open))
215 return; 214 return;
216 215
217 tty = tty_port_tty_get(&channel->tty_port);
218 if (!tty)
219 return;
220 /* The HW is organized in pair of channels. See which register we need 216 /* The HW is organized in pair of channels. See which register we need
221 * to read from */ 217 * to read from */
222 isr = ioread8(&channel->block_regs->r.isr); 218 isr = ioread8(&channel->block_regs->r.isr);
@@ -235,14 +231,13 @@ static void ipoctal_irq_channel(struct ipoctal_channel *channel)
235 231
236 /* RX data */ 232 /* RX data */
237 if ((isr & channel->isr_rx_rdy_mask) && (sr & SR_RX_READY)) 233 if ((isr & channel->isr_rx_rdy_mask) && (sr & SR_RX_READY))
238 ipoctal_irq_rx(channel, tty, sr); 234 ipoctal_irq_rx(channel, sr);
239 235
240 /* TX of each character */ 236 /* TX of each character */
241 if ((isr & channel->isr_tx_rdy_mask) && (sr & SR_TX_READY)) 237 if ((isr & channel->isr_tx_rdy_mask) && (sr & SR_TX_READY))
242 ipoctal_irq_tx(channel); 238 ipoctal_irq_tx(channel);
243 239
244 tty_flip_buffer_push(tty); 240 tty_flip_buffer_push(&channel->tty_port);
245 tty_kref_put(tty);
246} 241}
247 242
248static irqreturn_t ipoctal_irq_handler(void *arg) 243static irqreturn_t ipoctal_irq_handler(void *arg)
diff --git a/drivers/isdn/Kconfig b/drivers/isdn/Kconfig
index 86cd75a0e84d..ef661acdda17 100644
--- a/drivers/isdn/Kconfig
+++ b/drivers/isdn/Kconfig
@@ -22,6 +22,7 @@ if ISDN
22 22
23menuconfig ISDN_I4L 23menuconfig ISDN_I4L
24 tristate "Old ISDN4Linux (deprecated)" 24 tristate "Old ISDN4Linux (deprecated)"
25 depends on TTY
25 ---help--- 26 ---help---
26 This driver allows you to use an ISDN adapter for networking 27 This driver allows you to use an ISDN adapter for networking
27 connections and as dialin/out device. The isdn-tty's have a built 28 connections and as dialin/out device. The isdn-tty's have a built
diff --git a/drivers/isdn/capi/Kconfig b/drivers/isdn/capi/Kconfig
index 15c3ffd9d860..f04686580040 100644
--- a/drivers/isdn/capi/Kconfig
+++ b/drivers/isdn/capi/Kconfig
@@ -18,6 +18,7 @@ config CAPI_TRACE
18 18
19config ISDN_CAPI_MIDDLEWARE 19config ISDN_CAPI_MIDDLEWARE
20 bool "CAPI2.0 Middleware support" 20 bool "CAPI2.0 Middleware support"
21 depends on TTY
21 help 22 help
22 This option will enhance the capabilities of the /dev/capi20 23 This option will enhance the capabilities of the /dev/capi20
23 interface. It will provide a means of moving a data connection, 24 interface. It will provide a means of moving a data connection,
diff --git a/drivers/isdn/gigaset/Kconfig b/drivers/isdn/gigaset/Kconfig
index b18a92c32184..dde5e09e6267 100644
--- a/drivers/isdn/gigaset/Kconfig
+++ b/drivers/isdn/gigaset/Kconfig
@@ -1,5 +1,6 @@
1menuconfig ISDN_DRV_GIGASET 1menuconfig ISDN_DRV_GIGASET
2 tristate "Siemens Gigaset support" 2 tristate "Siemens Gigaset support"
3 depends on TTY
3 select CRC_CCITT 4 select CRC_CCITT
4 select BITREVERSE 5 select BITREVERSE
5 help 6 help
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c
index 67abf3ff45e8..0fbf4f215d86 100644
--- a/drivers/isdn/gigaset/interface.c
+++ b/drivers/isdn/gigaset/interface.c
@@ -164,7 +164,7 @@ static int if_open(struct tty_struct *tty, struct file *filp)
164 164
165 if (cs->port.count == 1) { 165 if (cs->port.count == 1) {
166 tty_port_tty_set(&cs->port, tty); 166 tty_port_tty_set(&cs->port, tty);
167 tty->low_latency = 1; 167 cs->port.low_latency = 1;
168 } 168 }
169 169
170 mutex_unlock(&cs->mutex); 170 mutex_unlock(&cs->mutex);
@@ -562,16 +562,8 @@ void gigaset_if_free(struct cardstate *cs)
562void gigaset_if_receive(struct cardstate *cs, 562void gigaset_if_receive(struct cardstate *cs,
563 unsigned char *buffer, size_t len) 563 unsigned char *buffer, size_t len)
564{ 564{
565 struct tty_struct *tty = tty_port_tty_get(&cs->port); 565 tty_insert_flip_string(&cs->port, buffer, len);
566 566 tty_flip_buffer_push(&cs->port);
567 if (tty == NULL) {
568 gig_dbg(DEBUG_IF, "receive on closed device");
569 return;
570 }
571
572 tty_insert_flip_string(tty, buffer, len);
573 tty_flip_buffer_push(tty);
574 tty_kref_put(tty);
575} 567}
576EXPORT_SYMBOL_GPL(gigaset_if_receive); 568EXPORT_SYMBOL_GPL(gigaset_if_receive);
577 569
diff --git a/drivers/isdn/hardware/mISDN/Kconfig b/drivers/isdn/hardware/mISDN/Kconfig
index eadc1cd34a20..b8611e3e5e74 100644
--- a/drivers/isdn/hardware/mISDN/Kconfig
+++ b/drivers/isdn/hardware/mISDN/Kconfig
@@ -76,6 +76,7 @@ config MISDN_NETJET
76 tristate "Support for NETJet cards" 76 tristate "Support for NETJet cards"
77 depends on MISDN 77 depends on MISDN
78 depends on PCI 78 depends on PCI
79 depends on TTY
79 select MISDN_IPAC 80 select MISDN_IPAC
80 select ISDN_HDLC 81 select ISDN_HDLC
81 select ISDN_I4L 82 select ISDN_I4L
diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c
index e2a945ee9f05..b87d9e577be2 100644
--- a/drivers/isdn/i4l/isdn_common.c
+++ b/drivers/isdn/i4l/isdn_common.c
@@ -876,7 +876,7 @@ isdn_readbchan(int di, int channel, u_char *buf, u_char *fp, int len, wait_queue
876 * of the mapping (di,ch)<->minor, happen during the sleep? --he 876 * of the mapping (di,ch)<->minor, happen during the sleep? --he
877 */ 877 */
878int 878int
879isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack) 879isdn_readbchan_tty(int di, int channel, struct tty_port *port, int cisco_hack)
880{ 880{
881 int count; 881 int count;
882 int count_pull; 882 int count_pull;
@@ -891,7 +891,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
891 if (skb_queue_empty(&dev->drv[di]->rpqueue[channel])) 891 if (skb_queue_empty(&dev->drv[di]->rpqueue[channel]))
892 return 0; 892 return 0;
893 893
894 len = tty_buffer_request_room(tty, dev->drv[di]->rcvcount[channel]); 894 len = tty_buffer_request_room(port, dev->drv[di]->rcvcount[channel]);
895 if (len == 0) 895 if (len == 0)
896 return len; 896 return len;
897 897
@@ -912,7 +912,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
912 while ((count_pull < skb->len) && (len > 0)) { 912 while ((count_pull < skb->len) && (len > 0)) {
913 /* push every character but the last to the tty buffer directly */ 913 /* push every character but the last to the tty buffer directly */
914 if (count_put) 914 if (count_put)
915 tty_insert_flip_char(tty, last, TTY_NORMAL); 915 tty_insert_flip_char(port, last, TTY_NORMAL);
916 len--; 916 len--;
917 if (dev->drv[di]->DLEflag & DLEmask) { 917 if (dev->drv[di]->DLEflag & DLEmask) {
918 last = DLE; 918 last = DLE;
@@ -940,7 +940,7 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
940 } 940 }
941 count_put = count_pull; 941 count_put = count_pull;
942 if (count_put > 1) 942 if (count_put > 1)
943 tty_insert_flip_string(tty, skb->data, count_put - 1); 943 tty_insert_flip_string(port, skb->data, count_put - 1);
944 last = skb->data[count_put - 1]; 944 last = skb->data[count_put - 1];
945 len -= count_put; 945 len -= count_put;
946#ifdef CONFIG_ISDN_AUDIO 946#ifdef CONFIG_ISDN_AUDIO
@@ -952,16 +952,16 @@ isdn_readbchan_tty(int di, int channel, struct tty_struct *tty, int cisco_hack)
952 * Now we can dequeue it. 952 * Now we can dequeue it.
953 */ 953 */
954 if (cisco_hack) 954 if (cisco_hack)
955 tty_insert_flip_char(tty, last, 0xFF); 955 tty_insert_flip_char(port, last, 0xFF);
956 else 956 else
957 tty_insert_flip_char(tty, last, TTY_NORMAL); 957 tty_insert_flip_char(port, last, TTY_NORMAL);
958#ifdef CONFIG_ISDN_AUDIO 958#ifdef CONFIG_ISDN_AUDIO
959 ISDN_AUDIO_SKB_LOCK(skb) = 0; 959 ISDN_AUDIO_SKB_LOCK(skb) = 0;
960#endif 960#endif
961 skb = skb_dequeue(&dev->drv[di]->rpqueue[channel]); 961 skb = skb_dequeue(&dev->drv[di]->rpqueue[channel]);
962 dev_kfree_skb(skb); 962 dev_kfree_skb(skb);
963 } else { 963 } else {
964 tty_insert_flip_char(tty, last, TTY_NORMAL); 964 tty_insert_flip_char(port, last, TTY_NORMAL);
965 /* Not yet emptied this buff, so it 965 /* Not yet emptied this buff, so it
966 * must stay in the queue, for further calls 966 * must stay in the queue, for further calls
967 * but we pull off the data we got until now. 967 * but we pull off the data we got until now.
diff --git a/drivers/isdn/i4l/isdn_common.h b/drivers/isdn/i4l/isdn_common.h
index 9a471f62e1d4..2260ef07ab9c 100644
--- a/drivers/isdn/i4l/isdn_common.h
+++ b/drivers/isdn/i4l/isdn_common.h
@@ -37,7 +37,7 @@ extern void isdn_timer_ctrl(int tf, int onoff);
37extern void isdn_unexclusive_channel(int di, int ch); 37extern void isdn_unexclusive_channel(int di, int ch);
38extern int isdn_getnum(char **); 38extern int isdn_getnum(char **);
39extern int isdn_readbchan(int, int, u_char *, u_char *, int, wait_queue_head_t *); 39extern int isdn_readbchan(int, int, u_char *, u_char *, int, wait_queue_head_t *);
40extern int isdn_readbchan_tty(int, int, struct tty_struct *, int); 40extern int isdn_readbchan_tty(int, int, struct tty_port *, int);
41extern int isdn_get_free_channel(int, int, int, int, int, char *); 41extern int isdn_get_free_channel(int, int, int, int, int, char *);
42extern int isdn_writebuf_skb_stub(int, int, int, struct sk_buff *); 42extern int isdn_writebuf_skb_stub(int, int, int, struct sk_buff *);
43extern int register_isdn(isdn_if *i); 43extern int register_isdn(isdn_if *i);
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c
index e09dc8a5e743..d8a7d8323414 100644
--- a/drivers/isdn/i4l/isdn_tty.c
+++ b/drivers/isdn/i4l/isdn_tty.c
@@ -60,18 +60,14 @@ static int si2bit[8] =
60static int 60static int
61isdn_tty_try_read(modem_info *info, struct sk_buff *skb) 61isdn_tty_try_read(modem_info *info, struct sk_buff *skb)
62{ 62{
63 struct tty_port *port = &info->port;
63 int c; 64 int c;
64 int len; 65 int len;
65 struct tty_struct *tty;
66 char last; 66 char last;
67 67
68 if (!info->online) 68 if (!info->online)
69 return 0; 69 return 0;
70 70
71 tty = info->port.tty;
72 if (!tty)
73 return 0;
74
75 if (!(info->mcr & UART_MCR_RTS)) 71 if (!(info->mcr & UART_MCR_RTS))
76 return 0; 72 return 0;
77 73
@@ -81,7 +77,7 @@ isdn_tty_try_read(modem_info *info, struct sk_buff *skb)
81#endif 77#endif
82 ; 78 ;
83 79
84 c = tty_buffer_request_room(tty, len); 80 c = tty_buffer_request_room(port, len);
85 if (c < len) 81 if (c < len)
86 return 0; 82 return 0;
87 83
@@ -91,25 +87,25 @@ isdn_tty_try_read(modem_info *info, struct sk_buff *skb)
91 unsigned char *dp = skb->data; 87 unsigned char *dp = skb->data;
92 while (--l) { 88 while (--l) {
93 if (*dp == DLE) 89 if (*dp == DLE)
94 tty_insert_flip_char(tty, DLE, 0); 90 tty_insert_flip_char(port, DLE, 0);
95 tty_insert_flip_char(tty, *dp++, 0); 91 tty_insert_flip_char(port, *dp++, 0);
96 } 92 }
97 if (*dp == DLE) 93 if (*dp == DLE)
98 tty_insert_flip_char(tty, DLE, 0); 94 tty_insert_flip_char(port, DLE, 0);
99 last = *dp; 95 last = *dp;
100 } else { 96 } else {
101#endif 97#endif
102 if (len > 1) 98 if (len > 1)
103 tty_insert_flip_string(tty, skb->data, len - 1); 99 tty_insert_flip_string(port, skb->data, len - 1);
104 last = skb->data[len - 1]; 100 last = skb->data[len - 1];
105#ifdef CONFIG_ISDN_AUDIO 101#ifdef CONFIG_ISDN_AUDIO
106 } 102 }
107#endif 103#endif
108 if (info->emu.mdmreg[REG_CPPP] & BIT_CPPP) 104 if (info->emu.mdmreg[REG_CPPP] & BIT_CPPP)
109 tty_insert_flip_char(tty, last, 0xFF); 105 tty_insert_flip_char(port, last, 0xFF);
110 else 106 else
111 tty_insert_flip_char(tty, last, TTY_NORMAL); 107 tty_insert_flip_char(port, last, TTY_NORMAL);
112 tty_flip_buffer_push(tty); 108 tty_flip_buffer_push(port);
113 kfree_skb(skb); 109 kfree_skb(skb);
114 110
115 return 1; 111 return 1;
@@ -126,7 +122,6 @@ isdn_tty_readmodem(void)
126 int midx; 122 int midx;
127 int i; 123 int i;
128 int r; 124 int r;
129 struct tty_struct *tty;
130 modem_info *info; 125 modem_info *info;
131 126
132 for (i = 0; i < ISDN_MAX_CHANNELS; i++) { 127 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
@@ -144,20 +139,21 @@ isdn_tty_readmodem(void)
144 if ((info->vonline & 1) && (info->emu.vpar[1])) 139 if ((info->vonline & 1) && (info->emu.vpar[1]))
145 isdn_audio_eval_silence(info); 140 isdn_audio_eval_silence(info);
146#endif 141#endif
147 tty = info->port.tty; 142 if (info->mcr & UART_MCR_RTS) {
148 if (tty) { 143 /* CISCO AsyncPPP Hack */
149 if (info->mcr & UART_MCR_RTS) { 144 if (!(info->emu.mdmreg[REG_CPPP] & BIT_CPPP))
150 /* CISCO AsyncPPP Hack */ 145 r = isdn_readbchan_tty(info->isdn_driver,
151 if (!(info->emu.mdmreg[REG_CPPP] & BIT_CPPP)) 146 info->isdn_channel,
152 r = isdn_readbchan_tty(info->isdn_driver, info->isdn_channel, tty, 0); 147 &info->port, 0);
153 else 148 else
154 r = isdn_readbchan_tty(info->isdn_driver, info->isdn_channel, tty, 1); 149 r = isdn_readbchan_tty(info->isdn_driver,
155 if (r) 150 info->isdn_channel,
156 tty_flip_buffer_push(tty); 151 &info->port, 1);
157 } else 152 if (r)
158 r = 1; 153 tty_flip_buffer_push(&info->port);
159 } else 154 } else
160 r = 1; 155 r = 1;
156
161 if (r) { 157 if (r) {
162 info->rcvsched = 0; 158 info->rcvsched = 0;
163 resched = 1; 159 resched = 1;
@@ -2229,7 +2225,7 @@ isdn_tty_stat_callback(int i, isdn_ctrl *c)
2229void 2225void
2230isdn_tty_at_cout(char *msg, modem_info *info) 2226isdn_tty_at_cout(char *msg, modem_info *info)
2231{ 2227{
2232 struct tty_struct *tty; 2228 struct tty_port *port = &info->port;
2233 atemu *m = &info->emu; 2229 atemu *m = &info->emu;
2234 char *p; 2230 char *p;
2235 char c; 2231 char c;
@@ -2246,15 +2242,14 @@ isdn_tty_at_cout(char *msg, modem_info *info)
2246 l = strlen(msg); 2242 l = strlen(msg);
2247 2243
2248 spin_lock_irqsave(&info->readlock, flags); 2244 spin_lock_irqsave(&info->readlock, flags);
2249 tty = info->port.tty; 2245 if (port->flags & ASYNC_CLOSING) {
2250 if ((info->port.flags & ASYNC_CLOSING) || (!tty)) {
2251 spin_unlock_irqrestore(&info->readlock, flags); 2246 spin_unlock_irqrestore(&info->readlock, flags);
2252 return; 2247 return;
2253 } 2248 }
2254 2249
2255 /* use queue instead of direct, if online and */ 2250 /* use queue instead of direct, if online and */
2256 /* data is in queue or buffer is full */ 2251 /* data is in queue or buffer is full */
2257 if (info->online && ((tty_buffer_request_room(tty, l) < l) || 2252 if (info->online && ((tty_buffer_request_room(port, l) < l) ||
2258 !skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel]))) { 2253 !skb_queue_empty(&dev->drv[info->isdn_driver]->rpqueue[info->isdn_channel]))) {
2259 skb = alloc_skb(l, GFP_ATOMIC); 2254 skb = alloc_skb(l, GFP_ATOMIC);
2260 if (!skb) { 2255 if (!skb) {
@@ -2285,7 +2280,7 @@ isdn_tty_at_cout(char *msg, modem_info *info)
2285 if (skb) { 2280 if (skb) {
2286 *sp++ = c; 2281 *sp++ = c;
2287 } else { 2282 } else {
2288 if (tty_insert_flip_char(tty, c, TTY_NORMAL) == 0) 2283 if (tty_insert_flip_char(port, c, TTY_NORMAL) == 0)
2289 break; 2284 break;
2290 } 2285 }
2291 } 2286 }
@@ -2299,7 +2294,7 @@ isdn_tty_at_cout(char *msg, modem_info *info)
2299 2294
2300 } else { 2295 } else {
2301 spin_unlock_irqrestore(&info->readlock, flags); 2296 spin_unlock_irqrestore(&info->readlock, flags);
2302 tty_flip_buffer_push(tty); 2297 tty_flip_buffer_push(port);
2303 } 2298 }
2304} 2299}
2305 2300
diff --git a/drivers/lguest/Kconfig b/drivers/lguest/Kconfig
index 34ae49dc557c..f9c43145a611 100644
--- a/drivers/lguest/Kconfig
+++ b/drivers/lguest/Kconfig
@@ -1,6 +1,6 @@
1config LGUEST 1config LGUEST
2 tristate "Linux hypervisor example code" 2 tristate "Linux hypervisor example code"
3 depends on X86_32 && EXPERIMENTAL && EVENTFD 3 depends on X86_32 && EXPERIMENTAL && EVENTFD && TTY
4 select HVC_DRIVER 4 select HVC_DRIVER
5 ---help--- 5 ---help---
6 This is a very simple module which allows you to run 6 This is a very simple module which allows you to run
diff --git a/drivers/media/radio/wl128x/Kconfig b/drivers/media/radio/wl128x/Kconfig
index ea1e6545df36..f359be7e9dd9 100644
--- a/drivers/media/radio/wl128x/Kconfig
+++ b/drivers/media/radio/wl128x/Kconfig
@@ -4,7 +4,7 @@
4menu "Texas Instruments WL128x FM driver (ST based)" 4menu "Texas Instruments WL128x FM driver (ST based)"
5config RADIO_WL128X 5config RADIO_WL128X
6 tristate "Texas Instruments WL128x FM Radio" 6 tristate "Texas Instruments WL128x FM Radio"
7 depends on VIDEO_V4L2 && RFKILL && GPIOLIB 7 depends on VIDEO_V4L2 && RFKILL && GPIOLIB && TTY
8 select TI_ST if NET 8 select TI_ST if NET
9 help 9 help
10 Choose Y here if you have this FM radio chip. 10 Choose Y here if you have this FM radio chip.
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index b151b7c1bd59..4b2bb939dde1 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -127,7 +127,7 @@ config PHANTOM
127 127
128config INTEL_MID_PTI 128config INTEL_MID_PTI
129 tristate "Parallel Trace Interface for MIPI P1149.7 cJTAG standard" 129 tristate "Parallel Trace Interface for MIPI P1149.7 cJTAG standard"
130 depends on PCI 130 depends on PCI && TTY
131 default n 131 default n
132 help 132 help
133 The PTI (Parallel Trace Interface) driver directs 133 The PTI (Parallel Trace Interface) driver directs
diff --git a/drivers/misc/ti-st/Kconfig b/drivers/misc/ti-st/Kconfig
index abb5de1afce3..f34dcc514730 100644
--- a/drivers/misc/ti-st/Kconfig
+++ b/drivers/misc/ti-st/Kconfig
@@ -5,7 +5,7 @@
5menu "Texas Instruments shared transport line discipline" 5menu "Texas Instruments shared transport line discipline"
6config TI_ST 6config TI_ST
7 tristate "Shared transport core driver" 7 tristate "Shared transport core driver"
8 depends on NET && GPIOLIB 8 depends on NET && GPIOLIB && TTY
9 select FW_LOADER 9 select FW_LOADER
10 help 10 help
11 This enables the shared transport core driver for TI 11 This enables the shared transport core driver for TI
diff --git a/drivers/mmc/card/Kconfig b/drivers/mmc/card/Kconfig
index 3b1f783bf924..5562308699bc 100644
--- a/drivers/mmc/card/Kconfig
+++ b/drivers/mmc/card/Kconfig
@@ -52,6 +52,7 @@ config MMC_BLOCK_BOUNCE
52 52
53config SDIO_UART 53config SDIO_UART
54 tristate "SDIO UART/GPS class support" 54 tristate "SDIO UART/GPS class support"
55 depends on TTY
55 help 56 help
56 SDIO function driver for SDIO cards that implements the UART 57 SDIO function driver for SDIO cards that implements the UART
57 class, as well as the GPS class which appears like a UART. 58 class, as well as the GPS class which appears like a UART.
diff --git a/drivers/mmc/card/sdio_uart.c b/drivers/mmc/card/sdio_uart.c
index bd57a11acc79..c931dfe6a59c 100644
--- a/drivers/mmc/card/sdio_uart.c
+++ b/drivers/mmc/card/sdio_uart.c
@@ -381,7 +381,6 @@ static void sdio_uart_stop_rx(struct sdio_uart_port *port)
381static void sdio_uart_receive_chars(struct sdio_uart_port *port, 381static void sdio_uart_receive_chars(struct sdio_uart_port *port,
382 unsigned int *status) 382 unsigned int *status)
383{ 383{
384 struct tty_struct *tty = tty_port_tty_get(&port->port);
385 unsigned int ch, flag; 384 unsigned int ch, flag;
386 int max_count = 256; 385 int max_count = 256;
387 386
@@ -418,23 +417,19 @@ static void sdio_uart_receive_chars(struct sdio_uart_port *port,
418 } 417 }
419 418
420 if ((*status & port->ignore_status_mask & ~UART_LSR_OE) == 0) 419 if ((*status & port->ignore_status_mask & ~UART_LSR_OE) == 0)
421 if (tty) 420 tty_insert_flip_char(&port->port, ch, flag);
422 tty_insert_flip_char(tty, ch, flag);
423 421
424 /* 422 /*
425 * Overrun is special. Since it's reported immediately, 423 * Overrun is special. Since it's reported immediately,
426 * it doesn't affect the current character. 424 * it doesn't affect the current character.
427 */ 425 */
428 if (*status & ~port->ignore_status_mask & UART_LSR_OE) 426 if (*status & ~port->ignore_status_mask & UART_LSR_OE)
429 if (tty) 427 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
430 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
431 428
432 *status = sdio_in(port, UART_LSR); 429 *status = sdio_in(port, UART_LSR);
433 } while ((*status & UART_LSR_DR) && (max_count-- > 0)); 430 } while ((*status & UART_LSR_DR) && (max_count-- > 0));
434 if (tty) { 431
435 tty_flip_buffer_push(tty); 432 tty_flip_buffer_push(&port->port);
436 tty_kref_put(tty);
437 }
438} 433}
439 434
440static void sdio_uart_transmit_chars(struct sdio_uart_port *port) 435static void sdio_uart_transmit_chars(struct sdio_uart_port *port)
diff --git a/drivers/net/caif/Kconfig b/drivers/net/caif/Kconfig
index abf4d7a9dcce..60c2142373c9 100644
--- a/drivers/net/caif/Kconfig
+++ b/drivers/net/caif/Kconfig
@@ -6,7 +6,7 @@ comment "CAIF transport drivers"
6 6
7config CAIF_TTY 7config CAIF_TTY
8 tristate "CAIF TTY transport driver" 8 tristate "CAIF TTY transport driver"
9 depends on CAIF 9 depends on CAIF && TTY
10 default n 10 default n
11 ---help--- 11 ---help---
12 The CAIF TTY transport driver is a Line Discipline (ldisc) 12 The CAIF TTY transport driver is a Line Discipline (ldisc)
diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c
index 5de74e762021..666891a9a248 100644
--- a/drivers/net/caif/caif_serial.c
+++ b/drivers/net/caif/caif_serial.c
@@ -91,7 +91,7 @@ static inline void update_tty_status(struct ser_device *ser)
91 ser->tty->hw_stopped << 4 | 91 ser->tty->hw_stopped << 4 |
92 ser->tty->flow_stopped << 3 | 92 ser->tty->flow_stopped << 3 |
93 ser->tty->packet << 2 | 93 ser->tty->packet << 2 |
94 ser->tty->low_latency << 1 | 94 ser->tty->port->low_latency << 1 |
95 ser->tty->warned; 95 ser->tty->warned;
96} 96}
97static inline void debugfs_init(struct ser_device *ser, struct tty_struct *tty) 97static inline void debugfs_init(struct ser_device *ser, struct tty_struct *tty)
diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig
index b56bd9e80957..72df3a306a08 100644
--- a/drivers/net/can/Kconfig
+++ b/drivers/net/can/Kconfig
@@ -13,7 +13,7 @@ config CAN_VCAN
13 13
14config CAN_SLCAN 14config CAN_SLCAN
15 tristate "Serial / USB serial CAN Adaptors (slcan)" 15 tristate "Serial / USB serial CAN Adaptors (slcan)"
16 depends on CAN 16 depends on CAN && TTY
17 ---help--- 17 ---help---
18 CAN driver for several 'low cost' CAN interfaces that are attached 18 CAN driver for several 'low cost' CAN interfaces that are attached
19 via serial lines or via USB-to-serial adapters using the LAWICEL 19 via serial lines or via USB-to-serial adapters using the LAWICEL
diff --git a/drivers/net/hamradio/Kconfig b/drivers/net/hamradio/Kconfig
index 95dbcfdf131d..bf5e59687680 100644
--- a/drivers/net/hamradio/Kconfig
+++ b/drivers/net/hamradio/Kconfig
@@ -1,6 +1,6 @@
1config MKISS 1config MKISS
2 tristate "Serial port KISS driver" 2 tristate "Serial port KISS driver"
3 depends on AX25 3 depends on AX25 && TTY
4 select CRC16 4 select CRC16
5 ---help--- 5 ---help---
6 KISS is a protocol used for the exchange of data between a computer 6 KISS is a protocol used for the exchange of data between a computer
@@ -18,7 +18,7 @@ config MKISS
18 18
19config 6PACK 19config 6PACK
20 tristate "Serial port 6PACK driver" 20 tristate "Serial port 6PACK driver"
21 depends on AX25 21 depends on AX25 && TTY
22 ---help--- 22 ---help---
23 6pack is a transmission protocol for the data exchange between your 23 6pack is a transmission protocol for the data exchange between your
24 PC and your TNC (the Terminal Node Controller acts as a kind of 24 PC and your TNC (the Terminal Node Controller acts as a kind of
diff --git a/drivers/net/irda/Kconfig b/drivers/net/irda/Kconfig
index 595205406d73..e1454cdec14b 100644
--- a/drivers/net/irda/Kconfig
+++ b/drivers/net/irda/Kconfig
@@ -5,7 +5,7 @@ comment "SIR device drivers"
5 5
6config IRTTY_SIR 6config IRTTY_SIR
7 tristate "IrTTY (uses Linux serial driver)" 7 tristate "IrTTY (uses Linux serial driver)"
8 depends on IRDA 8 depends on IRDA && TTY
9 help 9 help
10 Say Y here if you want to build support for the IrTTY line 10 Say Y here if you want to build support for the IrTTY line
11 discipline. To compile it as a module, choose M here: the module 11 discipline. To compile it as a module, choose M here: the module
diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c
index 6e4d4b62c9a8..a41267197839 100644
--- a/drivers/net/irda/irtty-sir.c
+++ b/drivers/net/irda/irtty-sir.c
@@ -210,7 +210,7 @@ static int irtty_do_write(struct sir_dev *dev, const unsigned char *ptr, size_t
210 * been received, which can now be decapsulated and delivered for 210 * been received, which can now be decapsulated and delivered for
211 * further processing 211 * further processing
212 * 212 *
213 * calling context depends on underlying driver and tty->low_latency! 213 * calling context depends on underlying driver and tty->port->low_latency!
214 * for example (low_latency: 1 / 0): 214 * for example (low_latency: 1 / 0):
215 * serial.c: uart-interrupt / softint 215 * serial.c: uart-interrupt / softint
216 * usbserial: urb-complete-interrupt / softint 216 * usbserial: urb-complete-interrupt / softint
diff --git a/drivers/net/ppp/Kconfig b/drivers/net/ppp/Kconfig
index 872df3ef07a6..3d9ef4f1e600 100644
--- a/drivers/net/ppp/Kconfig
+++ b/drivers/net/ppp/Kconfig
@@ -147,6 +147,7 @@ config PPPOL2TP
147 Support for PPP-over-L2TP socket family. L2TP is a protocol 147 Support for PPP-over-L2TP socket family. L2TP is a protocol
148 used by ISPs and enterprises to tunnel PPP traffic over UDP 148 used by ISPs and enterprises to tunnel PPP traffic over UDP
149 tunnels. L2TP is replacing PPTP for VPN uses. 149 tunnels. L2TP is replacing PPTP for VPN uses.
150if TTY
150 151
151config PPP_ASYNC 152config PPP_ASYNC
152 tristate "PPP support for async serial ports" 153 tristate "PPP support for async serial ports"
@@ -172,4 +173,6 @@ config PPP_SYNC_TTY
172 173
173 To compile this driver as a module, choose M here. 174 To compile this driver as a module, choose M here.
174 175
176endif # TTY
177
175endif # PPP 178endif # PPP
diff --git a/drivers/net/slip/Kconfig b/drivers/net/slip/Kconfig
index 211b160e4e9c..48e68714eef3 100644
--- a/drivers/net/slip/Kconfig
+++ b/drivers/net/slip/Kconfig
@@ -4,6 +4,7 @@
4 4
5config SLIP 5config SLIP
6 tristate "SLIP (serial line) support" 6 tristate "SLIP (serial line) support"
7 depends on TTY
7 ---help--- 8 ---help---
8 Say Y if you intend to use SLIP or CSLIP (compressed SLIP) to 9 Say Y if you intend to use SLIP or CSLIP (compressed SLIP) to
9 connect to your Internet service provider or to connect to some 10 connect to your Internet service provider or to connect to some
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index ef976215b649..bd33153261ce 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -445,7 +445,7 @@ config USB_NET_QMI_WWAN
445 445
446config USB_HSO 446config USB_HSO
447 tristate "Option USB High Speed Mobile Devices" 447 tristate "Option USB High Speed Mobile Devices"
448 depends on USB && RFKILL 448 depends on USB && RFKILL && TTY
449 default n 449 default n
450 help 450 help
451 Choose this option if you have an Option HSDPA/HSUPA card. 451 Choose this option if you have an Option HSDPA/HSUPA card.
@@ -493,7 +493,7 @@ config USB_SIERRA_NET
493 493
494config USB_VL600 494config USB_VL600
495 tristate "LG VL600 modem dongle" 495 tristate "LG VL600 modem dongle"
496 depends on USB_NET_CDCETHER 496 depends on USB_NET_CDCETHER && TTY
497 select USB_ACM 497 select USB_ACM
498 help 498 help
499 Select this if you want to use an LG Electronics 4G/LTE usb modem 499 Select this if you want to use an LG Electronics 4G/LTE usb modem
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index cd8ccb240f4b..f902a14da88c 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2035,25 +2035,23 @@ static int put_rxbuf_data(struct urb *urb, struct hso_serial *serial)
2035 tty = tty_port_tty_get(&serial->port); 2035 tty = tty_port_tty_get(&serial->port);
2036 2036
2037 /* Push data to tty */ 2037 /* Push data to tty */
2038 if (tty) { 2038 write_length_remaining = urb->actual_length -
2039 write_length_remaining = urb->actual_length - 2039 serial->curr_rx_urb_offset;
2040 serial->curr_rx_urb_offset; 2040 D1("data to push to tty");
2041 D1("data to push to tty"); 2041 while (write_length_remaining) {
2042 while (write_length_remaining) { 2042 if (tty && test_bit(TTY_THROTTLED, &tty->flags)) {
2043 if (test_bit(TTY_THROTTLED, &tty->flags)) { 2043 tty_kref_put(tty);
2044 tty_kref_put(tty); 2044 return -1;
2045 return -1;
2046 }
2047 curr_write_len = tty_insert_flip_string
2048 (tty, urb->transfer_buffer +
2049 serial->curr_rx_urb_offset,
2050 write_length_remaining);
2051 serial->curr_rx_urb_offset += curr_write_len;
2052 write_length_remaining -= curr_write_len;
2053 tty_flip_buffer_push(tty);
2054 } 2045 }
2055 tty_kref_put(tty); 2046 curr_write_len = tty_insert_flip_string(&serial->port,
2047 urb->transfer_buffer + serial->curr_rx_urb_offset,
2048 write_length_remaining);
2049 serial->curr_rx_urb_offset += curr_write_len;
2050 write_length_remaining -= curr_write_len;
2051 tty_flip_buffer_push(&serial->port);
2056 } 2052 }
2053 tty_kref_put(tty);
2054
2057 if (write_length_remaining == 0) { 2055 if (write_length_remaining == 0) {
2058 serial->curr_rx_urb_offset = 0; 2056 serial->curr_rx_urb_offset = 0;
2059 serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 0; 2057 serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 0;
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig
index d58431e99f73..61eb8994b34f 100644
--- a/drivers/net/wan/Kconfig
+++ b/drivers/net/wan/Kconfig
@@ -429,7 +429,7 @@ config LAPBETHER
429 429
430config X25_ASY 430config X25_ASY
431 tristate "X.25 async driver (EXPERIMENTAL)" 431 tristate "X.25 async driver (EXPERIMENTAL)"
432 depends on LAPB && X25 432 depends on LAPB && X25 && TTY
433 ---help--- 433 ---help---
434 Send and receive X.25 frames over regular asynchronous serial 434 Send and receive X.25 frames over regular asynchronous serial
435 lines such as telephone lines equipped with ordinary modems. 435 lines such as telephone lines equipped with ordinary modems.
diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
index 445197d4a8c4..6efd9b60d8ff 100644
--- a/drivers/pps/clients/Kconfig
+++ b/drivers/pps/clients/Kconfig
@@ -17,7 +17,7 @@ config PPS_CLIENT_KTIMER
17 17
18config PPS_CLIENT_LDISC 18config PPS_CLIENT_LDISC
19 tristate "PPS line discipline" 19 tristate "PPS line discipline"
20 depends on PPS 20 depends on PPS && TTY
21 help 21 help
22 If you say yes here you get support for a PPS source connected 22 If you say yes here you get support for a PPS source connected
23 with the CD (Carrier Detect) pin of your serial port. 23 with the CD (Carrier Detect) pin of your serial port.
diff --git a/drivers/s390/char/Kconfig b/drivers/s390/char/Kconfig
index 2c9a776bd63c..71bf959732fe 100644
--- a/drivers/s390/char/Kconfig
+++ b/drivers/s390/char/Kconfig
@@ -11,7 +11,7 @@ config TN3270
11config TN3270_TTY 11config TN3270_TTY
12 def_tristate y 12 def_tristate y
13 prompt "Support for tty input/output on 3270 terminals" 13 prompt "Support for tty input/output on 3270 terminals"
14 depends on TN3270 14 depends on TN3270 && TTY
15 help 15 help
16 Include support for using an IBM 3270 terminal as a Linux tty. 16 Include support for using an IBM 3270 terminal as a Linux tty.
17 17
@@ -33,7 +33,7 @@ config TN3270_CONSOLE
33config TN3215 33config TN3215
34 def_bool y 34 def_bool y
35 prompt "Support for 3215 line mode terminal" 35 prompt "Support for 3215 line mode terminal"
36 depends on CCW 36 depends on CCW && TTY
37 help 37 help
38 Include support for IBM 3215 line-mode terminals. 38 Include support for IBM 3215 line-mode terminals.
39 39
@@ -51,7 +51,7 @@ config CCW_CONSOLE
51config SCLP_TTY 51config SCLP_TTY
52 def_bool y 52 def_bool y
53 prompt "Support for SCLP line mode terminal" 53 prompt "Support for SCLP line mode terminal"
54 depends on S390 54 depends on S390 && TTY
55 help 55 help
56 Include support for IBM SCLP line-mode terminals. 56 Include support for IBM SCLP line-mode terminals.
57 57
@@ -66,7 +66,7 @@ config SCLP_CONSOLE
66config SCLP_VT220_TTY 66config SCLP_VT220_TTY
67 def_bool y 67 def_bool y
68 prompt "Support for SCLP VT220-compatible terminal" 68 prompt "Support for SCLP VT220-compatible terminal"
69 depends on S390 69 depends on S390 && TTY
70 help 70 help
71 Include support for an IBM SCLP VT220-compatible terminal. 71 Include support for an IBM SCLP VT220-compatible terminal.
72 72
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c
index 33b7141a182f..7b00fa634d40 100644
--- a/drivers/s390/char/con3215.c
+++ b/drivers/s390/char/con3215.c
@@ -412,8 +412,9 @@ static void raw3215_irq(struct ccw_device *cdev, unsigned long intparm,
412 break; 412 break;
413 413
414 case CTRLCHAR_CTRL: 414 case CTRLCHAR_CTRL:
415 tty_insert_flip_char(tty, cchar, TTY_NORMAL); 415 tty_insert_flip_char(&raw->port, cchar,
416 tty_flip_buffer_push(tty); 416 TTY_NORMAL);
417 tty_flip_buffer_push(&raw->port);
417 break; 418 break;
418 419
419 case CTRLCHAR_NONE: 420 case CTRLCHAR_NONE:
@@ -425,8 +426,9 @@ static void raw3215_irq(struct ccw_device *cdev, unsigned long intparm,
425 count++; 426 count++;
426 } else 427 } else
427 count -= 2; 428 count -= 2;
428 tty_insert_flip_string(tty, raw->inbuf, count); 429 tty_insert_flip_string(&raw->port, raw->inbuf,
429 tty_flip_buffer_push(tty); 430 count);
431 tty_flip_buffer_push(&raw->port);
430 break; 432 break;
431 } 433 }
432 } else if (req->type == RAW3215_WRITE) { 434 } else if (req->type == RAW3215_WRITE) {
@@ -970,7 +972,7 @@ static int tty3215_open(struct tty_struct *tty, struct file * filp)
970 972
971 tty_port_tty_set(&raw->port, tty); 973 tty_port_tty_set(&raw->port, tty);
972 974
973 tty->low_latency = 0; /* don't use bottom half for pushing chars */ 975 raw->port.low_latency = 0; /* don't use bottom half for pushing chars */
974 /* 976 /*
975 * Start up 3215 device 977 * Start up 3215 device
976 */ 978 */
diff --git a/drivers/s390/char/keyboard.h b/drivers/s390/char/keyboard.h
index d0ae2be58191..a31f339211d5 100644
--- a/drivers/s390/char/keyboard.h
+++ b/drivers/s390/char/keyboard.h
@@ -43,22 +43,14 @@ int kbd_ioctl(struct kbd_data *, unsigned int, unsigned long);
43static inline void 43static inline void
44kbd_put_queue(struct tty_port *port, int ch) 44kbd_put_queue(struct tty_port *port, int ch)
45{ 45{
46 struct tty_struct *tty = tty_port_tty_get(port); 46 tty_insert_flip_char(port, ch, 0);
47 if (!tty) 47 tty_schedule_flip(port);
48 return;
49 tty_insert_flip_char(tty, ch, 0);
50 tty_schedule_flip(tty);
51 tty_kref_put(tty);
52} 48}
53 49
54static inline void 50static inline void
55kbd_puts_queue(struct tty_port *port, char *cp) 51kbd_puts_queue(struct tty_port *port, char *cp)
56{ 52{
57 struct tty_struct *tty = tty_port_tty_get(port);
58 if (!tty)
59 return;
60 while (*cp) 53 while (*cp)
61 tty_insert_flip_char(tty, *cp++, 0); 54 tty_insert_flip_char(port, *cp++, 0);
62 tty_schedule_flip(tty); 55 tty_schedule_flip(port);
63 tty_kref_put(tty);
64} 56}
diff --git a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c
index 877fbc37c1e7..14b4cb8abcc8 100644
--- a/drivers/s390/char/sclp_tty.c
+++ b/drivers/s390/char/sclp_tty.c
@@ -65,7 +65,7 @@ sclp_tty_open(struct tty_struct *tty, struct file *filp)
65{ 65{
66 tty_port_tty_set(&sclp_port, tty); 66 tty_port_tty_set(&sclp_port, tty);
67 tty->driver_data = NULL; 67 tty->driver_data = NULL;
68 tty->low_latency = 0; 68 sclp_port.low_latency = 0;
69 return 0; 69 return 0;
70} 70}
71 71
@@ -342,8 +342,8 @@ sclp_tty_input(unsigned char* buf, unsigned int count)
342 case CTRLCHAR_SYSRQ: 342 case CTRLCHAR_SYSRQ:
343 break; 343 break;
344 case CTRLCHAR_CTRL: 344 case CTRLCHAR_CTRL:
345 tty_insert_flip_char(tty, cchar, TTY_NORMAL); 345 tty_insert_flip_char(&sclp_port, cchar, TTY_NORMAL);
346 tty_flip_buffer_push(tty); 346 tty_flip_buffer_push(&sclp_port);
347 break; 347 break;
348 case CTRLCHAR_NONE: 348 case CTRLCHAR_NONE:
349 /* send (normal) input to line discipline */ 349 /* send (normal) input to line discipline */
@@ -351,11 +351,11 @@ sclp_tty_input(unsigned char* buf, unsigned int count)
351 (strncmp((const char *) buf + count - 2, "^n", 2) && 351 (strncmp((const char *) buf + count - 2, "^n", 2) &&
352 strncmp((const char *) buf + count - 2, "\252n", 2))) { 352 strncmp((const char *) buf + count - 2, "\252n", 2))) {
353 /* add the auto \n */ 353 /* add the auto \n */
354 tty_insert_flip_string(tty, buf, count); 354 tty_insert_flip_string(&sclp_port, buf, count);
355 tty_insert_flip_char(tty, '\n', TTY_NORMAL); 355 tty_insert_flip_char(&sclp_port, '\n', TTY_NORMAL);
356 } else 356 } else
357 tty_insert_flip_string(tty, buf, count - 2); 357 tty_insert_flip_string(&sclp_port, buf, count - 2);
358 tty_flip_buffer_push(tty); 358 tty_flip_buffer_push(&sclp_port);
359 break; 359 break;
360 } 360 }
361 tty_kref_put(tty); 361 tty_kref_put(tty);
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c
index effcc8756e0a..6c92f62623be 100644
--- a/drivers/s390/char/sclp_vt220.c
+++ b/drivers/s390/char/sclp_vt220.c
@@ -461,14 +461,9 @@ sclp_vt220_write(struct tty_struct *tty, const unsigned char *buf, int count)
461static void 461static void
462sclp_vt220_receiver_fn(struct evbuf_header *evbuf) 462sclp_vt220_receiver_fn(struct evbuf_header *evbuf)
463{ 463{
464 struct tty_struct *tty = tty_port_tty_get(&sclp_vt220_port);
465 char *buffer; 464 char *buffer;
466 unsigned int count; 465 unsigned int count;
467 466
468 /* Ignore input if device is not open */
469 if (tty == NULL)
470 return;
471
472 buffer = (char *) ((addr_t) evbuf + sizeof(struct evbuf_header)); 467 buffer = (char *) ((addr_t) evbuf + sizeof(struct evbuf_header));
473 count = evbuf->length - sizeof(struct evbuf_header); 468 count = evbuf->length - sizeof(struct evbuf_header);
474 469
@@ -480,11 +475,10 @@ sclp_vt220_receiver_fn(struct evbuf_header *evbuf)
480 /* Send input to line discipline */ 475 /* Send input to line discipline */
481 buffer++; 476 buffer++;
482 count--; 477 count--;
483 tty_insert_flip_string(tty, buffer, count); 478 tty_insert_flip_string(&sclp_vt220_port, buffer, count);
484 tty_flip_buffer_push(tty); 479 tty_flip_buffer_push(&sclp_vt220_port);
485 break; 480 break;
486 } 481 }
487 tty_kref_put(tty);
488} 482}
489 483
490/* 484/*
@@ -495,7 +489,7 @@ sclp_vt220_open(struct tty_struct *tty, struct file *filp)
495{ 489{
496 if (tty->count == 1) { 490 if (tty->count == 1) {
497 tty_port_tty_set(&sclp_vt220_port, tty); 491 tty_port_tty_set(&sclp_vt220_port, tty);
498 tty->low_latency = 0; 492 sclp_vt220_port.low_latency = 0;
499 if (!tty->winsize.ws_row && !tty->winsize.ws_col) { 493 if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
500 tty->winsize.ws_row = 24; 494 tty->winsize.ws_row = 24;
501 tty->winsize.ws_col = 80; 495 tty->winsize.ws_col = 80;
diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c
index 43ea0593bdb0..3860e796b65f 100644
--- a/drivers/s390/char/tty3270.c
+++ b/drivers/s390/char/tty3270.c
@@ -860,7 +860,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
860 tty->driver_data = tp; 860 tty->driver_data = tp;
861 tty->winsize.ws_row = tp->view.rows - 2; 861 tty->winsize.ws_row = tp->view.rows - 2;
862 tty->winsize.ws_col = tp->view.cols; 862 tty->winsize.ws_col = tp->view.cols;
863 tty->low_latency = 0; 863 tp->port.low_latency = 0;
864 /* why to reassign? */ 864 /* why to reassign? */
865 tty_port_tty_set(&tp->port, tty); 865 tty_port_tty_set(&tp->port, tty);
866 tp->inattr = TF_INPUT; 866 tp->inattr = TF_INPUT;
@@ -893,7 +893,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
893 } 893 }
894 894
895 tty_port_tty_set(&tp->port, tty); 895 tty_port_tty_set(&tp->port, tty);
896 tty->low_latency = 0; 896 tp->port.low_latency = 0;
897 tty->winsize.ws_row = tp->view.rows - 2; 897 tty->winsize.ws_row = tp->view.rows - 2;
898 tty->winsize.ws_col = tp->view.cols; 898 tty->winsize.ws_col = tp->view.cols;
899 899
diff --git a/drivers/staging/ccg/Kconfig b/drivers/staging/ccg/Kconfig
index 8997a8c757aa..7ed5bc6caadb 100644
--- a/drivers/staging/ccg/Kconfig
+++ b/drivers/staging/ccg/Kconfig
@@ -2,7 +2,7 @@ if USB_GADGET
2 2
3config USB_G_CCG 3config USB_G_CCG
4 tristate "Configurable Composite Gadget (STAGING)" 4 tristate "Configurable Composite Gadget (STAGING)"
5 depends on STAGING && BLOCK && NET && !USB_ZERO && !USB_ZERO_HNPTEST && !USB_AUDIO && !GADGET_UAC1 && !USB_ETH && !USB_ETH_RNDIS && !USB_ETH_EEM && !USB_G_NCM && !USB_GADGETFS && !USB_FUNCTIONFS && !USB_FUNCTIONFS_ETH && !USB_FUNCTIONFS_RNDIS && !USB_FUNCTIONFS_GENERIC && !USB_FILE_STORAGE && !USB_FILE_STORAGE_TEST && !USB_MASS_STORAGE && !USB_G_SERIAL && !USB_MIDI_GADGET && !USB_G_PRINTER && !USB_CDC_COMPOSITE && !USB_G_NOKIA && !USB_G_ACM_MS && !USB_G_MULTI && !USB_G_MULTI_RNDIS && !USB_G_MULTI_CDC && !USB_G_HID && !USB_G_DBGP && !USB_G_WEBCAM 5 depends on STAGING && BLOCK && NET && !USB_ZERO && !USB_ZERO_HNPTEST && !USB_AUDIO && !GADGET_UAC1 && !USB_ETH && !USB_ETH_RNDIS && !USB_ETH_EEM && !USB_G_NCM && !USB_GADGETFS && !USB_FUNCTIONFS && !USB_FUNCTIONFS_ETH && !USB_FUNCTIONFS_RNDIS && !USB_FUNCTIONFS_GENERIC && !USB_FILE_STORAGE && !USB_FILE_STORAGE_TEST && !USB_MASS_STORAGE && !USB_G_SERIAL && !USB_MIDI_GADGET && !USB_G_PRINTER && !USB_CDC_COMPOSITE && !USB_G_NOKIA && !USB_G_ACM_MS && !USB_G_MULTI && !USB_G_MULTI_RNDIS && !USB_G_MULTI_CDC && !USB_G_HID && !USB_G_DBGP && !USB_G_WEBCAM && TTY
6 help 6 help
7 The Configurable Composite Gadget supports multiple USB 7 The Configurable Composite Gadget supports multiple USB
8 functions: acm, mass storage, rndis and FunctionFS. 8 functions: acm, mass storage, rndis and FunctionFS.
diff --git a/drivers/staging/ccg/u_serial.c b/drivers/staging/ccg/u_serial.c
index 373c40656b52..b10947ae0ac5 100644
--- a/drivers/staging/ccg/u_serial.c
+++ b/drivers/staging/ccg/u_serial.c
@@ -491,12 +491,8 @@ static void gs_rx_push(unsigned long _port)
491 491
492 req = list_first_entry(queue, struct usb_request, list); 492 req = list_first_entry(queue, struct usb_request, list);
493 493
494 /* discard data if tty was closed */
495 if (!tty)
496 goto recycle;
497
498 /* leave data queued if tty was rx throttled */ 494 /* leave data queued if tty was rx throttled */
499 if (test_bit(TTY_THROTTLED, &tty->flags)) 495 if (tty && test_bit(TTY_THROTTLED, &tty->flags))
500 break; 496 break;
501 497
502 switch (req->status) { 498 switch (req->status) {
@@ -529,7 +525,7 @@ static void gs_rx_push(unsigned long _port)
529 size -= n; 525 size -= n;
530 } 526 }
531 527
532 count = tty_insert_flip_string(tty, packet, size); 528 count = tty_insert_flip_string(&port->port, packet, size);
533 if (count) 529 if (count)
534 do_push = true; 530 do_push = true;
535 if (count != size) { 531 if (count != size) {
@@ -542,7 +538,6 @@ static void gs_rx_push(unsigned long _port)
542 } 538 }
543 port->n_read = 0; 539 port->n_read = 0;
544 } 540 }
545recycle:
546 list_move(&req->list, &port->read_pool); 541 list_move(&req->list, &port->read_pool);
547 port->read_started--; 542 port->read_started--;
548 } 543 }
@@ -550,8 +545,8 @@ recycle:
550 /* Push from tty to ldisc; without low_latency set this is handled by 545 /* Push from tty to ldisc; without low_latency set this is handled by
551 * a workqueue, so we won't get callbacks and can hold port_lock 546 * a workqueue, so we won't get callbacks and can hold port_lock
552 */ 547 */
553 if (tty && do_push) 548 if (do_push)
554 tty_flip_buffer_push(tty); 549 tty_flip_buffer_push(&port->port);
555 550
556 551
557 /* We want our data queue to become empty ASAP, keeping data 552 /* We want our data queue to become empty ASAP, keeping data
diff --git a/drivers/staging/dgrp/Kconfig b/drivers/staging/dgrp/Kconfig
index 39f4bb65ec83..e4c41552923a 100644
--- a/drivers/staging/dgrp/Kconfig
+++ b/drivers/staging/dgrp/Kconfig
@@ -1,7 +1,7 @@
1config DGRP 1config DGRP
2 tristate "Digi Realport driver" 2 tristate "Digi Realport driver"
3 default n 3 default n
4 depends on SYSFS 4 depends on SYSFS && TTY
5 ---help--- 5 ---help---
6 Support for Digi Realport devices. These devices allow you to 6 Support for Digi Realport devices. These devices allow you to
7 access remote serial ports as if they are local tty devices. This 7 access remote serial ports as if they are local tty devices. This
diff --git a/drivers/staging/dgrp/dgrp_net_ops.c b/drivers/staging/dgrp/dgrp_net_ops.c
index 2d1bbfd5b67c..4c7abfabf197 100644
--- a/drivers/staging/dgrp/dgrp_net_ops.c
+++ b/drivers/staging/dgrp/dgrp_net_ops.c
@@ -211,7 +211,7 @@ static void dgrp_input(struct ch_struct *ch)
211 data_len = (ch->ch_rin - ch->ch_rout) & RBUF_MASK; 211 data_len = (ch->ch_rin - ch->ch_rout) & RBUF_MASK;
212 212
213 /* len is the amount of data we are going to transfer here */ 213 /* len is the amount of data we are going to transfer here */
214 len = tty_buffer_request_room(tty, data_len); 214 len = tty_buffer_request_room(&ch->port, data_len);
215 215
216 /* Check DPA flow control */ 216 /* Check DPA flow control */
217 if ((nd->nd_dpa_debug) && 217 if ((nd->nd_dpa_debug) &&
@@ -232,9 +232,9 @@ static void dgrp_input(struct ch_struct *ch)
232 (nd->nd_dpa_port == PORT_NUM(MINOR(tty_devnum(tty))))) 232 (nd->nd_dpa_port == PORT_NUM(MINOR(tty_devnum(tty)))))
233 dgrp_dpa_data(nd, 1, myflipbuf, len); 233 dgrp_dpa_data(nd, 1, myflipbuf, len);
234 234
235 tty_insert_flip_string_flags(tty, myflipbuf, 235 tty_insert_flip_string_flags(&ch->port, myflipbuf,
236 myflipflagbuf, len); 236 myflipflagbuf, len);
237 tty_flip_buffer_push(tty); 237 tty_flip_buffer_push(&ch->port);
238 238
239 ch->ch_rxcount += len; 239 ch->ch_rxcount += len;
240 } 240 }
@@ -2956,9 +2956,9 @@ check_query:
2956 I_BRKINT(ch->ch_tun.un_tty) && 2956 I_BRKINT(ch->ch_tun.un_tty) &&
2957 !(I_IGNBRK(ch->ch_tun.un_tty))) { 2957 !(I_IGNBRK(ch->ch_tun.un_tty))) {
2958 2958
2959 tty_buffer_request_room(ch->ch_tun.un_tty, 1); 2959 tty_buffer_request_room(&ch->port, 1);
2960 tty_insert_flip_char(ch->ch_tun.un_tty, 0, TTY_BREAK); 2960 tty_insert_flip_char(&ch->port, 0, TTY_BREAK);
2961 tty_flip_buffer_push(ch->ch_tun.un_tty); 2961 tty_flip_buffer_push(&ch->port);
2962 2962
2963 } 2963 }
2964 2964
diff --git a/drivers/staging/fwserial/Kconfig b/drivers/staging/fwserial/Kconfig
index b2f8331e4acf..a0812d99136f 100644
--- a/drivers/staging/fwserial/Kconfig
+++ b/drivers/staging/fwserial/Kconfig
@@ -1,6 +1,6 @@
1config FIREWIRE_SERIAL 1config FIREWIRE_SERIAL
2 tristate "TTY over Firewire" 2 tristate "TTY over Firewire"
3 depends on FIREWIRE 3 depends on FIREWIRE && TTY
4 help 4 help
5 This enables TTY over IEEE 1394, providing high-speed serial 5 This enables TTY over IEEE 1394, providing high-speed serial
6 connectivity to cabled peers. This driver implements a 6 connectivity to cabled peers. This driver implements a
diff --git a/drivers/staging/fwserial/fwserial.c b/drivers/staging/fwserial/fwserial.c
index d03a7f57e8d4..e5e8f2f36e0c 100644
--- a/drivers/staging/fwserial/fwserial.c
+++ b/drivers/staging/fwserial/fwserial.c
@@ -489,16 +489,11 @@ static void fwtty_do_hangup(struct work_struct *work)
489static void fwtty_emit_breaks(struct work_struct *work) 489static void fwtty_emit_breaks(struct work_struct *work)
490{ 490{
491 struct fwtty_port *port = to_port(to_delayed_work(work), emit_breaks); 491 struct fwtty_port *port = to_port(to_delayed_work(work), emit_breaks);
492 struct tty_struct *tty;
493 static const char buf[16]; 492 static const char buf[16];
494 unsigned long now = jiffies; 493 unsigned long now = jiffies;
495 unsigned long elapsed = now - port->break_last; 494 unsigned long elapsed = now - port->break_last;
496 int n, t, c, brk = 0; 495 int n, t, c, brk = 0;
497 496
498 tty = tty_port_tty_get(&port->port);
499 if (!tty)
500 return;
501
502 /* generate breaks at the line rate (but at least 1) */ 497 /* generate breaks at the line rate (but at least 1) */
503 n = (elapsed * port->cps) / HZ + 1; 498 n = (elapsed * port->cps) / HZ + 1;
504 port->break_last = now; 499 port->break_last = now;
@@ -507,15 +502,14 @@ static void fwtty_emit_breaks(struct work_struct *work)
507 502
508 while (n) { 503 while (n) {
509 t = min(n, 16); 504 t = min(n, 16);
510 c = tty_insert_flip_string_fixed_flag(tty, buf, TTY_BREAK, t); 505 c = tty_insert_flip_string_fixed_flag(&port->port, buf,
506 TTY_BREAK, t);
511 n -= c; 507 n -= c;
512 brk += c; 508 brk += c;
513 if (c < t) 509 if (c < t)
514 break; 510 break;
515 } 511 }
516 tty_flip_buffer_push(tty); 512 tty_flip_buffer_push(&port->port);
517
518 tty_kref_put(tty);
519 513
520 if (port->mstatus & (UART_LSR_BI << 24)) 514 if (port->mstatus & (UART_LSR_BI << 24))
521 schedule_delayed_work(&port->emit_breaks, FREQ_BREAKS); 515 schedule_delayed_work(&port->emit_breaks, FREQ_BREAKS);
@@ -529,13 +523,9 @@ static void fwtty_pushrx(struct work_struct *work)
529 struct buffered_rx *buf, *next; 523 struct buffered_rx *buf, *next;
530 int n, c = 0; 524 int n, c = 0;
531 525
532 tty = tty_port_tty_get(&port->port);
533 if (!tty)
534 return;
535
536 spin_lock_bh(&port->lock); 526 spin_lock_bh(&port->lock);
537 list_for_each_entry_safe(buf, next, &port->buf_list, list) { 527 list_for_each_entry_safe(buf, next, &port->buf_list, list) {
538 n = tty_insert_flip_string_fixed_flag(tty, buf->data, 528 n = tty_insert_flip_string_fixed_flag(&port->port, buf->data,
539 TTY_NORMAL, buf->n); 529 TTY_NORMAL, buf->n);
540 c += n; 530 c += n;
541 port->buffered -= n; 531 port->buffered -= n;
@@ -544,7 +534,11 @@ static void fwtty_pushrx(struct work_struct *work)
544 memmove(buf->data, buf->data + n, buf->n - n); 534 memmove(buf->data, buf->data + n, buf->n - n);
545 buf->n -= n; 535 buf->n -= n;
546 } 536 }
547 __fwtty_throttle(port, tty); 537 tty = tty_port_tty_get(&port->port);
538 if (tty) {
539 __fwtty_throttle(port, tty);
540 tty_kref_put(tty);
541 }
548 break; 542 break;
549 } else { 543 } else {
550 list_del(&buf->list); 544 list_del(&buf->list);
@@ -552,13 +546,11 @@ static void fwtty_pushrx(struct work_struct *work)
552 } 546 }
553 } 547 }
554 if (c > 0) 548 if (c > 0)
555 tty_flip_buffer_push(tty); 549 tty_flip_buffer_push(&port->port);
556 550
557 if (list_empty(&port->buf_list)) 551 if (list_empty(&port->buf_list))
558 clear_bit(BUFFERING_RX, &port->flags); 552 clear_bit(BUFFERING_RX, &port->flags);
559 spin_unlock_bh(&port->lock); 553 spin_unlock_bh(&port->lock);
560
561 tty_kref_put(tty);
562} 554}
563 555
564static int fwtty_buffer_rx(struct fwtty_port *port, unsigned char *d, size_t n) 556static int fwtty_buffer_rx(struct fwtty_port *port, unsigned char *d, size_t n)
@@ -593,10 +585,6 @@ static int fwtty_rx(struct fwtty_port *port, unsigned char *data, size_t len)
593 unsigned lsr; 585 unsigned lsr;
594 int err = 0; 586 int err = 0;
595 587
596 tty = tty_port_tty_get(&port->port);
597 if (!tty)
598 return -ENOENT;
599
600 fwtty_dbg(port, "%d", n); 588 fwtty_dbg(port, "%d", n);
601 profile_size_distrib(port->stats.reads, n); 589 profile_size_distrib(port->stats.reads, n);
602 590
@@ -616,7 +604,7 @@ static int fwtty_rx(struct fwtty_port *port, unsigned char *data, size_t len)
616 604
617 lsr &= port->status_mask; 605 lsr &= port->status_mask;
618 if (lsr & ~port->ignore_mask & UART_LSR_OE) { 606 if (lsr & ~port->ignore_mask & UART_LSR_OE) {
619 if (!tty_insert_flip_char(tty, 0, TTY_OVERRUN)) { 607 if (!tty_insert_flip_char(&port->port, 0, TTY_OVERRUN)) {
620 err = -EIO; 608 err = -EIO;
621 goto out; 609 goto out;
622 } 610 }
@@ -630,18 +618,23 @@ static int fwtty_rx(struct fwtty_port *port, unsigned char *data, size_t len)
630 } 618 }
631 619
632 if (!test_bit(BUFFERING_RX, &port->flags)) { 620 if (!test_bit(BUFFERING_RX, &port->flags)) {
633 c = tty_insert_flip_string_fixed_flag(tty, data, TTY_NORMAL, n); 621 c = tty_insert_flip_string_fixed_flag(&port->port, data,
622 TTY_NORMAL, n);
634 if (c > 0) 623 if (c > 0)
635 tty_flip_buffer_push(tty); 624 tty_flip_buffer_push(&port->port);
636 n -= c; 625 n -= c;
637 626
638 if (n) { 627 if (n) {
639 /* start buffering and throttling */ 628 /* start buffering and throttling */
640 n -= fwtty_buffer_rx(port, &data[c], n); 629 n -= fwtty_buffer_rx(port, &data[c], n);
641 630
642 spin_lock_bh(&port->lock); 631 tty = tty_port_tty_get(&port->port);
643 __fwtty_throttle(port, tty); 632 if (tty) {
644 spin_unlock_bh(&port->lock); 633 spin_lock_bh(&port->lock);
634 __fwtty_throttle(port, tty);
635 spin_unlock_bh(&port->lock);
636 tty_kref_put(tty);
637 }
645 } 638 }
646 } else 639 } else
647 n -= fwtty_buffer_rx(port, data, n); 640 n -= fwtty_buffer_rx(port, data, n);
@@ -652,8 +645,6 @@ static int fwtty_rx(struct fwtty_port *port, unsigned char *data, size_t len)
652 } 645 }
653 646
654out: 647out:
655 tty_kref_put(tty);
656
657 port->icount.rx += len; 648 port->icount.rx += len;
658 port->stats.lost += n; 649 port->stats.lost += n;
659 return err; 650 return err;
diff --git a/drivers/staging/sb105x/Kconfig b/drivers/staging/sb105x/Kconfig
index 1facad625554..245e7847a354 100644
--- a/drivers/staging/sb105x/Kconfig
+++ b/drivers/staging/sb105x/Kconfig
@@ -1,8 +1,7 @@
1config SB105X 1config SB105X
2 tristate "SystemBase PCI Multiport UART" 2 tristate "SystemBase PCI Multiport UART"
3 select SERIAL_CORE 3 select SERIAL_CORE
4 depends on PCI 4 depends on PCI && X86 && TTY && BROKEN
5 depends on X86
6 help 5 help
7 A driver for the SystemBase Multi-2/PCI serial card 6 A driver for the SystemBase Multi-2/PCI serial card
8 7
diff --git a/drivers/staging/serqt_usb2/serqt_usb2.c b/drivers/staging/serqt_usb2/serqt_usb2.c
index 1b3e995d3a27..b1bb1a6abe81 100644
--- a/drivers/staging/serqt_usb2/serqt_usb2.c
+++ b/drivers/staging/serqt_usb2/serqt_usb2.c
@@ -255,12 +255,11 @@ static void ProcessModemStatus(struct quatech_port *qt_port,
255 wake_up_interruptible(&qt_port->wait); 255 wake_up_interruptible(&qt_port->wait);
256} 256}
257 257
258static void ProcessRxChar(struct tty_struct *tty, struct usb_serial_port *port, 258static void ProcessRxChar(struct usb_serial_port *port, unsigned char data)
259 unsigned char data)
260{ 259{
261 struct urb *urb = port->read_urb; 260 struct urb *urb = port->read_urb;
262 if (urb->actual_length) 261 if (urb->actual_length)
263 tty_insert_flip_char(tty, data, TTY_NORMAL); 262 tty_insert_flip_char(&port->port, data, TTY_NORMAL);
264} 263}
265 264
266static void qt_write_bulk_callback(struct urb *urb) 265static void qt_write_bulk_callback(struct urb *urb)
@@ -291,8 +290,7 @@ static void qt_interrupt_callback(struct urb *urb)
291 /* FIXME */ 290 /* FIXME */
292} 291}
293 292
294static void qt_status_change_check(struct tty_struct *tty, 293static void qt_status_change_check(struct urb *urb,
295 struct urb *urb,
296 struct quatech_port *qt_port, 294 struct quatech_port *qt_port,
297 struct usb_serial_port *port) 295 struct usb_serial_port *port)
298{ 296{
@@ -335,8 +333,8 @@ static void qt_status_change_check(struct tty_struct *tty,
335 case 0xff: 333 case 0xff:
336 dev_dbg(&port->dev, "No status sequence.\n"); 334 dev_dbg(&port->dev, "No status sequence.\n");
337 335
338 ProcessRxChar(tty, port, data[i]); 336 ProcessRxChar(port, data[i]);
339 ProcessRxChar(tty, port, data[i + 1]); 337 ProcessRxChar(port, data[i + 1]);
340 338
341 i += 2; 339 i += 2;
342 break; 340 break;
@@ -345,11 +343,11 @@ static void qt_status_change_check(struct tty_struct *tty,
345 continue; 343 continue;
346 } 344 }
347 345
348 if (tty && urb->actual_length) 346 if (urb->actual_length)
349 tty_insert_flip_char(tty, data[i], TTY_NORMAL); 347 tty_insert_flip_char(&port->port, data[i], TTY_NORMAL);
350 348
351 } 349 }
352 tty_flip_buffer_push(tty); 350 tty_flip_buffer_push(&port->port);
353} 351}
354 352
355static void qt_read_bulk_callback(struct urb *urb) 353static void qt_read_bulk_callback(struct urb *urb)
@@ -358,7 +356,6 @@ static void qt_read_bulk_callback(struct urb *urb)
358 struct usb_serial_port *port = urb->context; 356 struct usb_serial_port *port = urb->context;
359 struct usb_serial *serial = get_usb_serial(port, __func__); 357 struct usb_serial *serial = get_usb_serial(port, __func__);
360 struct quatech_port *qt_port = qt_get_port_private(port); 358 struct quatech_port *qt_port = qt_get_port_private(port);
361 struct tty_struct *tty;
362 int result; 359 int result;
363 360
364 if (urb->status) { 361 if (urb->status) {
@@ -369,27 +366,23 @@ static void qt_read_bulk_callback(struct urb *urb)
369 return; 366 return;
370 } 367 }
371 368
372 tty = tty_port_tty_get(&port->port);
373 if (!tty)
374 return;
375
376 dev_dbg(&port->dev, 369 dev_dbg(&port->dev,
377 "%s - port->RxHolding = %d\n", __func__, qt_port->RxHolding); 370 "%s - port->RxHolding = %d\n", __func__, qt_port->RxHolding);
378 371
379 if (port_paranoia_check(port, __func__) != 0) { 372 if (port_paranoia_check(port, __func__) != 0) {
380 qt_port->ReadBulkStopped = 1; 373 qt_port->ReadBulkStopped = 1;
381 goto exit; 374 return;
382 } 375 }
383 376
384 if (!serial) 377 if (!serial)
385 goto exit; 378 return;
386 379
387 if (qt_port->closePending == 1) { 380 if (qt_port->closePending == 1) {
388 /* Were closing , stop reading */ 381 /* Were closing , stop reading */
389 dev_dbg(&port->dev, 382 dev_dbg(&port->dev,
390 "%s - (qt_port->closepending == 1\n", __func__); 383 "%s - (qt_port->closepending == 1\n", __func__);
391 qt_port->ReadBulkStopped = 1; 384 qt_port->ReadBulkStopped = 1;
392 goto exit; 385 return;
393 } 386 }
394 387
395 /* 388 /*
@@ -399,7 +392,7 @@ static void qt_read_bulk_callback(struct urb *urb)
399 */ 392 */
400 if (qt_port->RxHolding == 1) { 393 if (qt_port->RxHolding == 1) {
401 qt_port->ReadBulkStopped = 1; 394 qt_port->ReadBulkStopped = 1;
402 goto exit; 395 return;
403 } 396 }
404 397
405 if (urb->status) { 398 if (urb->status) {
@@ -408,11 +401,11 @@ static void qt_read_bulk_callback(struct urb *urb)
408 dev_dbg(&port->dev, 401 dev_dbg(&port->dev,
409 "%s - nonzero read bulk status received: %d\n", 402 "%s - nonzero read bulk status received: %d\n",
410 __func__, urb->status); 403 __func__, urb->status);
411 goto exit; 404 return;
412 } 405 }
413 406
414 if (urb->actual_length) 407 if (urb->actual_length)
415 qt_status_change_check(tty, urb, qt_port, port); 408 qt_status_change_check(urb, qt_port, port);
416 409
417 /* Continue trying to always read */ 410 /* Continue trying to always read */
418 usb_fill_bulk_urb(port->read_urb, serial->dev, 411 usb_fill_bulk_urb(port->read_urb, serial->dev,
@@ -428,14 +421,12 @@ static void qt_read_bulk_callback(struct urb *urb)
428 __func__, result); 421 __func__, result);
429 else { 422 else {
430 if (urb->actual_length) { 423 if (urb->actual_length) {
431 tty_flip_buffer_push(tty); 424 tty_flip_buffer_push(&port->port);
432 tty_schedule_flip(tty); 425 tty_schedule_flip(&port->port);
433 } 426 }
434 } 427 }
435 428
436 schedule_work(&port->work); 429 schedule_work(&port->work);
437exit:
438 tty_kref_put(tty);
439} 430}
440 431
441/* 432/*
diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig
index 0ecf22b6a38e..29dfc24f2dbb 100644
--- a/drivers/tty/Kconfig
+++ b/drivers/tty/Kconfig
@@ -1,3 +1,14 @@
1config TTY
2 bool "Enable TTY" if EXPERT
3 default y
4 ---help---
5 Allows you to remove TTY support which can save space, and
6 blocks features that require TTY from inclusion in the kernel.
7 TTY is required for any text terminals or serial port
8 communication. Most users should leave this enabled.
9
10if TTY
11
1config VT 12config VT
2 bool "Virtual terminal" if EXPERT 13 bool "Virtual terminal" if EXPERT
3 depends on !S390 && !UML 14 depends on !S390 && !UML
@@ -388,3 +399,11 @@ config PPC_EARLY_DEBUG_EHV_BC_HANDLE
388 If the number you specify is not a valid byte channel handle, then 399 If the number you specify is not a valid byte channel handle, then
389 there simply will be no early console output. This is true also 400 there simply will be no early console output. This is true also
390 if you don't boot under a hypervisor at all. 401 if you don't boot under a hypervisor at all.
402
403config GOLDFISH_TTY
404 tristate "Goldfish TTY Driver"
405 depends on GOLDFISH
406 help
407 Console and system TTY driver for the Goldfish virtual platform.
408
409endif # TTY
diff --git a/drivers/tty/Makefile b/drivers/tty/Makefile
index 2953059530e4..35649d35abf0 100644
--- a/drivers/tty/Makefile
+++ b/drivers/tty/Makefile
@@ -1,4 +1,4 @@
1obj-y += tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o \ 1obj-$(CONFIG_TTY) += tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o \
2 tty_buffer.o tty_port.o tty_mutex.o 2 tty_buffer.o tty_port.o tty_mutex.o
3obj-$(CONFIG_LEGACY_PTYS) += pty.o 3obj-$(CONFIG_LEGACY_PTYS) += pty.o
4obj-$(CONFIG_UNIX98_PTYS) += pty.o 4obj-$(CONFIG_UNIX98_PTYS) += pty.o
@@ -27,5 +27,6 @@ obj-$(CONFIG_SYNCLINK_GT) += synclink_gt.o
27obj-$(CONFIG_SYNCLINKMP) += synclinkmp.o 27obj-$(CONFIG_SYNCLINKMP) += synclinkmp.o
28obj-$(CONFIG_SYNCLINK) += synclink.o 28obj-$(CONFIG_SYNCLINK) += synclink.o
29obj-$(CONFIG_PPC_EPAPR_HV_BYTECHAN) += ehv_bytechan.o 29obj-$(CONFIG_PPC_EPAPR_HV_BYTECHAN) += ehv_bytechan.o
30obj-$(CONFIG_GOLDFISH_TTY) += goldfish.o
30 31
31obj-y += ipwireless/ 32obj-y += ipwireless/
diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
index 9d7d00cdfecb..4c7d70172193 100644
--- a/drivers/tty/amiserial.c
+++ b/drivers/tty/amiserial.c
@@ -251,7 +251,6 @@ static void receive_chars(struct serial_state *info)
251{ 251{
252 int status; 252 int status;
253 int serdatr; 253 int serdatr;
254 struct tty_struct *tty = info->tport.tty;
255 unsigned char ch, flag; 254 unsigned char ch, flag;
256 struct async_icount *icount; 255 struct async_icount *icount;
257 int oe = 0; 256 int oe = 0;
@@ -314,7 +313,7 @@ static void receive_chars(struct serial_state *info)
314#endif 313#endif
315 flag = TTY_BREAK; 314 flag = TTY_BREAK;
316 if (info->tport.flags & ASYNC_SAK) 315 if (info->tport.flags & ASYNC_SAK)
317 do_SAK(tty); 316 do_SAK(info->tport.tty);
318 } else if (status & UART_LSR_PE) 317 } else if (status & UART_LSR_PE)
319 flag = TTY_PARITY; 318 flag = TTY_PARITY;
320 else if (status & UART_LSR_FE) 319 else if (status & UART_LSR_FE)
@@ -328,10 +327,10 @@ static void receive_chars(struct serial_state *info)
328 oe = 1; 327 oe = 1;
329 } 328 }
330 } 329 }
331 tty_insert_flip_char(tty, ch, flag); 330 tty_insert_flip_char(&info->tport, ch, flag);
332 if (oe == 1) 331 if (oe == 1)
333 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 332 tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN);
334 tty_flip_buffer_push(tty); 333 tty_flip_buffer_push(&info->tport);
335out: 334out:
336 return; 335 return;
337} 336}
@@ -1099,7 +1098,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
1099 state->custom_divisor = new_serial.custom_divisor; 1098 state->custom_divisor = new_serial.custom_divisor;
1100 port->close_delay = new_serial.close_delay * HZ/100; 1099 port->close_delay = new_serial.close_delay * HZ/100;
1101 port->closing_wait = new_serial.closing_wait * HZ/100; 1100 port->closing_wait = new_serial.closing_wait * HZ/100;
1102 tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1101 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1103 1102
1104check_and_exit: 1103check_and_exit:
1105 if (port->flags & ASYNC_INITIALIZED) { 1104 if (port->flags & ASYNC_INITIALIZED) {
@@ -1528,7 +1527,7 @@ static int rs_open(struct tty_struct *tty, struct file * filp)
1528 if (serial_paranoia_check(info, tty->name, "rs_open")) 1527 if (serial_paranoia_check(info, tty->name, "rs_open"))
1529 return -ENODEV; 1528 return -ENODEV;
1530 1529
1531 tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1530 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1532 1531
1533 retval = startup(tty, info); 1532 retval = startup(tty, info);
1534 if (retval) { 1533 if (retval) {
diff --git a/drivers/tty/bfin_jtag_comm.c b/drivers/tty/bfin_jtag_comm.c
index 1cfcdbf1d0cc..a93a424873fa 100644
--- a/drivers/tty/bfin_jtag_comm.c
+++ b/drivers/tty/bfin_jtag_comm.c
@@ -95,18 +95,16 @@ bfin_jc_emudat_manager(void *arg)
95 95
96 /* if incoming data is ready, eat it */ 96 /* if incoming data is ready, eat it */
97 if (bfin_read_DBGSTAT() & EMUDIF) { 97 if (bfin_read_DBGSTAT() & EMUDIF) {
98 if (tty != NULL) { 98 uint32_t emudat = bfin_read_emudat();
99 uint32_t emudat = bfin_read_emudat(); 99 if (inbound_len == 0) {
100 if (inbound_len == 0) { 100 pr_debug("incoming length: 0x%08x\n", emudat);
101 pr_debug("incoming length: 0x%08x\n", emudat); 101 inbound_len = emudat;
102 inbound_len = emudat; 102 } else {
103 } else { 103 size_t num_chars = (4 <= inbound_len ? 4 : inbound_len);
104 size_t num_chars = (4 <= inbound_len ? 4 : inbound_len); 104 pr_debug(" incoming data: 0x%08x (pushing %zu)\n", emudat, num_chars);
105 pr_debug(" incoming data: 0x%08x (pushing %zu)\n", emudat, num_chars); 105 inbound_len -= num_chars;
106 inbound_len -= num_chars; 106 tty_insert_flip_string(&port, (unsigned char *)&emudat, num_chars);
107 tty_insert_flip_string(tty, (unsigned char *)&emudat, num_chars); 107 tty_flip_buffer_push(&port);
108 tty_flip_buffer_push(tty);
109 }
110 } 108 }
111 } 109 }
112 110
diff --git a/drivers/tty/cyclades.c b/drivers/tty/cyclades.c
index b09c8d1f9a66..345bd0e0884e 100644
--- a/drivers/tty/cyclades.c
+++ b/drivers/tty/cyclades.c
@@ -441,7 +441,7 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
441 void __iomem *base_addr) 441 void __iomem *base_addr)
442{ 442{
443 struct cyclades_port *info; 443 struct cyclades_port *info;
444 struct tty_struct *tty; 444 struct tty_port *port;
445 int len, index = cinfo->bus_index; 445 int len, index = cinfo->bus_index;
446 u8 ivr, save_xir, channel, save_car, data, char_count; 446 u8 ivr, save_xir, channel, save_car, data, char_count;
447 447
@@ -452,22 +452,11 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
452 save_xir = readb(base_addr + (CyRIR << index)); 452 save_xir = readb(base_addr + (CyRIR << index));
453 channel = save_xir & CyIRChannel; 453 channel = save_xir & CyIRChannel;
454 info = &cinfo->ports[channel + chip * 4]; 454 info = &cinfo->ports[channel + chip * 4];
455 port = &info->port;
455 save_car = cyy_readb(info, CyCAR); 456 save_car = cyy_readb(info, CyCAR);
456 cyy_writeb(info, CyCAR, save_xir); 457 cyy_writeb(info, CyCAR, save_xir);
457 ivr = cyy_readb(info, CyRIVR) & CyIVRMask; 458 ivr = cyy_readb(info, CyRIVR) & CyIVRMask;
458 459
459 tty = tty_port_tty_get(&info->port);
460 /* if there is nowhere to put the data, discard it */
461 if (tty == NULL) {
462 if (ivr == CyIVRRxEx) { /* exception */
463 data = cyy_readb(info, CyRDSR);
464 } else { /* normal character reception */
465 char_count = cyy_readb(info, CyRDCR);
466 while (char_count--)
467 data = cyy_readb(info, CyRDSR);
468 }
469 goto end;
470 }
471 /* there is an open port for this data */ 460 /* there is an open port for this data */
472 if (ivr == CyIVRRxEx) { /* exception */ 461 if (ivr == CyIVRRxEx) { /* exception */
473 data = cyy_readb(info, CyRDSR); 462 data = cyy_readb(info, CyRDSR);
@@ -484,40 +473,45 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
484 473
485 if (data & info->ignore_status_mask) { 474 if (data & info->ignore_status_mask) {
486 info->icount.rx++; 475 info->icount.rx++;
487 tty_kref_put(tty);
488 return; 476 return;
489 } 477 }
490 if (tty_buffer_request_room(tty, 1)) { 478 if (tty_buffer_request_room(port, 1)) {
491 if (data & info->read_status_mask) { 479 if (data & info->read_status_mask) {
492 if (data & CyBREAK) { 480 if (data & CyBREAK) {
493 tty_insert_flip_char(tty, 481 tty_insert_flip_char(port,
494 cyy_readb(info, CyRDSR), 482 cyy_readb(info, CyRDSR),
495 TTY_BREAK); 483 TTY_BREAK);
496 info->icount.rx++; 484 info->icount.rx++;
497 if (info->port.flags & ASYNC_SAK) 485 if (port->flags & ASYNC_SAK) {
498 do_SAK(tty); 486 struct tty_struct *tty =
487 tty_port_tty_get(port);
488 if (tty) {
489 do_SAK(tty);
490 tty_kref_put(tty);
491 }
492 }
499 } else if (data & CyFRAME) { 493 } else if (data & CyFRAME) {
500 tty_insert_flip_char(tty, 494 tty_insert_flip_char(port,
501 cyy_readb(info, CyRDSR), 495 cyy_readb(info, CyRDSR),
502 TTY_FRAME); 496 TTY_FRAME);
503 info->icount.rx++; 497 info->icount.rx++;
504 info->idle_stats.frame_errs++; 498 info->idle_stats.frame_errs++;
505 } else if (data & CyPARITY) { 499 } else if (data & CyPARITY) {
506 /* Pieces of seven... */ 500 /* Pieces of seven... */
507 tty_insert_flip_char(tty, 501 tty_insert_flip_char(port,
508 cyy_readb(info, CyRDSR), 502 cyy_readb(info, CyRDSR),
509 TTY_PARITY); 503 TTY_PARITY);
510 info->icount.rx++; 504 info->icount.rx++;
511 info->idle_stats.parity_errs++; 505 info->idle_stats.parity_errs++;
512 } else if (data & CyOVERRUN) { 506 } else if (data & CyOVERRUN) {
513 tty_insert_flip_char(tty, 0, 507 tty_insert_flip_char(port, 0,
514 TTY_OVERRUN); 508 TTY_OVERRUN);
515 info->icount.rx++; 509 info->icount.rx++;
516 /* If the flip buffer itself is 510 /* If the flip buffer itself is
517 overflowing, we still lose 511 overflowing, we still lose
518 the next incoming character. 512 the next incoming character.
519 */ 513 */
520 tty_insert_flip_char(tty, 514 tty_insert_flip_char(port,
521 cyy_readb(info, CyRDSR), 515 cyy_readb(info, CyRDSR),
522 TTY_FRAME); 516 TTY_FRAME);
523 info->icount.rx++; 517 info->icount.rx++;
@@ -527,12 +521,12 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
527 /* } else if(data & CyTIMEOUT) { */ 521 /* } else if(data & CyTIMEOUT) { */
528 /* } else if(data & CySPECHAR) { */ 522 /* } else if(data & CySPECHAR) { */
529 } else { 523 } else {
530 tty_insert_flip_char(tty, 0, 524 tty_insert_flip_char(port, 0,
531 TTY_NORMAL); 525 TTY_NORMAL);
532 info->icount.rx++; 526 info->icount.rx++;
533 } 527 }
534 } else { 528 } else {
535 tty_insert_flip_char(tty, 0, TTY_NORMAL); 529 tty_insert_flip_char(port, 0, TTY_NORMAL);
536 info->icount.rx++; 530 info->icount.rx++;
537 } 531 }
538 } else { 532 } else {
@@ -552,10 +546,10 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
552 info->mon.char_max = char_count; 546 info->mon.char_max = char_count;
553 info->mon.char_last = char_count; 547 info->mon.char_last = char_count;
554#endif 548#endif
555 len = tty_buffer_request_room(tty, char_count); 549 len = tty_buffer_request_room(port, char_count);
556 while (len--) { 550 while (len--) {
557 data = cyy_readb(info, CyRDSR); 551 data = cyy_readb(info, CyRDSR);
558 tty_insert_flip_char(tty, data, TTY_NORMAL); 552 tty_insert_flip_char(port, data, TTY_NORMAL);
559 info->idle_stats.recv_bytes++; 553 info->idle_stats.recv_bytes++;
560 info->icount.rx++; 554 info->icount.rx++;
561#ifdef CY_16Y_HACK 555#ifdef CY_16Y_HACK
@@ -564,9 +558,8 @@ static void cyy_chip_rx(struct cyclades_card *cinfo, int chip,
564 } 558 }
565 info->idle_stats.recv_idle = jiffies; 559 info->idle_stats.recv_idle = jiffies;
566 } 560 }
567 tty_schedule_flip(tty); 561 tty_schedule_flip(port);
568 tty_kref_put(tty); 562
569end:
570 /* end of service */ 563 /* end of service */
571 cyy_writeb(info, CyRIR, save_xir & 0x3f); 564 cyy_writeb(info, CyRIR, save_xir & 0x3f);
572 cyy_writeb(info, CyCAR, save_car); 565 cyy_writeb(info, CyCAR, save_car);
@@ -924,10 +917,11 @@ cyz_issue_cmd(struct cyclades_card *cinfo,
924 return 0; 917 return 0;
925} /* cyz_issue_cmd */ 918} /* cyz_issue_cmd */
926 919
927static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty) 920static void cyz_handle_rx(struct cyclades_port *info)
928{ 921{
929 struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl; 922 struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
930 struct cyclades_card *cinfo = info->card; 923 struct cyclades_card *cinfo = info->card;
924 struct tty_port *port = &info->port;
931 unsigned int char_count; 925 unsigned int char_count;
932 int len; 926 int len;
933#ifdef BLOCKMOVE 927#ifdef BLOCKMOVE
@@ -946,80 +940,77 @@ static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty)
946 else 940 else
947 char_count = rx_put - rx_get + rx_bufsize; 941 char_count = rx_put - rx_get + rx_bufsize;
948 942
949 if (char_count) { 943 if (!char_count)
944 return;
945
950#ifdef CY_ENABLE_MONITORING 946#ifdef CY_ENABLE_MONITORING
951 info->mon.int_count++; 947 info->mon.int_count++;
952 info->mon.char_count += char_count; 948 info->mon.char_count += char_count;
953 if (char_count > info->mon.char_max) 949 if (char_count > info->mon.char_max)
954 info->mon.char_max = char_count; 950 info->mon.char_max = char_count;
955 info->mon.char_last = char_count; 951 info->mon.char_last = char_count;
956#endif 952#endif
957 if (tty == NULL) { 953
958 /* flush received characters */
959 new_rx_get = (new_rx_get + char_count) &
960 (rx_bufsize - 1);
961 info->rflush_count++;
962 } else {
963#ifdef BLOCKMOVE 954#ifdef BLOCKMOVE
964 /* we'd like to use memcpy(t, f, n) and memset(s, c, count) 955 /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
965 for performance, but because of buffer boundaries, there 956 for performance, but because of buffer boundaries, there
966 may be several steps to the operation */ 957 may be several steps to the operation */
967 while (1) { 958 while (1) {
968 len = tty_prepare_flip_string(tty, &buf, 959 len = tty_prepare_flip_string(port, &buf,
969 char_count); 960 char_count);
970 if (!len) 961 if (!len)
971 break; 962 break;
972 963
973 len = min_t(unsigned int, min(len, char_count), 964 len = min_t(unsigned int, min(len, char_count),
974 rx_bufsize - new_rx_get); 965 rx_bufsize - new_rx_get);
975 966
976 memcpy_fromio(buf, cinfo->base_addr + 967 memcpy_fromio(buf, cinfo->base_addr +
977 rx_bufaddr + new_rx_get, len); 968 rx_bufaddr + new_rx_get, len);
978 969
979 new_rx_get = (new_rx_get + len) & 970 new_rx_get = (new_rx_get + len) &
980 (rx_bufsize - 1); 971 (rx_bufsize - 1);
981 char_count -= len; 972 char_count -= len;
982 info->icount.rx += len; 973 info->icount.rx += len;
983 info->idle_stats.recv_bytes += len; 974 info->idle_stats.recv_bytes += len;
984 } 975 }
985#else 976#else
986 len = tty_buffer_request_room(tty, char_count); 977 len = tty_buffer_request_room(port, char_count);
987 while (len--) { 978 while (len--) {
988 data = readb(cinfo->base_addr + rx_bufaddr + 979 data = readb(cinfo->base_addr + rx_bufaddr +
989 new_rx_get); 980 new_rx_get);
990 new_rx_get = (new_rx_get + 1) & 981 new_rx_get = (new_rx_get + 1) &
991 (rx_bufsize - 1); 982 (rx_bufsize - 1);
992 tty_insert_flip_char(tty, data, TTY_NORMAL); 983 tty_insert_flip_char(port, data, TTY_NORMAL);
993 info->idle_stats.recv_bytes++; 984 info->idle_stats.recv_bytes++;
994 info->icount.rx++; 985 info->icount.rx++;
995 } 986 }
996#endif 987#endif
997#ifdef CONFIG_CYZ_INTR 988#ifdef CONFIG_CYZ_INTR
998 /* Recalculate the number of chars in the RX buffer and issue 989 /* Recalculate the number of chars in the RX buffer and issue
999 a cmd in case it's higher than the RX high water mark */ 990 a cmd in case it's higher than the RX high water mark */
1000 rx_put = readl(&buf_ctrl->rx_put); 991 rx_put = readl(&buf_ctrl->rx_put);
1001 if (rx_put >= rx_get) 992 if (rx_put >= rx_get)
1002 char_count = rx_put - rx_get; 993 char_count = rx_put - rx_get;
1003 else 994 else
1004 char_count = rx_put - rx_get + rx_bufsize; 995 char_count = rx_put - rx_get + rx_bufsize;
1005 if (char_count >= readl(&buf_ctrl->rx_threshold) && 996 if (char_count >= readl(&buf_ctrl->rx_threshold) &&
1006 !timer_pending(&cyz_rx_full_timer[ 997 !timer_pending(&cyz_rx_full_timer[
1007 info->line])) 998 info->line]))
1008 mod_timer(&cyz_rx_full_timer[info->line], 999 mod_timer(&cyz_rx_full_timer[info->line],
1009 jiffies + 1); 1000 jiffies + 1);
1010#endif 1001#endif
1011 info->idle_stats.recv_idle = jiffies; 1002 info->idle_stats.recv_idle = jiffies;
1012 tty_schedule_flip(tty); 1003 tty_schedule_flip(&info->port);
1013 } 1004
1014 /* Update rx_get */ 1005 /* Update rx_get */
1015 cy_writel(&buf_ctrl->rx_get, new_rx_get); 1006 cy_writel(&buf_ctrl->rx_get, new_rx_get);
1016 }
1017} 1007}
1018 1008
1019static void cyz_handle_tx(struct cyclades_port *info, struct tty_struct *tty) 1009static void cyz_handle_tx(struct cyclades_port *info)
1020{ 1010{
1021 struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl; 1011 struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
1022 struct cyclades_card *cinfo = info->card; 1012 struct cyclades_card *cinfo = info->card;
1013 struct tty_struct *tty;
1023 u8 data; 1014 u8 data;
1024 unsigned int char_count; 1015 unsigned int char_count;
1025#ifdef BLOCKMOVE 1016#ifdef BLOCKMOVE
@@ -1039,63 +1030,63 @@ static void cyz_handle_tx(struct cyclades_port *info, struct tty_struct *tty)
1039 else 1030 else
1040 char_count = tx_get - tx_put - 1; 1031 char_count = tx_get - tx_put - 1;
1041 1032
1042 if (char_count) { 1033 if (!char_count)
1043 1034 return;
1044 if (tty == NULL) 1035
1045 goto ztxdone; 1036 tty = tty_port_tty_get(&info->port);
1037 if (tty == NULL)
1038 goto ztxdone;
1046 1039
1047 if (info->x_char) { /* send special char */ 1040 if (info->x_char) { /* send special char */
1048 data = info->x_char; 1041 data = info->x_char;
1049 1042
1050 cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data); 1043 cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1051 tx_put = (tx_put + 1) & (tx_bufsize - 1); 1044 tx_put = (tx_put + 1) & (tx_bufsize - 1);
1052 info->x_char = 0; 1045 info->x_char = 0;
1053 char_count--; 1046 char_count--;
1054 info->icount.tx++; 1047 info->icount.tx++;
1055 } 1048 }
1056#ifdef BLOCKMOVE 1049#ifdef BLOCKMOVE
1057 while (0 < (small_count = min_t(unsigned int, 1050 while (0 < (small_count = min_t(unsigned int,
1058 tx_bufsize - tx_put, min_t(unsigned int, 1051 tx_bufsize - tx_put, min_t(unsigned int,
1059 (SERIAL_XMIT_SIZE - info->xmit_tail), 1052 (SERIAL_XMIT_SIZE - info->xmit_tail),
1060 min_t(unsigned int, info->xmit_cnt, 1053 min_t(unsigned int, info->xmit_cnt,
1061 char_count))))) { 1054 char_count))))) {
1062 1055
1063 memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr + 1056 memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr + tx_put),
1064 tx_put), 1057 &info->port.xmit_buf[info->xmit_tail],
1065 &info->port.xmit_buf[info->xmit_tail], 1058 small_count);
1066 small_count); 1059
1067 1060 tx_put = (tx_put + small_count) & (tx_bufsize - 1);
1068 tx_put = (tx_put + small_count) & (tx_bufsize - 1); 1061 char_count -= small_count;
1069 char_count -= small_count; 1062 info->icount.tx += small_count;
1070 info->icount.tx += small_count; 1063 info->xmit_cnt -= small_count;
1071 info->xmit_cnt -= small_count; 1064 info->xmit_tail = (info->xmit_tail + small_count) &
1072 info->xmit_tail = (info->xmit_tail + small_count) & 1065 (SERIAL_XMIT_SIZE - 1);
1073 (SERIAL_XMIT_SIZE - 1); 1066 }
1074 }
1075#else 1067#else
1076 while (info->xmit_cnt && char_count) { 1068 while (info->xmit_cnt && char_count) {
1077 data = info->port.xmit_buf[info->xmit_tail]; 1069 data = info->port.xmit_buf[info->xmit_tail];
1078 info->xmit_cnt--; 1070 info->xmit_cnt--;
1079 info->xmit_tail = (info->xmit_tail + 1) & 1071 info->xmit_tail = (info->xmit_tail + 1) &
1080 (SERIAL_XMIT_SIZE - 1); 1072 (SERIAL_XMIT_SIZE - 1);
1081 1073
1082 cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data); 1074 cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1083 tx_put = (tx_put + 1) & (tx_bufsize - 1); 1075 tx_put = (tx_put + 1) & (tx_bufsize - 1);
1084 char_count--; 1076 char_count--;
1085 info->icount.tx++; 1077 info->icount.tx++;
1086 } 1078 }
1087#endif 1079#endif
1088 tty_wakeup(tty); 1080 tty_wakeup(tty);
1081 tty_kref_put(tty);
1089ztxdone: 1082ztxdone:
1090 /* Update tx_put */ 1083 /* Update tx_put */
1091 cy_writel(&buf_ctrl->tx_put, tx_put); 1084 cy_writel(&buf_ctrl->tx_put, tx_put);
1092 }
1093} 1085}
1094 1086
1095static void cyz_handle_cmd(struct cyclades_card *cinfo) 1087static void cyz_handle_cmd(struct cyclades_card *cinfo)
1096{ 1088{
1097 struct BOARD_CTRL __iomem *board_ctrl = cinfo->board_ctrl; 1089 struct BOARD_CTRL __iomem *board_ctrl = cinfo->board_ctrl;
1098 struct tty_struct *tty;
1099 struct cyclades_port *info; 1090 struct cyclades_port *info;
1100 __u32 channel, param, fw_ver; 1091 __u32 channel, param, fw_ver;
1101 __u8 cmd; 1092 __u8 cmd;
@@ -1108,23 +1099,20 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
1108 special_count = 0; 1099 special_count = 0;
1109 delta_count = 0; 1100 delta_count = 0;
1110 info = &cinfo->ports[channel]; 1101 info = &cinfo->ports[channel];
1111 tty = tty_port_tty_get(&info->port);
1112 if (tty == NULL)
1113 continue;
1114 1102
1115 switch (cmd) { 1103 switch (cmd) {
1116 case C_CM_PR_ERROR: 1104 case C_CM_PR_ERROR:
1117 tty_insert_flip_char(tty, 0, TTY_PARITY); 1105 tty_insert_flip_char(&info->port, 0, TTY_PARITY);
1118 info->icount.rx++; 1106 info->icount.rx++;
1119 special_count++; 1107 special_count++;
1120 break; 1108 break;
1121 case C_CM_FR_ERROR: 1109 case C_CM_FR_ERROR:
1122 tty_insert_flip_char(tty, 0, TTY_FRAME); 1110 tty_insert_flip_char(&info->port, 0, TTY_FRAME);
1123 info->icount.rx++; 1111 info->icount.rx++;
1124 special_count++; 1112 special_count++;
1125 break; 1113 break;
1126 case C_CM_RXBRK: 1114 case C_CM_RXBRK:
1127 tty_insert_flip_char(tty, 0, TTY_BREAK); 1115 tty_insert_flip_char(&info->port, 0, TTY_BREAK);
1128 info->icount.rx++; 1116 info->icount.rx++;
1129 special_count++; 1117 special_count++;
1130 break; 1118 break;
@@ -1136,8 +1124,14 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
1136 readl(&info->u.cyz.ch_ctrl->rs_status); 1124 readl(&info->u.cyz.ch_ctrl->rs_status);
1137 if (dcd & C_RS_DCD) 1125 if (dcd & C_RS_DCD)
1138 wake_up_interruptible(&info->port.open_wait); 1126 wake_up_interruptible(&info->port.open_wait);
1139 else 1127 else {
1140 tty_hangup(tty); 1128 struct tty_struct *tty;
1129 tty = tty_port_tty_get(&info->port);
1130 if (tty) {
1131 tty_hangup(tty);
1132 tty_kref_put(tty);
1133 }
1134 }
1141 } 1135 }
1142 break; 1136 break;
1143 case C_CM_MCTS: 1137 case C_CM_MCTS:
@@ -1166,7 +1160,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
1166 printk(KERN_DEBUG "cyz_interrupt: rcvd intr, card %d, " 1160 printk(KERN_DEBUG "cyz_interrupt: rcvd intr, card %d, "
1167 "port %ld\n", info->card, channel); 1161 "port %ld\n", info->card, channel);
1168#endif 1162#endif
1169 cyz_handle_rx(info, tty); 1163 cyz_handle_rx(info);
1170 break; 1164 break;
1171 case C_CM_TXBEMPTY: 1165 case C_CM_TXBEMPTY:
1172 case C_CM_TXLOWWM: 1166 case C_CM_TXLOWWM:
@@ -1176,7 +1170,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
1176 printk(KERN_DEBUG "cyz_interrupt: xmit intr, card %d, " 1170 printk(KERN_DEBUG "cyz_interrupt: xmit intr, card %d, "
1177 "port %ld\n", info->card, channel); 1171 "port %ld\n", info->card, channel);
1178#endif 1172#endif
1179 cyz_handle_tx(info, tty); 1173 cyz_handle_tx(info);
1180 break; 1174 break;
1181#endif /* CONFIG_CYZ_INTR */ 1175#endif /* CONFIG_CYZ_INTR */
1182 case C_CM_FATAL: 1176 case C_CM_FATAL:
@@ -1188,8 +1182,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
1188 if (delta_count) 1182 if (delta_count)
1189 wake_up_interruptible(&info->port.delta_msr_wait); 1183 wake_up_interruptible(&info->port.delta_msr_wait);
1190 if (special_count) 1184 if (special_count)
1191 tty_schedule_flip(tty); 1185 tty_schedule_flip(&info->port);
1192 tty_kref_put(tty);
1193 } 1186 }
1194} 1187}
1195 1188
@@ -1255,17 +1248,11 @@ static void cyz_poll(unsigned long arg)
1255 cyz_handle_cmd(cinfo); 1248 cyz_handle_cmd(cinfo);
1256 1249
1257 for (port = 0; port < cinfo->nports; port++) { 1250 for (port = 0; port < cinfo->nports; port++) {
1258 struct tty_struct *tty;
1259
1260 info = &cinfo->ports[port]; 1251 info = &cinfo->ports[port];
1261 tty = tty_port_tty_get(&info->port);
1262 /* OK to pass NULL to the handle functions below.
1263 They need to drop the data in that case. */
1264 1252
1265 if (!info->throttle) 1253 if (!info->throttle)
1266 cyz_handle_rx(info, tty); 1254 cyz_handle_rx(info);
1267 cyz_handle_tx(info, tty); 1255 cyz_handle_tx(info);
1268 tty_kref_put(tty);
1269 } 1256 }
1270 /* poll every 'cyz_polling_cycle' period */ 1257 /* poll every 'cyz_polling_cycle' period */
1271 expires = jiffies + cyz_polling_cycle; 1258 expires = jiffies + cyz_polling_cycle;
diff --git a/drivers/tty/ehv_bytechan.c b/drivers/tty/ehv_bytechan.c
index c117d775a22f..ed92622b8949 100644
--- a/drivers/tty/ehv_bytechan.c
+++ b/drivers/tty/ehv_bytechan.c
@@ -371,22 +371,17 @@ console_initcall(ehv_bc_console_init);
371static irqreturn_t ehv_bc_tty_rx_isr(int irq, void *data) 371static irqreturn_t ehv_bc_tty_rx_isr(int irq, void *data)
372{ 372{
373 struct ehv_bc_data *bc = data; 373 struct ehv_bc_data *bc = data;
374 struct tty_struct *ttys = tty_port_tty_get(&bc->port);
375 unsigned int rx_count, tx_count, len; 374 unsigned int rx_count, tx_count, len;
376 int count; 375 int count;
377 char buffer[EV_BYTE_CHANNEL_MAX_BYTES]; 376 char buffer[EV_BYTE_CHANNEL_MAX_BYTES];
378 int ret; 377 int ret;
379 378
380 /* ttys could be NULL during a hangup */
381 if (!ttys)
382 return IRQ_HANDLED;
383
384 /* Find out how much data needs to be read, and then ask the TTY layer 379 /* Find out how much data needs to be read, and then ask the TTY layer
385 * if it can handle that much. We want to ensure that every byte we 380 * if it can handle that much. We want to ensure that every byte we
386 * read from the byte channel will be accepted by the TTY layer. 381 * read from the byte channel will be accepted by the TTY layer.
387 */ 382 */
388 ev_byte_channel_poll(bc->handle, &rx_count, &tx_count); 383 ev_byte_channel_poll(bc->handle, &rx_count, &tx_count);
389 count = tty_buffer_request_room(ttys, rx_count); 384 count = tty_buffer_request_room(&bc->port, rx_count);
390 385
391 /* 'count' is the maximum amount of data the TTY layer can accept at 386 /* 'count' is the maximum amount of data the TTY layer can accept at
392 * this time. However, during testing, I was never able to get 'count' 387 * this time. However, during testing, I was never able to get 'count'
@@ -407,7 +402,7 @@ static irqreturn_t ehv_bc_tty_rx_isr(int irq, void *data)
407 */ 402 */
408 403
409 /* Pass the received data to the tty layer. */ 404 /* Pass the received data to the tty layer. */
410 ret = tty_insert_flip_string(ttys, buffer, len); 405 ret = tty_insert_flip_string(&bc->port, buffer, len);
411 406
412 /* 'ret' is the number of bytes that the TTY layer accepted. 407 /* 'ret' is the number of bytes that the TTY layer accepted.
413 * If it's not equal to 'len', then it means the buffer is 408 * If it's not equal to 'len', then it means the buffer is
@@ -422,9 +417,7 @@ static irqreturn_t ehv_bc_tty_rx_isr(int irq, void *data)
422 } 417 }
423 418
424 /* Tell the tty layer that we're done. */ 419 /* Tell the tty layer that we're done. */
425 tty_flip_buffer_push(ttys); 420 tty_flip_buffer_push(&bc->port);
426
427 tty_kref_put(ttys);
428 421
429 return IRQ_HANDLED; 422 return IRQ_HANDLED;
430} 423}
diff --git a/drivers/tty/goldfish.c b/drivers/tty/goldfish.c
new file mode 100644
index 000000000000..f17d2e4ee2ca
--- /dev/null
+++ b/drivers/tty/goldfish.c
@@ -0,0 +1,328 @@
1/*
2 * Copyright (C) 2007 Google, Inc.
3 * Copyright (C) 2012 Intel, Inc.
4 *
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 */
15
16#include <linux/console.h>
17#include <linux/init.h>
18#include <linux/interrupt.h>
19#include <linux/platform_device.h>
20#include <linux/tty.h>
21#include <linux/tty_flip.h>
22#include <linux/slab.h>
23#include <linux/io.h>
24#include <linux/module.h>
25
26enum {
27 GOLDFISH_TTY_PUT_CHAR = 0x00,
28 GOLDFISH_TTY_BYTES_READY = 0x04,
29 GOLDFISH_TTY_CMD = 0x08,
30
31 GOLDFISH_TTY_DATA_PTR = 0x10,
32 GOLDFISH_TTY_DATA_LEN = 0x14,
33
34 GOLDFISH_TTY_CMD_INT_DISABLE = 0,
35 GOLDFISH_TTY_CMD_INT_ENABLE = 1,
36 GOLDFISH_TTY_CMD_WRITE_BUFFER = 2,
37 GOLDFISH_TTY_CMD_READ_BUFFER = 3,
38};
39
40struct goldfish_tty {
41 struct tty_port port;
42 spinlock_t lock;
43 void __iomem *base;
44 u32 irq;
45 int opencount;
46 struct console console;
47};
48
49static DEFINE_MUTEX(goldfish_tty_lock);
50static struct tty_driver *goldfish_tty_driver;
51static u32 goldfish_tty_line_count = 8;
52static u32 goldfish_tty_current_line_count;
53static struct goldfish_tty *goldfish_ttys;
54
55static void goldfish_tty_do_write(int line, const char *buf, unsigned count)
56{
57 unsigned long irq_flags;
58 struct goldfish_tty *qtty = &goldfish_ttys[line];
59 void __iomem *base = qtty->base;
60 spin_lock_irqsave(&qtty->lock, irq_flags);
61 writel((u32)buf, base + GOLDFISH_TTY_DATA_PTR);
62 writel(count, base + GOLDFISH_TTY_DATA_LEN);
63 writel(GOLDFISH_TTY_CMD_WRITE_BUFFER, base + GOLDFISH_TTY_CMD);
64 spin_unlock_irqrestore(&qtty->lock, irq_flags);
65}
66
67static irqreturn_t goldfish_tty_interrupt(int irq, void *dev_id)
68{
69 struct platform_device *pdev = dev_id;
70 struct goldfish_tty *qtty = &goldfish_ttys[pdev->id];
71 void __iomem *base = qtty->base;
72 unsigned long irq_flags;
73 unsigned char *buf;
74 u32 count;
75
76 count = readl(base + GOLDFISH_TTY_BYTES_READY);
77 if(count == 0)
78 return IRQ_NONE;
79
80 count = tty_prepare_flip_string(&qtty->port, &buf, count);
81 spin_lock_irqsave(&qtty->lock, irq_flags);
82 writel((u32)buf, base + GOLDFISH_TTY_DATA_PTR);
83 writel(count, base + GOLDFISH_TTY_DATA_LEN);
84 writel(GOLDFISH_TTY_CMD_READ_BUFFER, base + GOLDFISH_TTY_CMD);
85 spin_unlock_irqrestore(&qtty->lock, irq_flags);
86 tty_schedule_flip(&qtty->port);
87 return IRQ_HANDLED;
88}
89
90static int goldfish_tty_activate(struct tty_port *port, struct tty_struct *tty)
91{
92 struct goldfish_tty *qtty = container_of(port, struct goldfish_tty, port);
93 writel(GOLDFISH_TTY_CMD_INT_ENABLE, qtty->base + GOLDFISH_TTY_CMD);
94 return 0;
95}
96
97static void goldfish_tty_shutdown(struct tty_port *port)
98{
99 struct goldfish_tty *qtty = container_of(port, struct goldfish_tty, port);
100 writel(GOLDFISH_TTY_CMD_INT_DISABLE, qtty->base + GOLDFISH_TTY_CMD);
101}
102
103static int goldfish_tty_open(struct tty_struct * tty, struct file * filp)
104{
105 struct goldfish_tty *qtty = &goldfish_ttys[tty->index];
106 return tty_port_open(&qtty->port, tty, filp);
107}
108
109static void goldfish_tty_close(struct tty_struct * tty, struct file * filp)
110{
111 tty_port_close(tty->port, tty, filp);
112}
113
114static void goldfish_tty_hangup(struct tty_struct *tty)
115{
116 tty_port_hangup(tty->port);
117}
118
119static int goldfish_tty_write(struct tty_struct * tty, const unsigned char *buf, int count)
120{
121 goldfish_tty_do_write(tty->index, buf, count);
122 return count;
123}
124
125static int goldfish_tty_write_room(struct tty_struct *tty)
126{
127 return 0x10000;
128}
129
130static int goldfish_tty_chars_in_buffer(struct tty_struct *tty)
131{
132 struct goldfish_tty *qtty = &goldfish_ttys[tty->index];
133 void __iomem *base = qtty->base;
134 return readl(base + GOLDFISH_TTY_BYTES_READY);
135}
136
137static void goldfish_tty_console_write(struct console *co, const char *b, unsigned count)
138{
139 goldfish_tty_do_write(co->index, b, count);
140}
141
142static struct tty_driver *goldfish_tty_console_device(struct console *c, int *index)
143{
144 *index = c->index;
145 return goldfish_tty_driver;
146}
147
148static int goldfish_tty_console_setup(struct console *co, char *options)
149{
150 if((unsigned)co->index > goldfish_tty_line_count)
151 return -ENODEV;
152 if(goldfish_ttys[co->index].base == 0)
153 return -ENODEV;
154 return 0;
155}
156
157static struct tty_port_operations goldfish_port_ops = {
158 .activate = goldfish_tty_activate,
159 .shutdown = goldfish_tty_shutdown
160};
161
162static struct tty_operations goldfish_tty_ops = {
163 .open = goldfish_tty_open,
164 .close = goldfish_tty_close,
165 .hangup = goldfish_tty_hangup,
166 .write = goldfish_tty_write,
167 .write_room = goldfish_tty_write_room,
168 .chars_in_buffer = goldfish_tty_chars_in_buffer,
169};
170
171static int goldfish_tty_create_driver(void)
172{
173 int ret;
174 struct tty_driver *tty;
175
176 goldfish_ttys = kzalloc(sizeof(*goldfish_ttys) * goldfish_tty_line_count, GFP_KERNEL);
177 if(goldfish_ttys == NULL) {
178 ret = -ENOMEM;
179 goto err_alloc_goldfish_ttys_failed;
180 }
181 tty = alloc_tty_driver(goldfish_tty_line_count);
182 if(tty == NULL) {
183 ret = -ENOMEM;
184 goto err_alloc_tty_driver_failed;
185 }
186 tty->driver_name = "goldfish";
187 tty->name = "ttyGF";
188 tty->type = TTY_DRIVER_TYPE_SERIAL;
189 tty->subtype = SERIAL_TYPE_NORMAL;
190 tty->init_termios = tty_std_termios;
191 tty->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
192 tty_set_operations(tty, &goldfish_tty_ops);
193 ret = tty_register_driver(tty);
194 if(ret)
195 goto err_tty_register_driver_failed;
196
197 goldfish_tty_driver = tty;
198 return 0;
199
200err_tty_register_driver_failed:
201 put_tty_driver(tty);
202err_alloc_tty_driver_failed:
203 kfree(goldfish_ttys);
204 goldfish_ttys = NULL;
205err_alloc_goldfish_ttys_failed:
206 return ret;
207}
208
209static void goldfish_tty_delete_driver(void)
210{
211 tty_unregister_driver(goldfish_tty_driver);
212 put_tty_driver(goldfish_tty_driver);
213 goldfish_tty_driver = NULL;
214 kfree(goldfish_ttys);
215 goldfish_ttys = NULL;
216}
217
218static int goldfish_tty_probe(struct platform_device *pdev)
219{
220 struct goldfish_tty *qtty;
221 int ret = -EINVAL;
222 int i;
223 struct resource *r;
224 struct device *ttydev;
225 void __iomem *base;
226 u32 irq;
227
228 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
229 if(r == NULL)
230 return -EINVAL;
231
232 base = ioremap(r->start, 0x1000);
233 if (base == NULL)
234 pr_err("goldfish_tty: unable to remap base\n");
235
236 r = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
237 if(r == NULL)
238 goto err_unmap;
239
240 irq = r->start;
241
242 if(pdev->id >= goldfish_tty_line_count)
243 goto err_unmap;
244
245 mutex_lock(&goldfish_tty_lock);
246 if(goldfish_tty_current_line_count == 0) {
247 ret = goldfish_tty_create_driver();
248 if(ret)
249 goto err_create_driver_failed;
250 }
251 goldfish_tty_current_line_count++;
252
253 qtty = &goldfish_ttys[pdev->id];
254 spin_lock_init(&qtty->lock);
255 tty_port_init(&qtty->port);
256 qtty->port.ops = &goldfish_port_ops;
257 qtty->base = base;
258 qtty->irq = irq;
259
260 writel(GOLDFISH_TTY_CMD_INT_DISABLE, base + GOLDFISH_TTY_CMD);
261
262 ret = request_irq(irq, goldfish_tty_interrupt, IRQF_SHARED, "goldfish_tty", pdev);
263 if(ret)
264 goto err_request_irq_failed;
265
266
267 ttydev = tty_port_register_device(&qtty->port, goldfish_tty_driver,
268 pdev->id, &pdev->dev);
269 if(IS_ERR(ttydev)) {
270 ret = PTR_ERR(ttydev);
271 goto err_tty_register_device_failed;
272 }
273
274 strcpy(qtty->console.name, "ttyGF");
275 qtty->console.write = goldfish_tty_console_write;
276 qtty->console.device = goldfish_tty_console_device;
277 qtty->console.setup = goldfish_tty_console_setup;
278 qtty->console.flags = CON_PRINTBUFFER;
279 qtty->console.index = pdev->id;
280 register_console(&qtty->console);
281
282 mutex_unlock(&goldfish_tty_lock);
283 return 0;
284
285 tty_unregister_device(goldfish_tty_driver, i);
286err_tty_register_device_failed:
287 free_irq(irq, pdev);
288err_request_irq_failed:
289 goldfish_tty_current_line_count--;
290 if(goldfish_tty_current_line_count == 0)
291 goldfish_tty_delete_driver();
292err_create_driver_failed:
293 mutex_unlock(&goldfish_tty_lock);
294err_unmap:
295 iounmap(base);
296 return ret;
297}
298
299static int goldfish_tty_remove(struct platform_device *pdev)
300{
301 struct goldfish_tty *qtty;
302
303 mutex_lock(&goldfish_tty_lock);
304
305 qtty = &goldfish_ttys[pdev->id];
306 unregister_console(&qtty->console);
307 tty_unregister_device(goldfish_tty_driver, pdev->id);
308 iounmap(qtty->base);
309 qtty->base = 0;
310 free_irq(qtty->irq, pdev);
311 goldfish_tty_current_line_count--;
312 if(goldfish_tty_current_line_count == 0)
313 goldfish_tty_delete_driver();
314 mutex_unlock(&goldfish_tty_lock);
315 return 0;
316}
317
318static struct platform_driver goldfish_tty_platform_driver = {
319 .probe = goldfish_tty_probe,
320 .remove = goldfish_tty_remove,
321 .driver = {
322 .name = "goldfish_tty"
323 }
324};
325
326module_platform_driver(goldfish_tty_platform_driver);
327
328MODULE_LICENSE("GPL v2");
diff --git a/drivers/tty/hvc/Kconfig b/drivers/tty/hvc/Kconfig
index f47b734c6a7a..8902f9b4df71 100644
--- a/drivers/tty/hvc/Kconfig
+++ b/drivers/tty/hvc/Kconfig
@@ -1,3 +1,5 @@
1if TTY
2
1config HVC_DRIVER 3config HVC_DRIVER
2 bool 4 bool
3 help 5 help
@@ -119,3 +121,4 @@ config HVCS
119 which will also be compiled when this driver is built as a 121 which will also be compiled when this driver is built as a
120 module. 122 module.
121 123
124endif # TTY
diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 13ee53bd0bf6..eb255e807c06 100644
--- a/drivers/tty/hvc/hvc_console.c
+++ b/drivers/tty/hvc/hvc_console.c
@@ -629,7 +629,7 @@ int hvc_poll(struct hvc_struct *hp)
629 629
630 /* Read data if any */ 630 /* Read data if any */
631 for (;;) { 631 for (;;) {
632 int count = tty_buffer_request_room(tty, N_INBUF); 632 int count = tty_buffer_request_room(&hp->port, N_INBUF);
633 633
634 /* If flip is full, just reschedule a later read */ 634 /* If flip is full, just reschedule a later read */
635 if (count == 0) { 635 if (count == 0) {
@@ -672,7 +672,7 @@ int hvc_poll(struct hvc_struct *hp)
672 } 672 }
673 } 673 }
674#endif /* CONFIG_MAGIC_SYSRQ */ 674#endif /* CONFIG_MAGIC_SYSRQ */
675 tty_insert_flip_char(tty, buf[i], 0); 675 tty_insert_flip_char(&hp->port, buf[i], 0);
676 } 676 }
677 677
678 read_total += n; 678 read_total += n;
@@ -691,7 +691,7 @@ int hvc_poll(struct hvc_struct *hp)
691 a minimum for performance. */ 691 a minimum for performance. */
692 timeout = MIN_TIMEOUT; 692 timeout = MIN_TIMEOUT;
693 693
694 tty_flip_buffer_push(tty); 694 tty_flip_buffer_push(&hp->port);
695 } 695 }
696 tty_kref_put(tty); 696 tty_kref_put(tty);
697 697
diff --git a/drivers/tty/hvc/hvcs.c b/drivers/tty/hvc/hvcs.c
index 877635733952..1956593ee89d 100644
--- a/drivers/tty/hvc/hvcs.c
+++ b/drivers/tty/hvc/hvcs.c
@@ -609,11 +609,11 @@ static int hvcs_io(struct hvcs_struct *hvcsd)
609 /* remove the read masks */ 609 /* remove the read masks */
610 hvcsd->todo_mask &= ~(HVCS_READ_MASK); 610 hvcsd->todo_mask &= ~(HVCS_READ_MASK);
611 611
612 if (tty_buffer_request_room(tty, HVCS_BUFF_LEN) >= HVCS_BUFF_LEN) { 612 if (tty_buffer_request_room(&hvcsd->port, HVCS_BUFF_LEN) >= HVCS_BUFF_LEN) {
613 got = hvc_get_chars(unit_address, 613 got = hvc_get_chars(unit_address,
614 &buf[0], 614 &buf[0],
615 HVCS_BUFF_LEN); 615 HVCS_BUFF_LEN);
616 tty_insert_flip_string(tty, buf, got); 616 tty_insert_flip_string(&hvcsd->port, buf, got);
617 } 617 }
618 618
619 /* Give the TTY time to process the data we just sent. */ 619 /* Give the TTY time to process the data we just sent. */
@@ -623,7 +623,7 @@ static int hvcs_io(struct hvcs_struct *hvcsd)
623 spin_unlock_irqrestore(&hvcsd->lock, flags); 623 spin_unlock_irqrestore(&hvcsd->lock, flags);
624 /* This is synch because tty->low_latency == 1 */ 624 /* This is synch because tty->low_latency == 1 */
625 if(got) 625 if(got)
626 tty_flip_buffer_push(tty); 626 tty_flip_buffer_push(&hvcsd->port);
627 627
628 if (!got) { 628 if (!got) {
629 /* Do this _after_ the flip_buffer_push */ 629 /* Do this _after_ the flip_buffer_push */
diff --git a/drivers/tty/hvc/hvsi.c b/drivers/tty/hvc/hvsi.c
index 68357a6e4de9..ef95a154854a 100644
--- a/drivers/tty/hvc/hvsi.c
+++ b/drivers/tty/hvc/hvsi.c
@@ -329,8 +329,7 @@ static void hvsi_recv_query(struct hvsi_struct *hp, uint8_t *packet)
329 } 329 }
330} 330}
331 331
332static void hvsi_insert_chars(struct hvsi_struct *hp, struct tty_struct *tty, 332static void hvsi_insert_chars(struct hvsi_struct *hp, const char *buf, int len)
333 const char *buf, int len)
334{ 333{
335 int i; 334 int i;
336 335
@@ -346,7 +345,7 @@ static void hvsi_insert_chars(struct hvsi_struct *hp, struct tty_struct *tty,
346 continue; 345 continue;
347 } 346 }
348#endif /* CONFIG_MAGIC_SYSRQ */ 347#endif /* CONFIG_MAGIC_SYSRQ */
349 tty_insert_flip_char(tty, c, 0); 348 tty_insert_flip_char(&hp->port, c, 0);
350 } 349 }
351} 350}
352 351
@@ -359,8 +358,7 @@ static void hvsi_insert_chars(struct hvsi_struct *hp, struct tty_struct *tty,
359 * revisited. 358 * revisited.
360 */ 359 */
361#define TTY_THRESHOLD_THROTTLE 128 360#define TTY_THRESHOLD_THROTTLE 128
362static bool hvsi_recv_data(struct hvsi_struct *hp, struct tty_struct *tty, 361static bool hvsi_recv_data(struct hvsi_struct *hp, const uint8_t *packet)
363 const uint8_t *packet)
364{ 362{
365 const struct hvsi_header *header = (const struct hvsi_header *)packet; 363 const struct hvsi_header *header = (const struct hvsi_header *)packet;
366 const uint8_t *data = packet + sizeof(struct hvsi_header); 364 const uint8_t *data = packet + sizeof(struct hvsi_header);
@@ -377,7 +375,7 @@ static bool hvsi_recv_data(struct hvsi_struct *hp, struct tty_struct *tty,
377 datalen = TTY_THRESHOLD_THROTTLE; 375 datalen = TTY_THRESHOLD_THROTTLE;
378 } 376 }
379 377
380 hvsi_insert_chars(hp, tty, data, datalen); 378 hvsi_insert_chars(hp, data, datalen);
381 379
382 if (overflow > 0) { 380 if (overflow > 0) {
383 /* 381 /*
@@ -438,9 +436,7 @@ static int hvsi_load_chunk(struct hvsi_struct *hp, struct tty_struct *tty,
438 case VS_DATA_PACKET_HEADER: 436 case VS_DATA_PACKET_HEADER:
439 if (!is_open(hp)) 437 if (!is_open(hp))
440 break; 438 break;
441 if (tty == NULL) 439 flip = hvsi_recv_data(hp, packet);
442 break; /* no tty buffer to put data in */
443 flip = hvsi_recv_data(hp, tty, packet);
444 break; 440 break;
445 case VS_CONTROL_PACKET_HEADER: 441 case VS_CONTROL_PACKET_HEADER:
446 hvsi_recv_control(hp, packet, tty, handshake); 442 hvsi_recv_control(hp, packet, tty, handshake);
@@ -469,17 +465,17 @@ static int hvsi_load_chunk(struct hvsi_struct *hp, struct tty_struct *tty,
469 compact_inbuf(hp, packet); 465 compact_inbuf(hp, packet);
470 466
471 if (flip) 467 if (flip)
472 tty_flip_buffer_push(tty); 468 tty_flip_buffer_push(&hp->port);
473 469
474 return 1; 470 return 1;
475} 471}
476 472
477static void hvsi_send_overflow(struct hvsi_struct *hp, struct tty_struct *tty) 473static void hvsi_send_overflow(struct hvsi_struct *hp)
478{ 474{
479 pr_debug("%s: delivering %i bytes overflow\n", __func__, 475 pr_debug("%s: delivering %i bytes overflow\n", __func__,
480 hp->n_throttle); 476 hp->n_throttle);
481 477
482 hvsi_insert_chars(hp, tty, hp->throttle_buf, hp->n_throttle); 478 hvsi_insert_chars(hp, hp->throttle_buf, hp->n_throttle);
483 hp->n_throttle = 0; 479 hp->n_throttle = 0;
484} 480}
485 481
@@ -514,8 +510,8 @@ static irqreturn_t hvsi_interrupt(int irq, void *arg)
514 if (tty && hp->n_throttle && !test_bit(TTY_THROTTLED, &tty->flags)) { 510 if (tty && hp->n_throttle && !test_bit(TTY_THROTTLED, &tty->flags)) {
515 /* we weren't hung up and we weren't throttled, so we can 511 /* we weren't hung up and we weren't throttled, so we can
516 * deliver the rest now */ 512 * deliver the rest now */
517 hvsi_send_overflow(hp, tty); 513 hvsi_send_overflow(hp);
518 tty_flip_buffer_push(tty); 514 tty_flip_buffer_push(&hp->port);
519 } 515 }
520 spin_unlock_irqrestore(&hp->lock, flags); 516 spin_unlock_irqrestore(&hp->lock, flags);
521 517
@@ -1001,8 +997,8 @@ static void hvsi_unthrottle(struct tty_struct *tty)
1001 997
1002 spin_lock_irqsave(&hp->lock, flags); 998 spin_lock_irqsave(&hp->lock, flags);
1003 if (hp->n_throttle) { 999 if (hp->n_throttle) {
1004 hvsi_send_overflow(hp, tty); 1000 hvsi_send_overflow(hp);
1005 tty_flip_buffer_push(tty); 1001 tty_flip_buffer_push(&hp->port);
1006 } 1002 }
1007 spin_unlock_irqrestore(&hp->lock, flags); 1003 spin_unlock_irqrestore(&hp->lock, flags);
1008 1004
@@ -1187,9 +1183,7 @@ static int __init hvsi_console_init(void)
1187 hvsi_wait = poll_for_state; /* no irqs yet; must poll */ 1183 hvsi_wait = poll_for_state; /* no irqs yet; must poll */
1188 1184
1189 /* search device tree for vty nodes */ 1185 /* search device tree for vty nodes */
1190 for (vty = of_find_compatible_node(NULL, "serial", "hvterm-protocol"); 1186 for_each_compatible_node(vty, "serial", "hvterm-protocol") {
1191 vty != NULL;
1192 vty = of_find_compatible_node(vty, "serial", "hvterm-protocol")) {
1193 struct hvsi_struct *hp; 1187 struct hvsi_struct *hp;
1194 const uint32_t *vtermno, *irq; 1188 const uint32_t *vtermno, *irq;
1195 1189
diff --git a/drivers/tty/ipwireless/tty.c b/drivers/tty/ipwireless/tty.c
index 2cde13ddf9fc..8fd72ff9436e 100644
--- a/drivers/tty/ipwireless/tty.c
+++ b/drivers/tty/ipwireless/tty.c
@@ -106,7 +106,7 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp)
106 106
107 tty->port.tty = linux_tty; 107 tty->port.tty = linux_tty;
108 linux_tty->driver_data = tty; 108 linux_tty->driver_data = tty;
109 linux_tty->low_latency = 1; 109 tty->port.low_latency = 1;
110 110
111 if (tty->tty_type == TTYTYPE_MODEM) 111 if (tty->tty_type == TTYTYPE_MODEM)
112 ipwireless_ppp_open(tty->network); 112 ipwireless_ppp_open(tty->network);
@@ -160,15 +160,9 @@ static void ipw_close(struct tty_struct *linux_tty, struct file *filp)
160void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data, 160void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,
161 unsigned int length) 161 unsigned int length)
162{ 162{
163 struct tty_struct *linux_tty;
164 int work = 0; 163 int work = 0;
165 164
166 mutex_lock(&tty->ipw_tty_mutex); 165 mutex_lock(&tty->ipw_tty_mutex);
167 linux_tty = tty->port.tty;
168 if (linux_tty == NULL) {
169 mutex_unlock(&tty->ipw_tty_mutex);
170 return;
171 }
172 166
173 if (!tty->port.count) { 167 if (!tty->port.count) {
174 mutex_unlock(&tty->ipw_tty_mutex); 168 mutex_unlock(&tty->ipw_tty_mutex);
@@ -176,7 +170,7 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,
176 } 170 }
177 mutex_unlock(&tty->ipw_tty_mutex); 171 mutex_unlock(&tty->ipw_tty_mutex);
178 172
179 work = tty_insert_flip_string(linux_tty, data, length); 173 work = tty_insert_flip_string(&tty->port, data, length);
180 174
181 if (work != length) 175 if (work != length)
182 printk(KERN_DEBUG IPWIRELESS_PCCARD_NAME 176 printk(KERN_DEBUG IPWIRELESS_PCCARD_NAME
@@ -187,7 +181,7 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,
187 * This may sleep if ->low_latency is set 181 * This may sleep if ->low_latency is set
188 */ 182 */
189 if (work) 183 if (work)
190 tty_flip_buffer_push(linux_tty); 184 tty_flip_buffer_push(&tty->port);
191} 185}
192 186
193static void ipw_write_packet_sent_callback(void *callback_data, 187static void ipw_write_packet_sent_callback(void *callback_data,
diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c
index 3205b2e9090b..858291ca889c 100644
--- a/drivers/tty/isicom.c
+++ b/drivers/tty/isicom.c
@@ -634,10 +634,10 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
634 break; 634 break;
635 635
636 case 1: /* Received Break !!! */ 636 case 1: /* Received Break !!! */
637 tty_insert_flip_char(tty, 0, TTY_BREAK); 637 tty_insert_flip_char(&port->port, 0, TTY_BREAK);
638 if (port->port.flags & ASYNC_SAK) 638 if (port->port.flags & ASYNC_SAK)
639 do_SAK(tty); 639 do_SAK(tty);
640 tty_flip_buffer_push(tty); 640 tty_flip_buffer_push(&port->port);
641 break; 641 break;
642 642
643 case 2: /* Statistics */ 643 case 2: /* Statistics */
@@ -650,15 +650,15 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
650 break; 650 break;
651 } 651 }
652 } else { /* Data Packet */ 652 } else { /* Data Packet */
653 653 count = tty_prepare_flip_string(&port->port, &rp,
654 count = tty_prepare_flip_string(tty, &rp, byte_count & ~1); 654 byte_count & ~1);
655 pr_debug("%s: Can rx %d of %d bytes.\n", 655 pr_debug("%s: Can rx %d of %d bytes.\n",
656 __func__, count, byte_count); 656 __func__, count, byte_count);
657 word_count = count >> 1; 657 word_count = count >> 1;
658 insw(base, rp, word_count); 658 insw(base, rp, word_count);
659 byte_count -= (word_count << 1); 659 byte_count -= (word_count << 1);
660 if (count & 0x0001) { 660 if (count & 0x0001) {
661 tty_insert_flip_char(tty, inw(base) & 0xff, 661 tty_insert_flip_char(&port->port, inw(base) & 0xff,
662 TTY_NORMAL); 662 TTY_NORMAL);
663 byte_count -= 2; 663 byte_count -= 2;
664 } 664 }
@@ -671,7 +671,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
671 byte_count -= 2; 671 byte_count -= 2;
672 } 672 }
673 } 673 }
674 tty_flip_buffer_push(tty); 674 tty_flip_buffer_push(&port->port);
675 } 675 }
676 outw(0x0000, base+0x04); /* enable interrupts */ 676 outw(0x0000, base+0x04); /* enable interrupts */
677 spin_unlock(&card->card_lock); 677 spin_unlock(&card->card_lock);
diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c
index f9d28503bdec..adeac255e526 100644
--- a/drivers/tty/moxa.c
+++ b/drivers/tty/moxa.c
@@ -1405,7 +1405,7 @@ static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
1405 if (inited && !test_bit(TTY_THROTTLED, &tty->flags) && 1405 if (inited && !test_bit(TTY_THROTTLED, &tty->flags) &&
1406 MoxaPortRxQueue(p) > 0) { /* RX */ 1406 MoxaPortRxQueue(p) > 0) { /* RX */
1407 MoxaPortReadData(p); 1407 MoxaPortReadData(p);
1408 tty_schedule_flip(tty); 1408 tty_schedule_flip(&p->port);
1409 } 1409 }
1410 } else { 1410 } else {
1411 clear_bit(EMPTYWAIT, &p->statusflags); 1411 clear_bit(EMPTYWAIT, &p->statusflags);
@@ -1429,8 +1429,8 @@ static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
1429 goto put; 1429 goto put;
1430 1430
1431 if (tty && (intr & IntrBreak) && !I_IGNBRK(tty)) { /* BREAK */ 1431 if (tty && (intr & IntrBreak) && !I_IGNBRK(tty)) { /* BREAK */
1432 tty_insert_flip_char(tty, 0, TTY_BREAK); 1432 tty_insert_flip_char(&p->port, 0, TTY_BREAK);
1433 tty_schedule_flip(tty); 1433 tty_schedule_flip(&p->port);
1434 } 1434 }
1435 1435
1436 if (intr & IntrLine) 1436 if (intr & IntrLine)
@@ -1966,7 +1966,7 @@ static int MoxaPortReadData(struct moxa_port *port)
1966 ofs = baseAddr + DynPage_addr + bufhead + head; 1966 ofs = baseAddr + DynPage_addr + bufhead + head;
1967 len = (tail >= head) ? (tail - head) : 1967 len = (tail >= head) ? (tail - head) :
1968 (rx_mask + 1 - head); 1968 (rx_mask + 1 - head);
1969 len = tty_prepare_flip_string(tty, &dst, 1969 len = tty_prepare_flip_string(&port->port, &dst,
1970 min(len, count)); 1970 min(len, count));
1971 memcpy_fromio(dst, ofs, len); 1971 memcpy_fromio(dst, ofs, len);
1972 head = (head + len) & rx_mask; 1972 head = (head + len) & rx_mask;
@@ -1978,7 +1978,7 @@ static int MoxaPortReadData(struct moxa_port *port)
1978 while (count > 0) { 1978 while (count > 0) {
1979 writew(pageno, baseAddr + Control_reg); 1979 writew(pageno, baseAddr + Control_reg);
1980 ofs = baseAddr + DynPage_addr + pageofs; 1980 ofs = baseAddr + DynPage_addr + pageofs;
1981 len = tty_prepare_flip_string(tty, &dst, 1981 len = tty_prepare_flip_string(&port->port, &dst,
1982 min(Page_size - pageofs, count)); 1982 min(Page_size - pageofs, count));
1983 memcpy_fromio(dst, ofs, len); 1983 memcpy_fromio(dst, ofs, len);
1984 1984
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
index 40113868bec2..ad34a202a34d 100644
--- a/drivers/tty/mxser.c
+++ b/drivers/tty/mxser.c
@@ -1264,7 +1264,7 @@ static int mxser_set_serial_info(struct tty_struct *tty,
1264 (new_serial.flags & ASYNC_FLAGS)); 1264 (new_serial.flags & ASYNC_FLAGS));
1265 port->close_delay = new_serial.close_delay * HZ / 100; 1265 port->close_delay = new_serial.close_delay * HZ / 100;
1266 port->closing_wait = new_serial.closing_wait * HZ / 100; 1266 port->closing_wait = new_serial.closing_wait * HZ / 100;
1267 tty->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 1267 port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1268 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST && 1268 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST &&
1269 (new_serial.baud_base != info->baud_base || 1269 (new_serial.baud_base != info->baud_base ||
1270 new_serial.custom_divisor != 1270 new_serial.custom_divisor !=
@@ -2079,7 +2079,7 @@ static void mxser_receive_chars(struct tty_struct *tty,
2079 } 2079 }
2080 while (gdl--) { 2080 while (gdl--) {
2081 ch = inb(port->ioaddr + UART_RX); 2081 ch = inb(port->ioaddr + UART_RX);
2082 tty_insert_flip_char(tty, ch, 0); 2082 tty_insert_flip_char(&port->port, ch, 0);
2083 cnt++; 2083 cnt++;
2084 } 2084 }
2085 goto end_intr; 2085 goto end_intr;
@@ -2118,7 +2118,7 @@ intr_old:
2118 } else 2118 } else
2119 flag = TTY_BREAK; 2119 flag = TTY_BREAK;
2120 } 2120 }
2121 tty_insert_flip_char(tty, ch, flag); 2121 tty_insert_flip_char(&port->port, ch, flag);
2122 cnt++; 2122 cnt++;
2123 if (cnt >= recv_room) { 2123 if (cnt >= recv_room) {
2124 if (!port->ldisc_stop_rx) 2124 if (!port->ldisc_stop_rx)
@@ -2145,7 +2145,7 @@ end_intr:
2145 * recursive locking. 2145 * recursive locking.
2146 */ 2146 */
2147 spin_unlock(&port->slock); 2147 spin_unlock(&port->slock);
2148 tty_flip_buffer_push(tty); 2148 tty_flip_buffer_push(&port->port);
2149 spin_lock(&port->slock); 2149 spin_lock(&port->slock);
2150} 2150}
2151 2151
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
index dcc0430a49c8..e0f80ce0cf8f 100644
--- a/drivers/tty/n_gsm.c
+++ b/drivers/tty/n_gsm.c
@@ -1067,9 +1067,9 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
1067 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD)) 1067 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD))
1068 if (!(tty->termios.c_cflag & CLOCAL)) 1068 if (!(tty->termios.c_cflag & CLOCAL))
1069 tty_hangup(tty); 1069 tty_hangup(tty);
1070 if (brk & 0x01)
1071 tty_insert_flip_char(tty, 0, TTY_BREAK);
1072 } 1070 }
1071 if (brk & 0x01)
1072 tty_insert_flip_char(&dlci->port, 0, TTY_BREAK);
1073 dlci->modem_rx = mlines; 1073 dlci->modem_rx = mlines;
1074} 1074}
1075 1075
@@ -1137,7 +1137,7 @@ static void gsm_control_modem(struct gsm_mux *gsm, u8 *data, int clen)
1137 1137
1138static void gsm_control_rls(struct gsm_mux *gsm, u8 *data, int clen) 1138static void gsm_control_rls(struct gsm_mux *gsm, u8 *data, int clen)
1139{ 1139{
1140 struct tty_struct *tty; 1140 struct tty_port *port;
1141 unsigned int addr = 0 ; 1141 unsigned int addr = 0 ;
1142 u8 bits; 1142 u8 bits;
1143 int len = clen; 1143 int len = clen;
@@ -1160,19 +1160,18 @@ static void gsm_control_rls(struct gsm_mux *gsm, u8 *data, int clen)
1160 bits = *dp; 1160 bits = *dp;
1161 if ((bits & 1) == 0) 1161 if ((bits & 1) == 0)
1162 return; 1162 return;
1163 /* See if we have an uplink tty */
1164 tty = tty_port_tty_get(&gsm->dlci[addr]->port);
1165 1163
1166 if (tty) { 1164 port = &gsm->dlci[addr]->port;
1167 if (bits & 2) 1165
1168 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 1166 if (bits & 2)
1169 if (bits & 4) 1167 tty_insert_flip_char(port, 0, TTY_OVERRUN);
1170 tty_insert_flip_char(tty, 0, TTY_PARITY); 1168 if (bits & 4)
1171 if (bits & 8) 1169 tty_insert_flip_char(port, 0, TTY_PARITY);
1172 tty_insert_flip_char(tty, 0, TTY_FRAME); 1170 if (bits & 8)
1173 tty_flip_buffer_push(tty); 1171 tty_insert_flip_char(port, 0, TTY_FRAME);
1174 tty_kref_put(tty); 1172
1175 } 1173 tty_flip_buffer_push(port);
1174
1176 gsm_control_reply(gsm, CMD_RLS, data, clen); 1175 gsm_control_reply(gsm, CMD_RLS, data, clen);
1177} 1176}
1178 1177
@@ -1545,36 +1544,37 @@ static void gsm_dlci_data(struct gsm_dlci *dlci, u8 *data, int clen)
1545{ 1544{
1546 /* krefs .. */ 1545 /* krefs .. */
1547 struct tty_port *port = &dlci->port; 1546 struct tty_port *port = &dlci->port;
1548 struct tty_struct *tty = tty_port_tty_get(port); 1547 struct tty_struct *tty;
1549 unsigned int modem = 0; 1548 unsigned int modem = 0;
1550 int len = clen; 1549 int len = clen;
1551 1550
1552 if (debug & 16) 1551 if (debug & 16)
1553 pr_debug("%d bytes for tty %p\n", len, tty); 1552 pr_debug("%d bytes for tty\n", len);
1554 if (tty) { 1553 switch (dlci->adaption) {
1555 switch (dlci->adaption) { 1554 /* Unsupported types */
1556 /* Unsupported types */ 1555 /* Packetised interruptible data */
1557 /* Packetised interruptible data */ 1556 case 4:
1558 case 4: 1557 break;
1559 break; 1558 /* Packetised uininterruptible voice/data */
1560 /* Packetised uininterruptible voice/data */ 1559 case 3:
1561 case 3: 1560 break;
1562 break; 1561 /* Asynchronous serial with line state in each frame */
1563 /* Asynchronous serial with line state in each frame */ 1562 case 2:
1564 case 2: 1563 while (gsm_read_ea(&modem, *data++) == 0) {
1565 while (gsm_read_ea(&modem, *data++) == 0) { 1564 len--;
1566 len--; 1565 if (len == 0)
1567 if (len == 0) 1566 return;
1568 return; 1567 }
1569 } 1568 tty = tty_port_tty_get(port);
1569 if (tty) {
1570 gsm_process_modem(tty, dlci, modem, clen); 1570 gsm_process_modem(tty, dlci, modem, clen);
1571 /* Line state will go via DLCI 0 controls only */ 1571 tty_kref_put(tty);
1572 case 1:
1573 default:
1574 tty_insert_flip_string(tty, data, len);
1575 tty_flip_buffer_push(tty);
1576 } 1572 }
1577 tty_kref_put(tty); 1573 /* Line state will go via DLCI 0 controls only */
1574 case 1:
1575 default:
1576 tty_insert_flip_string(port, data, len);
1577 tty_flip_buffer_push(port);
1578 } 1578 }
1579} 1579}
1580 1580
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
index 19083efa2314..d5cea3bb01ea 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -229,6 +229,8 @@ static void reset_buffer_flags(struct tty_struct *tty)
229 ldata->canon_head = ldata->canon_data = ldata->erasing = 0; 229 ldata->canon_head = ldata->canon_data = ldata->erasing = 0;
230 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE); 230 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
231 n_tty_set_room(tty); 231 n_tty_set_room(tty);
232
233 check_unthrottle(tty);
232} 234}
233 235
234/** 236/**
diff --git a/drivers/tty/nozomi.c b/drivers/tty/nozomi.c
index a0c69ab04399..2dff19796157 100644
--- a/drivers/tty/nozomi.c
+++ b/drivers/tty/nozomi.c
@@ -827,15 +827,10 @@ static int receive_data(enum port_type index, struct nozomi *dc)
827 struct tty_struct *tty = tty_port_tty_get(&port->port); 827 struct tty_struct *tty = tty_port_tty_get(&port->port);
828 int i, ret; 828 int i, ret;
829 829
830 if (unlikely(!tty)) {
831 DBG1("tty not open for port: %d?", index);
832 return 1;
833 }
834
835 read_mem32((u32 *) &size, addr, 4); 830 read_mem32((u32 *) &size, addr, 4);
836 /* DBG1( "%d bytes port: %d", size, index); */ 831 /* DBG1( "%d bytes port: %d", size, index); */
837 832
838 if (test_bit(TTY_THROTTLED, &tty->flags)) { 833 if (tty && test_bit(TTY_THROTTLED, &tty->flags)) {
839 DBG1("No room in tty, don't read data, don't ack interrupt, " 834 DBG1("No room in tty, don't read data, don't ack interrupt, "
840 "disable interrupt"); 835 "disable interrupt");
841 836
@@ -855,13 +850,14 @@ static int receive_data(enum port_type index, struct nozomi *dc)
855 read_mem32((u32 *) buf, addr + offset, RECEIVE_BUF_MAX); 850 read_mem32((u32 *) buf, addr + offset, RECEIVE_BUF_MAX);
856 851
857 if (size == 1) { 852 if (size == 1) {
858 tty_insert_flip_char(tty, buf[0], TTY_NORMAL); 853 tty_insert_flip_char(&port->port, buf[0], TTY_NORMAL);
859 size = 0; 854 size = 0;
860 } else if (size < RECEIVE_BUF_MAX) { 855 } else if (size < RECEIVE_BUF_MAX) {
861 size -= tty_insert_flip_string(tty, (char *) buf, size); 856 size -= tty_insert_flip_string(&port->port,
857 (char *)buf, size);
862 } else { 858 } else {
863 i = tty_insert_flip_string(tty, \ 859 i = tty_insert_flip_string(&port->port,
864 (char *) buf, RECEIVE_BUF_MAX); 860 (char *)buf, RECEIVE_BUF_MAX);
865 size -= i; 861 size -= i;
866 offset += i; 862 offset += i;
867 } 863 }
@@ -1276,15 +1272,11 @@ static irqreturn_t interrupt_handler(int irq, void *dev_id)
1276 1272
1277exit_handler: 1273exit_handler:
1278 spin_unlock(&dc->spin_mutex); 1274 spin_unlock(&dc->spin_mutex);
1279 for (a = 0; a < NOZOMI_MAX_PORTS; a++) { 1275
1280 struct tty_struct *tty; 1276 for (a = 0; a < NOZOMI_MAX_PORTS; a++)
1281 if (test_and_clear_bit(a, &dc->flip)) { 1277 if (test_and_clear_bit(a, &dc->flip))
1282 tty = tty_port_tty_get(&dc->port[a].port); 1278 tty_flip_buffer_push(&dc->port[a].port);
1283 if (tty) 1279
1284 tty_flip_buffer_push(tty);
1285 tty_kref_put(tty);
1286 }
1287 }
1288 return IRQ_HANDLED; 1280 return IRQ_HANDLED;
1289none: 1281none:
1290 spin_unlock(&dc->spin_mutex); 1282 spin_unlock(&dc->spin_mutex);
@@ -1687,12 +1679,6 @@ static int ntty_write(struct tty_struct *tty, const unsigned char *buffer,
1687 1679
1688 rval = kfifo_in(&port->fifo_ul, (unsigned char *)buffer, count); 1680 rval = kfifo_in(&port->fifo_ul, (unsigned char *)buffer, count);
1689 1681
1690 /* notify card */
1691 if (unlikely(dc == NULL)) {
1692 DBG1("No device context?");
1693 goto exit;
1694 }
1695
1696 spin_lock_irqsave(&dc->spin_mutex, flags); 1682 spin_lock_irqsave(&dc->spin_mutex, flags);
1697 /* CTS is only valid on the modem channel */ 1683 /* CTS is only valid on the modem channel */
1698 if (port == &(dc->port[PORT_MDM])) { 1684 if (port == &(dc->port[PORT_MDM])) {
@@ -1708,7 +1694,6 @@ static int ntty_write(struct tty_struct *tty, const unsigned char *buffer,
1708 } 1694 }
1709 spin_unlock_irqrestore(&dc->spin_mutex, flags); 1695 spin_unlock_irqrestore(&dc->spin_mutex, flags);
1710 1696
1711exit:
1712 return rval; 1697 return rval;
1713} 1698}
1714 1699
diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c
index 79ff3a5e925d..755600f6120f 100644
--- a/drivers/tty/pty.c
+++ b/drivers/tty/pty.c
@@ -47,7 +47,6 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
47 /* Review - krefs on tty_link ?? */ 47 /* Review - krefs on tty_link ?? */
48 if (!tty->link) 48 if (!tty->link)
49 return; 49 return;
50 tty->link->packet = 0;
51 set_bit(TTY_OTHER_CLOSED, &tty->link->flags); 50 set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
52 wake_up_interruptible(&tty->link->read_wait); 51 wake_up_interruptible(&tty->link->read_wait);
53 wake_up_interruptible(&tty->link->write_wait); 52 wake_up_interruptible(&tty->link->write_wait);
@@ -55,9 +54,9 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
55 set_bit(TTY_OTHER_CLOSED, &tty->flags); 54 set_bit(TTY_OTHER_CLOSED, &tty->flags);
56#ifdef CONFIG_UNIX98_PTYS 55#ifdef CONFIG_UNIX98_PTYS
57 if (tty->driver == ptm_driver) { 56 if (tty->driver == ptm_driver) {
58 mutex_lock(&devpts_mutex); 57 mutex_lock(&devpts_mutex);
59 devpts_pty_kill(tty->link->driver_data); 58 devpts_pty_kill(tty->link->driver_data);
60 mutex_unlock(&devpts_mutex); 59 mutex_unlock(&devpts_mutex);
61 } 60 }
62#endif 61#endif
63 tty_unlock(tty); 62 tty_unlock(tty);
@@ -120,10 +119,10 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
120 119
121 if (c > 0) { 120 if (c > 0) {
122 /* Stuff the data into the input queue of the other end */ 121 /* Stuff the data into the input queue of the other end */
123 c = tty_insert_flip_string(to, buf, c); 122 c = tty_insert_flip_string(to->port, buf, c);
124 /* And shovel */ 123 /* And shovel */
125 if (c) { 124 if (c) {
126 tty_flip_buffer_push(to); 125 tty_flip_buffer_push(to->port);
127 tty_wakeup(tty); 126 tty_wakeup(tty);
128 } 127 }
129 } 128 }
@@ -663,7 +662,7 @@ static const struct tty_operations pty_unix98_ops = {
663 * Allocate a unix98 pty master device from the ptmx driver. 662 * Allocate a unix98 pty master device from the ptmx driver.
664 * 663 *
665 * Locking: tty_mutex protects the init_dev work. tty->count should 664 * Locking: tty_mutex protects the init_dev work. tty->count should
666 * protect the rest. 665 * protect the rest.
667 * allocated_ptys_lock handles the list of free pty numbers 666 * allocated_ptys_lock handles the list of free pty numbers
668 */ 667 */
669 668
@@ -797,7 +796,7 @@ static void __init unix98_pty_init(void)
797 cdev_init(&ptmx_cdev, &ptmx_fops); 796 cdev_init(&ptmx_cdev, &ptmx_fops);
798 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || 797 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
799 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) 798 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
800 panic("Couldn't register /dev/ptmx driver\n"); 799 panic("Couldn't register /dev/ptmx driver");
801 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx"); 800 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
802} 801}
803 802
diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c
index e42009a00529..1d270034bfc3 100644
--- a/drivers/tty/rocket.c
+++ b/drivers/tty/rocket.c
@@ -55,7 +55,7 @@
55#undef REV_PCI_ORDER 55#undef REV_PCI_ORDER
56#undef ROCKET_DEBUG_IO 56#undef ROCKET_DEBUG_IO
57 57
58#define POLL_PERIOD HZ/100 /* Polling period .01 seconds (10ms) */ 58#define POLL_PERIOD (HZ/100) /* Polling period .01 seconds (10ms) */
59 59
60/****** Kernel includes ******/ 60/****** Kernel includes ******/
61 61
@@ -315,9 +315,8 @@ static inline int rocket_paranoia_check(struct r_port *info,
315 * that receive data is present on a serial port. Pulls data from FIFO, moves it into the 315 * that receive data is present on a serial port. Pulls data from FIFO, moves it into the
316 * tty layer. 316 * tty layer.
317 */ 317 */
318static void rp_do_receive(struct r_port *info, 318static void rp_do_receive(struct r_port *info, CHANNEL_t *cp,
319 struct tty_struct *tty, 319 unsigned int ChanStatus)
320 CHANNEL_t * cp, unsigned int ChanStatus)
321{ 320{
322 unsigned int CharNStat; 321 unsigned int CharNStat;
323 int ToRecv, wRecv, space; 322 int ToRecv, wRecv, space;
@@ -379,7 +378,8 @@ static void rp_do_receive(struct r_port *info,
379 flag = TTY_OVERRUN; 378 flag = TTY_OVERRUN;
380 else 379 else
381 flag = TTY_NORMAL; 380 flag = TTY_NORMAL;
382 tty_insert_flip_char(tty, CharNStat & 0xff, flag); 381 tty_insert_flip_char(&info->port, CharNStat & 0xff,
382 flag);
383 ToRecv--; 383 ToRecv--;
384 } 384 }
385 385
@@ -399,7 +399,7 @@ static void rp_do_receive(struct r_port *info,
399 * characters at time by doing repeated word IO 399 * characters at time by doing repeated word IO
400 * transfer. 400 * transfer.
401 */ 401 */
402 space = tty_prepare_flip_string(tty, &cbuf, ToRecv); 402 space = tty_prepare_flip_string(&info->port, &cbuf, ToRecv);
403 if (space < ToRecv) { 403 if (space < ToRecv) {
404#ifdef ROCKET_DEBUG_RECEIVE 404#ifdef ROCKET_DEBUG_RECEIVE
405 printk(KERN_INFO "rp_do_receive:insufficient space ToRecv=%d space=%d\n", ToRecv, space); 405 printk(KERN_INFO "rp_do_receive:insufficient space ToRecv=%d space=%d\n", ToRecv, space);
@@ -415,7 +415,7 @@ static void rp_do_receive(struct r_port *info,
415 cbuf[ToRecv - 1] = sInB(sGetTxRxDataIO(cp)); 415 cbuf[ToRecv - 1] = sInB(sGetTxRxDataIO(cp));
416 } 416 }
417 /* Push the data up to the tty layer */ 417 /* Push the data up to the tty layer */
418 tty_flip_buffer_push(tty); 418 tty_flip_buffer_push(&info->port);
419} 419}
420 420
421/* 421/*
@@ -494,7 +494,6 @@ static void rp_do_transmit(struct r_port *info)
494static void rp_handle_port(struct r_port *info) 494static void rp_handle_port(struct r_port *info)
495{ 495{
496 CHANNEL_t *cp; 496 CHANNEL_t *cp;
497 struct tty_struct *tty;
498 unsigned int IntMask, ChanStatus; 497 unsigned int IntMask, ChanStatus;
499 498
500 if (!info) 499 if (!info)
@@ -505,12 +504,7 @@ static void rp_handle_port(struct r_port *info)
505 "info->flags & NOT_INIT\n"); 504 "info->flags & NOT_INIT\n");
506 return; 505 return;
507 } 506 }
508 tty = tty_port_tty_get(&info->port); 507
509 if (!tty) {
510 printk(KERN_WARNING "rp: WARNING: rp_handle_port called with "
511 "tty==NULL\n");
512 return;
513 }
514 cp = &info->channel; 508 cp = &info->channel;
515 509
516 IntMask = sGetChanIntID(cp) & info->intmask; 510 IntMask = sGetChanIntID(cp) & info->intmask;
@@ -519,7 +513,7 @@ static void rp_handle_port(struct r_port *info)
519#endif 513#endif
520 ChanStatus = sGetChanStatus(cp); 514 ChanStatus = sGetChanStatus(cp);
521 if (IntMask & RXF_TRIG) { /* Rx FIFO trigger level */ 515 if (IntMask & RXF_TRIG) { /* Rx FIFO trigger level */
522 rp_do_receive(info, tty, cp, ChanStatus); 516 rp_do_receive(info, cp, ChanStatus);
523 } 517 }
524 if (IntMask & DELTA_CD) { /* CD change */ 518 if (IntMask & DELTA_CD) { /* CD change */
525#if (defined(ROCKET_DEBUG_OPEN) || defined(ROCKET_DEBUG_INTR) || defined(ROCKET_DEBUG_HANGUP)) 519#if (defined(ROCKET_DEBUG_OPEN) || defined(ROCKET_DEBUG_INTR) || defined(ROCKET_DEBUG_HANGUP))
@@ -527,10 +521,15 @@ static void rp_handle_port(struct r_port *info)
527 (ChanStatus & CD_ACT) ? "on" : "off"); 521 (ChanStatus & CD_ACT) ? "on" : "off");
528#endif 522#endif
529 if (!(ChanStatus & CD_ACT) && info->cd_status) { 523 if (!(ChanStatus & CD_ACT) && info->cd_status) {
524 struct tty_struct *tty;
530#ifdef ROCKET_DEBUG_HANGUP 525#ifdef ROCKET_DEBUG_HANGUP
531 printk(KERN_INFO "CD drop, calling hangup.\n"); 526 printk(KERN_INFO "CD drop, calling hangup.\n");
532#endif 527#endif
533 tty_hangup(tty); 528 tty = tty_port_tty_get(&info->port);
529 if (tty) {
530 tty_hangup(tty);
531 tty_kref_put(tty);
532 }
534 } 533 }
535 info->cd_status = (ChanStatus & CD_ACT) ? 1 : 0; 534 info->cd_status = (ChanStatus & CD_ACT) ? 1 : 0;
536 wake_up_interruptible(&info->port.open_wait); 535 wake_up_interruptible(&info->port.open_wait);
@@ -543,7 +542,6 @@ static void rp_handle_port(struct r_port *info)
543 printk(KERN_INFO "DSR change...\n"); 542 printk(KERN_INFO "DSR change...\n");
544 } 543 }
545#endif 544#endif
546 tty_kref_put(tty);
547} 545}
548 546
549/* 547/*
@@ -1758,8 +1756,29 @@ static void rp_flush_buffer(struct tty_struct *tty)
1758 1756
1759#ifdef CONFIG_PCI 1757#ifdef CONFIG_PCI
1760 1758
1761static struct pci_device_id __used rocket_pci_ids[] = { 1759static DEFINE_PCI_DEVICE_TABLE(rocket_pci_ids) = {
1762 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_ANY_ID) }, 1760 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP4QUAD) },
1761 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8OCTA) },
1762 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP8OCTA) },
1763 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8INTF) },
1764 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP8INTF) },
1765 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8J) },
1766 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP4J) },
1767 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8SNI) },
1768 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP16SNI) },
1769 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP16INTF) },
1770 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP16INTF) },
1771 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_CRP16INTF) },
1772 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP32INTF) },
1773 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP32INTF) },
1774 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RPP4) },
1775 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RPP8) },
1776 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP2_232) },
1777 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP2_422) },
1778 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP6M) },
1779 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP4M) },
1780 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_UPCI_RM3_8PORT) },
1781 { PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_UPCI_RM3_4PORT) },
1763 { } 1782 { }
1764}; 1783};
1765MODULE_DEVICE_TABLE(pci, rocket_pci_ids); 1784MODULE_DEVICE_TABLE(pci, rocket_pci_ids);
@@ -1781,7 +1800,8 @@ static __init int register_PCI(int i, struct pci_dev *dev)
1781 WordIO_t ConfigIO = 0; 1800 WordIO_t ConfigIO = 0;
1782 ByteIO_t UPCIRingInd = 0; 1801 ByteIO_t UPCIRingInd = 0;
1783 1802
1784 if (!dev || pci_enable_device(dev)) 1803 if (!dev || !pci_match_id(rocket_pci_ids, dev) ||
1804 pci_enable_device(dev))
1785 return 0; 1805 return 0;
1786 1806
1787 rcktpt_io_addr[i] = pci_resource_start(dev, 0); 1807 rcktpt_io_addr[i] = pci_resource_start(dev, 0);
diff --git a/drivers/tty/serial/21285.c b/drivers/tty/serial/21285.c
index a44345a2dbb4..c7e8b60b6177 100644
--- a/drivers/tty/serial/21285.c
+++ b/drivers/tty/serial/21285.c
@@ -85,7 +85,6 @@ static void serial21285_enable_ms(struct uart_port *port)
85static irqreturn_t serial21285_rx_chars(int irq, void *dev_id) 85static irqreturn_t serial21285_rx_chars(int irq, void *dev_id)
86{ 86{
87 struct uart_port *port = dev_id; 87 struct uart_port *port = dev_id;
88 struct tty_struct *tty = port->state->port.tty;
89 unsigned int status, ch, flag, rxs, max_count = 256; 88 unsigned int status, ch, flag, rxs, max_count = 256;
90 89
91 status = *CSR_UARTFLG; 90 status = *CSR_UARTFLG;
@@ -115,7 +114,7 @@ static irqreturn_t serial21285_rx_chars(int irq, void *dev_id)
115 114
116 status = *CSR_UARTFLG; 115 status = *CSR_UARTFLG;
117 } 116 }
118 tty_flip_buffer_push(tty); 117 tty_flip_buffer_push(&port->state->port);
119 118
120 return IRQ_HANDLED; 119 return IRQ_HANDLED;
121} 120}
diff --git a/drivers/tty/serial/68328serial.c b/drivers/tty/serial/68328serial.c
index f99a84526f82..49399470794d 100644
--- a/drivers/tty/serial/68328serial.c
+++ b/drivers/tty/serial/68328serial.c
@@ -262,8 +262,7 @@ static void rs_start(struct tty_struct *tty)
262 local_irq_restore(flags); 262 local_irq_restore(flags);
263} 263}
264 264
265static void receive_chars(struct m68k_serial *info, struct tty_struct *tty, 265static void receive_chars(struct m68k_serial *info, unsigned short rx)
266 unsigned short rx)
267{ 266{
268 m68328_uart *uart = &uart_addr[info->line]; 267 m68328_uart *uart = &uart_addr[info->line];
269 unsigned char ch, flag; 268 unsigned char ch, flag;
@@ -293,9 +292,6 @@ static void receive_chars(struct m68k_serial *info, struct tty_struct *tty,
293 } 292 }
294 } 293 }
295 294
296 if(!tty)
297 goto clear_and_exit;
298
299 flag = TTY_NORMAL; 295 flag = TTY_NORMAL;
300 296
301 if (rx & URX_PARITY_ERROR) 297 if (rx & URX_PARITY_ERROR)
@@ -305,15 +301,12 @@ static void receive_chars(struct m68k_serial *info, struct tty_struct *tty,
305 else if (rx & URX_FRAME_ERROR) 301 else if (rx & URX_FRAME_ERROR)
306 flag = TTY_FRAME; 302 flag = TTY_FRAME;
307 303
308 tty_insert_flip_char(tty, ch, flag); 304 tty_insert_flip_char(&info->tport, ch, flag);
309#ifndef CONFIG_XCOPILOT_BUGS 305#ifndef CONFIG_XCOPILOT_BUGS
310 } while((rx = uart->urx.w) & URX_DATA_READY); 306 } while((rx = uart->urx.w) & URX_DATA_READY);
311#endif 307#endif
312 308
313 tty_schedule_flip(tty); 309 tty_schedule_flip(&info->tport);
314
315clear_and_exit:
316 return;
317} 310}
318 311
319static void transmit_chars(struct m68k_serial *info, struct tty_struct *tty) 312static void transmit_chars(struct m68k_serial *info, struct tty_struct *tty)
@@ -367,11 +360,11 @@ irqreturn_t rs_interrupt(int irq, void *dev_id)
367 tx = uart->utx.w; 360 tx = uart->utx.w;
368 361
369 if (rx & URX_DATA_READY) 362 if (rx & URX_DATA_READY)
370 receive_chars(info, tty, rx); 363 receive_chars(info, rx);
371 if (tx & UTX_TX_AVAIL) 364 if (tx & UTX_TX_AVAIL)
372 transmit_chars(info, tty); 365 transmit_chars(info, tty);
373#else 366#else
374 receive_chars(info, tty, rx); 367 receive_chars(info, rx);
375#endif 368#endif
376 tty_kref_put(tty); 369 tty_kref_put(tty);
377 370
@@ -1009,7 +1002,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1009 m68328_uart *uart = &uart_addr[info->line]; 1002 m68328_uart *uart = &uart_addr[info->line];
1010 unsigned long flags; 1003 unsigned long flags;
1011 1004
1012 if (!info || serial_paranoia_check(info, tty->name, "rs_close")) 1005 if (serial_paranoia_check(info, tty->name, "rs_close"))
1013 return; 1006 return;
1014 1007
1015 local_irq_save(flags); 1008 local_irq_save(flags);
diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c
index f9320437a649..24939ca3eedc 100644
--- a/drivers/tty/serial/8250/8250.c
+++ b/drivers/tty/serial/8250/8250.c
@@ -239,13 +239,6 @@ static const struct serial8250_config uart_config[] = {
239 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, 239 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
240 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE, 240 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
241 }, 241 },
242 [PORT_RM9000] = {
243 .name = "RM9000",
244 .fifo_size = 16,
245 .tx_loadsz = 16,
246 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
247 .flags = UART_CAP_FIFO,
248 },
249 [PORT_OCTEON] = { 242 [PORT_OCTEON] = {
250 .name = "OCTEON", 243 .name = "OCTEON",
251 .fifo_size = 64, 244 .fifo_size = 64,
@@ -370,56 +363,6 @@ static void au_serial_dl_write(struct uart_8250_port *up, int value)
370 363
371#endif 364#endif
372 365
373#ifdef CONFIG_SERIAL_8250_RM9K
374
375static const u8
376 regmap_in[8] = {
377 [UART_RX] = 0x00,
378 [UART_IER] = 0x0c,
379 [UART_IIR] = 0x14,
380 [UART_LCR] = 0x1c,
381 [UART_MCR] = 0x20,
382 [UART_LSR] = 0x24,
383 [UART_MSR] = 0x28,
384 [UART_SCR] = 0x2c
385 },
386 regmap_out[8] = {
387 [UART_TX] = 0x04,
388 [UART_IER] = 0x0c,
389 [UART_FCR] = 0x18,
390 [UART_LCR] = 0x1c,
391 [UART_MCR] = 0x20,
392 [UART_LSR] = 0x24,
393 [UART_MSR] = 0x28,
394 [UART_SCR] = 0x2c
395 };
396
397static unsigned int rm9k_serial_in(struct uart_port *p, int offset)
398{
399 offset = regmap_in[offset] << p->regshift;
400 return readl(p->membase + offset);
401}
402
403static void rm9k_serial_out(struct uart_port *p, int offset, int value)
404{
405 offset = regmap_out[offset] << p->regshift;
406 writel(value, p->membase + offset);
407}
408
409static int rm9k_serial_dl_read(struct uart_8250_port *up)
410{
411 return ((__raw_readl(up->port.membase + 0x10) << 8) |
412 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff;
413}
414
415static void rm9k_serial_dl_write(struct uart_8250_port *up, int value)
416{
417 __raw_writel(value, up->port.membase + 0x08);
418 __raw_writel(value >> 8, up->port.membase + 0x10);
419}
420
421#endif
422
423static unsigned int hub6_serial_in(struct uart_port *p, int offset) 366static unsigned int hub6_serial_in(struct uart_port *p, int offset)
424{ 367{
425 offset = offset << p->regshift; 368 offset = offset << p->regshift;
@@ -497,15 +440,6 @@ static void set_io_from_upio(struct uart_port *p)
497 p->serial_out = mem32_serial_out; 440 p->serial_out = mem32_serial_out;
498 break; 441 break;
499 442
500#ifdef CONFIG_SERIAL_8250_RM9K
501 case UPIO_RM9000:
502 p->serial_in = rm9k_serial_in;
503 p->serial_out = rm9k_serial_out;
504 up->dl_read = rm9k_serial_dl_read;
505 up->dl_write = rm9k_serial_dl_write;
506 break;
507#endif
508
509#ifdef CONFIG_MIPS_ALCHEMY 443#ifdef CONFIG_MIPS_ALCHEMY
510 case UPIO_AU: 444 case UPIO_AU:
511 p->serial_in = au_serial_in; 445 p->serial_in = au_serial_in;
@@ -1341,7 +1275,9 @@ static void serial8250_start_tx(struct uart_port *port)
1341 struct uart_8250_port *up = 1275 struct uart_8250_port *up =
1342 container_of(port, struct uart_8250_port, port); 1276 container_of(port, struct uart_8250_port, port);
1343 1277
1344 if (!(up->ier & UART_IER_THRI)) { 1278 if (up->dma && !serial8250_tx_dma(up)) {
1279 return;
1280 } else if (!(up->ier & UART_IER_THRI)) {
1345 up->ier |= UART_IER_THRI; 1281 up->ier |= UART_IER_THRI;
1346 serial_port_out(port, UART_IER, up->ier); 1282 serial_port_out(port, UART_IER, up->ier);
1347 1283
@@ -1349,9 +1285,7 @@ static void serial8250_start_tx(struct uart_port *port)
1349 unsigned char lsr; 1285 unsigned char lsr;
1350 lsr = serial_in(up, UART_LSR); 1286 lsr = serial_in(up, UART_LSR);
1351 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; 1287 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
1352 if ((port->type == PORT_RM9000) ? 1288 if (lsr & UART_LSR_TEMT)
1353 (lsr & UART_LSR_THRE) :
1354 (lsr & UART_LSR_TEMT))
1355 serial8250_tx_chars(up); 1289 serial8250_tx_chars(up);
1356 } 1290 }
1357 } 1291 }
@@ -1397,7 +1331,6 @@ unsigned char
1397serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr) 1331serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
1398{ 1332{
1399 struct uart_port *port = &up->port; 1333 struct uart_port *port = &up->port;
1400 struct tty_struct *tty = port->state->port.tty;
1401 unsigned char ch; 1334 unsigned char ch;
1402 int max_count = 256; 1335 int max_count = 256;
1403 char flag; 1336 char flag;
@@ -1462,7 +1395,7 @@ ignore_char:
1462 lsr = serial_in(up, UART_LSR); 1395 lsr = serial_in(up, UART_LSR);
1463 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0)); 1396 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
1464 spin_unlock(&port->lock); 1397 spin_unlock(&port->lock);
1465 tty_flip_buffer_push(tty); 1398 tty_flip_buffer_push(&port->state->port);
1466 spin_lock(&port->lock); 1399 spin_lock(&port->lock);
1467 return lsr; 1400 return lsr;
1468} 1401}
@@ -1547,6 +1480,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
1547 unsigned long flags; 1480 unsigned long flags;
1548 struct uart_8250_port *up = 1481 struct uart_8250_port *up =
1549 container_of(port, struct uart_8250_port, port); 1482 container_of(port, struct uart_8250_port, port);
1483 int dma_err = 0;
1550 1484
1551 if (iir & UART_IIR_NO_INT) 1485 if (iir & UART_IIR_NO_INT)
1552 return 0; 1486 return 0;
@@ -1557,8 +1491,13 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
1557 1491
1558 DEBUG_INTR("status = %x...", status); 1492 DEBUG_INTR("status = %x...", status);
1559 1493
1560 if (status & (UART_LSR_DR | UART_LSR_BI)) 1494 if (status & (UART_LSR_DR | UART_LSR_BI)) {
1561 status = serial8250_rx_chars(up, status); 1495 if (up->dma)
1496 dma_err = serial8250_rx_dma(up, iir);
1497
1498 if (!up->dma || dma_err)
1499 status = serial8250_rx_chars(up, status);
1500 }
1562 serial8250_modem_status(up); 1501 serial8250_modem_status(up);
1563 if (status & UART_LSR_THRE) 1502 if (status & UART_LSR_THRE)
1564 serial8250_tx_chars(up); 1503 serial8250_tx_chars(up);
@@ -1991,9 +1930,12 @@ static int serial8250_startup(struct uart_port *port)
1991 if (port->type == PORT_8250_CIR) 1930 if (port->type == PORT_8250_CIR)
1992 return -ENODEV; 1931 return -ENODEV;
1993 1932
1994 port->fifosize = uart_config[up->port.type].fifo_size; 1933 if (!port->fifosize)
1995 up->tx_loadsz = uart_config[up->port.type].tx_loadsz; 1934 port->fifosize = uart_config[port->type].fifo_size;
1996 up->capabilities = uart_config[up->port.type].flags; 1935 if (!up->tx_loadsz)
1936 up->tx_loadsz = uart_config[port->type].tx_loadsz;
1937 if (!up->capabilities)
1938 up->capabilities = uart_config[port->type].flags;
1997 up->mcr = 0; 1939 up->mcr = 0;
1998 1940
1999 if (port->iotype != up->cur_iotype) 1941 if (port->iotype != up->cur_iotype)
@@ -2198,6 +2140,18 @@ dont_test_tx_en:
2198 up->msr_saved_flags = 0; 2140 up->msr_saved_flags = 0;
2199 2141
2200 /* 2142 /*
2143 * Request DMA channels for both RX and TX.
2144 */
2145 if (up->dma) {
2146 retval = serial8250_request_dma(up);
2147 if (retval) {
2148 pr_warn_ratelimited("ttyS%d - failed to request DMA\n",
2149 serial_index(port));
2150 up->dma = NULL;
2151 }
2152 }
2153
2154 /*
2201 * Finally, enable interrupts. Note: Modem status interrupts 2155 * Finally, enable interrupts. Note: Modem status interrupts
2202 * are set via set_termios(), which will be occurring imminently 2156 * are set via set_termios(), which will be occurring imminently
2203 * anyway, so we don't enable them here. 2157 * anyway, so we don't enable them here.
@@ -2230,6 +2184,9 @@ static void serial8250_shutdown(struct uart_port *port)
2230 up->ier = 0; 2184 up->ier = 0;
2231 serial_port_out(port, UART_IER, 0); 2185 serial_port_out(port, UART_IER, 0);
2232 2186
2187 if (up->dma)
2188 serial8250_release_dma(up);
2189
2233 spin_lock_irqsave(&port->lock, flags); 2190 spin_lock_irqsave(&port->lock, flags);
2234 if (port->flags & UPF_FOURPORT) { 2191 if (port->flags & UPF_FOURPORT) {
2235 /* reset interrupts on the AST Fourport board */ 2192 /* reset interrupts on the AST Fourport board */
@@ -2826,9 +2783,12 @@ static void
2826serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type) 2783serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2827{ 2784{
2828 up->port.type = type; 2785 up->port.type = type;
2829 up->port.fifosize = uart_config[type].fifo_size; 2786 if (!up->port.fifosize)
2830 up->capabilities = uart_config[type].flags; 2787 up->port.fifosize = uart_config[type].fifo_size;
2831 up->tx_loadsz = uart_config[type].tx_loadsz; 2788 if (!up->tx_loadsz)
2789 up->tx_loadsz = uart_config[type].tx_loadsz;
2790 if (!up->capabilities)
2791 up->capabilities = uart_config[type].flags;
2832} 2792}
2833 2793
2834static void __init 2794static void __init
@@ -3262,6 +3222,10 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
3262 uart->bugs = up->bugs; 3222 uart->bugs = up->bugs;
3263 uart->port.mapbase = up->port.mapbase; 3223 uart->port.mapbase = up->port.mapbase;
3264 uart->port.private_data = up->port.private_data; 3224 uart->port.private_data = up->port.private_data;
3225 uart->port.fifosize = up->port.fifosize;
3226 uart->tx_loadsz = up->tx_loadsz;
3227 uart->capabilities = up->capabilities;
3228
3265 if (up->port.dev) 3229 if (up->port.dev)
3266 uart->port.dev = up->port.dev; 3230 uart->port.dev = up->port.dev;
3267 3231
@@ -3287,6 +3251,8 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
3287 uart->dl_read = up->dl_read; 3251 uart->dl_read = up->dl_read;
3288 if (up->dl_write) 3252 if (up->dl_write)
3289 uart->dl_write = up->dl_write; 3253 uart->dl_write = up->dl_write;
3254 if (up->dma)
3255 uart->dma = up->dma;
3290 3256
3291 if (serial8250_isa_config != NULL) 3257 if (serial8250_isa_config != NULL)
3292 serial8250_isa_config(0, &uart->port, 3258 serial8250_isa_config(0, &uart->port,
diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h
index 12caa1292b75..34eb676916fe 100644
--- a/drivers/tty/serial/8250/8250.h
+++ b/drivers/tty/serial/8250/8250.h
@@ -12,6 +12,35 @@
12 */ 12 */
13 13
14#include <linux/serial_8250.h> 14#include <linux/serial_8250.h>
15#include <linux/dmaengine.h>
16
17struct uart_8250_dma {
18 dma_filter_fn fn;
19 void *rx_param;
20 void *tx_param;
21
22 int rx_chan_id;
23 int tx_chan_id;
24
25 struct dma_slave_config rxconf;
26 struct dma_slave_config txconf;
27
28 struct dma_chan *rxchan;
29 struct dma_chan *txchan;
30
31 dma_addr_t rx_addr;
32 dma_addr_t tx_addr;
33
34 dma_cookie_t rx_cookie;
35 dma_cookie_t tx_cookie;
36
37 void *rx_buf;
38
39 size_t rx_size;
40 size_t tx_size;
41
42 unsigned char tx_running:1;
43};
15 44
16struct old_serial_port { 45struct old_serial_port {
17 unsigned int uart; 46 unsigned int uart;
@@ -143,3 +172,24 @@ static inline int is_omap1510_8250(struct uart_8250_port *pt)
143 return 0; 172 return 0;
144} 173}
145#endif 174#endif
175
176#ifdef CONFIG_SERIAL_8250_DMA
177extern int serial8250_tx_dma(struct uart_8250_port *);
178extern int serial8250_rx_dma(struct uart_8250_port *, unsigned int iir);
179extern int serial8250_request_dma(struct uart_8250_port *);
180extern void serial8250_release_dma(struct uart_8250_port *);
181#else
182static inline int serial8250_tx_dma(struct uart_8250_port *p)
183{
184 return -1;
185}
186static inline int serial8250_rx_dma(struct uart_8250_port *p, unsigned int iir)
187{
188 return -1;
189}
190static inline int serial8250_request_dma(struct uart_8250_port *p)
191{
192 return -1;
193}
194static inline void serial8250_release_dma(struct uart_8250_port *p) { }
195#endif
diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c
new file mode 100644
index 000000000000..b9f7fd28112e
--- /dev/null
+++ b/drivers/tty/serial/8250/8250_dma.c
@@ -0,0 +1,216 @@
1/*
2 * 8250_dma.c - DMA Engine API support for 8250.c
3 *
4 * Copyright (C) 2013 Intel Corporation
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11#include <linux/tty.h>
12#include <linux/tty_flip.h>
13#include <linux/serial_reg.h>
14#include <linux/dma-mapping.h>
15
16#include "8250.h"
17
18static void __dma_tx_complete(void *param)
19{
20 struct uart_8250_port *p = param;
21 struct uart_8250_dma *dma = p->dma;
22 struct circ_buf *xmit = &p->port.state->xmit;
23
24 dma->tx_running = 0;
25
26 dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr,
27 UART_XMIT_SIZE, DMA_TO_DEVICE);
28
29 xmit->tail += dma->tx_size;
30 xmit->tail &= UART_XMIT_SIZE - 1;
31 p->port.icount.tx += dma->tx_size;
32
33 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
34 uart_write_wakeup(&p->port);
35
36 if (!uart_circ_empty(xmit) && !uart_tx_stopped(&p->port)) {
37 serial8250_tx_dma(p);
38 uart_write_wakeup(&p->port);
39 }
40}
41
42static void __dma_rx_complete(void *param)
43{
44 struct uart_8250_port *p = param;
45 struct uart_8250_dma *dma = p->dma;
46 struct tty_port *tty_port = &p->port.state->port;
47 struct dma_tx_state state;
48 int count;
49
50 dma_sync_single_for_cpu(dma->rxchan->device->dev, dma->rx_addr,
51 dma->rx_size, DMA_FROM_DEVICE);
52
53 dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
54 dmaengine_terminate_all(dma->rxchan);
55
56 count = dma->rx_size - state.residue;
57
58 tty_insert_flip_string(tty_port, dma->rx_buf, count);
59 p->port.icount.rx += count;
60
61 tty_flip_buffer_push(tty_port);
62}
63
64int serial8250_tx_dma(struct uart_8250_port *p)
65{
66 struct uart_8250_dma *dma = p->dma;
67 struct circ_buf *xmit = &p->port.state->xmit;
68 struct dma_async_tx_descriptor *desc;
69
70 if (dma->tx_running)
71 return -EBUSY;
72
73 dma->tx_size = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
74 if (!dma->tx_size)
75 return -EINVAL;
76
77 desc = dmaengine_prep_slave_single(dma->txchan,
78 dma->tx_addr + xmit->tail,
79 dma->tx_size, DMA_MEM_TO_DEV,
80 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
81 if (!desc)
82 return -EBUSY;
83
84 dma->tx_running = 1;
85
86 desc->callback = __dma_tx_complete;
87 desc->callback_param = p;
88
89 dma->tx_cookie = dmaengine_submit(desc);
90
91 dma_sync_single_for_device(dma->txchan->device->dev, dma->tx_addr,
92 UART_XMIT_SIZE, DMA_TO_DEVICE);
93
94 dma_async_issue_pending(dma->txchan);
95
96 return 0;
97}
98EXPORT_SYMBOL_GPL(serial8250_tx_dma);
99
100int serial8250_rx_dma(struct uart_8250_port *p, unsigned int iir)
101{
102 struct uart_8250_dma *dma = p->dma;
103 struct dma_async_tx_descriptor *desc;
104 struct dma_tx_state state;
105 int dma_status;
106
107 /*
108 * If RCVR FIFO trigger level was not reached, complete the transfer and
109 * let 8250.c copy the remaining data.
110 */
111 if ((iir & 0x3f) == UART_IIR_RX_TIMEOUT) {
112 dma_status = dmaengine_tx_status(dma->rxchan, dma->rx_cookie,
113 &state);
114 if (dma_status == DMA_IN_PROGRESS) {
115 dmaengine_pause(dma->rxchan);
116 __dma_rx_complete(p);
117 }
118 return -ETIMEDOUT;
119 }
120
121 desc = dmaengine_prep_slave_single(dma->rxchan, dma->rx_addr,
122 dma->rx_size, DMA_DEV_TO_MEM,
123 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
124 if (!desc)
125 return -EBUSY;
126
127 desc->callback = __dma_rx_complete;
128 desc->callback_param = p;
129
130 dma->rx_cookie = dmaengine_submit(desc);
131
132 dma_sync_single_for_device(dma->rxchan->device->dev, dma->rx_addr,
133 dma->rx_size, DMA_FROM_DEVICE);
134
135 dma_async_issue_pending(dma->rxchan);
136
137 return 0;
138}
139EXPORT_SYMBOL_GPL(serial8250_rx_dma);
140
141int serial8250_request_dma(struct uart_8250_port *p)
142{
143 struct uart_8250_dma *dma = p->dma;
144 dma_cap_mask_t mask;
145
146 dma->rxconf.src_addr = p->port.mapbase + UART_RX;
147 dma->txconf.dst_addr = p->port.mapbase + UART_TX;
148
149 dma_cap_zero(mask);
150 dma_cap_set(DMA_SLAVE, mask);
151
152 /* Get a channel for RX */
153 dma->rxchan = dma_request_channel(mask, dma->fn, dma->rx_param);
154 if (!dma->rxchan)
155 return -ENODEV;
156
157 dmaengine_slave_config(dma->rxchan, &dma->rxconf);
158
159 /* Get a channel for TX */
160 dma->txchan = dma_request_channel(mask, dma->fn, dma->tx_param);
161 if (!dma->txchan) {
162 dma_release_channel(dma->rxchan);
163 return -ENODEV;
164 }
165
166 dmaengine_slave_config(dma->txchan, &dma->txconf);
167
168 /* RX buffer */
169 if (!dma->rx_size)
170 dma->rx_size = PAGE_SIZE;
171
172 dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size,
173 &dma->rx_addr, GFP_KERNEL);
174 if (!dma->rx_buf) {
175 dma_release_channel(dma->rxchan);
176 dma_release_channel(dma->txchan);
177 return -ENOMEM;
178 }
179
180 /* TX buffer */
181 dma->tx_addr = dma_map_single(dma->txchan->device->dev,
182 p->port.state->xmit.buf,
183 UART_XMIT_SIZE,
184 DMA_TO_DEVICE);
185
186 dev_dbg_ratelimited(p->port.dev, "got both dma channels\n");
187
188 return 0;
189}
190EXPORT_SYMBOL_GPL(serial8250_request_dma);
191
192void serial8250_release_dma(struct uart_8250_port *p)
193{
194 struct uart_8250_dma *dma = p->dma;
195
196 if (!dma)
197 return;
198
199 /* Release RX resources */
200 dmaengine_terminate_all(dma->rxchan);
201 dma_free_coherent(dma->rxchan->device->dev, dma->rx_size, dma->rx_buf,
202 dma->rx_addr);
203 dma_release_channel(dma->rxchan);
204 dma->rxchan = NULL;
205
206 /* Release TX resources */
207 dmaengine_terminate_all(dma->txchan);
208 dma_unmap_single(dma->txchan->device->dev, dma->tx_addr,
209 UART_XMIT_SIZE, DMA_TO_DEVICE);
210 dma_release_channel(dma->txchan);
211 dma->txchan = NULL;
212 dma->tx_running = 0;
213
214 dev_dbg_ratelimited(p->port.dev, "dma channels released\n");
215}
216EXPORT_SYMBOL_GPL(serial8250_release_dma);
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index 096d2ef48b32..db0e66f6dd0e 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -2,6 +2,7 @@
2 * Synopsys DesignWare 8250 driver. 2 * Synopsys DesignWare 8250 driver.
3 * 3 *
4 * Copyright 2011 Picochip, Jamie Iles. 4 * Copyright 2011 Picochip, Jamie Iles.
5 * Copyright 2013 Intel Corporation
5 * 6 *
6 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by 8 * it under the terms of the GNU General Public License as published by
@@ -24,6 +25,34 @@
24#include <linux/of_platform.h> 25#include <linux/of_platform.h>
25#include <linux/platform_device.h> 26#include <linux/platform_device.h>
26#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/acpi.h>
29
30#include "8250.h"
31
32/* Offsets for the DesignWare specific registers */
33#define DW_UART_USR 0x1f /* UART Status Register */
34#define DW_UART_CPR 0xf4 /* Component Parameter Register */
35#define DW_UART_UCV 0xf8 /* UART Component Version */
36
37/* Intel Low Power Subsystem specific */
38#define LPSS_PRV_CLOCK_PARAMS 0x800
39
40/* Component Parameter Register bits */
41#define DW_UART_CPR_ABP_DATA_WIDTH (3 << 0)
42#define DW_UART_CPR_AFCE_MODE (1 << 4)
43#define DW_UART_CPR_THRE_MODE (1 << 5)
44#define DW_UART_CPR_SIR_MODE (1 << 6)
45#define DW_UART_CPR_SIR_LP_MODE (1 << 7)
46#define DW_UART_CPR_ADDITIONAL_FEATURES (1 << 8)
47#define DW_UART_CPR_FIFO_ACCESS (1 << 9)
48#define DW_UART_CPR_FIFO_STAT (1 << 10)
49#define DW_UART_CPR_SHADOW (1 << 11)
50#define DW_UART_CPR_ENCODED_PARMS (1 << 12)
51#define DW_UART_CPR_DMA_EXTRA (1 << 13)
52#define DW_UART_CPR_FIFO_MODE (0xff << 16)
53/* Helper for fifo size calculation */
54#define DW_UART_CPR_FIFO_SIZE(a) (((a >> 16) & 0xff) * 16)
55
27 56
28struct dw8250_data { 57struct dw8250_data {
29 int last_lcr; 58 int last_lcr;
@@ -66,9 +95,6 @@ static unsigned int dw8250_serial_in32(struct uart_port *p, int offset)
66 return readl(p->membase + offset); 95 return readl(p->membase + offset);
67} 96}
68 97
69/* Offset for the DesignWare's UART Status Register. */
70#define UART_USR 0x1f
71
72static int dw8250_handle_irq(struct uart_port *p) 98static int dw8250_handle_irq(struct uart_port *p)
73{ 99{
74 struct dw8250_data *d = p->private_data; 100 struct dw8250_data *d = p->private_data;
@@ -78,7 +104,7 @@ static int dw8250_handle_irq(struct uart_port *p)
78 return 1; 104 return 1;
79 } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) { 105 } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
80 /* Clear the USR and write the LCR again. */ 106 /* Clear the USR and write the LCR again. */
81 (void)p->serial_in(p, UART_USR); 107 (void)p->serial_in(p, DW_UART_USR);
82 p->serial_out(p, UART_LCR, d->last_lcr); 108 p->serial_out(p, UART_LCR, d->last_lcr);
83 109
84 return 1; 110 return 1;
@@ -87,61 +113,210 @@ static int dw8250_handle_irq(struct uart_port *p)
87 return 0; 113 return 0;
88} 114}
89 115
116static int dw8250_probe_of(struct uart_port *p)
117{
118 struct device_node *np = p->dev->of_node;
119 u32 val;
120
121 if (!of_property_read_u32(np, "reg-io-width", &val)) {
122 switch (val) {
123 case 1:
124 break;
125 case 4:
126 p->iotype = UPIO_MEM32;
127 p->serial_in = dw8250_serial_in32;
128 p->serial_out = dw8250_serial_out32;
129 break;
130 default:
131 dev_err(p->dev, "unsupported reg-io-width (%u)\n", val);
132 return -EINVAL;
133 }
134 }
135
136 if (!of_property_read_u32(np, "reg-shift", &val))
137 p->regshift = val;
138
139 if (of_property_read_u32(np, "clock-frequency", &val)) {
140 dev_err(p->dev, "no clock-frequency property set\n");
141 return -EINVAL;
142 }
143 p->uartclk = val;
144
145 return 0;
146}
147
148#ifdef CONFIG_ACPI
149static bool dw8250_acpi_dma_filter(struct dma_chan *chan, void *parm)
150{
151 return chan->chan_id == *(int *)parm;
152}
153
154static acpi_status
155dw8250_acpi_walk_resource(struct acpi_resource *res, void *data)
156{
157 struct uart_port *p = data;
158 struct uart_8250_port *port;
159 struct uart_8250_dma *dma;
160 struct acpi_resource_fixed_dma *fixed_dma;
161 struct dma_slave_config *slave;
162
163 port = container_of(p, struct uart_8250_port, port);
164
165 switch (res->type) {
166 case ACPI_RESOURCE_TYPE_FIXED_DMA:
167 fixed_dma = &res->data.fixed_dma;
168
169 /* TX comes first */
170 if (!port->dma) {
171 dma = devm_kzalloc(p->dev, sizeof(*dma), GFP_KERNEL);
172 if (!dma)
173 return AE_NO_MEMORY;
174
175 port->dma = dma;
176 slave = &dma->txconf;
177
178 slave->direction = DMA_MEM_TO_DEV;
179 slave->dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
180 slave->slave_id = fixed_dma->request_lines;
181 slave->dst_maxburst = port->tx_loadsz / 4;
182
183 dma->tx_chan_id = fixed_dma->channels;
184 dma->tx_param = &dma->tx_chan_id;
185 dma->fn = dw8250_acpi_dma_filter;
186 } else {
187 dma = port->dma;
188 slave = &dma->rxconf;
189
190 slave->direction = DMA_DEV_TO_MEM;
191 slave->src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
192 slave->slave_id = fixed_dma->request_lines;
193 slave->src_maxburst = p->fifosize / 4;
194
195 dma->rx_chan_id = fixed_dma->channels;
196 dma->rx_param = &dma->rx_chan_id;
197 }
198
199 break;
200 }
201
202 return AE_OK;
203}
204
205static int dw8250_probe_acpi(struct uart_port *p)
206{
207 const struct acpi_device_id *id;
208 acpi_status status;
209 u32 reg;
210
211 id = acpi_match_device(p->dev->driver->acpi_match_table, p->dev);
212 if (!id)
213 return -ENODEV;
214
215 p->iotype = UPIO_MEM32;
216 p->serial_in = dw8250_serial_in32;
217 p->serial_out = dw8250_serial_out32;
218 p->regshift = 2;
219 p->uartclk = (unsigned int)id->driver_data;
220
221 status = acpi_walk_resources(ACPI_HANDLE(p->dev), METHOD_NAME__CRS,
222 dw8250_acpi_walk_resource, p);
223 if (ACPI_FAILURE(status)) {
224 dev_err_ratelimited(p->dev, "%s failed \"%s\"\n", __func__,
225 acpi_format_exception(status));
226 return -ENODEV;
227 }
228
229 /* Fix Haswell issue where the clocks do not get enabled */
230 if (!strcmp(id->id, "INT33C4") || !strcmp(id->id, "INT33C5")) {
231 reg = readl(p->membase + LPSS_PRV_CLOCK_PARAMS);
232 writel(reg | 1, p->membase + LPSS_PRV_CLOCK_PARAMS);
233 }
234
235 return 0;
236}
237#else
238static inline int dw8250_probe_acpi(struct uart_port *p)
239{
240 return -ENODEV;
241}
242#endif /* CONFIG_ACPI */
243
244static void dw8250_setup_port(struct uart_8250_port *up)
245{
246 struct uart_port *p = &up->port;
247 u32 reg = readl(p->membase + DW_UART_UCV);
248
249 /*
250 * If the Component Version Register returns zero, we know that
251 * ADDITIONAL_FEATURES are not enabled. No need to go any further.
252 */
253 if (!reg)
254 return;
255
256 dev_dbg_ratelimited(p->dev, "Designware UART version %c.%c%c\n",
257 (reg >> 24) & 0xff, (reg >> 16) & 0xff, (reg >> 8) & 0xff);
258
259 reg = readl(p->membase + DW_UART_CPR);
260 if (!reg)
261 return;
262
263 /* Select the type based on fifo */
264 if (reg & DW_UART_CPR_FIFO_MODE) {
265 p->type = PORT_16550A;
266 p->flags |= UPF_FIXED_TYPE;
267 p->fifosize = DW_UART_CPR_FIFO_SIZE(reg);
268 up->tx_loadsz = p->fifosize;
269 }
270}
271
90static int dw8250_probe(struct platform_device *pdev) 272static int dw8250_probe(struct platform_device *pdev)
91{ 273{
92 struct uart_8250_port uart = {}; 274 struct uart_8250_port uart = {};
93 struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 275 struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
94 struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 276 struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
95 struct device_node *np = pdev->dev.of_node;
96 u32 val;
97 struct dw8250_data *data; 277 struct dw8250_data *data;
278 int err;
98 279
99 if (!regs || !irq) { 280 if (!regs || !irq) {
100 dev_err(&pdev->dev, "no registers/irq defined\n"); 281 dev_err(&pdev->dev, "no registers/irq defined\n");
101 return -EINVAL; 282 return -EINVAL;
102 } 283 }
103 284
104 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
105 if (!data)
106 return -ENOMEM;
107 uart.port.private_data = data;
108
109 spin_lock_init(&uart.port.lock); 285 spin_lock_init(&uart.port.lock);
110 uart.port.mapbase = regs->start; 286 uart.port.mapbase = regs->start;
111 uart.port.irq = irq->start; 287 uart.port.irq = irq->start;
112 uart.port.handle_irq = dw8250_handle_irq; 288 uart.port.handle_irq = dw8250_handle_irq;
113 uart.port.type = PORT_8250; 289 uart.port.type = PORT_8250;
114 uart.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP | 290 uart.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
115 UPF_FIXED_PORT | UPF_FIXED_TYPE;
116 uart.port.dev = &pdev->dev; 291 uart.port.dev = &pdev->dev;
117 292
293 uart.port.membase = ioremap(regs->start, resource_size(regs));
294 if (!uart.port.membase)
295 return -ENOMEM;
296
118 uart.port.iotype = UPIO_MEM; 297 uart.port.iotype = UPIO_MEM;
119 uart.port.serial_in = dw8250_serial_in; 298 uart.port.serial_in = dw8250_serial_in;
120 uart.port.serial_out = dw8250_serial_out; 299 uart.port.serial_out = dw8250_serial_out;
121 if (!of_property_read_u32(np, "reg-io-width", &val)) { 300
122 switch (val) { 301 dw8250_setup_port(&uart);
123 case 1: 302
124 break; 303 if (pdev->dev.of_node) {
125 case 4: 304 err = dw8250_probe_of(&uart.port);
126 uart.port.iotype = UPIO_MEM32; 305 if (err)
127 uart.port.serial_in = dw8250_serial_in32; 306 return err;
128 uart.port.serial_out = dw8250_serial_out32; 307 } else if (ACPI_HANDLE(&pdev->dev)) {
129 break; 308 err = dw8250_probe_acpi(&uart.port);
130 default: 309 if (err)
131 dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n", 310 return err;
132 val); 311 } else {
133 return -EINVAL; 312 return -ENODEV;
134 }
135 } 313 }
136 314
137 if (!of_property_read_u32(np, "reg-shift", &val)) 315 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
138 uart.port.regshift = val; 316 if (!data)
317 return -ENOMEM;
139 318
140 if (of_property_read_u32(np, "clock-frequency", &val)) { 319 uart.port.private_data = data;
141 dev_err(&pdev->dev, "no clock-frequency property set\n");
142 return -EINVAL;
143 }
144 uart.port.uartclk = val;
145 320
146 data->line = serial8250_register_8250_port(&uart); 321 data->line = serial8250_register_8250_port(&uart);
147 if (data->line < 0) 322 if (data->line < 0)
@@ -184,17 +359,25 @@ static int dw8250_resume(struct platform_device *pdev)
184#define dw8250_resume NULL 359#define dw8250_resume NULL
185#endif /* CONFIG_PM */ 360#endif /* CONFIG_PM */
186 361
187static const struct of_device_id dw8250_match[] = { 362static const struct of_device_id dw8250_of_match[] = {
188 { .compatible = "snps,dw-apb-uart" }, 363 { .compatible = "snps,dw-apb-uart" },
189 { /* Sentinel */ } 364 { /* Sentinel */ }
190}; 365};
191MODULE_DEVICE_TABLE(of, dw8250_match); 366MODULE_DEVICE_TABLE(of, dw8250_of_match);
367
368static const struct acpi_device_id dw8250_acpi_match[] = {
369 { "INT33C4", 100000000 },
370 { "INT33C5", 100000000 },
371 { },
372};
373MODULE_DEVICE_TABLE(acpi, dw8250_acpi_match);
192 374
193static struct platform_driver dw8250_platform_driver = { 375static struct platform_driver dw8250_platform_driver = {
194 .driver = { 376 .driver = {
195 .name = "dw-apb-uart", 377 .name = "dw-apb-uart",
196 .owner = THIS_MODULE, 378 .owner = THIS_MODULE,
197 .of_match_table = dw8250_match, 379 .of_match_table = dw8250_of_match,
380 .acpi_match_table = ACPI_PTR(dw8250_acpi_match),
198 }, 381 },
199 .probe = dw8250_probe, 382 .probe = dw8250_probe,
200 .remove = dw8250_remove, 383 .remove = dw8250_remove,
diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c
index f53a7db4350d..721904f8efa9 100644
--- a/drivers/tty/serial/8250/8250_early.c
+++ b/drivers/tty/serial/8250/8250_early.c
@@ -194,7 +194,7 @@ static int __init parse_options(struct early_serial8250_device *device,
194 options++; 194 options++;
195 device->baud = simple_strtoul(options, NULL, 0); 195 device->baud = simple_strtoul(options, NULL, 0);
196 length = min(strcspn(options, " "), sizeof(device->options)); 196 length = min(strcspn(options, " "), sizeof(device->options));
197 strncpy(device->options, options, length); 197 strlcpy(device->options, options, length);
198 } else { 198 } else {
199 device->baud = probe_baud(port); 199 device->baud = probe_baud(port);
200 snprintf(device->options, sizeof(device->options), "%u", 200 snprintf(device->options, sizeof(device->options), "%u",
diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
index a27a98e1b066..3cb333242912 100644
--- a/drivers/tty/serial/8250/8250_pci.c
+++ b/drivers/tty/serial/8250/8250_pci.c
@@ -1040,6 +1040,253 @@ static int pci_asix_setup(struct serial_private *priv,
1040 return pci_default_setup(priv, board, port, idx); 1040 return pci_default_setup(priv, board, port, idx);
1041} 1041}
1042 1042
1043/* Quatech devices have their own extra interface features */
1044
1045struct quatech_feature {
1046 u16 devid;
1047 bool amcc;
1048};
1049
1050#define QPCR_TEST_FOR1 0x3F
1051#define QPCR_TEST_GET1 0x00
1052#define QPCR_TEST_FOR2 0x40
1053#define QPCR_TEST_GET2 0x40
1054#define QPCR_TEST_FOR3 0x80
1055#define QPCR_TEST_GET3 0x40
1056#define QPCR_TEST_FOR4 0xC0
1057#define QPCR_TEST_GET4 0x80
1058
1059#define QOPR_CLOCK_X1 0x0000
1060#define QOPR_CLOCK_X2 0x0001
1061#define QOPR_CLOCK_X4 0x0002
1062#define QOPR_CLOCK_X8 0x0003
1063#define QOPR_CLOCK_RATE_MASK 0x0003
1064
1065
1066static struct quatech_feature quatech_cards[] = {
1067 { PCI_DEVICE_ID_QUATECH_QSC100, 1 },
1068 { PCI_DEVICE_ID_QUATECH_DSC100, 1 },
1069 { PCI_DEVICE_ID_QUATECH_DSC100E, 0 },
1070 { PCI_DEVICE_ID_QUATECH_DSC200, 1 },
1071 { PCI_DEVICE_ID_QUATECH_DSC200E, 0 },
1072 { PCI_DEVICE_ID_QUATECH_ESC100D, 1 },
1073 { PCI_DEVICE_ID_QUATECH_ESC100M, 1 },
1074 { PCI_DEVICE_ID_QUATECH_QSCP100, 1 },
1075 { PCI_DEVICE_ID_QUATECH_DSCP100, 1 },
1076 { PCI_DEVICE_ID_QUATECH_QSCP200, 1 },
1077 { PCI_DEVICE_ID_QUATECH_DSCP200, 1 },
1078 { PCI_DEVICE_ID_QUATECH_ESCLP100, 0 },
1079 { PCI_DEVICE_ID_QUATECH_QSCLP100, 0 },
1080 { PCI_DEVICE_ID_QUATECH_DSCLP100, 0 },
1081 { PCI_DEVICE_ID_QUATECH_SSCLP100, 0 },
1082 { PCI_DEVICE_ID_QUATECH_QSCLP200, 0 },
1083 { PCI_DEVICE_ID_QUATECH_DSCLP200, 0 },
1084 { PCI_DEVICE_ID_QUATECH_SSCLP200, 0 },
1085 { PCI_DEVICE_ID_QUATECH_SPPXP_100, 0 },
1086 { 0, }
1087};
1088
1089static int pci_quatech_amcc(u16 devid)
1090{
1091 struct quatech_feature *qf = &quatech_cards[0];
1092 while (qf->devid) {
1093 if (qf->devid == devid)
1094 return qf->amcc;
1095 qf++;
1096 }
1097 pr_err("quatech: unknown port type '0x%04X'.\n", devid);
1098 return 0;
1099};
1100
1101static int pci_quatech_rqopr(struct uart_8250_port *port)
1102{
1103 unsigned long base = port->port.iobase;
1104 u8 LCR, val;
1105
1106 LCR = inb(base + UART_LCR);
1107 outb(0xBF, base + UART_LCR);
1108 val = inb(base + UART_SCR);
1109 outb(LCR, base + UART_LCR);
1110 return val;
1111}
1112
1113static void pci_quatech_wqopr(struct uart_8250_port *port, u8 qopr)
1114{
1115 unsigned long base = port->port.iobase;
1116 u8 LCR, val;
1117
1118 LCR = inb(base + UART_LCR);
1119 outb(0xBF, base + UART_LCR);
1120 val = inb(base + UART_SCR);
1121 outb(qopr, base + UART_SCR);
1122 outb(LCR, base + UART_LCR);
1123}
1124
1125static int pci_quatech_rqmcr(struct uart_8250_port *port)
1126{
1127 unsigned long base = port->port.iobase;
1128 u8 LCR, val, qmcr;
1129
1130 LCR = inb(base + UART_LCR);
1131 outb(0xBF, base + UART_LCR);
1132 val = inb(base + UART_SCR);
1133 outb(val | 0x10, base + UART_SCR);
1134 qmcr = inb(base + UART_MCR);
1135 outb(val, base + UART_SCR);
1136 outb(LCR, base + UART_LCR);
1137
1138 return qmcr;
1139}
1140
1141static void pci_quatech_wqmcr(struct uart_8250_port *port, u8 qmcr)
1142{
1143 unsigned long base = port->port.iobase;
1144 u8 LCR, val;
1145
1146 LCR = inb(base + UART_LCR);
1147 outb(0xBF, base + UART_LCR);
1148 val = inb(base + UART_SCR);
1149 outb(val | 0x10, base + UART_SCR);
1150 outb(qmcr, base + UART_MCR);
1151 outb(val, base + UART_SCR);
1152 outb(LCR, base + UART_LCR);
1153}
1154
1155static int pci_quatech_has_qmcr(struct uart_8250_port *port)
1156{
1157 unsigned long base = port->port.iobase;
1158 u8 LCR, val;
1159
1160 LCR = inb(base + UART_LCR);
1161 outb(0xBF, base + UART_LCR);
1162 val = inb(base + UART_SCR);
1163 if (val & 0x20) {
1164 outb(0x80, UART_LCR);
1165 if (!(inb(UART_SCR) & 0x20)) {
1166 outb(LCR, base + UART_LCR);
1167 return 1;
1168 }
1169 }
1170 return 0;
1171}
1172
1173static int pci_quatech_test(struct uart_8250_port *port)
1174{
1175 u8 reg;
1176 u8 qopr = pci_quatech_rqopr(port);
1177 pci_quatech_wqopr(port, qopr & QPCR_TEST_FOR1);
1178 reg = pci_quatech_rqopr(port) & 0xC0;
1179 if (reg != QPCR_TEST_GET1)
1180 return -EINVAL;
1181 pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR2);
1182 reg = pci_quatech_rqopr(port) & 0xC0;
1183 if (reg != QPCR_TEST_GET2)
1184 return -EINVAL;
1185 pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR3);
1186 reg = pci_quatech_rqopr(port) & 0xC0;
1187 if (reg != QPCR_TEST_GET3)
1188 return -EINVAL;
1189 pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR4);
1190 reg = pci_quatech_rqopr(port) & 0xC0;
1191 if (reg != QPCR_TEST_GET4)
1192 return -EINVAL;
1193
1194 pci_quatech_wqopr(port, qopr);
1195 return 0;
1196}
1197
1198static int pci_quatech_clock(struct uart_8250_port *port)
1199{
1200 u8 qopr, reg, set;
1201 unsigned long clock;
1202
1203 if (pci_quatech_test(port) < 0)
1204 return 1843200;
1205
1206 qopr = pci_quatech_rqopr(port);
1207
1208 pci_quatech_wqopr(port, qopr & ~QOPR_CLOCK_X8);
1209 reg = pci_quatech_rqopr(port);
1210 if (reg & QOPR_CLOCK_X8) {
1211 clock = 1843200;
1212 goto out;
1213 }
1214 pci_quatech_wqopr(port, qopr | QOPR_CLOCK_X8);
1215 reg = pci_quatech_rqopr(port);
1216 if (!(reg & QOPR_CLOCK_X8)) {
1217 clock = 1843200;
1218 goto out;
1219 }
1220 reg &= QOPR_CLOCK_X8;
1221 if (reg == QOPR_CLOCK_X2) {
1222 clock = 3685400;
1223 set = QOPR_CLOCK_X2;
1224 } else if (reg == QOPR_CLOCK_X4) {
1225 clock = 7372800;
1226 set = QOPR_CLOCK_X4;
1227 } else if (reg == QOPR_CLOCK_X8) {
1228 clock = 14745600;
1229 set = QOPR_CLOCK_X8;
1230 } else {
1231 clock = 1843200;
1232 set = QOPR_CLOCK_X1;
1233 }
1234 qopr &= ~QOPR_CLOCK_RATE_MASK;
1235 qopr |= set;
1236
1237out:
1238 pci_quatech_wqopr(port, qopr);
1239 return clock;
1240}
1241
1242static int pci_quatech_rs422(struct uart_8250_port *port)
1243{
1244 u8 qmcr;
1245 int rs422 = 0;
1246
1247 if (!pci_quatech_has_qmcr(port))
1248 return 0;
1249 qmcr = pci_quatech_rqmcr(port);
1250 pci_quatech_wqmcr(port, 0xFF);
1251 if (pci_quatech_rqmcr(port))
1252 rs422 = 1;
1253 pci_quatech_wqmcr(port, qmcr);
1254 return rs422;
1255}
1256
1257static int pci_quatech_init(struct pci_dev *dev)
1258{
1259 if (pci_quatech_amcc(dev->device)) {
1260 unsigned long base = pci_resource_start(dev, 0);
1261 if (base) {
1262 u32 tmp;
1263 outl(inl(base + 0x38), base + 0x38);
1264 tmp = inl(base + 0x3c);
1265 outl(tmp | 0x01000000, base + 0x3c);
1266 outl(tmp, base + 0x3c);
1267 }
1268 }
1269 return 0;
1270}
1271
1272static int pci_quatech_setup(struct serial_private *priv,
1273 const struct pciserial_board *board,
1274 struct uart_8250_port *port, int idx)
1275{
1276 /* Needed by pci_quatech calls below */
1277 port->port.iobase = pci_resource_start(priv->dev, FL_GET_BASE(board->flags));
1278 /* Set up the clocking */
1279 port->port.uartclk = pci_quatech_clock(port);
1280 /* For now just warn about RS422 */
1281 if (pci_quatech_rs422(port))
1282 pr_warn("quatech: software control of RS422 features not currently supported.\n");
1283 return pci_default_setup(priv, board, port, idx);
1284}
1285
1286static void pci_quatech_exit(struct pci_dev *dev)
1287{
1288}
1289
1043static int pci_default_setup(struct serial_private *priv, 1290static int pci_default_setup(struct serial_private *priv,
1044 const struct pciserial_board *board, 1291 const struct pciserial_board *board,
1045 struct uart_8250_port *port, int idx) 1292 struct uart_8250_port *port, int idx)
@@ -1541,6 +1788,16 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
1541 .setup = pci_ni8430_setup, 1788 .setup = pci_ni8430_setup,
1542 .exit = pci_ni8430_exit, 1789 .exit = pci_ni8430_exit,
1543 }, 1790 },
1791 /* Quatech */
1792 {
1793 .vendor = PCI_VENDOR_ID_QUATECH,
1794 .device = PCI_ANY_ID,
1795 .subvendor = PCI_ANY_ID,
1796 .subdevice = PCI_ANY_ID,
1797 .init = pci_quatech_init,
1798 .setup = pci_quatech_setup,
1799 .exit = pci_quatech_exit,
1800 },
1544 /* 1801 /*
1545 * Panacom 1802 * Panacom
1546 */ 1803 */
@@ -3506,18 +3763,70 @@ static struct pci_device_id serial_pci_tbl[] = {
3506 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_ROMULUS, 3763 { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_ROMULUS,
3507 0x10b5, 0x106a, 0, 0, 3764 0x10b5, 0x106a, 0, 0,
3508 pbn_plx_romulus }, 3765 pbn_plx_romulus },
3766 /*
3767 * Quatech cards. These actually have configurable clocks but for
3768 * now we just use the default.
3769 *
3770 * 100 series are RS232, 200 series RS422,
3771 */
3509 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100, 3772 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100,
3510 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3773 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3511 pbn_b1_4_115200 }, 3774 pbn_b1_4_115200 },
3512 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100, 3775 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100,
3513 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3776 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3514 pbn_b1_2_115200 }, 3777 pbn_b1_2_115200 },
3778 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100E,
3779 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3780 pbn_b2_2_115200 },
3781 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200,
3782 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3783 pbn_b1_2_115200 },
3784 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200E,
3785 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3786 pbn_b2_2_115200 },
3787 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC200,
3788 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3789 pbn_b1_4_115200 },
3515 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100D, 3790 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100D,
3516 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3791 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3517 pbn_b1_8_115200 }, 3792 pbn_b1_8_115200 },
3518 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100M, 3793 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100M,
3519 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3794 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3520 pbn_b1_8_115200 }, 3795 pbn_b1_8_115200 },
3796 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP100,
3797 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3798 pbn_b1_4_115200 },
3799 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP100,
3800 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3801 pbn_b1_2_115200 },
3802 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP200,
3803 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3804 pbn_b1_4_115200 },
3805 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP200,
3806 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3807 pbn_b1_2_115200 },
3808 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP100,
3809 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3810 pbn_b2_4_115200 },
3811 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP100,
3812 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3813 pbn_b2_2_115200 },
3814 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP100,
3815 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3816 pbn_b2_1_115200 },
3817 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP200,
3818 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3819 pbn_b2_4_115200 },
3820 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP200,
3821 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3822 pbn_b2_2_115200 },
3823 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP200,
3824 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3825 pbn_b2_1_115200 },
3826 { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESCLP100,
3827 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
3828 pbn_b0_8_115200 },
3829
3521 { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_OXSEMI_16PCI954, 3830 { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_OXSEMI_16PCI954,
3522 PCI_VENDOR_ID_SPECIALIX, PCI_SUBDEVICE_ID_SPECIALIX_SPEED4, 3831 PCI_VENDOR_ID_SPECIALIX, PCI_SUBDEVICE_ID_SPECIALIX_SPEED4,
3523 0, 0, 3832 0, 0,
diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig
index c31133a6ea8e..d31f4c63d4ba 100644
--- a/drivers/tty/serial/8250/Kconfig
+++ b/drivers/tty/serial/8250/Kconfig
@@ -84,6 +84,14 @@ config SERIAL_8250_GSC
84 depends on SERIAL_8250 && GSC 84 depends on SERIAL_8250 && GSC
85 default SERIAL_8250 85 default SERIAL_8250
86 86
87config SERIAL_8250_DMA
88 bool "DMA support for 16550 compatible UART controllers" if EXPERT
89 depends on SERIAL_8250 && DMADEVICES=y
90 default SERIAL_8250
91 help
92 This builds DMA support that can be used with 8250/16650
93 compatible UART controllers that support DMA signaling.
94
87config SERIAL_8250_PCI 95config SERIAL_8250_PCI
88 tristate "8250/16550 PCI device support" if EXPERT 96 tristate "8250/16550 PCI device support" if EXPERT
89 depends on SERIAL_8250 && PCI 97 depends on SERIAL_8250 && PCI
@@ -249,15 +257,6 @@ config SERIAL_8250_ACORN
249 system, say Y to this option. The driver can handle 1, 2, or 3 port 257 system, say Y to this option. The driver can handle 1, 2, or 3 port
250 cards. If unsure, say N. 258 cards. If unsure, say N.
251 259
252config SERIAL_8250_RM9K
253 bool "Support for MIPS RM9xxx integrated serial port"
254 depends on SERIAL_8250 != n && SERIAL_RM9000
255 select SERIAL_8250_SHARE_IRQ
256 help
257 Selecting this option will add support for the integrated serial
258 port hardware found on MIPS RM9122 and similar processors.
259 If unsure, say N.
260
261config SERIAL_8250_FSL 260config SERIAL_8250_FSL
262 bool 261 bool
263 depends on SERIAL_8250_CONSOLE && PPC_UDBG_16550 262 depends on SERIAL_8250_CONSOLE && PPC_UDBG_16550
@@ -265,7 +264,7 @@ config SERIAL_8250_FSL
265 264
266config SERIAL_8250_DW 265config SERIAL_8250_DW
267 tristate "Support for Synopsys DesignWare 8250 quirks" 266 tristate "Support for Synopsys DesignWare 8250 quirks"
268 depends on SERIAL_8250 && OF 267 depends on SERIAL_8250
269 help 268 help
270 Selecting this option will enable handling of the extra features 269 Selecting this option will enable handling of the extra features
271 present in the Synopsys DesignWare APB UART. 270 present in the Synopsys DesignWare APB UART.
diff --git a/drivers/tty/serial/8250/Makefile b/drivers/tty/serial/8250/Makefile
index 108fe7fe13e2..a23838a4d535 100644
--- a/drivers/tty/serial/8250/Makefile
+++ b/drivers/tty/serial/8250/Makefile
@@ -5,6 +5,7 @@
5obj-$(CONFIG_SERIAL_8250) += 8250_core.o 5obj-$(CONFIG_SERIAL_8250) += 8250_core.o
68250_core-y := 8250.o 68250_core-y := 8250.o
78250_core-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o 78250_core-$(CONFIG_SERIAL_8250_PNP) += 8250_pnp.o
88250_core-$(CONFIG_SERIAL_8250_DMA) += 8250_dma.o
8obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o 9obj-$(CONFIG_SERIAL_8250_GSC) += 8250_gsc.o
9obj-$(CONFIG_SERIAL_8250_PCI) += 8250_pci.o 10obj-$(CONFIG_SERIAL_8250_PCI) += 8250_pci.o
10obj-$(CONFIG_SERIAL_8250_HP300) += 8250_hp300.o 11obj-$(CONFIG_SERIAL_8250_HP300) += 8250_hp300.o
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 59c23d038106..e9aeccdfbe35 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -2,6 +2,8 @@
2# Serial device configuration 2# Serial device configuration
3# 3#
4 4
5if TTY
6
5menu "Serial drivers" 7menu "Serial drivers"
6 depends on HAS_IOMEM 8 depends on HAS_IOMEM
7 9
@@ -269,6 +271,17 @@ config SERIAL_SIRFSOC_CONSOLE
269 your boot loader about how to pass options to the kernel at 271 your boot loader about how to pass options to the kernel at
270 boot time.) 272 boot time.)
271 273
274config SERIAL_TEGRA
275 tristate "NVIDIA Tegra20/30 SoC serial controller"
276 depends on ARCH_TEGRA && TEGRA20_APB_DMA
277 select SERIAL_CORE
278 help
279 Support for the on-chip UARTs on the NVIDIA Tegra series SOCs
280 providing /dev/ttyHS0, 1, 2, 3 and 4 (note, some machines may not
281 provide all of these ports, depending on how the serial port
282 are enabled). This driver uses the APB DMA to achieve higher baudrate
283 and better performance.
284
272config SERIAL_MAX3100 285config SERIAL_MAX3100
273 tristate "MAX3100 support" 286 tristate "MAX3100 support"
274 depends on SPI 287 depends on SPI
@@ -1447,4 +1460,30 @@ config SERIAL_ARC_NR_PORTS
1447 Set this to the number of serial ports you want the driver 1460 Set this to the number of serial ports you want the driver
1448 to support. 1461 to support.
1449 1462
1463config SERIAL_RP2
1464 tristate "Comtrol RocketPort EXPRESS/INFINITY support"
1465 depends on PCI
1466 select SERIAL_CORE
1467 help
1468 This driver supports the Comtrol RocketPort EXPRESS and
1469 RocketPort INFINITY families of PCI/PCIe multiport serial adapters.
1470 These adapters use a "RocketPort 2" ASIC that is not compatible
1471 with the original RocketPort driver (CONFIG_ROCKETPORT).
1472
1473 To compile this driver as a module, choose M here: the
1474 module will be called rp2.
1475
1476 If you want to compile this driver into the kernel, say Y here. If
1477 you don't have a suitable RocketPort card installed, say N.
1478
1479config SERIAL_RP2_NR_UARTS
1480 int "Maximum number of RocketPort EXPRESS/INFINITY ports"
1481 depends on SERIAL_RP2
1482 default "32"
1483 help
1484 If multiple cards are present, the default limit of 32 ports may
1485 need to be increased.
1486
1450endmenu 1487endmenu
1488
1489endif # TTY
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile
index df1b998c436b..eedfec40e3dd 100644
--- a/drivers/tty/serial/Makefile
+++ b/drivers/tty/serial/Makefile
@@ -80,6 +80,8 @@ obj-$(CONFIG_SERIAL_MXS_AUART) += mxs-auart.o
80obj-$(CONFIG_SERIAL_LANTIQ) += lantiq.o 80obj-$(CONFIG_SERIAL_LANTIQ) += lantiq.o
81obj-$(CONFIG_SERIAL_XILINX_PS_UART) += xilinx_uartps.o 81obj-$(CONFIG_SERIAL_XILINX_PS_UART) += xilinx_uartps.o
82obj-$(CONFIG_SERIAL_SIRFSOC) += sirfsoc_uart.o 82obj-$(CONFIG_SERIAL_SIRFSOC) += sirfsoc_uart.o
83obj-$(CONFIG_SERIAL_TEGRA) += serial-tegra.o
83obj-$(CONFIG_SERIAL_AR933X) += ar933x_uart.o 84obj-$(CONFIG_SERIAL_AR933X) += ar933x_uart.o
84obj-$(CONFIG_SERIAL_EFM32_UART) += efm32-uart.o 85obj-$(CONFIG_SERIAL_EFM32_UART) += efm32-uart.o
85obj-$(CONFIG_SERIAL_ARC) += arc_uart.o 86obj-$(CONFIG_SERIAL_ARC) += arc_uart.o
87obj-$(CONFIG_SERIAL_RP2) += rp2.o
diff --git a/drivers/tty/serial/altera_jtaguart.c b/drivers/tty/serial/altera_jtaguart.c
index 872f14ae43d2..84b90fd48063 100644
--- a/drivers/tty/serial/altera_jtaguart.c
+++ b/drivers/tty/serial/altera_jtaguart.c
@@ -139,7 +139,7 @@ static void altera_jtaguart_rx_chars(struct altera_jtaguart *pp)
139 uart_insert_char(port, 0, 0, ch, flag); 139 uart_insert_char(port, 0, 0, ch, flag);
140 } 140 }
141 141
142 tty_flip_buffer_push(port->state->port.tty); 142 tty_flip_buffer_push(&port->state->port);
143} 143}
144 144
145static void altera_jtaguart_tx_chars(struct altera_jtaguart *pp) 145static void altera_jtaguart_tx_chars(struct altera_jtaguart *pp)
diff --git a/drivers/tty/serial/altera_uart.c b/drivers/tty/serial/altera_uart.c
index 684a0808e1c7..e133c8814bb5 100644
--- a/drivers/tty/serial/altera_uart.c
+++ b/drivers/tty/serial/altera_uart.c
@@ -231,7 +231,7 @@ static void altera_uart_rx_chars(struct altera_uart *pp)
231 flag); 231 flag);
232 } 232 }
233 233
234 tty_flip_buffer_push(port->state->port.tty); 234 tty_flip_buffer_push(&port->state->port);
235} 235}
236 236
237static void altera_uart_tx_chars(struct altera_uart *pp) 237static void altera_uart_tx_chars(struct altera_uart *pp)
diff --git a/drivers/tty/serial/amba-pl010.c b/drivers/tty/serial/amba-pl010.c
index 22317dd16474..c36840519527 100644
--- a/drivers/tty/serial/amba-pl010.c
+++ b/drivers/tty/serial/amba-pl010.c
@@ -116,7 +116,6 @@ static void pl010_enable_ms(struct uart_port *port)
116 116
117static void pl010_rx_chars(struct uart_amba_port *uap) 117static void pl010_rx_chars(struct uart_amba_port *uap)
118{ 118{
119 struct tty_struct *tty = uap->port.state->port.tty;
120 unsigned int status, ch, flag, rsr, max_count = 256; 119 unsigned int status, ch, flag, rsr, max_count = 256;
121 120
122 status = readb(uap->port.membase + UART01x_FR); 121 status = readb(uap->port.membase + UART01x_FR);
@@ -165,7 +164,7 @@ static void pl010_rx_chars(struct uart_amba_port *uap)
165 status = readb(uap->port.membase + UART01x_FR); 164 status = readb(uap->port.membase + UART01x_FR);
166 } 165 }
167 spin_unlock(&uap->port.lock); 166 spin_unlock(&uap->port.lock);
168 tty_flip_buffer_push(tty); 167 tty_flip_buffer_push(&uap->port.state->port);
169 spin_lock(&uap->port.lock); 168 spin_lock(&uap->port.lock);
170} 169}
171 170
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index 7fca4022a8b2..3ea5408fcbeb 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -698,7 +698,7 @@ static void pl011_dma_rx_chars(struct uart_amba_port *uap,
698 u32 pending, bool use_buf_b, 698 u32 pending, bool use_buf_b,
699 bool readfifo) 699 bool readfifo)
700{ 700{
701 struct tty_struct *tty = uap->port.state->port.tty; 701 struct tty_port *port = &uap->port.state->port;
702 struct pl011_sgbuf *sgbuf = use_buf_b ? 702 struct pl011_sgbuf *sgbuf = use_buf_b ?
703 &uap->dmarx.sgbuf_b : &uap->dmarx.sgbuf_a; 703 &uap->dmarx.sgbuf_b : &uap->dmarx.sgbuf_a;
704 struct device *dev = uap->dmarx.chan->device->dev; 704 struct device *dev = uap->dmarx.chan->device->dev;
@@ -715,8 +715,7 @@ static void pl011_dma_rx_chars(struct uart_amba_port *uap,
715 * Note that tty_insert_flip_buf() tries to take as many chars 715 * Note that tty_insert_flip_buf() tries to take as many chars
716 * as it can. 716 * as it can.
717 */ 717 */
718 dma_count = tty_insert_flip_string(uap->port.state->port.tty, 718 dma_count = tty_insert_flip_string(port, sgbuf->buf, pending);
719 sgbuf->buf, pending);
720 719
721 /* Return buffer to device */ 720 /* Return buffer to device */
722 dma_sync_sg_for_device(dev, &sgbuf->sg, 1, DMA_FROM_DEVICE); 721 dma_sync_sg_for_device(dev, &sgbuf->sg, 1, DMA_FROM_DEVICE);
@@ -754,7 +753,7 @@ static void pl011_dma_rx_chars(struct uart_amba_port *uap,
754 dev_vdbg(uap->port.dev, 753 dev_vdbg(uap->port.dev,
755 "Took %d chars from DMA buffer and %d chars from the FIFO\n", 754 "Took %d chars from DMA buffer and %d chars from the FIFO\n",
756 dma_count, fifotaken); 755 dma_count, fifotaken);
757 tty_flip_buffer_push(tty); 756 tty_flip_buffer_push(port);
758 spin_lock(&uap->port.lock); 757 spin_lock(&uap->port.lock);
759} 758}
760 759
@@ -1076,12 +1075,10 @@ static void pl011_enable_ms(struct uart_port *port)
1076 1075
1077static void pl011_rx_chars(struct uart_amba_port *uap) 1076static void pl011_rx_chars(struct uart_amba_port *uap)
1078{ 1077{
1079 struct tty_struct *tty = uap->port.state->port.tty;
1080
1081 pl011_fifo_to_tty(uap); 1078 pl011_fifo_to_tty(uap);
1082 1079
1083 spin_unlock(&uap->port.lock); 1080 spin_unlock(&uap->port.lock);
1084 tty_flip_buffer_push(tty); 1081 tty_flip_buffer_push(&uap->port.state->port);
1085 /* 1082 /*
1086 * If we were temporarily out of DMA mode for a while, 1083 * If we were temporarily out of DMA mode for a while,
1087 * attempt to switch back to DMA mode again. 1084 * attempt to switch back to DMA mode again.
diff --git a/drivers/tty/serial/apbuart.c b/drivers/tty/serial/apbuart.c
index 59ae2b53e765..6331464d9101 100644
--- a/drivers/tty/serial/apbuart.c
+++ b/drivers/tty/serial/apbuart.c
@@ -78,7 +78,6 @@ static void apbuart_enable_ms(struct uart_port *port)
78 78
79static void apbuart_rx_chars(struct uart_port *port) 79static void apbuart_rx_chars(struct uart_port *port)
80{ 80{
81 struct tty_struct *tty = port->state->port.tty;
82 unsigned int status, ch, rsr, flag; 81 unsigned int status, ch, rsr, flag;
83 unsigned int max_chars = port->fifosize; 82 unsigned int max_chars = port->fifosize;
84 83
@@ -126,7 +125,7 @@ static void apbuart_rx_chars(struct uart_port *port)
126 status = UART_GET_STATUS(port); 125 status = UART_GET_STATUS(port);
127 } 126 }
128 127
129 tty_flip_buffer_push(tty); 128 tty_flip_buffer_push(&port->state->port);
130} 129}
131 130
132static void apbuart_tx_chars(struct uart_port *port) 131static void apbuart_tx_chars(struct uart_port *port)
diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c
index 505c490c0b44..27f20c57abed 100644
--- a/drivers/tty/serial/ar933x_uart.c
+++ b/drivers/tty/serial/ar933x_uart.c
@@ -297,10 +297,9 @@ static void ar933x_uart_set_termios(struct uart_port *port,
297 297
298static void ar933x_uart_rx_chars(struct ar933x_uart_port *up) 298static void ar933x_uart_rx_chars(struct ar933x_uart_port *up)
299{ 299{
300 struct tty_struct *tty; 300 struct tty_port *port = &up->port.state->port;
301 int max_count = 256; 301 int max_count = 256;
302 302
303 tty = tty_port_tty_get(&up->port.state->port);
304 do { 303 do {
305 unsigned int rdata; 304 unsigned int rdata;
306 unsigned char ch; 305 unsigned char ch;
@@ -313,11 +312,6 @@ static void ar933x_uart_rx_chars(struct ar933x_uart_port *up)
313 ar933x_uart_write(up, AR933X_UART_DATA_REG, 312 ar933x_uart_write(up, AR933X_UART_DATA_REG,
314 AR933X_UART_DATA_RX_CSR); 313 AR933X_UART_DATA_RX_CSR);
315 314
316 if (!tty) {
317 /* discard the data if no tty available */
318 continue;
319 }
320
321 up->port.icount.rx++; 315 up->port.icount.rx++;
322 ch = rdata & AR933X_UART_DATA_TX_RX_MASK; 316 ch = rdata & AR933X_UART_DATA_TX_RX_MASK;
323 317
@@ -325,13 +319,10 @@ static void ar933x_uart_rx_chars(struct ar933x_uart_port *up)
325 continue; 319 continue;
326 320
327 if ((up->port.ignore_status_mask & AR933X_DUMMY_STATUS_RD) == 0) 321 if ((up->port.ignore_status_mask & AR933X_DUMMY_STATUS_RD) == 0)
328 tty_insert_flip_char(tty, ch, TTY_NORMAL); 322 tty_insert_flip_char(port, ch, TTY_NORMAL);
329 } while (max_count-- > 0); 323 } while (max_count-- > 0);
330 324
331 if (tty) { 325 tty_flip_buffer_push(port);
332 tty_flip_buffer_push(tty);
333 tty_kref_put(tty);
334 }
335} 326}
336 327
337static void ar933x_uart_tx_chars(struct ar933x_uart_port *up) 328static void ar933x_uart_tx_chars(struct ar933x_uart_port *up)
diff --git a/drivers/tty/serial/arc_uart.c b/drivers/tty/serial/arc_uart.c
index 3e0b3fac6a0e..6f7eadc424a3 100644
--- a/drivers/tty/serial/arc_uart.c
+++ b/drivers/tty/serial/arc_uart.c
@@ -37,6 +37,8 @@
37#include <linux/tty_flip.h> 37#include <linux/tty_flip.h>
38#include <linux/serial_core.h> 38#include <linux/serial_core.h>
39#include <linux/io.h> 39#include <linux/io.h>
40#include <linux/of.h>
41#include <linux/of_platform.h>
40 42
41/************************************* 43/*************************************
42 * ARC UART Hardware Specs 44 * ARC UART Hardware Specs
@@ -209,12 +211,8 @@ static void arc_serial_start_tx(struct uart_port *port)
209 211
210static void arc_serial_rx_chars(struct arc_uart_port *uart) 212static void arc_serial_rx_chars(struct arc_uart_port *uart)
211{ 213{
212 struct tty_struct *tty = tty_port_tty_get(&uart->port.state->port);
213 unsigned int status, ch, flg = 0; 214 unsigned int status, ch, flg = 0;
214 215
215 if (!tty)
216 return;
217
218 /* 216 /*
219 * UART has 4 deep RX-FIFO. Driver's recongnition of this fact 217 * UART has 4 deep RX-FIFO. Driver's recongnition of this fact
220 * is very subtle. Here's how ... 218 * is very subtle. Here's how ...
@@ -250,10 +248,8 @@ static void arc_serial_rx_chars(struct arc_uart_port *uart)
250 uart_insert_char(&uart->port, status, RXOERR, ch, flg); 248 uart_insert_char(&uart->port, status, RXOERR, ch, flg);
251 249
252done: 250done:
253 tty_flip_buffer_push(tty); 251 tty_flip_buffer_push(&uart->port.state->port);
254 } 252 }
255
256 tty_kref_put(tty);
257} 253}
258 254
259/* 255/*
@@ -526,18 +522,37 @@ static struct uart_ops arc_serial_pops = {
526}; 522};
527 523
528static int 524static int
529arc_uart_init_one(struct platform_device *pdev, struct arc_uart_port *uart) 525arc_uart_init_one(struct platform_device *pdev, int dev_id)
530{ 526{
531 struct resource *res, *res2; 527 struct resource *res, *res2;
532 unsigned long *plat_data; 528 unsigned long *plat_data;
533 529 struct arc_uart_port *uart = &arc_uart_ports[dev_id];
534 if (pdev->id < 0 || pdev->id >= CONFIG_SERIAL_ARC_NR_PORTS) {
535 dev_err(&pdev->dev, "Wrong uart platform device id.\n");
536 return -ENOENT;
537 }
538 530
539 plat_data = ((unsigned long *)(pdev->dev.platform_data)); 531 plat_data = ((unsigned long *)(pdev->dev.platform_data));
540 uart->baud = plat_data[0]; 532 if (!plat_data)
533 return -ENODEV;
534
535 uart->is_emulated = !!plat_data[0]; /* workaround ISS bug */
536
537 if (is_early_platform_device(pdev)) {
538 uart->port.uartclk = plat_data[1];
539 uart->baud = plat_data[2];
540 } else {
541 struct device_node *np = pdev->dev.of_node;
542 u32 val;
543
544 if (of_property_read_u32(np, "clock-frequency", &val)) {
545 dev_err(&pdev->dev, "clock-frequency property NOTset\n");
546 return -EINVAL;
547 }
548 uart->port.uartclk = val;
549
550 if (of_property_read_u32(np, "baud", &val)) {
551 dev_err(&pdev->dev, "baud property NOT set\n");
552 return -EINVAL;
553 }
554 uart->baud = val;
555 }
541 556
542 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 557 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
543 if (!res) 558 if (!res)
@@ -557,10 +572,9 @@ arc_uart_init_one(struct platform_device *pdev, struct arc_uart_port *uart)
557 uart->port.dev = &pdev->dev; 572 uart->port.dev = &pdev->dev;
558 uart->port.iotype = UPIO_MEM; 573 uart->port.iotype = UPIO_MEM;
559 uart->port.flags = UPF_BOOT_AUTOCONF; 574 uart->port.flags = UPF_BOOT_AUTOCONF;
560 uart->port.line = pdev->id; 575 uart->port.line = dev_id;
561 uart->port.ops = &arc_serial_pops; 576 uart->port.ops = &arc_serial_pops;
562 577
563 uart->port.uartclk = plat_data[1];
564 uart->port.fifosize = ARC_UART_TX_FIFO_SIZE; 578 uart->port.fifosize = ARC_UART_TX_FIFO_SIZE;
565 579
566 /* 580 /*
@@ -569,9 +583,6 @@ arc_uart_init_one(struct platform_device *pdev, struct arc_uart_port *uart)
569 */ 583 */
570 uart->port.ignore_status_mask = 0; 584 uart->port.ignore_status_mask = 0;
571 585
572 /* Real Hardware vs. emulated to work around a bug */
573 uart->is_emulated = !!plat_data[2];
574
575 return 0; 586 return 0;
576} 587}
577 588
@@ -648,45 +659,52 @@ static __init void early_serial_write(struct console *con, const char *s,
648 } 659 }
649} 660}
650 661
651static struct __initdata console arc_early_serial_console = { 662static struct console arc_early_serial_console __initdata = {
652 .name = "early_ARCuart", 663 .name = "early_ARCuart",
653 .write = early_serial_write, 664 .write = early_serial_write,
654 .flags = CON_PRINTBUFFER | CON_BOOT, 665 .flags = CON_PRINTBUFFER | CON_BOOT,
655 .index = -1 666 .index = -1
656}; 667};
657 668
658static int arc_serial_probe_earlyprintk(struct platform_device *pdev) 669static int __init arc_serial_probe_earlyprintk(struct platform_device *pdev)
659{ 670{
660 arc_early_serial_console.index = pdev->id; 671 int dev_id = pdev->id < 0 ? 0 : pdev->id;
672 int rc;
673
674 arc_early_serial_console.index = dev_id;
661 675
662 arc_uart_init_one(pdev, &arc_uart_ports[pdev->id]); 676 rc = arc_uart_init_one(pdev, dev_id);
677 if (rc)
678 panic("early console init failed\n");
663 679
664 arc_serial_console_setup(&arc_early_serial_console, NULL); 680 arc_serial_console_setup(&arc_early_serial_console, NULL);
665 681
666 register_console(&arc_early_serial_console); 682 register_console(&arc_early_serial_console);
667 return 0; 683 return 0;
668} 684}
669#else
670static int arc_serial_probe_earlyprintk(struct platform_device *pdev)
671{
672 return -ENODEV;
673}
674#endif /* CONFIG_SERIAL_ARC_CONSOLE */ 685#endif /* CONFIG_SERIAL_ARC_CONSOLE */
675 686
676static int arc_serial_probe(struct platform_device *pdev) 687static int arc_serial_probe(struct platform_device *pdev)
677{ 688{
678 struct arc_uart_port *uart; 689 int rc, dev_id;
679 int rc; 690 struct device_node *np = pdev->dev.of_node;
691
692 /* no device tree device */
693 if (!np)
694 return -ENODEV;
680 695
681 if (is_early_platform_device(pdev)) 696 dev_id = of_alias_get_id(np, "serial");
682 return arc_serial_probe_earlyprintk(pdev); 697 if (dev_id < 0) {
698 dev_err(&pdev->dev, "failed to get alias id: %d\n", dev_id);
699 return dev_id;
700 }
683 701
684 uart = &arc_uart_ports[pdev->id]; 702 rc = arc_uart_init_one(pdev, dev_id);
685 rc = arc_uart_init_one(pdev, uart);
686 if (rc) 703 if (rc)
687 return rc; 704 return rc;
688 705
689 return uart_add_one_port(&arc_uart_driver, &uart->port); 706 rc = uart_add_one_port(&arc_uart_driver, &arc_uart_ports[dev_id].port);
707 return rc;
690} 708}
691 709
692static int arc_serial_remove(struct platform_device *pdev) 710static int arc_serial_remove(struct platform_device *pdev)
@@ -695,16 +713,32 @@ static int arc_serial_remove(struct platform_device *pdev)
695 return 0; 713 return 0;
696} 714}
697 715
716static const struct of_device_id arc_uart_dt_ids[] = {
717 { .compatible = "snps,arc-uart" },
718 { /* Sentinel */ }
719};
720MODULE_DEVICE_TABLE(of, arc_uart_dt_ids);
721
698static struct platform_driver arc_platform_driver = { 722static struct platform_driver arc_platform_driver = {
699 .probe = arc_serial_probe, 723 .probe = arc_serial_probe,
700 .remove = arc_serial_remove, 724 .remove = arc_serial_remove,
701 .driver = { 725 .driver = {
702 .name = DRIVER_NAME, 726 .name = DRIVER_NAME,
703 .owner = THIS_MODULE, 727 .owner = THIS_MODULE,
728 .of_match_table = arc_uart_dt_ids,
704 }, 729 },
705}; 730};
706 731
707#ifdef CONFIG_SERIAL_ARC_CONSOLE 732#ifdef CONFIG_SERIAL_ARC_CONSOLE
733
734static struct platform_driver early_arc_platform_driver __initdata = {
735 .probe = arc_serial_probe_earlyprintk,
736 .remove = arc_serial_remove,
737 .driver = {
738 .name = DRIVER_NAME,
739 .owner = THIS_MODULE,
740 },
741};
708/* 742/*
709 * Register an early platform driver of "earlyprintk" class. 743 * Register an early platform driver of "earlyprintk" class.
710 * ARCH platform code installs the driver and probes the early devices 744 * ARCH platform code installs the driver and probes the early devices
@@ -712,7 +746,7 @@ static struct platform_driver arc_platform_driver = {
712 * or it could be done independently, for all "earlyprintk" class drivers. 746 * or it could be done independently, for all "earlyprintk" class drivers.
713 * [see arch/arc/plat-arcfpga/platform.c] 747 * [see arch/arc/plat-arcfpga/platform.c]
714 */ 748 */
715early_platform_init("earlyprintk", &arc_platform_driver); 749early_platform_init("earlyprintk", &early_arc_platform_driver);
716 750
717#endif /* CONFIG_SERIAL_ARC_CONSOLE */ 751#endif /* CONFIG_SERIAL_ARC_CONSOLE */
718 752
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 922e85aeb63a..d4a7c241b751 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -774,14 +774,14 @@ static void atmel_rx_from_ring(struct uart_port *port)
774 * uart_start(), which takes the lock. 774 * uart_start(), which takes the lock.
775 */ 775 */
776 spin_unlock(&port->lock); 776 spin_unlock(&port->lock);
777 tty_flip_buffer_push(port->state->port.tty); 777 tty_flip_buffer_push(&port->state->port);
778 spin_lock(&port->lock); 778 spin_lock(&port->lock);
779} 779}
780 780
781static void atmel_rx_from_dma(struct uart_port *port) 781static void atmel_rx_from_dma(struct uart_port *port)
782{ 782{
783 struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); 783 struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
784 struct tty_struct *tty = port->state->port.tty; 784 struct tty_port *tport = &port->state->port;
785 struct atmel_dma_buffer *pdc; 785 struct atmel_dma_buffer *pdc;
786 int rx_idx = atmel_port->pdc_rx_idx; 786 int rx_idx = atmel_port->pdc_rx_idx;
787 unsigned int head; 787 unsigned int head;
@@ -820,7 +820,8 @@ static void atmel_rx_from_dma(struct uart_port *port)
820 */ 820 */
821 count = head - tail; 821 count = head - tail;
822 822
823 tty_insert_flip_string(tty, pdc->buf + pdc->ofs, count); 823 tty_insert_flip_string(tport, pdc->buf + pdc->ofs,
824 count);
824 825
825 dma_sync_single_for_device(port->dev, pdc->dma_addr, 826 dma_sync_single_for_device(port->dev, pdc->dma_addr,
826 pdc->dma_size, DMA_FROM_DEVICE); 827 pdc->dma_size, DMA_FROM_DEVICE);
@@ -848,7 +849,7 @@ static void atmel_rx_from_dma(struct uart_port *port)
848 * uart_start(), which takes the lock. 849 * uart_start(), which takes the lock.
849 */ 850 */
850 spin_unlock(&port->lock); 851 spin_unlock(&port->lock);
851 tty_flip_buffer_push(tty); 852 tty_flip_buffer_push(tport);
852 spin_lock(&port->lock); 853 spin_lock(&port->lock);
853 854
854 UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT); 855 UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT);
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c
index c76a226080f2..719594e5fc21 100644
--- a/drivers/tty/serial/bcm63xx_uart.c
+++ b/drivers/tty/serial/bcm63xx_uart.c
@@ -235,14 +235,13 @@ static const char *bcm_uart_type(struct uart_port *port)
235 */ 235 */
236static void bcm_uart_do_rx(struct uart_port *port) 236static void bcm_uart_do_rx(struct uart_port *port)
237{ 237{
238 struct tty_struct *tty; 238 struct tty_port *port = &port->state->port;
239 unsigned int max_count; 239 unsigned int max_count;
240 240
241 /* limit number of char read in interrupt, should not be 241 /* limit number of char read in interrupt, should not be
242 * higher than fifo size anyway since we're much faster than 242 * higher than fifo size anyway since we're much faster than
243 * serial port */ 243 * serial port */
244 max_count = 32; 244 max_count = 32;
245 tty = port->state->port.tty;
246 do { 245 do {
247 unsigned int iestat, c, cstat; 246 unsigned int iestat, c, cstat;
248 char flag; 247 char flag;
@@ -261,7 +260,7 @@ static void bcm_uart_do_rx(struct uart_port *port)
261 bcm_uart_writel(port, val, UART_CTL_REG); 260 bcm_uart_writel(port, val, UART_CTL_REG);
262 261
263 port->icount.overrun++; 262 port->icount.overrun++;
264 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 263 tty_insert_flip_char(port, 0, TTY_OVERRUN);
265 } 264 }
266 265
267 if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY))) 266 if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY)))
@@ -300,11 +299,11 @@ static void bcm_uart_do_rx(struct uart_port *port)
300 299
301 300
302 if ((cstat & port->ignore_status_mask) == 0) 301 if ((cstat & port->ignore_status_mask) == 0)
303 tty_insert_flip_char(tty, c, flag); 302 tty_insert_flip_char(port, c, flag);
304 303
305 } while (--max_count); 304 } while (--max_count);
306 305
307 tty_flip_buffer_push(tty); 306 tty_flip_buffer_push(port);
308} 307}
309 308
310/* 309/*
diff --git a/drivers/tty/serial/bfin_sport_uart.c b/drivers/tty/serial/bfin_sport_uart.c
index f5d117379b60..487c173b0f72 100644
--- a/drivers/tty/serial/bfin_sport_uart.c
+++ b/drivers/tty/serial/bfin_sport_uart.c
@@ -149,7 +149,7 @@ static int sport_uart_setup(struct sport_uart_port *up, int size, int baud_rate)
149static irqreturn_t sport_uart_rx_irq(int irq, void *dev_id) 149static irqreturn_t sport_uart_rx_irq(int irq, void *dev_id)
150{ 150{
151 struct sport_uart_port *up = dev_id; 151 struct sport_uart_port *up = dev_id;
152 struct tty_struct *tty = up->port.state->port.tty; 152 struct tty_port *port = &up->port.state->port;
153 unsigned int ch; 153 unsigned int ch;
154 154
155 spin_lock(&up->port.lock); 155 spin_lock(&up->port.lock);
@@ -159,9 +159,10 @@ static irqreturn_t sport_uart_rx_irq(int irq, void *dev_id)
159 up->port.icount.rx++; 159 up->port.icount.rx++;
160 160
161 if (!uart_handle_sysrq_char(&up->port, ch)) 161 if (!uart_handle_sysrq_char(&up->port, ch))
162 tty_insert_flip_char(tty, ch, TTY_NORMAL); 162 tty_insert_flip_char(port, ch, TTY_NORMAL);
163 } 163 }
164 tty_flip_buffer_push(tty); 164 /* XXX this won't deadlock with lowlat? */
165 tty_flip_buffer_push(port);
165 166
166 spin_unlock(&up->port.lock); 167 spin_unlock(&up->port.lock);
167 168
@@ -182,7 +183,6 @@ static irqreturn_t sport_uart_tx_irq(int irq, void *dev_id)
182static irqreturn_t sport_uart_err_irq(int irq, void *dev_id) 183static irqreturn_t sport_uart_err_irq(int irq, void *dev_id)
183{ 184{
184 struct sport_uart_port *up = dev_id; 185 struct sport_uart_port *up = dev_id;
185 struct tty_struct *tty = up->port.state->port.tty;
186 unsigned int stat = SPORT_GET_STAT(up); 186 unsigned int stat = SPORT_GET_STAT(up);
187 187
188 spin_lock(&up->port.lock); 188 spin_lock(&up->port.lock);
@@ -190,7 +190,7 @@ static irqreturn_t sport_uart_err_irq(int irq, void *dev_id)
190 /* Overflow in RX FIFO */ 190 /* Overflow in RX FIFO */
191 if (stat & ROVF) { 191 if (stat & ROVF) {
192 up->port.icount.overrun++; 192 up->port.icount.overrun++;
193 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 193 tty_insert_flip_char(&up->port.state->port, 0, TTY_OVERRUN);
194 SPORT_PUT_STAT(up, ROVF); /* Clear ROVF bit */ 194 SPORT_PUT_STAT(up, ROVF); /* Clear ROVF bit */
195 } 195 }
196 /* These should not happen */ 196 /* These should not happen */
@@ -205,6 +205,8 @@ static irqreturn_t sport_uart_err_irq(int irq, void *dev_id)
205 SSYNC(); 205 SSYNC();
206 206
207 spin_unlock(&up->port.lock); 207 spin_unlock(&up->port.lock);
208 /* XXX we don't push the overrun bit to TTY? */
209
208 return IRQ_HANDLED; 210 return IRQ_HANDLED;
209} 211}
210 212
diff --git a/drivers/tty/serial/bfin_uart.c b/drivers/tty/serial/bfin_uart.c
index 2e2b2c1cb722..12dceda9db33 100644
--- a/drivers/tty/serial/bfin_uart.c
+++ b/drivers/tty/serial/bfin_uart.c
@@ -223,7 +223,6 @@ static void bfin_serial_enable_ms(struct uart_port *port)
223#ifdef CONFIG_SERIAL_BFIN_PIO 223#ifdef CONFIG_SERIAL_BFIN_PIO
224static void bfin_serial_rx_chars(struct bfin_serial_port *uart) 224static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
225{ 225{
226 struct tty_struct *tty = NULL;
227 unsigned int status, ch, flg; 226 unsigned int status, ch, flg;
228 static struct timeval anomaly_start = { .tv_sec = 0 }; 227 static struct timeval anomaly_start = { .tv_sec = 0 };
229 228
@@ -242,11 +241,9 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
242 return; 241 return;
243 } 242 }
244 243
245 if (!uart->port.state || !uart->port.state->port.tty) 244 if (!uart->port.state)
246 return; 245 return;
247#endif 246#endif
248 tty = uart->port.state->port.tty;
249
250 if (ANOMALY_05000363) { 247 if (ANOMALY_05000363) {
251 /* The BF533 (and BF561) family of processors have a nice anomaly 248 /* The BF533 (and BF561) family of processors have a nice anomaly
252 * where they continuously generate characters for a "single" break. 249 * where they continuously generate characters for a "single" break.
@@ -325,7 +322,7 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
325 uart_insert_char(&uart->port, status, OE, ch, flg); 322 uart_insert_char(&uart->port, status, OE, ch, flg);
326 323
327 ignore_char: 324 ignore_char:
328 tty_flip_buffer_push(tty); 325 tty_flip_buffer_push(&uart->port.state->port);
329} 326}
330 327
331static void bfin_serial_tx_chars(struct bfin_serial_port *uart) 328static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
@@ -426,7 +423,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
426 423
427static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) 424static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart)
428{ 425{
429 struct tty_struct *tty = uart->port.state->port.tty;
430 int i, flg, status; 426 int i, flg, status;
431 427
432 status = UART_GET_LSR(uart); 428 status = UART_GET_LSR(uart);
@@ -471,7 +467,7 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart)
471 } 467 }
472 468
473 dma_ignore_char: 469 dma_ignore_char:
474 tty_flip_buffer_push(tty); 470 tty_flip_buffer_push(&uart->port.state->port);
475} 471}
476 472
477void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart) 473void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart)
diff --git a/drivers/tty/serial/clps711x.c b/drivers/tty/serial/clps711x.c
index 3fd2526d121e..bfb17968c8db 100644
--- a/drivers/tty/serial/clps711x.c
+++ b/drivers/tty/serial/clps711x.c
@@ -85,12 +85,8 @@ static void uart_clps711x_enable_ms(struct uart_port *port)
85static irqreturn_t uart_clps711x_int_rx(int irq, void *dev_id) 85static irqreturn_t uart_clps711x_int_rx(int irq, void *dev_id)
86{ 86{
87 struct uart_port *port = dev_id; 87 struct uart_port *port = dev_id;
88 struct tty_struct *tty = tty_port_tty_get(&port->state->port);
89 unsigned int status, ch, flg; 88 unsigned int status, ch, flg;
90 89
91 if (!tty)
92 return IRQ_HANDLED;
93
94 for (;;) { 90 for (;;) {
95 status = clps_readl(SYSFLG(port)); 91 status = clps_readl(SYSFLG(port));
96 if (status & SYSFLG_URXFE) 92 if (status & SYSFLG_URXFE)
@@ -130,9 +126,7 @@ static irqreturn_t uart_clps711x_int_rx(int irq, void *dev_id)
130 uart_insert_char(port, status, UARTDR_OVERR, ch, flg); 126 uart_insert_char(port, status, UARTDR_OVERR, ch, flg);
131 } 127 }
132 128
133 tty_flip_buffer_push(tty); 129 tty_flip_buffer_push(&port->state->port);
134
135 tty_kref_put(tty);
136 130
137 return IRQ_HANDLED; 131 return IRQ_HANDLED;
138} 132}
diff --git a/drivers/tty/serial/cpm_uart/cpm_uart_core.c b/drivers/tty/serial/cpm_uart/cpm_uart_core.c
index ad0caf176808..97f4e1858649 100644
--- a/drivers/tty/serial/cpm_uart/cpm_uart_core.c
+++ b/drivers/tty/serial/cpm_uart/cpm_uart_core.c
@@ -245,7 +245,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
245 int i; 245 int i;
246 unsigned char ch; 246 unsigned char ch;
247 u8 *cp; 247 u8 *cp;
248 struct tty_struct *tty = port->state->port.tty; 248 struct tty_port *tport = &port->state->port;
249 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; 249 struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
250 cbd_t __iomem *bdp; 250 cbd_t __iomem *bdp;
251 u16 status; 251 u16 status;
@@ -276,7 +276,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
276 /* If we have not enough room in tty flip buffer, then we try 276 /* If we have not enough room in tty flip buffer, then we try
277 * later, which will be the next rx-interrupt or a timeout 277 * later, which will be the next rx-interrupt or a timeout
278 */ 278 */
279 if(tty_buffer_request_room(tty, i) < i) { 279 if (tty_buffer_request_room(tport, i) < i) {
280 printk(KERN_WARNING "No room in flip buffer\n"); 280 printk(KERN_WARNING "No room in flip buffer\n");
281 return; 281 return;
282 } 282 }
@@ -302,7 +302,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
302 } 302 }
303#endif 303#endif
304 error_return: 304 error_return:
305 tty_insert_flip_char(tty, ch, flg); 305 tty_insert_flip_char(tport, ch, flg);
306 306
307 } /* End while (i--) */ 307 } /* End while (i--) */
308 308
@@ -322,7 +322,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
322 pinfo->rx_cur = bdp; 322 pinfo->rx_cur = bdp;
323 323
324 /* activate BH processing */ 324 /* activate BH processing */
325 tty_flip_buffer_push(tty); 325 tty_flip_buffer_push(tport);
326 326
327 return; 327 return;
328 328
@@ -507,7 +507,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
507 507
508 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); 508 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
509 if (baud < HW_BUF_SPD_THRESHOLD || 509 if (baud < HW_BUF_SPD_THRESHOLD ||
510 (pinfo->port.state && pinfo->port.state->port.tty->low_latency)) 510 (pinfo->port.state && pinfo->port.state->port.low_latency))
511 pinfo->rx_fifosize = 1; 511 pinfo->rx_fifosize = 1;
512 else 512 else
513 pinfo->rx_fifosize = RX_BUF_SIZE; 513 pinfo->rx_fifosize = RX_BUF_SIZE;
diff --git a/drivers/tty/serial/crisv10.c b/drivers/tty/serial/crisv10.c
index 35ee6a2c6877..5f37c31e32bc 100644
--- a/drivers/tty/serial/crisv10.c
+++ b/drivers/tty/serial/crisv10.c
@@ -1760,8 +1760,7 @@ add_char_and_flag(struct e100_serial *info, unsigned char data, unsigned char fl
1760 1760
1761 info->icount.rx++; 1761 info->icount.rx++;
1762 } else { 1762 } else {
1763 struct tty_struct *tty = info->port.tty; 1763 tty_insert_flip_char(&info->port, data, flag);
1764 tty_insert_flip_char(tty, data, flag);
1765 info->icount.rx++; 1764 info->icount.rx++;
1766 } 1765 }
1767 1766
@@ -2105,22 +2104,15 @@ static int force_eop_if_needed(struct e100_serial *info)
2105 2104
2106static void flush_to_flip_buffer(struct e100_serial *info) 2105static void flush_to_flip_buffer(struct e100_serial *info)
2107{ 2106{
2108 struct tty_struct *tty;
2109 struct etrax_recv_buffer *buffer; 2107 struct etrax_recv_buffer *buffer;
2110 unsigned long flags; 2108 unsigned long flags;
2111 2109
2112 local_irq_save(flags); 2110 local_irq_save(flags);
2113 tty = info->port.tty;
2114
2115 if (!tty) {
2116 local_irq_restore(flags);
2117 return;
2118 }
2119 2111
2120 while ((buffer = info->first_recv_buffer) != NULL) { 2112 while ((buffer = info->first_recv_buffer) != NULL) {
2121 unsigned int count = buffer->length; 2113 unsigned int count = buffer->length;
2122 2114
2123 tty_insert_flip_string(tty, buffer->buffer, count); 2115 tty_insert_flip_string(&info->port, buffer->buffer, count);
2124 info->recv_cnt -= count; 2116 info->recv_cnt -= count;
2125 2117
2126 if (count == buffer->length) { 2118 if (count == buffer->length) {
@@ -2139,7 +2131,7 @@ static void flush_to_flip_buffer(struct e100_serial *info)
2139 local_irq_restore(flags); 2131 local_irq_restore(flags);
2140 2132
2141 /* This includes a check for low-latency */ 2133 /* This includes a check for low-latency */
2142 tty_flip_buffer_push(tty); 2134 tty_flip_buffer_push(&info->port);
2143} 2135}
2144 2136
2145static void check_flush_timeout(struct e100_serial *info) 2137static void check_flush_timeout(struct e100_serial *info)
@@ -2275,12 +2267,6 @@ static
2275struct e100_serial * handle_ser_rx_interrupt_no_dma(struct e100_serial *info) 2267struct e100_serial * handle_ser_rx_interrupt_no_dma(struct e100_serial *info)
2276{ 2268{
2277 unsigned long data_read; 2269 unsigned long data_read;
2278 struct tty_struct *tty = info->port.tty;
2279
2280 if (!tty) {
2281 printk("!NO TTY!\n");
2282 return info;
2283 }
2284 2270
2285 /* Read data and status at the same time */ 2271 /* Read data and status at the same time */
2286 data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); 2272 data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]);
@@ -2338,8 +2324,7 @@ more_data:
2338 data_in, data_read); 2324 data_in, data_read);
2339 char flag = TTY_NORMAL; 2325 char flag = TTY_NORMAL;
2340 if (info->errorcode == ERRCODE_INSERT_BREAK) { 2326 if (info->errorcode == ERRCODE_INSERT_BREAK) {
2341 struct tty_struct *tty = info->port.tty; 2327 tty_insert_flip_char(&info->port, 0, flag);
2342 tty_insert_flip_char(tty, 0, flag);
2343 info->icount.rx++; 2328 info->icount.rx++;
2344 } 2329 }
2345 2330
@@ -2353,7 +2338,7 @@ more_data:
2353 info->icount.frame++; 2338 info->icount.frame++;
2354 flag = TTY_FRAME; 2339 flag = TTY_FRAME;
2355 } 2340 }
2356 tty_insert_flip_char(tty, data, flag); 2341 tty_insert_flip_char(&info->port, data, flag);
2357 info->errorcode = 0; 2342 info->errorcode = 0;
2358 } 2343 }
2359 info->break_detected_cnt = 0; 2344 info->break_detected_cnt = 0;
@@ -2369,7 +2354,7 @@ more_data:
2369 log_int(rdpc(), 0, 0); 2354 log_int(rdpc(), 0, 0);
2370 } 2355 }
2371 ); 2356 );
2372 tty_insert_flip_char(tty, 2357 tty_insert_flip_char(&info->port,
2373 IO_EXTRACT(R_SERIAL0_READ, data_in, data_read), 2358 IO_EXTRACT(R_SERIAL0_READ, data_in, data_read),
2374 TTY_NORMAL); 2359 TTY_NORMAL);
2375 } else { 2360 } else {
@@ -2384,7 +2369,7 @@ more_data:
2384 goto more_data; 2369 goto more_data;
2385 } 2370 }
2386 2371
2387 tty_flip_buffer_push(info->port.tty); 2372 tty_flip_buffer_push(&info->port);
2388 return info; 2373 return info;
2389} 2374}
2390 2375
@@ -3137,7 +3122,7 @@ static int rs_raw_write(struct tty_struct *tty,
3137 3122
3138 /* first some sanity checks */ 3123 /* first some sanity checks */
3139 3124
3140 if (!tty || !info->xmit.buf) 3125 if (!info->xmit.buf)
3141 return 0; 3126 return 0;
3142 3127
3143#ifdef SERIAL_DEBUG_DATA 3128#ifdef SERIAL_DEBUG_DATA
@@ -3464,7 +3449,7 @@ set_serial_info(struct e100_serial *info,
3464 info->type = new_serial.type; 3449 info->type = new_serial.type;
3465 info->close_delay = new_serial.close_delay; 3450 info->close_delay = new_serial.close_delay;
3466 info->closing_wait = new_serial.closing_wait; 3451 info->closing_wait = new_serial.closing_wait;
3467 info->port.tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; 3452 info->port.low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
3468 3453
3469 check_and_exit: 3454 check_and_exit:
3470 if (info->flags & ASYNC_INITIALIZED) { 3455 if (info->flags & ASYNC_INITIALIZED) {
@@ -4108,7 +4093,7 @@ rs_open(struct tty_struct *tty, struct file * filp)
4108 tty->driver_data = info; 4093 tty->driver_data = info;
4109 info->port.tty = tty; 4094 info->port.tty = tty;
4110 4095
4111 tty->low_latency = !!(info->flags & ASYNC_LOW_LATENCY); 4096 info->port.low_latency = !!(info->flags & ASYNC_LOW_LATENCY);
4112 4097
4113 /* 4098 /*
4114 * If the port is in the middle of closing, bail out now 4099 * If the port is in the middle of closing, bail out now
diff --git a/drivers/tty/serial/dz.c b/drivers/tty/serial/dz.c
index 6491b8644a7f..2f2b2e538a54 100644
--- a/drivers/tty/serial/dz.c
+++ b/drivers/tty/serial/dz.c
@@ -187,7 +187,6 @@ static inline void dz_receive_chars(struct dz_mux *mux)
187{ 187{
188 struct uart_port *uport; 188 struct uart_port *uport;
189 struct dz_port *dport = &mux->dport[0]; 189 struct dz_port *dport = &mux->dport[0];
190 struct tty_struct *tty = NULL;
191 struct uart_icount *icount; 190 struct uart_icount *icount;
192 int lines_rx[DZ_NB_PORT] = { [0 ... DZ_NB_PORT - 1] = 0 }; 191 int lines_rx[DZ_NB_PORT] = { [0 ... DZ_NB_PORT - 1] = 0 };
193 unsigned char ch, flag; 192 unsigned char ch, flag;
@@ -197,7 +196,6 @@ static inline void dz_receive_chars(struct dz_mux *mux)
197 while ((status = dz_in(dport, DZ_RBUF)) & DZ_DVAL) { 196 while ((status = dz_in(dport, DZ_RBUF)) & DZ_DVAL) {
198 dport = &mux->dport[LINE(status)]; 197 dport = &mux->dport[LINE(status)];
199 uport = &dport->port; 198 uport = &dport->port;
200 tty = uport->state->port.tty; /* point to the proper dev */
201 199
202 ch = UCHAR(status); /* grab the char */ 200 ch = UCHAR(status); /* grab the char */
203 flag = TTY_NORMAL; 201 flag = TTY_NORMAL;
@@ -249,7 +247,7 @@ static inline void dz_receive_chars(struct dz_mux *mux)
249 } 247 }
250 for (i = 0; i < DZ_NB_PORT; i++) 248 for (i = 0; i < DZ_NB_PORT; i++)
251 if (lines_rx[i]) 249 if (lines_rx[i])
252 tty_flip_buffer_push(mux->dport[i].port.state->port.tty); 250 tty_flip_buffer_push(&mux->dport[i].port.state->port);
253} 251}
254 252
255/* 253/*
diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c
index a8cbb2670521..7d199c8e1a75 100644
--- a/drivers/tty/serial/efm32-uart.c
+++ b/drivers/tty/serial/efm32-uart.c
@@ -81,6 +81,7 @@ struct efm32_uart_port {
81 struct uart_port port; 81 struct uart_port port;
82 unsigned int txirq; 82 unsigned int txirq;
83 struct clk *clk; 83 struct clk *clk;
84 struct efm32_uart_pdata pdata;
84}; 85};
85#define to_efm_port(_port) container_of(_port, struct efm32_uart_port, port) 86#define to_efm_port(_port) container_of(_port, struct efm32_uart_port, port)
86#define efm_debug(efm_port, format, arg...) \ 87#define efm_debug(efm_port, format, arg...) \
@@ -194,8 +195,7 @@ static void efm32_uart_break_ctl(struct uart_port *port, int ctl)
194 /* not possible without fiddling with gpios */ 195 /* not possible without fiddling with gpios */
195} 196}
196 197
197static void efm32_uart_rx_chars(struct efm32_uart_port *efm_port, 198static void efm32_uart_rx_chars(struct efm32_uart_port *efm_port)
198 struct tty_struct *tty)
199{ 199{
200 struct uart_port *port = &efm_port->port; 200 struct uart_port *port = &efm_port->port;
201 201
@@ -237,8 +237,8 @@ static void efm32_uart_rx_chars(struct efm32_uart_port *efm_port,
237 rxdata & UARTn_RXDATAX_RXDATA__MASK)) 237 rxdata & UARTn_RXDATAX_RXDATA__MASK))
238 continue; 238 continue;
239 239
240 if (tty && (rxdata & port->ignore_status_mask) == 0) 240 if ((rxdata & port->ignore_status_mask) == 0)
241 tty_insert_flip_char(tty, 241 tty_insert_flip_char(&port->state->port,
242 rxdata & UARTn_RXDATAX_RXDATA__MASK, flag); 242 rxdata & UARTn_RXDATAX_RXDATA__MASK, flag);
243 } 243 }
244} 244}
@@ -249,15 +249,13 @@ static irqreturn_t efm32_uart_rxirq(int irq, void *data)
249 u32 irqflag = efm32_uart_read32(efm_port, UARTn_IF); 249 u32 irqflag = efm32_uart_read32(efm_port, UARTn_IF);
250 int handled = IRQ_NONE; 250 int handled = IRQ_NONE;
251 struct uart_port *port = &efm_port->port; 251 struct uart_port *port = &efm_port->port;
252 struct tty_struct *tty; 252 struct tty_port *tport = &port->state->port;
253 253
254 spin_lock(&port->lock); 254 spin_lock(&port->lock);
255 255
256 tty = tty_kref_get(port->state->port.tty);
257
258 if (irqflag & UARTn_IF_RXDATAV) { 256 if (irqflag & UARTn_IF_RXDATAV) {
259 efm32_uart_write32(efm_port, UARTn_IF_RXDATAV, UARTn_IFC); 257 efm32_uart_write32(efm_port, UARTn_IF_RXDATAV, UARTn_IFC);
260 efm32_uart_rx_chars(efm_port, tty); 258 efm32_uart_rx_chars(efm_port);
261 259
262 handled = IRQ_HANDLED; 260 handled = IRQ_HANDLED;
263 } 261 }
@@ -265,16 +263,12 @@ static irqreturn_t efm32_uart_rxirq(int irq, void *data)
265 if (irqflag & UARTn_IF_RXOF) { 263 if (irqflag & UARTn_IF_RXOF) {
266 efm32_uart_write32(efm_port, UARTn_IF_RXOF, UARTn_IFC); 264 efm32_uart_write32(efm_port, UARTn_IF_RXOF, UARTn_IFC);
267 port->icount.overrun++; 265 port->icount.overrun++;
268 if (tty) 266 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
269 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
270 267
271 handled = IRQ_HANDLED; 268 handled = IRQ_HANDLED;
272 } 269 }
273 270
274 if (tty) { 271 tty_flip_buffer_push(tport);
275 tty_flip_buffer_push(tty);
276 tty_kref_put(tty);
277 }
278 272
279 spin_unlock(&port->lock); 273 spin_unlock(&port->lock);
280 274
@@ -300,13 +294,8 @@ static irqreturn_t efm32_uart_txirq(int irq, void *data)
300static int efm32_uart_startup(struct uart_port *port) 294static int efm32_uart_startup(struct uart_port *port)
301{ 295{
302 struct efm32_uart_port *efm_port = to_efm_port(port); 296 struct efm32_uart_port *efm_port = to_efm_port(port);
303 u32 location = 0;
304 struct efm32_uart_pdata *pdata = dev_get_platdata(port->dev);
305 int ret; 297 int ret;
306 298
307 if (pdata)
308 location = UARTn_ROUTE_LOCATION(pdata->location);
309
310 ret = clk_enable(efm_port->clk); 299 ret = clk_enable(efm_port->clk);
311 if (ret) { 300 if (ret) {
312 efm_debug(efm_port, "failed to enable clk\n"); 301 efm_debug(efm_port, "failed to enable clk\n");
@@ -315,7 +304,9 @@ static int efm32_uart_startup(struct uart_port *port)
315 port->uartclk = clk_get_rate(efm_port->clk); 304 port->uartclk = clk_get_rate(efm_port->clk);
316 305
317 /* Enable pins at configured location */ 306 /* Enable pins at configured location */
318 efm32_uart_write32(efm_port, location | UARTn_ROUTE_RXPEN | UARTn_ROUTE_TXPEN, 307 efm32_uart_write32(efm_port,
308 UARTn_ROUTE_LOCATION(efm_port->pdata.location) |
309 UARTn_ROUTE_RXPEN | UARTn_ROUTE_TXPEN,
319 UARTn_ROUTE); 310 UARTn_ROUTE);
320 311
321 ret = request_irq(port->irq, efm32_uart_rxirq, 0, 312 ret = request_irq(port->irq, efm32_uart_rxirq, 0,
@@ -674,11 +665,24 @@ static int efm32_uart_probe_dt(struct platform_device *pdev,
674 struct efm32_uart_port *efm_port) 665 struct efm32_uart_port *efm_port)
675{ 666{
676 struct device_node *np = pdev->dev.of_node; 667 struct device_node *np = pdev->dev.of_node;
668 u32 location;
677 int ret; 669 int ret;
678 670
679 if (!np) 671 if (!np)
680 return 1; 672 return 1;
681 673
674 ret = of_property_read_u32(np, "location", &location);
675 if (!ret) {
676 if (location > 5) {
677 dev_err(&pdev->dev, "invalid location\n");
678 return -EINVAL;
679 }
680 efm_debug(efm_port, "using location %u\n", location);
681 efm_port->pdata.location = location;
682 } else {
683 efm_debug(efm_port, "fall back to location 0\n");
684 }
685
682 ret = of_alias_get_id(np, "serial"); 686 ret = of_alias_get_id(np, "serial");
683 if (ret < 0) { 687 if (ret < 0) {
684 dev_err(&pdev->dev, "failed to get alias id: %d\n", ret); 688 dev_err(&pdev->dev, "failed to get alias id: %d\n", ret);
@@ -738,10 +742,16 @@ static int efm32_uart_probe(struct platform_device *pdev)
738 efm_port->port.flags = UPF_BOOT_AUTOCONF; 742 efm_port->port.flags = UPF_BOOT_AUTOCONF;
739 743
740 ret = efm32_uart_probe_dt(pdev, efm_port); 744 ret = efm32_uart_probe_dt(pdev, efm_port);
741 if (ret > 0) 745 if (ret > 0) {
742 /* not created by device tree */ 746 /* not created by device tree */
747 const struct efm32_uart_pdata *pdata = dev_get_platdata(&pdev->dev);
748
743 efm_port->port.line = pdev->id; 749 efm_port->port.line = pdev->id;
744 750
751 if (pdata)
752 efm_port->pdata = *pdata;
753 }
754
745 if (efm_port->port.line >= 0 && 755 if (efm_port->port.line >= 0 &&
746 efm_port->port.line < ARRAY_SIZE(efm32_uart_ports)) 756 efm_port->port.line < ARRAY_SIZE(efm32_uart_ports))
747 efm32_uart_ports[efm_port->port.line] = efm_port; 757 efm32_uart_ports[efm_port->port.line] = efm_port;
diff --git a/drivers/tty/serial/icom.c b/drivers/tty/serial/icom.c
index 72b6334bcf1a..bc9e6b017b05 100644
--- a/drivers/tty/serial/icom.c
+++ b/drivers/tty/serial/icom.c
@@ -734,7 +734,7 @@ static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
734static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port) 734static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
735{ 735{
736 short int count, rcv_buff; 736 short int count, rcv_buff;
737 struct tty_struct *tty = icom_port->uart_port.state->port.tty; 737 struct tty_port *port = &icom_port->uart_port.state->port;
738 unsigned short int status; 738 unsigned short int status;
739 struct uart_icount *icount; 739 struct uart_icount *icount;
740 unsigned long offset; 740 unsigned long offset;
@@ -761,7 +761,7 @@ static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
761 /* Block copy all but the last byte as this may have status */ 761 /* Block copy all but the last byte as this may have status */
762 if (count > 0) { 762 if (count > 0) {
763 first = icom_port->recv_buf[offset]; 763 first = icom_port->recv_buf[offset];
764 tty_insert_flip_string(tty, icom_port->recv_buf + offset, count - 1); 764 tty_insert_flip_string(port, icom_port->recv_buf + offset, count - 1);
765 } 765 }
766 766
767 icount = &icom_port->uart_port.icount; 767 icount = &icom_port->uart_port.icount;
@@ -812,7 +812,7 @@ static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
812 812
813 } 813 }
814 814
815 tty_insert_flip_char(tty, *(icom_port->recv_buf + offset + count - 1), flag); 815 tty_insert_flip_char(port, *(icom_port->recv_buf + offset + count - 1), flag);
816 816
817 if (status & SA_FLAGS_OVERRUN) 817 if (status & SA_FLAGS_OVERRUN)
818 /* 818 /*
@@ -820,7 +820,7 @@ static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
820 * reported immediately, and doesn't 820 * reported immediately, and doesn't
821 * affect the current character 821 * affect the current character
822 */ 822 */
823 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 823 tty_insert_flip_char(port, 0, TTY_OVERRUN);
824ignore_char: 824ignore_char:
825 icom_port->statStg->rcv[rcv_buff].flags = 0; 825 icom_port->statStg->rcv[rcv_buff].flags = 0;
826 icom_port->statStg->rcv[rcv_buff].leLength = 0; 826 icom_port->statStg->rcv[rcv_buff].leLength = 0;
@@ -834,7 +834,7 @@ ignore_char:
834 status = cpu_to_le16(icom_port->statStg->rcv[rcv_buff].flags); 834 status = cpu_to_le16(icom_port->statStg->rcv[rcv_buff].flags);
835 } 835 }
836 icom_port->next_rcv = rcv_buff; 836 icom_port->next_rcv = rcv_buff;
837 tty_flip_buffer_push(tty); 837 tty_flip_buffer_push(port);
838} 838}
839 839
840static void process_interrupt(u16 port_int_reg, 840static void process_interrupt(u16 port_int_reg,
diff --git a/drivers/tty/serial/ifx6x60.c b/drivers/tty/serial/ifx6x60.c
index 8cb6d8d66a13..68d7ce997ede 100644
--- a/drivers/tty/serial/ifx6x60.c
+++ b/drivers/tty/serial/ifx6x60.c
@@ -481,7 +481,6 @@ static int ifx_spi_prepare_tx_buffer(struct ifx_spi_device *ifx_dev)
481 unsigned char *tx_buffer; 481 unsigned char *tx_buffer;
482 482
483 tx_buffer = ifx_dev->tx_buffer; 483 tx_buffer = ifx_dev->tx_buffer;
484 memset(tx_buffer, 0, IFX_SPI_TRANSFER_SIZE);
485 484
486 /* make room for required SPI header */ 485 /* make room for required SPI header */
487 tx_buffer += IFX_SPI_HEADER_OVERHEAD; 486 tx_buffer += IFX_SPI_HEADER_OVERHEAD;
@@ -615,7 +614,7 @@ static int ifx_port_activate(struct tty_port *port, struct tty_struct *tty)
615 tty->driver_data = ifx_dev; 614 tty->driver_data = ifx_dev;
616 615
617 /* allows flip string push from int context */ 616 /* allows flip string push from int context */
618 tty->low_latency = 1; 617 port->low_latency = 1;
619 618
620 /* set flag to allows data transfer */ 619 /* set flag to allows data transfer */
621 set_bit(IFX_SPI_STATE_IO_AVAILABLE, &ifx_dev->flags); 620 set_bit(IFX_SPI_STATE_IO_AVAILABLE, &ifx_dev->flags);
@@ -670,12 +669,8 @@ static const struct tty_operations ifx_spi_serial_ops = {
670static void ifx_spi_insert_flip_string(struct ifx_spi_device *ifx_dev, 669static void ifx_spi_insert_flip_string(struct ifx_spi_device *ifx_dev,
671 unsigned char *chars, size_t size) 670 unsigned char *chars, size_t size)
672{ 671{
673 struct tty_struct *tty = tty_port_tty_get(&ifx_dev->tty_port); 672 tty_insert_flip_string(&ifx_dev->tty_port, chars, size);
674 if (!tty) 673 tty_flip_buffer_push(&ifx_dev->tty_port);
675 return;
676 tty_insert_flip_string(tty, chars, size);
677 tty_flip_buffer_push(tty);
678 tty_kref_put(tty);
679} 674}
680 675
681/** 676/**
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 59819121fe9b..a220f77ceab6 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -48,8 +48,8 @@
48#include <linux/of.h> 48#include <linux/of.h>
49#include <linux/of_device.h> 49#include <linux/of_device.h>
50#include <linux/pinctrl/consumer.h> 50#include <linux/pinctrl/consumer.h>
51#include <linux/io.h>
51 52
52#include <asm/io.h>
53#include <asm/irq.h> 53#include <asm/irq.h>
54#include <linux/platform_data/serial-imx.h> 54#include <linux/platform_data/serial-imx.h>
55 55
@@ -73,102 +73,102 @@
73#define IMX21_UTS 0xb4 /* UART Test Register on all other i.mx*/ 73#define IMX21_UTS 0xb4 /* UART Test Register on all other i.mx*/
74 74
75/* UART Control Register Bit Fields.*/ 75/* UART Control Register Bit Fields.*/
76#define URXD_CHARRDY (1<<15) 76#define URXD_CHARRDY (1<<15)
77#define URXD_ERR (1<<14) 77#define URXD_ERR (1<<14)
78#define URXD_OVRRUN (1<<13) 78#define URXD_OVRRUN (1<<13)
79#define URXD_FRMERR (1<<12) 79#define URXD_FRMERR (1<<12)
80#define URXD_BRK (1<<11) 80#define URXD_BRK (1<<11)
81#define URXD_PRERR (1<<10) 81#define URXD_PRERR (1<<10)
82#define UCR1_ADEN (1<<15) /* Auto detect interrupt */ 82#define UCR1_ADEN (1<<15) /* Auto detect interrupt */
83#define UCR1_ADBR (1<<14) /* Auto detect baud rate */ 83#define UCR1_ADBR (1<<14) /* Auto detect baud rate */
84#define UCR1_TRDYEN (1<<13) /* Transmitter ready interrupt enable */ 84#define UCR1_TRDYEN (1<<13) /* Transmitter ready interrupt enable */
85#define UCR1_IDEN (1<<12) /* Idle condition interrupt */ 85#define UCR1_IDEN (1<<12) /* Idle condition interrupt */
86#define UCR1_RRDYEN (1<<9) /* Recv ready interrupt enable */ 86#define UCR1_RRDYEN (1<<9) /* Recv ready interrupt enable */
87#define UCR1_RDMAEN (1<<8) /* Recv ready DMA enable */ 87#define UCR1_RDMAEN (1<<8) /* Recv ready DMA enable */
88#define UCR1_IREN (1<<7) /* Infrared interface enable */ 88#define UCR1_IREN (1<<7) /* Infrared interface enable */
89#define UCR1_TXMPTYEN (1<<6) /* Transimitter empty interrupt enable */ 89#define UCR1_TXMPTYEN (1<<6) /* Transimitter empty interrupt enable */
90#define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */ 90#define UCR1_RTSDEN (1<<5) /* RTS delta interrupt enable */
91#define UCR1_SNDBRK (1<<4) /* Send break */ 91#define UCR1_SNDBRK (1<<4) /* Send break */
92#define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */ 92#define UCR1_TDMAEN (1<<3) /* Transmitter ready DMA enable */
93#define IMX1_UCR1_UARTCLKEN (1<<2) /* UART clock enabled, i.mx1 only */ 93#define IMX1_UCR1_UARTCLKEN (1<<2) /* UART clock enabled, i.mx1 only */
94#define UCR1_DOZE (1<<1) /* Doze */ 94#define UCR1_DOZE (1<<1) /* Doze */
95#define UCR1_UARTEN (1<<0) /* UART enabled */ 95#define UCR1_UARTEN (1<<0) /* UART enabled */
96#define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */ 96#define UCR2_ESCI (1<<15) /* Escape seq interrupt enable */
97#define UCR2_IRTS (1<<14) /* Ignore RTS pin */ 97#define UCR2_IRTS (1<<14) /* Ignore RTS pin */
98#define UCR2_CTSC (1<<13) /* CTS pin control */ 98#define UCR2_CTSC (1<<13) /* CTS pin control */
99#define UCR2_CTS (1<<12) /* Clear to send */ 99#define UCR2_CTS (1<<12) /* Clear to send */
100#define UCR2_ESCEN (1<<11) /* Escape enable */ 100#define UCR2_ESCEN (1<<11) /* Escape enable */
101#define UCR2_PREN (1<<8) /* Parity enable */ 101#define UCR2_PREN (1<<8) /* Parity enable */
102#define UCR2_PROE (1<<7) /* Parity odd/even */ 102#define UCR2_PROE (1<<7) /* Parity odd/even */
103#define UCR2_STPB (1<<6) /* Stop */ 103#define UCR2_STPB (1<<6) /* Stop */
104#define UCR2_WS (1<<5) /* Word size */ 104#define UCR2_WS (1<<5) /* Word size */
105#define UCR2_RTSEN (1<<4) /* Request to send interrupt enable */ 105#define UCR2_RTSEN (1<<4) /* Request to send interrupt enable */
106#define UCR2_ATEN (1<<3) /* Aging Timer Enable */ 106#define UCR2_ATEN (1<<3) /* Aging Timer Enable */
107#define UCR2_TXEN (1<<2) /* Transmitter enabled */ 107#define UCR2_TXEN (1<<2) /* Transmitter enabled */
108#define UCR2_RXEN (1<<1) /* Receiver enabled */ 108#define UCR2_RXEN (1<<1) /* Receiver enabled */
109#define UCR2_SRST (1<<0) /* SW reset */ 109#define UCR2_SRST (1<<0) /* SW reset */
110#define UCR3_DTREN (1<<13) /* DTR interrupt enable */ 110#define UCR3_DTREN (1<<13) /* DTR interrupt enable */
111#define UCR3_PARERREN (1<<12) /* Parity enable */ 111#define UCR3_PARERREN (1<<12) /* Parity enable */
112#define UCR3_FRAERREN (1<<11) /* Frame error interrupt enable */ 112#define UCR3_FRAERREN (1<<11) /* Frame error interrupt enable */
113#define UCR3_DSR (1<<10) /* Data set ready */ 113#define UCR3_DSR (1<<10) /* Data set ready */
114#define UCR3_DCD (1<<9) /* Data carrier detect */ 114#define UCR3_DCD (1<<9) /* Data carrier detect */
115#define UCR3_RI (1<<8) /* Ring indicator */ 115#define UCR3_RI (1<<8) /* Ring indicator */
116#define UCR3_TIMEOUTEN (1<<7) /* Timeout interrupt enable */ 116#define UCR3_TIMEOUTEN (1<<7) /* Timeout interrupt enable */
117#define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */ 117#define UCR3_RXDSEN (1<<6) /* Receive status interrupt enable */
118#define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */ 118#define UCR3_AIRINTEN (1<<5) /* Async IR wake interrupt enable */
119#define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */ 119#define UCR3_AWAKEN (1<<4) /* Async wake interrupt enable */
120#define IMX21_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select */ 120#define IMX21_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select */
121#define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ 121#define UCR3_INVT (1<<1) /* Inverted Infrared transmission */
122#define UCR3_BPEN (1<<0) /* Preset registers enable */ 122#define UCR3_BPEN (1<<0) /* Preset registers enable */
123#define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */ 123#define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */
124#define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */ 124#define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */
125#define UCR4_INVR (1<<9) /* Inverted infrared reception */ 125#define UCR4_INVR (1<<9) /* Inverted infrared reception */
126#define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ 126#define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */
127#define UCR4_WKEN (1<<7) /* Wake interrupt enable */ 127#define UCR4_WKEN (1<<7) /* Wake interrupt enable */
128#define UCR4_REF16 (1<<6) /* Ref freq 16 MHz */ 128#define UCR4_REF16 (1<<6) /* Ref freq 16 MHz */
129#define UCR4_IRSC (1<<5) /* IR special case */ 129#define UCR4_IRSC (1<<5) /* IR special case */
130#define UCR4_TCEN (1<<3) /* Transmit complete interrupt enable */ 130#define UCR4_TCEN (1<<3) /* Transmit complete interrupt enable */
131#define UCR4_BKEN (1<<2) /* Break condition interrupt enable */ 131#define UCR4_BKEN (1<<2) /* Break condition interrupt enable */
132#define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */ 132#define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */
133#define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */ 133#define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */
134#define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */ 134#define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */
135#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */ 135#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */
136#define UFCR_RFDIV (7<<7) /* Reference freq divider mask */ 136#define UFCR_RFDIV (7<<7) /* Reference freq divider mask */
137#define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7) 137#define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7)
138#define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */ 138#define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */
139#define USR1_PARITYERR (1<<15) /* Parity error interrupt flag */ 139#define USR1_PARITYERR (1<<15) /* Parity error interrupt flag */
140#define USR1_RTSS (1<<14) /* RTS pin status */ 140#define USR1_RTSS (1<<14) /* RTS pin status */
141#define USR1_TRDY (1<<13) /* Transmitter ready interrupt/dma flag */ 141#define USR1_TRDY (1<<13) /* Transmitter ready interrupt/dma flag */
142#define USR1_RTSD (1<<12) /* RTS delta */ 142#define USR1_RTSD (1<<12) /* RTS delta */
143#define USR1_ESCF (1<<11) /* Escape seq interrupt flag */ 143#define USR1_ESCF (1<<11) /* Escape seq interrupt flag */
144#define USR1_FRAMERR (1<<10) /* Frame error interrupt flag */ 144#define USR1_FRAMERR (1<<10) /* Frame error interrupt flag */
145#define USR1_RRDY (1<<9) /* Receiver ready interrupt/dma flag */ 145#define USR1_RRDY (1<<9) /* Receiver ready interrupt/dma flag */
146#define USR1_TIMEOUT (1<<7) /* Receive timeout interrupt status */ 146#define USR1_TIMEOUT (1<<7) /* Receive timeout interrupt status */
147#define USR1_RXDS (1<<6) /* Receiver idle interrupt flag */ 147#define USR1_RXDS (1<<6) /* Receiver idle interrupt flag */
148#define USR1_AIRINT (1<<5) /* Async IR wake interrupt flag */ 148#define USR1_AIRINT (1<<5) /* Async IR wake interrupt flag */
149#define USR1_AWAKE (1<<4) /* Aysnc wake interrupt flag */ 149#define USR1_AWAKE (1<<4) /* Aysnc wake interrupt flag */
150#define USR2_ADET (1<<15) /* Auto baud rate detect complete */ 150#define USR2_ADET (1<<15) /* Auto baud rate detect complete */
151#define USR2_TXFE (1<<14) /* Transmit buffer FIFO empty */ 151#define USR2_TXFE (1<<14) /* Transmit buffer FIFO empty */
152#define USR2_DTRF (1<<13) /* DTR edge interrupt flag */ 152#define USR2_DTRF (1<<13) /* DTR edge interrupt flag */
153#define USR2_IDLE (1<<12) /* Idle condition */ 153#define USR2_IDLE (1<<12) /* Idle condition */
154#define USR2_IRINT (1<<8) /* Serial infrared interrupt flag */ 154#define USR2_IRINT (1<<8) /* Serial infrared interrupt flag */
155#define USR2_WAKE (1<<7) /* Wake */ 155#define USR2_WAKE (1<<7) /* Wake */
156#define USR2_RTSF (1<<4) /* RTS edge interrupt flag */ 156#define USR2_RTSF (1<<4) /* RTS edge interrupt flag */
157#define USR2_TXDC (1<<3) /* Transmitter complete */ 157#define USR2_TXDC (1<<3) /* Transmitter complete */
158#define USR2_BRCD (1<<2) /* Break condition */ 158#define USR2_BRCD (1<<2) /* Break condition */
159#define USR2_ORE (1<<1) /* Overrun error */ 159#define USR2_ORE (1<<1) /* Overrun error */
160#define USR2_RDR (1<<0) /* Recv data ready */ 160#define USR2_RDR (1<<0) /* Recv data ready */
161#define UTS_FRCPERR (1<<13) /* Force parity error */ 161#define UTS_FRCPERR (1<<13) /* Force parity error */
162#define UTS_LOOP (1<<12) /* Loop tx and rx */ 162#define UTS_LOOP (1<<12) /* Loop tx and rx */
163#define UTS_TXEMPTY (1<<6) /* TxFIFO empty */ 163#define UTS_TXEMPTY (1<<6) /* TxFIFO empty */
164#define UTS_RXEMPTY (1<<5) /* RxFIFO empty */ 164#define UTS_RXEMPTY (1<<5) /* RxFIFO empty */
165#define UTS_TXFULL (1<<4) /* TxFIFO full */ 165#define UTS_TXFULL (1<<4) /* TxFIFO full */
166#define UTS_RXFULL (1<<3) /* RxFIFO full */ 166#define UTS_RXFULL (1<<3) /* RxFIFO full */
167#define UTS_SOFTRST (1<<0) /* Software reset */ 167#define UTS_SOFTRST (1<<0) /* Software reset */
168 168
169/* We've been assigned a range on the "Low-density serial ports" major */ 169/* We've been assigned a range on the "Low-density serial ports" major */
170#define SERIAL_IMX_MAJOR 207 170#define SERIAL_IMX_MAJOR 207
171#define MINOR_START 16 171#define MINOR_START 16
172#define DEV_NAME "ttymxc" 172#define DEV_NAME "ttymxc"
173 173
174/* 174/*
@@ -199,7 +199,7 @@ struct imx_port {
199 struct uart_port port; 199 struct uart_port port;
200 struct timer_list timer; 200 struct timer_list timer;
201 unsigned int old_status; 201 unsigned int old_status;
202 int txirq,rxirq,rtsirq; 202 int txirq, rxirq, rtsirq;
203 unsigned int have_rtscts:1; 203 unsigned int have_rtscts:1;
204 unsigned int use_irda:1; 204 unsigned int use_irda:1;
205 unsigned int irda_inv_rx:1; 205 unsigned int irda_inv_rx:1;
@@ -397,7 +397,7 @@ static void imx_stop_rx(struct uart_port *port)
397 unsigned long temp; 397 unsigned long temp;
398 398
399 temp = readl(sport->port.membase + UCR2); 399 temp = readl(sport->port.membase + UCR2);
400 writel(temp &~ UCR2_RXEN, sport->port.membase + UCR2); 400 writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2);
401} 401}
402 402
403/* 403/*
@@ -490,9 +490,8 @@ static irqreturn_t imx_txint(int irq, void *dev_id)
490 struct circ_buf *xmit = &sport->port.state->xmit; 490 struct circ_buf *xmit = &sport->port.state->xmit;
491 unsigned long flags; 491 unsigned long flags;
492 492
493 spin_lock_irqsave(&sport->port.lock,flags); 493 spin_lock_irqsave(&sport->port.lock, flags);
494 if (sport->port.x_char) 494 if (sport->port.x_char) {
495 {
496 /* Send next char */ 495 /* Send next char */
497 writel(sport->port.x_char, sport->port.membase + URTX0); 496 writel(sport->port.x_char, sport->port.membase + URTX0);
498 goto out; 497 goto out;
@@ -509,18 +508,18 @@ static irqreturn_t imx_txint(int irq, void *dev_id)
509 uart_write_wakeup(&sport->port); 508 uart_write_wakeup(&sport->port);
510 509
511out: 510out:
512 spin_unlock_irqrestore(&sport->port.lock,flags); 511 spin_unlock_irqrestore(&sport->port.lock, flags);
513 return IRQ_HANDLED; 512 return IRQ_HANDLED;
514} 513}
515 514
516static irqreturn_t imx_rxint(int irq, void *dev_id) 515static irqreturn_t imx_rxint(int irq, void *dev_id)
517{ 516{
518 struct imx_port *sport = dev_id; 517 struct imx_port *sport = dev_id;
519 unsigned int rx,flg,ignored = 0; 518 unsigned int rx, flg, ignored = 0;
520 struct tty_struct *tty = sport->port.state->port.tty; 519 struct tty_port *port = &sport->port.state->port;
521 unsigned long flags, temp; 520 unsigned long flags, temp;
522 521
523 spin_lock_irqsave(&sport->port.lock,flags); 522 spin_lock_irqsave(&sport->port.lock, flags);
524 523
525 while (readl(sport->port.membase + USR2) & USR2_RDR) { 524 while (readl(sport->port.membase + USR2) & USR2_RDR) {
526 flg = TTY_NORMAL; 525 flg = TTY_NORMAL;
@@ -570,12 +569,12 @@ static irqreturn_t imx_rxint(int irq, void *dev_id)
570#endif 569#endif
571 } 570 }
572 571
573 tty_insert_flip_char(tty, rx, flg); 572 tty_insert_flip_char(port, rx, flg);
574 } 573 }
575 574
576out: 575out:
577 spin_unlock_irqrestore(&sport->port.lock,flags); 576 spin_unlock_irqrestore(&sport->port.lock, flags);
578 tty_flip_buffer_push(tty); 577 tty_flip_buffer_push(port);
579 return IRQ_HANDLED; 578 return IRQ_HANDLED;
580} 579}
581 580
@@ -654,7 +653,7 @@ static void imx_break_ctl(struct uart_port *port, int break_state)
654 653
655 temp = readl(sport->port.membase + UCR1) & ~UCR1_SNDBRK; 654 temp = readl(sport->port.membase + UCR1) & ~UCR1_SNDBRK;
656 655
657 if ( break_state != 0 ) 656 if (break_state != 0)
658 temp |= UCR1_SNDBRK; 657 temp |= UCR1_SNDBRK;
659 658
660 writel(temp, sport->port.membase + UCR1); 659 writel(temp, sport->port.membase + UCR1);
@@ -696,8 +695,8 @@ static int imx_startup(struct uart_port *port)
696 temp |= UCR4_IRSC; 695 temp |= UCR4_IRSC;
697 696
698 /* set the trigger level for CTS */ 697 /* set the trigger level for CTS */
699 temp &= ~(UCR4_CTSTL_MASK<< UCR4_CTSTL_SHF); 698 temp &= ~(UCR4_CTSTL_MASK << UCR4_CTSTL_SHF);
700 temp |= CTSTL<< UCR4_CTSTL_SHF; 699 temp |= CTSTL << UCR4_CTSTL_SHF;
701 700
702 writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); 701 writel(temp & ~UCR4_DREN, sport->port.membase + UCR4);
703 702
@@ -799,7 +798,7 @@ static int imx_startup(struct uart_port *port)
799 * Enable modem status interrupts 798 * Enable modem status interrupts
800 */ 799 */
801 imx_enable_ms(&sport->port); 800 imx_enable_ms(&sport->port);
802 spin_unlock_irqrestore(&sport->port.lock,flags); 801 spin_unlock_irqrestore(&sport->port.lock, flags);
803 802
804 if (USE_IRDA(sport)) { 803 if (USE_IRDA(sport)) {
805 struct imxuart_platform_data *pdata; 804 struct imxuart_platform_data *pdata;
@@ -909,7 +908,7 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
909 ucr2 = UCR2_SRST | UCR2_IRTS; 908 ucr2 = UCR2_SRST | UCR2_IRTS;
910 909
911 if (termios->c_cflag & CRTSCTS) { 910 if (termios->c_cflag & CRTSCTS) {
912 if( sport->have_rtscts ) { 911 if (sport->have_rtscts) {
913 ucr2 &= ~UCR2_IRTS; 912 ucr2 &= ~UCR2_IRTS;
914 ucr2 |= UCR2_CTSC; 913 ucr2 |= UCR2_CTSC;
915 } else { 914 } else {
@@ -969,12 +968,12 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
969 writel(old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN), 968 writel(old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN),
970 sport->port.membase + UCR1); 969 sport->port.membase + UCR1);
971 970
972 while ( !(readl(sport->port.membase + USR2) & USR2_TXDC)) 971 while (!(readl(sport->port.membase + USR2) & USR2_TXDC))
973 barrier(); 972 barrier();
974 973
975 /* then, disable everything */ 974 /* then, disable everything */
976 old_txrxen = readl(sport->port.membase + UCR2); 975 old_txrxen = readl(sport->port.membase + UCR2);
977 writel(old_txrxen & ~( UCR2_TXEN | UCR2_RXEN), 976 writel(old_txrxen & ~(UCR2_TXEN | UCR2_RXEN),
978 sport->port.membase + UCR2); 977 sport->port.membase + UCR2);
979 old_txrxen &= (UCR2_TXEN | UCR2_RXEN); 978 old_txrxen &= (UCR2_TXEN | UCR2_RXEN);
980 979
@@ -1255,7 +1254,7 @@ imx_console_get_options(struct imx_port *sport, int *baud,
1255 1254
1256 if (readl(sport->port.membase + UCR1) & UCR1_UARTEN) { 1255 if (readl(sport->port.membase + UCR1) & UCR1_UARTEN) {
1257 /* ok, the port was enabled */ 1256 /* ok, the port was enabled */
1258 unsigned int ucr2, ubir,ubmr, uartclk; 1257 unsigned int ucr2, ubir, ubmr, uartclk;
1259 unsigned int baud_raw; 1258 unsigned int baud_raw;
1260 unsigned int ucfr_rfdiv; 1259 unsigned int ucfr_rfdiv;
1261 1260
@@ -1301,8 +1300,8 @@ imx_console_get_options(struct imx_port *sport, int *baud,
1301 *baud = (baud_raw + 50) / 100 * 100; 1300 *baud = (baud_raw + 50) / 100 * 100;
1302 } 1301 }
1303 1302
1304 if(*baud != baud_raw) 1303 if (*baud != baud_raw)
1305 printk(KERN_INFO "Serial: Console IMX rounded baud rate from %d to %d\n", 1304 pr_info("Console IMX rounded baud rate from %d to %d\n",
1306 baud_raw, *baud); 1305 baud_raw, *baud);
1307 } 1306 }
1308} 1307}
@@ -1324,7 +1323,7 @@ imx_console_setup(struct console *co, char *options)
1324 if (co->index == -1 || co->index >= ARRAY_SIZE(imx_ports)) 1323 if (co->index == -1 || co->index >= ARRAY_SIZE(imx_ports))
1325 co->index = 0; 1324 co->index = 0;
1326 sport = imx_ports[co->index]; 1325 sport = imx_ports[co->index];
1327 if(sport == NULL) 1326 if (sport == NULL)
1328 return -ENODEV; 1327 return -ENODEV;
1329 1328
1330 if (options) 1329 if (options)
@@ -1462,7 +1461,7 @@ static int serial_imx_probe(struct platform_device *pdev)
1462 struct resource *res; 1461 struct resource *res;
1463 struct pinctrl *pinctrl; 1462 struct pinctrl *pinctrl;
1464 1463
1465 sport = kzalloc(sizeof(*sport), GFP_KERNEL); 1464 sport = devm_kzalloc(&pdev->dev, sizeof(*sport), GFP_KERNEL);
1466 if (!sport) 1465 if (!sport)
1467 return -ENOMEM; 1466 return -ENOMEM;
1468 1467
@@ -1470,19 +1469,15 @@ static int serial_imx_probe(struct platform_device *pdev)
1470 if (ret > 0) 1469 if (ret > 0)
1471 serial_imx_probe_pdata(sport, pdev); 1470 serial_imx_probe_pdata(sport, pdev);
1472 else if (ret < 0) 1471 else if (ret < 0)
1473 goto free; 1472 return ret;
1474 1473
1475 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1474 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1476 if (!res) { 1475 if (!res)
1477 ret = -ENODEV; 1476 return -ENODEV;
1478 goto free;
1479 }
1480 1477
1481 base = ioremap(res->start, PAGE_SIZE); 1478 base = devm_ioremap(&pdev->dev, res->start, PAGE_SIZE);
1482 if (!base) { 1479 if (!base)
1483 ret = -ENOMEM; 1480 return -ENOMEM;
1484 goto free;
1485 }
1486 1481
1487 sport->port.dev = &pdev->dev; 1482 sport->port.dev = &pdev->dev;
1488 sport->port.mapbase = res->start; 1483 sport->port.mapbase = res->start;
@@ -1504,21 +1499,21 @@ static int serial_imx_probe(struct platform_device *pdev)
1504 if (IS_ERR(pinctrl)) { 1499 if (IS_ERR(pinctrl)) {
1505 ret = PTR_ERR(pinctrl); 1500 ret = PTR_ERR(pinctrl);
1506 dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret); 1501 dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret);
1507 goto unmap; 1502 return ret;
1508 } 1503 }
1509 1504
1510 sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); 1505 sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
1511 if (IS_ERR(sport->clk_ipg)) { 1506 if (IS_ERR(sport->clk_ipg)) {
1512 ret = PTR_ERR(sport->clk_ipg); 1507 ret = PTR_ERR(sport->clk_ipg);
1513 dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret); 1508 dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
1514 goto unmap; 1509 return ret;
1515 } 1510 }
1516 1511
1517 sport->clk_per = devm_clk_get(&pdev->dev, "per"); 1512 sport->clk_per = devm_clk_get(&pdev->dev, "per");
1518 if (IS_ERR(sport->clk_per)) { 1513 if (IS_ERR(sport->clk_per)) {
1519 ret = PTR_ERR(sport->clk_per); 1514 ret = PTR_ERR(sport->clk_per);
1520 dev_err(&pdev->dev, "failed to get per clk: %d\n", ret); 1515 dev_err(&pdev->dev, "failed to get per clk: %d\n", ret);
1521 goto unmap; 1516 return ret;
1522 } 1517 }
1523 1518
1524 clk_prepare_enable(sport->clk_per); 1519 clk_prepare_enable(sport->clk_per);
@@ -1547,11 +1542,6 @@ deinit:
1547clkput: 1542clkput:
1548 clk_disable_unprepare(sport->clk_per); 1543 clk_disable_unprepare(sport->clk_per);
1549 clk_disable_unprepare(sport->clk_ipg); 1544 clk_disable_unprepare(sport->clk_ipg);
1550unmap:
1551 iounmap(sport->port.membase);
1552free:
1553 kfree(sport);
1554
1555 return ret; 1545 return ret;
1556} 1546}
1557 1547
@@ -1572,9 +1562,6 @@ static int serial_imx_remove(struct platform_device *pdev)
1572 if (pdata && pdata->exit) 1562 if (pdata && pdata->exit)
1573 pdata->exit(pdev); 1563 pdata->exit(pdev);
1574 1564
1575 iounmap(sport->port.membase);
1576 kfree(sport);
1577
1578 return 0; 1565 return 0;
1579} 1566}
1580 1567
@@ -1596,7 +1583,7 @@ static int __init imx_serial_init(void)
1596{ 1583{
1597 int ret; 1584 int ret;
1598 1585
1599 printk(KERN_INFO "Serial: IMX driver\n"); 1586 pr_info("Serial: IMX driver\n");
1600 1587
1601 ret = uart_register_driver(&imx_reg); 1588 ret = uart_register_driver(&imx_reg);
1602 if (ret) 1589 if (ret)
diff --git a/drivers/tty/serial/ioc3_serial.c b/drivers/tty/serial/ioc3_serial.c
index d8f1d1d54471..6e4c715c5d26 100644
--- a/drivers/tty/serial/ioc3_serial.c
+++ b/drivers/tty/serial/ioc3_serial.c
@@ -1000,7 +1000,7 @@ ioc3_change_speed(struct uart_port *the_port,
1000 1000
1001 the_port->ignore_status_mask = N_ALL_INPUT; 1001 the_port->ignore_status_mask = N_ALL_INPUT;
1002 1002
1003 state->port.tty->low_latency = 1; 1003 state->port.low_latency = 1;
1004 1004
1005 if (iflag & IGNPAR) 1005 if (iflag & IGNPAR)
1006 the_port->ignore_status_mask &= ~(N_PARITY_ERROR 1006 the_port->ignore_status_mask &= ~(N_PARITY_ERROR
@@ -1393,7 +1393,6 @@ static inline int do_read(struct uart_port *the_port, char *buf, int len)
1393 */ 1393 */
1394static int receive_chars(struct uart_port *the_port) 1394static int receive_chars(struct uart_port *the_port)
1395{ 1395{
1396 struct tty_struct *tty;
1397 unsigned char ch[MAX_CHARS]; 1396 unsigned char ch[MAX_CHARS];
1398 int read_count = 0, read_room, flip = 0; 1397 int read_count = 0, read_room, flip = 0;
1399 struct uart_state *state = the_port->state; 1398 struct uart_state *state = the_port->state;
@@ -1403,25 +1402,23 @@ static int receive_chars(struct uart_port *the_port)
1403 /* Make sure all the pointers are "good" ones */ 1402 /* Make sure all the pointers are "good" ones */
1404 if (!state) 1403 if (!state)
1405 return 0; 1404 return 0;
1406 if (!state->port.tty)
1407 return 0;
1408 1405
1409 if (!(port->ip_flags & INPUT_ENABLE)) 1406 if (!(port->ip_flags & INPUT_ENABLE))
1410 return 0; 1407 return 0;
1411 1408
1412 spin_lock_irqsave(&the_port->lock, pflags); 1409 spin_lock_irqsave(&the_port->lock, pflags);
1413 tty = state->port.tty;
1414 1410
1415 read_count = do_read(the_port, ch, MAX_CHARS); 1411 read_count = do_read(the_port, ch, MAX_CHARS);
1416 if (read_count > 0) { 1412 if (read_count > 0) {
1417 flip = 1; 1413 flip = 1;
1418 read_room = tty_insert_flip_string(tty, ch, read_count); 1414 read_room = tty_insert_flip_string(&state->port, ch,
1415 read_count);
1419 the_port->icount.rx += read_count; 1416 the_port->icount.rx += read_count;
1420 } 1417 }
1421 spin_unlock_irqrestore(&the_port->lock, pflags); 1418 spin_unlock_irqrestore(&the_port->lock, pflags);
1422 1419
1423 if (flip) 1420 if (flip)
1424 tty_flip_buffer_push(tty); 1421 tty_flip_buffer_push(&state->port);
1425 1422
1426 return read_count; 1423 return read_count;
1427} 1424}
diff --git a/drivers/tty/serial/ioc4_serial.c b/drivers/tty/serial/ioc4_serial.c
index 3e7da10cebba..e2520abcb1c4 100644
--- a/drivers/tty/serial/ioc4_serial.c
+++ b/drivers/tty/serial/ioc4_serial.c
@@ -1740,7 +1740,7 @@ ioc4_change_speed(struct uart_port *the_port,
1740 1740
1741 the_port->ignore_status_mask = N_ALL_INPUT; 1741 the_port->ignore_status_mask = N_ALL_INPUT;
1742 1742
1743 state->port.tty->low_latency = 1; 1743 state->port.low_latency = 1;
1744 1744
1745 if (iflag & IGNPAR) 1745 if (iflag & IGNPAR)
1746 the_port->ignore_status_mask &= ~(N_PARITY_ERROR 1746 the_port->ignore_status_mask &= ~(N_PARITY_ERROR
@@ -2340,7 +2340,6 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf,
2340 */ 2340 */
2341static void receive_chars(struct uart_port *the_port) 2341static void receive_chars(struct uart_port *the_port)
2342{ 2342{
2343 struct tty_struct *tty;
2344 unsigned char ch[IOC4_MAX_CHARS]; 2343 unsigned char ch[IOC4_MAX_CHARS];
2345 int read_count, request_count = IOC4_MAX_CHARS; 2344 int read_count, request_count = IOC4_MAX_CHARS;
2346 struct uart_icount *icount; 2345 struct uart_icount *icount;
@@ -2350,26 +2349,23 @@ static void receive_chars(struct uart_port *the_port)
2350 /* Make sure all the pointers are "good" ones */ 2349 /* Make sure all the pointers are "good" ones */
2351 if (!state) 2350 if (!state)
2352 return; 2351 return;
2353 if (!state->port.tty)
2354 return;
2355 2352
2356 spin_lock_irqsave(&the_port->lock, pflags); 2353 spin_lock_irqsave(&the_port->lock, pflags);
2357 tty = state->port.tty;
2358 2354
2359 request_count = tty_buffer_request_room(tty, IOC4_MAX_CHARS); 2355 request_count = tty_buffer_request_room(&state->port, IOC4_MAX_CHARS);
2360 2356
2361 if (request_count > 0) { 2357 if (request_count > 0) {
2362 icount = &the_port->icount; 2358 icount = &the_port->icount;
2363 read_count = do_read(the_port, ch, request_count); 2359 read_count = do_read(the_port, ch, request_count);
2364 if (read_count > 0) { 2360 if (read_count > 0) {
2365 tty_insert_flip_string(tty, ch, read_count); 2361 tty_insert_flip_string(&state->port, ch, read_count);
2366 icount->rx += read_count; 2362 icount->rx += read_count;
2367 } 2363 }
2368 } 2364 }
2369 2365
2370 spin_unlock_irqrestore(&the_port->lock, pflags); 2366 spin_unlock_irqrestore(&the_port->lock, pflags);
2371 2367
2372 tty_flip_buffer_push(tty); 2368 tty_flip_buffer_push(&state->port);
2373} 2369}
2374 2370
2375/** 2371/**
@@ -2883,6 +2879,7 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
2883 /* error exits that give back resources */ 2879 /* error exits that give back resources */
2884out5: 2880out5:
2885 ioc4_serial_remove_one(idd); 2881 ioc4_serial_remove_one(idd);
2882 return ret;
2886out4: 2883out4:
2887 kfree(soft); 2884 kfree(soft);
2888out3: 2885out3:
diff --git a/drivers/tty/serial/ip22zilog.c b/drivers/tty/serial/ip22zilog.c
index 7b1cda59ebb5..cb3c81eb0996 100644
--- a/drivers/tty/serial/ip22zilog.c
+++ b/drivers/tty/serial/ip22zilog.c
@@ -248,17 +248,12 @@ static void ip22zilog_maybe_update_regs(struct uart_ip22zilog_port *up,
248#define Rx_BRK 0x0100 /* BREAK event software flag. */ 248#define Rx_BRK 0x0100 /* BREAK event software flag. */
249#define Rx_SYS 0x0200 /* SysRq event software flag. */ 249#define Rx_SYS 0x0200 /* SysRq event software flag. */
250 250
251static struct tty_struct *ip22zilog_receive_chars(struct uart_ip22zilog_port *up, 251static bool ip22zilog_receive_chars(struct uart_ip22zilog_port *up,
252 struct zilog_channel *channel) 252 struct zilog_channel *channel)
253{ 253{
254 struct tty_struct *tty;
255 unsigned char ch, flag; 254 unsigned char ch, flag;
256 unsigned int r1; 255 unsigned int r1;
257 256 bool push = up->port.state != NULL;
258 tty = NULL;
259 if (up->port.state != NULL &&
260 up->port.state->port.tty != NULL)
261 tty = up->port.state->port.tty;
262 257
263 for (;;) { 258 for (;;) {
264 ch = readb(&channel->control); 259 ch = readb(&channel->control);
@@ -312,10 +307,10 @@ static struct tty_struct *ip22zilog_receive_chars(struct uart_ip22zilog_port *up
312 if (uart_handle_sysrq_char(&up->port, ch)) 307 if (uart_handle_sysrq_char(&up->port, ch))
313 continue; 308 continue;
314 309
315 if (tty) 310 if (push)
316 uart_insert_char(&up->port, r1, Rx_OVR, ch, flag); 311 uart_insert_char(&up->port, r1, Rx_OVR, ch, flag);
317 } 312 }
318 return tty; 313 return push;
319} 314}
320 315
321static void ip22zilog_status_handle(struct uart_ip22zilog_port *up, 316static void ip22zilog_status_handle(struct uart_ip22zilog_port *up,
@@ -438,21 +433,20 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
438 while (up) { 433 while (up) {
439 struct zilog_channel *channel 434 struct zilog_channel *channel
440 = ZILOG_CHANNEL_FROM_PORT(&up->port); 435 = ZILOG_CHANNEL_FROM_PORT(&up->port);
441 struct tty_struct *tty;
442 unsigned char r3; 436 unsigned char r3;
437 bool push = false;
443 438
444 spin_lock(&up->port.lock); 439 spin_lock(&up->port.lock);
445 r3 = read_zsreg(channel, R3); 440 r3 = read_zsreg(channel, R3);
446 441
447 /* Channel A */ 442 /* Channel A */
448 tty = NULL;
449 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { 443 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
450 writeb(RES_H_IUS, &channel->control); 444 writeb(RES_H_IUS, &channel->control);
451 ZSDELAY(); 445 ZSDELAY();
452 ZS_WSYNC(channel); 446 ZS_WSYNC(channel);
453 447
454 if (r3 & CHARxIP) 448 if (r3 & CHARxIP)
455 tty = ip22zilog_receive_chars(up, channel); 449 push = ip22zilog_receive_chars(up, channel);
456 if (r3 & CHAEXT) 450 if (r3 & CHAEXT)
457 ip22zilog_status_handle(up, channel); 451 ip22zilog_status_handle(up, channel);
458 if (r3 & CHATxIP) 452 if (r3 & CHATxIP)
@@ -460,22 +454,22 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
460 } 454 }
461 spin_unlock(&up->port.lock); 455 spin_unlock(&up->port.lock);
462 456
463 if (tty) 457 if (push)
464 tty_flip_buffer_push(tty); 458 tty_flip_buffer_push(&up->port.state->port);
465 459
466 /* Channel B */ 460 /* Channel B */
467 up = up->next; 461 up = up->next;
468 channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 462 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
463 push = false;
469 464
470 spin_lock(&up->port.lock); 465 spin_lock(&up->port.lock);
471 tty = NULL;
472 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { 466 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
473 writeb(RES_H_IUS, &channel->control); 467 writeb(RES_H_IUS, &channel->control);
474 ZSDELAY(); 468 ZSDELAY();
475 ZS_WSYNC(channel); 469 ZS_WSYNC(channel);
476 470
477 if (r3 & CHBRxIP) 471 if (r3 & CHBRxIP)
478 tty = ip22zilog_receive_chars(up, channel); 472 push = ip22zilog_receive_chars(up, channel);
479 if (r3 & CHBEXT) 473 if (r3 & CHBEXT)
480 ip22zilog_status_handle(up, channel); 474 ip22zilog_status_handle(up, channel);
481 if (r3 & CHBTxIP) 475 if (r3 & CHBTxIP)
@@ -483,8 +477,8 @@ static irqreturn_t ip22zilog_interrupt(int irq, void *dev_id)
483 } 477 }
484 spin_unlock(&up->port.lock); 478 spin_unlock(&up->port.lock);
485 479
486 if (tty) 480 if (push)
487 tty_flip_buffer_push(tty); 481 tty_flip_buffer_push(&up->port.state->port);
488 482
489 up = up->next; 483 up = up->next;
490 } 484 }
diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c
index 4c00c5550b1a..00f250ae14c5 100644
--- a/drivers/tty/serial/jsm/jsm_tty.c
+++ b/drivers/tty/serial/jsm/jsm_tty.c
@@ -521,6 +521,7 @@ void jsm_input(struct jsm_channel *ch)
521{ 521{
522 struct jsm_board *bd; 522 struct jsm_board *bd;
523 struct tty_struct *tp; 523 struct tty_struct *tp;
524 struct tty_port *port;
524 u32 rmask; 525 u32 rmask;
525 u16 head; 526 u16 head;
526 u16 tail; 527 u16 tail;
@@ -536,7 +537,8 @@ void jsm_input(struct jsm_channel *ch)
536 if (!ch) 537 if (!ch)
537 return; 538 return;
538 539
539 tp = ch->uart_port.state->port.tty; 540 port = &ch->uart_port.state->port;
541 tp = port->tty;
540 542
541 bd = ch->ch_bd; 543 bd = ch->ch_bd;
542 if(!bd) 544 if(!bd)
@@ -600,7 +602,7 @@ void jsm_input(struct jsm_channel *ch)
600 return; 602 return;
601 } 603 }
602 604
603 len = tty_buffer_request_room(tp, data_len); 605 len = tty_buffer_request_room(port, data_len);
604 n = len; 606 n = len;
605 607
606 /* 608 /*
@@ -629,16 +631,16 @@ void jsm_input(struct jsm_channel *ch)
629 * format it likes. 631 * format it likes.
630 */ 632 */
631 if (*(ch->ch_equeue +tail +i) & UART_LSR_BI) 633 if (*(ch->ch_equeue +tail +i) & UART_LSR_BI)
632 tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_BREAK); 634 tty_insert_flip_char(port, *(ch->ch_rqueue +tail +i), TTY_BREAK);
633 else if (*(ch->ch_equeue +tail +i) & UART_LSR_PE) 635 else if (*(ch->ch_equeue +tail +i) & UART_LSR_PE)
634 tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_PARITY); 636 tty_insert_flip_char(port, *(ch->ch_rqueue +tail +i), TTY_PARITY);
635 else if (*(ch->ch_equeue +tail +i) & UART_LSR_FE) 637 else if (*(ch->ch_equeue +tail +i) & UART_LSR_FE)
636 tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_FRAME); 638 tty_insert_flip_char(port, *(ch->ch_rqueue +tail +i), TTY_FRAME);
637 else 639 else
638 tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_NORMAL); 640 tty_insert_flip_char(port, *(ch->ch_rqueue +tail +i), TTY_NORMAL);
639 } 641 }
640 } else { 642 } else {
641 tty_insert_flip_string(tp, ch->ch_rqueue + tail, s) ; 643 tty_insert_flip_string(port, ch->ch_rqueue + tail, s);
642 } 644 }
643 tail += s; 645 tail += s;
644 n -= s; 646 n -= s;
@@ -652,7 +654,7 @@ void jsm_input(struct jsm_channel *ch)
652 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 654 spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
653 655
654 /* Tell the tty layer its okay to "eat" the data now */ 656 /* Tell the tty layer its okay to "eat" the data now */
655 tty_flip_buffer_push(tp); 657 tty_flip_buffer_push(port);
656 658
657 jsm_dbg(IOCTL, &ch->ch_bd->pci_dev, "finish\n"); 659 jsm_dbg(IOCTL, &ch->ch_bd->pci_dev, "finish\n");
658} 660}
diff --git a/drivers/tty/serial/kgdb_nmi.c b/drivers/tty/serial/kgdb_nmi.c
index 6ac2b797a764..26a50b0c868b 100644
--- a/drivers/tty/serial/kgdb_nmi.c
+++ b/drivers/tty/serial/kgdb_nmi.c
@@ -202,7 +202,6 @@ bool kgdb_nmi_poll_knock(void)
202static void kgdb_nmi_tty_receiver(unsigned long data) 202static void kgdb_nmi_tty_receiver(unsigned long data)
203{ 203{
204 struct kgdb_nmi_tty_priv *priv = (void *)data; 204 struct kgdb_nmi_tty_priv *priv = (void *)data;
205 struct tty_struct *tty;
206 char ch; 205 char ch;
207 206
208 tasklet_schedule(&priv->tlet); 207 tasklet_schedule(&priv->tlet);
@@ -210,16 +209,9 @@ static void kgdb_nmi_tty_receiver(unsigned long data)
210 if (likely(!kgdb_nmi_tty_enabled || !kfifo_len(&priv->fifo))) 209 if (likely(!kgdb_nmi_tty_enabled || !kfifo_len(&priv->fifo)))
211 return; 210 return;
212 211
213 /* Port is there, but tty might be hung up, check. */
214 tty = tty_port_tty_get(kgdb_nmi_port);
215 if (!tty)
216 return;
217
218 while (kfifo_out(&priv->fifo, &ch, 1)) 212 while (kfifo_out(&priv->fifo, &ch, 1))
219 tty_insert_flip_char(priv->port.tty, ch, TTY_NORMAL); 213 tty_insert_flip_char(&priv->port, ch, TTY_NORMAL);
220 tty_flip_buffer_push(priv->port.tty); 214 tty_flip_buffer_push(&priv->port);
221
222 tty_kref_put(tty);
223} 215}
224 216
225static int kgdb_nmi_tty_activate(struct tty_port *port, struct tty_struct *tty) 217static int kgdb_nmi_tty_activate(struct tty_port *port, struct tty_struct *tty)
diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index 02da071fe1e7..15733da757c6 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -162,21 +162,16 @@ lqasc_enable_ms(struct uart_port *port)
162static int 162static int
163lqasc_rx_chars(struct uart_port *port) 163lqasc_rx_chars(struct uart_port *port)
164{ 164{
165 struct tty_struct *tty = tty_port_tty_get(&port->state->port); 165 struct tty_port *tport = &port->state->port;
166 unsigned int ch = 0, rsr = 0, fifocnt; 166 unsigned int ch = 0, rsr = 0, fifocnt;
167 167
168 if (!tty) { 168 fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
169 dev_dbg(port->dev, "%s:tty is busy now", __func__);
170 return -EBUSY;
171 }
172 fifocnt =
173 ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
174 while (fifocnt--) { 169 while (fifocnt--) {
175 u8 flag = TTY_NORMAL; 170 u8 flag = TTY_NORMAL;
176 ch = ltq_r8(port->membase + LTQ_ASC_RBUF); 171 ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
177 rsr = (ltq_r32(port->membase + LTQ_ASC_STATE) 172 rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
178 & ASCSTATE_ANY) | UART_DUMMY_UER_RX; 173 & ASCSTATE_ANY) | UART_DUMMY_UER_RX;
179 tty_flip_buffer_push(tty); 174 tty_flip_buffer_push(tport);
180 port->icount.rx++; 175 port->icount.rx++;
181 176
182 /* 177 /*
@@ -208,7 +203,7 @@ lqasc_rx_chars(struct uart_port *port)
208 } 203 }
209 204
210 if ((rsr & port->ignore_status_mask) == 0) 205 if ((rsr & port->ignore_status_mask) == 0)
211 tty_insert_flip_char(tty, ch, flag); 206 tty_insert_flip_char(tport, ch, flag);
212 207
213 if (rsr & ASCSTATE_ROE) 208 if (rsr & ASCSTATE_ROE)
214 /* 209 /*
@@ -216,11 +211,12 @@ lqasc_rx_chars(struct uart_port *port)
216 * immediately, and doesn't affect the current 211 * immediately, and doesn't affect the current
217 * character 212 * character
218 */ 213 */
219 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 214 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
220 } 215 }
216
221 if (ch != 0) 217 if (ch != 0)
222 tty_flip_buffer_push(tty); 218 tty_flip_buffer_push(tport);
223 tty_kref_put(tty); 219
224 return 0; 220 return 0;
225} 221}
226 222
diff --git a/drivers/tty/serial/lpc32xx_hs.c b/drivers/tty/serial/lpc32xx_hs.c
index 0e86bff3fe2a..dffea6b2cd7d 100644
--- a/drivers/tty/serial/lpc32xx_hs.c
+++ b/drivers/tty/serial/lpc32xx_hs.c
@@ -257,17 +257,8 @@ static void __serial_uart_flush(struct uart_port *port)
257 257
258static void __serial_lpc32xx_rx(struct uart_port *port) 258static void __serial_lpc32xx_rx(struct uart_port *port)
259{ 259{
260 struct tty_port *tport = &port->state->port;
260 unsigned int tmp, flag; 261 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 262
272 /* Read data from FIFO and push into terminal */ 263 /* Read data from FIFO and push into terminal */
273 tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); 264 tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
@@ -281,15 +272,14 @@ static void __serial_lpc32xx_rx(struct uart_port *port)
281 LPC32XX_HSUART_IIR(port->membase)); 272 LPC32XX_HSUART_IIR(port->membase));
282 port->icount.frame++; 273 port->icount.frame++;
283 flag = TTY_FRAME; 274 flag = TTY_FRAME;
284 tty_insert_flip_char(tty, 0, TTY_FRAME); 275 tty_insert_flip_char(tport, 0, TTY_FRAME);
285 } 276 }
286 277
287 tty_insert_flip_char(tty, (tmp & 0xFF), flag); 278 tty_insert_flip_char(tport, (tmp & 0xFF), flag);
288 279
289 tmp = readl(LPC32XX_HSUART_FIFO(port->membase)); 280 tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
290 } 281 }
291 tty_flip_buffer_push(tty); 282 tty_flip_buffer_push(tport);
292 tty_kref_put(tty);
293} 283}
294 284
295static void __serial_lpc32xx_tx(struct uart_port *port) 285static void __serial_lpc32xx_tx(struct uart_port *port)
@@ -332,7 +322,7 @@ exit_tx:
332static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id) 322static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
333{ 323{
334 struct uart_port *port = dev_id; 324 struct uart_port *port = dev_id;
335 struct tty_struct *tty = tty_port_tty_get(&port->state->port); 325 struct tty_port *tport = &port->state->port;
336 u32 status; 326 u32 status;
337 327
338 spin_lock(&port->lock); 328 spin_lock(&port->lock);
@@ -356,17 +346,14 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
356 writel(LPC32XX_HSU_RX_OE_INT, 346 writel(LPC32XX_HSU_RX_OE_INT,
357 LPC32XX_HSUART_IIR(port->membase)); 347 LPC32XX_HSUART_IIR(port->membase));
358 port->icount.overrun++; 348 port->icount.overrun++;
359 if (tty) { 349 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
360 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 350 tty_schedule_flip(tport);
361 tty_schedule_flip(tty);
362 }
363 } 351 }
364 352
365 /* Data received? */ 353 /* Data received? */
366 if (status & (LPC32XX_HSU_RX_TIMEOUT_INT | LPC32XX_HSU_RX_TRIG_INT)) { 354 if (status & (LPC32XX_HSU_RX_TIMEOUT_INT | LPC32XX_HSU_RX_TRIG_INT)) {
367 __serial_lpc32xx_rx(port); 355 __serial_lpc32xx_rx(port);
368 if (tty) 356 tty_flip_buffer_push(tport);
369 tty_flip_buffer_push(tty);
370 } 357 }
371 358
372 /* Transmit data request? */ 359 /* Transmit data request? */
@@ -376,7 +363,6 @@ static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
376 } 363 }
377 364
378 spin_unlock(&port->lock); 365 spin_unlock(&port->lock);
379 tty_kref_put(tty);
380 366
381 return IRQ_HANDLED; 367 return IRQ_HANDLED;
382} 368}
diff --git a/drivers/tty/serial/m32r_sio.c b/drivers/tty/serial/m32r_sio.c
index b13949ad3408..bb1afa0922e1 100644
--- a/drivers/tty/serial/m32r_sio.c
+++ b/drivers/tty/serial/m32r_sio.c
@@ -300,7 +300,7 @@ static void m32r_sio_enable_ms(struct uart_port *port)
300 300
301static void receive_chars(struct uart_sio_port *up, int *status) 301static void receive_chars(struct uart_sio_port *up, int *status)
302{ 302{
303 struct tty_struct *tty = up->port.state->port.tty; 303 struct tty_port *port = &up->port.state->port;
304 unsigned char ch; 304 unsigned char ch;
305 unsigned char flag; 305 unsigned char flag;
306 int max_count = 256; 306 int max_count = 256;
@@ -355,7 +355,7 @@ static void receive_chars(struct uart_sio_port *up, int *status)
355 if (uart_handle_sysrq_char(&up->port, ch)) 355 if (uart_handle_sysrq_char(&up->port, ch))
356 goto ignore_char; 356 goto ignore_char;
357 if ((*status & up->port.ignore_status_mask) == 0) 357 if ((*status & up->port.ignore_status_mask) == 0)
358 tty_insert_flip_char(tty, ch, flag); 358 tty_insert_flip_char(port, ch, flag);
359 359
360 if (*status & UART_LSR_OE) { 360 if (*status & UART_LSR_OE) {
361 /* 361 /*
@@ -363,12 +363,12 @@ static void receive_chars(struct uart_sio_port *up, int *status)
363 * immediately, and doesn't affect the current 363 * immediately, and doesn't affect the current
364 * character. 364 * character.
365 */ 365 */
366 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 366 tty_insert_flip_char(port, 0, TTY_OVERRUN);
367 } 367 }
368 ignore_char: 368 ignore_char:
369 *status = serial_in(up, UART_LSR); 369 *status = serial_in(up, UART_LSR);
370 } while ((*status & UART_LSR_DR) && (max_count-- > 0)); 370 } while ((*status & UART_LSR_DR) && (max_count-- > 0));
371 tty_flip_buffer_push(tty); 371 tty_flip_buffer_push(port);
372} 372}
373 373
374static void transmit_chars(struct uart_sio_port *up) 374static void transmit_chars(struct uart_sio_port *up)
diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
index 7ce3197087bb..791e1dfb8b11 100644
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -311,8 +311,8 @@ static void max3100_work(struct work_struct *w)
311 } 311 }
312 } 312 }
313 313
314 if (rxchars > 16 && s->port.state->port.tty != NULL) { 314 if (rxchars > 16) {
315 tty_flip_buffer_push(s->port.state->port.tty); 315 tty_flip_buffer_push(&s->port.state->port);
316 rxchars = 0; 316 rxchars = 0;
317 } 317 }
318 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) 318 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
@@ -324,8 +324,8 @@ static void max3100_work(struct work_struct *w)
324 (!uart_circ_empty(xmit) && 324 (!uart_circ_empty(xmit) &&
325 !uart_tx_stopped(&s->port)))); 325 !uart_tx_stopped(&s->port))));
326 326
327 if (rxchars > 0 && s->port.state->port.tty != NULL) 327 if (rxchars > 0)
328 tty_flip_buffer_push(s->port.state->port.tty); 328 tty_flip_buffer_push(&s->port.state->port);
329} 329}
330 330
331static irqreturn_t max3100_irq(int irqno, void *dev_id) 331static irqreturn_t max3100_irq(int irqno, void *dev_id)
@@ -530,7 +530,7 @@ max3100_set_termios(struct uart_port *port, struct ktermios *termios,
530 MAX3100_STATUS_OE; 530 MAX3100_STATUS_OE;
531 531
532 /* we are sending char from a workqueue so enable */ 532 /* we are sending char from a workqueue so enable */
533 s->port.state->port.tty->low_latency = 1; 533 s->port.state->port.low_latency = 1;
534 534
535 if (s->poll_time > 0) 535 if (s->poll_time > 0)
536 del_timer_sync(&s->timer); 536 del_timer_sync(&s->timer);
diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
index a801f6872cad..0c2422cb04ea 100644
--- a/drivers/tty/serial/max310x.c
+++ b/drivers/tty/serial/max310x.c
@@ -460,10 +460,6 @@ static int max310x_set_ref_clk(struct max310x_port *s)
460static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen) 460static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen)
461{ 461{
462 unsigned int sts = 0, ch = 0, flag; 462 unsigned int sts = 0, ch = 0, flag;
463 struct tty_struct *tty = tty_port_tty_get(&s->port.state->port);
464
465 if (!tty)
466 return;
467 463
468 if (unlikely(rxlen >= MAX310X_FIFO_SIZE)) { 464 if (unlikely(rxlen >= MAX310X_FIFO_SIZE)) {
469 dev_warn(s->port.dev, "Possible RX FIFO overrun %d\n", rxlen); 465 dev_warn(s->port.dev, "Possible RX FIFO overrun %d\n", rxlen);
@@ -516,9 +512,7 @@ static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen)
516 ch, flag); 512 ch, flag);
517 } 513 }
518 514
519 tty_flip_buffer_push(tty); 515 tty_flip_buffer_push(&s->port.state->port);
520
521 tty_kref_put(tty);
522} 516}
523 517
524static void max310x_handle_tx(struct max310x_port *s) 518static void max310x_handle_tx(struct max310x_port *s)
diff --git a/drivers/tty/serial/mcf.c b/drivers/tty/serial/mcf.c
index fcd56ab6053f..e956377a38fe 100644
--- a/drivers/tty/serial/mcf.c
+++ b/drivers/tty/serial/mcf.c
@@ -23,6 +23,7 @@
23#include <linux/serial.h> 23#include <linux/serial.h>
24#include <linux/serial_core.h> 24#include <linux/serial_core.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/uaccess.h>
26#include <asm/coldfire.h> 27#include <asm/coldfire.h>
27#include <asm/mcfsim.h> 28#include <asm/mcfsim.h>
28#include <asm/mcfuart.h> 29#include <asm/mcfuart.h>
@@ -55,6 +56,7 @@ struct mcf_uart {
55 struct uart_port port; 56 struct uart_port port;
56 unsigned int sigs; /* Local copy of line sigs */ 57 unsigned int sigs; /* Local copy of line sigs */
57 unsigned char imr; /* Local IMR mirror */ 58 unsigned char imr; /* Local IMR mirror */
59 struct serial_rs485 rs485; /* RS485 settings */
58}; 60};
59 61
60/****************************************************************************/ 62/****************************************************************************/
@@ -101,6 +103,12 @@ static void mcf_start_tx(struct uart_port *port)
101{ 103{
102 struct mcf_uart *pp = container_of(port, struct mcf_uart, port); 104 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
103 105
106 if (pp->rs485.flags & SER_RS485_ENABLED) {
107 /* Enable Transmitter */
108 writeb(MCFUART_UCR_TXENABLE, port->membase + MCFUART_UCR);
109 /* Manually assert RTS */
110 writeb(MCFUART_UOP_RTS, port->membase + MCFUART_UOP1);
111 }
104 pp->imr |= MCFUART_UIR_TXREADY; 112 pp->imr |= MCFUART_UIR_TXREADY;
105 writeb(pp->imr, port->membase + MCFUART_UIMR); 113 writeb(pp->imr, port->membase + MCFUART_UIMR);
106} 114}
@@ -196,6 +204,7 @@ static void mcf_shutdown(struct uart_port *port)
196static void mcf_set_termios(struct uart_port *port, struct ktermios *termios, 204static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
197 struct ktermios *old) 205 struct ktermios *old)
198{ 206{
207 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
199 unsigned long flags; 208 unsigned long flags;
200 unsigned int baud, baudclk; 209 unsigned int baud, baudclk;
201#if defined(CONFIG_M5272) 210#if defined(CONFIG_M5272)
@@ -248,6 +257,11 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
248 mr2 |= MCFUART_MR2_TXCTS; 257 mr2 |= MCFUART_MR2_TXCTS;
249 } 258 }
250 259
260 if (pp->rs485.flags & SER_RS485_ENABLED) {
261 dev_dbg(port->dev, "Setting UART to RS485\n");
262 mr2 |= MCFUART_MR2_TXRTS;
263 }
264
251 spin_lock_irqsave(&port->lock, flags); 265 spin_lock_irqsave(&port->lock, flags);
252 uart_update_timeout(port, termios->c_cflag, baud); 266 uart_update_timeout(port, termios->c_cflag, baud);
253 writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR); 267 writeb(MCFUART_UCR_CMDRESETRX, port->membase + MCFUART_UCR);
@@ -310,7 +324,7 @@ static void mcf_rx_chars(struct mcf_uart *pp)
310 uart_insert_char(port, status, MCFUART_USR_RXOVERRUN, ch, flag); 324 uart_insert_char(port, status, MCFUART_USR_RXOVERRUN, ch, flag);
311 } 325 }
312 326
313 tty_flip_buffer_push(port->state->port.tty); 327 tty_flip_buffer_push(&port->state->port);
314} 328}
315 329
316/****************************************************************************/ 330/****************************************************************************/
@@ -342,6 +356,10 @@ static void mcf_tx_chars(struct mcf_uart *pp)
342 if (xmit->head == xmit->tail) { 356 if (xmit->head == xmit->tail) {
343 pp->imr &= ~MCFUART_UIR_TXREADY; 357 pp->imr &= ~MCFUART_UIR_TXREADY;
344 writeb(pp->imr, port->membase + MCFUART_UIMR); 358 writeb(pp->imr, port->membase + MCFUART_UIMR);
359 /* Disable TX to negate RTS automatically */
360 if (pp->rs485.flags & SER_RS485_ENABLED)
361 writeb(MCFUART_UCR_TXDISABLE,
362 port->membase + MCFUART_UCR);
345 } 363 }
346} 364}
347 365
@@ -418,6 +436,58 @@ static int mcf_verify_port(struct uart_port *port, struct serial_struct *ser)
418 436
419/****************************************************************************/ 437/****************************************************************************/
420 438
439/* Enable or disable the RS485 support */
440static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
441{
442 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
443 unsigned long flags;
444 unsigned char mr1, mr2;
445
446 spin_lock_irqsave(&port->lock, flags);
447 /* Get mode registers */
448 mr1 = readb(port->membase + MCFUART_UMR);
449 mr2 = readb(port->membase + MCFUART_UMR);
450 if (rs485->flags & SER_RS485_ENABLED) {
451 dev_dbg(port->dev, "Setting UART to RS485\n");
452 /* Automatically negate RTS after TX completes */
453 mr2 |= MCFUART_MR2_TXRTS;
454 } else {
455 dev_dbg(port->dev, "Setting UART to RS232\n");
456 mr2 &= ~MCFUART_MR2_TXRTS;
457 }
458 writeb(mr1, port->membase + MCFUART_UMR);
459 writeb(mr2, port->membase + MCFUART_UMR);
460 pp->rs485 = *rs485;
461 spin_unlock_irqrestore(&port->lock, flags);
462}
463
464static int mcf_ioctl(struct uart_port *port, unsigned int cmd,
465 unsigned long arg)
466{
467 switch (cmd) {
468 case TIOCSRS485: {
469 struct serial_rs485 rs485;
470 if (copy_from_user(&rs485, (struct serial_rs485 *)arg,
471 sizeof(struct serial_rs485)))
472 return -EFAULT;
473 mcf_config_rs485(port, &rs485);
474 break;
475 }
476 case TIOCGRS485: {
477 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
478 if (copy_to_user((struct serial_rs485 *)arg, &pp->rs485,
479 sizeof(struct serial_rs485)))
480 return -EFAULT;
481 break;
482 }
483 default:
484 return -ENOIOCTLCMD;
485 }
486 return 0;
487}
488
489/****************************************************************************/
490
421/* 491/*
422 * Define the basic serial functions we support. 492 * Define the basic serial functions we support.
423 */ 493 */
@@ -438,6 +508,7 @@ static const struct uart_ops mcf_uart_ops = {
438 .release_port = mcf_release_port, 508 .release_port = mcf_release_port,
439 .config_port = mcf_config_port, 509 .config_port = mcf_config_port,
440 .verify_port = mcf_verify_port, 510 .verify_port = mcf_verify_port,
511 .ioctl = mcf_ioctl,
441}; 512};
442 513
443static struct mcf_uart mcf_ports[4]; 514static struct mcf_uart mcf_ports[4];
diff --git a/drivers/tty/serial/mfd.c b/drivers/tty/serial/mfd.c
index 2c01344dc332..5f4765a7a5c5 100644
--- a/drivers/tty/serial/mfd.c
+++ b/drivers/tty/serial/mfd.c
@@ -387,12 +387,9 @@ void hsu_dma_rx(struct uart_hsu_port *up, u32 int_sts)
387 struct hsu_dma_buffer *dbuf = &up->rxbuf; 387 struct hsu_dma_buffer *dbuf = &up->rxbuf;
388 struct hsu_dma_chan *chan = up->rxc; 388 struct hsu_dma_chan *chan = up->rxc;
389 struct uart_port *port = &up->port; 389 struct uart_port *port = &up->port;
390 struct tty_struct *tty = port->state->port.tty; 390 struct tty_port *tport = &port->state->port;
391 int count; 391 int count;
392 392
393 if (!tty)
394 return;
395
396 /* 393 /*
397 * First need to know how many is already transferred, 394 * First need to know how many is already transferred,
398 * then check if its a timeout DMA irq, and return 395 * then check if its a timeout DMA irq, and return
@@ -423,7 +420,7 @@ void hsu_dma_rx(struct uart_hsu_port *up, u32 int_sts)
423 * explicitly set tail to 0. So head will 420 * explicitly set tail to 0. So head will
424 * always be greater than tail. 421 * always be greater than tail.
425 */ 422 */
426 tty_insert_flip_string(tty, dbuf->buf, count); 423 tty_insert_flip_string(tport, dbuf->buf, count);
427 port->icount.rx += count; 424 port->icount.rx += count;
428 425
429 dma_sync_single_for_device(up->port.dev, dbuf->dma_addr, 426 dma_sync_single_for_device(up->port.dev, dbuf->dma_addr,
@@ -437,7 +434,7 @@ void hsu_dma_rx(struct uart_hsu_port *up, u32 int_sts)
437 | (0x1 << 16) 434 | (0x1 << 16)
438 | (0x1 << 24) /* timeout bit, see HSU Errata 1 */ 435 | (0x1 << 24) /* timeout bit, see HSU Errata 1 */
439 ); 436 );
440 tty_flip_buffer_push(tty); 437 tty_flip_buffer_push(tport);
441 438
442 chan_writel(chan, HSU_CH_CR, 0x3); 439 chan_writel(chan, HSU_CH_CR, 0x3);
443 440
@@ -460,13 +457,9 @@ static void serial_hsu_stop_rx(struct uart_port *port)
460 457
461static inline void receive_chars(struct uart_hsu_port *up, int *status) 458static inline void receive_chars(struct uart_hsu_port *up, int *status)
462{ 459{
463 struct tty_struct *tty = up->port.state->port.tty;
464 unsigned int ch, flag; 460 unsigned int ch, flag;
465 unsigned int max_count = 256; 461 unsigned int max_count = 256;
466 462
467 if (!tty)
468 return;
469
470 do { 463 do {
471 ch = serial_in(up, UART_RX); 464 ch = serial_in(up, UART_RX);
472 flag = TTY_NORMAL; 465 flag = TTY_NORMAL;
@@ -522,7 +515,7 @@ static inline void receive_chars(struct uart_hsu_port *up, int *status)
522 ignore_char: 515 ignore_char:
523 *status = serial_in(up, UART_LSR); 516 *status = serial_in(up, UART_LSR);
524 } while ((*status & UART_LSR_DR) && max_count--); 517 } while ((*status & UART_LSR_DR) && max_count--);
525 tty_flip_buffer_push(tty); 518 tty_flip_buffer_push(&up->port.state->port);
526} 519}
527 520
528static void transmit_chars(struct uart_hsu_port *up) 521static void transmit_chars(struct uart_hsu_port *up)
diff --git a/drivers/tty/serial/mpc52xx_uart.c b/drivers/tty/serial/mpc52xx_uart.c
index 7c23c4f4c58d..c0e1fad51be7 100644
--- a/drivers/tty/serial/mpc52xx_uart.c
+++ b/drivers/tty/serial/mpc52xx_uart.c
@@ -941,7 +941,7 @@ static struct uart_ops mpc52xx_uart_ops = {
941static inline int 941static inline int
942mpc52xx_uart_int_rx_chars(struct uart_port *port) 942mpc52xx_uart_int_rx_chars(struct uart_port *port)
943{ 943{
944 struct tty_struct *tty = port->state->port.tty; 944 struct tty_port *tport = &port->state->port;
945 unsigned char ch, flag; 945 unsigned char ch, flag;
946 unsigned short status; 946 unsigned short status;
947 947
@@ -986,20 +986,20 @@ mpc52xx_uart_int_rx_chars(struct uart_port *port)
986 out_8(&PSC(port)->command, MPC52xx_PSC_RST_ERR_STAT); 986 out_8(&PSC(port)->command, MPC52xx_PSC_RST_ERR_STAT);
987 987
988 } 988 }
989 tty_insert_flip_char(tty, ch, flag); 989 tty_insert_flip_char(tport, ch, flag);
990 if (status & MPC52xx_PSC_SR_OE) { 990 if (status & MPC52xx_PSC_SR_OE) {
991 /* 991 /*
992 * Overrun is special, since it's 992 * Overrun is special, since it's
993 * reported immediately, and doesn't 993 * reported immediately, and doesn't
994 * affect the current character 994 * affect the current character
995 */ 995 */
996 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 996 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
997 port->icount.overrun++; 997 port->icount.overrun++;
998 } 998 }
999 } 999 }
1000 1000
1001 spin_unlock(&port->lock); 1001 spin_unlock(&port->lock);
1002 tty_flip_buffer_push(tty); 1002 tty_flip_buffer_push(tport);
1003 spin_lock(&port->lock); 1003 spin_lock(&port->lock);
1004 1004
1005 return psc_ops->raw_rx_rdy(port); 1005 return psc_ops->raw_rx_rdy(port);
diff --git a/drivers/tty/serial/mpsc.c b/drivers/tty/serial/mpsc.c
index 6a9c6605666a..bc24f4931670 100644
--- a/drivers/tty/serial/mpsc.c
+++ b/drivers/tty/serial/mpsc.c
@@ -937,7 +937,7 @@ static int serial_polled;
937static int mpsc_rx_intr(struct mpsc_port_info *pi) 937static int mpsc_rx_intr(struct mpsc_port_info *pi)
938{ 938{
939 struct mpsc_rx_desc *rxre; 939 struct mpsc_rx_desc *rxre;
940 struct tty_struct *tty = pi->port.state->port.tty; 940 struct tty_port *port = &pi->port.state->port;
941 u32 cmdstat, bytes_in, i; 941 u32 cmdstat, bytes_in, i;
942 int rc = 0; 942 int rc = 0;
943 u8 *bp; 943 u8 *bp;
@@ -968,10 +968,9 @@ static int mpsc_rx_intr(struct mpsc_port_info *pi)
968 } 968 }
969#endif 969#endif
970 /* Following use of tty struct directly is deprecated */ 970 /* Following use of tty struct directly is deprecated */
971 if (unlikely(tty_buffer_request_room(tty, bytes_in) 971 if (tty_buffer_request_room(port, bytes_in) < bytes_in) {
972 < bytes_in)) { 972 if (port->low_latency)
973 if (tty->low_latency) 973 tty_flip_buffer_push(port);
974 tty_flip_buffer_push(tty);
975 /* 974 /*
976 * If this failed then we will throw away the bytes 975 * If this failed then we will throw away the bytes
977 * but must do so to clear interrupts. 976 * but must do so to clear interrupts.
@@ -1040,10 +1039,10 @@ static int mpsc_rx_intr(struct mpsc_port_info *pi)
1040 | SDMA_DESC_CMDSTAT_FR 1039 | SDMA_DESC_CMDSTAT_FR
1041 | SDMA_DESC_CMDSTAT_OR))) 1040 | SDMA_DESC_CMDSTAT_OR)))
1042 && !(cmdstat & pi->port.ignore_status_mask)) { 1041 && !(cmdstat & pi->port.ignore_status_mask)) {
1043 tty_insert_flip_char(tty, *bp, flag); 1042 tty_insert_flip_char(port, *bp, flag);
1044 } else { 1043 } else {
1045 for (i=0; i<bytes_in; i++) 1044 for (i=0; i<bytes_in; i++)
1046 tty_insert_flip_char(tty, *bp++, TTY_NORMAL); 1045 tty_insert_flip_char(port, *bp++, TTY_NORMAL);
1047 1046
1048 pi->port.icount.rx += bytes_in; 1047 pi->port.icount.rx += bytes_in;
1049 } 1048 }
@@ -1081,7 +1080,7 @@ next_frame:
1081 if ((readl(pi->sdma_base + SDMA_SDCM) & SDMA_SDCM_ERD) == 0) 1080 if ((readl(pi->sdma_base + SDMA_SDCM) & SDMA_SDCM_ERD) == 0)
1082 mpsc_start_rx(pi); 1081 mpsc_start_rx(pi);
1083 1082
1084 tty_flip_buffer_push(tty); 1083 tty_flip_buffer_push(port);
1085 return rc; 1084 return rc;
1086} 1085}
1087 1086
diff --git a/drivers/tty/serial/mrst_max3110.c b/drivers/tty/serial/mrst_max3110.c
index 58734d7e746d..f641c232beca 100644
--- a/drivers/tty/serial/mrst_max3110.c
+++ b/drivers/tty/serial/mrst_max3110.c
@@ -339,7 +339,7 @@ static int
339receive_chars(struct uart_max3110 *max, unsigned short *str, int len) 339receive_chars(struct uart_max3110 *max, unsigned short *str, int len)
340{ 340{
341 struct uart_port *port = &max->port; 341 struct uart_port *port = &max->port;
342 struct tty_struct *tty; 342 struct tty_port *tport;
343 char buf[M3110_RX_FIFO_DEPTH]; 343 char buf[M3110_RX_FIFO_DEPTH];
344 int r, w, usable; 344 int r, w, usable;
345 345
@@ -347,9 +347,7 @@ receive_chars(struct uart_max3110 *max, unsigned short *str, int len)
347 if (!port->state) 347 if (!port->state)
348 return 0; 348 return 0;
349 349
350 tty = tty_port_tty_get(&port->state->port); 350 tport = &port->state->port;
351 if (!tty)
352 return 0;
353 351
354 for (r = 0, w = 0; r < len; r++) { 352 for (r = 0, w = 0; r < len; r++) {
355 if (str[r] & MAX3110_BREAK && 353 if (str[r] & MAX3110_BREAK &&
@@ -364,20 +362,17 @@ receive_chars(struct uart_max3110 *max, unsigned short *str, int len)
364 } 362 }
365 } 363 }
366 364
367 if (!w) { 365 if (!w)
368 tty_kref_put(tty);
369 return 0; 366 return 0;
370 }
371 367
372 for (r = 0; w; r += usable, w -= usable) { 368 for (r = 0; w; r += usable, w -= usable) {
373 usable = tty_buffer_request_room(tty, w); 369 usable = tty_buffer_request_room(tport, w);
374 if (usable) { 370 if (usable) {
375 tty_insert_flip_string(tty, buf + r, usable); 371 tty_insert_flip_string(tport, buf + r, usable);
376 port->icount.rx += usable; 372 port->icount.rx += usable;
377 } 373 }
378 } 374 }
379 tty_flip_buffer_push(tty); 375 tty_flip_buffer_push(tport);
380 tty_kref_put(tty);
381 376
382 return r; 377 return r;
383} 378}
@@ -493,7 +488,7 @@ static int serial_m3110_startup(struct uart_port *port)
493 | WC_BAUD_DR2; 488 | WC_BAUD_DR2;
494 489
495 /* as we use thread to handle tx/rx, need set low latency */ 490 /* as we use thread to handle tx/rx, need set low latency */
496 port->state->port.tty->low_latency = 1; 491 port->state->port.low_latency = 1;
497 492
498 if (max->irq) { 493 if (max->irq) {
499 max->read_thread = NULL; 494 max->read_thread = NULL;
diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
index 95fd39be2934..b11e99797fd8 100644
--- a/drivers/tty/serial/msm_serial.c
+++ b/drivers/tty/serial/msm_serial.c
@@ -91,14 +91,14 @@ static void msm_enable_ms(struct uart_port *port)
91 91
92static void handle_rx_dm(struct uart_port *port, unsigned int misr) 92static void handle_rx_dm(struct uart_port *port, unsigned int misr)
93{ 93{
94 struct tty_struct *tty = port->state->port.tty; 94 struct tty_port *tport = &port->state->port;
95 unsigned int sr; 95 unsigned int sr;
96 int count = 0; 96 int count = 0;
97 struct msm_port *msm_port = UART_TO_MSM(port); 97 struct msm_port *msm_port = UART_TO_MSM(port);
98 98
99 if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) { 99 if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) {
100 port->icount.overrun++; 100 port->icount.overrun++;
101 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 101 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
102 msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR); 102 msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR);
103 } 103 }
104 104
@@ -132,12 +132,12 @@ static void handle_rx_dm(struct uart_port *port, unsigned int misr)
132 port->icount.frame++; 132 port->icount.frame++;
133 133
134 /* TODO: handle sysrq */ 134 /* TODO: handle sysrq */
135 tty_insert_flip_string(tty, (char *) &c, 135 tty_insert_flip_string(tport, (char *)&c,
136 (count > 4) ? 4 : count); 136 (count > 4) ? 4 : count);
137 count -= 4; 137 count -= 4;
138 } 138 }
139 139
140 tty_flip_buffer_push(tty); 140 tty_flip_buffer_push(tport);
141 if (misr & (UART_IMR_RXSTALE)) 141 if (misr & (UART_IMR_RXSTALE))
142 msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR); 142 msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR);
143 msm_write(port, 0xFFFFFF, UARTDM_DMRX); 143 msm_write(port, 0xFFFFFF, UARTDM_DMRX);
@@ -146,7 +146,7 @@ static void handle_rx_dm(struct uart_port *port, unsigned int misr)
146 146
147static void handle_rx(struct uart_port *port) 147static void handle_rx(struct uart_port *port)
148{ 148{
149 struct tty_struct *tty = port->state->port.tty; 149 struct tty_port *tport = &port->state->port;
150 unsigned int sr; 150 unsigned int sr;
151 151
152 /* 152 /*
@@ -155,7 +155,7 @@ static void handle_rx(struct uart_port *port)
155 */ 155 */
156 if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) { 156 if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) {
157 port->icount.overrun++; 157 port->icount.overrun++;
158 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 158 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
159 msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR); 159 msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR);
160 } 160 }
161 161
@@ -186,10 +186,10 @@ static void handle_rx(struct uart_port *port)
186 } 186 }
187 187
188 if (!uart_handle_sysrq_char(port, c)) 188 if (!uart_handle_sysrq_char(port, c))
189 tty_insert_flip_char(tty, c, flag); 189 tty_insert_flip_char(tport, c, flag);
190 } 190 }
191 191
192 tty_flip_buffer_push(tty); 192 tty_flip_buffer_push(tport);
193} 193}
194 194
195static void reset_dm_count(struct uart_port *port) 195static void reset_dm_count(struct uart_port *port)
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c
index 1fa92284ade0..4a942c78347e 100644
--- a/drivers/tty/serial/msm_serial_hs.c
+++ b/drivers/tty/serial/msm_serial_hs.c
@@ -908,6 +908,7 @@ static void msm_hs_dmov_rx_callback(struct msm_dmov_cmd *cmd_ptr,
908 unsigned long flags; 908 unsigned long flags;
909 unsigned int flush; 909 unsigned int flush;
910 struct tty_struct *tty; 910 struct tty_struct *tty;
911 struct tty_port *port;
911 struct uart_port *uport; 912 struct uart_port *uport;
912 struct msm_hs_port *msm_uport; 913 struct msm_hs_port *msm_uport;
913 914
@@ -917,7 +918,8 @@ static void msm_hs_dmov_rx_callback(struct msm_dmov_cmd *cmd_ptr,
917 spin_lock_irqsave(&uport->lock, flags); 918 spin_lock_irqsave(&uport->lock, flags);
918 clk_enable(msm_uport->clk); 919 clk_enable(msm_uport->clk);
919 920
920 tty = uport->state->port.tty; 921 port = &uport->state->port;
922 tty = port->tty;
921 923
922 msm_hs_write(uport, UARTDM_CR_ADDR, STALE_EVENT_DISABLE); 924 msm_hs_write(uport, UARTDM_CR_ADDR, STALE_EVENT_DISABLE);
923 925
@@ -926,7 +928,7 @@ static void msm_hs_dmov_rx_callback(struct msm_dmov_cmd *cmd_ptr,
926 /* overflow is not connect to data in a FIFO */ 928 /* overflow is not connect to data in a FIFO */
927 if (unlikely((status & UARTDM_SR_OVERRUN_BMSK) && 929 if (unlikely((status & UARTDM_SR_OVERRUN_BMSK) &&
928 (uport->read_status_mask & CREAD))) { 930 (uport->read_status_mask & CREAD))) {
929 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 931 tty_insert_flip_char(port, 0, TTY_OVERRUN);
930 uport->icount.buf_overrun++; 932 uport->icount.buf_overrun++;
931 error_f = 1; 933 error_f = 1;
932 } 934 }
@@ -939,7 +941,7 @@ static void msm_hs_dmov_rx_callback(struct msm_dmov_cmd *cmd_ptr,
939 uport->icount.parity++; 941 uport->icount.parity++;
940 error_f = 1; 942 error_f = 1;
941 if (uport->ignore_status_mask & IGNPAR) 943 if (uport->ignore_status_mask & IGNPAR)
942 tty_insert_flip_char(tty, 0, TTY_PARITY); 944 tty_insert_flip_char(port, 0, TTY_PARITY);
943 } 945 }
944 946
945 if (error_f) 947 if (error_f)
@@ -959,7 +961,7 @@ static void msm_hs_dmov_rx_callback(struct msm_dmov_cmd *cmd_ptr,
959 rx_count = msm_hs_read(uport, UARTDM_RX_TOTAL_SNAP_ADDR); 961 rx_count = msm_hs_read(uport, UARTDM_RX_TOTAL_SNAP_ADDR);
960 962
961 if (0 != (uport->read_status_mask & CREAD)) { 963 if (0 != (uport->read_status_mask & CREAD)) {
962 retval = tty_insert_flip_string(tty, msm_uport->rx.buffer, 964 retval = tty_insert_flip_string(port, msm_uport->rx.buffer,
963 rx_count); 965 rx_count);
964 BUG_ON(retval != rx_count); 966 BUG_ON(retval != rx_count);
965 } 967 }
@@ -979,9 +981,8 @@ static void msm_hs_tty_flip_buffer_work(struct work_struct *work)
979{ 981{
980 struct msm_hs_port *msm_uport = 982 struct msm_hs_port *msm_uport =
981 container_of(work, struct msm_hs_port, rx.tty_work); 983 container_of(work, struct msm_hs_port, rx.tty_work);
982 struct tty_struct *tty = msm_uport->uport.state->port.tty;
983 984
984 tty_flip_buffer_push(tty); 985 tty_flip_buffer_push(&msm_uport->uport.state->port);
985} 986}
986 987
987/* 988/*
@@ -1344,7 +1345,6 @@ static irqreturn_t msm_hs_rx_wakeup_isr(int irq, void *dev)
1344 unsigned long flags; 1345 unsigned long flags;
1345 struct msm_hs_port *msm_uport = dev; 1346 struct msm_hs_port *msm_uport = dev;
1346 struct uart_port *uport = &msm_uport->uport; 1347 struct uart_port *uport = &msm_uport->uport;
1347 struct tty_struct *tty = NULL;
1348 1348
1349 spin_lock_irqsave(&uport->lock, flags); 1349 spin_lock_irqsave(&uport->lock, flags);
1350 if (msm_uport->clk_state == MSM_HS_CLK_OFF) { 1350 if (msm_uport->clk_state == MSM_HS_CLK_OFF) {
@@ -1361,8 +1361,7 @@ static irqreturn_t msm_hs_rx_wakeup_isr(int irq, void *dev)
1361 * optionally inject char into tty rx */ 1361 * optionally inject char into tty rx */
1362 msm_hs_request_clock_on_locked(uport); 1362 msm_hs_request_clock_on_locked(uport);
1363 if (msm_uport->rx_wakeup.inject_rx) { 1363 if (msm_uport->rx_wakeup.inject_rx) {
1364 tty = uport->state->port.tty; 1364 tty_insert_flip_char(&uport->state->port,
1365 tty_insert_flip_char(tty,
1366 msm_uport->rx_wakeup.rx_to_inject, 1365 msm_uport->rx_wakeup.rx_to_inject,
1367 TTY_NORMAL); 1366 TTY_NORMAL);
1368 queue_work(msm_hs_workqueue, &msm_uport->rx.tty_work); 1367 queue_work(msm_hs_workqueue, &msm_uport->rx.tty_work);
@@ -1400,7 +1399,7 @@ static int msm_hs_startup(struct uart_port *uport)
1400 1399
1401 /* do not let tty layer execute RX in global workqueue, use a 1400 /* do not let tty layer execute RX in global workqueue, use a
1402 * dedicated workqueue managed by this driver */ 1401 * dedicated workqueue managed by this driver */
1403 uport->state->port.tty->low_latency = 1; 1402 uport->state->port.low_latency = 1;
1404 1403
1405 /* turn on uart clk */ 1404 /* turn on uart clk */
1406 ret = msm_hs_init_clk_locked(uport); 1405 ret = msm_hs_init_clk_locked(uport);
diff --git a/drivers/tty/serial/msm_smd_tty.c b/drivers/tty/serial/msm_smd_tty.c
index 925d1fa153db..e722ff163d91 100644
--- a/drivers/tty/serial/msm_smd_tty.c
+++ b/drivers/tty/serial/msm_smd_tty.c
@@ -70,7 +70,7 @@ static void smd_tty_notify(void *priv, unsigned event)
70 if (avail == 0) 70 if (avail == 0)
71 break; 71 break;
72 72
73 avail = tty_prepare_flip_string(tty, &ptr, avail); 73 avail = tty_prepare_flip_string(&info->port, &ptr, avail);
74 74
75 if (smd_read(info->ch, ptr, avail) != avail) { 75 if (smd_read(info->ch, ptr, avail) != avail) {
76 /* shouldn't be possible since we're in interrupt 76 /* shouldn't be possible since we're in interrupt
@@ -80,7 +80,7 @@ static void smd_tty_notify(void *priv, unsigned event)
80 pr_err("OOPS - smd_tty_buffer mismatch?!"); 80 pr_err("OOPS - smd_tty_buffer mismatch?!");
81 } 81 }
82 82
83 tty_flip_buffer_push(tty); 83 tty_flip_buffer_push(&info->port);
84 } 84 }
85 85
86 /* XXX only when writable and necessary */ 86 /* XXX only when writable and necessary */
diff --git a/drivers/tty/serial/mux.c b/drivers/tty/serial/mux.c
index e2775b6df5a5..7fd6aaaacd8e 100644
--- a/drivers/tty/serial/mux.c
+++ b/drivers/tty/serial/mux.c
@@ -242,8 +242,8 @@ static void mux_write(struct uart_port *port)
242 */ 242 */
243static void mux_read(struct uart_port *port) 243static void mux_read(struct uart_port *port)
244{ 244{
245 struct tty_port *tport = &port->state->port;
245 int data; 246 int data;
246 struct tty_struct *tty = port->state->port.tty;
247 __u32 start_count = port->icount.rx; 247 __u32 start_count = port->icount.rx;
248 248
249 while(1) { 249 while(1) {
@@ -266,12 +266,11 @@ static void mux_read(struct uart_port *port)
266 if (uart_handle_sysrq_char(port, data & 0xffu)) 266 if (uart_handle_sysrq_char(port, data & 0xffu))
267 continue; 267 continue;
268 268
269 tty_insert_flip_char(tty, data & 0xFF, TTY_NORMAL); 269 tty_insert_flip_char(tport, data & 0xFF, TTY_NORMAL);
270 } 270 }
271 271
272 if (start_count != port->icount.rx) { 272 if (start_count != port->icount.rx)
273 tty_flip_buffer_push(tty); 273 tty_flip_buffer_push(tport);
274 }
275} 274}
276 275
277/** 276/**
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index e55615eb34ad..d549fe1fa42a 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -364,7 +364,6 @@ out:
364 364
365static void mxs_auart_rx_chars(struct mxs_auart_port *s) 365static void mxs_auart_rx_chars(struct mxs_auart_port *s)
366{ 366{
367 struct tty_struct *tty = s->port.state->port.tty;
368 u32 stat = 0; 367 u32 stat = 0;
369 368
370 for (;;) { 369 for (;;) {
@@ -375,7 +374,7 @@ static void mxs_auart_rx_chars(struct mxs_auart_port *s)
375 } 374 }
376 375
377 writel(stat, s->port.membase + AUART_STAT); 376 writel(stat, s->port.membase + AUART_STAT);
378 tty_flip_buffer_push(tty); 377 tty_flip_buffer_push(&s->port.state->port);
379} 378}
380 379
381static int mxs_auart_request_port(struct uart_port *u) 380static int mxs_auart_request_port(struct uart_port *u)
@@ -459,7 +458,7 @@ static int mxs_auart_dma_prep_rx(struct mxs_auart_port *s);
459static void dma_rx_callback(void *arg) 458static void dma_rx_callback(void *arg)
460{ 459{
461 struct mxs_auart_port *s = (struct mxs_auart_port *) arg; 460 struct mxs_auart_port *s = (struct mxs_auart_port *) arg;
462 struct tty_struct *tty = s->port.state->port.tty; 461 struct tty_port *port = &s->port.state->port;
463 int count; 462 int count;
464 u32 stat; 463 u32 stat;
465 464
@@ -470,10 +469,10 @@ static void dma_rx_callback(void *arg)
470 AUART_STAT_PERR | AUART_STAT_FERR); 469 AUART_STAT_PERR | AUART_STAT_FERR);
471 470
472 count = stat & AUART_STAT_RXCOUNT_MASK; 471 count = stat & AUART_STAT_RXCOUNT_MASK;
473 tty_insert_flip_string(tty, s->rx_dma_buf, count); 472 tty_insert_flip_string(port, s->rx_dma_buf, count);
474 473
475 writel(stat, s->port.membase + AUART_STAT); 474 writel(stat, s->port.membase + AUART_STAT);
476 tty_flip_buffer_push(tty); 475 tty_flip_buffer_push(port);
477 476
478 /* start the next DMA for RX. */ 477 /* start the next DMA for RX. */
479 mxs_auart_dma_prep_rx(s); 478 mxs_auart_dma_prep_rx(s);
@@ -552,7 +551,7 @@ static int mxs_auart_dma_init(struct mxs_auart_port *s)
552 return 0; 551 return 0;
553 552
554 /* We do not get the right DMA channels. */ 553 /* We do not get the right DMA channels. */
555 if (s->dma_channel_rx == -1 || s->dma_channel_rx == -1) 554 if (s->dma_channel_rx == -1 || s->dma_channel_tx == -1)
556 return -EINVAL; 555 return -EINVAL;
557 556
558 /* init for RX */ 557 /* init for RX */
diff --git a/drivers/tty/serial/netx-serial.c b/drivers/tty/serial/netx-serial.c
index d40da78e7c85..b9a40ed70be2 100644
--- a/drivers/tty/serial/netx-serial.c
+++ b/drivers/tty/serial/netx-serial.c
@@ -199,7 +199,6 @@ static void netx_txint(struct uart_port *port)
199static void netx_rxint(struct uart_port *port) 199static void netx_rxint(struct uart_port *port)
200{ 200{
201 unsigned char rx, flg, status; 201 unsigned char rx, flg, status;
202 struct tty_struct *tty = port->state->port.tty;
203 202
204 while (!(readl(port->membase + UART_FR) & FR_RXFE)) { 203 while (!(readl(port->membase + UART_FR) & FR_RXFE)) {
205 rx = readl(port->membase + UART_DR); 204 rx = readl(port->membase + UART_DR);
@@ -237,8 +236,7 @@ static void netx_rxint(struct uart_port *port)
237 uart_insert_char(port, status, SR_OE, rx, flg); 236 uart_insert_char(port, status, SR_OE, rx, flg);
238 } 237 }
239 238
240 tty_flip_buffer_push(tty); 239 tty_flip_buffer_push(&port->state->port);
241 return;
242} 240}
243 241
244static irqreturn_t netx_int(int irq, void *dev_id) 242static irqreturn_t netx_int(int irq, void *dev_id)
diff --git a/drivers/tty/serial/nwpserial.c b/drivers/tty/serial/nwpserial.c
index dd4c31d1aee5..77287c54f331 100644
--- a/drivers/tty/serial/nwpserial.c
+++ b/drivers/tty/serial/nwpserial.c
@@ -128,7 +128,7 @@ static void nwpserial_config_port(struct uart_port *port, int flags)
128static irqreturn_t nwpserial_interrupt(int irq, void *dev_id) 128static irqreturn_t nwpserial_interrupt(int irq, void *dev_id)
129{ 129{
130 struct nwpserial_port *up = dev_id; 130 struct nwpserial_port *up = dev_id;
131 struct tty_struct *tty = up->port.state->port.tty; 131 struct tty_port *port = &up->port.state->port;
132 irqreturn_t ret; 132 irqreturn_t ret;
133 unsigned int iir; 133 unsigned int iir;
134 unsigned char ch; 134 unsigned char ch;
@@ -146,10 +146,10 @@ static irqreturn_t nwpserial_interrupt(int irq, void *dev_id)
146 up->port.icount.rx++; 146 up->port.icount.rx++;
147 ch = dcr_read(up->dcr_host, UART_RX); 147 ch = dcr_read(up->dcr_host, UART_RX);
148 if (up->port.ignore_status_mask != NWPSERIAL_STATUS_RXVALID) 148 if (up->port.ignore_status_mask != NWPSERIAL_STATUS_RXVALID)
149 tty_insert_flip_char(tty, ch, TTY_NORMAL); 149 tty_insert_flip_char(port, ch, TTY_NORMAL);
150 } while (dcr_read(up->dcr_host, UART_LSR) & UART_LSR_DR); 150 } while (dcr_read(up->dcr_host, UART_LSR) & UART_LSR_DR);
151 151
152 tty_flip_buffer_push(tty); 152 tty_flip_buffer_push(port);
153 ret = IRQ_HANDLED; 153 ret = IRQ_HANDLED;
154 154
155 /* clear interrupt */ 155 /* clear interrupt */
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 57d6b29c039c..9915e4d1418c 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -232,24 +232,42 @@ static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
232} 232}
233 233
234/* 234/*
235 * serial_omap_baud_is_mode16 - check if baud rate is MODE16X
236 * @port: uart port info
237 * @baud: baudrate for which mode needs to be determined
238 *
239 * Returns true if baud rate is MODE16X and false if MODE13X
240 * Original table in OMAP TRM named "UART Mode Baud Rates, Divisor Values,
241 * and Error Rates" determines modes not for all common baud rates.
242 * E.g. for 1000000 baud rate mode must be 16x, but according to that
243 * table it's determined as 13x.
244 */
245static bool
246serial_omap_baud_is_mode16(struct uart_port *port, unsigned int baud)
247{
248 unsigned int n13 = port->uartclk / (13 * baud);
249 unsigned int n16 = port->uartclk / (16 * baud);
250 int baudAbsDiff13 = baud - (port->uartclk / (13 * n13));
251 int baudAbsDiff16 = baud - (port->uartclk / (16 * n16));
252 if(baudAbsDiff13 < 0)
253 baudAbsDiff13 = -baudAbsDiff13;
254 if(baudAbsDiff16 < 0)
255 baudAbsDiff16 = -baudAbsDiff16;
256
257 return (baudAbsDiff13 > baudAbsDiff16);
258}
259
260/*
235 * serial_omap_get_divisor - calculate divisor value 261 * serial_omap_get_divisor - calculate divisor value
236 * @port: uart port info 262 * @port: uart port info
237 * @baud: baudrate for which divisor needs to be calculated. 263 * @baud: baudrate for which divisor needs to be calculated.
238 *
239 * We have written our own function to get the divisor so as to support
240 * 13x mode. 3Mbps Baudrate as an different divisor.
241 * Reference OMAP TRM Chapter 17:
242 * Table 17-1. UART Mode Baud Rates, Divisor Values, and Error Rates
243 * referring to oversampling - divisor value
244 * baudrate 460,800 to 3,686,400 all have divisor 13
245 * except 3,000,000 which has divisor value 16
246 */ 264 */
247static unsigned int 265static unsigned int
248serial_omap_get_divisor(struct uart_port *port, unsigned int baud) 266serial_omap_get_divisor(struct uart_port *port, unsigned int baud)
249{ 267{
250 unsigned int divisor; 268 unsigned int divisor;
251 269
252 if (baud > OMAP_MODE13X_SPEED && baud != 3000000) 270 if (!serial_omap_baud_is_mode16(port, baud))
253 divisor = 13; 271 divisor = 13;
254 else 272 else
255 divisor = 16; 273 divisor = 16;
@@ -483,7 +501,6 @@ static void serial_omap_rdi(struct uart_omap_port *up, unsigned int lsr)
483static irqreturn_t serial_omap_irq(int irq, void *dev_id) 501static irqreturn_t serial_omap_irq(int irq, void *dev_id)
484{ 502{
485 struct uart_omap_port *up = dev_id; 503 struct uart_omap_port *up = dev_id;
486 struct tty_struct *tty = up->port.state->port.tty;
487 unsigned int iir, lsr; 504 unsigned int iir, lsr;
488 unsigned int type; 505 unsigned int type;
489 irqreturn_t ret = IRQ_NONE; 506 irqreturn_t ret = IRQ_NONE;
@@ -530,7 +547,7 @@ static irqreturn_t serial_omap_irq(int irq, void *dev_id)
530 547
531 spin_unlock(&up->port.lock); 548 spin_unlock(&up->port.lock);
532 549
533 tty_flip_buffer_push(tty); 550 tty_flip_buffer_push(&up->port.state->port);
534 551
535 pm_runtime_mark_last_busy(up->dev); 552 pm_runtime_mark_last_busy(up->dev);
536 pm_runtime_put_autosuspend(up->dev); 553 pm_runtime_put_autosuspend(up->dev);
@@ -776,6 +793,8 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
776 cval |= UART_LCR_PARITY; 793 cval |= UART_LCR_PARITY;
777 if (!(termios->c_cflag & PARODD)) 794 if (!(termios->c_cflag & PARODD))
778 cval |= UART_LCR_EPAR; 795 cval |= UART_LCR_EPAR;
796 if (termios->c_cflag & CMSPAR)
797 cval |= UART_LCR_SPAR;
779 798
780 /* 799 /*
781 * Ask the core to calculate the divisor for us. 800 * Ask the core to calculate the divisor for us.
@@ -915,7 +934,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
915 serial_out(up, UART_EFR, up->efr); 934 serial_out(up, UART_EFR, up->efr);
916 serial_out(up, UART_LCR, cval); 935 serial_out(up, UART_LCR, cval);
917 936
918 if (baud > 230400 && baud != 3000000) 937 if (!serial_omap_baud_is_mode16(port, baud))
919 up->mdr1 = UART_OMAP_MDR1_13X_MODE; 938 up->mdr1 = UART_OMAP_MDR1_13X_MODE;
920 else 939 else
921 up->mdr1 = UART_OMAP_MDR1_16X_MODE; 940 up->mdr1 = UART_OMAP_MDR1_16X_MODE;
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
index 8318925fbf6b..7a6c989924b3 100644
--- a/drivers/tty/serial/pch_uart.c
+++ b/drivers/tty/serial/pch_uart.c
@@ -14,18 +14,21 @@
14 *along with this program; if not, write to the Free Software 14 *along with this program; if not, write to the Free Software
15 *Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 15 *Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
16 */ 16 */
17#if defined(CONFIG_SERIAL_PCH_UART_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
18#define SUPPORT_SYSRQ
19#endif
17#include <linux/kernel.h> 20#include <linux/kernel.h>
18#include <linux/serial_reg.h> 21#include <linux/serial_reg.h>
19#include <linux/slab.h> 22#include <linux/slab.h>
20#include <linux/module.h> 23#include <linux/module.h>
21#include <linux/pci.h> 24#include <linux/pci.h>
25#include <linux/console.h>
22#include <linux/serial_core.h> 26#include <linux/serial_core.h>
23#include <linux/tty.h> 27#include <linux/tty.h>
24#include <linux/tty_flip.h> 28#include <linux/tty_flip.h>
25#include <linux/interrupt.h> 29#include <linux/interrupt.h>
26#include <linux/io.h> 30#include <linux/io.h>
27#include <linux/dmi.h> 31#include <linux/dmi.h>
28#include <linux/console.h>
29#include <linux/nmi.h> 32#include <linux/nmi.h>
30#include <linux/delay.h> 33#include <linux/delay.h>
31 34
@@ -553,12 +556,26 @@ static int pch_uart_hal_read(struct eg20t_port *priv, unsigned char *buf,
553{ 556{
554 int i; 557 int i;
555 u8 rbr, lsr; 558 u8 rbr, lsr;
559 struct uart_port *port = &priv->port;
556 560
557 lsr = ioread8(priv->membase + UART_LSR); 561 lsr = ioread8(priv->membase + UART_LSR);
558 for (i = 0, lsr = ioread8(priv->membase + UART_LSR); 562 for (i = 0, lsr = ioread8(priv->membase + UART_LSR);
559 i < rx_size && lsr & UART_LSR_DR; 563 i < rx_size && lsr & (UART_LSR_DR | UART_LSR_BI);
560 lsr = ioread8(priv->membase + UART_LSR)) { 564 lsr = ioread8(priv->membase + UART_LSR)) {
561 rbr = ioread8(priv->membase + PCH_UART_RBR); 565 rbr = ioread8(priv->membase + PCH_UART_RBR);
566
567 if (lsr & UART_LSR_BI) {
568 port->icount.brk++;
569 if (uart_handle_break(port))
570 continue;
571 }
572#ifdef SUPPORT_SYSRQ
573 if (port->sysrq) {
574 if (uart_handle_sysrq_char(port, rbr))
575 continue;
576 }
577#endif
578
562 buf[i++] = rbr; 579 buf[i++] = rbr;
563 } 580 }
564 return i; 581 return i;
@@ -591,19 +608,11 @@ static void pch_uart_hal_set_break(struct eg20t_port *priv, int on)
591static int push_rx(struct eg20t_port *priv, const unsigned char *buf, 608static int push_rx(struct eg20t_port *priv, const unsigned char *buf,
592 int size) 609 int size)
593{ 610{
594 struct uart_port *port; 611 struct uart_port *port = &priv->port;
595 struct tty_struct *tty; 612 struct tty_port *tport = &port->state->port;
596
597 port = &priv->port;
598 tty = tty_port_tty_get(&port->state->port);
599 if (!tty) {
600 dev_dbg(priv->port.dev, "%s:tty is busy now", __func__);
601 return -EBUSY;
602 }
603 613
604 tty_insert_flip_string(tty, buf, size); 614 tty_insert_flip_string(tport, buf, size);
605 tty_flip_buffer_push(tty); 615 tty_flip_buffer_push(tport);
606 tty_kref_put(tty);
607 616
608 return 0; 617 return 0;
609} 618}
@@ -629,15 +638,16 @@ static int dma_push_rx(struct eg20t_port *priv, int size)
629 struct tty_struct *tty; 638 struct tty_struct *tty;
630 int room; 639 int room;
631 struct uart_port *port = &priv->port; 640 struct uart_port *port = &priv->port;
641 struct tty_port *tport = &port->state->port;
632 642
633 port = &priv->port; 643 port = &priv->port;
634 tty = tty_port_tty_get(&port->state->port); 644 tty = tty_port_tty_get(tport);
635 if (!tty) { 645 if (!tty) {
636 dev_dbg(priv->port.dev, "%s:tty is busy now", __func__); 646 dev_dbg(priv->port.dev, "%s:tty is busy now", __func__);
637 return 0; 647 return 0;
638 } 648 }
639 649
640 room = tty_buffer_request_room(tty, size); 650 room = tty_buffer_request_room(tport, size);
641 651
642 if (room < size) 652 if (room < size)
643 dev_warn(port->dev, "Rx overrun: dropping %u bytes\n", 653 dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
@@ -645,7 +655,7 @@ static int dma_push_rx(struct eg20t_port *priv, int size)
645 if (!room) 655 if (!room)
646 return room; 656 return room;
647 657
648 tty_insert_flip_string(tty, sg_virt(&priv->sg_rx), size); 658 tty_insert_flip_string(tport, sg_virt(&priv->sg_rx), size);
649 659
650 port->icount.rx += room; 660 port->icount.rx += room;
651 tty_kref_put(tty); 661 tty_kref_put(tty);
@@ -743,19 +753,12 @@ static void pch_dma_rx_complete(void *arg)
743{ 753{
744 struct eg20t_port *priv = arg; 754 struct eg20t_port *priv = arg;
745 struct uart_port *port = &priv->port; 755 struct uart_port *port = &priv->port;
746 struct tty_struct *tty = tty_port_tty_get(&port->state->port);
747 int count; 756 int count;
748 757
749 if (!tty) {
750 dev_dbg(priv->port.dev, "%s:tty is busy now", __func__);
751 return;
752 }
753
754 dma_sync_sg_for_cpu(port->dev, &priv->sg_rx, 1, DMA_FROM_DEVICE); 758 dma_sync_sg_for_cpu(port->dev, &priv->sg_rx, 1, DMA_FROM_DEVICE);
755 count = dma_push_rx(priv, priv->trigger_level); 759 count = dma_push_rx(priv, priv->trigger_level);
756 if (count) 760 if (count)
757 tty_flip_buffer_push(tty); 761 tty_flip_buffer_push(&port->state->port);
758 tty_kref_put(tty);
759 async_tx_ack(priv->desc_rx); 762 async_tx_ack(priv->desc_rx);
760 pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT | 763 pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT |
761 PCH_UART_HAL_RX_ERR_INT); 764 PCH_UART_HAL_RX_ERR_INT);
@@ -1037,23 +1040,33 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
1037 1040
1038static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr) 1041static void pch_uart_err_ir(struct eg20t_port *priv, unsigned int lsr)
1039{ 1042{
1040 u8 fcr = ioread8(priv->membase + UART_FCR); 1043 struct uart_port *port = &priv->port;
1041 1044 struct tty_struct *tty = tty_port_tty_get(&port->state->port);
1042 /* Reset FIFO */ 1045 char *error_msg[5] = {};
1043 fcr |= UART_FCR_CLEAR_RCVR; 1046 int i = 0;
1044 iowrite8(fcr, priv->membase + UART_FCR);
1045 1047
1046 if (lsr & PCH_UART_LSR_ERR) 1048 if (lsr & PCH_UART_LSR_ERR)
1047 dev_err(&priv->pdev->dev, "Error data in FIFO\n"); 1049 error_msg[i++] = "Error data in FIFO\n";
1048 1050
1049 if (lsr & UART_LSR_FE) 1051 if (lsr & UART_LSR_FE) {
1050 dev_err(&priv->pdev->dev, "Framing Error\n"); 1052 port->icount.frame++;
1053 error_msg[i++] = " Framing Error\n";
1054 }
1051 1055
1052 if (lsr & UART_LSR_PE) 1056 if (lsr & UART_LSR_PE) {
1053 dev_err(&priv->pdev->dev, "Parity Error\n"); 1057 port->icount.parity++;
1058 error_msg[i++] = " Parity Error\n";
1059 }
1054 1060
1055 if (lsr & UART_LSR_OE) 1061 if (lsr & UART_LSR_OE) {
1056 dev_err(&priv->pdev->dev, "Overrun Error\n"); 1062 port->icount.overrun++;
1063 error_msg[i++] = " Overrun Error\n";
1064 }
1065
1066 if (tty == NULL) {
1067 for (i = 0; error_msg[i] != NULL; i++)
1068 dev_err(&priv->pdev->dev, error_msg[i]);
1069 }
1057} 1070}
1058 1071
1059static irqreturn_t pch_uart_interrupt(int irq, void *dev_id) 1072static irqreturn_t pch_uart_interrupt(int irq, void *dev_id)
@@ -1564,7 +1577,8 @@ pch_console_write(struct console *co, const char *s, unsigned int count)
1564 1577
1565 local_irq_save(flags); 1578 local_irq_save(flags);
1566 if (priv->port.sysrq) { 1579 if (priv->port.sysrq) {
1567 spin_lock(&priv->lock); 1580 /* call to uart_handle_sysrq_char already took the priv lock */
1581 priv_locked = 0;
1568 /* serial8250_handle_port() already took the port lock */ 1582 /* serial8250_handle_port() already took the port lock */
1569 port_locked = 0; 1583 port_locked = 0;
1570 } else if (oops_in_progress) { 1584 } else if (oops_in_progress) {
diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c
index 333c8d012b0e..b1785f58b6e3 100644
--- a/drivers/tty/serial/pmac_zilog.c
+++ b/drivers/tty/serial/pmac_zilog.c
@@ -227,19 +227,19 @@ static void pmz_interrupt_control(struct uart_pmac_port *uap, int enable)
227 write_zsreg(uap, R1, uap->curregs[1]); 227 write_zsreg(uap, R1, uap->curregs[1]);
228} 228}
229 229
230static struct tty_struct *pmz_receive_chars(struct uart_pmac_port *uap) 230static bool pmz_receive_chars(struct uart_pmac_port *uap)
231{ 231{
232 struct tty_struct *tty = NULL; 232 struct tty_port *port;
233 unsigned char ch, r1, drop, error, flag; 233 unsigned char ch, r1, drop, error, flag;
234 int loops = 0; 234 int loops = 0;
235 235
236 /* Sanity check, make sure the old bug is no longer happening */ 236 /* Sanity check, make sure the old bug is no longer happening */
237 if (uap->port.state == NULL || uap->port.state->port.tty == NULL) { 237 if (uap->port.state == NULL) {
238 WARN_ON(1); 238 WARN_ON(1);
239 (void)read_zsdata(uap); 239 (void)read_zsdata(uap);
240 return NULL; 240 return false;
241 } 241 }
242 tty = uap->port.state->port.tty; 242 port = &uap->port.state->port;
243 243
244 while (1) { 244 while (1) {
245 error = 0; 245 error = 0;
@@ -309,10 +309,10 @@ static struct tty_struct *pmz_receive_chars(struct uart_pmac_port *uap)
309 309
310 if (uap->port.ignore_status_mask == 0xff || 310 if (uap->port.ignore_status_mask == 0xff ||
311 (r1 & uap->port.ignore_status_mask) == 0) { 311 (r1 & uap->port.ignore_status_mask) == 0) {
312 tty_insert_flip_char(tty, ch, flag); 312 tty_insert_flip_char(port, ch, flag);
313 } 313 }
314 if (r1 & Rx_OVR) 314 if (r1 & Rx_OVR)
315 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 315 tty_insert_flip_char(port, 0, TTY_OVERRUN);
316 next_char: 316 next_char:
317 /* We can get stuck in an infinite loop getting char 0 when the 317 /* We can get stuck in an infinite loop getting char 0 when the
318 * line is in a wrong HW state, we break that here. 318 * line is in a wrong HW state, we break that here.
@@ -328,11 +328,11 @@ static struct tty_struct *pmz_receive_chars(struct uart_pmac_port *uap)
328 break; 328 break;
329 } 329 }
330 330
331 return tty; 331 return true;
332 flood: 332 flood:
333 pmz_interrupt_control(uap, 0); 333 pmz_interrupt_control(uap, 0);
334 pmz_error("pmz: rx irq flood !\n"); 334 pmz_error("pmz: rx irq flood !\n");
335 return tty; 335 return true;
336} 336}
337 337
338static void pmz_status_handle(struct uart_pmac_port *uap) 338static void pmz_status_handle(struct uart_pmac_port *uap)
@@ -453,7 +453,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
453 struct uart_pmac_port *uap_a; 453 struct uart_pmac_port *uap_a;
454 struct uart_pmac_port *uap_b; 454 struct uart_pmac_port *uap_b;
455 int rc = IRQ_NONE; 455 int rc = IRQ_NONE;
456 struct tty_struct *tty; 456 bool push;
457 u8 r3; 457 u8 r3;
458 458
459 uap_a = pmz_get_port_A(uap); 459 uap_a = pmz_get_port_A(uap);
@@ -466,7 +466,7 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
466 pmz_debug("irq, r3: %x\n", r3); 466 pmz_debug("irq, r3: %x\n", r3);
467#endif 467#endif
468 /* Channel A */ 468 /* Channel A */
469 tty = NULL; 469 push = false;
470 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { 470 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
471 if (!ZS_IS_OPEN(uap_a)) { 471 if (!ZS_IS_OPEN(uap_a)) {
472 pmz_debug("ChanA interrupt while not open !\n"); 472 pmz_debug("ChanA interrupt while not open !\n");
@@ -477,21 +477,21 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
477 if (r3 & CHAEXT) 477 if (r3 & CHAEXT)
478 pmz_status_handle(uap_a); 478 pmz_status_handle(uap_a);
479 if (r3 & CHARxIP) 479 if (r3 & CHARxIP)
480 tty = pmz_receive_chars(uap_a); 480 push = pmz_receive_chars(uap_a);
481 if (r3 & CHATxIP) 481 if (r3 & CHATxIP)
482 pmz_transmit_chars(uap_a); 482 pmz_transmit_chars(uap_a);
483 rc = IRQ_HANDLED; 483 rc = IRQ_HANDLED;
484 } 484 }
485 skip_a: 485 skip_a:
486 spin_unlock(&uap_a->port.lock); 486 spin_unlock(&uap_a->port.lock);
487 if (tty != NULL) 487 if (push)
488 tty_flip_buffer_push(tty); 488 tty_flip_buffer_push(&uap->port.state->port);
489 489
490 if (!uap_b) 490 if (!uap_b)
491 goto out; 491 goto out;
492 492
493 spin_lock(&uap_b->port.lock); 493 spin_lock(&uap_b->port.lock);
494 tty = NULL; 494 push = false;
495 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { 495 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
496 if (!ZS_IS_OPEN(uap_b)) { 496 if (!ZS_IS_OPEN(uap_b)) {
497 pmz_debug("ChanB interrupt while not open !\n"); 497 pmz_debug("ChanB interrupt while not open !\n");
@@ -502,15 +502,15 @@ static irqreturn_t pmz_interrupt(int irq, void *dev_id)
502 if (r3 & CHBEXT) 502 if (r3 & CHBEXT)
503 pmz_status_handle(uap_b); 503 pmz_status_handle(uap_b);
504 if (r3 & CHBRxIP) 504 if (r3 & CHBRxIP)
505 tty = pmz_receive_chars(uap_b); 505 push = pmz_receive_chars(uap_b);
506 if (r3 & CHBTxIP) 506 if (r3 & CHBTxIP)
507 pmz_transmit_chars(uap_b); 507 pmz_transmit_chars(uap_b);
508 rc = IRQ_HANDLED; 508 rc = IRQ_HANDLED;
509 } 509 }
510 skip_b: 510 skip_b:
511 spin_unlock(&uap_b->port.lock); 511 spin_unlock(&uap_b->port.lock);
512 if (tty != NULL) 512 if (push)
513 tty_flip_buffer_push(tty); 513 tty_flip_buffer_push(&uap->port.state->port);
514 514
515 out: 515 out:
516 return rc; 516 return rc;
diff --git a/drivers/tty/serial/pnx8xxx_uart.c b/drivers/tty/serial/pnx8xxx_uart.c
index 0aa75a97531c..7e277a5384a7 100644
--- a/drivers/tty/serial/pnx8xxx_uart.c
+++ b/drivers/tty/serial/pnx8xxx_uart.c
@@ -181,7 +181,6 @@ static void pnx8xxx_enable_ms(struct uart_port *port)
181 181
182static void pnx8xxx_rx_chars(struct pnx8xxx_port *sport) 182static void pnx8xxx_rx_chars(struct pnx8xxx_port *sport)
183{ 183{
184 struct tty_struct *tty = sport->port.state->port.tty;
185 unsigned int status, ch, flg; 184 unsigned int status, ch, flg;
186 185
187 status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) | 186 status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) |
@@ -238,7 +237,7 @@ static void pnx8xxx_rx_chars(struct pnx8xxx_port *sport)
238 status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) | 237 status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) |
239 ISTAT_TO_SM(serial_in(sport, PNX8XXX_ISTAT)); 238 ISTAT_TO_SM(serial_in(sport, PNX8XXX_ISTAT));
240 } 239 }
241 tty_flip_buffer_push(tty); 240 tty_flip_buffer_push(&sport->port.state->port);
242} 241}
243 242
244static void pnx8xxx_tx_chars(struct pnx8xxx_port *sport) 243static void pnx8xxx_tx_chars(struct pnx8xxx_port *sport)
diff --git a/drivers/tty/serial/pxa.c b/drivers/tty/serial/pxa.c
index 2764828251f5..05f504e0c271 100644
--- a/drivers/tty/serial/pxa.c
+++ b/drivers/tty/serial/pxa.c
@@ -98,7 +98,6 @@ static void serial_pxa_stop_rx(struct uart_port *port)
98 98
99static inline void receive_chars(struct uart_pxa_port *up, int *status) 99static inline void receive_chars(struct uart_pxa_port *up, int *status)
100{ 100{
101 struct tty_struct *tty = up->port.state->port.tty;
102 unsigned int ch, flag; 101 unsigned int ch, flag;
103 int max_count = 256; 102 int max_count = 256;
104 103
@@ -168,7 +167,7 @@ static inline void receive_chars(struct uart_pxa_port *up, int *status)
168 ignore_char: 167 ignore_char:
169 *status = serial_in(up, UART_LSR); 168 *status = serial_in(up, UART_LSR);
170 } while ((*status & UART_LSR_DR) && (max_count-- > 0)); 169 } while ((*status & UART_LSR_DR) && (max_count-- > 0));
171 tty_flip_buffer_push(tty); 170 tty_flip_buffer_push(&up->port.state->port);
172 171
173 /* work around Errata #20 according to 172 /* work around Errata #20 according to
174 * Intel(R) PXA27x Processor Family 173 * Intel(R) PXA27x Processor Family
@@ -673,8 +672,7 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
673 unsigned long flags; 672 unsigned long flags;
674 int locked = 1; 673 int locked = 1;
675 674
676 clk_prepare_enable(up->clk); 675 clk_enable(up->clk);
677
678 local_irq_save(flags); 676 local_irq_save(flags);
679 if (up->port.sysrq) 677 if (up->port.sysrq)
680 locked = 0; 678 locked = 0;
@@ -701,8 +699,8 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
701 if (locked) 699 if (locked)
702 spin_unlock(&up->port.lock); 700 spin_unlock(&up->port.lock);
703 local_irq_restore(flags); 701 local_irq_restore(flags);
702 clk_disable(up->clk);
704 703
705 clk_disable_unprepare(up->clk);
706} 704}
707 705
708#ifdef CONFIG_CONSOLE_POLL 706#ifdef CONFIG_CONSOLE_POLL
@@ -899,6 +897,12 @@ static int serial_pxa_probe(struct platform_device *dev)
899 goto err_free; 897 goto err_free;
900 } 898 }
901 899
900 ret = clk_prepare(sport->clk);
901 if (ret) {
902 clk_put(sport->clk);
903 goto err_free;
904 }
905
902 sport->port.type = PORT_PXA; 906 sport->port.type = PORT_PXA;
903 sport->port.iotype = UPIO_MEM; 907 sport->port.iotype = UPIO_MEM;
904 sport->port.mapbase = mmres->start; 908 sport->port.mapbase = mmres->start;
@@ -930,6 +934,7 @@ static int serial_pxa_probe(struct platform_device *dev)
930 return 0; 934 return 0;
931 935
932 err_clk: 936 err_clk:
937 clk_unprepare(sport->clk);
933 clk_put(sport->clk); 938 clk_put(sport->clk);
934 err_free: 939 err_free:
935 kfree(sport); 940 kfree(sport);
@@ -943,6 +948,8 @@ static int serial_pxa_remove(struct platform_device *dev)
943 platform_set_drvdata(dev, NULL); 948 platform_set_drvdata(dev, NULL);
944 949
945 uart_remove_one_port(&serial_pxa_reg, &sport->port); 950 uart_remove_one_port(&serial_pxa_reg, &sport->port);
951
952 clk_unprepare(sport->clk);
946 clk_put(sport->clk); 953 clk_put(sport->clk);
947 kfree(sport); 954 kfree(sport);
948 955
diff --git a/drivers/tty/serial/rp2.c b/drivers/tty/serial/rp2.c
new file mode 100644
index 000000000000..a314a943f124
--- /dev/null
+++ b/drivers/tty/serial/rp2.c
@@ -0,0 +1,885 @@
1/*
2 * Driver for Comtrol RocketPort EXPRESS/INFINITY cards
3 *
4 * Copyright (C) 2012 Kevin Cernekee <cernekee@gmail.com>
5 *
6 * Inspired by, and loosely based on:
7 *
8 * ar933x_uart.c
9 * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
10 *
11 * rocketport_infinity_express-linux-1.20.tar.gz
12 * Copyright (C) 2004-2011 Comtrol, Inc.
13 *
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License version 2 as published
16 * by the Free Software Foundation.
17 */
18
19#include <linux/bitops.h>
20#include <linux/compiler.h>
21#include <linux/completion.h>
22#include <linux/console.h>
23#include <linux/delay.h>
24#include <linux/firmware.h>
25#include <linux/init.h>
26#include <linux/io.h>
27#include <linux/ioport.h>
28#include <linux/irq.h>
29#include <linux/kernel.h>
30#include <linux/log2.h>
31#include <linux/module.h>
32#include <linux/pci.h>
33#include <linux/serial.h>
34#include <linux/serial_core.h>
35#include <linux/slab.h>
36#include <linux/sysrq.h>
37#include <linux/tty.h>
38#include <linux/tty_flip.h>
39#include <linux/types.h>
40
41#define DRV_NAME "rp2"
42
43#define RP2_FW_NAME "rp2.fw"
44#define RP2_UCODE_BYTES 0x3f
45
46#define PORTS_PER_ASIC 16
47#define ALL_PORTS_MASK (BIT(PORTS_PER_ASIC) - 1)
48
49#define UART_CLOCK 44236800
50#define DEFAULT_BAUD_DIV (UART_CLOCK / (9600 * 16))
51#define FIFO_SIZE 512
52
53/* BAR0 registers */
54#define RP2_FPGA_CTL0 0x110
55#define RP2_FPGA_CTL1 0x11c
56#define RP2_IRQ_MASK 0x1ec
57#define RP2_IRQ_MASK_EN_m BIT(0)
58#define RP2_IRQ_STATUS 0x1f0
59
60/* BAR1 registers */
61#define RP2_ASIC_SPACING 0x1000
62#define RP2_ASIC_OFFSET(i) ((i) << ilog2(RP2_ASIC_SPACING))
63
64#define RP2_PORT_BASE 0x000
65#define RP2_PORT_SPACING 0x040
66
67#define RP2_UCODE_BASE 0x400
68#define RP2_UCODE_SPACING 0x80
69
70#define RP2_CLK_PRESCALER 0xc00
71#define RP2_CH_IRQ_STAT 0xc04
72#define RP2_CH_IRQ_MASK 0xc08
73#define RP2_ASIC_IRQ 0xd00
74#define RP2_ASIC_IRQ_EN_m BIT(20)
75#define RP2_GLOBAL_CMD 0xd0c
76#define RP2_ASIC_CFG 0xd04
77
78/* port registers */
79#define RP2_DATA_DWORD 0x000
80
81#define RP2_DATA_BYTE 0x008
82#define RP2_DATA_BYTE_ERR_PARITY_m BIT(8)
83#define RP2_DATA_BYTE_ERR_OVERRUN_m BIT(9)
84#define RP2_DATA_BYTE_ERR_FRAMING_m BIT(10)
85#define RP2_DATA_BYTE_BREAK_m BIT(11)
86
87/* This lets uart_insert_char() drop bytes received on a !CREAD port */
88#define RP2_DUMMY_READ BIT(16)
89
90#define RP2_DATA_BYTE_EXCEPTION_MASK (RP2_DATA_BYTE_ERR_PARITY_m | \
91 RP2_DATA_BYTE_ERR_OVERRUN_m | \
92 RP2_DATA_BYTE_ERR_FRAMING_m | \
93 RP2_DATA_BYTE_BREAK_m)
94
95#define RP2_RX_FIFO_COUNT 0x00c
96#define RP2_TX_FIFO_COUNT 0x00e
97
98#define RP2_CHAN_STAT 0x010
99#define RP2_CHAN_STAT_RXDATA_m BIT(0)
100#define RP2_CHAN_STAT_DCD_m BIT(3)
101#define RP2_CHAN_STAT_DSR_m BIT(4)
102#define RP2_CHAN_STAT_CTS_m BIT(5)
103#define RP2_CHAN_STAT_RI_m BIT(6)
104#define RP2_CHAN_STAT_OVERRUN_m BIT(13)
105#define RP2_CHAN_STAT_DSR_CHANGED_m BIT(16)
106#define RP2_CHAN_STAT_CTS_CHANGED_m BIT(17)
107#define RP2_CHAN_STAT_CD_CHANGED_m BIT(18)
108#define RP2_CHAN_STAT_RI_CHANGED_m BIT(22)
109#define RP2_CHAN_STAT_TXEMPTY_m BIT(25)
110
111#define RP2_CHAN_STAT_MS_CHANGED_MASK (RP2_CHAN_STAT_DSR_CHANGED_m | \
112 RP2_CHAN_STAT_CTS_CHANGED_m | \
113 RP2_CHAN_STAT_CD_CHANGED_m | \
114 RP2_CHAN_STAT_RI_CHANGED_m)
115
116#define RP2_TXRX_CTL 0x014
117#define RP2_TXRX_CTL_MSRIRQ_m BIT(0)
118#define RP2_TXRX_CTL_RXIRQ_m BIT(2)
119#define RP2_TXRX_CTL_RX_TRIG_s 3
120#define RP2_TXRX_CTL_RX_TRIG_m (0x3 << RP2_TXRX_CTL_RX_TRIG_s)
121#define RP2_TXRX_CTL_RX_TRIG_1 (0x1 << RP2_TXRX_CTL_RX_TRIG_s)
122#define RP2_TXRX_CTL_RX_TRIG_256 (0x2 << RP2_TXRX_CTL_RX_TRIG_s)
123#define RP2_TXRX_CTL_RX_TRIG_448 (0x3 << RP2_TXRX_CTL_RX_TRIG_s)
124#define RP2_TXRX_CTL_RX_EN_m BIT(5)
125#define RP2_TXRX_CTL_RTSFLOW_m BIT(6)
126#define RP2_TXRX_CTL_DTRFLOW_m BIT(7)
127#define RP2_TXRX_CTL_TX_TRIG_s 16
128#define RP2_TXRX_CTL_TX_TRIG_m (0x3 << RP2_TXRX_CTL_RX_TRIG_s)
129#define RP2_TXRX_CTL_DSRFLOW_m BIT(18)
130#define RP2_TXRX_CTL_TXIRQ_m BIT(19)
131#define RP2_TXRX_CTL_CTSFLOW_m BIT(23)
132#define RP2_TXRX_CTL_TX_EN_m BIT(24)
133#define RP2_TXRX_CTL_RTS_m BIT(25)
134#define RP2_TXRX_CTL_DTR_m BIT(26)
135#define RP2_TXRX_CTL_LOOP_m BIT(27)
136#define RP2_TXRX_CTL_BREAK_m BIT(28)
137#define RP2_TXRX_CTL_CMSPAR_m BIT(29)
138#define RP2_TXRX_CTL_nPARODD_m BIT(30)
139#define RP2_TXRX_CTL_PARENB_m BIT(31)
140
141#define RP2_UART_CTL 0x018
142#define RP2_UART_CTL_MODE_s 0
143#define RP2_UART_CTL_MODE_m (0x7 << RP2_UART_CTL_MODE_s)
144#define RP2_UART_CTL_MODE_rs232 (0x1 << RP2_UART_CTL_MODE_s)
145#define RP2_UART_CTL_FLUSH_RX_m BIT(3)
146#define RP2_UART_CTL_FLUSH_TX_m BIT(4)
147#define RP2_UART_CTL_RESET_CH_m BIT(5)
148#define RP2_UART_CTL_XMIT_EN_m BIT(6)
149#define RP2_UART_CTL_DATABITS_s 8
150#define RP2_UART_CTL_DATABITS_m (0x3 << RP2_UART_CTL_DATABITS_s)
151#define RP2_UART_CTL_DATABITS_8 (0x3 << RP2_UART_CTL_DATABITS_s)
152#define RP2_UART_CTL_DATABITS_7 (0x2 << RP2_UART_CTL_DATABITS_s)
153#define RP2_UART_CTL_DATABITS_6 (0x1 << RP2_UART_CTL_DATABITS_s)
154#define RP2_UART_CTL_DATABITS_5 (0x0 << RP2_UART_CTL_DATABITS_s)
155#define RP2_UART_CTL_STOPBITS_m BIT(10)
156
157#define RP2_BAUD 0x01c
158
159/* ucode registers */
160#define RP2_TX_SWFLOW 0x02
161#define RP2_TX_SWFLOW_ena 0x81
162#define RP2_TX_SWFLOW_dis 0x9d
163
164#define RP2_RX_SWFLOW 0x0c
165#define RP2_RX_SWFLOW_ena 0x81
166#define RP2_RX_SWFLOW_dis 0x8d
167
168#define RP2_RX_FIFO 0x37
169#define RP2_RX_FIFO_ena 0x08
170#define RP2_RX_FIFO_dis 0x81
171
172static struct uart_driver rp2_uart_driver = {
173 .owner = THIS_MODULE,
174 .driver_name = DRV_NAME,
175 .dev_name = "ttyRP",
176 .nr = CONFIG_SERIAL_RP2_NR_UARTS,
177};
178
179struct rp2_card;
180
181struct rp2_uart_port {
182 struct uart_port port;
183 int idx;
184 int ignore_rx;
185 struct rp2_card *card;
186 void __iomem *asic_base;
187 void __iomem *base;
188 void __iomem *ucode;
189};
190
191struct rp2_card {
192 struct pci_dev *pdev;
193 struct rp2_uart_port *ports;
194 int n_ports;
195 int initialized_ports;
196 int minor_start;
197 int smpte;
198 void __iomem *bar0;
199 void __iomem *bar1;
200 spinlock_t card_lock;
201 struct completion fw_loaded;
202};
203
204#define RP_ID(prod) PCI_VDEVICE(RP, (prod))
205#define RP_CAP(ports, smpte) (((ports) << 8) | ((smpte) << 0))
206
207static inline void rp2_decode_cap(const struct pci_device_id *id,
208 int *ports, int *smpte)
209{
210 *ports = id->driver_data >> 8;
211 *smpte = id->driver_data & 0xff;
212}
213
214static DEFINE_SPINLOCK(rp2_minor_lock);
215static int rp2_minor_next;
216
217static int rp2_alloc_ports(int n_ports)
218{
219 int ret = -ENOSPC;
220
221 spin_lock(&rp2_minor_lock);
222 if (rp2_minor_next + n_ports <= CONFIG_SERIAL_RP2_NR_UARTS) {
223 /* sorry, no support for hot unplugging individual cards */
224 ret = rp2_minor_next;
225 rp2_minor_next += n_ports;
226 }
227 spin_unlock(&rp2_minor_lock);
228
229 return ret;
230}
231
232static inline struct rp2_uart_port *port_to_up(struct uart_port *port)
233{
234 return container_of(port, struct rp2_uart_port, port);
235}
236
237static void rp2_rmw(struct rp2_uart_port *up, int reg,
238 u32 clr_bits, u32 set_bits)
239{
240 u32 tmp = readl(up->base + reg);
241 tmp &= ~clr_bits;
242 tmp |= set_bits;
243 writel(tmp, up->base + reg);
244}
245
246static void rp2_rmw_clr(struct rp2_uart_port *up, int reg, u32 val)
247{
248 rp2_rmw(up, reg, val, 0);
249}
250
251static void rp2_rmw_set(struct rp2_uart_port *up, int reg, u32 val)
252{
253 rp2_rmw(up, reg, 0, val);
254}
255
256static void rp2_mask_ch_irq(struct rp2_uart_port *up, int ch_num,
257 int is_enabled)
258{
259 unsigned long flags, irq_mask;
260
261 spin_lock_irqsave(&up->card->card_lock, flags);
262
263 irq_mask = readl(up->asic_base + RP2_CH_IRQ_MASK);
264 if (is_enabled)
265 irq_mask &= ~BIT(ch_num);
266 else
267 irq_mask |= BIT(ch_num);
268 writel(irq_mask, up->asic_base + RP2_CH_IRQ_MASK);
269
270 spin_unlock_irqrestore(&up->card->card_lock, flags);
271}
272
273static unsigned int rp2_uart_tx_empty(struct uart_port *port)
274{
275 struct rp2_uart_port *up = port_to_up(port);
276 unsigned long tx_fifo_bytes, flags;
277
278 /*
279 * This should probably check the transmitter, not the FIFO.
280 * But the TXEMPTY bit doesn't seem to work unless the TX IRQ is
281 * enabled.
282 */
283 spin_lock_irqsave(&up->port.lock, flags);
284 tx_fifo_bytes = readw(up->base + RP2_TX_FIFO_COUNT);
285 spin_unlock_irqrestore(&up->port.lock, flags);
286
287 return tx_fifo_bytes ? 0 : TIOCSER_TEMT;
288}
289
290static unsigned int rp2_uart_get_mctrl(struct uart_port *port)
291{
292 struct rp2_uart_port *up = port_to_up(port);
293 u32 status;
294
295 status = readl(up->base + RP2_CHAN_STAT);
296 return ((status & RP2_CHAN_STAT_DCD_m) ? TIOCM_CAR : 0) |
297 ((status & RP2_CHAN_STAT_DSR_m) ? TIOCM_DSR : 0) |
298 ((status & RP2_CHAN_STAT_CTS_m) ? TIOCM_CTS : 0) |
299 ((status & RP2_CHAN_STAT_RI_m) ? TIOCM_RI : 0);
300}
301
302static void rp2_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
303{
304 rp2_rmw(port_to_up(port), RP2_TXRX_CTL,
305 RP2_TXRX_CTL_DTR_m | RP2_TXRX_CTL_RTS_m | RP2_TXRX_CTL_LOOP_m,
306 ((mctrl & TIOCM_DTR) ? RP2_TXRX_CTL_DTR_m : 0) |
307 ((mctrl & TIOCM_RTS) ? RP2_TXRX_CTL_RTS_m : 0) |
308 ((mctrl & TIOCM_LOOP) ? RP2_TXRX_CTL_LOOP_m : 0));
309}
310
311static void rp2_uart_start_tx(struct uart_port *port)
312{
313 rp2_rmw_set(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_TXIRQ_m);
314}
315
316static void rp2_uart_stop_tx(struct uart_port *port)
317{
318 rp2_rmw_clr(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_TXIRQ_m);
319}
320
321static void rp2_uart_stop_rx(struct uart_port *port)
322{
323 rp2_rmw_clr(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_RXIRQ_m);
324}
325
326static void rp2_uart_break_ctl(struct uart_port *port, int break_state)
327{
328 unsigned long flags;
329
330 spin_lock_irqsave(&port->lock, flags);
331 rp2_rmw(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_BREAK_m,
332 break_state ? RP2_TXRX_CTL_BREAK_m : 0);
333 spin_unlock_irqrestore(&port->lock, flags);
334}
335
336static void rp2_uart_enable_ms(struct uart_port *port)
337{
338 rp2_rmw_set(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_MSRIRQ_m);
339}
340
341static void __rp2_uart_set_termios(struct rp2_uart_port *up,
342 unsigned long cfl,
343 unsigned long ifl,
344 unsigned int baud_div)
345{
346 /* baud rate divisor (calculated elsewhere). 0 = divide-by-1 */
347 writew(baud_div - 1, up->base + RP2_BAUD);
348
349 /* data bits and stop bits */
350 rp2_rmw(up, RP2_UART_CTL,
351 RP2_UART_CTL_STOPBITS_m | RP2_UART_CTL_DATABITS_m,
352 ((cfl & CSTOPB) ? RP2_UART_CTL_STOPBITS_m : 0) |
353 (((cfl & CSIZE) == CS8) ? RP2_UART_CTL_DATABITS_8 : 0) |
354 (((cfl & CSIZE) == CS7) ? RP2_UART_CTL_DATABITS_7 : 0) |
355 (((cfl & CSIZE) == CS6) ? RP2_UART_CTL_DATABITS_6 : 0) |
356 (((cfl & CSIZE) == CS5) ? RP2_UART_CTL_DATABITS_5 : 0));
357
358 /* parity and hardware flow control */
359 rp2_rmw(up, RP2_TXRX_CTL,
360 RP2_TXRX_CTL_PARENB_m | RP2_TXRX_CTL_nPARODD_m |
361 RP2_TXRX_CTL_CMSPAR_m | RP2_TXRX_CTL_DTRFLOW_m |
362 RP2_TXRX_CTL_DSRFLOW_m | RP2_TXRX_CTL_RTSFLOW_m |
363 RP2_TXRX_CTL_CTSFLOW_m,
364 ((cfl & PARENB) ? RP2_TXRX_CTL_PARENB_m : 0) |
365 ((cfl & PARODD) ? 0 : RP2_TXRX_CTL_nPARODD_m) |
366 ((cfl & CMSPAR) ? RP2_TXRX_CTL_CMSPAR_m : 0) |
367 ((cfl & CRTSCTS) ? (RP2_TXRX_CTL_RTSFLOW_m |
368 RP2_TXRX_CTL_CTSFLOW_m) : 0));
369
370 /* XON/XOFF software flow control */
371 writeb((ifl & IXON) ? RP2_TX_SWFLOW_ena : RP2_TX_SWFLOW_dis,
372 up->ucode + RP2_TX_SWFLOW);
373 writeb((ifl & IXOFF) ? RP2_RX_SWFLOW_ena : RP2_RX_SWFLOW_dis,
374 up->ucode + RP2_RX_SWFLOW);
375}
376
377static void rp2_uart_set_termios(struct uart_port *port,
378 struct ktermios *new,
379 struct ktermios *old)
380{
381 struct rp2_uart_port *up = port_to_up(port);
382 unsigned long flags;
383 unsigned int baud, baud_div;
384
385 baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
386 baud_div = uart_get_divisor(port, baud);
387
388 if (tty_termios_baud_rate(new))
389 tty_termios_encode_baud_rate(new, baud, baud);
390
391 spin_lock_irqsave(&port->lock, flags);
392
393 /* ignore all characters if CREAD is not set */
394 port->ignore_status_mask = (new->c_cflag & CREAD) ? 0 : RP2_DUMMY_READ;
395
396 __rp2_uart_set_termios(up, new->c_cflag, new->c_iflag, baud_div);
397 uart_update_timeout(port, new->c_cflag, baud);
398
399 spin_unlock_irqrestore(&port->lock, flags);
400}
401
402static void rp2_rx_chars(struct rp2_uart_port *up)
403{
404 u16 bytes = readw(up->base + RP2_RX_FIFO_COUNT);
405 struct tty_port *port = &up->port.state->port;
406
407 for (; bytes != 0; bytes--) {
408 u32 byte = readw(up->base + RP2_DATA_BYTE) | RP2_DUMMY_READ;
409 char ch = byte & 0xff;
410
411 if (likely(!(byte & RP2_DATA_BYTE_EXCEPTION_MASK))) {
412 if (!uart_handle_sysrq_char(&up->port, ch))
413 uart_insert_char(&up->port, byte, 0, ch,
414 TTY_NORMAL);
415 } else {
416 char flag = TTY_NORMAL;
417
418 if (byte & RP2_DATA_BYTE_BREAK_m)
419 flag = TTY_BREAK;
420 else if (byte & RP2_DATA_BYTE_ERR_FRAMING_m)
421 flag = TTY_FRAME;
422 else if (byte & RP2_DATA_BYTE_ERR_PARITY_m)
423 flag = TTY_PARITY;
424 uart_insert_char(&up->port, byte,
425 RP2_DATA_BYTE_ERR_OVERRUN_m, ch, flag);
426 }
427 up->port.icount.rx++;
428 }
429
430 tty_flip_buffer_push(port);
431}
432
433static void rp2_tx_chars(struct rp2_uart_port *up)
434{
435 u16 max_tx = FIFO_SIZE - readw(up->base + RP2_TX_FIFO_COUNT);
436 struct circ_buf *xmit = &up->port.state->xmit;
437
438 if (uart_tx_stopped(&up->port)) {
439 rp2_uart_stop_tx(&up->port);
440 return;
441 }
442
443 for (; max_tx != 0; max_tx--) {
444 if (up->port.x_char) {
445 writeb(up->port.x_char, up->base + RP2_DATA_BYTE);
446 up->port.x_char = 0;
447 up->port.icount.tx++;
448 continue;
449 }
450 if (uart_circ_empty(xmit)) {
451 rp2_uart_stop_tx(&up->port);
452 break;
453 }
454 writeb(xmit->buf[xmit->tail], up->base + RP2_DATA_BYTE);
455 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
456 up->port.icount.tx++;
457 }
458
459 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
460 uart_write_wakeup(&up->port);
461}
462
463static void rp2_ch_interrupt(struct rp2_uart_port *up)
464{
465 u32 status;
466
467 spin_lock(&up->port.lock);
468
469 /*
470 * The IRQ status bits are clear-on-write. Other status bits in
471 * this register aren't, so it's harmless to write to them.
472 */
473 status = readl(up->base + RP2_CHAN_STAT);
474 writel(status, up->base + RP2_CHAN_STAT);
475
476 if (status & RP2_CHAN_STAT_RXDATA_m)
477 rp2_rx_chars(up);
478 if (status & RP2_CHAN_STAT_TXEMPTY_m)
479 rp2_tx_chars(up);
480 if (status & RP2_CHAN_STAT_MS_CHANGED_MASK)
481 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
482
483 spin_unlock(&up->port.lock);
484}
485
486static int rp2_asic_interrupt(struct rp2_card *card, unsigned int asic_id)
487{
488 void __iomem *base = card->bar1 + RP2_ASIC_OFFSET(asic_id);
489 int ch, handled = 0;
490 unsigned long status = readl(base + RP2_CH_IRQ_STAT) &
491 ~readl(base + RP2_CH_IRQ_MASK);
492
493 for_each_set_bit(ch, &status, PORTS_PER_ASIC) {
494 rp2_ch_interrupt(&card->ports[ch]);
495 handled++;
496 }
497 return handled;
498}
499
500static irqreturn_t rp2_uart_interrupt(int irq, void *dev_id)
501{
502 struct rp2_card *card = dev_id;
503 int handled;
504
505 handled = rp2_asic_interrupt(card, 0);
506 if (card->n_ports >= PORTS_PER_ASIC)
507 handled += rp2_asic_interrupt(card, 1);
508
509 return handled ? IRQ_HANDLED : IRQ_NONE;
510}
511
512static inline void rp2_flush_fifos(struct rp2_uart_port *up)
513{
514 rp2_rmw_set(up, RP2_UART_CTL,
515 RP2_UART_CTL_FLUSH_RX_m | RP2_UART_CTL_FLUSH_TX_m);
516 readl(up->base + RP2_UART_CTL);
517 udelay(10);
518 rp2_rmw_clr(up, RP2_UART_CTL,
519 RP2_UART_CTL_FLUSH_RX_m | RP2_UART_CTL_FLUSH_TX_m);
520}
521
522static int rp2_uart_startup(struct uart_port *port)
523{
524 struct rp2_uart_port *up = port_to_up(port);
525
526 rp2_flush_fifos(up);
527 rp2_rmw(up, RP2_TXRX_CTL, RP2_TXRX_CTL_MSRIRQ_m, RP2_TXRX_CTL_RXIRQ_m);
528 rp2_rmw(up, RP2_TXRX_CTL, RP2_TXRX_CTL_RX_TRIG_m,
529 RP2_TXRX_CTL_RX_TRIG_1);
530 rp2_rmw(up, RP2_CHAN_STAT, 0, 0);
531 rp2_mask_ch_irq(up, up->idx, 1);
532
533 return 0;
534}
535
536static void rp2_uart_shutdown(struct uart_port *port)
537{
538 struct rp2_uart_port *up = port_to_up(port);
539 unsigned long flags;
540
541 rp2_uart_break_ctl(port, 0);
542
543 spin_lock_irqsave(&port->lock, flags);
544 rp2_mask_ch_irq(up, up->idx, 0);
545 rp2_rmw(up, RP2_CHAN_STAT, 0, 0);
546 spin_unlock_irqrestore(&port->lock, flags);
547}
548
549static const char *rp2_uart_type(struct uart_port *port)
550{
551 return (port->type == PORT_RP2) ? "RocketPort 2 UART" : NULL;
552}
553
554static void rp2_uart_release_port(struct uart_port *port)
555{
556 /* Nothing to release ... */
557}
558
559static int rp2_uart_request_port(struct uart_port *port)
560{
561 /* UARTs always present */
562 return 0;
563}
564
565static void rp2_uart_config_port(struct uart_port *port, int flags)
566{
567 if (flags & UART_CONFIG_TYPE)
568 port->type = PORT_RP2;
569}
570
571static int rp2_uart_verify_port(struct uart_port *port,
572 struct serial_struct *ser)
573{
574 if (ser->type != PORT_UNKNOWN && ser->type != PORT_RP2)
575 return -EINVAL;
576
577 return 0;
578}
579
580static const struct uart_ops rp2_uart_ops = {
581 .tx_empty = rp2_uart_tx_empty,
582 .set_mctrl = rp2_uart_set_mctrl,
583 .get_mctrl = rp2_uart_get_mctrl,
584 .stop_tx = rp2_uart_stop_tx,
585 .start_tx = rp2_uart_start_tx,
586 .stop_rx = rp2_uart_stop_rx,
587 .enable_ms = rp2_uart_enable_ms,
588 .break_ctl = rp2_uart_break_ctl,
589 .startup = rp2_uart_startup,
590 .shutdown = rp2_uart_shutdown,
591 .set_termios = rp2_uart_set_termios,
592 .type = rp2_uart_type,
593 .release_port = rp2_uart_release_port,
594 .request_port = rp2_uart_request_port,
595 .config_port = rp2_uart_config_port,
596 .verify_port = rp2_uart_verify_port,
597};
598
599static void rp2_reset_asic(struct rp2_card *card, unsigned int asic_id)
600{
601 void __iomem *base = card->bar1 + RP2_ASIC_OFFSET(asic_id);
602 u32 clk_cfg;
603
604 writew(1, base + RP2_GLOBAL_CMD);
605 readw(base + RP2_GLOBAL_CMD);
606 msleep(100);
607 writel(0, base + RP2_CLK_PRESCALER);
608
609 /* TDM clock configuration */
610 clk_cfg = readw(base + RP2_ASIC_CFG);
611 clk_cfg = (clk_cfg & ~BIT(8)) | BIT(9);
612 writew(clk_cfg, base + RP2_ASIC_CFG);
613
614 /* IRQ routing */
615 writel(ALL_PORTS_MASK, base + RP2_CH_IRQ_MASK);
616 writel(RP2_ASIC_IRQ_EN_m, base + RP2_ASIC_IRQ);
617}
618
619static void rp2_init_card(struct rp2_card *card)
620{
621 writel(4, card->bar0 + RP2_FPGA_CTL0);
622 writel(0, card->bar0 + RP2_FPGA_CTL1);
623
624 rp2_reset_asic(card, 0);
625 if (card->n_ports >= PORTS_PER_ASIC)
626 rp2_reset_asic(card, 1);
627
628 writel(RP2_IRQ_MASK_EN_m, card->bar0 + RP2_IRQ_MASK);
629}
630
631static void rp2_init_port(struct rp2_uart_port *up, const struct firmware *fw)
632{
633 int i;
634
635 writel(RP2_UART_CTL_RESET_CH_m, up->base + RP2_UART_CTL);
636 readl(up->base + RP2_UART_CTL);
637 udelay(1);
638
639 writel(0, up->base + RP2_TXRX_CTL);
640 writel(0, up->base + RP2_UART_CTL);
641 readl(up->base + RP2_UART_CTL);
642 udelay(1);
643
644 rp2_flush_fifos(up);
645
646 for (i = 0; i < min_t(int, fw->size, RP2_UCODE_BYTES); i++)
647 writeb(fw->data[i], up->ucode + i);
648
649 __rp2_uart_set_termios(up, CS8 | CREAD | CLOCAL, 0, DEFAULT_BAUD_DIV);
650 rp2_uart_set_mctrl(&up->port, 0);
651
652 writeb(RP2_RX_FIFO_ena, up->ucode + RP2_RX_FIFO);
653 rp2_rmw(up, RP2_UART_CTL, RP2_UART_CTL_MODE_m,
654 RP2_UART_CTL_XMIT_EN_m | RP2_UART_CTL_MODE_rs232);
655 rp2_rmw_set(up, RP2_TXRX_CTL,
656 RP2_TXRX_CTL_TX_EN_m | RP2_TXRX_CTL_RX_EN_m);
657}
658
659static void rp2_remove_ports(struct rp2_card *card)
660{
661 int i;
662
663 for (i = 0; i < card->initialized_ports; i++)
664 uart_remove_one_port(&rp2_uart_driver, &card->ports[i].port);
665 card->initialized_ports = 0;
666}
667
668static void rp2_fw_cb(const struct firmware *fw, void *context)
669{
670 struct rp2_card *card = context;
671 resource_size_t phys_base;
672 int i, rc = -ENOENT;
673
674 if (!fw) {
675 dev_err(&card->pdev->dev, "cannot find '%s' firmware image\n",
676 RP2_FW_NAME);
677 goto no_fw;
678 }
679
680 phys_base = pci_resource_start(card->pdev, 1);
681
682 for (i = 0; i < card->n_ports; i++) {
683 struct rp2_uart_port *rp = &card->ports[i];
684 struct uart_port *p;
685 int j = (unsigned)i % PORTS_PER_ASIC;
686
687 rp->asic_base = card->bar1;
688 rp->base = card->bar1 + RP2_PORT_BASE + j*RP2_PORT_SPACING;
689 rp->ucode = card->bar1 + RP2_UCODE_BASE + j*RP2_UCODE_SPACING;
690 rp->card = card;
691 rp->idx = j;
692
693 p = &rp->port;
694 p->line = card->minor_start + i;
695 p->dev = &card->pdev->dev;
696 p->type = PORT_RP2;
697 p->iotype = UPIO_MEM32;
698 p->uartclk = UART_CLOCK;
699 p->regshift = 2;
700 p->fifosize = FIFO_SIZE;
701 p->ops = &rp2_uart_ops;
702 p->irq = card->pdev->irq;
703 p->membase = rp->base;
704 p->mapbase = phys_base + RP2_PORT_BASE + j*RP2_PORT_SPACING;
705
706 if (i >= PORTS_PER_ASIC) {
707 rp->asic_base += RP2_ASIC_SPACING;
708 rp->base += RP2_ASIC_SPACING;
709 rp->ucode += RP2_ASIC_SPACING;
710 p->mapbase += RP2_ASIC_SPACING;
711 }
712
713 rp2_init_port(rp, fw);
714 rc = uart_add_one_port(&rp2_uart_driver, p);
715 if (rc) {
716 dev_err(&card->pdev->dev,
717 "error registering port %d: %d\n", i, rc);
718 rp2_remove_ports(card);
719 break;
720 }
721 card->initialized_ports++;
722 }
723
724 release_firmware(fw);
725no_fw:
726 /*
727 * rp2_fw_cb() is called from a workqueue long after rp2_probe()
728 * has already returned success. So if something failed here,
729 * we'll just leave the now-dormant device in place until somebody
730 * unbinds it.
731 */
732 if (rc)
733 dev_warn(&card->pdev->dev, "driver initialization failed\n");
734
735 complete(&card->fw_loaded);
736}
737
738static int rp2_probe(struct pci_dev *pdev,
739 const struct pci_device_id *id)
740{
741 struct rp2_card *card;
742 struct rp2_uart_port *ports;
743 void __iomem * const *bars;
744 int rc;
745
746 card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
747 if (!card)
748 return -ENOMEM;
749 pci_set_drvdata(pdev, card);
750 spin_lock_init(&card->card_lock);
751 init_completion(&card->fw_loaded);
752
753 rc = pcim_enable_device(pdev);
754 if (rc)
755 return rc;
756
757 rc = pcim_iomap_regions_request_all(pdev, 0x03, DRV_NAME);
758 if (rc)
759 return rc;
760
761 bars = pcim_iomap_table(pdev);
762 card->bar0 = bars[0];
763 card->bar1 = bars[1];
764 card->pdev = pdev;
765
766 rp2_decode_cap(id, &card->n_ports, &card->smpte);
767 dev_info(&pdev->dev, "found new card with %d ports\n", card->n_ports);
768
769 card->minor_start = rp2_alloc_ports(card->n_ports);
770 if (card->minor_start < 0) {
771 dev_err(&pdev->dev,
772 "too many ports (try increasing CONFIG_SERIAL_RP2_NR_UARTS)\n");
773 return -EINVAL;
774 }
775
776 rp2_init_card(card);
777
778 ports = devm_kzalloc(&pdev->dev, sizeof(*ports) * card->n_ports,
779 GFP_KERNEL);
780 if (!ports)
781 return -ENOMEM;
782 card->ports = ports;
783
784 rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt,
785 IRQF_SHARED, DRV_NAME, card);
786 if (rc)
787 return rc;
788
789 /*
790 * Only catastrophic errors (e.g. ENOMEM) are reported here.
791 * If the FW image is missing, we'll find out in rp2_fw_cb()
792 * and print an error message.
793 */
794 rc = request_firmware_nowait(THIS_MODULE, 1, RP2_FW_NAME, &pdev->dev,
795 GFP_KERNEL, card, rp2_fw_cb);
796 if (rc)
797 return rc;
798 dev_dbg(&pdev->dev, "waiting for firmware blob...\n");
799
800 return 0;
801}
802
803static void rp2_remove(struct pci_dev *pdev)
804{
805 struct rp2_card *card = pci_get_drvdata(pdev);
806
807 wait_for_completion(&card->fw_loaded);
808 rp2_remove_ports(card);
809}
810
811static DEFINE_PCI_DEVICE_TABLE(rp2_pci_tbl) = {
812
813 /* RocketPort INFINITY cards */
814
815 { RP_ID(0x0040), RP_CAP(8, 0) }, /* INF Octa, RJ45, selectable */
816 { RP_ID(0x0041), RP_CAP(32, 0) }, /* INF 32, ext interface */
817 { RP_ID(0x0042), RP_CAP(8, 0) }, /* INF Octa, ext interface */
818 { RP_ID(0x0043), RP_CAP(16, 0) }, /* INF 16, ext interface */
819 { RP_ID(0x0044), RP_CAP(4, 0) }, /* INF Quad, DB, selectable */
820 { RP_ID(0x0045), RP_CAP(8, 0) }, /* INF Octa, DB, selectable */
821 { RP_ID(0x0046), RP_CAP(4, 0) }, /* INF Quad, ext interface */
822 { RP_ID(0x0047), RP_CAP(4, 0) }, /* INF Quad, RJ45 */
823 { RP_ID(0x004a), RP_CAP(4, 0) }, /* INF Plus, Quad */
824 { RP_ID(0x004b), RP_CAP(8, 0) }, /* INF Plus, Octa */
825 { RP_ID(0x004c), RP_CAP(8, 0) }, /* INF III, Octa */
826 { RP_ID(0x004d), RP_CAP(4, 0) }, /* INF III, Quad */
827 { RP_ID(0x004e), RP_CAP(2, 0) }, /* INF Plus, 2, RS232 */
828 { RP_ID(0x004f), RP_CAP(2, 1) }, /* INF Plus, 2, SMPTE */
829 { RP_ID(0x0050), RP_CAP(4, 0) }, /* INF Plus, Quad, RJ45 */
830 { RP_ID(0x0051), RP_CAP(8, 0) }, /* INF Plus, Octa, RJ45 */
831 { RP_ID(0x0052), RP_CAP(8, 1) }, /* INF Octa, SMPTE */
832
833 /* RocketPort EXPRESS cards */
834
835 { RP_ID(0x0060), RP_CAP(8, 0) }, /* EXP Octa, RJ45, selectable */
836 { RP_ID(0x0061), RP_CAP(32, 0) }, /* EXP 32, ext interface */
837 { RP_ID(0x0062), RP_CAP(8, 0) }, /* EXP Octa, ext interface */
838 { RP_ID(0x0063), RP_CAP(16, 0) }, /* EXP 16, ext interface */
839 { RP_ID(0x0064), RP_CAP(4, 0) }, /* EXP Quad, DB, selectable */
840 { RP_ID(0x0065), RP_CAP(8, 0) }, /* EXP Octa, DB, selectable */
841 { RP_ID(0x0066), RP_CAP(4, 0) }, /* EXP Quad, ext interface */
842 { RP_ID(0x0067), RP_CAP(4, 0) }, /* EXP Quad, RJ45 */
843 { RP_ID(0x0068), RP_CAP(8, 0) }, /* EXP Octa, RJ11 */
844 { RP_ID(0x0072), RP_CAP(8, 1) }, /* EXP Octa, SMPTE */
845 { }
846};
847MODULE_DEVICE_TABLE(pci, rp2_pci_tbl);
848
849static struct pci_driver rp2_pci_driver = {
850 .name = DRV_NAME,
851 .id_table = rp2_pci_tbl,
852 .probe = rp2_probe,
853 .remove = rp2_remove,
854};
855
856static int __init rp2_uart_init(void)
857{
858 int rc;
859
860 rc = uart_register_driver(&rp2_uart_driver);
861 if (rc)
862 return rc;
863
864 rc = pci_register_driver(&rp2_pci_driver);
865 if (rc) {
866 uart_unregister_driver(&rp2_uart_driver);
867 return rc;
868 }
869
870 return 0;
871}
872
873static void __exit rp2_uart_exit(void)
874{
875 pci_unregister_driver(&rp2_pci_driver);
876 uart_unregister_driver(&rp2_uart_driver);
877}
878
879module_init(rp2_uart_init);
880module_exit(rp2_uart_exit);
881
882MODULE_DESCRIPTION("Comtrol RocketPort EXPRESS/INFINITY driver");
883MODULE_AUTHOR("Kevin Cernekee <cernekee@gmail.com>");
884MODULE_LICENSE("GPL v2");
885MODULE_FIRMWARE(RP2_FW_NAME);
diff --git a/drivers/tty/serial/sa1100.c b/drivers/tty/serial/sa1100.c
index 5d4b9b449b4a..af6b3e3ad24d 100644
--- a/drivers/tty/serial/sa1100.c
+++ b/drivers/tty/serial/sa1100.c
@@ -188,7 +188,6 @@ static void sa1100_enable_ms(struct uart_port *port)
188static void 188static void
189sa1100_rx_chars(struct sa1100_port *sport) 189sa1100_rx_chars(struct sa1100_port *sport)
190{ 190{
191 struct tty_struct *tty = sport->port.state->port.tty;
192 unsigned int status, ch, flg; 191 unsigned int status, ch, flg;
193 192
194 status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) | 193 status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) |
@@ -233,7 +232,7 @@ sa1100_rx_chars(struct sa1100_port *sport)
233 status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) | 232 status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) |
234 UTSR0_TO_SM(UART_GET_UTSR0(sport)); 233 UTSR0_TO_SM(UART_GET_UTSR0(sport));
235 } 234 }
236 tty_flip_buffer_push(tty); 235 tty_flip_buffer_push(&sport->port.state->port);
237} 236}
238 237
239static void sa1100_tx_chars(struct sa1100_port *sport) 238static void sa1100_tx_chars(struct sa1100_port *sport)
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index e514b3a4dc57..2769a38d15b6 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
@@ -47,7 +47,6 @@
47#include <asm/irq.h> 47#include <asm/irq.h>
48 48
49#include <mach/hardware.h> 49#include <mach/hardware.h>
50#include <mach/map.h>
51 50
52#include <plat/regs-serial.h> 51#include <plat/regs-serial.h>
53#include <plat/clock.h> 52#include <plat/clock.h>
@@ -221,7 +220,6 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id)
221{ 220{
222 struct s3c24xx_uart_port *ourport = dev_id; 221 struct s3c24xx_uart_port *ourport = dev_id;
223 struct uart_port *port = &ourport->port; 222 struct uart_port *port = &ourport->port;
224 struct tty_struct *tty = port->state->port.tty;
225 unsigned int ufcon, ch, flag, ufstat, uerstat; 223 unsigned int ufcon, ch, flag, ufstat, uerstat;
226 unsigned long flags; 224 unsigned long flags;
227 int max_count = 64; 225 int max_count = 64;
@@ -299,7 +297,7 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id)
299 ignore_char: 297 ignore_char:
300 continue; 298 continue;
301 } 299 }
302 tty_flip_buffer_push(tty); 300 tty_flip_buffer_push(&port->state->port);
303 301
304 out: 302 out:
305 spin_unlock_irqrestore(&port->lock, flags); 303 spin_unlock_irqrestore(&port->lock, flags);
@@ -1143,8 +1141,13 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
1143 1141
1144 dbg("resource %p (%lx..%lx)\n", res, res->start, res->end); 1142 dbg("resource %p (%lx..%lx)\n", res, res->start, res->end);
1145 1143
1144 port->membase = devm_ioremap(port->dev, res->start, resource_size(res));
1145 if (!port->membase) {
1146 dev_err(port->dev, "failed to remap controller address\n");
1147 return -EBUSY;
1148 }
1149
1146 port->mapbase = res->start; 1150 port->mapbase = res->start;
1147 port->membase = S3C_VA_UART + (res->start & 0xfffff);
1148 ret = platform_get_irq(platdev, 0); 1151 ret = platform_get_irq(platdev, 0);
1149 if (ret < 0) 1152 if (ret < 0)
1150 port->irq = 0; 1153 port->irq = 0;
@@ -1724,8 +1727,6 @@ static const struct of_device_id s3c24xx_uart_dt_match[] = {
1724 {}, 1727 {},
1725}; 1728};
1726MODULE_DEVICE_TABLE(of, s3c24xx_uart_dt_match); 1729MODULE_DEVICE_TABLE(of, s3c24xx_uart_dt_match);
1727#else
1728#define s3c24xx_uart_dt_match NULL
1729#endif 1730#endif
1730 1731
1731static struct platform_driver samsung_serial_driver = { 1732static struct platform_driver samsung_serial_driver = {
@@ -1736,7 +1737,7 @@ static struct platform_driver samsung_serial_driver = {
1736 .name = "samsung-uart", 1737 .name = "samsung-uart",
1737 .owner = THIS_MODULE, 1738 .owner = THIS_MODULE,
1738 .pm = SERIAL_SAMSUNG_PM_OPS, 1739 .pm = SERIAL_SAMSUNG_PM_OPS,
1739 .of_match_table = s3c24xx_uart_dt_match, 1740 .of_match_table = of_match_ptr(s3c24xx_uart_dt_match),
1740 }, 1741 },
1741}; 1742};
1742 1743
diff --git a/drivers/tty/serial/sb1250-duart.c b/drivers/tty/serial/sb1250-duart.c
index f76b1688c5c8..a7cdec2962dd 100644
--- a/drivers/tty/serial/sb1250-duart.c
+++ b/drivers/tty/serial/sb1250-duart.c
@@ -384,7 +384,7 @@ static void sbd_receive_chars(struct sbd_port *sport)
384 uart_insert_char(uport, status, M_DUART_OVRUN_ERR, ch, flag); 384 uart_insert_char(uport, status, M_DUART_OVRUN_ERR, ch, flag);
385 } 385 }
386 386
387 tty_flip_buffer_push(uport->state->port.tty); 387 tty_flip_buffer_push(&uport->state->port);
388} 388}
389 389
390static void sbd_transmit_chars(struct sbd_port *sport) 390static void sbd_transmit_chars(struct sbd_port *sport)
diff --git a/drivers/tty/serial/sc26xx.c b/drivers/tty/serial/sc26xx.c
index aced1dd923d8..c9735680762d 100644
--- a/drivers/tty/serial/sc26xx.c
+++ b/drivers/tty/serial/sc26xx.c
@@ -136,16 +136,17 @@ static void sc26xx_disable_irq(struct uart_port *port, int mask)
136 WRITE_SC(port, IMR, up->imr); 136 WRITE_SC(port, IMR, up->imr);
137} 137}
138 138
139static struct tty_struct *receive_chars(struct uart_port *port) 139static bool receive_chars(struct uart_port *port)
140{ 140{
141 struct tty_struct *tty = NULL; 141 struct tty_port *tport = NULL;
142 int limit = 10000; 142 int limit = 10000;
143 unsigned char ch; 143 unsigned char ch;
144 char flag; 144 char flag;
145 u8 status; 145 u8 status;
146 146
147 /* FIXME what is this trying to achieve? */
147 if (port->state != NULL) /* Unopened serial console */ 148 if (port->state != NULL) /* Unopened serial console */
148 tty = port->state->port.tty; 149 tport = &port->state->port;
149 150
150 while (limit-- > 0) { 151 while (limit-- > 0) {
151 status = READ_SC_PORT(port, SR); 152 status = READ_SC_PORT(port, SR);
@@ -185,9 +186,9 @@ static struct tty_struct *receive_chars(struct uart_port *port)
185 if (status & port->ignore_status_mask) 186 if (status & port->ignore_status_mask)
186 continue; 187 continue;
187 188
188 tty_insert_flip_char(tty, ch, flag); 189 tty_insert_flip_char(tport, ch, flag);
189 } 190 }
190 return tty; 191 return !!tport;
191} 192}
192 193
193static void transmit_chars(struct uart_port *port) 194static void transmit_chars(struct uart_port *port)
@@ -217,36 +218,36 @@ static void transmit_chars(struct uart_port *port)
217static irqreturn_t sc26xx_interrupt(int irq, void *dev_id) 218static irqreturn_t sc26xx_interrupt(int irq, void *dev_id)
218{ 219{
219 struct uart_sc26xx_port *up = dev_id; 220 struct uart_sc26xx_port *up = dev_id;
220 struct tty_struct *tty;
221 unsigned long flags; 221 unsigned long flags;
222 bool push;
222 u8 isr; 223 u8 isr;
223 224
224 spin_lock_irqsave(&up->port[0].lock, flags); 225 spin_lock_irqsave(&up->port[0].lock, flags);
225 226
226 tty = NULL; 227 push = false;
227 isr = READ_SC(&up->port[0], ISR); 228 isr = READ_SC(&up->port[0], ISR);
228 if (isr & ISR_TXRDYA) 229 if (isr & ISR_TXRDYA)
229 transmit_chars(&up->port[0]); 230 transmit_chars(&up->port[0]);
230 if (isr & ISR_RXRDYA) 231 if (isr & ISR_RXRDYA)
231 tty = receive_chars(&up->port[0]); 232 push = receive_chars(&up->port[0]);
232 233
233 spin_unlock(&up->port[0].lock); 234 spin_unlock(&up->port[0].lock);
234 235
235 if (tty) 236 if (push)
236 tty_flip_buffer_push(tty); 237 tty_flip_buffer_push(&up->port[0].state->port);
237 238
238 spin_lock(&up->port[1].lock); 239 spin_lock(&up->port[1].lock);
239 240
240 tty = NULL; 241 push = false;
241 if (isr & ISR_TXRDYB) 242 if (isr & ISR_TXRDYB)
242 transmit_chars(&up->port[1]); 243 transmit_chars(&up->port[1]);
243 if (isr & ISR_RXRDYB) 244 if (isr & ISR_RXRDYB)
244 tty = receive_chars(&up->port[1]); 245 push = receive_chars(&up->port[1]);
245 246
246 spin_unlock_irqrestore(&up->port[1].lock, flags); 247 spin_unlock_irqrestore(&up->port[1].lock, flags);
247 248
248 if (tty) 249 if (push)
249 tty_flip_buffer_push(tty); 250 tty_flip_buffer_push(&up->port[1].state->port);
250 251
251 return IRQ_HANDLED; 252 return IRQ_HANDLED;
252} 253}
diff --git a/drivers/tty/serial/sccnxp.c b/drivers/tty/serial/sccnxp.c
index 418b495e3233..caccbe8fc1be 100644
--- a/drivers/tty/serial/sccnxp.c
+++ b/drivers/tty/serial/sccnxp.c
@@ -23,8 +23,9 @@
23#include <linux/io.h> 23#include <linux/io.h>
24#include <linux/tty.h> 24#include <linux/tty.h>
25#include <linux/tty_flip.h> 25#include <linux/tty_flip.h>
26#include <linux/spinlock.h>
26#include <linux/platform_device.h> 27#include <linux/platform_device.h>
27#include <linux/platform_data/sccnxp.h> 28#include <linux/platform_data/serial-sccnxp.h>
28 29
29#define SCCNXP_NAME "uart-sccnxp" 30#define SCCNXP_NAME "uart-sccnxp"
30#define SCCNXP_MAJOR 204 31#define SCCNXP_MAJOR 204
@@ -106,6 +107,7 @@ enum {
106struct sccnxp_port { 107struct sccnxp_port {
107 struct uart_driver uart; 108 struct uart_driver uart;
108 struct uart_port port[SCCNXP_MAX_UARTS]; 109 struct uart_port port[SCCNXP_MAX_UARTS];
110 bool opened[SCCNXP_MAX_UARTS];
109 111
110 const char *name; 112 const char *name;
111 int irq; 113 int irq;
@@ -122,7 +124,10 @@ struct sccnxp_port {
122 struct console console; 124 struct console console;
123#endif 125#endif
124 126
125 struct mutex sccnxp_mutex; 127 spinlock_t lock;
128
129 bool poll;
130 struct timer_list timer;
126 131
127 struct sccnxp_pdata pdata; 132 struct sccnxp_pdata pdata;
128}; 133};
@@ -174,14 +179,12 @@ static int sccnxp_update_best_err(int a, int b, int *besterr)
174 return 1; 179 return 1;
175} 180}
176 181
177struct baud_table { 182static const struct {
178 u8 csr; 183 u8 csr;
179 u8 acr; 184 u8 acr;
180 u8 mr0; 185 u8 mr0;
181 int baud; 186 int baud;
182}; 187} baud_std[] = {
183
184const struct baud_table baud_std[] = {
185 { 0, ACR_BAUD0, MR0_BAUD_NORMAL, 50, }, 188 { 0, ACR_BAUD0, MR0_BAUD_NORMAL, 50, },
186 { 0, ACR_BAUD1, MR0_BAUD_NORMAL, 75, }, 189 { 0, ACR_BAUD1, MR0_BAUD_NORMAL, 75, },
187 { 1, ACR_BAUD0, MR0_BAUD_NORMAL, 110, }, 190 { 1, ACR_BAUD0, MR0_BAUD_NORMAL, 110, },
@@ -285,10 +288,6 @@ static void sccnxp_handle_rx(struct uart_port *port)
285{ 288{
286 u8 sr; 289 u8 sr;
287 unsigned int ch, flag; 290 unsigned int ch, flag;
288 struct tty_struct *tty = tty_port_tty_get(&port->state->port);
289
290 if (!tty)
291 return;
292 291
293 for (;;) { 292 for (;;) {
294 sr = sccnxp_port_read(port, SCCNXP_SR_REG); 293 sr = sccnxp_port_read(port, SCCNXP_SR_REG);
@@ -304,14 +303,19 @@ static void sccnxp_handle_rx(struct uart_port *port)
304 if (unlikely(sr)) { 303 if (unlikely(sr)) {
305 if (sr & SR_BRK) { 304 if (sr & SR_BRK) {
306 port->icount.brk++; 305 port->icount.brk++;
306 sccnxp_port_write(port, SCCNXP_CR_REG,
307 CR_CMD_BREAK_RESET);
307 if (uart_handle_break(port)) 308 if (uart_handle_break(port))
308 continue; 309 continue;
309 } else if (sr & SR_PE) 310 } else if (sr & SR_PE)
310 port->icount.parity++; 311 port->icount.parity++;
311 else if (sr & SR_FE) 312 else if (sr & SR_FE)
312 port->icount.frame++; 313 port->icount.frame++;
313 else if (sr & SR_OVR) 314 else if (sr & SR_OVR) {
314 port->icount.overrun++; 315 port->icount.overrun++;
316 sccnxp_port_write(port, SCCNXP_CR_REG,
317 CR_CMD_STATUS_RESET);
318 }
315 319
316 sr &= port->read_status_mask; 320 sr &= port->read_status_mask;
317 if (sr & SR_BRK) 321 if (sr & SR_BRK)
@@ -333,9 +337,7 @@ static void sccnxp_handle_rx(struct uart_port *port)
333 uart_insert_char(port, sr, SR_OVR, ch, flag); 337 uart_insert_char(port, sr, SR_OVR, ch, flag);
334 } 338 }
335 339
336 tty_flip_buffer_push(tty); 340 tty_flip_buffer_push(&port->state->port);
337
338 tty_kref_put(tty);
339} 341}
340 342
341static void sccnxp_handle_tx(struct uart_port *port) 343static void sccnxp_handle_tx(struct uart_port *port)
@@ -377,31 +379,48 @@ static void sccnxp_handle_tx(struct uart_port *port)
377 uart_write_wakeup(port); 379 uart_write_wakeup(port);
378} 380}
379 381
380static irqreturn_t sccnxp_ist(int irq, void *dev_id) 382static void sccnxp_handle_events(struct sccnxp_port *s)
381{ 383{
382 int i; 384 int i;
383 u8 isr; 385 u8 isr;
384 struct sccnxp_port *s = (struct sccnxp_port *)dev_id;
385
386 mutex_lock(&s->sccnxp_mutex);
387 386
388 for (;;) { 387 do {
389 isr = sccnxp_read(&s->port[0], SCCNXP_ISR_REG); 388 isr = sccnxp_read(&s->port[0], SCCNXP_ISR_REG);
390 isr &= s->imr; 389 isr &= s->imr;
391 if (!isr) 390 if (!isr)
392 break; 391 break;
393 392
394 dev_dbg(s->port[0].dev, "IRQ status: 0x%02x\n", isr);
395
396 for (i = 0; i < s->uart.nr; i++) { 393 for (i = 0; i < s->uart.nr; i++) {
397 if (isr & ISR_RXRDY(i)) 394 if (s->opened[i] && (isr & ISR_RXRDY(i)))
398 sccnxp_handle_rx(&s->port[i]); 395 sccnxp_handle_rx(&s->port[i]);
399 if (isr & ISR_TXRDY(i)) 396 if (s->opened[i] && (isr & ISR_TXRDY(i)))
400 sccnxp_handle_tx(&s->port[i]); 397 sccnxp_handle_tx(&s->port[i]);
401 } 398 }
402 } 399 } while (1);
400}
401
402static void sccnxp_timer(unsigned long data)
403{
404 struct sccnxp_port *s = (struct sccnxp_port *)data;
405 unsigned long flags;
403 406
404 mutex_unlock(&s->sccnxp_mutex); 407 spin_lock_irqsave(&s->lock, flags);
408 sccnxp_handle_events(s);
409 spin_unlock_irqrestore(&s->lock, flags);
410
411 if (!timer_pending(&s->timer))
412 mod_timer(&s->timer, jiffies +
413 usecs_to_jiffies(s->pdata.poll_time_us));
414}
415
416static irqreturn_t sccnxp_ist(int irq, void *dev_id)
417{
418 struct sccnxp_port *s = (struct sccnxp_port *)dev_id;
419 unsigned long flags;
420
421 spin_lock_irqsave(&s->lock, flags);
422 sccnxp_handle_events(s);
423 spin_unlock_irqrestore(&s->lock, flags);
405 424
406 return IRQ_HANDLED; 425 return IRQ_HANDLED;
407} 426}
@@ -409,8 +428,9 @@ static irqreturn_t sccnxp_ist(int irq, void *dev_id)
409static void sccnxp_start_tx(struct uart_port *port) 428static void sccnxp_start_tx(struct uart_port *port)
410{ 429{
411 struct sccnxp_port *s = dev_get_drvdata(port->dev); 430 struct sccnxp_port *s = dev_get_drvdata(port->dev);
431 unsigned long flags;
412 432
413 mutex_lock(&s->sccnxp_mutex); 433 spin_lock_irqsave(&s->lock, flags);
414 434
415 /* Set direction to output */ 435 /* Set direction to output */
416 if (s->flags & SCCNXP_HAVE_IO) 436 if (s->flags & SCCNXP_HAVE_IO)
@@ -418,7 +438,7 @@ static void sccnxp_start_tx(struct uart_port *port)
418 438
419 sccnxp_enable_irq(port, IMR_TXRDY); 439 sccnxp_enable_irq(port, IMR_TXRDY);
420 440
421 mutex_unlock(&s->sccnxp_mutex); 441 spin_unlock_irqrestore(&s->lock, flags);
422} 442}
423 443
424static void sccnxp_stop_tx(struct uart_port *port) 444static void sccnxp_stop_tx(struct uart_port *port)
@@ -429,20 +449,22 @@ static void sccnxp_stop_tx(struct uart_port *port)
429static void sccnxp_stop_rx(struct uart_port *port) 449static void sccnxp_stop_rx(struct uart_port *port)
430{ 450{
431 struct sccnxp_port *s = dev_get_drvdata(port->dev); 451 struct sccnxp_port *s = dev_get_drvdata(port->dev);
452 unsigned long flags;
432 453
433 mutex_lock(&s->sccnxp_mutex); 454 spin_lock_irqsave(&s->lock, flags);
434 sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_DISABLE); 455 sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_DISABLE);
435 mutex_unlock(&s->sccnxp_mutex); 456 spin_unlock_irqrestore(&s->lock, flags);
436} 457}
437 458
438static unsigned int sccnxp_tx_empty(struct uart_port *port) 459static unsigned int sccnxp_tx_empty(struct uart_port *port)
439{ 460{
440 u8 val; 461 u8 val;
462 unsigned long flags;
441 struct sccnxp_port *s = dev_get_drvdata(port->dev); 463 struct sccnxp_port *s = dev_get_drvdata(port->dev);
442 464
443 mutex_lock(&s->sccnxp_mutex); 465 spin_lock_irqsave(&s->lock, flags);
444 val = sccnxp_port_read(port, SCCNXP_SR_REG); 466 val = sccnxp_port_read(port, SCCNXP_SR_REG);
445 mutex_unlock(&s->sccnxp_mutex); 467 spin_unlock_irqrestore(&s->lock, flags);
446 468
447 return (val & SR_TXEMT) ? TIOCSER_TEMT : 0; 469 return (val & SR_TXEMT) ? TIOCSER_TEMT : 0;
448} 470}
@@ -455,28 +477,30 @@ static void sccnxp_enable_ms(struct uart_port *port)
455static void sccnxp_set_mctrl(struct uart_port *port, unsigned int mctrl) 477static void sccnxp_set_mctrl(struct uart_port *port, unsigned int mctrl)
456{ 478{
457 struct sccnxp_port *s = dev_get_drvdata(port->dev); 479 struct sccnxp_port *s = dev_get_drvdata(port->dev);
480 unsigned long flags;
458 481
459 if (!(s->flags & SCCNXP_HAVE_IO)) 482 if (!(s->flags & SCCNXP_HAVE_IO))
460 return; 483 return;
461 484
462 mutex_lock(&s->sccnxp_mutex); 485 spin_lock_irqsave(&s->lock, flags);
463 486
464 sccnxp_set_bit(port, DTR_OP, mctrl & TIOCM_DTR); 487 sccnxp_set_bit(port, DTR_OP, mctrl & TIOCM_DTR);
465 sccnxp_set_bit(port, RTS_OP, mctrl & TIOCM_RTS); 488 sccnxp_set_bit(port, RTS_OP, mctrl & TIOCM_RTS);
466 489
467 mutex_unlock(&s->sccnxp_mutex); 490 spin_unlock_irqrestore(&s->lock, flags);
468} 491}
469 492
470static unsigned int sccnxp_get_mctrl(struct uart_port *port) 493static unsigned int sccnxp_get_mctrl(struct uart_port *port)
471{ 494{
472 u8 bitmask, ipr; 495 u8 bitmask, ipr;
496 unsigned long flags;
473 struct sccnxp_port *s = dev_get_drvdata(port->dev); 497 struct sccnxp_port *s = dev_get_drvdata(port->dev);
474 unsigned int mctrl = TIOCM_DSR | TIOCM_CTS | TIOCM_CAR; 498 unsigned int mctrl = TIOCM_DSR | TIOCM_CTS | TIOCM_CAR;
475 499
476 if (!(s->flags & SCCNXP_HAVE_IO)) 500 if (!(s->flags & SCCNXP_HAVE_IO))
477 return mctrl; 501 return mctrl;
478 502
479 mutex_lock(&s->sccnxp_mutex); 503 spin_lock_irqsave(&s->lock, flags);
480 504
481 ipr = ~sccnxp_read(port, SCCNXP_IPCR_REG); 505 ipr = ~sccnxp_read(port, SCCNXP_IPCR_REG);
482 506
@@ -505,7 +529,7 @@ static unsigned int sccnxp_get_mctrl(struct uart_port *port)
505 mctrl |= (ipr & bitmask) ? TIOCM_RNG : 0; 529 mctrl |= (ipr & bitmask) ? TIOCM_RNG : 0;
506 } 530 }
507 531
508 mutex_unlock(&s->sccnxp_mutex); 532 spin_unlock_irqrestore(&s->lock, flags);
509 533
510 return mctrl; 534 return mctrl;
511} 535}
@@ -513,21 +537,23 @@ static unsigned int sccnxp_get_mctrl(struct uart_port *port)
513static void sccnxp_break_ctl(struct uart_port *port, int break_state) 537static void sccnxp_break_ctl(struct uart_port *port, int break_state)
514{ 538{
515 struct sccnxp_port *s = dev_get_drvdata(port->dev); 539 struct sccnxp_port *s = dev_get_drvdata(port->dev);
540 unsigned long flags;
516 541
517 mutex_lock(&s->sccnxp_mutex); 542 spin_lock_irqsave(&s->lock, flags);
518 sccnxp_port_write(port, SCCNXP_CR_REG, break_state ? 543 sccnxp_port_write(port, SCCNXP_CR_REG, break_state ?
519 CR_CMD_START_BREAK : CR_CMD_STOP_BREAK); 544 CR_CMD_START_BREAK : CR_CMD_STOP_BREAK);
520 mutex_unlock(&s->sccnxp_mutex); 545 spin_unlock_irqrestore(&s->lock, flags);
521} 546}
522 547
523static void sccnxp_set_termios(struct uart_port *port, 548static void sccnxp_set_termios(struct uart_port *port,
524 struct ktermios *termios, struct ktermios *old) 549 struct ktermios *termios, struct ktermios *old)
525{ 550{
526 struct sccnxp_port *s = dev_get_drvdata(port->dev); 551 struct sccnxp_port *s = dev_get_drvdata(port->dev);
552 unsigned long flags;
527 u8 mr1, mr2; 553 u8 mr1, mr2;
528 int baud; 554 int baud;
529 555
530 mutex_lock(&s->sccnxp_mutex); 556 spin_lock_irqsave(&s->lock, flags);
531 557
532 /* Mask termios capabilities we don't support */ 558 /* Mask termios capabilities we don't support */
533 termios->c_cflag &= ~CMSPAR; 559 termios->c_cflag &= ~CMSPAR;
@@ -594,20 +620,22 @@ static void sccnxp_set_termios(struct uart_port *port,
594 /* Update timeout according to new baud rate */ 620 /* Update timeout according to new baud rate */
595 uart_update_timeout(port, termios->c_cflag, baud); 621 uart_update_timeout(port, termios->c_cflag, baud);
596 622
623 /* Report actual baudrate back to core */
597 if (tty_termios_baud_rate(termios)) 624 if (tty_termios_baud_rate(termios))
598 tty_termios_encode_baud_rate(termios, baud, baud); 625 tty_termios_encode_baud_rate(termios, baud, baud);
599 626
600 /* Enable RX & TX */ 627 /* Enable RX & TX */
601 sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_ENABLE | CR_TX_ENABLE); 628 sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_ENABLE | CR_TX_ENABLE);
602 629
603 mutex_unlock(&s->sccnxp_mutex); 630 spin_unlock_irqrestore(&s->lock, flags);
604} 631}
605 632
606static int sccnxp_startup(struct uart_port *port) 633static int sccnxp_startup(struct uart_port *port)
607{ 634{
608 struct sccnxp_port *s = dev_get_drvdata(port->dev); 635 struct sccnxp_port *s = dev_get_drvdata(port->dev);
636 unsigned long flags;
609 637
610 mutex_lock(&s->sccnxp_mutex); 638 spin_lock_irqsave(&s->lock, flags);
611 639
612 if (s->flags & SCCNXP_HAVE_IO) { 640 if (s->flags & SCCNXP_HAVE_IO) {
613 /* Outputs are controlled manually */ 641 /* Outputs are controlled manually */
@@ -626,7 +654,9 @@ static int sccnxp_startup(struct uart_port *port)
626 /* Enable RX interrupt */ 654 /* Enable RX interrupt */
627 sccnxp_enable_irq(port, IMR_RXRDY); 655 sccnxp_enable_irq(port, IMR_RXRDY);
628 656
629 mutex_unlock(&s->sccnxp_mutex); 657 s->opened[port->line] = 1;
658
659 spin_unlock_irqrestore(&s->lock, flags);
630 660
631 return 0; 661 return 0;
632} 662}
@@ -634,8 +664,11 @@ static int sccnxp_startup(struct uart_port *port)
634static void sccnxp_shutdown(struct uart_port *port) 664static void sccnxp_shutdown(struct uart_port *port)
635{ 665{
636 struct sccnxp_port *s = dev_get_drvdata(port->dev); 666 struct sccnxp_port *s = dev_get_drvdata(port->dev);
667 unsigned long flags;
637 668
638 mutex_lock(&s->sccnxp_mutex); 669 spin_lock_irqsave(&s->lock, flags);
670
671 s->opened[port->line] = 0;
639 672
640 /* Disable interrupts */ 673 /* Disable interrupts */
641 sccnxp_disable_irq(port, IMR_TXRDY | IMR_RXRDY); 674 sccnxp_disable_irq(port, IMR_TXRDY | IMR_RXRDY);
@@ -647,7 +680,7 @@ static void sccnxp_shutdown(struct uart_port *port)
647 if (s->flags & SCCNXP_HAVE_IO) 680 if (s->flags & SCCNXP_HAVE_IO)
648 sccnxp_set_bit(port, DIR_OP, 0); 681 sccnxp_set_bit(port, DIR_OP, 0);
649 682
650 mutex_unlock(&s->sccnxp_mutex); 683 spin_unlock_irqrestore(&s->lock, flags);
651} 684}
652 685
653static const char *sccnxp_type(struct uart_port *port) 686static const char *sccnxp_type(struct uart_port *port)
@@ -721,10 +754,11 @@ static void sccnxp_console_write(struct console *co, const char *c, unsigned n)
721{ 754{
722 struct sccnxp_port *s = (struct sccnxp_port *)co->data; 755 struct sccnxp_port *s = (struct sccnxp_port *)co->data;
723 struct uart_port *port = &s->port[co->index]; 756 struct uart_port *port = &s->port[co->index];
757 unsigned long flags;
724 758
725 mutex_lock(&s->sccnxp_mutex); 759 spin_lock_irqsave(&s->lock, flags);
726 uart_console_write(port, c, n, sccnxp_console_putchar); 760 uart_console_write(port, c, n, sccnxp_console_putchar);
727 mutex_unlock(&s->sccnxp_mutex); 761 spin_unlock_irqrestore(&s->lock, flags);
728} 762}
729 763
730static int sccnxp_console_setup(struct console *co, char *options) 764static int sccnxp_console_setup(struct console *co, char *options)
@@ -763,7 +797,7 @@ static int sccnxp_probe(struct platform_device *pdev)
763 } 797 }
764 platform_set_drvdata(pdev, s); 798 platform_set_drvdata(pdev, s);
765 799
766 mutex_init(&s->sccnxp_mutex); 800 spin_lock_init(&s->lock);
767 801
768 /* Individual chip settings */ 802 /* Individual chip settings */
769 switch (chiptype) { 803 switch (chiptype) {
@@ -860,11 +894,19 @@ static int sccnxp_probe(struct platform_device *pdev)
860 } else 894 } else
861 memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata)); 895 memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata));
862 896
863 s->irq = platform_get_irq(pdev, 0); 897 if (s->pdata.poll_time_us) {
864 if (s->irq <= 0) { 898 dev_info(&pdev->dev, "Using poll mode, resolution %u usecs\n",
865 dev_err(&pdev->dev, "Missing irq resource data\n"); 899 s->pdata.poll_time_us);
866 ret = -ENXIO; 900 s->poll = 1;
867 goto err_out; 901 }
902
903 if (!s->poll) {
904 s->irq = platform_get_irq(pdev, 0);
905 if (s->irq < 0) {
906 dev_err(&pdev->dev, "Missing irq resource data\n");
907 ret = -ENXIO;
908 goto err_out;
909 }
868 } 910 }
869 911
870 /* Check input frequency */ 912 /* Check input frequency */
@@ -929,13 +971,23 @@ static int sccnxp_probe(struct platform_device *pdev)
929 if (s->pdata.init) 971 if (s->pdata.init)
930 s->pdata.init(); 972 s->pdata.init();
931 973
932 ret = devm_request_threaded_irq(&pdev->dev, s->irq, NULL, sccnxp_ist, 974 if (!s->poll) {
933 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 975 ret = devm_request_threaded_irq(&pdev->dev, s->irq, NULL,
934 dev_name(&pdev->dev), s); 976 sccnxp_ist,
935 if (!ret) 977 IRQF_TRIGGER_FALLING |
978 IRQF_ONESHOT,
979 dev_name(&pdev->dev), s);
980 if (!ret)
981 return 0;
982
983 dev_err(&pdev->dev, "Unable to reguest IRQ %i\n", s->irq);
984 } else {
985 init_timer(&s->timer);
986 setup_timer(&s->timer, sccnxp_timer, (unsigned long)s);
987 mod_timer(&s->timer, jiffies +
988 usecs_to_jiffies(s->pdata.poll_time_us));
936 return 0; 989 return 0;
937 990 }
938 dev_err(&pdev->dev, "Unable to reguest IRQ %i\n", s->irq);
939 991
940err_out: 992err_out:
941 platform_set_drvdata(pdev, NULL); 993 platform_set_drvdata(pdev, NULL);
@@ -948,7 +1000,10 @@ static int sccnxp_remove(struct platform_device *pdev)
948 int i; 1000 int i;
949 struct sccnxp_port *s = platform_get_drvdata(pdev); 1001 struct sccnxp_port *s = platform_get_drvdata(pdev);
950 1002
951 devm_free_irq(&pdev->dev, s->irq, s); 1003 if (!s->poll)
1004 devm_free_irq(&pdev->dev, s->irq, s);
1005 else
1006 del_timer_sync(&s->timer);
952 1007
953 for (i = 0; i < s->uart.nr; i++) 1008 for (i = 0; i < s->uart.nr; i++)
954 uart_remove_one_port(&s->uart, &s->port[i]); 1009 uart_remove_one_port(&s->uart, &s->port[i]);
diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c
new file mode 100644
index 000000000000..4f5e62989a2b
--- /dev/null
+++ b/drivers/tty/serial/serial-tegra.c
@@ -0,0 +1,1402 @@
1/*
2 * serial_tegra.c
3 *
4 * High-speed serial driver for NVIDIA Tegra SoCs
5 *
6 * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
7 *
8 * Author: Laxman Dewangan <ldewangan@nvidia.com>
9 *
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms and conditions of the GNU General Public License,
12 * version 2, as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23#include <linux/clk.h>
24#include <linux/debugfs.h>
25#include <linux/delay.h>
26#include <linux/dmaengine.h>
27#include <linux/dma-mapping.h>
28#include <linux/dmapool.h>
29#include <linux/io.h>
30#include <linux/irq.h>
31#include <linux/module.h>
32#include <linux/of.h>
33#include <linux/of_device.h>
34#include <linux/pagemap.h>
35#include <linux/platform_device.h>
36#include <linux/serial.h>
37#include <linux/serial_8250.h>
38#include <linux/serial_core.h>
39#include <linux/serial_reg.h>
40#include <linux/slab.h>
41#include <linux/string.h>
42#include <linux/termios.h>
43#include <linux/tty.h>
44#include <linux/tty_flip.h>
45
46#include <linux/clk/tegra.h>
47
48#define TEGRA_UART_TYPE "TEGRA_UART"
49#define TX_EMPTY_STATUS (UART_LSR_TEMT | UART_LSR_THRE)
50#define BYTES_TO_ALIGN(x) ((unsigned long)(x) & 0x3)
51
52#define TEGRA_UART_RX_DMA_BUFFER_SIZE 4096
53#define TEGRA_UART_LSR_TXFIFO_FULL 0x100
54#define TEGRA_UART_IER_EORD 0x20
55#define TEGRA_UART_MCR_RTS_EN 0x40
56#define TEGRA_UART_MCR_CTS_EN 0x20
57#define TEGRA_UART_LSR_ANY (UART_LSR_OE | UART_LSR_BI | \
58 UART_LSR_PE | UART_LSR_FE)
59#define TEGRA_UART_IRDA_CSR 0x08
60#define TEGRA_UART_SIR_ENABLED 0x80
61
62#define TEGRA_UART_TX_PIO 1
63#define TEGRA_UART_TX_DMA 2
64#define TEGRA_UART_MIN_DMA 16
65#define TEGRA_UART_FIFO_SIZE 32
66
67/*
68 * Tx fifo trigger level setting in tegra uart is in
69 * reverse way then conventional uart.
70 */
71#define TEGRA_UART_TX_TRIG_16B 0x00
72#define TEGRA_UART_TX_TRIG_8B 0x10
73#define TEGRA_UART_TX_TRIG_4B 0x20
74#define TEGRA_UART_TX_TRIG_1B 0x30
75
76#define TEGRA_UART_MAXIMUM 5
77
78/* Default UART setting when started: 115200 no parity, stop, 8 data bits */
79#define TEGRA_UART_DEFAULT_BAUD 115200
80#define TEGRA_UART_DEFAULT_LSR UART_LCR_WLEN8
81
82/* Tx transfer mode */
83#define TEGRA_TX_PIO 1
84#define TEGRA_TX_DMA 2
85
86/**
87 * tegra_uart_chip_data: SOC specific data.
88 *
89 * @tx_fifo_full_status: Status flag available for checking tx fifo full.
90 * @allow_txfifo_reset_fifo_mode: allow_tx fifo reset with fifo mode or not.
91 * Tegra30 does not allow this.
92 * @support_clk_src_div: Clock source support the clock divider.
93 */
94struct tegra_uart_chip_data {
95 bool tx_fifo_full_status;
96 bool allow_txfifo_reset_fifo_mode;
97 bool support_clk_src_div;
98};
99
100struct tegra_uart_port {
101 struct uart_port uport;
102 const struct tegra_uart_chip_data *cdata;
103
104 struct clk *uart_clk;
105 unsigned int current_baud;
106
107 /* Register shadow */
108 unsigned long fcr_shadow;
109 unsigned long mcr_shadow;
110 unsigned long lcr_shadow;
111 unsigned long ier_shadow;
112 bool rts_active;
113
114 int tx_in_progress;
115 unsigned int tx_bytes;
116
117 bool enable_modem_interrupt;
118
119 bool rx_timeout;
120 int rx_in_progress;
121 int symb_bit;
122 int dma_req_sel;
123
124 struct dma_chan *rx_dma_chan;
125 struct dma_chan *tx_dma_chan;
126 dma_addr_t rx_dma_buf_phys;
127 dma_addr_t tx_dma_buf_phys;
128 unsigned char *rx_dma_buf_virt;
129 unsigned char *tx_dma_buf_virt;
130 struct dma_async_tx_descriptor *tx_dma_desc;
131 struct dma_async_tx_descriptor *rx_dma_desc;
132 dma_cookie_t tx_cookie;
133 dma_cookie_t rx_cookie;
134 int tx_bytes_requested;
135 int rx_bytes_requested;
136};
137
138static void tegra_uart_start_next_tx(struct tegra_uart_port *tup);
139static int tegra_uart_start_rx_dma(struct tegra_uart_port *tup);
140
141static inline unsigned long tegra_uart_read(struct tegra_uart_port *tup,
142 unsigned long reg)
143{
144 return readl(tup->uport.membase + (reg << tup->uport.regshift));
145}
146
147static inline void tegra_uart_write(struct tegra_uart_port *tup, unsigned val,
148 unsigned long reg)
149{
150 writel(val, tup->uport.membase + (reg << tup->uport.regshift));
151}
152
153static inline struct tegra_uart_port *to_tegra_uport(struct uart_port *u)
154{
155 return container_of(u, struct tegra_uart_port, uport);
156}
157
158static unsigned int tegra_uart_get_mctrl(struct uart_port *u)
159{
160 struct tegra_uart_port *tup = to_tegra_uport(u);
161
162 /*
163 * RI - Ring detector is active
164 * CD/DCD/CAR - Carrier detect is always active. For some reason
165 * linux has different names for carrier detect.
166 * DSR - Data Set ready is active as the hardware doesn't support it.
167 * Don't know if the linux support this yet?
168 * CTS - Clear to send. Always set to active, as the hardware handles
169 * CTS automatically.
170 */
171 if (tup->enable_modem_interrupt)
172 return TIOCM_RI | TIOCM_CD | TIOCM_DSR | TIOCM_CTS;
173 return TIOCM_CTS;
174}
175
176static void set_rts(struct tegra_uart_port *tup, bool active)
177{
178 unsigned long mcr;
179
180 mcr = tup->mcr_shadow;
181 if (active)
182 mcr |= TEGRA_UART_MCR_RTS_EN;
183 else
184 mcr &= ~TEGRA_UART_MCR_RTS_EN;
185 if (mcr != tup->mcr_shadow) {
186 tegra_uart_write(tup, mcr, UART_MCR);
187 tup->mcr_shadow = mcr;
188 }
189 return;
190}
191
192static void set_dtr(struct tegra_uart_port *tup, bool active)
193{
194 unsigned long mcr;
195
196 mcr = tup->mcr_shadow;
197 if (active)
198 mcr |= UART_MCR_DTR;
199 else
200 mcr &= ~UART_MCR_DTR;
201 if (mcr != tup->mcr_shadow) {
202 tegra_uart_write(tup, mcr, UART_MCR);
203 tup->mcr_shadow = mcr;
204 }
205 return;
206}
207
208static void tegra_uart_set_mctrl(struct uart_port *u, unsigned int mctrl)
209{
210 struct tegra_uart_port *tup = to_tegra_uport(u);
211 unsigned long mcr;
212 int dtr_enable;
213
214 mcr = tup->mcr_shadow;
215 tup->rts_active = !!(mctrl & TIOCM_RTS);
216 set_rts(tup, tup->rts_active);
217
218 dtr_enable = !!(mctrl & TIOCM_DTR);
219 set_dtr(tup, dtr_enable);
220 return;
221}
222
223static void tegra_uart_break_ctl(struct uart_port *u, int break_ctl)
224{
225 struct tegra_uart_port *tup = to_tegra_uport(u);
226 unsigned long lcr;
227
228 lcr = tup->lcr_shadow;
229 if (break_ctl)
230 lcr |= UART_LCR_SBC;
231 else
232 lcr &= ~UART_LCR_SBC;
233 tegra_uart_write(tup, lcr, UART_LCR);
234 tup->lcr_shadow = lcr;
235}
236
237/* Wait for a symbol-time. */
238static void tegra_uart_wait_sym_time(struct tegra_uart_port *tup,
239 unsigned int syms)
240{
241 if (tup->current_baud)
242 udelay(DIV_ROUND_UP(syms * tup->symb_bit * 1000000,
243 tup->current_baud));
244}
245
246static void tegra_uart_fifo_reset(struct tegra_uart_port *tup, u8 fcr_bits)
247{
248 unsigned long fcr = tup->fcr_shadow;
249
250 if (tup->cdata->allow_txfifo_reset_fifo_mode) {
251 fcr |= fcr_bits & (UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
252 tegra_uart_write(tup, fcr, UART_FCR);
253 } else {
254 fcr &= ~UART_FCR_ENABLE_FIFO;
255 tegra_uart_write(tup, fcr, UART_FCR);
256 udelay(60);
257 fcr |= fcr_bits & (UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
258 tegra_uart_write(tup, fcr, UART_FCR);
259 fcr |= UART_FCR_ENABLE_FIFO;
260 tegra_uart_write(tup, fcr, UART_FCR);
261 }
262
263 /* Dummy read to ensure the write is posted */
264 tegra_uart_read(tup, UART_SCR);
265
266 /* Wait for the flush to propagate. */
267 tegra_uart_wait_sym_time(tup, 1);
268}
269
270static int tegra_set_baudrate(struct tegra_uart_port *tup, unsigned int baud)
271{
272 unsigned long rate;
273 unsigned int divisor;
274 unsigned long lcr;
275 int ret;
276
277 if (tup->current_baud == baud)
278 return 0;
279
280 if (tup->cdata->support_clk_src_div) {
281 rate = baud * 16;
282 ret = clk_set_rate(tup->uart_clk, rate);
283 if (ret < 0) {
284 dev_err(tup->uport.dev,
285 "clk_set_rate() failed for rate %lu\n", rate);
286 return ret;
287 }
288 divisor = 1;
289 } else {
290 rate = clk_get_rate(tup->uart_clk);
291 divisor = DIV_ROUND_CLOSEST(rate, baud * 16);
292 }
293
294 lcr = tup->lcr_shadow;
295 lcr |= UART_LCR_DLAB;
296 tegra_uart_write(tup, lcr, UART_LCR);
297
298 tegra_uart_write(tup, divisor & 0xFF, UART_TX);
299 tegra_uart_write(tup, ((divisor >> 8) & 0xFF), UART_IER);
300
301 lcr &= ~UART_LCR_DLAB;
302 tegra_uart_write(tup, lcr, UART_LCR);
303
304 /* Dummy read to ensure the write is posted */
305 tegra_uart_read(tup, UART_SCR);
306
307 tup->current_baud = baud;
308
309 /* wait two character intervals at new rate */
310 tegra_uart_wait_sym_time(tup, 2);
311 return 0;
312}
313
314static char tegra_uart_decode_rx_error(struct tegra_uart_port *tup,
315 unsigned long lsr)
316{
317 char flag = TTY_NORMAL;
318
319 if (unlikely(lsr & TEGRA_UART_LSR_ANY)) {
320 if (lsr & UART_LSR_OE) {
321 /* Overrrun error */
322 flag |= TTY_OVERRUN;
323 tup->uport.icount.overrun++;
324 dev_err(tup->uport.dev, "Got overrun errors\n");
325 } else if (lsr & UART_LSR_PE) {
326 /* Parity error */
327 flag |= TTY_PARITY;
328 tup->uport.icount.parity++;
329 dev_err(tup->uport.dev, "Got Parity errors\n");
330 } else if (lsr & UART_LSR_FE) {
331 flag |= TTY_FRAME;
332 tup->uport.icount.frame++;
333 dev_err(tup->uport.dev, "Got frame errors\n");
334 } else if (lsr & UART_LSR_BI) {
335 dev_err(tup->uport.dev, "Got Break\n");
336 tup->uport.icount.brk++;
337 /* If FIFO read error without any data, reset Rx FIFO */
338 if (!(lsr & UART_LSR_DR) && (lsr & UART_LSR_FIFOE))
339 tegra_uart_fifo_reset(tup, UART_FCR_CLEAR_RCVR);
340 }
341 }
342 return flag;
343}
344
345static int tegra_uart_request_port(struct uart_port *u)
346{
347 return 0;
348}
349
350static void tegra_uart_release_port(struct uart_port *u)
351{
352 /* Nothing to do here */
353}
354
355static void tegra_uart_fill_tx_fifo(struct tegra_uart_port *tup, int max_bytes)
356{
357 struct circ_buf *xmit = &tup->uport.state->xmit;
358 int i;
359
360 for (i = 0; i < max_bytes; i++) {
361 BUG_ON(uart_circ_empty(xmit));
362 if (tup->cdata->tx_fifo_full_status) {
363 unsigned long lsr = tegra_uart_read(tup, UART_LSR);
364 if ((lsr & TEGRA_UART_LSR_TXFIFO_FULL))
365 break;
366 }
367 tegra_uart_write(tup, xmit->buf[xmit->tail], UART_TX);
368 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
369 tup->uport.icount.tx++;
370 }
371}
372
373static void tegra_uart_start_pio_tx(struct tegra_uart_port *tup,
374 unsigned int bytes)
375{
376 if (bytes > TEGRA_UART_MIN_DMA)
377 bytes = TEGRA_UART_MIN_DMA;
378
379 tup->tx_in_progress = TEGRA_UART_TX_PIO;
380 tup->tx_bytes = bytes;
381 tup->ier_shadow |= UART_IER_THRI;
382 tegra_uart_write(tup, tup->ier_shadow, UART_IER);
383}
384
385static void tegra_uart_tx_dma_complete(void *args)
386{
387 struct tegra_uart_port *tup = args;
388 struct circ_buf *xmit = &tup->uport.state->xmit;
389 struct dma_tx_state state;
390 unsigned long flags;
391 int count;
392
393 dmaengine_tx_status(tup->tx_dma_chan, tup->rx_cookie, &state);
394 count = tup->tx_bytes_requested - state.residue;
395 async_tx_ack(tup->tx_dma_desc);
396 spin_lock_irqsave(&tup->uport.lock, flags);
397 xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
398 tup->tx_in_progress = 0;
399 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
400 uart_write_wakeup(&tup->uport);
401 tegra_uart_start_next_tx(tup);
402 spin_unlock_irqrestore(&tup->uport.lock, flags);
403}
404
405static int tegra_uart_start_tx_dma(struct tegra_uart_port *tup,
406 unsigned long count)
407{
408 struct circ_buf *xmit = &tup->uport.state->xmit;
409 dma_addr_t tx_phys_addr;
410
411 dma_sync_single_for_device(tup->uport.dev, tup->tx_dma_buf_phys,
412 UART_XMIT_SIZE, DMA_TO_DEVICE);
413
414 tup->tx_bytes = count & ~(0xF);
415 tx_phys_addr = tup->tx_dma_buf_phys + xmit->tail;
416 tup->tx_dma_desc = dmaengine_prep_slave_single(tup->tx_dma_chan,
417 tx_phys_addr, tup->tx_bytes, DMA_MEM_TO_DEV,
418 DMA_PREP_INTERRUPT);
419 if (!tup->tx_dma_desc) {
420 dev_err(tup->uport.dev, "Not able to get desc for Tx\n");
421 return -EIO;
422 }
423
424 tup->tx_dma_desc->callback = tegra_uart_tx_dma_complete;
425 tup->tx_dma_desc->callback_param = tup;
426 tup->tx_in_progress = TEGRA_UART_TX_DMA;
427 tup->tx_bytes_requested = tup->tx_bytes;
428 tup->tx_cookie = dmaengine_submit(tup->tx_dma_desc);
429 dma_async_issue_pending(tup->tx_dma_chan);
430 return 0;
431}
432
433static void tegra_uart_start_next_tx(struct tegra_uart_port *tup)
434{
435 unsigned long tail;
436 unsigned long count;
437 struct circ_buf *xmit = &tup->uport.state->xmit;
438
439 tail = (unsigned long)&xmit->buf[xmit->tail];
440 count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
441 if (!count)
442 return;
443
444 if (count < TEGRA_UART_MIN_DMA)
445 tegra_uart_start_pio_tx(tup, count);
446 else if (BYTES_TO_ALIGN(tail) > 0)
447 tegra_uart_start_pio_tx(tup, BYTES_TO_ALIGN(tail));
448 else
449 tegra_uart_start_tx_dma(tup, count);
450}
451
452/* Called by serial core driver with u->lock taken. */
453static void tegra_uart_start_tx(struct uart_port *u)
454{
455 struct tegra_uart_port *tup = to_tegra_uport(u);
456 struct circ_buf *xmit = &u->state->xmit;
457
458 if (!uart_circ_empty(xmit) && !tup->tx_in_progress)
459 tegra_uart_start_next_tx(tup);
460}
461
462static unsigned int tegra_uart_tx_empty(struct uart_port *u)
463{
464 struct tegra_uart_port *tup = to_tegra_uport(u);
465 unsigned int ret = 0;
466 unsigned long flags;
467
468 spin_lock_irqsave(&u->lock, flags);
469 if (!tup->tx_in_progress) {
470 unsigned long lsr = tegra_uart_read(tup, UART_LSR);
471 if ((lsr & TX_EMPTY_STATUS) == TX_EMPTY_STATUS)
472 ret = TIOCSER_TEMT;
473 }
474 spin_unlock_irqrestore(&u->lock, flags);
475 return ret;
476}
477
478static void tegra_uart_stop_tx(struct uart_port *u)
479{
480 struct tegra_uart_port *tup = to_tegra_uport(u);
481 struct circ_buf *xmit = &tup->uport.state->xmit;
482 struct dma_tx_state state;
483 int count;
484
485 dmaengine_terminate_all(tup->tx_dma_chan);
486 dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
487 count = tup->tx_bytes_requested - state.residue;
488 async_tx_ack(tup->tx_dma_desc);
489 xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
490 tup->tx_in_progress = 0;
491 return;
492}
493
494static void tegra_uart_handle_tx_pio(struct tegra_uart_port *tup)
495{
496 struct circ_buf *xmit = &tup->uport.state->xmit;
497
498 tegra_uart_fill_tx_fifo(tup, tup->tx_bytes);
499 tup->tx_in_progress = 0;
500 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
501 uart_write_wakeup(&tup->uport);
502 tegra_uart_start_next_tx(tup);
503 return;
504}
505
506static void tegra_uart_handle_rx_pio(struct tegra_uart_port *tup,
507 struct tty_port *tty)
508{
509 do {
510 char flag = TTY_NORMAL;
511 unsigned long lsr = 0;
512 unsigned char ch;
513
514 lsr = tegra_uart_read(tup, UART_LSR);
515 if (!(lsr & UART_LSR_DR))
516 break;
517
518 flag = tegra_uart_decode_rx_error(tup, lsr);
519 ch = (unsigned char) tegra_uart_read(tup, UART_RX);
520 tup->uport.icount.rx++;
521
522 if (!uart_handle_sysrq_char(&tup->uport, ch) && tty)
523 tty_insert_flip_char(tty, ch, flag);
524 } while (1);
525
526 return;
527}
528
529static void tegra_uart_copy_rx_to_tty(struct tegra_uart_port *tup,
530 struct tty_port *tty, int count)
531{
532 int copied;
533
534 tup->uport.icount.rx += count;
535 if (!tty) {
536 dev_err(tup->uport.dev, "No tty port\n");
537 return;
538 }
539 dma_sync_single_for_cpu(tup->uport.dev, tup->rx_dma_buf_phys,
540 TEGRA_UART_RX_DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
541 copied = tty_insert_flip_string(tty,
542 ((unsigned char *)(tup->rx_dma_buf_virt)), count);
543 if (copied != count) {
544 WARN_ON(1);
545 dev_err(tup->uport.dev, "RxData copy to tty layer failed\n");
546 }
547 dma_sync_single_for_device(tup->uport.dev, tup->rx_dma_buf_phys,
548 TEGRA_UART_RX_DMA_BUFFER_SIZE, DMA_TO_DEVICE);
549}
550
551static void tegra_uart_rx_dma_complete(void *args)
552{
553 struct tegra_uart_port *tup = args;
554 struct uart_port *u = &tup->uport;
555 int count = tup->rx_bytes_requested;
556 struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port);
557 struct tty_port *port = &u->state->port;
558 unsigned long flags;
559
560 async_tx_ack(tup->rx_dma_desc);
561 spin_lock_irqsave(&u->lock, flags);
562
563 /* Deactivate flow control to stop sender */
564 if (tup->rts_active)
565 set_rts(tup, false);
566
567 /* If we are here, DMA is stopped */
568 if (count)
569 tegra_uart_copy_rx_to_tty(tup, port, count);
570
571 tegra_uart_handle_rx_pio(tup, port);
572 if (tty) {
573 tty_flip_buffer_push(port);
574 tty_kref_put(tty);
575 }
576 tegra_uart_start_rx_dma(tup);
577
578 /* Activate flow control to start transfer */
579 if (tup->rts_active)
580 set_rts(tup, true);
581
582 spin_unlock_irqrestore(&u->lock, flags);
583}
584
585static void tegra_uart_handle_rx_dma(struct tegra_uart_port *tup)
586{
587 struct dma_tx_state state;
588 struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port);
589 struct tty_port *port = &tup->uport.state->port;
590 int count;
591
592 /* Deactivate flow control to stop sender */
593 if (tup->rts_active)
594 set_rts(tup, false);
595
596 dmaengine_terminate_all(tup->rx_dma_chan);
597 dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
598 count = tup->rx_bytes_requested - state.residue;
599
600 /* If we are here, DMA is stopped */
601 if (count)
602 tegra_uart_copy_rx_to_tty(tup, port, count);
603
604 tegra_uart_handle_rx_pio(tup, port);
605 if (tty) {
606 tty_flip_buffer_push(port);
607 tty_kref_put(tty);
608 }
609 tegra_uart_start_rx_dma(tup);
610
611 if (tup->rts_active)
612 set_rts(tup, true);
613}
614
615static int tegra_uart_start_rx_dma(struct tegra_uart_port *tup)
616{
617 unsigned int count = TEGRA_UART_RX_DMA_BUFFER_SIZE;
618
619 tup->rx_dma_desc = dmaengine_prep_slave_single(tup->rx_dma_chan,
620 tup->rx_dma_buf_phys, count, DMA_DEV_TO_MEM,
621 DMA_PREP_INTERRUPT);
622 if (!tup->rx_dma_desc) {
623 dev_err(tup->uport.dev, "Not able to get desc for Rx\n");
624 return -EIO;
625 }
626
627 tup->rx_dma_desc->callback = tegra_uart_rx_dma_complete;
628 tup->rx_dma_desc->callback_param = tup;
629 dma_sync_single_for_device(tup->uport.dev, tup->rx_dma_buf_phys,
630 count, DMA_TO_DEVICE);
631 tup->rx_bytes_requested = count;
632 tup->rx_cookie = dmaengine_submit(tup->rx_dma_desc);
633 dma_async_issue_pending(tup->rx_dma_chan);
634 return 0;
635}
636
637static void tegra_uart_handle_modem_signal_change(struct uart_port *u)
638{
639 struct tegra_uart_port *tup = to_tegra_uport(u);
640 unsigned long msr;
641
642 msr = tegra_uart_read(tup, UART_MSR);
643 if (!(msr & UART_MSR_ANY_DELTA))
644 return;
645
646 if (msr & UART_MSR_TERI)
647 tup->uport.icount.rng++;
648 if (msr & UART_MSR_DDSR)
649 tup->uport.icount.dsr++;
650 /* We may only get DDCD when HW init and reset */
651 if (msr & UART_MSR_DDCD)
652 uart_handle_dcd_change(&tup->uport, msr & UART_MSR_DCD);
653 /* Will start/stop_tx accordingly */
654 if (msr & UART_MSR_DCTS)
655 uart_handle_cts_change(&tup->uport, msr & UART_MSR_CTS);
656 return;
657}
658
659static irqreturn_t tegra_uart_isr(int irq, void *data)
660{
661 struct tegra_uart_port *tup = data;
662 struct uart_port *u = &tup->uport;
663 unsigned long iir;
664 unsigned long ier;
665 bool is_rx_int = false;
666 unsigned long flags;
667
668 spin_lock_irqsave(&u->lock, flags);
669 while (1) {
670 iir = tegra_uart_read(tup, UART_IIR);
671 if (iir & UART_IIR_NO_INT) {
672 if (is_rx_int) {
673 tegra_uart_handle_rx_dma(tup);
674 if (tup->rx_in_progress) {
675 ier = tup->ier_shadow;
676 ier |= (UART_IER_RLSI | UART_IER_RTOIE |
677 TEGRA_UART_IER_EORD);
678 tup->ier_shadow = ier;
679 tegra_uart_write(tup, ier, UART_IER);
680 }
681 }
682 spin_unlock_irqrestore(&u->lock, flags);
683 return IRQ_HANDLED;
684 }
685
686 switch ((iir >> 1) & 0x7) {
687 case 0: /* Modem signal change interrupt */
688 tegra_uart_handle_modem_signal_change(u);
689 break;
690
691 case 1: /* Transmit interrupt only triggered when using PIO */
692 tup->ier_shadow &= ~UART_IER_THRI;
693 tegra_uart_write(tup, tup->ier_shadow, UART_IER);
694 tegra_uart_handle_tx_pio(tup);
695 break;
696
697 case 4: /* End of data */
698 case 6: /* Rx timeout */
699 case 2: /* Receive */
700 if (!is_rx_int) {
701 is_rx_int = true;
702 /* Disable Rx interrupts */
703 ier = tup->ier_shadow;
704 ier |= UART_IER_RDI;
705 tegra_uart_write(tup, ier, UART_IER);
706 ier &= ~(UART_IER_RDI | UART_IER_RLSI |
707 UART_IER_RTOIE | TEGRA_UART_IER_EORD);
708 tup->ier_shadow = ier;
709 tegra_uart_write(tup, ier, UART_IER);
710 }
711 break;
712
713 case 3: /* Receive error */
714 tegra_uart_decode_rx_error(tup,
715 tegra_uart_read(tup, UART_LSR));
716 break;
717
718 case 5: /* break nothing to handle */
719 case 7: /* break nothing to handle */
720 break;
721 }
722 }
723}
724
725static void tegra_uart_stop_rx(struct uart_port *u)
726{
727 struct tegra_uart_port *tup = to_tegra_uport(u);
728 struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port);
729 struct tty_port *port = &u->state->port;
730 struct dma_tx_state state;
731 unsigned long ier;
732 int count;
733
734 if (tup->rts_active)
735 set_rts(tup, false);
736
737 if (!tup->rx_in_progress)
738 return;
739
740 tegra_uart_wait_sym_time(tup, 1); /* wait a character interval */
741
742 ier = tup->ier_shadow;
743 ier &= ~(UART_IER_RDI | UART_IER_RLSI | UART_IER_RTOIE |
744 TEGRA_UART_IER_EORD);
745 tup->ier_shadow = ier;
746 tegra_uart_write(tup, ier, UART_IER);
747 tup->rx_in_progress = 0;
748 if (tup->rx_dma_chan) {
749 dmaengine_terminate_all(tup->rx_dma_chan);
750 dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
751 async_tx_ack(tup->rx_dma_desc);
752 count = tup->rx_bytes_requested - state.residue;
753 tegra_uart_copy_rx_to_tty(tup, port, count);
754 tegra_uart_handle_rx_pio(tup, port);
755 } else {
756 tegra_uart_handle_rx_pio(tup, port);
757 }
758 if (tty) {
759 tty_flip_buffer_push(port);
760 tty_kref_put(tty);
761 }
762 return;
763}
764
765static void tegra_uart_hw_deinit(struct tegra_uart_port *tup)
766{
767 unsigned long flags;
768 unsigned long char_time = DIV_ROUND_UP(10000000, tup->current_baud);
769 unsigned long fifo_empty_time = tup->uport.fifosize * char_time;
770 unsigned long wait_time;
771 unsigned long lsr;
772 unsigned long msr;
773 unsigned long mcr;
774
775 /* Disable interrupts */
776 tegra_uart_write(tup, 0, UART_IER);
777
778 lsr = tegra_uart_read(tup, UART_LSR);
779 if ((lsr & UART_LSR_TEMT) != UART_LSR_TEMT) {
780 msr = tegra_uart_read(tup, UART_MSR);
781 mcr = tegra_uart_read(tup, UART_MCR);
782 if ((mcr & TEGRA_UART_MCR_CTS_EN) && (msr & UART_MSR_CTS))
783 dev_err(tup->uport.dev,
784 "Tx Fifo not empty, CTS disabled, waiting\n");
785
786 /* Wait for Tx fifo to be empty */
787 while ((lsr & UART_LSR_TEMT) != UART_LSR_TEMT) {
788 wait_time = min(fifo_empty_time, 100lu);
789 udelay(wait_time);
790 fifo_empty_time -= wait_time;
791 if (!fifo_empty_time) {
792 msr = tegra_uart_read(tup, UART_MSR);
793 mcr = tegra_uart_read(tup, UART_MCR);
794 if ((mcr & TEGRA_UART_MCR_CTS_EN) &&
795 (msr & UART_MSR_CTS))
796 dev_err(tup->uport.dev,
797 "Slave not ready\n");
798 break;
799 }
800 lsr = tegra_uart_read(tup, UART_LSR);
801 }
802 }
803
804 spin_lock_irqsave(&tup->uport.lock, flags);
805 /* Reset the Rx and Tx FIFOs */
806 tegra_uart_fifo_reset(tup, UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);
807 tup->current_baud = 0;
808 spin_unlock_irqrestore(&tup->uport.lock, flags);
809
810 clk_disable_unprepare(tup->uart_clk);
811}
812
813static int tegra_uart_hw_init(struct tegra_uart_port *tup)
814{
815 int ret;
816
817 tup->fcr_shadow = 0;
818 tup->mcr_shadow = 0;
819 tup->lcr_shadow = 0;
820 tup->ier_shadow = 0;
821 tup->current_baud = 0;
822
823 clk_prepare_enable(tup->uart_clk);
824
825 /* Reset the UART controller to clear all previous status.*/
826 tegra_periph_reset_assert(tup->uart_clk);
827 udelay(10);
828 tegra_periph_reset_deassert(tup->uart_clk);
829
830 tup->rx_in_progress = 0;
831 tup->tx_in_progress = 0;
832
833 /*
834 * Set the trigger level
835 *
836 * For PIO mode:
837 *
838 * For receive, this will interrupt the CPU after that many number of
839 * bytes are received, for the remaining bytes the receive timeout
840 * interrupt is received. Rx high watermark is set to 4.
841 *
842 * For transmit, if the trasnmit interrupt is enabled, this will
843 * interrupt the CPU when the number of entries in the FIFO reaches the
844 * low watermark. Tx low watermark is set to 16 bytes.
845 *
846 * For DMA mode:
847 *
848 * Set the Tx trigger to 16. This should match the DMA burst size that
849 * programmed in the DMA registers.
850 */
851 tup->fcr_shadow = UART_FCR_ENABLE_FIFO;
852 tup->fcr_shadow |= UART_FCR_R_TRIG_01;
853 tup->fcr_shadow |= TEGRA_UART_TX_TRIG_16B;
854 tegra_uart_write(tup, tup->fcr_shadow, UART_FCR);
855
856 /*
857 * Initialize the UART with default configuration
858 * (115200, N, 8, 1) so that the receive DMA buffer may be
859 * enqueued
860 */
861 tup->lcr_shadow = TEGRA_UART_DEFAULT_LSR;
862 tegra_set_baudrate(tup, TEGRA_UART_DEFAULT_BAUD);
863 tup->fcr_shadow |= UART_FCR_DMA_SELECT;
864 tegra_uart_write(tup, tup->fcr_shadow, UART_FCR);
865
866 ret = tegra_uart_start_rx_dma(tup);
867 if (ret < 0) {
868 dev_err(tup->uport.dev, "Not able to start Rx DMA\n");
869 return ret;
870 }
871 tup->rx_in_progress = 1;
872
873 /*
874 * Enable IE_RXS for the receive status interrupts like line errros.
875 * Enable IE_RX_TIMEOUT to get the bytes which cannot be DMA'd.
876 *
877 * If using DMA mode, enable EORD instead of receive interrupt which
878 * will interrupt after the UART is done with the receive instead of
879 * the interrupt when the FIFO "threshold" is reached.
880 *
881 * EORD is different interrupt than RX_TIMEOUT - RX_TIMEOUT occurs when
882 * the DATA is sitting in the FIFO and couldn't be transferred to the
883 * DMA as the DMA size alignment(4 bytes) is not met. EORD will be
884 * triggered when there is a pause of the incomming data stream for 4
885 * characters long.
886 *
887 * For pauses in the data which is not aligned to 4 bytes, we get
888 * both the EORD as well as RX_TIMEOUT - SW sees RX_TIMEOUT first
889 * then the EORD.
890 */
891 tup->ier_shadow = UART_IER_RLSI | UART_IER_RTOIE | TEGRA_UART_IER_EORD;
892 tegra_uart_write(tup, tup->ier_shadow, UART_IER);
893 return 0;
894}
895
896static int tegra_uart_dma_channel_allocate(struct tegra_uart_port *tup,
897 bool dma_to_memory)
898{
899 struct dma_chan *dma_chan;
900 unsigned char *dma_buf;
901 dma_addr_t dma_phys;
902 int ret;
903 struct dma_slave_config dma_sconfig;
904 dma_cap_mask_t mask;
905
906 dma_cap_zero(mask);
907 dma_cap_set(DMA_SLAVE, mask);
908 dma_chan = dma_request_channel(mask, NULL, NULL);
909 if (!dma_chan) {
910 dev_err(tup->uport.dev,
911 "Dma channel is not available, will try later\n");
912 return -EPROBE_DEFER;
913 }
914
915 if (dma_to_memory) {
916 dma_buf = dma_alloc_coherent(tup->uport.dev,
917 TEGRA_UART_RX_DMA_BUFFER_SIZE,
918 &dma_phys, GFP_KERNEL);
919 if (!dma_buf) {
920 dev_err(tup->uport.dev,
921 "Not able to allocate the dma buffer\n");
922 dma_release_channel(dma_chan);
923 return -ENOMEM;
924 }
925 } else {
926 dma_phys = dma_map_single(tup->uport.dev,
927 tup->uport.state->xmit.buf, UART_XMIT_SIZE,
928 DMA_TO_DEVICE);
929 dma_buf = tup->uport.state->xmit.buf;
930 }
931
932 dma_sconfig.slave_id = tup->dma_req_sel;
933 if (dma_to_memory) {
934 dma_sconfig.src_addr = tup->uport.mapbase;
935 dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
936 dma_sconfig.src_maxburst = 4;
937 } else {
938 dma_sconfig.dst_addr = tup->uport.mapbase;
939 dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
940 dma_sconfig.dst_maxburst = 16;
941 }
942
943 ret = dmaengine_slave_config(dma_chan, &dma_sconfig);
944 if (ret < 0) {
945 dev_err(tup->uport.dev,
946 "Dma slave config failed, err = %d\n", ret);
947 goto scrub;
948 }
949
950 if (dma_to_memory) {
951 tup->rx_dma_chan = dma_chan;
952 tup->rx_dma_buf_virt = dma_buf;
953 tup->rx_dma_buf_phys = dma_phys;
954 } else {
955 tup->tx_dma_chan = dma_chan;
956 tup->tx_dma_buf_virt = dma_buf;
957 tup->tx_dma_buf_phys = dma_phys;
958 }
959 return 0;
960
961scrub:
962 dma_release_channel(dma_chan);
963 return ret;
964}
965
966static void tegra_uart_dma_channel_free(struct tegra_uart_port *tup,
967 bool dma_to_memory)
968{
969 struct dma_chan *dma_chan;
970
971 if (dma_to_memory) {
972 dma_free_coherent(tup->uport.dev, TEGRA_UART_RX_DMA_BUFFER_SIZE,
973 tup->rx_dma_buf_virt, tup->rx_dma_buf_phys);
974 dma_chan = tup->rx_dma_chan;
975 tup->rx_dma_chan = NULL;
976 tup->rx_dma_buf_phys = 0;
977 tup->rx_dma_buf_virt = NULL;
978 } else {
979 dma_unmap_single(tup->uport.dev, tup->tx_dma_buf_phys,
980 UART_XMIT_SIZE, DMA_TO_DEVICE);
981 dma_chan = tup->tx_dma_chan;
982 tup->tx_dma_chan = NULL;
983 tup->tx_dma_buf_phys = 0;
984 tup->tx_dma_buf_virt = NULL;
985 }
986 dma_release_channel(dma_chan);
987}
988
989static int tegra_uart_startup(struct uart_port *u)
990{
991 struct tegra_uart_port *tup = to_tegra_uport(u);
992 int ret;
993
994 ret = tegra_uart_dma_channel_allocate(tup, false);
995 if (ret < 0) {
996 dev_err(u->dev, "Tx Dma allocation failed, err = %d\n", ret);
997 return ret;
998 }
999
1000 ret = tegra_uart_dma_channel_allocate(tup, true);
1001 if (ret < 0) {
1002 dev_err(u->dev, "Rx Dma allocation failed, err = %d\n", ret);
1003 goto fail_rx_dma;
1004 }
1005
1006 ret = tegra_uart_hw_init(tup);
1007 if (ret < 0) {
1008 dev_err(u->dev, "Uart HW init failed, err = %d\n", ret);
1009 goto fail_hw_init;
1010 }
1011
1012 ret = request_irq(u->irq, tegra_uart_isr, IRQF_DISABLED,
1013 dev_name(u->dev), tup);
1014 if (ret < 0) {
1015 dev_err(u->dev, "Failed to register ISR for IRQ %d\n", u->irq);
1016 goto fail_hw_init;
1017 }
1018 return 0;
1019
1020fail_hw_init:
1021 tegra_uart_dma_channel_free(tup, true);
1022fail_rx_dma:
1023 tegra_uart_dma_channel_free(tup, false);
1024 return ret;
1025}
1026
1027static void tegra_uart_shutdown(struct uart_port *u)
1028{
1029 struct tegra_uart_port *tup = to_tegra_uport(u);
1030
1031 tegra_uart_hw_deinit(tup);
1032
1033 tup->rx_in_progress = 0;
1034 tup->tx_in_progress = 0;
1035
1036 tegra_uart_dma_channel_free(tup, true);
1037 tegra_uart_dma_channel_free(tup, false);
1038 free_irq(u->irq, tup);
1039}
1040
1041static void tegra_uart_enable_ms(struct uart_port *u)
1042{
1043 struct tegra_uart_port *tup = to_tegra_uport(u);
1044
1045 if (tup->enable_modem_interrupt) {
1046 tup->ier_shadow |= UART_IER_MSI;
1047 tegra_uart_write(tup, tup->ier_shadow, UART_IER);
1048 }
1049}
1050
1051static void tegra_uart_set_termios(struct uart_port *u,
1052 struct ktermios *termios, struct ktermios *oldtermios)
1053{
1054 struct tegra_uart_port *tup = to_tegra_uport(u);
1055 unsigned int baud;
1056 unsigned long flags;
1057 unsigned int lcr;
1058 int symb_bit = 1;
1059 struct clk *parent_clk = clk_get_parent(tup->uart_clk);
1060 unsigned long parent_clk_rate = clk_get_rate(parent_clk);
1061 int max_divider = (tup->cdata->support_clk_src_div) ? 0x7FFF : 0xFFFF;
1062
1063 max_divider *= 16;
1064 spin_lock_irqsave(&u->lock, flags);
1065
1066 /* Changing configuration, it is safe to stop any rx now */
1067 if (tup->rts_active)
1068 set_rts(tup, false);
1069
1070 /* Clear all interrupts as configuration is going to be change */
1071 tegra_uart_write(tup, tup->ier_shadow | UART_IER_RDI, UART_IER);
1072 tegra_uart_read(tup, UART_IER);
1073 tegra_uart_write(tup, 0, UART_IER);
1074 tegra_uart_read(tup, UART_IER);
1075
1076 /* Parity */
1077 lcr = tup->lcr_shadow;
1078 lcr &= ~UART_LCR_PARITY;
1079
1080 /* CMSPAR isn't supported by this driver */
1081 termios->c_cflag &= ~CMSPAR;
1082
1083 if ((termios->c_cflag & PARENB) == PARENB) {
1084 symb_bit++;
1085 if (termios->c_cflag & PARODD) {
1086 lcr |= UART_LCR_PARITY;
1087 lcr &= ~UART_LCR_EPAR;
1088 lcr &= ~UART_LCR_SPAR;
1089 } else {
1090 lcr |= UART_LCR_PARITY;
1091 lcr |= UART_LCR_EPAR;
1092 lcr &= ~UART_LCR_SPAR;
1093 }
1094 }
1095
1096 lcr &= ~UART_LCR_WLEN8;
1097 switch (termios->c_cflag & CSIZE) {
1098 case CS5:
1099 lcr |= UART_LCR_WLEN5;
1100 symb_bit += 5;
1101 break;
1102 case CS6:
1103 lcr |= UART_LCR_WLEN6;
1104 symb_bit += 6;
1105 break;
1106 case CS7:
1107 lcr |= UART_LCR_WLEN7;
1108 symb_bit += 7;
1109 break;
1110 default:
1111 lcr |= UART_LCR_WLEN8;
1112 symb_bit += 8;
1113 break;
1114 }
1115
1116 /* Stop bits */
1117 if (termios->c_cflag & CSTOPB) {
1118 lcr |= UART_LCR_STOP;
1119 symb_bit += 2;
1120 } else {
1121 lcr &= ~UART_LCR_STOP;
1122 symb_bit++;
1123 }
1124
1125 tegra_uart_write(tup, lcr, UART_LCR);
1126 tup->lcr_shadow = lcr;
1127 tup->symb_bit = symb_bit;
1128
1129 /* Baud rate. */
1130 baud = uart_get_baud_rate(u, termios, oldtermios,
1131 parent_clk_rate/max_divider,
1132 parent_clk_rate/16);
1133 spin_unlock_irqrestore(&u->lock, flags);
1134 tegra_set_baudrate(tup, baud);
1135 if (tty_termios_baud_rate(termios))
1136 tty_termios_encode_baud_rate(termios, baud, baud);
1137 spin_lock_irqsave(&u->lock, flags);
1138
1139 /* Flow control */
1140 if (termios->c_cflag & CRTSCTS) {
1141 tup->mcr_shadow |= TEGRA_UART_MCR_CTS_EN;
1142 tup->mcr_shadow &= ~TEGRA_UART_MCR_RTS_EN;
1143 tegra_uart_write(tup, tup->mcr_shadow, UART_MCR);
1144 /* if top layer has asked to set rts active then do so here */
1145 if (tup->rts_active)
1146 set_rts(tup, true);
1147 } else {
1148 tup->mcr_shadow &= ~TEGRA_UART_MCR_CTS_EN;
1149 tup->mcr_shadow &= ~TEGRA_UART_MCR_RTS_EN;
1150 tegra_uart_write(tup, tup->mcr_shadow, UART_MCR);
1151 }
1152
1153 /* update the port timeout based on new settings */
1154 uart_update_timeout(u, termios->c_cflag, baud);
1155
1156 /* Make sure all write has completed */
1157 tegra_uart_read(tup, UART_IER);
1158
1159 /* Reenable interrupt */
1160 tegra_uart_write(tup, tup->ier_shadow, UART_IER);
1161 tegra_uart_read(tup, UART_IER);
1162
1163 spin_unlock_irqrestore(&u->lock, flags);
1164 return;
1165}
1166
1167/*
1168 * Flush any TX data submitted for DMA and PIO. Called when the
1169 * TX circular buffer is reset.
1170 */
1171static void tegra_uart_flush_buffer(struct uart_port *u)
1172{
1173 struct tegra_uart_port *tup = to_tegra_uport(u);
1174
1175 tup->tx_bytes = 0;
1176 if (tup->tx_dma_chan)
1177 dmaengine_terminate_all(tup->tx_dma_chan);
1178 return;
1179}
1180
1181static const char *tegra_uart_type(struct uart_port *u)
1182{
1183 return TEGRA_UART_TYPE;
1184}
1185
1186static struct uart_ops tegra_uart_ops = {
1187 .tx_empty = tegra_uart_tx_empty,
1188 .set_mctrl = tegra_uart_set_mctrl,
1189 .get_mctrl = tegra_uart_get_mctrl,
1190 .stop_tx = tegra_uart_stop_tx,
1191 .start_tx = tegra_uart_start_tx,
1192 .stop_rx = tegra_uart_stop_rx,
1193 .flush_buffer = tegra_uart_flush_buffer,
1194 .enable_ms = tegra_uart_enable_ms,
1195 .break_ctl = tegra_uart_break_ctl,
1196 .startup = tegra_uart_startup,
1197 .shutdown = tegra_uart_shutdown,
1198 .set_termios = tegra_uart_set_termios,
1199 .type = tegra_uart_type,
1200 .request_port = tegra_uart_request_port,
1201 .release_port = tegra_uart_release_port,
1202};
1203
1204static struct uart_driver tegra_uart_driver = {
1205 .owner = THIS_MODULE,
1206 .driver_name = "tegra_hsuart",
1207 .dev_name = "ttyTHS",
1208 .cons = 0,
1209 .nr = TEGRA_UART_MAXIMUM,
1210};
1211
1212static int tegra_uart_parse_dt(struct platform_device *pdev,
1213 struct tegra_uart_port *tup)
1214{
1215 struct device_node *np = pdev->dev.of_node;
1216 u32 of_dma[2];
1217 int port;
1218
1219 if (of_property_read_u32_array(np, "nvidia,dma-request-selector",
1220 of_dma, 2) >= 0) {
1221 tup->dma_req_sel = of_dma[1];
1222 } else {
1223 dev_err(&pdev->dev, "missing dma requestor in device tree\n");
1224 return -EINVAL;
1225 }
1226
1227 port = of_alias_get_id(np, "serial");
1228 if (port < 0) {
1229 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", port);
1230 return port;
1231 }
1232 tup->uport.line = port;
1233
1234 tup->enable_modem_interrupt = of_property_read_bool(np,
1235 "nvidia,enable-modem-interrupt");
1236 return 0;
1237}
1238
1239struct tegra_uart_chip_data tegra20_uart_chip_data = {
1240 .tx_fifo_full_status = false,
1241 .allow_txfifo_reset_fifo_mode = true,
1242 .support_clk_src_div = false,
1243};
1244
1245struct tegra_uart_chip_data tegra30_uart_chip_data = {
1246 .tx_fifo_full_status = true,
1247 .allow_txfifo_reset_fifo_mode = false,
1248 .support_clk_src_div = true,
1249};
1250
1251static struct of_device_id tegra_uart_of_match[] = {
1252 {
1253 .compatible = "nvidia,tegra30-hsuart",
1254 .data = &tegra30_uart_chip_data,
1255 }, {
1256 .compatible = "nvidia,tegra20-hsuart",
1257 .data = &tegra20_uart_chip_data,
1258 }, {
1259 },
1260};
1261MODULE_DEVICE_TABLE(of, tegra_uart_of_match);
1262
1263static int tegra_uart_probe(struct platform_device *pdev)
1264{
1265 struct tegra_uart_port *tup;
1266 struct uart_port *u;
1267 struct resource *resource;
1268 int ret;
1269 const struct tegra_uart_chip_data *cdata;
1270 const struct of_device_id *match;
1271
1272 match = of_match_device(of_match_ptr(tegra_uart_of_match),
1273 &pdev->dev);
1274 if (!match) {
1275 dev_err(&pdev->dev, "Error: No device match found\n");
1276 return -ENODEV;
1277 }
1278 cdata = match->data;
1279
1280 tup = devm_kzalloc(&pdev->dev, sizeof(*tup), GFP_KERNEL);
1281 if (!tup) {
1282 dev_err(&pdev->dev, "Failed to allocate memory for tup\n");
1283 return -ENOMEM;
1284 }
1285
1286 ret = tegra_uart_parse_dt(pdev, tup);
1287 if (ret < 0)
1288 return ret;
1289
1290 u = &tup->uport;
1291 u->dev = &pdev->dev;
1292 u->ops = &tegra_uart_ops;
1293 u->type = PORT_TEGRA;
1294 u->fifosize = 32;
1295 tup->cdata = cdata;
1296
1297 platform_set_drvdata(pdev, tup);
1298 resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1299 if (!resource) {
1300 dev_err(&pdev->dev, "No IO memory resource\n");
1301 return -ENODEV;
1302 }
1303
1304 u->mapbase = resource->start;
1305 u->membase = devm_request_and_ioremap(&pdev->dev, resource);
1306 if (!u->membase) {
1307 dev_err(&pdev->dev, "memregion/iomap address req failed\n");
1308 return -EADDRNOTAVAIL;
1309 }
1310
1311 tup->uart_clk = devm_clk_get(&pdev->dev, NULL);
1312 if (IS_ERR(tup->uart_clk)) {
1313 dev_err(&pdev->dev, "Couldn't get the clock\n");
1314 return PTR_ERR(tup->uart_clk);
1315 }
1316
1317 u->iotype = UPIO_MEM32;
1318 u->irq = platform_get_irq(pdev, 0);
1319 u->regshift = 2;
1320 ret = uart_add_one_port(&tegra_uart_driver, u);
1321 if (ret < 0) {
1322 dev_err(&pdev->dev, "Failed to add uart port, err %d\n", ret);
1323 return ret;
1324 }
1325 return ret;
1326}
1327
1328static int tegra_uart_remove(struct platform_device *pdev)
1329{
1330 struct tegra_uart_port *tup = platform_get_drvdata(pdev);
1331 struct uart_port *u = &tup->uport;
1332
1333 uart_remove_one_port(&tegra_uart_driver, u);
1334 return 0;
1335}
1336
1337#ifdef CONFIG_PM_SLEEP
1338static int tegra_uart_suspend(struct device *dev)
1339{
1340 struct tegra_uart_port *tup = dev_get_drvdata(dev);
1341 struct uart_port *u = &tup->uport;
1342
1343 return uart_suspend_port(&tegra_uart_driver, u);
1344}
1345
1346static int tegra_uart_resume(struct device *dev)
1347{
1348 struct tegra_uart_port *tup = dev_get_drvdata(dev);
1349 struct uart_port *u = &tup->uport;
1350
1351 return uart_resume_port(&tegra_uart_driver, u);
1352}
1353#endif
1354
1355static const struct dev_pm_ops tegra_uart_pm_ops = {
1356 SET_SYSTEM_SLEEP_PM_OPS(tegra_uart_suspend, tegra_uart_resume)
1357};
1358
1359static struct platform_driver tegra_uart_platform_driver = {
1360 .probe = tegra_uart_probe,
1361 .remove = tegra_uart_remove,
1362 .driver = {
1363 .name = "serial-tegra",
1364 .of_match_table = of_match_ptr(tegra_uart_of_match),
1365 .pm = &tegra_uart_pm_ops,
1366 },
1367};
1368
1369static int __init tegra_uart_init(void)
1370{
1371 int ret;
1372
1373 ret = uart_register_driver(&tegra_uart_driver);
1374 if (ret < 0) {
1375 pr_err("Could not register %s driver\n",
1376 tegra_uart_driver.driver_name);
1377 return ret;
1378 }
1379
1380 ret = platform_driver_register(&tegra_uart_platform_driver);
1381 if (ret < 0) {
1382 pr_err("Uart platfrom driver register failed, e = %d\n", ret);
1383 uart_unregister_driver(&tegra_uart_driver);
1384 return ret;
1385 }
1386 return 0;
1387}
1388
1389static void __exit tegra_uart_exit(void)
1390{
1391 pr_info("Unloading tegra uart driver\n");
1392 platform_driver_unregister(&tegra_uart_platform_driver);
1393 uart_unregister_driver(&tegra_uart_driver);
1394}
1395
1396module_init(tegra_uart_init);
1397module_exit(tegra_uart_exit);
1398
1399MODULE_ALIAS("platform:serial-tegra");
1400MODULE_DESCRIPTION("High speed UART driver for tegra chipset");
1401MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
1402MODULE_LICENSE("GPL v2");
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 2c7230aaefd4..ca98a3f65fe1 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -59,7 +59,8 @@ static struct lock_class_key port_lock_key;
59static void uart_change_speed(struct tty_struct *tty, struct uart_state *state, 59static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
60 struct ktermios *old_termios); 60 struct ktermios *old_termios);
61static void uart_wait_until_sent(struct tty_struct *tty, int timeout); 61static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
62static void uart_change_pm(struct uart_state *state, int pm_state); 62static void uart_change_pm(struct uart_state *state,
63 enum uart_pm_state pm_state);
63 64
64static void uart_port_shutdown(struct tty_port *port); 65static void uart_port_shutdown(struct tty_port *port);
65 66
@@ -866,9 +867,7 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
866 port->closing_wait = closing_wait; 867 port->closing_wait = closing_wait;
867 if (new_info->xmit_fifo_size) 868 if (new_info->xmit_fifo_size)
868 uport->fifosize = new_info->xmit_fifo_size; 869 uport->fifosize = new_info->xmit_fifo_size;
869 if (port->tty) 870 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
870 port->tty->low_latency =
871 (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
872 871
873 check_and_exit: 872 check_and_exit:
874 retval = 0; 873 retval = 0;
@@ -1308,9 +1307,10 @@ static void uart_set_termios(struct tty_struct *tty,
1308} 1307}
1309 1308
1310/* 1309/*
1311 * In 2.4.5, calls to this will be serialized via the BKL in 1310 * Calls to uart_close() are serialised via the tty_lock in
1312 * linux/drivers/char/tty_io.c:tty_release() 1311 * drivers/tty/tty_io.c:tty_release()
1313 * linux/drivers/char/tty_io.c:do_tty_handup() 1312 * drivers/tty/tty_io.c:do_tty_hangup()
1313 * This runs from a workqueue and can sleep for a _short_ time only.
1314 */ 1314 */
1315static void uart_close(struct tty_struct *tty, struct file *filp) 1315static void uart_close(struct tty_struct *tty, struct file *filp)
1316{ 1316{
@@ -1365,7 +1365,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
1365 spin_lock_irqsave(&port->lock, flags); 1365 spin_lock_irqsave(&port->lock, flags);
1366 } else if (!uart_console(uport)) { 1366 } else if (!uart_console(uport)) {
1367 spin_unlock_irqrestore(&port->lock, flags); 1367 spin_unlock_irqrestore(&port->lock, flags);
1368 uart_change_pm(state, 3); 1368 uart_change_pm(state, UART_PM_STATE_OFF);
1369 spin_lock_irqsave(&port->lock, flags); 1369 spin_lock_irqsave(&port->lock, flags);
1370 } 1370 }
1371 1371
@@ -1437,10 +1437,9 @@ static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
1437} 1437}
1438 1438
1439/* 1439/*
1440 * This is called with the BKL held in 1440 * Calls to uart_hangup() are serialised by the tty_lock in
1441 * linux/drivers/char/tty_io.c:do_tty_hangup() 1441 * drivers/tty/tty_io.c:do_tty_hangup()
1442 * We're called from the eventd thread, so we can sleep for 1442 * This runs from a workqueue and can sleep for a _short_ time only.
1443 * a _short_ time only.
1444 */ 1443 */
1445static void uart_hangup(struct tty_struct *tty) 1444static void uart_hangup(struct tty_struct *tty)
1446{ 1445{
@@ -1521,8 +1520,8 @@ static void uart_dtr_rts(struct tty_port *port, int onoff)
1521} 1520}
1522 1521
1523/* 1522/*
1524 * calls to uart_open are serialised by the BKL in 1523 * Calls to uart_open are serialised by the tty_lock in
1525 * fs/char_dev.c:chrdev_open() 1524 * drivers/tty/tty_io.c:tty_open()
1526 * Note that if this fails, then uart_close() _will_ be called. 1525 * Note that if this fails, then uart_close() _will_ be called.
1527 * 1526 *
1528 * In time, we want to scrap the "opening nonpresent ports" 1527 * In time, we want to scrap the "opening nonpresent ports"
@@ -1564,7 +1563,8 @@ static int uart_open(struct tty_struct *tty, struct file *filp)
1564 */ 1563 */
1565 tty->driver_data = state; 1564 tty->driver_data = state;
1566 state->uart_port->state = state; 1565 state->uart_port->state = state;
1567 tty->low_latency = (state->uart_port->flags & UPF_LOW_LATENCY) ? 1 : 0; 1566 state->port.low_latency =
1567 (state->uart_port->flags & UPF_LOW_LATENCY) ? 1 : 0;
1568 tty_port_tty_set(port, tty); 1568 tty_port_tty_set(port, tty);
1569 1569
1570 /* 1570 /*
@@ -1579,7 +1579,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp)
1579 * Make sure the device is in D0 state. 1579 * Make sure the device is in D0 state.
1580 */ 1580 */
1581 if (port->count == 1) 1581 if (port->count == 1)
1582 uart_change_pm(state, 0); 1582 uart_change_pm(state, UART_PM_STATE_ON);
1583 1583
1584 /* 1584 /*
1585 * Start up the serial port. 1585 * Start up the serial port.
@@ -1620,7 +1620,7 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
1620{ 1620{
1621 struct uart_state *state = drv->state + i; 1621 struct uart_state *state = drv->state + i;
1622 struct tty_port *port = &state->port; 1622 struct tty_port *port = &state->port;
1623 int pm_state; 1623 enum uart_pm_state pm_state;
1624 struct uart_port *uport = state->uart_port; 1624 struct uart_port *uport = state->uart_port;
1625 char stat_buf[32]; 1625 char stat_buf[32];
1626 unsigned int status; 1626 unsigned int status;
@@ -1645,12 +1645,12 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
1645 if (capable(CAP_SYS_ADMIN)) { 1645 if (capable(CAP_SYS_ADMIN)) {
1646 mutex_lock(&port->mutex); 1646 mutex_lock(&port->mutex);
1647 pm_state = state->pm_state; 1647 pm_state = state->pm_state;
1648 if (pm_state) 1648 if (pm_state != UART_PM_STATE_ON)
1649 uart_change_pm(state, 0); 1649 uart_change_pm(state, UART_PM_STATE_ON);
1650 spin_lock_irq(&uport->lock); 1650 spin_lock_irq(&uport->lock);
1651 status = uport->ops->get_mctrl(uport); 1651 status = uport->ops->get_mctrl(uport);
1652 spin_unlock_irq(&uport->lock); 1652 spin_unlock_irq(&uport->lock);
1653 if (pm_state) 1653 if (pm_state != UART_PM_STATE_ON)
1654 uart_change_pm(state, pm_state); 1654 uart_change_pm(state, pm_state);
1655 mutex_unlock(&port->mutex); 1655 mutex_unlock(&port->mutex);
1656 1656
@@ -1897,7 +1897,8 @@ EXPORT_SYMBOL_GPL(uart_set_options);
1897 * 1897 *
1898 * Locking: port->mutex has to be held 1898 * Locking: port->mutex has to be held
1899 */ 1899 */
1900static void uart_change_pm(struct uart_state *state, int pm_state) 1900static void uart_change_pm(struct uart_state *state,
1901 enum uart_pm_state pm_state)
1901{ 1902{
1902 struct uart_port *port = state->uart_port; 1903 struct uart_port *port = state->uart_port;
1903 1904
@@ -1982,7 +1983,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
1982 console_stop(uport->cons); 1983 console_stop(uport->cons);
1983 1984
1984 if (console_suspend_enabled || !uart_console(uport)) 1985 if (console_suspend_enabled || !uart_console(uport))
1985 uart_change_pm(state, 3); 1986 uart_change_pm(state, UART_PM_STATE_OFF);
1986 1987
1987 mutex_unlock(&port->mutex); 1988 mutex_unlock(&port->mutex);
1988 1989
@@ -2027,7 +2028,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
2027 termios = port->tty->termios; 2028 termios = port->tty->termios;
2028 2029
2029 if (console_suspend_enabled) 2030 if (console_suspend_enabled)
2030 uart_change_pm(state, 0); 2031 uart_change_pm(state, UART_PM_STATE_ON);
2031 uport->ops->set_termios(uport, &termios, NULL); 2032 uport->ops->set_termios(uport, &termios, NULL);
2032 if (console_suspend_enabled) 2033 if (console_suspend_enabled)
2033 console_start(uport->cons); 2034 console_start(uport->cons);
@@ -2037,7 +2038,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
2037 const struct uart_ops *ops = uport->ops; 2038 const struct uart_ops *ops = uport->ops;
2038 int ret; 2039 int ret;
2039 2040
2040 uart_change_pm(state, 0); 2041 uart_change_pm(state, UART_PM_STATE_ON);
2041 spin_lock_irq(&uport->lock); 2042 spin_lock_irq(&uport->lock);
2042 ops->set_mctrl(uport, 0); 2043 ops->set_mctrl(uport, 0);
2043 spin_unlock_irq(&uport->lock); 2044 spin_unlock_irq(&uport->lock);
@@ -2137,7 +2138,7 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2137 uart_report_port(drv, port); 2138 uart_report_port(drv, port);
2138 2139
2139 /* Power up port for set_mctrl() */ 2140 /* Power up port for set_mctrl() */
2140 uart_change_pm(state, 0); 2141 uart_change_pm(state, UART_PM_STATE_ON);
2141 2142
2142 /* 2143 /*
2143 * Ensure that the modem control lines are de-activated. 2144 * Ensure that the modem control lines are de-activated.
@@ -2161,7 +2162,7 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2161 * console if we have one. 2162 * console if we have one.
2162 */ 2163 */
2163 if (!uart_console(port)) 2164 if (!uart_console(port))
2164 uart_change_pm(state, 3); 2165 uart_change_pm(state, UART_PM_STATE_OFF);
2165 } 2166 }
2166} 2167}
2167 2168
@@ -2588,7 +2589,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
2588 } 2589 }
2589 2590
2590 state->uart_port = uport; 2591 state->uart_port = uport;
2591 state->pm_state = -1; 2592 state->pm_state = UART_PM_STATE_UNDEFINED;
2592 2593
2593 uport->cons = drv->cons; 2594 uport->cons = drv->cons;
2594 uport->state = state; 2595 uport->state = state;
@@ -2642,6 +2643,7 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
2642{ 2643{
2643 struct uart_state *state = drv->state + uport->line; 2644 struct uart_state *state = drv->state + uport->line;
2644 struct tty_port *port = &state->port; 2645 struct tty_port *port = &state->port;
2646 int ret = 0;
2645 2647
2646 BUG_ON(in_interrupt()); 2648 BUG_ON(in_interrupt());
2647 2649
@@ -2656,6 +2658,11 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
2656 * succeeding while we shut down the port. 2658 * succeeding while we shut down the port.
2657 */ 2659 */
2658 mutex_lock(&port->mutex); 2660 mutex_lock(&port->mutex);
2661 if (!state->uart_port) {
2662 mutex_unlock(&port->mutex);
2663 ret = -EINVAL;
2664 goto out;
2665 }
2659 uport->flags |= UPF_DEAD; 2666 uport->flags |= UPF_DEAD;
2660 mutex_unlock(&port->mutex); 2667 mutex_unlock(&port->mutex);
2661 2668
@@ -2679,9 +2686,10 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
2679 uport->type = PORT_UNKNOWN; 2686 uport->type = PORT_UNKNOWN;
2680 2687
2681 state->uart_port = NULL; 2688 state->uart_port = NULL;
2689out:
2682 mutex_unlock(&port_mutex); 2690 mutex_unlock(&port_mutex);
2683 2691
2684 return 0; 2692 return ret;
2685} 2693}
2686 2694
2687/* 2695/*
@@ -2790,10 +2798,10 @@ EXPORT_SYMBOL_GPL(uart_handle_cts_change);
2790void uart_insert_char(struct uart_port *port, unsigned int status, 2798void uart_insert_char(struct uart_port *port, unsigned int status,
2791 unsigned int overrun, unsigned int ch, unsigned int flag) 2799 unsigned int overrun, unsigned int ch, unsigned int flag)
2792{ 2800{
2793 struct tty_struct *tty = port->state->port.tty; 2801 struct tty_port *tport = &port->state->port;
2794 2802
2795 if ((status & port->ignore_status_mask & ~overrun) == 0) 2803 if ((status & port->ignore_status_mask & ~overrun) == 0)
2796 if (tty_insert_flip_char(tty, ch, flag) == 0) 2804 if (tty_insert_flip_char(tport, ch, flag) == 0)
2797 ++port->icount.buf_overrun; 2805 ++port->icount.buf_overrun;
2798 2806
2799 /* 2807 /*
@@ -2801,7 +2809,7 @@ void uart_insert_char(struct uart_port *port, unsigned int status,
2801 * it doesn't affect the current character. 2809 * it doesn't affect the current character.
2802 */ 2810 */
2803 if (status & ~port->ignore_status_mask & overrun) 2811 if (status & ~port->ignore_status_mask & overrun)
2804 if (tty_insert_flip_char(tty, 0, TTY_OVERRUN) == 0) 2812 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
2805 ++port->icount.buf_overrun; 2813 ++port->icount.buf_overrun;
2806} 2814}
2807EXPORT_SYMBOL_GPL(uart_insert_char); 2815EXPORT_SYMBOL_GPL(uart_insert_char);
diff --git a/drivers/tty/serial/serial_ks8695.c b/drivers/tty/serial/serial_ks8695.c
index 9bd004f9da89..e1caa99e3d3b 100644
--- a/drivers/tty/serial/serial_ks8695.c
+++ b/drivers/tty/serial/serial_ks8695.c
@@ -153,7 +153,6 @@ static void ks8695uart_disable_ms(struct uart_port *port)
153static irqreturn_t ks8695uart_rx_chars(int irq, void *dev_id) 153static irqreturn_t ks8695uart_rx_chars(int irq, void *dev_id)
154{ 154{
155 struct uart_port *port = dev_id; 155 struct uart_port *port = dev_id;
156 struct tty_struct *tty = port->state->port.tty;
157 unsigned int status, ch, lsr, flg, max_count = 256; 156 unsigned int status, ch, lsr, flg, max_count = 256;
158 157
159 status = UART_GET_LSR(port); /* clears pending LSR interrupts */ 158 status = UART_GET_LSR(port); /* clears pending LSR interrupts */
@@ -200,7 +199,7 @@ static irqreturn_t ks8695uart_rx_chars(int irq, void *dev_id)
200ignore_char: 199ignore_char:
201 status = UART_GET_LSR(port); 200 status = UART_GET_LSR(port);
202 } 201 }
203 tty_flip_buffer_push(tty); 202 tty_flip_buffer_push(&port->state->port);
204 203
205 return IRQ_HANDLED; 204 return IRQ_HANDLED;
206} 205}
diff --git a/drivers/tty/serial/serial_txx9.c b/drivers/tty/serial/serial_txx9.c
index b52b21aeb250..fe48a0c2b4ca 100644
--- a/drivers/tty/serial/serial_txx9.c
+++ b/drivers/tty/serial/serial_txx9.c
@@ -277,7 +277,6 @@ static void serial_txx9_initialize(struct uart_port *port)
277static inline void 277static inline void
278receive_chars(struct uart_txx9_port *up, unsigned int *status) 278receive_chars(struct uart_txx9_port *up, unsigned int *status)
279{ 279{
280 struct tty_struct *tty = up->port.state->port.tty;
281 unsigned char ch; 280 unsigned char ch;
282 unsigned int disr = *status; 281 unsigned int disr = *status;
283 int max_count = 256; 282 int max_count = 256;
@@ -346,7 +345,7 @@ receive_chars(struct uart_txx9_port *up, unsigned int *status)
346 disr = sio_in(up, TXX9_SIDISR); 345 disr = sio_in(up, TXX9_SIDISR);
347 } while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0)); 346 } while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0));
348 spin_unlock(&up->port.lock); 347 spin_unlock(&up->port.lock);
349 tty_flip_buffer_push(tty); 348 tty_flip_buffer_push(&up->port.state->port);
350 spin_lock(&up->port.lock); 349 spin_lock(&up->port.lock);
351 *status = disr; 350 *status = disr;
352} 351}
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 61477567423f..156418619949 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -596,7 +596,7 @@ static void sci_transmit_chars(struct uart_port *port)
596static void sci_receive_chars(struct uart_port *port) 596static void sci_receive_chars(struct uart_port *port)
597{ 597{
598 struct sci_port *sci_port = to_sci_port(port); 598 struct sci_port *sci_port = to_sci_port(port);
599 struct tty_struct *tty = port->state->port.tty; 599 struct tty_port *tport = &port->state->port;
600 int i, count, copied = 0; 600 int i, count, copied = 0;
601 unsigned short status; 601 unsigned short status;
602 unsigned char flag; 602 unsigned char flag;
@@ -607,7 +607,7 @@ static void sci_receive_chars(struct uart_port *port)
607 607
608 while (1) { 608 while (1) {
609 /* Don't copy more bytes than there is room for in the buffer */ 609 /* Don't copy more bytes than there is room for in the buffer */
610 count = tty_buffer_request_room(tty, sci_rxfill(port)); 610 count = tty_buffer_request_room(tport, sci_rxfill(port));
611 611
612 /* If for any reason we can't copy more data, we're done! */ 612 /* If for any reason we can't copy more data, we're done! */
613 if (count == 0) 613 if (count == 0)
@@ -619,7 +619,7 @@ static void sci_receive_chars(struct uart_port *port)
619 sci_port->break_flag) 619 sci_port->break_flag)
620 count = 0; 620 count = 0;
621 else 621 else
622 tty_insert_flip_char(tty, c, TTY_NORMAL); 622 tty_insert_flip_char(tport, c, TTY_NORMAL);
623 } else { 623 } else {
624 for (i = 0; i < count; i++) { 624 for (i = 0; i < count; i++) {
625 char c = serial_port_in(port, SCxRDR); 625 char c = serial_port_in(port, SCxRDR);
@@ -661,7 +661,7 @@ static void sci_receive_chars(struct uart_port *port)
661 } else 661 } else
662 flag = TTY_NORMAL; 662 flag = TTY_NORMAL;
663 663
664 tty_insert_flip_char(tty, c, flag); 664 tty_insert_flip_char(tport, c, flag);
665 } 665 }
666 } 666 }
667 667
@@ -674,7 +674,7 @@ static void sci_receive_chars(struct uart_port *port)
674 674
675 if (copied) { 675 if (copied) {
676 /* Tell the rest of the system the news. New characters! */ 676 /* Tell the rest of the system the news. New characters! */
677 tty_flip_buffer_push(tty); 677 tty_flip_buffer_push(tport);
678 } else { 678 } else {
679 serial_port_in(port, SCxSR); /* dummy read */ 679 serial_port_in(port, SCxSR); /* dummy read */
680 serial_port_out(port, SCxSR, SCxSR_RDxF_CLEAR(port)); 680 serial_port_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
@@ -720,7 +720,7 @@ static int sci_handle_errors(struct uart_port *port)
720{ 720{
721 int copied = 0; 721 int copied = 0;
722 unsigned short status = serial_port_in(port, SCxSR); 722 unsigned short status = serial_port_in(port, SCxSR);
723 struct tty_struct *tty = port->state->port.tty; 723 struct tty_port *tport = &port->state->port;
724 struct sci_port *s = to_sci_port(port); 724 struct sci_port *s = to_sci_port(port);
725 725
726 /* 726 /*
@@ -731,7 +731,7 @@ static int sci_handle_errors(struct uart_port *port)
731 port->icount.overrun++; 731 port->icount.overrun++;
732 732
733 /* overrun error */ 733 /* overrun error */
734 if (tty_insert_flip_char(tty, 0, TTY_OVERRUN)) 734 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN))
735 copied++; 735 copied++;
736 736
737 dev_notice(port->dev, "overrun error"); 737 dev_notice(port->dev, "overrun error");
@@ -755,7 +755,7 @@ static int sci_handle_errors(struct uart_port *port)
755 755
756 dev_dbg(port->dev, "BREAK detected\n"); 756 dev_dbg(port->dev, "BREAK detected\n");
757 757
758 if (tty_insert_flip_char(tty, 0, TTY_BREAK)) 758 if (tty_insert_flip_char(tport, 0, TTY_BREAK))
759 copied++; 759 copied++;
760 } 760 }
761 761
@@ -763,7 +763,7 @@ static int sci_handle_errors(struct uart_port *port)
763 /* frame error */ 763 /* frame error */
764 port->icount.frame++; 764 port->icount.frame++;
765 765
766 if (tty_insert_flip_char(tty, 0, TTY_FRAME)) 766 if (tty_insert_flip_char(tport, 0, TTY_FRAME))
767 copied++; 767 copied++;
768 768
769 dev_notice(port->dev, "frame error\n"); 769 dev_notice(port->dev, "frame error\n");
@@ -774,21 +774,21 @@ static int sci_handle_errors(struct uart_port *port)
774 /* parity error */ 774 /* parity error */
775 port->icount.parity++; 775 port->icount.parity++;
776 776
777 if (tty_insert_flip_char(tty, 0, TTY_PARITY)) 777 if (tty_insert_flip_char(tport, 0, TTY_PARITY))
778 copied++; 778 copied++;
779 779
780 dev_notice(port->dev, "parity error"); 780 dev_notice(port->dev, "parity error");
781 } 781 }
782 782
783 if (copied) 783 if (copied)
784 tty_flip_buffer_push(tty); 784 tty_flip_buffer_push(tport);
785 785
786 return copied; 786 return copied;
787} 787}
788 788
789static int sci_handle_fifo_overrun(struct uart_port *port) 789static int sci_handle_fifo_overrun(struct uart_port *port)
790{ 790{
791 struct tty_struct *tty = port->state->port.tty; 791 struct tty_port *tport = &port->state->port;
792 struct sci_port *s = to_sci_port(port); 792 struct sci_port *s = to_sci_port(port);
793 struct plat_sci_reg *reg; 793 struct plat_sci_reg *reg;
794 int copied = 0; 794 int copied = 0;
@@ -802,8 +802,8 @@ static int sci_handle_fifo_overrun(struct uart_port *port)
802 802
803 port->icount.overrun++; 803 port->icount.overrun++;
804 804
805 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 805 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
806 tty_flip_buffer_push(tty); 806 tty_flip_buffer_push(tport);
807 807
808 dev_notice(port->dev, "overrun error\n"); 808 dev_notice(port->dev, "overrun error\n");
809 copied++; 809 copied++;
@@ -816,7 +816,7 @@ static int sci_handle_breaks(struct uart_port *port)
816{ 816{
817 int copied = 0; 817 int copied = 0;
818 unsigned short status = serial_port_in(port, SCxSR); 818 unsigned short status = serial_port_in(port, SCxSR);
819 struct tty_struct *tty = port->state->port.tty; 819 struct tty_port *tport = &port->state->port;
820 struct sci_port *s = to_sci_port(port); 820 struct sci_port *s = to_sci_port(port);
821 821
822 if (uart_handle_break(port)) 822 if (uart_handle_break(port))
@@ -831,14 +831,14 @@ static int sci_handle_breaks(struct uart_port *port)
831 port->icount.brk++; 831 port->icount.brk++;
832 832
833 /* Notify of BREAK */ 833 /* Notify of BREAK */
834 if (tty_insert_flip_char(tty, 0, TTY_BREAK)) 834 if (tty_insert_flip_char(tport, 0, TTY_BREAK))
835 copied++; 835 copied++;
836 836
837 dev_dbg(port->dev, "BREAK detected\n"); 837 dev_dbg(port->dev, "BREAK detected\n");
838 } 838 }
839 839
840 if (copied) 840 if (copied)
841 tty_flip_buffer_push(tty); 841 tty_flip_buffer_push(tport);
842 842
843 copied += sci_handle_fifo_overrun(port); 843 copied += sci_handle_fifo_overrun(port);
844 844
@@ -1259,13 +1259,13 @@ static void sci_dma_tx_complete(void *arg)
1259} 1259}
1260 1260
1261/* Locking: called with port lock held */ 1261/* Locking: called with port lock held */
1262static int sci_dma_rx_push(struct sci_port *s, struct tty_struct *tty, 1262static int sci_dma_rx_push(struct sci_port *s, size_t count)
1263 size_t count)
1264{ 1263{
1265 struct uart_port *port = &s->port; 1264 struct uart_port *port = &s->port;
1265 struct tty_port *tport = &port->state->port;
1266 int i, active, room; 1266 int i, active, room;
1267 1267
1268 room = tty_buffer_request_room(tty, count); 1268 room = tty_buffer_request_room(tport, count);
1269 1269
1270 if (s->active_rx == s->cookie_rx[0]) { 1270 if (s->active_rx == s->cookie_rx[0]) {
1271 active = 0; 1271 active = 0;
@@ -1283,7 +1283,7 @@ static int sci_dma_rx_push(struct sci_port *s, struct tty_struct *tty,
1283 return room; 1283 return room;
1284 1284
1285 for (i = 0; i < room; i++) 1285 for (i = 0; i < room; i++)
1286 tty_insert_flip_char(tty, ((u8 *)sg_virt(&s->sg_rx[active]))[i], 1286 tty_insert_flip_char(tport, ((u8 *)sg_virt(&s->sg_rx[active]))[i],
1287 TTY_NORMAL); 1287 TTY_NORMAL);
1288 1288
1289 port->icount.rx += room; 1289 port->icount.rx += room;
@@ -1295,7 +1295,6 @@ static void sci_dma_rx_complete(void *arg)
1295{ 1295{
1296 struct sci_port *s = arg; 1296 struct sci_port *s = arg;
1297 struct uart_port *port = &s->port; 1297 struct uart_port *port = &s->port;
1298 struct tty_struct *tty = port->state->port.tty;
1299 unsigned long flags; 1298 unsigned long flags;
1300 int count; 1299 int count;
1301 1300
@@ -1303,14 +1302,14 @@ static void sci_dma_rx_complete(void *arg)
1303 1302
1304 spin_lock_irqsave(&port->lock, flags); 1303 spin_lock_irqsave(&port->lock, flags);
1305 1304
1306 count = sci_dma_rx_push(s, tty, s->buf_len_rx); 1305 count = sci_dma_rx_push(s, s->buf_len_rx);
1307 1306
1308 mod_timer(&s->rx_timer, jiffies + s->rx_timeout); 1307 mod_timer(&s->rx_timer, jiffies + s->rx_timeout);
1309 1308
1310 spin_unlock_irqrestore(&port->lock, flags); 1309 spin_unlock_irqrestore(&port->lock, flags);
1311 1310
1312 if (count) 1311 if (count)
1313 tty_flip_buffer_push(tty); 1312 tty_flip_buffer_push(&port->state->port);
1314 1313
1315 schedule_work(&s->work_rx); 1314 schedule_work(&s->work_rx);
1316} 1315}
@@ -1404,7 +1403,6 @@ static void work_fn_rx(struct work_struct *work)
1404 if (dma_async_is_tx_complete(s->chan_rx, s->active_rx, NULL, NULL) != 1403 if (dma_async_is_tx_complete(s->chan_rx, s->active_rx, NULL, NULL) !=
1405 DMA_SUCCESS) { 1404 DMA_SUCCESS) {
1406 /* Handle incomplete DMA receive */ 1405 /* Handle incomplete DMA receive */
1407 struct tty_struct *tty = port->state->port.tty;
1408 struct dma_chan *chan = s->chan_rx; 1406 struct dma_chan *chan = s->chan_rx;
1409 struct shdma_desc *sh_desc = container_of(desc, 1407 struct shdma_desc *sh_desc = container_of(desc,
1410 struct shdma_desc, async_tx); 1408 struct shdma_desc, async_tx);
@@ -1416,11 +1414,11 @@ static void work_fn_rx(struct work_struct *work)
1416 sh_desc->partial, sh_desc->cookie); 1414 sh_desc->partial, sh_desc->cookie);
1417 1415
1418 spin_lock_irqsave(&port->lock, flags); 1416 spin_lock_irqsave(&port->lock, flags);
1419 count = sci_dma_rx_push(s, tty, sh_desc->partial); 1417 count = sci_dma_rx_push(s, sh_desc->partial);
1420 spin_unlock_irqrestore(&port->lock, flags); 1418 spin_unlock_irqrestore(&port->lock, flags);
1421 1419
1422 if (count) 1420 if (count)
1423 tty_flip_buffer_push(tty); 1421 tty_flip_buffer_push(&port->state->port);
1424 1422
1425 sci_submit_rx(s); 1423 sci_submit_rx(s);
1426 1424
diff --git a/drivers/tty/serial/sirfsoc_uart.c b/drivers/tty/serial/sirfsoc_uart.c
index 5da5cb962769..6bbfe9934a4d 100644
--- a/drivers/tty/serial/sirfsoc_uart.c
+++ b/drivers/tty/serial/sirfsoc_uart.c
@@ -75,6 +75,20 @@ static struct sirfsoc_uart_port sirfsoc_uart_ports[SIRFSOC_UART_NR] = {
75 .line = 2, 75 .line = 2,
76 }, 76 },
77 }, 77 },
78 [3] = {
79 .port = {
80 .iotype = UPIO_MEM,
81 .flags = UPF_BOOT_AUTOCONF,
82 .line = 3,
83 },
84 },
85 [4] = {
86 .port = {
87 .iotype = UPIO_MEM,
88 .flags = UPF_BOOT_AUTOCONF,
89 .line = 4,
90 },
91 },
78}; 92};
79 93
80static inline struct sirfsoc_uart_port *to_sirfport(struct uart_port *port) 94static inline struct sirfsoc_uart_port *to_sirfport(struct uart_port *port)
@@ -192,11 +206,6 @@ static unsigned int
192sirfsoc_uart_pio_rx_chars(struct uart_port *port, unsigned int max_rx_count) 206sirfsoc_uart_pio_rx_chars(struct uart_port *port, unsigned int max_rx_count)
193{ 207{
194 unsigned int ch, rx_count = 0; 208 unsigned int ch, rx_count = 0;
195 struct tty_struct *tty;
196
197 tty = tty_port_tty_get(&port->state->port);
198 if (!tty)
199 return -ENODEV;
200 209
201 while (!(rd_regl(port, SIRFUART_RX_FIFO_STATUS) & 210 while (!(rd_regl(port, SIRFUART_RX_FIFO_STATUS) &
202 SIRFUART_FIFOEMPTY_MASK(port))) { 211 SIRFUART_FIFOEMPTY_MASK(port))) {
@@ -210,8 +219,7 @@ sirfsoc_uart_pio_rx_chars(struct uart_port *port, unsigned int max_rx_count)
210 } 219 }
211 220
212 port->icount.rx += rx_count; 221 port->icount.rx += rx_count;
213 tty_flip_buffer_push(tty); 222 tty_flip_buffer_push(&port->state->port);
214 tty_kref_put(tty);
215 223
216 return rx_count; 224 return rx_count;
217} 225}
@@ -245,6 +253,7 @@ static irqreturn_t sirfsoc_uart_isr(int irq, void *dev_id)
245 struct uart_port *port = &sirfport->port; 253 struct uart_port *port = &sirfport->port;
246 struct uart_state *state = port->state; 254 struct uart_state *state = port->state;
247 struct circ_buf *xmit = &port->state->xmit; 255 struct circ_buf *xmit = &port->state->xmit;
256 spin_lock(&port->lock);
248 intr_status = rd_regl(port, SIRFUART_INT_STATUS); 257 intr_status = rd_regl(port, SIRFUART_INT_STATUS);
249 wr_regl(port, SIRFUART_INT_STATUS, intr_status); 258 wr_regl(port, SIRFUART_INT_STATUS, intr_status);
250 intr_status &= rd_regl(port, SIRFUART_INT_EN); 259 intr_status &= rd_regl(port, SIRFUART_INT_EN);
@@ -254,6 +263,7 @@ static irqreturn_t sirfsoc_uart_isr(int irq, void *dev_id)
254 goto recv_char; 263 goto recv_char;
255 uart_insert_char(port, intr_status, 264 uart_insert_char(port, intr_status,
256 SIRFUART_RX_OFLOW, 0, TTY_BREAK); 265 SIRFUART_RX_OFLOW, 0, TTY_BREAK);
266 spin_unlock(&port->lock);
257 return IRQ_HANDLED; 267 return IRQ_HANDLED;
258 } 268 }
259 if (intr_status & SIRFUART_RX_OFLOW) 269 if (intr_status & SIRFUART_RX_OFLOW)
@@ -286,6 +296,7 @@ recv_char:
286 sirfsoc_uart_pio_rx_chars(port, SIRFSOC_UART_IO_RX_MAX_CNT); 296 sirfsoc_uart_pio_rx_chars(port, SIRFSOC_UART_IO_RX_MAX_CNT);
287 if (intr_status & SIRFUART_TX_INT_EN) { 297 if (intr_status & SIRFUART_TX_INT_EN) {
288 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { 298 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
299 spin_unlock(&port->lock);
289 return IRQ_HANDLED; 300 return IRQ_HANDLED;
290 } else { 301 } else {
291 sirfsoc_uart_pio_tx_chars(sirfport, 302 sirfsoc_uart_pio_tx_chars(sirfport,
@@ -296,6 +307,7 @@ recv_char:
296 sirfsoc_uart_stop_tx(port); 307 sirfsoc_uart_stop_tx(port);
297 } 308 }
298 } 309 }
310 spin_unlock(&port->lock);
299 return IRQ_HANDLED; 311 return IRQ_HANDLED;
300} 312}
301 313
@@ -345,7 +357,6 @@ static void sirfsoc_uart_set_termios(struct uart_port *port,
345 struct ktermios *old) 357 struct ktermios *old)
346{ 358{
347 struct sirfsoc_uart_port *sirfport = to_sirfport(port); 359 struct sirfsoc_uart_port *sirfport = to_sirfport(port);
348 unsigned long ioclk_rate;
349 unsigned long config_reg = 0; 360 unsigned long config_reg = 0;
350 unsigned long baud_rate; 361 unsigned long baud_rate;
351 unsigned long setted_baud; 362 unsigned long setted_baud;
@@ -357,7 +368,6 @@ static void sirfsoc_uart_set_termios(struct uart_port *port,
357 int threshold_div; 368 int threshold_div;
358 int temp; 369 int temp;
359 370
360 ioclk_rate = 150000000;
361 switch (termios->c_cflag & CSIZE) { 371 switch (termios->c_cflag & CSIZE) {
362 default: 372 default:
363 case CS8: 373 case CS8:
@@ -413,14 +423,17 @@ static void sirfsoc_uart_set_termios(struct uart_port *port,
413 sirfsoc_uart_disable_ms(port); 423 sirfsoc_uart_disable_ms(port);
414 } 424 }
415 425
416 /* common rate: fast calculation */ 426 if (port->uartclk == 150000000) {
417 for (ic = 0; ic < SIRF_BAUD_RATE_SUPPORT_NR; ic++) 427 /* common rate: fast calculation */
418 if (baud_rate == baudrate_to_regv[ic].baud_rate) 428 for (ic = 0; ic < SIRF_BAUD_RATE_SUPPORT_NR; ic++)
419 clk_div_reg = baudrate_to_regv[ic].reg_val; 429 if (baud_rate == baudrate_to_regv[ic].baud_rate)
430 clk_div_reg = baudrate_to_regv[ic].reg_val;
431 }
432
420 setted_baud = baud_rate; 433 setted_baud = baud_rate;
421 /* arbitary rate setting */ 434 /* arbitary rate setting */
422 if (unlikely(clk_div_reg == 0)) 435 if (unlikely(clk_div_reg == 0))
423 clk_div_reg = sirfsoc_calc_sample_div(baud_rate, ioclk_rate, 436 clk_div_reg = sirfsoc_calc_sample_div(baud_rate, port->uartclk,
424 &setted_baud); 437 &setted_baud);
425 wr_regl(port, SIRFUART_DIVISOR, clk_div_reg); 438 wr_regl(port, SIRFUART_DIVISOR, clk_div_reg);
426 439
@@ -679,6 +692,14 @@ int sirfsoc_uart_probe(struct platform_device *pdev)
679 goto err; 692 goto err;
680 } 693 }
681 694
695 sirfport->clk = clk_get(&pdev->dev, NULL);
696 if (IS_ERR(sirfport->clk)) {
697 ret = PTR_ERR(sirfport->clk);
698 goto clk_err;
699 }
700 clk_prepare_enable(sirfport->clk);
701 port->uartclk = clk_get_rate(sirfport->clk);
702
682 port->ops = &sirfsoc_uart_ops; 703 port->ops = &sirfsoc_uart_ops;
683 spin_lock_init(&port->lock); 704 spin_lock_init(&port->lock);
684 705
@@ -692,6 +713,9 @@ int sirfsoc_uart_probe(struct platform_device *pdev)
692 return 0; 713 return 0;
693 714
694port_err: 715port_err:
716 clk_disable_unprepare(sirfport->clk);
717 clk_put(sirfport->clk);
718clk_err:
695 platform_set_drvdata(pdev, NULL); 719 platform_set_drvdata(pdev, NULL);
696 if (sirfport->hw_flow_ctrl) 720 if (sirfport->hw_flow_ctrl)
697 pinctrl_put(sirfport->p); 721 pinctrl_put(sirfport->p);
@@ -706,6 +730,8 @@ static int sirfsoc_uart_remove(struct platform_device *pdev)
706 platform_set_drvdata(pdev, NULL); 730 platform_set_drvdata(pdev, NULL);
707 if (sirfport->hw_flow_ctrl) 731 if (sirfport->hw_flow_ctrl)
708 pinctrl_put(sirfport->p); 732 pinctrl_put(sirfport->p);
733 clk_disable_unprepare(sirfport->clk);
734 clk_put(sirfport->clk);
709 uart_remove_one_port(&sirfsoc_uart_drv, port); 735 uart_remove_one_port(&sirfsoc_uart_drv, port);
710 return 0; 736 return 0;
711} 737}
@@ -729,6 +755,7 @@ static int sirfsoc_uart_resume(struct platform_device *pdev)
729 755
730static struct of_device_id sirfsoc_uart_ids[] = { 756static struct of_device_id sirfsoc_uart_ids[] = {
731 { .compatible = "sirf,prima2-uart", }, 757 { .compatible = "sirf,prima2-uart", },
758 { .compatible = "sirf,marco-uart", },
732 {} 759 {}
733}; 760};
734MODULE_DEVICE_TABLE(of, sirfsoc_serial_of_match); 761MODULE_DEVICE_TABLE(of, sirfsoc_serial_of_match);
diff --git a/drivers/tty/serial/sirfsoc_uart.h b/drivers/tty/serial/sirfsoc_uart.h
index 6e207fdc2fed..85328ba0c4e3 100644
--- a/drivers/tty/serial/sirfsoc_uart.h
+++ b/drivers/tty/serial/sirfsoc_uart.h
@@ -139,7 +139,7 @@
139#define SIRFSOC_UART_MINOR 0 139#define SIRFSOC_UART_MINOR 0
140#define SIRFUART_PORT_NAME "sirfsoc-uart" 140#define SIRFUART_PORT_NAME "sirfsoc-uart"
141#define SIRFUART_MAP_SIZE 0x200 141#define SIRFUART_MAP_SIZE 0x200
142#define SIRFSOC_UART_NR 3 142#define SIRFSOC_UART_NR 5
143#define SIRFSOC_PORT_TYPE 0xa5 143#define SIRFSOC_PORT_TYPE 0xa5
144 144
145/* Baud Rate Calculation */ 145/* Baud Rate Calculation */
@@ -163,6 +163,7 @@ struct sirfsoc_uart_port {
163 163
164 struct uart_port port; 164 struct uart_port port;
165 struct pinctrl *p; 165 struct pinctrl *p;
166 struct clk *clk;
166}; 167};
167 168
168/* Hardware Flow Control */ 169/* Hardware Flow Control */
diff --git a/drivers/tty/serial/sn_console.c b/drivers/tty/serial/sn_console.c
index 1c6de9f58699..f51ffdc696fd 100644
--- a/drivers/tty/serial/sn_console.c
+++ b/drivers/tty/serial/sn_console.c
@@ -457,8 +457,8 @@ static int sn_debug_printf(const char *fmt, ...)
457static void 457static void
458sn_receive_chars(struct sn_cons_port *port, unsigned long flags) 458sn_receive_chars(struct sn_cons_port *port, unsigned long flags)
459{ 459{
460 struct tty_port *tport = NULL;
460 int ch; 461 int ch;
461 struct tty_struct *tty;
462 462
463 if (!port) { 463 if (!port) {
464 printk(KERN_ERR "sn_receive_chars - port NULL so can't receive\n"); 464 printk(KERN_ERR "sn_receive_chars - port NULL so can't receive\n");
@@ -472,11 +472,7 @@ sn_receive_chars(struct sn_cons_port *port, unsigned long flags)
472 472
473 if (port->sc_port.state) { 473 if (port->sc_port.state) {
474 /* The serial_core stuffs are initialized, use them */ 474 /* The serial_core stuffs are initialized, use them */
475 tty = port->sc_port.state->port.tty; 475 tport = &port->sc_port.state->port;
476 }
477 else {
478 /* Not registered yet - can't pass to tty layer. */
479 tty = NULL;
480 } 476 }
481 477
482 while (port->sc_ops->sal_input_pending()) { 478 while (port->sc_ops->sal_input_pending()) {
@@ -516,15 +512,15 @@ sn_receive_chars(struct sn_cons_port *port, unsigned long flags)
516#endif /* CONFIG_MAGIC_SYSRQ */ 512#endif /* CONFIG_MAGIC_SYSRQ */
517 513
518 /* record the character to pass up to the tty layer */ 514 /* record the character to pass up to the tty layer */
519 if (tty) { 515 if (tport) {
520 if(tty_insert_flip_char(tty, ch, TTY_NORMAL) == 0) 516 if (tty_insert_flip_char(tport, ch, TTY_NORMAL) == 0)
521 break; 517 break;
522 } 518 }
523 port->sc_port.icount.rx++; 519 port->sc_port.icount.rx++;
524 } 520 }
525 521
526 if (tty) 522 if (tport)
527 tty_flip_buffer_push(tty); 523 tty_flip_buffer_push(tport);
528} 524}
529 525
530/** 526/**
diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c
index b9bf9c53f7fd..ba60708053e0 100644
--- a/drivers/tty/serial/sunhv.c
+++ b/drivers/tty/serial/sunhv.c
@@ -72,7 +72,7 @@ static void transmit_chars_write(struct uart_port *port, struct circ_buf *xmit)
72 } 72 }
73} 73}
74 74
75static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty) 75static int receive_chars_getchar(struct uart_port *port)
76{ 76{
77 int saw_console_brk = 0; 77 int saw_console_brk = 0;
78 int limit = 10000; 78 int limit = 10000;
@@ -99,7 +99,7 @@ static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty)
99 uart_handle_dcd_change(port, 1); 99 uart_handle_dcd_change(port, 1);
100 } 100 }
101 101
102 if (tty == NULL) { 102 if (port->state == NULL) {
103 uart_handle_sysrq_char(port, c); 103 uart_handle_sysrq_char(port, c);
104 continue; 104 continue;
105 } 105 }
@@ -109,13 +109,13 @@ static int receive_chars_getchar(struct uart_port *port, struct tty_struct *tty)
109 if (uart_handle_sysrq_char(port, c)) 109 if (uart_handle_sysrq_char(port, c))
110 continue; 110 continue;
111 111
112 tty_insert_flip_char(tty, c, TTY_NORMAL); 112 tty_insert_flip_char(&port->state->port, c, TTY_NORMAL);
113 } 113 }
114 114
115 return saw_console_brk; 115 return saw_console_brk;
116} 116}
117 117
118static int receive_chars_read(struct uart_port *port, struct tty_struct *tty) 118static int receive_chars_read(struct uart_port *port)
119{ 119{
120 int saw_console_brk = 0; 120 int saw_console_brk = 0;
121 int limit = 10000; 121 int limit = 10000;
@@ -152,12 +152,13 @@ static int receive_chars_read(struct uart_port *port, struct tty_struct *tty)
152 for (i = 0; i < bytes_read; i++) 152 for (i = 0; i < bytes_read; i++)
153 uart_handle_sysrq_char(port, con_read_page[i]); 153 uart_handle_sysrq_char(port, con_read_page[i]);
154 154
155 if (tty == NULL) 155 if (port->state == NULL)
156 continue; 156 continue;
157 157
158 port->icount.rx += bytes_read; 158 port->icount.rx += bytes_read;
159 159
160 tty_insert_flip_string(tty, con_read_page, bytes_read); 160 tty_insert_flip_string(&port->state->port, con_read_page,
161 bytes_read);
161 } 162 }
162 163
163 return saw_console_brk; 164 return saw_console_brk;
@@ -165,7 +166,7 @@ static int receive_chars_read(struct uart_port *port, struct tty_struct *tty)
165 166
166struct sunhv_ops { 167struct sunhv_ops {
167 void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit); 168 void (*transmit_chars)(struct uart_port *port, struct circ_buf *xmit);
168 int (*receive_chars)(struct uart_port *port, struct tty_struct *tty); 169 int (*receive_chars)(struct uart_port *port);
169}; 170};
170 171
171static struct sunhv_ops bychar_ops = { 172static struct sunhv_ops bychar_ops = {
@@ -180,17 +181,17 @@ static struct sunhv_ops bywrite_ops = {
180 181
181static struct sunhv_ops *sunhv_ops = &bychar_ops; 182static struct sunhv_ops *sunhv_ops = &bychar_ops;
182 183
183static struct tty_struct *receive_chars(struct uart_port *port) 184static struct tty_port *receive_chars(struct uart_port *port)
184{ 185{
185 struct tty_struct *tty = NULL; 186 struct tty_port *tport = NULL;
186 187
187 if (port->state != NULL) /* Unopened serial console */ 188 if (port->state != NULL) /* Unopened serial console */
188 tty = port->state->port.tty; 189 tport = &port->state->port;
189 190
190 if (sunhv_ops->receive_chars(port, tty)) 191 if (sunhv_ops->receive_chars(port))
191 sun_do_break(); 192 sun_do_break();
192 193
193 return tty; 194 return tport;
194} 195}
195 196
196static void transmit_chars(struct uart_port *port) 197static void transmit_chars(struct uart_port *port)
@@ -213,16 +214,16 @@ static void transmit_chars(struct uart_port *port)
213static irqreturn_t sunhv_interrupt(int irq, void *dev_id) 214static irqreturn_t sunhv_interrupt(int irq, void *dev_id)
214{ 215{
215 struct uart_port *port = dev_id; 216 struct uart_port *port = dev_id;
216 struct tty_struct *tty; 217 struct tty_port *tport;
217 unsigned long flags; 218 unsigned long flags;
218 219
219 spin_lock_irqsave(&port->lock, flags); 220 spin_lock_irqsave(&port->lock, flags);
220 tty = receive_chars(port); 221 tport = receive_chars(port);
221 transmit_chars(port); 222 transmit_chars(port);
222 spin_unlock_irqrestore(&port->lock, flags); 223 spin_unlock_irqrestore(&port->lock, flags);
223 224
224 if (tty) 225 if (tport)
225 tty_flip_buffer_push(tty); 226 tty_flip_buffer_push(tport);
226 227
227 return IRQ_HANDLED; 228 return IRQ_HANDLED;
228} 229}
diff --git a/drivers/tty/serial/sunsab.c b/drivers/tty/serial/sunsab.c
index bd8b3b634103..8de2213664e0 100644
--- a/drivers/tty/serial/sunsab.c
+++ b/drivers/tty/serial/sunsab.c
@@ -107,11 +107,11 @@ static __inline__ void sunsab_cec_wait(struct uart_sunsab_port *up)
107 udelay(1); 107 udelay(1);
108} 108}
109 109
110static struct tty_struct * 110static struct tty_port *
111receive_chars(struct uart_sunsab_port *up, 111receive_chars(struct uart_sunsab_port *up,
112 union sab82532_irq_status *stat) 112 union sab82532_irq_status *stat)
113{ 113{
114 struct tty_struct *tty = NULL; 114 struct tty_port *port = NULL;
115 unsigned char buf[32]; 115 unsigned char buf[32];
116 int saw_console_brk = 0; 116 int saw_console_brk = 0;
117 int free_fifo = 0; 117 int free_fifo = 0;
@@ -119,7 +119,7 @@ receive_chars(struct uart_sunsab_port *up,
119 int i; 119 int i;
120 120
121 if (up->port.state != NULL) /* Unopened serial console */ 121 if (up->port.state != NULL) /* Unopened serial console */
122 tty = up->port.state->port.tty; 122 port = &up->port.state->port;
123 123
124 /* Read number of BYTES (Character + Status) available. */ 124 /* Read number of BYTES (Character + Status) available. */
125 if (stat->sreg.isr0 & SAB82532_ISR0_RPF) { 125 if (stat->sreg.isr0 & SAB82532_ISR0_RPF) {
@@ -136,7 +136,7 @@ receive_chars(struct uart_sunsab_port *up,
136 if (stat->sreg.isr0 & SAB82532_ISR0_TIME) { 136 if (stat->sreg.isr0 & SAB82532_ISR0_TIME) {
137 sunsab_cec_wait(up); 137 sunsab_cec_wait(up);
138 writeb(SAB82532_CMDR_RFRD, &up->regs->w.cmdr); 138 writeb(SAB82532_CMDR_RFRD, &up->regs->w.cmdr);
139 return tty; 139 return port;
140 } 140 }
141 141
142 if (stat->sreg.isr0 & SAB82532_ISR0_RFO) 142 if (stat->sreg.isr0 & SAB82532_ISR0_RFO)
@@ -160,11 +160,6 @@ receive_chars(struct uart_sunsab_port *up,
160 for (i = 0; i < count; i++) { 160 for (i = 0; i < count; i++) {
161 unsigned char ch = buf[i], flag; 161 unsigned char ch = buf[i], flag;
162 162
163 if (tty == NULL) {
164 uart_handle_sysrq_char(&up->port, ch);
165 continue;
166 }
167
168 flag = TTY_NORMAL; 163 flag = TTY_NORMAL;
169 up->port.icount.rx++; 164 up->port.icount.rx++;
170 165
@@ -213,15 +208,15 @@ receive_chars(struct uart_sunsab_port *up,
213 208
214 if ((stat->sreg.isr0 & (up->port.ignore_status_mask & 0xff)) == 0 && 209 if ((stat->sreg.isr0 & (up->port.ignore_status_mask & 0xff)) == 0 &&
215 (stat->sreg.isr1 & ((up->port.ignore_status_mask >> 8) & 0xff)) == 0) 210 (stat->sreg.isr1 & ((up->port.ignore_status_mask >> 8) & 0xff)) == 0)
216 tty_insert_flip_char(tty, ch, flag); 211 tty_insert_flip_char(port, ch, flag);
217 if (stat->sreg.isr0 & SAB82532_ISR0_RFO) 212 if (stat->sreg.isr0 & SAB82532_ISR0_RFO)
218 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 213 tty_insert_flip_char(port, 0, TTY_OVERRUN);
219 } 214 }
220 215
221 if (saw_console_brk) 216 if (saw_console_brk)
222 sun_do_break(); 217 sun_do_break();
223 218
224 return tty; 219 return port;
225} 220}
226 221
227static void sunsab_stop_tx(struct uart_port *); 222static void sunsab_stop_tx(struct uart_port *);
@@ -304,7 +299,7 @@ static void check_status(struct uart_sunsab_port *up,
304static irqreturn_t sunsab_interrupt(int irq, void *dev_id) 299static irqreturn_t sunsab_interrupt(int irq, void *dev_id)
305{ 300{
306 struct uart_sunsab_port *up = dev_id; 301 struct uart_sunsab_port *up = dev_id;
307 struct tty_struct *tty; 302 struct tty_port *port = NULL;
308 union sab82532_irq_status status; 303 union sab82532_irq_status status;
309 unsigned long flags; 304 unsigned long flags;
310 unsigned char gis; 305 unsigned char gis;
@@ -318,12 +313,11 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id)
318 if (gis & 2) 313 if (gis & 2)
319 status.sreg.isr1 = readb(&up->regs->r.isr1); 314 status.sreg.isr1 = readb(&up->regs->r.isr1);
320 315
321 tty = NULL;
322 if (status.stat) { 316 if (status.stat) {
323 if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | 317 if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME |
324 SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) || 318 SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) ||
325 (status.sreg.isr1 & SAB82532_ISR1_BRK)) 319 (status.sreg.isr1 & SAB82532_ISR1_BRK))
326 tty = receive_chars(up, &status); 320 port = receive_chars(up, &status);
327 if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || 321 if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) ||
328 (status.sreg.isr1 & SAB82532_ISR1_CSC)) 322 (status.sreg.isr1 & SAB82532_ISR1_CSC))
329 check_status(up, &status); 323 check_status(up, &status);
@@ -333,8 +327,8 @@ static irqreturn_t sunsab_interrupt(int irq, void *dev_id)
333 327
334 spin_unlock_irqrestore(&up->port.lock, flags); 328 spin_unlock_irqrestore(&up->port.lock, flags);
335 329
336 if (tty) 330 if (port)
337 tty_flip_buffer_push(tty); 331 tty_flip_buffer_push(port);
338 332
339 return IRQ_HANDLED; 333 return IRQ_HANDLED;
340} 334}
diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c
index 220da3f9724f..e343d6670854 100644
--- a/drivers/tty/serial/sunsu.c
+++ b/drivers/tty/serial/sunsu.c
@@ -315,10 +315,10 @@ static void sunsu_enable_ms(struct uart_port *port)
315 spin_unlock_irqrestore(&up->port.lock, flags); 315 spin_unlock_irqrestore(&up->port.lock, flags);
316} 316}
317 317
318static struct tty_struct * 318static void
319receive_chars(struct uart_sunsu_port *up, unsigned char *status) 319receive_chars(struct uart_sunsu_port *up, unsigned char *status)
320{ 320{
321 struct tty_struct *tty = up->port.state->port.tty; 321 struct tty_port *port = &up->port.state->port;
322 unsigned char ch, flag; 322 unsigned char ch, flag;
323 int max_count = 256; 323 int max_count = 256;
324 int saw_console_brk = 0; 324 int saw_console_brk = 0;
@@ -376,22 +376,20 @@ receive_chars(struct uart_sunsu_port *up, unsigned char *status)
376 if (uart_handle_sysrq_char(&up->port, ch)) 376 if (uart_handle_sysrq_char(&up->port, ch))
377 goto ignore_char; 377 goto ignore_char;
378 if ((*status & up->port.ignore_status_mask) == 0) 378 if ((*status & up->port.ignore_status_mask) == 0)
379 tty_insert_flip_char(tty, ch, flag); 379 tty_insert_flip_char(port, ch, flag);
380 if (*status & UART_LSR_OE) 380 if (*status & UART_LSR_OE)
381 /* 381 /*
382 * Overrun is special, since it's reported 382 * Overrun is special, since it's reported
383 * immediately, and doesn't affect the current 383 * immediately, and doesn't affect the current
384 * character. 384 * character.
385 */ 385 */
386 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 386 tty_insert_flip_char(port, 0, TTY_OVERRUN);
387 ignore_char: 387 ignore_char:
388 *status = serial_inp(up, UART_LSR); 388 *status = serial_inp(up, UART_LSR);
389 } while ((*status & UART_LSR_DR) && (max_count-- > 0)); 389 } while ((*status & UART_LSR_DR) && (max_count-- > 0));
390 390
391 if (saw_console_brk) 391 if (saw_console_brk)
392 sun_do_break(); 392 sun_do_break();
393
394 return tty;
395} 393}
396 394
397static void transmit_chars(struct uart_sunsu_port *up) 395static void transmit_chars(struct uart_sunsu_port *up)
@@ -460,20 +458,16 @@ static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id)
460 spin_lock_irqsave(&up->port.lock, flags); 458 spin_lock_irqsave(&up->port.lock, flags);
461 459
462 do { 460 do {
463 struct tty_struct *tty;
464
465 status = serial_inp(up, UART_LSR); 461 status = serial_inp(up, UART_LSR);
466 tty = NULL;
467 if (status & UART_LSR_DR) 462 if (status & UART_LSR_DR)
468 tty = receive_chars(up, &status); 463 receive_chars(up, &status);
469 check_modem_status(up); 464 check_modem_status(up);
470 if (status & UART_LSR_THRE) 465 if (status & UART_LSR_THRE)
471 transmit_chars(up); 466 transmit_chars(up);
472 467
473 spin_unlock_irqrestore(&up->port.lock, flags); 468 spin_unlock_irqrestore(&up->port.lock, flags);
474 469
475 if (tty) 470 tty_flip_buffer_push(&up->port.state->port);
476 tty_flip_buffer_push(tty);
477 471
478 spin_lock_irqsave(&up->port.lock, flags); 472 spin_lock_irqsave(&up->port.lock, flags);
479 473
diff --git a/drivers/tty/serial/sunzilog.c b/drivers/tty/serial/sunzilog.c
index aef4fab957c3..27669ff3d446 100644
--- a/drivers/tty/serial/sunzilog.c
+++ b/drivers/tty/serial/sunzilog.c
@@ -323,17 +323,15 @@ static void sunzilog_kbdms_receive_chars(struct uart_sunzilog_port *up,
323 } 323 }
324} 324}
325 325
326static struct tty_struct * 326static struct tty_port *
327sunzilog_receive_chars(struct uart_sunzilog_port *up, 327sunzilog_receive_chars(struct uart_sunzilog_port *up,
328 struct zilog_channel __iomem *channel) 328 struct zilog_channel __iomem *channel)
329{ 329{
330 struct tty_struct *tty; 330 struct tty_port *port = NULL;
331 unsigned char ch, r1, flag; 331 unsigned char ch, r1, flag;
332 332
333 tty = NULL; 333 if (up->port.state != NULL) /* Unopened serial console */
334 if (up->port.state != NULL && /* Unopened serial console */ 334 port = &up->port.state->port;
335 up->port.state->port.tty != NULL) /* Keyboard || mouse */
336 tty = up->port.state->port.tty;
337 335
338 for (;;) { 336 for (;;) {
339 337
@@ -366,11 +364,6 @@ sunzilog_receive_chars(struct uart_sunzilog_port *up,
366 continue; 364 continue;
367 } 365 }
368 366
369 if (tty == NULL) {
370 uart_handle_sysrq_char(&up->port, ch);
371 continue;
372 }
373
374 /* A real serial line, record the character and status. */ 367 /* A real serial line, record the character and status. */
375 flag = TTY_NORMAL; 368 flag = TTY_NORMAL;
376 up->port.icount.rx++; 369 up->port.icount.rx++;
@@ -400,13 +393,13 @@ sunzilog_receive_chars(struct uart_sunzilog_port *up,
400 393
401 if (up->port.ignore_status_mask == 0xff || 394 if (up->port.ignore_status_mask == 0xff ||
402 (r1 & up->port.ignore_status_mask) == 0) { 395 (r1 & up->port.ignore_status_mask) == 0) {
403 tty_insert_flip_char(tty, ch, flag); 396 tty_insert_flip_char(port, ch, flag);
404 } 397 }
405 if (r1 & Rx_OVR) 398 if (r1 & Rx_OVR)
406 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 399 tty_insert_flip_char(port, 0, TTY_OVERRUN);
407 } 400 }
408 401
409 return tty; 402 return port;
410} 403}
411 404
412static void sunzilog_status_handle(struct uart_sunzilog_port *up, 405static void sunzilog_status_handle(struct uart_sunzilog_port *up,
@@ -539,21 +532,21 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
539 while (up) { 532 while (up) {
540 struct zilog_channel __iomem *channel 533 struct zilog_channel __iomem *channel
541 = ZILOG_CHANNEL_FROM_PORT(&up->port); 534 = ZILOG_CHANNEL_FROM_PORT(&up->port);
542 struct tty_struct *tty; 535 struct tty_port *port;
543 unsigned char r3; 536 unsigned char r3;
544 537
545 spin_lock(&up->port.lock); 538 spin_lock(&up->port.lock);
546 r3 = read_zsreg(channel, R3); 539 r3 = read_zsreg(channel, R3);
547 540
548 /* Channel A */ 541 /* Channel A */
549 tty = NULL; 542 port = NULL;
550 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { 543 if (r3 & (CHAEXT | CHATxIP | CHARxIP)) {
551 writeb(RES_H_IUS, &channel->control); 544 writeb(RES_H_IUS, &channel->control);
552 ZSDELAY(); 545 ZSDELAY();
553 ZS_WSYNC(channel); 546 ZS_WSYNC(channel);
554 547
555 if (r3 & CHARxIP) 548 if (r3 & CHARxIP)
556 tty = sunzilog_receive_chars(up, channel); 549 port = sunzilog_receive_chars(up, channel);
557 if (r3 & CHAEXT) 550 if (r3 & CHAEXT)
558 sunzilog_status_handle(up, channel); 551 sunzilog_status_handle(up, channel);
559 if (r3 & CHATxIP) 552 if (r3 & CHATxIP)
@@ -561,22 +554,22 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
561 } 554 }
562 spin_unlock(&up->port.lock); 555 spin_unlock(&up->port.lock);
563 556
564 if (tty) 557 if (port)
565 tty_flip_buffer_push(tty); 558 tty_flip_buffer_push(port);
566 559
567 /* Channel B */ 560 /* Channel B */
568 up = up->next; 561 up = up->next;
569 channel = ZILOG_CHANNEL_FROM_PORT(&up->port); 562 channel = ZILOG_CHANNEL_FROM_PORT(&up->port);
570 563
571 spin_lock(&up->port.lock); 564 spin_lock(&up->port.lock);
572 tty = NULL; 565 port = NULL;
573 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { 566 if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) {
574 writeb(RES_H_IUS, &channel->control); 567 writeb(RES_H_IUS, &channel->control);
575 ZSDELAY(); 568 ZSDELAY();
576 ZS_WSYNC(channel); 569 ZS_WSYNC(channel);
577 570
578 if (r3 & CHBRxIP) 571 if (r3 & CHBRxIP)
579 tty = sunzilog_receive_chars(up, channel); 572 port = sunzilog_receive_chars(up, channel);
580 if (r3 & CHBEXT) 573 if (r3 & CHBEXT)
581 sunzilog_status_handle(up, channel); 574 sunzilog_status_handle(up, channel);
582 if (r3 & CHBTxIP) 575 if (r3 & CHBTxIP)
@@ -584,8 +577,8 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id)
584 } 577 }
585 spin_unlock(&up->port.lock); 578 spin_unlock(&up->port.lock);
586 579
587 if (tty) 580 if (port)
588 tty_flip_buffer_push(tty); 581 tty_flip_buffer_push(port);
589 582
590 up = up->next; 583 up = up->next;
591 } 584 }
diff --git a/drivers/tty/serial/timbuart.c b/drivers/tty/serial/timbuart.c
index 5be0d68feceb..6818410a2bea 100644
--- a/drivers/tty/serial/timbuart.c
+++ b/drivers/tty/serial/timbuart.c
@@ -91,16 +91,16 @@ static void timbuart_flush_buffer(struct uart_port *port)
91 91
92static void timbuart_rx_chars(struct uart_port *port) 92static void timbuart_rx_chars(struct uart_port *port)
93{ 93{
94 struct tty_struct *tty = port->state->port.tty; 94 struct tty_port *tport = &port->state->port;
95 95
96 while (ioread32(port->membase + TIMBUART_ISR) & RXDP) { 96 while (ioread32(port->membase + TIMBUART_ISR) & RXDP) {
97 u8 ch = ioread8(port->membase + TIMBUART_RXFIFO); 97 u8 ch = ioread8(port->membase + TIMBUART_RXFIFO);
98 port->icount.rx++; 98 port->icount.rx++;
99 tty_insert_flip_char(tty, ch, TTY_NORMAL); 99 tty_insert_flip_char(tport, ch, TTY_NORMAL);
100 } 100 }
101 101
102 spin_unlock(&port->lock); 102 spin_unlock(&port->lock);
103 tty_flip_buffer_push(port->state->port.tty); 103 tty_flip_buffer_push(tport);
104 spin_lock(&port->lock); 104 spin_lock(&port->lock);
105 105
106 dev_dbg(port->dev, "%s - total read %d bytes\n", 106 dev_dbg(port->dev, "%s - total read %d bytes\n",
diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c
index 89eee43c4e2d..5486505e87c7 100644
--- a/drivers/tty/serial/uartlite.c
+++ b/drivers/tty/serial/uartlite.c
@@ -66,7 +66,7 @@ static struct uart_port ulite_ports[ULITE_NR_UARTS];
66 66
67static int ulite_receive(struct uart_port *port, int stat) 67static int ulite_receive(struct uart_port *port, int stat)
68{ 68{
69 struct tty_struct *tty = port->state->port.tty; 69 struct tty_port *tport = &port->state->port;
70 unsigned char ch = 0; 70 unsigned char ch = 0;
71 char flag = TTY_NORMAL; 71 char flag = TTY_NORMAL;
72 72
@@ -103,13 +103,13 @@ static int ulite_receive(struct uart_port *port, int stat)
103 stat &= ~port->ignore_status_mask; 103 stat &= ~port->ignore_status_mask;
104 104
105 if (stat & ULITE_STATUS_RXVALID) 105 if (stat & ULITE_STATUS_RXVALID)
106 tty_insert_flip_char(tty, ch, flag); 106 tty_insert_flip_char(tport, ch, flag);
107 107
108 if (stat & ULITE_STATUS_FRAME) 108 if (stat & ULITE_STATUS_FRAME)
109 tty_insert_flip_char(tty, 0, TTY_FRAME); 109 tty_insert_flip_char(tport, 0, TTY_FRAME);
110 110
111 if (stat & ULITE_STATUS_OVERRUN) 111 if (stat & ULITE_STATUS_OVERRUN)
112 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 112 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
113 113
114 return 1; 114 return 1;
115} 115}
@@ -156,7 +156,7 @@ static irqreturn_t ulite_isr(int irq, void *dev_id)
156 156
157 /* work done? */ 157 /* work done? */
158 if (n > 1) { 158 if (n > 1) {
159 tty_flip_buffer_push(port->state->port.tty); 159 tty_flip_buffer_push(&port->state->port);
160 return IRQ_HANDLED; 160 return IRQ_HANDLED;
161 } else { 161 } else {
162 return IRQ_NONE; 162 return IRQ_NONE;
diff --git a/drivers/tty/serial/ucc_uart.c b/drivers/tty/serial/ucc_uart.c
index f99b0c965f85..7355303dad99 100644
--- a/drivers/tty/serial/ucc_uart.c
+++ b/drivers/tty/serial/ucc_uart.c
@@ -469,7 +469,7 @@ static void qe_uart_int_rx(struct uart_qe_port *qe_port)
469 int i; 469 int i;
470 unsigned char ch, *cp; 470 unsigned char ch, *cp;
471 struct uart_port *port = &qe_port->port; 471 struct uart_port *port = &qe_port->port;
472 struct tty_struct *tty = port->state->port.tty; 472 struct tty_port *tport = &port->state->port;
473 struct qe_bd *bdp; 473 struct qe_bd *bdp;
474 u16 status; 474 u16 status;
475 unsigned int flg; 475 unsigned int flg;
@@ -491,7 +491,7 @@ static void qe_uart_int_rx(struct uart_qe_port *qe_port)
491 /* If we don't have enough room in RX buffer for the entire BD, 491 /* If we don't have enough room in RX buffer for the entire BD,
492 * then we try later, which will be the next RX interrupt. 492 * then we try later, which will be the next RX interrupt.
493 */ 493 */
494 if (tty_buffer_request_room(tty, i) < i) { 494 if (tty_buffer_request_room(tport, i) < i) {
495 dev_dbg(port->dev, "ucc-uart: no room in RX buffer\n"); 495 dev_dbg(port->dev, "ucc-uart: no room in RX buffer\n");
496 return; 496 return;
497 } 497 }
@@ -512,7 +512,7 @@ static void qe_uart_int_rx(struct uart_qe_port *qe_port)
512 continue; 512 continue;
513 513
514error_return: 514error_return:
515 tty_insert_flip_char(tty, ch, flg); 515 tty_insert_flip_char(tport, ch, flg);
516 516
517 } 517 }
518 518
@@ -530,7 +530,7 @@ error_return:
530 qe_port->rx_cur = bdp; 530 qe_port->rx_cur = bdp;
531 531
532 /* Activate BH processing */ 532 /* Activate BH processing */
533 tty_flip_buffer_push(tty); 533 tty_flip_buffer_push(tport);
534 534
535 return; 535 return;
536 536
@@ -560,7 +560,7 @@ handle_error:
560 560
561 /* Overrun does not affect the current character ! */ 561 /* Overrun does not affect the current character ! */
562 if (status & BD_SC_OV) 562 if (status & BD_SC_OV)
563 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 563 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
564#ifdef SUPPORT_SYSRQ 564#ifdef SUPPORT_SYSRQ
565 port->sysrq = 0; 565 port->sysrq = 0;
566#endif 566#endif
diff --git a/drivers/tty/serial/vr41xx_siu.c b/drivers/tty/serial/vr41xx_siu.c
index 62ee0166bc65..f655997f44af 100644
--- a/drivers/tty/serial/vr41xx_siu.c
+++ b/drivers/tty/serial/vr41xx_siu.c
@@ -313,12 +313,10 @@ static void siu_break_ctl(struct uart_port *port, int ctl)
313 313
314static inline void receive_chars(struct uart_port *port, uint8_t *status) 314static inline void receive_chars(struct uart_port *port, uint8_t *status)
315{ 315{
316 struct tty_struct *tty;
317 uint8_t lsr, ch; 316 uint8_t lsr, ch;
318 char flag; 317 char flag;
319 int max_count = RX_MAX_COUNT; 318 int max_count = RX_MAX_COUNT;
320 319
321 tty = port->state->port.tty;
322 lsr = *status; 320 lsr = *status;
323 321
324 do { 322 do {
@@ -365,7 +363,7 @@ static inline void receive_chars(struct uart_port *port, uint8_t *status)
365 lsr = siu_read(port, UART_LSR); 363 lsr = siu_read(port, UART_LSR);
366 } while ((lsr & UART_LSR_DR) && (max_count-- > 0)); 364 } while ((lsr & UART_LSR_DR) && (max_count-- > 0));
367 365
368 tty_flip_buffer_push(tty); 366 tty_flip_buffer_push(&port->state->port);
369 367
370 *status = lsr; 368 *status = lsr;
371} 369}
diff --git a/drivers/tty/serial/vt8500_serial.c b/drivers/tty/serial/vt8500_serial.c
index d5ed9f613005..a3f9dd5c9dff 100644
--- a/drivers/tty/serial/vt8500_serial.c
+++ b/drivers/tty/serial/vt8500_serial.c
@@ -136,22 +136,14 @@ static void vt8500_enable_ms(struct uart_port *port)
136 136
137static void handle_rx(struct uart_port *port) 137static void handle_rx(struct uart_port *port)
138{ 138{
139 struct tty_struct *tty = tty_port_tty_get(&port->state->port); 139 struct tty_port *tport = &port->state->port;
140 if (!tty) {
141 /* Discard data: no tty available */
142 int count = (vt8500_read(port, VT8500_URFIDX) & 0x1f00) >> 8;
143 u16 ch;
144 while (count--)
145 ch = readw(port->membase + VT8500_RXFIFO);
146 return;
147 }
148 140
149 /* 141 /*
150 * Handle overrun 142 * Handle overrun
151 */ 143 */
152 if ((vt8500_read(port, VT8500_URISR) & RXOVER)) { 144 if ((vt8500_read(port, VT8500_URISR) & RXOVER)) {
153 port->icount.overrun++; 145 port->icount.overrun++;
154 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 146 tty_insert_flip_char(tport, 0, TTY_OVERRUN);
155 } 147 }
156 148
157 /* and now the main RX loop */ 149 /* and now the main RX loop */
@@ -174,11 +166,10 @@ static void handle_rx(struct uart_port *port)
174 port->icount.rx++; 166 port->icount.rx++;
175 167
176 if (!uart_handle_sysrq_char(port, c)) 168 if (!uart_handle_sysrq_char(port, c))
177 tty_insert_flip_char(tty, c, flag); 169 tty_insert_flip_char(tport, c, flag);
178 } 170 }
179 171
180 tty_flip_buffer_push(tty); 172 tty_flip_buffer_push(tport);
181 tty_kref_put(tty);
182} 173}
183 174
184static void handle_tx(struct uart_port *port) 175static void handle_tx(struct uart_port *port)
@@ -569,7 +560,7 @@ static int vt8500_serial_probe(struct platform_device *pdev)
569 560
570 if (np) 561 if (np)
571 port = of_alias_get_id(np, "serial"); 562 port = of_alias_get_id(np, "serial");
572 if (port > VT8500_MAX_PORTS) 563 if (port >= VT8500_MAX_PORTS)
573 port = -1; 564 port = -1;
574 else 565 else
575 port = -1; 566 port = -1;
@@ -580,7 +571,7 @@ static int vt8500_serial_probe(struct platform_device *pdev)
580 sizeof(vt8500_ports_in_use)); 571 sizeof(vt8500_ports_in_use));
581 } 572 }
582 573
583 if (port > VT8500_MAX_PORTS) 574 if (port >= VT8500_MAX_PORTS)
584 return -ENODEV; 575 return -ENODEV;
585 576
586 /* reserve the port id */ 577 /* reserve the port id */
@@ -589,10 +580,27 @@ static int vt8500_serial_probe(struct platform_device *pdev)
589 return -EBUSY; 580 return -EBUSY;
590 } 581 }
591 582
592 vt8500_port = kzalloc(sizeof(struct vt8500_port), GFP_KERNEL); 583 vt8500_port = devm_kzalloc(&pdev->dev, sizeof(struct vt8500_port),
584 GFP_KERNEL);
593 if (!vt8500_port) 585 if (!vt8500_port)
594 return -ENOMEM; 586 return -ENOMEM;
595 587
588 vt8500_port->uart.membase = devm_request_and_ioremap(&pdev->dev, mmres);
589 if (!vt8500_port->uart.membase)
590 return -EADDRNOTAVAIL;
591
592 vt8500_port->clk = of_clk_get(pdev->dev.of_node, 0);
593 if (IS_ERR(vt8500_port->clk)) {
594 dev_err(&pdev->dev, "failed to get clock\n");
595 return -EINVAL;
596 }
597
598 ret = clk_prepare_enable(vt8500_port->clk);
599 if (ret) {
600 dev_err(&pdev->dev, "failed to enable clock\n");
601 return ret;
602 }
603
596 vt8500_port->uart.type = PORT_VT8500; 604 vt8500_port->uart.type = PORT_VT8500;
597 vt8500_port->uart.iotype = UPIO_MEM; 605 vt8500_port->uart.iotype = UPIO_MEM;
598 vt8500_port->uart.mapbase = mmres->start; 606 vt8500_port->uart.mapbase = mmres->start;
@@ -615,12 +623,6 @@ static int vt8500_serial_probe(struct platform_device *pdev)
615 snprintf(vt8500_port->name, sizeof(vt8500_port->name), 623 snprintf(vt8500_port->name, sizeof(vt8500_port->name),
616 "VT8500 UART%d", pdev->id); 624 "VT8500 UART%d", pdev->id);
617 625
618 vt8500_port->uart.membase = ioremap(mmres->start, resource_size(mmres));
619 if (!vt8500_port->uart.membase) {
620 ret = -ENOMEM;
621 goto err;
622 }
623
624 vt8500_uart_ports[port] = vt8500_port; 626 vt8500_uart_ports[port] = vt8500_port;
625 627
626 uart_add_one_port(&vt8500_uart_driver, &vt8500_port->uart); 628 uart_add_one_port(&vt8500_uart_driver, &vt8500_port->uart);
@@ -628,10 +630,6 @@ static int vt8500_serial_probe(struct platform_device *pdev)
628 platform_set_drvdata(pdev, vt8500_port); 630 platform_set_drvdata(pdev, vt8500_port);
629 631
630 return 0; 632 return 0;
631
632err:
633 kfree(vt8500_port);
634 return ret;
635} 633}
636 634
637static int vt8500_serial_remove(struct platform_device *pdev) 635static int vt8500_serial_remove(struct platform_device *pdev)
@@ -639,8 +637,8 @@ static int vt8500_serial_remove(struct platform_device *pdev)
639 struct vt8500_port *vt8500_port = platform_get_drvdata(pdev); 637 struct vt8500_port *vt8500_port = platform_get_drvdata(pdev);
640 638
641 platform_set_drvdata(pdev, NULL); 639 platform_set_drvdata(pdev, NULL);
640 clk_disable_unprepare(vt8500_port->clk);
642 uart_remove_one_port(&vt8500_uart_driver, &vt8500_port->uart); 641 uart_remove_one_port(&vt8500_uart_driver, &vt8500_port->uart);
643 kfree(vt8500_port);
644 642
645 return 0; 643 return 0;
646} 644}
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 9ab910370c56..ba451c7209fc 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -17,6 +17,7 @@
17#include <linux/tty.h> 17#include <linux/tty.h>
18#include <linux/tty_flip.h> 18#include <linux/tty_flip.h>
19#include <linux/console.h> 19#include <linux/console.h>
20#include <linux/clk.h>
20#include <linux/irq.h> 21#include <linux/irq.h>
21#include <linux/io.h> 22#include <linux/io.h>
22#include <linux/of.h> 23#include <linux/of.h>
@@ -147,15 +148,11 @@
147static irqreturn_t xuartps_isr(int irq, void *dev_id) 148static irqreturn_t xuartps_isr(int irq, void *dev_id)
148{ 149{
149 struct uart_port *port = (struct uart_port *)dev_id; 150 struct uart_port *port = (struct uart_port *)dev_id;
150 struct tty_struct *tty;
151 unsigned long flags; 151 unsigned long flags;
152 unsigned int isrstatus, numbytes; 152 unsigned int isrstatus, numbytes;
153 unsigned int data; 153 unsigned int data;
154 char status = TTY_NORMAL; 154 char status = TTY_NORMAL;
155 155
156 /* Get the tty which could be NULL so don't assume it's valid */
157 tty = tty_port_tty_get(&port->state->port);
158
159 spin_lock_irqsave(&port->lock, flags); 156 spin_lock_irqsave(&port->lock, flags);
160 157
161 /* Read the interrupt status register to determine which 158 /* Read the interrupt status register to determine which
@@ -187,14 +184,11 @@ static irqreturn_t xuartps_isr(int irq, void *dev_id)
187 } else if (isrstatus & XUARTPS_IXR_OVERRUN) 184 } else if (isrstatus & XUARTPS_IXR_OVERRUN)
188 port->icount.overrun++; 185 port->icount.overrun++;
189 186
190 if (tty) 187 uart_insert_char(port, isrstatus, XUARTPS_IXR_OVERRUN,
191 uart_insert_char(port, isrstatus, 188 data, status);
192 XUARTPS_IXR_OVERRUN, data,
193 status);
194 } 189 }
195 spin_unlock(&port->lock); 190 spin_unlock(&port->lock);
196 if (tty) 191 tty_flip_buffer_push(&port->state->port);
197 tty_flip_buffer_push(tty);
198 spin_lock(&port->lock); 192 spin_lock(&port->lock);
199 } 193 }
200 194
@@ -237,7 +231,6 @@ static irqreturn_t xuartps_isr(int irq, void *dev_id)
237 231
238 /* be sure to release the lock and tty before leaving */ 232 /* be sure to release the lock and tty before leaving */
239 spin_unlock_irqrestore(&port->lock, flags); 233 spin_unlock_irqrestore(&port->lock, flags);
240 tty_kref_put(tty);
241 234
242 return IRQ_HANDLED; 235 return IRQ_HANDLED;
243} 236}
@@ -944,16 +937,18 @@ static int xuartps_probe(struct platform_device *pdev)
944 int rc; 937 int rc;
945 struct uart_port *port; 938 struct uart_port *port;
946 struct resource *res, *res2; 939 struct resource *res, *res2;
947 int clk = 0; 940 struct clk *clk;
948
949 const unsigned int *prop;
950 941
951 prop = of_get_property(pdev->dev.of_node, "clock", NULL); 942 clk = of_clk_get(pdev->dev.of_node, 0);
952 if (prop) 943 if (IS_ERR(clk)) {
953 clk = be32_to_cpup(prop);
954 if (!clk) {
955 dev_err(&pdev->dev, "no clock specified\n"); 944 dev_err(&pdev->dev, "no clock specified\n");
956 return -ENODEV; 945 return PTR_ERR(clk);
946 }
947
948 rc = clk_prepare_enable(clk);
949 if (rc) {
950 dev_err(&pdev->dev, "could not enable clock\n");
951 return -EBUSY;
957 } 952 }
958 953
959 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 954 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -978,7 +973,8 @@ static int xuartps_probe(struct platform_device *pdev)
978 port->mapbase = res->start; 973 port->mapbase = res->start;
979 port->irq = res2->start; 974 port->irq = res2->start;
980 port->dev = &pdev->dev; 975 port->dev = &pdev->dev;
981 port->uartclk = clk; 976 port->uartclk = clk_get_rate(clk);
977 port->private_data = clk;
982 dev_set_drvdata(&pdev->dev, port); 978 dev_set_drvdata(&pdev->dev, port);
983 rc = uart_add_one_port(&xuartps_uart_driver, port); 979 rc = uart_add_one_port(&xuartps_uart_driver, port);
984 if (rc) { 980 if (rc) {
@@ -1000,14 +996,14 @@ static int xuartps_probe(struct platform_device *pdev)
1000static int xuartps_remove(struct platform_device *pdev) 996static int xuartps_remove(struct platform_device *pdev)
1001{ 997{
1002 struct uart_port *port = dev_get_drvdata(&pdev->dev); 998 struct uart_port *port = dev_get_drvdata(&pdev->dev);
1003 int rc = 0; 999 struct clk *clk = port->private_data;
1000 int rc;
1004 1001
1005 /* Remove the xuartps port from the serial core */ 1002 /* Remove the xuartps port from the serial core */
1006 if (port) { 1003 rc = uart_remove_one_port(&xuartps_uart_driver, port);
1007 rc = uart_remove_one_port(&xuartps_uart_driver, port); 1004 dev_set_drvdata(&pdev->dev, NULL);
1008 dev_set_drvdata(&pdev->dev, NULL); 1005 port->mapbase = 0;
1009 port->mapbase = 0; 1006 clk_disable_unprepare(clk);
1010 }
1011 return rc; 1007 return rc;
1012} 1008}
1013 1009
@@ -1048,7 +1044,7 @@ MODULE_DEVICE_TABLE(of, xuartps_of_match);
1048 1044
1049static struct platform_driver xuartps_platform_driver = { 1045static struct platform_driver xuartps_platform_driver = {
1050 .probe = xuartps_probe, /* Probe method */ 1046 .probe = xuartps_probe, /* Probe method */
1051 .remove = __exit_p(xuartps_remove), /* Detach method */ 1047 .remove = xuartps_remove, /* Detach method */
1052 .suspend = xuartps_suspend, /* Suspend */ 1048 .suspend = xuartps_suspend, /* Suspend */
1053 .resume = xuartps_resume, /* Resume after a suspend */ 1049 .resume = xuartps_resume, /* Resume after a suspend */
1054 .driver = { 1050 .driver = {
diff --git a/drivers/tty/serial/zs.c b/drivers/tty/serial/zs.c
index 92c00b24d0df..6a169877109b 100644
--- a/drivers/tty/serial/zs.c
+++ b/drivers/tty/serial/zs.c
@@ -603,7 +603,7 @@ static void zs_receive_chars(struct zs_port *zport)
603 uart_insert_char(uport, status, Rx_OVR, ch, flag); 603 uart_insert_char(uport, status, Rx_OVR, ch, flag);
604 } 604 }
605 605
606 tty_flip_buffer_push(uport->state->port.tty); 606 tty_flip_buffer_push(&uport->state->port);
607} 607}
608 608
609static void zs_raw_transmit_chars(struct zs_port *zport) 609static void zs_raw_transmit_chars(struct zs_port *zport)
diff --git a/drivers/tty/synclink.c b/drivers/tty/synclink.c
index 9e071f6985f6..555fdc0ed0f1 100644
--- a/drivers/tty/synclink.c
+++ b/drivers/tty/synclink.c
@@ -291,8 +291,7 @@ struct mgsl_struct {
291 bool lcr_mem_requested; 291 bool lcr_mem_requested;
292 292
293 u32 misc_ctrl_value; 293 u32 misc_ctrl_value;
294 char flag_buf[MAX_ASYNC_BUFFER_SIZE]; 294 char *flag_buf;
295 char char_buf[MAX_ASYNC_BUFFER_SIZE];
296 bool drop_rts_on_tx_done; 295 bool drop_rts_on_tx_done;
297 296
298 bool loopmode_insert_requested; 297 bool loopmode_insert_requested;
@@ -1440,7 +1439,6 @@ static void mgsl_isr_receive_data( struct mgsl_struct *info )
1440 u16 status; 1439 u16 status;
1441 int work = 0; 1440 int work = 0;
1442 unsigned char DataByte; 1441 unsigned char DataByte;
1443 struct tty_struct *tty = info->port.tty;
1444 struct mgsl_icount *icount = &info->icount; 1442 struct mgsl_icount *icount = &info->icount;
1445 1443
1446 if ( debug_level >= DEBUG_LEVEL_ISR ) 1444 if ( debug_level >= DEBUG_LEVEL_ISR )
@@ -1502,19 +1500,19 @@ static void mgsl_isr_receive_data( struct mgsl_struct *info )
1502 if (status & RXSTATUS_BREAK_RECEIVED) { 1500 if (status & RXSTATUS_BREAK_RECEIVED) {
1503 flag = TTY_BREAK; 1501 flag = TTY_BREAK;
1504 if (info->port.flags & ASYNC_SAK) 1502 if (info->port.flags & ASYNC_SAK)
1505 do_SAK(tty); 1503 do_SAK(info->port.tty);
1506 } else if (status & RXSTATUS_PARITY_ERROR) 1504 } else if (status & RXSTATUS_PARITY_ERROR)
1507 flag = TTY_PARITY; 1505 flag = TTY_PARITY;
1508 else if (status & RXSTATUS_FRAMING_ERROR) 1506 else if (status & RXSTATUS_FRAMING_ERROR)
1509 flag = TTY_FRAME; 1507 flag = TTY_FRAME;
1510 } /* end of if (error) */ 1508 } /* end of if (error) */
1511 tty_insert_flip_char(tty, DataByte, flag); 1509 tty_insert_flip_char(&info->port, DataByte, flag);
1512 if (status & RXSTATUS_OVERRUN) { 1510 if (status & RXSTATUS_OVERRUN) {
1513 /* Overrun is special, since it's 1511 /* Overrun is special, since it's
1514 * reported immediately, and doesn't 1512 * reported immediately, and doesn't
1515 * affect the current character 1513 * affect the current character
1516 */ 1514 */
1517 work += tty_insert_flip_char(tty, 0, TTY_OVERRUN); 1515 work += tty_insert_flip_char(&info->port, 0, TTY_OVERRUN);
1518 } 1516 }
1519 } 1517 }
1520 1518
@@ -1525,7 +1523,7 @@ static void mgsl_isr_receive_data( struct mgsl_struct *info )
1525 } 1523 }
1526 1524
1527 if(work) 1525 if(work)
1528 tty_flip_buffer_push(tty); 1526 tty_flip_buffer_push(&info->port);
1529} 1527}
1530 1528
1531/* mgsl_isr_misc() 1529/* mgsl_isr_misc()
@@ -3416,7 +3414,7 @@ static int mgsl_open(struct tty_struct *tty, struct file * filp)
3416 goto cleanup; 3414 goto cleanup;
3417 } 3415 }
3418 3416
3419 info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; 3417 info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
3420 3418
3421 spin_lock_irqsave(&info->netlock, flags); 3419 spin_lock_irqsave(&info->netlock, flags);
3422 if (info->netcount) { 3420 if (info->netcount) {
@@ -3898,7 +3896,13 @@ static int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info)
3898 info->intermediate_rxbuffer = kmalloc(info->max_frame_size, GFP_KERNEL | GFP_DMA); 3896 info->intermediate_rxbuffer = kmalloc(info->max_frame_size, GFP_KERNEL | GFP_DMA);
3899 if ( info->intermediate_rxbuffer == NULL ) 3897 if ( info->intermediate_rxbuffer == NULL )
3900 return -ENOMEM; 3898 return -ENOMEM;
3901 3899 /* unused flag buffer to satisfy receive_buf calling interface */
3900 info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
3901 if (!info->flag_buf) {
3902 kfree(info->intermediate_rxbuffer);
3903 info->intermediate_rxbuffer = NULL;
3904 return -ENOMEM;
3905 }
3902 return 0; 3906 return 0;
3903 3907
3904} /* end of mgsl_alloc_intermediate_rxbuffer_memory() */ 3908} /* end of mgsl_alloc_intermediate_rxbuffer_memory() */
@@ -3917,6 +3921,8 @@ static void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info)
3917{ 3921{
3918 kfree(info->intermediate_rxbuffer); 3922 kfree(info->intermediate_rxbuffer);
3919 info->intermediate_rxbuffer = NULL; 3923 info->intermediate_rxbuffer = NULL;
3924 kfree(info->flag_buf);
3925 info->flag_buf = NULL;
3920 3926
3921} /* end of mgsl_free_intermediate_rxbuffer_memory() */ 3927} /* end of mgsl_free_intermediate_rxbuffer_memory() */
3922 3928
diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c
index aba1e59f4a88..ac8599a76820 100644
--- a/drivers/tty/synclink_gt.c
+++ b/drivers/tty/synclink_gt.c
@@ -317,8 +317,7 @@ struct slgt_info {
317 unsigned char *tx_buf; 317 unsigned char *tx_buf;
318 int tx_count; 318 int tx_count;
319 319
320 char flag_buf[MAX_ASYNC_BUFFER_SIZE]; 320 char *flag_buf;
321 char char_buf[MAX_ASYNC_BUFFER_SIZE];
322 bool drop_rts_on_tx_done; 321 bool drop_rts_on_tx_done;
323 struct _input_signal_events input_signal_events; 322 struct _input_signal_events input_signal_events;
324 323
@@ -683,7 +682,7 @@ static int open(struct tty_struct *tty, struct file *filp)
683 } 682 }
684 683
685 mutex_lock(&info->port.mutex); 684 mutex_lock(&info->port.mutex);
686 info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; 685 info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
687 686
688 spin_lock_irqsave(&info->netlock, flags); 687 spin_lock_irqsave(&info->netlock, flags);
689 if (info->netcount) { 688 if (info->netcount) {
@@ -1855,7 +1854,6 @@ static void hdlcdev_exit(struct slgt_info *info)
1855 */ 1854 */
1856static void rx_async(struct slgt_info *info) 1855static void rx_async(struct slgt_info *info)
1857{ 1856{
1858 struct tty_struct *tty = info->port.tty;
1859 struct mgsl_icount *icount = &info->icount; 1857 struct mgsl_icount *icount = &info->icount;
1860 unsigned int start, end; 1858 unsigned int start, end;
1861 unsigned char *p; 1859 unsigned char *p;
@@ -1894,10 +1892,8 @@ static void rx_async(struct slgt_info *info)
1894 else if (status & BIT0) 1892 else if (status & BIT0)
1895 stat = TTY_FRAME; 1893 stat = TTY_FRAME;
1896 } 1894 }
1897 if (tty) { 1895 tty_insert_flip_char(&info->port, ch, stat);
1898 tty_insert_flip_char(tty, ch, stat); 1896 chars++;
1899 chars++;
1900 }
1901 } 1897 }
1902 1898
1903 if (i < count) { 1899 if (i < count) {
@@ -1918,8 +1914,8 @@ static void rx_async(struct slgt_info *info)
1918 break; 1914 break;
1919 } 1915 }
1920 1916
1921 if (tty && chars) 1917 if (chars)
1922 tty_flip_buffer_push(tty); 1918 tty_flip_buffer_push(&info->port);
1923} 1919}
1924 1920
1925/* 1921/*
@@ -1961,8 +1957,6 @@ static void bh_handler(struct work_struct *work)
1961 struct slgt_info *info = container_of(work, struct slgt_info, task); 1957 struct slgt_info *info = container_of(work, struct slgt_info, task);
1962 int action; 1958 int action;
1963 1959
1964 if (!info)
1965 return;
1966 info->bh_running = true; 1960 info->bh_running = true;
1967 1961
1968 while((action = bh_action(info))) { 1962 while((action = bh_action(info))) {
@@ -2183,7 +2177,7 @@ static void isr_serial(struct slgt_info *info)
2183 if (info->port.tty) { 2177 if (info->port.tty) {
2184 if (!(status & info->ignore_status_mask)) { 2178 if (!(status & info->ignore_status_mask)) {
2185 if (info->read_status_mask & MASK_BREAK) { 2179 if (info->read_status_mask & MASK_BREAK) {
2186 tty_insert_flip_char(info->port.tty, 0, TTY_BREAK); 2180 tty_insert_flip_char(&info->port, 0, TTY_BREAK);
2187 if (info->port.flags & ASYNC_SAK) 2181 if (info->port.flags & ASYNC_SAK)
2188 do_SAK(info->port.tty); 2182 do_SAK(info->port.tty);
2189 } 2183 }
@@ -3355,11 +3349,24 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
3355 return retval; 3349 return retval;
3356} 3350}
3357 3351
3352/*
3353 * allocate buffers used for calling line discipline receive_buf
3354 * directly in synchronous mode
3355 * note: add 5 bytes to max frame size to allow appending
3356 * 32-bit CRC and status byte when configured to do so
3357 */
3358static int alloc_tmp_rbuf(struct slgt_info *info) 3358static int alloc_tmp_rbuf(struct slgt_info *info)
3359{ 3359{
3360 info->tmp_rbuf = kmalloc(info->max_frame_size + 5, GFP_KERNEL); 3360 info->tmp_rbuf = kmalloc(info->max_frame_size + 5, GFP_KERNEL);
3361 if (info->tmp_rbuf == NULL) 3361 if (info->tmp_rbuf == NULL)
3362 return -ENOMEM; 3362 return -ENOMEM;
3363 /* unused flag buffer to satisfy receive_buf calling interface */
3364 info->flag_buf = kzalloc(info->max_frame_size + 5, GFP_KERNEL);
3365 if (!info->flag_buf) {
3366 kfree(info->tmp_rbuf);
3367 info->tmp_rbuf = NULL;
3368 return -ENOMEM;
3369 }
3363 return 0; 3370 return 0;
3364} 3371}
3365 3372
@@ -3367,6 +3374,8 @@ static void free_tmp_rbuf(struct slgt_info *info)
3367{ 3374{
3368 kfree(info->tmp_rbuf); 3375 kfree(info->tmp_rbuf);
3369 info->tmp_rbuf = NULL; 3376 info->tmp_rbuf = NULL;
3377 kfree(info->flag_buf);
3378 info->flag_buf = NULL;
3370} 3379}
3371 3380
3372/* 3381/*
diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c
index fd43fb6f7cee..545402509cab 100644
--- a/drivers/tty/synclinkmp.c
+++ b/drivers/tty/synclinkmp.c
@@ -262,8 +262,7 @@ typedef struct _synclinkmp_info {
262 bool sca_statctrl_requested; 262 bool sca_statctrl_requested;
263 263
264 u32 misc_ctrl_value; 264 u32 misc_ctrl_value;
265 char flag_buf[MAX_ASYNC_BUFFER_SIZE]; 265 char *flag_buf;
266 char char_buf[MAX_ASYNC_BUFFER_SIZE];
267 bool drop_rts_on_tx_done; 266 bool drop_rts_on_tx_done;
268 267
269 struct _input_signal_events input_signal_events; 268 struct _input_signal_events input_signal_events;
@@ -762,7 +761,7 @@ static int open(struct tty_struct *tty, struct file *filp)
762 goto cleanup; 761 goto cleanup;
763 } 762 }
764 763
765 info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; 764 info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
766 765
767 spin_lock_irqsave(&info->netlock, flags); 766 spin_lock_irqsave(&info->netlock, flags);
768 if (info->netcount) { 767 if (info->netcount) {
@@ -2008,9 +2007,6 @@ static void bh_handler(struct work_struct *work)
2008 SLMP_INFO *info = container_of(work, SLMP_INFO, task); 2007 SLMP_INFO *info = container_of(work, SLMP_INFO, task);
2009 int action; 2008 int action;
2010 2009
2011 if (!info)
2012 return;
2013
2014 if ( debug_level >= DEBUG_LEVEL_BH ) 2010 if ( debug_level >= DEBUG_LEVEL_BH )
2015 printk( "%s(%d):%s bh_handler() entry\n", 2011 printk( "%s(%d):%s bh_handler() entry\n",
2016 __FILE__,__LINE__,info->device_name); 2012 __FILE__,__LINE__,info->device_name);
@@ -2132,13 +2128,11 @@ static void isr_rxint(SLMP_INFO * info)
2132 /* process break detection if tty control 2128 /* process break detection if tty control
2133 * is not set to ignore it 2129 * is not set to ignore it
2134 */ 2130 */
2135 if ( tty ) { 2131 if (!(status & info->ignore_status_mask1)) {
2136 if (!(status & info->ignore_status_mask1)) { 2132 if (info->read_status_mask1 & BRKD) {
2137 if (info->read_status_mask1 & BRKD) { 2133 tty_insert_flip_char(&info->port, 0, TTY_BREAK);
2138 tty_insert_flip_char(tty, 0, TTY_BREAK); 2134 if (tty && (info->port.flags & ASYNC_SAK))
2139 if (info->port.flags & ASYNC_SAK) 2135 do_SAK(tty);
2140 do_SAK(tty);
2141 }
2142 } 2136 }
2143 } 2137 }
2144 } 2138 }
@@ -2170,7 +2164,6 @@ static void isr_rxrdy(SLMP_INFO * info)
2170{ 2164{
2171 u16 status; 2165 u16 status;
2172 unsigned char DataByte; 2166 unsigned char DataByte;
2173 struct tty_struct *tty = info->port.tty;
2174 struct mgsl_icount *icount = &info->icount; 2167 struct mgsl_icount *icount = &info->icount;
2175 2168
2176 if ( debug_level >= DEBUG_LEVEL_ISR ) 2169 if ( debug_level >= DEBUG_LEVEL_ISR )
@@ -2203,26 +2196,22 @@ static void isr_rxrdy(SLMP_INFO * info)
2203 2196
2204 status &= info->read_status_mask2; 2197 status &= info->read_status_mask2;
2205 2198
2206 if ( tty ) { 2199 if (status & PE)
2207 if (status & PE) 2200 flag = TTY_PARITY;
2208 flag = TTY_PARITY; 2201 else if (status & FRME)
2209 else if (status & FRME) 2202 flag = TTY_FRAME;
2210 flag = TTY_FRAME; 2203 if (status & OVRN) {
2211 if (status & OVRN) { 2204 /* Overrun is special, since it's
2212 /* Overrun is special, since it's 2205 * reported immediately, and doesn't
2213 * reported immediately, and doesn't 2206 * affect the current character
2214 * affect the current character 2207 */
2215 */ 2208 over = true;
2216 over = true;
2217 }
2218 } 2209 }
2219 } /* end of if (error) */ 2210 } /* end of if (error) */
2220 2211
2221 if ( tty ) { 2212 tty_insert_flip_char(&info->port, DataByte, flag);
2222 tty_insert_flip_char(tty, DataByte, flag); 2213 if (over)
2223 if (over) 2214 tty_insert_flip_char(&info->port, 0, TTY_OVERRUN);
2224 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
2225 }
2226 } 2215 }
2227 2216
2228 if ( debug_level >= DEBUG_LEVEL_ISR ) { 2217 if ( debug_level >= DEBUG_LEVEL_ISR ) {
@@ -2232,8 +2221,7 @@ static void isr_rxrdy(SLMP_INFO * info)
2232 icount->frame,icount->overrun); 2221 icount->frame,icount->overrun);
2233 } 2222 }
2234 2223
2235 if ( tty ) 2224 tty_flip_buffer_push(&info->port);
2236 tty_flip_buffer_push(tty);
2237} 2225}
2238 2226
2239static void isr_txeom(SLMP_INFO * info, unsigned char status) 2227static void isr_txeom(SLMP_INFO * info, unsigned char status)
@@ -3553,6 +3541,13 @@ static int alloc_tmp_rx_buf(SLMP_INFO *info)
3553 info->tmp_rx_buf = kmalloc(info->max_frame_size, GFP_KERNEL); 3541 info->tmp_rx_buf = kmalloc(info->max_frame_size, GFP_KERNEL);
3554 if (info->tmp_rx_buf == NULL) 3542 if (info->tmp_rx_buf == NULL)
3555 return -ENOMEM; 3543 return -ENOMEM;
3544 /* unused flag buffer to satisfy receive_buf calling interface */
3545 info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
3546 if (!info->flag_buf) {
3547 kfree(info->tmp_rx_buf);
3548 info->tmp_rx_buf = NULL;
3549 return -ENOMEM;
3550 }
3556 return 0; 3551 return 0;
3557} 3552}
3558 3553
@@ -3560,6 +3555,8 @@ static void free_tmp_rx_buf(SLMP_INFO *info)
3560{ 3555{
3561 kfree(info->tmp_rx_buf); 3556 kfree(info->tmp_rx_buf);
3562 info->tmp_rx_buf = NULL; 3557 info->tmp_rx_buf = NULL;
3558 kfree(info->flag_buf);
3559 info->flag_buf = NULL;
3563} 3560}
3564 3561
3565static int claim_resources(SLMP_INFO *info) 3562static int claim_resources(SLMP_INFO *info)
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index 45d916198f78..61ec4ddf47e0 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -119,11 +119,14 @@ static void __tty_buffer_flush(struct tty_port *port)
119 struct tty_bufhead *buf = &port->buf; 119 struct tty_bufhead *buf = &port->buf;
120 struct tty_buffer *thead; 120 struct tty_buffer *thead;
121 121
122 while ((thead = buf->head) != NULL) { 122 if (unlikely(buf->head == NULL))
123 buf->head = thead->next; 123 return;
124 tty_buffer_free(port, thead); 124 while ((thead = buf->head->next) != NULL) {
125 tty_buffer_free(port, buf->head);
126 buf->head = thead;
125 } 127 }
126 buf->tail = NULL; 128 WARN_ON(buf->head != buf->tail);
129 buf->head->read = buf->head->commit;
127} 130}
128 131
129/** 132/**
@@ -194,19 +197,22 @@ static struct tty_buffer *tty_buffer_find(struct tty_port *port, size_t size)
194 have queued and recycle that ? */ 197 have queued and recycle that ? */
195} 198}
196/** 199/**
197 * __tty_buffer_request_room - grow tty buffer if needed 200 * tty_buffer_request_room - grow tty buffer if needed
198 * @tty: tty structure 201 * @tty: tty structure
199 * @size: size desired 202 * @size: size desired
200 * 203 *
201 * Make at least size bytes of linear space available for the tty 204 * Make at least size bytes of linear space available for the tty
202 * buffer. If we fail return the size we managed to find. 205 * buffer. If we fail return the size we managed to find.
203 * Locking: Caller must hold port->buf.lock 206 *
207 * Locking: Takes port->buf.lock
204 */ 208 */
205static int __tty_buffer_request_room(struct tty_port *port, size_t size) 209int tty_buffer_request_room(struct tty_port *port, size_t size)
206{ 210{
207 struct tty_bufhead *buf = &port->buf; 211 struct tty_bufhead *buf = &port->buf;
208 struct tty_buffer *b, *n; 212 struct tty_buffer *b, *n;
209 int left; 213 int left;
214 unsigned long flags;
215 spin_lock_irqsave(&buf->lock, flags);
210 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to 216 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to
211 remove this conditional if its worth it. This would be invisible 217 remove this conditional if its worth it. This would be invisible
212 to the callers */ 218 to the callers */
@@ -228,37 +234,14 @@ static int __tty_buffer_request_room(struct tty_port *port, size_t size)
228 } else 234 } else
229 size = left; 235 size = left;
230 } 236 }
231 237 spin_unlock_irqrestore(&buf->lock, flags);
232 return size; 238 return size;
233} 239}
234
235
236/**
237 * tty_buffer_request_room - grow tty buffer if needed
238 * @tty: tty structure
239 * @size: size desired
240 *
241 * Make at least size bytes of linear space available for the tty
242 * buffer. If we fail return the size we managed to find.
243 *
244 * Locking: Takes port->buf.lock
245 */
246int tty_buffer_request_room(struct tty_struct *tty, size_t size)
247{
248 struct tty_port *port = tty->port;
249 unsigned long flags;
250 int length;
251
252 spin_lock_irqsave(&port->buf.lock, flags);
253 length = __tty_buffer_request_room(port, size);
254 spin_unlock_irqrestore(&port->buf.lock, flags);
255 return length;
256}
257EXPORT_SYMBOL_GPL(tty_buffer_request_room); 240EXPORT_SYMBOL_GPL(tty_buffer_request_room);
258 241
259/** 242/**
260 * tty_insert_flip_string_fixed_flag - Add characters to the tty buffer 243 * tty_insert_flip_string_fixed_flag - Add characters to the tty buffer
261 * @tty: tty structure 244 * @port: tty port
262 * @chars: characters 245 * @chars: characters
263 * @flag: flag value for each character 246 * @flag: flag value for each character
264 * @size: size 247 * @size: size
@@ -269,29 +252,21 @@ EXPORT_SYMBOL_GPL(tty_buffer_request_room);
269 * Locking: Called functions may take port->buf.lock 252 * Locking: Called functions may take port->buf.lock
270 */ 253 */
271 254
272int tty_insert_flip_string_fixed_flag(struct tty_struct *tty, 255int tty_insert_flip_string_fixed_flag(struct tty_port *port,
273 const unsigned char *chars, char flag, size_t size) 256 const unsigned char *chars, char flag, size_t size)
274{ 257{
275 struct tty_bufhead *buf = &tty->port->buf;
276 int copied = 0; 258 int copied = 0;
277 do { 259 do {
278 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE); 260 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
279 int space; 261 int space = tty_buffer_request_room(port, goal);
280 unsigned long flags; 262 struct tty_buffer *tb = port->buf.tail;
281 struct tty_buffer *tb;
282
283 spin_lock_irqsave(&buf->lock, flags);
284 space = __tty_buffer_request_room(tty->port, goal);
285 tb = buf->tail;
286 /* If there is no space then tb may be NULL */ 263 /* If there is no space then tb may be NULL */
287 if (unlikely(space == 0)) { 264 if (unlikely(space == 0)) {
288 spin_unlock_irqrestore(&buf->lock, flags);
289 break; 265 break;
290 } 266 }
291 memcpy(tb->char_buf_ptr + tb->used, chars, space); 267 memcpy(tb->char_buf_ptr + tb->used, chars, space);
292 memset(tb->flag_buf_ptr + tb->used, flag, space); 268 memset(tb->flag_buf_ptr + tb->used, flag, space);
293 tb->used += space; 269 tb->used += space;
294 spin_unlock_irqrestore(&buf->lock, flags);
295 copied += space; 270 copied += space;
296 chars += space; 271 chars += space;
297 /* There is a small chance that we need to split the data over 272 /* There is a small chance that we need to split the data over
@@ -303,7 +278,7 @@ EXPORT_SYMBOL(tty_insert_flip_string_fixed_flag);
303 278
304/** 279/**
305 * tty_insert_flip_string_flags - Add characters to the tty buffer 280 * tty_insert_flip_string_flags - Add characters to the tty buffer
306 * @tty: tty structure 281 * @port: tty port
307 * @chars: characters 282 * @chars: characters
308 * @flags: flag bytes 283 * @flags: flag bytes
309 * @size: size 284 * @size: size
@@ -315,29 +290,21 @@ EXPORT_SYMBOL(tty_insert_flip_string_fixed_flag);
315 * Locking: Called functions may take port->buf.lock 290 * Locking: Called functions may take port->buf.lock
316 */ 291 */
317 292
318int tty_insert_flip_string_flags(struct tty_struct *tty, 293int tty_insert_flip_string_flags(struct tty_port *port,
319 const unsigned char *chars, const char *flags, size_t size) 294 const unsigned char *chars, const char *flags, size_t size)
320{ 295{
321 struct tty_bufhead *buf = &tty->port->buf;
322 int copied = 0; 296 int copied = 0;
323 do { 297 do {
324 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE); 298 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
325 int space; 299 int space = tty_buffer_request_room(port, goal);
326 unsigned long __flags; 300 struct tty_buffer *tb = port->buf.tail;
327 struct tty_buffer *tb;
328
329 spin_lock_irqsave(&buf->lock, __flags);
330 space = __tty_buffer_request_room(tty->port, goal);
331 tb = buf->tail;
332 /* If there is no space then tb may be NULL */ 301 /* If there is no space then tb may be NULL */
333 if (unlikely(space == 0)) { 302 if (unlikely(space == 0)) {
334 spin_unlock_irqrestore(&buf->lock, __flags);
335 break; 303 break;
336 } 304 }
337 memcpy(tb->char_buf_ptr + tb->used, chars, space); 305 memcpy(tb->char_buf_ptr + tb->used, chars, space);
338 memcpy(tb->flag_buf_ptr + tb->used, flags, space); 306 memcpy(tb->flag_buf_ptr + tb->used, flags, space);
339 tb->used += space; 307 tb->used += space;
340 spin_unlock_irqrestore(&buf->lock, __flags);
341 copied += space; 308 copied += space;
342 chars += space; 309 chars += space;
343 flags += space; 310 flags += space;
@@ -350,7 +317,7 @@ EXPORT_SYMBOL(tty_insert_flip_string_flags);
350 317
351/** 318/**
352 * tty_schedule_flip - push characters to ldisc 319 * tty_schedule_flip - push characters to ldisc
353 * @tty: tty to push from 320 * @port: tty port to push from
354 * 321 *
355 * Takes any pending buffers and transfers their ownership to the 322 * Takes any pending buffers and transfers their ownership to the
356 * ldisc side of the queue. It then schedules those characters for 323 * ldisc side of the queue. It then schedules those characters for
@@ -361,11 +328,11 @@ EXPORT_SYMBOL(tty_insert_flip_string_flags);
361 * Locking: Takes port->buf.lock 328 * Locking: Takes port->buf.lock
362 */ 329 */
363 330
364void tty_schedule_flip(struct tty_struct *tty) 331void tty_schedule_flip(struct tty_port *port)
365{ 332{
366 struct tty_bufhead *buf = &tty->port->buf; 333 struct tty_bufhead *buf = &port->buf;
367 unsigned long flags; 334 unsigned long flags;
368 WARN_ON(tty->low_latency); 335 WARN_ON(port->low_latency);
369 336
370 spin_lock_irqsave(&buf->lock, flags); 337 spin_lock_irqsave(&buf->lock, flags);
371 if (buf->tail != NULL) 338 if (buf->tail != NULL)
@@ -377,7 +344,7 @@ EXPORT_SYMBOL(tty_schedule_flip);
377 344
378/** 345/**
379 * tty_prepare_flip_string - make room for characters 346 * tty_prepare_flip_string - make room for characters
380 * @tty: tty 347 * @port: tty port
381 * @chars: return pointer for character write area 348 * @chars: return pointer for character write area
382 * @size: desired size 349 * @size: desired size
383 * 350 *
@@ -390,31 +357,23 @@ EXPORT_SYMBOL(tty_schedule_flip);
390 * Locking: May call functions taking port->buf.lock 357 * Locking: May call functions taking port->buf.lock
391 */ 358 */
392 359
393int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, 360int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
394 size_t size) 361 size_t size)
395{ 362{
396 struct tty_bufhead *buf = &tty->port->buf; 363 int space = tty_buffer_request_room(port, size);
397 int space;
398 unsigned long flags;
399 struct tty_buffer *tb;
400
401 spin_lock_irqsave(&buf->lock, flags);
402 space = __tty_buffer_request_room(tty->port, size);
403
404 tb = buf->tail;
405 if (likely(space)) { 364 if (likely(space)) {
365 struct tty_buffer *tb = port->buf.tail;
406 *chars = tb->char_buf_ptr + tb->used; 366 *chars = tb->char_buf_ptr + tb->used;
407 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space); 367 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
408 tb->used += space; 368 tb->used += space;
409 } 369 }
410 spin_unlock_irqrestore(&buf->lock, flags);
411 return space; 370 return space;
412} 371}
413EXPORT_SYMBOL_GPL(tty_prepare_flip_string); 372EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
414 373
415/** 374/**
416 * tty_prepare_flip_string_flags - make room for characters 375 * tty_prepare_flip_string_flags - make room for characters
417 * @tty: tty 376 * @port: tty port
418 * @chars: return pointer for character write area 377 * @chars: return pointer for character write area
419 * @flags: return pointer for status flag write area 378 * @flags: return pointer for status flag write area
420 * @size: desired size 379 * @size: desired size
@@ -428,24 +387,16 @@ EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
428 * Locking: May call functions taking port->buf.lock 387 * Locking: May call functions taking port->buf.lock
429 */ 388 */
430 389
431int tty_prepare_flip_string_flags(struct tty_struct *tty, 390int tty_prepare_flip_string_flags(struct tty_port *port,
432 unsigned char **chars, char **flags, size_t size) 391 unsigned char **chars, char **flags, size_t size)
433{ 392{
434 struct tty_bufhead *buf = &tty->port->buf; 393 int space = tty_buffer_request_room(port, size);
435 int space;
436 unsigned long __flags;
437 struct tty_buffer *tb;
438
439 spin_lock_irqsave(&buf->lock, __flags);
440 space = __tty_buffer_request_room(tty->port, size);
441
442 tb = buf->tail;
443 if (likely(space)) { 394 if (likely(space)) {
395 struct tty_buffer *tb = port->buf.tail;
444 *chars = tb->char_buf_ptr + tb->used; 396 *chars = tb->char_buf_ptr + tb->used;
445 *flags = tb->flag_buf_ptr + tb->used; 397 *flags = tb->flag_buf_ptr + tb->used;
446 tb->used += space; 398 tb->used += space;
447 } 399 }
448 spin_unlock_irqrestore(&buf->lock, __flags);
449 return space; 400 return space;
450} 401}
451EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags); 402EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
@@ -539,16 +490,17 @@ static void flush_to_ldisc(struct work_struct *work)
539 */ 490 */
540void tty_flush_to_ldisc(struct tty_struct *tty) 491void tty_flush_to_ldisc(struct tty_struct *tty)
541{ 492{
542 if (!tty->low_latency) 493 if (!tty->port->low_latency)
543 flush_work(&tty->port->buf.work); 494 flush_work(&tty->port->buf.work);
544} 495}
545 496
546/** 497/**
547 * tty_flip_buffer_push - terminal 498 * tty_flip_buffer_push - terminal
548 * @tty: tty to push 499 * @port: tty port to push
549 * 500 *
550 * Queue a push of the terminal flip buffers to the line discipline. This 501 * Queue a push of the terminal flip buffers to the line discipline. This
551 * function must not be called from IRQ context if tty->low_latency is set. 502 * function must not be called from IRQ context if port->low_latency is
503 * set.
552 * 504 *
553 * In the event of the queue being busy for flipping the work will be 505 * In the event of the queue being busy for flipping the work will be
554 * held off and retried later. 506 * held off and retried later.
@@ -556,9 +508,9 @@ void tty_flush_to_ldisc(struct tty_struct *tty)
556 * Locking: tty buffer lock. Driver locks in low latency mode. 508 * Locking: tty buffer lock. Driver locks in low latency mode.
557 */ 509 */
558 510
559void tty_flip_buffer_push(struct tty_struct *tty) 511void tty_flip_buffer_push(struct tty_port *port)
560{ 512{
561 struct tty_bufhead *buf = &tty->port->buf; 513 struct tty_bufhead *buf = &port->buf;
562 unsigned long flags; 514 unsigned long flags;
563 515
564 spin_lock_irqsave(&buf->lock, flags); 516 spin_lock_irqsave(&buf->lock, flags);
@@ -566,7 +518,7 @@ void tty_flip_buffer_push(struct tty_struct *tty)
566 buf->tail->commit = buf->tail->used; 518 buf->tail->commit = buf->tail->used;
567 spin_unlock_irqrestore(&buf->lock, flags); 519 spin_unlock_irqrestore(&buf->lock, flags);
568 520
569 if (tty->low_latency) 521 if (port->low_latency)
570 flush_to_ldisc(&buf->work); 522 flush_to_ldisc(&buf->work);
571 else 523 else
572 schedule_work(&buf->work); 524 schedule_work(&buf->work);
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index da9fde850754..54a254ab85c7 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -536,7 +536,7 @@ EXPORT_SYMBOL_GPL(tty_wakeup);
536 * __tty_hangup - actual handler for hangup events 536 * __tty_hangup - actual handler for hangup events
537 * @work: tty device 537 * @work: tty device
538 * 538 *
539 * This can be called by the "eventd" kernel thread. That is process 539 * This can be called by a "kworker" kernel thread. That is process
540 * synchronous but doesn't hold any locks, so we need to make sure we 540 * synchronous but doesn't hold any locks, so we need to make sure we
541 * have the appropriate locks for what we're doing. 541 * have the appropriate locks for what we're doing.
542 * 542 *
diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c
index 8481b29d5b3a..cc0fc52787c7 100644
--- a/drivers/tty/tty_ioctl.c
+++ b/drivers/tty/tty_ioctl.c
@@ -1096,12 +1096,16 @@ int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1096 ld = tty_ldisc_ref_wait(tty); 1096 ld = tty_ldisc_ref_wait(tty);
1097 switch (arg) { 1097 switch (arg) {
1098 case TCIFLUSH: 1098 case TCIFLUSH:
1099 if (ld && ld->ops->flush_buffer) 1099 if (ld && ld->ops->flush_buffer) {
1100 ld->ops->flush_buffer(tty); 1100 ld->ops->flush_buffer(tty);
1101 tty_unthrottle(tty);
1102 }
1101 break; 1103 break;
1102 case TCIOFLUSH: 1104 case TCIOFLUSH:
1103 if (ld && ld->ops->flush_buffer) 1105 if (ld && ld->ops->flush_buffer) {
1104 ld->ops->flush_buffer(tty); 1106 ld->ops->flush_buffer(tty);
1107 tty_unthrottle(tty);
1108 }
1105 /* fall through */ 1109 /* fall through */
1106 case TCOFLUSH: 1110 case TCOFLUSH:
1107 tty_driver_flush_buffer(tty); 1111 tty_driver_flush_buffer(tty);
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
index c5782294e532..d794087c327e 100644
--- a/drivers/tty/tty_ldisc.c
+++ b/drivers/tty/tty_ldisc.c
@@ -64,7 +64,9 @@ static void put_ldisc(struct tty_ldisc *ld)
64 return; 64 return;
65 } 65 }
66 raw_spin_unlock_irqrestore(&tty_ldisc_lock, flags); 66 raw_spin_unlock_irqrestore(&tty_ldisc_lock, flags);
67 wake_up(&ld->wq_idle); 67
68 if (waitqueue_active(&ld->wq_idle))
69 wake_up(&ld->wq_idle);
68} 70}
69 71
70/** 72/**
@@ -934,17 +936,17 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
934 * race with the set_ldisc code path. 936 * race with the set_ldisc code path.
935 */ 937 */
936 938
937 tty_lock_pair(tty, o_tty);
938 tty_ldisc_halt(tty); 939 tty_ldisc_halt(tty);
939 tty_ldisc_flush_works(tty); 940 if (o_tty)
940 if (o_tty) {
941 tty_ldisc_halt(o_tty); 941 tty_ldisc_halt(o_tty);
942
943 tty_ldisc_flush_works(tty);
944 if (o_tty)
942 tty_ldisc_flush_works(o_tty); 945 tty_ldisc_flush_works(o_tty);
943 }
944 946
947 tty_lock_pair(tty, o_tty);
945 /* This will need doing differently if we need to lock */ 948 /* This will need doing differently if we need to lock */
946 tty_ldisc_kill(tty); 949 tty_ldisc_kill(tty);
947
948 if (o_tty) 950 if (o_tty)
949 tty_ldisc_kill(o_tty); 951 tty_ldisc_kill(o_tty);
950 952
diff --git a/drivers/tty/vt/Makefile b/drivers/tty/vt/Makefile
index 14a51c9960df..17ae94cb29f8 100644
--- a/drivers/tty/vt/Makefile
+++ b/drivers/tty/vt/Makefile
@@ -27,8 +27,6 @@ $(obj)/defkeymap.o: $(obj)/defkeymap.c
27ifdef GENERATE_KEYMAP 27ifdef GENERATE_KEYMAP
28 28
29$(obj)/defkeymap.c: $(obj)/%.c: $(src)/%.map 29$(obj)/defkeymap.c: $(obj)/%.c: $(src)/%.map
30 loadkeys --mktable $< > $@.tmp 30 loadkeys --mktable $< > $@
31 sed -e 's/^static *//' $@.tmp > $@
32 rm $@.tmp
33 31
34endif 32endif
diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
index 681765baef69..a9af1b9ae160 100644
--- a/drivers/tty/vt/keyboard.c
+++ b/drivers/tty/vt/keyboard.c
@@ -307,26 +307,17 @@ int kbd_rate(struct kbd_repeat *rep)
307 */ 307 */
308static void put_queue(struct vc_data *vc, int ch) 308static void put_queue(struct vc_data *vc, int ch)
309{ 309{
310 struct tty_struct *tty = vc->port.tty; 310 tty_insert_flip_char(&vc->port, ch, 0);
311 311 tty_schedule_flip(&vc->port);
312 if (tty) {
313 tty_insert_flip_char(tty, ch, 0);
314 tty_schedule_flip(tty);
315 }
316} 312}
317 313
318static void puts_queue(struct vc_data *vc, char *cp) 314static void puts_queue(struct vc_data *vc, char *cp)
319{ 315{
320 struct tty_struct *tty = vc->port.tty;
321
322 if (!tty)
323 return;
324
325 while (*cp) { 316 while (*cp) {
326 tty_insert_flip_char(tty, *cp, 0); 317 tty_insert_flip_char(&vc->port, *cp, 0);
327 cp++; 318 cp++;
328 } 319 }
329 tty_schedule_flip(tty); 320 tty_schedule_flip(&vc->port);
330} 321}
331 322
332static void applkey(struct vc_data *vc, int key, char mode) 323static void applkey(struct vc_data *vc, int key, char mode)
@@ -582,12 +573,8 @@ static void fn_inc_console(struct vc_data *vc)
582 573
583static void fn_send_intr(struct vc_data *vc) 574static void fn_send_intr(struct vc_data *vc)
584{ 575{
585 struct tty_struct *tty = vc->port.tty; 576 tty_insert_flip_char(&vc->port, 0, TTY_BREAK);
586 577 tty_schedule_flip(&vc->port);
587 if (!tty)
588 return;
589 tty_insert_flip_char(tty, 0, TTY_BREAK);
590 tty_schedule_flip(tty);
591} 578}
592 579
593static void fn_scroll_forw(struct vc_data *vc) 580static void fn_scroll_forw(struct vc_data *vc)
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 8fd89687d068..1a2728034599 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1333,13 +1333,13 @@ static void csi_m(struct vc_data *vc)
1333 update_attr(vc); 1333 update_attr(vc);
1334} 1334}
1335 1335
1336static void respond_string(const char *p, struct tty_struct *tty) 1336static void respond_string(const char *p, struct tty_port *port)
1337{ 1337{
1338 while (*p) { 1338 while (*p) {
1339 tty_insert_flip_char(tty, *p, 0); 1339 tty_insert_flip_char(port, *p, 0);
1340 p++; 1340 p++;
1341 } 1341 }
1342 tty_schedule_flip(tty); 1342 tty_schedule_flip(port);
1343} 1343}
1344 1344
1345static void cursor_report(struct vc_data *vc, struct tty_struct *tty) 1345static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
@@ -1347,17 +1347,17 @@ static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
1347 char buf[40]; 1347 char buf[40];
1348 1348
1349 sprintf(buf, "\033[%d;%dR", vc->vc_y + (vc->vc_decom ? vc->vc_top + 1 : 1), vc->vc_x + 1); 1349 sprintf(buf, "\033[%d;%dR", vc->vc_y + (vc->vc_decom ? vc->vc_top + 1 : 1), vc->vc_x + 1);
1350 respond_string(buf, tty); 1350 respond_string(buf, tty->port);
1351} 1351}
1352 1352
1353static inline void status_report(struct tty_struct *tty) 1353static inline void status_report(struct tty_struct *tty)
1354{ 1354{
1355 respond_string("\033[0n", tty); /* Terminal ok */ 1355 respond_string("\033[0n", tty->port); /* Terminal ok */
1356} 1356}
1357 1357
1358static inline void respond_ID(struct tty_struct * tty) 1358static inline void respond_ID(struct tty_struct *tty)
1359{ 1359{
1360 respond_string(VT102ID, tty); 1360 respond_string(VT102ID, tty->port);
1361} 1361}
1362 1362
1363void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry) 1363void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry)
@@ -1366,7 +1366,7 @@ void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry)
1366 1366
1367 sprintf(buf, "\033[M%c%c%c", (char)(' ' + butt), (char)('!' + mrx), 1367 sprintf(buf, "\033[M%c%c%c", (char)(' ' + butt), (char)('!' + mrx),
1368 (char)('!' + mry)); 1368 (char)('!' + mry));
1369 respond_string(buf, tty); 1369 respond_string(buf, tty->port);
1370} 1370}
1371 1371
1372/* invoked via ioctl(TIOCLINUX) and through set_selection */ 1372/* invoked via ioctl(TIOCLINUX) and through set_selection */
diff --git a/drivers/usb/class/Kconfig b/drivers/usb/class/Kconfig
index 2519e320098f..316aac8e4ca1 100644
--- a/drivers/usb/class/Kconfig
+++ b/drivers/usb/class/Kconfig
@@ -6,7 +6,7 @@ comment "USB Device Class drivers"
6 6
7config USB_ACM 7config USB_ACM
8 tristate "USB Modem (CDC ACM) support" 8 tristate "USB Modem (CDC ACM) support"
9 depends on USB 9 depends on USB && TTY
10 ---help--- 10 ---help---
11 This driver supports USB modems and ISDN adapters which support the 11 This driver supports USB modems and ISDN adapters which support the
12 Communication Device Class Abstract Control Model interface. 12 Communication Device Class Abstract Control Model interface.
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 2d92cce260d7..8ac25adf31b4 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -410,19 +410,12 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)
410 410
411static void acm_process_read_urb(struct acm *acm, struct urb *urb) 411static void acm_process_read_urb(struct acm *acm, struct urb *urb)
412{ 412{
413 struct tty_struct *tty;
414
415 if (!urb->actual_length) 413 if (!urb->actual_length)
416 return; 414 return;
417 415
418 tty = tty_port_tty_get(&acm->port); 416 tty_insert_flip_string(&acm->port, urb->transfer_buffer,
419 if (!tty) 417 urb->actual_length);
420 return; 418 tty_flip_buffer_push(&acm->port);
421
422 tty_insert_flip_string(tty, urb->transfer_buffer, urb->actual_length);
423 tty_flip_buffer_push(tty);
424
425 tty_kref_put(tty);
426} 419}
427 420
428static void acm_read_bulk_callback(struct urb *urb) 421static void acm_read_bulk_callback(struct urb *urb)
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 14625fd2cecd..a1bd951f9cb7 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -750,6 +750,7 @@ config USB_GADGET_TARGET
750 750
751config USB_G_SERIAL 751config USB_G_SERIAL
752 tristate "Serial Gadget (with CDC ACM and CDC OBEX support)" 752 tristate "Serial Gadget (with CDC ACM and CDC OBEX support)"
753 depends on TTY
753 select USB_LIBCOMPOSITE 754 select USB_LIBCOMPOSITE
754 help 755 help
755 The Serial Gadget talks to the Linux-USB generic serial driver. 756 The Serial Gadget talks to the Linux-USB generic serial driver.
@@ -799,6 +800,8 @@ config USB_G_PRINTER
799 For more information, see Documentation/usb/gadget_printer.txt 800 For more information, see Documentation/usb/gadget_printer.txt
800 which includes sample code for accessing the device file. 801 which includes sample code for accessing the device file.
801 802
803if TTY
804
802config USB_CDC_COMPOSITE 805config USB_CDC_COMPOSITE
803 tristate "CDC Composite Device (Ethernet and ACM)" 806 tristate "CDC Composite Device (Ethernet and ACM)"
804 depends on NET 807 depends on NET
@@ -879,6 +882,8 @@ config USB_G_MULTI_CDC
879 882
880 If unsure, say "y". 883 If unsure, say "y".
881 884
885endif # TTY
886
882config USB_G_HID 887config USB_G_HID
883 tristate "HID Gadget" 888 tristate "HID Gadget"
884 select USB_LIBCOMPOSITE 889 select USB_LIBCOMPOSITE
@@ -895,6 +900,7 @@ config USB_G_HID
895# Standalone / single function gadgets 900# Standalone / single function gadgets
896config USB_G_DBGP 901config USB_G_DBGP
897 tristate "EHCI Debug Device Gadget" 902 tristate "EHCI Debug Device Gadget"
903 depends on TTY
898 select USB_LIBCOMPOSITE 904 select USB_LIBCOMPOSITE
899 help 905 help
900 This gadget emulates an EHCI Debug device. This is useful when you want 906 This gadget emulates an EHCI Debug device. This is useful when you want
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c
index 598dcc1212f0..46b1cc773ab8 100644
--- a/drivers/usb/gadget/u_serial.c
+++ b/drivers/usb/gadget/u_serial.c
@@ -495,12 +495,8 @@ static void gs_rx_push(unsigned long _port)
495 495
496 req = list_first_entry(queue, struct usb_request, list); 496 req = list_first_entry(queue, struct usb_request, list);
497 497
498 /* discard data if tty was closed */
499 if (!tty)
500 goto recycle;
501
502 /* leave data queued if tty was rx throttled */ 498 /* leave data queued if tty was rx throttled */
503 if (test_bit(TTY_THROTTLED, &tty->flags)) 499 if (tty && test_bit(TTY_THROTTLED, &tty->flags))
504 break; 500 break;
505 501
506 switch (req->status) { 502 switch (req->status) {
@@ -533,7 +529,8 @@ static void gs_rx_push(unsigned long _port)
533 size -= n; 529 size -= n;
534 } 530 }
535 531
536 count = tty_insert_flip_string(tty, packet, size); 532 count = tty_insert_flip_string(&port->port, packet,
533 size);
537 if (count) 534 if (count)
538 do_push = true; 535 do_push = true;
539 if (count != size) { 536 if (count != size) {
@@ -546,7 +543,7 @@ static void gs_rx_push(unsigned long _port)
546 } 543 }
547 port->n_read = 0; 544 port->n_read = 0;
548 } 545 }
549recycle: 546
550 list_move(&req->list, &port->read_pool); 547 list_move(&req->list, &port->read_pool);
551 port->read_started--; 548 port->read_started--;
552 } 549 }
@@ -554,8 +551,8 @@ recycle:
554 /* Push from tty to ldisc; without low_latency set this is handled by 551 /* Push from tty to ldisc; without low_latency set this is handled by
555 * a workqueue, so we won't get callbacks and can hold port_lock 552 * a workqueue, so we won't get callbacks and can hold port_lock
556 */ 553 */
557 if (tty && do_push) 554 if (do_push)
558 tty_flip_buffer_push(tty); 555 tty_flip_buffer_push(&port->port);
559 556
560 557
561 /* We want our data queue to become empty ASAP, keeping data 558 /* We want our data queue to become empty ASAP, keeping data
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
index 76f462241738..d8e35fe30b0c 100644
--- a/drivers/usb/serial/Kconfig
+++ b/drivers/usb/serial/Kconfig
@@ -4,7 +4,7 @@
4 4
5menuconfig USB_SERIAL 5menuconfig USB_SERIAL
6 tristate "USB Serial Converter support" 6 tristate "USB Serial Converter support"
7 depends on USB 7 depends on USB && TTY
8 ---help--- 8 ---help---
9 Say Y here if you have a USB device that provides normal serial 9 Say Y here if you have a USB device that provides normal serial
10 ports, or acts like a serial device, and you want to connect it to 10 ports, or acts like a serial device, and you want to connect it to
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c
index 6d110a3bc7e7..6e320cec397d 100644
--- a/drivers/usb/serial/aircable.c
+++ b/drivers/usb/serial/aircable.c
@@ -119,9 +119,8 @@ static int aircable_probe(struct usb_serial *serial,
119 return 0; 119 return 0;
120} 120}
121 121
122static int aircable_process_packet(struct tty_struct *tty, 122static int aircable_process_packet(struct usb_serial_port *port,
123 struct usb_serial_port *port, int has_headers, 123 int has_headers, char *packet, int len)
124 char *packet, int len)
125{ 124{
126 if (has_headers) { 125 if (has_headers) {
127 len -= HCI_HEADER_LENGTH; 126 len -= HCI_HEADER_LENGTH;
@@ -132,7 +131,7 @@ static int aircable_process_packet(struct tty_struct *tty,
132 return 0; 131 return 0;
133 } 132 }
134 133
135 tty_insert_flip_string(tty, packet, len); 134 tty_insert_flip_string(&port->port, packet, len);
136 135
137 return len; 136 return len;
138} 137}
@@ -141,28 +140,22 @@ static void aircable_process_read_urb(struct urb *urb)
141{ 140{
142 struct usb_serial_port *port = urb->context; 141 struct usb_serial_port *port = urb->context;
143 char *data = (char *)urb->transfer_buffer; 142 char *data = (char *)urb->transfer_buffer;
144 struct tty_struct *tty;
145 int has_headers; 143 int has_headers;
146 int count; 144 int count;
147 int len; 145 int len;
148 int i; 146 int i;
149 147
150 tty = tty_port_tty_get(&port->port);
151 if (!tty)
152 return;
153
154 has_headers = (urb->actual_length > 2 && data[0] == RX_HEADER_0); 148 has_headers = (urb->actual_length > 2 && data[0] == RX_HEADER_0);
155 149
156 count = 0; 150 count = 0;
157 for (i = 0; i < urb->actual_length; i += HCI_COMPLETE_FRAME) { 151 for (i = 0; i < urb->actual_length; i += HCI_COMPLETE_FRAME) {
158 len = min_t(int, urb->actual_length - i, HCI_COMPLETE_FRAME); 152 len = min_t(int, urb->actual_length - i, HCI_COMPLETE_FRAME);
159 count += aircable_process_packet(tty, port, has_headers, 153 count += aircable_process_packet(port, has_headers,
160 &data[i], len); 154 &data[i], len);
161 } 155 }
162 156
163 if (count) 157 if (count)
164 tty_flip_buffer_push(tty); 158 tty_flip_buffer_push(&port->port);
165 tty_kref_put(tty);
166} 159}
167 160
168static struct usb_serial_driver aircable_device = { 161static struct usb_serial_driver aircable_device = {
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
index a88882c0e237..cbd904b8fba5 100644
--- a/drivers/usb/serial/ark3116.c
+++ b/drivers/usb/serial/ark3116.c
@@ -674,7 +674,6 @@ static void ark3116_process_read_urb(struct urb *urb)
674{ 674{
675 struct usb_serial_port *port = urb->context; 675 struct usb_serial_port *port = urb->context;
676 struct ark3116_private *priv = usb_get_serial_port_data(port); 676 struct ark3116_private *priv = usb_get_serial_port_data(port);
677 struct tty_struct *tty;
678 unsigned char *data = urb->transfer_buffer; 677 unsigned char *data = urb->transfer_buffer;
679 char tty_flag = TTY_NORMAL; 678 char tty_flag = TTY_NORMAL;
680 unsigned long flags; 679 unsigned long flags;
@@ -689,10 +688,6 @@ static void ark3116_process_read_urb(struct urb *urb)
689 if (!urb->actual_length) 688 if (!urb->actual_length)
690 return; 689 return;
691 690
692 tty = tty_port_tty_get(&port->port);
693 if (!tty)
694 return;
695
696 if (lsr & UART_LSR_BRK_ERROR_BITS) { 691 if (lsr & UART_LSR_BRK_ERROR_BITS) {
697 if (lsr & UART_LSR_BI) 692 if (lsr & UART_LSR_BI)
698 tty_flag = TTY_BREAK; 693 tty_flag = TTY_BREAK;
@@ -703,12 +698,11 @@ static void ark3116_process_read_urb(struct urb *urb)
703 698
704 /* overrun is special, not associated with a char */ 699 /* overrun is special, not associated with a char */
705 if (lsr & UART_LSR_OE) 700 if (lsr & UART_LSR_OE)
706 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 701 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
707 } 702 }
708 tty_insert_flip_string_fixed_flag(tty, data, tty_flag, 703 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
709 urb->actual_length); 704 urb->actual_length);
710 tty_flip_buffer_push(tty); 705 tty_flip_buffer_push(&port->port);
711 tty_kref_put(tty);
712} 706}
713 707
714static struct usb_serial_driver ark3116_device = { 708static struct usb_serial_driver ark3116_device = {
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
index b72a4c166705..84217e78ded4 100644
--- a/drivers/usb/serial/belkin_sa.c
+++ b/drivers/usb/serial/belkin_sa.c
@@ -242,7 +242,6 @@ static void belkin_sa_process_read_urb(struct urb *urb)
242{ 242{
243 struct usb_serial_port *port = urb->context; 243 struct usb_serial_port *port = urb->context;
244 struct belkin_sa_private *priv = usb_get_serial_port_data(port); 244 struct belkin_sa_private *priv = usb_get_serial_port_data(port);
245 struct tty_struct *tty;
246 unsigned char *data = urb->transfer_buffer; 245 unsigned char *data = urb->transfer_buffer;
247 unsigned long flags; 246 unsigned long flags;
248 unsigned char status; 247 unsigned char status;
@@ -259,10 +258,6 @@ static void belkin_sa_process_read_urb(struct urb *urb)
259 if (!urb->actual_length) 258 if (!urb->actual_length)
260 return; 259 return;
261 260
262 tty = tty_port_tty_get(&port->port);
263 if (!tty)
264 return;
265
266 if (status & BELKIN_SA_LSR_ERR) { 261 if (status & BELKIN_SA_LSR_ERR) {
267 /* Break takes precedence over parity, which takes precedence 262 /* Break takes precedence over parity, which takes precedence
268 * over framing errors. */ 263 * over framing errors. */
@@ -276,13 +271,12 @@ static void belkin_sa_process_read_urb(struct urb *urb)
276 271
277 /* Overrun is special, not associated with a char. */ 272 /* Overrun is special, not associated with a char. */
278 if (status & BELKIN_SA_LSR_OE) 273 if (status & BELKIN_SA_LSR_OE)
279 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 274 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
280 } 275 }
281 276
282 tty_insert_flip_string_fixed_flag(tty, data, tty_flag, 277 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
283 urb->actual_length); 278 urb->actual_length);
284 tty_flip_buffer_push(tty); 279 tty_flip_buffer_push(&port->port);
285 tty_kref_put(tty);
286} 280}
287 281
288static void belkin_sa_set_termios(struct tty_struct *tty, 282static void belkin_sa_set_termios(struct tty_struct *tty,
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
index 69a4fa1cee25..629bd2894506 100644
--- a/drivers/usb/serial/cyberjack.c
+++ b/drivers/usb/serial/cyberjack.c
@@ -324,7 +324,6 @@ static void cyberjack_read_bulk_callback(struct urb *urb)
324 struct usb_serial_port *port = urb->context; 324 struct usb_serial_port *port = urb->context;
325 struct cyberjack_private *priv = usb_get_serial_port_data(port); 325 struct cyberjack_private *priv = usb_get_serial_port_data(port);
326 struct device *dev = &port->dev; 326 struct device *dev = &port->dev;
327 struct tty_struct *tty;
328 unsigned char *data = urb->transfer_buffer; 327 unsigned char *data = urb->transfer_buffer;
329 short todo; 328 short todo;
330 int result; 329 int result;
@@ -337,16 +336,10 @@ static void cyberjack_read_bulk_callback(struct urb *urb)
337 return; 336 return;
338 } 337 }
339 338
340 tty = tty_port_tty_get(&port->port);
341 if (!tty) {
342 dev_dbg(dev, "%s - ignoring since device not open\n", __func__);
343 return;
344 }
345 if (urb->actual_length) { 339 if (urb->actual_length) {
346 tty_insert_flip_string(tty, data, urb->actual_length); 340 tty_insert_flip_string(&port->port, data, urb->actual_length);
347 tty_flip_buffer_push(tty); 341 tty_flip_buffer_push(&port->port);
348 } 342 }
349 tty_kref_put(tty);
350 343
351 spin_lock(&priv->lock); 344 spin_lock(&priv->lock);
352 345
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index fd8c35fd452e..8efa19d0e9fb 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -1214,10 +1214,10 @@ static void cypress_read_int_callback(struct urb *urb)
1214 spin_unlock_irqrestore(&priv->lock, flags); 1214 spin_unlock_irqrestore(&priv->lock, flags);
1215 1215
1216 /* process read if there is data other than line status */ 1216 /* process read if there is data other than line status */
1217 if (tty && bytes > i) { 1217 if (bytes > i) {
1218 tty_insert_flip_string_fixed_flag(tty, data + i, 1218 tty_insert_flip_string_fixed_flag(&port->port, data + i,
1219 tty_flag, bytes - i); 1219 tty_flag, bytes - i);
1220 tty_flip_buffer_push(tty); 1220 tty_flip_buffer_push(&port->port);
1221 } 1221 }
1222 1222
1223 spin_lock_irqsave(&priv->lock, flags); 1223 spin_lock_irqsave(&priv->lock, flags);
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
index 45d4af62967f..ebe45fa0ed50 100644
--- a/drivers/usb/serial/digi_acceleport.c
+++ b/drivers/usb/serial/digi_acceleport.c
@@ -1399,9 +1399,7 @@ static void digi_read_bulk_callback(struct urb *urb)
1399 1399
1400static int digi_read_inb_callback(struct urb *urb) 1400static int digi_read_inb_callback(struct urb *urb)
1401{ 1401{
1402
1403 struct usb_serial_port *port = urb->context; 1402 struct usb_serial_port *port = urb->context;
1404 struct tty_struct *tty;
1405 struct digi_port *priv = usb_get_serial_port_data(port); 1403 struct digi_port *priv = usb_get_serial_port_data(port);
1406 int opcode = ((unsigned char *)urb->transfer_buffer)[0]; 1404 int opcode = ((unsigned char *)urb->transfer_buffer)[0];
1407 int len = ((unsigned char *)urb->transfer_buffer)[1]; 1405 int len = ((unsigned char *)urb->transfer_buffer)[1];
@@ -1425,7 +1423,6 @@ static int digi_read_inb_callback(struct urb *urb)
1425 return -1; 1423 return -1;
1426 } 1424 }
1427 1425
1428 tty = tty_port_tty_get(&port->port);
1429 spin_lock(&priv->dp_port_lock); 1426 spin_lock(&priv->dp_port_lock);
1430 1427
1431 /* check for throttle; if set, do not resubmit read urb */ 1428 /* check for throttle; if set, do not resubmit read urb */
@@ -1435,13 +1432,13 @@ static int digi_read_inb_callback(struct urb *urb)
1435 priv->dp_throttle_restart = 1; 1432 priv->dp_throttle_restart = 1;
1436 1433
1437 /* receive data */ 1434 /* receive data */
1438 if (tty && opcode == DIGI_CMD_RECEIVE_DATA) { 1435 if (opcode == DIGI_CMD_RECEIVE_DATA) {
1439 /* get flag from port_status */ 1436 /* get flag from port_status */
1440 flag = 0; 1437 flag = 0;
1441 1438
1442 /* overrun is special, not associated with a char */ 1439 /* overrun is special, not associated with a char */
1443 if (port_status & DIGI_OVERRUN_ERROR) 1440 if (port_status & DIGI_OVERRUN_ERROR)
1444 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 1441 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
1445 1442
1446 /* break takes precedence over parity, */ 1443 /* break takes precedence over parity, */
1447 /* which takes precedence over framing errors */ 1444 /* which takes precedence over framing errors */
@@ -1455,13 +1452,12 @@ static int digi_read_inb_callback(struct urb *urb)
1455 /* data length is len-1 (one byte of len is port_status) */ 1452 /* data length is len-1 (one byte of len is port_status) */
1456 --len; 1453 --len;
1457 if (len > 0) { 1454 if (len > 0) {
1458 tty_insert_flip_string_fixed_flag(tty, data, flag, 1455 tty_insert_flip_string_fixed_flag(&port->port, data,
1459 len); 1456 flag, len);
1460 tty_flip_buffer_push(tty); 1457 tty_flip_buffer_push(&port->port);
1461 } 1458 }
1462 } 1459 }
1463 spin_unlock(&priv->dp_port_lock); 1460 spin_unlock(&priv->dp_port_lock);
1464 tty_kref_put(tty);
1465 1461
1466 if (opcode == DIGI_CMD_RECEIVE_DISABLE) 1462 if (opcode == DIGI_CMD_RECEIVE_DISABLE)
1467 dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__); 1463 dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__);
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c
index 6e4eb57d0177..b1b2dc64b50b 100644
--- a/drivers/usb/serial/f81232.c
+++ b/drivers/usb/serial/f81232.c
@@ -100,7 +100,6 @@ static void f81232_process_read_urb(struct urb *urb)
100{ 100{
101 struct usb_serial_port *port = urb->context; 101 struct usb_serial_port *port = urb->context;
102 struct f81232_private *priv = usb_get_serial_port_data(port); 102 struct f81232_private *priv = usb_get_serial_port_data(port);
103 struct tty_struct *tty;
104 unsigned char *data = urb->transfer_buffer; 103 unsigned char *data = urb->transfer_buffer;
105 char tty_flag = TTY_NORMAL; 104 char tty_flag = TTY_NORMAL;
106 unsigned long flags; 105 unsigned long flags;
@@ -117,10 +116,6 @@ static void f81232_process_read_urb(struct urb *urb)
117 if (!urb->actual_length) 116 if (!urb->actual_length)
118 return; 117 return;
119 118
120 tty = tty_port_tty_get(&port->port);
121 if (!tty)
122 return;
123
124 /* break takes precedence over parity, */ 119 /* break takes precedence over parity, */
125 /* which takes precedence over framing errors */ 120 /* which takes precedence over framing errors */
126 if (line_status & UART_BREAK_ERROR) 121 if (line_status & UART_BREAK_ERROR)
@@ -133,19 +128,19 @@ static void f81232_process_read_urb(struct urb *urb)
133 128
134 /* overrun is special, not associated with a char */ 129 /* overrun is special, not associated with a char */
135 if (line_status & UART_OVERRUN_ERROR) 130 if (line_status & UART_OVERRUN_ERROR)
136 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 131 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
137 132
138 if (port->port.console && port->sysrq) { 133 if (port->port.console && port->sysrq) {
139 for (i = 0; i < urb->actual_length; ++i) 134 for (i = 0; i < urb->actual_length; ++i)
140 if (!usb_serial_handle_sysrq_char(port, data[i])) 135 if (!usb_serial_handle_sysrq_char(port, data[i]))
141 tty_insert_flip_char(tty, data[i], tty_flag); 136 tty_insert_flip_char(&port->port, data[i],
137 tty_flag);
142 } else { 138 } else {
143 tty_insert_flip_string_fixed_flag(tty, data, tty_flag, 139 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
144 urb->actual_length); 140 urb->actual_length);
145 } 141 }
146 142
147 tty_flip_buffer_push(tty); 143 tty_flip_buffer_push(&port->port);
148 tty_kref_put(tty);
149} 144}
150 145
151static int set_control_lines(struct usb_device *dev, u8 value) 146static int set_control_lines(struct usb_device *dev, u8 value)
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index ba68835d06a6..eaa038d032b8 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -1960,9 +1960,8 @@ static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
1960 1960
1961#define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE) 1961#define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
1962 1962
1963static int ftdi_process_packet(struct tty_struct *tty, 1963static int ftdi_process_packet(struct usb_serial_port *port,
1964 struct usb_serial_port *port, struct ftdi_private *priv, 1964 struct ftdi_private *priv, char *packet, int len)
1965 char *packet, int len)
1966{ 1965{
1967 int i; 1966 int i;
1968 char status; 1967 char status;
@@ -2012,7 +2011,7 @@ static int ftdi_process_packet(struct tty_struct *tty,
2012 /* Overrun is special, not associated with a char */ 2011 /* Overrun is special, not associated with a char */
2013 if (packet[1] & FTDI_RS_OE) { 2012 if (packet[1] & FTDI_RS_OE) {
2014 priv->icount.overrun++; 2013 priv->icount.overrun++;
2015 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 2014 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
2016 } 2015 }
2017 } 2016 }
2018 2017
@@ -2031,10 +2030,10 @@ static int ftdi_process_packet(struct tty_struct *tty,
2031 if (port->port.console && port->sysrq) { 2030 if (port->port.console && port->sysrq) {
2032 for (i = 0; i < len; i++, ch++) { 2031 for (i = 0; i < len; i++, ch++) {
2033 if (!usb_serial_handle_sysrq_char(port, *ch)) 2032 if (!usb_serial_handle_sysrq_char(port, *ch))
2034 tty_insert_flip_char(tty, *ch, flag); 2033 tty_insert_flip_char(&port->port, *ch, flag);
2035 } 2034 }
2036 } else { 2035 } else {
2037 tty_insert_flip_string_fixed_flag(tty, ch, flag, len); 2036 tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
2038 } 2037 }
2039 2038
2040 return len; 2039 return len;
@@ -2043,25 +2042,19 @@ static int ftdi_process_packet(struct tty_struct *tty,
2043static void ftdi_process_read_urb(struct urb *urb) 2042static void ftdi_process_read_urb(struct urb *urb)
2044{ 2043{
2045 struct usb_serial_port *port = urb->context; 2044 struct usb_serial_port *port = urb->context;
2046 struct tty_struct *tty;
2047 struct ftdi_private *priv = usb_get_serial_port_data(port); 2045 struct ftdi_private *priv = usb_get_serial_port_data(port);
2048 char *data = (char *)urb->transfer_buffer; 2046 char *data = (char *)urb->transfer_buffer;
2049 int i; 2047 int i;
2050 int len; 2048 int len;
2051 int count = 0; 2049 int count = 0;
2052 2050
2053 tty = tty_port_tty_get(&port->port);
2054 if (!tty)
2055 return;
2056
2057 for (i = 0; i < urb->actual_length; i += priv->max_packet_size) { 2051 for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
2058 len = min_t(int, urb->actual_length - i, priv->max_packet_size); 2052 len = min_t(int, urb->actual_length - i, priv->max_packet_size);
2059 count += ftdi_process_packet(tty, port, priv, &data[i], len); 2053 count += ftdi_process_packet(port, priv, &data[i], len);
2060 } 2054 }
2061 2055
2062 if (count) 2056 if (count)
2063 tty_flip_buffer_push(tty); 2057 tty_flip_buffer_push(&port->port);
2064 tty_kref_put(tty);
2065} 2058}
2066 2059
2067static void ftdi_break_ctl(struct tty_struct *tty, int break_state) 2060static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
index 203358d7e7bc..1a07b12ef341 100644
--- a/drivers/usb/serial/garmin_gps.c
+++ b/drivers/usb/serial/garmin_gps.c
@@ -252,14 +252,11 @@ static inline int isAbortTrfCmnd(const unsigned char *buf)
252static void send_to_tty(struct usb_serial_port *port, 252static void send_to_tty(struct usb_serial_port *port,
253 char *data, unsigned int actual_length) 253 char *data, unsigned int actual_length)
254{ 254{
255 struct tty_struct *tty = tty_port_tty_get(&port->port); 255 if (actual_length) {
256
257 if (tty && actual_length) {
258 usb_serial_debug_data(&port->dev, __func__, actual_length, data); 256 usb_serial_debug_data(&port->dev, __func__, actual_length, data);
259 tty_insert_flip_string(tty, data, actual_length); 257 tty_insert_flip_string(&port->port, data, actual_length);
260 tty_flip_buffer_push(tty); 258 tty_flip_buffer_push(&port->port);
261 } 259 }
262 tty_kref_put(tty);
263} 260}
264 261
265 262
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
index 2ea70a631996..4c5c23f1cae5 100644
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -313,30 +313,24 @@ EXPORT_SYMBOL_GPL(usb_serial_generic_submit_read_urbs);
313void usb_serial_generic_process_read_urb(struct urb *urb) 313void usb_serial_generic_process_read_urb(struct urb *urb)
314{ 314{
315 struct usb_serial_port *port = urb->context; 315 struct usb_serial_port *port = urb->context;
316 struct tty_struct *tty;
317 char *ch = (char *)urb->transfer_buffer; 316 char *ch = (char *)urb->transfer_buffer;
318 int i; 317 int i;
319 318
320 if (!urb->actual_length) 319 if (!urb->actual_length)
321 return; 320 return;
322 321
323 tty = tty_port_tty_get(&port->port);
324 if (!tty)
325 return;
326
327 /* The per character mucking around with sysrq path it too slow for 322 /* The per character mucking around with sysrq path it too slow for
328 stuff like 3G modems, so shortcircuit it in the 99.9999999% of cases 323 stuff like 3G modems, so shortcircuit it in the 99.9999999% of cases
329 where the USB serial is not a console anyway */ 324 where the USB serial is not a console anyway */
330 if (!port->port.console || !port->sysrq) 325 if (!port->port.console || !port->sysrq)
331 tty_insert_flip_string(tty, ch, urb->actual_length); 326 tty_insert_flip_string(&port->port, ch, urb->actual_length);
332 else { 327 else {
333 for (i = 0; i < urb->actual_length; i++, ch++) { 328 for (i = 0; i < urb->actual_length; i++, ch++) {
334 if (!usb_serial_handle_sysrq_char(port, *ch)) 329 if (!usb_serial_handle_sysrq_char(port, *ch))
335 tty_insert_flip_char(tty, *ch, TTY_NORMAL); 330 tty_insert_flip_char(&port->port, *ch, TTY_NORMAL);
336 } 331 }
337 } 332 }
338 tty_flip_buffer_push(tty); 333 tty_flip_buffer_push(&port->port);
339 tty_kref_put(tty);
340} 334}
341EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb); 335EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb);
342 336
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index 7b770c7f8b11..b00e5cbf741f 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -232,8 +232,8 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
232 unsigned char *buffer, __u16 bufferLength); 232 unsigned char *buffer, __u16 bufferLength);
233static void process_rcvd_status(struct edgeport_serial *edge_serial, 233static void process_rcvd_status(struct edgeport_serial *edge_serial,
234 __u8 byte2, __u8 byte3); 234 __u8 byte2, __u8 byte3);
235static void edge_tty_recv(struct device *dev, struct tty_struct *tty, 235static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
236 unsigned char *data, int length); 236 int length);
237static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr); 237static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr);
238static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData, 238static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
239 __u8 lsr, __u8 data); 239 __u8 lsr, __u8 data);
@@ -1752,7 +1752,6 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
1752 struct device *dev = &edge_serial->serial->dev->dev; 1752 struct device *dev = &edge_serial->serial->dev->dev;
1753 struct usb_serial_port *port; 1753 struct usb_serial_port *port;
1754 struct edgeport_port *edge_port; 1754 struct edgeport_port *edge_port;
1755 struct tty_struct *tty;
1756 __u16 lastBufferLength; 1755 __u16 lastBufferLength;
1757 __u16 rxLen; 1756 __u16 rxLen;
1758 1757
@@ -1860,14 +1859,11 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
1860 edge_serial->rxPort]; 1859 edge_serial->rxPort];
1861 edge_port = usb_get_serial_port_data(port); 1860 edge_port = usb_get_serial_port_data(port);
1862 if (edge_port->open) { 1861 if (edge_port->open) {
1863 tty = tty_port_tty_get( 1862 dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n",
1864 &edge_port->port->port); 1863 __func__, rxLen,
1865 if (tty) { 1864 edge_serial->rxPort);
1866 dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n", 1865 edge_tty_recv(edge_port->port, buffer,
1867 __func__, rxLen, edge_serial->rxPort); 1866 rxLen);
1868 edge_tty_recv(&edge_serial->serial->dev->dev, tty, buffer, rxLen);
1869 tty_kref_put(tty);
1870 }
1871 edge_port->icount.rx += rxLen; 1867 edge_port->icount.rx += rxLen;
1872 } 1868 }
1873 buffer += rxLen; 1869 buffer += rxLen;
@@ -2017,20 +2013,20 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,
2017 * edge_tty_recv 2013 * edge_tty_recv
2018 * this function passes data on to the tty flip buffer 2014 * this function passes data on to the tty flip buffer
2019 *****************************************************************************/ 2015 *****************************************************************************/
2020static void edge_tty_recv(struct device *dev, struct tty_struct *tty, 2016static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
2021 unsigned char *data, int length) 2017 int length)
2022{ 2018{
2023 int cnt; 2019 int cnt;
2024 2020
2025 cnt = tty_insert_flip_string(tty, data, length); 2021 cnt = tty_insert_flip_string(&port->port, data, length);
2026 if (cnt < length) { 2022 if (cnt < length) {
2027 dev_err(dev, "%s - dropping data, %d bytes lost\n", 2023 dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
2028 __func__, length - cnt); 2024 __func__, length - cnt);
2029 } 2025 }
2030 data += cnt; 2026 data += cnt;
2031 length -= cnt; 2027 length -= cnt;
2032 2028
2033 tty_flip_buffer_push(tty); 2029 tty_flip_buffer_push(&port->port);
2034} 2030}
2035 2031
2036 2032
@@ -2086,14 +2082,9 @@ static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,
2086 } 2082 }
2087 2083
2088 /* Place LSR data byte into Rx buffer */ 2084 /* Place LSR data byte into Rx buffer */
2089 if (lsrData) { 2085 if (lsrData)
2090 struct tty_struct *tty = 2086 edge_tty_recv(edge_port->port, &data, 1);
2091 tty_port_tty_get(&edge_port->port->port); 2087
2092 if (tty) {
2093 edge_tty_recv(&edge_port->port->dev, tty, &data, 1);
2094 tty_kref_put(tty);
2095 }
2096 }
2097 /* update input line counters */ 2088 /* update input line counters */
2098 icount = &edge_port->icount; 2089 icount = &edge_port->icount;
2099 if (newLsr & LSR_BREAK) 2090 if (newLsr & LSR_BREAK)
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
index 82afc4d6a327..b5ab0a54b6b6 100644
--- a/drivers/usb/serial/io_ti.c
+++ b/drivers/usb/serial/io_ti.c
@@ -201,8 +201,8 @@ static int closing_wait = EDGE_CLOSING_WAIT;
201static bool ignore_cpu_rev; 201static bool ignore_cpu_rev;
202static int default_uart_mode; /* RS232 */ 202static int default_uart_mode; /* RS232 */
203 203
204static void edge_tty_recv(struct device *dev, struct tty_struct *tty, 204static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
205 unsigned char *data, int length); 205 int length);
206 206
207static void stop_read(struct edgeport_port *edge_port); 207static void stop_read(struct edgeport_port *edge_port);
208static int restart_read(struct edgeport_port *edge_port); 208static int restart_read(struct edgeport_port *edge_port);
@@ -1543,7 +1543,6 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
1543 struct async_icount *icount; 1543 struct async_icount *icount;
1544 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | 1544 __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR |
1545 LSR_FRM_ERR | LSR_BREAK)); 1545 LSR_FRM_ERR | LSR_BREAK));
1546 struct tty_struct *tty;
1547 1546
1548 dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, new_lsr); 1547 dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, new_lsr);
1549 1548
@@ -1557,13 +1556,8 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
1557 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); 1556 new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
1558 1557
1559 /* Place LSR data byte into Rx buffer */ 1558 /* Place LSR data byte into Rx buffer */
1560 if (lsr_data) { 1559 if (lsr_data)
1561 tty = tty_port_tty_get(&edge_port->port->port); 1560 edge_tty_recv(edge_port->port, &data, 1);
1562 if (tty) {
1563 edge_tty_recv(&edge_port->port->dev, tty, &data, 1);
1564 tty_kref_put(tty);
1565 }
1566 }
1567 1561
1568 /* update input line counters */ 1562 /* update input line counters */
1569 icount = &edge_port->icount; 1563 icount = &edge_port->icount;
@@ -1679,7 +1673,6 @@ static void edge_bulk_in_callback(struct urb *urb)
1679 struct edgeport_port *edge_port = urb->context; 1673 struct edgeport_port *edge_port = urb->context;
1680 struct device *dev = &edge_port->port->dev; 1674 struct device *dev = &edge_port->port->dev;
1681 unsigned char *data = urb->transfer_buffer; 1675 unsigned char *data = urb->transfer_buffer;
1682 struct tty_struct *tty;
1683 int retval = 0; 1676 int retval = 0;
1684 int port_number; 1677 int port_number;
1685 int status = urb->status; 1678 int status = urb->status;
@@ -1718,17 +1711,16 @@ static void edge_bulk_in_callback(struct urb *urb)
1718 ++data; 1711 ++data;
1719 } 1712 }
1720 1713
1721 tty = tty_port_tty_get(&edge_port->port->port); 1714 if (urb->actual_length) {
1722 if (tty && urb->actual_length) {
1723 usb_serial_debug_data(dev, __func__, urb->actual_length, data); 1715 usb_serial_debug_data(dev, __func__, urb->actual_length, data);
1724 if (edge_port->close_pending) 1716 if (edge_port->close_pending)
1725 dev_dbg(dev, "%s - close pending, dropping data on the floor\n", 1717 dev_dbg(dev, "%s - close pending, dropping data on the floor\n",
1726 __func__); 1718 __func__);
1727 else 1719 else
1728 edge_tty_recv(dev, tty, data, urb->actual_length); 1720 edge_tty_recv(edge_port->port, data,
1721 urb->actual_length);
1729 edge_port->icount.rx += urb->actual_length; 1722 edge_port->icount.rx += urb->actual_length;
1730 } 1723 }
1731 tty_kref_put(tty);
1732 1724
1733exit: 1725exit:
1734 /* continue read unless stopped */ 1726 /* continue read unless stopped */
@@ -1743,16 +1735,16 @@ exit:
1743 dev_err(dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval); 1735 dev_err(dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval);
1744} 1736}
1745 1737
1746static void edge_tty_recv(struct device *dev, struct tty_struct *tty, 1738static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
1747 unsigned char *data, int length) 1739 int length)
1748{ 1740{
1749 int queued; 1741 int queued;
1750 1742
1751 queued = tty_insert_flip_string(tty, data, length); 1743 queued = tty_insert_flip_string(&port->port, data, length);
1752 if (queued < length) 1744 if (queued < length)
1753 dev_err(dev, "%s - dropping data, %d bytes lost\n", 1745 dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
1754 __func__, length - queued); 1746 __func__, length - queued);
1755 tty_flip_buffer_push(tty); 1747 tty_flip_buffer_push(&port->port);
1756} 1748}
1757 1749
1758static void edge_bulk_out_callback(struct urb *urb) 1750static void edge_bulk_out_callback(struct urb *urb)
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
index e24e2d4f4c1b..716930ab1bb1 100644
--- a/drivers/usb/serial/ir-usb.c
+++ b/drivers/usb/serial/ir-usb.c
@@ -287,7 +287,6 @@ static void ir_process_read_urb(struct urb *urb)
287{ 287{
288 struct usb_serial_port *port = urb->context; 288 struct usb_serial_port *port = urb->context;
289 unsigned char *data = urb->transfer_buffer; 289 unsigned char *data = urb->transfer_buffer;
290 struct tty_struct *tty;
291 290
292 if (!urb->actual_length) 291 if (!urb->actual_length)
293 return; 292 return;
@@ -302,12 +301,8 @@ static void ir_process_read_urb(struct urb *urb)
302 if (urb->actual_length == 1) 301 if (urb->actual_length == 1)
303 return; 302 return;
304 303
305 tty = tty_port_tty_get(&port->port); 304 tty_insert_flip_string(&port->port, data + 1, urb->actual_length - 1);
306 if (!tty) 305 tty_flip_buffer_push(&port->port);
307 return;
308 tty_insert_flip_string(tty, data + 1, urb->actual_length - 1);
309 tty_flip_buffer_push(tty);
310 tty_kref_put(tty);
311} 306}
312 307
313static void ir_set_termios_callback(struct urb *urb) 308static void ir_set_termios_callback(struct urb *urb)
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
index 1e1fbed65ef2..ff77027160aa 100644
--- a/drivers/usb/serial/iuu_phoenix.c
+++ b/drivers/usb/serial/iuu_phoenix.c
@@ -581,7 +581,6 @@ static void read_buf_callback(struct urb *urb)
581{ 581{
582 struct usb_serial_port *port = urb->context; 582 struct usb_serial_port *port = urb->context;
583 unsigned char *data = urb->transfer_buffer; 583 unsigned char *data = urb->transfer_buffer;
584 struct tty_struct *tty;
585 int status = urb->status; 584 int status = urb->status;
586 585
587 if (status) { 586 if (status) {
@@ -592,14 +591,12 @@ static void read_buf_callback(struct urb *urb)
592 } 591 }
593 592
594 dev_dbg(&port->dev, "%s - %i chars to write\n", __func__, urb->actual_length); 593 dev_dbg(&port->dev, "%s - %i chars to write\n", __func__, urb->actual_length);
595 tty = tty_port_tty_get(&port->port);
596 if (data == NULL) 594 if (data == NULL)
597 dev_dbg(&port->dev, "%s - data is NULL !!!\n", __func__); 595 dev_dbg(&port->dev, "%s - data is NULL !!!\n", __func__);
598 if (tty && urb->actual_length && data) { 596 if (urb->actual_length && data) {
599 tty_insert_flip_string(tty, data, urb->actual_length); 597 tty_insert_flip_string(&port->port, data, urb->actual_length);
600 tty_flip_buffer_push(tty); 598 tty_flip_buffer_push(&port->port);
601 } 599 }
602 tty_kref_put(tty);
603 iuu_led_activity_on(urb); 600 iuu_led_activity_on(urb);
604} 601}
605 602
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index 97bc49f68efd..f6d7f68fa43c 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -291,7 +291,6 @@ static void usa26_indat_callback(struct urb *urb)
291 int i, err; 291 int i, err;
292 int endpoint; 292 int endpoint;
293 struct usb_serial_port *port; 293 struct usb_serial_port *port;
294 struct tty_struct *tty;
295 unsigned char *data = urb->transfer_buffer; 294 unsigned char *data = urb->transfer_buffer;
296 int status = urb->status; 295 int status = urb->status;
297 296
@@ -304,8 +303,7 @@ static void usa26_indat_callback(struct urb *urb)
304 } 303 }
305 304
306 port = urb->context; 305 port = urb->context;
307 tty = tty_port_tty_get(&port->port); 306 if (urb->actual_length) {
308 if (tty && urb->actual_length) {
309 /* 0x80 bit is error flag */ 307 /* 0x80 bit is error flag */
310 if ((data[0] & 0x80) == 0) { 308 if ((data[0] & 0x80) == 0) {
311 /* no errors on individual bytes, only 309 /* no errors on individual bytes, only
@@ -315,7 +313,7 @@ static void usa26_indat_callback(struct urb *urb)
315 else 313 else
316 err = 0; 314 err = 0;
317 for (i = 1; i < urb->actual_length ; ++i) 315 for (i = 1; i < urb->actual_length ; ++i)
318 tty_insert_flip_char(tty, data[i], err); 316 tty_insert_flip_char(&port->port, data[i], err);
319 } else { 317 } else {
320 /* some bytes had errors, every byte has status */ 318 /* some bytes had errors, every byte has status */
321 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__); 319 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
@@ -328,12 +326,12 @@ static void usa26_indat_callback(struct urb *urb)
328 if (stat & RXERROR_PARITY) 326 if (stat & RXERROR_PARITY)
329 flag |= TTY_PARITY; 327 flag |= TTY_PARITY;
330 /* XXX should handle break (0x10) */ 328 /* XXX should handle break (0x10) */
331 tty_insert_flip_char(tty, data[i+1], flag); 329 tty_insert_flip_char(&port->port, data[i+1],
330 flag);
332 } 331 }
333 } 332 }
334 tty_flip_buffer_push(tty); 333 tty_flip_buffer_push(&port->port);
335 } 334 }
336 tty_kref_put(tty);
337 335
338 /* Resubmit urb so we continue receiving */ 336 /* Resubmit urb so we continue receiving */
339 err = usb_submit_urb(urb, GFP_ATOMIC); 337 err = usb_submit_urb(urb, GFP_ATOMIC);
@@ -446,7 +444,6 @@ static void usa28_indat_callback(struct urb *urb)
446{ 444{
447 int err; 445 int err;
448 struct usb_serial_port *port; 446 struct usb_serial_port *port;
449 struct tty_struct *tty;
450 unsigned char *data; 447 unsigned char *data;
451 struct keyspan_port_private *p_priv; 448 struct keyspan_port_private *p_priv;
452 int status = urb->status; 449 int status = urb->status;
@@ -469,12 +466,11 @@ static void usa28_indat_callback(struct urb *urb)
469 p_priv = usb_get_serial_port_data(port); 466 p_priv = usb_get_serial_port_data(port);
470 data = urb->transfer_buffer; 467 data = urb->transfer_buffer;
471 468
472 tty = tty_port_tty_get(&port->port); 469 if (urb->actual_length) {
473 if (tty && urb->actual_length) { 470 tty_insert_flip_string(&port->port, data,
474 tty_insert_flip_string(tty, data, urb->actual_length); 471 urb->actual_length);
475 tty_flip_buffer_push(tty); 472 tty_flip_buffer_push(&port->port);
476 } 473 }
477 tty_kref_put(tty);
478 474
479 /* Resubmit urb so we continue receiving */ 475 /* Resubmit urb so we continue receiving */
480 err = usb_submit_urb(urb, GFP_ATOMIC); 476 err = usb_submit_urb(urb, GFP_ATOMIC);
@@ -669,7 +665,6 @@ static void usa49_indat_callback(struct urb *urb)
669 int i, err; 665 int i, err;
670 int endpoint; 666 int endpoint;
671 struct usb_serial_port *port; 667 struct usb_serial_port *port;
672 struct tty_struct *tty;
673 unsigned char *data = urb->transfer_buffer; 668 unsigned char *data = urb->transfer_buffer;
674 int status = urb->status; 669 int status = urb->status;
675 670
@@ -682,12 +677,11 @@ static void usa49_indat_callback(struct urb *urb)
682 } 677 }
683 678
684 port = urb->context; 679 port = urb->context;
685 tty = tty_port_tty_get(&port->port); 680 if (urb->actual_length) {
686 if (tty && urb->actual_length) {
687 /* 0x80 bit is error flag */ 681 /* 0x80 bit is error flag */
688 if ((data[0] & 0x80) == 0) { 682 if ((data[0] & 0x80) == 0) {
689 /* no error on any byte */ 683 /* no error on any byte */
690 tty_insert_flip_string(tty, data + 1, 684 tty_insert_flip_string(&port->port, data + 1,
691 urb->actual_length - 1); 685 urb->actual_length - 1);
692 } else { 686 } else {
693 /* some bytes had errors, every byte has status */ 687 /* some bytes had errors, every byte has status */
@@ -700,12 +694,12 @@ static void usa49_indat_callback(struct urb *urb)
700 if (stat & RXERROR_PARITY) 694 if (stat & RXERROR_PARITY)
701 flag |= TTY_PARITY; 695 flag |= TTY_PARITY;
702 /* XXX should handle break (0x10) */ 696 /* XXX should handle break (0x10) */
703 tty_insert_flip_char(tty, data[i+1], flag); 697 tty_insert_flip_char(&port->port, data[i+1],
698 flag);
704 } 699 }
705 } 700 }
706 tty_flip_buffer_push(tty); 701 tty_flip_buffer_push(&port->port);
707 } 702 }
708 tty_kref_put(tty);
709 703
710 /* Resubmit urb so we continue receiving */ 704 /* Resubmit urb so we continue receiving */
711 err = usb_submit_urb(urb, GFP_ATOMIC); 705 err = usb_submit_urb(urb, GFP_ATOMIC);
@@ -718,7 +712,6 @@ static void usa49wg_indat_callback(struct urb *urb)
718 int i, len, x, err; 712 int i, len, x, err;
719 struct usb_serial *serial; 713 struct usb_serial *serial;
720 struct usb_serial_port *port; 714 struct usb_serial_port *port;
721 struct tty_struct *tty;
722 unsigned char *data = urb->transfer_buffer; 715 unsigned char *data = urb->transfer_buffer;
723 int status = urb->status; 716 int status = urb->status;
724 717
@@ -743,7 +736,6 @@ static void usa49wg_indat_callback(struct urb *urb)
743 return; 736 return;
744 } 737 }
745 port = serial->port[data[i++]]; 738 port = serial->port[data[i++]];
746 tty = tty_port_tty_get(&port->port);
747 len = data[i++]; 739 len = data[i++];
748 740
749 /* 0x80 bit is error flag */ 741 /* 0x80 bit is error flag */
@@ -751,7 +743,8 @@ static void usa49wg_indat_callback(struct urb *urb)
751 /* no error on any byte */ 743 /* no error on any byte */
752 i++; 744 i++;
753 for (x = 1; x < len ; ++x) 745 for (x = 1; x < len ; ++x)
754 tty_insert_flip_char(tty, data[i++], 0); 746 tty_insert_flip_char(&port->port,
747 data[i++], 0);
755 } else { 748 } else {
756 /* 749 /*
757 * some bytes had errors, every byte has status 750 * some bytes had errors, every byte has status
@@ -765,13 +758,12 @@ static void usa49wg_indat_callback(struct urb *urb)
765 if (stat & RXERROR_PARITY) 758 if (stat & RXERROR_PARITY)
766 flag |= TTY_PARITY; 759 flag |= TTY_PARITY;
767 /* XXX should handle break (0x10) */ 760 /* XXX should handle break (0x10) */
768 tty_insert_flip_char(tty, 761 tty_insert_flip_char(&port->port,
769 data[i+1], flag); 762 data[i+1], flag);
770 i += 2; 763 i += 2;
771 } 764 }
772 } 765 }
773 tty_flip_buffer_push(tty); 766 tty_flip_buffer_push(&port->port);
774 tty_kref_put(tty);
775 } 767 }
776 } 768 }
777 769
@@ -792,7 +784,6 @@ static void usa90_indat_callback(struct urb *urb)
792 int endpoint; 784 int endpoint;
793 struct usb_serial_port *port; 785 struct usb_serial_port *port;
794 struct keyspan_port_private *p_priv; 786 struct keyspan_port_private *p_priv;
795 struct tty_struct *tty;
796 unsigned char *data = urb->transfer_buffer; 787 unsigned char *data = urb->transfer_buffer;
797 int status = urb->status; 788 int status = urb->status;
798 789
@@ -808,12 +799,12 @@ static void usa90_indat_callback(struct urb *urb)
808 p_priv = usb_get_serial_port_data(port); 799 p_priv = usb_get_serial_port_data(port);
809 800
810 if (urb->actual_length) { 801 if (urb->actual_length) {
811 tty = tty_port_tty_get(&port->port);
812 /* if current mode is DMA, looks like usa28 format 802 /* if current mode is DMA, looks like usa28 format
813 otherwise looks like usa26 data format */ 803 otherwise looks like usa26 data format */
814 804
815 if (p_priv->baud > 57600) 805 if (p_priv->baud > 57600)
816 tty_insert_flip_string(tty, data, urb->actual_length); 806 tty_insert_flip_string(&port->port, data,
807 urb->actual_length);
817 else { 808 else {
818 /* 0x80 bit is error flag */ 809 /* 0x80 bit is error flag */
819 if ((data[0] & 0x80) == 0) { 810 if ((data[0] & 0x80) == 0) {
@@ -824,8 +815,8 @@ static void usa90_indat_callback(struct urb *urb)
824 else 815 else
825 err = 0; 816 err = 0;
826 for (i = 1; i < urb->actual_length ; ++i) 817 for (i = 1; i < urb->actual_length ; ++i)
827 tty_insert_flip_char(tty, data[i], 818 tty_insert_flip_char(&port->port,
828 err); 819 data[i], err);
829 } else { 820 } else {
830 /* some bytes had errors, every byte has status */ 821 /* some bytes had errors, every byte has status */
831 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__); 822 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
@@ -838,13 +829,12 @@ static void usa90_indat_callback(struct urb *urb)
838 if (stat & RXERROR_PARITY) 829 if (stat & RXERROR_PARITY)
839 flag |= TTY_PARITY; 830 flag |= TTY_PARITY;
840 /* XXX should handle break (0x10) */ 831 /* XXX should handle break (0x10) */
841 tty_insert_flip_char(tty, data[i+1], 832 tty_insert_flip_char(&port->port,
842 flag); 833 data[i+1], flag);
843 } 834 }
844 } 835 }
845 } 836 }
846 tty_flip_buffer_push(tty); 837 tty_flip_buffer_push(&port->port);
847 tty_kref_put(tty);
848 } 838 }
849 839
850 /* Resubmit urb so we continue receiving */ 840 /* Resubmit urb so we continue receiving */
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
index 41b01092af07..3b17d5d13dc8 100644
--- a/drivers/usb/serial/keyspan_pda.c
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -138,7 +138,6 @@ static void keyspan_pda_request_unthrottle(struct work_struct *work)
138static void keyspan_pda_rx_interrupt(struct urb *urb) 138static void keyspan_pda_rx_interrupt(struct urb *urb)
139{ 139{
140 struct usb_serial_port *port = urb->context; 140 struct usb_serial_port *port = urb->context;
141 struct tty_struct *tty;
142 unsigned char *data = urb->transfer_buffer; 141 unsigned char *data = urb->transfer_buffer;
143 int retval; 142 int retval;
144 int status = urb->status; 143 int status = urb->status;
@@ -163,14 +162,12 @@ static void keyspan_pda_rx_interrupt(struct urb *urb)
163 /* see if the message is data or a status interrupt */ 162 /* see if the message is data or a status interrupt */
164 switch (data[0]) { 163 switch (data[0]) {
165 case 0: 164 case 0:
166 tty = tty_port_tty_get(&port->port);
167 /* rest of message is rx data */ 165 /* rest of message is rx data */
168 if (tty && urb->actual_length) { 166 if (urb->actual_length) {
169 tty_insert_flip_string(tty, data + 1, 167 tty_insert_flip_string(&port->port, data + 1,
170 urb->actual_length - 1); 168 urb->actual_length - 1);
171 tty_flip_buffer_push(tty); 169 tty_flip_buffer_push(&port->port);
172 } 170 }
173 tty_kref_put(tty);
174 break; 171 break;
175 case 1: 172 case 1:
176 /* status interrupt */ 173 /* status interrupt */
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
index fc9e14a1e9b3..769d910ae0a5 100644
--- a/drivers/usb/serial/kl5kusb105.c
+++ b/drivers/usb/serial/kl5kusb105.c
@@ -389,7 +389,6 @@ static void klsi_105_process_read_urb(struct urb *urb)
389{ 389{
390 struct usb_serial_port *port = urb->context; 390 struct usb_serial_port *port = urb->context;
391 unsigned char *data = urb->transfer_buffer; 391 unsigned char *data = urb->transfer_buffer;
392 struct tty_struct *tty;
393 unsigned len; 392 unsigned len;
394 393
395 /* empty urbs seem to happen, we ignore them */ 394 /* empty urbs seem to happen, we ignore them */
@@ -401,19 +400,14 @@ static void klsi_105_process_read_urb(struct urb *urb)
401 return; 400 return;
402 } 401 }
403 402
404 tty = tty_port_tty_get(&port->port);
405 if (!tty)
406 return;
407
408 len = get_unaligned_le16(data); 403 len = get_unaligned_le16(data);
409 if (len > urb->actual_length - KLSI_HDR_LEN) { 404 if (len > urb->actual_length - KLSI_HDR_LEN) {
410 dev_dbg(&port->dev, "%s - packet length mismatch\n", __func__); 405 dev_dbg(&port->dev, "%s - packet length mismatch\n", __func__);
411 len = urb->actual_length - KLSI_HDR_LEN; 406 len = urb->actual_length - KLSI_HDR_LEN;
412 } 407 }
413 408
414 tty_insert_flip_string(tty, data + KLSI_HDR_LEN, len); 409 tty_insert_flip_string(&port->port, data + KLSI_HDR_LEN, len);
415 tty_flip_buffer_push(tty); 410 tty_flip_buffer_push(&port->port);
416 tty_kref_put(tty);
417} 411}
418 412
419static void klsi_105_set_termios(struct tty_struct *tty, 413static void klsi_105_set_termios(struct tty_struct *tty,
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
index b747ba615d0b..903d938e174b 100644
--- a/drivers/usb/serial/kobil_sct.c
+++ b/drivers/usb/serial/kobil_sct.c
@@ -324,7 +324,6 @@ static void kobil_read_int_callback(struct urb *urb)
324{ 324{
325 int result; 325 int result;
326 struct usb_serial_port *port = urb->context; 326 struct usb_serial_port *port = urb->context;
327 struct tty_struct *tty;
328 unsigned char *data = urb->transfer_buffer; 327 unsigned char *data = urb->transfer_buffer;
329 int status = urb->status; 328 int status = urb->status;
330 329
@@ -333,8 +332,7 @@ static void kobil_read_int_callback(struct urb *urb)
333 return; 332 return;
334 } 333 }
335 334
336 tty = tty_port_tty_get(&port->port); 335 if (urb->actual_length) {
337 if (tty && urb->actual_length) {
338 336
339 /* BEGIN DEBUG */ 337 /* BEGIN DEBUG */
340 /* 338 /*
@@ -353,10 +351,9 @@ static void kobil_read_int_callback(struct urb *urb)
353 */ 351 */
354 /* END DEBUG */ 352 /* END DEBUG */
355 353
356 tty_insert_flip_string(tty, data, urb->actual_length); 354 tty_insert_flip_string(&port->port, data, urb->actual_length);
357 tty_flip_buffer_push(tty); 355 tty_flip_buffer_push(&port->port);
358 } 356 }
359 tty_kref_put(tty);
360 357
361 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 358 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
362 dev_dbg(&port->dev, "%s - Send read URB returns: %i\n", __func__, result); 359 dev_dbg(&port->dev, "%s - Send read URB returns: %i\n", __func__, result);
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
index b6911757c855..f42528e05d7b 100644
--- a/drivers/usb/serial/mct_u232.c
+++ b/drivers/usb/serial/mct_u232.c
@@ -531,7 +531,6 @@ static void mct_u232_read_int_callback(struct urb *urb)
531{ 531{
532 struct usb_serial_port *port = urb->context; 532 struct usb_serial_port *port = urb->context;
533 struct mct_u232_private *priv = usb_get_serial_port_data(port); 533 struct mct_u232_private *priv = usb_get_serial_port_data(port);
534 struct tty_struct *tty;
535 unsigned char *data = urb->transfer_buffer; 534 unsigned char *data = urb->transfer_buffer;
536 int retval; 535 int retval;
537 int status = urb->status; 536 int status = urb->status;
@@ -561,13 +560,9 @@ static void mct_u232_read_int_callback(struct urb *urb)
561 */ 560 */
562 if (urb->transfer_buffer_length > 2) { 561 if (urb->transfer_buffer_length > 2) {
563 if (urb->actual_length) { 562 if (urb->actual_length) {
564 tty = tty_port_tty_get(&port->port); 563 tty_insert_flip_string(&port->port, data,
565 if (tty) { 564 urb->actual_length);
566 tty_insert_flip_string(tty, data, 565 tty_flip_buffer_push(&port->port);
567 urb->actual_length);
568 tty_flip_buffer_push(tty);
569 }
570 tty_kref_put(tty);
571 } 566 }
572 goto exit; 567 goto exit;
573 } 568 }
diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c
index 3d258448c29a..bf3c7a23553e 100644
--- a/drivers/usb/serial/metro-usb.c
+++ b/drivers/usb/serial/metro-usb.c
@@ -95,7 +95,6 @@ static void metrousb_read_int_callback(struct urb *urb)
95{ 95{
96 struct usb_serial_port *port = urb->context; 96 struct usb_serial_port *port = urb->context;
97 struct metrousb_private *metro_priv = usb_get_serial_port_data(port); 97 struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
98 struct tty_struct *tty;
99 unsigned char *data = urb->transfer_buffer; 98 unsigned char *data = urb->transfer_buffer;
100 int throttled = 0; 99 int throttled = 0;
101 int result = 0; 100 int result = 0;
@@ -124,15 +123,13 @@ static void metrousb_read_int_callback(struct urb *urb)
124 123
125 124
126 /* Set the data read from the usb port into the serial port buffer. */ 125 /* Set the data read from the usb port into the serial port buffer. */
127 tty = tty_port_tty_get(&port->port); 126 if (urb->actual_length) {
128 if (tty && urb->actual_length) {
129 /* Loop through the data copying each byte to the tty layer. */ 127 /* Loop through the data copying each byte to the tty layer. */
130 tty_insert_flip_string(tty, data, urb->actual_length); 128 tty_insert_flip_string(&port->port, data, urb->actual_length);
131 129
132 /* Force the data to the tty layer. */ 130 /* Force the data to the tty layer. */
133 tty_flip_buffer_push(tty); 131 tty_flip_buffer_push(&port->port);
134 } 132 }
135 tty_kref_put(tty);
136 133
137 /* Set any port variables. */ 134 /* Set any port variables. */
138 spin_lock_irqsave(&metro_priv->lock, flags); 135 spin_lock_irqsave(&metro_priv->lock, flags);
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index f57a6b1fe787..e0ebec3b5d6a 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -899,7 +899,6 @@ static void mos7720_bulk_in_callback(struct urb *urb)
899 int retval; 899 int retval;
900 unsigned char *data ; 900 unsigned char *data ;
901 struct usb_serial_port *port; 901 struct usb_serial_port *port;
902 struct tty_struct *tty;
903 int status = urb->status; 902 int status = urb->status;
904 903
905 if (status) { 904 if (status) {
@@ -913,12 +912,10 @@ static void mos7720_bulk_in_callback(struct urb *urb)
913 912
914 data = urb->transfer_buffer; 913 data = urb->transfer_buffer;
915 914
916 tty = tty_port_tty_get(&port->port); 915 if (urb->actual_length) {
917 if (tty && urb->actual_length) { 916 tty_insert_flip_string(&port->port, data, urb->actual_length);
918 tty_insert_flip_string(tty, data, urb->actual_length); 917 tty_flip_buffer_push(&port->port);
919 tty_flip_buffer_push(tty);
920 } 918 }
921 tty_kref_put(tty);
922 919
923 if (port->read_urb->status != -EINPROGRESS) { 920 if (port->read_urb->status != -EINPROGRESS) {
924 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC); 921 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 66d9e088d9d9..809fb329eca5 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -744,7 +744,6 @@ static void mos7840_bulk_in_callback(struct urb *urb)
744 struct usb_serial *serial; 744 struct usb_serial *serial;
745 struct usb_serial_port *port; 745 struct usb_serial_port *port;
746 struct moschip_port *mos7840_port; 746 struct moschip_port *mos7840_port;
747 struct tty_struct *tty;
748 int status = urb->status; 747 int status = urb->status;
749 748
750 mos7840_port = urb->context; 749 mos7840_port = urb->context;
@@ -773,12 +772,9 @@ static void mos7840_bulk_in_callback(struct urb *urb)
773 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); 772 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
774 773
775 if (urb->actual_length) { 774 if (urb->actual_length) {
776 tty = tty_port_tty_get(&mos7840_port->port->port); 775 struct tty_port *tport = &mos7840_port->port->port;
777 if (tty) { 776 tty_insert_flip_string(tport, data, urb->actual_length);
778 tty_insert_flip_string(tty, data, urb->actual_length); 777 tty_flip_buffer_push(tport);
779 tty_flip_buffer_push(tty);
780 tty_kref_put(tty);
781 }
782 mos7840_port->icount.rx += urb->actual_length; 778 mos7840_port->icount.rx += urb->actual_length;
783 smp_wmb(); 779 smp_wmb();
784 dev_dbg(&port->dev, "mos7840_port->icount.rx is %d:\n", mos7840_port->icount.rx); 780 dev_dbg(&port->dev, "mos7840_port->icount.rx is %d:\n", mos7840_port->icount.rx);
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c
index 1566f8f500ae..38725fc8c2c8 100644
--- a/drivers/usb/serial/navman.c
+++ b/drivers/usb/serial/navman.c
@@ -32,7 +32,6 @@ static void navman_read_int_callback(struct urb *urb)
32{ 32{
33 struct usb_serial_port *port = urb->context; 33 struct usb_serial_port *port = urb->context;
34 unsigned char *data = urb->transfer_buffer; 34 unsigned char *data = urb->transfer_buffer;
35 struct tty_struct *tty;
36 int status = urb->status; 35 int status = urb->status;
37 int result; 36 int result;
38 37
@@ -55,12 +54,10 @@ static void navman_read_int_callback(struct urb *urb)
55 54
56 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); 55 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
57 56
58 tty = tty_port_tty_get(&port->port); 57 if (urb->actual_length) {
59 if (tty && urb->actual_length) { 58 tty_insert_flip_string(&port->port, data, urb->actual_length);
60 tty_insert_flip_string(tty, data, urb->actual_length); 59 tty_flip_buffer_push(&port->port);
61 tty_flip_buffer_push(tty);
62 } 60 }
63 tty_kref_put(tty);
64 61
65exit: 62exit:
66 result = usb_submit_urb(urb, GFP_ATOMIC); 63 result = usb_submit_urb(urb, GFP_ATOMIC);
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
index 7818af931a48..1e1cafe287e4 100644
--- a/drivers/usb/serial/omninet.c
+++ b/drivers/usb/serial/omninet.c
@@ -174,13 +174,9 @@ static void omninet_read_bulk_callback(struct urb *urb)
174 } 174 }
175 175
176 if (urb->actual_length && header->oh_len) { 176 if (urb->actual_length && header->oh_len) {
177 struct tty_struct *tty = tty_port_tty_get(&port->port); 177 tty_insert_flip_string(&port->port, data + OMNINET_DATAOFFSET,
178 if (tty) { 178 header->oh_len);
179 tty_insert_flip_string(tty, data + OMNINET_DATAOFFSET, 179 tty_flip_buffer_push(&port->port);
180 header->oh_len);
181 tty_flip_buffer_push(tty);
182 tty_kref_put(tty);
183 }
184 } 180 }
185 181
186 /* Continue trying to always read */ 182 /* Continue trying to always read */
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c
index c6bfb83efb1e..e13e1a4d3e1e 100644
--- a/drivers/usb/serial/opticon.c
+++ b/drivers/usb/serial/opticon.c
@@ -51,15 +51,8 @@ struct opticon_private {
51static void opticon_process_data_packet(struct usb_serial_port *port, 51static void opticon_process_data_packet(struct usb_serial_port *port,
52 const unsigned char *buf, size_t len) 52 const unsigned char *buf, size_t len)
53{ 53{
54 struct tty_struct *tty; 54 tty_insert_flip_string(&port->port, buf, len);
55 55 tty_flip_buffer_push(&port->port);
56 tty = tty_port_tty_get(&port->port);
57 if (!tty)
58 return;
59
60 tty_insert_flip_string(tty, buf, len);
61 tty_flip_buffer_push(tty);
62 tty_kref_put(tty);
63} 56}
64 57
65static void opticon_process_status_packet(struct usb_serial_port *port, 58static void opticon_process_status_packet(struct usb_serial_port *port,
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c
index d217fd6ee43f..a958fd41b5b3 100644
--- a/drivers/usb/serial/oti6858.c
+++ b/drivers/usb/serial/oti6858.c
@@ -820,7 +820,6 @@ static void oti6858_read_bulk_callback(struct urb *urb)
820{ 820{
821 struct usb_serial_port *port = urb->context; 821 struct usb_serial_port *port = urb->context;
822 struct oti6858_private *priv = usb_get_serial_port_data(port); 822 struct oti6858_private *priv = usb_get_serial_port_data(port);
823 struct tty_struct *tty;
824 unsigned char *data = urb->transfer_buffer; 823 unsigned char *data = urb->transfer_buffer;
825 unsigned long flags; 824 unsigned long flags;
826 int status = urb->status; 825 int status = urb->status;
@@ -835,12 +834,10 @@ static void oti6858_read_bulk_callback(struct urb *urb)
835 return; 834 return;
836 } 835 }
837 836
838 tty = tty_port_tty_get(&port->port); 837 if (urb->actual_length > 0) {
839 if (tty != NULL && urb->actual_length > 0) { 838 tty_insert_flip_string(&port->port, data, urb->actual_length);
840 tty_insert_flip_string(tty, data, urb->actual_length); 839 tty_flip_buffer_push(&port->port);
841 tty_flip_buffer_push(tty);
842 } 840 }
843 tty_kref_put(tty);
844 841
845 /* schedule the interrupt urb */ 842 /* schedule the interrupt urb */
846 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 843 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 600241901361..54adc9125e5c 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -772,7 +772,6 @@ static void pl2303_process_read_urb(struct urb *urb)
772{ 772{
773 struct usb_serial_port *port = urb->context; 773 struct usb_serial_port *port = urb->context;
774 struct pl2303_private *priv = usb_get_serial_port_data(port); 774 struct pl2303_private *priv = usb_get_serial_port_data(port);
775 struct tty_struct *tty;
776 unsigned char *data = urb->transfer_buffer; 775 unsigned char *data = urb->transfer_buffer;
777 char tty_flag = TTY_NORMAL; 776 char tty_flag = TTY_NORMAL;
778 unsigned long flags; 777 unsigned long flags;
@@ -789,10 +788,6 @@ static void pl2303_process_read_urb(struct urb *urb)
789 if (!urb->actual_length) 788 if (!urb->actual_length)
790 return; 789 return;
791 790
792 tty = tty_port_tty_get(&port->port);
793 if (!tty)
794 return;
795
796 /* break takes precedence over parity, */ 791 /* break takes precedence over parity, */
797 /* which takes precedence over framing errors */ 792 /* which takes precedence over framing errors */
798 if (line_status & UART_BREAK_ERROR) 793 if (line_status & UART_BREAK_ERROR)
@@ -805,19 +800,19 @@ static void pl2303_process_read_urb(struct urb *urb)
805 800
806 /* overrun is special, not associated with a char */ 801 /* overrun is special, not associated with a char */
807 if (line_status & UART_OVERRUN_ERROR) 802 if (line_status & UART_OVERRUN_ERROR)
808 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 803 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
809 804
810 if (port->port.console && port->sysrq) { 805 if (port->port.console && port->sysrq) {
811 for (i = 0; i < urb->actual_length; ++i) 806 for (i = 0; i < urb->actual_length; ++i)
812 if (!usb_serial_handle_sysrq_char(port, data[i])) 807 if (!usb_serial_handle_sysrq_char(port, data[i]))
813 tty_insert_flip_char(tty, data[i], tty_flag); 808 tty_insert_flip_char(&port->port, data[i],
809 tty_flag);
814 } else { 810 } else {
815 tty_insert_flip_string_fixed_flag(tty, data, tty_flag, 811 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
816 urb->actual_length); 812 urb->actual_length);
817 } 813 }
818 814
819 tty_flip_buffer_push(tty); 815 tty_flip_buffer_push(&port->port);
820 tty_kref_put(tty);
821} 816}
822 817
823/* All of the device info needed for the PL2303 SIO serial converter */ 818/* All of the device info needed for the PL2303 SIO serial converter */
diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c
index d152be97d041..6850745808c3 100644
--- a/drivers/usb/serial/quatech2.c
+++ b/drivers/usb/serial/quatech2.c
@@ -609,7 +609,6 @@ void qt2_process_read_urb(struct urb *urb)
609 struct qt2_serial_private *serial_priv; 609 struct qt2_serial_private *serial_priv;
610 struct usb_serial_port *port; 610 struct usb_serial_port *port;
611 struct qt2_port_private *port_priv; 611 struct qt2_port_private *port_priv;
612 struct tty_struct *tty;
613 bool escapeflag; 612 bool escapeflag;
614 unsigned char *ch; 613 unsigned char *ch;
615 int i; 614 int i;
@@ -620,15 +619,11 @@ void qt2_process_read_urb(struct urb *urb)
620 return; 619 return;
621 620
622 ch = urb->transfer_buffer; 621 ch = urb->transfer_buffer;
623 tty = NULL;
624 serial = urb->context; 622 serial = urb->context;
625 serial_priv = usb_get_serial_data(serial); 623 serial_priv = usb_get_serial_data(serial);
626 port = serial->port[serial_priv->current_port]; 624 port = serial->port[serial_priv->current_port];
627 port_priv = usb_get_serial_port_data(port); 625 port_priv = usb_get_serial_port_data(port);
628 626
629 if (port_priv->is_open)
630 tty = tty_port_tty_get(&port->port);
631
632 for (i = 0; i < urb->actual_length; i++) { 627 for (i = 0; i < urb->actual_length; i++) {
633 ch = (unsigned char *)urb->transfer_buffer + i; 628 ch = (unsigned char *)urb->transfer_buffer + i;
634 if ((i <= (len - 3)) && 629 if ((i <= (len - 3)) &&
@@ -666,10 +661,7 @@ void qt2_process_read_urb(struct urb *urb)
666 __func__); 661 __func__);
667 break; 662 break;
668 } 663 }
669 if (tty) { 664 tty_flip_buffer_push(&port->port);
670 tty_flip_buffer_push(tty);
671 tty_kref_put(tty);
672 }
673 665
674 newport = *(ch + 3); 666 newport = *(ch + 3);
675 667
@@ -683,10 +675,6 @@ void qt2_process_read_urb(struct urb *urb)
683 serial_priv->current_port = newport; 675 serial_priv->current_port = newport;
684 port = serial->port[serial_priv->current_port]; 676 port = serial->port[serial_priv->current_port];
685 port_priv = usb_get_serial_port_data(port); 677 port_priv = usb_get_serial_port_data(port);
686 if (port_priv->is_open)
687 tty = tty_port_tty_get(&port->port);
688 else
689 tty = NULL;
690 i += 3; 678 i += 3;
691 escapeflag = true; 679 escapeflag = true;
692 break; 680 break;
@@ -697,8 +685,8 @@ void qt2_process_read_urb(struct urb *urb)
697 escapeflag = true; 685 escapeflag = true;
698 break; 686 break;
699 case QT2_CONTROL_ESCAPE: 687 case QT2_CONTROL_ESCAPE:
700 tty_buffer_request_room(tty, 2); 688 tty_buffer_request_room(&port->port, 2);
701 tty_insert_flip_string(tty, ch, 2); 689 tty_insert_flip_string(&port->port, ch, 2);
702 i += 2; 690 i += 2;
703 escapeflag = true; 691 escapeflag = true;
704 break; 692 break;
@@ -712,16 +700,11 @@ void qt2_process_read_urb(struct urb *urb)
712 continue; 700 continue;
713 } 701 }
714 702
715 if (tty) { 703 tty_buffer_request_room(&port->port, 1);
716 tty_buffer_request_room(tty, 1); 704 tty_insert_flip_string(&port->port, ch, 1);
717 tty_insert_flip_string(tty, ch, 1);
718 }
719 } 705 }
720 706
721 if (tty) { 707 tty_flip_buffer_push(&port->port);
722 tty_flip_buffer_push(tty);
723 tty_kref_put(tty);
724 }
725} 708}
726 709
727static void qt2_write_bulk_callback(struct urb *urb) 710static void qt2_write_bulk_callback(struct urb *urb)
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c
index c949ce6ef0c6..21cd7bf2a8cc 100644
--- a/drivers/usb/serial/safe_serial.c
+++ b/drivers/usb/serial/safe_serial.c
@@ -207,38 +207,31 @@ static void safe_process_read_urb(struct urb *urb)
207 unsigned char *data = urb->transfer_buffer; 207 unsigned char *data = urb->transfer_buffer;
208 unsigned char length = urb->actual_length; 208 unsigned char length = urb->actual_length;
209 int actual_length; 209 int actual_length;
210 struct tty_struct *tty;
211 __u16 fcs; 210 __u16 fcs;
212 211
213 if (!length) 212 if (!length)
214 return; 213 return;
215 214
216 tty = tty_port_tty_get(&port->port);
217 if (!tty)
218 return;
219
220 if (!safe) 215 if (!safe)
221 goto out; 216 goto out;
222 217
223 fcs = fcs_compute10(data, length, CRC10_INITFCS); 218 fcs = fcs_compute10(data, length, CRC10_INITFCS);
224 if (fcs) { 219 if (fcs) {
225 dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); 220 dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs);
226 goto err; 221 return;
227 } 222 }
228 223
229 actual_length = data[length - 2] >> 2; 224 actual_length = data[length - 2] >> 2;
230 if (actual_length > (length - 2)) { 225 if (actual_length > (length - 2)) {
231 dev_err(&port->dev, "%s - inconsistent lengths %d:%d\n", 226 dev_err(&port->dev, "%s - inconsistent lengths %d:%d\n",
232 __func__, actual_length, length); 227 __func__, actual_length, length);
233 goto err; 228 return;
234 } 229 }
235 dev_info(&urb->dev->dev, "%s - actual: %d\n", __func__, actual_length); 230 dev_info(&urb->dev->dev, "%s - actual: %d\n", __func__, actual_length);
236 length = actual_length; 231 length = actual_length;
237out: 232out:
238 tty_insert_flip_string(tty, data, length); 233 tty_insert_flip_string(&port->port, data, length);
239 tty_flip_buffer_push(tty); 234 tty_flip_buffer_push(&port->port);
240err:
241 tty_kref_put(tty);
242} 235}
243 236
244static int safe_prepare_write_buffer(struct usb_serial_port *port, 237static int safe_prepare_write_buffer(struct usb_serial_port *port,
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index af06f2f5f38b..70aee8d59f23 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -569,7 +569,6 @@ static void sierra_indat_callback(struct urb *urb)
569 int err; 569 int err;
570 int endpoint; 570 int endpoint;
571 struct usb_serial_port *port; 571 struct usb_serial_port *port;
572 struct tty_struct *tty;
573 unsigned char *data = urb->transfer_buffer; 572 unsigned char *data = urb->transfer_buffer;
574 int status = urb->status; 573 int status = urb->status;
575 574
@@ -581,16 +580,12 @@ static void sierra_indat_callback(struct urb *urb)
581 " endpoint %02x\n", __func__, status, endpoint); 580 " endpoint %02x\n", __func__, status, endpoint);
582 } else { 581 } else {
583 if (urb->actual_length) { 582 if (urb->actual_length) {
584 tty = tty_port_tty_get(&port->port); 583 tty_insert_flip_string(&port->port, data,
585 if (tty) { 584 urb->actual_length);
586 tty_insert_flip_string(tty, data, 585 tty_flip_buffer_push(&port->port);
587 urb->actual_length); 586
588 tty_flip_buffer_push(tty); 587 usb_serial_debug_data(&port->dev, __func__,
589 588 urb->actual_length, data);
590 tty_kref_put(tty);
591 usb_serial_debug_data(&port->dev, __func__,
592 urb->actual_length, data);
593 }
594 } else { 589 } else {
595 dev_dbg(&port->dev, "%s: empty read urb" 590 dev_dbg(&port->dev, "%s: empty read urb"
596 " received\n", __func__); 591 " received\n", __func__);
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
index a42536af1256..91ff8e3bddbd 100644
--- a/drivers/usb/serial/spcp8x5.c
+++ b/drivers/usb/serial/spcp8x5.c
@@ -462,7 +462,6 @@ static void spcp8x5_process_read_urb(struct urb *urb)
462{ 462{
463 struct usb_serial_port *port = urb->context; 463 struct usb_serial_port *port = urb->context;
464 struct spcp8x5_private *priv = usb_get_serial_port_data(port); 464 struct spcp8x5_private *priv = usb_get_serial_port_data(port);
465 struct tty_struct *tty;
466 unsigned char *data = urb->transfer_buffer; 465 unsigned char *data = urb->transfer_buffer;
467 unsigned long flags; 466 unsigned long flags;
468 u8 status; 467 u8 status;
@@ -481,9 +480,6 @@ static void spcp8x5_process_read_urb(struct urb *urb)
481 if (!urb->actual_length) 480 if (!urb->actual_length)
482 return; 481 return;
483 482
484 tty = tty_port_tty_get(&port->port);
485 if (!tty)
486 return;
487 483
488 if (status & UART_STATE_TRANSIENT_MASK) { 484 if (status & UART_STATE_TRANSIENT_MASK) {
489 /* break takes precedence over parity, which takes precedence 485 /* break takes precedence over parity, which takes precedence
@@ -498,17 +494,21 @@ static void spcp8x5_process_read_urb(struct urb *urb)
498 494
499 /* overrun is special, not associated with a char */ 495 /* overrun is special, not associated with a char */
500 if (status & UART_OVERRUN_ERROR) 496 if (status & UART_OVERRUN_ERROR)
501 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 497 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
502 498
503 if (status & UART_DCD) 499 if (status & UART_DCD) {
504 usb_serial_handle_dcd_change(port, tty, 500 struct tty_struct *tty = tty_port_tty_get(&port->port);
505 priv->line_status & MSR_STATUS_LINE_DCD); 501 if (tty) {
502 usb_serial_handle_dcd_change(port, tty,
503 priv->line_status & MSR_STATUS_LINE_DCD);
504 tty_kref_put(tty);
505 }
506 }
506 } 507 }
507 508
508 tty_insert_flip_string_fixed_flag(tty, data, tty_flag, 509 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
509 urb->actual_length); 510 urb->actual_length);
510 tty_flip_buffer_push(tty); 511 tty_flip_buffer_push(&port->port);
511 tty_kref_put(tty);
512} 512}
513 513
514static int spcp8x5_wait_modem_info(struct usb_serial_port *port, 514static int spcp8x5_wait_modem_info(struct usb_serial_port *port,
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c
index 4543ea350229..58bc7e793524 100644
--- a/drivers/usb/serial/ssu100.c
+++ b/drivers/usb/serial/ssu100.c
@@ -582,8 +582,7 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,
582 582
583} 583}
584 584
585static int ssu100_process_packet(struct urb *urb, 585static void ssu100_process_read_urb(struct urb *urb)
586 struct tty_struct *tty)
587{ 586{
588 struct usb_serial_port *port = urb->context; 587 struct usb_serial_port *port = urb->context;
589 char *packet = (char *)urb->transfer_buffer; 588 char *packet = (char *)urb->transfer_buffer;
@@ -598,7 +597,8 @@ static int ssu100_process_packet(struct urb *urb,
598 if (packet[2] == 0x00) { 597 if (packet[2] == 0x00) {
599 ssu100_update_lsr(port, packet[3], &flag); 598 ssu100_update_lsr(port, packet[3], &flag);
600 if (flag == TTY_OVERRUN) 599 if (flag == TTY_OVERRUN)
601 tty_insert_flip_char(tty, 0, TTY_OVERRUN); 600 tty_insert_flip_char(&port->port, 0,
601 TTY_OVERRUN);
602 } 602 }
603 if (packet[2] == 0x01) 603 if (packet[2] == 0x01)
604 ssu100_update_msr(port, packet[3]); 604 ssu100_update_msr(port, packet[3]);
@@ -609,34 +609,17 @@ static int ssu100_process_packet(struct urb *urb,
609 ch = packet; 609 ch = packet;
610 610
611 if (!len) 611 if (!len)
612 return 0; /* status only */ 612 return; /* status only */
613 613
614 if (port->port.console && port->sysrq) { 614 if (port->port.console && port->sysrq) {
615 for (i = 0; i < len; i++, ch++) { 615 for (i = 0; i < len; i++, ch++) {
616 if (!usb_serial_handle_sysrq_char(port, *ch)) 616 if (!usb_serial_handle_sysrq_char(port, *ch))
617 tty_insert_flip_char(tty, *ch, flag); 617 tty_insert_flip_char(&port->port, *ch, flag);
618 } 618 }
619 } else 619 } else
620 tty_insert_flip_string_fixed_flag(tty, ch, flag, len); 620 tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
621
622 return len;
623}
624
625static void ssu100_process_read_urb(struct urb *urb)
626{
627 struct usb_serial_port *port = urb->context;
628 struct tty_struct *tty;
629 int count;
630
631 tty = tty_port_tty_get(&port->port);
632 if (!tty)
633 return;
634
635 count = ssu100_process_packet(urb, tty);
636 621
637 if (count) 622 tty_flip_buffer_push(&port->port);
638 tty_flip_buffer_push(tty);
639 tty_kref_put(tty);
640} 623}
641 624
642static struct usb_serial_driver ssu100_device = { 625static struct usb_serial_driver ssu100_device = {
diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c
index 701fffa8431f..be05e6caf9a3 100644
--- a/drivers/usb/serial/symbolserial.c
+++ b/drivers/usb/serial/symbolserial.c
@@ -48,7 +48,6 @@ static void symbol_int_callback(struct urb *urb)
48 unsigned char *data = urb->transfer_buffer; 48 unsigned char *data = urb->transfer_buffer;
49 struct usb_serial_port *port = priv->port; 49 struct usb_serial_port *port = priv->port;
50 int status = urb->status; 50 int status = urb->status;
51 struct tty_struct *tty;
52 int result; 51 int result;
53 int data_length; 52 int data_length;
54 53
@@ -82,12 +81,8 @@ static void symbol_int_callback(struct urb *urb)
82 * we pretty much just ignore the size and send everything 81 * we pretty much just ignore the size and send everything
83 * else to the tty layer. 82 * else to the tty layer.
84 */ 83 */
85 tty = tty_port_tty_get(&port->port); 84 tty_insert_flip_string(&port->port, &data[1], data_length);
86 if (tty) { 85 tty_flip_buffer_push(&port->port);
87 tty_insert_flip_string(tty, &data[1], data_length);
88 tty_flip_buffer_push(tty);
89 tty_kref_put(tty);
90 }
91 } else { 86 } else {
92 dev_dbg(&priv->udev->dev, 87 dev_dbg(&priv->udev->dev,
93 "Improper amount of data received from the device, " 88 "Improper amount of data received from the device, "
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
index f2530d2ef3c4..39cb9b807c3c 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -121,8 +121,8 @@ static void ti_interrupt_callback(struct urb *urb);
121static void ti_bulk_in_callback(struct urb *urb); 121static void ti_bulk_in_callback(struct urb *urb);
122static void ti_bulk_out_callback(struct urb *urb); 122static void ti_bulk_out_callback(struct urb *urb);
123 123
124static void ti_recv(struct device *dev, struct tty_struct *tty, 124static void ti_recv(struct usb_serial_port *port, unsigned char *data,
125 unsigned char *data, int length); 125 int length);
126static void ti_send(struct ti_port *tport); 126static void ti_send(struct ti_port *tport);
127static int ti_set_mcr(struct ti_port *tport, unsigned int mcr); 127static int ti_set_mcr(struct ti_port *tport, unsigned int mcr);
128static int ti_get_lsr(struct ti_port *tport); 128static int ti_get_lsr(struct ti_port *tport);
@@ -1118,7 +1118,6 @@ static void ti_bulk_in_callback(struct urb *urb)
1118 struct device *dev = &urb->dev->dev; 1118 struct device *dev = &urb->dev->dev;
1119 int status = urb->status; 1119 int status = urb->status;
1120 int retval = 0; 1120 int retval = 0;
1121 struct tty_struct *tty;
1122 1121
1123 switch (status) { 1122 switch (status) {
1124 case 0: 1123 case 0:
@@ -1145,24 +1144,18 @@ static void ti_bulk_in_callback(struct urb *urb)
1145 return; 1144 return;
1146 } 1145 }
1147 1146
1148 tty = tty_port_tty_get(&port->port); 1147 if (urb->actual_length) {
1149 if (tty) { 1148 usb_serial_debug_data(dev, __func__, urb->actual_length,
1150 if (urb->actual_length) { 1149 urb->transfer_buffer);
1151 usb_serial_debug_data(dev, __func__, urb->actual_length,
1152 urb->transfer_buffer);
1153 1150
1154 if (!tport->tp_is_open) 1151 if (!tport->tp_is_open)
1155 dev_dbg(dev, "%s - port closed, dropping data\n", 1152 dev_dbg(dev, "%s - port closed, dropping data\n",
1156 __func__); 1153 __func__);
1157 else 1154 else
1158 ti_recv(&urb->dev->dev, tty, 1155 ti_recv(port, urb->transfer_buffer, urb->actual_length);
1159 urb->transfer_buffer, 1156 spin_lock(&tport->tp_lock);
1160 urb->actual_length); 1157 tport->tp_icount.rx += urb->actual_length;
1161 spin_lock(&tport->tp_lock); 1158 spin_unlock(&tport->tp_lock);
1162 tport->tp_icount.rx += urb->actual_length;
1163 spin_unlock(&tport->tp_lock);
1164 }
1165 tty_kref_put(tty);
1166 } 1159 }
1167 1160
1168exit: 1161exit:
@@ -1210,24 +1203,23 @@ static void ti_bulk_out_callback(struct urb *urb)
1210} 1203}
1211 1204
1212 1205
1213static void ti_recv(struct device *dev, struct tty_struct *tty, 1206static void ti_recv(struct usb_serial_port *port, unsigned char *data,
1214 unsigned char *data, int length) 1207 int length)
1215{ 1208{
1216 int cnt; 1209 int cnt;
1217 1210
1218 do { 1211 do {
1219 cnt = tty_insert_flip_string(tty, data, length); 1212 cnt = tty_insert_flip_string(&port->port, data, length);
1220 if (cnt < length) { 1213 if (cnt < length) {
1221 dev_err(dev, "%s - dropping data, %d bytes lost\n", 1214 dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
1222 __func__, length - cnt); 1215 __func__, length - cnt);
1223 if (cnt == 0) 1216 if (cnt == 0)
1224 break; 1217 break;
1225 } 1218 }
1226 tty_flip_buffer_push(tty); 1219 tty_flip_buffer_push(&port->port);
1227 data += cnt; 1220 data += cnt;
1228 length -= cnt; 1221 length -= cnt;
1229 } while (length > 0); 1222 } while (length > 0);
1230
1231} 1223}
1232 1224
1233 1225
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c
index 01c94aada56c..a547c91e3c05 100644
--- a/drivers/usb/serial/usb_wwan.c
+++ b/drivers/usb/serial/usb_wwan.c
@@ -275,7 +275,6 @@ static void usb_wwan_indat_callback(struct urb *urb)
275 int err; 275 int err;
276 int endpoint; 276 int endpoint;
277 struct usb_serial_port *port; 277 struct usb_serial_port *port;
278 struct tty_struct *tty;
279 struct device *dev; 278 struct device *dev;
280 unsigned char *data = urb->transfer_buffer; 279 unsigned char *data = urb->transfer_buffer;
281 int status = urb->status; 280 int status = urb->status;
@@ -288,16 +287,12 @@ static void usb_wwan_indat_callback(struct urb *urb)
288 dev_dbg(dev, "%s: nonzero status: %d on endpoint %02x.\n", 287 dev_dbg(dev, "%s: nonzero status: %d on endpoint %02x.\n",
289 __func__, status, endpoint); 288 __func__, status, endpoint);
290 } else { 289 } else {
291 tty = tty_port_tty_get(&port->port); 290 if (urb->actual_length) {
292 if (tty) { 291 tty_insert_flip_string(&port->port, data,
293 if (urb->actual_length) { 292 urb->actual_length);
294 tty_insert_flip_string(tty, data, 293 tty_flip_buffer_push(&port->port);
295 urb->actual_length); 294 } else
296 tty_flip_buffer_push(tty); 295 dev_dbg(dev, "%s: empty read urb received\n", __func__);
297 } else
298 dev_dbg(dev, "%s: empty read urb received\n", __func__);
299 tty_kref_put(tty);
300 }
301 296
302 /* Resubmit urb so we continue receiving */ 297 /* Resubmit urb so we continue receiving */
303 err = usb_submit_urb(urb, GFP_ATOMIC); 298 err = usb_submit_urb(urb, GFP_ATOMIC);
diff --git a/fs/proc/Makefile b/fs/proc/Makefile
index 981b05601931..712f24db9600 100644
--- a/fs/proc/Makefile
+++ b/fs/proc/Makefile
@@ -8,7 +8,8 @@ proc-y := nommu.o task_nommu.o
8proc-$(CONFIG_MMU) := mmu.o task_mmu.o 8proc-$(CONFIG_MMU) := mmu.o task_mmu.o
9 9
10proc-y += inode.o root.o base.o generic.o array.o \ 10proc-y += inode.o root.o base.o generic.o array.o \
11 proc_tty.o fd.o 11 fd.o
12proc-$(CONFIG_TTY) += proc_tty.o
12proc-y += cmdline.o 13proc-y += cmdline.o
13proc-y += consoles.o 14proc-y += consoles.o
14proc-y += cpuinfo.o 15proc-y += cpuinfo.o
diff --git a/include/linux/console.h b/include/linux/console.h
index dedb082fe50f..3b709da1786e 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -157,7 +157,12 @@ extern int is_console_locked(void);
157extern int braille_register_console(struct console *, int index, 157extern int braille_register_console(struct console *, int index,
158 char *console_options, char *braille_options); 158 char *console_options, char *braille_options);
159extern int braille_unregister_console(struct console *); 159extern int braille_unregister_console(struct console *);
160#ifdef CONFIG_TTY
160extern void console_sysfs_notify(void); 161extern void console_sysfs_notify(void);
162#else
163static inline void console_sysfs_notify(void)
164{ }
165#endif
161extern bool console_suspend_enabled; 166extern bool console_suspend_enabled;
162 167
163/* Suspend and resume console messages over PM events */ 168/* Suspend and resume console messages over PM events */
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 0eb65796bcb9..19e8d7a42b34 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1868,8 +1868,23 @@
1868#define PCI_VENDOR_ID_QUATECH 0x135C 1868#define PCI_VENDOR_ID_QUATECH 0x135C
1869#define PCI_DEVICE_ID_QUATECH_QSC100 0x0010 1869#define PCI_DEVICE_ID_QUATECH_QSC100 0x0010
1870#define PCI_DEVICE_ID_QUATECH_DSC100 0x0020 1870#define PCI_DEVICE_ID_QUATECH_DSC100 0x0020
1871#define PCI_DEVICE_ID_QUATECH_DSC200 0x0030
1872#define PCI_DEVICE_ID_QUATECH_QSC200 0x0040
1871#define PCI_DEVICE_ID_QUATECH_ESC100D 0x0050 1873#define PCI_DEVICE_ID_QUATECH_ESC100D 0x0050
1872#define PCI_DEVICE_ID_QUATECH_ESC100M 0x0060 1874#define PCI_DEVICE_ID_QUATECH_ESC100M 0x0060
1875#define PCI_DEVICE_ID_QUATECH_QSCP100 0x0120
1876#define PCI_DEVICE_ID_QUATECH_DSCP100 0x0130
1877#define PCI_DEVICE_ID_QUATECH_QSCP200 0x0140
1878#define PCI_DEVICE_ID_QUATECH_DSCP200 0x0150
1879#define PCI_DEVICE_ID_QUATECH_QSCLP100 0x0170
1880#define PCI_DEVICE_ID_QUATECH_DSCLP100 0x0180
1881#define PCI_DEVICE_ID_QUATECH_DSC100E 0x0181
1882#define PCI_DEVICE_ID_QUATECH_SSCLP100 0x0190
1883#define PCI_DEVICE_ID_QUATECH_QSCLP200 0x01A0
1884#define PCI_DEVICE_ID_QUATECH_DSCLP200 0x01B0
1885#define PCI_DEVICE_ID_QUATECH_DSC200E 0x01B1
1886#define PCI_DEVICE_ID_QUATECH_SSCLP200 0x01C0
1887#define PCI_DEVICE_ID_QUATECH_ESCLP100 0x01E0
1873#define PCI_DEVICE_ID_QUATECH_SPPXP_100 0x0278 1888#define PCI_DEVICE_ID_QUATECH_SPPXP_100 0x0278
1874 1889
1875#define PCI_VENDOR_ID_SEALEVEL 0x135e 1890#define PCI_VENDOR_ID_SEALEVEL 0x135e
diff --git a/include/linux/platform_data/sccnxp.h b/include/linux/platform_data/serial-sccnxp.h
index 7311ccd3217f..215574d1e81d 100644
--- a/include/linux/platform_data/sccnxp.h
+++ b/include/linux/platform_data/serial-sccnxp.h
@@ -11,8 +11,8 @@
11 * (at your option) any later version. 11 * (at your option) any later version.
12 */ 12 */
13 13
14#ifndef __SCCNXP_H 14#ifndef _PLATFORM_DATA_SERIAL_SCCNXP_H_
15#define __SCCNXP_H 15#define _PLATFORM_DATA_SERIAL_SCCNXP_H_
16 16
17#define SCCNXP_MAX_UARTS 2 17#define SCCNXP_MAX_UARTS 2
18 18
@@ -84,6 +84,8 @@ struct sccnxp_pdata {
84 const u8 reg_shift; 84 const u8 reg_shift;
85 /* Modem control lines configuration */ 85 /* Modem control lines configuration */
86 const u32 mctrl_cfg[SCCNXP_MAX_UARTS]; 86 const u32 mctrl_cfg[SCCNXP_MAX_UARTS];
87 /* Timer value for polling mode (usecs) */
88 const unsigned int poll_time_us;
87 /* Called during startup */ 89 /* Called during startup */
88 void (*init)(void); 90 void (*init)(void);
89 /* Called before finish */ 91 /* Called before finish */
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index 32676b35d2f5..3c22538aab66 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -127,7 +127,12 @@ extern void pid_ns_release_proc(struct pid_namespace *ns);
127 * proc_tty.c 127 * proc_tty.c
128 */ 128 */
129struct tty_driver; 129struct tty_driver;
130#ifdef CONFIG_TTY
130extern void proc_tty_init(void); 131extern void proc_tty_init(void);
132#else
133static inline void proc_tty_init(void)
134{ }
135#endif
131extern void proc_tty_register_driver(struct tty_driver *driver); 136extern void proc_tty_register_driver(struct tty_driver *driver);
132extern void proc_tty_unregister_driver(struct tty_driver *driver); 137extern void proc_tty_unregister_driver(struct tty_driver *driver);
133 138
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index c490d20b3fb8..af47a8af6024 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -59,6 +59,8 @@ enum {
59 PLAT8250_DEV_SM501, 59 PLAT8250_DEV_SM501,
60}; 60};
61 61
62struct uart_8250_dma;
63
62/* 64/*
63 * This should be used by drivers which want to register 65 * This should be used by drivers which want to register
64 * their own 8250 ports without registering their own 66 * their own 8250 ports without registering their own
@@ -91,6 +93,8 @@ struct uart_8250_port {
91#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA 93#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
92 unsigned char msr_saved_flags; 94 unsigned char msr_saved_flags;
93 95
96 struct uart_8250_dma *dma;
97
94 /* 8250 specific callbacks */ 98 /* 8250 specific callbacks */
95 int (*dl_read)(struct uart_8250_port *); 99 int (*dl_read)(struct uart_8250_port *);
96 void (*dl_write)(struct uart_8250_port *, int); 100 void (*dl_write)(struct uart_8250_port *, int);
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index c6690a2a27fb..82aebc8ff77f 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -37,8 +37,8 @@ struct serial_struct;
37struct device; 37struct device;
38 38
39/* 39/*
40 * This structure describes all the operations that can be 40 * This structure describes all the operations that can be done on the
41 * done on the physical hardware. 41 * physical hardware. See Documentation/serial/driver for details.
42 */ 42 */
43struct uart_ops { 43struct uart_ops {
44 unsigned int (*tx_empty)(struct uart_port *); 44 unsigned int (*tx_empty)(struct uart_port *);
@@ -65,7 +65,7 @@ struct uart_ops {
65 /* 65 /*
66 * Return a string describing the type of the port 66 * Return a string describing the type of the port
67 */ 67 */
68 const char *(*type)(struct uart_port *); 68 const char *(*type)(struct uart_port *);
69 69
70 /* 70 /*
71 * Release IO and memory resources used by the port. 71 * Release IO and memory resources used by the port.
@@ -83,7 +83,7 @@ struct uart_ops {
83 int (*ioctl)(struct uart_port *, unsigned int, unsigned long); 83 int (*ioctl)(struct uart_port *, unsigned int, unsigned long);
84#ifdef CONFIG_CONSOLE_POLL 84#ifdef CONFIG_CONSOLE_POLL
85 int (*poll_init)(struct uart_port *); 85 int (*poll_init)(struct uart_port *);
86 void (*poll_put_char)(struct uart_port *, unsigned char); 86 void (*poll_put_char)(struct uart_port *, unsigned char);
87 int (*poll_get_char)(struct uart_port *); 87 int (*poll_get_char)(struct uart_port *);
88#endif 88#endif
89}; 89};
@@ -136,7 +136,6 @@ struct uart_port {
136#define UPIO_MEM32 (3) 136#define UPIO_MEM32 (3)
137#define UPIO_AU (4) /* Au1x00 type IO */ 137#define UPIO_AU (4) /* Au1x00 type IO */
138#define UPIO_TSI (5) /* Tsi108/109 type IO */ 138#define UPIO_TSI (5) /* Tsi108/109 type IO */
139#define UPIO_RM9000 (6) /* RM9000 type IO */
140 139
141 unsigned int read_status_mask; /* driver specific */ 140 unsigned int read_status_mask; /* driver specific */
142 unsigned int ignore_status_mask; /* driver specific */ 141 unsigned int ignore_status_mask; /* driver specific */
@@ -208,13 +207,25 @@ static inline void serial_port_out(struct uart_port *up, int offset, int value)
208 up->serial_out(up, offset, value); 207 up->serial_out(up, offset, value);
209} 208}
210 209
210/**
211 * enum uart_pm_state - power states for UARTs
212 * @UART_PM_STATE_ON: UART is powered, up and operational
213 * @UART_PM_STATE_OFF: UART is powered off
214 * @UART_PM_STATE_UNDEFINED: sentinel
215 */
216enum uart_pm_state {
217 UART_PM_STATE_ON = 0,
218 UART_PM_STATE_OFF = 3, /* number taken from ACPI */
219 UART_PM_STATE_UNDEFINED,
220};
221
211/* 222/*
212 * This is the state information which is persistent across opens. 223 * This is the state information which is persistent across opens.
213 */ 224 */
214struct uart_state { 225struct uart_state {
215 struct tty_port port; 226 struct tty_port port;
216 227
217 int pm_state; 228 enum uart_pm_state pm_state;
218 struct circ_buf xmit; 229 struct circ_buf xmit;
219 230
220 struct uart_port *uart_port; 231 struct uart_port *uart_port;
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 8db1b569c37a..c75d886b0307 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -202,7 +202,8 @@ struct tty_port {
202 unsigned long iflags; /* TTYP_ internal flags */ 202 unsigned long iflags; /* TTYP_ internal flags */
203#define TTYP_FLUSHING 1 /* Flushing to ldisc in progress */ 203#define TTYP_FLUSHING 1 /* Flushing to ldisc in progress */
204#define TTYP_FLUSHPENDING 2 /* Queued buffer flush pending */ 204#define TTYP_FLUSHPENDING 2 /* Queued buffer flush pending */
205 unsigned char console:1; /* port is a console */ 205 unsigned char console:1, /* port is a console */
206 low_latency:1; /* direct buffer flush */
206 struct mutex mutex; /* Locking */ 207 struct mutex mutex; /* Locking */
207 struct mutex buf_mutex; /* Buffer alloc lock */ 208 struct mutex buf_mutex; /* Buffer alloc lock */
208 unsigned char *xmit_buf; /* Optional buffer */ 209 unsigned char *xmit_buf; /* Optional buffer */
@@ -254,7 +255,7 @@ struct tty_struct {
254 int count; 255 int count;
255 struct winsize winsize; /* termios mutex */ 256 struct winsize winsize; /* termios mutex */
256 unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1; 257 unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1;
257 unsigned char low_latency:1, warned:1; 258 unsigned char warned:1;
258 unsigned char ctrl_status; /* ctrl_lock */ 259 unsigned char ctrl_status; /* ctrl_lock */
259 unsigned int receive_room; /* Bytes free for queue */ 260 unsigned int receive_room; /* Bytes free for queue */
260 261
@@ -317,11 +318,43 @@ struct tty_file_private {
317 318
318#define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) 319#define TTY_WRITE_FLUSH(tty) tty_write_flush((tty))
319 320
321#ifdef CONFIG_TTY
322extern void console_init(void);
323extern void tty_kref_put(struct tty_struct *tty);
324extern struct pid *tty_get_pgrp(struct tty_struct *tty);
325extern void tty_vhangup_self(void);
326extern void disassociate_ctty(int priv);
327extern dev_t tty_devnum(struct tty_struct *tty);
328extern void proc_clear_tty(struct task_struct *p);
329extern struct tty_struct *get_current_tty(void);
330/* tty_io.c */
331extern int __init tty_init(void);
332#else
333static inline void console_init(void)
334{ }
335static inline void tty_kref_put(struct tty_struct *tty)
336{ }
337static inline struct pid *tty_get_pgrp(struct tty_struct *tty)
338{ return NULL; }
339static inline void tty_vhangup_self(void)
340{ }
341static inline void disassociate_ctty(int priv)
342{ }
343static inline dev_t tty_devnum(struct tty_struct *tty)
344{ return 0; }
345static inline void proc_clear_tty(struct task_struct *p)
346{ }
347static inline struct tty_struct *get_current_tty(void)
348{ return NULL; }
349/* tty_io.c */
350static inline int __init tty_init(void)
351{ return 0; }
352#endif
353
320extern void tty_write_flush(struct tty_struct *); 354extern void tty_write_flush(struct tty_struct *);
321 355
322extern struct ktermios tty_std_termios; 356extern struct ktermios tty_std_termios;
323 357
324extern void console_init(void);
325extern int vcs_init(void); 358extern int vcs_init(void);
326 359
327extern struct class *tty_class; 360extern struct class *tty_class;
@@ -341,7 +374,6 @@ static inline struct tty_struct *tty_kref_get(struct tty_struct *tty)
341 kref_get(&tty->kref); 374 kref_get(&tty->kref);
342 return tty; 375 return tty;
343} 376}
344extern void tty_kref_put(struct tty_struct *tty);
345 377
346extern int tty_paranoia_check(struct tty_struct *tty, struct inode *inode, 378extern int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
347 const char *routine); 379 const char *routine);
@@ -373,20 +405,16 @@ extern void tty_driver_remove_tty(struct tty_driver *driver,
373 struct tty_struct *tty); 405 struct tty_struct *tty);
374extern void tty_free_termios(struct tty_struct *tty); 406extern void tty_free_termios(struct tty_struct *tty);
375extern int is_current_pgrp_orphaned(void); 407extern int is_current_pgrp_orphaned(void);
376extern struct pid *tty_get_pgrp(struct tty_struct *tty);
377extern int is_ignored(int sig); 408extern int is_ignored(int sig);
378extern int tty_signal(int sig, struct tty_struct *tty); 409extern int tty_signal(int sig, struct tty_struct *tty);
379extern void tty_hangup(struct tty_struct *tty); 410extern void tty_hangup(struct tty_struct *tty);
380extern void tty_vhangup(struct tty_struct *tty); 411extern void tty_vhangup(struct tty_struct *tty);
381extern void tty_vhangup_locked(struct tty_struct *tty); 412extern void tty_vhangup_locked(struct tty_struct *tty);
382extern void tty_vhangup_self(void);
383extern void tty_unhangup(struct file *filp); 413extern void tty_unhangup(struct file *filp);
384extern int tty_hung_up_p(struct file *filp); 414extern int tty_hung_up_p(struct file *filp);
385extern void do_SAK(struct tty_struct *tty); 415extern void do_SAK(struct tty_struct *tty);
386extern void __do_SAK(struct tty_struct *tty); 416extern void __do_SAK(struct tty_struct *tty);
387extern void disassociate_ctty(int priv);
388extern void no_tty(void); 417extern void no_tty(void);
389extern void tty_flip_buffer_push(struct tty_struct *tty);
390extern void tty_flush_to_ldisc(struct tty_struct *tty); 418extern void tty_flush_to_ldisc(struct tty_struct *tty);
391extern void tty_buffer_free_all(struct tty_port *port); 419extern void tty_buffer_free_all(struct tty_port *port);
392extern void tty_buffer_flush(struct tty_struct *tty); 420extern void tty_buffer_flush(struct tty_struct *tty);
@@ -415,9 +443,6 @@ extern long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
415extern int tty_mode_ioctl(struct tty_struct *tty, struct file *file, 443extern int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
416 unsigned int cmd, unsigned long arg); 444 unsigned int cmd, unsigned long arg);
417extern int tty_perform_flush(struct tty_struct *tty, unsigned long arg); 445extern int tty_perform_flush(struct tty_struct *tty, unsigned long arg);
418extern dev_t tty_devnum(struct tty_struct *tty);
419extern void proc_clear_tty(struct task_struct *p);
420extern struct tty_struct *get_current_tty(void);
421extern void tty_default_fops(struct file_operations *fops); 446extern void tty_default_fops(struct file_operations *fops);
422extern struct tty_struct *alloc_tty_struct(void); 447extern struct tty_struct *alloc_tty_struct(void);
423extern int tty_alloc_file(struct file *file); 448extern int tty_alloc_file(struct file *file);
@@ -543,9 +568,6 @@ static inline int tty_audit_push_task(struct task_struct *tsk,
543} 568}
544#endif 569#endif
545 570
546/* tty_io.c */
547extern int __init tty_init(void);
548
549/* tty_ioctl.c */ 571/* tty_ioctl.c */
550extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file, 572extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
551 unsigned int cmd, unsigned long arg); 573 unsigned int cmd, unsigned long arg);
diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h
index 2002344ed36a..e0f252633b47 100644
--- a/include/linux/tty_flip.h
+++ b/include/linux/tty_flip.h
@@ -1,28 +1,34 @@
1#ifndef _LINUX_TTY_FLIP_H 1#ifndef _LINUX_TTY_FLIP_H
2#define _LINUX_TTY_FLIP_H 2#define _LINUX_TTY_FLIP_H
3 3
4extern int tty_buffer_request_room(struct tty_struct *tty, size_t size); 4extern int tty_buffer_request_room(struct tty_port *port, size_t size);
5extern int tty_insert_flip_string_flags(struct tty_struct *tty, const unsigned char *chars, const char *flags, size_t size); 5extern int tty_insert_flip_string_flags(struct tty_port *port,
6extern int tty_insert_flip_string_fixed_flag(struct tty_struct *tty, const unsigned char *chars, char flag, size_t size); 6 const unsigned char *chars, const char *flags, size_t size);
7extern int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size); 7extern int tty_insert_flip_string_fixed_flag(struct tty_port *port,
8extern int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size); 8 const unsigned char *chars, char flag, size_t size);
9void tty_schedule_flip(struct tty_struct *tty); 9extern int tty_prepare_flip_string(struct tty_port *port,
10 unsigned char **chars, size_t size);
11extern int tty_prepare_flip_string_flags(struct tty_port *port,
12 unsigned char **chars, char **flags, size_t size);
13extern void tty_flip_buffer_push(struct tty_port *port);
14void tty_schedule_flip(struct tty_port *port);
10 15
11static inline int tty_insert_flip_char(struct tty_struct *tty, 16static inline int tty_insert_flip_char(struct tty_port *port,
12 unsigned char ch, char flag) 17 unsigned char ch, char flag)
13{ 18{
14 struct tty_buffer *tb = tty->port->buf.tail; 19 struct tty_buffer *tb = port->buf.tail;
15 if (tb && tb->used < tb->size) { 20 if (tb && tb->used < tb->size) {
16 tb->flag_buf_ptr[tb->used] = flag; 21 tb->flag_buf_ptr[tb->used] = flag;
17 tb->char_buf_ptr[tb->used++] = ch; 22 tb->char_buf_ptr[tb->used++] = ch;
18 return 1; 23 return 1;
19 } 24 }
20 return tty_insert_flip_string_flags(tty, &ch, &flag, 1); 25 return tty_insert_flip_string_flags(port, &ch, &flag, 1);
21} 26}
22 27
23static inline int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, size_t size) 28static inline int tty_insert_flip_string(struct tty_port *port,
29 const unsigned char *chars, size_t size)
24{ 30{
25 return tty_insert_flip_string_fixed_flag(tty, chars, TTY_NORMAL, size); 31 return tty_insert_flip_string_fixed_flag(port, chars, TTY_NORMAL, size);
26} 32}
27 33
28#endif /* _LINUX_TTY_FLIP_H */ 34#endif /* _LINUX_TTY_FLIP_H */
diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h
index 2c6c85f18ea0..08464ef2c72c 100644
--- a/include/uapi/linux/serial_core.h
+++ b/include/uapi/linux/serial_core.h
@@ -220,4 +220,7 @@
220/* ARC (Synopsys) on-chip UART */ 220/* ARC (Synopsys) on-chip UART */
221#define PORT_ARC 101 221#define PORT_ARC 101
222 222
223/* Rocketport EXPRESS/INFINITY */
224#define PORT_RP2 102
225
223#endif /* _UAPILINUX_SERIAL_CORE_H */ 226#endif /* _UAPILINUX_SERIAL_CORE_H */
diff --git a/lib/Kconfig.kgdb b/lib/Kconfig.kgdb
index 43cb93fa2651..30894fab84d6 100644
--- a/lib/Kconfig.kgdb
+++ b/lib/Kconfig.kgdb
@@ -22,6 +22,7 @@ config KGDB_SERIAL_CONSOLE
22 tristate "KGDB: use kgdb over the serial console" 22 tristate "KGDB: use kgdb over the serial console"
23 select CONSOLE_POLL 23 select CONSOLE_POLL
24 select MAGIC_SYSRQ 24 select MAGIC_SYSRQ
25 depends on TTY
25 default y 26 default y
26 help 27 help
27 Share a serial console with kgdb. Sysrq-g must be used 28 Share a serial console with kgdb. Sysrq-g must be used
diff --git a/net/bluetooth/rfcomm/Kconfig b/net/bluetooth/rfcomm/Kconfig
index 22e718b554e4..18d352ea2bc7 100644
--- a/net/bluetooth/rfcomm/Kconfig
+++ b/net/bluetooth/rfcomm/Kconfig
@@ -12,6 +12,7 @@ config BT_RFCOMM
12config BT_RFCOMM_TTY 12config BT_RFCOMM_TTY
13 bool "RFCOMM TTY support" 13 bool "RFCOMM TTY support"
14 depends on BT_RFCOMM 14 depends on BT_RFCOMM
15 depends on TTY
15 help 16 help
16 This option enables TTY emulation support for RFCOMM channels. 17 This option enables TTY emulation support for RFCOMM channels.
17 18
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index bd6fd0f43d2b..b6e44ad6cca6 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -541,23 +541,21 @@ int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
541static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb) 541static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
542{ 542{
543 struct rfcomm_dev *dev = dlc->owner; 543 struct rfcomm_dev *dev = dlc->owner;
544 struct tty_struct *tty;
545 544
546 if (!dev) { 545 if (!dev) {
547 kfree_skb(skb); 546 kfree_skb(skb);
548 return; 547 return;
549 } 548 }
550 549
551 tty = dev->port.tty; 550 if (!skb_queue_empty(&dev->pending)) {
552 if (!tty || !skb_queue_empty(&dev->pending)) {
553 skb_queue_tail(&dev->pending, skb); 551 skb_queue_tail(&dev->pending, skb);
554 return; 552 return;
555 } 553 }
556 554
557 BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len); 555 BT_DBG("dlc %p len %d", dlc, skb->len);
558 556
559 tty_insert_flip_string(tty, skb->data, skb->len); 557 tty_insert_flip_string(&dev->port, skb->data, skb->len);
560 tty_flip_buffer_push(tty); 558 tty_flip_buffer_push(&dev->port);
561 559
562 kfree_skb(skb); 560 kfree_skb(skb);
563} 561}
@@ -621,26 +619,23 @@ static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
621/* ---- TTY functions ---- */ 619/* ---- TTY functions ---- */
622static void rfcomm_tty_copy_pending(struct rfcomm_dev *dev) 620static void rfcomm_tty_copy_pending(struct rfcomm_dev *dev)
623{ 621{
624 struct tty_struct *tty = dev->port.tty;
625 struct sk_buff *skb; 622 struct sk_buff *skb;
626 int inserted = 0; 623 int inserted = 0;
627 624
628 if (!tty) 625 BT_DBG("dev %p", dev);
629 return;
630
631 BT_DBG("dev %p tty %p", dev, tty);
632 626
633 rfcomm_dlc_lock(dev->dlc); 627 rfcomm_dlc_lock(dev->dlc);
634 628
635 while ((skb = skb_dequeue(&dev->pending))) { 629 while ((skb = skb_dequeue(&dev->pending))) {
636 inserted += tty_insert_flip_string(tty, skb->data, skb->len); 630 inserted += tty_insert_flip_string(&dev->port, skb->data,
631 skb->len);
637 kfree_skb(skb); 632 kfree_skb(skb);
638 } 633 }
639 634
640 rfcomm_dlc_unlock(dev->dlc); 635 rfcomm_dlc_unlock(dev->dlc);
641 636
642 if (inserted > 0) 637 if (inserted > 0)
643 tty_flip_buffer_push(tty); 638 tty_flip_buffer_push(&dev->port);
644} 639}
645 640
646static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp) 641static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
diff --git a/net/irda/ircomm/Kconfig b/net/irda/ircomm/Kconfig
index 2d4c6b4a78d6..19492c1707b7 100644
--- a/net/irda/ircomm/Kconfig
+++ b/net/irda/ircomm/Kconfig
@@ -1,6 +1,6 @@
1config IRCOMM 1config IRCOMM
2 tristate "IrCOMM protocol" 2 tristate "IrCOMM protocol"
3 depends on IRDA 3 depends on IRDA && TTY
4 help 4 help
5 Say Y here if you want to build support for the IrCOMM protocol. 5 Say Y here if you want to build support for the IrCOMM protocol.
6 To compile it as modules, choose M here: the modules will be 6 To compile it as modules, choose M here: the modules will be
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c
index a68c88cdec6e..9a5fd3c3e530 100644
--- a/net/irda/ircomm/ircomm_tty.c
+++ b/net/irda/ircomm/ircomm_tty.c
@@ -452,7 +452,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
452 self->line, self->port.count); 452 self->line, self->port.count);
453 453
454 /* Not really used by us, but lets do it anyway */ 454 /* Not really used by us, but lets do it anyway */
455 tty->low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; 455 self->port.low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
456 456
457 /* 457 /*
458 * If the port is the middle of closing, bail out now 458 * If the port is the middle of closing, bail out now
@@ -1136,14 +1136,14 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
1136 ircomm_tty_send_initial_parameters(self); 1136 ircomm_tty_send_initial_parameters(self);
1137 ircomm_tty_link_established(self); 1137 ircomm_tty_link_established(self);
1138 } 1138 }
1139 tty_kref_put(tty);
1139 1140
1140 /* 1141 /*
1141 * Use flip buffer functions since the code may be called from interrupt 1142 * Use flip buffer functions since the code may be called from interrupt
1142 * context 1143 * context
1143 */ 1144 */
1144 tty_insert_flip_string(tty, skb->data, skb->len); 1145 tty_insert_flip_string(&self->port, skb->data, skb->len);
1145 tty_flip_buffer_push(tty); 1146 tty_flip_buffer_push(&self->port);
1146 tty_kref_put(tty);
1147 1147
1148 /* No need to kfree_skb - see ircomm_ttp_data_indication() */ 1148 /* No need to kfree_skb - see ircomm_ttp_data_indication() */
1149 1149
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 3a847828932a..298822c0ad65 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -34,7 +34,7 @@ config SND_SOC_ALL_CODECS
34 select SND_SOC_CS42L73 if I2C 34 select SND_SOC_CS42L73 if I2C
35 select SND_SOC_CS4270 if I2C 35 select SND_SOC_CS4270 if I2C
36 select SND_SOC_CS4271 if SND_SOC_I2C_AND_SPI 36 select SND_SOC_CS4271 if SND_SOC_I2C_AND_SPI
37 select SND_SOC_CX20442 37 select SND_SOC_CX20442 if TTY
38 select SND_SOC_DA7210 if I2C 38 select SND_SOC_DA7210 if I2C
39 select SND_SOC_DA732X if I2C 39 select SND_SOC_DA732X if I2C
40 select SND_SOC_DA9055 if I2C 40 select SND_SOC_DA9055 if I2C
@@ -236,6 +236,7 @@ config SND_SOC_CS4271
236 236
237config SND_SOC_CX20442 237config SND_SOC_CX20442
238 tristate 238 tristate
239 depends on TTY
239 240
240config SND_SOC_JZ4740_CODEC 241config SND_SOC_JZ4740_CODEC
241 select REGMAP_MMIO 242 select REGMAP_MMIO