ASoC: Intel: sst: fix sst_memcpy32 wrong with non-4x bytes issue
authorJie Yang <yang.jie@intel.com>
Mon, 14 Dec 2015 14:27:13 +0000 (22:27 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 16 Dec 2015 12:28:04 +0000 (12:28 +0000)
sst_memcpy32() only copied bytes/4 32bits, which means it dropped
the remaining bytes%4 bytes wrongly.

Here add copying those missing bytes, first to a 32bits tmp, and
then write the tmp to 32bits iomem.

Signed-off-by: Jie Yang <yang.jie@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/common/sst-firmware.c

index bee04a9707d8955e29f877245455ea86516b89e9..ef4881e7753ab2a369874d75c3bb63824b078ef7 100644 (file)
@@ -51,8 +51,22 @@ struct sst_dma {
 
 static inline void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes)
 {
+       u32 tmp = 0;
+       int i, m, n;
+       const u8 *src_byte = src;
+
+       m = bytes / 4;
+       n = bytes % 4;
+
        /* __iowrite32_copy use 32bit size values so divide by 4 */
-       __iowrite32_copy((void *)dest, src, bytes/4);
+       __iowrite32_copy((void *)dest, src, m);
+
+       if (n) {
+               for (i = 0; i < n; i++)
+                       tmp |= (u32)*(src_byte + m * 4 + i) << (i * 8);
+               __iowrite32_copy((void *)(dest + m * 4), &tmp, 1);
+       }
+
 }
 
 static void sst_dma_transfer_complete(void *arg)