MLK-16695-1: mipi_csi: Add pm suspend and resume
authorGuoniu.Zhou <guoniu.zhou@nxp.com>
Fri, 10 Nov 2017 01:58:20 +0000 (09:58 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:46:56 +0000 (15:46 -0500)
Add mipi_csi power manager suspend and resume support.

Reviewed-by: Sandor Yu <sandor.yu@nxp.com>
Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com>
(cherry picked from commit 3cab760652a489f0f569cfa3744c2f1f9800f2d1)

drivers/media/platform/imx8/mxc-mipi-csi2.c
drivers/media/platform/imx8/mxc-mipi-csi2.h

index e957849..86489c4 100644 (file)
@@ -589,6 +589,8 @@ static int mipi_csi2_probe(struct platform_device *pdev)
                 csi2dev->num_lanes, csi2dev->sd.name);
 
        csi2dev->running = 0;
+       csi2dev->flags = MXC_MIPI_CSI2_PM_POWERED;
+
        return 0;
 
 e_clkdis:
@@ -608,6 +610,51 @@ static int mipi_csi2_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int  mipi_csi2_pm_suspend(struct device *dev)
+{
+       struct mxc_mipi_csi2_dev *csi2dev = dev_get_drvdata(dev);
+       struct v4l2_subdev *sd = &csi2dev->sd;
+
+       if (csi2dev->flags & MXC_MIPI_CSI2_PM_SUSPENDED)
+               return 0;
+
+       if (csi2dev->running)
+               mipi_csi2_s_stream(sd, false);
+       mipi_csi2_clk_disable(csi2dev);
+       csi2dev->flags &= ~MXC_MIPI_CSI2_PM_POWERED;
+       csi2dev->flags |= MXC_MIPI_CSI2_PM_SUSPENDED;
+
+       return 0;
+}
+
+static int  mipi_csi2_pm_resume(struct device *dev)
+{
+       struct mxc_mipi_csi2_dev *csi2dev = dev_get_drvdata(dev);
+       struct v4l2_subdev *sd = &csi2dev->sd;
+       int ret;
+
+       if (csi2dev->flags & MXC_MIPI_CSI2_PM_POWERED)
+               return 0;
+
+       ret = mipi_csi2_clk_enable(csi2dev);
+       if (ret < 0) {
+               dev_info(dev, "%s:%d fail\n", __func__, __LINE__);
+               return -EAGAIN;
+       }
+
+       if (csi2dev->running)
+               mipi_csi2_s_stream(sd, true);
+       csi2dev->flags |= MXC_MIPI_CSI2_PM_POWERED;
+       csi2dev->flags &= ~MXC_MIPI_CSI2_PM_SUSPENDED;
+
+       return 0;
+}
+
+static const struct dev_pm_ops mipi_csi_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(mipi_csi2_pm_suspend, mipi_csi2_pm_resume)
+};
+
 static const struct of_device_id mipi_csi2_of_match[] = {
        {       .compatible = "fsl,mxc-mipi-csi2",},
        { /* sentinel */ },
@@ -618,7 +665,8 @@ MODULE_DEVICE_TABLE(of, mipi_csi2_of_match);
 static struct platform_driver mipi_csi2_driver = {
        .driver = {
                .name = MXC_MIPI_CSI2_DRIVER_NAME,
-               .of_match_table = mipi_csi2_of_match,
+               .of_match_table = mipi_csi2_of_match,
+               .pm = &mipi_csi_pm_ops,
        },
        .probe = mipi_csi2_probe,
        .remove = mipi_csi2_remove,
index b451112..cdaf9d3 100644 (file)
@@ -248,4 +248,9 @@ struct mxc_mipi_csi2_dev {
        u8 running;
 };
 
+enum mxc_mipi_csi2_pm_state {
+       MXC_MIPI_CSI2_PM_POWERED        = 0x1,
+       MXC_MIPI_CSI2_PM_SUSPENDED      = 0x2,
+};
+
 #endif