mici: reduce sound driver boot time from 1.7s -> 0.2s (#119)

This commit is contained in:
Adeeb Shihadeh
2026-05-04 20:02:33 -07:00
committed by GitHub
parent b330d9e7e9
commit da9144d068
2 changed files with 95 additions and 51 deletions

View File

@@ -250,6 +250,22 @@ status = "ok";
qcom,msm-mi2s-tx-lines = <1>;
};
&snd_934x {
qcom,comma-skip-tavil-init;
qcom,comma-minimal-audio;
qcom,audio-routing =
"HiFi Playback", "IN_L",
"HiFi Playback", "IN_R",
"OUT_L", "HiFi Capture",
"OUT_R", "HiFi Capture";
asoc-platform = <&pcm0>, <&routing>;
asoc-platform-names = "msm-pcm-dsp.0", "msm-pcm-routing";
asoc-cpu = <&dai_mi2s1>;
asoc-cpu-names = "msm-dai-q6-mi2s.1";
};
/* Board definition */
/ {
model = "comma mici";

View File

@@ -3829,6 +3829,10 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
rtd->pmdown_time = 0;
if (of_property_read_bool(rtd->card->dev->of_node,
"qcom,comma-skip-tavil-init"))
return 0;
ret = snd_soc_add_codec_controls(codec, msm_snd_controls,
ARRAY_SIZE(msm_snd_controls));
if (ret < 0) {
@@ -6164,6 +6168,12 @@ static struct snd_soc_dai_link msm_tavil_snd_card_dai_links[
ARRAY_SIZE(msm_mi2s_be_dai_links) +
ARRAY_SIZE(msm_auxpcm_be_dai_links)];
#define MSM_COMMON_DAI_LINK_MEDIA1 0
#define MSM_MI2S_DAI_LINK_SEC_RX 2
#define MSM_MI2S_DAI_LINK_SEC_TX 3
static struct snd_soc_dai_link msm_mici_snd_card_dai_links[3];
#if 0
static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card)
{
@@ -6462,60 +6472,78 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
if (!strcmp(match->data, "tavil_codec")) {
card = &snd_soc_card_tavil_msm;
len_1 = ARRAY_SIZE(msm_common_dai_links);
len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links);
len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links);
len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links);
total_links = len_4 + ARRAY_SIZE(msm_tavil_be_dai_links);
memcpy(msm_tavil_snd_card_dai_links,
msm_common_dai_links,
sizeof(msm_common_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_1,
msm_tavil_fe_dai_links,
sizeof(msm_tavil_fe_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_2,
msm_common_misc_fe_dai_links,
sizeof(msm_common_misc_fe_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_3,
msm_common_be_dai_links,
sizeof(msm_common_be_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_4,
msm_tavil_be_dai_links,
sizeof(msm_tavil_be_dai_links));
if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
dev_dbg(dev, "%s(): WCN BTFM support present\n",
__func__);
memcpy(msm_tavil_snd_card_dai_links + total_links,
msm_wcn_be_dai_links,
sizeof(msm_wcn_be_dai_links));
total_links += ARRAY_SIZE(msm_wcn_be_dai_links);
}
if (of_property_read_bool(dev->of_node,
"qcom,ext-disp-audio-rx")) {
dev_dbg(dev, "%s(): ext disp audio support present\n",
__func__);
memcpy(msm_tavil_snd_card_dai_links + total_links,
ext_disp_be_dai_link,
sizeof(ext_disp_be_dai_link));
total_links += ARRAY_SIZE(ext_disp_be_dai_link);
"qcom,comma-minimal-audio")) {
total_links = ARRAY_SIZE(msm_mici_snd_card_dai_links);
memcpy(&msm_mici_snd_card_dai_links[0],
&msm_common_dai_links[MSM_COMMON_DAI_LINK_MEDIA1],
sizeof(msm_mici_snd_card_dai_links[0]));
memcpy(&msm_mici_snd_card_dai_links[1],
&msm_mi2s_be_dai_links[MSM_MI2S_DAI_LINK_SEC_RX],
sizeof(msm_mici_snd_card_dai_links[1]));
memcpy(&msm_mici_snd_card_dai_links[2],
&msm_mi2s_be_dai_links[MSM_MI2S_DAI_LINK_SEC_TX],
sizeof(msm_mici_snd_card_dai_links[2]));
dailink = msm_mici_snd_card_dai_links;
} else {
len_1 = ARRAY_SIZE(msm_common_dai_links);
len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links);
len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links);
len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links);
total_links = len_4 + ARRAY_SIZE(msm_tavil_be_dai_links);
memcpy(msm_tavil_snd_card_dai_links,
msm_common_dai_links,
sizeof(msm_common_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_1,
msm_tavil_fe_dai_links,
sizeof(msm_tavil_fe_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_2,
msm_common_misc_fe_dai_links,
sizeof(msm_common_misc_fe_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_3,
msm_common_be_dai_links,
sizeof(msm_common_be_dai_links));
memcpy(msm_tavil_snd_card_dai_links + len_4,
msm_tavil_be_dai_links,
sizeof(msm_tavil_be_dai_links));
if (of_property_read_bool(dev->of_node,
"qcom,wcn-btfm")) {
dev_dbg(dev, "%s(): WCN BTFM support present\n",
__func__);
memcpy(msm_tavil_snd_card_dai_links +
total_links, msm_wcn_be_dai_links,
sizeof(msm_wcn_be_dai_links));
total_links += ARRAY_SIZE(msm_wcn_be_dai_links);
}
if (of_property_read_bool(dev->of_node,
"qcom,ext-disp-audio-rx")) {
dev_dbg(dev,
"%s(): ext disp audio support present\n",
__func__);
memcpy(msm_tavil_snd_card_dai_links +
total_links, ext_disp_be_dai_link,
sizeof(ext_disp_be_dai_link));
total_links += ARRAY_SIZE(ext_disp_be_dai_link);
}
if (of_property_read_bool(dev->of_node,
"qcom,mi2s-audio-intf")) {
memcpy(msm_tavil_snd_card_dai_links +
total_links, msm_mi2s_be_dai_links,
sizeof(msm_mi2s_be_dai_links));
total_links += ARRAY_SIZE(msm_mi2s_be_dai_links);
}
if (of_property_read_bool(dev->of_node,
"qcom,auxpcm-audio-intf")) {
memcpy(msm_tavil_snd_card_dai_links +
total_links, msm_auxpcm_be_dai_links,
sizeof(msm_auxpcm_be_dai_links));
total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links);
}
dailink = msm_tavil_snd_card_dai_links;
}
if (of_property_read_bool(dev->of_node,
"qcom,mi2s-audio-intf")) {
memcpy(msm_tavil_snd_card_dai_links + total_links,
msm_mi2s_be_dai_links,
sizeof(msm_mi2s_be_dai_links));
total_links += ARRAY_SIZE(msm_mi2s_be_dai_links);
}
if (of_property_read_bool(dev->of_node,
"qcom,auxpcm-audio-intf")) {
memcpy(msm_tavil_snd_card_dai_links + total_links,
msm_auxpcm_be_dai_links,
sizeof(msm_auxpcm_be_dai_links));
total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links);
}
dailink = msm_tavil_snd_card_dai_links;
} else if (!strcmp(match->data, "stub_codec")) {
card = &snd_soc_card_stub_msm;
len_1 = ARRAY_SIZE(msm_stub_fe_dai_links);