文章目录
前言
前文ALSA总结中提到,ASOC中的框架有三部分,Machine、Platform以及Codec,Machine主要是注册声卡实体,Codec是针对数模设备,本文主要针对ALSA 中Platform部分简要分析。
一、Platform/cpu
一般来说,Platform driver部分主要针对dma的初始化,cpu driver主要针对I2S的初始化,但是在驱动的注册过程中,一般将这两部分的初始化放在一起进行。
static int snd_afe_i2s_sc_probe(struct platform_device *pdev)
{
//节选如下部分代码
struct device *dev = &pdev->dev;
struct sdrv_afe_i2s_sc *afe;
int ret;
struct resource *res;
unsigned int irq_id, value;
afe = devm_kzalloc(dev, sizeof(struct sdrv_afe_i2s_sc), GFP_KERNEL);
if (afe == NULL){
return -ENOMEM;
}
platform_set_drvdata(pdev, afe);//将pdev中的私有指针保存afe结构
/* Get register and print */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//获取设备树中I2S的资源
afe->regs = devm_ioremap_resource(afe->dev, res);//将物理地址转化为虚拟地址
/* Get irq and setting */
irq_id = platform_get_irq(pdev, 0);
devm_request_irq(afe->dev, irq_id, sdrv_i2s_sc_irq_handler, 0, pdev->name, (void *)afe);
devm_snd_dmaengine_pcm_register(dev, &sdrv_dmaengine_pcm_config, 0);//重点函数 Platform端 dma的初始化
memcpy(&afe->dai_drv, &snd_afe_dai_template, sizeof(struct snd_soc_dai_driver));
devm_snd_soc_register_component(dev, &snd_afe_soc_component,&afe->dai_drv,1);//重点函数 cpu端的初始化
afe_i2s_sc_config(afe);
return 0;
}
在前文中有提到,在声卡的注册过程中,会去配对已经注册的组件,则soc_probe_link_components 和 soc_probe_link_dais二个配对函数,在soc_probe_link_components中会调用platform->probe,soc_probe_link_dais中会调用cpu->probe,这二个probe则在上面代码注释中的二个重点函数中进行注册。
二、devm_snd_dmaengine_pcm_register注册函数
int devm_snd_dmaengine_pcm_register(struct device *dev,
const struct snd_dmaengine_pcm_config *config, unsigned int flags)
{
struct device **ptr;
int ret;
ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL);
if (!