Skip to content

Commit 627d05a

Browse files
Srinivas Goudbroonie
authored andcommitted
spi: spi-cadence: Fix data corruption issues in slave mode
Remove 10us delay in cdns_spi_process_fifo() (called from cdns_spi_irq()) to fix data corruption issue on Master side when this driver configured in Slave mode, as Slave is failed to prepare the date on time due to above delay. Add 10us delay before processing the RX FIFO as TX empty doesn't guarantee valid data in RX FIFO. Signed-off-by: Srinivas Goud <srinivas.goud@amd.com> Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com> Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/1692610216-217644-1-git-send-email-srinivas.goud@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 715dc9a commit 627d05a

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

drivers/spi/spi-cadence.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -317,12 +317,6 @@ static void cdns_spi_process_fifo(struct cdns_spi *xspi, int ntx, int nrx)
317317
xspi->rx_bytes -= nrx;
318318

319319
while (ntx || nrx) {
320-
/* When xspi in busy condition, bytes may send failed,
321-
* then spi control did't work thoroughly, add one byte delay
322-
*/
323-
if (cdns_spi_read(xspi, CDNS_SPI_ISR) & CDNS_SPI_IXR_TXFULL)
324-
udelay(10);
325-
326320
if (ntx) {
327321
if (xspi->txbuf)
328322
cdns_spi_write(xspi, CDNS_SPI_TXD, *xspi->txbuf++);
@@ -392,6 +386,11 @@ static irqreturn_t cdns_spi_irq(int irq, void *dev_id)
392386
if (xspi->tx_bytes) {
393387
cdns_spi_process_fifo(xspi, trans_cnt, trans_cnt);
394388
} else {
389+
/* Fixed delay due to controller limitation with
390+
* RX_NEMPTY incorrect status
391+
* Xilinx AR:65885 contains more details
392+
*/
393+
udelay(10);
395394
cdns_spi_process_fifo(xspi, 0, trans_cnt);
396395
cdns_spi_write(xspi, CDNS_SPI_IDR,
397396
CDNS_SPI_IXR_DEFAULT);
@@ -439,12 +438,18 @@ static int cdns_transfer_one(struct spi_controller *ctlr,
439438
cdns_spi_setup_transfer(spi, transfer);
440439
} else {
441440
/* Set TX empty threshold to half of FIFO depth
442-
* only if TX bytes are more than half FIFO depth.
441+
* only if TX bytes are more than FIFO depth.
443442
*/
444443
if (xspi->tx_bytes > xspi->tx_fifo_depth)
445444
cdns_spi_write(xspi, CDNS_SPI_THLD, xspi->tx_fifo_depth >> 1);
446445
}
447446

447+
/* When xspi in busy condition, bytes may send failed,
448+
* then spi control didn't work thoroughly, add one byte delay
449+
*/
450+
if (cdns_spi_read(xspi, CDNS_SPI_ISR) & CDNS_SPI_IXR_TXFULL)
451+
udelay(10);
452+
448453
cdns_spi_process_fifo(xspi, xspi->tx_fifo_depth, 0);
449454
spi_transfer_delay_exec(transfer);
450455

0 commit comments

Comments
 (0)