Unverified Commit 090349a9 authored by Daniel Baluta's avatar Daniel Baluta Committed by Mark Brown
Browse files

ASoC: SOF: Add support for compress API for stream data/offset



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: default avatarPaul Olaru <paul.olaru@nxp.com>
Reviewed-by: default avatarIuliana Prodan <iuliana.prodan@nxp.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: default avatarDaniel Baluta <daniel.baluta@nxp.com>
Link: https://lore.kernel.org/r/20230117122533.201708-4-daniel.baluta@oss.nxp.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 249f186d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+36 −12
Original line number Diff line number Diff line
@@ -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;

		if (sps->substream) {
			struct sof_stream *stream = sps->substream->runtime->private_data;

			/* The stream might already be closed */
			if (!stream)
				return -ESTRPIPE;

		snd_sof_dsp_mailbox_read(sdev, stream->posn_offset, p, sz);
			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",
		substream->stream, stream->posn_offset);
			sps->substream->stream, posn_offset);
	} else if (sps->cstream) {
		struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;

		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;
}