spi: omap2-mcspi: fix omap2_mcspi_probe error handling
PATCH RESEND 1/1 spi: omap2-mcspi: fix omap2_mcspi_probe error handling
This patch includes below fixes for error handling:
1. return proper error if kcalloc for mcspi->dma_channels fails
2. return proper error if omap2_mcspi_master_setup fails
3. properly release allocated resources in error paths and improve the naming of goto labels.
Signed-off-by Axel Lin <[email protected]>
--- drivers/spi/spi-omap2-mcspi.c | 39 +++++++++++++++++++++------------------ 1 files changed, 21 insertions(+), 18 deletions(-)
drivers/spi/spi-omap2-mcspi.c +21 -18
@@ -1087,7 +1087,7 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)struct omap2_mcspi_platform_config *pdata = pdev->dev.platform_data;struct omap2_mcspi *mcspi;struct resource *r; -int status =0 , i; +int status, i; master =spi_alloc_master (&pdev->dev,sizeof *mcspi);if (master ==NULL ) {
@@ -1114,12 +1114,12 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev) r =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (r ==NULL ) { status = -ENODEV ; - goto err1; + goto err_put_master; }if (!request_mem_region (r->start,resource_size (r),dev_name (&pdev->dev))) { status = -EBUSY ; - goto err1; + goto err_put_master; } r->start += pdata->regs_offset;
@@ -1129,7 +1129,7 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)if (!mcspi->base) {dev_dbg (&pdev->dev,"can't ioremap MCSPI\n" ); status = -ENOMEM ; - goto err2; + goto err_release_mem_region; } mcspi->dev = &pdev->dev;
@@ -1143,8 +1143,10 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)sizeof (struct omap2_mcspi_dma ), GFP_KERNEL); -if (mcspi->dma_channels ==NULL ) - goto err2; +if (mcspi->dma_channels ==NULL ) { + status = -ENOMEM ; + goto err_iounmap; + }for (i =0 ; i < master->num_chipselect; i++) {char dma_ch_name[14 ];
@@ -1156,7 +1158,7 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)if (!dma_res) {dev_dbg (&pdev->dev,"cannot get DMA RX channel\n" ); status = -ENODEV ; -break ; + goto err_free_dma_channels; } mcspi->dma_channels[i].dma_rx_channel =-1 ;
@@ -1167,7 +1169,7 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)if (!dma_res) {dev_dbg (&pdev->dev,"cannot get DMA TX channel\n" ); status = -ENODEV ; -break ; + goto err_free_dma_channels; } mcspi->dma_channels[i].dma_tx_channel =-1 ;
@@ -1176,23 +1178,24 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)pm_runtime_enable (&pdev->dev); -if (status ||omap2_mcspi_master_setup (mcspi) <0 ) - goto err3; + status =omap2_mcspi_master_setup (mcspi); +if (status) + goto err_free_dma_channels; status =spi_register_master (master);if (status <0 ) - goto err4; + goto err_free_dma_channels; -return status; +return 0 ; -err4: -spi_master_put (master); -err3: +err_free_dma_channels:kfree (mcspi->dma_channels); -err2: -release_mem_region (r->start,resource_size (r)); +err_iounmap:iounmap (mcspi->base); -err1: +err_release_mem_region: +release_mem_region (r->start,resource_size (r)); +err_put_master: +spi_master_put (master);return status; }
Signature · 1 line
1.7.4.1