Skip to contentSkip to conversation

spi: new spi->mode bits

PATCH In review David Brownell 2 participants 3 messages Jun 23, 2009 2 messages not in the archive SPI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 spi: new spi->mode bits

From: David Brownell <[email protected]>

Add two new spi_device.mode bits to accomodate more protocol options, and pass them through to usermode drivers:

* SPI_NO_CS ... a second 3-wire variant, where the chipselect line is removed instead of a data line; transfers are still full duplex.

This obviously has STRONG protocol implications since the chipselect transitions can't be used to synchronize state transitions with the SPI master.

* SPI_READY ... defines open drain signal that's pulled low to pause the clock. This defines a 5-wire variant (normal 4-wire SPI plus READY) and two 4-wire variants (READY plus each of the 3-wire flavors).

Such hardware flow control can be a big win. There are ADC converters and flash chips that expose READY signals, but not many host controllers support it today.

The spi_bitbang code should be changed to use SPI_NO_CS instead of its current nonportable hack. That's a mode most hardware can easily support (unlike SPI_READY).

---
An upcoming driver for the SPI controller in some new DaVinci family chips (the DA830/OMAP-L137) supports both these modes.

Yep, and later patches will add more spi_device.mode bits, now that the existing set is all used up.

 Documentation/spi/spidev_test.c |   10 +++++++++-
 drivers/spi/spidev.c            |   17 +++++++++++------
 include/linux/spi/spi.h         |    2 ++
 include/linux/spi/spidev.h      |    2 ++
 4 files changed, 24 insertions(+), 7 deletions(-)
Documentation/spi/spidev_test.c +9 -1
@@ -99,11 +99,13 @@ void parse_opts(int argc, char *argv[])
 			{ "lsb",     0, 0, 'L' },
 			{ "cs-high", 0, 0, 'C' },
 			{ "3wire",   0, 0, '3' },
+			{ "no-cs",   0, 0, 'N' },
+			{ "ready",   0, 0, 'R' },
 			{ NULL, 0, 0, 0 },
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3", lopts, NULL);
+		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);
 
 		if (c == -1)
 			break;
@@ -139,6 +141,12 @@ void parse_opts(int argc, char *argv[])
 		case '3':
 			mode |= SPI_3WIRE;
 			break;
+		case 'N':
+			mode |= SPI_NO_CS;
+			break;
+		case 'R':
+			mode |= SPI_READY;
+			break;
 		default:
 			print_usage(argv[0]);
 			break;
drivers/spi/spidev.c +11 -6
@@ -58,15 +58,20 @@ static unsigned long	minors[N_SPI_MINORS
 
 
 /* Bit masks for spi_device.mode management.  Note that incorrect
- * settings for CS_HIGH and 3WIRE can cause *lots* of trouble for other
- * devices on a shared bus:  CS_HIGH, because this device will be
- * active when it shouldn't be;  3WIRE, because when active it won't
- * behave as it should.
+ * settings for some settings can cause *lots* of trouble for other
+ * devices on a shared bus:
  *
- * REVISIT should changing those two modes be privileged?
+ *  - CS_HIGH ... this device will be active when it shouldn't be
+ *  - 3WIRE ... when active, it won't behave as it should
+ *  - NO_CS ... there will be no explicit message boundaries; this
+ *	is completely incompatible with the shared bus model
+ *  - READY ... transfers may proceed when they shouldn't.
+ *
+ * REVISIT should changing those flags be privileged?
  */
 #define SPI_MODE_MASK		(SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \
-				| SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP)
+				| SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP \
+				| SPI_NO_CS | SPI_READY)
 
 struct spidev_data {
 	dev_t			devt;
include/linux/spi/spi.h +2 -0
@@ -80,6 +80,8 @@ struct spi_device {
 #define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */
 #define	SPI_3WIRE	0x10			/* SI/SO signals shared */
 #define	SPI_LOOP	0x20			/* loopback mode */
+#define	SPI_NO_CS	0x40			/* 1 dev/bus, no chipselect */
+#define	SPI_READY	0x80			/* slave pulls low to pause */
 	u8			bits_per_word;
 	int			irq;
 	void			*controller_state;
include/linux/spi/spidev.h +2 -0
@@ -40,6 +40,8 @@
 #define SPI_LSB_FIRST		0x08
 #define SPI_3WIRE		0x10
 #define SPI_LOOP		0x20
+#define SPI_NO_CS		0x40
+#define SPI_READY		0x80
 
 /*---------------------------------------------------------------------------*/
 

------------------------------------------------------------------------------

A message that is not in the archive (sent off-list or not yet received): 200906231207.37879.david-b-yBeKhBN/[email protected]

#2 lore raw
Quoted 1 line · On Tue, 23 Jun 2009 12:07:37 -0700 David Brownell…

Subject: [patch 2.6.30] spi: new spi->mode bits

2.6.31, I assume.

It's a bit late for 2.6.31 really, but this looks harmless enough.

------------------------------------------------------------------------------

A message that is not in the archive (sent off-list or not yet received): 20090623121555.065876b2.akpm-de/[email protected]

#4 lore raw
Quoted 8 lines · Andrew Morton
Quoted 1 line · On Tue, 23 Jun 2009 12:07:37 -0700 David Brownell…

Subject: [patch 2.6.30] spi: new spi->mode bits

2.6.31, I assume.

It's a bit late for 2.6.31 really, but this looks harmless enough.

Yeah, 2.6.31 would be good ... I thought I'd sent this before, evidently not.

------------------------------------------------------------------------------