summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Muller <mullerf@google.com>2023-06-20 17:23:20 -0700
committerFlorian Muller <mullerf@google.com>2023-06-20 19:00:15 -0700
commitfc5693494ad278ba12dc269e54755f5e984991e9 (patch)
treefd601c92222d45c10a695d43ff2ef846967962a4
parent78c8eece9b0ee28d887176fe19b3dd77b80ffbdc (diff)
downloadmsm-extra-fc5693494ad278ba12dc269e54755f5e984991e9.tar.gz
Check for haptic snd_soc_dai_driver to exist before adding it to card
If we attempt to add the snd_soc_dai_driver when the haptic driver has not been loaded successfully, it leads to the entire audio failing to set up. Check for the haptic snd_soc_dai_driver to exist before adding it to the DAI links, which will only exist if its associated drivers loaded successfully. Test: Manual + Validated by factory Bug: 287448904 Change-Id: Ie6f172b0c88964e1ea93df03feaf3957d2ac7c0d Signed-off-by: Florian Muller <mullerf@google.com>
-rw-r--r--asoc/monaco.c54
1 files changed, 44 insertions, 10 deletions
diff --git a/asoc/monaco.c b/asoc/monaco.c
index 8274d565..95aeca4d 100644
--- a/asoc/monaco.c
+++ b/asoc/monaco.c
@@ -1162,8 +1162,7 @@ static struct snd_soc_dai_link msm_monaco_dai_links[
ARRAY_SIZE(msm_pri_mi2s_be_dai_links) +
#ifdef CONFIG_GOOGLE_SW5100_AUDIO
ARRAY_SIZE(msm_tert_mi2s_be_dai_links) +
- ARRAY_SIZE(msm_sec_haptics_be_dai_links) +
- ARRAY_SIZE(msm_pri_haptics_be_dai_links) +
+ ARRAY_SIZE(msm_sec_haptics_be_dai_links) + // ~ msm_pri_haptics_be_dai_links
#endif
ARRAY_SIZE(msm_pri_tdm_be_dai_links)
];
@@ -1191,6 +1190,33 @@ static int msm_snd_card_monaco_late_probe(struct snd_soc_card *card)
return 0;
}
+#ifdef CONFIG_GOOGLE_SW5100_AUDIO
+static bool cs40l26_is_loaded(struct device *dev)
+{
+ struct of_phandle_args args;
+ const char *dai_name = NULL;
+ int rc, num_elems, i;
+
+ num_elems = of_count_phandle_with_args(dev->of_node,
+ "asoc-codec", NULL);
+
+ for (i = 0; i < num_elems; i++) {
+ rc = of_parse_phandle_with_fixed_args(dev->of_node,
+ "asoc-codec", 0, i, &args);
+ if (rc) {
+ dev_err(dev, "asoc-codec property parse error\n");
+ } else if (!snd_soc_get_dai_name(&args, &dai_name)) {
+ if (!strcmp(dai_name, "cs40l26-pcm")) {
+ dev_info(dev, "Found cs40l26-pcm\n");
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+#endif
+
static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
{
struct snd_soc_card *card = NULL;
@@ -1275,10 +1301,14 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
dev_info(dev, "%s(): CS40L26 codec support present"
" - Using Secondary MI2S\n",
__func__);
- memcpy(msm_monaco_dai_links + total_links,
- msm_sec_haptics_be_dai_links,
- sizeof(msm_sec_haptics_be_dai_links));
- total_links += ARRAY_SIZE(msm_sec_haptics_be_dai_links);
+ if (cs40l26_is_loaded(dev)) {
+ memcpy(msm_monaco_dai_links + total_links,
+ msm_sec_haptics_be_dai_links,
+ sizeof(msm_sec_haptics_be_dai_links));
+ total_links += ARRAY_SIZE(msm_sec_haptics_be_dai_links);
+ } else {
+ dev_err(dev, "%s(): CS40L26 is not loaded\n", __func__);
+ }
} else {
rc = of_property_read_u32(dev->of_node,
"qcom,cs40l26-codec-pri-mi2s", &val);
@@ -1286,10 +1316,14 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
dev_info(dev, "%s(): CS40L26 codec support present"
" - Using Primary MI2S\n",
__func__);
- memcpy(msm_monaco_dai_links + total_links,
- msm_pri_haptics_be_dai_links,
- sizeof(msm_pri_haptics_be_dai_links));
- total_links += ARRAY_SIZE(msm_pri_haptics_be_dai_links);
+ if (cs40l26_is_loaded(dev)) {
+ memcpy(msm_monaco_dai_links + total_links,
+ msm_pri_haptics_be_dai_links,
+ sizeof(msm_pri_haptics_be_dai_links));
+ total_links += ARRAY_SIZE(msm_pri_haptics_be_dai_links);
+ } else {
+ dev_err(dev, "%s(): CS40L26 is not loaded\n", __func__);
+ }
}
}
#endif