Commit e1cdee73 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Mark Brown

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: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent f254e65c
...@@ -98,6 +98,7 @@ struct fsl_espi { ...@@ -98,6 +98,7 @@ struct fsl_espi {
const void *tx; const void *tx;
void *rx; void *rx;
bool swab;
unsigned int rx_len; unsigned int rx_len;
unsigned int tx_len; unsigned int tx_len;
unsigned int rxskip; unsigned int rxskip;
...@@ -140,14 +141,14 @@ static void fsl_espi_memcpy_swab(void *to, const void *from, ...@@ -140,14 +141,14 @@ static void fsl_espi_memcpy_swab(void *to, const void *from,
struct spi_message *m, struct spi_message *m,
struct spi_transfer *t) struct spi_transfer *t)
{ {
struct fsl_espi *espi = spi_master_get_devdata(m->spi->master);
unsigned int len = t->len; unsigned int len = t->len;
if (!(m->spi->mode & SPI_LSB_FIRST) || t->bits_per_word <= 8) { if (!espi->swab) {
memcpy(to, from, len); memcpy(to, from, len);
return; return;
} }
/* In case of LSB-first and bits_per_word > 8 byte-swap all words */
while (len) while (len)
if (len >= 4) { if (len >= 4) {
*(u32 *)to = swahb32p(from); *(u32 *)to = swahb32p(from);
...@@ -384,6 +385,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans) ...@@ -384,6 +385,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
struct spi_device *spi = m->spi; struct spi_device *spi = m->spi;
int ret; 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); espi->rxskip = fsl_espi_check_rxskip_mode(m);
if (trans->rx_nbits == SPI_NBITS_DUAL && !espi->rxskip) { if (trans->rx_nbits == SPI_NBITS_DUAL && !espi->rxskip) {
dev_err(espi->dev, "Dual output mode requires RXSKIP mode!\n"); dev_err(espi->dev, "Dual output mode requires RXSKIP mode!\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment