OSDN Git Service

gpio: dwapb: Convert to use resource managed APIs
authorAxel Lin <axel.lin@ingics.com>
Sun, 28 Dec 2014 07:23:14 +0000 (15:23 +0800)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 15 Jan 2015 16:23:21 +0000 (17:23 +0100)
Use resource managed APIs to simplify the code a bit.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-dwapb.c

index b4eb6a6..58faf04 100644 (file)
@@ -469,15 +469,13 @@ dwapb_gpio_get_pdata_of(struct device *dev)
        if (nports == 0)
                return ERR_PTR(-ENODEV);
 
-       pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
        if (!pdata)
                return ERR_PTR(-ENOMEM);
 
-       pdata->properties = kcalloc(nports, sizeof(*pp), GFP_KERNEL);
-       if (!pdata->properties) {
-               kfree(pdata);
+       pdata->properties = devm_kcalloc(dev, nports, sizeof(*pp), GFP_KERNEL);
+       if (!pdata->properties)
                return ERR_PTR(-ENOMEM);
-       }
 
        pdata->nports = nports;
 
@@ -490,8 +488,6 @@ dwapb_gpio_get_pdata_of(struct device *dev)
                    pp->idx >= DWAPB_MAX_PORTS) {
                        dev_err(dev, "missing/invalid port index for %s\n",
                                port_np->full_name);
-                       kfree(pdata->properties);
-                       kfree(pdata);
                        return ERR_PTR(-EINVAL);
                }
 
@@ -523,15 +519,6 @@ dwapb_gpio_get_pdata_of(struct device *dev)
        return pdata;
 }
 
-static inline void dwapb_free_pdata_of(struct dwapb_platform_data *pdata)
-{
-       if (!IS_ENABLED(CONFIG_OF_GPIO) || !pdata)
-               return;
-
-       kfree(pdata->properties);
-       kfree(pdata);
-}
-
 static int dwapb_gpio_probe(struct platform_device *pdev)
 {
        unsigned int i;
@@ -540,40 +527,32 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
        int err;
        struct device *dev = &pdev->dev;
        struct dwapb_platform_data *pdata = dev_get_platdata(dev);
-       bool is_pdata_alloc = !pdata;
 
-       if (is_pdata_alloc) {
+       if (!pdata) {
                pdata = dwapb_gpio_get_pdata_of(dev);
                if (IS_ERR(pdata))
                        return PTR_ERR(pdata);
        }
 
-       if (!pdata->nports) {
-               err = -ENODEV;
-               goto out_err;
-       }
+       if (!pdata->nports)
+               return -ENODEV;
 
        gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
-       if (!gpio) {
-               err = -ENOMEM;
-               goto out_err;
-       }
+       if (!gpio)
+               return -ENOMEM;
+
        gpio->dev = &pdev->dev;
        gpio->nr_ports = pdata->nports;
 
        gpio->ports = devm_kcalloc(&pdev->dev, gpio->nr_ports,
                                   sizeof(*gpio->ports), GFP_KERNEL);
-       if (!gpio->ports) {
-               err = -ENOMEM;
-               goto out_err;
-       }
+       if (!gpio->ports)
+               return -ENOMEM;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        gpio->regs = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(gpio->regs)) {
-               err = PTR_ERR(gpio->regs);
-               goto out_err;
-       }
+       if (IS_ERR(gpio->regs))
+               return PTR_ERR(gpio->regs);
 
        for (i = 0; i < gpio->nr_ports; i++) {
                err = dwapb_gpio_add_port(gpio, &pdata->properties[i], i);
@@ -582,16 +561,12 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
        }
        platform_set_drvdata(pdev, gpio);
 
-       goto out_err;
+       return 0;
 
 out_unregister:
        dwapb_gpio_unregister(gpio);
        dwapb_irq_teardown(gpio);
 
-out_err:
-       if (is_pdata_alloc)
-               dwapb_free_pdata_of(pdata);
-
        return err;
 }