Merge tag 'please-pull-noboot' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl...
[linux-2.6-microblaze.git] / drivers / regulator / arizona-ldo1.c
index f6d6a4a..e976d07 100644 (file)
@@ -36,6 +36,8 @@ struct arizona_ldo1 {
 
        struct regulator_consumer_supply supply;
        struct regulator_init_data init_data;
+
+       struct gpio_desc *ena_gpiod;
 };
 
 static int arizona_ldo1_hc_list_voltage(struct regulator_dev *rdev,
@@ -253,12 +255,17 @@ static int arizona_ldo1_common_init(struct platform_device *pdev,
                }
        }
 
-       /* We assume that high output = regulator off */
-       config.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "wlf,ldoena",
-                                                  GPIOD_OUT_HIGH);
+       /* We assume that high output = regulator off
+        * Don't use devm, since we need to get against the parent device
+        * so clean up would happen at the wrong time
+        */
+       config.ena_gpiod = gpiod_get_optional(parent_dev, "wlf,ldoena",
+                                             GPIOD_OUT_LOW);
        if (IS_ERR(config.ena_gpiod))
                return PTR_ERR(config.ena_gpiod);
 
+       ldo1->ena_gpiod = config.ena_gpiod;
+
        if (pdata->init_data)
                config.init_data = pdata->init_data;
        else
@@ -276,6 +283,9 @@ static int arizona_ldo1_common_init(struct platform_device *pdev,
        of_node_put(config.of_node);
 
        if (IS_ERR(ldo1->regulator)) {
+               if (config.ena_gpiod)
+                       gpiod_put(config.ena_gpiod);
+
                ret = PTR_ERR(ldo1->regulator);
                dev_err(&pdev->dev, "Failed to register LDO1 supply: %d\n",
                        ret);
@@ -334,8 +344,19 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
        return ret;
 }
 
+static int arizona_ldo1_remove(struct platform_device *pdev)
+{
+       struct arizona_ldo1 *ldo1 = platform_get_drvdata(pdev);
+
+       if (ldo1->ena_gpiod)
+               gpiod_put(ldo1->ena_gpiod);
+
+       return 0;
+}
+
 static struct platform_driver arizona_ldo1_driver = {
        .probe = arizona_ldo1_probe,
+       .remove = arizona_ldo1_remove,
        .driver         = {
                .name   = "arizona-ldo1",
        },