Skip to content

Commit

Permalink
spi/rockchip: fix bug that cause the failure to read data in DMA mode
Browse files Browse the repository at this point in the history
In my test on RK3288-pinky board, if spi is enabled, it will begin to
read data from slave regardless of whether the DMA is ready. So we
need prepare DMA before spi is enable.

Signed-off-by: Addy Ke <addy.ke@rock-chips.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
  • Loading branch information
Addy Ke authored and Mark Brown committed Sep 25, 2014
1 parent 7d1311b commit a24e70c
Showing 1 changed file with 7 additions and 8 deletions.
15 changes: 7 additions & 8 deletions drivers/spi/spi-rockchip.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ static void rockchip_spi_dma_txcb(void *data)
spin_unlock_irqrestore(&rs->lock, flags);
}

static int rockchip_spi_dma_transfer(struct rockchip_spi *rs)
static void rockchip_spi_prepare_dma(struct rockchip_spi *rs)
{
unsigned long flags;
struct dma_slave_config rxconf, txconf;
Expand Down Expand Up @@ -474,8 +474,6 @@ static int rockchip_spi_dma_transfer(struct rockchip_spi *rs)
dmaengine_submit(txdesc);
dma_async_issue_pending(rs->dma_tx.ch);
}

return 1;
}

static void rockchip_spi_config(struct rockchip_spi *rs)
Expand Down Expand Up @@ -556,16 +554,17 @@ static int rockchip_spi_transfer_one(
else if (rs->rx)
rs->tmode = CR0_XFM_RO;

if (master->can_dma && master->can_dma(master, spi, xfer))
/* we need prepare dma before spi was enabled */
if (master->can_dma && master->can_dma(master, spi, xfer)) {
rs->use_dma = 1;
else
rockchip_spi_prepare_dma(rs);
} else {
rs->use_dma = 0;
}

rockchip_spi_config(rs);

if (rs->use_dma)
ret = rockchip_spi_dma_transfer(rs);
else
if (!rs->use_dma)
ret = rockchip_spi_pio_transfer(rs);

return ret;
Expand Down

0 comments on commit a24e70c

Please sign in to comment.