Merge branch 'drop-time' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek...
[pandora-kernel.git] / drivers / spi / spi-oc-tiny.c
index 91c6685..f7c896e 100644 (file)
@@ -153,62 +153,22 @@ static int tiny_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
                }
 
                wait_for_completion(&hw->done);
-       } else if (txp && rxp) {
-               /* we need to tighten the transfer loop */
-               writeb(*txp++, hw->base + TINY_SPI_TXDATA);
-               if (t->len > 1) {
-                       writeb(*txp++, hw->base + TINY_SPI_TXDATA);
-                       for (i = 2; i < t->len; i++) {
-                               u8 rx, tx = *txp++;
-                               tiny_spi_wait_txr(hw);
-                               rx = readb(hw->base + TINY_SPI_TXDATA);
-                               writeb(tx, hw->base + TINY_SPI_TXDATA);
-                               *rxp++ = rx;
-                       }
-                       tiny_spi_wait_txr(hw);
-                       *rxp++ = readb(hw->base + TINY_SPI_TXDATA);
-               }
-               tiny_spi_wait_txe(hw);
-               *rxp++ = readb(hw->base + TINY_SPI_RXDATA);
-       } else if (rxp) {
-               writeb(0, hw->base + TINY_SPI_TXDATA);
-               if (t->len > 1) {
-                       writeb(0,
-                              hw->base + TINY_SPI_TXDATA);
-                       for (i = 2; i < t->len; i++) {
-                               u8 rx;
-                               tiny_spi_wait_txr(hw);
-                               rx = readb(hw->base + TINY_SPI_TXDATA);
-                               writeb(0, hw->base + TINY_SPI_TXDATA);
-                               *rxp++ = rx;
-                       }
-                       tiny_spi_wait_txr(hw);
-                       *rxp++ = readb(hw->base + TINY_SPI_TXDATA);
-               }
-               tiny_spi_wait_txe(hw);
-               *rxp++ = readb(hw->base + TINY_SPI_RXDATA);
-       } else if (txp) {
-               writeb(*txp++, hw->base + TINY_SPI_TXDATA);
-               if (t->len > 1) {
-                       writeb(*txp++, hw->base + TINY_SPI_TXDATA);
-                       for (i = 2; i < t->len; i++) {
-                               u8 tx = *txp++;
-                               tiny_spi_wait_txr(hw);
-                               writeb(tx, hw->base + TINY_SPI_TXDATA);
-                       }
-               }
-               tiny_spi_wait_txe(hw);
        } else {
-               writeb(0, hw->base + TINY_SPI_TXDATA);
-               if (t->len > 1) {
-                       writeb(0, hw->base + TINY_SPI_TXDATA);
-                       for (i = 2; i < t->len; i++) {
+               /* we need to tighten the transfer loop */
+               writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
+               for (i = 1; i < t->len; i++) {
+                       writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
+
+                       if (rxp || (i != t->len - 1))
                                tiny_spi_wait_txr(hw);
-                               writeb(0, hw->base + TINY_SPI_TXDATA);
-                       }
+                       if (rxp)
+                               *rxp++ = readb(hw->base + TINY_SPI_TXDATA);
                }
                tiny_spi_wait_txe(hw);
+               if (rxp)
+                       *rxp++ = readb(hw->base + TINY_SPI_RXDATA);
        }
+
        return t->len;
 }