soc駆動、学習分析

1852 ワード

カーネルドライブ.
デバイス--バス--駆動.3つの間の関連.
概要
最近はサウンドカードの駆動に関するものを作っているからです.従って,本論文では,soc下のwm 9713のサウンドカードフローを解析した.およびsocの部分.
(1)どこから来ましたか.
//sound/soc/soc-core.c
static int __devinit snd_soc_init(void)
{
    printk(KERN_INFO "ASoC version %s
", 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;
}