Skip to content

Commit

Permalink
timbuart: Fix the termios logic
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alan Cox authored and torvalds committed Jun 11, 2009
1 parent 34aec59 commit 7d55dea
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions drivers/serial/timbuart.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down

0 comments on commit 7d55dea

Please sign in to comment.