serial: bfin_sport_uart: speed up sport RX sample rate to be 3% faster
authorSonic Zhang <sonic.zhang@analog.com>
Sat, 16 Oct 2010 22:22:34 +0000 (18:22 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:20:11 +0000 (10:20 -0700)
The actual uart baud rate of devices vary between +/-2% of what is
asked.  The SPORT RX sample rate should be faster than double of the
worst case.  Otherwise, wrong data may be received.  So set SPORT RX
clock to be 3% faster in general.

Reported-by: Olivier STOCK <ostockemer@ereca.fr>
Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/serial/bfin_sport_uart.c

index 5318dd3..6f1b51e 100644 (file)
@@ -131,7 +131,12 @@ static int sport_uart_setup(struct sport_uart_port *up, int size, int baud_rate)
        pr_debug("%s RCR1:%x, RCR2:%x\n", __func__, SPORT_GET_RCR1(up), SPORT_GET_RCR2(up));
 
        tclkdiv = sclk / (2 * baud_rate) - 1;
-       rclkdiv = sclk / (2 * baud_rate * 2) - 1;
+       /* The actual uart baud rate of devices vary between +/-2%. The sport
+        * RX sample rate should be faster than the double of the worst case,
+        * otherwise, wrong data are received. So, set sport RX clock to be
+        * 3% faster.
+        */
+       rclkdiv = sclk / (2 * baud_rate * 2 * 97 / 100) - 1;
        SPORT_PUT_TCLKDIV(up, tclkdiv);
        SPORT_PUT_RCLKDIV(up, rclkdiv);
        SSYNC();