ASoC: Intel: add get_codec_dai_by_name helper function
authorBard Liao <yung-chuan.liao@linux.intel.com>
Thu, 8 Feb 2024 16:55:31 +0000 (10:55 -0600)
committerMark Brown <broonie@kernel.org>
Thu, 8 Feb 2024 21:23:09 +0000 (21:23 +0000)
Currently, we assume the codecs in a dai link are all the same.
So that we get codec dai with snd_soc_rtd_to_codec(rtd, 0) in dai_links
->init callback. However, a link can include different codecs.
For example, a 4 speakers link can consist of rt712 and rt1316.
Therefore, we need to select the codec dai by name in the dai link.

Reviewed-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20240208165545.93811-11-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_board_helpers.c
sound/soc/intel/boards/sof_board_helpers.h

index 25f9ff12618c12e14a0454b04e5aee585c2f18f5..9c08d3e54e3bf3b372e51a714705c0969ececa0a 100644 (file)
@@ -584,6 +584,24 @@ int sof_intel_board_set_dai_link(struct device *dev, struct snd_soc_card *card,
 }
 EXPORT_SYMBOL_NS(sof_intel_board_set_dai_link, SND_SOC_INTEL_SOF_BOARD_HELPERS);
 
+struct snd_soc_dai *get_codec_dai_by_name(struct snd_soc_pcm_runtime *rtd,
+                                         const char *dai_name[], int num_dais)
+{
+       struct snd_soc_dai *dai;
+       int index;
+       int i;
+
+       for (index = 0; index < num_dais; index++)
+               for_each_rtd_codec_dais(rtd, i, dai)
+                       if (strstr(dai->name, dai_name[index])) {
+                               dev_dbg(rtd->card->dev, "get dai %s\n", dai->name);
+                               return dai;
+                       }
+
+       return NULL;
+}
+EXPORT_SYMBOL_NS(get_codec_dai_by_name, SND_SOC_INTEL_SOF_BOARD_HELPERS);
+
 MODULE_DESCRIPTION("ASoC Intel SOF Machine Driver Board Helpers");
 MODULE_AUTHOR("Brent Lu <brent.lu@intel.com>");
 MODULE_LICENSE("GPL");
index c5d6e7bec5d4cf7de57fe7d756999c65f1b80a49..b626198f685df0b34176504aec74519d4e9cac62 100644 (file)
@@ -118,4 +118,7 @@ int sof_intel_board_set_hdmi_in_link(struct device *dev,
                                     struct snd_soc_dai_link *link, int be_id,
                                     int ssp_hdmi);
 
+struct snd_soc_dai *get_codec_dai_by_name(struct snd_soc_pcm_runtime *rtd,
+                                         const char *dai_name[], int num_dais);
+
 #endif /* __SOF_INTEL_BOARD_HELPERS_H */