summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOskar Schirmer <os@emlix.com>2009-06-11 14:55:22 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-11 08:51:09 -0700
commitd7f8d437bda0ec409e26cffb846bc28a40603ee3 (patch)
tree917e906bc45d2f08038f0dcba326b1dbb6c57320
parentb6e4913834cd032082e5c76dfade61050212dc98 (diff)
imx: serial: use tty_encode_baud_rate to set true rate
real baud rate may be different from the one requested. for upper layers, set the nearest value to the real rate in favour of the rate previously requested. Signed-off-by: Oskar Schirmer <os@emlix.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/serial/imx.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c
index 8c79e8c2fd4..7b5d1de9cfe 100644
--- a/drivers/serial/imx.c
+++ b/drivers/serial/imx.c
@@ -818,6 +818,7 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
unsigned int old_csize = old ? old->c_cflag & CSIZE : CS8;
unsigned int div, ufcr;
unsigned long num, denom;
+ uint64_t tdiv64;
/*
* If we don't support modem control lines, don't allow
@@ -930,6 +931,12 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
rational_best_approximation(16 * div * baud, sport->port.uartclk,
1 << 16, 1 << 16, &num, &denom);
+ tdiv64 = sport->port.uartclk;
+ tdiv64 *= num;
+ do_div(tdiv64, denom * 16 * div);
+ tty_encode_baud_rate(sport->port.info->port.tty,
+ (speed_t)tdiv64, (speed_t)tdiv64);
+
num -= 1;
denom -= 1;