summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gong <b38343@freescale.com>2014-12-18 12:51:28 +0800
committerRobin Gong <b38343@freescale.com>2014-12-19 10:26:19 +0800
commit819efee83b7b1f47685dca6fad6bbe17f1c42092 (patch)
tree1ce7ecd0dc6737851a26cc2ff6f444d2e2261d30
parent90c929d7d1a3f8e196641b5ed7a33d2ee03bd63c (diff)
MLK-9986-5 spi: spi-imx: decrease tx fifo wartermark level
We set both wartermark of txfifo and rxfifo 32 as half of fifo length 64. That will cause easy rxfifo overflow: If there is 31 bytes in rxfifo, rx script will wait the next dma request (the 32th data come into the rxfifo) and schedule out to tx script. Once tx script start to run, the rx script need to wait tx script finish even if its priority higher than tx. Meanwhile, spi slave device may input data continous, plus the rx data which triggered by new tx script(32 bytes). That will quickly consume whole 64 bytes fifo, so we keep 16bytes availbale even in the worst case new tx script triggered during two rx transfer. That may slow down tx slightly, but better than overflow and RX DMA timeout. Signed-off-by: Robin Gong <b38343@freescale.com> (cherry picked from commit 16043ad0ad96aa04a90614e473aa17980af4b8af)
-rw-r--r--drivers/spi/spi-imx.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 203bb6a5f389..57ca70682f13 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -375,7 +375,7 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
if (spi_imx->dma_is_inited) {
dma = readl(spi_imx->base + MX51_ECSPI_DMA);
- spi_imx->tx_wml = spi_imx_get_fifosize(spi_imx) / 2;
+ spi_imx->tx_wml = spi_imx_get_fifosize(spi_imx) / 4;
spi_imx->rx_wml = spi_imx_get_fifosize(spi_imx) / 2;
spi_imx->rxt_wml = spi_imx_get_fifosize(spi_imx) / 2;
rx_wml_cfg = spi_imx->rx_wml << MX51_ECSPI_DMA_RX_WML_OFFSET;
@@ -838,7 +838,7 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
slave_config.direction = DMA_MEM_TO_DEV;
slave_config.dst_addr = res->start + MXC_CSPITXDATA;
slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
- slave_config.dst_maxburst = spi_imx_get_fifosize(spi_imx) / 2;
+ slave_config.dst_maxburst = spi_imx_get_fifosize(spi_imx) / 4;
ret = dmaengine_slave_config(master->dma_tx, &slave_config);
if (ret) {
dev_err(dev, "error in TX dma configuration.\n");