Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spidev supports more communications modes

The spidev driver doesn't currently expose all SPI communications modes to
userspace. This passes them all through to the driver.

Two of them are potentially troublesome, in the sense that they could cause
hardware conflicts on shared busses. It might be appropriate to add some
privilege checks for for those modes.

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Anton Vorontsov and committed by
Linus Torvalds
6f166e38 4ef7af50

+14 -3
+10 -3
drivers/spi/spidev.c
··· 55 55 static unsigned long minors[N_SPI_MINORS / BITS_PER_LONG]; 56 56 57 57 58 - /* Bit masks for spi_device.mode management */ 59 - #define SPI_MODE_MASK (SPI_CPHA | SPI_CPOL) 60 - 58 + /* Bit masks for spi_device.mode management. Note that incorrect 59 + * settings for CS_HIGH and 3WIRE can cause *lots* of trouble for other 60 + * devices on a shared bus: CS_HIGH, because this device will be 61 + * active when it shouldn't be; 3WIRE, because when active it won't 62 + * behave as it should. 63 + * 64 + * REVISIT should changing those two modes be privileged? 65 + */ 66 + #define SPI_MODE_MASK (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \ 67 + | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP) 61 68 62 69 struct spidev_data { 63 70 struct device dev;
+4
include/linux/spi/spidev.h
··· 35 35 #define SPI_MODE_2 (SPI_CPOL|0) 36 36 #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) 37 37 38 + #define SPI_CS_HIGH 0x04 39 + #define SPI_LSB_FIRST 0x08 40 + #define SPI_3WIRE 0x10 41 + #define SPI_LOOP 0x20 38 42 39 43 /*---------------------------------------------------------------------------*/ 40 44