|
@@ -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;
|
|
|
spi_finalize_current_transfer(dws->master);
|
|
spi_finalize_current_transfer(dws->master);
|
|
|
}
|
|
}
|
|
@@ -139,6 +140,9 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_tx(struct dw_spi *dws)
|
|
|
1,
|
|
1,
|
|
|
DMA_MEM_TO_DEV,
|
|
DMA_MEM_TO_DEV,
|
|
|
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
|
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
|
|
|
|
+ if (!txdesc)
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+
|
|
|
txdesc->callback = dw_spi_dma_tx_done;
|
|
txdesc->callback = dw_spi_dma_tx_done;
|
|
|
txdesc->callback_param = dws;
|
|
txdesc->callback_param = dws;
|
|
|
|
|
|
|
@@ -153,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;
|
|
|
spi_finalize_current_transfer(dws->master);
|
|
spi_finalize_current_transfer(dws->master);
|
|
|
}
|
|
}
|
|
@@ -184,6 +189,9 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_rx(struct dw_spi *dws)
|
|
|
1,
|
|
1,
|
|
|
DMA_DEV_TO_MEM,
|
|
DMA_DEV_TO_MEM,
|
|
|
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
|
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
|
|
|
|
+ if (!rxdesc)
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+
|
|
|
rxdesc->callback = dw_spi_dma_rx_done;
|
|
rxdesc->callback = dw_spi_dma_rx_done;
|
|
|
rxdesc->callback_param = dws;
|
|
rxdesc->callback_param = dws;
|
|
|
|
|
|