u8 rx_threshold;
        u8 dma_burst_size;
        u32 timeout;
-       int gpio_cs;
   };
 
 The "pxa2xx_spi_chip.tx_threshold" and "pxa2xx_spi_chip.rx_threshold" fields are
        .rx_threshold = 8, /* SSP hardward FIFO threshold */
        .dma_burst_size = 8, /* Byte wide transfers used so 8 byte bursts */
        .timeout = 235, /* See Intel documentation */
-       .gpio_cs = 2, /* Use external chip select */
   };
 
   static struct pxa2xx_spi_chip cs8405a_chip_info = {
        .rx_threshold = 8, /* SSP hardward FIFO threshold */
        .dma_burst_size = 8, /* Byte wide transfers used so 8 byte bursts */
        .timeout = 235, /* See Intel documentation */
-       .gpio_cs = 3, /* Use external chip select */
   };
 
   static struct spi_board_info streetracer_spi_board_info[] __initdata = {
 
        .num_chipselect = 3,
 };
 
+static struct gpiod_lookup_table corgi_spi_gpio_table = {
+       .dev_id = "pxa2xx-spi.1",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", CORGI_GPIO_ADS7846_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("gpio-pxa", CORGI_GPIO_LCDCON_CS, "cs", 1, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("gpio-pxa", CORGI_GPIO_MAX1111_CS, "cs", 2, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static void corgi_wait_for_hsync(void)
 {
        while (gpio_get_value(CORGI_GPIO_HSYNC))
        .wait_for_sync          = corgi_wait_for_hsync,
 };
 
-static struct pxa2xx_spi_chip corgi_ads7846_chip = {
-       .gpio_cs        = CORGI_GPIO_ADS7846_CS,
-};
-
 static void corgi_bl_kick_battery(void)
 {
        void (*kick_batt)(void);
        .kick_battery           = corgi_bl_kick_battery,
 };
 
-static struct pxa2xx_spi_chip corgi_lcdcon_chip = {
-       .gpio_cs        = CORGI_GPIO_LCDCON_CS,
-};
-
-static struct pxa2xx_spi_chip corgi_max1111_chip = {
-       .gpio_cs        = CORGI_GPIO_MAX1111_CS,
-};
-
 static struct spi_board_info corgi_spi_devices[] = {
        {
                .modalias       = "ads7846",
                .bus_num        = 1,
                .chip_select    = 0,
                .platform_data  = &corgi_ads7846_info,
-               .controller_data= &corgi_ads7846_chip,
                .irq            = PXA_GPIO_TO_IRQ(CORGI_GPIO_TP_INT),
        }, {
                .modalias       = "corgi-lcd",
                .bus_num        = 1,
                .chip_select    = 1,
                .platform_data  = &corgi_lcdcon_info,
-               .controller_data= &corgi_lcdcon_chip,
        }, {
                .modalias       = "max1111",
                .max_speed_hz   = 450000,
                .bus_num        = 1,
                .chip_select    = 2,
-               .controller_data= &corgi_max1111_chip,
        },
 };
 
 static void __init corgi_init_spi(void)
 {
+       gpiod_add_lookup_table(&corgi_spi_gpio_table);
        pxa2xx_set_spi_info(1, &corgi_spi_info);
        gpiod_add_lookup_table(&corgi_lcdcon_gpio_table);
        spi_register_board_info(ARRAY_AND_SIZE(corgi_spi_devices));
 
        .tx_threshold = 1,
        .rx_threshold = 2,
        .timeout      = 64,
-       .gpio_cs      = GPIO88_HX4700_TSC2046_CS,
 };
 
 static struct spi_board_info tsc2046_board_info[] __initdata = {
        .enable_dma     = 1,
 };
 
+static struct gpiod_lookup_table pxa_ssp2_gpio_table = {
+       .dev_id = "pxa2xx-spi.2",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", GPIO88_HX4700_TSC2046_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 /*
  * External power
  */
        pxa_set_i2c_info(NULL);
        i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info));
        i2c_register_board_info(1, ARRAY_AND_SIZE(pi2c_board_info));
+       gpiod_add_lookup_table(&pxa_ssp2_gpio_table);
        pxa2xx_set_spi_info(2, &pxa_ssp2_master_info);
        spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info));
 
 
 #include <linux/irq.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
-#include <linux/gpio.h>
+#include <linux/gpio/machine.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
        .rx_threshold   = 128,
        .dma_burst_size = 8,
        .timeout        = 235,
-       .gpio_cs        = ICONTROL_MCP251x_nCS1
 };
 
 static struct pxa2xx_spi_chip mcp251x_chip_info2 = {
        .rx_threshold   = 128,
        .dma_burst_size = 8,
        .timeout        = 235,
-       .gpio_cs        = ICONTROL_MCP251x_nCS2
 };
 
 static struct pxa2xx_spi_chip mcp251x_chip_info3 = {
        .rx_threshold   = 128,
        .dma_burst_size = 8,
        .timeout        = 235,
-       .gpio_cs        = ICONTROL_MCP251x_nCS3
 };
 
 static struct pxa2xx_spi_chip mcp251x_chip_info4 = {
        .rx_threshold   = 128,
        .dma_burst_size = 8,
        .timeout        = 235,
-       .gpio_cs        = ICONTROL_MCP251x_nCS4
 };
 
 static const struct property_entry mcp251x_properties[] = {
        }
 };
 
+static struct gpiod_lookup_table pxa_ssp3_gpio_table = {
+       .dev_id = "pxa2xx-spi.3",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS1, "cs", 0, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS2, "cs", 1, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
+static struct gpiod_lookup_table pxa_ssp4_gpio_table = {
+       .dev_id = "pxa2xx-spi.4",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS3, "cs", 0, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS4, "cs", 1, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static struct platform_device *icontrol_spi_devices[] __initdata = {
        &pxa_spi_ssp3,
        &pxa_spi_ssp4,
 static void __init icontrol_can_init(void)
 {
        pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_can_cfg));
+       gpiod_add_lookup_table(&pxa_ssp3_gpio_table);
+       gpiod_add_lookup_table(&pxa_ssp4_gpio_table);
        platform_add_devices(ARRAY_AND_SIZE(icontrol_spi_devices));
        spi_register_board_info(ARRAY_AND_SIZE(mcp251x_board_info));
 }
 
 static struct pxa2xx_spi_chip littleton_tdo24m_chip = {
        .rx_threshold   = 1,
        .tx_threshold   = 1,
-       .gpio_cs        = LITTLETON_GPIO_LCD_CS,
 };
 
 static struct spi_board_info littleton_spi_devices[] __initdata = {
        },
 };
 
+static struct gpiod_lookup_table littleton_spi_gpio_table = {
+       .dev_id = "pxa2xx-spi.2",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", LITTLETON_GPIO_LCD_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static void __init littleton_init_spi(void)
 {
+       gpiod_add_lookup_table(&littleton_spi_gpio_table);
        pxa2xx_set_spi_info(2, &littleton_spi_info);
        spi_register_board_info(ARRAY_AND_SIZE(littleton_spi_devices));
 }
 
        .tx_threshold   = 1,
        .rx_threshold   = 2,
        .timeout        = 64,
-       /* NOTICE must be GPIO, incompatibility with hw PXA SPI framing */
-       .gpio_cs        = GPIO14_MAGICIAN_TSC2046_CS,
 };
 
 static struct pxa2xx_spi_controller magician_spi_info = {
        .enable_dma     = 1,
 };
 
+static struct gpiod_lookup_table magician_spi_gpio_table = {
+       .dev_id = "pxa2xx-spi.2",
+       .table = {
+               /* NOTICE must be GPIO, incompatibility with hw PXA SPI framing */
+               GPIO_LOOKUP_IDX("gpio-pxa", GPIO14_MAGICIAN_TSC2046_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static struct spi_board_info ads7846_spi_board_info[] __initdata = {
        {
                .modalias               = "ads7846",
        } else
                pr_err("LCD detection: CPLD mapping failed\n");
 
+       gpiod_add_lookup_table(&magician_spi_gpio_table);
        pxa2xx_set_spi_info(2, &magician_spi_info);
        spi_register_board_info(ARRAY_AND_SIZE(ads7846_spi_board_info));
 
 
        .num_chipselect = 1,
 };
 
+static struct gpiod_lookup_table poodle_spi_gpio_table = {
+       .dev_id = "pxa2xx-spi.1",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", POODLE_GPIO_TP_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static struct ads7846_platform_data poodle_ads7846_info = {
        .model                  = 7846,
        .vref_delay_usecs       = 100,
        .gpio_pendown           = POODLE_GPIO_TP_INT,
 };
 
-static struct pxa2xx_spi_chip poodle_ads7846_chip = {
-       .gpio_cs                = POODLE_GPIO_TP_CS,
-};
-
 static struct spi_board_info poodle_spi_devices[] = {
        {
                .modalias       = "ads7846",
                .max_speed_hz   = 10000,
                .bus_num        = 1,
                .platform_data  = &poodle_ads7846_info,
-               .controller_data= &poodle_ads7846_chip,
                .irq            = PXA_GPIO_TO_IRQ(POODLE_GPIO_TP_INT),
        },
 };
 
 static void __init poodle_init_spi(void)
 {
+       gpiod_add_lookup_table(&poodle_spi_gpio_table);
        pxa2xx_set_spi_info(1, &poodle_spi_info);
        spi_register_board_info(ARRAY_AND_SIZE(poodle_spi_devices));
 }
 
        .wait_for_sync          = spitz_ads7846_wait_for_hsync,
 };
 
-static struct pxa2xx_spi_chip spitz_ads7846_chip = {
-       .gpio_cs                = SPITZ_GPIO_ADS7846_CS,
-};
-
 static void spitz_bl_kick_battery(void)
 {
        void (*kick_batt)(void);
        .kick_battery           = spitz_bl_kick_battery,
 };
 
-static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
-       .gpio_cs        = SPITZ_GPIO_LCDCON_CS,
-};
-
-static struct pxa2xx_spi_chip spitz_max1111_chip = {
-       .gpio_cs        = SPITZ_GPIO_MAX1111_CS,
-};
-
 static struct spi_board_info spitz_spi_devices[] = {
        {
                .modalias               = "ads7846",
                .bus_num                = 2,
                .chip_select            = 0,
                .platform_data          = &spitz_ads7846_info,
-               .controller_data        = &spitz_ads7846_chip,
                .irq                    = PXA_GPIO_TO_IRQ(SPITZ_GPIO_TP_INT),
        }, {
                .modalias               = "corgi-lcd",
                .bus_num                = 2,
                .chip_select            = 1,
                .platform_data          = &spitz_lcdcon_info,
-               .controller_data        = &spitz_lcdcon_chip,
        }, {
                .modalias               = "max1111",
                .max_speed_hz           = 450000,
                .bus_num                = 2,
                .chip_select            = 2,
-               .controller_data        = &spitz_max1111_chip,
        },
 };
 
        .num_chipselect = 3,
 };
 
+static struct gpiod_lookup_table spitz_spi_gpio_table = {
+       .dev_id = "pxa2xx-spi.2",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_ADS7846_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_LCDCON_CS, "cs", 1, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_MAX1111_CS, "cs", 2, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static void __init spitz_spi_init(void)
 {
        if (machine_is_akita())
        else
                gpiod_add_lookup_table(&spitz_lcdcon_gpio_table);
 
+       gpiod_add_lookup_table(&spitz_spi_gpio_table);
        pxa2xx_set_spi_info(2, &spitz_spi_info);
        spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
 }
 
        .num_chipselect = 1,
 };
 
+static struct gpiod_lookup_table pxa_ssp1_gpio_table = {
+       .dev_id = "pxa2xx-spi.1",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", 24, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
+static struct gpiod_lookup_table pxa_ssp3_gpio_table = {
+       .dev_id = "pxa2xx-spi.3",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", 39, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 /* An upcoming kernel change will scrap SFRM usage so these
  * drivers have been moved to use GPIOs */
 static struct pxa2xx_spi_chip staccel_chip_info = {
        .rx_threshold = 8,
        .dma_burst_size = 8,
        .timeout = 235,
-       .gpio_cs = 24,
 };
 
 static struct pxa2xx_spi_chip cc2420_info = {
        .rx_threshold = 8,
        .dma_burst_size = 8,
        .timeout = 235,
-       .gpio_cs = 39,
 };
 
 static struct spi_board_info spi_board_info[] __initdata = {
        pxa_set_btuart_info(NULL);
        pxa_set_stuart_info(NULL);
 
+       gpiod_add_lookup_table(&pxa_ssp1_gpio_table);
+       gpiod_add_lookup_table(&pxa_ssp3_gpio_table);
        pxa2xx_set_spi_info(1, &pxa_ssp_master_0_info);
        pxa2xx_set_spi_info(2, &pxa_ssp_master_1_info);
        pxa2xx_set_spi_info(3, &pxa_ssp_master_2_info);
 
        .rx_threshold   = 8,
        .tx_threshold   = 8,
        .timeout        = 1000,
-       .gpio_cs        = GPIO24_ZIPITZ2_WIFI_CS,
 };
 
 static struct libertas_spi_platform_data z2_lbs_pdata = {
        .rx_threshold   = 1,
        .tx_threshold   = 1,
        .timeout        = 64,
-       .gpio_cs        = GPIO88_ZIPITZ2_LCD_CS,
 };
 
 static struct gpiod_lookup_table lms283_gpio_table = {
        .num_chipselect = 1,
 };
 
+static struct gpiod_lookup_table pxa_ssp1_gpio_table = {
+       .dev_id = "pxa2xx-spi.1",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", GPIO24_ZIPITZ2_WIFI_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
+static struct gpiod_lookup_table pxa_ssp2_gpio_table = {
+       .dev_id = "pxa2xx-spi.2",
+       .table = {
+               GPIO_LOOKUP_IDX("gpio-pxa", GPIO88_ZIPITZ2_LCD_CS, "cs", 0, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static void __init z2_spi_init(void)
 {
+       gpiod_add_lookup_table(&pxa_ssp1_gpio_table);
+       gpiod_add_lookup_table(&pxa_ssp2_gpio_table);
        pxa2xx_set_spi_info(1, &pxa_ssp1_master_info);
        pxa2xx_set_spi_info(2, &pxa_ssp2_master_info);
        gpiod_add_lookup_table(&lms283_gpio_table);
 
 #include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/gpio/consumer.h>
-#include <linux/gpio.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
        return 0;
 }
 
-static void cleanup_cs(struct spi_device *spi)
-{
-       if (!gpio_is_valid(spi->cs_gpio))
-               return;
-
-       gpio_free(spi->cs_gpio);
-       spi->cs_gpio = -ENOENT;
-}
-
-static int setup_cs(struct spi_device *spi, struct chip_data *chip,
-                   struct pxa2xx_spi_chip *chip_info)
-{
-       struct driver_data *drv_data = spi_controller_get_devdata(spi->controller);
-
-       if (chip == NULL)
-               return 0;
-
-       if (chip_info == NULL)
-               return 0;
-
-       if (drv_data->ssp_type == CE4100_SSP)
-               return 0;
-
-       /*
-        * NOTE: setup() can be called multiple times, possibly with
-        * different chip_info, release previously requested GPIO.
-        */
-       cleanup_cs(spi);
-
-       if (gpio_is_valid(chip_info->gpio_cs)) {
-               int gpio = chip_info->gpio_cs;
-               int err;
-
-               err = gpio_request(gpio, "SPI_CS");
-               if (err) {
-                       dev_err(&spi->dev, "failed to request chip select GPIO%d\n", gpio);
-                       return err;
-               }
-
-               err = gpio_direction_output(gpio, !(spi->mode & SPI_CS_HIGH));
-               if (err) {
-                       gpio_free(gpio);
-                       return err;
-               }
-
-               spi->cs_gpio = gpio;
-       }
-
-       return 0;
-}
-
 static int setup(struct spi_device *spi)
 {
        struct pxa2xx_spi_chip *chip_info;
        struct driver_data *drv_data =
                spi_controller_get_devdata(spi->controller);
        uint tx_thres, tx_hi_thres, rx_thres;
-       int err;
 
        switch (drv_data->ssp_type) {
        case QUARK_X1000_SSP:
 
        spi_set_ctldata(spi, chip);
 
-       if (drv_data->ssp_type == CE4100_SSP)
-               return 0;
-
-       err = setup_cs(spi, chip, chip_info);
-       if (err)
-               kfree(chip);
-
-       return err;
+       return 0;
 }
 
 static void cleanup(struct spi_device *spi)
 {
        struct chip_data *chip = spi_get_ctldata(spi);
 
-       cleanup_cs(spi);
        kfree(chip);
 }
 
 
        u8 rx_threshold;
        u8 dma_burst_size;
        u32 timeout;
-       int gpio_cs;
 };
 
 #if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)