| From 5696fa7e864fe6011c3398d05225a5d55b50eb08 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 6 Jul 2021 14:16:09 +0200 |
| Subject: spi: mediatek: fix fifo rx mode |
| |
| From: Peter Hess <peter.hess@ph-home.de> |
| |
| [ Upstream commit 3a70dd2d050331ee4cf5ad9d5c0a32d83ead9a43 ] |
| |
| In FIFO mode were two problems: |
| - RX mode was never handled and |
| - in this case the tx_buf pointer was NULL and caused an exception |
| |
| fix this by handling RX mode in mtk_spi_fifo_transfer |
| |
| Fixes: a568231f4632 ("spi: mediatek: Add spi bus for Mediatek MT8173") |
| Signed-off-by: Peter Hess <peter.hess@ph-home.de> |
| Signed-off-by: Frank Wunderlich <frank-w@public-files.de> |
| Link: https://lore.kernel.org/r/20210706121609.680534-1-linux@fw-web.de |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/spi/spi-mt65xx.c | 16 +++++++++++++--- |
| 1 file changed, 13 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c |
| index 976f73b9e299..8d5fa7f1e506 100644 |
| --- a/drivers/spi/spi-mt65xx.c |
| +++ b/drivers/spi/spi-mt65xx.c |
| @@ -427,13 +427,23 @@ static int mtk_spi_fifo_transfer(struct spi_master *master, |
| mtk_spi_setup_packet(master); |
| |
| cnt = xfer->len / 4; |
| - iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt); |
| + if (xfer->tx_buf) |
| + iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt); |
| + |
| + if (xfer->rx_buf) |
| + ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt); |
| |
| remainder = xfer->len % 4; |
| if (remainder > 0) { |
| reg_val = 0; |
| - memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder); |
| - writel(reg_val, mdata->base + SPI_TX_DATA_REG); |
| + if (xfer->tx_buf) { |
| + memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder); |
| + writel(reg_val, mdata->base + SPI_TX_DATA_REG); |
| + } |
| + if (xfer->rx_buf) { |
| + reg_val = readl(mdata->base + SPI_RX_DATA_REG); |
| + memcpy(xfer->rx_buf + (cnt * 4), ®_val, remainder); |
| + } |
| } |
| |
| mtk_spi_enable_transfer(master); |
| -- |
| 2.30.2 |
| |