]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mmc: sdhci-s3c: use devm_ functions
authorJulia Lawall <Julia.Lawall@lip6.fr>
Fri, 9 Mar 2012 04:24:53 +0000 (23:24 -0500)
committerChris Ball <cjb@laptop.org>
Sun, 1 Apr 2012 03:30:48 +0000 (23:30 -0400)
The various devm_ functions allocate memory that is released when a driver
detaches.  This patch uses these functions for data that is allocated in
the probe function of a platform device and is only freed in the remove
function.

By using devm_ioremap, it also removes a potential memory leak, because
there was no call to iounmap in the probe function.

The call to platform_get_resource was moved just to make it closer to the
place where its result it used.

Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sdhci-s3c.c

index a2bfbe0a5e9fd40e9e579fc5a5c8e7b817192e73..4f6ba7aec5b5da543625d707c76845e993f06939 100644 (file)
@@ -550,12 +550,6 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
                return irq;
        }
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(dev, "no memory specified\n");
-               return -ENOENT;
-       }
-
        host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c));
        if (IS_ERR(host)) {
                dev_err(dev, "sdhci_alloc_host() failed\n");
@@ -627,15 +621,8 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
                goto err_no_busclks;
        }
 
-       sc->ioarea = request_mem_region(res->start, resource_size(res),
-                                       mmc_hostname(host->mmc));
-       if (!sc->ioarea) {
-               dev_err(dev, "failed to reserve register area\n");
-               ret = -ENXIO;
-               goto err_req_regs;
-       }
-
-       host->ioaddr = ioremap_nocache(res->start, resource_size(res));
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       host->ioaddr = devm_request_and_ioremap(&pdev->dev, res);
        if (!host->ioaddr) {
                dev_err(dev, "failed to map registers\n");
                ret = -ENXIO;
@@ -720,7 +707,7 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
        ret = sdhci_add_host(host);
        if (ret) {
                dev_err(dev, "sdhci_add_host() failed\n");
-               goto err_add_host;
+               goto err_req_regs;
        }
 
        /* The following two methods of card detection might call
@@ -734,10 +721,6 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
 
        return 0;
 
- err_add_host:
-       release_resource(sc->ioarea);
-       kfree(sc->ioarea);
-
  err_req_regs:
        for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
                if (sc->clk_bus[ptr]) {
@@ -789,10 +772,6 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev)
        clk_disable(sc->clk_io);
        clk_put(sc->clk_io);
 
-       iounmap(host->ioaddr);
-       release_resource(sc->ioarea);
-       kfree(sc->ioarea);
-
        if (pdev->dev.of_node) {
                for (ptr = 0; ptr < NUM_GPIOS(sc->pdata->max_width); ptr++)
                        gpio_free(sc->gpios[ptr]);