timbuart: Fix the termios logic
authorAlan Cox <alan@linux.intel.com>
Thu, 11 Jun 2009 13:27:13 +0000 (14:27 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jun 2009 15:51:06 +0000 (08:51 -0700)
The driver only handles speeds but it fails to return the current values
for the hardware features it does not support.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/serial/timbuart.c

index 30ba3c4cc180afc56da405cede0f26efa005e8e7..ac9e5d5f742ef1b6a3cc9dbc93d45be169b3d50a 100644 (file)
@@ -278,7 +278,7 @@ static int get_bindex(int baud)
        int i;
 
        for (i = 0; i < ARRAY_SIZE(baudrates); i++)
-               if (baud == baudrates[i])
+               if (baud <= baudrates[i])
                        return i;
 
        return -1;
@@ -296,14 +296,20 @@ static void timbuart_set_termios(struct uart_port *port,
        bindex = get_bindex(baud);
        dev_dbg(port->dev, "%s - bindex %d\n", __func__, bindex);
 
-       if (bindex < 0) {
-               printk(KERN_ALERT "timbuart: Unsupported baud rate\n");
-       } else {
-               spin_lock_irqsave(&port->lock, flags);
-               iowrite8((u8)bindex, port->membase + TIMBUART_BAUDRATE);
-               uart_update_timeout(port, termios->c_cflag, baud);
-               spin_unlock_irqrestore(&port->lock, flags);
-       }
+       if (bindex < 0)
+               bindex = 0;
+       baud = baudrates[bindex];
+
+       /* The serial layer calls into this once with old = NULL when setting
+          up initially */
+       if (old)
+               tty_termios_copy_hw(termios, old);
+       tty_termios_encode_baud_rate(termios, baud, baud);
+
+       spin_lock_irqsave(&port->lock, flags);
+       iowrite8((u8)bindex, port->membase + TIMBUART_BAUDRATE);
+       uart_update_timeout(port, termios->c_cflag, baud);
+       spin_unlock_irqrestore(&port->lock, flags);
 }
 
 static const char *timbuart_type(struct uart_port *port)