summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert+renesas@glider.be>2016-01-04 16:45:20 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-07 09:54:55 +0300
commit7b5c0c08f5e895fb92c1d1d5f905c68eca1df5c0 (patch)
tree9f7142a3122f0bf40c31e9478e6e283821999283
parent3a964abe1ef1cfbe82d0ae832d70c7750d673728 (diff)
downloadlinux-7b5c0c08f5e895fb92c1d1d5f905c68eca1df5c0.tar.xz
serial: sh-sci: Use premultiplier to handle half sampling rate
On SCIx variants different from HSCIF, the bit rate is equal to the sampling clock rate divided by half the sampling rate. Currently this is handled by dividing the sampling rate by two, which was OK as it was always even. Replace halving the sampling rate by premultiplying the base clock frequency by 2, to accommodate odd sampling rates on SCIFA/SCIFB later. Replace the shift value in the BRG divider calculation by a premultiplication of the base clock frequency too, for consistency. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/tty/serial/sh-sci.c16
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: