media: videobuf2: Allow exporting of a struct dmabuf
[platform/kernel/linux-rpi.git] / drivers / media / common / videobuf2 / videobuf2-core.c
index cf6727d..9bd4cfe 100644 (file)
@@ -2229,12 +2229,12 @@ static int __find_plane_by_offset(struct vb2_queue *q, unsigned long off,
        return -EINVAL;
 }
 
-int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
-               unsigned int index, unsigned int plane, unsigned int flags)
+int vb2_core_expbuf_dmabuf(struct vb2_queue *q, unsigned int type,
+                          unsigned int index, unsigned int plane,
+                          unsigned int flags, struct dma_buf **dmabuf)
 {
        struct vb2_buffer *vb = NULL;
        struct vb2_plane *vb_plane;
-       int ret;
        struct dma_buf *dbuf;
 
        if (q->memory != VB2_MEMORY_MMAP) {
@@ -2286,6 +2286,21 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
                return -EINVAL;
        }
 
+       *dmabuf = dbuf;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(vb2_core_expbuf_dmabuf);
+
+int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
+                   unsigned int index, unsigned int plane, unsigned int flags)
+{
+       struct dma_buf *dbuf;
+       int ret;
+
+       ret = vb2_core_expbuf_dmabuf(q, type, index, plane, flags, &dbuf);
+       if (ret)
+               return ret;
+
        ret = dma_buf_fd(dbuf, flags & ~O_ACCMODE);
        if (ret < 0) {
                dprintk(q, 3, "buffer %d, plane %d failed to export (%d)\n",