summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuoniu.Zhou <guoniu.zhou@nxp.com>2017-11-10 09:58:20 +0800
committerGuoniu.Zhou <guoniu.zhou@nxp.com>2017-11-14 16:04:06 +0800
commit3cab760652a489f0f569cfa3744c2f1f9800f2d1 (patch)
tree78d05ac7732c02c09bb05839dc50c7a2e66be1c7
parentee294069e7f60f2bc6c9378426774a6c07543a51 (diff)
MLK-16695-1: mipi_csi: Add pm suspend and resume
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>
-rw-r--r--drivers/media/platform/imx8/mxc-mipi-csi2.c50
-rw-r--r--drivers/media/platform/imx8/mxc-mipi-csi2.h5
2 files changed, 54 insertions, 1 deletions
diff --git a/drivers/media/platform/imx8/mxc-mipi-csi2.c b/drivers/media/platform/imx8/mxc-mipi-csi2.c
index e95784965aa7..86489c497e2e 100644
--- a/drivers/media/platform/imx8/mxc-mipi-csi2.c
+++ b/drivers/media/platform/imx8/mxc-mipi-csi2.c
@@ -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,
diff --git a/drivers/media/platform/imx8/mxc-mipi-csi2.h b/drivers/media/platform/imx8/mxc-mipi-csi2.h
index b451112b1489..cdaf9d3971c1 100644
--- a/drivers/media/platform/imx8/mxc-mipi-csi2.h
+++ b/drivers/media/platform/imx8/mxc-mipi-csi2.h
@@ -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