0. 背景
平台:Qualcomm 5G SM6350、android10、kernel version: msm-4.19。
本文重点分析machine driver里面的msm_asoc_machine_probe函数,这个是machie驱动的核心代码,涉及声卡解析注册,CPU dai和codec dai绑定,麦克偏置解析配置routing、耳机麦克检测(欧-美标兼容)、MI2S主、从模式配置,以及新增的LPASS音频投票机制。
此外,msm_asoc_machine_probe函数也可以说就干了一件事:
实例化结构体snd_soc_card。
那个,兄弟们转载博客还是希望附上我的转载链接啊,不要直接copy,也是尊重人不是 -_-。

1. msm_asoc_machine_probe
代码位置:
./vendor/qcom/opensource/audio-kernel/asoc/kona.c
msm_asoc_machine_probe整个函数如下:
static int msm_asoc_machine_probe(struct platform_device *pdev)
{
struct snd_soc_card *card = NULL;
struct msm_asoc_mach_data *pdata = NULL;
const char *mbhc_audio_jack_type = NULL;
int ret = 0;
uint index = 0;
struct clk *lpass_audio_hw_vote = NULL;
if (!pdev->dev.of_node) {
dev_err(&pdev->dev, "%s: No platform supplied from device tree\n", __func__);
return -EINVAL;
}
pdata = devm_kzalloc(&pdev->dev,
sizeof(struct msm_asoc_mach_data), GFP_KERNEL);
if (!pdata)
return -ENOMEM;
of_property_read_u32(pdev->dev.of_node,
"qcom,lito-is-v2-enabled",
&pdata->lito_v2_enabled);
card = populate_snd_card_dailinks(&pdev->dev);
if (!card) {
dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
ret = -EINVAL;
goto err;
}
card->dev = &pdev->dev;
platform_set_drvdata(pdev, card);
snd_soc_card_set_drvdata(card, pdata);
ret = snd_soc_of_parse_card_name(card, "qcom,model");
if (ret) {
dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n",
__func__, ret);
goto err;
}
ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
if (ret) {
dev_err(&pdev->dev, "%s: parse audio routing failed, err:%d\n",
__func__, ret);
goto err;
}
ret = msm_populate_dai_link_component_of_node(card);
if (ret) {
ret = -EPROBE_DEFER;
goto err;
}
ret = msm_init_aux_dev(pdev, card);
if (ret)
goto err;
ret = devm_snd_soc_register_card(&pdev->dev, card);
if (ret == -EPROBE_DEFER) {
if (codec_reg_done)
ret = -EINVAL;
goto err;
} else if (ret) {
dev_err(&pdev->dev, "%s: snd_soc_register_card failed (%d)\n",
__func__, ret);
goto err;
}
dev_err(&pdev->dev, "%s: Sound card %s registered\n", __func__, card->name);
kona_parse_aw87xx_mode(pdev, pdata);
pdata->spk_ext_pa_gpio_p = of_parse_phandle(pdev->dev.of_node,
"qcom,msm-spk-ext-pa-gpios", 0);
if (!pdata->spk_ext_pa_gpio_p) {
pr_err("%s: property %s not detected in node %s\n", __func__,
"qcom,msm-spk-ext-pa-gpios", pdev->dev.of_node->full_name);
}else{
ret = msm_cdc_pinctrl_select_sleep_state(pdata->spk_ext_pa_gpio_p);
if (ret < 0) {
pr_err("%s: gpio set cannot be activated %s\n", __func__, "speaker_pa_gpio");
return ret;
}
}
ret = of_property_read_u32(pdev->dev.of_node, "qcom,tdm-max-slots",
&pdata->tdm_max_slots);
if (ret) {
dev_err(&pdev->dev, "%s: No DT match for tdm max slots\n",
__func__);
}
if ((pdata->tdm_max_slots <= 0) || (pdata->tdm_max_slots >
TDM_MAX_SLOTS)) {
pdata->tdm_max_slots = TDM_MAX_SLOTS;
dev_err(&pdev->dev, "%s: Using default tdm max slot: %d\n",
__func__, pdata->tdm_max_slots);
}
pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node,
"qcom,hph-en1-gpio", 0);
if (!pdata->hph_en1_gpio_p) {
dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n",
__func__, "qcom,hph-en1-gpio",
pdev->dev.of_node->full_name);
}
pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node,
"qcom,hph-en0-gpio", 0);
if (!pdata->hph_en0_gpio_p) {
dev_dbg(&pdev->dev,

本文基于Qualcomm 5G SM6350、android10、kernel version msm - 4.19平台,重点分析machine driver里的msm_asoc_machine_probe函数,涉及声卡解析注册、dai绑定、麦克偏置解析等内容,还介绍了TDM接口、耳机兼容、MI2S模式配置及新增的LPASS音频投票机制。
最低0.47元/天 解锁文章
1200

被折叠的 条评论
为什么被折叠?



