soundwire: intel: add intel_free_stream() back
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Wed, 27 Mar 2024 05:52:15 +0000 (05:52 +0000)
committerVinod Koul <vkoul@kernel.org>
Thu, 28 Mar 2024 18:14:58 +0000 (23:44 +0530)
Add the intel_free_stream() callback to deal with the change in IPC that
requires additional steps to be done to clear the gateway node_id.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20240327055215.1097559-1-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/intel.c

index 1287a325c4359ce35a8ba899faa7692a7d118de2..83926817507918c30816eac06432c931accfc43f 100644 (file)
@@ -668,6 +668,24 @@ static int intel_params_stream(struct sdw_intel *sdw,
  * DAI routines
  */
 
+static int intel_free_stream(struct sdw_intel *sdw,
+                            struct snd_pcm_substream *substream,
+                            struct snd_soc_dai *dai,
+                            int link_id)
+{
+       struct sdw_intel_link_res *res = sdw->link_res;
+       struct sdw_intel_stream_free_data free_data;
+
+       free_data.substream = substream;
+       free_data.dai = dai;
+       free_data.link_id = link_id;
+
+       if (res->ops && res->ops->free_stream && res->dev)
+               return res->ops->free_stream(res->dev, &free_data);
+
+       return 0;
+}
+
 static int intel_hw_params(struct snd_pcm_substream *substream,
                           struct snd_pcm_hw_params *params,
                           struct snd_soc_dai *dai)
@@ -799,6 +817,7 @@ static int
 intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
 {
        struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+       struct sdw_intel *sdw = cdns_to_intel(cdns);
        struct sdw_cdns_dai_runtime *dai_runtime;
        int ret;
 
@@ -819,6 +838,12 @@ intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
                return ret;
        }
 
+       ret = intel_free_stream(sdw, substream, dai, sdw->instance);
+       if (ret < 0) {
+               dev_err(dai->dev, "intel_free_stream: failed %d\n", ret);
+               return ret;
+       }
+
        dai_runtime->pdi = NULL;
 
        return 0;