Commit 854d2f24 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Mark Brown

spi: dw-mid: clear BUSY flag fist and test other one

The logic of DMA completion is broken now since test_and_clear_bit() never
returns the other bit is set. It means condition are always false and we have
spi_finalize_current_transfer() called per each DMA completion which is wrong.

The patch fixes logic by clearing BUSY bit first and then check for the other
one.

Fixes: 30c8eb52 (spi: dw-mid: split rx and tx callbacks when DMA)
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
parent c9dafb27
...@@ -108,7 +108,8 @@ static void dw_spi_dma_tx_done(void *arg) ...@@ -108,7 +108,8 @@ static void dw_spi_dma_tx_done(void *arg)
{ {
struct dw_spi *dws = arg; struct dw_spi *dws = arg;
if (test_and_clear_bit(TX_BUSY, &dws->dma_chan_busy) & BIT(RX_BUSY)) clear_bit(TX_BUSY, &dws->dma_chan_busy);
if (test_bit(RX_BUSY, &dws->dma_chan_busy))
return; return;
dw_spi_xfer_done(dws); dw_spi_xfer_done(dws);
} }
...@@ -156,7 +157,8 @@ static void dw_spi_dma_rx_done(void *arg) ...@@ -156,7 +157,8 @@ static void dw_spi_dma_rx_done(void *arg)
{ {
struct dw_spi *dws = arg; struct dw_spi *dws = arg;
if (test_and_clear_bit(RX_BUSY, &dws->dma_chan_busy) & BIT(TX_BUSY)) clear_bit(RX_BUSY, &dws->dma_chan_busy);
if (test_bit(TX_BUSY, &dws->dma_chan_busy))
return; return;
dw_spi_xfer_done(dws); dw_spi_xfer_done(dws);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment