enum {
ST_POWERED = 1,
- ST_STREAMING = 2,
- ST_SUSPENDED = 4,
};
struct mipi_csis_event {
mutex_lock(&csis->lock);
if (enable) {
- if (csis->state & ST_SUSPENDED) {
- ret = -EBUSY;
- goto unlock;
- }
-
mipi_csis_start_stream(csis);
ret = v4l2_subdev_call(csis->src_sd, video, s_stream, 1);
if (ret < 0)
goto unlock;
mipi_csis_log_counters(csis, true);
-
- csis->state |= ST_STREAMING;
} else {
v4l2_subdev_call(csis->src_sd, video, s_stream, 0);
mipi_csis_stop_stream(csis);
- csis->state &= ~ST_STREAMING;
+
if (csis->debug.enable)
mipi_csis_log_counters(csis, true);
}
* Suspend/resume
*/
-static int mipi_csis_pm_suspend(struct device *dev, bool runtime)
+static int __maybe_unused mipi_csis_runtime_suspend(struct device *dev)
{
struct v4l2_subdev *sd = dev_get_drvdata(dev);
struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
goto unlock;
mipi_csis_clk_disable(csis);
csis->state &= ~ST_POWERED;
- if (!runtime)
- csis->state |= ST_SUSPENDED;
}
unlock:
return ret ? -EAGAIN : 0;
}
-static int mipi_csis_pm_resume(struct device *dev, bool runtime)
+static int __maybe_unused mipi_csis_runtime_resume(struct device *dev)
{
struct v4l2_subdev *sd = dev_get_drvdata(dev);
struct mipi_csis_device *csis = sd_to_mipi_csis_device(sd);
int ret = 0;
mutex_lock(&csis->lock);
- if (!runtime && !(csis->state & ST_SUSPENDED))
- goto unlock;
if (!(csis->state & ST_POWERED)) {
ret = mipi_csis_phy_enable(csis);
csis->state |= ST_POWERED;
mipi_csis_clk_enable(csis);
}
- if (csis->state & ST_STREAMING)
- mipi_csis_start_stream(csis);
-
- csis->state &= ~ST_SUSPENDED;
unlock:
mutex_unlock(&csis->lock);
return ret ? -EAGAIN : 0;
}
-static int __maybe_unused mipi_csis_suspend(struct device *dev)
-{
- return mipi_csis_pm_suspend(dev, false);
-}
-
-static int __maybe_unused mipi_csis_resume(struct device *dev)
-{
- return mipi_csis_pm_resume(dev, false);
-}
-
-static int __maybe_unused mipi_csis_runtime_suspend(struct device *dev)
-{
- return mipi_csis_pm_suspend(dev, true);
-}
-
-static int __maybe_unused mipi_csis_runtime_resume(struct device *dev)
-{
- return mipi_csis_pm_resume(dev, true);
-}
-
static const struct dev_pm_ops mipi_csis_pm_ops = {
SET_RUNTIME_PM_OPS(mipi_csis_runtime_suspend, mipi_csis_runtime_resume,
NULL)
- SET_SYSTEM_SLEEP_PM_OPS(mipi_csis_suspend, mipi_csis_resume)
};
/* -----------------------------------------------------------------------------
/* Enable runtime PM. */
pm_runtime_enable(dev);
if (!pm_runtime_enabled(dev)) {
- ret = mipi_csis_pm_resume(dev, true);
+ ret = mipi_csis_runtime_resume(dev);
if (ret < 0)
goto unregister_all;
}
v4l2_async_unregister_subdev(&csis->sd);
pm_runtime_disable(&pdev->dev);
- mipi_csis_pm_suspend(&pdev->dev, true);
+ mipi_csis_runtime_suspend(&pdev->dev);
mipi_csis_clk_disable(csis);
media_entity_cleanup(&csis->sd.entity);
mutex_destroy(&csis->lock);