]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
spi: fsl-espi: determine need for byte swap only once
authorHeiner Kallweit <hkallweit1@gmail.com>
Fri, 25 Nov 2016 22:58:49 +0000 (23:58 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 30 Nov 2016 18:04:23 +0000 (18:04 +0000)
Determine need for byte swap only once and store it in new member
swab in struct fsl_espi.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-espi.c

index 4fbcc36fa89154e8bfe116c307d474fe2e77e37d..4222578a4dd4b360e581491d11a04436207128ca 100644 (file)
@@ -98,6 +98,7 @@ struct fsl_espi {
        const void *tx;
        void *rx;
 
+       bool swab;
        unsigned int rx_len;
        unsigned int tx_len;
        unsigned int rxskip;
@@ -140,14 +141,14 @@ static void fsl_espi_memcpy_swab(void *to, const void *from,
                                 struct spi_message *m,
                                 struct spi_transfer *t)
 {
+       struct fsl_espi *espi = spi_master_get_devdata(m->spi->master);
        unsigned int len = t->len;
 
-       if (!(m->spi->mode & SPI_LSB_FIRST) || t->bits_per_word <= 8) {
+       if (!espi->swab) {
                memcpy(to, from, len);
                return;
        }
 
-       /* In case of LSB-first and bits_per_word > 8 byte-swap all words */
        while (len)
                if (len >= 4) {
                        *(u32 *)to = swahb32p(from);
@@ -384,6 +385,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
        struct spi_device *spi = m->spi;
        int ret;
 
+       /* In case of LSB-first and bits_per_word > 8 byte-swap all words */
+       espi->swab = spi->mode & SPI_LSB_FIRST && trans->bits_per_word > 8;
+
        espi->rxskip = fsl_espi_check_rxskip_mode(m);
        if (trans->rx_nbits == SPI_NBITS_DUAL && !espi->rxskip) {
                dev_err(espi->dev, "Dual output mode requires RXSKIP mode!\n");