]> www.infradead.org Git - users/hch/xfs.git/commitdiff
regulator: arizona-ldo1: Look up a descriptor and pass to the core
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 14 May 2018 08:06:24 +0000 (10:06 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 17 May 2018 06:42:53 +0000 (15:42 +0900)
Instead of passing a global GPIO number, pass a descriptor looked
up with the standard devm_gpiod_get_optional() call.

We have augmented the GPIO core to look up the regulator special
GPIO "wlf,ldoena" in commit 6a537d48461d
"gpio: of: Support regulator nonstandard GPIO properties".

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/arm/mach-s3c64xx/mach-crag6410-module.c
drivers/regulator/arizona-ldo1.c
include/linux/regulator/arizona-ldo1.h

index f00988705408d00083d6b2c5fe592922cb89f66d..5aa472892465ad377f46eff786890bde573addb6 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/interrupt.h>
 #include <linux/i2c.h>
 #include <linux/spi/spi.h>
+#include <linux/gpio/machine.h>
 
 #include <linux/mfd/wm831x/irq.h>
 #include <linux/mfd/wm831x/gpio.h>
@@ -206,9 +207,6 @@ static const struct i2c_board_info wm1277_devs[] = {
 };
 
 static struct arizona_pdata wm5102_reva_pdata = {
-       .ldo1 = {
-               .ldoena = S3C64XX_GPN(7),
-       },
        .gpio_base = CODEC_GPIO_BASE,
        .irq_flags = IRQF_TRIGGER_HIGH,
        .micd_pol_gpio = CODEC_GPIO_BASE + 4,
@@ -237,10 +235,16 @@ static struct spi_board_info wm5102_reva_spi_devs[] = {
        },
 };
 
-static struct arizona_pdata wm5102_pdata = {
-       .ldo1 = {
-               .ldoena = S3C64XX_GPN(7),
+static struct gpiod_lookup_table wm5102_reva_gpiod_table = {
+       .dev_id = "spi0.1", /* SPI device name */
+       .table = {
+               GPIO_LOOKUP("GPION", 7,
+                           "wlf,ldoena", GPIO_ACTIVE_HIGH),
+               { },
        },
+};
+
+static struct arizona_pdata wm5102_pdata = {
        .gpio_base = CODEC_GPIO_BASE,
        .irq_flags = IRQF_TRIGGER_HIGH,
        .micd_pol_gpio = CODEC_GPIO_BASE + 2,
@@ -264,6 +268,15 @@ static struct spi_board_info wm5102_spi_devs[] = {
        },
 };
 
+static struct gpiod_lookup_table wm5102_gpiod_table = {
+       .dev_id = "spi0.1", /* SPI device name */
+       .table = {
+               GPIO_LOOKUP("GPION", 7,
+                           "wlf,ldo1ena", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static struct spi_board_info wm5110_spi_devs[] = {
        [0] = {
                .modalias       = "wm5110",
@@ -366,6 +379,9 @@ static int wlf_gf_module_probe(struct i2c_client *i2c,
                                            rev == gf_mods[i].rev))
                        break;
 
+       gpiod_add_lookup_table(&wm5102_reva_gpiod_table);
+       gpiod_add_lookup_table(&wm5102_gpiod_table);
+
        if (i < ARRAY_SIZE(gf_mods)) {
                dev_info(&i2c->dev, "%s revision %d\n",
                         gf_mods[i].name, rev + 1);
index 96fddfff5dc46148086a805918ec83d8bc5d8442..f6d6a4ad9e8a28c8561b2ca807ccf2b11ed9aad3 100644 (file)
 #include <linux/bitops.h>
 #include <linux/err.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/of_regulator.h>
-#include <linux/gpio.h>
 #include <linux/slab.h>
 
 #include <linux/regulator/arizona-ldo1.h>
@@ -198,16 +197,6 @@ static int arizona_ldo1_of_get_pdata(struct arizona_ldo1_pdata *pdata,
        struct device_node *init_node, *dcvdd_node;
        struct regulator_init_data *init_data;
 
-       pdata->ldoena = of_get_named_gpio(np, "wlf,ldoena", 0);
-       if (pdata->ldoena < 0) {
-               dev_warn(config->dev,
-                        "LDOENA GPIO property missing/malformed: %d\n",
-                        pdata->ldoena);
-               pdata->ldoena = 0;
-       } else {
-               config->ena_gpio_initialized = true;
-       }
-
        init_node = of_get_child_by_name(np, "ldo1");
        dcvdd_node = of_parse_phandle(np, "DCVDD-supply", 0);
 
@@ -264,7 +253,11 @@ static int arizona_ldo1_common_init(struct platform_device *pdev,
                }
        }
 
-       config.ena_gpio = pdata->ldoena;
+       /* We assume that high output = regulator off */
+       config.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "wlf,ldoena",
+                                                  GPIOD_OUT_HIGH);
+       if (IS_ERR(config.ena_gpiod))
+               return PTR_ERR(config.ena_gpiod);
 
        if (pdata->init_data)
                config.init_data = pdata->init_data;
index c685f1277c639187afdbead1bce86a2a681566a8..fe74ab9990e696f31aff8a4a2a17019eb2d123a6 100644 (file)
@@ -14,9 +14,6 @@
 struct regulator_init_data;
 
 struct arizona_ldo1_pdata {
-       /** GPIO controlling LDOENA, if any */
-       int ldoena;
-
        /** Regulator configuration for LDO1 */
        const struct regulator_init_data *init_data;
 };