summaryrefslogtreecommitdiff
path: root/sound/soc/intel/common/sst-firmware.c
diff options
context:
space:
mode:
authorJie Yang <yang.jie@intel.com>2015-12-14 22:27:13 +0800
committerMark Brown <broonie@kernel.org>2015-12-16 12:28:04 +0000
commit1cf8dfd90fe50ac660f79d4b94f47b8e721a1178 (patch)
tree9370c8ac301d5ee9a469b8099d1198b5e8b42208 /sound/soc/intel/common/sst-firmware.c
parentaf1086ba051aa33c559350a5fdb533acfe98a80c (diff)
ASoC: Intel: sst: fix sst_memcpy32 wrong with non-4x bytes issue
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>
Diffstat (limited to 'sound/soc/intel/common/sst-firmware.c')
-rw-r--r--sound/soc/intel/common/sst-firmware.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index bee04a9707d8..ef4881e7753a 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -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)