.unlocked_ioctl = video_ioctl2,
 };
 
+static int vidioc_reqbufs(struct file *file, void *priv,
+                         struct v4l2_requestbuffers *p)
+{
+       struct video_device *vdev = video_devdata(file);
+       int r;
+
+       /*
+        * Sliced and raw VBI capture share the same queue so we must
+        * change the type.
+        */
+       if (p->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE ||
+           p->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+               r = vb2_queue_change_type(vdev->queue, p->type);
+               if (r)
+                       return r;
+       }
+
+       return vb2_ioctl_reqbufs(file, priv, p);
+}
+
+static int vidioc_create_bufs(struct file *file, void *priv,
+                             struct v4l2_create_buffers *p)
+{
+       struct video_device *vdev = video_devdata(file);
+       int r;
+
+       /*
+        * Sliced and raw VBI capture share the same queue so we must
+        * change the type.
+        */
+       if (p->format.type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE ||
+           p->format.type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+               r = vb2_queue_change_type(vdev->queue, p->format.type);
+               if (r)
+                       return r;
+       }
+
+       return vb2_ioctl_create_bufs(file, priv, p);
+}
+
 static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
        .vidioc_querycap                = vidioc_querycap,
 
        .vidioc_g_fbuf                  = vidioc_g_fbuf,
        .vidioc_s_fbuf                  = vidioc_s_fbuf,
 
-       .vidioc_reqbufs                 = vb2_ioctl_reqbufs,
-       .vidioc_create_bufs             = vb2_ioctl_create_bufs,
+       .vidioc_reqbufs                 = vidioc_reqbufs,
+       .vidioc_create_bufs             = vidioc_create_bufs,
        .vidioc_prepare_buf             = vb2_ioctl_prepare_buf,
        .vidioc_querybuf                = vb2_ioctl_querybuf,
        .vidioc_qbuf                    = vb2_ioctl_qbuf,