#include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/fb.h>
+#include <linux/gpio/machine.h>
 #include <linux/gpio.h>
 #include <linux/gpio_keys.h>
 #include <linux/input.h>
        .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) },
 static struct gpio_regulator_config bq24022_info = {
        .supply_name = "bq24022",
 
-       .enable_gpio = GPIO72_HX4700_BQ24022_nCHARGE_EN,
-       .enable_high = 0,
        .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),
        },
 };
 
+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),
+               { },
+       },
+};
+
 /*
  * StrataFlash
  */
        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));
 
 
        .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) },
 static struct gpio_regulator_config bq24022_info = {
        .supply_name            = "bq24022",
 
-       .enable_gpio            = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
-       .enable_high            = 0,
        .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),
        },
 };
 
+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),
+               { },
+       },
+};
+
 /*
  * fixed regulator for ads7846
  */
        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));
 }
 
 
 #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;
 
        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;
 
 
        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;
 
 {
        struct gpio_regulator_config *config;
        const char *regtype;
-       int proplen, gpio, i;
+       int proplen, i;
+       int ngpios;
        int ret;
 
        config = devm_kzalloc(dev,
 
        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;
 
        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))
-               return ERR_PTR(ret);
-
-       if (ret > 0) {
-               config->nr_gpios = ret;
-               config->gpios = devm_kcalloc(dev,
-                                       config->nr_gpios, sizeof(struct gpio),
-                                       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");
        struct device_node *np = pdev->dev.of_node;
        struct gpio_regulator_data *drvdata;
        struct regulator_config cfg = { };
-       int ptr, ret, state;
+       enum gpiod_flags gflags;
+       int ptr, ret, state, i;
 
        drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gpio_regulator_data),
                               GFP_KERNEL);
                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->gpiods = devm_kzalloc(&pdev->dev, sizeof(struct gpio_desc *),
+                                      GFP_KERNEL);
+       if (!drvdata->gpiods)
+               return -ENOMEM;
+       for (i = 0; i < config->ngpios; i++) {
+               drvdata->gpiods[i] = devm_gpiod_get_index(&pdev->dev,
+                                                         NULL,
+                                                         i,
+                                                         config->gflags[i]);
+               if (IS_ERR(drvdata->gpiods[i]))
+                       return PTR_ERR(drvdata->gpiods[i]);
+               /* This is good to know */
+               gpiod_set_consumer_name(drvdata->gpiods[i], drvdata->desc.name);
        }
+       drvdata->nr_gpios = config->ngpios;
 
        drvdata->states = kmemdup(config->states,
                                  config->nr_states *
        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;
 
        /* 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;
        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;
-               else
-                       cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
-       } else {
-               if (config->enable_high)
-                       cfg.ena_gpio_flags |= GPIOF_OUT_INIT_LOW;
-               else
-                       cfg.ena_gpio_flags |= GPIOF_OUT_INIT_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 | GPIOD_FLAGS_BIT_NONEXCLUSIVE;
+       else
+               gflags = GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE;
+
+       cfg.ena_gpiod = gpiod_get_optional(&pdev->dev, "enable", gflags);
+       if (IS_ERR(cfg.ena_gpiod)) {
+               ret = PTR_ERR(cfg.ena_gpiod);
+               goto err_memstate;
        }
 
        drvdata->dev = regulator_register(&drvdata->desc, &cfg);
 
 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;
        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;