From: Vaibhav Hiremath <hvaibhav@xxxxxx> Signed-off-by: Vaibhav Hiremath <hvaibhav@xxxxxx> --- drivers/media/video/mem2mem_testdev.c | 58 ++++++++++++++------------------ 1 files changed, 25 insertions(+), 33 deletions(-) diff --git a/drivers/media/video/mem2mem_testdev.c b/drivers/media/video/mem2mem_testdev.c index 05630e3..1f35b7e 100644 --- a/drivers/media/video/mem2mem_testdev.c +++ b/drivers/media/video/mem2mem_testdev.c @@ -98,11 +98,10 @@ static struct m2mtest_fmt formats[] = { }; /* Per-queue, driver-specific private data */ -struct m2mtest_q_data -{ - unsigned int width; - unsigned int height; - unsigned int sizeimage; +struct m2mtest_q_data { + u32 width; + u32 height; + u32 sizeimage; struct m2mtest_fmt *fmt; }; @@ -123,11 +122,10 @@ static struct m2mtest_q_data *get_q_data(enum v4l2_buf_type type) return &q_data[V4L2_M2M_DST]; default: BUG(); - return NULL; } + return NULL; } - #define V4L2_CID_TRANS_TIME_MSEC V4L2_CID_PRIVATE_BASE #define V4L2_CID_TRANS_NUM_BUFS (V4L2_CID_PRIVATE_BASE + 1) @@ -158,7 +156,7 @@ static struct v4l2_queryctrl m2mtest_ctrls[] = { static struct m2mtest_fmt *find_format(struct v4l2_format *f) { struct m2mtest_fmt *fmt; - unsigned int k; + u32 k; for (k = 0; k < NUM_FORMATS; k++) { fmt = &formats[k]; @@ -237,12 +235,12 @@ static int device_process(struct m2mtest_ctx *ctx, if (!p_in || !p_out) { v4l2_err(&dev->v4l2_dev, "Acquiring kernel pointers to buffers failed\n"); - return 1; + return -EFAULT; } if (in_buf->vb.size < out_buf->vb.size) { v4l2_err(&dev->v4l2_dev, "Output buffer is too small\n"); - return 1; + return -EINVAL; } tile_w = (in_buf->vb.width * (q_data[V4L2_M2M_DST].fmt->depth >> 3)) @@ -361,8 +359,6 @@ static void device_isr(unsigned long priv) spin_unlock_irqrestore(&m2mtest_dev->irqlock, flags); device_run(curr_ctx); } - - return; } @@ -384,10 +380,7 @@ static int vidioc_querycap(struct file *file, void *priv, static int enum_fmt(struct v4l2_fmtdesc *f, u32 type) { - int i, num; - struct m2mtest_fmt *fmt; - - num = 0; + int i, num = 0; for (i = 0; i < NUM_FORMATS; ++i) { if (formats[i].types & type) { @@ -402,9 +395,9 @@ static int enum_fmt(struct v4l2_fmtdesc *f, u32 type) if (i < NUM_FORMATS) { /* Format found */ - fmt = &formats[i]; - strncpy(f->description, fmt->name, sizeof(f->description) - 1); - f->pixelformat = fmt->fourcc; + strncpy(f->description, formats[i].name, + sizeof(f->description) - 1); + f->pixelformat = formats[i].fourcc; return 0; } @@ -430,6 +423,9 @@ static int vidioc_g_fmt(struct m2mtest_ctx *ctx, struct v4l2_format *f) struct m2mtest_q_data *q_data; vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type); + if (!vq) + return -EINVAL; + q_data = get_q_data(f->type); f->fmt.pix.width = q_data->width; @@ -524,9 +520,10 @@ static int vidioc_s_fmt(struct m2mtest_ctx *ctx, struct v4l2_format *f) { struct m2mtest_q_data *q_data; struct videobuf_queue *vq; - int ret = 0; vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type); + if (!vq) + return -EINVAL; q_data = get_q_data(f->type); if (!q_data) return -EINVAL; @@ -535,8 +532,8 @@ static int vidioc_s_fmt(struct m2mtest_ctx *ctx, struct v4l2_format *f) if (videobuf_queue_is_busy(vq)) { v4l2_err(&ctx->dev->v4l2_dev, "%s queue busy\n", __func__); - ret = -EBUSY; - goto out; + mutex_unlock(&vq->vb_lock); + return -EBUSY; } q_data->fmt = find_format(f); @@ -550,9 +547,7 @@ static int vidioc_s_fmt(struct m2mtest_ctx *ctx, struct v4l2_format *f) "Setting format for type %d, wxh: %dx%d, fmt: %d\n", f->type, q_data->width, q_data->height, q_data->fmt->fourcc); -out: - mutex_unlock(&vq->vb_lock); - return ret; + return 0; } static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, @@ -857,13 +852,9 @@ static int m2mtest_open(struct file *file) struct m2mtest_dev *dev = video_drvdata(file); struct m2mtest_ctx *ctx = NULL; - atomic_inc(&dev->num_inst); - ctx = kzalloc(sizeof *ctx, GFP_KERNEL); - if (!ctx) { - atomic_dec(&dev->num_inst); + if (!ctx) return -ENOMEM; - } file->private_data = ctx; ctx->dev = dev; @@ -872,13 +863,13 @@ static int m2mtest_open(struct file *file) ctx->num_processed = 0; ctx->m2m_ctx = v4l2_m2m_ctx_init(ctx, dev->m2m_dev, queue_init); - if (IS_ERR(ctx->m2m_ctx)) { kfree(ctx); - atomic_dec(&dev->num_inst); return PTR_ERR(ctx->m2m_ctx); } + atomic_inc(&dev->num_inst); + dprintk(dev, "Created instance %p, m2m_ctx: %p\n", ctx, ctx->m2m_ctx); return 0; @@ -959,6 +950,7 @@ static int m2mtest_probe(struct platform_device *pdev) vfd = video_device_alloc(); if (!vfd) { v4l2_err(&dev->v4l2_dev, "Failed to allocate video device\n"); + ret = -ENOMEM; goto unreg_dev; } @@ -1042,7 +1034,7 @@ static int __init m2mtest_init(void) if (ret) platform_device_unregister(&m2mtest_pdev); - return 0; + return ret; } module_init(m2mtest_init); -- 1.6.2.4 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html