Commit 8d274e7c authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab

[media] s5p-fimc: Ensure proper s_stream() call order in the ISP datapaths

Since the FIMC-IS firmware communicates with an image sensor directly
through the ISP I2C bus controllers data streaming cannot be simply
enabled from left to right or disabled from right to left along the
processing pipeline. Thus a subdev index to call s_stream() on is
looked up from a table, rather than doing the op call based on
increasing/decreasing indexes.
Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3e20c345
...@@ -225,28 +225,36 @@ static int __fimc_pipeline_close(struct fimc_pipeline *p) ...@@ -225,28 +225,36 @@ static int __fimc_pipeline_close(struct fimc_pipeline *p)
} }
/** /**
* __fimc_pipeline_s_stream - invoke s_stream on pipeline subdevs * __fimc_pipeline_s_stream - call s_stream() on pipeline subdevs
* @pipeline: video pipeline structure * @pipeline: video pipeline structure
* @on: passed as the s_stream call argument * @on: passed as the s_stream() callback argument
*/ */
static int __fimc_pipeline_s_stream(struct fimc_pipeline *p, bool on) static int __fimc_pipeline_s_stream(struct fimc_pipeline *p, bool on)
{ {
int i, ret; static const u8 seq[2][IDX_MAX] = {
{ IDX_FIMC, IDX_SENSOR, IDX_IS_ISP, IDX_CSIS, IDX_FLITE },
{ IDX_CSIS, IDX_FLITE, IDX_FIMC, IDX_SENSOR, IDX_IS_ISP },
};
int i, ret = 0;
if (p->subdevs[IDX_SENSOR] == NULL) if (p->subdevs[IDX_SENSOR] == NULL)
return -ENODEV; return -ENODEV;
for (i = 0; i < IDX_MAX; i++) { for (i = 0; i < IDX_MAX; i++) {
unsigned int idx = on ? (IDX_MAX - 1) - i : i; unsigned int idx = seq[on][i];
ret = v4l2_subdev_call(p->subdevs[idx], video, s_stream, on); ret = v4l2_subdev_call(p->subdevs[idx], video, s_stream, on);
if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV) if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
return ret; goto error;
} }
return 0; return 0;
error:
for (; i >= 0; i--) {
unsigned int idx = seq[on][i];
v4l2_subdev_call(p->subdevs[idx], video, s_stream, !on);
}
return ret;
} }
/* Media pipeline operations for the FIMC/FIMC-LITE video device driver */ /* Media pipeline operations for the FIMC/FIMC-LITE video device driver */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment