内核驱动,无外乎。
设备--总线--驱动。三者之间的关联。
简介
由于最近在做声卡驱动方面的东西。所以本文分析的是,soc下的wm9713的声卡流程。以及soc的部分。
(1) 从哪里来?
- //sound/soc/soc-core.c
- static int __devinit snd_soc_init(void)
- {
- printk(KERN_INFO "ASoC version %s\n", SND_SOC_VERSION);
- return platform_driver_register(&soc_driver);
- }
- /* ASoC platform driver */
- static struct platform_driver soc_driver = {
- .driver = {
- .name = "soc-audio",
- },
- .probe = soc_probe,
- .remove = soc_remove,
- .suspend = soc_suspend,
- .resume = soc_resume,
- };
- /* probes a new socdev */
- static int soc_probe(struct platform_device *pdev)
- {
- int ret = 0, i;
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_machine *machine = socdev->machine;
- struct snd_soc_platform *platform = socdev->platform;
- struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
- //这里下面掉用了好几个probe。分别指出他们位于哪个位置
- //下面这个一般位于soc下的s3c目录下。比如我用的就是在smdk2450_wm9713.c文件内
- if (machine->probe) {
- ret = machine->probe(pdev);
- if(ret < 0)
- return ret;
- }
- for (i = 0; i < machine->num_links; i++)
- {
- struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
- if (cpu_dai->probe) {
- ret = cpu_dai->probe(pdev);
- if(ret < 0)
- goto cpu_dai_err;
- }
- }
- if (codec_dev->probe) {
- ret = codec_dev->probe(pdev);
- if(ret < 0)
- goto cpu_dai_err;
- }
- if (platform->probe) {
- ret = platform->probe(pdev);
- if(ret < 0)
- goto platform_err;
- }
- //......
- return ret;