]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
spi: oc-tiny: Simplify tiny_spi_txrx_bufs implementation when irq is not used
authorAxel Lin <axel.lin@ingics.com>
Wed, 8 Jan 2014 08:00:04 +0000 (16:00 +0800)
committerMark Brown <broonie@linaro.org>
Thu, 9 Jan 2014 17:58:28 +0000 (17:58 +0000)
Currently we have similar code for (txp && rxp), (txp && !rxp), (!rxp & txp),
and (!txp && !rxp) cases. This patch refactors the code a bit to avoid
duplicate similar code.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/spi/spi-oc-tiny.c

index 91c66859620232a024827df02f846c0a6f08798d..f7c896e2981ef684d339f8e97f2b021ff468c35d 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;
 }