diff options
Diffstat (limited to 'drivers/spi/spi-fsl-cpm.c')
| -rw-r--r-- | drivers/spi/spi-fsl-cpm.c | 23 | 
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/spi/spi-fsl-cpm.c b/drivers/spi/spi-fsl-cpm.c index 17a44d4f5021..38452089e8f3 100644 --- a/drivers/spi/spi-fsl-cpm.c +++ b/drivers/spi/spi-fsl-cpm.c @@ -21,6 +21,7 @@  #include <linux/spi/spi.h>  #include <linux/types.h>  #include <linux/platform_device.h> +#include <linux/byteorder/generic.h>  #include "spi-fsl-cpm.h"  #include "spi-fsl-lib.h" @@ -120,6 +121,21 @@ int fsl_spi_cpm_bufs(struct mpc8xxx_spi *mspi,  		mspi->rx_dma = mspi->dma_dummy_rx;  		mspi->map_rx_dma = 0;  	} +	if (t->bits_per_word == 16 && t->tx_buf) { +		const u16 *src = t->tx_buf; +		u16 *dst; +		int i; + +		dst = kmalloc(t->len, GFP_KERNEL); +		if (!dst) +			return -ENOMEM; + +		for (i = 0; i < t->len >> 1; i++) +			dst[i] = cpu_to_le16p(src + i); + +		mspi->tx = dst; +		mspi->map_tx_dma = 1; +	}  	if (mspi->map_tx_dma) {  		void *nonconst_tx = (void *)mspi->tx; /* shut up gcc */ @@ -173,6 +189,13 @@ void fsl_spi_cpm_bufs_complete(struct mpc8xxx_spi *mspi)  	if (mspi->map_rx_dma)  		dma_unmap_single(dev, mspi->rx_dma, t->len, DMA_FROM_DEVICE);  	mspi->xfer_in_progress = NULL; + +	if (t->bits_per_word == 16 && t->rx_buf) { +		int i; + +		for (i = 0; i < t->len; i += 2) +			le16_to_cpus(t->rx_buf + i); +	}  }  EXPORT_SYMBOL_GPL(fsl_spi_cpm_bufs_complete);  |