MLK-16712 tty: serial: lpuart: keep per clock disabled during suspend
authorFugang Duan <fugang.duan@nxp.com>
Fri, 27 Oct 2017 01:45:25 +0000 (09:45 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:39:02 +0000 (15:39 -0500)
Keep per clock disabled during system suspend.

BuildInfo:
 - SCFW 88456c73, IMX-MKIMAGE 06bc2767, ATF a438801
 - U-Boot 2017.03-imx_v2017.03_4.9.51_imx8_beta1+g7953d47

Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Reviewed-by: Anson Huang <Anson.Huang@nxp.com>
drivers/tty/serial/fsl_lpuart.c

index 3b6cbc4..9a3b925 100644 (file)
@@ -2381,12 +2381,17 @@ static int lpuart_suspend(struct device *dev)
        unsigned long flags;
        int ret;
 
-       ret = clk_prepare_enable(sport->ipg_clk);
-       if (ret)
-               return ret;
-
        uart_suspend_port(&lpuart_reg, &sport->port);
 
+       if (!uart_console(&sport->port) &&
+           !(sport->port.irq_wake && tty_port_initialized(port))) {
+               ret = clk_prepare_enable(sport->ipg_clk);
+               if (ret)
+                       return ret;
+       } else {
+               clk_disable_unprepare(sport->per_clk);
+       }
+
        if (sport->lpuart32) {
                temp = lpuart32_read(sport->port.membase + UARTCTRL);
                temp &= ~(UARTCTRL_TE | UARTCTRL_TIE | UARTCTRL_TCIE);
@@ -2540,15 +2545,24 @@ static inline void lpuart_resume_init(struct lpuart_port *sport)
 static int lpuart_resume(struct device *dev)
 {
        struct lpuart_port *sport = dev_get_drvdata(dev);
+       struct tty_port *port = &sport->port.state->port;
+       int ret;
 
        if (sport->lpuart32)
                lpuart32_resume_init(sport);
        else
                lpuart_resume_init(sport);
 
-       uart_resume_port(&lpuart_reg, &sport->port);
+       if (uart_console(&sport->port) ||
+           (sport->port.irq_wake && tty_port_initialized(port))) {
+               ret = clk_prepare_enable(sport->per_clk);
+               if (ret)
+                       return ret;
+       } else {
+               clk_disable_unprepare(sport->ipg_clk);
+       }
 
-       clk_disable_unprepare(sport->ipg_clk);
+       uart_resume_port(&lpuart_reg, &sport->port);
 
        return 0;
 }