From 302962a4f198cd54bb7b81f81d1d28b629376c15 Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Wed, 8 Apr 2020 17:58:36 -0700 Subject: [PATCH] ASoC: lahaina: check if codec is enabled Add support to check if a codec is enabled/disabled in device tree. Some codecs can be disabled on some platforms while being enabled on others, so before registering with sound card check if a codec is enabled. Change-Id: Idcd0989de9fa70a2fd21c7fd2abc9e9efa02480d Signed-off-by: Vignesh Kulothungan --- asoc/lahaina.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/asoc/lahaina.c b/asoc/lahaina.c index a15edfc45296..7c7f69bda9f6 100644 --- a/asoc/lahaina.c +++ b/asoc/lahaina.c @@ -6698,7 +6698,9 @@ static int msm_populate_dai_link_component_of_node( int i, j, index, ret = 0; struct device *cdev = card->dev; struct snd_soc_dai_link *dai_link = card->dai_link; - struct device_node *np; + struct device_node *np = NULL; + int codecs_enabled = 0; + struct snd_soc_dai_link_component *codecs_comp = NULL; if (!cdev) { dev_err(cdev, "%s: Sound card device memory NULL\n", __func__); @@ -6782,6 +6784,48 @@ static int msm_populate_dai_link_component_of_node( } } + /* In multi-codec scenario, check if codecs are enabled for this platform */ + for (i = 0; i < card->num_links; i++) { + codecs_enabled = 0; + if (dai_link[i].num_codecs > 1) { + for (j = 0; j < dai_link[i].num_codecs; j++) { + if (!dai_link[i].codecs[j].of_node) + continue; + + np = dai_link[i].codecs[j].of_node; + if (!of_device_is_available(np)) { + dev_err(cdev, "%s: codec is disabled: %s\n", + __func__, + np->full_name); + dai_link[i].codecs[j].of_node = NULL; + continue; + } + + codecs_enabled++; + } + if (codecs_enabled > 0 && + codecs_enabled < dai_link[i].num_codecs) { + codecs_comp = devm_kzalloc(cdev, + sizeof(struct snd_soc_dai_link_component) + * codecs_enabled, GFP_KERNEL); + + index = 0; + for (j = 0; j < dai_link[i].num_codecs; j++) { + if(dai_link[i].codecs[j].of_node) { + codecs_comp[index].of_node = + dai_link[i].codecs[j].of_node; + codecs_comp[index].dai_name = + dai_link[i].codecs[j].dai_name; + codecs_comp[index].name = NULL; + index++; + } + } + dai_link[i].codecs = codecs_comp; + dai_link[i].num_codecs = codecs_enabled; + } + } + } + err: return ret; }