Skip to content

Commit

Permalink
serial: sh-sci: support lower baud rate
Browse files Browse the repository at this point in the history
Support prescaler 1/16 and 1/64, in addition to current 1 and 1/4.

Supporting below 2400bps was dropped long time ago in mainline.
Since then, setting lower rate has been resulting in erroneous
register value, without indicating any errors through API.

This patch adds more prescaler to support lower rates again.
This still doesn't check range, but we won't hit the case because
even 50bps at 48MHz clock is now supported.

Signed-off-by: Takashi Yoshii <takashi.yoshii.zj@renesas.com>
Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Takashi Yoshii authored and Greg Kroah-Hartman committed Nov 16, 2012
1 parent 4ffc3cd commit 9d482cc
Showing 1 changed file with 8 additions and 11 deletions.
19 changes: 8 additions & 11 deletions drivers/tty/serial/sh-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1815,7 +1815,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
{
struct sci_port *s = to_sci_port(port);
struct plat_sci_reg *reg;
unsigned int baud, smr_val, max_baud;
unsigned int baud, smr_val, max_baud, cks;
int t = -1;

/*
Expand Down Expand Up @@ -1849,21 +1849,18 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,

uart_update_timeout(port, termios->c_cflag, baud);

serial_port_out(port, SCSMR, smr_val);
for (cks = 0; t >= 256 && cks <= 3; cks++)
t >>= 2;

dev_dbg(port->dev, "%s: SMR %x, t %x, SCSCR %x\n", __func__, smr_val, t,
s->cfg->scscr);
dev_dbg(port->dev, "%s: SMR %x, cks %x, t %x, SCSCR %x\n",
__func__, smr_val, cks, t, s->cfg->scscr);

if (t >= 0) {
if (t >= 256) {
serial_port_out(port, SCSMR, (serial_port_in(port, SCSMR) & ~3) | 1);
t >>= 2;
} else
serial_port_out(port, SCSMR, serial_port_in(port, SCSMR) & ~3);

serial_port_out(port, SCSMR, (smr_val & ~3) | cks);
serial_port_out(port, SCBRR, t);
udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */
}
} else
serial_port_out(port, SCSMR, smr_val);

sci_init_pins(port, termios->c_cflag);

Expand Down

0 comments on commit 9d482cc

Please sign in to comment.