vserver 1.9.5.x5
[linux-2.6.git] / drivers / serial / amba-pl010.c
index b88c00b..ac57fdc 100644 (file)
  * and hooked into this driver.
  */
 #include <linux/config.h>
+
+#if defined(CONFIG_SERIAL_AMBA_PL010_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
 #include <linux/module.h>
-#include <linux/tty.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
-#include <linux/serial.h>
 #include <linux/console.h>
 #include <linux/sysrq.h>
 #include <linux/device.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/hardware/amba.h>
-
-#if defined(CONFIG_SERIAL_AMBA_PL010_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
-#define SUPPORT_SYSRQ
-#endif
-
-#include <linux/serial_core.h>
-
 #include <asm/hardware/amba_serial.h>
 
 #define UART_NR                2
@@ -149,22 +149,22 @@ pl010_rx_chars(struct uart_port *port)
 #endif
 {
        struct tty_struct *tty = port->info->tty;
-       unsigned int status, ch, rsr, max_count = 256;
+       unsigned int status, ch, flag, rsr, max_count = 256;
 
        status = UART_GET_FR(port);
        while (UART_RX_DATA(status) && max_count--) {
                if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-                       tty->flip.work.func((void *)tty);
-                       if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-                               printk(KERN_WARNING "TTY_DONT_FLIP set\n");
-                               return;
-                       }
+                       if (tty->low_latency)
+                               tty_flip_buffer_push(tty);
+                       /*
+                        * If this failed then we will throw away the
+                        * bytes but must do so to clear interrupts.
+                        */
                }
 
                ch = UART_GET_CHAR(port);
+               flag = TTY_NORMAL;
 
-               *tty->flip.char_buf_ptr = ch;
-               *tty->flip.flag_buf_ptr = TTY_NORMAL;
                port->icount.rx++;
 
                /*
@@ -188,20 +188,18 @@ pl010_rx_chars(struct uart_port *port)
                        rsr &= port->read_status_mask;
 
                        if (rsr & UART01x_RSR_BE)
-                               *tty->flip.flag_buf_ptr = TTY_BREAK;
+                               flag = TTY_BREAK;
                        else if (rsr & UART01x_RSR_PE)
-                               *tty->flip.flag_buf_ptr = TTY_PARITY;
+                               flag = TTY_PARITY;
                        else if (rsr & UART01x_RSR_FE)
-                               *tty->flip.flag_buf_ptr = TTY_FRAME;
+                               flag = TTY_FRAME;
                }
 
                if (uart_handle_sysrq_char(port, ch, regs))
                        goto ignore_char;
 
                if ((rsr & port->ignore_status_mask) == 0) {
-                       tty->flip.flag_buf_ptr++;
-                       tty->flip.char_buf_ptr++;
-                       tty->flip.count++;
+                       tty_insert_flip_char(tty, ch, flag);
                }
                if ((rsr & UART01x_RSR_OE) &&
                    tty->flip.count < TTY_FLIPBUF_SIZE) {
@@ -210,9 +208,7 @@ pl010_rx_chars(struct uart_port *port)
                         * immediately, and doesn't affect the current
                         * character
                         */
-                       *tty->flip.char_buf_ptr++ = 0;
-                       *tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
-                       tty->flip.count++;
+                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
                }
        ignore_char:
                status = UART_GET_FR(port);
@@ -714,6 +710,24 @@ static struct console amba_console = {
        .data           = &amba_reg,
 };
 
+static int __init amba_console_init(void)
+{
+       /*
+        * All port initializations are done statically
+        */
+       register_console(&amba_console);
+       return 0;
+}
+console_initcall(amba_console_init);
+
+static int __init amba_late_console_init(void)
+{
+       if (!(amba_console.flags & CON_ENABLED))
+               register_console(&amba_console);
+       return 0;
+}
+late_initcall(amba_late_console_init);
+
 #define AMBA_CONSOLE   &amba_console
 #else
 #define AMBA_CONSOLE   NULL