summaryrefslogtreecommitdiff
path: root/drivers/media/platform/exynos4-is/fimc-lite.c
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2013-03-25 16:50:50 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-04-04 20:24:32 -0300
commit9ea89e2b62c70f3986c89363818a89c8c11c96c4 (patch)
tree4b59e979af0bac64ff3fe0936fa1ac6efd4b6b9d /drivers/media/platform/exynos4-is/fimc-lite.c
parent439797980af4bddfc2b86a44ddb573c5e48a1fcc (diff)
[media] exynos4-is: Ensure proper media pipeline state on device close
Make sure media_entity_pipeline_stop() is called on video device close in cases where there was VIDIOC_STREAMON ioctl and no VIDIOC_STREAMOFF. This patch fixes media entities stream_count state which could prevent links from being disconnected, due to non-zero stream_count. 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>
Diffstat (limited to 'drivers/media/platform/exynos4-is/fimc-lite.c')
-rw-r--r--drivers/media/platform/exynos4-is/fimc-lite.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/media/platform/exynos4-is/fimc-lite.c b/drivers/media/platform/exynos4-is/fimc-lite.c
index b11e3583b9fa..cb196b85a858 100644
--- a/drivers/media/platform/exynos4-is/fimc-lite.c
+++ b/drivers/media/platform/exynos4-is/fimc-lite.c
@@ -507,6 +507,10 @@ static int fimc_lite_release(struct file *file)
if (v4l2_fh_is_singular_file(file) &&
atomic_read(&fimc->out_path) == FIMC_IO_DMA) {
+ if (fimc->streaming) {
+ media_entity_pipeline_stop(&fimc->vfd.entity);
+ fimc->streaming = false;
+ }
clear_bit(ST_FLITE_IN_USE, &fimc->state);
fimc_lite_stop_capture(fimc, false);
fimc_pipeline_call(fimc, close, &fimc->pipeline);
@@ -798,8 +802,11 @@ static int fimc_lite_streamon(struct file *file, void *priv,
goto err_p_stop;
ret = vb2_ioctl_streamon(file, priv, type);
- if (!ret)
+ if (!ret) {
+ fimc->streaming = true;
return ret;
+ }
+
err_p_stop:
media_entity_pipeline_stop(entity);
return 0;
@@ -812,9 +819,12 @@ static int fimc_lite_streamoff(struct file *file, void *priv,
int ret;
ret = vb2_ioctl_streamoff(file, priv, type);
- if (ret == 0)
- media_entity_pipeline_stop(&fimc->vfd.entity);
- return ret;
+ if (ret < 0)
+ return ret;
+
+ media_entity_pipeline_stop(&fimc->vfd.entity);
+ fimc->streaming = false;
+ return 0;
}
static int fimc_lite_reqbufs(struct file *file, void *priv,