summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeiner Kallweit <hkallweit1@gmail.com>2016-11-26 01:58:49 +0300
committerMark Brown <broonie@kernel.org>2016-11-30 21:04:23 +0300
commite1cdee73dfcac393768117511e52a6142587dacf (patch)
tree4a7ef8ca915103e80672ed95a7ef9a510e80dc64
parentf254e65ce20fda3c442ebc50ae1502281963a79b (diff)
downloadlinux-e1cdee73dfcac393768117511e52a6142587dacf.tar.xz
spi: fsl-espi: determine need for byte swap only once
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>
-rw-r--r--drivers/spi/spi-fsl-espi.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 4fbcc36fa891..4222578a4dd4 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -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");