extern struct platform_device iop3xx_aau_channel;
 extern struct platform_device iop3xx_i2c0_device;
 extern struct platform_device iop3xx_i2c1_device;
+extern struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup;
+extern struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup;
 
 #endif
 
 
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <mach/hardware.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 {
        register_iop32x_gpio();
        platform_device_register(&em7210_serial_device);
+       gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup);
+       gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup);
        platform_device_register(&iop3xx_i2c0_device);
        platform_device_register(&iop3xx_i2c1_device);
        platform_device_register(&em7210_flash_device);
 
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/gpio/machine.h>
 #include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 static void __init glantank_init_machine(void)
 {
        register_iop32x_gpio();
+       gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup);
+       gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup);
        platform_device_register(&iop3xx_i2c0_device);
        platform_device_register(&iop3xx_i2c1_device);
        platform_device_register(&glantank_flash_device);
 
 #include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/gpio/machine.h>
 #include <mach/hardware.h>
 #include <asm/cputype.h>
 #include <asm/irq.h>
 static void __init iq31244_init_machine(void)
 {
        register_iop32x_gpio();
+       gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup);
+       gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup);
        platform_device_register(&iop3xx_i2c0_device);
        platform_device_register(&iop3xx_i2c1_device);
        platform_device_register(&iq31244_flash_device);
 
 #include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/gpio/machine.h>
 #include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 static void __init iq80321_init_machine(void)
 {
        register_iop32x_gpio();
+       gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup);
+       gpiod_add_lookup_table(&iop3xx_i2c1_gpio_lookup);
        platform_device_register(&iop3xx_i2c0_device);
        platform_device_register(&iop3xx_i2c1_device);
        platform_device_register(&iq80321_flash_device);
 
 #include <linux/reboot.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 #include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 static void __init n2100_init_machine(void)
 {
        register_iop32x_gpio();
+       gpiod_add_lookup_table(&iop3xx_i2c0_gpio_lookup);
        platform_device_register(&iop3xx_i2c0_device);
        platform_device_register(&n2100_flash_device);
        platform_device_register(&n2100_serial_device);
 
 #include <linux/tty.h>
 #include <linux/serial_core.h>
 #include <linux/io.h>
+#include <linux/gpio/machine.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/mach/map.h>
 #define IRQ_IOP3XX_I2C_1       IRQ_IOP33X_I2C_1
 #endif
 
+/*
+ * Each of the I2C busses have corresponding GPIO lines, and the driver
+ * need to access these directly to drive the bus low at times.
+ */
+
+struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup = {
+       .dev_id = "IOP3xx-I2C.0",
+       .table = {
+               GPIO_LOOKUP("gpio-iop", 7, "scl", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("gpio-iop", 6, "sda", GPIO_ACTIVE_HIGH),
+               { }
+       },
+};
+
+struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup = {
+       .dev_id = "IOP3xx-I2C.1",
+       .table = {
+               GPIO_LOOKUP("gpio-iop", 5, "scl", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("gpio-iop", 4, "sda", GPIO_ACTIVE_HIGH),
+               { }
+       },
+};
+
 static struct resource iop3xx_i2c0_resources[] = {
        [0] = {
                .start  = 0xfffff680,
 
 
        gc->base = 0;
        gc->owner = THIS_MODULE;
+       gc->label = "gpio-iop";
 
        return devm_gpiochip_add_data(&pdev->dev, gc, NULL);
 }
 
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
 #include <linux/io.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 
 #include "i2c-iop3xx.h"
 
 
        /*
         * Every time unit enable is asserted, GPOD needs to be cleared
-        * on IOP3XX to avoid data corruption on the bus.
+        * on IOP3XX to avoid data corruption on the bus. We use the
+        * gpiod_set_raw_value() to make sure the 0 hits the hardware
+        * GPOD register. These descriptors are only passed along to
+        * the device if this is necessary.
         */
-#if defined(CONFIG_ARCH_IOP32X) || defined(CONFIG_ARCH_IOP33X)
-       if (iop3xx_adap->id == 0) {
-               gpio_set_value(7, 0);
-               gpio_set_value(6, 0);
-       } else {
-               gpio_set_value(5, 0);
-               gpio_set_value(4, 0);
-       }
-#endif
+       if (iop3xx_adap->gpio_scl)
+               gpiod_set_raw_value(iop3xx_adap->gpio_scl, 0);
+       if (iop3xx_adap->gpio_sda)
+               gpiod_set_raw_value(iop3xx_adap->gpio_sda, 0);
+
        /* NB SR bits not same position as CR IE bits :-( */
        iop3xx_adap->SR_enabled =
                IOP3XX_ISR_ALD | IOP3XX_ISR_BERRD |
                goto free_adapter;
        }
 
+       adapter_data->gpio_scl = devm_gpiod_get_optional(&pdev->dev,
+                                                        "scl",
+                                                        GPIOD_ASIS);
+       if (IS_ERR(adapter_data->gpio_scl))
+               return PTR_ERR(adapter_data->gpio_scl);
+       adapter_data->gpio_sda = devm_gpiod_get_optional(&pdev->dev,
+                                                        "sda",
+                                                        GPIOD_ASIS);
+       if (IS_ERR(adapter_data->gpio_sda))
+               return PTR_ERR(adapter_data->gpio_sda);
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                ret = -ENODEV;
 
        spinlock_t lock;
        u32 SR_enabled, SR_received;
        int id;
+       struct gpio_desc *gpio_scl;
+       struct gpio_desc *gpio_sda;
 };
 
 #endif /* I2C_IOP3XX_H */