summaryrefslogtreecommitdiff
path: root/drivers/serial
diff options
context:
space:
mode:
authorPradeep Goudagunta <pgoudagunta@nvidia.com>2011-02-11 16:25:43 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-04-26 15:52:02 -0700
commit51eac9019738240ca00e4f71923ba3f2703e9870 (patch)
tree2bab105577c533d879b94897e8261a93b2dbb29e /drivers/serial
parent9044bb2fa38c91d9c820a4c687335db80f294056 (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.c12
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);