#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/dmaengine.h>
-#include <linux/gpio.h>
 #include <linux/interrupt.h>
 #include <linux/iopoll.h>
 #include <linux/module.h>
        return IRQ_HANDLED;
 }
 
-/**
- * stm32_spi_setup - setup device chip select
- */
-static int stm32_spi_setup(struct spi_device *spi_dev)
-{
-       int ret = 0;
-
-       if (!gpio_is_valid(spi_dev->cs_gpio)) {
-               dev_err(&spi_dev->dev, "%d is not a valid gpio\n",
-                       spi_dev->cs_gpio);
-               return -EINVAL;
-       }
-
-       dev_dbg(&spi_dev->dev, "%s: set gpio%d output %s\n", __func__,
-               spi_dev->cs_gpio,
-               (spi_dev->mode & SPI_CS_HIGH) ? "low" : "high");
-
-       ret = gpio_direction_output(spi_dev->cs_gpio,
-                                   !(spi_dev->mode & SPI_CS_HIGH));
-
-       return ret;
-}
-
 /**
  * stm32_spi_prepare_msg - set up the controller to transfer a single message
  */
        struct spi_master *master;
        struct stm32_spi *spi;
        struct resource *res;
-       int i, ret;
+       int ret;
 
        master = spi_alloc_master(&pdev->dev, sizeof(struct stm32_spi));
        if (!master) {
        master->bits_per_word_mask = spi->cfg->get_bpw_mask(spi);
        master->max_speed_hz = spi->clk_rate / spi->cfg->baud_rate_div_min;
        master->min_speed_hz = spi->clk_rate / spi->cfg->baud_rate_div_max;
-       master->setup = stm32_spi_setup;
+       master->use_gpio_descriptors = true;
        master->prepare_message = stm32_spi_prepare_msg;
        master->transfer_one = stm32_spi_transfer_one;
        master->unprepare_message = stm32_spi_unprepare_msg;
                goto err_dma_release;
        }
 
-       if (!master->cs_gpios) {
+       if (!master->cs_gpiods) {
                dev_err(&pdev->dev, "no CS gpios available\n");
                ret = -EINVAL;
                goto err_dma_release;
        }
 
-       for (i = 0; i < master->num_chipselect; i++) {
-               if (!gpio_is_valid(master->cs_gpios[i])) {
-                       dev_err(&pdev->dev, "%i is not a valid gpio\n",
-                               master->cs_gpios[i]);
-                       ret = -EINVAL;
-                       goto err_dma_release;
-               }
-
-               ret = devm_gpio_request(&pdev->dev, master->cs_gpios[i],
-                                       DRIVER_NAME);
-               if (ret) {
-                       dev_err(&pdev->dev, "can't get CS gpio %i\n",
-                               master->cs_gpios[i]);
-                       goto err_dma_release;
-               }
-       }
-
        dev_info(&pdev->dev, "driver initialized\n");
 
        return 0;