]> rtime.felk.cvut.cz Git - lisovros/linux_canprio.git/commitdiff
[PATCH] SPI: devices can require LSB-first encodings
authorDavid Brownell <david-b@pacbell.net>
Mon, 3 Apr 2006 22:46:22 +0000 (15:46 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 16 May 2006 21:33:57 +0000 (14:33 -0700)
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: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/spi/spi_bitbang.c
include/linux/spi/spi.h

index 6c3da64d609a69330d0d8f01bb2173fd25afc9d4..0f7f5c64391cbb62700189d6c2cc89220811421e 100644 (file)
@@ -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;
index 082006714b85b8a0f9f64d63d78a8adb03eef114..77add901691d2f192338430228a18e5985707329 100644 (file)
@@ -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