coda: Fix error paths
PATCH v7 1/3 coda: Fix error paths
From: Fabio Estevam <[email protected]>
Some resources were not being released in the error path and some were released in the incorrect order.
---
Changes since v6:
- Rebased against correct branch
drivers/media/platform/coda.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-)
drivers/media/platform/coda.c +29 -14
@@ -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;
@@ -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);
@@ -2411,12 +2416,12 @@ 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;
@@ -2424,7 +2429,7 @@ static int coda_open(struct file *file) 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 ;
@@ -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);
@@ -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; }
@@ -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);
Signature · 1 line
1.8.1.2
PATCH v7 2/3 coda: Check the return value from clk_prepare_enable()
From: Fabio Estevam <[email protected]>
clk_prepare_enable() may fail, so let's check its return value and propagate it in the case of error.
---
Changes since v6:
- Rebased against correct branch
drivers/media/platform/coda.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-)
drivers/media/platform/coda.c +22 -5
@@ -2406,8 +2406,14 @@ static int coda_open(struct file *file) ctx->reg_idx = idx; } -clk_prepare_enable (dev->clk_per); -clk_prepare_enable (dev->clk_ahb); + ret =clk_prepare_enable (dev->clk_per); +if (ret) + goto err_clk_per; + + ret =clk_prepare_enable (dev->clk_ahb); +if (ret) + goto err_clk_ahb; +set_default_params (ctx); ctx->m2m_ctx =v4l2_m2m_ctx_init (dev->m2m_dev, ctx, &coda_queue_init);
@@ -2465,7 +2471,9 @@ err_ctrls_setup:v4l2_m2m_ctx_release (ctx->m2m_ctx); err_ctx_init:clk_disable_unprepare (dev->clk_ahb); +err_clk_ahb:clk_disable_unprepare (dev->clk_per); +err_clk_per:v4l2_fh_del (&ctx->fh);v4l2_fh_exit (&ctx->fh);clear_bit (ctx->idx, &dev->instance_mask);
@@ -2873,10 +2881,15 @@ static int coda_hw_init(struct coda_dev *dev)u16 product, major, minor, release;u32 data;u16 *p; -int i; +int i, ret; + + ret =clk_prepare_enable (dev->clk_per); +if (ret) +return ret; -clk_prepare_enable (dev->clk_per); -clk_prepare_enable (dev->clk_ahb); + ret =clk_prepare_enable (dev->clk_ahb); +if (ret) + goto err_clk_ahb;/* * Copy the first CODA_ISRAM_SIZE in the internal SRAM.
@@ -2985,6 +2998,10 @@ static int coda_hw_init(struct coda_dev *dev) }return 0 ; + +err_clk_ahb: +clk_disable_unprepare (dev->clk_per); +return ret; }static void coda_fw_callback (const struct firmware *fw,void *context)
Signature · 1 line
1.8.1.2
PATCH v7 3/3 coda: No need to check the return value of platform_get_resource()
In reply to Fabio EstevamFrom: Fabio Estevam <[email protected]>
When using devm_ioremap_resource(), we do not need to check the return value of platform_get_resource(), so just remove it.
---
Changes since v6:
- Rebased against correct branch
drivers/media/platform/coda.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/media/platform/coda.c +0 -5
@@ -3154,11 +3154,6 @@ static int coda_probe(struct platform_device *pdev)/* Get memory for physical registers */ res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -if (res ==NULL ) { -dev_err (&pdev->dev,"failed to get memory region resource\n" ); -return -ENOENT ; - } - dev->regs_base =devm_ioremap_resource (&pdev->dev, res);if (IS_ERR (dev->regs_base))return PTR_ERR (dev->regs_base);
Signature · 1 line
1.8.1.2