#include <linux/io.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/spi_bitbang.h>
-#include <linux/gpio.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/module.h>
-#include <linux/of_gpio.h>
 #include <linux/platform_data/efm32-spi.h>
+#include <linux/of.h>
 
 #define DRIVER_NAME "efm32-spi"
 
        const u8 *tx_buf;
        u8 *rx_buf;
        unsigned tx_len, rx_len;
-
-       /* chip selects */
-       unsigned csgpio[];
 };
 
 #define ddata_to_dev(ddata)    (&(ddata->bitbang.master->dev))
        return readl_relaxed(ddata->base + offset);
 }
 
-static void efm32_spi_chipselect(struct spi_device *spi, int is_on)
-{
-       struct efm32_spi_ddata *ddata = spi_master_get_devdata(spi->master);
-       int value = !(spi->mode & SPI_CS_HIGH) == !(is_on == BITBANG_CS_ACTIVE);
-
-       gpio_set_value(ddata->csgpio[spi->chip_select], value);
-}
-
 static int efm32_spi_setup_transfer(struct spi_device *spi,
                struct spi_transfer *t)
 {
        int ret;
        struct spi_master *master;
        struct device_node *np = pdev->dev.of_node;
-       int num_cs, i;
 
        if (!np)
                return -EINVAL;
 
-       num_cs = of_gpio_named_count(np, "cs-gpios");
-       if (num_cs < 0)
-               return num_cs;
-
-       master = spi_alloc_master(&pdev->dev,
-                       sizeof(*ddata) + num_cs * sizeof(unsigned));
+       master = spi_alloc_master(&pdev->dev, sizeof(*ddata));
        if (!master) {
                dev_dbg(&pdev->dev,
                                "failed to allocate spi master controller\n");
 
        master->dev.of_node = pdev->dev.of_node;
 
-       master->num_chipselect = num_cs;
        master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
        master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
+       master->use_gpio_descriptors = true;
 
        ddata = spi_master_get_devdata(master);
 
        ddata->bitbang.master = master;
-       ddata->bitbang.chipselect = efm32_spi_chipselect;
        ddata->bitbang.setup_transfer = efm32_spi_setup_transfer;
        ddata->bitbang.txrx_bufs = efm32_spi_txrx_bufs;
 
                goto err;
        }
 
-       for (i = 0; i < num_cs; ++i) {
-               ret = of_get_named_gpio(np, "cs-gpios", i);
-               if (ret < 0) {
-                       dev_err(&pdev->dev, "failed to get csgpio#%u (%d)\n",
-                                       i, ret);
-                       goto err;
-               }
-               ddata->csgpio[i] = ret;
-               dev_dbg(&pdev->dev, "csgpio#%u = %u\n", i, ddata->csgpio[i]);
-               ret = devm_gpio_request_one(&pdev->dev, ddata->csgpio[i],
-                               GPIOF_OUT_INIT_LOW, DRIVER_NAME);
-               if (ret < 0) {
-                       dev_err(&pdev->dev,
-                                       "failed to configure csgpio#%u (%d)\n",
-                                       i, ret);
-                       goto err;
-               }
-       }
-
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                ret = -ENODEV;