spi: sh-msiof: Convert to use GPIO descriptors
authorGeert Uytterhoeven <geert+renesas@glider.be>
Wed, 3 Apr 2019 15:08:52 +0000 (17:08 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 4 Apr 2019 06:00:47 +0000 (13:00 +0700)
Convert GPIO chip selects in the Renesas MSIOF SPI driver from legacy
GPIO numbers to GPIO descriptors.

Notes:
  - The board file for the SH7724-based Ecovec24 development board now
    registers a GPIO descriptor lookup, instead of passing a GPIO number
    through controller_data,
  - sh_msiof_get_cs_gpios() must release all GPIOs, else
    spi_get_gpio_descs() cannot claim them during SPI controller
    registration.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/sh/boards/mach-ecovec24/setup.c
drivers/spi/spi-sh-msiof.c

index 34e5414c556391469ed7a72119a653109f570e6b..f402aa741bf370a819b7840183909faa22419331 100644 (file)
@@ -806,7 +806,6 @@ static struct spi_board_info spi_bus[] = {
                .platform_data  = &mmc_spi_info,
                .max_speed_hz   = 5000000,
                .mode           = SPI_MODE_0,
-               .controller_data = (void *) GPIO_PTM4,
        },
 };
 
@@ -838,6 +837,14 @@ static struct platform_device msiof0_device = {
        .resource       = msiof0_resources,
 };
 
+static struct gpiod_lookup_table msiof_gpio_table = {
+       .dev_id = "spi_sh_msiof.0",
+       .table = {
+               GPIO_LOOKUP("sh7724_pfc", GPIO_PTM4, "cs", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 #endif
 
 /* FSI */
@@ -1296,12 +1303,11 @@ static int __init arch_setup(void)
        gpio_request(GPIO_FN_MSIOF0_TXD, NULL);
        gpio_request(GPIO_FN_MSIOF0_RXD, NULL);
        gpio_request(GPIO_FN_MSIOF0_TSCK, NULL);
-       gpio_request(GPIO_PTM4, NULL); /* software CS control of TSYNC pin */
-       gpio_direction_output(GPIO_PTM4, 1); /* active low CS */
        gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */
        gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */
 
        gpiod_add_lookup_table(&mmc_spi_gpio_table);
+       gpiod_add_lookup_table(&msiof_gpio_table);
        spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
 #endif
 
index d3794499915c17cbd0d8adf054ca63864b89cf48..6aab7b2136dbcadcce196195a6ed98676be3d4a1 100644 (file)
@@ -549,25 +549,11 @@ static void sh_msiof_spi_read_fifo_s32u(struct sh_msiof_spi_priv *p,
 
 static int sh_msiof_spi_setup(struct spi_device *spi)
 {
-       struct device_node *np = spi->controller->dev.of_node;
        struct sh_msiof_spi_priv *p =
                spi_controller_get_devdata(spi->controller);
        u32 clr, set, tmp;
 
-       if (!np) {
-               /*
-                * Use spi->controller_data for CS (same strategy as spi_gpio),
-                * if any. otherwise let HW control CS
-                */
-               spi->cs_gpio = (uintptr_t)spi->controller_data;
-       }
-
-       if (gpio_is_valid(spi->cs_gpio)) {
-               gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
-               return 0;
-       }
-
-       if (spi_controller_is_slave(p->ctlr))
+       if (spi->cs_gpiod || spi_controller_is_slave(p->ctlr))
                return 0;
 
        if (p->native_cs_inited &&
@@ -600,7 +586,7 @@ static int sh_msiof_prepare_message(struct spi_controller *ctlr,
        u32 ss, cs_high;
 
        /* Configure pins before asserting CS */
-       if (gpio_is_valid(spi->cs_gpio)) {
+       if (spi->cs_gpiod) {
                ss = p->unused_ss;
                cs_high = p->native_cs_high;
        } else {
@@ -1156,6 +1142,7 @@ static int sh_msiof_get_cs_gpios(struct sh_msiof_spi_priv *p)
 
                gpiod = devm_gpiod_get_index(dev, "cs", i, GPIOD_ASIS);
                if (!IS_ERR(gpiod)) {
+                       devm_gpiod_put(dev, gpiod);
                        cs_gpios++;
                        continue;
                }
@@ -1407,6 +1394,7 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
        ctlr->bits_per_word_mask = chipdata->bits_per_word_mask;
        ctlr->auto_runtime_pm = true;
        ctlr->transfer_one = sh_msiof_transfer_one;
+       ctlr->use_gpio_descriptors = true;
 
        ret = sh_msiof_request_dma(p);
        if (ret < 0)