--- a/drivers/media/i2c/video-i2c.c +++ b/drivers/media/i2c/video-i2c.c @@ -308,6 +308,7 @@ static void video_i2c_del_list(struct vb2_queue *vq, enum vb2_buffer_state state static int start_streaming(struct vb2_queue *vq, unsigned int count) { struct video_i2c_data *data = vb2_get_drv_priv(vq); + int ret = 0; if (data->kthread_vid_cap) return 0; @@ -320,7 +321,9 @@ static int start_streaming(struct vb2_queue *vq, unsigned int count) video_i2c_del_list(vq, VB2_BUF_STATE_QUEUED); - return PTR_ERR(data->kthread_vid_cap); + ret = PTR_ERR(data->kthread_vid_cap); + data->kthread_vid_cap = NULL; + return ret; } static void stop_streaming(struct vb2_queue *vq) diff --git a/drivers/media/platform/vivid/vivid-kthread-cap.c b/drivers/media/platform/vivid/vivid-kthread-cap.c index eebfff2126be..a60017307b65 100644 --- a/drivers/media/platform/vivid/vivid-kthread-cap.c +++ b/drivers/media/platform/vivid/vivid-kthread-cap.c @@ -850,6 +850,8 @@ static void vivid_grab_controls(struct vivid_dev *dev, bool grab) int vivid_start_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming) { + int ret = 0; + dprintk(dev, 1, "%s\n", __func__); if (dev->kthread_vid_cap) { @@ -874,7 +876,9 @@ int vivid_start_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming) if (IS_ERR(dev->kthread_vid_cap)) { v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n"); - return PTR_ERR(dev->kthread_vid_cap); + ret = PTR_ERR(dev->kthread_vid_cap); + dev->kthread_vid_cap = NULL; + return ret; } *pstreaming = true; vivid_grab_controls(dev, true);