Commit a3c17402 authored by Emil Renner Berthing's avatar Emil Renner Berthing Committed by Mark Brown

spi: rockchip: simplify spi enable logic

Let the dma/non-dma code paths handle the spi enable
flag themselves. This removes some logic to determine
if the flag should be turned on before or after dma
and also don't leave the spi enabled if the dma path
fails.
Signed-off-by: default avatarEmil Renner Berthing <kernel@esmil.dk>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d9071b7e
...@@ -379,6 +379,8 @@ static int rockchip_spi_pio_transfer(struct rockchip_spi *rs) ...@@ -379,6 +379,8 @@ static int rockchip_spi_pio_transfer(struct rockchip_spi *rs)
{ {
int remain = 0; int remain = 0;
spi_enable_chip(rs, 1);
do { do {
if (rs->tx) { if (rs->tx) {
remain = rs->tx_end - rs->tx; remain = rs->tx_end - rs->tx;
...@@ -498,6 +500,8 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs) ...@@ -498,6 +500,8 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs)
dma_async_issue_pending(rs->dma_rx.ch); dma_async_issue_pending(rs->dma_rx.ch);
} }
spi_enable_chip(rs, 1);
if (txdesc) { if (txdesc) {
spin_lock_irqsave(&rs->lock, flags); spin_lock_irqsave(&rs->lock, flags);
rs->state |= TXBUSY; rs->state |= TXBUSY;
...@@ -506,7 +510,8 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs) ...@@ -506,7 +510,8 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs)
dma_async_issue_pending(rs->dma_tx.ch); dma_async_issue_pending(rs->dma_tx.ch);
} }
return 0; /* 1 means the transfer is in progress */
return 1;
} }
static void rockchip_spi_config(struct rockchip_spi *rs) static void rockchip_spi_config(struct rockchip_spi *rs)
...@@ -589,7 +594,6 @@ static int rockchip_spi_transfer_one( ...@@ -589,7 +594,6 @@ static int rockchip_spi_transfer_one(
struct spi_device *spi, struct spi_device *spi,
struct spi_transfer *xfer) struct spi_transfer *xfer)
{ {
int ret = 0;
struct rockchip_spi *rs = spi_master_get_devdata(master); struct rockchip_spi *rs = spi_master_get_devdata(master);
WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) && WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) &&
...@@ -633,24 +637,10 @@ static int rockchip_spi_transfer_one( ...@@ -633,24 +637,10 @@ static int rockchip_spi_transfer_one(
rockchip_spi_config(rs); rockchip_spi_config(rs);
if (rs->use_dma) { if (rs->use_dma)
if (rs->tmode == CR0_XFM_RO) { return rockchip_spi_prepare_dma(rs);
/* rx: dma must be prepared first */
ret = rockchip_spi_prepare_dma(rs);
spi_enable_chip(rs, 1);
} else {
/* tx or tr: spi must be enabled first */
spi_enable_chip(rs, 1);
ret = rockchip_spi_prepare_dma(rs);
}
/* successful DMA prepare means the transfer is in progress */
ret = ret ? ret : 1;
} else {
spi_enable_chip(rs, 1);
ret = rockchip_spi_pio_transfer(rs);
}
return ret; return rockchip_spi_pio_transfer(rs);
} }
static bool rockchip_spi_can_dma(struct spi_master *master, static bool rockchip_spi_can_dma(struct spi_master *master,
......
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