Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -551,6 +551,7 @@ static int fimc_capture_open(struct file *file)
static int fimc_capture_release(struct file *file)
{
	struct fimc_dev *fimc = video_drvdata(file);
	struct fimc_vid_cap *vc = &fimc->vid_cap;
	int ret;

	dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state);
@@ -558,6 +559,10 @@ static int fimc_capture_release(struct file *file)
	mutex_lock(&fimc->lock);

	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);
		fimc_stop_capture(fimc, false);
		fimc_pipeline_call(fimc, close, &fimc->pipeline);
@@ -1243,8 +1248,10 @@ static int fimc_cap_streamon(struct file *file, void *priv,
	}

	ret = vb2_ioctl_streamon(file, priv, type);
	if (!ret)
	if (!ret) {
		vc->streaming = true;
		return ret;
	}

err_p_stop:
	media_entity_pipeline_stop(entity);
@@ -1258,11 +1265,12 @@ static int fimc_cap_streamoff(struct file *file, void *priv,
	int ret;

	ret = vb2_ioctl_streamoff(file, priv, type);
	if (ret < 0)
		return ret;

	if (ret == 0)
	media_entity_pipeline_stop(&fimc->vid_cap.vfd.entity);

	return ret;
	fimc->vid_cap.streaming = false;
	return 0;
}

static int fimc_cap_reqbufs(struct file *file, void *priv,
+1 −0
Original line number Diff line number Diff line
@@ -319,6 +319,7 @@ struct fimc_vid_cap {
	int				buf_index;
	unsigned int			frame_count;
	unsigned int			reqbufs_count;
	bool				streaming;
	int				input_index;
	int				refcnt;
	u32				input;
+14 −4
Original line number Diff line number Diff line
@@ -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);
	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,
+1 −0
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ struct fimc_lite {
	int			ref_count;

	struct fimc_lite_events	events;
	bool			streaming;
};

static inline bool fimc_lite_active(struct fimc_lite *fimc)