alsa子系统 <一>

入口函数
static int __init alsa_sound_init(void)
{
    //116
    snd_major = major;
    snd_ecards_limit = cards_limit;
    /**
        注册一个字符设备,主设备号为116.
        这里设计的和input.c(input子系统的核心层)类似。
        snd_fops中只提供了一个open函数,
        在input子系统中 也是只提供了一个open函数。(input_open()函数的具体实现请见我以前的博文分析)
        在分析完成snd_open()之后,会比较他们之间的一些差异。
    */  
    if (register_chrdev(major,"alsa",&snd_fops))
    {
        snd_printk(KERN_ERR "unable to register native major device number %d\n", major);
        return -EIO;
    }
...
    return 0;
}

static const struct file_operations snd_fops =
{
    .owner =    THIS_MODULE,
    .open =     snd_open,
    .llseek =   noop_llseek,
};

/**
    这个函数的实现和input_open()的实现在逻辑上及其类似。
    这种在注册的时候,根据次设备号填充到数组中,在open的时候根据次设备号从数组中取出来
    在input子系统、LCD子系统、v4l2子系统中都大量的使用。
*/
static int snd_open(struct inode *inode, struct file *file)
{
    /**
        获取次设备号,是要根据这里获取到的次设备号从数组中取出对应的snd_minor 
        那么,这里的次设备号就是snd_minor[]被填充的索引值,
        这一操作是再snd_register_device_for_dev()函数中 实现的,下面会有分析。
    */
    unsigned int minor = iminor(inode);
    struct snd_minor *mptr = NULL;

    const struct file_operations *old_fops;
    int err = 0;

    /**
        static struct snd_minor *snd_minors[256];
        看获取到的次设备号是否大于256。
    */
    if (minor >= ARRAY_SIZE(snd_minors))
    {
        return -ENODEV;
    }   
    mutex_lock(&sound_mutex);
    /**
        根据上面获取到的次设备号,从snd_minors[]中取出对应的snd_minor 
        那么,要问了,snd_minors[]是在什么时候被填充的?接着往下看
    */
    mptr = snd_minors[minor];

    if (mptr == NULL) 
    {
        mptr = autoload_device(minor);
        if (!mptr) {
            mutex_unlock(&sound_mutex);
            return -ENODEV;
        }
    }
    old_fops = file->f_op;
    /**
        将打开文件的file_operation被赋予从数组中获取的那个snd_minor的file_operations
        问题 : 
                那么,这里替换打开文件的fops,这个fops是什么。
        这个问题也是在下面的一个函数snd_register_device_for_dev()中来实现的。
        这里替换了打开文件的fops,以后的函数 使用file->f_op中定义的函数,就是snd_pcm_f_ops中提供的函数了
        这一技巧,在内核大多数open函数中都有使用
    */
    file->f_op = fops_get(mptr->f_ops);
    if (file->f_op == NULL) 
    {
        file->f_op = old_fops;
        err = -ENODEV;
    }
    mutex_unlock(&sound_mutex);
    if (err < 0)
        return err;

    /**
        如果从数组中取出的这个snd_minor 提供了file_operations,并且在file_operations中
        提供了open函数,那么就调用它的open函数
    */
    if (file->f_op->open) 
    {
        /**
            调用open函数
        */
        err = file->f_op->open(inode, file);
        if (err) {
            fops_put(file->f_op);
            file->f_op = fops_get(old_fops);
        }
    }
    fops_put(old_fops);
    return err;
}
现在的问题是: snd_minors[]数组在什么时候被填充
/**
    看第三个参数  f_ops
    [0] :播放
    [1] :录音 
        const struct file_operations snd_pcm_f_ops[2] = {
    {                                               
        .owner =        THIS_MODULE,
        .write =        snd_pcm_write,
        .aio_write =        snd_pcm_aio_write,
        .open =         snd_pcm_playback_open,
        .release =      snd_pcm_release,
        .llseek =       no_llseek,
        .poll =         snd_pcm_playback_poll,
        .unlocked_ioctl =   snd_pcm_playback_ioctl,
        .compat_ioctl =     snd_pcm_ioctl_compat,
        .mmap =         snd_pcm_mmap,
        .fasync =       snd_pcm_fasync,
        ...
    },
    {
        .owner =        THIS_MODULE,
        .read =         snd_pcm_read,
        .aio_read =     snd_pcm_aio_read,
        .open =         snd_pcm_capture_open,
        .release =      snd_pcm_release,
        .llseek =       no_llseek,
        .poll =         snd_pcm_capture_poll,
        .unlocked_ioctl =   snd_pcm_capture_ioctl,
        .compat_ioctl =     snd_pcm_ioctl_compat,
        .mmap =         snd_pcm_mmap,
        .fasync =       snd_pcm_fasync,
        .get_unmapped_area =    snd_pcm_get_unmapped_area,
    }
};

在看一下它的使用 
            err = snd_register_device_for_dev(devtype, pcm->card,
                          pcm->device,
                          &snd_pcm_f_ops[cidx],
                          pcm, str, dev);

    在这个函数中有下面一句代码:
                          preg->f_ops = f_ops;      
    所以,这个过程 : snd_pcm_f_ops 作为snd_register_device_for_dev的一个参数被传递
    进来,最终被赋值给了 snd_minors[minor]->f_ops中,
    那么,snd_pcm_f_ops中的这些指针函数什么时候被使用呢?   下面有分析                            

*/
int snd_register_device_for_dev(int type,struct snd_card * card,
                                int dev,
                                const struct file_operations *f_ops,
                                void * private_data,
                                const char * name,
                                struct device * device
                                )
{
    int minor;
    struct snd_minor * preg;

    //必需提供name参数
    if (snd_BUG_ON(!name))
    {
        return -EINVAL;
    }
    /**
        为snd_minor分配内存空间
    */
    preg = kmalloc(sizeof(*preg),GFP_KERNEL);
    if (preg == NULL)
    {
        return -ENOMEM;
    }
    /**
        赋值初始化 snd_minor
    */

    preg->type = type;

    preg->card = card ? card->number : -1;

    preg->device = dev;

    preg->f_ops = f_ops;  //看这个传入的参数已经赋值给了snd_minors->f_ops了

    preg->private_data = private_data;

    mutex_lock(&sound_mutex);
#indef CONFIG_SND_DYNAMIC_MINORS;
    minor = snd_find_free_minor();
#else
    /**
        静态 分配次设备号,这个函数在下面进行分析
    */
    minor = snd_kernel_minor(type,card,dev);
    /**

        检查分配的minor,snd_minors[minor]是否为空缺
        为下面将snd_minors放入奥snd_minors[]中做准备
    */
    if (minor >= 0 && snd_minors[minor])
    {
        minor = -EBUSY;
    }
#endif
    if (minor < 0)
    {
        mutex_unlock(&sound_mutex);
        kfree(preg);
        return minor;
    }
    /**
        #define SNDRV_OS_MINORS  256

        static struct snd_minor *snd_minors[SNDRV_OS_MINORS];

        将该snd_minor放到全局数组snd_minors[]中,位置是minor为索引值
        问题:
            snd_minors[]一定会在以后的其他函数中根据minor为索引值取出来,(如:上面的额open函数)

            这个指针数组的设计在内核的其他子系统中都有,注册的时候往里放,open或者其他函数从里面依据minor取出来
            lcd子系统中的fb_info、input子系统中的input_table、v4l2的video_device 都是这样的设计
            既然是共享的资源,那么一定要使用互斥机制来保护这些临界区,发现他们都是使用的互斥锁来保护的。
    */
    snd_minors[minor] = preg;
    /**
        创建设备文件节点
        那么,对应的class_create()创建类是再什么时候被调用的?
    */
    preg->dev = device_create(sound_class,device,MKDEV(major,minor)
                private_data,"%s",name);

    if (IS_ERR(preg->dev)) //出错的情况下,该释放的释放,该置空的置空
    {
        snd_minors[minor] = NULL;
        mutex_unlock(&sound_mutex);
        minor = PTR_ERR(preg->dev);
        kfree(preg);

        return minor;
    }
    mutex_unlock(&soun_mutex);

    return 0;
}
那么是谁调用了snd_register_device_for_dev()这个函数呢,源头在哪里?

调用流程图
这里写图片描述

sound_vbc_v4_sprd_codec: sound@0 { compatible = "unisoc,vbc-v4-codec-sc2730"; status = "disabled"; sprd-audio-card,name = "sprdphone-sc2730"; sprd-audio-card,routing = "HPMIC Pin", "HP Mic Jack", "MIC Pin", "Mic Jack", "MIC2 Pin", "Aux Mic Jack", "HeadPhone Jack", "HP Pin", "Ext Spk", "HP Pin", "Ext Spk1", "HP Pin", "Ext Spk", "SPK Pin", "Ext Spk1", "SPK Pin", "Ext Ear", "EAR Pin", "Ext Ear", "SPK Pin", "Ext Ear", "HP Pin"; sprd-audio-card,headset = <&sprd_headset>; /* *L5Pro use lable:audcp_ahb_regs *N6Pro use lable:audcp_glb_regs(in ums9620-base.dts) */ sprd,syscon-agcp-ahb = <&audcp_ahb_regs>; /* fe dai-links */ /* fe normal ap01 */ sprd-audio-card,dai-link@0 { link-name = "FE_NORMAL_AP01"; stream-name = "FE_ST_NORMAL_AP01"; ignore-suspend = <0>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 0>; }; codec { sound-dai = <0 0>; }; }; /* fe normal ap23 */ sprd-audio-card,dai-link@1 { link-name = "FE_NORMAL_AP23"; stream-name = "FE_ST_NORMAL_AP23"; ignore-suspend = <0>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 1>; }; codec { sound-dai = <0 0>; }; }; /* fe capture dsp */ sprd-audio-card,dai-link@2 { link-name = "FE_CAPTURE_DSP"; stream-name = "FE_ST_CAPTURE_DSP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 2>; }; codec { sound-dai = <0 0>; }; }; /* fe fast */ sprd-audio-card,dai-link@3 { link-name = "FE_FAST"; stream-name = "FE_ST_FAST"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 3>; }; codec { sound-dai = <0 0>; }; }; /* fe offload */ sprd-audio-card,dai-link@4 { link-name = "FE_OFFLOAD"; stream-name = "FE_ST_OFFLOAD"; ignore-suspend = <0>; ignore-pmdown-time = <0>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_compr>; }; cpu { sound-dai = <&sprd_fe_dai 4>; }; codec { sound-dai = <0 0>; }; }; /* fe voice*/ sprd-audio-card,dai-link@5 { link-name = "FE_VOICE"; stream-name = "FE_ST_VOICE"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 5>; }; codec { sound-dai = <0 0>; }; }; /* fe voip */ sprd-audio-card,dai-link@6 { link-name = "FE_VOIP"; stream-name = "FE_ST_VOIP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 6>; }; codec { sound-dai = <0 0>; }; }; /* fe fm */ sprd-audio-card,dai-link@7 { link-name = "FE_FM"; stream-name = "FE_ST_FM"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 7>; }; codec { sound-dai = <0 0>; }; }; /* fe fm capture */ sprd-audio-card,dai-link@8 { link-name = "FE_FM_C"; stream-name = "FE_ST_FM_C"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 8>; }; codec { sound-dai = <0 0>; }; }; /* fe voice capture */ sprd-audio-card,dai-link@9 { link-name = "FE_VOICE_C"; stream-name = "FE_ST_VOICE_C"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture= <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 9>; }; codec { sound-dai = <0 0>; }; }; /* fe loop */ sprd-audio-card,dai-link@10 { link-name = "FE_LOOP"; stream-name = "FE_ST_LOOP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 10>; }; codec { sound-dai = <0 0>; }; }; /* fe a2dp offload */ sprd-audio-card,dai-link@11 { link-name = "FE_A2DP_OFFLOAD"; stream-name = "FE_ST_A2DP_OFFLOAD"; ignore-suspend = <0>; ignore-pmdown-time = <0>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_compr>; }; cpu { sound-dai = <&sprd_fe_dai 11>; }; codec { sound-dai = <0 0>; }; }; /* fe a2dp pcm */ sprd-audio-card,dai-link@12 { link-name = "FE_A2DP_PCM"; stream-name = "FE_ST_A2DP_PCM"; ignore-suspend = <0>; ignore-pmdown-time = <0>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 12>; }; codec { sound-dai = <0 0>; }; }; /* fe fm capture dsp */ sprd-audio-card,dai-link@13 { link-name = "FE_CAPTURE_FM_DSP"; stream-name = "FE_ST_CAPTURE_FM_DSP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 13>; }; codec { sound-dai = <0 0>; }; }; /* fe btsco capture dsp */ sprd-audio-card,dai-link@14 { link-name = "FE_CAPTURE_BTSCO_DSP"; stream-name = "FE_ST_CAPTURE_BTSCO_DSP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 14>; }; codec { sound-dai = <0 0>; }; }; /* fe fm dsp */ sprd-audio-card,dai-link@15 { link-name = "FE_FM_DSP"; stream-name = "FE_ST_FM_DSP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 15>; }; codec { sound-dai = <0 0>; }; }; /* fe vbc dump */ sprd-audio-card,dai-link@16 { link-name = "FE_DUMP"; stream-name = "FE_ST_DUMP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 16>; }; codec { sound-dai = <0 0>; }; }; /* fe bt capture ap */ sprd-audio-card,dai-link@17 { link-name = "FE_BTCAP_AP"; stream-name = "FE_ST_BTCAP_AP"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 17>; }; codec { sound-dai = <0 0>; }; }; /* be dai-links */ /* 0: be normal_ap01 codec */ sprd-audio-card,dai-link@18 { ignore-suspend = <0>; link-name = "BE_NORMAL_AP01_CODEC"; stream-name = "BE_ST_NORMAL_AP01_CODEC"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 0>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 1: be normal_ap23 codec */ sprd-audio-card,dai-link@19 { ignore-suspend = <0>; link-name = "BE_NORMAL_AP23_CODEC"; stream-name = "BE_ST_NORMAL_AP23_CODEC"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 1>; }; codec { sound-dai = <&sprd_audio_codec_ana 1>; }; }; /* 2: be capture dsp codec */ sprd-audio-card,dai-link@20 { ignore-suspend = <0>; link-name = "BE_CAPTURE_DSP_CODEC"; stream-name = "BE_ST_CAPTURE_DSP_CODEC"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 2>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 3: be fast codec */ sprd-audio-card,dai-link@21 { ignore-suspend = <1>; link-name = "BE_FAST_CODEC"; stream-name = "BE_ST_FAST_CODEC"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 3>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 4: be offload codec */ sprd-audio-card,dai-link@22 { ignore-suspend = <0>; ignore-pmdown-time = <0>; link-name = "BE_OFFLOAD_CODEC"; stream-name = "BE_ST_OFFLOAD_CODEC"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 4>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 5: be voice codec */ sprd-audio-card,dai-link@23 { ignore-suspend = <1>; link-name = "BE_VOICE_CODEC"; stream-name = "BE_ST_VOICE_CODEC"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 5>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 6: be voip codec */ sprd-audio-card,dai-link@24 { ignore-suspend = <1>; link-name = "BE_VOIP_CODEC"; stream-name = "BE_ST_VOIP_CODEC"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 6>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 7: be fm codec */ sprd-audio-card,dai-link@25 { ignore-suspend = <1>; link-name = "BE_FM_CODEC"; stream-name = "BE_ST_FM_CODEC"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 7>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 8: be loop codec */ sprd-audio-card,dai-link@26 { ignore-suspend = <1>; link-name = "BE_LOOP_CODEC"; stream-name = "BE_ST_LOOP_CODEC"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 8>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 9: be fm dsp codec */ sprd-audio-card,dai-link@27 { ignore-suspend = <1>; link-name = "BE_FM_DSP_CODEC"; stream-name = "BE_ST_FM_DSP_CODEC"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 9>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 10: be normal_ap01 usb */ sprd-audio-card,dai-link@28 { ignore-suspend = <0>; link-name = "BE_NORMAL_AP01_USB"; stream-name = "BE_ST_NORMAL_AP01_USB"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 10>; }; codec { sound-dai = <0 0>; }; }; /* 11: be normal_ap23 usb */ sprd-audio-card,dai-link@29 { ignore-suspend = <0>; link-name = "BE_NORMAL_AP23_USB"; stream-name = "BE_ST_NORMAL_AP23_USB"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 11>; }; codec { sound-dai = <0 0>; }; }; /* 12: be capture dsp usb */ sprd-audio-card,dai-link@30 { ignore-suspend = <0>; link-name = "BE_CAPTURE_DSP_USB"; stream-name = "BE_ST_CAPTURE_DSP_USB"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 12>; }; codec { sound-dai = <0 0>; }; }; /* 13: be fast usb */ sprd-audio-card,dai-link@31 { ignore-suspend = <1>; link-name = "BE_FAST_USB"; stream-name = "BE_ST_FAST_USB"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 13>; }; codec { sound-dai = <0 0>; }; }; /* 14: be offload usb */ sprd-audio-card,dai-link@32 { ignore-suspend = <0>; ignore-pmdown-time = <0>; link-name = "BE_OFFLOAD_USB"; stream-name = "BE_ST_OFFLOAD_USB"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 14>; }; codec { sound-dai = <0 0>; }; }; /* 15: be voice usb */ sprd-audio-card,dai-link@33 { ignore-suspend = <1>; link-name = "BE_VOICE_USB"; stream-name = "BE_ST_VOICE_USB"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 15>; }; codec { sound-dai = <0 0>; }; }; /* 16: be voip usb */ sprd-audio-card,dai-link@34 { ignore-suspend = <1>; link-name = "BE_VOIP_USB"; stream-name = "BE_ST_VOIP_USB"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 16>; }; codec { sound-dai = <0 0>; }; }; /* 17: be fm usb */ sprd-audio-card,dai-link@35 { ignore-suspend = <1>; link-name = "BE_FM_USB"; stream-name = "BE_ST_FM_USB"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 17>; }; codec { sound-dai = <0 0>; }; }; /* 18: be loop usb */ sprd-audio-card,dai-link@36 { ignore-suspend = <1>; link-name = "BE_LOOP_USB"; stream-name = "BE_ST_LOOP_USB"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 18>; }; codec { sound-dai = <0 0>; }; }; /* 19: be fm dsp usb */ sprd-audio-card,dai-link@37 { ignore-suspend = <1>; link-name = "BE_FM_DSP_USB"; stream-name = "BE_ST_FM_DSP_USB"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 19>; }; codec { sound-dai = <0 0>; }; }; /* 20: be offload a2dp */ sprd-audio-card,dai-link@38 { ignore-suspend = <0>; ignore-pmdown-time = <0>; link-name = "BE_OFFLOAD_A2DP"; stream-name = "BE_ST_OFFLOAD_A2DP"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 20>; }; codec { sound-dai = <0 0>; }; }; /* 21: be pcm a2dp */ sprd-audio-card,dai-link@39 { ignore-suspend = <0>; ignore-pmdown-time = <0>; link-name = "BE_PCM_A2DP"; stream-name = "BE_ST_PCM_A2DP"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 21>; }; codec { sound-dai = <0 0>; }; }; /* 22: be voice bt */ sprd-audio-card,dai-link@40 { ignore-suspend = <1>; link-name = "BE_VOICE_BT"; stream-name = "BE_ST_VOICE_BT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 22>; }; codec { sound-dai = <0 0>; }; }; /* 23: be voip bt */ sprd-audio-card,dai-link@41 { ignore-suspend = <1>; link-name = "BE_VOIP_BT"; stream-name = "BE_ST_VOIP_BT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 23>; }; codec { sound-dai = <0 0>; }; }; /* 24: be loop bt */ sprd-audio-card,dai-link@42 { ignore-suspend = <1>; link-name = "BE_LOOP_BT"; stream-name = "BE_ST_LOOP_BT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 24>; }; codec { sound-dai = <0 0>; }; }; /* 25: be capture bt */ sprd-audio-card,dai-link@43 { ignore-suspend = <1>; link-name = "BE_BT_C"; stream-name = "BE_ST_BT_C"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 25>; }; codec { sound-dai = <0 0>; }; }; /* 26: be voice capture */ sprd-audio-card,dai-link@44 { ignore-suspend = <1>; link-name = "BE_VOICE_C"; stream-name = "BE_ST_VOICE_C"; no-pcm = <1>; dpcm-capture= <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 26>; }; codec { sound-dai = <0 0>; }; }; /* 27: be fm capture */ sprd-audio-card,dai-link@45 { ignore-suspend = <1>; link-name = "BE_FM_C"; stream-name = "BE_ST_FM_C"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 27>; }; codec { sound-dai = <0 0>; }; }; /* 28: be capture fm dsp */ sprd-audio-card,dai-link@46 { ignore-suspend = <0>; link-name = "BE_CAPTURE_FM_DSP"; stream-name = "BE_ST_CAPTURE_FM_DSP"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 28>; }; codec { sound-dai = <0 0>; }; }; /* 29: be capture btsco dsp */ sprd-audio-card,dai-link@47 { ignore-suspend = <0>; link-name = "BE_CAPTURE_BTSCO_DSP"; stream-name = "BE_ST_CAPTURE_BTSCO_DSP"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 29>; }; codec { sound-dai = <0 0>; }; }; /* 30: be dump */ sprd-audio-card,dai-link@48 { ignore-suspend = <1>; link-name = "BE_DUMP"; stream-name = "BE_DUMP"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 30>; }; codec { sound-dai = <0 0>; }; }; /* 31: fe test codec */ sprd-audio-card,dai-link@49 { link-name = "FE_TEST_CODEC"; stream-name = "FE_ST_TEST_CODEC"; ignore-suspend = <0>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 19>; }; codec { sound-dai = <0 0>; }; }; /* 32: simulate codec */ sprd-audio-card,dai-link@50 { ignore-suspend = <1>; link-name = "BE_TEST_CODEC"; stream-name = "BE_TEST_CODEC"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { /* dummy cpu dai, not as be dai */ sound-dai = <&vbc_v4 31>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 33: be fast btsco */ sprd-audio-card,dai-link@51 { ignore-suspend = <1>; link-name = "BE_FAST_BTSCO"; stream-name = "BE_ST_FAST_BTSCO"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 32>; }; codec { sound-dai = <0 0>; }; }; /* 34: be normal ap01 btsco */ sprd-audio-card,dai-link@52 { ignore-suspend = <1>; link-name = "BE_NORMAL_AP01_BTSCO"; stream-name = "BE_ST_NORMAL_AP01_BTSCO"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 33>; }; codec { sound-dai = <0 0>; }; }; /* dai-link@53 ~ dai-link@67 (index from 35 to 49) * are reserved for ucp1301 and HIFI. */ /* 50: fe voice pcm */ sprd-audio-card,dai-link@68 { link-name = "FE_VOICE_PCM_P"; stream-name = "FE_ST_VOICE_PCM_P"; ignore-suspend = <1>; dynamic = <1>; trigger = <1 1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 18>; }; codec { sound-dai = <0 0>; }; }; /* 51: be voice pcm */ sprd-audio-card,dai-link@69 { ignore-suspend = <1>; link-name = "BE_VOICE_PCM_P"; stream-name = "BE_ST_VOICE_PCM_P"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 45>; }; codec { sound-dai = <0 0>; }; }; /* 52: fe multimedia*/ sprd-audio-card,dai-link@90 { link-name = "FE_MM_P"; stream-name = "FE_ST_MM_P"; be-id = <0>; trigger = <1 1>; ignore-suspend = <1>; dynamic = <1>; dpcm-playback = <1>; plat { sound-dai = <&sprd_pcm>; }; cpu { sound-dai = <&sprd_fe_dai 25>; }; codec { sound-dai = <0 0>; }; }; /* 53: be multimedia */ sprd-audio-card,dai-link@91 { link-name = "BE_FAST_P_SMART_AMP"; stream-name = "BE_ST_FAST_P_SMART_AMP"; be-id = <0>; ignore-suspend = <0>; no-pcm = <1>; dpcm-playback = <1>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 57>; }; codec { sound-dai = <&sprd_audio_codec_ana 0>; }; }; /* 58: be normal_ap01 usb mcdt */ /*sprd-audio-card,dai-link@98 { ignore-suspend = <0>; link-name = "BE_NORMAL_AP01_USB_MCDT"; stream-name = "BE_ST_NORMAL_AP01_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 58>; }; codec { sound-dai = <0 0>; }; };*/ /* 59: be normal_ap23 usb mcdt */ /*sprd-audio-card,dai-link@99 { ignore-suspend = <0>; link-name = "BE_NORMAL_AP23_USB_MCDT"; stream-name = "BE_ST_NORMAL_AP23_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 59>; }; codec { sound-dai = <0 0>; }; };*/ /* 60: be capture dsp usb mcdt */ /*sprd-audio-card,dai-link@100 { ignore-suspend = <0>; link-name = "BE_CAPTURE_DSP_USB_MCDT"; stream-name = "BE_ST_CAPTURE_DSP_USB_MCDT"; no-pcm = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 60>; }; codec { sound-dai = <0 0>; }; };*/ /* 61: be fast usb mcdt */ /*sprd-audio-card,dai-link@101 { ignore-suspend = <1>; link-name = "BE_FAST_USB_MCDT"; stream-name = "BE_ST_FAST_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 61>; }; codec { sound-dai = <0 0>; }; };*/ /* 62: be offload usb mcdt */ /*sprd-audio-card,dai-link@102 { ignore-suspend = <0>; ignore-pmdown-time = <0>; link-name = "BE_OFFLOAD_USB_MCDT"; stream-name = "BE_ST_OFFLOAD_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 62>; }; codec { sound-dai = <0 0>; }; };*/ /* 63: be voice usb mcdt */ /*sprd-audio-card,dai-link@103 { ignore-suspend = <1>; link-name = "BE_VOICE_USB_MCDT"; stream-name = "BE_ST_VOICE_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 63>; }; codec { sound-dai = <0 0>; }; };*/ /* 64: be voip usb mcdt */ /*sprd-audio-card,dai-link@104 { ignore-suspend = <1>; link-name = "BE_VOIP_USB_MCDT"; stream-name = "BE_ST_VOIP_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 64>; }; codec { sound-dai = <0 0>; }; };*/ /* 65: be fm usb mcdt */ /*sprd-audio-card,dai-link@105 { ignore-suspend = <1>; link-name = "BE_FM_USB_MCDT"; stream-name = "BE_ST_FM_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 65>; }; codec { sound-dai = <0 0>; }; };*/ /* 66: be loop usb mcdt */ /*sprd-audio-card,dai-link@106 { ignore-suspend = <1>; link-name = "BE_LOOP_USB_MCDT"; stream-name = "BE_ST_LOOP_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; dpcm-capture = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 66>; }; codec { sound-dai = <0 0>; }; };*/ /* 67: be fm dsp usb mcdt */ /*sprd-audio-card,dai-link@107 { ignore-suspend = <1>; link-name = "BE_FM_DSP_USB_MCDT"; stream-name = "BE_ST_FM_DSP_USB_MCDT"; no-pcm = <1>; dpcm-playback = <1>; be-id = <0>; plat { sound-dai = <&sprd_route_pcm>; }; cpu { sound-dai = <&vbc_v4 67>; }; codec { sound-dai = <0 0>; }; };*/ };
09-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值