diff options
author | Florian Muller <mullerf@google.com> | 2023-06-20 17:23:20 -0700 |
---|---|---|
committer | Florian Muller <mullerf@google.com> | 2023-06-20 19:00:15 -0700 |
commit | fc5693494ad278ba12dc269e54755f5e984991e9 (patch) | |
tree | fd601c92222d45c10a695d43ff2ef846967962a4 | |
parent | 78c8eece9b0ee28d887176fe19b3dd77b80ffbdc (diff) | |
download | msm-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.c | 54 |
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 |