mtd: mxc_nand: Use managed resources
authorSascha Hauer <s.hauer@pengutronix.de>
Wed, 6 Jun 2012 10:33:13 +0000 (12:33 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 6 Jul 2012 17:17:05 +0000 (18:17 +0100)
To make the error path simpler and to make subsequent patches
easier.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/mxc_nand.c

index fc3b38c7ffb4c8f3442ec811681ecbabb3f8ef1f..db428c24e2c84e8967c664a219f1bdfdedea5755 100644 (file)
@@ -1344,8 +1344,8 @@ static int __init mxcnd_probe(struct platform_device *pdev)
        int err = 0;
 
        /* Allocate memory for MTD device structure and private data */
-       host = kzalloc(sizeof(struct mxc_nand_host) + NAND_MAX_PAGESIZE +
-                       NAND_MAX_OOBSIZE, GFP_KERNEL);
+       host = devm_kzalloc(&pdev->dev, sizeof(struct mxc_nand_host) +
+                       NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE, GFP_KERNEL);
        if (!host)
                return -ENOMEM;
 
@@ -1372,26 +1372,17 @@ static int __init mxcnd_probe(struct platform_device *pdev)
        this->read_buf = mxc_nand_read_buf;
        this->verify_buf = mxc_nand_verify_buf;
 
-       host->clk = clk_get(&pdev->dev, "nfc");
-       if (IS_ERR(host->clk)) {
-               err = PTR_ERR(host->clk);
-               goto eclk;
-       }
-
-       clk_prepare_enable(host->clk);
-       host->clk_act = 1;
+       host->clk = devm_clk_get(&pdev->dev, "nfc");
+       if (IS_ERR(host->clk))
+               return PTR_ERR(host->clk);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               err = -ENODEV;
-               goto eres;
-       }
+       if (!res)
+               return -ENODEV;
 
-       host->base = ioremap(res->start, resource_size(res));
-       if (!host->base) {
-               err = -ENOMEM;
-               goto eres;
-       }
+       host->base = devm_request_and_ioremap(&pdev->dev, res);
+       if (!host->base)
+               return -ENOMEM;
 
        host->main_area0 = host->base;
 
@@ -1399,7 +1390,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
        if (err > 0)
                err = mxcnd_probe_pdata(host);
        if (err < 0)
-               goto eirq;
+               return err;
 
        if (host->devtype_data->regs_offset)
                host->regs = host->base + host->devtype_data->regs_offset;
@@ -1416,15 +1407,11 @@ static int __init mxcnd_probe(struct platform_device *pdev)
 
        if (host->devtype_data->needs_ip) {
                res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-               if (!res) {
-                       err = -ENODEV;
-                       goto eirq;
-               }
-               host->regs_ip = ioremap(res->start, resource_size(res));
-               if (!host->regs_ip) {
-                       err = -ENOMEM;
-                       goto eirq;
-               }
+               if (!res)
+                       return -ENODEV;
+               host->regs_ip = devm_request_and_ioremap(&pdev->dev, res);
+               if (!host->regs_ip)
+                       return -ENOMEM;
        }
 
        if (host->pdata.hw_ecc) {
@@ -1458,9 +1445,13 @@ static int __init mxcnd_probe(struct platform_device *pdev)
         */
        host->devtype_data->irq_control(host, 0);
 
-       err = request_irq(host->irq, mxc_nfc_irq, IRQF_DISABLED, DRIVER_NAME, host);
+       err = devm_request_irq(&pdev->dev, host->irq, mxc_nfc_irq,
+                       IRQF_DISABLED, DRIVER_NAME, host);
        if (err)
-               goto eirq;
+               return err;
+
+       clk_prepare_enable(host->clk);
+       host->clk_act = 1;
 
        /*
         * Now that we "own" the interrupt make sure the interrupt mask bit is
@@ -1512,15 +1503,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
        return 0;
 
 escan:
-       free_irq(host->irq, host);
-eirq:
-       if (host->regs_ip)
-               iounmap(host->regs_ip);
-       iounmap(host->base);
-eres:
-       clk_put(host->clk);
-eclk:
-       kfree(host);
+       clk_disable_unprepare(host->clk);
 
        return err;
 }
@@ -1529,16 +1512,9 @@ static int __devexit mxcnd_remove(struct platform_device *pdev)
 {
        struct mxc_nand_host *host = platform_get_drvdata(pdev);
 
-       clk_put(host->clk);
-
        platform_set_drvdata(pdev, NULL);
 
        nand_release(&host->mtd);
-       free_irq(host->irq, host);
-       if (host->regs_ip)
-               iounmap(host->regs_ip);
-       iounmap(host->base);
-       kfree(host);
 
        return 0;
 }