media: au0828: stop video streaming only when last user stops

If the application was streaming from both videoX and vbiX, and streaming
from videoX was stopped, then the vbi streaming also stopped.

The cause being that stop_streaming for video stopped the subdevs as well,
instead of only doing that if dev->streaming_users reached 0.

au0828_stop_vbi_streaming was also wrong since it didn't stop the subdevs
at all when dev->streaming_users reached 0.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Tested-by: Shuah Khan <shuah@kernel.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Hans Verkuil 2019-04-02 03:24:15 -04:00 committed by Mauro Carvalho Chehab
parent 10cb050459
commit f604f0f5af

View File

@ -842,9 +842,9 @@ int au0828_start_analog_streaming(struct vb2_queue *vq, unsigned int count)
return rc; return rc;
} }
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
v4l2_device_call_all(&dev->v4l2_dev, 0, video,
s_stream, 1);
dev->vid_timeout_running = 1; dev->vid_timeout_running = 1;
mod_timer(&dev->vid_timeout, jiffies + (HZ / 10)); mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
} else if (vq->type == V4L2_BUF_TYPE_VBI_CAPTURE) { } else if (vq->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
@ -864,10 +864,11 @@ static void au0828_stop_streaming(struct vb2_queue *vq)
dprintk(1, "au0828_stop_streaming called %d\n", dev->streaming_users); dprintk(1, "au0828_stop_streaming called %d\n", dev->streaming_users);
if (dev->streaming_users-- == 1) if (dev->streaming_users-- == 1) {
au0828_uninit_isoc(dev); au0828_uninit_isoc(dev);
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
}
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
dev->vid_timeout_running = 0; dev->vid_timeout_running = 0;
del_timer_sync(&dev->vid_timeout); del_timer_sync(&dev->vid_timeout);
@ -896,8 +897,10 @@ void au0828_stop_vbi_streaming(struct vb2_queue *vq)
dprintk(1, "au0828_stop_vbi_streaming called %d\n", dprintk(1, "au0828_stop_vbi_streaming called %d\n",
dev->streaming_users); dev->streaming_users);
if (dev->streaming_users-- == 1) if (dev->streaming_users-- == 1) {
au0828_uninit_isoc(dev); au0828_uninit_isoc(dev);
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
}
spin_lock_irqsave(&dev->slock, flags); spin_lock_irqsave(&dev->slock, flags);
if (dev->isoc_ctl.vbi_buf != NULL) { if (dev->isoc_ctl.vbi_buf != NULL) {