#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>
        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,
 };
 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,
 };
        },
 };
 
+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, NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 /*
  * Connected is a portrait Sharp-QVGA display
  * of type: LQ035Q7DB02
 {
        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 =
 
 #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>
 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, NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static void __init mx27ads_regulator_init(void)
 {
        struct gpio_chip *vchip;
        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,
 
 #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>
 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,
        },
 };
 
+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,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static struct max8925_platform_data brownstone_max8925_info = {
        .irq_base               = MMP_NR_IRQS,
 };
        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);
 }
 
 
 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,
        },
 };
 
+static struct gpiod_lookup_table ams_delta_nreset_gpiod_table = {
+       .dev_id = "reg-fixed-voltage",
+       .table = {
+               GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_MODEM_NRESET,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 struct modem_private_data {
        struct regulator *regulator;
 };
 static struct fixed_voltage_config keybrd_pwr_config = {
        .supply_name            = "keybrd_pwr",
        .microvolts             = 5000000,
-       .gpio                   = AMS_DELTA_GPIO_PIN_KEYBRD_PWR,
        .enable_high            = 1,
        .init_data              = &keybrd_pwr_initdata,
 };
 };
 
 static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = {
+       &ams_delta_nreset_gpiod_table,
        &ams_delta_audio_gpio_table,
        &keybrd_pwr_gpio_table,
        &ams_delta_lcd_gpio_table,
 
 #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>
 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,
        },
 };
 
+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,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static void pandora_wl1251_init_card(struct mmc_card *card)
 {
        /*
 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);
 
        .supply_name            = "camera_vdd",
        .input_supply           = "vcc cam",
        .microvolts             = 2800000,
-       .gpio                   = -1,
        .enable_high            = 0,
        .init_data              = &camera_dummy_initdata,
 };
 
 #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>
 
 #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,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
        },
 };
 #endif
 
 static struct platform_device *a780_devices[] __initdata = {
        &a780_gpio_keys,
-       &camera_supply_dummy_device,
+       &camera_supply_regulator_device,
 };
 
 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));
 
 static struct platform_device *a910_devices[] __initdata = {
        &a910_gpio_keys,
-       &camera_supply_dummy_device,
+       &camera_supply_regulator_device,
 };
 
 static void __init a910_init(void)
        if (a910_camera_init() == 0)
                pxa_set_camera_info(&a910_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(a910_devices));
 
 #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>
 static struct fixed_voltage_config vads7846 = {
        .supply_name    = "vads7846",
        .microvolts     = 3300000, /* probably */
-       .gpio           = -EINVAL,
        .startup_delay  = 0,
        .init_data      = &vads7846_regulator,
 };
 
 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,
        },
 };
 
+static struct gpiod_lookup_table audio_va_gpiod_table = {
+       .dev_id = "reg-fixed-voltage.0",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa", GPIO_AUDIO_VA_ENABLE,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 /* Dummy supplies for Codec's VD/VLC */
 
 static struct regulator_consumer_supply audio_dummy_supplies[] = {
 static struct fixed_voltage_config audio_dummy_config = {
        .supply_name            = "audio_vd",
        .microvolts             = 3300000,
-       .gpio                   = -1,
        .init_data              = &audio_dummy_initdata,
 };
 
        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));
 }
 
 
 #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>
 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,
 };
 
        },
 };
 
+static struct gpiod_lookup_table can_regulator_gpiod_table = {
+       .dev_id = "reg-fixed-voltage.0",
+       .table = {
+               GPIO_LOOKUP("gpio-pxa", ZEUS_CAN_SHDN_GPIO,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static struct mcp251x_platform_data zeus_mcp2515_pdata = {
        .oscillator_frequency   = 16*1000*1000,
 };
 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,
        },
 };
 
+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,
+                           NULL, 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
 
        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();
 
        .supply_name = "WALLVDD",
        .microvolts = 5000000,
        .init_data = &wallvdd_data,
-       .gpio = -EINVAL,
 };
 
 static struct platform_device wallvdd_device = {
 
        .supply_name = "B_PWR_5V",
        .microvolts = 5000000,
        .init_data = &smdk6410_b_pwr_5v_data,
-       .gpio = -EINVAL,
 };
 
 static struct platform_device smdk6410_b_pwr_5v = {
 
 
        assabet_bcr_gc = gc;
 
-       return gc->base;
+       return 0;
 }
 
 /*
        .enable_high = 1,
 };
 
+static struct gpiod_lookup_table assabet_cf_vcc_gpio_table = {
+       .dev_id = "reg-fixed-voltage.0",
+       .table = {
+               GPIO_LOOKUP("assabet", 0, NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 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);
 
        }
 
 
 void __init assabet_init_irq(void)
 {
-       unsigned int assabet_gpio_base;
        u32 def_val;
 
        sa1100_init_irq();
         *
         * 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")
 
 
 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;
 
        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;
 
 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);
 
        .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();
 
 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,
 };
        },
 };
 
+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,
+                           NULL, GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
 /* SDHI0 */
 static struct regulator_consumer_supply sdhi0_power_consumers[] =
 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,
 };
        },
 };
 
+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,
+                           NULL, 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,
                                    DMA_MEMORY_EXCLUSIVE);
        platform_device_add(ecovec_ceu_devices[1]);
 
+       gpiod_add_lookup_table(&cn12_power_gpiod_table);
+#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
+       gpiod_add_lookup_table(&sdhi0_power_gpiod_table);
+#endif
+
        return platform_add_devices(ecovec_devices,
                                    ARRAY_SIZE(ecovec_devices));
 }
 
  * 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>
         * 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 */
        },
 };
 
+static struct gpiod_lookup_table bcm43xx_vmmc_gpio_table = {
+       .dev_id = "reg-fixed-voltage.0",
+       .table  = {
+               GPIO_LOOKUP("0000:00:0c.0", -1, NULL, 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__);
 
        }
 
        data->cfg.microvolts = uv;
-       data->cfg.gpio = -EINVAL;
        data->cfg.enabled_at_boot = 1;
        data->cfg.init_data = &data->init_data;
 
 
 #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>
 
        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");
        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),
 
        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;
 
  * @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
        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;