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 }

 

posted @ 2023-02-11 14:59  Action_er  阅读(145)  评论(0)    收藏  举报