ASoC: SOF: Introduce optional callback to configure stream data offset
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Thu, 10 Mar 2022 04:27:14 +0000 (20:27 -0800)
committerMark Brown <broonie@kernel.org>
Fri, 11 Mar 2022 13:41:03 +0000 (13:41 +0000)
Each running audio stream's data have distinct start offset within the
stream mailbox area from/to where the host can read/write.

Instead of using the struct sof_ipc_pcm_params_reply to configure this
offset, add an optional callback which is IPC agnostic.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20220310042720.976809-5-ranjani.sridharan@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ops.h
sound/soc/sof/pcm.c
sound/soc/sof/sof-priv.h

index 98fa91f..f21d4a7 100644 (file)
@@ -476,6 +476,19 @@ snd_sof_ipc_pcm_params(struct snd_sof_dev *sdev,
        return sof_ops(sdev)->ipc_pcm_params(sdev, substream, reply);
 }
 
+/* host side configuration of the stream's data offset in stream mailbox area */
+static inline int
+snd_sof_set_stream_data_offset(struct snd_sof_dev *sdev,
+                              struct snd_pcm_substream *substream,
+                              size_t posn_offset)
+{
+       if (sof_ops(sdev) && sof_ops(sdev)->set_stream_data_offset)
+               return sof_ops(sdev)->set_stream_data_offset(sdev, substream,
+                                                            posn_offset);
+
+       return 0;
+}
+
 /* host stream pointer */
 static inline snd_pcm_uframes_t
 snd_sof_pcm_platform_pointer(struct snd_sof_dev *sdev,
index 20459d4..150f9ac 100644 (file)
@@ -276,6 +276,14 @@ static int sof_pcm_hw_params(struct snd_soc_component *component,
                return ret;
        }
 
+       ret = snd_sof_set_stream_data_offset(sdev, substream,
+                                            ipc_params_reply.posn_offset);
+       if (ret < 0) {
+               dev_err(component->dev, "%s: invalid stream data offset for PCM %d\n",
+                       __func__, spcm->pcm.pcm_id);
+               return ret;
+       }
+
        spcm->prepared[substream->stream] = true;
 
        /* save pcm hw_params */
index f87c454..08eba51 100644 (file)
@@ -226,6 +226,11 @@ struct snd_sof_dsp_ops {
                              struct snd_pcm_substream *substream,
                              const struct sof_ipc_pcm_params_reply *reply); /* mandatory */
 
+       /* host side configuration of the stream's data offset in stream mailbox area */
+       int (*set_stream_data_offset)(struct snd_sof_dev *sdev,
+                                     struct snd_pcm_substream *substream,
+                                     size_t posn_offset); /* optional */
+
        /* pre/post firmware run */
        int (*pre_fw_run)(struct snd_sof_dev *sof_dev); /* optional */
        int (*post_fw_run)(struct snd_sof_dev *sof_dev); /* optional */