Merge remote-tracking branch 'stable/linux-5.15.y' into rpi-5.15.y
[platform/kernel/linux-rpi.git] / drivers / media / v4l2-core / v4l2-mem2mem.c
index 2256f43..af012cf 100644 (file)
@@ -584,19 +584,14 @@ int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 }
 EXPORT_SYMBOL_GPL(v4l2_m2m_reqbufs);
 
-int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
-                     struct v4l2_buffer *buf)
+static void v4l2_m2m_adjust_mem_offset(struct vb2_queue *vq,
+                                      struct v4l2_buffer *buf)
 {
-       struct vb2_queue *vq;
-       int ret = 0;
-       unsigned int i;
-
-       vq = v4l2_m2m_get_vq(m2m_ctx, buf->type);
-       ret = vb2_querybuf(vq, buf);
-
        /* Adjust MMAP memory offsets for the CAPTURE queue */
        if (buf->memory == V4L2_MEMORY_MMAP && V4L2_TYPE_IS_CAPTURE(vq->type)) {
                if (V4L2_TYPE_IS_MULTIPLANAR(vq->type)) {
+                       unsigned int i;
+
                        for (i = 0; i < buf->length; ++i)
                                buf->m.planes[i].m.mem_offset
                                        += DST_QUEUE_OFF_BASE;
@@ -604,8 +599,23 @@ int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
                        buf->m.offset += DST_QUEUE_OFF_BASE;
                }
        }
+}
 
-       return ret;
+int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
+                     struct v4l2_buffer *buf)
+{
+       struct vb2_queue *vq;
+       int ret;
+
+       vq = v4l2_m2m_get_vq(m2m_ctx, buf->type);
+       ret = vb2_querybuf(vq, buf);
+       if (ret)
+               return ret;
+
+       /* Adjust MMAP memory offsets for the CAPTURE queue */
+       v4l2_m2m_adjust_mem_offset(vq, buf);
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(v4l2_m2m_querybuf);
 
@@ -762,6 +772,9 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
        if (ret)
                return ret;
 
+       /* Adjust MMAP memory offsets for the CAPTURE queue */
+       v4l2_m2m_adjust_mem_offset(vq, buf);
+
        /*
         * If the capture queue is streaming, but streaming hasn't started
         * on the device, but was asked to stop, mark the previously queued
@@ -783,9 +796,17 @@ int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
                   struct v4l2_buffer *buf)
 {
        struct vb2_queue *vq;
+       int ret;
 
        vq = v4l2_m2m_get_vq(m2m_ctx, buf->type);
-       return vb2_dqbuf(vq, buf, file->f_flags & O_NONBLOCK);
+       ret = vb2_dqbuf(vq, buf, file->f_flags & O_NONBLOCK);
+       if (ret)
+               return ret;
+
+       /* Adjust MMAP memory offsets for the CAPTURE queue */
+       v4l2_m2m_adjust_mem_offset(vq, buf);
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(v4l2_m2m_dqbuf);
 
@@ -794,9 +815,17 @@ int v4l2_m2m_prepare_buf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 {
        struct video_device *vdev = video_devdata(file);
        struct vb2_queue *vq;
+       int ret;
 
        vq = v4l2_m2m_get_vq(m2m_ctx, buf->type);
-       return vb2_prepare_buf(vq, vdev->v4l2_dev->mdev, buf);
+       ret = vb2_prepare_buf(vq, vdev->v4l2_dev->mdev, buf);
+       if (ret)
+               return ret;
+
+       /* Adjust MMAP memory offsets for the CAPTURE queue */
+       v4l2_m2m_adjust_mem_offset(vq, buf);
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(v4l2_m2m_prepare_buf);