U6715 16550A serial driver support
[linux-2.6.git] / include / linux / serial_core.h
index d58e460..8129ca2 100644 (file)
 /* Qualcomm MSM SoCs */
 #define PORT_MSM       88
 
+/* BCM63xx family SoCs */
+#define PORT_BCM63XX   89
+
+/* Aeroflex Gaisler GRLIB APBUART */
+#define PORT_APBUART    90
+
+/* Altera UARTs */
+#define PORT_ALTERA_JTAGUART   91
+#define PORT_ALTERA_UART       92
+
+/* MAX3107 */
+#define PORT_MAX3107   94
+
+/* High Speed UART for Medfield */
+#define PORT_MFD       95
+
 #ifdef __KERNEL__
 
 #include <linux/compiler.h>
@@ -210,7 +226,7 @@ struct uart_ops {
        void            (*flush_buffer)(struct uart_port *);
        void            (*set_termios)(struct uart_port *, struct ktermios *new,
                                       struct ktermios *old);
-       void            (*set_ldisc)(struct uart_port *);
+       void            (*set_ldisc)(struct uart_port *, int new);
        void            (*pm)(struct uart_port *, unsigned int state,
                              unsigned int oldstate);
        int             (*set_wake)(struct uart_port *, unsigned int state);
@@ -240,6 +256,7 @@ struct uart_ops {
 #endif
 };
 
+#define NO_POLL_CHAR           0x00ff0000
 #define UART_CONFIG_TYPE       (1 << 0)
 #define UART_CONFIG_IRQ                (1 << 1)
 
@@ -265,6 +282,9 @@ struct uart_port {
        unsigned char __iomem   *membase;               /* read/write[bwl] */
        unsigned int            (*serial_in)(struct uart_port *, int);
        void                    (*serial_out)(struct uart_port *, int, int);
+       void                    (*set_termios)(struct uart_port *,
+                                              struct ktermios *new,
+                                              struct ktermios *old);
        unsigned int            irq;                    /* irq number */
        unsigned long           irqflags;               /* irq flags  */
        unsigned int            uartclk;                /* base uart clock */
@@ -477,7 +497,7 @@ static inline int uart_handle_break(struct uart_port *port)
 
 /**
  *     uart_handle_dcd_change - handle a change of carrier detect state
- *     @port: uart_port structure for the open port
+ *     @uport: uart_port structure for the open port
  *     @status: new carrier detect status, nonzero if active
  */
 static inline void
@@ -485,9 +505,13 @@ uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
 {
        struct uart_state *state = uport->state;
        struct tty_port *port = &state->port;
+       struct tty_ldisc *ld = tty_ldisc_ref(port->tty);
+       struct timespec ts;
 
-       uport->icount.dcd++;
+       if (ld && ld->ops->dcd_change)
+               getnstimeofday(&ts);
 
+       uport->icount.dcd++;
 #ifdef CONFIG_HARD_PPS
        if ((uport->flags & UPF_HARDPPS_CD) && status)
                hardpps();
@@ -499,11 +523,16 @@ uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
                else if (port->tty)
                        tty_hangup(port->tty);
        }
+
+       if (ld && ld->ops->dcd_change)
+               ld->ops->dcd_change(port->tty, status, &ts);
+       if (ld)
+               tty_ldisc_deref(ld);
 }
 
 /**
  *     uart_handle_cts_change - handle a change of clear-to-send state
- *     @port: uart_port structure for the open port
+ *     @uport: uart_port structure for the open port
  *     @status: new clear to send status, nonzero if active
  */
 static inline void