Skip to content

Commit

Permalink
[media] coda: Fix error paths
Browse files Browse the repository at this point in the history
Some resources were not being released in the error path and some were released
in the incorrect order.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
  • Loading branch information
Fabio Estevam authored and Mauro Carvalho Chehab committed Aug 24, 2013
1 parent fea564a commit f82bc20
Showing 1 changed file with 29 additions and 14 deletions.
43 changes: 29 additions & 14 deletions drivers/media/platform/coda.c
Original file line number Diff line number Diff line change
Expand Up @@ -2381,15 +2381,17 @@ static int coda_open(struct file *file)
int ret;
int idx;

idx = coda_next_free_instance(dev);
if (idx >= CODA_MAX_INSTANCES)
return -EBUSY;
set_bit(idx, &dev->instance_mask);

ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
if (!ctx)
return -ENOMEM;

idx = coda_next_free_instance(dev);
if (idx >= CODA_MAX_INSTANCES) {
ret = -EBUSY;
goto err_coda_max;
}
set_bit(idx, &dev->instance_mask);

INIT_WORK(&ctx->skip_run, coda_skip_run);
v4l2_fh_init(&ctx->fh, video_devdata(file));
file->private_data = &ctx->fh;
Expand All @@ -2403,6 +2405,9 @@ static int coda_open(struct file *file)
default:
ctx->reg_idx = idx;
}

clk_prepare_enable(dev->clk_per);
clk_prepare_enable(dev->clk_ahb);
set_default_params(ctx);
ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx,
&coda_queue_init);
Expand All @@ -2411,20 +2416,20 @@ static int coda_open(struct file *file)

v4l2_err(&dev->v4l2_dev, "%s return error (%d)\n",
__func__, ret);
goto err;
goto err_ctx_init;
}
ret = coda_ctrls_setup(ctx);
if (ret) {
v4l2_err(&dev->v4l2_dev, "failed to setup coda controls\n");
goto err;
goto err_ctrls_setup;
}

ctx->fh.ctrl_handler = &ctx->ctrls;

ret = coda_alloc_context_buf(ctx, &ctx->parabuf, CODA_PARA_BUF_SIZE);
if (ret < 0) {
v4l2_err(&dev->v4l2_dev, "failed to allocate parabuf");
goto err;
goto err_dma_alloc;
}

ctx->bitstream.size = CODA_MAX_FRAME_SIZE;
Expand All @@ -2433,7 +2438,7 @@ static int coda_open(struct file *file)
if (!ctx->bitstream.vaddr) {
v4l2_err(&dev->v4l2_dev, "failed to allocate bitstream ringbuffer");
ret = -ENOMEM;
goto err;
goto err_dma_writecombine;
}
kfifo_init(&ctx->bitstream_fifo,
ctx->bitstream.vaddr, ctx->bitstream.size);
Expand All @@ -2444,17 +2449,27 @@ static int coda_open(struct file *file)
list_add(&ctx->list, &dev->instances);
coda_unlock(ctx);

clk_prepare_enable(dev->clk_per);
clk_prepare_enable(dev->clk_ahb);

v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Created instance %d (%p)\n",
ctx->idx, ctx);

return 0;

err:
err_dma_writecombine:
coda_free_context_buffers(ctx);
if (ctx->dev->devtype->product == CODA_DX6)
coda_free_aux_buf(dev, &ctx->workbuf);
coda_free_aux_buf(dev, &ctx->parabuf);
err_dma_alloc:
v4l2_ctrl_handler_free(&ctx->ctrls);
err_ctrls_setup:
v4l2_m2m_ctx_release(ctx->m2m_ctx);
err_ctx_init:
clk_disable_unprepare(dev->clk_ahb);
clk_disable_unprepare(dev->clk_per);
v4l2_fh_del(&ctx->fh);
v4l2_fh_exit(&ctx->fh);
clear_bit(ctx->idx, &dev->instance_mask);
err_coda_max:
kfree(ctx);
return ret;
}
Expand Down Expand Up @@ -2496,8 +2511,8 @@ static int coda_release(struct file *file)

coda_free_aux_buf(dev, &ctx->parabuf);
v4l2_ctrl_handler_free(&ctx->ctrls);
clk_disable_unprepare(dev->clk_per);
clk_disable_unprepare(dev->clk_ahb);
clk_disable_unprepare(dev->clk_per);
v4l2_fh_del(&ctx->fh);
v4l2_fh_exit(&ctx->fh);
clear_bit(ctx->idx, &dev->instance_mask);
Expand Down

0 comments on commit f82bc20

Please sign in to comment.