ASoC: SOF: add get_stream_position ops for pcm delay
authorRander Wang <rander.wang@intel.com>
Thu, 2 Feb 2023 13:29:52 +0000 (15:29 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 3 Feb 2023 12:03:53 +0000 (12:03 +0000)
PCM delay depends on stream position based on hardware
counter to calculate stream delay so add this ops to get
stream position according to hardware counter.

Signed-off-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230202132954.26773-8-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ops.h
sound/soc/sof/sof-priv.h

index febe318..03752c8 100644 (file)
@@ -511,6 +511,16 @@ static inline int snd_sof_pcm_platform_ack(struct snd_sof_dev *sdev,
        return 0;
 }
 
+static inline u64 snd_sof_pcm_get_stream_position(struct snd_sof_dev *sdev,
+                                                 struct snd_soc_component *component,
+                                                 struct snd_pcm_substream *substream)
+{
+       if (sof_ops(sdev) && sof_ops(sdev)->get_stream_position)
+               return sof_ops(sdev)->get_stream_position(sdev, component, substream);
+
+       return 0;
+}
+
 /* machine driver */
 static inline int
 snd_sof_machine_register(struct snd_sof_dev *sdev, void *pdata)
index fd1c3b1..14f7adb 100644 (file)
@@ -248,6 +248,15 @@ struct snd_sof_dsp_ops {
        /* pcm ack */
        int (*pcm_ack)(struct snd_sof_dev *sdev, struct snd_pcm_substream *substream); /* optional */
 
+       /*
+        * optional callback to retrieve the link DMA position for the substream
+        * when the position is not reported in the shared SRAM windows but
+        * instead from a host-accessible hardware counter.
+        */
+       u64 (*get_stream_position)(struct snd_sof_dev *sdev,
+                                  struct snd_soc_component *component,
+                                  struct snd_pcm_substream *substream); /* optional */
+
        /* host read DSP stream data */
        int (*ipc_msg_data)(struct snd_sof_dev *sdev,
                            struct snd_sof_pcm_stream *sps,