From 7b01408469cae7ef288bbe29ab6324727fb5db0f Mon Sep 17 00:00:00 2001 From: "Guoniu.zhou" Date: Fri, 29 Jan 2021 10:29:11 +0800 Subject: LF-3217: media: isi: cap: call streamoff if the process abnormal exit For normal case, userspace should call streamon/streamoff balance, but for some special case, the process will be killed or terminated and the streamoff ioctl will be ignored. So driver need to handle the case. Signed-off-by: Guoniu.zhou Reviewed-by: Robby Cai (cherry picked from commit 057b44588095cb6be35175f42467c1481d0dd54b) --- drivers/staging/media/imx/imx8-isi-cap.c | 9 +++++++++ drivers/staging/media/imx/imx8-isi-core.h | 1 + 2 files changed, 10 insertions(+) diff --git a/drivers/staging/media/imx/imx8-isi-cap.c b/drivers/staging/media/imx/imx8-isi-cap.c index 6ba5b3a86f49..0960a8fa8af8 100644 --- a/drivers/staging/media/imx/imx8-isi-cap.c +++ b/drivers/staging/media/imx/imx8-isi-cap.c @@ -31,6 +31,8 @@ #include "imx8-common.h" #define sd_to_cap_dev(ptr) container_of(ptr, struct mxc_isi_cap_dev, sd) +static int mxc_isi_cap_streamoff(struct file *file, void *priv, + enum v4l2_buf_type type); struct mxc_isi_fmt mxc_isi_out_formats[] = { { @@ -739,14 +741,19 @@ static int mxc_isi_capture_open(struct file *file) static int mxc_isi_capture_release(struct file *file) { struct mxc_isi_cap_dev *isi_cap = video_drvdata(file); + struct video_device *vdev = video_devdata(file); struct mxc_isi_dev *mxc_isi = mxc_isi_get_hostdata(isi_cap->pdev); struct device *dev = &isi_cap->pdev->dev; + struct vb2_queue *q = vdev->queue; struct v4l2_subdev *sd; int ret = -1; if (!isi_cap->is_link_setup) return 0; + if (isi_cap->is_streaming[isi_cap->id]) + mxc_isi_cap_streamoff(file, NULL, q->type); + sd = mxc_get_remote_subdev(&isi_cap->sd, __func__); if (!sd) goto label; @@ -1078,6 +1085,7 @@ static int mxc_isi_cap_streamon(struct file *file, void *priv, if (ret < 0 && ret != -ENOIOCTLCMD) return ret; + isi_cap->is_streaming[isi_cap->id] = 1; mxc_isi->is_streaming = 1; return 0; @@ -1096,6 +1104,7 @@ static int mxc_isi_cap_streamoff(struct file *file, void *priv, mxc_isi_channel_disable(mxc_isi); ret = vb2_ioctl_streamoff(file, priv, type); + isi_cap->is_streaming[isi_cap->id] = 0; mxc_isi->is_streaming = 0; return ret; diff --git a/drivers/staging/media/imx/imx8-isi-core.h b/drivers/staging/media/imx/imx8-isi-core.h index c955ec21c8d8..8ae41f8e6563 100644 --- a/drivers/staging/media/imx/imx8-isi-core.h +++ b/drivers/staging/media/imx/imx8-isi-core.h @@ -310,6 +310,7 @@ struct mxc_isi_cap_dev { u32 frame_count; u32 id; + u32 is_streaming[MXC_ISI_MAX_DEVS]; bool is_link_setup; struct mutex lock; -- cgit v1.2.3