aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/coda/coda-common.c
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2014-08-05 14:00:10 -0300
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-08-21 15:25:24 -0500
commitb906352c23388837a643720d8548ae9459b5ed76 (patch)
tree581b79ea9008636e19a190d73d4be34cc8f49e11 /drivers/media/platform/coda/coda-common.c
parent[media] coda: request BIT processor interrupt by name (diff)
downloadlinux-dev-b906352c23388837a643720d8548ae9459b5ed76.tar.xz
linux-dev-b906352c23388837a643720d8548ae9459b5ed76.zip
[media] coda: dequeue buffers if start_streaming fails
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Kamil Debski <k.debski@samsung.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to '')
-rw-r--r--drivers/media/platform/coda/coda-common.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c
index 86fc527a7782..1e938895f5f9 100644
--- a/drivers/media/platform/coda/coda-common.c
+++ b/drivers/media/platform/coda/coda-common.c
@@ -1005,6 +1005,7 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
struct coda_ctx *ctx = vb2_get_drv_priv(q);
struct v4l2_device *v4l2_dev = &ctx->dev->v4l2_dev;
struct coda_q_data *q_data_src, *q_data_dst;
+ struct vb2_buffer *buf;
u32 dst_fourcc;
int ret = 0;
@@ -1016,17 +1017,23 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
coda_fill_bitstream(ctx);
mutex_unlock(&ctx->bitstream_mutex);
- if (coda_get_bitstream_payload(ctx) < 512)
- return -EINVAL;
+ if (coda_get_bitstream_payload(ctx) < 512) {
+ ret = -EINVAL;
+ goto err;
+ }
} else {
- if (count < 1)
- return -EINVAL;
+ if (count < 1) {
+ ret = -EINVAL;
+ goto err;
+ }
}
ctx->streamon_out = 1;
} else {
- if (count < 1)
- return -EINVAL;
+ if (count < 1) {
+ ret = -EINVAL;
+ goto err;
+ }
ctx->streamon_cap = 1;
}
@@ -1047,7 +1054,8 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
q_data_dst->fourcc);
if (!ctx->codec) {
v4l2_err(v4l2_dev, "couldn't tell instance type.\n");
- return -EINVAL;
+ ret = -EINVAL;
+ goto err;
}
ret = ctx->ops->start_streaming(ctx);
@@ -1055,11 +1063,21 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
if (ret == -EAGAIN)
return 0;
else if (ret < 0)
- return ret;
+ goto err;
}
ctx->initialized = 1;
return ret;
+
+err:
+ if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
+ while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx)))
+ v4l2_m2m_buf_done(buf, VB2_BUF_STATE_DEQUEUED);
+ } else {
+ while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx)))
+ v4l2_m2m_buf_done(buf, VB2_BUF_STATE_DEQUEUED);
+ }
+ return ret;
}
static void coda_stop_streaming(struct vb2_queue *q)