Commit 8e55ea19 authored by Olivier Moysan's avatar Olivier Moysan Committed by Mark Brown

ASoC: stm32: dfsdm: fix 16 bits record

In stm32_afsdm_pcm_cb function, the transfer size is provided in bytes.
However, samples are copied as 16 bits words from iio buffer.
Divide by two the transfer size, to copy the right number of samples.

Fixes: 1e7f6e1c ("ASoC: stm32: dfsdm: add 16 bits audio record support")
Signed-off-by: default avatarOlivier Moysan <olivier.moysan@st.com>
Link: https://lore.kernel.org/r/20200110131131.3191-1-olivier.moysan@st.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent a14bf98c
...@@ -153,13 +153,13 @@ static const struct snd_soc_component_driver stm32_adfsdm_dai_component = { ...@@ -153,13 +153,13 @@ static const struct snd_soc_component_driver stm32_adfsdm_dai_component = {
.name = "stm32_dfsdm_audio", .name = "stm32_dfsdm_audio",
}; };
static void memcpy_32to16(void *dest, const void *src, size_t n) static void stm32_memcpy_32to16(void *dest, const void *src, size_t n)
{ {
unsigned int i = 0; unsigned int i = 0;
u16 *d = (u16 *)dest, *s = (u16 *)src; u16 *d = (u16 *)dest, *s = (u16 *)src;
s++; s++;
for (i = n; i > 0; i--) { for (i = n >> 1; i > 0; i--) {
*d++ = *s++; *d++ = *s++;
s++; s++;
} }
...@@ -186,7 +186,7 @@ static int stm32_afsdm_pcm_cb(const void *data, size_t size, void *private) ...@@ -186,7 +186,7 @@ static int stm32_afsdm_pcm_cb(const void *data, size_t size, void *private)
if ((priv->pos + src_size) > buff_size) { if ((priv->pos + src_size) > buff_size) {
if (format == SNDRV_PCM_FORMAT_S16_LE) if (format == SNDRV_PCM_FORMAT_S16_LE)
memcpy_32to16(&pcm_buff[priv->pos], src_buff, stm32_memcpy_32to16(&pcm_buff[priv->pos], src_buff,
buff_size - priv->pos); buff_size - priv->pos);
else else
memcpy(&pcm_buff[priv->pos], src_buff, memcpy(&pcm_buff[priv->pos], src_buff,
...@@ -196,7 +196,7 @@ static int stm32_afsdm_pcm_cb(const void *data, size_t size, void *private) ...@@ -196,7 +196,7 @@ static int stm32_afsdm_pcm_cb(const void *data, size_t size, void *private)
} }
if (format == SNDRV_PCM_FORMAT_S16_LE) if (format == SNDRV_PCM_FORMAT_S16_LE)
memcpy_32to16(&pcm_buff[priv->pos], stm32_memcpy_32to16(&pcm_buff[priv->pos],
&src_buff[src_size - cur_size], cur_size); &src_buff[src_size - cur_size], cur_size);
else else
memcpy(&pcm_buff[priv->pos], &src_buff[src_size - cur_size], memcpy(&pcm_buff[priv->pos], &src_buff[src_size - cur_size],
......
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