serial: imx: remove the uart_console() check
authorHuang Shijie <b32955@freescale.com>
Fri, 28 Jun 2013 05:39:42 +0000 (13:39 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2013 22:42:46 +0000 (15:42 -0700)
The uart_console() check makes the clocks(clk_per and clk_ipg) opened
even when we close the console uart.

This patch enable/disable the clocks in imx_console_write(),
so we can keep the clocks closed when the console uart is closed.

Also remove the clock enable/disable oprations in the probe, we do not
need them any more.

Signed-off-by: Huang Shijie <b32955@freescale.com>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/imx.c

index 40ca759d1f17a5e1cb56a38fac041d8af497b266..e43064b5c938b93e2560b42b336367b995054b14 100644 (file)
@@ -701,15 +701,13 @@ static int imx_startup(struct uart_port *port)
        int retval;
        unsigned long flags, temp;
 
-       if (!uart_console(port)) {
-               retval = clk_prepare_enable(sport->clk_per);
-               if (retval)
-                       goto error_out1;
-               retval = clk_prepare_enable(sport->clk_ipg);
-               if (retval) {
-                       clk_disable_unprepare(sport->clk_per);
-                       goto error_out1;
-               }
+       retval = clk_prepare_enable(sport->clk_per);
+       if (retval)
+               goto error_out1;
+       retval = clk_prepare_enable(sport->clk_ipg);
+       if (retval) {
+               clk_disable_unprepare(sport->clk_per);
+               goto error_out1;
        }
 
        imx_setup_ufcr(sport, 0);
@@ -900,10 +898,8 @@ static void imx_shutdown(struct uart_port *port)
        writel(temp, sport->port.membase + UCR1);
        spin_unlock_irqrestore(&sport->port.lock, flags);
 
-       if (!uart_console(&sport->port)) {
-               clk_disable_unprepare(sport->clk_per);
-               clk_disable_unprepare(sport->clk_ipg);
-       }
+       clk_disable_unprepare(sport->clk_per);
+       clk_disable_unprepare(sport->clk_ipg);
 }
 
 static void
@@ -1250,6 +1246,16 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
        unsigned int ucr1;
        unsigned long flags = 0;
        int locked = 1;
+       int retval;
+
+       retval = clk_enable(sport->clk_per);
+       if (retval)
+               return;
+       retval = clk_enable(sport->clk_ipg);
+       if (retval) {
+               clk_disable(sport->clk_per);
+               return;
+       }
 
        if (sport->port.sysrq)
                locked = 0;
@@ -1285,6 +1291,9 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
 
        if (locked)
                spin_unlock_irqrestore(&sport->port.lock, flags);
+
+       clk_disable(sport->clk_ipg);
+       clk_disable(sport->clk_per);
 }
 
 /*
@@ -1358,6 +1367,7 @@ imx_console_setup(struct console *co, char *options)
        int bits = 8;
        int parity = 'n';
        int flow = 'n';
+       int retval;
 
        /*
         * Check whether an invalid uart number has been specified, and
@@ -1370,6 +1380,11 @@ imx_console_setup(struct console *co, char *options)
        if (sport == NULL)
                return -ENODEV;
 
+       /* For setting the registers, we only need to enable the ipg clock. */
+       retval = clk_prepare_enable(sport->clk_ipg);
+       if (retval)
+               goto error_console;
+
        if (options)
                uart_parse_options(options, &baud, &parity, &bits, &flow);
        else
@@ -1377,7 +1392,20 @@ imx_console_setup(struct console *co, char *options)
 
        imx_setup_ufcr(sport, 0);
 
-       return uart_set_options(&sport->port, co, baud, parity, bits, flow);
+       retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);
+
+       clk_disable(sport->clk_ipg);
+       if (retval) {
+               clk_unprepare(sport->clk_ipg);
+               goto error_console;
+       }
+
+       retval = clk_prepare(sport->clk_per);
+       if (retval)
+               clk_disable_unprepare(sport->clk_ipg);
+
+error_console:
+       return retval;
 }
 
 static struct uart_driver imx_reg;
@@ -1555,9 +1583,6 @@ static int serial_imx_probe(struct platform_device *pdev)
                return ret;
        }
 
-       clk_prepare_enable(sport->clk_per);
-       clk_prepare_enable(sport->clk_ipg);
-
        sport->port.uartclk = clk_get_rate(sport->clk_per);
 
        imx_ports[sport->port.line] = sport;
@@ -1566,7 +1591,7 @@ static int serial_imx_probe(struct platform_device *pdev)
        if (pdata && pdata->init) {
                ret = pdata->init(pdev);
                if (ret)
-                       goto clkput;
+                       return ret;
        }
 
        ret = uart_add_one_port(&imx_reg, &sport->port);
@@ -1574,18 +1599,10 @@ static int serial_imx_probe(struct platform_device *pdev)
                goto deinit;
        platform_set_drvdata(pdev, sport);
 
-       if (!uart_console(&sport->port)) {
-               clk_disable_unprepare(sport->clk_per);
-               clk_disable_unprepare(sport->clk_ipg);
-       }
-
        return 0;
 deinit:
        if (pdata && pdata->exit)
                pdata->exit(pdev);
-clkput:
-       clk_disable_unprepare(sport->clk_per);
-       clk_disable_unprepare(sport->clk_ipg);
        return ret;
 }