regulator: s5m8767: Properly handle gpio_request failure
authorAxel Lin <axel.lin@gmail.com>
Thu, 5 Jul 2012 15:12:49 +0000 (23:12 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 15 Jul 2012 20:49:53 +0000 (21:49 +0100)
Convert to devm_gpio_request to save a few error handling code.

This patch properly handle the gpio_request failure, we should return error
when gpio_request fails rather than just show warning.

I think one of the reason we got -EBUSY is because current code does not free
gpios in s5m8767_pmic_remove(). So it got -EBUSY when reload the module.

Yest another reason is in current code if gpio_request() returns error,
the rest of the code still calls gpio_direction_output to config buck_gpios
and buck_ds gpios. This looks wrong to me.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/regulator/s5m8767.c

index 1ad9c3c0da8d16a64443b3680f7a46e9fc9c3e0a..102287fa7ecb48df1aae1de76c484b3fe683051d 100644 (file)
@@ -620,20 +620,21 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
        if (gpio_is_valid(pdata->buck_gpios[0]) &&
                gpio_is_valid(pdata->buck_gpios[1]) &&
                gpio_is_valid(pdata->buck_gpios[2])) {
-               ret = gpio_request(pdata->buck_gpios[0], "S5M8767 SET1");
-               if (ret == -EBUSY)
-                       dev_warn(&pdev->dev, "Duplicated gpio request"
-                               " for SET1\n");
-
-               ret = gpio_request(pdata->buck_gpios[1], "S5M8767 SET2");
-               if (ret == -EBUSY)
-                       dev_warn(&pdev->dev, "Duplicated gpio request"
-                               " for SET2\n");
-
-               ret = gpio_request(pdata->buck_gpios[2], "S5M8767 SET3");
-               if (ret == -EBUSY)
-                       dev_warn(&pdev->dev, "Duplicated gpio request"
-                                       " for SET3\n");
+               ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[0],
+                                       "S5M8767 SET1");
+               if (ret)
+                       return ret;
+
+               ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[1],
+                                       "S5M8767 SET2");
+               if (ret)
+                       return ret;
+
+               ret = devm_gpio_request(&pdev->dev, pdata->buck_gpios[2],
+                                       "S5M8767 SET3");
+               if (ret)
+                       return ret;
+
                /* SET1 GPIO */
                gpio_direction_output(pdata->buck_gpios[0],
                                (s5m8767->buck_gpioindex >> 2) & 0x1);
@@ -643,25 +644,23 @@ static __devinit int s5m8767_pmic_probe(struct platform_device *pdev)
                /* SET3 GPIO */
                gpio_direction_output(pdata->buck_gpios[2],
                                (s5m8767->buck_gpioindex >> 0) & 0x1);
-               ret = 0;
-
        } else {
                dev_err(&pdev->dev, "GPIO NOT VALID\n");
                ret = -EINVAL;
                return ret;
        }
 
-       ret = gpio_request(pdata->buck_ds[0], "S5M8767 DS2");
-       if (ret == -EBUSY)
-               dev_warn(&pdev->dev, "Duplicated gpio request for DS2\n");
+       ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[0], "S5M8767 DS2");
+       if (ret)
+               return ret;
 
-       ret = gpio_request(pdata->buck_ds[1], "S5M8767 DS3");
-       if (ret == -EBUSY)
-               dev_warn(&pdev->dev, "Duplicated gpio request for DS3\n");
+       ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[1], "S5M8767 DS3");
+       if (ret)
+               return ret;
 
-       ret = gpio_request(pdata->buck_ds[2], "S5M8767 DS4");
-       if (ret == -EBUSY)
-               dev_warn(&pdev->dev, "Duplicated gpio request for DS4\n");
+       ret = devm_gpio_request(&pdev->dev, pdata->buck_ds[2], "S5M8767 DS4");
+       if (ret)
+               return ret;
 
        /* DS2 GPIO */
        gpio_direction_output(pdata->buck_ds[0], 0x0);