hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/spi/spi-fsl-cpm.c
....@@ -21,6 +21,7 @@
2121 #include <linux/spi/spi.h>
2222 #include <linux/types.h>
2323 #include <linux/platform_device.h>
24
+#include <linux/byteorder/generic.h>
2425
2526 #include "spi-fsl-cpm.h"
2627 #include "spi-fsl-lib.h"
....@@ -120,6 +121,21 @@
120121 mspi->rx_dma = mspi->dma_dummy_rx;
121122 mspi->map_rx_dma = 0;
122123 }
124
+ if (t->bits_per_word == 16 && t->tx_buf) {
125
+ const u16 *src = t->tx_buf;
126
+ u16 *dst;
127
+ int i;
128
+
129
+ dst = kmalloc(t->len, GFP_KERNEL);
130
+ if (!dst)
131
+ return -ENOMEM;
132
+
133
+ for (i = 0; i < t->len >> 1; i++)
134
+ dst[i] = cpu_to_le16p(src + i);
135
+
136
+ mspi->tx = dst;
137
+ mspi->map_tx_dma = 1;
138
+ }
123139
124140 if (mspi->map_tx_dma) {
125141 void *nonconst_tx = (void *)mspi->tx; /* shut up gcc */
....@@ -173,6 +189,13 @@
173189 if (mspi->map_rx_dma)
174190 dma_unmap_single(dev, mspi->rx_dma, t->len, DMA_FROM_DEVICE);
175191 mspi->xfer_in_progress = NULL;
192
+
193
+ if (t->bits_per_word == 16 && t->rx_buf) {
194
+ int i;
195
+
196
+ for (i = 0; i < t->len; i += 2)
197
+ le16_to_cpus(t->rx_buf + i);
198
+ }
176199 }
177200 EXPORT_SYMBOL_GPL(fsl_spi_cpm_bufs_complete);
178201