Commit 95c4a17f authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab

[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: 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 99fd133f
...@@ -1230,36 +1230,43 @@ static int fimc_cap_streamon(struct file *file, void *priv, ...@@ -1230,36 +1230,43 @@ static int fimc_cap_streamon(struct file *file, void *priv,
{ {
struct fimc_dev *fimc = video_drvdata(file); struct fimc_dev *fimc = video_drvdata(file);
struct fimc_pipeline *p = &fimc->pipeline; 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; int ret;
if (fimc_capture_active(fimc)) if (fimc_capture_active(fimc))
return -EBUSY; return -EBUSY;
ret = media_entity_pipeline_start(&sd->entity, p->m_pipeline); ret = media_entity_pipeline_start(entity, p->m_pipeline);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (fimc->vid_cap.user_subdev_api) { if (vc->user_subdev_api) {
ret = fimc_pipeline_validate(fimc); ret = fimc_pipeline_validate(fimc);
if (ret < 0) { if (ret < 0)
media_entity_pipeline_stop(&sd->entity); goto err_p_stop;
return ret;
}
} }
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, static int fimc_cap_streamoff(struct file *file, void *priv,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
struct fimc_dev *fimc = video_drvdata(file); struct fimc_dev *fimc = video_drvdata(file);
struct v4l2_subdev *sd = fimc->pipeline.subdevs[IDX_SENSOR];
int ret; int ret;
ret = vb2_streamoff(&fimc->vid_cap.vbq, type); ret = vb2_streamoff(&fimc->vid_cap.vbq, type);
if (ret == 0) if (ret == 0)
media_entity_pipeline_stop(&sd->entity); media_entity_pipeline_stop(&fimc->vid_cap.vfd.entity);
return ret; return ret;
} }
......
...@@ -800,20 +800,20 @@ static int fimc_lite_streamon(struct file *file, void *priv, ...@@ -800,20 +800,20 @@ static int fimc_lite_streamon(struct file *file, void *priv,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
struct fimc_lite *fimc = video_drvdata(file); 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; struct fimc_pipeline *p = &fimc->pipeline;
int ret; int ret;
if (fimc_lite_active(fimc)) if (fimc_lite_active(fimc))
return -EBUSY; return -EBUSY;
ret = media_entity_pipeline_start(&sensor->entity, p->m_pipeline); ret = media_entity_pipeline_start(entity, p->m_pipeline);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = fimc_pipeline_validate(fimc); ret = fimc_pipeline_validate(fimc);
if (ret) { if (ret) {
media_entity_pipeline_stop(&sensor->entity); media_entity_pipeline_stop(entity);
return ret; return ret;
} }
...@@ -824,12 +824,11 @@ static int fimc_lite_streamoff(struct file *file, void *priv, ...@@ -824,12 +824,11 @@ static int fimc_lite_streamoff(struct file *file, void *priv,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
struct fimc_lite *fimc = video_drvdata(file); struct fimc_lite *fimc = video_drvdata(file);
struct v4l2_subdev *sd = fimc->pipeline.subdevs[IDX_SENSOR];
int ret; int ret;
ret = vb2_streamoff(&fimc->vb_queue, type); ret = vb2_streamoff(&fimc->vb_queue, type);
if (ret == 0) if (ret == 0)
media_entity_pipeline_stop(&sd->entity); media_entity_pipeline_stop(&fimc->vfd.entity);
return ret; return ret;
} }
......
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