* [U-Boot] [PATCH] MX28: SPI: Limit the DMA transfer length
@ 2012-08-21 9:06 Marek Vasut
2012-08-21 12:04 ` Marek Vasut
0 siblings, 1 reply; 2+ messages in thread
From: Marek Vasut @ 2012-08-21 9:06 UTC (permalink / raw)
To: u-boot
The upper limit for DMA transfer length on MX28 is 0x4000 bytes,
otherwise the DMA refuses to operate.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: Otavio Salvador <otavio@ossystems.com.br>
Cc: Stefano Babic <sbabic@denx.de>
---
drivers/spi/mxs_spi.c | 31 ++++++++++++++++++++++---------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/drivers/spi/mxs_spi.c b/drivers/spi/mxs_spi.c
index a037c13..fb6a167 100644
--- a/drivers/spi/mxs_spi.c
+++ b/drivers/spi/mxs_spi.c
@@ -287,9 +287,9 @@ static int mxs_spi_xfer_dma(struct mxs_spi_slave *slave,
int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
const void *dout, void *din, unsigned long flags)
{
- struct mxs_spi_slave *mxs_slave = to_mxs_slave(slave);
- struct mxs_ssp_regs *ssp_regs = mxs_slave->regs;
- int len = bitlen / 8;
+ struct mxs_spi_slave *sslave = to_mxs_slave(slave);
+ struct mxs_ssp_regs *regs = sslave->regs;
+ int len = bitlen / 8, tl, ret;
char dummy;
int write = 0;
char *data = NULL;
@@ -335,11 +335,24 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
dma = 0;
}
- if (!dma || (len < MXSSSP_SMALL_TRANSFER)) {
- writel(SSP_CTRL1_DMA_ENABLE, &ssp_regs->hw_ssp_ctrl1_clr);
- return mxs_spi_xfer_pio(mxs_slave, data, len, write, flags);
- } else {
- writel(SSP_CTRL1_DMA_ENABLE, &ssp_regs->hw_ssp_ctrl1_set);
- return mxs_spi_xfer_dma(mxs_slave, data, len, write, flags);
+ while (len) {
+ if (!dma || (len < MXSSSP_SMALL_TRANSFER)) {
+ tl = len;
+ writel(SSP_CTRL1_DMA_ENABLE, ®s->hw_ssp_ctrl1_clr);
+ ret = mxs_spi_xfer_pio(sslave, data, tl, write, flags);
+ } else {
+ /* 0x4000 bytes is the limit for DMA burst. */
+ tl = min(len, 0x4000);
+ writel(SSP_CTRL1_DMA_ENABLE, ®s->hw_ssp_ctrl1_set);
+ ret = mxs_spi_xfer_dma(sslave, data, tl, write, flags);
+ }
+
+ if (ret)
+ return ret;
+
+ data += tl;
+ len -= tl;
}
+
+ return ret;
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-08-21 12:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-21 9:06 [U-Boot] [PATCH] MX28: SPI: Limit the DMA transfer length Marek Vasut
2012-08-21 12:04 ` Marek Vasut
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox