diff options
author | Guoniu.Zhou <guoniu.zhou@nxp.com> | 2017-11-10 09:58:20 +0800 |
---|---|---|
committer | Guoniu.Zhou <guoniu.zhou@nxp.com> | 2017-11-14 16:04:06 +0800 |
commit | 3cab760652a489f0f569cfa3744c2f1f9800f2d1 (patch) | |
tree | 78d05ac7732c02c09bb05839dc50c7a2e66be1c7 | |
parent | ee294069e7f60f2bc6c9378426774a6c07543a51 (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.c | 50 | ||||
-rw-r--r-- | drivers/media/platform/imx8/mxc-mipi-csi2.h | 5 |
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 |