diff --git a/drivers/media/platform/rockchip/rga/rga-buf.c b/drivers/media/platform/rockchip/rga/rga-buf.c index fa1ba98c96dc..356821c2dacf 100644 --- a/drivers/media/platform/rockchip/rga/rga-buf.c +++ b/drivers/media/platform/rockchip/rga/rga-buf.c @@ -64,31 +64,10 @@ static void rga_buf_queue(struct vb2_buffer *vb) v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); } -static int rga_buf_start_streaming(struct vb2_queue *q, unsigned int count) +static void rga_buf_return_buffers(struct vb2_queue *q, + enum vb2_buffer_state state) { struct rga_ctx *ctx = vb2_get_drv_priv(q); - struct rockchip_rga *rga = ctx->rga; - int ret, i; - - ret = pm_runtime_get_sync(rga->dev); - - if (!ret) - return 0; - - for (i = 0; i < q->num_buffers; ++i) { - if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE) { - v4l2_m2m_buf_done(to_vb2_v4l2_buffer(q->bufs[i]), - VB2_BUF_STATE_QUEUED); - } - } - - return ret; -} - -static void rga_buf_stop_streaming(struct vb2_queue *q) -{ - struct rga_ctx *ctx = vb2_get_drv_priv(q); - struct rockchip_rga *rga = ctx->rga; struct vb2_v4l2_buffer *vbuf; for (;;) { @@ -98,9 +77,31 @@ static void rga_buf_stop_streaming(struct vb2_queue *q) vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); if (!vbuf) break; - v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); + v4l2_m2m_buf_done(vbuf, state); + } +} + +static int rga_buf_start_streaming(struct vb2_queue *q, unsigned int count) +{ + struct rga_ctx *ctx = vb2_get_drv_priv(q); + struct rockchip_rga *rga = ctx->rga; + int ret; + + ret = pm_runtime_get_sync(rga->dev); + if (ret < 0) { + rga_buf_return_buffers(q, VB2_BUF_STATE_QUEUED); + return ret; } + return 0; +} + +static void rga_buf_stop_streaming(struct vb2_queue *q) +{ + struct rga_ctx *ctx = vb2_get_drv_priv(q); + struct rockchip_rga *rga = ctx->rga; + + rga_buf_return_buffers(q, VB2_BUF_STATE_ERROR); pm_runtime_put(rga->dev); }