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: Mark Brown <broonie@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20191204233230.22309-1-linus.walleij@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1184fd9966
commit
453a4b6d8e
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue