OSDN Git Service

mtd: plat_nand: Use devm_*() functions
authorJingoo Han <jg1.han@samsung.com>
Fri, 3 Jan 2014 02:16:28 +0000 (11:16 +0900)
committerBrian Norris <computersforpeace@gmail.com>
Tue, 7 Jan 2014 18:07:33 +0000 (10:07 -0800)
Use devm_*() functions to make cleanup paths simpler.

Signed-off-by: Jingoo Han <jg1.han@samsung.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/nand/plat_nand.c

index cad4cdc..d00e3a7 100644 (file)
@@ -9,6 +9,7 @@
  *
  */
 
+#include <linux/err.h>
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
@@ -52,25 +53,16 @@ static int plat_nand_probe(struct platform_device *pdev)
                return -ENXIO;
 
        /* Allocate memory for the device structure (and zero it) */
-       data = kzalloc(sizeof(struct plat_nand_data), GFP_KERNEL);
+       data = devm_kzalloc(&pdev->dev, sizeof(struct plat_nand_data),
+                           GFP_KERNEL);
        if (!data) {
                dev_err(&pdev->dev, "failed to allocate device structure.\n");
                return -ENOMEM;
        }
 
-       if (!request_mem_region(res->start, resource_size(res),
-                               dev_name(&pdev->dev))) {
-               dev_err(&pdev->dev, "request_mem_region failed\n");
-               err = -EBUSY;
-               goto out_free;
-       }
-
-       data->io_base = ioremap(res->start, resource_size(res));
-       if (data->io_base == NULL) {
-               dev_err(&pdev->dev, "ioremap failed\n");
-               err = -EIO;
-               goto out_release_io;
-       }
+       data->io_base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(data->io_base))
+               return PTR_ERR(data->io_base);
 
        data->chip.priv = &data;
        data->mtd.priv = &data->chip;
@@ -122,11 +114,6 @@ static int plat_nand_probe(struct platform_device *pdev)
 out:
        if (pdata->ctrl.remove)
                pdata->ctrl.remove(pdev);
-       iounmap(data->io_base);
-out_release_io:
-       release_mem_region(res->start, resource_size(res));
-out_free:
-       kfree(data);
        return err;
 }
 
@@ -137,16 +124,10 @@ static int plat_nand_remove(struct platform_device *pdev)
 {
        struct plat_nand_data *data = platform_get_drvdata(pdev);
        struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev);
-       struct resource *res;
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        nand_release(&data->mtd);
        if (pdata->ctrl.remove)
                pdata->ctrl.remove(pdev);
-       iounmap(data->io_base);
-       release_mem_region(res->start, resource_size(res));
-       kfree(data);
 
        return 0;
 }