Signed-off-by: Tomeu Vizoso <tomeu.viz...@collabora.com>
---

 drivers/regulator/fixed.c | 33 +++++++++++----------------------
 1 file changed, 11 insertions(+), 22 deletions(-)

diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
index ff62d69ba0be..4ece78c1260d 100644
--- a/drivers/regulator/fixed.c
+++ b/drivers/regulator/fixed.c
@@ -34,6 +34,7 @@
 struct fixed_voltage_data {
        struct regulator_desc desc;
        struct regulator_dev *dev;
+       struct gpio_desc *gpio;
 };
 
 
@@ -78,20 +79,6 @@ of_get_fixed_voltage_config(struct device *dev,
        if (init_data->constraints.boot_on)
                config->enabled_at_boot = true;
 
-       config->gpio = of_get_named_gpio(np, "gpio", 0);
-       /*
-        * of_get_named_gpio() currently returns ENODEV rather than
-        * EPROBE_DEFER. This code attempts to be compatible with both
-        * for now; the ENODEV check can be removed once the API is fixed.
-        * of_get_named_gpio() doesn't differentiate between a missing
-        * property (which would be fine here, since the GPIO is optional)
-        * and some other error. Patches have been posted for both issues.
-        * Once they are check in, we should replace this with:
-        * if (config->gpio < 0 && config->gpio != -ENOENT)
-        */
-       if ((config->gpio == -ENODEV) || (config->gpio == -EPROBE_DEFER))
-               return ERR_PTR(-EPROBE_DEFER);
-
        of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
 
        config->enable_high = of_property_read_bool(np, "enable-active-high");
@@ -110,20 +97,17 @@ static struct regulator_ops fixed_voltage_ops = {
 static int reg_fixed_voltage_probe(struct platform_device *pdev)
 {
        struct fixed_voltage_config *config;
-       struct fixed_voltage_data *drvdata;
+       struct fixed_voltage_data *drvdata = platform_get_drvdata(pdev);
        struct regulator_config cfg = { };
        int ret;
 
-       drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
-                              GFP_KERNEL);
-       if (!drvdata)
-               return -ENOMEM;
-
        if (pdev->dev.of_node) {
                config = of_get_fixed_voltage_config(&pdev->dev,
                                                     &drvdata->desc);
                if (IS_ERR(config))
                        return PTR_ERR(config);
+
+               config->gpio = desc_to_gpio(drvdata->gpio);
        } else {
                config = dev_get_platdata(&pdev->dev);
        }
@@ -193,8 +177,6 @@ static int reg_fixed_voltage_probe(struct platform_device 
*pdev)
                return ret;
        }
 
-       platform_set_drvdata(pdev, drvdata);
-
        dev_dbg(&pdev->dev, "%s supplying %duV\n", drvdata->desc.name,
                drvdata->desc.fixed_uV);
 
@@ -209,11 +191,18 @@ static const struct of_device_id fixed_of_match[] = {
 MODULE_DEVICE_TABLE(of, fixed_of_match);
 #endif
 
+static const struct devm_resource reg_fixed_resources[] = {
+       DEVM_ALLOC(fixed_voltage_data),
+       DEVM_GPIO_NAMED(fixed_voltage_data, gpio, NULL),
+       {},
+};
+
 static struct platform_driver regulator_fixed_voltage_driver = {
        .probe          = reg_fixed_voltage_probe,
        .driver         = {
                .name           = "reg-fixed-voltage",
                .of_match_table = of_match_ptr(fixed_of_match),
+               .resources = reg_fixed_resources,
        },
 };
 
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to