| From 55bc8dc26ab9cdc69eb8ca357d03662a2ee2de72 Mon Sep 17 00:00:00 2001 |
| From: Charles Keepax <ckeepax@opensource.cirrus.com> |
| Date: Tue, 26 Nov 2019 16:41:40 +0000 |
| Subject: [PATCH] spi: cadence: Correct handling of native chipselect |
| |
| commit 61acd19f9c56fa0809285346bd0bd4a926ab0da0 upstream. |
| |
| To fix a regression on the Cadence SPI driver, this patch reverts |
| commit 6046f5407ff0 ("spi: cadence: Fix default polarity of native |
| chipselect"). |
| |
| This patch was not the correct fix for the issue. The SPI framework |
| calls the set_cs line with the logic level it desires on the chip select |
| line, as such the old is_high handling was correct. However, this was |
| broken by the fact that before commit 3e5ec1db8bfe ("spi: Fix SPI_CS_HIGH |
| setting when using native and GPIO CS") all controllers that offered |
| the use of a GPIO chip select had SPI_CS_HIGH applied, even for hardware |
| chip selects. This caused the value passed into the driver to be inverted. |
| Which unfortunately makes it look like a logical enable the chip select |
| value. |
| |
| Since the core was corrected to not unconditionally apply SPI_CS_HIGH, |
| the Cadence driver, whilst using the hardware chip select, will deselect |
| the chip select every time we attempt to communicate with the device, |
| which results in failed communications. |
| |
| Fixes: 3e5ec1db8bfe ("spi: Fix SPI_CS_HIGH setting when using native and GPIO CS") |
| Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> |
| Acked-by: Linus Walleij <linus.walleij@linaro.org> |
| Link: https://lore.kernel.org/r/20191126164140.6240-1-ckeepax@opensource.cirrus.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c |
| index 7c41e4e82849..e3dbd670bab2 100644 |
| --- a/drivers/spi/spi-cadence.c |
| +++ b/drivers/spi/spi-cadence.c |
| @@ -168,16 +168,16 @@ static void cdns_spi_init_hw(struct cdns_spi *xspi) |
| /** |
| * cdns_spi_chipselect - Select or deselect the chip select line |
| * @spi: Pointer to the spi_device structure |
| - * @enable: Select (1) or deselect (0) the chip select line |
| + * @is_high: Select(0) or deselect (1) the chip select line |
| */ |
| -static void cdns_spi_chipselect(struct spi_device *spi, bool enable) |
| +static void cdns_spi_chipselect(struct spi_device *spi, bool is_high) |
| { |
| struct cdns_spi *xspi = spi_master_get_devdata(spi->master); |
| u32 ctrl_reg; |
| |
| ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); |
| |
| - if (!enable) { |
| + if (is_high) { |
| /* Deselect the slave */ |
| ctrl_reg |= CDNS_SPI_CR_SSCTRL; |
| } else { |
| -- |
| 2.7.4 |
| |