| From 1e858fdaa8bc580f6cd7422cdb223e8b2d8f93a6 Mon Sep 17 00:00:00 2001 |
| From: Gregory CLEMENT <gregory.clement@bootlin.com> |
| Date: Fri, 18 Oct 2019 17:29:29 +0200 |
| Subject: [PATCH] spi: Fix SPI_CS_HIGH setting when using native and GPIO CS |
| |
| commit 3e5ec1db8bfee845d9f8560d1c64aeaccd586398 upstream. |
| |
| When improving the CS GPIO support at core level, the SPI_CS_HIGH |
| has been enabled for all the CS lines used for a given SPI controller. |
| |
| However, the SPI framework allows to have on the same controller native |
| CS and GPIO CS. The native CS may not support the SPI_CS_HIGH, so they |
| should not be setup automatically. |
| |
| With this patch the setting is done only for the CS that will use a |
| GPIO as CS |
| |
| Fixes: f3186dd87669 ("spi: Optionally use GPIO descriptors for CS GPIOs") |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com> |
| Link: https://lore.kernel.org/r/20191018152929.3287-1-gregory.clement@bootlin.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
| index 29916e446143..7d31242c9ab7 100644 |
| --- a/drivers/spi/spi.c |
| +++ b/drivers/spi/spi.c |
| @@ -1643,15 +1643,7 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi, |
| spi->mode |= SPI_3WIRE; |
| if (of_property_read_bool(nc, "spi-lsb-first")) |
| spi->mode |= SPI_LSB_FIRST; |
| - |
| - /* |
| - * For descriptors associated with the device, polarity inversion is |
| - * handled in the gpiolib, so all chip selects are "active high" in |
| - * the logical sense, the gpiolib will invert the line if need be. |
| - */ |
| - if (ctlr->use_gpio_descriptors) |
| - spi->mode |= SPI_CS_HIGH; |
| - else if (of_property_read_bool(nc, "spi-cs-high")) |
| + if (of_property_read_bool(nc, "spi-cs-high")) |
| spi->mode |= SPI_CS_HIGH; |
| |
| /* Device DUAL/QUAD mode */ |
| @@ -1715,6 +1707,14 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi, |
| } |
| spi->chip_select = value; |
| |
| + /* |
| + * For descriptors associated with the device, polarity inversion is |
| + * handled in the gpiolib, so all gpio chip selects are "active high" |
| + * in the logical sense, the gpiolib will invert the line if need be. |
| + */ |
| + if ((ctlr->use_gpio_descriptors) && ctlr->cs_gpiods[spi->chip_select]) |
| + spi->mode |= SPI_CS_HIGH; |
| + |
| /* Device speed */ |
| rc = of_property_read_u32(nc, "spi-max-frequency", &value); |
| if (rc) { |
| -- |
| 2.7.4 |
| |