下面就看看上面提到的两个链表platform和dai_list。
先看platform
搜索platform,发现在函数snd_soc_register_platform中,将snd_soc_platform类型的变量加入到了这个链表,现在就要看是谁调用了snd_soc_register_platform这个函数。之后,在s3c24xx_soc_platform_init中找到了调用这个函数的代码,s3c24xx_soc_platform_init是一个用module_init修饰的模块初始化函数。
在这里,向内核注册的snd_soc_platform类型的变量为:
struct snd_soc_platform s3c24xx_soc_platform = {
.name = "s3c24xx-audio",
.pcm_ops = &s3c24xx_pcm_ops,
.pcm_new = s3c24xx_pcm_new,
.pcm_free = s3c24xx_pcm_free_dma_buffers,
};
下面分析函数snd_soc_register_platform,看看是怎么注册的。
int snd_soc_register_platform(struct snd_soc_platform *platform)
{
if (!platform->name)
return -EINVAL;
INIT_LIST_HEAD(&platform->list);
mutex_lock(&client_mutex);
list_add(&platform->list, &platform_list);
snd_soc_instantiate_cards();
mutex_unlock(&client_mutex);
pr_debug("Registered platform '%s'\n", platform->name);
return 0;
}
看了这个函数之后,发现和snd_soc_register_card一样,也调用了snd_soc_instantiate_cards这个函数,也就是又执行了一遍snd_soc_instantiate_card中匹配的过程。
再看dai_list这个链表。链表dai_list中的节点是在函数snd_soc_register_dai中添加的。模块初始化函数uda134x_init调用了snd_soc_register_dai,向内核注册一个snd_soc_dai类型的变量uda134x_dai。
struct snd_soc_dai uda134x_dai = {
.name = "UDA134X",
/* playback capabilities */
.playback = {