Merge tag 'v5.15.57' into rpi-5.15.y
[platform/kernel/linux-rpi.git] / drivers / media / common / videobuf2 / videobuf2-core.c
index 508ac29..8f06b89 100644 (file)
@@ -68,13 +68,13 @@ module_param(debug, int, 0644);
        err;                                                            \
 })
 
-#define call_ptr_memop(vb, op, args...)                                        \
+#define call_ptr_memop(op, vb, args...)                                        \
 ({                                                                     \
        struct vb2_queue *_q = (vb)->vb2_queue;                         \
        void *ptr;                                                      \
                                                                        \
        log_memop(vb, op);                                              \
-       ptr = _q->mem_ops->op ? _q->mem_ops->op(args) : NULL;           \
+       ptr = _q->mem_ops->op ? _q->mem_ops->op(vb, args) : NULL;       \
        if (!IS_ERR_OR_NULL(ptr))                                       \
                (vb)->cnt_mem_ ## op++;                                 \
        ptr;                                                            \
@@ -144,9 +144,9 @@ module_param(debug, int, 0644);
        ((vb)->vb2_queue->mem_ops->op ?                                 \
                (vb)->vb2_queue->mem_ops->op(args) : 0)
 
-#define call_ptr_memop(vb, op, args...)                                        \
+#define call_ptr_memop(op, vb, args...)                                        \
        ((vb)->vb2_queue->mem_ops->op ?                                 \
-               (vb)->vb2_queue->mem_ops->op(args) : NULL)
+               (vb)->vb2_queue->mem_ops->op(vb, args) : NULL)
 
 #define call_void_memop(vb, op, args...)                               \
        do {                                                            \
@@ -230,9 +230,10 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb)
                if (size < vb->planes[plane].length)
                        goto free;
 
-               mem_priv = call_ptr_memop(vb, alloc,
-                               q->alloc_devs[plane] ? : q->dev,
-                               q->dma_attrs, size, q->dma_dir, q->gfp_flags);
+               mem_priv = call_ptr_memop(alloc,
+                                         vb,
+                                         q->alloc_devs[plane] ? : q->dev,
+                                         size);
                if (IS_ERR_OR_NULL(mem_priv)) {
                        if (mem_priv)
                                ret = PTR_ERR(mem_priv);
@@ -975,7 +976,7 @@ void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no)
        if (plane_no >= vb->num_planes || !vb->planes[plane_no].mem_priv)
                return NULL;
 
-       return call_ptr_memop(vb, vaddr, vb->planes[plane_no].mem_priv);
+       return call_ptr_memop(vaddr, vb, vb->planes[plane_no].mem_priv);
 
 }
 EXPORT_SYMBOL_GPL(vb2_plane_vaddr);
@@ -985,7 +986,7 @@ void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no)
        if (plane_no >= vb->num_planes || !vb->planes[plane_no].mem_priv)
                return NULL;
 
-       return call_ptr_memop(vb, cookie, vb->planes[plane_no].mem_priv);
+       return call_ptr_memop(cookie, vb, vb->planes[plane_no].mem_priv);
 }
 EXPORT_SYMBOL_GPL(vb2_plane_cookie);
 
@@ -1125,10 +1126,11 @@ static int __prepare_userptr(struct vb2_buffer *vb)
                vb->planes[plane].data_offset = 0;
 
                /* Acquire each plane's memory */
-               mem_priv = call_ptr_memop(vb, get_userptr,
-                               q->alloc_devs[plane] ? : q->dev,
-                               planes[plane].m.userptr,
-                               planes[plane].length, q->dma_dir);
+               mem_priv = call_ptr_memop(get_userptr,
+                                         vb,
+                                         q->alloc_devs[plane] ? : q->dev,
+                                         planes[plane].m.userptr,
+                                         planes[plane].length);
                if (IS_ERR(mem_priv)) {
                        dprintk(q, 1, "failed acquiring userspace memory for plane %d\n",
                                plane);
@@ -1249,9 +1251,11 @@ static int __prepare_dmabuf(struct vb2_buffer *vb)
                vb->planes[plane].data_offset = 0;
 
                /* Acquire each plane's memory */
-               mem_priv = call_ptr_memop(vb, attach_dmabuf,
-                               q->alloc_devs[plane] ? : q->dev,
-                               dbuf, planes[plane].length, q->dma_dir);
+               mem_priv = call_ptr_memop(attach_dmabuf,
+                                         vb,
+                                         q->alloc_devs[plane] ? : q->dev,
+                                         dbuf,
+                                         planes[plane].length);
                if (IS_ERR(mem_priv)) {
                        dprintk(q, 1, "failed to attach dmabuf\n");
                        ret = PTR_ERR(mem_priv);
@@ -2140,12 +2144,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) {
@@ -2187,14 +2191,31 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
 
        vb_plane = &vb->planes[plane];
 
-       dbuf = call_ptr_memop(vb, get_dmabuf, vb_plane->mem_priv,
-                               flags & O_ACCMODE);
+       dbuf = call_ptr_memop(get_dmabuf,
+                             vb,
+                             vb_plane->mem_priv,
+                             flags & O_ACCMODE);
        if (IS_ERR_OR_NULL(dbuf)) {
                dprintk(q, 1, "failed to export buffer %d, plane %d\n",
                        index, plane);
                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",