|
@@ -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;
|
|
|
}
|
|
|
|