]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/media/usb/uvc/uvc_queue.c
Merge remote-tracking branch 'v4l-dvb/master'
[karo-tx-linux.git] / drivers / media / usb / uvc / uvc_queue.c
index f16b9b42689d3f20f937af5ca68160ec6512c513..cfb868a48b5f02ad4e76c11072b4ce0b33a2890e 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/videodev2.h>
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
+#include <media/videobuf2-v4l2.h>
 #include <media/videobuf2-vmalloc.h>
 
 #include "uvcvideo.h"
@@ -60,7 +61,7 @@ static void uvc_queue_return_buffers(struct uvc_video_queue *queue,
                                                          queue);
                list_del(&buf->queue);
                buf->state = state;
-               vb2_buffer_done(&buf->buf, vb2_state);
+               vb2_buffer_done(&buf->buf.vb2_buf, vb2_state);
        }
 }
 
@@ -68,10 +69,11 @@ static void uvc_queue_return_buffers(struct uvc_video_queue *queue,
  * videobuf2 queue operations
  */
 
-static int uvc_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
+static int uvc_queue_setup(struct vb2_queue *vq, const void *parg,
                           unsigned int *nbuffers, unsigned int *nplanes,
                           unsigned int sizes[], void *alloc_ctxs[])
 {
+       const struct v4l2_format *fmt = parg;
        struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
        struct uvc_streaming *stream = uvc_queue_to_stream(queue);
 
@@ -89,10 +91,11 @@ static int uvc_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
 
 static int uvc_buffer_prepare(struct vb2_buffer *vb)
 {
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
        struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
-       struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf);
+       struct uvc_buffer *buf = container_of(vbuf, struct uvc_buffer, buf);
 
-       if (vb->v4l2_buf.type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
+       if (vb->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
            vb2_get_plane_payload(vb, 0) > vb2_plane_size(vb, 0)) {
                uvc_trace(UVC_TRACE_CAPTURE, "[E] Bytes used out of bounds.\n");
                return -EINVAL;
@@ -105,7 +108,7 @@ static int uvc_buffer_prepare(struct vb2_buffer *vb)
        buf->error = 0;
        buf->mem = vb2_plane_vaddr(vb, 0);
        buf->length = vb2_plane_size(vb, 0);
-       if (vb->v4l2_buf.type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+       if (vb->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
                buf->bytesused = 0;
        else
                buf->bytesused = vb2_get_plane_payload(vb, 0);
@@ -115,8 +118,9 @@ static int uvc_buffer_prepare(struct vb2_buffer *vb)
 
 static void uvc_buffer_queue(struct vb2_buffer *vb)
 {
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
        struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
-       struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf);
+       struct uvc_buffer *buf = container_of(vbuf, struct uvc_buffer, buf);
        unsigned long flags;
 
        spin_lock_irqsave(&queue->irqlock, flags);
@@ -127,7 +131,7 @@ static void uvc_buffer_queue(struct vb2_buffer *vb)
                 * directly. The next QBUF call will fail with -ENODEV.
                 */
                buf->state = UVC_BUF_STATE_ERROR;
-               vb2_buffer_done(&buf->buf, VB2_BUF_STATE_ERROR);
+               vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
        }
 
        spin_unlock_irqrestore(&queue->irqlock, flags);
@@ -135,12 +139,13 @@ static void uvc_buffer_queue(struct vb2_buffer *vb)
 
 static void uvc_buffer_finish(struct vb2_buffer *vb)
 {
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
        struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
        struct uvc_streaming *stream = uvc_queue_to_stream(queue);
-       struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf);
+       struct uvc_buffer *buf = container_of(vbuf, struct uvc_buffer, buf);
 
        if (vb->state == VB2_BUF_STATE_DONE)
-               uvc_video_clock_update(stream, &vb->v4l2_buf, buf);
+               uvc_video_clock_update(stream, vbuf, buf);
 }
 
 static int uvc_start_streaming(struct vb2_queue *vq, unsigned int count)
@@ -398,7 +403,7 @@ struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
                buf->error = 0;
                buf->state = UVC_BUF_STATE_QUEUED;
                buf->bytesused = 0;
-               vb2_set_plane_payload(&buf->buf, 0, 0);
+               vb2_set_plane_payload(&buf->buf.vb2_buf, 0, 0);
                return buf;
        }
 
@@ -412,8 +417,8 @@ struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
        spin_unlock_irqrestore(&queue->irqlock, flags);
 
        buf->state = buf->error ? VB2_BUF_STATE_ERROR : UVC_BUF_STATE_DONE;
-       vb2_set_plane_payload(&buf->buf, 0, buf->bytesused);
-       vb2_buffer_done(&buf->buf, VB2_BUF_STATE_DONE);
+       vb2_set_plane_payload(&buf->buf.vb2_buf, 0, buf->bytesused);
+       vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE);
 
        return nextbuf;
 }