|
@@ -1867,12 +1867,13 @@ static unsigned int sci_scbrr_calc(struct sci_port *s, unsigned int bps,
|
|
|
}
|
|
|
|
|
|
/* calculate sample rate, BRR, and clock select for HSCIF */
|
|
|
-static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
|
|
|
+static void sci_baud_calc_hscif(struct sci_port *s, unsigned int bps,
|
|
|
+ unsigned long freq, int *brr,
|
|
|
unsigned int *srr, unsigned int *cks)
|
|
|
{
|
|
|
unsigned int sr, br, prediv, scrate, c;
|
|
|
int err, recv_margin;
|
|
|
- int min_err = 1000; /* 100% */
|
|
|
+ int min_err = INT_MAX;
|
|
|
int recv_max_margin = 0;
|
|
|
|
|
|
/* Find the combination of sample rate and clock select with the
|
|
@@ -1886,7 +1887,7 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
|
|
|
* We need to calculate:
|
|
|
*
|
|
|
* br = freq / (prediv * bps) clamped to [1..256]
|
|
|
- * err = (freq / (br * prediv * bps / 1000)) - 1000
|
|
|
+ * err = freq / (br * prediv) - bps
|
|
|
*
|
|
|
* Watch out for overflow when calculating the desired
|
|
|
* sampling clock rate!
|
|
@@ -1897,8 +1898,7 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
|
|
|
scrate = prediv * bps;
|
|
|
br = DIV_ROUND_CLOSEST(freq, scrate);
|
|
|
br = clamp(br, 1U, 256U);
|
|
|
- err = DIV_ROUND_CLOSEST(freq, (br * scrate) / 1000) -
|
|
|
- 1000;
|
|
|
+ err = DIV_ROUND_CLOSEST(freq, br * prediv) - bps;
|
|
|
/* Calc recv margin
|
|
|
* M: Receive margin (%)
|
|
|
* N: Ratio of bit rate to clock (N = sampling rate)
|
|
@@ -1928,13 +1928,8 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (min_err == 1000) {
|
|
|
- WARN_ON(1);
|
|
|
- /* use defaults */
|
|
|
- *brr = 255;
|
|
|
- *srr = 15;
|
|
|
- *cks = 0;
|
|
|
- }
|
|
|
+ dev_dbg(s->port.dev, "BRR: %u%+d bps using N %u SR %u cks %u\n", bps,
|
|
|
+ min_err, *brr, *srr + 1, *cks);
|
|
|
}
|
|
|
|
|
|
static void sci_reset(struct uart_port *port)
|
|
@@ -1984,7 +1979,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
baud = uart_get_baud_rate(port, termios, old, 0, max_baud);
|
|
|
if (likely(baud && port->uartclk)) {
|
|
|
if (s->cfg->type == PORT_HSCIF) {
|
|
|
- sci_baud_calc_hscif(baud, port->uartclk, &t, &srr,
|
|
|
+ sci_baud_calc_hscif(s, baud, port->uartclk, &t, &srr,
|
|
|
&cks);
|
|
|
} else {
|
|
|
t = sci_scbrr_calc(s, baud, port->uartclk);
|