Skip to content

Commit 821c8c9

Browse files
committed
spi: spi-mem: Allow specifying the byte order in DTR mode
There are NOR flashes (Macronix) that swap the bytes on a 16-bit boundary when configured in DTR mode. The byte order of 16-bit words is swapped when read or written in Double Transfer Rate (DTR) mode compared to Single Transfer Rate (STR) mode. If one writes D0 D1 D2 D3 bytes using 1-1-1 mode, and uses 8D-8D-8D SPI mode for reading, it will read back D1 D0 D3 D2. Swapping the bytes is a bad design decision because this may introduce some endianness problems. It can affect the boot sequence if the entire boot sequence is not handled in either 8D-8D-8D mode or 1-1-1 mode. Fortunately there are controllers that can swap back the bytes at runtime, fixing the endiannesses. Provide a way for the upper layers to specify the byte order in DTR mode. Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
1 parent 15af7e1 commit 821c8c9

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

include/linux/spi/spi-mem.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ enum spi_mem_data_dir {
8989
* @dummy.dtr: whether the dummy bytes should be sent in DTR mode or not
9090
* @data.buswidth: number of IO lanes used to send/receive the data
9191
* @data.dtr: whether the data should be sent in DTR mode or not
92+
* @data.dtr_bswap16: whether the byte order of 16-bit words is swapped when
93+
* read or written in DTR mode compared to STR mode.
9294
* @data.dir: direction of the transfer
9395
* @data.nbytes: number of data bytes to send/receive. Can be zero if the
9496
* operation does not involve transferring data
@@ -119,6 +121,7 @@ struct spi_mem_op {
119121
struct {
120122
u8 buswidth;
121123
u8 dtr : 1;
124+
u8 dtr_bswap16 : 1;
122125
enum spi_mem_data_dir dir;
123126
unsigned int nbytes;
124127
union {

0 commit comments

Comments
 (0)