Skip to content
Snippets Groups Projects
Commit a03d33f3 authored by Guoniu.Zhou's avatar Guoniu.Zhou Committed by Jason Liu
Browse files

MLK-16695-1: mipi_csi: Add pm suspend and resume


Add mipi_csi power manager suspend and resume support.

Reviewed-by: default avatarSandor Yu <sandor.yu@nxp.com>
Signed-off-by: default avatarGuoniu.Zhou <guoniu.zhou@nxp.com>
parent 2de55116
No related branches found
No related tags found
No related merge requests found
......@@ -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,50 @@ static int mipi_csi2_remove(struct platform_device *pdev)
return 0;
}
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 +664,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,
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment