summaryrefslogtreecommitdiff
path: root/drivers/tty
diff options
context:
space:
mode:
authorPradeep Goudagunta <pgoudagunta@nvidia.com>2011-02-11 16:25:43 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:43:17 -0800
commitabd90087edd4d832c6dc42a973c35203aa83a035 (patch)
tree1521c506eddd0a0e6f7168cda75f01809498c9d7 /drivers/tty
parentfc2fd76581f2615f1f44da967016279d53033412 (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> Original-Change-Id: I6d1beeb962f446eb0e169d8e316a39b9d7fe78e4 Rebase-Id: R28a0fa4eb5fd34ed555cb2ec02d5aa5132da93c8
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/tegra_hsuart.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/tty/serial/tegra_hsuart.c b/drivers/tty/serial/tegra_hsuart.c
index 36dd63b45500..c11d804fdad5 100644
--- a/drivers/tty/serial/tegra_hsuart.c
+++ b/drivers/tty/serial/tegra_hsuart.c
@@ -999,10 +999,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;
@@ -1010,6 +1014,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);