]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00139274-4 [UART]Enable suspend/resume feature
authorAnson Huang <b20788@freescale.com>
Wed, 20 Jul 2011 06:46:37 +0000 (14:46 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:09:19 +0000 (14:09 +0200)
1. Enable wake up of uart;

Signed-off-by: Anson Huang <b20788@freescale.com>
drivers/tty/serial/imx.c

index 850b6d811418a5ff5b2443bf31f90df22429b03a..fd517262a8d07dbc401af568b2a75c352524a9c9 100644 (file)
@@ -501,8 +501,7 @@ static irqreturn_t imx_int(int irq, void *dev_id)
 
        if (sts & USR1_RTSD)
                imx_rtsint(irq, dev_id);
-
-#ifdef CONFIG_ARCH_MX6
+#ifdef CONFIG_PM
        if (sts & USR1_AWAKE)
                writel(USR1_AWAKE, sport->port.membase + USR1);
 #endif
@@ -602,6 +601,7 @@ static int imx_startup(struct uart_port *port)
        struct imx_port *sport = (struct imx_port *)port;
        int retval;
        unsigned long flags, temp;
+       struct tty_struct *tty;
 
        imx_setup_ufcr(sport, 0);
 
@@ -732,6 +732,10 @@ static int imx_startup(struct uart_port *port)
                        pdata->irda_enable(1);
        }
 
+       tty = sport->port.state->port.tty;
+#ifdef CONFIG_PM
+       device_set_wakeup_enable(tty->dev, 1);
+#endif
        return 0;
 
 error_out3:
@@ -1212,14 +1216,20 @@ static int serial_imx_suspend(struct platform_device *dev, pm_message_t state)
        struct imx_port *sport = platform_get_drvdata(dev);
        unsigned int val;
 
+       if (device_may_wakeup(&dev->dev)) {
+               enable_irq_wake(sport->rxirq);
+#ifdef CONFIG_PM
+               if (sport->port.line == 0) {
+                       /* enable awake for MX6 */
+                       val = readl(sport->port.membase + UCR3);
+                       val |= UCR3_AWAKEN;
+                       writel(val, sport->port.membase + UCR3);
+               }
+#endif
+       }
        if (sport)
                uart_suspend_port(&imx_reg, &sport->port);
-#ifdef CONFIG_ARCH_MX6
-       /* enable awake for MX6*/
-       val = readl(sport->port.membase + UCR3);
-       val |= UCR3_AWAKEN;
-       writel(val, sport->port.membase + UCR3);
-#endif
+
        return 0;
 }
 
@@ -1231,11 +1241,16 @@ static int serial_imx_resume(struct platform_device *dev)
        if (sport)
                uart_resume_port(&imx_reg, &sport->port);
 
-#ifdef CONFIG_ARCH_MX6
-       val = readl(sport->port.membase + UCR3);
-       val &= ~UCR3_AWAKEN;
-       writel(val, sport->port.membase + UCR3);
+       if (device_may_wakeup(&dev->dev)) {
+#ifdef CONFIG_PM
+               if (sport->port.line == 0) {
+                       val = readl(sport->port.membase + UCR3);
+                       val &= ~UCR3_AWAKEN;
+                       writel(val, sport->port.membase + UCR3);
+               }
 #endif
+               disable_irq_wake(sport->rxirq);
+       }
        return 0;
 }
 
@@ -1311,6 +1326,9 @@ static int serial_imx_probe(struct platform_device *pdev)
                goto deinit;
        platform_set_drvdata(pdev, &sport->port);
 
+#ifdef CONFIG_PM
+       device_init_wakeup(&pdev->dev, 1);
+#endif
        return 0;
 deinit:
        if (pdata && pdata->exit)