[BUG] SPI_LSB_FIRST ignored in most SPI drivers

Ulf Samuelsson u-boot at emagii.com
Fri Sep 25 09:12:10 CEST 2020


It appears that most SPI drivers does not honour the SPI_LSB_FIRST flag.
The Cyclone 10 LP FPGA can be configured by an SPI look-alike port, but 
it needs LSB first.

when I tried this, I realized that the SPI driver I was using did
not support sending with LSB first, it always sends MSB first which does 
not work.

I then checked the rest, and it appears that very few drivers support 
LSB first, and no warning is given if the flag is set.

ulf at valinor:~/projects/u-boot/u-boot-2020.10-rc5$ rgrep SPI_LSB
drivers/spi/xilinx_spi.c:	if (mode & SPI_LSB_FIRST)
drivers/spi/stm32_spi.c:	if (mode & SPI_LSB_FIRST)
drivers/spi/cf_spi.c: *      7 -  0: SPI_CPHA, SPI_CPOL, SPI_LSB_FIRST
drivers/spi/cf_spi.c:	if (cfspi->mode & SPI_LSB_FIRST)
drivers/spi/spi-sifive.c:	if (slave_plat->mode & SPI_LSB_FIRST)
drivers/spi/fsl_dspi.c:	if (mode & SPI_LSB_FIRST)
drivers/spi/octeon_spi.c:		FIELD_PREP(MPI_CFG_LSBFIRST, !!(slave->mode & 
SPI_LSB_FIRST)) |
drivers/spi/uniphier_spi.c:	if (mode & SPI_LSB_FIRST) {
drivers/spi/mt7621_spi.c:	if (mode & SPI_LSB_FIRST)
drivers/spi/kirkwood_spi.c:	if (mode & SPI_LSB_FIRST)
drivers/spi/bcm63xx_spi.c:	if (mode & SPI_LSB_FIRST)
include/spi.h:#define SPI_LSB_FIRST	BIT(3)			/* per-word bits-on-wire */

I plan to extend the omap3-spi driver by checking for the condition
* 8-bit wordlen
* write only (no read or bidirectional transfer)
and then I create a temporary buffer using malloc/free.

Possibly the buffer should be statically allocated in the driver
with a configurable size defined in Kconfig.
Since the amount of FPGA configuration is fixed for a certain board
this should work.

Best Regards
Ulf Samuelsson




More information about the U-Boot mailing list