diff options
author | Pradeep Goudagunta <pgoudagunta@nvidia.com> | 2011-02-11 16:25:43 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-04-26 15:52:02 -0700 |
commit | 51eac9019738240ca00e4f71923ba3f2703e9870 (patch) | |
tree | 2bab105577c533d879b94897e8261a93b2dbb29e /drivers/serial | |
parent | 9044bb2fa38c91d9c820a4c687335db80f294056 (diff) |
arm:tegra:uart: Set clk rate according to baudrate
Adding support to hs_uart driver to set clock rate according to given
baudrate.
Original-Change-Id: Ia15421bf1db7f46f77b5d63c863703e441f1d3ff
Reviewed-on: http://git-master/r/19233
Tested-by: Pradeep Goudagunta <pgoudagunta@nvidia.com>
Tested-by: Rakesh Goyal <rgoyal@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Change-Id: I6d1beeb962f446eb0e169d8e316a39b9d7fe78e4
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/tegra_hsuart.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/serial/tegra_hsuart.c b/drivers/serial/tegra_hsuart.c index a74dbe6ad16d..899936056243 100644 --- a/drivers/serial/tegra_hsuart.c +++ b/drivers/serial/tegra_hsuart.c @@ -1006,10 +1006,14 @@ static void tegra_set_baudrate(struct tegra_uart_port *t, unsigned int baud) unsigned long rate; unsigned int divisor; unsigned char lcr; + unsigned int baud_actual; + unsigned int baud_delta; if (t->baud == baud) return; + rate = baud * 16; + clk_set_rate(t->clk, rate); rate = clk_get_rate(t->clk); divisor = rate; @@ -1017,6 +1021,14 @@ static void tegra_set_baudrate(struct tegra_uart_port *t, unsigned int baud) divisor += baud/2; do_div(divisor, baud); + /* The allowable baudrate error from desired baudrate is 5% */ + baud_actual = divisor ? rate / (16 * divisor) : 0; + baud_delta = abs(baud_actual - baud); + if (WARN_ON(baud_delta * 20 > baud)) { + dev_err(t->uport.dev, "requested baud %u, actual %u\n", + baud, baud_actual); + } + lcr = t->lcr_shadow; lcr |= UART_LCR_DLAB; uart_writeb(t, lcr, UART_LCR); |