]> git.karo-electronics.de Git - linux-beck.git/commitdiff
serial: sirf: provide pm entries of uart_ops
authorQipan Li <Qipan.Li@csr.com>
Fri, 3 Jan 2014 07:44:07 +0000 (15:44 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Jan 2014 01:09:04 +0000 (17:09 -0800)
this patch provides PM entry of uart_ops, then drop clk enable and
disable because serial core will do it.

the patch also fixes the issue that uart hang in resume caused by
not-enabled clock.

Signed-off-by: Qipan Li <Qipan.Li@csr.com>
Signed-off-by: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sirfsoc_uart.c

index 6fea79b96bb93eeb910a753bfb7f6442501622dd..a6c38ab1eeb2c3137f60e37a105ac88933ec58ba 100644 (file)
@@ -1033,6 +1033,16 @@ static void sirfsoc_uart_set_termios(struct uart_port *port,
        spin_unlock_irqrestore(&port->lock, flags);
 }
 
+static void sirfsoc_uart_pm(struct uart_port *port, unsigned int state,
+                             unsigned int oldstate)
+{
+       struct sirfsoc_uart_port *sirfport = to_sirfport(port);
+       if (!state)
+               clk_prepare_enable(sirfport->clk);
+       else
+               clk_disable_unprepare(sirfport->clk);
+}
+
 static unsigned int sirfsoc_uart_init_tx_dma(struct uart_port *port)
 {
        struct sirfsoc_uart_port *sirfport = to_sirfport(port);
@@ -1264,6 +1274,7 @@ static struct uart_ops sirfsoc_uart_ops = {
        .startup        = sirfsoc_uart_startup,
        .shutdown       = sirfsoc_uart_shutdown,
        .set_termios    = sirfsoc_uart_set_termios,
+       .pm             = sirfsoc_uart_pm,
        .type           = sirfsoc_uart_type,
        .release_port   = sirfsoc_uart_release_port,
        .request_port   = sirfsoc_uart_request_port,
@@ -1486,7 +1497,6 @@ usp_no_flow_control:
                ret = PTR_ERR(sirfport->clk);
                goto err;
        }
-       clk_prepare_enable(sirfport->clk);
        port->uartclk = clk_get_rate(sirfport->clk);
 
        port->ops = &sirfsoc_uart_ops;
@@ -1502,7 +1512,6 @@ usp_no_flow_control:
        return 0;
 
 port_err:
-       clk_disable_unprepare(sirfport->clk);
        clk_put(sirfport->clk);
 err:
        return ret;
@@ -1512,7 +1521,6 @@ static int sirfsoc_uart_remove(struct platform_device *pdev)
 {
        struct sirfsoc_uart_port *sirfport = platform_get_drvdata(pdev);
        struct uart_port *port = &sirfport->port;
-       clk_disable_unprepare(sirfport->clk);
        clk_put(sirfport->clk);
        uart_remove_one_port(&sirfsoc_uart_drv, port);
        return 0;