summaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorHuang Shijie <b32955@freescale.com>2013-06-04 09:59:33 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-06-06 13:05:38 -0700
commit28eb4274e7ec3ddba6711e3d13e374046b3c2230 (patch)
treec72d2e58524ba3d6bc065cdc4caccce085c3ef11 /drivers/tty
parente943f58ea84a80cc88dfceb6a5ed788d0ba24a1e (diff)
downloadlinux-28eb4274e7ec3ddba6711e3d13e374046b3c2230.tar.bz2
serial: imx: enable the clocks only when the uart is used
Current code opens the clocks when the uart driver is probed. This will wastes some power if several uarts are enabled, but not really used. So close these clocks for uart, and enable the clocks only when the uart is used. Signed-off-by: Huang Shijie <b32955@freescale.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/imx.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 381a2d79593c..831324a9745b 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -700,6 +700,14 @@ static int imx_startup(struct uart_port *port)
int retval;
unsigned long flags, temp;
+ retval = clk_prepare_enable(sport->clk_per);
+ if (retval)
+ goto error_out1;
+
+ retval = clk_prepare_enable(sport->clk_ipg);
+ if (retval)
+ goto error_out1;
+
imx_setup_ufcr(sport, 0);
/* disable the DREN bit (Data Ready interrupt enable) before
@@ -885,6 +893,9 @@ static void imx_shutdown(struct uart_port *port)
writel(temp, sport->port.membase + UCR1);
spin_unlock_irqrestore(&sport->port.lock, flags);
+
+ clk_disable_unprepare(sport->clk_per);
+ clk_disable_unprepare(sport->clk_ipg);
}
static void
@@ -1563,6 +1574,9 @@ static int serial_imx_probe(struct platform_device *pdev)
goto deinit;
platform_set_drvdata(pdev, sport);
+ clk_disable_unprepare(sport->clk_per);
+ clk_disable_unprepare(sport->clk_ipg);
+
return 0;
deinit:
if (pdata && pdata->exit)
@@ -1584,9 +1598,6 @@ static int serial_imx_remove(struct platform_device *pdev)
uart_remove_one_port(&imx_reg, &sport->port);
- clk_disable_unprepare(sport->clk_per);
- clk_disable_unprepare(sport->clk_ipg);
-
if (pdata && pdata->exit)
pdata->exit(pdev);