ASoC: SOF: Add support for compress API for stream data/offset
authorDaniel Baluta <daniel.baluta@nxp.com>
Tue, 17 Jan 2023 12:25:32 +0000 (14:25 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 17 Jan 2023 13:37:53 +0000 (13:37 +0000)
snd_sof_pcm_stream keeps information about both PCM (snd_pcm_substream)
and Compress (snd_compr_stream) streams.

When PCM substream pointer is NULL this means we are dealing with a
compress stream.

Reviewed-by: Paul Olaru <paul.olaru@nxp.com>
Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Link: https://lore.kernel.org/r/20230117122533.201708-4-daniel.baluta@oss.nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-priv.h
sound/soc/sof/stream-ipc.c

index 95a6b30..86fc5c6 100644 (file)
@@ -115,6 +115,7 @@ struct sof_compr_stream {
        u32 sampling_rate;
        u16 channels;
        u16 sample_container_bytes;
+       size_t posn_offset;
 };
 
 struct snd_sof_dev;
index 872a495..216b454 100644 (file)
@@ -33,14 +33,27 @@ int sof_ipc_msg_data(struct snd_sof_dev *sdev,
        if (!sps || !sdev->stream_box.size) {
                snd_sof_dsp_mailbox_read(sdev, sdev->dsp_box.offset, p, sz);
        } else {
-               struct snd_pcm_substream *substream = sps->substream;
-               struct sof_stream *stream = substream->runtime->private_data;
+               size_t posn_offset;
 
-               /* The stream might already be closed */
-               if (!stream)
-                       return -ESTRPIPE;
+               if (sps->substream) {
+                       struct sof_stream *stream = sps->substream->runtime->private_data;
 
-               snd_sof_dsp_mailbox_read(sdev, stream->posn_offset, p, sz);
+                       /* The stream might already be closed */
+                       if (!stream)
+                               return -ESTRPIPE;
+
+                       posn_offset = stream->posn_offset;
+               } else {
+
+                       struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;
+
+                       if (!sstream)
+                               return -ESTRPIPE;
+
+                       posn_offset = sstream->posn_offset;
+               }
+
+               snd_sof_dsp_mailbox_read(sdev, posn_offset, p, sz);
        }
 
        return 0;
@@ -51,18 +64,29 @@ int sof_set_stream_data_offset(struct snd_sof_dev *sdev,
                               struct snd_sof_pcm_stream *sps,
                               size_t posn_offset)
 {
-       struct snd_pcm_substream *substream = sps->substream;
-       struct sof_stream *stream = substream->runtime->private_data;
-
        /* check if offset is overflow or it is not aligned */
        if (posn_offset > sdev->stream_box.size ||
            posn_offset % sizeof(struct sof_ipc_stream_posn) != 0)
                return -EINVAL;
 
-       stream->posn_offset = sdev->stream_box.offset + posn_offset;
+       posn_offset += sdev->stream_box.offset;
+
+       if (sps->substream) {
+               struct sof_stream *stream = sps->substream->runtime->private_data;
+
+               stream->posn_offset = posn_offset;
+               dev_dbg(sdev->dev, "pcm: stream dir %d, posn mailbox offset is %zu",
+                       sps->substream->stream, posn_offset);
+       } else if (sps->cstream) {
+               struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;
 
-       dev_dbg(sdev->dev, "pcm: stream dir %d, posn mailbox offset is %zu",
-               substream->stream, stream->posn_offset);
+               sstream->posn_offset = posn_offset;
+               dev_dbg(sdev->dev, "compr: stream dir %d, posn mailbox offset is %zu",
+                       sps->cstream->direction, posn_offset);
+       } else {
+               dev_err(sdev->dev, "No stream opened");
+               return -EINVAL;
+       }
 
        return 0;
 }