diff options
| -rw-r--r-- | drivers/tty/serial/sh-sci.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index b175f8f565d8..70f005f37de0 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -1907,9 +1907,11 @@ static int sci_sck_calc(struct sci_port *s, unsigned int bps, unsigned int min_sr, max_sr, sr; int err, min_err = INT_MAX; + if (s->port.type != PORT_HSCIF) + freq *= 2; if (s->sampling_rate) { /* SCI(F) has a fixed sampling rate */ - min_sr = max_sr = s->sampling_rate / 2; + min_sr = max_sr = s->sampling_rate; } else { /* HSCIF has a variable 1/(8..32) sampling rate */ min_sr = 8; @@ -1940,9 +1942,11 @@ static int sci_brg_calc(struct sci_port *s, unsigned int bps, unsigned int min_sr, max_sr, sr, dl; int err, min_err = INT_MAX; + if (s->port.type != PORT_HSCIF) + freq *= 2; if (s->sampling_rate) { /* SCIF has a fixed sampling rate */ - min_sr = max_sr = s->sampling_rate / 2; + min_sr = max_sr = s->sampling_rate; } else { /* HSCIF has a variable 1/(8..32) sampling rate */ min_sr = 8; @@ -1975,18 +1979,18 @@ static int sci_scbrr_calc(struct sci_port *s, unsigned int bps, unsigned int *brr, unsigned int *srr, unsigned int *cks) { - unsigned int min_sr, max_sr, shift, sr, br, prediv, scrate, c; + unsigned int min_sr, max_sr, sr, br, prediv, scrate, c; unsigned long freq = s->clk_rates[SCI_FCK]; int err, min_err = INT_MAX; + if (s->port.type != PORT_HSCIF) + freq *= 2; if (s->sampling_rate) { min_sr = max_sr = s->sampling_rate; - shift = 0; } else { /* HSCIF has a variable sample rate */ min_sr = 8; max_sr = 32; - shift = 1; } /* @@ -2007,7 +2011,7 @@ static int sci_scbrr_calc(struct sci_port *s, unsigned int bps, for (sr = max_sr; sr >= min_sr; sr--) { for (c = 0; c <= 3; c++) { /* integerized formulas from HSCIF documentation */ - prediv = sr * (1 << (2 * c + shift)); + prediv = sr * (1 << (2 * c + 1)); /* * We need to calculate: |
