Pull out all the PIO transfer logic into separate function,
so DMA can be added.

Signed-off-by: Marek Vasut <ma...@denx.de>
Cc: Fabio Estevam <feste...@freescale.com>
Cc: Otavio Salvador <ota...@ossystems.com.br>
Cc: Stefano Babic <sba...@denx.de>
Cc: Wolfgang Denk <w...@denx.de>
---
 drivers/spi/mxs_spi.c |   72 +++++++++++++++++++++++++++----------------------
 1 file changed, 40 insertions(+), 32 deletions(-)

diff --git a/drivers/spi/mxs_spi.c b/drivers/spi/mxs_spi.c
index a47b25b..0459b3b 100644
--- a/drivers/spi/mxs_spi.c
+++ b/drivers/spi/mxs_spi.c
@@ -140,46 +140,19 @@ static void mxs_spi_end_xfer(struct mx28_ssp_regs 
*ssp_regs)
        writel(SSP_CTRL0_IGNORE_CRC, &ssp_regs->hw_ssp_ctrl0_set);
 }
 
-int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
-               const void *dout, void *din, unsigned long flags)
+static int mxs_spi_xfer_pio(struct mxs_spi_slave *slave,
+                       char *data, int length, int write, unsigned long flags)
 {
-       struct mxs_spi_slave *mxs_slave = to_mxs_slave(slave);
-       struct mx28_ssp_regs *ssp_regs = mxs_slave->regs;
-       int len = bitlen / 8;
-       char dummy;
-       int write = 0;
-       char *data = NULL;
-
-       if (bitlen == 0) {
-               if (flags & SPI_XFER_END) {
-                       din = (void *)&dummy;
-                       len = 1;
-               } else
-                       return 0;
-       }
-
-       if (din && dout) {
-               /* Half-duplex only */
-               return -EINVAL;
-       } else if (!din && !dout) {
-               /* No data */
-               return 0;
-       } else if (dout) {
-               data = (char *)dout;
-               write = 1;
-       } else if (din) {
-               data = (char *)din;
-               write = 0;
-       }
+       struct mx28_ssp_regs *ssp_regs = slave->regs;
 
        if (flags & SPI_XFER_BEGIN)
                mxs_spi_start_xfer(ssp_regs);
 
-       while (len--) {
+       while (length--) {
                /* We transfer 1 byte */
                writel(1, &ssp_regs->hw_ssp_xfer_size);
 
-               if ((flags & SPI_XFER_END) && !len)
+               if ((flags & SPI_XFER_END) && !length)
                        mxs_spi_end_xfer(ssp_regs);
 
                if (write)
@@ -219,4 +192,39 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
        }
 
        return 0;
+
+}
+
+int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
+               const void *dout, void *din, unsigned long flags)
+{
+       struct mxs_spi_slave *mxs_slave = to_mxs_slave(slave);
+       int len = bitlen / 8;
+       char dummy;
+       int write = 0;
+       char *data = NULL;
+
+       if (bitlen == 0) {
+               if (flags & SPI_XFER_END) {
+                       din = (void *)&dummy;
+                       len = 1;
+               } else
+                       return 0;
+       }
+
+       if (din && dout) {
+               /* Half-duplex only */
+               return -EINVAL;
+       } else if (!din && !dout) {
+               /* No data */
+               return 0;
+       } else if (dout) {
+               data = (char *)dout;
+               write = 1;
+       } else if (din) {
+               data = (char *)din;
+               write = 0;
+       }
+
+       return  mxs_spi_xfer_pio(mxs_slave, data, len, write, flags);
 }
-- 
1.7.10.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to