diff options
author | Qipan Li <Qipan.Li@csr.com> | 2014-01-03 15:44:07 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-07 17:09:04 -0800 |
commit | 388faf9ffdaf92c81243514a2dd4c6ce04d28874 (patch) | |
tree | 30369709d7115a7d53663a66a25674e06ce032f8 /drivers/tty | |
parent | 99e626f50477e3b14c9be43892c33ab75b2e5bf9 (diff) |
serial: sirf: provide pm entries of uart_ops
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>
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/sirfsoc_uart.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/tty/serial/sirfsoc_uart.c b/drivers/tty/serial/sirfsoc_uart.c index 6fea79b96bb9..a6c38ab1eeb2 100644 --- a/drivers/tty/serial/sirfsoc_uart.c +++ b/drivers/tty/serial/sirfsoc_uart.c @@ -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; |