]> git.sur5r.net Git - u-boot/commitdiff
spi: Add support for dual and quad mode
authorMugunthan V N <mugunthanvnm@ti.com>
Wed, 23 Dec 2015 15:09:37 +0000 (20:39 +0530)
committerJagan Teki <jteki@openedev.com>
Wed, 13 Jan 2016 13:17:27 +0000 (18:47 +0530)
spi bus can support dual and quad wire data transfers for tx and
rx. So defining dual and quad modes for both tx and rx. Also add
support to parse bus width used for spi tx and rx transfers.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Reviewed-by: Jagan Teki <jteki@openedev.com>
Signed-off-by: Jagan Teki <jteki@openedev.com>
drivers/spi/spi-uclass.c
include/spi.h

index e0f6b25f30a6b6b6f814415faabc7968a12a00cb..677c020b110251fcac33251f5446c5eb80ede925 100644 (file)
@@ -157,6 +157,7 @@ static int spi_child_pre_probe(struct udevice *dev)
 
        slave->max_hz = plat->max_hz;
        slave->mode = plat->mode;
+       slave->mode_rx = plat->mode_rx;
 
        return 0;
 }
@@ -368,7 +369,8 @@ void spi_free_slave(struct spi_slave *slave)
 int spi_slave_ofdata_to_platdata(const void *blob, int node,
                                 struct dm_spi_slave_platdata *plat)
 {
-       int mode = 0;
+       int mode = 0, mode_rx = 0;
+       int value;
 
        plat->cs = fdtdec_get_int(blob, node, "reg", -1);
        plat->max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", 0);
@@ -382,8 +384,42 @@ int spi_slave_ofdata_to_platdata(const void *blob, int node,
                mode |= SPI_3WIRE;
        if (fdtdec_get_bool(blob, node, "spi-half-duplex"))
                mode |= SPI_PREAMBLE;
+
+       /* Device DUAL/QUAD mode */
+       value = fdtdec_get_uint(blob, node, "spi-tx-bus-width", 1);
+       switch (value) {
+       case 1:
+               break;
+       case 2:
+               mode |= SPI_TX_DUAL;
+               break;
+       case 4:
+               mode |= SPI_TX_QUAD;
+               break;
+       default:
+               error("spi-tx-bus-width %d not supported\n", value);
+               break;
+       }
+
        plat->mode = mode;
 
+       value = fdtdec_get_uint(blob, node, "spi-rx-bus-width", 1);
+       switch (value) {
+       case 1:
+               break;
+       case 2:
+               mode_rx |= SPI_RX_DUAL;
+               break;
+       case 4:
+               mode_rx |= SPI_RX_QUAD;
+               break;
+       default:
+               error("spi-rx-bus-width %d not supported\n", value);
+               break;
+       }
+
+       plat->mode_rx = mode_rx;
+
        return 0;
 }
 
index 25470e4df2669fd9da49a8f696a4085f218931a1..4b88d3986e78cea0e3bf117a5b6351f88c011146 100644 (file)
@@ -61,11 +61,13 @@ struct dm_spi_bus {
  * @cs:                Chip select number (0..n-1)
  * @max_hz:    Maximum bus speed that this slave can tolerate
  * @mode:      SPI mode to use for this device (see SPI mode flags)
+ * @mode_rx:   SPI RX mode to use for this slave (see SPI mode_rx flags)
  */
 struct dm_spi_slave_platdata {
        unsigned int cs;
        uint max_hz;
        uint mode;
+       u8 mode_rx;
 };
 
 #endif /* CONFIG_DM_SPI */