pm_runtime_put_autosuspend(vpu->dev);
        clk_bulk_disable(vpu->variant->num_clocks, vpu->clocks);
 
-       src = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
-       dst = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
+       src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
+       dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
 
        if (WARN_ON(!src))
                return;
        src->sequence = ctx->sequence_out++;
        dst->sequence = ctx->sequence_cap++;
 
-       ret = ctx->buf_finish(ctx, &dst->vb2_buf, bytesused);
-       if (ret)
-               result = VB2_BUF_STATE_ERROR;
-
-       v4l2_m2m_buf_done(src, result);
-       v4l2_m2m_buf_done(dst, result);
+       if (ctx->buf_finish) {
+               ret = ctx->buf_finish(ctx, &dst->vb2_buf, bytesused);
+               if (ret)
+                       result = VB2_BUF_STATE_ERROR;
+       }
 
-       v4l2_m2m_job_finish(vpu->m2m_dev, ctx->fh.m2m_ctx);
+       v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx,
+                                        result);
 }
 
 void hantro_irq_done(struct hantro_dev *vpu, unsigned int bytesused,