Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e826a7ff authored by Axel Lin's avatar Axel Lin Committed by Mark Brown
Browse files

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: default avatarAxel Lin <axel.lin@ingics.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 6ce4eac1
Loading
Loading
Loading
Loading
+11 −51
Original line number Original line Diff line number Diff line
@@ -153,62 +153,22 @@ static int tiny_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
		}
		}


		wait_for_completion(&hw->done);
		wait_for_completion(&hw->done);
	} else if (txp && rxp) {
	} else {
		/* we need to tighten the transfer loop */
		/* we need to tighten the transfer loop */
		writeb(*txp++, hw->base + TINY_SPI_TXDATA);
		writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
		if (t->len > 1) {
		for (i = 1; i < t->len; i++) {
			writeb(*txp++, hw->base + TINY_SPI_TXDATA);
			writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
			for (i = 2; i < t->len; i++) {

				u8 rx, tx = *txp++;
			if (rxp || (i != t->len - 1))
				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);
				tiny_spi_wait_txr(hw);
			if (rxp)
				*rxp++ = readb(hw->base + TINY_SPI_TXDATA);
				*rxp++ = readb(hw->base + TINY_SPI_TXDATA);
		}
		}
		tiny_spi_wait_txe(hw);
		tiny_spi_wait_txe(hw);
		if (rxp)
			*rxp++ = readb(hw->base + TINY_SPI_RXDATA);
			*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++) {
				tiny_spi_wait_txr(hw);
				writeb(0, hw->base + TINY_SPI_TXDATA);
			}
		}
		tiny_spi_wait_txe(hw);
	}
	}

	return t->len;
	return t->len;
}
}