|
@@ -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;
|
|
|
}
|