VMware Balloon driver
[safe/jmp/linux-2.6] / drivers / serial / 8250.c
index a81ff7b..2b1ea3d 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/serial_8250.h>
 #include <linux/nmi.h>
 #include <linux/mutex.h>
+#include <linux/slab.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -2408,6 +2409,21 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
 }
 
 static void
+serial8250_set_ldisc(struct uart_port *port)
+{
+       int line = port->line;
+
+       if (line >= port->state->port.tty->driver->num)
+               return;
+
+       if (port->state->port.tty->ldisc->ops->num == N_PPS) {
+               port->flags |= UPF_HARDPPS_CD;
+               serial8250_enable_ms(port);
+       } else
+               port->flags &= ~UPF_HARDPPS_CD;
+}
+
+static void
 serial8250_pm(struct uart_port *port, unsigned int state,
              unsigned int oldstate)
 {
@@ -2628,6 +2644,7 @@ static struct uart_ops serial8250_pops = {
        .startup        = serial8250_startup,
        .shutdown       = serial8250_shutdown,
        .set_termios    = serial8250_set_termios,
+       .set_ldisc      = serial8250_set_ldisc,
        .pm             = serial8250_pm,
        .type           = serial8250_type,
        .release_port   = serial8250_release_port,
@@ -2690,6 +2707,15 @@ static void __init serial8250_isa_init_ports(void)
        }
 }
 
+static void
+serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
+{
+       up->port.type = type;
+       up->port.fifosize = uart_config[type].fifo_size;
+       up->capabilities = uart_config[type].flags;
+       up->tx_loadsz = uart_config[type].tx_loadsz;
+}
+
 static void __init
 serial8250_register_ports(struct uart_driver *drv, struct device *dev)
 {
@@ -2706,6 +2732,10 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev)
                struct uart_8250_port *up = &serial8250_ports[i];
 
                up->port.dev = dev;
+
+               if (up->port.flags & UPF_FIXED_TYPE)
+                       serial8250_init_fixed_type_port(up, up->port.type);
+
                uart_add_one_port(drv, &up->port);
        }
 }
@@ -3118,12 +3148,8 @@ int serial8250_register_port(struct uart_port *port)
                if (port->dev)
                        uart->port.dev = port->dev;
 
-               if (port->flags & UPF_FIXED_TYPE) {
-                       uart->port.type = port->type;
-                       uart->port.fifosize = uart_config[port->type].fifo_size;
-                       uart->capabilities = uart_config[port->type].flags;
-                       uart->tx_loadsz = uart_config[port->type].tx_loadsz;
-               }
+               if (port->flags & UPF_FIXED_TYPE)
+                       serial8250_init_fixed_type_port(uart, port->type);
 
                set_io_from_upio(&uart->port);
                /* Possibly override default I/O functions.  */