mirror of
https://github.com/torvalds/linux.git
synced 2024-12-17 00:21:32 +00:00
media: rockchip/rga: Fix broken .start_streaming
Currently, rga_buf_start_streaming() is expecting
pm_runtime_get_sync to return zero on success, which
is wrong.
As per the documentation, pm_runtime_get_sync increments
the device's usage counter and return its result.
This means it will typically return a positive integer
on success and a negative error code.
Therefore, rockchip-rga driver is currently unusable
failing to start_streaming in most cases. Fix it and
while here, cleanup the buffer return-to-core logic.
Fixes: f7e7b48e6d
("[media] rockchip/rga: v4l2 m2m support")
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Reviewed-by: Jacob Chen <jacob-chen@iotwrt.com>
[hans.verkuil@cisco.com: fix line over 80 cols warning]
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
1946117b8f
commit
9aecc03555
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user