]> git.baikalelectronics.ru Git - kernel.git/commitdiff
spi: s3c64xx: Convert to use GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 18 Jan 2022 23:09:15 +0000 (00:09 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 24 Jan 2022 13:37:33 +0000 (13:37 +0000)
Convert the S3C64xx SPI host to use GPIO descriptors.

Provide GPIO descriptor tables for the one user with CS
0 and 1.

Cc: linux-samsung-soc@vger.kernel.org
Cc: Sylwester Nawrocki <snawrocki@kernel.org>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20220118230915.157797-3-linus.walleij@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/arm/mach-s3c/mach-crag6410-module.c
arch/arm/mach-s3c/mach-crag6410.c
drivers/spi/spi-s3c64xx.c
include/linux/platform_data/spi-s3c64xx.h

index 407ad493493e3de8bc6f1ea7342fb8e4e67993ff..5d1d4b67a4b776bbb602cad8f750bab14a95d85f 100644 (file)
 
 #include "crag6410.h"
 
-static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = {
-       .line = S3C64XX_GPC(3),
-};
-
 static struct wm0010_pdata wm0010_pdata = {
        .gpio_reset = S3C64XX_GPN(6),
        .reset_active_high = 1, /* Active high for Glenfarclas Rev 2 */
@@ -49,7 +45,6 @@ static struct spi_board_info wm1253_devs[] = {
                .chip_select    = 0,
                .mode           = SPI_MODE_0,
                .irq            = S3C_EINT(4),
-               .controller_data = &wm0010_spi_csinfo,
                .platform_data = &wm0010_pdata,
        },
 };
@@ -62,7 +57,6 @@ static struct spi_board_info balblair_devs[] = {
                .chip_select    = 0,
                .mode           = SPI_MODE_0,
                .irq            = S3C_EINT(4),
-               .controller_data = &wm0010_spi_csinfo,
                .platform_data = &wm0010_pdata,
        },
 };
@@ -229,10 +223,6 @@ static struct arizona_pdata wm5102_reva_pdata = {
        },
 };
 
-static struct s3c64xx_spi_csinfo codec_spi_csinfo = {
-       .line = S3C64XX_GPN(5),
-};
-
 static struct spi_board_info wm5102_reva_spi_devs[] = {
        [0] = {
                .modalias       = "wm5102",
@@ -242,7 +232,6 @@ static struct spi_board_info wm5102_reva_spi_devs[] = {
                .mode           = SPI_MODE_0,
                .irq            = GLENFARCLAS_PMIC_IRQ_BASE +
                                  WM831X_IRQ_GPIO_2,
-               .controller_data = &codec_spi_csinfo,
                .platform_data = &wm5102_reva_pdata,
        },
 };
@@ -275,7 +264,6 @@ static struct spi_board_info wm5102_spi_devs[] = {
                .mode           = SPI_MODE_0,
                .irq            = GLENFARCLAS_PMIC_IRQ_BASE +
                                  WM831X_IRQ_GPIO_2,
-               .controller_data = &codec_spi_csinfo,
                .platform_data = &wm5102_pdata,
        },
 };
@@ -298,7 +286,6 @@ static struct spi_board_info wm5110_spi_devs[] = {
                .mode           = SPI_MODE_0,
                .irq            = GLENFARCLAS_PMIC_IRQ_BASE +
                                  WM831X_IRQ_GPIO_2,
-               .controller_data = &codec_spi_csinfo,
                .platform_data = &wm5102_reva_pdata,
        },
 };
index 41f0aba2d2fd0c0b7d57f3a4013526d9f9c973b1..e3e0fe897bccb0702a5c22e4cbed061258b7860f 100644 (file)
@@ -825,6 +825,15 @@ static const struct gpio_led_platform_data gpio_leds_pdata = {
 
 static struct dwc2_hsotg_plat crag6410_hsotg_pdata;
 
+static struct gpiod_lookup_table crag_spi0_gpiod_table = {
+       .dev_id = "s3c6410-spi.0",
+       .table = {
+               GPIO_LOOKUP_IDX("GPIOC", 3, "cs", 0, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("GPION", 5, "cs", 1, GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static void __init crag6410_machine_init(void)
 {
        /* Open drain IRQs need pullups */
@@ -856,6 +865,8 @@ static void __init crag6410_machine_init(void)
        i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
 
        samsung_keypad_set_platdata(&crag6410_keypad_data);
+
+       gpiod_add_lookup_table(&crag_spi0_gpiod_table);
        s3c64xx_spi0_set_platdata(0, 2);
 
        pwm_add_table(crag6410_pwm_lookup, ARRAY_SIZE(crag6410_pwm_lookup));
index 8755cd85e83ceb05c48716f131ed222d81d366d8..3e42cdb19d272269a6b297c3cda6210714b46932 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/spi/spi.h>
-#include <linux/gpio.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
-#include <linux/of_gpio.h>
 
 #include <linux/platform_data/spi-s3c64xx.h>
 
@@ -656,7 +654,11 @@ static int s3c64xx_spi_prepare_message(struct spi_master *master,
        struct s3c64xx_spi_csinfo *cs = spi->controller_data;
 
        /* Configure feedback delay */
-       writel(cs->fb_delay & 0x3, sdd->regs + S3C64XX_SPI_FB_CLK);
+       if (!cs)
+               /* No delay if not defined */
+               writel(0, sdd->regs + S3C64XX_SPI_FB_CLK);
+       else
+               writel(cs->fb_delay & 0x3, sdd->regs + S3C64XX_SPI_FB_CLK);
 
        return 0;
 }
@@ -830,34 +832,16 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
        if (spi->dev.of_node) {
                cs = s3c64xx_get_slave_ctrldata(spi);
                spi->controller_data = cs;
-       } else if (cs) {
-               /* On non-DT platforms the SPI core will set spi->cs_gpio
-                * to -ENOENT. The GPIO pin used to drive the chip select
-                * is defined by using platform data so spi->cs_gpio value
-                * has to be override to have the proper GPIO pin number.
-                */
-               spi->cs_gpio = cs->line;
        }
 
-       if (IS_ERR_OR_NULL(cs)) {
+       /* NULL is fine, we just avoid using the FB delay (=0) */
+       if (IS_ERR(cs)) {
                dev_err(&spi->dev, "No CS for SPI(%d)\n", spi->chip_select);
                return -ENODEV;
        }
 
-       if (!spi_get_ctldata(spi)) {
-               if (gpio_is_valid(spi->cs_gpio)) {
-                       err = gpio_request_one(spi->cs_gpio, GPIOF_OUT_INIT_HIGH,
-                                              dev_name(&spi->dev));
-                       if (err) {
-                               dev_err(&spi->dev,
-                                       "Failed to get /CS gpio [%d]: %d\n",
-                                       spi->cs_gpio, err);
-                               goto err_gpio_req;
-                       }
-               }
-
+       if (!spi_get_ctldata(spi))
                spi_set_ctldata(spi, cs);
-       }
 
        pm_runtime_get_sync(&sdd->pdev->dev);
 
@@ -909,11 +893,9 @@ setup_exit:
        /* setup() returns with device de-selected */
        s3c64xx_spi_set_cs(spi, false);
 
-       if (gpio_is_valid(spi->cs_gpio))
-               gpio_free(spi->cs_gpio);
        spi_set_ctldata(spi, NULL);
 
-err_gpio_req:
+       /* This was dynamically allocated on the DT path */
        if (spi->dev.of_node)
                kfree(cs);
 
@@ -924,19 +906,9 @@ static void s3c64xx_spi_cleanup(struct spi_device *spi)
 {
        struct s3c64xx_spi_csinfo *cs = spi_get_ctldata(spi);
 
-       if (gpio_is_valid(spi->cs_gpio)) {
-               gpio_free(spi->cs_gpio);
-               if (spi->dev.of_node)
-                       kfree(cs);
-               else {
-                       /* On non-DT platforms, the SPI core sets
-                        * spi->cs_gpio to -ENOENT and .setup()
-                        * overrides it with the GPIO pin value
-                        * passed using platform data.
-                        */
-                       spi->cs_gpio = -ENOENT;
-               }
-       }
+       /* This was dynamically allocated on the DT path */
+       if (spi->dev.of_node)
+               kfree(cs);
 
        spi_set_ctldata(spi, NULL);
 }
@@ -1131,6 +1103,7 @@ static int s3c64xx_spi_probe(struct platform_device *pdev)
        master->prepare_message = s3c64xx_spi_prepare_message;
        master->transfer_one = s3c64xx_spi_transfer_one;
        master->num_chipselect = sci->num_cs;
+       master->use_gpio_descriptors = true;
        master->dma_alignment = 8;
        master->bits_per_word_mask = SPI_BPW_MASK(32) | SPI_BPW_MASK(16) |
                                        SPI_BPW_MASK(8);
index 10890a4b55b9ac404fd89cfb7ac215ba4783af3b..5df1ace6d2c98e1ea585ec8daa01e99da7db5f4d 100644 (file)
@@ -16,7 +16,6 @@ struct platform_device;
  * struct s3c64xx_spi_csinfo - ChipSelect description
  * @fb_delay: Slave specific feedback delay.
  *            Refer to FB_CLK_SEL register definition in SPI chapter.
- * @line: Custom 'identity' of the CS line.
  *
  * This is per SPI-Slave Chipselect information.
  * Allocate and initialize one in machine init code and make the
@@ -24,7 +23,6 @@ struct platform_device;
  */
 struct s3c64xx_spi_csinfo {
        u8 fb_delay;
-       unsigned line;
 };
 
 /**