OSDN Git Service

ASoC: SOF: compress: Add copy function for capture case
authorLaurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Mon, 22 Aug 2022 10:15:02 +0000 (13:15 +0300)
committerMark Brown <broonie@kernel.org>
Wed, 31 Aug 2022 11:12:59 +0000 (12:12 +0100)
Added a new copy function used to copy data to user buffer
in the case of compress capture.

Reviewed-by: Paul Olaru <paul.olaru@nxp.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Link: https://lore.kernel.org/r/20220822101502.17644-3-laurentiu.mihalcea@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/compress.c

index 2ee8109..8e1a9ba 100644 (file)
@@ -318,6 +318,27 @@ static int sof_compr_copy_playback(struct snd_compr_runtime *rtd,
        return count - ret;
 }
 
+static int sof_compr_copy_capture(struct snd_compr_runtime *rtd,
+                                 char __user *buf, size_t count)
+{
+       void *ptr;
+       unsigned int offset, n;
+       int ret;
+
+       div_u64_rem(rtd->total_bytes_transferred, rtd->buffer_size, &offset);
+       ptr = rtd->dma_area + offset;
+       n = rtd->buffer_size - offset;
+
+       if (count < n) {
+               ret = copy_to_user(buf, ptr, count);
+       } else {
+               ret = copy_to_user(buf, ptr, n);
+               ret += copy_to_user(buf + n, rtd->dma_area, count - n);
+       }
+
+       return count - ret;
+}
+
 static int sof_compr_copy(struct snd_soc_component *component,
                          struct snd_compr_stream *cstream,
                          char __user *buf, size_t count)
@@ -327,7 +348,10 @@ static int sof_compr_copy(struct snd_soc_component *component,
        if (count > rtd->buffer_size)
                count = rtd->buffer_size;
 
-       return sof_compr_copy_playback(rtd, buf, count);
+       if (cstream->direction == SND_COMPRESS_PLAYBACK)
+               return sof_compr_copy_playback(rtd, buf, count);
+       else
+               return sof_compr_copy_capture(rtd, buf, count);
 }
 
 static int sof_compr_pointer(struct snd_soc_component *component,