diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c index c418add65bb5..4696bb1888fd 100644 --- a/drivers/media/usb/em28xx/em28xx-video.c +++ b/drivers/media/usb/em28xx/em28xx-video.c @@ -1405,24 +1405,30 @@ static int em28xx_vb2_setup(struct em28xx *dev) q->buf_struct_size = sizeof(struct em28xx_buffer); q->ops = &em28xx_video_qops; q->mem_ops = &vb2_vmalloc_memops; + q->lock = &v4l2->vb_queue_lock; rc = vb2_queue_init(q); if (rc < 0) return rc; - /* Setup Videobuf2 for VBI capture */ - q = &v4l2->vb_vbiq; - q->type = V4L2_BUF_TYPE_VBI_CAPTURE; - q->io_modes = VB2_READ | VB2_MMAP | VB2_USERPTR; - q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; - q->drv_priv = dev; - q->buf_struct_size = sizeof(struct em28xx_buffer); - q->ops = &em28xx_vbi_qops; - q->mem_ops = &vb2_vmalloc_memops; - - rc = vb2_queue_init(q); - if (rc < 0) - return rc; + /* Setup Videobuf2 for VBI capture if supported */ + if (em28xx_vbi_supported(dev)) { + q = &v4l2->vb_vbiq; + q->type = V4L2_BUF_TYPE_VBI_CAPTURE; + q->io_modes = VB2_READ | VB2_MMAP | VB2_USERPTR; + q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; + q->drv_priv = dev; + q->buf_struct_size = sizeof(struct em28xx_buffer); + q->ops = &em28xx_vbi_qops; + q->mem_ops = &vb2_vmalloc_memops; + q->lock = &v4l2->vb_vbi_queue_lock; + + rc = vb2_queue_init(q); + if (rc < 0) { + vb2_queue_release(&v4l2->vb_vidq); + return rc; + } + } return 0; } @@ -2983,6 +2989,14 @@ static int em28xx_v4l2_init(struct em28xx *dev) if (dev->chip_id == CHIP_ID_EM2828X || dev->board.decoder == EM28XX_BUILTIN) v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_ENUM_FRAMESIZES); + /* initialize videobuf2 stuff */ + ret = em28xx_vb2_setup(dev); + if (ret) { + dev_err(&dev->intf->dev, + "unable to setup videobuf queues (error=%i).\n", ret); + goto unregister_dev; + } + /* register v4l2 video video_device */ ret = video_register_device(&v4l2->vdev, VFL_TYPE_VIDEO, video_nr[dev->devno]); @@ -3068,9 +3082,6 @@ static int em28xx_v4l2_init(struct em28xx *dev) /* Save some power by putting tuner to sleep */ v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, standby); - /* initialize videobuf2 stuff */ - em28xx_vb2_setup(dev); - dev_info(&dev->intf->dev, "V4L2 extension successfully initialized\n");