dma: coh901318: use devm allocation
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 12 Jun 2012 18:19:24 +0000 (20:19 +0200)
committerVinod Koul <vinod.koul@linux.intel.com>
Thu, 14 Jun 2012 03:12:26 +0000 (08:42 +0530)
Allocate memory, region, remap and irq for device state using
devm_* helpers to simplify memory accounting.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
drivers/dma/coh901318.c

index e67b4e06a918350137e8119e940618318f2c7867..aa384e53b7aca152c71c82a79a817313b276a79b 100644 (file)
@@ -1438,34 +1438,32 @@ static int __init coh901318_probe(struct platform_device *pdev)
 
        io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!io)
-               goto err_get_resource;
+               return -ENODEV;
 
        /* Map DMA controller registers to virtual memory */
-       if (request_mem_region(io->start,
-                              resource_size(io),
-                              pdev->dev.driver->name) == NULL) {
-               err = -EBUSY;
-               goto err_request_mem;
-       }
+       if (devm_request_mem_region(&pdev->dev,
+                                   io->start,
+                                   resource_size(io),
+                                   pdev->dev.driver->name) == NULL)
+               return -ENOMEM;
 
        pdata = pdev->dev.platform_data;
        if (!pdata)
-               goto err_no_platformdata;
+               return -ENODEV;
 
-       base = kmalloc(ALIGN(sizeof(struct coh901318_base), 4) +
-                      pdata->max_channels *
-                      sizeof(struct coh901318_chan),
-                      GFP_KERNEL);
+       base = devm_kzalloc(&pdev->dev,
+                           ALIGN(sizeof(struct coh901318_base), 4) +
+                           pdata->max_channels *
+                           sizeof(struct coh901318_chan),
+                           GFP_KERNEL);
        if (!base)
-               goto err_alloc_coh_dma_channels;
+               return -ENOMEM;
 
        base->chans = ((void *)base) + ALIGN(sizeof(struct coh901318_base), 4);
 
-       base->virtbase = ioremap(io->start, resource_size(io));
-       if (!base->virtbase) {
-               err = -ENOMEM;
-               goto err_no_ioremap;
-       }
+       base->virtbase = devm_ioremap(&pdev->dev, io->start, resource_size(io));
+       if (!base->virtbase)
+               return -ENOMEM;
 
        base->dev = &pdev->dev;
        base->platform = pdata;
@@ -1474,25 +1472,20 @@ static int __init coh901318_probe(struct platform_device *pdev)
 
        COH901318_DEBUGFS_ASSIGN(debugfs_dma_base, base);
 
-       platform_set_drvdata(pdev, base);
-
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
-               goto err_no_irq;
-
-       err = request_irq(irq, dma_irq_handler, IRQF_DISABLED,
-                         "coh901318", base);
-       if (err) {
-               dev_crit(&pdev->dev,
-                        "Cannot allocate IRQ for DMA controller!\n");
-               goto err_request_irq;
-       }
+               return irq;
+
+       err = devm_request_irq(&pdev->dev, irq, dma_irq_handler, IRQF_DISABLED,
+                              "coh901318", base);
+       if (err)
+               return err;
 
        err = coh901318_pool_create(&base->pool, &pdev->dev,
                                    sizeof(struct coh901318_lli),
                                    32);
        if (err)
-               goto err_pool_create;
+               return err;
 
        /* init channels for device transfers */
        coh901318_base_init(&base->dma_slave,  base->platform->chans_slave,
@@ -1538,6 +1531,7 @@ static int __init coh901318_probe(struct platform_device *pdev)
        if (err)
                goto err_register_memcpy;
 
+       platform_set_drvdata(pdev, base);
        dev_info(&pdev->dev, "Initialized COH901318 DMA on virtual base 0x%08x\n",
                (u32) base->virtbase);
 
@@ -1547,19 +1541,6 @@ static int __init coh901318_probe(struct platform_device *pdev)
        dma_async_device_unregister(&base->dma_slave);
  err_register_slave:
        coh901318_pool_destroy(&base->pool);
- err_pool_create:
-       free_irq(platform_get_irq(pdev, 0), base);
- err_request_irq:
- err_no_irq:
-       iounmap(base->virtbase);
- err_no_ioremap:
-       kfree(base);
- err_alloc_coh_dma_channels:
- err_no_platformdata:
-       release_mem_region(pdev->resource->start,
-                          resource_size(pdev->resource));
- err_request_mem:
- err_get_resource:
        return err;
 }
 
@@ -1570,11 +1551,6 @@ static int __exit coh901318_remove(struct platform_device *pdev)
        dma_async_device_unregister(&base->dma_memcpy);
        dma_async_device_unregister(&base->dma_slave);
        coh901318_pool_destroy(&base->pool);
-       free_irq(platform_get_irq(pdev, 0), base);
-       iounmap(base->virtbase);
-       kfree(base);
-       release_mem_region(pdev->resource->start,
-                          resource_size(pdev->resource));
        return 0;
 }