Commit ccf77cc4 authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman
Browse files

[PATCH] SPI: devices can require LSB-first encodings



Add spi_device hook for LSB-first word encoding, and update all the
(in-tree) controller drivers to reject such devices.  Eventually,
some controller drivers will be updated to support lsb-first encodings
on the wire; no current drivers need this.

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent ff9f4771
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -187,13 +187,22 @@ int spi_bitbang_setup(struct spi_device *spi)
	if (!spi->max_speed_hz)
		return -EINVAL;

	bitbang = spi_master_get_devdata(spi->master);

	/* REVISIT: some systems will want to support devices using lsb-first
	 * bit encodings on the wire.  In pure software that would be trivial,
	 * just bitbang_txrx_le_cphaX() routines shifting the other way, and
	 * some hardware controllers also have this support.
	 */
	if ((spi->mode & SPI_LSB_FIRST) != 0)
		return -EINVAL;

	if (!cs) {
		cs = kzalloc(sizeof *cs, SLAB_KERNEL);
		if (!cs)
			return -ENOMEM;
		spi->controller_state = cs;
	}
	bitbang = spi_master_get_devdata(spi->master);

	if (!spi->bits_per_word)
		spi->bits_per_word = 8;
+5 −2
Original line number Diff line number Diff line
@@ -35,10 +35,13 @@ extern struct bus_type spi_bus_type;
 * @chip-select: Chipselect, distinguishing chips handled by "master".
 * @mode: The spi mode defines how data is clocked out and in.
 *	This may be changed by the device's driver.
 *	The "active low" default for chipselect mode can be overridden,
 *	as can the "MSB first" default for each word in a transfer.
 * @bits_per_word: Data transfers involve one or more words; word sizes
 *	like eight or 12 bits are common.  In-memory wordsizes are
 *	powers of two bytes (e.g. 20 bit samples use 32 bits).
 *	This may be changed by the device's driver.
 *	This may be changed by the device's driver, or left at the
 *	default (0) indicating protocol words are eight bit bytes.
 *	The spi_transfer.bits_per_word can override this for each transfer.
 * @irq: Negative, or the number passed to request_irq() to receive
 *	interrupts from this device.
@@ -67,6 +70,7 @@ struct spi_device {
#define	SPI_MODE_2	(SPI_CPOL|0)
#define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA)
#define	SPI_CS_HIGH	0x04			/* chipselect active high? */
#define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */
	u8			bits_per_word;
	int			irq;
	void			*controller_state;
@@ -75,7 +79,6 @@ struct spi_device {

	// likely need more hooks for more protocol options affecting how
	// the controller talks to each chip, like:
	//  - bit order (default is wordwise msb-first)
	//  - memory packing (12 bit samples into low bits, others zeroed)
	//  - priority
	//  - drop chipselect after each word