spi: dw: fix potential variable assignment error
authorshaftarger <sholchen@gmail.com>
Fri, 28 Dec 2018 08:33:12 +0000 (16:33 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 7 Jan 2019 18:15:54 +0000 (18:15 +0000)
spi::mode is defined by framework for several SPI capabilities,
such as polarity, phase, bit-endian, wire number. Directly use this
variable for setting controller's polarity and phase causes other
bit in register being set. Since SPI framework has its definition,
SPI_CPOL and SPI_CPHA offset may be changed by framwork change.
Instead of just mask off the relevant bits,
fetch required bit in spi::mode and set to register.

Signed-off-by: shaftarger <shol@livemail.tw>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-dw.c

index 2e822a56576acfa04afaf3c51064cdcd7d7d82c5..a945fad3db62fa4cf501ea0cfdaf5d0f4dbac433 100644 (file)
@@ -317,7 +317,8 @@ static int dw_spi_transfer_one(struct spi_controller *master,
        /* Default SPI mode is SCPOL = 0, SCPH = 0 */
        cr0 = (transfer->bits_per_word - 1)
                | (chip->type << SPI_FRF_OFFSET)
-               | (spi->mode << SPI_MODE_OFFSET)
+               | ((((spi->mode & SPI_CPOL) ? 1 : 0) << SPI_SCOL_OFFSET) |
+                       (((spi->mode & SPI_CPHA) ? 1 : 0) << SPI_SCPH_OFFSET))
                | (chip->tmode << SPI_TMOD_OFFSET);
 
        /*