linux alsa_2 snd_soc_register_card
machine driver的probe函数会调用此api向Alsa注册声卡
1 int snd_soc_register_card(struct snd_soc_card *card) 2 { 3 int i, ret; 4 struct snd_soc_pcm_runtime *rtd; 5 6 if (!card->name || !card->dev) 7 return -EINVAL; 8 9 for (i = 0; i < card->num_links; i++) { 10 struct snd_soc_dai_link *link = &card->dai_link[i]; 11 12 ret = soc_init_dai_link(card, link);//检查dai_link中codec、platform、CPU dai信息是否完整 13 if (ret) { 14 dev_err(card->dev, "ASoC: failed to init link %s\n", 15 link->name); 16 return ret; 17 } 18 } 19 20 dev_set_drvdata(card->dev, card); 21 22 snd_soc_initialize_card_lists(card);//初始化card中链表 23 24 INIT_LIST_HEAD(&card->dai_link_list);//初始化card中的dai_link链表 25 card->num_dai_links = 0; 26 27 INIT_LIST_HEAD(&card->rtd_list);//初始化card中rtd链表 28 card->num_rtd = 0; 29 30 INIT_LIST_HEAD(&card->dapm_dirty); 31 INIT_LIST_HEAD(&card->dobj_list); 32 card->instantiated = 0;声卡初始化的一个flag 33 mutex_init(&card->mutex); 34 mutex_init(&card->dapm_mutex); 35 36 ret = snd_soc_instantiate_card(card);//初始化声卡 37 if (ret != 0) 38 return ret; 39 40 /* deactivate pins to sleep state */ 41 list_for_each_entry(rtd, &card->rtd_list, list) { 42 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 43 int j; 44 45 for (j = 0; j < rtd->num_codecs; j++) { 46 struct snd_soc_dai *codec_dai = rtd->codec_dais[j]; 47 if (!codec_dai->active) 48 pinctrl_pm_select_sleep_state(codec_dai->dev); 49 } 50 51 if (!cpu_dai->active) 52 pinctrl_pm_select_sleep_state(cpu_dai->dev); 53 } 54 55 return ret; 56 }
行胜于言,自强不息。

浙公网安备 33010602011771号