DAPM event机制

概要

通过dapm事件机制,widget可以定义自己的event回调函数来监听dapm事件。

有些dapm widget和其它组件 在上下电顺序上有要求,而且这些组件电源不是通过寄存器控制或者说这些组件无法定义成widget注册到dapm框架,通过dapm机制控制其电源。可以通过dapm事件机制或amix进行控制。

例如:对于那些位于codec之外的组件,例如喇叭功放、外部的前置放大器等等,这些组件和有些widget有上下电顺序要求。由于组件不是使用codec内部的寄存器进行电源控制,无法定义成widget,我们就必须利用dapm的事件机制,获得相应的上下电事件,从而可以控制组件和widget之间的上下电顺序。

dapm widget event种类

widget event回调函数

下面的widget默认需要提供event回调函数:

这些widget都是位于codec外部的器件,它们无法使用通用的寄存器操作来控制widget的电源状态,所以需要我们提供event回调函数。

在定义snd_soc_dapm_clock_supply、snd_soc_dapm_regulator_supply、snd_soc_dapm_pinctrl类型widgets时,会默认定义相应的event回调函数。代码如下所示:

#define SND_SOC_DAPM_CLOCK_SUPPLY(wname) 
{	.id = snd_soc_dapm_clock_supply, .name = wname, 
	.reg = SND_SOC_NOPM, .event = dapm_clock_event, 
	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
#define SND_SOC_DAPM_REGULATOR_SUPPLY(wname, wdelay, wflags)	    
{	.id = snd_soc_dapm_regulator_supply, .name = wname, 
	.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, 
	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, 
	.on_val = wflags}
#define SND_SOC_DAPM_PINCTRL(wname, active, sleep) 
{	.id = snd_soc_dapm_pinctrl, .name = wname, 
	.priv = (&(struct snd_soc_dapm_pinctrl_priv) 
		{ .active_state = active, .sleep_state = sleep,}), 
	.reg = SND_SOC_NOPM, .event = dapm_pinctrl_event, 
	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }

在定义snd_soc_dapm_supply类型的widget时,可以定义event回调函数。代码如下:

#define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) 
{	.id = snd_soc_dapm_supply, .name = wname, 
	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), 
	.event = wevent, .event_flags = wflags}

注意这些硬件资源类型的widgets,是通过widget name来获取资源句柄的
supply类型widget必须添加到audio route路由表里,其event()回调函数才会被调用

原文地址:https://www.cnblogs.com/bobfly1984/p/13966732.html