MLK-21491 serial: imx: add pm_qos to interact with cpu idle
authorFugang Duan <fugang.duan@nxp.com>
Wed, 17 Apr 2019 12:44:44 +0000 (20:44 +0800)
committerFugang Duan <fugang.duan@nxp.com>
Thu, 18 Apr 2019 09:07:59 +0000 (17:07 +0800)
Add pm_qos to prevent cpuidle from entering low level idles
for uart DMA mode when the uart port is active.

Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com>
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
drivers/tty/serial/imx.c

index 7bdda13..2e18d0f 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <asm/irq.h>
 #include <linux/busfreq-imx.h>
+#include <linux/pm_qos.h>
 #include <linux/platform_data/serial-imx.h>
 #include <linux/platform_data/dma-imx.h>
 
@@ -229,6 +230,8 @@ struct imx_port {
        unsigned int            dma_tx_nents;
        unsigned int            saved_reg[10];
        bool                    context_saved;
+
+       struct pm_qos_request   pm_qos_req;
 };
 
 struct imx_port_ucrs {
@@ -1233,6 +1236,7 @@ static void imx_uart_dma_exit(struct imx_port *sport)
                sport->dma_chan_tx = NULL;
        }
 
+       pm_qos_remove_request(&sport->pm_qos_req);
        release_bus_freq(BUS_FREQ_HIGH);
 }
 
@@ -1242,6 +1246,10 @@ static int imx_uart_dma_init(struct imx_port *sport)
        struct device *dev = sport->port.dev;
        int ret;
 
+       /* request high bus for DMA mode */
+       request_bus_freq(BUS_FREQ_HIGH);
+       pm_qos_add_request(&sport->pm_qos_req, PM_QOS_CPU_DMA_LATENCY, 0);
+
        /* Prepare for RX : */
        sport->dma_chan_rx = dma_request_slave_channel(dev, "rx");
        if (!sport->dma_chan_rx) {
@@ -1286,8 +1294,6 @@ static int imx_uart_dma_init(struct imx_port *sport)
                goto err;
        }
 
-       request_bus_freq(BUS_FREQ_HIGH);
-
        return 0;
 err:
        imx_uart_dma_exit(sport);