v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
 
        dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
-       v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
+       coda_m2m_buf_done(ctx, dst_buf, VB2_BUF_STATE_DONE);
 
        ctx->gopcounter--;
        if (ctx->gopcounter < 0)
                }
                vb2_set_plane_payload(dst_buf, 0, payload);
 
-               v4l2_m2m_buf_done(dst_buf, ctx->frame_errors[display_idx] ?
+               coda_m2m_buf_done(ctx, dst_buf, ctx->frame_errors[display_idx] ?
                                  VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
 
                v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
 
 }
 
 static bool coda_buf_is_end_of_stream(struct coda_ctx *ctx,
-                                     struct v4l2_buffer *buf)
+                                     struct vb2_buffer *buf)
 {
        struct vb2_queue *src_vq;
 
        src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
 
        return ((ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG) &&
-               (buf->sequence == (ctx->qsequence - 1)));
+               (buf->v4l2_buf.sequence == (ctx->qsequence - 1)));
 }
 
-static int coda_dqbuf(struct file *file, void *priv,
-                     struct v4l2_buffer *buf)
+void coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_buffer *buf,
+                      enum vb2_buffer_state state)
 {
-       struct coda_ctx *ctx = fh_to_ctx(priv);
-       int ret;
+       const struct v4l2_event eos_event = {
+               .type = V4L2_EVENT_EOS
+       };
 
-       ret = v4l2_m2m_dqbuf(file, ctx->fh.m2m_ctx, buf);
-
-       /* If this is the last capture buffer, emit an end-of-stream event */
-       if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
-           coda_buf_is_end_of_stream(ctx, buf)) {
-               const struct v4l2_event eos_event = {
-                       .type = V4L2_EVENT_EOS
-               };
+       if (coda_buf_is_end_of_stream(ctx, buf)) {
+               buf->v4l2_buf.flags |= V4L2_BUF_FLAG_LAST;
 
                v4l2_event_queue_fh(&ctx->fh, &eos_event);
        }
 
-       return ret;
+       v4l2_m2m_buf_done(buf, state);
 }
 
 static int coda_g_selection(struct file *file, void *fh,
 
        .vidioc_qbuf            = coda_qbuf,
        .vidioc_expbuf          = v4l2_m2m_ioctl_expbuf,
-       .vidioc_dqbuf           = coda_dqbuf,
+       .vidioc_dqbuf           = v4l2_m2m_ioctl_dqbuf,
        .vidioc_create_bufs     = v4l2_m2m_ioctl_create_bufs,
 
        .vidioc_streamon        = v4l2_m2m_ioctl_streamon,