spi: omap2-mcspi: Convert to use GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Thu, 25 Jun 2020 23:12:57 +0000 (01:12 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 29 Jun 2020 18:14:07 +0000 (19:14 +0100)
The OMAP2 MCSPI has some kind of half-baked GPIO CS support:
it includes code like this:

  if (gpio_is_valid(spi->cs_gpio)) {
        ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
(...)

But it doesn't parse the "cs-gpios" attribute in the device
tree to count the number of GPIOs or pick out the GPIO numbers
and put these in the SPI master's .cs_gpios property.

We complete the implementation of supporting CS GPIOs
from the device tree and switch it over to use the SPI core
for this.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Tony Lindgren <tony@atomide.com>
Link: https://lore.kernel.org/r/20200625231257.280615-1-linus.walleij@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-omap2-mcspi.c

index e9e2567..1c9478e 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/iopoll.h>
 
 #include <linux/spi/spi.h>
-#include <linux/gpio.h>
 
 #include <linux/platform_data/spi-omap2-mcspi.h>
 
@@ -1043,16 +1042,6 @@ static int omap2_mcspi_setup(struct spi_device *spi)
                spi->controller_state = cs;
                /* Link this to context save list */
                list_add_tail(&cs->node, &ctx->cs);
-
-               if (gpio_is_valid(spi->cs_gpio)) {
-                       ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
-                       if (ret) {
-                               dev_err(&spi->dev, "failed to request gpio\n");
-                               return ret;
-                       }
-                       gpio_direction_output(spi->cs_gpio,
-                                        !(spi->mode & SPI_CS_HIGH));
-               }
        }
 
        ret = pm_runtime_get_sync(mcspi->dev);
@@ -1080,9 +1069,6 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
 
                kfree(cs);
        }
-
-       if (gpio_is_valid(spi->cs_gpio))
-               gpio_free(spi->cs_gpio);
 }
 
 static irqreturn_t omap2_mcspi_irq_handler(int irq, void *data)
@@ -1152,7 +1138,7 @@ static int omap2_mcspi_transfer_one(struct spi_master *master,
 
        omap2_mcspi_set_enable(spi, 0);
 
-       if (gpio_is_valid(spi->cs_gpio))
+       if (spi->cs_gpiod)
                omap2_mcspi_set_cs(spi, spi->mode & SPI_CS_HIGH);
 
        if (par_override ||
@@ -1241,7 +1227,7 @@ out:
 
        omap2_mcspi_set_enable(spi, 0);
 
-       if (gpio_is_valid(spi->cs_gpio))
+       if (spi->cs_gpiod)
                omap2_mcspi_set_cs(spi, !(spi->mode & SPI_CS_HIGH));
 
        if (mcspi->fifo_depth > 0 && t)
@@ -1431,6 +1417,7 @@ static int omap2_mcspi_probe(struct platform_device *pdev)
        master->dev.of_node = node;
        master->max_speed_hz = OMAP2_MCSPI_MAX_FREQ;
        master->min_speed_hz = OMAP2_MCSPI_MAX_FREQ >> 15;
+       master->use_gpio_descriptors = true;
 
        platform_set_drvdata(pdev, master);