serial: sh-sci: Updated calculation of bit error rate and bit rate
authorNobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
Mon, 14 Jul 2014 07:09:58 +0000 (16:09 +0900)
committerStephane Desneux <stephane.desneux@open.eurogiciel.org>
Wed, 4 Feb 2015 10:15:32 +0000 (11:15 +0100)
Currently, the decimal point is discarded calculation of BRR.
Therefore, it can not calculate a value close to the correct value.
This patch fixes this problem by using DIV_ROUND_CLOSEST.

Signed-off-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit b7d66397f4d282ddf2a2fe516fc9329c5a063459)
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
drivers/tty/serial/sh-sci.c

index 88236da..ce80137 100644 (file)
@@ -1796,11 +1796,13 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq,
        for (sr = 8; sr <= 32; sr++) {
                for (c = 0; c <= 3; c++) {
                        /* integerized formulas from HSCIF documentation */
-                       br = freq / (sr * (1 << (2 * c + 1)) * bps) - 1;
+                       br = DIV_ROUND_CLOSEST(freq, (sr *
+                                             (1 << (2 * c + 1)) * bps)) - 1;
                        if (br < 0 || br > 255)
                                continue;
-                       err = freq / ((br + 1) * bps * sr *
-                             (1 << (2 * c + 1)) / 1000) - 1000;
+                       err = DIV_ROUND_CLOSEST(freq, ((br + 1) * bps * sr *
+                                              (1 << (2 * c + 1)) / 1000)) -
+                                              1000;
                        if (min_err > err) {
                                min_err = err;
                                *brr = br;