mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
spi: mxic: Fix the transmit path
commit5fd6739e0dupstream. By working with external hardware ECC engines, we figured out that Under certain circumstances, it is needed for the SPI controller to check INT_TX_EMPTY and INT_RX_NOT_EMPTY in both receive and transmit path (not only in the receive path). The delay penalty being negligible, move this code in the common path. Fixes:b942d80b0a("spi: Add MXIC controller driver") Cc: stable@vger.kernel.org Suggested-by: Mason Yang <masonccyang@mxic.com.tw> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Reviewed-by: Zhengxun Li <zhengxunli@mxic.com.tw> Reviewed-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/linux-mtd/20220127091808.1043392-10-miquel.raynal@bootlin.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
be22ebe79e
commit
145a63201d
|
|
@ -304,25 +304,21 @@ static int mxic_spi_data_xfer(struct mxic_spi *mxic, const void *txbuf,
|
||||||
|
|
||||||
writel(data, mxic->regs + TXD(nbytes % 4));
|
writel(data, mxic->regs + TXD(nbytes % 4));
|
||||||
|
|
||||||
|
ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
|
||||||
|
sts & INT_TX_EMPTY, 0, USEC_PER_SEC);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
|
||||||
|
sts & INT_RX_NOT_EMPTY, 0,
|
||||||
|
USEC_PER_SEC);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
data = readl(mxic->regs + RXD);
|
||||||
if (rxbuf) {
|
if (rxbuf) {
|
||||||
ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
|
|
||||||
sts & INT_TX_EMPTY, 0,
|
|
||||||
USEC_PER_SEC);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = readl_poll_timeout(mxic->regs + INT_STS, sts,
|
|
||||||
sts & INT_RX_NOT_EMPTY, 0,
|
|
||||||
USEC_PER_SEC);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
data = readl(mxic->regs + RXD);
|
|
||||||
data >>= (8 * (4 - nbytes));
|
data >>= (8 * (4 - nbytes));
|
||||||
memcpy(rxbuf + pos, &data, nbytes);
|
memcpy(rxbuf + pos, &data, nbytes);
|
||||||
WARN_ON(readl(mxic->regs + INT_STS) & INT_RX_NOT_EMPTY);
|
|
||||||
} else {
|
|
||||||
readl(mxic->regs + RXD);
|
|
||||||
}
|
}
|
||||||
WARN_ON(readl(mxic->regs + INT_STS) & INT_RX_NOT_EMPTY);
|
WARN_ON(readl(mxic->regs + INT_STS) & INT_RX_NOT_EMPTY);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user