[media] s5p-fimc: Use video entity for marking media pipeline as streaming
It doesn't matter whether we start from the sensor of from the video node entity. Remove use of pipeline->subdevs array where possible, so we can partly drop dependency on struct fimc_pipeline in the fimc-lite module, which is also used by the exynos5-is driver. Also make sure we revert any media entity pipeline operations when vb2_streamon() function fails. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
99fd133f90
commit
95c4a17f79
@ -1230,36 +1230,43 @@ static int fimc_cap_streamon(struct file *file, void *priv,
|
||||
{
|
||||
struct fimc_dev *fimc = video_drvdata(file);
|
||||
struct fimc_pipeline *p = &fimc->pipeline;
|
||||
struct v4l2_subdev *sd = p->subdevs[IDX_SENSOR];
|
||||
struct fimc_vid_cap *vc = &fimc->vid_cap;
|
||||
struct media_entity *entity = &vc->vfd.entity;
|
||||
int ret;
|
||||
|
||||
if (fimc_capture_active(fimc))
|
||||
return -EBUSY;
|
||||
|
||||
ret = media_entity_pipeline_start(&sd->entity, p->m_pipeline);
|
||||
ret = media_entity_pipeline_start(entity, p->m_pipeline);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (fimc->vid_cap.user_subdev_api) {
|
||||
if (vc->user_subdev_api) {
|
||||
ret = fimc_pipeline_validate(fimc);
|
||||
if (ret < 0) {
|
||||
media_entity_pipeline_stop(&sd->entity);
|
||||
return ret;
|
||||
}
|
||||
if (ret < 0)
|
||||
goto err_p_stop;
|
||||
}
|
||||
return vb2_streamon(&fimc->vid_cap.vbq, type);
|
||||
|
||||
ret = vb2_streamon(&vc->vbq, type);
|
||||
if (!ret)
|
||||
return ret;
|
||||
|
||||
err_p_stop:
|
||||
media_entity_pipeline_stop(entity);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fimc_cap_streamoff(struct file *file, void *priv,
|
||||
enum v4l2_buf_type type)
|
||||
{
|
||||
struct fimc_dev *fimc = video_drvdata(file);
|
||||
struct v4l2_subdev *sd = fimc->pipeline.subdevs[IDX_SENSOR];
|
||||
int ret;
|
||||
|
||||
ret = vb2_streamoff(&fimc->vid_cap.vbq, type);
|
||||
|
||||
if (ret == 0)
|
||||
media_entity_pipeline_stop(&sd->entity);
|
||||
media_entity_pipeline_stop(&fimc->vid_cap.vfd.entity);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -800,20 +800,20 @@ static int fimc_lite_streamon(struct file *file, void *priv,
|
||||
enum v4l2_buf_type type)
|
||||
{
|
||||
struct fimc_lite *fimc = video_drvdata(file);
|
||||
struct v4l2_subdev *sensor = fimc->pipeline.subdevs[IDX_SENSOR];
|
||||
struct media_entity *entity = &fimc->vfd.entity;
|
||||
struct fimc_pipeline *p = &fimc->pipeline;
|
||||
int ret;
|
||||
|
||||
if (fimc_lite_active(fimc))
|
||||
return -EBUSY;
|
||||
|
||||
ret = media_entity_pipeline_start(&sensor->entity, p->m_pipeline);
|
||||
ret = media_entity_pipeline_start(entity, p->m_pipeline);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fimc_pipeline_validate(fimc);
|
||||
if (ret) {
|
||||
media_entity_pipeline_stop(&sensor->entity);
|
||||
media_entity_pipeline_stop(entity);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -824,12 +824,11 @@ static int fimc_lite_streamoff(struct file *file, void *priv,
|
||||
enum v4l2_buf_type type)
|
||||
{
|
||||
struct fimc_lite *fimc = video_drvdata(file);
|
||||
struct v4l2_subdev *sd = fimc->pipeline.subdevs[IDX_SENSOR];
|
||||
int ret;
|
||||
|
||||
ret = vb2_streamoff(&fimc->vb_queue, type);
|
||||
if (ret == 0)
|
||||
media_entity_pipeline_stop(&sd->entity);
|
||||
media_entity_pipeline_stop(&fimc->vfd.entity);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user