spi: oc-tiny: Simplify tiny_spi_txrx_bufs implementation when irq is not used
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>
This commit is contained in:
parent
6ce4eac1f6
commit
e826a7ff69
1 changed files with 11 additions and 51 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue