All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/19 v3] Refactor fixed and GPIO regulators
@ 2018-05-14  8:06 Linus Walleij
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
                   ` (18 more replies)
  0 siblings, 19 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

This pulls the fixed and GPIO regulators into the gpiolib
descriptor framework, at least more than what is currently
the case.

This is also available as a git branch:
git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
for-regulator-4.18

Charles Keepax (1):
  ARM: s3c64xx: Tidy up handling of regulator GPIO lookups

Linus Walleij (18):
  regulator: fixed: Convert to use GPIO descriptor only
  regulator: gpio: Get enable GPIO using GPIO descriptor
  regulator: arizona-ldo1: Look up a descriptor and pass to the core
  regulator: max8973: Pass descriptor instead of GPIO number
  regulator: max77686: Pass descriptor instead of GPIO number
  regulator: lm363x: Pass descriptor instead of GPIO number
  regulator: lp8788-ldo: Pass descriptor instead of GPIO number
  regulator: max8952: Pass descriptor instead of GPIO number
  regulator: pfuze100: Delete reference to ena_gpio
  regulator: s2mps11: Pass descriptor instead of GPIO number
  regulator: s5m8767: Pass descriptor instead of GPIO number
  regulator: tps65090: Pass descriptor instead of GPIO number
  regulator: wm8994: Pass descriptor instead of GPIO number
  regulator: core: Only support passing enable GPIO descriptors
  regulator: fixed/gpio: Pull inversion/OD into gpiolib
  regulator: fixed/gpio: Update device tree bindings
  regulator: gpio: Convert to fully use descriptors
  regulator: gpio: Simplify probe path

 .../bindings/regulator/fixed-regulator.txt    |  13 +-
 .../bindings/regulator/gpio-regulator.txt     |   4 +
 arch/arm/mach-imx/mach-mx21ads.c              |  14 +-
 arch/arm/mach-imx/mach-mx27ads.c              |  12 +-
 arch/arm/mach-mmp/brownstone.c                |  13 +-
 arch/arm/mach-omap1/board-ams-delta.c         |  15 +-
 arch/arm/mach-omap2/pdata-quirks.c            |  17 +-
 arch/arm/mach-pxa/em-x270.c                   |   2 -
 arch/arm/mach-pxa/ezx.c                       |  34 ++--
 arch/arm/mach-pxa/hx4700.c                    |  23 ++-
 arch/arm/mach-pxa/magician.c                  |  25 ++-
 arch/arm/mach-pxa/raumfeld.c                  |  13 +-
 arch/arm/mach-pxa/zeus.c                      |  24 ++-
 arch/arm/mach-s3c64xx/mach-crag6410-module.c  |  55 ++++-
 arch/arm/mach-s3c64xx/mach-crag6410.c         |   1 -
 arch/arm/mach-s3c64xx/mach-smdk6410.c         |   1 -
 arch/arm/mach-sa1100/assabet.c                |  22 +-
 arch/arm/mach-sa1100/generic.c                |   5 +-
 arch/arm/mach-sa1100/generic.h                |   3 +-
 arch/arm/mach-sa1100/shannon.c                |   4 +-
 arch/sh/boards/mach-ecovec24/setup.c          |  24 ++-
 .../intel-mid/device_libs/platform_bcm43xx.c  |  18 +-
 drivers/mfd/wm8994-core.c                     |   9 -
 drivers/regulator/arizona-ldo1.c              |  19 +-
 drivers/regulator/core.c                      |  40 +---
 drivers/regulator/da9055-regulator.c          |   1 -
 drivers/regulator/fixed-helper.c              |   1 -
 drivers/regulator/fixed.c                     |  43 ++--
 drivers/regulator/gpio-regulator.c            | 192 +++++++-----------
 drivers/regulator/lm363x-regulator.c          |  20 +-
 drivers/regulator/lp8788-ldo.c                |  32 +--
 drivers/regulator/max77686-regulator.c        |  19 +-
 drivers/regulator/max8952.c                   |  18 +-
 drivers/regulator/max8973-regulator.c         |  54 ++---
 drivers/regulator/pfuze100-regulator.c        |   1 -
 drivers/regulator/s2mps11.c                   |  46 ++---
 drivers/regulator/s5m8767.c                   |  26 ++-
 drivers/regulator/tps65090-regulator.c        |  50 +++--
 drivers/regulator/wm8994-regulator.c          |  19 +-
 include/linux/mfd/lp8788.h                    |  16 --
 include/linux/mfd/samsung/core.h              |   4 +-
 include/linux/mfd/tps65090.h                  |   8 +-
 include/linux/mfd/wm8994/pdata.h              |   3 -
 include/linux/regulator/arizona-ldo1.h        |   3 -
 include/linux/regulator/driver.h              |  10 +-
 include/linux/regulator/fixed.h               |  13 --
 include/linux/regulator/gpio-regulator.h      |  18 +-
 include/linux/regulator/max8952.h             |   1 -
 48 files changed, 527 insertions(+), 481 deletions(-)

-- 
2.17.0

^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14 11:03   ` Andy Shevchenko
                     ` (4 more replies)
  2018-05-14  8:06 ` [PATCH 02/19 v3] regulator: gpio: Get enable GPIO using GPIO descriptor Linus Walleij
                   ` (17 subsequent siblings)
  18 siblings, 5 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown
  Cc: linux-kernel, Linus Walleij, Andy Shevchenko, Alexander Shiyan,
	Haojian Zhuang, Aaro Koskinen, Tony Lindgren, Mike Rapoport,
	Robert Jarzmik, Philipp Zabel, Daniel Mack, Marc Zyngier,
	Geert Uytterhoeven, Russell King

As we augmented the regulator core to accept a GPIO descriptor instead
of a GPIO number, we can augment the fixed GPIO regulator to look up
and pass that descriptor directly from device tree or board GPIO
descriptor look up tables.

Some boards just auto-enumerate their fixed regulator platform devices
and I have assumed they get names like "fixed-regulator.0" but it's
pretty hard to guess this. I need some testing from board maintainers to
be sure. Other boards are straight forward, using just plain
"fixed-regulator" (ID -1) or "fixed-regulator.1" hammering down the
device ID.

The OMAP didn't have proper label names on its GPIO chips so I have fixed
this with a separate patch to the GPIO tree, see
commit 088413bc0bd5f5fb66ca22a19d66a49d7154ba4c
"gpio: omap: Give unique labels to each GPIO bank/chip"

It seems the da9055 and da9211 has never got around to actually passing
any enable gpio into its platform data (not the in-tree code anyway) so we
can just decide to simply pass a descriptor instead.

The fixed GPIO-controlled regulator in mach-pxa/ezx.c was confusingly named
"*_dummy_supply_device" while it is a very real device backed by a GPIO
line. There is nothing dummy about it at all, so I renamed it with the
infix *_regulator_* as part of this patch set.

For the patch hunk hitting arch/blackfin I would say I do not expect
testing, review or ACKs anymore so if it works, it works.

The hunk hitting the x86 BCM43xx driver is especially tricky as the number
comes out of SFI which is a mystery to me. I definately need someone to
look at this. (Hi Andy.)

Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> # Check the x86 BCM stuff
Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer
Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on mainline with Blackfin gone and other changes.
- Fix up the new users that appeared in sa1100
- Drop some suplus comments in x86.
---
 arch/arm/mach-imx/mach-mx21ads.c              | 13 +++++++-
 arch/arm/mach-imx/mach-mx27ads.c              | 12 ++++++-
 arch/arm/mach-mmp/brownstone.c                | 12 ++++++-
 arch/arm/mach-omap1/board-ams-delta.c         | 14 +++++++-
 arch/arm/mach-omap2/pdata-quirks.c            | 16 ++++++++-
 arch/arm/mach-pxa/em-x270.c                   |  1 -
 arch/arm/mach-pxa/ezx.c                       | 33 ++++++++++++-------
 arch/arm/mach-pxa/magician.c                  |  2 +-
 arch/arm/mach-pxa/raumfeld.c                  | 12 +++++--
 arch/arm/mach-pxa/zeus.c                      | 23 +++++++++++--
 arch/arm/mach-s3c64xx/mach-crag6410.c         |  1 -
 arch/arm/mach-s3c64xx/mach-smdk6410.c         |  1 -
 arch/arm/mach-sa1100/assabet.c                | 21 ++++++++----
 arch/arm/mach-sa1100/generic.c                |  5 +--
 arch/arm/mach-sa1100/generic.h                |  3 +-
 arch/arm/mach-sa1100/shannon.c                |  4 +--
 arch/sh/boards/mach-ecovec24/setup.c          | 22 +++++++++++--
 .../intel-mid/device_libs/platform_bcm43xx.c  | 17 ++++++++--
 drivers/regulator/fixed-helper.c              |  1 -
 drivers/regulator/fixed.c                     | 33 +++++++++----------
 include/linux/regulator/fixed.h               |  3 --
 21 files changed, 187 insertions(+), 62 deletions(-)

diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c
index 5e366824814f..5d3b6b4fe6db 100644
--- a/arch/arm/mach-imx/mach-mx21ads.c
+++ b/arch/arm/mach-imx/mach-mx21ads.c
@@ -18,6 +18,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/physmap.h>
 #include <linux/gpio/driver.h>
+#include <linux/gpio/machine.h>
 #include <linux/gpio.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
@@ -175,6 +176,7 @@ static struct resource mx21ads_mmgpio_resource =
 	DEFINE_RES_MEM_NAMED(MX21ADS_IO_REG, SZ_2, "dat");
 
 static struct bgpio_pdata mx21ads_mmgpio_pdata = {
+	.label	= "mx21ads-mmgpio",
 	.base	= MX21ADS_MMGPIO_BASE,
 	.ngpio	= 16,
 };
@@ -203,7 +205,6 @@ static struct regulator_init_data mx21ads_lcd_regulator_init_data = {
 static struct fixed_voltage_config mx21ads_lcd_regulator_pdata = {
 	.supply_name	= "LCD",
 	.microvolts	= 3300000,
-	.gpio		= MX21ADS_IO_LCDON,
 	.enable_high	= 1,
 	.init_data	= &mx21ads_lcd_regulator_init_data,
 };
@@ -216,6 +217,15 @@ static struct platform_device mx21ads_lcd_regulator = {
 	},
 };
 
+static struct gpiod_lookup_table mx21ads_lcd_regulator_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what we get */
+	.table = {
+		GPIO_LOOKUP("mx21ads-mmgpio", 9,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 /*
  * Connected is a portrait Sharp-QVGA display
  * of type: LQ035Q7DB02
@@ -311,6 +321,7 @@ static void __init mx21ads_late_init(void)
 {
 	imx21_add_mxc_mmc(0, &mx21ads_sdhc_pdata);
 
+	gpiod_add_lookup_table(&mx21ads_lcd_regulator_gpiod_table);
 	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
 
 	mx21ads_cs8900_resources[1].start =
diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c
index a04bb094ded1..0fdb88db0cbd 100644
--- a/arch/arm/mach-imx/mach-mx27ads.c
+++ b/arch/arm/mach-imx/mach-mx27ads.c
@@ -16,6 +16,7 @@
 #include <linux/gpio/driver.h>
 /* Needed for gpio_to_irq() */
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
@@ -230,10 +231,17 @@ static struct regulator_init_data mx27ads_lcd_regulator_init_data = {
 static struct fixed_voltage_config mx27ads_lcd_regulator_pdata = {
 	.supply_name	= "LCD",
 	.microvolts	= 3300000,
-	.gpio		= MX27ADS_LCD_GPIO,
 	.init_data	= &mx27ads_lcd_regulator_init_data,
 };
 
+static struct gpiod_lookup_table mx27ads_lcd_regulator_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what we get */
+	.table = {
+		GPIO_LOOKUP("LCD", 0, "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static void __init mx27ads_regulator_init(void)
 {
 	struct gpio_chip *vchip;
@@ -247,6 +255,8 @@ static void __init mx27ads_regulator_init(void)
 	vchip->set		= vgpio_set;
 	gpiochip_add_data(vchip, NULL);
 
+	gpiod_add_lookup_table(&mx27ads_lcd_regulator_gpiod_table);
+
 	platform_device_register_data(NULL, "reg-fixed-voltage",
 				      PLATFORM_DEVID_AUTO,
 				      &mx27ads_lcd_regulator_pdata,
diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c
index d1613b954926..563b5a278d65 100644
--- a/arch/arm/mach-mmp/brownstone.c
+++ b/arch/arm/mach-mmp/brownstone.c
@@ -15,6 +15,7 @@
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/gpio-pxa.h>
+#include <linux/gpio/machine.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/max8649.h>
 #include <linux/regulator/fixed.h>
@@ -148,7 +149,6 @@ static struct regulator_init_data brownstone_v_5vp_data = {
 static struct fixed_voltage_config brownstone_v_5vp = {
 	.supply_name		= "v_5vp",
 	.microvolts		= 5000000,
-	.gpio			= GPIO_5V_ENABLE,
 	.enable_high		= 1,
 	.enabled_at_boot	= 1,
 	.init_data		= &brownstone_v_5vp_data,
@@ -162,6 +162,15 @@ static struct platform_device brownstone_v_5vp_device = {
 	},
 };
 
+static struct gpiod_lookup_table brownstone_v_5vp_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.1", /* .id set to 1 above */
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", GPIO_5V_ENABLE,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static struct max8925_platform_data brownstone_max8925_info = {
 	.irq_base		= MMP_NR_IRQS,
 };
@@ -217,6 +226,7 @@ static void __init brownstone_init(void)
 	mmp2_add_isram(&mmp2_isram_platdata);
 
 	/* enable 5v regulator */
+	gpiod_add_lookup_table(&brownstone_v_5vp_gpiod_table);
 	platform_device_register(&brownstone_v_5vp_device);
 }
 
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index 52e8e53ca154..759fa18f6ab4 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -12,6 +12,7 @@
  * published by the Free Software Foundation.
  */
 #include <linux/gpio/driver.h>
+#include <linux/gpio/machine.h>
 #include <linux/gpio.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
@@ -203,6 +204,7 @@ static struct resource latch2_resources[] = {
 };
 
 static struct bgpio_pdata latch2_pdata = {
+	.label	= "ams-delta-latch2",
 	.base	= AMS_DELTA_LATCH2_GPIO_BASE,
 	.ngpio	= AMS_DELTA_LATCH2_NGPIO,
 };
@@ -272,7 +274,6 @@ static struct regulator_init_data modem_nreset_data = {
 static struct fixed_voltage_config modem_nreset_config = {
 	.supply_name		= "modem_nreset",
 	.microvolts		= 3300000,
-	.gpio			= AMS_DELTA_GPIO_PIN_MODEM_NRESET,
 	.startup_delay		= 25000,
 	.enable_high		= 1,
 	.enabled_at_boot	= 1,
@@ -287,6 +288,16 @@ static struct platform_device modem_nreset_device = {
 	},
 };
 
+static struct gpiod_lookup_table modem_nreset_gpiod_table = {
+	.dev_id = "reg-fixed-voltage",
+	.table = {
+		/* The AMS_DELTA_GPIO_PIN_MODEM_NRESET is at offset 12 */
+		GPIO_LOOKUP("ams-delta-latch2", 12,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 struct modem_private_data {
 	struct regulator *regulator;
 };
@@ -570,6 +581,7 @@ static int __init late_init(void)
 
 	platform_add_devices(late_devices, ARRAY_SIZE(late_devices));
 
+	gpiod_add_lookup_table(&modem_nreset_gpiod_table);
 	err = platform_device_register(&modem_nreset_device);
 	if (err) {
 		pr_err("Couldn't register the modem regulator device\n");
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
index 6459816c2879..7d1447204fb8 100644
--- a/arch/arm/mach-omap2/pdata-quirks.c
+++ b/arch/arm/mach-omap2/pdata-quirks.c
@@ -10,6 +10,7 @@
 #include <linux/clk.h>
 #include <linux/davinci_emac.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/of_platform.h>
@@ -330,7 +331,6 @@ static struct regulator_init_data pandora_vmmc3 = {
 static struct fixed_voltage_config pandora_vwlan = {
 	.supply_name		= "vwlan",
 	.microvolts		= 1800000, /* 1.8V */
-	.gpio			= PANDORA_WIFI_NRESET_GPIO,
 	.startup_delay		= 50000, /* 50ms */
 	.enable_high		= 1,
 	.init_data		= &pandora_vmmc3,
@@ -344,6 +344,19 @@ static struct platform_device pandora_vwlan_device = {
 	},
 };
 
+static struct gpiod_lookup_table pandora_vwlan_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.1",
+	.table = {
+		/*
+		 * As this is a low GPIO number it should be at the first
+		 * GPIO bank.
+		 */
+		GPIO_LOOKUP("gpio-0-31", PANDORA_WIFI_NRESET_GPIO,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static void pandora_wl1251_init_card(struct mmc_card *card)
 {
 	/*
@@ -405,6 +418,7 @@ static void __init pandora_wl1251_init(void)
 static void __init omap3_pandora_legacy_init(void)
 {
 	platform_device_register(&pandora_backlight);
+	gpiod_add_lookup_table(&pandora_vwlan_gpiod_table);
 	platform_device_register(&pandora_vwlan_device);
 	omap_hsmmc_init(pandora_mmc3);
 	omap_hsmmc_late_init(pandora_mmc3);
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 49022ad338e9..6d7d93981098 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -987,7 +987,6 @@ static struct fixed_voltage_config camera_dummy_config = {
 	.supply_name		= "camera_vdd",
 	.input_supply		= "vcc cam",
 	.microvolts		= 2800000,
-	.gpio			= -1,
 	.enable_high		= 0,
 	.init_data		= &camera_dummy_initdata,
 };
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
index 2c90b58f347d..2b4bd6d94855 100644
--- a/arch/arm/mach-pxa/ezx.c
+++ b/arch/arm/mach-pxa/ezx.c
@@ -21,6 +21,7 @@
 #include <linux/regulator/fixed.h>
 #include <linux/input.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/gpio_keys.h>
 #include <linux/leds-lp3944.h>
 #include <linux/platform_data/i2c-pxa.h>
@@ -698,31 +699,39 @@ static struct pxa27x_keypad_platform_data e2_keypad_platform_data = {
 
 #if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_A910)
 /* camera */
-static struct regulator_consumer_supply camera_dummy_supplies[] = {
+static struct regulator_consumer_supply camera_regulator_supplies[] = {
 	REGULATOR_SUPPLY("vdd", "0-005d"),
 };
 
-static struct regulator_init_data camera_dummy_initdata = {
-	.consumer_supplies = camera_dummy_supplies,
-	.num_consumer_supplies = ARRAY_SIZE(camera_dummy_supplies),
+static struct regulator_init_data camera_regulator_initdata = {
+	.consumer_supplies = camera_regulator_supplies,
+	.num_consumer_supplies = ARRAY_SIZE(camera_regulator_supplies),
 	.constraints = {
 		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
 	},
 };
 
-static struct fixed_voltage_config camera_dummy_config = {
+static struct fixed_voltage_config camera_regulator_config = {
 	.supply_name		= "camera_vdd",
 	.microvolts		= 2800000,
-	.gpio			= GPIO50_nCAM_EN,
 	.enable_high		= 0,
-	.init_data		= &camera_dummy_initdata,
+	.init_data		= &camera_regulator_initdata,
 };
 
-static struct platform_device camera_supply_dummy_device = {
+static struct platform_device camera_supply_regulator_device = {
 	.name	= "reg-fixed-voltage",
 	.id	= 1,
 	.dev	= {
-		.platform_data = &camera_dummy_config,
+		.platform_data = &camera_regulator_config,
+	},
+};
+
+static struct gpiod_lookup_table camera_supply_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.1",
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", GPIO50_nCAM_EN,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
 	},
 };
 #endif
@@ -800,7 +809,7 @@ static struct i2c_board_info a780_i2c_board_info[] = {
 
 static struct platform_device *a780_devices[] __initdata = {
 	&a780_gpio_keys,
-	&camera_supply_dummy_device,
+	&camera_supply_regulator_device,
 };
 
 static void __init a780_init(void)
@@ -823,6 +832,7 @@ static void __init a780_init(void)
 	if (a780_camera_init() == 0)
 		pxa_set_camera_info(&a780_pxacamera_platform_data);
 
+	gpiod_add_lookup_table(&camera_supply_gpiod_table);
 	pwm_add_table(ezx_pwm_lookup, ARRAY_SIZE(ezx_pwm_lookup));
 	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
 	platform_add_devices(ARRAY_AND_SIZE(a780_devices));
@@ -892,6 +902,7 @@ static void __init e680_init(void)
 
 	pxa_set_keypad_info(&e680_keypad_platform_data);
 
+	gpiod_add_lookup_table(&camera_supply_gpiod_table);
 	pwm_add_table(ezx_pwm_lookup, ARRAY_SIZE(ezx_pwm_lookup));
 	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
 	platform_add_devices(ARRAY_AND_SIZE(e680_devices));
@@ -1098,7 +1109,7 @@ static struct i2c_board_info __initdata a910_i2c_board_info[] = {
 
 static struct platform_device *a910_devices[] __initdata = {
 	&a910_gpio_keys,
-	&camera_supply_dummy_device,
+	&camera_supply_regulator_device,
 };
 
 static void __init a910_init(void)
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
index c5325d1ae77b..14c0f80bc9e7 100644
--- a/arch/arm/mach-pxa/magician.c
+++ b/arch/arm/mach-pxa/magician.c
@@ -18,6 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/gpio_keys.h>
 #include <linux/input.h>
 #include <linux/mfd/htc-pasic3.h>
@@ -696,7 +697,6 @@ static struct regulator_init_data vads7846_regulator = {
 static struct fixed_voltage_config vads7846 = {
 	.supply_name	= "vads7846",
 	.microvolts	= 3300000, /* probably */
-	.gpio		= -EINVAL,
 	.startup_delay	= 0,
 	.init_data	= &vads7846_regulator,
 };
diff --git a/arch/arm/mach-pxa/raumfeld.c b/arch/arm/mach-pxa/raumfeld.c
index 034345546f84..ee766e4ebddc 100644
--- a/arch/arm/mach-pxa/raumfeld.c
+++ b/arch/arm/mach-pxa/raumfeld.c
@@ -886,7 +886,6 @@ static struct regulator_init_data audio_va_initdata = {
 static struct fixed_voltage_config audio_va_config = {
 	.supply_name		= "audio_va",
 	.microvolts		= 5000000,
-	.gpio			= GPIO_AUDIO_VA_ENABLE,
 	.enable_high		= 1,
 	.enabled_at_boot	= 0,
 	.init_data		= &audio_va_initdata,
@@ -900,6 +899,15 @@ static struct platform_device audio_va_device = {
 	},
 };
 
+static struct gpiod_lookup_table audio_va_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.0",
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", GPIO_AUDIO_VA_ENABLE,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 /* Dummy supplies for Codec's VD/VLC */
 
 static struct regulator_consumer_supply audio_dummy_supplies[] = {
@@ -918,7 +926,6 @@ static struct regulator_init_data audio_dummy_initdata = {
 static struct fixed_voltage_config audio_dummy_config = {
 	.supply_name		= "audio_vd",
 	.microvolts		= 3300000,
-	.gpio			= -1,
 	.init_data		= &audio_dummy_initdata,
 };
 
@@ -1033,6 +1040,7 @@ static void __init raumfeld_audio_init(void)
 	else
 		gpio_direction_output(GPIO_MCLK_RESET, 1);
 
+	gpiod_add_lookup_table(&audio_va_gpiod_table);
 	platform_add_devices(ARRAY_AND_SIZE(audio_regulator_devices));
 }
 
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
index e3851795d6d7..58e05afcece0 100644
--- a/arch/arm/mach-pxa/zeus.c
+++ b/arch/arm/mach-pxa/zeus.c
@@ -17,6 +17,7 @@
 #include <linux/irq.h>
 #include <linux/pm.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/serial_8250.h>
 #include <linux/dm9000.h>
 #include <linux/mmc/host.h>
@@ -410,7 +411,6 @@ static struct regulator_init_data can_regulator_init_data = {
 static struct fixed_voltage_config can_regulator_pdata = {
 	.supply_name	= "CAN_SHDN",
 	.microvolts	= 3300000,
-	.gpio		= ZEUS_CAN_SHDN_GPIO,
 	.init_data	= &can_regulator_init_data,
 };
 
@@ -422,6 +422,15 @@ static struct platform_device can_regulator_device = {
 	},
 };
 
+static struct gpiod_lookup_table can_regulator_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.0",
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", ZEUS_CAN_SHDN_GPIO,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static struct mcp251x_platform_data zeus_mcp2515_pdata = {
 	.oscillator_frequency	= 16*1000*1000,
 };
@@ -538,7 +547,6 @@ static struct regulator_init_data zeus_ohci_regulator_data = {
 static struct fixed_voltage_config zeus_ohci_regulator_config = {
 	.supply_name		= "vbus2",
 	.microvolts		= 5000000, /* 5.0V */
-	.gpio			= ZEUS_USB2_PWREN_GPIO,
 	.enable_high		= 1,
 	.startup_delay		= 0,
 	.init_data		= &zeus_ohci_regulator_data,
@@ -552,6 +560,15 @@ static struct platform_device zeus_ohci_regulator_device = {
 	},
 };
 
+static struct gpiod_lookup_table zeus_ohci_regulator_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.0",
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", ZEUS_USB2_PWREN_GPIO,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static struct pxaohci_platform_data zeus_ohci_platform_data = {
 	.port_mode	= PMM_NPS_MODE,
 	/* Clear Power Control Polarity Low and set Power Sense
@@ -855,6 +872,8 @@ static void __init zeus_init(void)
 
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(zeus_pin_config));
 
+	gpiod_add_lookup_table(&can_regulator_gpiod_table);
+	gpiod_add_lookup_table(&zeus_ohci_regulator_gpiod_table);
 	platform_add_devices(zeus_devices, ARRAY_SIZE(zeus_devices));
 
 	zeus_register_ohci();
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c
index f04650297487..379424d72ae7 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410.c
@@ -352,7 +352,6 @@ static struct fixed_voltage_config wallvdd_pdata = {
 	.supply_name = "WALLVDD",
 	.microvolts = 5000000,
 	.init_data = &wallvdd_data,
-	.gpio = -EINVAL,
 };
 
 static struct platform_device wallvdd_device = {
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index c46fa5dfd2e0..908e5aa831c8 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -222,7 +222,6 @@ static struct fixed_voltage_config smdk6410_b_pwr_5v_pdata = {
 	.supply_name = "B_PWR_5V",
 	.microvolts = 5000000,
 	.init_data = &smdk6410_b_pwr_5v_data,
-	.gpio = -EINVAL,
 };
 
 static struct platform_device smdk6410_b_pwr_5v = {
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
index 575ec085cffa..dbb53c520165 100644
--- a/arch/arm/mach-sa1100/assabet.c
+++ b/arch/arm/mach-sa1100/assabet.c
@@ -101,7 +101,7 @@ static int __init assabet_init_gpio(void __iomem *reg, u32 def_val)
 
 	assabet_bcr_gc = gc;
 
-	return gc->base;
+	return 0;
 }
 
 /*
@@ -471,6 +471,14 @@ static struct fixed_voltage_config assabet_cf_vcc_pdata __initdata = {
 	.enable_high = 1,
 };
 
+static struct gpiod_lookup_table assabet_cf_vcc_gpio_table = {
+	.dev_id = "reg-fixed-voltage.0",
+	.table = {
+		GPIO_LOOKUP("assabet", 0, "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static void __init assabet_init(void)
 {
 	/*
@@ -517,9 +525,11 @@ static void __init assabet_init(void)
 			neponset_resources, ARRAY_SIZE(neponset_resources));
 #endif
 	} else {
+		gpiod_add_lookup_table(&assabet_cf_vcc_gpio_table);
 		sa11x0_register_fixed_regulator(0, &assabet_cf_vcc_pdata,
-					 assabet_cf_vcc_consumers,
-					 ARRAY_SIZE(assabet_cf_vcc_consumers));
+					assabet_cf_vcc_consumers,
+					ARRAY_SIZE(assabet_cf_vcc_consumers),
+					true);
 
 	}
 
@@ -802,7 +812,6 @@ fs_initcall(assabet_leds_init);
 
 void __init assabet_init_irq(void)
 {
-	unsigned int assabet_gpio_base;
 	u32 def_val;
 
 	sa1100_init_irq();
@@ -817,9 +826,7 @@ void __init assabet_init_irq(void)
 	 *
 	 * This must precede any driver calls to BCR_set() or BCR_clear().
 	 */
-	assabet_gpio_base = assabet_init_gpio((void *)&ASSABET_BCR, def_val);
-
-	assabet_cf_vcc_pdata.gpio = assabet_gpio_base + 0;
+	assabet_init_gpio((void *)&ASSABET_BCR, def_val);
 }
 
 MACHINE_START(ASSABET, "Intel-Assabet")
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c
index 7167ddf84a0e..800321c6cbd8 100644
--- a/arch/arm/mach-sa1100/generic.c
+++ b/arch/arm/mach-sa1100/generic.c
@@ -348,7 +348,8 @@ void __init sa11x0_init_late(void)
 
 int __init sa11x0_register_fixed_regulator(int n,
 	struct fixed_voltage_config *cfg,
-	struct regulator_consumer_supply *supplies, unsigned num_supplies)
+	struct regulator_consumer_supply *supplies, unsigned num_supplies,
+	bool uses_gpio)
 {
 	struct regulator_init_data *id;
 
@@ -356,7 +357,7 @@ int __init sa11x0_register_fixed_regulator(int n,
 	if (!cfg->init_data)
 		return -ENOMEM;
 
-	if (cfg->gpio < 0)
+	if (!uses_gpio)
 		id->constraints.always_on = 1;
 	id->constraints.name = cfg->supply_name;
 	id->constraints.min_uV = cfg->microvolts;
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h
index 5f3cb52fa6ab..158a4fd5ca24 100644
--- a/arch/arm/mach-sa1100/generic.h
+++ b/arch/arm/mach-sa1100/generic.h
@@ -54,4 +54,5 @@ void sa11x0_register_pcmcia(int socket, struct gpiod_lookup_table *);
 struct fixed_voltage_config;
 struct regulator_consumer_supply;
 int sa11x0_register_fixed_regulator(int n, struct fixed_voltage_config *cfg,
-	struct regulator_consumer_supply *supplies, unsigned num_supplies);
+	struct regulator_consumer_supply *supplies, unsigned num_supplies,
+	bool uses_gpio);
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c
index 22f7fe0b809f..5bc82e2671c6 100644
--- a/arch/arm/mach-sa1100/shannon.c
+++ b/arch/arm/mach-sa1100/shannon.c
@@ -102,14 +102,14 @@ static struct fixed_voltage_config shannon_cf_vcc_pdata __initdata = {
 	.supply_name = "cf-power",
 	.microvolts = 3300000,
 	.enabled_at_boot = 1,
-	.gpio = -EINVAL,
 };
 
 static void __init shannon_init(void)
 {
 	sa11x0_register_fixed_regulator(0, &shannon_cf_vcc_pdata,
 					shannon_cf_vcc_consumers,
-					ARRAY_SIZE(shannon_cf_vcc_consumers));
+					ARRAY_SIZE(shannon_cf_vcc_consumers),
+					false);
 	sa11x0_register_pcmcia(0, &shannon_pcmcia0_gpio_table);
 	sa11x0_register_pcmcia(1, &shannon_pcmcia1_gpio_table);
 	sa11x0_ppc_configure_mcp();
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c
index adc61d14172c..c296b5c399b7 100644
--- a/arch/sh/boards/mach-ecovec24/setup.c
+++ b/arch/sh/boards/mach-ecovec24/setup.c
@@ -633,7 +633,6 @@ static struct regulator_init_data cn12_power_init_data = {
 static struct fixed_voltage_config cn12_power_info = {
 	.supply_name = "CN12 SD/MMC Vdd",
 	.microvolts = 3300000,
-	.gpio = GPIO_PTB7,
 	.enable_high = 1,
 	.init_data = &cn12_power_init_data,
 };
@@ -646,6 +645,16 @@ static struct platform_device cn12_power = {
 	},
 };
 
+static struct gpiod_lookup_table cn12_power_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.0",
+	.table = {
+		/* Offset 7 on port B */
+		GPIO_LOOKUP("sh7724_pfc", GPIO_PTB7,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
 /* SDHI0 */
 static struct regulator_consumer_supply sdhi0_power_consumers[] =
@@ -665,7 +674,6 @@ static struct regulator_init_data sdhi0_power_init_data = {
 static struct fixed_voltage_config sdhi0_power_info = {
 	.supply_name = "CN11 SD/MMC Vdd",
 	.microvolts = 3300000,
-	.gpio = GPIO_PTB6,
 	.enable_high = 1,
 	.init_data = &sdhi0_power_init_data,
 };
@@ -678,6 +686,16 @@ static struct platform_device sdhi0_power = {
 	},
 };
 
+static struct gpiod_lookup_table sdhi0_power_gpiod_table = {
+	.dev_id = "reg-fixed-voltage.1",
+	.table = {
+		/* Offset 6 on port B */
+		GPIO_LOOKUP("sh7724_pfc", GPIO_PTB6,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 static struct tmio_mmc_data sdhi0_info = {
 	.chan_priv_tx	= (void *)SHDMA_SLAVE_SDHI0_TX,
 	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI0_RX,
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c b/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
index 4392c15ed9e0..fc77d69e51d7 100644
--- a/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
+++ b/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
@@ -10,7 +10,7 @@
  * of the License.
  */
 
-#include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/fixed.h>
@@ -43,7 +43,6 @@ static struct fixed_voltage_config bcm43xx_vmmc = {
 	 * real voltage and signaling are still 1.8V.
 	 */
 	.microvolts		= 2000000,		/* 1.8V */
-	.gpio			= -EINVAL,
 	.startup_delay		= 250 * 1000,		/* 250ms */
 	.enable_high		= 1,			/* active high */
 	.enabled_at_boot	= 0,			/* disabled at boot */
@@ -58,11 +57,23 @@ static struct platform_device bcm43xx_vmmc_regulator = {
 	},
 };
 
+static struct gpiod_lookup_table bcm43xx_vmmc_gpio_table = {
+	.dev_id	= "reg-fixed-voltage.0",
+	.table	= {
+		GPIO_LOOKUP("0000:00:0c.0", -1, "enable", GPIO_ACTIVE_LOW),
+		{}
+	},
+};
+
 static int __init bcm43xx_regulator_register(void)
 {
+	struct gpiod_lookup_table *table = &bcm43xx_vmmc_gpio_table;
+	struct gpiod_lookup *lookup = table->table;
 	int ret;
 
-	bcm43xx_vmmc.gpio = get_gpio_by_name(WLAN_SFI_GPIO_ENABLE_NAME);
+	lookup[0].chip_hwnum = get_gpio_by_name(WLAN_SFI_GPIO_ENABLE_NAME);
+	gpiod_add_lookup_table(table);
+
 	ret = platform_device_register(&bcm43xx_vmmc_regulator);
 	if (ret) {
 		pr_err("%s: vmmc regulator register failed\n", __func__);
diff --git a/drivers/regulator/fixed-helper.c b/drivers/regulator/fixed-helper.c
index 777fac6fb4cb..2c6098e6f4bc 100644
--- a/drivers/regulator/fixed-helper.c
+++ b/drivers/regulator/fixed-helper.c
@@ -43,7 +43,6 @@ struct platform_device *regulator_register_always_on(int id, const char *name,
 	}
 
 	data->cfg.microvolts = uv;
-	data->cfg.gpio = -EINVAL;
 	data->cfg.enabled_at_boot = 1;
 	data->cfg.init_data = &data->init_data;
 
diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
index 988a7472c2ab..1142f195529b 100644
--- a/drivers/regulator/fixed.c
+++ b/drivers/regulator/fixed.c
@@ -24,10 +24,9 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/fixed.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/regulator/machine.h>
 
@@ -78,10 +77,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);
-	if ((config->gpio < 0) && (config->gpio != -ENOENT))
-		return ERR_PTR(config->gpio);
-
 	of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
 
 	config->enable_high = of_property_read_bool(np, "enable-active-high");
@@ -102,6 +97,7 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
 	struct fixed_voltage_config *config;
 	struct fixed_voltage_data *drvdata;
 	struct regulator_config cfg = { };
+	enum gpiod_flags gflags;
 	int ret;
 
 	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
@@ -150,25 +146,28 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
 
 	drvdata->desc.fixed_uV = config->microvolts;
 
-	if (gpio_is_valid(config->gpio)) {
-		cfg.ena_gpio = config->gpio;
-		if (pdev->dev.of_node)
-			cfg.ena_gpio_initialized = true;
-	}
 	cfg.ena_gpio_invert = !config->enable_high;
 	if (config->enabled_at_boot) {
 		if (config->enable_high)
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
+			gflags = GPIOD_OUT_HIGH;
 		else
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
+			gflags = GPIOD_OUT_LOW;
 	} else {
 		if (config->enable_high)
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
+			gflags = GPIOD_OUT_LOW;
 		else
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
+			gflags = GPIOD_OUT_HIGH;
 	}
-	if (config->gpio_is_open_drain)
-		cfg.ena_gpio_flags |= GPIOF_OPEN_DRAIN;
+	if (config->gpio_is_open_drain) {
+		if (gflags == GPIOD_OUT_HIGH)
+			gflags = GPIOD_OUT_HIGH_OPEN_DRAIN;
+		else
+			gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
+	}
+
+	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, NULL, gflags);
+	if (IS_ERR(cfg.ena_gpiod))
+		return PTR_ERR(cfg.ena_gpiod);
 
 	cfg.dev = &pdev->dev;
 	cfg.init_data = config->init_data;
diff --git a/include/linux/regulator/fixed.h b/include/linux/regulator/fixed.h
index 48918be649d4..1a4340ed8e2b 100644
--- a/include/linux/regulator/fixed.h
+++ b/include/linux/regulator/fixed.h
@@ -24,8 +24,6 @@ struct regulator_init_data;
  * @supply_name:	Name of the regulator supply
  * @input_supply:	Name of the input regulator supply
  * @microvolts:		Output voltage of regulator
- * @gpio:		GPIO to use for enable control
- * 			set to -EINVAL if not used
  * @startup_delay:	Start-up time in microseconds
  * @gpio_is_open_drain: Gpio pin is open drain or normal type.
  *			If it is open drain type then HIGH will be set
@@ -49,7 +47,6 @@ struct fixed_voltage_config {
 	const char *supply_name;
 	const char *input_supply;
 	int microvolts;
-	int gpio;
 	unsigned startup_delay;
 	unsigned gpio_is_open_drain:1;
 	unsigned enable_high:1;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 02/19 v3] regulator: gpio: Get enable GPIO using GPIO descriptor
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core Linus Walleij
                   ` (16 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij, Philipp Zabel

We augment the GPIO regulator to get the *enable* regulator
GPIO line (not the other lines) using a descriptor rather than
a global number.

We then pass this into the regulator core which has been
prepared to hande enable descriptors in a separate patch.

Switch over the two boardfiles using this facility and clean
up so we only pass descriptors around.

Cc: Philipp Zabel <philipp.zabel@gmail.com> # HX4700/Magician maintainer
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 arch/arm/mach-pxa/hx4700.c               | 12 +++++++++++-
 arch/arm/mach-pxa/magician.c             | 11 ++++++++++-
 drivers/regulator/gpio-regulator.c       | 23 +++++++++++------------
 include/linux/regulator/gpio-regulator.h |  3 ---
 4 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
index e2e7f247a645..6717a10180eb 100644
--- a/arch/arm/mach-pxa/hx4700.c
+++ b/arch/arm/mach-pxa/hx4700.c
@@ -20,6 +20,7 @@
 #include <linux/delay.h>
 #include <linux/fb.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <linux/gpio_keys.h>
 #include <linux/input.h>
 #include <linux/input/navpoint.h>
@@ -711,7 +712,6 @@ static struct gpio_regulator_state bq24022_states[] = {
 static struct gpio_regulator_config bq24022_info = {
 	.supply_name = "bq24022",
 
-	.enable_gpio = GPIO72_HX4700_BQ24022_nCHARGE_EN,
 	.enable_high = 0,
 	.enabled_at_boot = 0,
 
@@ -733,6 +733,15 @@ static struct platform_device bq24022 = {
 	},
 };
 
+static struct gpiod_lookup_table bq24022_gpiod_table = {
+	.dev_id = "gpio-regulator",
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", GPIO72_HX4700_BQ24022_nCHARGE_EN,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 /*
  * StrataFlash
  */
@@ -875,6 +884,7 @@ static void __init hx4700_init(void)
 	pxa_set_btuart_info(NULL);
 	pxa_set_stuart_info(NULL);
 
+	gpiod_add_lookup_table(&bq24022_gpiod_table);
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 	pwm_add_table(hx4700_pwm_lookup, ARRAY_SIZE(hx4700_pwm_lookup));
 
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
index 14c0f80bc9e7..9a5bda3ea194 100644
--- a/arch/arm/mach-pxa/magician.c
+++ b/arch/arm/mach-pxa/magician.c
@@ -657,7 +657,6 @@ static struct gpio_regulator_state bq24022_states[] = {
 static struct gpio_regulator_config bq24022_info = {
 	.supply_name		= "bq24022",
 
-	.enable_gpio		= GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
 	.enable_high		= 0,
 	.enabled_at_boot	= 1,
 
@@ -679,6 +678,15 @@ static struct platform_device bq24022 = {
 	},
 };
 
+static struct gpiod_lookup_table bq24022_gpiod_table = {
+	.dev_id = "gpio-regulator",
+	.table = {
+		GPIO_LOOKUP("gpio-pxa", GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
+			    "enable", GPIO_ACTIVE_HIGH),
+		{ },
+	},
+};
+
 /*
  * fixed regulator for ads7846
  */
@@ -1007,6 +1015,7 @@ static void __init magician_init(void)
 	regulator_register_always_on(0, "power", pwm_backlight_supply,
 		ARRAY_SIZE(pwm_backlight_supply), 5000000);
 
+	gpiod_add_lookup_table(&bq24022_gpiod_table);
 	platform_add_devices(ARRAY_AND_SIZE(devices));
 }
 
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index a86b8997bb54..9d6094c4d71c 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -31,6 +31,7 @@
 #include <linux/regulator/of_regulator.h>
 #include <linux/regulator/gpio-regulator.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/of.h>
 #include <linux/of_gpio.h>
@@ -161,10 +162,6 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
 
 	of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
 
-	config->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0);
-	if (config->enable_gpio < 0 && config->enable_gpio != -ENOENT)
-		return ERR_PTR(config->enable_gpio);
-
 	/* Fetch GPIOs. - optional property*/
 	ret = of_gpio_count(np);
 	if ((ret < 0) && (ret != -ENOENT))
@@ -255,6 +252,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	struct device_node *np = pdev->dev.of_node;
 	struct gpio_regulator_data *drvdata;
 	struct regulator_config cfg = { };
+	enum gpiod_flags gflags;
 	int ptr, ret, state;
 
 	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
@@ -340,21 +338,22 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	cfg.driver_data = drvdata;
 	cfg.of_node = np;
 
-	if (gpio_is_valid(config->enable_gpio)) {
-		cfg.ena_gpio = config->enable_gpio;
-		cfg.ena_gpio_initialized = true;
-	}
 	cfg.ena_gpio_invert = !config->enable_high;
 	if (config->enabled_at_boot) {
 		if (config->enable_high)
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
+			gflags = GPIOD_OUT_HIGH;
 		else
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
+			gflags = GPIOD_OUT_LOW;
 	} else {
 		if (config->enable_high)
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
+			gflags = GPIOD_OUT_LOW;
 		else
-			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
+			gflags = GPIOD_OUT_HIGH;
+	}
+	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "enable", gflags);
+	if (IS_ERR(cfg.ena_gpiod)) {
+		ret = PTR_ERR(cfg.ena_gpiod);
+		goto err_stategpio;
 	}
 
 	drvdata->dev = regulator_register(&drvdata->desc, &cfg);
diff --git a/include/linux/regulator/gpio-regulator.h b/include/linux/regulator/gpio-regulator.h
index 19fbd267406d..536cab86f2d5 100644
--- a/include/linux/regulator/gpio-regulator.h
+++ b/include/linux/regulator/gpio-regulator.h
@@ -44,8 +44,6 @@ struct gpio_regulator_state {
 /**
  * struct gpio_regulator_config - config structure
  * @supply_name:	Name of the regulator supply
- * @enable_gpio:	GPIO to use for enable control
- *			set to -EINVAL if not used
  * @enable_high:	Polarity of enable GPIO
  *			1 = Active high, 0 = Active low
  * @enabled_at_boot:	Whether regulator has been enabled at
@@ -69,7 +67,6 @@ struct gpio_regulator_state {
 struct gpio_regulator_config {
 	const char *supply_name;
 
-	int enable_gpio;
 	unsigned enable_high:1;
 	unsigned enabled_at_boot:1;
 	unsigned startup_delay;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
  2018-05-14  8:06 ` [PATCH 02/19 v3] regulator: gpio: Get enable GPIO using GPIO descriptor Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-15 11:53   ` Charles Keepax
  2018-05-17 16:41   ` Applied "regulator: arizona-ldo1: Look up a descriptor and pass to the core" to the regulator tree Mark Brown
  2018-05-14  8:06 ` [PATCH 04/19 v3] regulator: max8973: Pass descriptor instead of GPIO number Linus Walleij
                   ` (15 subsequent siblings)
  18 siblings, 2 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown
  Cc: linux-kernel, Linus Walleij, patches, Richard Fitzgerald, Charles Keepax

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".

Cc: patches@opensource.cirrus.com
Cc: Richard Fitzgerald <rf@opensource.cirrus.com>
Cc: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Fix "wlf,ldo1ena" to "wlf,ldoena" on WM5102 non-reva
ChangeLog v1->v2:
- Rebase the patch on the other changes.
- Make sure to update some s3c64xx platform data properly.
---
 arch/arm/mach-s3c64xx/mach-crag6410-module.c | 28 +++++++++++++++-----
 drivers/regulator/arizona-ldo1.c             | 19 +++++--------
 include/linux/regulator/arizona-ldo1.h       |  3 ---
 3 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
index f00988705408..5aa472892465 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
@@ -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);
diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c
index 96fddfff5dc4..f6d6a4ad9e8a 100644
--- a/drivers/regulator/arizona-ldo1.c
+++ b/drivers/regulator/arizona-ldo1.c
@@ -17,12 +17,11 @@
 #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;
diff --git a/include/linux/regulator/arizona-ldo1.h b/include/linux/regulator/arizona-ldo1.h
index c685f1277c63..fe74ab9990e6 100644
--- a/include/linux/regulator/arizona-ldo1.h
+++ b/include/linux/regulator/arizona-ldo1.h
@@ -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;
 };
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 04/19 v3] regulator: max8973: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (2 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 05/19 v3] regulator: max77686: " Linus Walleij
                   ` (14 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown
  Cc: linux-kernel, Linus Walleij, Mikko Perttunen, Laxman Dewangan

Instead of passing a global GPIO number, pass a descriptor looked
up with the standard devm_gpiod_get_optional() call.

Cc: Mikko Perttunen <mperttunen@nvidia.com>
Cc: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/max8973-regulator.c | 54 ++++++++++++++-------------
 1 file changed, 29 insertions(+), 25 deletions(-)

diff --git a/drivers/regulator/max8973-regulator.c b/drivers/regulator/max8973-regulator.c
index e0c747aa9f85..7cd493ec6315 100644
--- a/drivers/regulator/max8973-regulator.c
+++ b/drivers/regulator/max8973-regulator.c
@@ -34,6 +34,7 @@
 #include <linux/regulator/max8973-regulator.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/of_gpio.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
@@ -114,7 +115,6 @@ struct max8973_chip {
 	struct regulator_desc desc;
 	struct regmap *regmap;
 	bool enable_external_control;
-	int enable_gpio;
 	int dvs_gpio;
 	int lru_index[MAX8973_MAX_VOUT_REG];
 	int curr_vout_val[MAX8973_MAX_VOUT_REG];
@@ -567,7 +567,6 @@ static struct max8973_regulator_platform_data *max8973_parse_dt(
 
 	pdata->enable_ext_control = of_property_read_bool(np,
 						"maxim,externally-enable");
-	pdata->enable_gpio = of_get_named_gpio(np, "maxim,enable-gpio", 0);
 	pdata->dvs_gpio = of_get_named_gpio(np, "maxim,dvs-gpio", 0);
 
 	ret = of_property_read_u32(np, "maxim,dvs-default-state", &pval);
@@ -633,6 +632,8 @@ static int max8973_probe(struct i2c_client *client,
 	struct max8973_chip *max;
 	bool pdata_from_dt = false;
 	unsigned int chip_id;
+	struct gpio_desc *gpiod;
+	enum gpiod_flags gflags;
 	int ret;
 
 	pdata = dev_get_platdata(&client->dev);
@@ -647,8 +648,7 @@ static int max8973_probe(struct i2c_client *client,
 		return -EIO;
 	}
 
-	if ((pdata->dvs_gpio == -EPROBE_DEFER) ||
-		(pdata->enable_gpio == -EPROBE_DEFER))
+	if (pdata->dvs_gpio == -EPROBE_DEFER)
 		return -EPROBE_DEFER;
 
 	max = devm_kzalloc(&client->dev, sizeof(*max), GFP_KERNEL);
@@ -696,15 +696,11 @@ static int max8973_probe(struct i2c_client *client,
 	max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE;
 
 	max->dvs_gpio = (pdata->dvs_gpio) ? pdata->dvs_gpio : -EINVAL;
-	max->enable_gpio = (pdata->enable_gpio) ? pdata->enable_gpio : -EINVAL;
 	max->enable_external_control = pdata->enable_ext_control;
 	max->curr_gpio_val = pdata->dvs_def_state;
 	max->curr_vout_reg = MAX8973_VOUT + pdata->dvs_def_state;
 	max->junction_temp_warning = pdata->junction_temp_warning;
 
-	if (gpio_is_valid(max->enable_gpio))
-		max->enable_external_control = true;
-
 	max->lru_index[0] = max->curr_vout_reg;
 
 	if (gpio_is_valid(max->dvs_gpio)) {
@@ -757,27 +753,35 @@ static int max8973_probe(struct i2c_client *client,
 			break;
 		}
 
-		if (gpio_is_valid(max->enable_gpio)) {
-			config.ena_gpio_flags = GPIOF_OUT_INIT_LOW;
-			if (ridata && (ridata->constraints.always_on ||
-					ridata->constraints.boot_on))
-				config.ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
-			config.ena_gpio = max->enable_gpio;
+		if (ridata && (ridata->constraints.always_on ||
+			       ridata->constraints.boot_on))
+			gflags = GPIOD_OUT_HIGH;
+		else
+			gflags = GPIOD_OUT_LOW;
+		gpiod = devm_gpiod_get_optional(&client->dev,
+						"maxim,enable",
+						gflags);
+		if (IS_ERR(gpiod))
+			return PTR_ERR(gpiod);
+		if (gpiod) {
+			config.ena_gpiod = gpiod;
+			max->enable_external_control = true;
 		}
+
 		break;
 
 	case MAX77621:
-		if (gpio_is_valid(max->enable_gpio)) {
-			ret = devm_gpio_request_one(&client->dev,
-					max->enable_gpio, GPIOF_OUT_INIT_HIGH,
-					"max8973-en-gpio");
-			if (ret) {
-				dev_err(&client->dev,
-					"gpio_request for gpio %d failed: %d\n",
-					max->enable_gpio, ret);
-				return ret;
-			}
-		}
+		/*
+		 * We do not let the core switch this regulator on/off,
+		 * we just leave it on.
+		 */
+		gpiod = devm_gpiod_get_optional(&client->dev,
+						"maxim,enable",
+						GPIOD_OUT_HIGH);
+		if (IS_ERR(gpiod))
+			return PTR_ERR(gpiod);
+		if (gpiod)
+			max->enable_external_control = true;
 
 		max->desc.enable_reg = MAX8973_VOUT;
 		max->desc.enable_mask = MAX8973_VOUT_ENABLE;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 05/19 v3] regulator: max77686: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (3 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 04/19 v3] regulator: max8973: Pass descriptor instead of GPIO number Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  9:28   ` Krzysztof Kozlowski
  2018-05-17 16:41   ` Applied "regulator: max77686: Pass descriptor instead of GPIO number" to the regulator tree Mark Brown
  2018-05-14  8:06 ` [PATCH 06/19 v3] regulator: lm363x: Pass descriptor instead of GPIO number Linus Walleij
                   ` (13 subsequent siblings)
  18 siblings, 2 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown
  Cc: linux-kernel, Linus Walleij, Chanwoo Choi, Krzysztof Kozlowski,
	Bartlomiej Zolnierkiewicz

Instead of passing a global GPIO number, pass a descriptor looked
up from the device tree configuration node.

Cc: Chanwoo Choi <cw00.choi@samsung.com>
Cc: Krzysztof Kozlowski <krzk@kernel.org>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Name the regulator "max77686-regulator"
- Set the regulator to NULL on erroneous lookup, restoring the
  old init data lookup behaviour.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/max77686-regulator.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/regulator/max77686-regulator.c b/drivers/regulator/max77686-regulator.c
index c301f3733475..37f98a8350f0 100644
--- a/drivers/regulator/max77686-regulator.c
+++ b/drivers/regulator/max77686-regulator.c
@@ -25,8 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/bug.h>
 #include <linux/err.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
@@ -90,6 +89,7 @@ enum max77686_ramp_rate {
 };
 
 struct max77686_data {
+	struct device *dev;
 	DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS);
 
 	/* Array indexed by regulator id */
@@ -269,16 +269,20 @@ static int max77686_of_parse_cb(struct device_node *np,
 	case MAX77686_BUCK8:
 	case MAX77686_BUCK9:
 	case MAX77686_LDO20 ... MAX77686_LDO22:
-		config->ena_gpio = of_get_named_gpio(np,
-					"maxim,ena-gpios", 0);
-		config->ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
-		config->ena_gpio_initialized = true;
+		config->ena_gpiod = devm_gpiod_get_from_of_node(max77686->dev,
+								np,
+								"maxim,ena",
+								0,
+								GPIOD_OUT_HIGH,
+								"max77686-regulator");
+		if (IS_ERR(config->ena_gpiod))
+			config->ena_gpiod = NULL;
 		break;
 	default:
 		return 0;
 	}
 
-	if (gpio_is_valid(config->ena_gpio)) {
+	if (config->ena_gpiod) {
 		set_bit(desc->id, max77686->gpio_enabled);
 
 		return regmap_update_bits(config->regmap, desc->enable_reg,
@@ -521,6 +525,7 @@ static int max77686_pmic_probe(struct platform_device *pdev)
 	if (!max77686)
 		return -ENOMEM;
 
+	max77686->dev = &pdev->dev;
 	config.dev = iodev->dev;
 	config.regmap = iodev->regmap;
 	config.driver_data = max77686;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 06/19 v3] regulator: lm363x: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (4 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 05/19 v3] regulator: max77686: " Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 07/19 v3] regulator: lp8788-ldo: " Linus Walleij
                   ` (12 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

Instead of passing a global GPIO number, pass a descriptor looked
up with the standard devm_gpiod_get_index_optional() call.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/lm363x-regulator.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/regulator/lm363x-regulator.c b/drivers/regulator/lm363x-regulator.c
index ce5f7d9ad475..b615a413ca9f 100644
--- a/drivers/regulator/lm363x-regulator.c
+++ b/drivers/regulator/lm363x-regulator.c
@@ -16,7 +16,7 @@
 #include <linux/mfd/ti-lmu-register.h>
 #include <linux/module.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/of_regulator.h>
@@ -219,7 +219,7 @@ static const struct regulator_desc lm363x_regulator_desc[] = {
 	},
 };
 
-static int lm363x_regulator_of_get_enable_gpio(struct device_node *np, int id)
+static struct gpio_desc *lm363x_regulator_of_get_enable_gpio(struct device *dev, int id)
 {
 	/*
 	 * Check LCM_EN1/2_GPIO is configured.
@@ -227,11 +227,11 @@ static int lm363x_regulator_of_get_enable_gpio(struct device_node *np, int id)
 	 */
 	switch (id) {
 	case LM3632_LDO_POS:
-		return of_get_named_gpio(np, "enable-gpios", 0);
+		return devm_gpiod_get_index_optional(dev, "enable", 0, GPIOD_OUT_LOW);
 	case LM3632_LDO_NEG:
-		return of_get_named_gpio(np, "enable-gpios", 1);
+		return devm_gpiod_get_index_optional(dev, "enable", 1, GPIOD_OUT_LOW);
 	default:
-		return -EINVAL;
+		return NULL;
 	}
 }
 
@@ -243,7 +243,8 @@ static int lm363x_regulator_probe(struct platform_device *pdev)
 	struct regulator_dev *rdev;
 	struct device *dev = &pdev->dev;
 	int id = pdev->id;
-	int ret, ena_gpio;
+	struct gpio_desc *gpiod;
+	int ret;
 
 	cfg.dev = dev;
 	cfg.regmap = regmap;
@@ -252,10 +253,9 @@ static int lm363x_regulator_probe(struct platform_device *pdev)
 	 * LM3632 LDOs can be controlled by external pin.
 	 * Register update is required if the pin is used.
 	 */
-	ena_gpio = lm363x_regulator_of_get_enable_gpio(dev->of_node, id);
-	if (gpio_is_valid(ena_gpio)) {
-		cfg.ena_gpio = ena_gpio;
-		cfg.ena_gpio_flags = GPIOF_OUT_INIT_LOW;
+	gpiod = lm363x_regulator_of_get_enable_gpio(dev, id);
+	if (gpiod) {
+		cfg.ena_gpiod = gpiod;
 
 		ret = regmap_update_bits(regmap, LM3632_REG_BIAS_CONFIG,
 					 LM3632_EXT_EN_MASK,
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 07/19 v3] regulator: lp8788-ldo: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (5 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 06/19 v3] regulator: lm363x: Pass descriptor instead of GPIO number Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 08/19 v3] regulator: max8952: " Linus Walleij
                   ` (11 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij, Milo Kim

Instead of passing a global GPIO number, pass a descriptor looked
up with the standard devm_gpiod_get_index_optional() call.

This driver has supported passing a LDO enable GPIO for years,
yet this facility has never been put to use in the upstream kernel.
If someone desires to put in place GPIO control for the LDOs,
this can be done by adding a GPIO descriptor table in the MFD
nexus in drivers/mfd/lp8788.c for the LDO device when spawning the
MFD children, or using a board file.

Cc: Milo Kim <milo.kim@ti.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
- Collect Lee's ACK.
---
 drivers/regulator/lp8788-ldo.c | 32 ++++++++++++++++----------------
 include/linux/mfd/lp8788.h     | 16 ----------------
 2 files changed, 16 insertions(+), 32 deletions(-)

diff --git a/drivers/regulator/lp8788-ldo.c b/drivers/regulator/lp8788-ldo.c
index cbfd35873575..f2347474a106 100644
--- a/drivers/regulator/lp8788-ldo.c
+++ b/drivers/regulator/lp8788-ldo.c
@@ -16,7 +16,7 @@
 #include <linux/err.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/mfd/lp8788.h>
 
 /* register address */
@@ -85,8 +85,6 @@
 #define LP8788_STARTUP_TIME_S		3
 
 #define ENABLE_TIME_USEC		32
-#define ENABLE				GPIOF_OUT_INIT_HIGH
-#define DISABLE				GPIOF_OUT_INIT_LOW
 
 enum lp8788_ldo_id {
 	DLDO1,
@@ -117,7 +115,7 @@ struct lp8788_ldo {
 	struct lp8788 *lp;
 	struct regulator_desc *desc;
 	struct regulator_dev *regulator;
-	struct lp8788_ldo_enable_pin *en_pin;
+	struct gpio_desc *ena_gpiod;
 };
 
 /* DLDO 1, 2, 3, 9 voltage table */
@@ -469,7 +467,6 @@ static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
 					enum lp8788_ldo_id id)
 {
 	struct lp8788 *lp = ldo->lp;
-	struct lp8788_platform_data *pdata = lp->pdata;
 	enum lp8788_ext_ldo_en_id enable_id;
 	u8 en_mask[] = {
 		[EN_ALDO1]   = LP8788_EN_SEL_ALDO1_M,
@@ -504,11 +501,18 @@ static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
 		return 0;
 	}
 
-	/* if no platform data for ldo pin, then set default enable mode */
-	if (!pdata || !pdata->ldo_pin || !pdata->ldo_pin[enable_id])
+	/* FIXME: check default mode for GPIO here: high or low? */
+	ldo->ena_gpiod = devm_gpiod_get_index_optional(&pdev->dev,
+						       "enable",
+						       enable_id,
+						       GPIOD_OUT_HIGH);
+	if (IS_ERR(ldo->ena_gpiod))
+		return PTR_ERR(ldo->ena_gpiod);
+
+	/* if no GPIO for ldo pin, then set default enable mode */
+	if (!ldo->ena_gpiod)
 		goto set_default_ldo_enable_mode;
 
-	ldo->en_pin = pdata->ldo_pin[enable_id];
 	return 0;
 
 set_default_ldo_enable_mode:
@@ -533,10 +537,8 @@ static int lp8788_dldo_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	if (ldo->en_pin) {
-		cfg.ena_gpio = ldo->en_pin->gpio;
-		cfg.ena_gpio_flags = ldo->en_pin->init_state;
-	}
+	if (ldo->ena_gpiod)
+		cfg.ena_gpiod = ldo->ena_gpiod;
 
 	cfg.dev = pdev->dev.parent;
 	cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL;
@@ -582,10 +584,8 @@ static int lp8788_aldo_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	if (ldo->en_pin) {
-		cfg.ena_gpio = ldo->en_pin->gpio;
-		cfg.ena_gpio_flags = ldo->en_pin->init_state;
-	}
+	if (ldo->ena_gpiod)
+		cfg.ena_gpiod = ldo->ena_gpiod;
 
 	cfg.dev = pdev->dev.parent;
 	cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL;
diff --git a/include/linux/mfd/lp8788.h b/include/linux/mfd/lp8788.h
index 786bf6679a28..2010e0de3e34 100644
--- a/include/linux/mfd/lp8788.h
+++ b/include/linux/mfd/lp8788.h
@@ -181,20 +181,6 @@ struct lp8788_buck2_dvs {
 	enum lp8788_dvs_sel vsel;
 };
 
-/*
- * struct lp8788_ldo_enable_pin
- *
- *   Basically, all LDOs are enabled through the I2C commands.
- *   But ALDO 1 ~ 5, 7, DLDO 7, 9, 11 can be enabled by external gpio pins.
- *
- * @gpio         : gpio number which is used for enabling ldos
- * @init_state   : initial gpio state (ex. GPIOF_OUT_INIT_LOW)
- */
-struct lp8788_ldo_enable_pin {
-	int gpio;
-	int init_state;
-};
-
 /*
  * struct lp8788_chg_param
  * @addr         : charging control register address (range : 0x11 ~ 0x1C)
@@ -288,7 +274,6 @@ struct lp8788_vib_platform_data {
  * @aldo_data    : regulator initial data for analog ldo
  * @buck1_dvs    : gpio configurations for buck1 dvs
  * @buck2_dvs    : gpio configurations for buck2 dvs
- * @ldo_pin      : gpio configurations for enabling LDOs
  * @chg_pdata    : platform data for charger driver
  * @alarm_sel    : rtc alarm selection (1 or 2)
  * @bl_pdata     : configurable data for backlight driver
@@ -306,7 +291,6 @@ struct lp8788_platform_data {
 	struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
 	struct lp8788_buck1_dvs *buck1_dvs;
 	struct lp8788_buck2_dvs *buck2_dvs;
-	struct lp8788_ldo_enable_pin *ldo_pin[EN_LDOS_MAX];
 
 	/* charger */
 	struct lp8788_charger_platform_data *chg_pdata;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 08/19 v3] regulator: max8952: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (6 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 07/19 v3] regulator: lp8788-ldo: " Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 09/19 v3] regulator: pfuze100: Delete reference to ena_gpio Linus Walleij
                   ` (10 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij, MyungJoo Ham

Instead of passing a global GPIO number for the enable GPIO, pass
a descriptor looked up with the standard devm_gpiod_get_optional()
call.

All users of this regulator use device tree so the transition is
pretty smooth.

Cc: MyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/max8952.c       | 18 +++++++++++++-----
 include/linux/regulator/max8952.h |  1 -
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/regulator/max8952.c b/drivers/regulator/max8952.c
index 1096546c05e9..f1e77ed5dfec 100644
--- a/drivers/regulator/max8952.c
+++ b/drivers/regulator/max8952.c
@@ -27,6 +27,7 @@
 #include <linux/regulator/driver.h>
 #include <linux/regulator/max8952.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/of_gpio.h>
@@ -148,7 +149,6 @@ static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
 
 	pd->gpio_vid0 = of_get_named_gpio(np, "max8952,vid-gpios", 0);
 	pd->gpio_vid1 = of_get_named_gpio(np, "max8952,vid-gpios", 1);
-	pd->gpio_en = of_get_named_gpio(np, "max8952,en-gpio", 0);
 
 	if (of_property_read_u32(np, "max8952,default-mode", &pd->default_mode))
 		dev_warn(dev, "Default mode not specified, assuming 0\n");
@@ -197,6 +197,8 @@ static int max8952_pmic_probe(struct i2c_client *client,
 	struct regulator_config config = { };
 	struct max8952_data *max8952;
 	struct regulator_dev *rdev;
+	struct gpio_desc *gpiod;
+	enum gpiod_flags gflags;
 
 	int ret = 0, err = 0;
 
@@ -224,11 +226,17 @@ static int max8952_pmic_probe(struct i2c_client *client,
 	config.driver_data = max8952;
 	config.of_node = client->dev.of_node;
 
-	config.ena_gpio = pdata->gpio_en;
-	if (client->dev.of_node)
-		config.ena_gpio_initialized = true;
 	if (pdata->reg_data->constraints.boot_on)
-		config.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
+		gflags = GPIOD_OUT_HIGH;
+	else
+		gflags = GPIOD_OUT_LOW;
+	gpiod = devm_gpiod_get_optional(&client->dev,
+					"max8952,en",
+					gflags);
+	if (IS_ERR(gpiod))
+		return PTR_ERR(gpiod);
+	if (gpiod)
+		config.ena_gpiod = gpiod;
 
 	rdev = devm_regulator_register(&client->dev, &regulator, &config);
 	if (IS_ERR(rdev)) {
diff --git a/include/linux/regulator/max8952.h b/include/linux/regulator/max8952.h
index 4dbb63a1d4ab..686c42c041b5 100644
--- a/include/linux/regulator/max8952.h
+++ b/include/linux/regulator/max8952.h
@@ -120,7 +120,6 @@ enum {
 struct max8952_platform_data {
 	int gpio_vid0;
 	int gpio_vid1;
-	int gpio_en;
 
 	u32 default_mode;
 	u32 dvs_mode[MAX8952_NUM_DVS_MODE]; /* MAX8952_DVS_MODEx_XXXXmV */
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 09/19 v3] regulator: pfuze100: Delete reference to ena_gpio
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (7 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 08/19 v3] regulator: max8952: " Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number Linus Walleij
                   ` (9 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

We now pass a GPIO descriptor to the core instead of a global
GPIO number, if this descriptor is NULL the GPIO line is not
used. Just delete the assignment of an invalid GPIO line.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/pfuze100-regulator.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c
index 63922a2167e5..f341d9614a77 100644
--- a/drivers/regulator/pfuze100-regulator.c
+++ b/drivers/regulator/pfuze100-regulator.c
@@ -648,7 +648,6 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
 		config.init_data = init_data;
 		config.driver_data = pfuze_chip;
 		config.of_node = match_of_node(i);
-		config.ena_gpio = -EINVAL;
 
 		pfuze_chip->regulators[i] =
 			devm_regulator_register(&client->dev, desc, &config);
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (8 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 09/19 v3] regulator: pfuze100: Delete reference to ena_gpio Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  9:42   ` Krzysztof Kozlowski
  2018-05-26 10:02   ` Mark Brown
  2018-05-14  8:06 ` [PATCH 11/19 v3] regulator: s5m8767: " Linus Walleij
                   ` (8 subsequent siblings)
  18 siblings, 2 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown
  Cc: linux-kernel, Linus Walleij, Krzysztof Kozlowski, Sangbeom Kim,
	Chanwoo Choi

Instead of passing a global GPIO number for the enable GPIO, pass
a descriptor looked up with the standard devm_gpiod_get_optional()
call.

This regulator supports passing platform data, but enable/sleep
regulators are looked up from the device tree exclusively, so
we can need not touch other files.

Cc: Krzysztof Kozlowski <krzk@kernel.org>
Cc: Sangbeom Kim <sbkim73@samsung.com>
Cc: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/s2mps11.c | 46 ++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
index 7726b874e539..9a1dca26362e 100644
--- a/drivers/regulator/s2mps11.c
+++ b/drivers/regulator/s2mps11.c
@@ -18,7 +18,7 @@
 
 #include <linux/bug.h>
 #include <linux/err.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -27,7 +27,6 @@
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/of_regulator.h>
-#include <linux/of_gpio.h>
 #include <linux/mfd/samsung/core.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps13.h>
@@ -57,7 +56,7 @@ struct s2mps11_info {
 	 * Array (size: number of regulators) with GPIO-s for external
 	 * sleep control.
 	 */
-	int *ext_control_gpio;
+	struct gpio_desc **ext_control_gpiod;
 };
 
 static int get_ramp_delay(int ramp_delay)
@@ -524,7 +523,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
 	case S2MPS14X:
 		if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
 			val = S2MPS14_ENABLE_SUSPEND;
-		else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
+		else if (s2mps11->ext_control_gpiod[rdev_get_id(rdev)])
 			val = S2MPS14_ENABLE_EXT_CONTROL;
 		else
 			val = rdev->desc->enable_mask;
@@ -818,7 +817,7 @@ static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
 static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 		struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
 {
-	int *gpio = s2mps11->ext_control_gpio;
+	struct gpio_desc **gpio = s2mps11->ext_control_gpiod;
 	unsigned int i;
 	unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,
 		S2MPS14_LDO12 };
@@ -829,11 +828,20 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 		if (!rdata[reg].init_data || !rdata[reg].of_node)
 			continue;
 
-		gpio[reg] = of_get_named_gpio(rdata[reg].of_node,
-				"samsung,ext-control-gpios", 0);
-		if (gpio_is_valid(gpio[reg]))
-			dev_dbg(&pdev->dev, "Using GPIO %d for ext-control over %d/%s\n",
-					gpio[reg], reg, rdata[reg].name);
+		gpio[reg] = devm_gpiod_get_from_of_node(&pdev->dev,
+							rdata[reg].of_node,
+							"samsung,ext-control-gpios",
+							0,
+							GPIOD_OUT_HIGH,
+							"s2mps11-LDO");
+		if (IS_ERR(gpio[reg])) {
+			dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
+				reg, rdata[reg].name);
+			continue;
+		}
+		if (gpio[reg])
+			dev_dbg(&pdev->dev, "Using GPIO for ext-control over %d/%s\n",
+				reg, rdata[reg].name);
 	}
 }
 
@@ -1139,17 +1147,11 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	s2mps11->ext_control_gpio = devm_kmalloc(&pdev->dev,
-			sizeof(*s2mps11->ext_control_gpio) * rdev_num,
+	s2mps11->ext_control_gpiod = devm_kmalloc(&pdev->dev,
+			sizeof(*s2mps11->ext_control_gpiod) * rdev_num,
 			GFP_KERNEL);
-	if (!s2mps11->ext_control_gpio)
+	if (!s2mps11->ext_control_gpiod)
 		return -ENOMEM;
-	/*
-	 * 0 is a valid GPIO so initialize all GPIO-s to negative value
-	 * to indicate that external control won't be used for this regulator.
-	 */
-	for (i = 0; i < rdev_num; i++)
-		s2mps11->ext_control_gpio[i] = -EINVAL;
 
 	if (!iodev->dev->of_node) {
 		if (iodev->pdata) {
@@ -1179,8 +1181,6 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
 	config.dev = &pdev->dev;
 	config.regmap = iodev->regmap_pmic;
 	config.driver_data = s2mps11;
-	config.ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
-	config.ena_gpio_initialized = true;
 	for (i = 0; i < rdev_num; i++) {
 		struct regulator_dev *regulator;
 
@@ -1191,7 +1191,7 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
 			config.init_data = rdata[i].init_data;
 			config.of_node = rdata[i].of_node;
 		}
-		config.ena_gpio = s2mps11->ext_control_gpio[i];
+		config.ena_gpiod = s2mps11->ext_control_gpiod[i];
 
 		regulator = devm_regulator_register(&pdev->dev,
 						&regulators[i], &config);
@@ -1202,7 +1202,7 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
 			goto out;
 		}
 
-		if (gpio_is_valid(s2mps11->ext_control_gpio[i])) {
+		if (s2mps11->ext_control_gpiod[i]) {
 			ret = s2mps14_pmic_enable_ext_control(s2mps11,
 					regulator);
 			if (ret < 0) {
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 11/19 v3] regulator: s5m8767: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (9 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 12/19 v3] regulator: tps65090: " Linus Walleij
                   ` (7 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

Instead of passing a global GPIO number for the enable GPIO, pass
a descriptor looked up from the device tree node for the
regulator.

This regulator supports passing platform data, but enable/sleep
regulators are looked up from the device tree exclusively, so
we can need not touch other files.

Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes
- Collect Lee's ACK.
---
 drivers/regulator/s5m8767.c      | 26 +++++++++++++++-----------
 include/linux/mfd/samsung/core.h |  4 +++-
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c
index 4836947e1521..b8443a360646 100644
--- a/drivers/regulator/s5m8767.c
+++ b/drivers/regulator/s5m8767.c
@@ -13,6 +13,7 @@
 
 #include <linux/err.h>
 #include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
@@ -459,15 +460,14 @@ static void s5m8767_regulator_config_ext_control(struct s5m8767_info *s5m8767,
 		return;
 	}
 
-	if (!gpio_is_valid(rdata->ext_control_gpio)) {
+	if (!rdata->ext_control_gpiod) {
 		dev_warn(s5m8767->dev,
 				"ext-control for %s: GPIO not valid, ignoring\n",
-				rdata->reg_node->name);
+			 rdata->reg_node->name);
 		return;
 	}
 
-	config->ena_gpio = rdata->ext_control_gpio;
-	config->ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
+	config->ena_gpiod = rdata->ext_control_gpiod;
 }
 
 /*
@@ -577,8 +577,14 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev,
 			continue;
 		}
 
-		rdata->ext_control_gpio = of_get_named_gpio(reg_np,
-			"s5m8767,pmic-ext-control-gpios", 0);
+		rdata->ext_control_gpiod = devm_gpiod_get_from_of_node(&pdev->dev,
+								       reg_np,
+								       "s5m8767,pmic-ext-control-gpios",
+								       0,
+								       GPIOD_OUT_HIGH,
+								       "s5m8767");
+		if (IS_ERR(rdata->ext_control_gpiod))
+			return PTR_ERR(rdata->ext_control_gpiod);
 
 		rdata->id = i;
 		rdata->initdata = of_get_regulator_init_data(
@@ -954,10 +960,8 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
 		config.driver_data = s5m8767;
 		config.regmap = iodev->regmap_pmic;
 		config.of_node = pdata->regulators[i].reg_node;
-		config.ena_gpio = -EINVAL;
-		config.ena_gpio_flags = 0;
-		config.ena_gpio_initialized = true;
-		if (gpio_is_valid(pdata->regulators[i].ext_control_gpio))
+		config.ena_gpiod = NULL;
+		if (pdata->regulators[i].ext_control_gpiod)
 			s5m8767_regulator_config_ext_control(s5m8767,
 					&pdata->regulators[i], &config);
 
@@ -970,7 +974,7 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
 			return ret;
 		}
 
-		if (gpio_is_valid(pdata->regulators[i].ext_control_gpio)) {
+		if (pdata->regulators[i].ext_control_gpiod) {
 			ret = s5m8767_enable_ext_control(s5m8767, rdev);
 			if (ret < 0) {
 				dev_err(s5m8767->dev,
diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h
index 5a23dd4df432..28f4ae76271d 100644
--- a/include/linux/mfd/samsung/core.h
+++ b/include/linux/mfd/samsung/core.h
@@ -39,6 +39,8 @@
 #define STEP_12_5_MV		12500
 #define STEP_6_25_MV		6250
 
+struct gpio_desc;
+
 enum sec_device_type {
 	S5M8751X,
 	S5M8763X,
@@ -151,7 +153,7 @@ struct sec_regulator_data {
 	int				id;
 	struct regulator_init_data	*initdata;
 	struct device_node		*reg_node;
-	int				ext_control_gpio;
+	struct gpio_desc		*ext_control_gpiod;
 };
 
 /*
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 12/19 v3] regulator: tps65090: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (10 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 11/19 v3] regulator: s5m8767: " Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 13/19 v3] regulator: wm8994: " Linus Walleij
                   ` (6 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

Instead of passing a global GPIO number for the enable GPIO, pass
a descriptor looked up from the device tree node for the
regulator.

This regulator supports passing platform data, but enable/sleep
regulators are looked up from the device tree exclusively, so
we can need not touch other files.

Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
- Collect Lee's ACK.
---
 drivers/regulator/tps65090-regulator.c | 50 ++++++++++++--------------
 include/linux/mfd/tps65090.h           |  8 +++--
 2 files changed, 28 insertions(+), 30 deletions(-)

diff --git a/drivers/regulator/tps65090-regulator.c b/drivers/regulator/tps65090-regulator.c
index 395f35dc8cdb..2d398fa3b720 100644
--- a/drivers/regulator/tps65090-regulator.c
+++ b/drivers/regulator/tps65090-regulator.c
@@ -19,8 +19,8 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/of.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/platform_device.h>
@@ -300,26 +300,6 @@ static int tps65090_regulator_disable_ext_control(
 	return tps65090_config_ext_control(ri, false);
 }
 
-static void tps65090_configure_regulator_config(
-		struct tps65090_regulator_plat_data *tps_pdata,
-		struct regulator_config *config)
-{
-	if (gpio_is_valid(tps_pdata->gpio)) {
-		int gpio_flag = GPIOF_OUT_INIT_LOW;
-
-		if (tps_pdata->reg_init_data->constraints.always_on ||
-				tps_pdata->reg_init_data->constraints.boot_on)
-			gpio_flag = GPIOF_OUT_INIT_HIGH;
-
-		config->ena_gpio = tps_pdata->gpio;
-		config->ena_gpio_initialized = true;
-		config->ena_gpio_flags = gpio_flag;
-	} else {
-		config->ena_gpio = -EINVAL;
-		config->ena_gpio_initialized = false;
-	}
-}
-
 #ifdef CONFIG_OF
 static struct of_regulator_match tps65090_matches[] = {
 	{ .name = "dcdc1", },
@@ -385,9 +365,26 @@ static struct tps65090_platform_data *tps65090_parse_dt_reg_data(
 		rpdata->enable_ext_control = of_property_read_bool(
 					tps65090_matches[idx].of_node,
 					"ti,enable-ext-control");
-		if (rpdata->enable_ext_control)
-			rpdata->gpio = of_get_named_gpio(np,
-					"dcdc-ext-control-gpios", 0);
+		if (rpdata->enable_ext_control) {
+			enum gpiod_flags gflags;
+
+			if (ri_data->constraints.always_on ||
+			    ri_data->constraints.boot_on)
+				gflags = GPIOD_OUT_HIGH;
+			else
+				gflags = GPIOD_OUT_LOW;
+
+			rpdata->gpiod = devm_gpiod_get_from_of_node(&pdev->dev,
+								    tps65090_matches[idx].of_node,
+								    "dcdc-ext-control-gpios", 0,
+								    gflags,
+								    "tps65090");
+			if (IS_ERR(rpdata->gpiod))
+				return ERR_CAST(rpdata->gpiod);
+			if (!rpdata->gpiod)
+				dev_err(&pdev->dev,
+					"could not find DCDC external control GPIO\n");
+		}
 
 		if (of_property_read_u32(tps65090_matches[idx].of_node,
 					 "ti,overcurrent-wait",
@@ -455,8 +452,7 @@ static int tps65090_regulator_probe(struct platform_device *pdev)
 		 */
 		if (tps_pdata && is_dcdc(num) && tps_pdata->reg_init_data) {
 			if (tps_pdata->enable_ext_control) {
-				tps65090_configure_regulator_config(
-						tps_pdata, &config);
+				config.ena_gpiod = tps_pdata->gpiod;
 				ri->desc->ops = &tps65090_ext_control_ops;
 			} else {
 				ret = tps65090_regulator_disable_ext_control(
diff --git a/include/linux/mfd/tps65090.h b/include/linux/mfd/tps65090.h
index 67d144b3b8f9..f05bf4a146e2 100644
--- a/include/linux/mfd/tps65090.h
+++ b/include/linux/mfd/tps65090.h
@@ -83,6 +83,8 @@ enum {
 #define TPS65090_MAX_REG	TPS65090_REG_AD_OUT2
 #define TPS65090_NUM_REGS	(TPS65090_MAX_REG + 1)
 
+struct gpio_desc;
+
 struct tps65090 {
 	struct device		*dev;
 	struct regmap		*rmap;
@@ -95,8 +97,8 @@ struct tps65090 {
  * @reg_init_data: The regulator init data.
  * @enable_ext_control: Enable extrenal control or not. Only available for
  *     DCDC1, DCDC2 and DCDC3.
- * @gpio: Gpio number if external control is enabled and controlled through
- *     gpio.
+ * @gpiod: Gpio descriptor if external control is enabled and controlled through
+ *     gpio
  * @overcurrent_wait_valid: True if the overcurrent_wait should be applied.
  * @overcurrent_wait: Value to set as the overcurrent wait time.  This is the
  *     actual bitfield value, not a time in ms (valid value are 0 - 3).
@@ -104,7 +106,7 @@ struct tps65090 {
 struct tps65090_regulator_plat_data {
 	struct regulator_init_data *reg_init_data;
 	bool enable_ext_control;
-	int gpio;
+	struct gpio_desc *gpiod;
 	bool overcurrent_wait_valid;
 	int overcurrent_wait;
 };
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 13/19 v3] regulator: wm8994: Pass descriptor instead of GPIO number
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (11 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 12/19 v3] regulator: tps65090: " Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 14/19 v3] regulator: core: Only support passing enable GPIO descriptors Linus Walleij
                   ` (5 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij, patches

Instead of passing a global GPIO number for the enable GPIO, pass
a descriptor looked up from the device tree node or the board file
decriptor table for the regulator.

There is a single board file passing the GPIOs for LDO1 and LDO2
through platform data, so augment this to pass descriptors
associated with the i2c device as well.

The special GPIO enable DT property for the enable GPIO is
nonstandard but this was accomodated in
commit 6a537d48461deacc57c07ed86d9915e5aa4b3539
"gpio: of: Support regulator nonstandard GPIO properties".

Cc: patches@opensource.cirrus.com
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Collect Charles' ACK.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
- Collect Lee's ACK.
---
 arch/arm/mach-s3c64xx/mach-crag6410-module.c | 17 +++++++++++++++--
 drivers/mfd/wm8994-core.c                    |  9 ---------
 drivers/regulator/wm8994-regulator.c         | 19 +++++++++++--------
 include/linux/mfd/wm8994/pdata.h             |  3 ---
 4 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
index 5aa472892465..76c4855a03bc 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
@@ -194,8 +194,8 @@ static struct wm8994_pdata wm8994_pdata = {
 		0x3,          /* IRQ out, active high, CMOS */
 	},
 	.ldo = {
-		 { .enable = S3C64XX_GPN(6), .init_data = &wm8994_ldo1, },
-		 { .enable = S3C64XX_GPN(4), .init_data = &wm8994_ldo2, },
+		 { .init_data = &wm8994_ldo1, },
+		 { .init_data = &wm8994_ldo2, },
 	},
 };
 
@@ -203,6 +203,18 @@ static const struct i2c_board_info wm1277_devs[] = {
 	{ I2C_BOARD_INFO("wm8958", 0x1a),  /* WM8958 is the superset */
 	  .platform_data = &wm8994_pdata,
 	  .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
+	  .dev_name = "wm8958",
+	},
+};
+
+static struct gpiod_lookup_table wm8994_gpiod_table = {
+	.dev_id = "i2c-wm8958", /* I2C device name */
+	.table = {
+		GPIO_LOOKUP("GPION", 6,
+			    "wlf,ldo1ena", GPIO_ACTIVE_HIGH),
+		GPIO_LOOKUP("GPION", 4,
+			    "wlf,ldo2ena", GPIO_ACTIVE_HIGH),
+		{ },
 	},
 };
 
@@ -381,6 +393,7 @@ static int wlf_gf_module_probe(struct i2c_client *i2c,
 
 	gpiod_add_lookup_table(&wm5102_reva_gpiod_table);
 	gpiod_add_lookup_table(&wm5102_gpiod_table);
+	gpiod_add_lookup_table(&wm8994_gpiod_table);
 
 	if (i < ARRAY_SIZE(gf_mods)) {
 		dev_info(&i2c->dev, "%s revision %d\n",
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c
index 953d0790ffd5..c409464231f6 100644
--- a/drivers/mfd/wm8994-core.c
+++ b/drivers/mfd/wm8994-core.c
@@ -21,7 +21,6 @@
 #include <linux/mfd/core.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
-#include <linux/of_gpio.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
@@ -302,14 +301,6 @@ static int wm8994_set_pdata_from_of(struct wm8994 *wm8994)
 	if (of_find_property(np, "wlf,ldoena-always-driven", NULL))
 		pdata->lineout2fb = true;
 
-	pdata->ldo[0].enable = of_get_named_gpio(np, "wlf,ldo1ena", 0);
-	if (pdata->ldo[0].enable < 0)
-		pdata->ldo[0].enable = 0;
-
-	pdata->ldo[1].enable = of_get_named_gpio(np, "wlf,ldo2ena", 0);
-	if (pdata->ldo[1].enable < 0)
-		pdata->ldo[1].enable = 0;
-
 	return 0;
 }
 #else
diff --git a/drivers/regulator/wm8994-regulator.c b/drivers/regulator/wm8994-regulator.c
index 7a4ce6df4f22..d3a5f48119c2 100644
--- a/drivers/regulator/wm8994-regulator.c
+++ b/drivers/regulator/wm8994-regulator.c
@@ -19,7 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 
 #include <linux/mfd/wm8994/core.h>
@@ -129,6 +129,7 @@ static int wm8994_ldo_probe(struct platform_device *pdev)
 	int id = pdev->id % ARRAY_SIZE(pdata->ldo);
 	struct regulator_config config = { };
 	struct wm8994_ldo *ldo;
+	struct gpio_desc *gpiod;
 	int ret;
 
 	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
@@ -145,12 +146,14 @@ static int wm8994_ldo_probe(struct platform_device *pdev)
 	config.driver_data = ldo;
 	config.regmap = wm8994->regmap;
 	config.init_data = &ldo->init_data;
-	if (pdata) {
-		config.ena_gpio = pdata->ldo[id].enable;
-	} else if (wm8994->dev->of_node) {
-		config.ena_gpio = wm8994->pdata.ldo[id].enable;
-		config.ena_gpio_initialized = true;
-	}
+
+	/* Look up LDO enable GPIO from the parent device node */
+	gpiod = devm_gpiod_get_optional(pdev->dev.parent,
+					id ? "wlf,ldo2ena" : "wlf,ldo1ena",
+					GPIOD_OUT_LOW);
+	if (IS_ERR(gpiod))
+		return PTR_ERR(gpiod);
+	config.ena_gpiod = gpiod;
 
 	/* Use default constraints if none set up */
 	if (!pdata || !pdata->ldo[id].init_data || wm8994->dev->of_node) {
@@ -159,7 +162,7 @@ static int wm8994_ldo_probe(struct platform_device *pdev)
 
 		ldo->init_data = wm8994_ldo_default[id];
 		ldo->init_data.consumer_supplies = &ldo->supply;
-		if (!config.ena_gpio)
+		if (!gpiod)
 			ldo->init_data.constraints.valid_ops_mask = 0;
 	} else {
 		ldo->init_data = *pdata->ldo[id].init_data;
diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h
index 90c60524a496..fca67bd194e2 100644
--- a/include/linux/mfd/wm8994/pdata.h
+++ b/include/linux/mfd/wm8994/pdata.h
@@ -20,9 +20,6 @@
 #define WM8994_NUM_AIF   3
 
 struct wm8994_ldo_pdata {
-	/** GPIOs to enable regulator, 0 or less if not available */
-	int enable;
-
 	const struct regulator_init_data *init_data;
 };
 
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 14/19 v3] regulator: core: Only support passing enable GPIO descriptors
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (12 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 13/19 v3] regulator: wm8994: " Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib Linus Walleij
                   ` (4 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

Now that we changed all providers to pass descriptors into the core
for enable GPIOs instead of a global GPIO number, delete the support
for passing GPIO numbers in, and we get a cleanup and size reduction
in the core, and from a GPIO point of view we use the modern, cleaner
interface.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/core.c         | 32 ++++++--------------------------
 include/linux/regulator/driver.h | 10 +---------
 2 files changed, 7 insertions(+), 35 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d4803460a557..8d56f9b906b0 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -23,7 +23,6 @@
 #include <linux/mutex.h>
 #include <linux/suspend.h>
 #include <linux/delay.h>
-#include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
 #include <linux/of.h>
 #include <linux/regmap.h>
@@ -1935,35 +1934,19 @@ static int regulator_ena_gpio_request(struct regulator_dev *rdev,
 {
 	struct regulator_enable_gpio *pin;
 	struct gpio_desc *gpiod;
-	int ret;
 
-	if (config->ena_gpiod)
-		gpiod = config->ena_gpiod;
-	else
-		gpiod = gpio_to_desc(config->ena_gpio);
+	gpiod = config->ena_gpiod;
 
 	list_for_each_entry(pin, &regulator_ena_gpio_list, list) {
 		if (pin->gpiod == gpiod) {
-			rdev_dbg(rdev, "GPIO %d is already used\n",
-				config->ena_gpio);
+			rdev_dbg(rdev, "GPIO is already used\n");
 			goto update_ena_gpio_to_rdev;
 		}
 	}
 
-	if (!config->ena_gpiod) {
-		ret = gpio_request_one(config->ena_gpio,
-				       GPIOF_DIR_OUT | config->ena_gpio_flags,
-				       rdev_get_name(rdev));
-		if (ret)
-			return ret;
-	}
-
 	pin = kzalloc(sizeof(struct regulator_enable_gpio), GFP_KERNEL);
-	if (pin == NULL) {
-		if (!config->ena_gpiod)
-			gpio_free(config->ena_gpio);
+	if (pin == NULL)
 		return -ENOMEM;
-	}
 
 	pin->gpiod = gpiod;
 	pin->ena_gpio_invert = config->ena_gpio_invert;
@@ -1987,7 +1970,6 @@ static void regulator_ena_gpio_free(struct regulator_dev *rdev)
 		if (pin->gpiod == rdev->ena_pin->gpiod) {
 			if (pin->request_count <= 1) {
 				pin->request_count = 0;
-				gpiod_put(pin->gpiod);
 				list_del(&pin->list);
 				kfree(pin);
 				rdev->ena_pin = NULL;
@@ -4160,15 +4142,13 @@ regulator_register(const struct regulator_desc *regulator_desc,
 			goto clean;
 	}
 
-	if (config->ena_gpiod ||
-	    ((config->ena_gpio || config->ena_gpio_initialized) &&
-	     gpio_is_valid(config->ena_gpio))) {
+	if (config->ena_gpiod) {
 		mutex_lock(&regulator_list_mutex);
 		ret = regulator_ena_gpio_request(rdev, config);
 		mutex_unlock(&regulator_list_mutex);
 		if (ret != 0) {
-			rdev_err(rdev, "Failed to request enable GPIO%d: %d\n",
-				 config->ena_gpio, ret);
+			rdev_err(rdev, "Failed to request enable GPIO: %d\n",
+				 ret);
 			goto clean;
 		}
 	}
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
index 4fc96cb8e5d7..8900c230c899 100644
--- a/include/linux/regulator/driver.h
+++ b/include/linux/regulator/driver.h
@@ -384,13 +384,8 @@ struct regulator_desc {
  *           NULL).
  * @regmap: regmap to use for core regmap helpers if dev_get_regmap() is
  *          insufficient.
- * @ena_gpio_initialized: GPIO controlling regulator enable was properly
- *                        initialized, meaning that >= 0 is a valid gpio
- *                        identifier and < 0 is a non existent gpio.
- * @ena_gpio: GPIO controlling regulator enable.
- * @ena_gpiod: GPIO descriptor controlling regulator enable.
+ * @ena_gpiod: GPIO controlling regulator enable.
  * @ena_gpio_invert: Sense for GPIO enable control.
- * @ena_gpio_flags: Flags to use when calling gpio_request_one()
  */
 struct regulator_config {
 	struct device *dev;
@@ -399,11 +394,8 @@ struct regulator_config {
 	struct device_node *of_node;
 	struct regmap *regmap;
 
-	bool ena_gpio_initialized;
-	int ena_gpio;
 	struct gpio_desc *ena_gpiod;
 	unsigned int ena_gpio_invert:1;
-	unsigned int ena_gpio_flags;
 };
 
 /*
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (13 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 14/19 v3] regulator: core: Only support passing enable GPIO descriptors Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-29 14:54   ` Mark Brown
  2018-05-14  8:06 ` [PATCH 16/19 v3] regulator: fixed/gpio: Update device tree bindings Linus Walleij
                   ` (3 subsequent siblings)
  18 siblings, 1 reply; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown
  Cc: linux-kernel, Linus Walleij, Alexander Shiyan, Haojian Zhuang,
	Aaro Koskinen, Tony Lindgren, Mike Rapoport, Robert Jarzmik,
	Philipp Zabel, Daniel Mack, Marc Zyngier, Geert Uytterhoeven,
	Russell King

This pushes the handling of inversion semantics and open drain
settings to the GPIO descriptor and gpiolib. All affected board
files are also augmented.

This is especiallt nice since we don't have to have any
confusing flags passed around to the left and right littering
the fixed and GPIO regulator drivers and the regulator core.
It is all just very straight-forward: the core asks the GPIO
line to be asserted or deasserted and gpiolib deals with the
rest depending on how the platform is configured: if the line
is active low, it deals with that, if the line is open drain,
it deals with that too.

Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer
Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch series
- Cover the new user added in sa1100
---
 arch/arm/mach-imx/mach-mx21ads.c              |  1 -
 arch/arm/mach-imx/mach-mx27ads.c              |  2 +-
 arch/arm/mach-mmp/brownstone.c                |  1 -
 arch/arm/mach-omap1/board-ams-delta.c         |  1 -
 arch/arm/mach-omap2/pdata-quirks.c            |  1 -
 arch/arm/mach-pxa/em-x270.c                   |  1 -
 arch/arm/mach-pxa/ezx.c                       |  3 +-
 arch/arm/mach-pxa/hx4700.c                    |  3 +-
 arch/arm/mach-pxa/magician.c                  |  3 +-
 arch/arm/mach-pxa/raumfeld.c                  |  1 -
 arch/arm/mach-pxa/zeus.c                      |  3 +-
 arch/arm/mach-sa1100/assabet.c                |  1 -
 arch/sh/boards/mach-ecovec24/setup.c          |  2 --
 .../intel-mid/device_libs/platform_bcm43xx.c  |  1 -
 drivers/regulator/core.c                      |  8 ++---
 drivers/regulator/da9055-regulator.c          |  1 -
 drivers/regulator/fixed.c                     | 30 +++++--------------
 drivers/regulator/gpio-regulator.c            | 24 ++++++---------
 include/linux/regulator/fixed.h               | 10 -------
 include/linux/regulator/gpio-regulator.h      |  3 --
 20 files changed, 24 insertions(+), 76 deletions(-)

diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c
index 5d3b6b4fe6db..8c4a4920468a 100644
--- a/arch/arm/mach-imx/mach-mx21ads.c
+++ b/arch/arm/mach-imx/mach-mx21ads.c
@@ -205,7 +205,6 @@ static struct regulator_init_data mx21ads_lcd_regulator_init_data = {
 static struct fixed_voltage_config mx21ads_lcd_regulator_pdata = {
 	.supply_name	= "LCD",
 	.microvolts	= 3300000,
-	.enable_high	= 1,
 	.init_data	= &mx21ads_lcd_regulator_init_data,
 };
 
diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c
index 0fdb88db0cbd..08a7e217b9e6 100644
--- a/arch/arm/mach-imx/mach-mx27ads.c
+++ b/arch/arm/mach-imx/mach-mx27ads.c
@@ -237,7 +237,7 @@ static struct fixed_voltage_config mx27ads_lcd_regulator_pdata = {
 static struct gpiod_lookup_table mx27ads_lcd_regulator_gpiod_table = {
 	.dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what we get */
 	.table = {
-		GPIO_LOOKUP("LCD", 0, "enable", GPIO_ACTIVE_HIGH),
+		GPIO_LOOKUP("LCD", 0, "enable", GPIO_ACTIVE_LOW),
 		{ },
 	},
 };
diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c
index 563b5a278d65..502343b32c7f 100644
--- a/arch/arm/mach-mmp/brownstone.c
+++ b/arch/arm/mach-mmp/brownstone.c
@@ -149,7 +149,6 @@ static struct regulator_init_data brownstone_v_5vp_data = {
 static struct fixed_voltage_config brownstone_v_5vp = {
 	.supply_name		= "v_5vp",
 	.microvolts		= 5000000,
-	.enable_high		= 1,
 	.enabled_at_boot	= 1,
 	.init_data		= &brownstone_v_5vp_data,
 };
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index 759fa18f6ab4..22e94da4af85 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -275,7 +275,6 @@ static struct fixed_voltage_config modem_nreset_config = {
 	.supply_name		= "modem_nreset",
 	.microvolts		= 3300000,
 	.startup_delay		= 25000,
-	.enable_high		= 1,
 	.enabled_at_boot	= 1,
 	.init_data		= &modem_nreset_data,
 };
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
index 7d1447204fb8..1c740c7e7c55 100644
--- a/arch/arm/mach-omap2/pdata-quirks.c
+++ b/arch/arm/mach-omap2/pdata-quirks.c
@@ -332,7 +332,6 @@ static struct fixed_voltage_config pandora_vwlan = {
 	.supply_name		= "vwlan",
 	.microvolts		= 1800000, /* 1.8V */
 	.startup_delay		= 50000, /* 50ms */
-	.enable_high		= 1,
 	.init_data		= &pandora_vmmc3,
 };
 
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 6d7d93981098..8d9ec158f118 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -987,7 +987,6 @@ static struct fixed_voltage_config camera_dummy_config = {
 	.supply_name		= "camera_vdd",
 	.input_supply		= "vcc cam",
 	.microvolts		= 2800000,
-	.enable_high		= 0,
 	.init_data		= &camera_dummy_initdata,
 };
 
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
index 2b4bd6d94855..13ebdfd697cc 100644
--- a/arch/arm/mach-pxa/ezx.c
+++ b/arch/arm/mach-pxa/ezx.c
@@ -714,7 +714,6 @@ static struct regulator_init_data camera_regulator_initdata = {
 static struct fixed_voltage_config camera_regulator_config = {
 	.supply_name		= "camera_vdd",
 	.microvolts		= 2800000,
-	.enable_high		= 0,
 	.init_data		= &camera_regulator_initdata,
 };
 
@@ -730,7 +729,7 @@ static struct gpiod_lookup_table camera_supply_gpiod_table = {
 	.dev_id = "reg-fixed-voltage.1",
 	.table = {
 		GPIO_LOOKUP("gpio-pxa", GPIO50_nCAM_EN,
-			    "enable", GPIO_ACTIVE_HIGH),
+			    "enable", GPIO_ACTIVE_LOW),
 		{ },
 	},
 };
diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
index 6717a10180eb..05148016c620 100644
--- a/arch/arm/mach-pxa/hx4700.c
+++ b/arch/arm/mach-pxa/hx4700.c
@@ -712,7 +712,6 @@ static struct gpio_regulator_state bq24022_states[] = {
 static struct gpio_regulator_config bq24022_info = {
 	.supply_name = "bq24022",
 
-	.enable_high = 0,
 	.enabled_at_boot = 0,
 
 	.gpios = bq24022_gpios,
@@ -737,7 +736,7 @@ static struct gpiod_lookup_table bq24022_gpiod_table = {
 	.dev_id = "gpio-regulator",
 	.table = {
 		GPIO_LOOKUP("gpio-pxa", GPIO72_HX4700_BQ24022_nCHARGE_EN,
-			    "enable", GPIO_ACTIVE_HIGH),
+			    "enable", GPIO_ACTIVE_LOW),
 		{ },
 	},
 };
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
index 9a5bda3ea194..fab63c52d50e 100644
--- a/arch/arm/mach-pxa/magician.c
+++ b/arch/arm/mach-pxa/magician.c
@@ -657,7 +657,6 @@ static struct gpio_regulator_state bq24022_states[] = {
 static struct gpio_regulator_config bq24022_info = {
 	.supply_name		= "bq24022",
 
-	.enable_high		= 0,
 	.enabled_at_boot	= 1,
 
 	.gpios			= bq24022_gpios,
@@ -682,7 +681,7 @@ static struct gpiod_lookup_table bq24022_gpiod_table = {
 	.dev_id = "gpio-regulator",
 	.table = {
 		GPIO_LOOKUP("gpio-pxa", GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
-			    "enable", GPIO_ACTIVE_HIGH),
+			    "enable", GPIO_ACTIVE_LOW),
 		{ },
 	},
 };
diff --git a/arch/arm/mach-pxa/raumfeld.c b/arch/arm/mach-pxa/raumfeld.c
index ee766e4ebddc..30ea27b85bb0 100644
--- a/arch/arm/mach-pxa/raumfeld.c
+++ b/arch/arm/mach-pxa/raumfeld.c
@@ -886,7 +886,6 @@ static struct regulator_init_data audio_va_initdata = {
 static struct fixed_voltage_config audio_va_config = {
 	.supply_name		= "audio_va",
 	.microvolts		= 5000000,
-	.enable_high		= 1,
 	.enabled_at_boot	= 0,
 	.init_data		= &audio_va_initdata,
 };
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
index 58e05afcece0..428c2db6818a 100644
--- a/arch/arm/mach-pxa/zeus.c
+++ b/arch/arm/mach-pxa/zeus.c
@@ -426,7 +426,7 @@ static struct gpiod_lookup_table can_regulator_gpiod_table = {
 	.dev_id = "reg-fixed-voltage.0",
 	.table = {
 		GPIO_LOOKUP("gpio-pxa", ZEUS_CAN_SHDN_GPIO,
-			    "enable", GPIO_ACTIVE_HIGH),
+			    "enable", GPIO_ACTIVE_LOW),
 		{ },
 	},
 };
@@ -547,7 +547,6 @@ static struct regulator_init_data zeus_ohci_regulator_data = {
 static struct fixed_voltage_config zeus_ohci_regulator_config = {
 	.supply_name		= "vbus2",
 	.microvolts		= 5000000, /* 5.0V */
-	.enable_high		= 1,
 	.startup_delay		= 0,
 	.init_data		= &zeus_ohci_regulator_data,
 };
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c
index dbb53c520165..705196a4b66f 100644
--- a/arch/arm/mach-sa1100/assabet.c
+++ b/arch/arm/mach-sa1100/assabet.c
@@ -468,7 +468,6 @@ static struct regulator_consumer_supply assabet_cf_vcc_consumers[] = {
 static struct fixed_voltage_config assabet_cf_vcc_pdata __initdata = {
 	.supply_name = "cf-power",
 	.microvolts = 3300000,
-	.enable_high = 1,
 };
 
 static struct gpiod_lookup_table assabet_cf_vcc_gpio_table = {
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c
index c296b5c399b7..6b9542616447 100644
--- a/arch/sh/boards/mach-ecovec24/setup.c
+++ b/arch/sh/boards/mach-ecovec24/setup.c
@@ -633,7 +633,6 @@ static struct regulator_init_data cn12_power_init_data = {
 static struct fixed_voltage_config cn12_power_info = {
 	.supply_name = "CN12 SD/MMC Vdd",
 	.microvolts = 3300000,
-	.enable_high = 1,
 	.init_data = &cn12_power_init_data,
 };
 
@@ -674,7 +673,6 @@ static struct regulator_init_data sdhi0_power_init_data = {
 static struct fixed_voltage_config sdhi0_power_info = {
 	.supply_name = "CN11 SD/MMC Vdd",
 	.microvolts = 3300000,
-	.enable_high = 1,
 	.init_data = &sdhi0_power_init_data,
 };
 
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c b/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
index fc77d69e51d7..8a579aad0b27 100644
--- a/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
+++ b/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
@@ -44,7 +44,6 @@ static struct fixed_voltage_config bcm43xx_vmmc = {
 	 */
 	.microvolts		= 2000000,		/* 1.8V */
 	.startup_delay		= 250 * 1000,		/* 250ms */
-	.enable_high		= 1,			/* active high */
 	.enabled_at_boot	= 0,			/* disabled at boot */
 	.init_data		= &bcm43xx_vmmc_data,
 };
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 8d56f9b906b0..f3050eaa0a7e 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -79,7 +79,6 @@ struct regulator_enable_gpio {
 	struct gpio_desc *gpiod;
 	u32 enable_count;	/* a number of enabled shared GPIO */
 	u32 request_count;	/* a number of requested shared GPIO */
-	unsigned int ena_gpio_invert:1;
 };
 
 /*
@@ -1949,7 +1948,6 @@ static int regulator_ena_gpio_request(struct regulator_dev *rdev,
 		return -ENOMEM;
 
 	pin->gpiod = gpiod;
-	pin->ena_gpio_invert = config->ena_gpio_invert;
 	list_add(&pin->list, &regulator_ena_gpio_list);
 
 update_ena_gpio_to_rdev:
@@ -1999,8 +1997,7 @@ static int regulator_ena_gpio_ctrl(struct regulator_dev *rdev, bool enable)
 	if (enable) {
 		/* Enable GPIO at initial use */
 		if (pin->enable_count == 0)
-			gpiod_set_value_cansleep(pin->gpiod,
-						 !pin->ena_gpio_invert);
+			gpiod_set_value_cansleep(pin->gpiod, 1);
 
 		pin->enable_count++;
 	} else {
@@ -2011,8 +2008,7 @@ static int regulator_ena_gpio_ctrl(struct regulator_dev *rdev, bool enable)
 
 		/* Disable GPIO if not used */
 		if (pin->enable_count <= 1) {
-			gpiod_set_value_cansleep(pin->gpiod,
-						 pin->ena_gpio_invert);
+			gpiod_set_value_cansleep(pin->gpiod, 0);
 			pin->enable_count = 0;
 		}
 	}
diff --git a/drivers/regulator/da9055-regulator.c b/drivers/regulator/da9055-regulator.c
index f40c3b8644ae..1a384258d0e5 100644
--- a/drivers/regulator/da9055-regulator.c
+++ b/drivers/regulator/da9055-regulator.c
@@ -457,7 +457,6 @@ static int da9055_gpio_init(struct da9055_regulator *regulator,
 		int gpio_mux = pdata->gpio_ren[id];
 
 		config->ena_gpiod = pdata->ena_gpiods[id];
-		config->ena_gpio_invert = 1;
 
 		/*
 		 * GPI pin is muxed with regulator to control the
diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
index 1142f195529b..8c479cdb69a9 100644
--- a/drivers/regulator/fixed.c
+++ b/drivers/regulator/fixed.c
@@ -79,10 +79,6 @@ of_get_fixed_voltage_config(struct device *dev,
 
 	of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
 
-	config->enable_high = of_property_read_bool(np, "enable-active-high");
-	config->gpio_is_open_drain = of_property_read_bool(np,
-							   "gpio-open-drain");
-
 	if (of_find_property(np, "vin-supply", NULL))
 		config->input_supply = "vin";
 
@@ -146,24 +142,14 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
 
 	drvdata->desc.fixed_uV = config->microvolts;
 
-	cfg.ena_gpio_invert = !config->enable_high;
-	if (config->enabled_at_boot) {
-		if (config->enable_high)
-			gflags = GPIOD_OUT_HIGH;
-		else
-			gflags = GPIOD_OUT_LOW;
-	} else {
-		if (config->enable_high)
-			gflags = GPIOD_OUT_LOW;
-		else
-			gflags = GPIOD_OUT_HIGH;
-	}
-	if (config->gpio_is_open_drain) {
-		if (gflags == GPIOD_OUT_HIGH)
-			gflags = GPIOD_OUT_HIGH_OPEN_DRAIN;
-		else
-			gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
-	}
+	/*
+	 * The signal will be inverted by the GPIO core if flagged so in the
+	 * decriptor.
+	 */
+	if (config->enabled_at_boot)
+		gflags = GPIOD_OUT_HIGH;
+	else
+		gflags = GPIOD_OUT_LOW;
 
 	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, NULL, gflags);
 	if (IS_ERR(cfg.ena_gpiod))
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 9d6094c4d71c..16ef08406739 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -154,9 +154,6 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
 
 	config->supply_name = config->init_data->constraints.name;
 
-	if (of_property_read_bool(np, "enable-active-high"))
-		config->enable_high = true;
-
 	if (of_property_read_bool(np, "enable-at-boot"))
 		config->enabled_at_boot = true;
 
@@ -338,18 +335,15 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	cfg.driver_data = drvdata;
 	cfg.of_node = np;
 
-	cfg.ena_gpio_invert = !config->enable_high;
-	if (config->enabled_at_boot) {
-		if (config->enable_high)
-			gflags = GPIOD_OUT_HIGH;
-		else
-			gflags = GPIOD_OUT_LOW;
-	} else {
-		if (config->enable_high)
-			gflags = GPIOD_OUT_LOW;
-		else
-			gflags = GPIOD_OUT_HIGH;
-	}
+	/*
+	 * The signal will be inverted by the GPIO core if flagged so in the
+	 * decriptor.
+	 */
+	if (config->enabled_at_boot)
+		gflags = GPIOD_OUT_HIGH;
+	else
+		gflags = GPIOD_OUT_LOW;
+
 	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "enable", gflags);
 	if (IS_ERR(cfg.ena_gpiod)) {
 		ret = PTR_ERR(cfg.ena_gpiod);
diff --git a/include/linux/regulator/fixed.h b/include/linux/regulator/fixed.h
index 1a4340ed8e2b..f10140da7145 100644
--- a/include/linux/regulator/fixed.h
+++ b/include/linux/regulator/fixed.h
@@ -25,14 +25,6 @@ struct regulator_init_data;
  * @input_supply:	Name of the input regulator supply
  * @microvolts:		Output voltage of regulator
  * @startup_delay:	Start-up time in microseconds
- * @gpio_is_open_drain: Gpio pin is open drain or normal type.
- *			If it is open drain type then HIGH will be set
- *			through PULL-UP with setting gpio as input
- *			and low will be set as gpio-output with driven
- *			to low. For non-open-drain case, the gpio will
- *			will be in output and drive to low/high accordingly.
- * @enable_high:	Polarity of enable GPIO
- *			1 = Active high, 0 = Active low
  * @enabled_at_boot:	Whether regulator has been enabled at
  * 			boot or not. 1 = Yes, 0 = No
  * 			This is used to keep the regulator at
@@ -48,8 +40,6 @@ struct fixed_voltage_config {
 	const char *input_supply;
 	int microvolts;
 	unsigned startup_delay;
-	unsigned gpio_is_open_drain:1;
-	unsigned enable_high:1;
 	unsigned enabled_at_boot:1;
 	struct regulator_init_data *init_data;
 };
diff --git a/include/linux/regulator/gpio-regulator.h b/include/linux/regulator/gpio-regulator.h
index 536cab86f2d5..4f3cc1a73ade 100644
--- a/include/linux/regulator/gpio-regulator.h
+++ b/include/linux/regulator/gpio-regulator.h
@@ -44,8 +44,6 @@ struct gpio_regulator_state {
 /**
  * struct gpio_regulator_config - config structure
  * @supply_name:	Name of the regulator supply
- * @enable_high:	Polarity of enable GPIO
- *			1 = Active high, 0 = Active low
  * @enabled_at_boot:	Whether regulator has been enabled at
  *			boot or not. 1 = Yes, 0 = No
  *			This is used to keep the regulator at
@@ -67,7 +65,6 @@ struct gpio_regulator_state {
 struct gpio_regulator_config {
 	const char *supply_name;
 
-	unsigned enable_high:1;
 	unsigned enabled_at_boot:1;
 	unsigned startup_delay;
 
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 16/19 v3] regulator: fixed/gpio: Update device tree bindings
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (14 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 17/19 v3] regulator: gpio: Convert to fully use descriptors Linus Walleij
                   ` (2 subsequent siblings)
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij, devicetree

Deprecate the open drain binding for fixed regulator and indicate
that we prefer this to be passed in the GPIO phandle flags.

Clarify that the line inversion semantics for fixed and GPIO
regulators completely overrides the active low flags in the
phandle flags.

Unfortunately this can not be changed to prefer that we pass
the flags in the phandle: the bindings have been specified and
deployed such that the presence/absence of this flag and only
that controls the line inversion semantics. The crucial semantic
is that the absence of the flag means the core will assume
the line is active low, which in GPIO terms is an exception,
as GPIO lines are normally assumed to be active high.

This special device tree semantic cannot be changed without
introducing a whole new compatible string for the fixed and
GPIO regulators, so we just contain the situation.

Cc: devicetree@vger.kernel.org
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Collect Rob's ACK.
---
 .../bindings/regulator/fixed-regulator.txt          | 13 +++++++++++--
 .../bindings/regulator/gpio-regulator.txt           |  4 ++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/regulator/fixed-regulator.txt b/Documentation/devicetree/bindings/regulator/fixed-regulator.txt
index 0c2a6c8a1536..a7a1cd0dfa6e 100644
--- a/Documentation/devicetree/bindings/regulator/fixed-regulator.txt
+++ b/Documentation/devicetree/bindings/regulator/fixed-regulator.txt
@@ -8,10 +8,19 @@ Optional properties:
 - gpio: gpio to use for enable control
 - startup-delay-us: startup time in microseconds
 - enable-active-high: Polarity of GPIO is Active high
-If this property is missing, the default assumed is Active low.
+  If this property is missing, the default assumed is Active low.
+  If the phandle flags to the GPIO handle also flag the line as active
+  low or high, that will be ignored for fixed regulators and the
+  presence or absence of this flag solely controls the inversion
+  semantics.
+-vin-supply: Input supply name.
+
+Deprecated properties:
 - gpio-open-drain: GPIO is open drain type.
   If this property is missing then default assumption is false.
--vin-supply: Input supply name.
+  Do not use this property in new device trees: instead use the
+  phandle flag to indicate to the GPIO provider that the line
+  should be handled as open drain.
 
 Any property defined as part of the core regulator
 binding, defined in regulator.txt, can also be used.
diff --git a/Documentation/devicetree/bindings/regulator/gpio-regulator.txt b/Documentation/devicetree/bindings/regulator/gpio-regulator.txt
index 1f496159e2bb..8fef3e5358a2 100644
--- a/Documentation/devicetree/bindings/regulator/gpio-regulator.txt
+++ b/Documentation/devicetree/bindings/regulator/gpio-regulator.txt
@@ -14,6 +14,10 @@ Optional properties:
 			  defualt is LOW if nothing is specified.
 - startup-delay-us	: Startup time in microseconds.
 - enable-active-high	: Polarity of GPIO is active high (default is low).
+			  If the phandle flags to the GPIO handle also flag the line as
+			  active low or high, that will be ignored for fixed regulators
+			  and the presence or absence of this flag solely controls the
+			  inversion semantics.
 - regulator-type	: Specifies what is being regulated, must be either
 			  "voltage" or "current", defaults to voltage.
 
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 17/19 v3] regulator: gpio: Convert to fully use descriptors
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (15 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 16/19 v3] regulator: fixed/gpio: Update device tree bindings Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 18/19 v3] regulator: gpio: Simplify probe path Linus Walleij
  2018-05-14  8:06 ` [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups Linus Walleij
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

This converts the GPIO regulator driver to use decriptors only.
We have to let go of the array gpio handling: the fetched descriptors
are handled individually anyway, and the array retrieveal function
does not make it possible to retrieve each GPIO descriptor with
unique flags. Instead get them one by one.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 arch/arm/mach-pxa/hx4700.c               |  10 +-
 arch/arm/mach-pxa/magician.c             |  11 ++-
 drivers/regulator/gpio-regulator.c       | 113 ++++++++---------------
 include/linux/regulator/gpio-regulator.h |  12 ++-
 4 files changed, 56 insertions(+), 90 deletions(-)

diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
index 05148016c620..24ba230340d8 100644
--- a/arch/arm/mach-pxa/hx4700.c
+++ b/arch/arm/mach-pxa/hx4700.c
@@ -700,9 +700,7 @@ static struct regulator_init_data bq24022_init_data = {
 	.consumer_supplies      = bq24022_consumers,
 };
 
-static struct gpio bq24022_gpios[] = {
-	{ GPIO96_HX4700_BQ24022_ISET2, GPIOF_OUT_INIT_LOW, "bq24022_iset2" },
-};
+static enum gpiod_flags bq24022_gpiod_gflags[] = { GPIOD_OUT_LOW };
 
 static struct gpio_regulator_state bq24022_states[] = {
 	{ .value = 100000, .gpios = (0 << 0) },
@@ -714,8 +712,8 @@ static struct gpio_regulator_config bq24022_info = {
 
 	.enabled_at_boot = 0,
 
-	.gpios = bq24022_gpios,
-	.nr_gpios = ARRAY_SIZE(bq24022_gpios),
+	.gflags = bq24022_gpiod_gflags,
+	.ngpios = ARRAY_SIZE(bq24022_gpiod_gflags),
 
 	.states = bq24022_states,
 	.nr_states = ARRAY_SIZE(bq24022_states),
@@ -735,6 +733,8 @@ static struct platform_device bq24022 = {
 static struct gpiod_lookup_table bq24022_gpiod_table = {
 	.dev_id = "gpio-regulator",
 	.table = {
+		GPIO_LOOKUP("gpio-pxa", GPIO96_HX4700_BQ24022_ISET2,
+			    NULL, GPIO_ACTIVE_HIGH),
 		GPIO_LOOKUP("gpio-pxa", GPIO72_HX4700_BQ24022_nCHARGE_EN,
 			    "enable", GPIO_ACTIVE_LOW),
 		{ },
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
index fab63c52d50e..5d21de79135b 100644
--- a/arch/arm/mach-pxa/magician.c
+++ b/arch/arm/mach-pxa/magician.c
@@ -645,9 +645,8 @@ static struct regulator_init_data bq24022_init_data = {
 	.consumer_supplies	= bq24022_consumers,
 };
 
-static struct gpio bq24022_gpios[] = {
-	{ EGPIO_MAGICIAN_BQ24022_ISET2, GPIOF_OUT_INIT_LOW, "bq24022_iset2" },
-};
+
+static enum gpiod_flags bq24022_gpiod_gflags[] = { GPIOD_OUT_LOW };
 
 static struct gpio_regulator_state bq24022_states[] = {
 	{ .value = 100000, .gpios = (0 << 0) },
@@ -659,8 +658,8 @@ static struct gpio_regulator_config bq24022_info = {
 
 	.enabled_at_boot	= 1,
 
-	.gpios			= bq24022_gpios,
-	.nr_gpios		= ARRAY_SIZE(bq24022_gpios),
+	.gflags = bq24022_gpiod_gflags,
+	.ngpios = ARRAY_SIZE(bq24022_gpiod_gflags),
 
 	.states			= bq24022_states,
 	.nr_states		= ARRAY_SIZE(bq24022_states),
@@ -680,6 +679,8 @@ static struct platform_device bq24022 = {
 static struct gpiod_lookup_table bq24022_gpiod_table = {
 	.dev_id = "gpio-regulator",
 	.table = {
+		GPIO_LOOKUP("gpio-pxa", EGPIO_MAGICIAN_BQ24022_ISET2,
+			    NULL, GPIO_ACTIVE_HIGH),
 		GPIO_LOOKUP("gpio-pxa", GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
 			    "enable", GPIO_ACTIVE_LOW),
 		{ },
diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 16ef08406739..756b7b50ffba 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -30,17 +30,15 @@
 #include <linux/regulator/machine.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/regulator/gpio-regulator.h>
-#include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 
 struct gpio_regulator_data {
 	struct regulator_desc desc;
 	struct regulator_dev *dev;
 
-	struct gpio *gpios;
+	struct gpio_desc **gpiods;
 	int nr_gpios;
 
 	struct gpio_regulator_state *states;
@@ -83,7 +81,7 @@ static int gpio_regulator_set_voltage(struct regulator_dev *dev,
 
 	for (ptr = 0; ptr < data->nr_gpios; ptr++) {
 		state = (target & (1 << ptr)) >> ptr;
-		gpio_set_value_cansleep(data->gpios[ptr].gpio, state);
+		gpiod_set_value_cansleep(data->gpiods[ptr], state);
 	}
 	data->state = target;
 
@@ -120,7 +118,7 @@ static int gpio_regulator_set_current_limit(struct regulator_dev *dev,
 
 	for (ptr = 0; ptr < data->nr_gpios; ptr++) {
 		state = (target & (1 << ptr)) >> ptr;
-		gpio_set_value_cansleep(data->gpios[ptr].gpio, state);
+		gpiod_set_value_cansleep(data->gpiods[ptr], state);
 	}
 	data->state = target;
 
@@ -139,7 +137,8 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
 {
 	struct gpio_regulator_config *config;
 	const char *regtype;
-	int proplen, gpio, i;
+	int proplen, i;
+	int ngpios;
 	int ret;
 
 	config = devm_kzalloc(dev,
@@ -159,47 +158,31 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
 
 	of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
 
-	/* Fetch GPIOs. - optional property*/
-	ret = of_gpio_count(np);
-	if ((ret < 0) && (ret != -ENOENT))
-		return ERR_PTR(ret);
-
-	if (ret > 0) {
-		config->nr_gpios = ret;
-		config->gpios = devm_kzalloc(dev,
-					sizeof(struct gpio) * config->nr_gpios,
-					GFP_KERNEL);
-		if (!config->gpios)
+	/* Fetch GPIO init levels */
+	ngpios = gpiod_count(dev, NULL);
+	if (ngpios > 0) {
+		config->gflags = devm_kzalloc(dev,
+					      sizeof(enum gpiod_flags)
+					      * ngpios,
+					      GFP_KERNEL);
+		if (!config->gflags)
 			return ERR_PTR(-ENOMEM);
 
-		proplen = of_property_count_u32_elems(np, "gpios-states");
-		/* optional property */
-		if (proplen < 0)
-			proplen = 0;
+		for (i = 0; i < ngpios; i++) {
+			u32 val;
 
-		if (proplen > 0 && proplen != config->nr_gpios) {
-			dev_warn(dev, "gpios <-> gpios-states mismatch\n");
-			proplen = 0;
-		}
+			ret = of_property_read_u32_index(np, "gpios-states", i,
+							 &val);
 
-		for (i = 0; i < config->nr_gpios; i++) {
-			gpio = of_get_named_gpio(np, "gpios", i);
-			if (gpio < 0) {
-				if (gpio != -ENOENT)
-					return ERR_PTR(gpio);
-				break;
-			}
-			config->gpios[i].gpio = gpio;
-			config->gpios[i].label = config->supply_name;
-			if (proplen > 0) {
-				of_property_read_u32_index(np, "gpios-states",
-							   i, &ret);
-				if (ret)
-					config->gpios[i].flags =
-							   GPIOF_OUT_INIT_HIGH;
-			}
+			/* Default to high per specification */
+			if (ret)
+				config->gflags[i] = GPIOD_OUT_HIGH;
+			else
+				config->gflags[i] =
+					val ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
 		}
 	}
+	config->ngpios = ngpios;
 
 	/* Fetch states. */
 	proplen = of_property_count_u32_elems(np, "states");
@@ -250,7 +233,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	struct gpio_regulator_data *drvdata;
 	struct regulator_config cfg = { };
 	enum gpiod_flags gflags;
-	int ptr, ret, state;
+	int ptr, ret, state, i;
 
 	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
 			       GFP_KERNEL);
@@ -264,33 +247,22 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 			return PTR_ERR(config);
 	}
 
+	for (i = 0; i < config->ngpios; i++) {
+		drvdata->gpiods[i] = devm_gpiod_get_index(&pdev->dev,
+							  config->supply_name,
+							  i,
+							  config->gflags[i]);
+		if (IS_ERR(drvdata->gpiods[i]))
+			return PTR_ERR(drvdata->gpiods[i]);
+	}
+	drvdata->nr_gpios = config->ngpios;
+
 	drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL);
 	if (drvdata->desc.name == NULL) {
 		dev_err(&pdev->dev, "Failed to allocate supply name\n");
 		return -ENOMEM;
 	}
 
-	if (config->nr_gpios != 0) {
-		drvdata->gpios = kmemdup(config->gpios,
-					 config->nr_gpios * sizeof(struct gpio),
-					 GFP_KERNEL);
-		if (drvdata->gpios == NULL) {
-			dev_err(&pdev->dev, "Failed to allocate gpio data\n");
-			ret = -ENOMEM;
-			goto err_name;
-		}
-
-		drvdata->nr_gpios = config->nr_gpios;
-		ret = gpio_request_array(drvdata->gpios, drvdata->nr_gpios);
-		if (ret) {
-			if (ret != -EPROBE_DEFER)
-				dev_err(&pdev->dev,
-					"Could not obtain regulator setting GPIOs: %d\n",
-					ret);
-			goto err_memgpio;
-		}
-	}
-
 	drvdata->states = kmemdup(config->states,
 				  config->nr_states *
 					 sizeof(struct gpio_regulator_state),
@@ -298,7 +270,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	if (drvdata->states == NULL) {
 		dev_err(&pdev->dev, "Failed to allocate state data\n");
 		ret = -ENOMEM;
-		goto err_stategpio;
+		goto err_name;
 	}
 	drvdata->nr_states = config->nr_states;
 
@@ -325,7 +297,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	/* build initial state from gpio init data. */
 	state = 0;
 	for (ptr = 0; ptr < drvdata->nr_gpios; ptr++) {
-		if (config->gpios[ptr].flags & GPIOF_OUT_INIT_HIGH)
+		if (config->gflags[ptr] == GPIOD_OUT_HIGH)
 			state |= (1 << ptr);
 	}
 	drvdata->state = state;
@@ -347,7 +319,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "enable", gflags);
 	if (IS_ERR(cfg.ena_gpiod)) {
 		ret = PTR_ERR(cfg.ena_gpiod);
-		goto err_stategpio;
+		goto err_memstate;
 	}
 
 	drvdata->dev = regulator_register(&drvdata->desc, &cfg);
@@ -363,10 +335,6 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 
 err_memstate:
 	kfree(drvdata->states);
-err_stategpio:
-	gpio_free_array(drvdata->gpios, drvdata->nr_gpios);
-err_memgpio:
-	kfree(drvdata->gpios);
 err_name:
 	kfree(drvdata->desc.name);
 	return ret;
@@ -377,12 +345,7 @@ static int gpio_regulator_remove(struct platform_device *pdev)
 	struct gpio_regulator_data *drvdata = platform_get_drvdata(pdev);
 
 	regulator_unregister(drvdata->dev);
-
-	gpio_free_array(drvdata->gpios, drvdata->nr_gpios);
-
 	kfree(drvdata->states);
-	kfree(drvdata->gpios);
-
 	kfree(drvdata->desc.name);
 
 	return 0;
diff --git a/include/linux/regulator/gpio-regulator.h b/include/linux/regulator/gpio-regulator.h
index 4f3cc1a73ade..11cd6375215d 100644
--- a/include/linux/regulator/gpio-regulator.h
+++ b/include/linux/regulator/gpio-regulator.h
@@ -21,6 +21,8 @@
 #ifndef __REGULATOR_GPIO_H
 #define __REGULATOR_GPIO_H
 
+#include <linux/gpio/consumer.h>
+
 struct regulator_init_data;
 
 enum regulator_type;
@@ -49,9 +51,9 @@ struct gpio_regulator_state {
  *			This is used to keep the regulator at
  *			the default state
  * @startup_delay:	Start-up time in microseconds
- * @gpios:		Array containing the gpios needed to control
- *			the setting of the regulator
- * @nr_gpios:		Number of gpios
+ * @gflags:		Array of GPIO configuration flags for initial
+ *			states
+ * @ngpios:		Number of GPIOs and configurations available
  * @states:		Array of gpio_regulator_state entries describing
  *			the gpio state for specific voltages
  * @nr_states:		Number of states available
@@ -68,8 +70,8 @@ struct gpio_regulator_config {
 	unsigned enabled_at_boot:1;
 	unsigned startup_delay;
 
-	struct gpio *gpios;
-	int nr_gpios;
+	enum gpiod_flags *gflags;
+	int ngpios;
 
 	struct gpio_regulator_state *states;
 	int nr_states;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 18/19 v3] regulator: gpio: Simplify probe path
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (16 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 17/19 v3] regulator: gpio: Convert to fully use descriptors Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-14  8:06 ` [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups Linus Walleij
  18 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Linus Walleij

Use devm_* managed device resources and create a local
struct device *dev variable to simplify the code inside
probe().

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Resending.
ChangeLog v1->v2:
- Rebase the patch on the other changes.
---
 drivers/regulator/gpio-regulator.c | 56 ++++++++++++------------------
 1 file changed, 23 insertions(+), 33 deletions(-)

diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 756b7b50ffba..e4b573bf8b99 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -228,27 +228,28 @@ static struct regulator_ops gpio_regulator_current_ops = {
 
 static int gpio_regulator_probe(struct platform_device *pdev)
 {
-	struct gpio_regulator_config *config = dev_get_platdata(&pdev->dev);
-	struct device_node *np = pdev->dev.of_node;
+	struct device *dev = &pdev->dev;
+	struct gpio_regulator_config *config = dev_get_platdata(dev);
+	struct device_node *np = dev->of_node;
 	struct gpio_regulator_data *drvdata;
 	struct regulator_config cfg = { };
 	enum gpiod_flags gflags;
 	int ptr, ret, state, i;
 
-	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
+	drvdata = devm_kzalloc(dev, sizeof(struct gpio_regulator_data),
 			       GFP_KERNEL);
 	if (drvdata == NULL)
 		return -ENOMEM;
 
 	if (np) {
-		config = of_get_gpio_regulator_config(&pdev->dev, np,
+		config = of_get_gpio_regulator_config(dev, np,
 						      &drvdata->desc);
 		if (IS_ERR(config))
 			return PTR_ERR(config);
 	}
 
 	for (i = 0; i < config->ngpios; i++) {
-		drvdata->gpiods[i] = devm_gpiod_get_index(&pdev->dev,
+		drvdata->gpiods[i] = devm_gpiod_get_index(dev,
 							  config->supply_name,
 							  i,
 							  config->gflags[i]);
@@ -257,20 +258,20 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	}
 	drvdata->nr_gpios = config->ngpios;
 
-	drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL);
+	drvdata->desc.name = devm_kstrdup(dev, config->supply_name, GFP_KERNEL);
 	if (drvdata->desc.name == NULL) {
-		dev_err(&pdev->dev, "Failed to allocate supply name\n");
+		dev_err(dev, "Failed to allocate supply name\n");
 		return -ENOMEM;
 	}
 
-	drvdata->states = kmemdup(config->states,
-				  config->nr_states *
-					 sizeof(struct gpio_regulator_state),
-				  GFP_KERNEL);
+	drvdata->states = devm_kmemdup(dev,
+				       config->states,
+				       config->nr_states *
+				       sizeof(struct gpio_regulator_state),
+				       GFP_KERNEL);
 	if (drvdata->states == NULL) {
-		dev_err(&pdev->dev, "Failed to allocate state data\n");
-		ret = -ENOMEM;
-		goto err_name;
+		dev_err(dev, "Failed to allocate state data\n");
+		return -ENOMEM;
 	}
 	drvdata->nr_states = config->nr_states;
 
@@ -289,9 +290,8 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 		drvdata->desc.ops = &gpio_regulator_current_ops;
 		break;
 	default:
-		dev_err(&pdev->dev, "No regulator type set\n");
-		ret = -EINVAL;
-		goto err_memstate;
+		dev_err(dev, "No regulator type set\n");
+		return -EINVAL;
 	}
 
 	/* build initial state from gpio init data. */
@@ -302,7 +302,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	}
 	drvdata->state = state;
 
-	cfg.dev = &pdev->dev;
+	cfg.dev = dev;
 	cfg.init_data = config->init_data;
 	cfg.driver_data = drvdata;
 	cfg.of_node = np;
@@ -316,28 +316,20 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	else
 		gflags = GPIOD_OUT_LOW;
 
-	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, "enable", gflags);
-	if (IS_ERR(cfg.ena_gpiod)) {
-		ret = PTR_ERR(cfg.ena_gpiod);
-		goto err_memstate;
-	}
+	cfg.ena_gpiod = devm_gpiod_get_optional(dev, "enable", gflags);
+	if (IS_ERR(cfg.ena_gpiod))
+		return PTR_ERR(cfg.ena_gpiod);
 
 	drvdata->dev = regulator_register(&drvdata->desc, &cfg);
 	if (IS_ERR(drvdata->dev)) {
 		ret = PTR_ERR(drvdata->dev);
-		dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
-		goto err_memstate;
+		dev_err(dev, "Failed to register regulator: %d\n", ret);
+		return ret;
 	}
 
 	platform_set_drvdata(pdev, drvdata);
 
 	return 0;
-
-err_memstate:
-	kfree(drvdata->states);
-err_name:
-	kfree(drvdata->desc.name);
-	return ret;
 }
 
 static int gpio_regulator_remove(struct platform_device *pdev)
@@ -345,8 +337,6 @@ static int gpio_regulator_remove(struct platform_device *pdev)
 	struct gpio_regulator_data *drvdata = platform_get_drvdata(pdev);
 
 	regulator_unregister(drvdata->dev);
-	kfree(drvdata->states);
-	kfree(drvdata->desc.name);
 
 	return 0;
 }
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups
  2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
                   ` (17 preceding siblings ...)
  2018-05-14  8:06 ` [PATCH 18/19 v3] regulator: gpio: Simplify probe path Linus Walleij
@ 2018-05-14  8:06 ` Linus Walleij
  2018-05-17  5:06   ` Mark Brown
  18 siblings, 1 reply; 50+ messages in thread
From: Linus Walleij @ 2018-05-14  8:06 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, Charles Keepax, Linus Walleij

From: Charles Keepax <ckeepax@opensource.cirrus.com>

Rather than unconditionally registering the GPIO lookup table only do so
for devices that require it.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
[Fixed up to also handle wm5102 and wm5102 reva]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v2->v3:
- Including this in my patch series.
---
 arch/arm/mach-s3c64xx/mach-crag6410-module.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
index 76c4855a03bc..56ec212442ad 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
@@ -328,6 +328,8 @@ static const struct {
 	int num_i2c_devs;
 	const struct spi_board_info *spi_devs;
 	int num_spi_devs;
+
+	struct gpiod_lookup_table *gpiod_table;
 } gf_mods[] = {
 	{ .id = 0x01, .rev = 0xff, .name = "1250-EV1 Springbank" },
 	{ .id = 0x02, .rev = 0xff, .name = "1251-EV1 Jura" },
@@ -362,13 +364,16 @@ static const struct {
 	  .i2c_devs = wm1255_devs, .num_i2c_devs = ARRAY_SIZE(wm1255_devs) },
 	{ .id = 0x3c, .rev = 0xff, .name = "1273-EV1 Longmorn" },
 	{ .id = 0x3d, .rev = 0xff, .name = "1277-EV1 Littlemill",
-	  .i2c_devs = wm1277_devs, .num_i2c_devs = ARRAY_SIZE(wm1277_devs) },
+	  .i2c_devs = wm1277_devs, .num_i2c_devs = ARRAY_SIZE(wm1277_devs),
+	  .gpiod_table = &wm8994_gpiod_table },
 	{ .id = 0x3e, .rev = 0, .name = "WM5102-6271-EV1-CS127 Amrut",
 	  .spi_devs = wm5102_reva_spi_devs,
-	  .num_spi_devs = ARRAY_SIZE(wm5102_reva_spi_devs) },
+	  .num_spi_devs = ARRAY_SIZE(wm5102_reva_spi_devs),
+	  .gpiod_table = &wm5102_reva_gpiod_table },
 	{ .id = 0x3e, .rev = -1, .name = "WM5102-6271-EV1-CS127 Amrut",
 	  .spi_devs = wm5102_spi_devs,
-	  .num_spi_devs = ARRAY_SIZE(wm5102_spi_devs) },
+	  .num_spi_devs = ARRAY_SIZE(wm5102_spi_devs),
+	  .gpiod_table = &wm5102_gpiod_table },
 	{ .id = 0x3f, .rev = -1, .name = "WM2200-6271-CS90-M-REV1",
 	  .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) },
 };
@@ -391,10 +396,6 @@ 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);
-	gpiod_add_lookup_table(&wm8994_gpiod_table);
-
 	if (i < ARRAY_SIZE(gf_mods)) {
 		dev_info(&i2c->dev, "%s revision %d\n",
 			 gf_mods[i].name, rev + 1);
@@ -408,6 +409,9 @@ static int wlf_gf_module_probe(struct i2c_client *i2c,
 
 		spi_register_board_info(gf_mods[i].spi_devs,
 					gf_mods[i].num_spi_devs);
+
+		if (gf_mods[i].gpiod_table)
+			gpiod_add_lookup_table(gf_mods[i].gpiod_table);
 	} else {
 		dev_warn(&i2c->dev, "Unknown module ID 0x%x revision %d\n",
 			 id, rev + 1);
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* Re: [PATCH 05/19 v3] regulator: max77686: Pass descriptor instead of GPIO number
  2018-05-14  8:06 ` [PATCH 05/19 v3] regulator: max77686: " Linus Walleij
@ 2018-05-14  9:28   ` Krzysztof Kozlowski
  2018-05-17 16:41   ` Applied "regulator: max77686: Pass descriptor instead of GPIO number" to the regulator tree Mark Brown
  1 sibling, 0 replies; 50+ messages in thread
From: Krzysztof Kozlowski @ 2018-05-14  9:28 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Chanwoo Choi,
	Bartlomiej Zolnierkiewicz

On Mon, May 14, 2018 at 10:06 AM, Linus Walleij
<linus.walleij@linaro.org> wrote:
> Instead of passing a global GPIO number, pass a descriptor looked
> up from the device tree configuration node.
>
> Cc: Chanwoo Choi <cw00.choi@samsung.com>
> Cc: Krzysztof Kozlowski <krzk@kernel.org>
> Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v2->v3:
> - Name the regulator "max77686-regulator"
> - Set the regulator to NULL on erroneous lookup, restoring the
>   old init data lookup behaviour.
> ChangeLog v1->v2:
> - Rebase the patch on the other changes.
> ---
>  drivers/regulator/max77686-regulator.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)

Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Tested on Odroid U3 (with max77686 although not using any GPIOs for
regulators, so at least default paths are not broken):
Tested-by: Krzysztof Kozlowski <krzk@kernel.org>

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-14  8:06 ` [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number Linus Walleij
@ 2018-05-14  9:42   ` Krzysztof Kozlowski
  2018-05-26 10:02   ` Mark Brown
  1 sibling, 0 replies; 50+ messages in thread
From: Krzysztof Kozlowski @ 2018-05-14  9:42 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Sangbeom Kim, Chanwoo Choi

On Mon, May 14, 2018 at 10:06 AM, Linus Walleij
<linus.walleij@linaro.org> wrote:
> Instead of passing a global GPIO number for the enable GPIO, pass
> a descriptor looked up with the standard devm_gpiod_get_optional()
> call.
>
> This regulator supports passing platform data, but enable/sleep
> regulators are looked up from the device tree exclusively, so
> we can need not touch other files.
>
> Cc: Krzysztof Kozlowski <krzk@kernel.org>
> Cc: Sangbeom Kim <sbkim73@samsung.com>
> Cc: Chanwoo Choi <cw00.choi@samsung.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v2->v3:
> - Resending.
> ChangeLog v1->v2:
> - Rebase the patch on the other changes.
> ---
>  drivers/regulator/s2mps11.c | 46 ++++++++++++++++++-------------------
>  1 file changed, 23 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
> index 7726b874e539..9a1dca26362e 100644
> --- a/drivers/regulator/s2mps11.c
> +++ b/drivers/regulator/s2mps11.c
> @@ -18,7 +18,7 @@
>
>  #include <linux/bug.h>
>  #include <linux/err.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/slab.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> @@ -27,7 +27,6 @@
>  #include <linux/regulator/driver.h>
>  #include <linux/regulator/machine.h>
>  #include <linux/regulator/of_regulator.h>
> -#include <linux/of_gpio.h>
>  #include <linux/mfd/samsung/core.h>
>  #include <linux/mfd/samsung/s2mps11.h>
>  #include <linux/mfd/samsung/s2mps13.h>
> @@ -57,7 +56,7 @@ struct s2mps11_info {
>          * Array (size: number of regulators) with GPIO-s for external
>          * sleep control.
>          */
> -       int *ext_control_gpio;
> +       struct gpio_desc **ext_control_gpiod;
>  };
>
>  static int get_ramp_delay(int ramp_delay)
> @@ -524,7 +523,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
>         case S2MPS14X:
>                 if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
>                         val = S2MPS14_ENABLE_SUSPEND;
> -               else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
> +               else if (s2mps11->ext_control_gpiod[rdev_get_id(rdev)])
>                         val = S2MPS14_ENABLE_EXT_CONTROL;
>                 else
>                         val = rdev->desc->enable_mask;
> @@ -818,7 +817,7 @@ static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
>  static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
>                 struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
>  {
> -       int *gpio = s2mps11->ext_control_gpio;
> +       struct gpio_desc **gpio = s2mps11->ext_control_gpiod;
>         unsigned int i;
>         unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,
>                 S2MPS14_LDO12 };
> @@ -829,11 +828,20 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
>                 if (!rdata[reg].init_data || !rdata[reg].of_node)
>                         continue;
>
> -               gpio[reg] = of_get_named_gpio(rdata[reg].of_node,
> -                               "samsung,ext-control-gpios", 0);
> -               if (gpio_is_valid(gpio[reg]))
> -                       dev_dbg(&pdev->dev, "Using GPIO %d for ext-control over %d/%s\n",
> -                                       gpio[reg], reg, rdata[reg].name);
> +               gpio[reg] = devm_gpiod_get_from_of_node(&pdev->dev,
> +                                                       rdata[reg].of_node,
> +                                                       "samsung,ext-control-gpios",
> +                                                       0,
> +                                                       GPIOD_OUT_HIGH,
> +                                                       "s2mps11-LDO");

Now I noticed that the name is okay because GPIO control can be used
only for LDOs.

No need to change:

Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Tested on Odroid XU3 (with s2mps11 although not using any GPIOs for
regulators, so at least default paths are not broken):
Tested-by: Krzysztof Kozlowski <krzk@kernel.org>

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
@ 2018-05-14 11:03   ` Andy Shevchenko
  2018-05-21 11:27     ` Linus Walleij
  2018-05-14 11:49   ` Geert Uytterhoeven
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 50+ messages in thread
From: Andy Shevchenko @ 2018-05-14 11:03 UTC (permalink / raw)
  To: Linus Walleij, Liam Girdwood, Mark Brown
  Cc: linux-kernel, Alexander Shiyan, Haojian Zhuang, Aaro Koskinen,
	Tony Lindgren, Mike Rapoport, Robert Jarzmik, Philipp Zabel,
	Daniel Mack, Marc Zyngier, Geert Uytterhoeven, Russell King

On Mon, 2018-05-14 at 10:06 +0200, Linus Walleij wrote:
> As we augmented the regulator core to accept a GPIO descriptor instead
> of a GPIO number, we can augment the fixed GPIO regulator to look up
> and pass that descriptor directly from device tree or board GPIO
> descriptor look up tables.
> 
> Some boards just auto-enumerate their fixed regulator platform devices
> and I have assumed they get names like "fixed-regulator.0" but it's
> pretty hard to guess this. I need some testing from board maintainers
> to
> be sure. Other boards are straight forward, using just plain
> "fixed-regulator" (ID -1) or "fixed-regulator.1" hammering down the
> device ID.
> 
> The OMAP didn't have proper label names on its GPIO chips so I have
> fixed
> this with a separate patch to the GPIO tree, see
> commit 088413bc0bd5f5fb66ca22a19d66a49d7154ba4c
> "gpio: omap: Give unique labels to each GPIO bank/chip"
> 
> It seems the da9055 and da9211 has never got around to actually
> passing
> any enable gpio into its platform data (not the in-tree code anyway)
> so we
> can just decide to simply pass a descriptor instead.
> 
> The fixed GPIO-controlled regulator in mach-pxa/ezx.c was confusingly
> named
> "*_dummy_supply_device" while it is a very real device backed by a
> GPIO
> line. There is nothing dummy about it at all, so I renamed it with the
> infix *_regulator_* as part of this patch set.
> 
> For the patch hunk hitting arch/blackfin I would say I do not expect
> testing, review or ACKs anymore so if it works, it works.
> 
> The hunk hitting the x86 BCM43xx driver is especially tricky as the
> number
> comes out of SFI which is a mystery to me. I definately need someone
> to
> look at this. (Hi Andy.)

Since there is no link to repo with a branch and I wasn't Cc'ed to cover
letter, asking here for a such. I would then pull it and test on real
hardware.

The code itself looks good, so:

Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

for Intel MID bits.

> 
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> # Check the
> x86 BCM stuff
> Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
> Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
> Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
> Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
> Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
> Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
> Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
> Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
> Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
> Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO
> maintainer
> Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v2->v3:
> - Resending.
> ChangeLog v1->v2:
> - Rebase the patch on mainline with Blackfin gone and other changes.
> - Fix up the new users that appeared in sa1100
> - Drop some suplus comments in x86.
> ---
>  arch/arm/mach-imx/mach-mx21ads.c              | 13 +++++++-
>  arch/arm/mach-imx/mach-mx27ads.c              | 12 ++++++-
>  arch/arm/mach-mmp/brownstone.c                | 12 ++++++-
>  arch/arm/mach-omap1/board-ams-delta.c         | 14 +++++++-
>  arch/arm/mach-omap2/pdata-quirks.c            | 16 ++++++++-
>  arch/arm/mach-pxa/em-x270.c                   |  1 -
>  arch/arm/mach-pxa/ezx.c                       | 33 ++++++++++++----
> ---
>  arch/arm/mach-pxa/magician.c                  |  2 +-
>  arch/arm/mach-pxa/raumfeld.c                  | 12 +++++--
>  arch/arm/mach-pxa/zeus.c                      | 23 +++++++++++--
>  arch/arm/mach-s3c64xx/mach-crag6410.c         |  1 -
>  arch/arm/mach-s3c64xx/mach-smdk6410.c         |  1 -
>  arch/arm/mach-sa1100/assabet.c                | 21 ++++++++----
>  arch/arm/mach-sa1100/generic.c                |  5 +--
>  arch/arm/mach-sa1100/generic.h                |  3 +-
>  arch/arm/mach-sa1100/shannon.c                |  4 +--
>  arch/sh/boards/mach-ecovec24/setup.c          | 22 +++++++++++--
>  .../intel-mid/device_libs/platform_bcm43xx.c  | 17 ++++++++--
>  drivers/regulator/fixed-helper.c              |  1 -
>  drivers/regulator/fixed.c                     | 33 +++++++++---------
> -
>  include/linux/regulator/fixed.h               |  3 --
>  21 files changed, 187 insertions(+), 62 deletions(-)
> 
> diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-
> imx/mach-mx21ads.c
> index 5e366824814f..5d3b6b4fe6db 100644
> --- a/arch/arm/mach-imx/mach-mx21ads.c
> +++ b/arch/arm/mach-imx/mach-mx21ads.c
> @@ -18,6 +18,7 @@
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/physmap.h>
>  #include <linux/gpio/driver.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/gpio.h>
>  #include <linux/regulator/fixed.h>
>  #include <linux/regulator/machine.h>
> @@ -175,6 +176,7 @@ static struct resource mx21ads_mmgpio_resource =
>  	DEFINE_RES_MEM_NAMED(MX21ADS_IO_REG, SZ_2, "dat");
>  
>  static struct bgpio_pdata mx21ads_mmgpio_pdata = {
> +	.label	= "mx21ads-mmgpio",
>  	.base	= MX21ADS_MMGPIO_BASE,
>  	.ngpio	= 16,
>  };
> @@ -203,7 +205,6 @@ static struct regulator_init_data
> mx21ads_lcd_regulator_init_data = {
>  static struct fixed_voltage_config mx21ads_lcd_regulator_pdata = {
>  	.supply_name	= "LCD",
>  	.microvolts	= 3300000,
> -	.gpio		= MX21ADS_IO_LCDON,
>  	.enable_high	= 1,
>  	.init_data	= &mx21ads_lcd_regulator_init_data,
>  };
> @@ -216,6 +217,15 @@ static struct platform_device
> mx21ads_lcd_regulator = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table mx21ads_lcd_regulator_gpiod_table =
> {
> +	.dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what
> we get */
> +	.table = {
> +		GPIO_LOOKUP("mx21ads-mmgpio", 9,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  /*
>   * Connected is a portrait Sharp-QVGA display
>   * of type: LQ035Q7DB02
> @@ -311,6 +321,7 @@ static void __init mx21ads_late_init(void)
>  {
>  	imx21_add_mxc_mmc(0, &mx21ads_sdhc_pdata);
>  
> +	gpiod_add_lookup_table(&mx21ads_lcd_regulator_gpiod_table);
>  	platform_add_devices(platform_devices,
> ARRAY_SIZE(platform_devices));
>  
>  	mx21ads_cs8900_resources[1].start =
> diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-
> imx/mach-mx27ads.c
> index a04bb094ded1..0fdb88db0cbd 100644
> --- a/arch/arm/mach-imx/mach-mx27ads.c
> +++ b/arch/arm/mach-imx/mach-mx27ads.c
> @@ -16,6 +16,7 @@
>  #include <linux/gpio/driver.h>
>  /* Needed for gpio_to_irq() */
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/platform_device.h>
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/map.h>
> @@ -230,10 +231,17 @@ static struct regulator_init_data
> mx27ads_lcd_regulator_init_data = {
>  static struct fixed_voltage_config mx27ads_lcd_regulator_pdata = {
>  	.supply_name	= "LCD",
>  	.microvolts	= 3300000,
> -	.gpio		= MX27ADS_LCD_GPIO,
>  	.init_data	= &mx27ads_lcd_regulator_init_data,
>  };
>  
> +static struct gpiod_lookup_table mx27ads_lcd_regulator_gpiod_table =
> {
> +	.dev_id = "reg-fixed-voltage.0", /* Let's hope ID 0 is what
> we get */
> +	.table = {
> +		GPIO_LOOKUP("LCD", 0, "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static void __init mx27ads_regulator_init(void)
>  {
>  	struct gpio_chip *vchip;
> @@ -247,6 +255,8 @@ static void __init mx27ads_regulator_init(void)
>  	vchip->set		= vgpio_set;
>  	gpiochip_add_data(vchip, NULL);
>  
> +	gpiod_add_lookup_table(&mx27ads_lcd_regulator_gpiod_table);
> +
>  	platform_device_register_data(NULL, "reg-fixed-voltage",
>  				      PLATFORM_DEVID_AUTO,
>  				      &mx27ads_lcd_regulator_pdata,
> diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-
> mmp/brownstone.c
> index d1613b954926..563b5a278d65 100644
> --- a/arch/arm/mach-mmp/brownstone.c
> +++ b/arch/arm/mach-mmp/brownstone.c
> @@ -15,6 +15,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/io.h>
>  #include <linux/gpio-pxa.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/regulator/machine.h>
>  #include <linux/regulator/max8649.h>
>  #include <linux/regulator/fixed.h>
> @@ -148,7 +149,6 @@ static struct regulator_init_data
> brownstone_v_5vp_data = {
>  static struct fixed_voltage_config brownstone_v_5vp = {
>  	.supply_name		= "v_5vp",
>  	.microvolts		= 5000000,
> -	.gpio			= GPIO_5V_ENABLE,
>  	.enable_high		= 1,
>  	.enabled_at_boot	= 1,
>  	.init_data		= &brownstone_v_5vp_data,
> @@ -162,6 +162,15 @@ static struct platform_device
> brownstone_v_5vp_device = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table brownstone_v_5vp_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.1", /* .id set to 1 above */
> +	.table = {
> +		GPIO_LOOKUP("gpio-pxa", GPIO_5V_ENABLE,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static struct max8925_platform_data brownstone_max8925_info = {
>  	.irq_base		= MMP_NR_IRQS,
>  };
> @@ -217,6 +226,7 @@ static void __init brownstone_init(void)
>  	mmp2_add_isram(&mmp2_isram_platdata);
>  
>  	/* enable 5v regulator */
> +	gpiod_add_lookup_table(&brownstone_v_5vp_gpiod_table);
>  	platform_device_register(&brownstone_v_5vp_device);
>  }
>  
> diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-
> omap1/board-ams-delta.c
> index 52e8e53ca154..759fa18f6ab4 100644
> --- a/arch/arm/mach-omap1/board-ams-delta.c
> +++ b/arch/arm/mach-omap1/board-ams-delta.c
> @@ -12,6 +12,7 @@
>   * published by the Free Software Foundation.
>   */
>  #include <linux/gpio/driver.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/gpio.h>
>  #include <linux/kernel.h>
>  #include <linux/init.h>
> @@ -203,6 +204,7 @@ static struct resource latch2_resources[] = {
>  };
>  
>  static struct bgpio_pdata latch2_pdata = {
> +	.label	= "ams-delta-latch2",
>  	.base	= AMS_DELTA_LATCH2_GPIO_BASE,
>  	.ngpio	= AMS_DELTA_LATCH2_NGPIO,
>  };
> @@ -272,7 +274,6 @@ static struct regulator_init_data
> modem_nreset_data = {
>  static struct fixed_voltage_config modem_nreset_config = {
>  	.supply_name		= "modem_nreset",
>  	.microvolts		= 3300000,
> -	.gpio			=
> AMS_DELTA_GPIO_PIN_MODEM_NRESET,
>  	.startup_delay		= 25000,
>  	.enable_high		= 1,
>  	.enabled_at_boot	= 1,
> @@ -287,6 +288,16 @@ static struct platform_device modem_nreset_device
> = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table modem_nreset_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage",
> +	.table = {
> +		/* The AMS_DELTA_GPIO_PIN_MODEM_NRESET is at offset
> 12 */
> +		GPIO_LOOKUP("ams-delta-latch2", 12,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  struct modem_private_data {
>  	struct regulator *regulator;
>  };
> @@ -570,6 +581,7 @@ static int __init late_init(void)
>  
>  	platform_add_devices(late_devices, ARRAY_SIZE(late_devices));
>  
> +	gpiod_add_lookup_table(&modem_nreset_gpiod_table);
>  	err = platform_device_register(&modem_nreset_device);
>  	if (err) {
>  		pr_err("Couldn't register the modem regulator
> device\n");
> diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-
> omap2/pdata-quirks.c
> index 6459816c2879..7d1447204fb8 100644
> --- a/arch/arm/mach-omap2/pdata-quirks.c
> +++ b/arch/arm/mach-omap2/pdata-quirks.c
> @@ -10,6 +10,7 @@
>  #include <linux/clk.h>
>  #include <linux/davinci_emac.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/init.h>
>  #include <linux/kernel.h>
>  #include <linux/of_platform.h>
> @@ -330,7 +331,6 @@ static struct regulator_init_data pandora_vmmc3 =
> {
>  static struct fixed_voltage_config pandora_vwlan = {
>  	.supply_name		= "vwlan",
>  	.microvolts		= 1800000, /* 1.8V */
> -	.gpio			= PANDORA_WIFI_NRESET_GPIO,
>  	.startup_delay		= 50000, /* 50ms */
>  	.enable_high		= 1,
>  	.init_data		= &pandora_vmmc3,
> @@ -344,6 +344,19 @@ static struct platform_device
> pandora_vwlan_device = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table pandora_vwlan_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.1",
> +	.table = {
> +		/*
> +		 * As this is a low GPIO number it should be at the
> first
> +		 * GPIO bank.
> +		 */
> +		GPIO_LOOKUP("gpio-0-31", PANDORA_WIFI_NRESET_GPIO,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static void pandora_wl1251_init_card(struct mmc_card *card)
>  {
>  	/*
> @@ -405,6 +418,7 @@ static void __init pandora_wl1251_init(void)
>  static void __init omap3_pandora_legacy_init(void)
>  {
>  	platform_device_register(&pandora_backlight);
> +	gpiod_add_lookup_table(&pandora_vwlan_gpiod_table);
>  	platform_device_register(&pandora_vwlan_device);
>  	omap_hsmmc_init(pandora_mmc3);
>  	omap_hsmmc_late_init(pandora_mmc3);
> diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
> index 49022ad338e9..6d7d93981098 100644
> --- a/arch/arm/mach-pxa/em-x270.c
> +++ b/arch/arm/mach-pxa/em-x270.c
> @@ -987,7 +987,6 @@ static struct fixed_voltage_config
> camera_dummy_config = {
>  	.supply_name		= "camera_vdd",
>  	.input_supply		= "vcc cam",
>  	.microvolts		= 2800000,
> -	.gpio			= -1,
>  	.enable_high		= 0,
>  	.init_data		= &camera_dummy_initdata,
>  };
> diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
> index 2c90b58f347d..2b4bd6d94855 100644
> --- a/arch/arm/mach-pxa/ezx.c
> +++ b/arch/arm/mach-pxa/ezx.c
> @@ -21,6 +21,7 @@
>  #include <linux/regulator/fixed.h>
>  #include <linux/input.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/gpio_keys.h>
>  #include <linux/leds-lp3944.h>
>  #include <linux/platform_data/i2c-pxa.h>
> @@ -698,31 +699,39 @@ static struct pxa27x_keypad_platform_data
> e2_keypad_platform_data = {
>  
>  #if defined(CONFIG_MACH_EZX_A780) || defined(CONFIG_MACH_EZX_A910)
>  /* camera */
> -static struct regulator_consumer_supply camera_dummy_supplies[] = {
> +static struct regulator_consumer_supply camera_regulator_supplies[] =
> {
>  	REGULATOR_SUPPLY("vdd", "0-005d"),
>  };
>  
> -static struct regulator_init_data camera_dummy_initdata = {
> -	.consumer_supplies = camera_dummy_supplies,
> -	.num_consumer_supplies = ARRAY_SIZE(camera_dummy_supplies),
> +static struct regulator_init_data camera_regulator_initdata = {
> +	.consumer_supplies = camera_regulator_supplies,
> +	.num_consumer_supplies =
> ARRAY_SIZE(camera_regulator_supplies),
>  	.constraints = {
>  		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
>  	},
>  };
>  
> -static struct fixed_voltage_config camera_dummy_config = {
> +static struct fixed_voltage_config camera_regulator_config = {
>  	.supply_name		= "camera_vdd",
>  	.microvolts		= 2800000,
> -	.gpio			= GPIO50_nCAM_EN,
>  	.enable_high		= 0,
> -	.init_data		= &camera_dummy_initdata,
> +	.init_data		= &camera_regulator_initdata,
>  };
>  
> -static struct platform_device camera_supply_dummy_device = {
> +static struct platform_device camera_supply_regulator_device = {
>  	.name	= "reg-fixed-voltage",
>  	.id	= 1,
>  	.dev	= {
> -		.platform_data = &camera_dummy_config,
> +		.platform_data = &camera_regulator_config,
> +	},
> +};
> +
> +static struct gpiod_lookup_table camera_supply_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.1",
> +	.table = {
> +		GPIO_LOOKUP("gpio-pxa", GPIO50_nCAM_EN,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
>  	},
>  };
>  #endif
> @@ -800,7 +809,7 @@ static struct i2c_board_info a780_i2c_board_info[]
> = {
>  
>  static struct platform_device *a780_devices[] __initdata = {
>  	&a780_gpio_keys,
> -	&camera_supply_dummy_device,
> +	&camera_supply_regulator_device,
>  };
>  
>  static void __init a780_init(void)
> @@ -823,6 +832,7 @@ static void __init a780_init(void)
>  	if (a780_camera_init() == 0)
>  		pxa_set_camera_info(&a780_pxacamera_platform_data);
>  
> +	gpiod_add_lookup_table(&camera_supply_gpiod_table);
>  	pwm_add_table(ezx_pwm_lookup, ARRAY_SIZE(ezx_pwm_lookup));
>  	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
>  	platform_add_devices(ARRAY_AND_SIZE(a780_devices));
> @@ -892,6 +902,7 @@ static void __init e680_init(void)
>  
>  	pxa_set_keypad_info(&e680_keypad_platform_data);
>  
> +	gpiod_add_lookup_table(&camera_supply_gpiod_table);
>  	pwm_add_table(ezx_pwm_lookup, ARRAY_SIZE(ezx_pwm_lookup));
>  	platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
>  	platform_add_devices(ARRAY_AND_SIZE(e680_devices));
> @@ -1098,7 +1109,7 @@ static struct i2c_board_info __initdata
> a910_i2c_board_info[] = {
>  
>  static struct platform_device *a910_devices[] __initdata = {
>  	&a910_gpio_keys,
> -	&camera_supply_dummy_device,
> +	&camera_supply_regulator_device,
>  };
>  
>  static void __init a910_init(void)
> diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-
> pxa/magician.c
> index c5325d1ae77b..14c0f80bc9e7 100644
> --- a/arch/arm/mach-pxa/magician.c
> +++ b/arch/arm/mach-pxa/magician.c
> @@ -18,6 +18,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/delay.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/gpio_keys.h>
>  #include <linux/input.h>
>  #include <linux/mfd/htc-pasic3.h>
> @@ -696,7 +697,6 @@ static struct regulator_init_data
> vads7846_regulator = {
>  static struct fixed_voltage_config vads7846 = {
>  	.supply_name	= "vads7846",
>  	.microvolts	= 3300000, /* probably */
> -	.gpio		= -EINVAL,
>  	.startup_delay	= 0,
>  	.init_data	= &vads7846_regulator,
>  };
> diff --git a/arch/arm/mach-pxa/raumfeld.c b/arch/arm/mach-
> pxa/raumfeld.c
> index 034345546f84..ee766e4ebddc 100644
> --- a/arch/arm/mach-pxa/raumfeld.c
> +++ b/arch/arm/mach-pxa/raumfeld.c
> @@ -886,7 +886,6 @@ static struct regulator_init_data
> audio_va_initdata = {
>  static struct fixed_voltage_config audio_va_config = {
>  	.supply_name		= "audio_va",
>  	.microvolts		= 5000000,
> -	.gpio			= GPIO_AUDIO_VA_ENABLE,
>  	.enable_high		= 1,
>  	.enabled_at_boot	= 0,
>  	.init_data		= &audio_va_initdata,
> @@ -900,6 +899,15 @@ static struct platform_device audio_va_device = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table audio_va_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.0",
> +	.table = {
> +		GPIO_LOOKUP("gpio-pxa", GPIO_AUDIO_VA_ENABLE,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  /* Dummy supplies for Codec's VD/VLC */
>  
>  static struct regulator_consumer_supply audio_dummy_supplies[] = {
> @@ -918,7 +926,6 @@ static struct regulator_init_data
> audio_dummy_initdata = {
>  static struct fixed_voltage_config audio_dummy_config = {
>  	.supply_name		= "audio_vd",
>  	.microvolts		= 3300000,
> -	.gpio			= -1,
>  	.init_data		= &audio_dummy_initdata,
>  };
>  
> @@ -1033,6 +1040,7 @@ static void __init raumfeld_audio_init(void)
>  	else
>  		gpio_direction_output(GPIO_MCLK_RESET, 1);
>  
> +	gpiod_add_lookup_table(&audio_va_gpiod_table);
>  	platform_add_devices(ARRAY_AND_SIZE(audio_regulator_devices))
> ;
>  }
>  
> diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
> index e3851795d6d7..58e05afcece0 100644
> --- a/arch/arm/mach-pxa/zeus.c
> +++ b/arch/arm/mach-pxa/zeus.c
> @@ -17,6 +17,7 @@
>  #include <linux/irq.h>
>  #include <linux/pm.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/serial_8250.h>
>  #include <linux/dm9000.h>
>  #include <linux/mmc/host.h>
> @@ -410,7 +411,6 @@ static struct regulator_init_data
> can_regulator_init_data = {
>  static struct fixed_voltage_config can_regulator_pdata = {
>  	.supply_name	= "CAN_SHDN",
>  	.microvolts	= 3300000,
> -	.gpio		= ZEUS_CAN_SHDN_GPIO,
>  	.init_data	= &can_regulator_init_data,
>  };
>  
> @@ -422,6 +422,15 @@ static struct platform_device
> can_regulator_device = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table can_regulator_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.0",
> +	.table = {
> +		GPIO_LOOKUP("gpio-pxa", ZEUS_CAN_SHDN_GPIO,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static struct mcp251x_platform_data zeus_mcp2515_pdata = {
>  	.oscillator_frequency	= 16*1000*1000,
>  };
> @@ -538,7 +547,6 @@ static struct regulator_init_data
> zeus_ohci_regulator_data = {
>  static struct fixed_voltage_config zeus_ohci_regulator_config = {
>  	.supply_name		= "vbus2",
>  	.microvolts		= 5000000, /* 5.0V */
> -	.gpio			= ZEUS_USB2_PWREN_GPIO,
>  	.enable_high		= 1,
>  	.startup_delay		= 0,
>  	.init_data		= &zeus_ohci_regulator_data,
> @@ -552,6 +560,15 @@ static struct platform_device
> zeus_ohci_regulator_device = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table zeus_ohci_regulator_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.0",
> +	.table = {
> +		GPIO_LOOKUP("gpio-pxa", ZEUS_USB2_PWREN_GPIO,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static struct pxaohci_platform_data zeus_ohci_platform_data = {
>  	.port_mode	= PMM_NPS_MODE,
>  	/* Clear Power Control Polarity Low and set Power Sense
> @@ -855,6 +872,8 @@ static void __init zeus_init(void)
>  
>  	pxa2xx_mfp_config(ARRAY_AND_SIZE(zeus_pin_config));
>  
> +	gpiod_add_lookup_table(&can_regulator_gpiod_table);
> +	gpiod_add_lookup_table(&zeus_ohci_regulator_gpiod_table);
>  	platform_add_devices(zeus_devices, ARRAY_SIZE(zeus_devices));
>  
>  	zeus_register_ohci();
> diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-
> s3c64xx/mach-crag6410.c
> index f04650297487..379424d72ae7 100644
> --- a/arch/arm/mach-s3c64xx/mach-crag6410.c
> +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c
> @@ -352,7 +352,6 @@ static struct fixed_voltage_config wallvdd_pdata =
> {
>  	.supply_name = "WALLVDD",
>  	.microvolts = 5000000,
>  	.init_data = &wallvdd_data,
> -	.gpio = -EINVAL,
>  };
>  
>  static struct platform_device wallvdd_device = {
> diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-
> s3c64xx/mach-smdk6410.c
> index c46fa5dfd2e0..908e5aa831c8 100644
> --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
> +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
> @@ -222,7 +222,6 @@ static struct fixed_voltage_config
> smdk6410_b_pwr_5v_pdata = {
>  	.supply_name = "B_PWR_5V",
>  	.microvolts = 5000000,
>  	.init_data = &smdk6410_b_pwr_5v_data,
> -	.gpio = -EINVAL,
>  };
>  
>  static struct platform_device smdk6410_b_pwr_5v = {
> diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-
> sa1100/assabet.c
> index 575ec085cffa..dbb53c520165 100644
> --- a/arch/arm/mach-sa1100/assabet.c
> +++ b/arch/arm/mach-sa1100/assabet.c
> @@ -101,7 +101,7 @@ static int __init assabet_init_gpio(void __iomem
> *reg, u32 def_val)
>  
>  	assabet_bcr_gc = gc;
>  
> -	return gc->base;
> +	return 0;
>  }
>  
>  /*
> @@ -471,6 +471,14 @@ static struct fixed_voltage_config
> assabet_cf_vcc_pdata __initdata = {
>  	.enable_high = 1,
>  };
>  
> +static struct gpiod_lookup_table assabet_cf_vcc_gpio_table = {
> +	.dev_id = "reg-fixed-voltage.0",
> +	.table = {
> +		GPIO_LOOKUP("assabet", 0, "enable",
> GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static void __init assabet_init(void)
>  {
>  	/*
> @@ -517,9 +525,11 @@ static void __init assabet_init(void)
>  			neponset_resources,
> ARRAY_SIZE(neponset_resources));
>  #endif
>  	} else {
> +		gpiod_add_lookup_table(&assabet_cf_vcc_gpio_table);
>  		sa11x0_register_fixed_regulator(0,
> &assabet_cf_vcc_pdata,
> -					 assabet_cf_vcc_consumers,
> -					 ARRAY_SIZE(assabet_cf_vcc_co
> nsumers));
> +					assabet_cf_vcc_consumers,
> +					ARRAY_SIZE(assabet_cf_vcc_con
> sumers),
> +					true);
>  
>  	}
>  
> @@ -802,7 +812,6 @@ fs_initcall(assabet_leds_init);
>  
>  void __init assabet_init_irq(void)
>  {
> -	unsigned int assabet_gpio_base;
>  	u32 def_val;
>  
>  	sa1100_init_irq();
> @@ -817,9 +826,7 @@ void __init assabet_init_irq(void)
>  	 *
>  	 * This must precede any driver calls to BCR_set() or
> BCR_clear().
>  	 */
> -	assabet_gpio_base = assabet_init_gpio((void *)&ASSABET_BCR,
> def_val);
> -
> -	assabet_cf_vcc_pdata.gpio = assabet_gpio_base + 0;
> +	assabet_init_gpio((void *)&ASSABET_BCR, def_val);
>  }
>  
>  MACHINE_START(ASSABET, "Intel-Assabet")
> diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-
> sa1100/generic.c
> index 7167ddf84a0e..800321c6cbd8 100644
> --- a/arch/arm/mach-sa1100/generic.c
> +++ b/arch/arm/mach-sa1100/generic.c
> @@ -348,7 +348,8 @@ void __init sa11x0_init_late(void)
>  
>  int __init sa11x0_register_fixed_regulator(int n,
>  	struct fixed_voltage_config *cfg,
> -	struct regulator_consumer_supply *supplies, unsigned
> num_supplies)
> +	struct regulator_consumer_supply *supplies, unsigned
> num_supplies,
> +	bool uses_gpio)
>  {
>  	struct regulator_init_data *id;
>  
> @@ -356,7 +357,7 @@ int __init sa11x0_register_fixed_regulator(int n,
>  	if (!cfg->init_data)
>  		return -ENOMEM;
>  
> -	if (cfg->gpio < 0)
> +	if (!uses_gpio)
>  		id->constraints.always_on = 1;
>  	id->constraints.name = cfg->supply_name;
>  	id->constraints.min_uV = cfg->microvolts;
> diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-
> sa1100/generic.h
> index 5f3cb52fa6ab..158a4fd5ca24 100644
> --- a/arch/arm/mach-sa1100/generic.h
> +++ b/arch/arm/mach-sa1100/generic.h
> @@ -54,4 +54,5 @@ void sa11x0_register_pcmcia(int socket, struct
> gpiod_lookup_table *);
>  struct fixed_voltage_config;
>  struct regulator_consumer_supply;
>  int sa11x0_register_fixed_regulator(int n, struct
> fixed_voltage_config *cfg,
> -	struct regulator_consumer_supply *supplies, unsigned
> num_supplies);
> +	struct regulator_consumer_supply *supplies, unsigned
> num_supplies,
> +	bool uses_gpio);
> diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-
> sa1100/shannon.c
> index 22f7fe0b809f..5bc82e2671c6 100644
> --- a/arch/arm/mach-sa1100/shannon.c
> +++ b/arch/arm/mach-sa1100/shannon.c
> @@ -102,14 +102,14 @@ static struct fixed_voltage_config
> shannon_cf_vcc_pdata __initdata = {
>  	.supply_name = "cf-power",
>  	.microvolts = 3300000,
>  	.enabled_at_boot = 1,
> -	.gpio = -EINVAL,
>  };
>  
>  static void __init shannon_init(void)
>  {
>  	sa11x0_register_fixed_regulator(0, &shannon_cf_vcc_pdata,
>  					shannon_cf_vcc_consumers,
> -					ARRAY_SIZE(shannon_cf_vcc_con
> sumers));
> +					ARRAY_SIZE(shannon_cf_vcc_con
> sumers),
> +					false);
>  	sa11x0_register_pcmcia(0, &shannon_pcmcia0_gpio_table);
>  	sa11x0_register_pcmcia(1, &shannon_pcmcia1_gpio_table);
>  	sa11x0_ppc_configure_mcp();
> diff --git a/arch/sh/boards/mach-ecovec24/setup.c
> b/arch/sh/boards/mach-ecovec24/setup.c
> index adc61d14172c..c296b5c399b7 100644
> --- a/arch/sh/boards/mach-ecovec24/setup.c
> +++ b/arch/sh/boards/mach-ecovec24/setup.c
> @@ -633,7 +633,6 @@ static struct regulator_init_data
> cn12_power_init_data = {
>  static struct fixed_voltage_config cn12_power_info = {
>  	.supply_name = "CN12 SD/MMC Vdd",
>  	.microvolts = 3300000,
> -	.gpio = GPIO_PTB7,
>  	.enable_high = 1,
>  	.init_data = &cn12_power_init_data,
>  };
> @@ -646,6 +645,16 @@ static struct platform_device cn12_power = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table cn12_power_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.0",
> +	.table = {
> +		/* Offset 7 on port B */
> +		GPIO_LOOKUP("sh7724_pfc", GPIO_PTB7,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
>  /* SDHI0 */
>  static struct regulator_consumer_supply sdhi0_power_consumers[] =
> @@ -665,7 +674,6 @@ static struct regulator_init_data
> sdhi0_power_init_data = {
>  static struct fixed_voltage_config sdhi0_power_info = {
>  	.supply_name = "CN11 SD/MMC Vdd",
>  	.microvolts = 3300000,
> -	.gpio = GPIO_PTB6,
>  	.enable_high = 1,
>  	.init_data = &sdhi0_power_init_data,
>  };
> @@ -678,6 +686,16 @@ static struct platform_device sdhi0_power = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table sdhi0_power_gpiod_table = {
> +	.dev_id = "reg-fixed-voltage.1",
> +	.table = {
> +		/* Offset 6 on port B */
> +		GPIO_LOOKUP("sh7724_pfc", GPIO_PTB6,
> +			    "enable", GPIO_ACTIVE_HIGH),
> +		{ },
> +	},
> +};
> +
>  static struct tmio_mmc_data sdhi0_info = {
>  	.chan_priv_tx	= (void *)SHDMA_SLAVE_SDHI0_TX,
>  	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI0_RX,
> diff --git a/arch/x86/platform/intel-
> mid/device_libs/platform_bcm43xx.c b/arch/x86/platform/intel-
> mid/device_libs/platform_bcm43xx.c
> index 4392c15ed9e0..fc77d69e51d7 100644
> --- a/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
> +++ b/arch/x86/platform/intel-mid/device_libs/platform_bcm43xx.c
> @@ -10,7 +10,7 @@
>   * of the License.
>   */
>  
> -#include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/platform_device.h>
>  #include <linux/regulator/machine.h>
>  #include <linux/regulator/fixed.h>
> @@ -43,7 +43,6 @@ static struct fixed_voltage_config bcm43xx_vmmc = {
>  	 * real voltage and signaling are still 1.8V.
>  	 */
>  	.microvolts		= 2000000,		/* 1.8V
> */
> -	.gpio			= -EINVAL,
>  	.startup_delay		= 250 * 1000,		/*
> 250ms */
>  	.enable_high		= 1,			/*
> active high */
>  	.enabled_at_boot	= 0,			/*
> disabled at boot */
> @@ -58,11 +57,23 @@ static struct platform_device
> bcm43xx_vmmc_regulator = {
>  	},
>  };
>  
> +static struct gpiod_lookup_table bcm43xx_vmmc_gpio_table = {
> +	.dev_id	= "reg-fixed-voltage.0",
> +	.table	= {
> +		GPIO_LOOKUP("0000:00:0c.0", -1, "enable",
> GPIO_ACTIVE_LOW),
> +		{}
> +	},
> +};
> +
>  static int __init bcm43xx_regulator_register(void)
>  {
> +	struct gpiod_lookup_table *table = &bcm43xx_vmmc_gpio_table;
> +	struct gpiod_lookup *lookup = table->table;
>  	int ret;
>  
> -	bcm43xx_vmmc.gpio =
> get_gpio_by_name(WLAN_SFI_GPIO_ENABLE_NAME);
> +	lookup[0].chip_hwnum =
> get_gpio_by_name(WLAN_SFI_GPIO_ENABLE_NAME);
> +	gpiod_add_lookup_table(table);
> +
>  	ret = platform_device_register(&bcm43xx_vmmc_regulator);
>  	if (ret) {
>  		pr_err("%s: vmmc regulator register failed\n",
> __func__);
> diff --git a/drivers/regulator/fixed-helper.c
> b/drivers/regulator/fixed-helper.c
> index 777fac6fb4cb..2c6098e6f4bc 100644
> --- a/drivers/regulator/fixed-helper.c
> +++ b/drivers/regulator/fixed-helper.c
> @@ -43,7 +43,6 @@ struct platform_device
> *regulator_register_always_on(int id, const char *name,
>  	}
>  
>  	data->cfg.microvolts = uv;
> -	data->cfg.gpio = -EINVAL;
>  	data->cfg.enabled_at_boot = 1;
>  	data->cfg.init_data = &data->init_data;
>  
> diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
> index 988a7472c2ab..1142f195529b 100644
> --- a/drivers/regulator/fixed.c
> +++ b/drivers/regulator/fixed.c
> @@ -24,10 +24,9 @@
>  #include <linux/platform_device.h>
>  #include <linux/regulator/driver.h>
>  #include <linux/regulator/fixed.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/slab.h>
>  #include <linux/of.h>
> -#include <linux/of_gpio.h>
>  #include <linux/regulator/of_regulator.h>
>  #include <linux/regulator/machine.h>
>  
> @@ -78,10 +77,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);
> -	if ((config->gpio < 0) && (config->gpio != -ENOENT))
> -		return ERR_PTR(config->gpio);
> -
>  	of_property_read_u32(np, "startup-delay-us", &config-
> >startup_delay);
>  
>  	config->enable_high = of_property_read_bool(np, "enable-
> active-high");
> @@ -102,6 +97,7 @@ static int reg_fixed_voltage_probe(struct
> platform_device *pdev)
>  	struct fixed_voltage_config *config;
>  	struct fixed_voltage_data *drvdata;
>  	struct regulator_config cfg = { };
> +	enum gpiod_flags gflags;
>  	int ret;
>  
>  	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct
> fixed_voltage_data),
> @@ -150,25 +146,28 @@ static int reg_fixed_voltage_probe(struct
> platform_device *pdev)
>  
>  	drvdata->desc.fixed_uV = config->microvolts;
>  
> -	if (gpio_is_valid(config->gpio)) {
> -		cfg.ena_gpio = config->gpio;
> -		if (pdev->dev.of_node)
> -			cfg.ena_gpio_initialized = true;
> -	}
>  	cfg.ena_gpio_invert = !config->enable_high;
>  	if (config->enabled_at_boot) {
>  		if (config->enable_high)
> -			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
> +			gflags = GPIOD_OUT_HIGH;
>  		else
> -			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
> +			gflags = GPIOD_OUT_LOW;
>  	} else {
>  		if (config->enable_high)
> -			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
> +			gflags = GPIOD_OUT_LOW;
>  		else
> -			cfg.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
> +			gflags = GPIOD_OUT_HIGH;
>  	}
> -	if (config->gpio_is_open_drain)
> -		cfg.ena_gpio_flags |= GPIOF_OPEN_DRAIN;
> +	if (config->gpio_is_open_drain) {
> +		if (gflags == GPIOD_OUT_HIGH)
> +			gflags = GPIOD_OUT_HIGH_OPEN_DRAIN;
> +		else
> +			gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
> +	}
> +
> +	cfg.ena_gpiod = devm_gpiod_get_optional(&pdev->dev, NULL,
> gflags);
> +	if (IS_ERR(cfg.ena_gpiod))
> +		return PTR_ERR(cfg.ena_gpiod);
>  
>  	cfg.dev = &pdev->dev;
>  	cfg.init_data = config->init_data;
> diff --git a/include/linux/regulator/fixed.h
> b/include/linux/regulator/fixed.h
> index 48918be649d4..1a4340ed8e2b 100644
> --- a/include/linux/regulator/fixed.h
> +++ b/include/linux/regulator/fixed.h
> @@ -24,8 +24,6 @@ struct regulator_init_data;
>   * @supply_name:	Name of the regulator supply
>   * @input_supply:	Name of the input regulator supply
>   * @microvolts:		Output voltage of regulator
> - * @gpio:		GPIO to use for enable control
> - * 			set to -EINVAL if not used
>   * @startup_delay:	Start-up time in microseconds
>   * @gpio_is_open_drain: Gpio pin is open drain or normal type.
>   *			If it is open drain type then HIGH will be
> set
> @@ -49,7 +47,6 @@ struct fixed_voltage_config {
>  	const char *supply_name;
>  	const char *input_supply;
>  	int microvolts;
> -	int gpio;
>  	unsigned startup_delay;
>  	unsigned gpio_is_open_drain:1;
>  	unsigned enable_high:1;

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
  2018-05-14 11:03   ` Andy Shevchenko
@ 2018-05-14 11:49   ` Geert Uytterhoeven
  2018-05-17 19:50   ` Tony Lindgren
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 50+ messages in thread
From: Geert Uytterhoeven @ 2018-05-14 11:49 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, Linux Kernel Mailing List,
	Andy Shevchenko, Alexander Shiyan, Haojian Zhuang, Aaro Koskinen,
	Tony Lindgren, Mike Rapoport, Robert Jarzmik, Philipp Zabel,
	Daniel Mack, Marc Zyngier, Geert Uytterhoeven, Russell King,
	Jacopo Mondi

Hi Linus,

On Mon, May 14, 2018 at 10:06 AM, Linus Walleij
<linus.walleij@linaro.org> wrote:
> As we augmented the regulator core to accept a GPIO descriptor instead
> of a GPIO number, we can augment the fixed GPIO regulator to look up
> and pass that descriptor directly from device tree or board GPIO
> descriptor look up tables.
>
> Some boards just auto-enumerate their fixed regulator platform devices
> and I have assumed they get names like "fixed-regulator.0" but it's
> pretty hard to guess this. I need some testing from board maintainers to
> be sure. Other boards are straight forward, using just plain
> "fixed-regulator" (ID -1) or "fixed-regulator.1" hammering down the
> device ID.
>
> The OMAP didn't have proper label names on its GPIO chips so I have fixed
> this with a separate patch to the GPIO tree, see
> commit 088413bc0bd5f5fb66ca22a19d66a49d7154ba4c
> "gpio: omap: Give unique labels to each GPIO bank/chip"
>
> It seems the da9055 and da9211 has never got around to actually passing
> any enable gpio into its platform data (not the in-tree code anyway) so we
> can just decide to simply pass a descriptor instead.
>
> The fixed GPIO-controlled regulator in mach-pxa/ezx.c was confusingly named
> "*_dummy_supply_device" while it is a very real device backed by a GPIO
> line. There is nothing dummy about it at all, so I renamed it with the
> infix *_regulator_* as part of this patch set.
>
> For the patch hunk hitting arch/blackfin I would say I do not expect
> testing, review or ACKs anymore so if it works, it works.
>
> The hunk hitting the x86 BCM43xx driver is especially tricky as the number
> comes out of SFI which is a mystery to me. I definately need someone to
> look at this. (Hi Andy.)

Thanks for your patch!

> Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer

IIRC, Jacopo (CC) has an Ecovec24.

> --- a/arch/sh/boards/mach-ecovec24/setup.c
> +++ b/arch/sh/boards/mach-ecovec24/setup.c
> @@ -633,7 +633,6 @@ static struct regulator_init_data cn12_power_init_data = {
>  static struct fixed_voltage_config cn12_power_info = {
>         .supply_name = "CN12 SD/MMC Vdd",
>         .microvolts = 3300000,
> -       .gpio = GPIO_PTB7,
>         .enable_high = 1,
>         .init_data = &cn12_power_init_data,
>  };
> @@ -646,6 +645,16 @@ static struct platform_device cn12_power = {
>         },
>  };
>
> +static struct gpiod_lookup_table cn12_power_gpiod_table = {
> +       .dev_id = "reg-fixed-voltage.0",
> +       .table = {
> +               /* Offset 7 on port B */
> +               GPIO_LOOKUP("sh7724_pfc", GPIO_PTB7,
> +                           "enable", GPIO_ACTIVE_HIGH),
> +               { },
> +       },
> +};
> +
>  #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
>  /* SDHI0 */
>  static struct regulator_consumer_supply sdhi0_power_consumers[] =
> @@ -665,7 +674,6 @@ static struct regulator_init_data sdhi0_power_init_data = {
>  static struct fixed_voltage_config sdhi0_power_info = {
>         .supply_name = "CN11 SD/MMC Vdd",
>         .microvolts = 3300000,
> -       .gpio = GPIO_PTB6,
>         .enable_high = 1,
>         .init_data = &sdhi0_power_init_data,
>  };
> @@ -678,6 +686,16 @@ static struct platform_device sdhi0_power = {
>         },
>  };
>
> +static struct gpiod_lookup_table sdhi0_power_gpiod_table = {
> +       .dev_id = "reg-fixed-voltage.1",
> +       .table = {
> +               /* Offset 6 on port B */
> +               GPIO_LOOKUP("sh7724_pfc", GPIO_PTB6,
> +                           "enable", GPIO_ACTIVE_HIGH),
> +               { },
> +       },
> +};
> +
>  static struct tmio_mmc_data sdhi0_info = {
>         .chan_priv_tx   = (void *)SHDMA_SLAVE_SDHI0_TX,
>         .chan_priv_rx   = (void *)SHDMA_SLAVE_SDHI0_RX,

No calls to gpiod_add_lookup_table() to add to arch_setup()?

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core
  2018-05-14  8:06 ` [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core Linus Walleij
@ 2018-05-15 11:53   ` Charles Keepax
  2018-05-17 16:41   ` Applied "regulator: arizona-ldo1: Look up a descriptor and pass to the core" to the regulator tree Mark Brown
  1 sibling, 0 replies; 50+ messages in thread
From: Charles Keepax @ 2018-05-15 11:53 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, patches, Richard Fitzgerald

On Mon, May 14, 2018 at 10:06:24AM +0200, Linus Walleij wrote:
> 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".
> 
> Cc: patches@opensource.cirrus.com
> Cc: Richard Fitzgerald <rf@opensource.cirrus.com>
> Cc: Charles Keepax <ckeepax@opensource.cirrus.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---

Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>

Thanks,
Charles

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups
  2018-05-14  8:06 ` [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups Linus Walleij
@ 2018-05-17  5:06   ` Mark Brown
  2018-05-21 11:24     ` Linus Walleij
  0 siblings, 1 reply; 50+ messages in thread
From: Mark Brown @ 2018-05-17  5:06 UTC (permalink / raw)
  To: Linus Walleij; +Cc: Liam Girdwood, linux-kernel, Charles Keepax

[-- Attachment #1: Type: text/plain, Size: 683 bytes --]

On Mon, May 14, 2018 at 10:06:40AM +0200, Linus Walleij wrote:
> From: Charles Keepax <ckeepax@opensource.cirrus.com>
> 
> Rather than unconditionally registering the GPIO lookup table only do so
> for devices that require it.
> 
> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
> [Fixed up to also handle wm5102 and wm5102 reva]
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v2->v3:
> - Including this in my patch series.
> ---
>  arch/arm/mach-s3c64xx/mach-crag6410-module.c | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)

You need to send this patch to the Samsung platform maintainers...

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 484 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Applied "regulator: max77686: Pass descriptor instead of GPIO number" to the regulator tree
  2018-05-14  8:06 ` [PATCH 05/19 v3] regulator: max77686: " Linus Walleij
  2018-05-14  9:28   ` Krzysztof Kozlowski
@ 2018-05-17 16:41   ` Mark Brown
  1 sibling, 0 replies; 50+ messages in thread
From: Mark Brown @ 2018-05-17 16:41 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Krzysztof Kozlowski, Mark Brown, Liam Girdwood, Mark Brown,
	linux-kernel, Chanwoo Choi, Krzysztof Kozlowski,
	Bartlomiej Zolnierkiewicz, linux-kernel

The patch

   regulator: max77686: Pass descriptor instead of GPIO number

has been applied to the regulator tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From c89c00e2b8f034891d2550df5ba6fae39f3bf563 Mon Sep 17 00:00:00 2001
From: Linus Walleij <linus.walleij@linaro.org>
Date: Mon, 14 May 2018 10:06:26 +0200
Subject: [PATCH] regulator: max77686: Pass descriptor instead of GPIO number

Instead of passing a global GPIO number, pass a descriptor looked
up from the device tree configuration node.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org>
Tested-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 drivers/regulator/max77686-regulator.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/regulator/max77686-regulator.c b/drivers/regulator/max77686-regulator.c
index c301f3733475..37f98a8350f0 100644
--- a/drivers/regulator/max77686-regulator.c
+++ b/drivers/regulator/max77686-regulator.c
@@ -25,8 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/bug.h>
 #include <linux/err.h>
-#include <linux/gpio.h>
-#include <linux/of_gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/slab.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
@@ -90,6 +89,7 @@ enum max77686_ramp_rate {
 };
 
 struct max77686_data {
+	struct device *dev;
 	DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS);
 
 	/* Array indexed by regulator id */
@@ -269,16 +269,20 @@ static int max77686_of_parse_cb(struct device_node *np,
 	case MAX77686_BUCK8:
 	case MAX77686_BUCK9:
 	case MAX77686_LDO20 ... MAX77686_LDO22:
-		config->ena_gpio = of_get_named_gpio(np,
-					"maxim,ena-gpios", 0);
-		config->ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
-		config->ena_gpio_initialized = true;
+		config->ena_gpiod = devm_gpiod_get_from_of_node(max77686->dev,
+								np,
+								"maxim,ena",
+								0,
+								GPIOD_OUT_HIGH,
+								"max77686-regulator");
+		if (IS_ERR(config->ena_gpiod))
+			config->ena_gpiod = NULL;
 		break;
 	default:
 		return 0;
 	}
 
-	if (gpio_is_valid(config->ena_gpio)) {
+	if (config->ena_gpiod) {
 		set_bit(desc->id, max77686->gpio_enabled);
 
 		return regmap_update_bits(config->regmap, desc->enable_reg,
@@ -521,6 +525,7 @@ static int max77686_pmic_probe(struct platform_device *pdev)
 	if (!max77686)
 		return -ENOMEM;
 
+	max77686->dev = &pdev->dev;
 	config.dev = iodev->dev;
 	config.regmap = iodev->regmap;
 	config.driver_data = max77686;
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* Applied "regulator: arizona-ldo1: Look up a descriptor and pass to the core" to the regulator tree
  2018-05-14  8:06 ` [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core Linus Walleij
  2018-05-15 11:53   ` Charles Keepax
@ 2018-05-17 16:41   ` Mark Brown
  1 sibling, 0 replies; 50+ messages in thread
From: Mark Brown @ 2018-05-17 16:41 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Charles Keepax, Mark Brown, Liam Girdwood, Mark Brown,
	linux-kernel, patches, Richard Fitzgerald, Charles Keepax,
	linux-kernel

The patch

   regulator: arizona-ldo1: Look up a descriptor and pass to the core

has been applied to the regulator tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From e1739e86f0cb9c48e8745a610e6981a4e24cadad Mon Sep 17 00:00:00 2001
From: Linus Walleij <linus.walleij@linaro.org>
Date: Mon, 14 May 2018 10:06:24 +0200
Subject: [PATCH] regulator: arizona-ldo1: Look up a descriptor and pass to the
 core

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 | 28 +++++++++++++++-----
 drivers/regulator/arizona-ldo1.c             | 19 +++++--------
 include/linux/regulator/arizona-ldo1.h       |  3 ---
 3 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
index f00988705408..5aa472892465 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c
@@ -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);
diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c
index 96fddfff5dc4..f6d6a4ad9e8a 100644
--- a/drivers/regulator/arizona-ldo1.c
+++ b/drivers/regulator/arizona-ldo1.c
@@ -17,12 +17,11 @@
 #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;
diff --git a/include/linux/regulator/arizona-ldo1.h b/include/linux/regulator/arizona-ldo1.h
index c685f1277c63..fe74ab9990e6 100644
--- a/include/linux/regulator/arizona-ldo1.h
+++ b/include/linux/regulator/arizona-ldo1.h
@@ -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;
 };
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
  2018-05-14 11:03   ` Andy Shevchenko
  2018-05-14 11:49   ` Geert Uytterhoeven
@ 2018-05-17 19:50   ` Tony Lindgren
  2018-05-30 21:27   ` Arnd Bergmann
  2018-06-01  9:35   ` Thierry Reding
  4 siblings, 0 replies; 50+ messages in thread
From: Tony Lindgren @ 2018-05-17 19:50 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Mike Rapoport,
	Robert Jarzmik, Philipp Zabel, Daniel Mack, Marc Zyngier,
	Geert Uytterhoeven, Russell King

* Linus Walleij <linus.walleij@linaro.org> [180514 08:08]:
> As we augmented the regulator core to accept a GPIO descriptor instead
> of a GPIO number, we can augment the fixed GPIO regulator to look up
> and pass that descriptor directly from device tree or board GPIO
> descriptor look up tables.
...
>  arch/arm/mach-omap1/board-ams-delta.c         | 14 +++++++-
>  arch/arm/mach-omap2/pdata-quirks.c            | 16 ++++++++-

Looks OK to me:

Acked-by: Tony Lindgren <tony@atomide.com>

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups
  2018-05-17  5:06   ` Mark Brown
@ 2018-05-21 11:24     ` Linus Walleij
  0 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-21 11:24 UTC (permalink / raw)
  To: Mark Brown; +Cc: Liam Girdwood, linux-kernel, Charles Keepax

On Thu, May 17, 2018 at 7:06 AM, Mark Brown <broonie@kernel.org> wrote:
> On Mon, May 14, 2018 at 10:06:40AM +0200, Linus Walleij wrote:
>> From: Charles Keepax <ckeepax@opensource.cirrus.com>
>>
>> Rather than unconditionally registering the GPIO lookup table only do so
>> for devices that require it.
>>
>> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
>> [Fixed up to also handle wm5102 and wm5102 reva]
>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
>> ---
>> ChangeLog v2->v3:
>> - Including this in my patch series.
>> ---
>>  arch/arm/mach-s3c64xx/mach-crag6410-module.c | 18 +++++++++++-------
>>  1 file changed, 11 insertions(+), 7 deletions(-)
>
> You need to send this patch to the Samsung platform maintainers...

Right. As it sits on top of the other patches we can take it on
a side track later anyways through their tree.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14 11:03   ` Andy Shevchenko
@ 2018-05-21 11:27     ` Linus Walleij
  2018-07-06 15:21       ` Andy Shevchenko
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Walleij @ 2018-05-21 11:27 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Alexander Shiyan,
	Haojian Zhuang, Aaro Koskinen, Tony Lindgren, Mike Rapoport,
	Robert Jarzmik, Philipp Zabel, Daniel Mack, Marc Zyngier,
	Geert Uytterhoeven, Russell King

On Mon, May 14, 2018 at 1:03 PM, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> On Mon, 2018-05-14 at 10:06 +0200, Linus Walleij wrote:

>> The hunk hitting the x86 BCM43xx driver is especially tricky as the
>> number
>> comes out of SFI which is a mystery to me. I definately need someone
>> to
>> look at this. (Hi Andy.)
>
> Since there is no link to repo with a branch and I wasn't Cc'ed to cover
> letter, asking here for a such. I would then pull it and test on real
> hardware.

I'm sorry about this.
This branch:
https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git/log/?h=gpio-descriptors-regulator

Has all the patches.

git pull git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
gpio-descriptors-regulator

will bring in the patches to a testing branch.

> The code itself looks good, so:
>
> Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
> for Intel MID bits.

Thanks!

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-14  8:06 ` [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number Linus Walleij
  2018-05-14  9:42   ` Krzysztof Kozlowski
@ 2018-05-26 10:02   ` Mark Brown
  2018-05-28  8:41     ` Linus Walleij
  1 sibling, 1 reply; 50+ messages in thread
From: Mark Brown @ 2018-05-26 10:02 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, linux-kernel, Krzysztof Kozlowski, Sangbeom Kim,
	Chanwoo Choi

[-- Attachment #1: Type: text/plain, Size: 614 bytes --]

On Mon, May 14, 2018 at 10:06:31AM +0200, Linus Walleij wrote:
> Instead of passing a global GPIO number for the enable GPIO, pass
> a descriptor looked up with the standard devm_gpiod_get_optional()
> call.
> 
> This regulator supports passing platform data, but enable/sleep
> regulators are looked up from the device tree exclusively, so
> we can need not touch other files.

This seems to have broken the boot on Odroid XU3 so I'm going to revert
it:

https://storage.kernelci.org/next/master/v4.17-rc6-9523-g47b9cef0672d/arm/multi_v7_defconfig/lab-baylibre-seattle/boot-exynos5422-odroidxu3.html

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-26 10:02   ` Mark Brown
@ 2018-05-28  8:41     ` Linus Walleij
       [not found]       ` <CGME20180528112908eucas1p2946a9b6385fcaf6c19921c9767420405@eucas1p2.samsung.com>
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Walleij @ 2018-05-28  8:41 UTC (permalink / raw)
  To: Mark Brown
  Cc: Liam Girdwood, linux-kernel, Krzysztof Kozlowski, Sangbeom Kim,
	Chanwoo Choi

On Sat, May 26, 2018 at 12:02 PM, Mark Brown <broonie@kernel.org> wrote:
> On Mon, May 14, 2018 at 10:06:31AM +0200, Linus Walleij wrote:
>> Instead of passing a global GPIO number for the enable GPIO, pass
>> a descriptor looked up with the standard devm_gpiod_get_optional()
>> call.
>>
>> This regulator supports passing platform data, but enable/sleep
>> regulators are looked up from the device tree exclusively, so
>> we can need not touch other files.
>
> This seems to have broken the boot on Odroid XU3 so I'm going to revert
> it:
>
> https://storage.kernelci.org/next/master/v4.17-rc6-9523-g47b9cef0672d/arm/multi_v7_defconfig/lab-baylibre-seattle/boot-exynos5422-odroidxu3.html

How annoying. I will check with a colleague who might have this
board so I can test it on hardware.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
       [not found]       ` <CGME20180528112908eucas1p2946a9b6385fcaf6c19921c9767420405@eucas1p2.samsung.com>
@ 2018-05-28 11:29         ` Bartlomiej Zolnierkiewicz
  2018-05-28 12:26           ` Andy Shevchenko
                             ` (2 more replies)
  0 siblings, 3 replies; 50+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2018-05-28 11:29 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Mark Brown, Liam Girdwood, linux-kernel, Krzysztof Kozlowski,
	Sangbeom Kim, Chanwoo Choi


Hi Linus,

On Monday, May 28, 2018 10:41:31 AM Linus Walleij wrote:
> On Sat, May 26, 2018 at 12:02 PM, Mark Brown <broonie@kernel.org> wrote:
> > On Mon, May 14, 2018 at 10:06:31AM +0200, Linus Walleij wrote:
> >> Instead of passing a global GPIO number for the enable GPIO, pass
> >> a descriptor looked up with the standard devm_gpiod_get_optional()
> >> call.
> >>
> >> This regulator supports passing platform data, but enable/sleep
> >> regulators are looked up from the device tree exclusively, so
> >> we can need not touch other files.
> >
> > This seems to have broken the boot on Odroid XU3 so I'm going to revert
> > it:
> >
> > https://storage.kernelci.org/next/master/v4.17-rc6-9523-g47b9cef0672d/arm/multi_v7_defconfig/lab-baylibre-seattle/boot-exynos5422-odroidxu3.html
> 
> How annoying. I will check with a colleague who might have this
> board so I can test it on hardware.

I've reproduced the problem on TM2e board and the patch below fixes
it (old code always initialized the structure, new code does it only
in case GPIO properties are provided).

I've also tested the new code (with fixup) on Artik5 board (which
actually uses GPIO properties) and discovered the other problem,
the GPIO core code doesn't handle shared GPIOs which are used by
many platforms.

Old code:
[    1.094950] s2mps11-pmic s2mps14-regulator: Using GPIO 21 for ext-control over 10/LDO11
[    1.095210] s2mps11-pmic s2mps14-regulator: Using GPIO 21 for ext-control over 11/LDO12

New code (with fixup):
[    1.114288] s2mps11-pmic s2mps14-regulator: Using GPIO for ext-control over 10/LDO11
[    1.143209] s2mps11-pmic s2mps14-regulator: Failed to get control GPIO for 11/LDO12

[ It fails with -EBUSY on gpiod_request() in gpiod_get_from_of_node(). ]

Therefore it seems that more work is needed before s2mps11 driver
can be converted to use GPIO descriptors.

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics


Index: b/drivers/regulator/s2mps11.c
===================================================================
--- a/drivers/regulator/s2mps11.c	2018-05-28 10:53:58.121322472 +0200
+++ b/drivers/regulator/s2mps11.c	2018-05-28 11:33:38.613382421 +0200
@@ -1147,7 +1147,7 @@ static int s2mps11_pmic_probe(struct pla
 		return -EINVAL;
 	}
 
-	s2mps11->ext_control_gpiod = devm_kmalloc(&pdev->dev,
+	s2mps11->ext_control_gpiod = devm_kzalloc(&pdev->dev,
 			sizeof(*s2mps11->ext_control_gpiod) * rdev_num,
 			GFP_KERNEL);
 	if (!s2mps11->ext_control_gpiod)

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-28 11:29         ` Bartlomiej Zolnierkiewicz
@ 2018-05-28 12:26           ` Andy Shevchenko
  2018-05-30  7:10             ` Linus Walleij
  2018-05-29 14:47           ` Mark Brown
       [not found]           ` <CGME20180530134408eucas1p14c6d7fe692e2ed91ef833c8a1ead8ce7@eucas1p1.samsung.com>
  2 siblings, 1 reply; 50+ messages in thread
From: Andy Shevchenko @ 2018-05-28 12:26 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz
  Cc: Linus Walleij, Mark Brown, Liam Girdwood, linux-kernel,
	Krzysztof Kozlowski, Sangbeom Kim, Chanwoo Choi

On Mon, May 28, 2018 at 2:29 PM, Bartlomiej Zolnierkiewicz
<b.zolnierkie@samsung.com> wrote:

> -       s2mps11->ext_control_gpiod = devm_kmalloc(&pdev->dev,
> +       s2mps11->ext_control_gpiod = devm_kzalloc(&pdev->dev,
>                         sizeof(*s2mps11->ext_control_gpiod) * rdev_num,
>                         GFP_KERNEL);

devm_kcalloc() I would rather use.

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-28 11:29         ` Bartlomiej Zolnierkiewicz
  2018-05-28 12:26           ` Andy Shevchenko
@ 2018-05-29 14:47           ` Mark Brown
       [not found]           ` <CGME20180530134408eucas1p14c6d7fe692e2ed91ef833c8a1ead8ce7@eucas1p1.samsung.com>
  2 siblings, 0 replies; 50+ messages in thread
From: Mark Brown @ 2018-05-29 14:47 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz
  Cc: Linus Walleij, Liam Girdwood, linux-kernel, Krzysztof Kozlowski,
	Sangbeom Kim, Chanwoo Choi

[-- Attachment #1: Type: text/plain, Size: 442 bytes --]

On Mon, May 28, 2018 at 01:29:07PM +0200, Bartlomiej Zolnierkiewicz wrote:

> I've also tested the new code (with fixup) on Artik5 board (which
> actually uses GPIO properties) and discovered the other problem,
> the GPIO core code doesn't handle shared GPIOs which are used by
> many platforms.

If the GPIO code is moved to use the regulator API GPIO support that
should hopefully deal with it (or we have a lot more boards with
problems).

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib
  2018-05-14  8:06 ` [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib Linus Walleij
@ 2018-05-29 14:54   ` Mark Brown
  2018-05-30  7:15     ` Linus Walleij
  0 siblings, 1 reply; 50+ messages in thread
From: Mark Brown @ 2018-05-29 14:54 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, linux-kernel, Alexander Shiyan, Haojian Zhuang,
	Aaro Koskinen, Tony Lindgren, Mike Rapoport, Robert Jarzmik,
	Philipp Zabel, Daniel Mack, Marc Zyngier, Geert Uytterhoeven,
	Russell King

[-- Attachment #1: Type: text/plain, Size: 201 bytes --]

On Mon, May 14, 2018 at 10:06:36AM +0200, Linus Walleij wrote:

>  arch/arm/mach-pxa/hx4700.c                    |  3 +-

This doesn't apply against the above file in my tree, please check and
resend.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-28 12:26           ` Andy Shevchenko
@ 2018-05-30  7:10             ` Linus Walleij
  0 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-30  7:10 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Bartlomiej Zolnierkiewicz, Mark Brown, Liam Girdwood,
	linux-kernel, Krzysztof Kozlowski, Sangbeom Kim, Chanwoo Choi

On Mon, May 28, 2018 at 2:26 PM, Andy Shevchenko
<andy.shevchenko@gmail.com> wrote:
> On Mon, May 28, 2018 at 2:29 PM, Bartlomiej Zolnierkiewicz
> <b.zolnierkie@samsung.com> wrote:
>
>> -       s2mps11->ext_control_gpiod = devm_kmalloc(&pdev->dev,
>> +       s2mps11->ext_control_gpiod = devm_kzalloc(&pdev->dev,
>>                         sizeof(*s2mps11->ext_control_gpiod) * rdev_num,
>>                         GFP_KERNEL);
>
> devm_kcalloc() I would rather use.

The patch replace kmalloc with kzalloc amd kcalloc does not initialize
memory to zero.

We don't have demv_kzcalloc() I'm afraid, I wonder it even makes
sense to add?

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib
  2018-05-29 14:54   ` Mark Brown
@ 2018-05-30  7:15     ` Linus Walleij
  0 siblings, 0 replies; 50+ messages in thread
From: Linus Walleij @ 2018-05-30  7:15 UTC (permalink / raw)
  To: Mark Brown
  Cc: Liam Girdwood, linux-kernel, Alexander Shiyan, Haojian Zhuang,
	Aaro Koskinen, Tony Lindgren, Mike Rapoport, Robert Jarzmik,
	Philipp Zabel, Daniel Mack, Marc Zyngier, Geert Uytterhoeven,
	Russell King

On Tue, May 29, 2018 at 4:54 PM, Mark Brown <broonie@kernel.org> wrote:
> On Mon, May 14, 2018 at 10:06:36AM +0200, Linus Walleij wrote:
>
>>  arch/arm/mach-pxa/hx4700.c                    |  3 +-
>
> This doesn't apply against the above file in my tree, please check and
> resend.

How typical. I say let's defer this to v4.19 and first see that we land
the fixed regulators conversion first and I'll rebase this on top there.
There is no stress with this so we can take it one step at the time.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
       [not found]           ` <CGME20180530134408eucas1p14c6d7fe692e2ed91ef833c8a1ead8ce7@eucas1p1.samsung.com>
@ 2018-05-30 13:44             ` Bartlomiej Zolnierkiewicz
  2018-05-30 14:16               ` Mark Brown
  0 siblings, 1 reply; 50+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2018-05-30 13:44 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Mark Brown, Liam Girdwood, linux-kernel, Krzysztof Kozlowski,
	Sangbeom Kim, Chanwoo Choi, Marek Szyprowski

On Monday, May 28, 2018 01:29:07 PM Bartlomiej Zolnierkiewicz wrote:
> 
> Hi Linus,
> 
> On Monday, May 28, 2018 10:41:31 AM Linus Walleij wrote:
> > On Sat, May 26, 2018 at 12:02 PM, Mark Brown <broonie@kernel.org> wrote:
> > > On Mon, May 14, 2018 at 10:06:31AM +0200, Linus Walleij wrote:
> > >> Instead of passing a global GPIO number for the enable GPIO, pass
> > >> a descriptor looked up with the standard devm_gpiod_get_optional()
> > >> call.
> > >>
> > >> This regulator supports passing platform data, but enable/sleep
> > >> regulators are looked up from the device tree exclusively, so
> > >> we can need not touch other files.
> > >
> > > This seems to have broken the boot on Odroid XU3 so I'm going to revert
> > > it:
> > >
> > > https://storage.kernelci.org/next/master/v4.17-rc6-9523-g47b9cef0672d/arm/multi_v7_defconfig/lab-baylibre-seattle/boot-exynos5422-odroidxu3.html
> > 
> > How annoying. I will check with a colleague who might have this
> > board so I can test it on hardware.
> 
> I've reproduced the problem on TM2e board and the patch below fixes
> it (old code always initialized the structure, new code does it only
> in case GPIO properties are provided).
> 
> I've also tested the new code (with fixup) on Artik5 board (which
> actually uses GPIO properties) and discovered the other problem,
> the GPIO core code doesn't handle shared GPIOs which are used by
> many platforms.
> 
> Old code:
> [    1.094950] s2mps11-pmic s2mps14-regulator: Using GPIO 21 for ext-control over 10/LDO11
> [    1.095210] s2mps11-pmic s2mps14-regulator: Using GPIO 21 for ext-control over 11/LDO12
> 
> New code (with fixup):
> [    1.114288] s2mps11-pmic s2mps14-regulator: Using GPIO for ext-control over 10/LDO11
> [    1.143209] s2mps11-pmic s2mps14-regulator: Failed to get control GPIO for 11/LDO12
> 
> [ It fails with -EBUSY on gpiod_request() in gpiod_get_from_of_node(). ]
> 
> Therefore it seems that more work is needed before s2mps11 driver
> can be converted to use GPIO descriptors.

The similar issue with shared GPIOs seems to be present in commit
c89c00e2b8f0 ("regulator: max77686: Pass descriptor instead of GPIO
number") and Midas board (arch/arm/boot/dts/exynos4412-midas.dtsi).
I don't have the board itself to test it but from the code audit it
seems that commit c89c00e2b8f0 should also be reverted.

Marek has also discovered separate problem on Trats2 board with
commit 3c6b38d45fa5 ("regulator: wm8994: Pass descriptor instead of
GPIO number"):

[    2.278330] wm8994 4-001a: Failed to get supply 'DBVDD1': -517
[    2.282773] wm8994 4-001a: Failed to get supplies: -517
[    2.291919] ------------[ cut here ]------------
[    2.295210] WARNING: CPU: 3 PID: 1 at drivers/gpio/gpiolib.c:2399 
release_nodes+0x178/0x1fc
[    2.303562] Modules linked in:
[    2.306483] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 
4.17.0-rc7-next-20180530-00001-g06c3288f5beb #811
[    2.315920] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[    2.321975] [<c011313c>] (unwind_backtrace) from [<c010ed20>] 
(show_stack+0x10/0x14)
[    2.329715] [<c010ed20>] (show_stack) from [<c0a3c070>] 
(dump_stack+0x98/0xc4)
[    2.336913] [<c0a3c070>] (dump_stack) from [<c0127a50>] 
(__warn+0x10c/0x124)
[    2.343935] [<c0127a50>] (__warn) from [<c0127b7c>] 
(warn_slowpath_null+0x40/0x48)
[    2.351495] [<c0127b7c>] (warn_slowpath_null) from [<c057e564>] 
(release_nodes+0x178/0x1fc)
[    2.359838] [<c057e564>] (release_nodes) from [<c0579dd8>] 
(driver_probe_device+0xe8/0x4a4)
[    2.368169] [<c0579dd8>] (driver_probe_device) from [<c057a298>] 
(__driver_attach+0x104/0x120)
[    2.376765] [<c057a298>] (__driver_attach) from [<c0577ef8>] 
(bus_for_each_dev+0x68/0xb4)
[    2.384920] [<c0577ef8>] (bus_for_each_dev) from [<c057915c>] 
(bus_add_driver+0x1a8/0x268)
[    2.393166] [<c057915c>] (bus_add_driver) from [<c057b3ec>] 
(driver_register+0x78/0x10c)
[    2.401243] [<c057b3ec>] (driver_register) from [<c06ce0b4>] 
(i2c_register_driver+0x3c/0xa8)
[    2.409664] [<c06ce0b4>] (i2c_register_driver) from [<c0103188>] 
(do_one_initcall+0x8c/0x4b0)
[    2.418172] [<c0103188>] (do_one_initcall) from [<c0f01268>] 
(kernel_init_freeable+0x3e4/0x570)
[    2.426854] [<c0f01268>] (kernel_init_freeable) from [<c0a52418>] 
(kernel_init+0x8/0x10c)
[    2.435003] [<c0a52418>] (kernel_init) from [<c01010b4>] 
(ret_from_fork+0x14/0x20)
[    2.442542] Exception stack(0xef0bbfb0 to 0xef0bbff8)
[    2.447549] bfa0: 00000000 00000000 00000000 00000000
[    2.455745] bfc0: 00000000 00000000 00000000 00000000 00000000 
00000000 00000000 00000000
[    2.463903] bfe0: 00000000 00000000 00000000 00000000 00000013 00000000
[    2.470568] irq event stamp: 331409
[    2.474034] hardirqs last  enabled at (331493): [<c01935a4>] 
console_unlock+0x4a4/0x660
[    2.481962] hardirqs last disabled at (331500): [<c01931cc>] 
console_unlock+0xcc/0x660
[    2.489923] softirqs last  enabled at (331530): [<c01023e0>] 
__do_softirq+0x2b8/0x650
[    2.497733] softirqs last disabled at (331541): [<c0130068>] 
irq_exit+0x158/0x164
[    2.505190] ---[ end trace 54f70738f2594ecf ]---

[ Reverting the commit in question fixes the issue. ]

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number
  2018-05-30 13:44             ` Bartlomiej Zolnierkiewicz
@ 2018-05-30 14:16               ` Mark Brown
  0 siblings, 0 replies; 50+ messages in thread
From: Mark Brown @ 2018-05-30 14:16 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz
  Cc: Linus Walleij, Liam Girdwood, linux-kernel, Krzysztof Kozlowski,
	Sangbeom Kim, Chanwoo Choi, Marek Szyprowski

[-- Attachment #1: Type: text/plain, Size: 587 bytes --]

On Wed, May 30, 2018 at 03:44:08PM +0200, Bartlomiej Zolnierkiewicz wrote:

> The similar issue with shared GPIOs seems to be present in commit
> c89c00e2b8f0 ("regulator: max77686: Pass descriptor instead of GPIO
> number") and Midas board (arch/arm/boot/dts/exynos4412-midas.dtsi).
> I don't have the board itself to test it but from the code audit it
> seems that commit c89c00e2b8f0 should also be reverted.

> Marek has also discovered separate problem on Trats2 board with
> commit 3c6b38d45fa5 ("regulator: wm8994: Pass descriptor instead of
> GPIO number"):

I've reverted both.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
                     ` (2 preceding siblings ...)
  2018-05-17 19:50   ` Tony Lindgren
@ 2018-05-30 21:27   ` Arnd Bergmann
  2018-06-01  9:35   ` Thierry Reding
  4 siblings, 0 replies; 50+ messages in thread
From: Arnd Bergmann @ 2018-05-30 21:27 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, Linux Kernel Mailing List,
	Andy Shevchenko, Alexander Shiyan, Haojian Zhuang, Aaro Koskinen,
	Tony Lindgren, Mike Rapoport, Robert Jarzmik, Philipp Zabel,
	Daniel Mack, Marc Zyngier, Geert Uytterhoeven, Russell King

On Mon, May 14, 2018 at 10:06 AM, Linus Walleij
<linus.walleij@linaro.org> wrote:


> @@ -892,6 +902,7 @@ static void __init e680_init(void)
>
>         pxa_set_keypad_info(&e680_keypad_platform_data);
>
> +       gpiod_add_lookup_table(&camera_supply_gpiod_table);
>         pwm_add_table(ezx_pwm_lookup, ARRAY_SIZE(ezx_pwm_lookup));
>         platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
>         platform_add_devices(ARRAY_AND_SIZE(e680_devices));
> @@ -1098,7 +1109,7 @@ static struct i2c_board_info __initdata a910_i2c_board_info[] = {
>
>  static struct platform_device *a910_devices[] __initdata = {
>         &a910_gpio_keys,
> -       &camera_supply_dummy_device,
> +       &camera_supply_regulator_device,
>  };
>

This part is wrong and triggered a build warning: camera_supply_gpiod_table
should have been in a910_init(), not e680_init(). I sent a fixup with subject
"ARM: pxa, regulator: fix building ezx e680".

        Arnd

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
                     ` (3 preceding siblings ...)
  2018-05-30 21:27   ` Arnd Bergmann
@ 2018-06-01  9:35   ` Thierry Reding
  2018-06-01  9:36     ` Thierry Reding
                       ` (2 more replies)
  4 siblings, 3 replies; 50+ messages in thread
From: Thierry Reding @ 2018-06-01  9:35 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King

[-- Attachment #1: Type: text/plain, Size: 7625 bytes --]

On Mon, May 14, 2018 at 10:06:22AM +0200, Linus Walleij wrote:
> As we augmented the regulator core to accept a GPIO descriptor instead
> of a GPIO number, we can augment the fixed GPIO regulator to look up
> and pass that descriptor directly from device tree or board GPIO
> descriptor look up tables.
> 
> Some boards just auto-enumerate their fixed regulator platform devices
> and I have assumed they get names like "fixed-regulator.0" but it's
> pretty hard to guess this. I need some testing from board maintainers to
> be sure. Other boards are straight forward, using just plain
> "fixed-regulator" (ID -1) or "fixed-regulator.1" hammering down the
> device ID.
> 
> The OMAP didn't have proper label names on its GPIO chips so I have fixed
> this with a separate patch to the GPIO tree, see
> commit 088413bc0bd5f5fb66ca22a19d66a49d7154ba4c
> "gpio: omap: Give unique labels to each GPIO bank/chip"
> 
> It seems the da9055 and da9211 has never got around to actually passing
> any enable gpio into its platform data (not the in-tree code anyway) so we
> can just decide to simply pass a descriptor instead.
> 
> The fixed GPIO-controlled regulator in mach-pxa/ezx.c was confusingly named
> "*_dummy_supply_device" while it is a very real device backed by a GPIO
> line. There is nothing dummy about it at all, so I renamed it with the
> infix *_regulator_* as part of this patch set.
> 
> For the patch hunk hitting arch/blackfin I would say I do not expect
> testing, review or ACKs anymore so if it works, it works.
> 
> The hunk hitting the x86 BCM43xx driver is especially tricky as the number
> comes out of SFI which is a mystery to me. I definately need someone to
> look at this. (Hi Andy.)
> 
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> # Check the x86 BCM stuff
> Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
> Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
> Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
> Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
> Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
> Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
> Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
> Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
> Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
> Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer
> Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> ChangeLog v2->v3:
> - Resending.
> ChangeLog v1->v2:
> - Rebase the patch on mainline with Blackfin gone and other changes.
> - Fix up the new users that appeared in sa1100
> - Drop some suplus comments in x86.
> ---
>  arch/arm/mach-imx/mach-mx21ads.c              | 13 +++++++-
>  arch/arm/mach-imx/mach-mx27ads.c              | 12 ++++++-
>  arch/arm/mach-mmp/brownstone.c                | 12 ++++++-
>  arch/arm/mach-omap1/board-ams-delta.c         | 14 +++++++-
>  arch/arm/mach-omap2/pdata-quirks.c            | 16 ++++++++-
>  arch/arm/mach-pxa/em-x270.c                   |  1 -
>  arch/arm/mach-pxa/ezx.c                       | 33 ++++++++++++-------
>  arch/arm/mach-pxa/magician.c                  |  2 +-
>  arch/arm/mach-pxa/raumfeld.c                  | 12 +++++--
>  arch/arm/mach-pxa/zeus.c                      | 23 +++++++++++--
>  arch/arm/mach-s3c64xx/mach-crag6410.c         |  1 -
>  arch/arm/mach-s3c64xx/mach-smdk6410.c         |  1 -
>  arch/arm/mach-sa1100/assabet.c                | 21 ++++++++----
>  arch/arm/mach-sa1100/generic.c                |  5 +--
>  arch/arm/mach-sa1100/generic.h                |  3 +-
>  arch/arm/mach-sa1100/shannon.c                |  4 +--
>  arch/sh/boards/mach-ecovec24/setup.c          | 22 +++++++++++--
>  .../intel-mid/device_libs/platform_bcm43xx.c  | 17 ++++++++--
>  drivers/regulator/fixed-helper.c              |  1 -
>  drivers/regulator/fixed.c                     | 33 +++++++++----------
>  include/linux/regulator/fixed.h               |  3 --
>  21 files changed, 187 insertions(+), 62 deletions(-)

This causes an HDMI display regression on Jetson TK1. From what I can
tell, the problem is that we now get a double-inversion for low-active
GPIOs. For example, we have this in the Jetson TK1 device tree:

		vdd_hdmi_pll: regulator@11 {
			compatible = "regulator-fixed";
			reg = <11>;
			regulator-name = "+1.05V_RUN_AVDD_HDMI_PLL";
			regulator-min-microvolt = <1050000>;
			regulator-max-microvolt = <1050000>;
			gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
			vin-supply = <&vdd_1v05_run>;
		};

We've got GPIO_ACTIVE_LOW for the regulator's enable GPIO and since we
don't have enable-active-high, the regulator core will treat the GPIO as
low active. The presence of the GPIO_ACTIVE_LOW flag will cause the GPIO
polarity to be inversed, transparently in gpiolib, and the lack of the
enable-active-high property causes the GPIO polarity to inversed as
well, so we effectively end up with a high-active enable GPIO for one
which should really be low-active.

This has always been a bit of an ambiguity since we've had two places
for expressing the polarity. But I think given the move to pervasively
using GPIO descriptors, it'd be reasonable to just ignore the
enable-active-high property, or perhaps warn if we stumble across a
low-active GPIO (via the flags in the specifier) if the regulator is
also marked enable-active-high.

> diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
> index 988a7472c2ab..1142f195529b 100644
> --- a/drivers/regulator/fixed.c
> +++ b/drivers/regulator/fixed.c
> @@ -24,10 +24,9 @@
>  #include <linux/platform_device.h>
>  #include <linux/regulator/driver.h>
>  #include <linux/regulator/fixed.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/slab.h>
>  #include <linux/of.h>
> -#include <linux/of_gpio.h>
>  #include <linux/regulator/of_regulator.h>
>  #include <linux/regulator/machine.h>
>  
> @@ -78,10 +77,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);
> -	if ((config->gpio < 0) && (config->gpio != -ENOENT))
> -		return ERR_PTR(config->gpio);
> -
>  	of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
>  
>  	config->enable_high = of_property_read_bool(np, "enable-active-high");
> @@ -102,6 +97,7 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
>  	struct fixed_voltage_config *config;
>  	struct fixed_voltage_data *drvdata;
>  	struct regulator_config cfg = { };
> +	enum gpiod_flags gflags;
>  	int ret;
>  
>  	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
> @@ -150,25 +146,28 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
>  
>  	drvdata->desc.fixed_uV = config->microvolts;
>  
> -	if (gpio_is_valid(config->gpio)) {
> -		cfg.ena_gpio = config->gpio;
> -		if (pdev->dev.of_node)
> -			cfg.ena_gpio_initialized = true;
> -	}
>  	cfg.ena_gpio_invert = !config->enable_high;

Change this line to:

	cfg.ena_gpio_invert = false;

fixes the regression and is pretty much the implementation of my above
suggestion to ignore enable-active-high, though we may eventually want
to get rid of ena_gpio_invert altogether, provided that everyone has
moved over to GPIO descriptors.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-06-01  9:35   ` Thierry Reding
@ 2018-06-01  9:36     ` Thierry Reding
  2018-06-01 10:21     ` Mark Brown
  2018-06-11 13:11     ` Linus Walleij
  2 siblings, 0 replies; 50+ messages in thread
From: Thierry Reding @ 2018-06-01  9:36 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King, linux-tegra

[-- Attachment #1: Type: text/plain, Size: 8077 bytes --]

On Fri, Jun 01, 2018 at 11:35:11AM +0200, Thierry Reding wrote:
> On Mon, May 14, 2018 at 10:06:22AM +0200, Linus Walleij wrote:
> > As we augmented the regulator core to accept a GPIO descriptor instead
> > of a GPIO number, we can augment the fixed GPIO regulator to look up
> > and pass that descriptor directly from device tree or board GPIO
> > descriptor look up tables.
> > 
> > Some boards just auto-enumerate their fixed regulator platform devices
> > and I have assumed they get names like "fixed-regulator.0" but it's
> > pretty hard to guess this. I need some testing from board maintainers to
> > be sure. Other boards are straight forward, using just plain
> > "fixed-regulator" (ID -1) or "fixed-regulator.1" hammering down the
> > device ID.
> > 
> > The OMAP didn't have proper label names on its GPIO chips so I have fixed
> > this with a separate patch to the GPIO tree, see
> > commit 088413bc0bd5f5fb66ca22a19d66a49d7154ba4c
> > "gpio: omap: Give unique labels to each GPIO bank/chip"
> > 
> > It seems the da9055 and da9211 has never got around to actually passing
> > any enable gpio into its platform data (not the in-tree code anyway) so we
> > can just decide to simply pass a descriptor instead.
> > 
> > The fixed GPIO-controlled regulator in mach-pxa/ezx.c was confusingly named
> > "*_dummy_supply_device" while it is a very real device backed by a GPIO
> > line. There is nothing dummy about it at all, so I renamed it with the
> > infix *_regulator_* as part of this patch set.
> > 
> > For the patch hunk hitting arch/blackfin I would say I do not expect
> > testing, review or ACKs anymore so if it works, it works.
> > 
> > The hunk hitting the x86 BCM43xx driver is especially tricky as the number
> > comes out of SFI which is a mystery to me. I definately need someone to
> > look at this. (Hi Andy.)
> > 
> > Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> # Check the x86 BCM stuff
> > Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
> > Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
> > Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
> > Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
> > Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
> > Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
> > Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
> > Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
> > Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
> > Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer
> > Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> > ---
> > ChangeLog v2->v3:
> > - Resending.
> > ChangeLog v1->v2:
> > - Rebase the patch on mainline with Blackfin gone and other changes.
> > - Fix up the new users that appeared in sa1100
> > - Drop some suplus comments in x86.
> > ---
> >  arch/arm/mach-imx/mach-mx21ads.c              | 13 +++++++-
> >  arch/arm/mach-imx/mach-mx27ads.c              | 12 ++++++-
> >  arch/arm/mach-mmp/brownstone.c                | 12 ++++++-
> >  arch/arm/mach-omap1/board-ams-delta.c         | 14 +++++++-
> >  arch/arm/mach-omap2/pdata-quirks.c            | 16 ++++++++-
> >  arch/arm/mach-pxa/em-x270.c                   |  1 -
> >  arch/arm/mach-pxa/ezx.c                       | 33 ++++++++++++-------
> >  arch/arm/mach-pxa/magician.c                  |  2 +-
> >  arch/arm/mach-pxa/raumfeld.c                  | 12 +++++--
> >  arch/arm/mach-pxa/zeus.c                      | 23 +++++++++++--
> >  arch/arm/mach-s3c64xx/mach-crag6410.c         |  1 -
> >  arch/arm/mach-s3c64xx/mach-smdk6410.c         |  1 -
> >  arch/arm/mach-sa1100/assabet.c                | 21 ++++++++----
> >  arch/arm/mach-sa1100/generic.c                |  5 +--
> >  arch/arm/mach-sa1100/generic.h                |  3 +-
> >  arch/arm/mach-sa1100/shannon.c                |  4 +--
> >  arch/sh/boards/mach-ecovec24/setup.c          | 22 +++++++++++--
> >  .../intel-mid/device_libs/platform_bcm43xx.c  | 17 ++++++++--
> >  drivers/regulator/fixed-helper.c              |  1 -
> >  drivers/regulator/fixed.c                     | 33 +++++++++----------
> >  include/linux/regulator/fixed.h               |  3 --
> >  21 files changed, 187 insertions(+), 62 deletions(-)
> 
> This causes an HDMI display regression on Jetson TK1. From what I can
> tell, the problem is that we now get a double-inversion for low-active
> GPIOs. For example, we have this in the Jetson TK1 device tree:
> 
> 		vdd_hdmi_pll: regulator@11 {
> 			compatible = "regulator-fixed";
> 			reg = <11>;
> 			regulator-name = "+1.05V_RUN_AVDD_HDMI_PLL";
> 			regulator-min-microvolt = <1050000>;
> 			regulator-max-microvolt = <1050000>;
> 			gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
> 			vin-supply = <&vdd_1v05_run>;
> 		};
> 
> We've got GPIO_ACTIVE_LOW for the regulator's enable GPIO and since we
> don't have enable-active-high, the regulator core will treat the GPIO as
> low active. The presence of the GPIO_ACTIVE_LOW flag will cause the GPIO
> polarity to be inversed, transparently in gpiolib, and the lack of the
> enable-active-high property causes the GPIO polarity to inversed as
> well, so we effectively end up with a high-active enable GPIO for one
> which should really be low-active.
> 
> This has always been a bit of an ambiguity since we've had two places
> for expressing the polarity. But I think given the move to pervasively
> using GPIO descriptors, it'd be reasonable to just ignore the
> enable-active-high property, or perhaps warn if we stumble across a
> low-active GPIO (via the flags in the specifier) if the regulator is
> also marked enable-active-high.
> 
> > diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
> > index 988a7472c2ab..1142f195529b 100644
> > --- a/drivers/regulator/fixed.c
> > +++ b/drivers/regulator/fixed.c
> > @@ -24,10 +24,9 @@
> >  #include <linux/platform_device.h>
> >  #include <linux/regulator/driver.h>
> >  #include <linux/regulator/fixed.h>
> > -#include <linux/gpio.h>
> > +#include <linux/gpio/consumer.h>
> >  #include <linux/slab.h>
> >  #include <linux/of.h>
> > -#include <linux/of_gpio.h>
> >  #include <linux/regulator/of_regulator.h>
> >  #include <linux/regulator/machine.h>
> >  
> > @@ -78,10 +77,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);
> > -	if ((config->gpio < 0) && (config->gpio != -ENOENT))
> > -		return ERR_PTR(config->gpio);
> > -
> >  	of_property_read_u32(np, "startup-delay-us", &config->startup_delay);
> >  
> >  	config->enable_high = of_property_read_bool(np, "enable-active-high");
> > @@ -102,6 +97,7 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
> >  	struct fixed_voltage_config *config;
> >  	struct fixed_voltage_data *drvdata;
> >  	struct regulator_config cfg = { };
> > +	enum gpiod_flags gflags;
> >  	int ret;
> >  
> >  	drvdata = devm_kzalloc(&pdev->dev, sizeof(struct fixed_voltage_data),
> > @@ -150,25 +146,28 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
> >  
> >  	drvdata->desc.fixed_uV = config->microvolts;
> >  
> > -	if (gpio_is_valid(config->gpio)) {
> > -		cfg.ena_gpio = config->gpio;
> > -		if (pdev->dev.of_node)
> > -			cfg.ena_gpio_initialized = true;
> > -	}
> >  	cfg.ena_gpio_invert = !config->enable_high;
> 
> Change this line to:
> 
> 	cfg.ena_gpio_invert = false;
> 
> fixes the regression and is pretty much the implementation of my above
> suggestion to ignore enable-active-high, though we may eventually want
> to get rid of ena_gpio_invert altogether, provided that everyone has
> moved over to GPIO descriptors.
> 
> Thierry

Forwarding this to linux-tegra for visibility.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-06-01  9:35   ` Thierry Reding
  2018-06-01  9:36     ` Thierry Reding
@ 2018-06-01 10:21     ` Mark Brown
  2018-06-11 13:11     ` Linus Walleij
  2 siblings, 0 replies; 50+ messages in thread
From: Mark Brown @ 2018-06-01 10:21 UTC (permalink / raw)
  To: Thierry Reding
  Cc: Linus Walleij, Liam Girdwood, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King

[-- Attachment #1: Type: text/plain, Size: 473 bytes --]

On Fri, Jun 01, 2018 at 11:35:11AM +0200, Thierry Reding wrote:

> >  	cfg.ena_gpio_invert = !config->enable_high;

> Change this line to:

> 	cfg.ena_gpio_invert = false;

> fixes the regression and is pretty much the implementation of my above
> suggestion to ignore enable-active-high, though we may eventually want
> to get rid of ena_gpio_invert altogether, provided that everyone has
> moved over to GPIO descriptors.

Please send a patch, I can't apply the above :(

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-06-01  9:35   ` Thierry Reding
  2018-06-01  9:36     ` Thierry Reding
  2018-06-01 10:21     ` Mark Brown
@ 2018-06-11 13:11     ` Linus Walleij
  2018-06-11 15:00       ` Mark Brown
  2 siblings, 1 reply; 50+ messages in thread
From: Linus Walleij @ 2018-06-11 13:11 UTC (permalink / raw)
  To: Thierry Reding
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King

On Fri, Jun 1, 2018 at 11:35 AM, Thierry Reding
<thierry.reding@gmail.com> wrote:
> On Mon, May 14, 2018 at 10:06:22AM +0200, Linus Walleij wrote:

>> As we augmented the regulator core to accept a GPIO descriptor instead
>> of a GPIO number, we can augment the fixed GPIO regulator to look up
>> and pass that descriptor directly from device tree or board GPIO
>> descriptor look up tables.
(...)
> This causes an HDMI display regression on Jetson TK1. From what I can
> tell, the problem is that we now get a double-inversion for low-active
> GPIOs. For example, we have this in the Jetson TK1 device tree:
>
>                 vdd_hdmi_pll: regulator@11 {
>                         compatible = "regulator-fixed";
>                         reg = <11>;
>                         regulator-name = "+1.05V_RUN_AVDD_HDMI_PLL";
>                         regulator-min-microvolt = <1050000>;
>                         regulator-max-microvolt = <1050000>;
>                         gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
>                         vin-supply = <&vdd_1v05_run>;
>                 };
>
> We've got GPIO_ACTIVE_LOW for the regulator's enable GPIO and since we
> don't have enable-active-high, the regulator core will treat the GPIO as
> low active. The presence of the GPIO_ACTIVE_LOW flag will cause the GPIO
> polarity to be inversed, transparently in gpiolib, and the lack of the
> enable-active-high property causes the GPIO polarity to inversed as
> well, so we effectively end up with a high-active enable GPIO for one
> which should really be low-active.

I dug into this. It turns out there are some layers of mess....

The DT binding for "regulator-fixed" specifies that enable-active-high
should be set for polarity inversion. For historical reasons, I guess,
we screwed up. The example in the binding uses that.

I interpreted the binding such that also specifying GPIO_ACTIVE_LOW
was essentially illegal, so I patched gpiolib in commit
a603a2b8d86ee93ee2107da8ca75fd854fd4ff32
"gpio: of: Add special quirk to parse regulator flags"
so it looks like that:

+       if (IS_ENABLED(CONFIG_REGULATOR) &&
+           (of_device_is_compatible(np, "reg-fixed-voltage") ||
+            of_device_is_compatible(np, "regulator-gpio"))) {
+               /*
+                * The regulator GPIO handles are specified such that the
+                * presence or absence of "enable-active-high" solely controls
+                * the polarity of the GPIO line. Any phandle flags must
+                * be actively ignored.
+                */
+               if (*flags & OF_GPIO_ACTIVE_LOW) {
+                       pr_warn("%s GPIO handle specifies active low -
ignored\n",
+                               of_node_full_name(np));
+                       *flags &= ~OF_GPIO_ACTIVE_LOW;
+               }
+               if (!of_property_read_bool(np, "enable-active-high"))
+                       *flags |= OF_GPIO_ACTIVE_LOW;
+       }

This means no matter if you specify active low, the GPIO
will be treated as active low, as this is the default behaviour.
We will warn if things are overspecified as active low on the
flag as well.

The second clause (notice nagation!) specifies that
if enable-acive-high flag is NOT specified, we will be active
low.

Sadly this only handled the undocumented fixed
regulator binding "reg-fixed-voltage". So I need to fix it
for "regulator-fixed" as well, and then it "should work".

I will follow up with a patch.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-06-11 13:11     ` Linus Walleij
@ 2018-06-11 15:00       ` Mark Brown
  2018-06-12  8:15         ` Linus Walleij
  0 siblings, 1 reply; 50+ messages in thread
From: Mark Brown @ 2018-06-11 15:00 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Thierry Reding, Liam Girdwood, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King

[-- Attachment #1: Type: text/plain, Size: 868 bytes --]

On Mon, Jun 11, 2018 at 03:11:14PM +0200, Linus Walleij wrote:

> The DT binding for "regulator-fixed" specifies that enable-active-high
> should be set for polarity inversion. For historical reasons, I guess,
> we screwed up. The example in the binding uses that.

No, it just says that if the enable is active high then we should
specify it using that boolean property.  It explicitly says that enables
might be active low:

| - enable-active-high: Polarity of GPIO is Active high
| If this property is missing, the default assumed is Active low.

This binding predates the GPIO binding having any gpiolib level polarity
inversion.

> Sadly this only handled the undocumented fixed
> regulator binding "reg-fixed-voltage". So I need to fix it
> for "regulator-fixed" as well, and then it "should work".

The normal fixed voltage regulator parses enable-active-high?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-06-11 15:00       ` Mark Brown
@ 2018-06-12  8:15         ` Linus Walleij
  2018-06-12 11:00           ` Mark Brown
  0 siblings, 1 reply; 50+ messages in thread
From: Linus Walleij @ 2018-06-12  8:15 UTC (permalink / raw)
  To: Mark Brown
  Cc: Thierry Reding, Liam Girdwood, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King

On Mon, Jun 11, 2018 at 5:00 PM, Mark Brown <broonie@kernel.org> wrote:
> On Mon, Jun 11, 2018 at 03:11:14PM +0200, Linus Walleij wrote:
>
>> The DT binding for "regulator-fixed" specifies that enable-active-high
>> should be set for polarity inversion. For historical reasons, I guess,
>> we screwed up. The example in the binding uses that.
>
> No, it just says that if the enable is active high then we should
> specify it using that boolean property.  It explicitly says that enables
> might be active low
>
> | - enable-active-high: Polarity of GPIO is Active high
> | If this property is missing, the default assumed is Active low.

Yeah my code gets it right I think, my head doesn't always :/

The assumed default is active low and then we tag this
bool property on the regulator if we want it to be active high.

> This binding predates the GPIO binding having any gpiolib level polarity
> inversion.

Yeah, that's how it is.

The confusion stems from Tegra using kinda both.

I think I have it handled right in the gpiolib core by assuming
it is active low, and explicitlt ignoring any attempts to use
the GPIO flags to flag it as active low. It will be active low
anyway in the Tegra case (after my patch to the second
compatible string) albeit giving a warning in the
dmesg.

>> Sadly this only handled the undocumented fixed
>> regulator binding "reg-fixed-voltage". So I need to fix it
>> for "regulator-fixed" as well, and then it "should work".
>
> The normal fixed voltage regulator parses enable-active-high?

Yeah currently. However I moved the handling to the gpiolib
parsing code to centralize polarity inversion handling, in an
attempt so keep things under control. So in the patch series
this flag handling moves over to the gpiolib.

I was thinking to do the same with other subsystems, such as
MMC to get legacy GPIO flags under control and contained.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-06-12  8:15         ` Linus Walleij
@ 2018-06-12 11:00           ` Mark Brown
  0 siblings, 0 replies; 50+ messages in thread
From: Mark Brown @ 2018-06-12 11:00 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Thierry Reding, Liam Girdwood, linux-kernel, Andy Shevchenko,
	Alexander Shiyan, Haojian Zhuang, Aaro Koskinen, Tony Lindgren,
	Mike Rapoport, Robert Jarzmik, Philipp Zabel, Daniel Mack,
	Marc Zyngier, Geert Uytterhoeven, Russell King

[-- Attachment #1: Type: text/plain, Size: 1139 bytes --]

On Tue, Jun 12, 2018 at 10:15:40AM +0200, Linus Walleij wrote:
> On Mon, Jun 11, 2018 at 5:00 PM, Mark Brown <broonie@kernel.org> wrote:
> > On Mon, Jun 11, 2018 at 03:11:14PM +0200, Linus Walleij wrote:

> >> Sadly this only handled the undocumented fixed
> >> regulator binding "reg-fixed-voltage". So I need to fix it
> >> for "regulator-fixed" as well, and then it "should work".

> > The normal fixed voltage regulator parses enable-active-high?

> Yeah currently. However I moved the handling to the gpiolib
> parsing code to centralize polarity inversion handling, in an
> attempt so keep things under control. So in the patch series
> this flag handling moves over to the gpiolib.

Ah, I see - you're talking about the series rather than the current
state of the code, I thought you were talking about the current state of
the code which was why I was confused.

> I was thinking to do the same with other subsystems, such as
> MMC to get legacy GPIO flags under control and contained.

Yes, it'd be good to try to make this clearer for users - having so many
ways of specifying the same thing makes everything hard to understand.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only
  2018-05-21 11:27     ` Linus Walleij
@ 2018-07-06 15:21       ` Andy Shevchenko
  0 siblings, 0 replies; 50+ messages in thread
From: Andy Shevchenko @ 2018-07-06 15:21 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Liam Girdwood, Mark Brown, linux-kernel, Alexander Shiyan,
	Haojian Zhuang, Aaro Koskinen, Tony Lindgren, Mike Rapoport,
	Robert Jarzmik, Philipp Zabel, Daniel Mack, Marc Zyngier,
	Geert Uytterhoeven, Russell King

On Mon, 2018-05-21 at 13:27 +0200, Linus Walleij wrote:
> On Mon, May 14, 2018 at 1:03 PM, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > On Mon, 2018-05-14 at 10:06 +0200, Linus Walleij wrote:
> > > The hunk hitting the x86 BCM43xx driver is especially tricky as
> > > the
> > > number
> > > comes out of SFI which is a mystery to me. I definately need
> > > someone
> > > to
> > > look at this. (Hi Andy.)
> > 
> > Since there is no link to repo with a branch and I wasn't Cc'ed to
> > cover
> > letter, asking here for a such. I would then pull it and test on
> > real
> > hardware.
> 
> I'm sorry about this.
> This branch:
> https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git/
> log/?h=gpio-descriptors-regulator
> 
> Has all the patches.
> 
> git pull git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-
> gpio.git
> gpio-descriptors-regulator
> 
> will bring in the patches to a testing branch.

As of today I took only one patch from that folder, i.e. 
commit c032bce1c0b5 ("regulator: fixed: Convert to use GPIO descriptor
only") and applied on top of recent linux-next and tested on Intel
Edison. Wi-Fi has been detected and I got interface in 'ip link list'
output.

Thus,

Tested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

(for Intel MID bits only)

Sorry it took a bit.

> 
> > The code itself looks good, so:
> > 
> > Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > 
> > for Intel MID bits.
> 


-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2018-07-06 15:21 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-14  8:06 [PATCH 00/19 v3] Refactor fixed and GPIO regulators Linus Walleij
2018-05-14  8:06 ` [PATCH 01/19 v3] regulator: fixed: Convert to use GPIO descriptor only Linus Walleij
2018-05-14 11:03   ` Andy Shevchenko
2018-05-21 11:27     ` Linus Walleij
2018-07-06 15:21       ` Andy Shevchenko
2018-05-14 11:49   ` Geert Uytterhoeven
2018-05-17 19:50   ` Tony Lindgren
2018-05-30 21:27   ` Arnd Bergmann
2018-06-01  9:35   ` Thierry Reding
2018-06-01  9:36     ` Thierry Reding
2018-06-01 10:21     ` Mark Brown
2018-06-11 13:11     ` Linus Walleij
2018-06-11 15:00       ` Mark Brown
2018-06-12  8:15         ` Linus Walleij
2018-06-12 11:00           ` Mark Brown
2018-05-14  8:06 ` [PATCH 02/19 v3] regulator: gpio: Get enable GPIO using GPIO descriptor Linus Walleij
2018-05-14  8:06 ` [PATCH 03/19 v3] regulator: arizona-ldo1: Look up a descriptor and pass to the core Linus Walleij
2018-05-15 11:53   ` Charles Keepax
2018-05-17 16:41   ` Applied "regulator: arizona-ldo1: Look up a descriptor and pass to the core" to the regulator tree Mark Brown
2018-05-14  8:06 ` [PATCH 04/19 v3] regulator: max8973: Pass descriptor instead of GPIO number Linus Walleij
2018-05-14  8:06 ` [PATCH 05/19 v3] regulator: max77686: " Linus Walleij
2018-05-14  9:28   ` Krzysztof Kozlowski
2018-05-17 16:41   ` Applied "regulator: max77686: Pass descriptor instead of GPIO number" to the regulator tree Mark Brown
2018-05-14  8:06 ` [PATCH 06/19 v3] regulator: lm363x: Pass descriptor instead of GPIO number Linus Walleij
2018-05-14  8:06 ` [PATCH 07/19 v3] regulator: lp8788-ldo: " Linus Walleij
2018-05-14  8:06 ` [PATCH 08/19 v3] regulator: max8952: " Linus Walleij
2018-05-14  8:06 ` [PATCH 09/19 v3] regulator: pfuze100: Delete reference to ena_gpio Linus Walleij
2018-05-14  8:06 ` [PATCH 10/19 v3] regulator: s2mps11: Pass descriptor instead of GPIO number Linus Walleij
2018-05-14  9:42   ` Krzysztof Kozlowski
2018-05-26 10:02   ` Mark Brown
2018-05-28  8:41     ` Linus Walleij
     [not found]       ` <CGME20180528112908eucas1p2946a9b6385fcaf6c19921c9767420405@eucas1p2.samsung.com>
2018-05-28 11:29         ` Bartlomiej Zolnierkiewicz
2018-05-28 12:26           ` Andy Shevchenko
2018-05-30  7:10             ` Linus Walleij
2018-05-29 14:47           ` Mark Brown
     [not found]           ` <CGME20180530134408eucas1p14c6d7fe692e2ed91ef833c8a1ead8ce7@eucas1p1.samsung.com>
2018-05-30 13:44             ` Bartlomiej Zolnierkiewicz
2018-05-30 14:16               ` Mark Brown
2018-05-14  8:06 ` [PATCH 11/19 v3] regulator: s5m8767: " Linus Walleij
2018-05-14  8:06 ` [PATCH 12/19 v3] regulator: tps65090: " Linus Walleij
2018-05-14  8:06 ` [PATCH 13/19 v3] regulator: wm8994: " Linus Walleij
2018-05-14  8:06 ` [PATCH 14/19 v3] regulator: core: Only support passing enable GPIO descriptors Linus Walleij
2018-05-14  8:06 ` [PATCH 15/19 v3] regulator: fixed/gpio: Pull inversion/OD into gpiolib Linus Walleij
2018-05-29 14:54   ` Mark Brown
2018-05-30  7:15     ` Linus Walleij
2018-05-14  8:06 ` [PATCH 16/19 v3] regulator: fixed/gpio: Update device tree bindings Linus Walleij
2018-05-14  8:06 ` [PATCH 17/19 v3] regulator: gpio: Convert to fully use descriptors Linus Walleij
2018-05-14  8:06 ` [PATCH 18/19 v3] regulator: gpio: Simplify probe path Linus Walleij
2018-05-14  8:06 ` [PATCH 19/19 v3] ARM: s3c64xx: Tidy up handling of regulator GPIO lookups Linus Walleij
2018-05-17  5:06   ` Mark Brown
2018-05-21 11:24     ` Linus Walleij

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.