]> git.itanic.dy.fi Git - linux-stable/commitdiff
spi: mediatek: fix fifo rx mode
authorPeter Hess <peter.hess@ph-home.de>
Tue, 6 Jul 2021 12:16:09 +0000 (14:16 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Jul 2021 11:30:55 +0000 (13:30 +0200)
[ 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

index 8acf24f7c5d406b3e5ab0b7cb1e407741bfda6a4..81eac9fbd08cb0e09c5e257b015fb956609a9ddf 100644 (file)
@@ -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(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
-               writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+               if (xfer->tx_buf) {
+                       memcpy(&reg_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), &reg_val, remainder);
+               }
        }
 
        mtk_spi_enable_transfer(master);