OLPC_DCON_BLANK,
 };
 
-struct dcon_gpio {
-       const char *name;
-       unsigned long flags;
-};
-
 static const struct dcon_gpio gpios_asis[] = {
        [OLPC_DCON_STAT0] = { .name = "dcon_stat0", .flags = GPIOD_ASIS },
        [OLPC_DCON_STAT1] = { .name = "dcon_stat1", .flags = GPIOD_ASIS },
        [OLPC_DCON_BLANK] = { .name = "dcon_blank", .flags = GPIOD_ASIS },
 };
 
-struct gpio_desc *gpios[5];
+static struct gpio_desc *gpios[5];
 
 static int dcon_init_xo_1(struct dcon_priv *dcon)
 {
 
 
 #include <linux/acpi.h>
 #include <linux/delay.h>
-#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/gpio/consumer.h>
+#include <linux/gpio/machine.h>
 #include <asm/olpc.h>
 
 /* TODO: this eventually belongs in linux/vx855.h */
 
 #define PREFIX "OLPC DCON:"
 
+enum dcon_gpios {
+       OLPC_DCON_STAT0,
+       OLPC_DCON_STAT1,
+       OLPC_DCON_LOAD,
+};
+
+struct gpiod_lookup_table gpios_table = {
+       .dev_id = NULL,
+       .table = {
+               GPIO_LOOKUP("VX855 South Bridge", VX855_GPIO(1), "dcon_load",
+                           GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("VX855 South Bridge", VX855_GPI(10), "dcon_stat0",
+                           GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("VX855 South Bridge", VX855_GPI(11), "dcon_stat1",
+                           GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
+static const struct dcon_gpio gpios_asis[] = {
+       [OLPC_DCON_STAT0] = { .name = "dcon_stat0", .flags = GPIOD_ASIS },
+       [OLPC_DCON_STAT1] = { .name = "dcon_stat1", .flags = GPIOD_ASIS },
+       [OLPC_DCON_LOAD] = { .name = "dcon_load", .flags = GPIOD_ASIS },
+};
+
+static struct gpio_desc *gpios[3];
+
 static void dcon_clear_irq(void)
 {
        /* irq status will appear in PMIO_Rx50[6] (RW1C) on gpio12 */
 static int dcon_init_xo_1_5(struct dcon_priv *dcon)
 {
        unsigned int irq;
+       const struct dcon_gpio *pin = &gpios_asis[0];
+       int i;
+       int ret;
+
+       /* Add GPIO look up table */
+       gpios_table.dev_id = dev_name(&dcon->client->dev);
+       gpiod_add_lookup_table(&gpios_table);
+
+       /* Get GPIO descriptor */
+       for (i = 0; i < ARRAY_SIZE(gpios_asis); i++) {
+               gpios[i] = devm_gpiod_get(&dcon->client->dev, pin[i].name,
+                                         pin[i].flags);
+               if (IS_ERR(gpios[i])) {
+                       ret = PTR_ERR(gpios[i]);
+                       pr_err("failed to request %s GPIO: %d\n", pin[i].name,
+                              ret);
+                       return ret;
+               }
+       }
 
        dcon_clear_irq();
 
 
 static void dcon_set_dconload_xo_1_5(int val)
 {
-       gpio_set_value(VX855_GPIO(1), val);
+       gpiod_set_value(gpios[OLPC_DCON_LOAD], val);
 }
 
 static int dcon_read_status_xo_1_5(u8 *status)
                return -1;
 
        /* i believe this is the same as "inb(0x44b) & 3" */
-       *status = gpio_get_value(VX855_GPI(10));
-       *status |= gpio_get_value(VX855_GPI(11)) << 1;
+       *status = gpiod_get_value(gpios[OLPC_DCON_STAT0]);
+       *status |= gpiod_get_value(gpios[OLPC_DCON_STAT1]) << 1;
 
        dcon_clear_irq();