Unverified Commit a45cf3cc authored by Linus Walleij's avatar Linus Walleij Committed by Mark Brown
Browse files

spi: s3c64xx: Convert to use GPIO descriptors



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: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Reviewed-by: default avatarSam Protsenko <semen.protsenko@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20220118230915.157797-3-linus.walleij@linaro.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 3b5529ae
Loading
Loading
Loading
Loading
+0 −13
Original line number Diff line number Diff line
@@ -32,10 +32,6 @@

#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,
	},
};
+11 −0
Original line number Diff line number Diff line
@@ -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));
+13 −40
Original line number Diff line number Diff line
@@ -13,10 +13,8 @@
#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,6 +654,10 @@ static int s3c64xx_spi_prepare_message(struct spi_master *master,
	struct s3c64xx_spi_csinfo *cs = spi->controller_data;

	/* Configure feedback delay */
	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 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
	/* 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);
	/* This was dynamically allocated on the DT path */
	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;
		}
	}

	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);
+0 −2
Original line number Diff line number Diff line
@@ -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;
};

/**