Commit 453a4b6d authored by Linus Walleij's avatar Linus Walleij Committed by Greg Kroah-Hartman
Browse files

staging: fbtft: Do not hardcode SPI CS polarity inversion



The current use of the mode flag SPI_CS_HIGH is fragile: it
overwrites anything already assigned by the SPI core.

Assign ^= SPI_CS_HIGH since we might be active high
already, and that is usually the case with GPIOs used
for chip select, even if they are in practice active low.

Add a comment clarifying why ^= SPI_CS_HIGH is the right
choice here.

Reported-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20191204233230.22309-1-linus.walleij@linaro.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1184fd99
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -63,11 +63,17 @@ static int init_display(struct fbtft_par *par)
{
	int ret;

	/* Set CS active high */
	par->spi->mode |= SPI_CS_HIGH;
	/*
	 * Set CS active inverse polarity: just setting SPI_CS_HIGH does not
	 * work with GPIO based chip selects that are logically active high
	 * but inverted inside the GPIO library, so enforce inverted
	 * semantics.
	 */
	par->spi->mode ^= SPI_CS_HIGH;
	ret = spi_setup(par->spi);
	if (ret) {
		dev_err(par->info->device, "Could not set SPI_CS_HIGH\n");
		dev_err(par->info->device,
			"Could not set inverse CS polarity\n");
		return ret;
	}

+10 −3
Original line number Diff line number Diff line
@@ -150,10 +150,17 @@ static int init_display(struct fbtft_par *par)

	/* enable SPI interface by having CS and MOSI low during reset */
	save_mode = par->spi->mode;
	par->spi->mode |= SPI_CS_HIGH;
	ret = spi_setup(par->spi); /* set CS inactive low */
	/*
	 * Set CS active inverse polarity: just setting SPI_CS_HIGH does not
	 * work with GPIO based chip selects that are logically active high
	 * but inverted inside the GPIO library, so enforce inverted
	 * semantics.
	 */
	par->spi->mode ^= SPI_CS_HIGH;
	ret = spi_setup(par->spi);
	if (ret) {
		dev_err(par->info->device, "Could not set SPI_CS_HIGH\n");
		dev_err(par->info->device,
			"Could not set inverse CS polarity\n");
		return ret;
	}
	write_reg(par, 0x00); /* make sure mode is set */