Commit 9ea89e2b authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab

[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: 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 43979798
...@@ -551,6 +551,7 @@ static int fimc_capture_open(struct file *file) ...@@ -551,6 +551,7 @@ static int fimc_capture_open(struct file *file)
static int fimc_capture_release(struct file *file) static int fimc_capture_release(struct file *file)
{ {
struct fimc_dev *fimc = video_drvdata(file); struct fimc_dev *fimc = video_drvdata(file);
struct fimc_vid_cap *vc = &fimc->vid_cap;
int ret; int ret;
dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state);
...@@ -558,6 +559,10 @@ static int fimc_capture_release(struct file *file) ...@@ -558,6 +559,10 @@ static int fimc_capture_release(struct file *file)
mutex_lock(&fimc->lock); mutex_lock(&fimc->lock);
if (v4l2_fh_is_singular_file(file)) { if (v4l2_fh_is_singular_file(file)) {
if (vc->streaming) {
media_entity_pipeline_stop(&vc->vfd.entity);
vc->streaming = false;
}
clear_bit(ST_CAPT_BUSY, &fimc->state); clear_bit(ST_CAPT_BUSY, &fimc->state);
fimc_stop_capture(fimc, false); fimc_stop_capture(fimc, false);
fimc_pipeline_call(fimc, close, &fimc->pipeline); fimc_pipeline_call(fimc, close, &fimc->pipeline);
...@@ -1243,8 +1248,10 @@ static int fimc_cap_streamon(struct file *file, void *priv, ...@@ -1243,8 +1248,10 @@ static int fimc_cap_streamon(struct file *file, void *priv,
} }
ret = vb2_ioctl_streamon(file, priv, type); ret = vb2_ioctl_streamon(file, priv, type);
if (!ret) if (!ret) {
vc->streaming = true;
return ret; return ret;
}
err_p_stop: err_p_stop:
media_entity_pipeline_stop(entity); media_entity_pipeline_stop(entity);
...@@ -1258,11 +1265,12 @@ static int fimc_cap_streamoff(struct file *file, void *priv, ...@@ -1258,11 +1265,12 @@ static int fimc_cap_streamoff(struct file *file, void *priv,
int ret; int ret;
ret = vb2_ioctl_streamoff(file, priv, type); ret = vb2_ioctl_streamoff(file, priv, type);
if (ret < 0)
return ret;
if (ret == 0) media_entity_pipeline_stop(&fimc->vid_cap.vfd.entity);
media_entity_pipeline_stop(&fimc->vid_cap.vfd.entity); fimc->vid_cap.streaming = false;
return 0;
return ret;
} }
static int fimc_cap_reqbufs(struct file *file, void *priv, static int fimc_cap_reqbufs(struct file *file, void *priv,
......
...@@ -319,6 +319,7 @@ struct fimc_vid_cap { ...@@ -319,6 +319,7 @@ struct fimc_vid_cap {
int buf_index; int buf_index;
unsigned int frame_count; unsigned int frame_count;
unsigned int reqbufs_count; unsigned int reqbufs_count;
bool streaming;
int input_index; int input_index;
int refcnt; int refcnt;
u32 input; u32 input;
......
...@@ -507,6 +507,10 @@ static int fimc_lite_release(struct file *file) ...@@ -507,6 +507,10 @@ static int fimc_lite_release(struct file *file)
if (v4l2_fh_is_singular_file(file) && if (v4l2_fh_is_singular_file(file) &&
atomic_read(&fimc->out_path) == FIMC_IO_DMA) { 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); clear_bit(ST_FLITE_IN_USE, &fimc->state);
fimc_lite_stop_capture(fimc, false); fimc_lite_stop_capture(fimc, false);
fimc_pipeline_call(fimc, close, &fimc->pipeline); fimc_pipeline_call(fimc, close, &fimc->pipeline);
...@@ -798,8 +802,11 @@ static int fimc_lite_streamon(struct file *file, void *priv, ...@@ -798,8 +802,11 @@ static int fimc_lite_streamon(struct file *file, void *priv,
goto err_p_stop; goto err_p_stop;
ret = vb2_ioctl_streamon(file, priv, type); ret = vb2_ioctl_streamon(file, priv, type);
if (!ret) if (!ret) {
fimc->streaming = true;
return ret; return ret;
}
err_p_stop: err_p_stop:
media_entity_pipeline_stop(entity); media_entity_pipeline_stop(entity);
return 0; return 0;
...@@ -812,9 +819,12 @@ static int fimc_lite_streamoff(struct file *file, void *priv, ...@@ -812,9 +819,12 @@ static int fimc_lite_streamoff(struct file *file, void *priv,
int ret; int ret;
ret = vb2_ioctl_streamoff(file, priv, type); ret = vb2_ioctl_streamoff(file, priv, type);
if (ret == 0) if (ret < 0)
media_entity_pipeline_stop(&fimc->vfd.entity); return ret;
return ret;
media_entity_pipeline_stop(&fimc->vfd.entity);
fimc->streaming = false;
return 0;
} }
static int fimc_lite_reqbufs(struct file *file, void *priv, static int fimc_lite_reqbufs(struct file *file, void *priv,
......
...@@ -166,6 +166,7 @@ struct fimc_lite { ...@@ -166,6 +166,7 @@ struct fimc_lite {
int ref_count; int ref_count;
struct fimc_lite_events events; struct fimc_lite_events events;
bool streaming;
}; };
static inline bool fimc_lite_active(struct fimc_lite *fimc) static inline bool fimc_lite_active(struct fimc_lite *fimc)
......
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