spi: npcm-pspi: fix 16 bit send and receive support
authorTomer Maimon <tmaimon77@gmail.com>
Wed, 15 Jan 2020 16:22:58 +0000 (18:22 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 17 Jan 2020 15:35:51 +0000 (15:35 +0000)
Fixing NPCM BMC Peripheral SPI controller 16 bit
send and receive support by writing and reading
the SPI data in the right order.

Signed-off-by: Tomer Maimon <tmaimon77@gmail.com>
Link: https://lore.kernel.org/r/20200115162301.235926-2-tmaimon77@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-npcm-pspi.c

index fe62473..c74611a 100644 (file)
@@ -195,6 +195,7 @@ static void npcm_pspi_setup_transfer(struct spi_device *spi,
 static void npcm_pspi_send(struct npcm_pspi *priv)
 {
        int wsize;
+       u16 val;
 
        wsize = min(bytes_per_word(priv->bits_per_word), priv->tx_bytes);
        priv->tx_bytes -= wsize;
@@ -204,17 +205,18 @@ static void npcm_pspi_send(struct npcm_pspi *priv)
 
        switch (wsize) {
        case 1:
-               iowrite8(*priv->tx_buf, NPCM_PSPI_DATA + priv->base);
+               val = *priv->tx_buf++;
+               iowrite8(val, NPCM_PSPI_DATA + priv->base);
                break;
        case 2:
-               iowrite16(*priv->tx_buf, NPCM_PSPI_DATA + priv->base);
+               val = *priv->tx_buf++;
+               val = *priv->tx_buf++ | (val << 8);
+               iowrite16(val, NPCM_PSPI_DATA + priv->base);
                break;
        default:
                WARN_ON_ONCE(1);
                return;
        }
-
-       priv->tx_buf += wsize;
 }
 
 static void npcm_pspi_recv(struct npcm_pspi *priv)
@@ -230,18 +232,17 @@ static void npcm_pspi_recv(struct npcm_pspi *priv)
 
        switch (rsize) {
        case 1:
-               val = ioread8(priv->base + NPCM_PSPI_DATA);
+               *priv->rx_buf++ = ioread8(priv->base + NPCM_PSPI_DATA);
                break;
        case 2:
                val = ioread16(priv->base + NPCM_PSPI_DATA);
+               *priv->rx_buf++ = (val >> 8);
+               *priv->rx_buf++ = val & 0xff;
                break;
        default:
                WARN_ON_ONCE(1);
                return;
        }
-
-       *priv->rx_buf = val;
-       priv->rx_buf += rsize;
 }
 
 static int npcm_pspi_transfer_one(struct spi_master *master,