ALSA声卡驱动的DAPM-基于高通平台

最近使用tinymix 调试相应的音频通道,但是一直不知道音频通道的原理是什么。所以百度了一下,百度结果是与DPAM有关。

一、DAPM简介:

DAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态下。DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core中完成。用户空间的应用程序无需对代码做出修改,也无需重新编译,DAPM根据当前激活的音频流(playback/capture)和声卡中的mixer等的配置来决定那些音频控件的电源开关被打开或关闭。

DAPM是基于kcontrol改进过后的相应框架,增加了相应的电源管理机制,其电源管理机制其实就是按照相应的音频路径,完美的对各种部件的电源进行控制,而且按照某种顺序进行。

kcontrol是什么?

http://blog.csdn.net/droidphone/article/details/12793293

二、DAPM的基本单位widget:

widget把kcontrol和动态电源管理进行了有机的结合,同时还具备音频路径的连结功能,一个widget可以与它相邻的widget有某种动态的连结关系。在DAPM框架中,widget用结构体snd_soc_dapm_widget来描述:

 1 struct snd_soc_dapm_widget {
 2         enum snd_soc_dapm_type id;    //该widget的类型值,比如snd_soc_dapm_output,snd_soc_dapm_mixer等等。
 3         const char *name;               /* widget name */
 4
 5         ......
 6         /* dapm control */
 7         int reg;                                /* negative reg = no direct dapm */
 8         unsigned char shift;                    /* bits to shift */
 9         unsigned int value;                             /* widget current value */
10         unsigned int mask;                      /* non-shifted mask */
11         ......
12
13         int (*power_check)(struct snd_soc_dapm_widget *w);
14
15         int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
16
17         /* kcontrols that relate to this widget */
18         int num_kcontrols;
19         const struct snd_kcontrol_new *kcontrol_news;
20         struct snd_kcontrol **kcontrols;
21
22         /* widget input and outputs */
23         struct list_head sources;
24         struct list_head sinks;
25         ......
26 };

2.1 widget的种类:

在DAPM框架中,把各种不同的widget划分为不同的种类,snd_soc_dapm_widget结构中的id字段用来表示该widget的种类,可选的种类都定义在一个枚举中:

1 enum snd_soc_dapm_type {......}  

下面我们逐个解释一下这些widget的种类:

 1 snd_soc_dapm_input     该widget对应一个输入引脚。
 2 snd_soc_dapm_output    该widget对应一个输出引脚。
 3 snd_soc_dapm_mux    该widget对应一个mux控件。
 4 snd_soc_dapm_virt_mux    该widget对应一个虚拟的mux控件。
 5 snd_soc_dapm_value_mux    该widget对应一个value类型的mux控件。
 6 snd_soc_dapm_mixer    该widget对应一个mixer控件。
 7 snd_soc_dapm_mixer_named_ctl    该widget对应一个mixer控件,但是对应的kcontrol的名字不会加入widget的名字作为前缀。
 8 snd_soc_dapm_pga    该widget对应一个pga控件(可编程增益控件)。
 9 snd_soc_dapm_out_drv    该widget对应一个输出驱动控件
10 snd_soc_dapm_adc    该widget对应一个ADC
11 snd_soc_dapm_dac    该widget对应一个DAC
12 snd_soc_dapm_micbias    该widget对应一个麦克风偏置电压控件
13 snd_soc_dapm_mic    该widget对应一个麦克风。
14 snd_soc_dapm_hp    该widget对应一个耳机。
15 snd_soc_dapm_spk    该widget对应一个扬声器。
16 snd_soc_dapm_line     该widget对应一个线路输入。
17 snd_soc_dapm_switch       该widget对应一个模拟开关。
18 snd_soc_dapm_vmid      该widget对应一个codec的vmid偏置电压。
19 snd_soc_dapm_pre      machine级别的专用widget,会先于其它widget执行检查操作。
20 snd_soc_dapm_post    machine级别的专用widget,会后于其它widget执行检查操作。
21 snd_soc_dapm_supply           对应一个电源或是时钟源。
22 snd_soc_dapm_regulator_supply  对应一个外部regulator稳压器。
23 snd_soc_dapm_clock_supply      对应一个外部时钟源。
24 snd_soc_dapm_aif_in            对应一个数字音频输入接口,比如I2S接口的输入端。
25 snd_soc_dapm_aif_out          对应一个数字音频输出接口,比如I2S接口的输出端。
26 snd_soc_dapm_siggen            对应一个信号发生器。
27 snd_soc_dapm_dai_in           对应一个platform或codec域的输入DAI结构。
28 snd_soc_dapm_dai_out        对应一个platform或codec域的输出DAI结构。
29 snd_soc_dapm_dai_link         用于链接一对输入/输出DAI结构。

2.2 widget之间的连接器path:

DAPM为我们提出了path这一概念,path相当于电路中的一根跳线,它把一个widget的输出端和另一个widget的输入端连接在一起,path用snd_soc_dapm_path结构来描述:

 1 /* dapm audio path between two widgets */
 2 struct snd_soc_dapm_path {
 3     const char *name;
 4     const char *long_name;
 5
 6     /* source (input) and sink (output) widgets */
 7     struct snd_soc_dapm_widget *source;
 8     struct snd_soc_dapm_widget *sink;
 9     struct snd_kcontrol *kcontrol;
10
11     /* status */
12     u32 connect:1;    /* source and sink widgets are connected */
13     u32 walked:1;    /* path has been walked */
14     u32 walking:1;  /* path is in the process of being walked */
15     u32 weak:1;    /* path ignored for power management */
16
17     int (*connected)(struct snd_soc_dapm_widget *source,
18              struct snd_soc_dapm_widget *sink);
19
20     struct list_head list_source;
21     struct list_head list_sink;
22     struct list_head list;
23 };

path与widget的关系如下图:

2.3 widget的连接关系route:

1 struct snd_soc_dapm_route {
2         const char *sink;
3         const char *control;
4         const char *source;
5         int (*connected)(struct snd_soc_dapm_widget *source,
6                          struct snd_soc_dapm_widget *sink);
7 };  

sink指向到达端widget的名字字符串,source指向起始端widget的名字字符串,control指向负责控制该连接所对应的kcontrol名字字符串,connected回调则定义了上一节所提到的自定义连接检查回调函数。该结构的意义很明显就是:source通过一个kcontrol,和sink连接在一起,现在是否处于连接状态,请调用connected回调函数检查。

2.4 如何定义各种widget:

和普通的kcontrol一样,DAPM框架为我们提供了大量的辅助宏用来定义各种各样的widget控件,这些宏定义根据widget的类型,按照它们的电源所在的域,被分为了几个域,他们分别是:

  • codec域     比如VREF和VMID等提供参考电压的widget,这些widget通常在codec的probe/remove回调中进行控制,当然,在工作中如果没有音频流时,也可以适当地进行控制它们的开启与关闭。
  • platform域    位于该域上的widget通常是针对平台或板子的一些需要物理连接的输入/输出接口,例如耳机、扬声器、麦克风,因为这些接口在每块板子上都可能不一样,所以通常它们是在machine驱动中进行定义和控制,并且也可以由用户空间的应用程序通过某种方式来控制它们的打开和关闭。
  • 音频路径域    一般是指codec内部的mixer、mux等控制音频路径的widget,这些widget可以根据用户空间的设定连接关系,自动设定他们的电源状态。
  • 音频数据流域    是指那些需要处理音频数据流的widget,例如ADC、DAC等等。

codec域widget的定义

目前,DAPM框架只提供了定义一个codec域widget的辅助宏:

1 #define SND_SOC_DAPM_VMID(wname) \
2 {       .id = snd_soc_dapm_vmid, .name = wname, .kcontrol_news = NULL, \
3         .num_kcontrols = 0}  

platform域widget的定义

DAPM框架为我们提供了多种platform域widget的辅助定义宏:

 1 #define SND_SOC_DAPM_SIGGEN(wname) \
 2 {       .id = snd_soc_dapm_siggen, .name = wname, .kcontrol_news = NULL, \
 3         .num_kcontrols = 0, .reg = SND_SOC_NOPM }
 4 #define SND_SOC_DAPM_INPUT(wname) \
 5 {       .id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \
 6         .num_kcontrols = 0, .reg = SND_SOC_NOPM }
 7 #define SND_SOC_DAPM_OUTPUT(wname) \
 8 {       .id = snd_soc_dapm_output, .name = wname, .kcontrol_news = NULL, \
 9         .num_kcontrols = 0, .reg = SND_SOC_NOPM }
10 #define SND_SOC_DAPM_MIC(wname, wevent) \
11 {       .id = snd_soc_dapm_mic, .name = wname, .kcontrol_news = NULL, \
12         .num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
13         .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
14 #define SND_SOC_DAPM_HP(wname, wevent) \
15 {       .id = snd_soc_dapm_hp, .name = wname, .kcontrol_news = NULL, \
16         .num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
17         .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
18 #define SND_SOC_DAPM_SPK(wname, wevent) \
19 {       .id = snd_soc_dapm_spk, .name = wname, .kcontrol_news = NULL, \
20         .num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
21         .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
22 #define SND_SOC_DAPM_LINE(wname, wevent) \
23 {       .id = snd_soc_dapm_line, .name = wname, .kcontrol_news = NULL, \
24         .num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
25         .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD} 

音频路径(path)域widget的定义

这种widget通常是对普通kcontrols控件的再封装,增加音频路径和电源管理功能,所以这种widget会包含一个或多个kcontrol。

 1 #define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\
 2          wcontrols, wncontrols) \
 3 {       .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
 4         .invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
 5 #define SND_SOC_DAPM_OUT_DRV(wname, wreg, wshift, winvert,\
 6          wcontrols, wncontrols) \
 7 {       .id = snd_soc_dapm_out_drv, .name = wname, .reg = wreg, .shift = wshift, \
 8         .invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
 9 #define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
10          wcontrols, wncontrols)\
11 {       .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
12         .invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
13 #define SND_SOC_DAPM_MIXER_NAMED_CTL(wname, wreg, wshift, winvert, \
14          wcontrols, wncontrols)\
15 {       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \
16         .shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \
17         .num_kcontrols = wncontrols}
18 #define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \
19 {       .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
20         .invert = winvert, .kcontrol_news = NULL, .num_kcontrols = 0}
21 #define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \
22 {       .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
23         .invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}
24 #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
25 {       .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
26         .invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}
27 #define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \
28 {       .id = snd_soc_dapm_virt_mux, .name = wname, .reg = wreg, .shift = wshift, \
29         .invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}
30 #define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \
31 {       .id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \
32         .shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \
33         .num_kcontrols = 1}  

音频数据流(stream)域widget的定义

这些widget主要包含音频输入/输出接口,ADC/DAC等等:

 1 #define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert)  2 {       .id = snd_soc_dapm_aif_in, .name = wname, .sname = stname,  3         .reg = wreg, .shift = wshift, .invert = winvert }
 4 #define SND_SOC_DAPM_AIF_IN_E(wname, stname, wslot, wreg, wshift, winvert,  5                               wevent, wflags)                            6 {       .id = snd_soc_dapm_aif_in, .name = wname, .sname = stname,  7         .reg = wreg, .shift = wshift, .invert = winvert,  8         .event = wevent, .event_flags = wflags }
 9 #define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert) 10 {       .id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, 11         .reg = wreg, .shift = wshift, .invert = winvert }
12 #define SND_SOC_DAPM_AIF_OUT_E(wname, stname, wslot, wreg, wshift, winvert, 13                              wevent, wflags)                            14 {       .id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, 15         .reg = wreg, .shift = wshift, .invert = winvert, 16         .event = wevent, .event_flags = wflags }
17 #define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) 18 {       .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, 19         .shift = wshift, .invert = winvert}
20 #define SND_SOC_DAPM_DAC_E(wname, stname, wreg, wshift, winvert, 21                            wevent, wflags)                              22 {       .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, 23         .shift = wshift, .invert = winvert, 24         .event = wevent, .event_flags = wflags}
25 #define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) 26 {       .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, 27         .shift = wshift, .invert = winvert}
28 #define SND_SOC_DAPM_ADC_E(wname, stname, wreg, wshift, winvert, 29                            wevent, wflags)                              30 {       .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, 31         .shift = wshift, .invert = winvert, 32         .event = wevent, .event_flags = wflags}
33 #define SND_SOC_DAPM_CLOCK_SUPPLY(wname) 34 {       .id = snd_soc_dapm_clock_supply, .name = wname, 35         .reg = SND_SOC_NOPM, .event = dapm_clock_event, 36         .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }

2.5 dapm kcontrol:

dapm kcontrol是widget的开关,info函数是显示widget的函数,put是设置,get是获取;

三、建立widget和route:

以我们打开音频tinymix ‘PRI_MI2S_RX Audio Mixer MultiMedia1’ 1 为例子来了解整个过程:

3.1 利用辅助宏定义widget所需要的dapm kcontrol:

 1 static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
 2     SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_MI2S_RX ,
 3     MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
 4     msm_routing_put_audio_mixer),
 5     SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_PRI_MI2S_RX,
 6     MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
 7     msm_routing_put_audio_mixer),
 8     SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_PRI_MI2S_RX,
 9     MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
10     msm_routing_put_audio_mixer),
11     SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_PRI_MI2S_RX,
12     MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
13     msm_routing_put_audio_mixer),
14     SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_PRI_MI2S_RX,
15     MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
16     msm_routing_put_audio_mixer),
17     SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_PRI_MI2S_RX,
18     MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
19     msm_routing_put_audio_mixer),
20     SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_PRI_MI2S_RX,
21     MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
22     msm_routing_put_audio_mixer),
23     SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_PRI_MI2S_RX,
24     MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
25     msm_routing_put_audio_mixer),
26     SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_PRI_MI2S_RX,
27     MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
28     msm_routing_put_audio_mixer),
29 };
 1 static const struct snd_kcontrol_new primary_mi2s_rx_port_mixer_controls[] = {
 2     SOC_SINGLE_EXT("SEC_MI2S_TX", MSM_BACKEND_DAI_PRI_MI2S_RX,
 3     MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
 4     msm_routing_put_port_mixer),
 5     SOC_SINGLE_EXT("TERT_MI2S_TX", MSM_BACKEND_DAI_PRI_MI2S_RX,
 6     MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
 7     msm_routing_put_port_mixer),
 8     SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_PRI_MI2S_RX,
 9     MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
10     msm_routing_put_port_mixer),
11     SOC_SINGLE_EXT("QUAT_MI2S_TX", MSM_BACKEND_DAI_PRI_MI2S_RX,
12     MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
13     msm_routing_put_port_mixer),
14     SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_PRI_MI2S_RX,
15     MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
16     msm_routing_put_port_mixer),
17 };

以上我们定义了prior通道的控件和MultiMedia1数据流通道;

3.2 定义真正的widget,包含第一步定义好的dapm控件:

  1 static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
  2     /* Frontend AIF */
  3     /* Widget name equals to Front-End DAI name<Need confirmation>,
  4      * Stream name must contains substring of front-end dai name
  5      */
  6     SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0),
  7     SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0),
  8     SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0),
  9     SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0),
 10     SND_SOC_DAPM_AIF_IN("MM_DL5", "MultiMedia5 Playback", 0, 0, 0, 0),
 11     SND_SOC_DAPM_AIF_IN("MM_DL6", "MultiMedia6 Playback", 0, 0, 0, 0),
 12     SND_SOC_DAPM_AIF_IN("MM_DL7", "MultiMedia7 Playback", 0, 0, 0, 0),
 13     SND_SOC_DAPM_AIF_IN("MM_DL8", "MultiMedia8 Playback", 0, 0, 0, 0),
 14     SND_SOC_DAPM_AIF_IN("MM_DL9", "MultiMedia9 Playback", 0, 0, 0, 0),
 15     SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
 16     SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
 17     SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
 18     SND_SOC_DAPM_AIF_OUT("MM_UL4", "MultiMedia4 Capture", 0, 0, 0, 0),
 19     SND_SOC_DAPM_AIF_OUT("MM_UL5", "MultiMedia5 Capture", 0, 0, 0, 0),
 20     SND_SOC_DAPM_AIF_OUT("MM_UL6", "MultiMedia6 Capture", 0, 0, 0, 0),
 21     SND_SOC_DAPM_AIF_OUT("MM_UL8", "MultiMedia8 Capture", 0, 0, 0, 0),
 22     SND_SOC_DAPM_AIF_OUT("MM_UL9", "MultiMedia9 Capture", 0, 0, 0, 0),
 23     SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, 0, 0, 0),
 24     SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
 25     SND_SOC_DAPM_AIF_IN("VOICE2_DL", "Voice2 Playback", 0, 0, 0, 0),
 26     SND_SOC_DAPM_AIF_OUT("VOICE2_UL", "Voice2 Capture", 0, 0, 0, 0),
 27     SND_SOC_DAPM_AIF_IN("VoLTE_DL", "VoLTE Playback", 0, 0, 0, 0),
 28     SND_SOC_DAPM_AIF_OUT("VoLTE_UL", "VoLTE Capture", 0, 0, 0, 0),
 29     SND_SOC_DAPM_AIF_IN("VoWLAN_DL", "VoWLAN Playback", 0, 0, 0, 0),
 30     SND_SOC_DAPM_AIF_OUT("VoWLAN_UL", "VoWLAN Capture", 0, 0, 0, 0),
 31     SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
 32     SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
 33         0, 0, 0, 0),
 34     SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture",
 35         0, 0, 0, 0),
 36     SND_SOC_DAPM_AIF_IN("SLIM1_DL_HL", "SLIMBUS1_HOSTLESS Playback",
 37         0, 0, 0, 0),
 38     SND_SOC_DAPM_AIF_OUT("SLIM1_UL_HL", "SLIMBUS1_HOSTLESS Capture",
 39         0, 0, 0, 0),
 40     SND_SOC_DAPM_AIF_IN("SLIM3_DL_HL", "SLIMBUS3_HOSTLESS Playback",
 41         0, 0, 0, 0),
 42     SND_SOC_DAPM_AIF_OUT("SLIM3_UL_HL", "SLIMBUS3_HOSTLESS Capture",
 43         0, 0, 0, 0),
 44     SND_SOC_DAPM_AIF_IN("SLIM4_DL_HL", "SLIMBUS4_HOSTLESS Playback",
 45         0, 0, 0, 0),
 46     SND_SOC_DAPM_AIF_OUT("SLIM4_UL_HL", "SLIMBUS4_HOSTLESS Capture",
 47         0, 0, 0, 0),
 48     SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback",
 49         0, 0, 0, 0),
 50     SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture",
 51         0, 0, 0, 0),
 52     SND_SOC_DAPM_AIF_IN("INTHFP_DL_HL", "INT_HFP_BT_HOSTLESS Playback",
 53         0, 0, 0, 0),
 54     SND_SOC_DAPM_AIF_OUT("INTHFP_UL_HL", "INT_HFP_BT_HOSTLESS Capture",
 55         0, 0, 0, 0),
 56     SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0),
 57     SND_SOC_DAPM_AIF_IN("SEC_I2S_DL_HL", "SEC_I2S_RX_HOSTLESS Playback",
 58         0, 0, 0, 0),
 59     SND_SOC_DAPM_AIF_IN("PRI_MI2S_DL_HL",
 60         "Primary MI2S_RX Hostless Playback",
 61         0, 0, 0, 0),
 62     SND_SOC_DAPM_AIF_IN("SEC_MI2S_DL_HL",
 63         "Secondary MI2S_RX Hostless Playback",
 64         0, 0, 0, 0),
 65
 66     SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
 67         0, 0, 0, 0),
 68     SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture",
 69         0, 0, 0, 0),
 70     SND_SOC_DAPM_AIF_OUT("MI2S_UL_HL", "MI2S_TX_HOSTLESS Capture",
 71         0, 0, 0, 0),
 72     SND_SOC_DAPM_AIF_OUT("TERT_MI2S_UL_HL",
 73         "Tertiary MI2S_TX Hostless Capture",
 74         0, 0, 0, 0),
 75     SND_SOC_DAPM_AIF_OUT("PRI_MI2S_UL_HL",
 76         "Primary MI2S_TX Hostless Capture",
 77         0, 0, 0, 0),
 78     SND_SOC_DAPM_AIF_OUT("MI2S_DL_HL", "MI2S_RX_HOSTLESS Playback",
 79         0, 0, 0, 0),
 80     SND_SOC_DAPM_AIF_IN("DTMF_DL_HL", "DTMF_RX_HOSTLESS Playback",
 81         0, 0, 0, 0),
 82     /* LSM */
 83     SND_SOC_DAPM_AIF_OUT("LSM1_UL_HL", "Listen 1 Audio Service Capture",
 84                  0, 0, 0, 0),
 85     SND_SOC_DAPM_AIF_OUT("LSM2_UL_HL", "Listen 2 Audio Service Capture",
 86                  0, 0, 0, 0),
 87     SND_SOC_DAPM_AIF_OUT("LSM3_UL_HL", "Listen 3 Audio Service Capture",
 88                  0, 0, 0, 0),
 89     SND_SOC_DAPM_AIF_OUT("LSM4_UL_HL", "Listen 4 Audio Service Capture",
 90                          0, 0, 0, 0),
 91     SND_SOC_DAPM_AIF_OUT("LSM5_UL_HL", "Listen 5 Audio Service Capture",
 92                  0, 0, 0, 0),
 93     SND_SOC_DAPM_AIF_OUT("LSM6_UL_HL", "Listen 6 Audio Service Capture",
 94                  0, 0, 0, 0),
 95     SND_SOC_DAPM_AIF_OUT("LSM7_UL_HL", "Listen 7 Audio Service Capture",
 96                  0, 0, 0, 0),
 97     SND_SOC_DAPM_AIF_OUT("LSM8_UL_HL", "Listen 8 Audio Service Capture",
 98                  0, 0, 0, 0),
 99     SND_SOC_DAPM_AIF_IN("QCHAT_DL", "QCHAT Playback", 0, 0, 0, 0),
100     SND_SOC_DAPM_AIF_OUT("QCHAT_UL", "QCHAT Capture", 0, 0, 0, 0),
101     /* Backend AIF */
102     /* Stream name equals to backend dai link stream name
103     */
104     SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0),
105     SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback",
106                 0, 0, 0 , 0),
107     SND_SOC_DAPM_AIF_OUT("SPDIF_RX", "SPDIF Playback", 0, 0, 0 , 0),
108     SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0),
109     SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0 , 0),
110     SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0),
111     SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX", "Quaternary MI2S Playback",
112                         0, 0, 0, 0),
113     SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX", "Tertiary MI2S Playback",
114                         0, 0, 0, 0),
115     SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX", "Secondary MI2S Playback",
116                  0, 0, 0, 0),
117     SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_SD1",
118             "Secondary MI2S Playback SD1",
119             0, 0, 0, 0),
120     SND_SOC_DAPM_AIF_OUT("PRI_MI2S_RX", "Primary MI2S Playback",
121                  0, 0, 0, 0),
122     SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
123     SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0),
124     SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX", "Quaternary MI2S Capture",
125                         0, 0, 0, 0),
126     SND_SOC_DAPM_AIF_IN("PRI_MI2S_TX", "Primary MI2S Capture",
127                 0, 0, 0, 0),
128     SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX", "Tertiary MI2S Capture",
129                         0, 0, 0, 0),
130     SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX", "Secondary MI2S Capture",
131                 0, 0, 0, 0),
132     SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0),
133     SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback",
134                 0, 0, 0 , 0),
135     SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
136                 0, 0, 0, 0),
137     SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
138                 0, 0, 0 , 0),
139     SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
140                 0, 0, 0, 0),
141     SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback",
142                 0, 0, 0 , 0),
143     SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
144                 0, 0, 0 , 0),
145     /* incall */
146     SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
147                 0, 0, 0 , 0),
148     SND_SOC_DAPM_AIF_OUT("VOICE2_PLAYBACK_TX", "Voice2 Farend Playback",
149                 0, 0, 0 , 0),
150     SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback",
151                 0, 0, 0 , 0),
152     SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture",
153                 0, 0, 0, 0),
154     SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture",
155                 0, 0, 0, 0),
156     SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
157                 0, 0, 0, 0),
158     SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0),
159
160     SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
161     SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
162     SND_SOC_DAPM_AIF_OUT("SEC_AUX_PCM_RX", "Sec AUX PCM Playback",
163                 0, 0, 0, 0),
164     SND_SOC_DAPM_AIF_IN("SEC_AUX_PCM_TX", "Sec AUX PCM Capture",
165                 0, 0, 0, 0),
166     SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
167     SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
168     SND_SOC_DAPM_AIF_IN("VOICE2_STUB_DL", "VOICE2_STUB Playback",
169                 0, 0, 0, 0),
170     SND_SOC_DAPM_AIF_OUT("VOICE2_STUB_UL", "VOICE2_STUB Capture",
171                 0, 0, 0, 0),
172     SND_SOC_DAPM_AIF_IN("VOLTE_STUB_DL", "VOLTE_STUB Playback", 0, 0, 0, 0),
173     SND_SOC_DAPM_AIF_OUT("VOLTE_STUB_UL", "VOLTE_STUB Capture", 0, 0, 0, 0),
174     SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0),
175     SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0),
176     SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0),
177     SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0),
178     SND_SOC_DAPM_AIF_IN("STUB_1_TX", "Stub1 Capture", 0, 0, 0, 0),
179     SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0),
180     SND_SOC_DAPM_AIF_IN("SLIMBUS_3_TX", "Slimbus3 Capture", 0, 0, 0, 0),
181     /* In- call recording */
182     SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_RX", "Slimbus6 Playback", 0, 0, 0 , 0),
183     SND_SOC_DAPM_AIF_IN("SLIMBUS_6_TX", "Slimbus6 Capture", 0, 0, 0, 0),
184
185     /* Switch Definitions */
186     SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
187                 &slim_fm_switch_mixer_controls),
188     SND_SOC_DAPM_SWITCH("SLIMBUS1_DL_HL", SND_SOC_NOPM, 0, 0,
189                 &slim1_fm_switch_mixer_controls),
190     SND_SOC_DAPM_SWITCH("SLIMBUS3_DL_HL", SND_SOC_NOPM, 0, 0,
191                 &slim3_fm_switch_mixer_controls),
192     SND_SOC_DAPM_SWITCH("SLIMBUS4_DL_HL", SND_SOC_NOPM, 0, 0,
193                 &slim4_fm_switch_mixer_controls),
194     SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0,
195                 &pcm_rx_switch_mixer_controls),
196     SND_SOC_DAPM_SWITCH("PRI_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0,
197                 &pri_mi2s_rx_switch_mixer_controls),
198
199     /* Mux Definitions */
200     SND_SOC_DAPM_MUX("LSM1 MUX", SND_SOC_NOPM, 0, 0, &lsm1_mux),
201     SND_SOC_DAPM_MUX("LSM2 MUX", SND_SOC_NOPM, 0, 0, &lsm2_mux),
202     SND_SOC_DAPM_MUX("LSM3 MUX", SND_SOC_NOPM, 0, 0, &lsm3_mux),
203     SND_SOC_DAPM_MUX("LSM4 MUX", SND_SOC_NOPM, 0, 0, &lsm4_mux),
204     SND_SOC_DAPM_MUX("LSM5 MUX", SND_SOC_NOPM, 0, 0, &lsm5_mux),
205     SND_SOC_DAPM_MUX("LSM6 MUX", SND_SOC_NOPM, 0, 0, &lsm6_mux),
206     SND_SOC_DAPM_MUX("LSM7 MUX", SND_SOC_NOPM, 0, 0, &lsm7_mux),
207     SND_SOC_DAPM_MUX("LSM8 MUX", SND_SOC_NOPM, 0, 0, &lsm8_mux),
208     SND_SOC_DAPM_MUX("SLIM_0_RX AANC MUX", SND_SOC_NOPM, 0, 0,
209             aanc_slim_0_rx_mux),
210
211     /* Mixer definitions */
212     SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
213     pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
214     SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
215     sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)),
216     SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
217     slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)),
218     SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
219     hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
220     SND_SOC_DAPM_MIXER("SPDIF_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
221     spdif_rx_mixer_controls, ARRAY_SIZE(spdif_rx_mixer_controls)),
222     SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
223     mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)),
224     SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
225                 quaternary_mi2s_rx_mixer_controls,
226                 ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
227     SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
228                 tertiary_mi2s_rx_mixer_controls,
229                 ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
230     SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
231                secondary_mi2s_rx_mixer_controls,
232                ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
233     SND_SOC_DAPM_MIXER("SEC_MI2S_RX_SD1 Audio Mixer", SND_SOC_NOPM, 0, 0,
234                secondary_mi2s_rx2_mixer_controls,
235                ARRAY_SIZE(secondary_mi2s_rx2_mixer_controls)),
236     SND_SOC_DAPM_MIXER("SEC_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
237                mi2s_hl_mixer_controls,
238                ARRAY_SIZE(mi2s_hl_mixer_controls)),
239     SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
240                primary_mi2s_rx_mixer_controls,
241                ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
242     SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
243     mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
244     SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
245     mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
246     SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
247     mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
248     SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
249     mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
250     SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
251     mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
252     SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
253     mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
254     SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
255     auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
256     SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
257     sec_auxpcm_rx_mixer_controls, ARRAY_SIZE(sec_auxpcm_rx_mixer_controls)),
258     /* incall */
259     SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
260     incall_music_delivery_mixer_controls,
261     ARRAY_SIZE(incall_music_delivery_mixer_controls)),
262     SND_SOC_DAPM_MIXER("Incall_Music_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
263     incall_music2_delivery_mixer_controls,
264     ARRAY_SIZE(incall_music2_delivery_mixer_controls)),
265     SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
266     slimbus_4_rx_mixer_controls,
267     ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
268     SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
269     slimbus_6_rx_mixer_controls,
270     ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
271     /* Voice Mixer */
272     SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer",
273                 SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls,
274                 ARRAY_SIZE(pri_rx_voice_mixer_controls)),
275     SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer",
276                 SND_SOC_NOPM, 0, 0,
277                 sec_i2s_rx_voice_mixer_controls,
278                 ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)),
279     SND_SOC_DAPM_MIXER("SEC_MI2S_RX_Voice Mixer",
280                 SND_SOC_NOPM, 0, 0,
281                 sec_mi2s_rx_voice_mixer_controls,
282                 ARRAY_SIZE(sec_mi2s_rx_voice_mixer_controls)),
283     SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer",
284                 SND_SOC_NOPM, 0, 0,
285                 slimbus_rx_voice_mixer_controls,
286                 ARRAY_SIZE(slimbus_rx_voice_mixer_controls)),
287     SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer",
288                 SND_SOC_NOPM, 0, 0,
289                 bt_sco_rx_voice_mixer_controls,
290                 ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)),
291     SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer",
292                 SND_SOC_NOPM, 0, 0,
293                 afe_pcm_rx_voice_mixer_controls,
294                 ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)),
295     SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer",
296                 SND_SOC_NOPM, 0, 0,
297                 aux_pcm_rx_voice_mixer_controls,
298                 ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)),
299     SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX_Voice Mixer",
300                   SND_SOC_NOPM, 0, 0,
301                   sec_aux_pcm_rx_voice_mixer_controls,
302                   ARRAY_SIZE(sec_aux_pcm_rx_voice_mixer_controls)),
303     SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
304                 SND_SOC_NOPM, 0, 0,
305                 hdmi_rx_voice_mixer_controls,
306                 ARRAY_SIZE(hdmi_rx_voice_mixer_controls)),
307     SND_SOC_DAPM_MIXER("MI2S_RX_Voice Mixer",
308                 SND_SOC_NOPM, 0, 0,
309                 mi2s_rx_voice_mixer_controls,
310                 ARRAY_SIZE(mi2s_rx_voice_mixer_controls)),
311     SND_SOC_DAPM_MIXER("PRI_MI2S_RX_Voice Mixer",
312                 SND_SOC_NOPM, 0, 0,
313                 pri_mi2s_rx_voice_mixer_controls,
314                 ARRAY_SIZE(pri_mi2s_rx_voice_mixer_controls)),
315     SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_Voice Mixer",
316                 SND_SOC_NOPM, 0, 0,
317                 quat_mi2s_rx_voice_mixer_controls,
318                 ARRAY_SIZE(quat_mi2s_rx_voice_mixer_controls)),
319     SND_SOC_DAPM_MIXER("Voice_Tx Mixer",
320                 SND_SOC_NOPM, 0, 0, tx_voice_mixer_controls,
321                 ARRAY_SIZE(tx_voice_mixer_controls)),
322     SND_SOC_DAPM_MIXER("Voice2_Tx Mixer",
323                SND_SOC_NOPM, 0, 0, tx_voice2_mixer_controls,
324                ARRAY_SIZE(tx_voice2_mixer_controls)),
325     SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
326                 SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
327                 ARRAY_SIZE(tx_voip_mixer_controls)),
328     SND_SOC_DAPM_MIXER("VoLTE_Tx Mixer",
329                 SND_SOC_NOPM, 0, 0, tx_volte_mixer_controls,
330                 ARRAY_SIZE(tx_volte_mixer_controls)),
331     SND_SOC_DAPM_MIXER("VoWLAN_Tx Mixer",
332                 SND_SOC_NOPM, 0, 0, tx_vowlan_mixer_controls,
333                 ARRAY_SIZE(tx_vowlan_mixer_controls)),
334     SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
335     int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
336     SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
337     int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
338     SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
339     afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
340     SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
341     tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)),
342     SND_SOC_DAPM_MIXER("Voice2 Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
343                tx_voice2_stub_mixer_controls,
344                ARRAY_SIZE(tx_voice2_stub_mixer_controls)),
345     SND_SOC_DAPM_MIXER("VoLTE Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
346     tx_volte_stub_mixer_controls, ARRAY_SIZE(tx_volte_stub_mixer_controls)),
347     SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0,
348     stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)),
349     SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0,
350     slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
351     SND_SOC_DAPM_MIXER("SLIMBUS_3_RX_Voice Mixer", SND_SOC_NOPM, 0, 0,
352     slimbus_3_rx_mixer_controls, ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
353     SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer",
354     SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls,
355     ARRAY_SIZE(sbus_0_rx_port_mixer_controls)),
356     SND_SOC_DAPM_MIXER("AUX_PCM_RX Port Mixer",
357     SND_SOC_NOPM, 0, 0, aux_pcm_rx_port_mixer_controls,
358     ARRAY_SIZE(aux_pcm_rx_port_mixer_controls)),
359     SND_SOC_DAPM_MIXER("SEC_AUXPCM_RX Port Mixer",
360     SND_SOC_NOPM, 0, 0, sec_auxpcm_rx_port_mixer_controls,
361     ARRAY_SIZE(sec_auxpcm_rx_port_mixer_controls)),
362     SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0,
363     sbus_1_rx_port_mixer_controls,
364     ARRAY_SIZE(sbus_1_rx_port_mixer_controls)),
365     SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0,
366     bt_sco_rx_port_mixer_controls,
367     ARRAY_SIZE(bt_sco_rx_port_mixer_controls)),
368     SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer",
369     SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls,
370     ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)),
371     SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer",
372     SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls,
373     ARRAY_SIZE(hdmi_rx_port_mixer_controls)),
374     SND_SOC_DAPM_MIXER("SEC_I2S_RX Port Mixer",
375     SND_SOC_NOPM, 0, 0, sec_i2s_rx_port_mixer_controls,
376     ARRAY_SIZE(sec_i2s_rx_port_mixer_controls)),
377     SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Port Mixer",
378     SND_SOC_NOPM, 0, 0, sbus_3_rx_port_mixer_controls,
379     ARRAY_SIZE(sbus_3_rx_port_mixer_controls)),
380     SND_SOC_DAPM_MIXER("MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
381     mi2s_rx_port_mixer_controls, ARRAY_SIZE(mi2s_rx_port_mixer_controls)),
382     SND_SOC_DAPM_MIXER("PRI_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
383     primary_mi2s_rx_port_mixer_controls,
384     ARRAY_SIZE(primary_mi2s_rx_port_mixer_controls)),
385     SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
386     quat_mi2s_rx_port_mixer_controls,
387     ARRAY_SIZE(quat_mi2s_rx_port_mixer_controls)),
388     SND_SOC_DAPM_MIXER("QCHAT_Tx Mixer",
389     SND_SOC_NOPM, 0, 0, tx_qchat_mixer_controls,
390     ARRAY_SIZE(tx_qchat_mixer_controls)),
391     /* Virtual Pins to force backends ON atm */
392     SND_SOC_DAPM_OUTPUT("BE_OUT"),
393     SND_SOC_DAPM_INPUT("BE_IN"),
394
395     SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0,
396                 &slim0_rx_vi_fb_lch_mux),
397     SND_SOC_DAPM_MUX("VOC_EXT_EC MUX", SND_SOC_NOPM, 0, 0,
398              &voc_ext_ec_mux),
399     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL1 MUX", SND_SOC_NOPM, 0, 0,
400         &ext_ec_ref_mux_ul1),
401     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL2 MUX", SND_SOC_NOPM, 0, 0,
402         &ext_ec_ref_mux_ul2),
403     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL4 MUX", SND_SOC_NOPM, 0, 0,
404         &ext_ec_ref_mux_ul4),
405     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL5 MUX", SND_SOC_NOPM, 0, 0,
406         &ext_ec_ref_mux_ul5),
407     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL6 MUX", SND_SOC_NOPM, 0, 0,
408         &ext_ec_ref_mux_ul6),
409     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL8 MUX", SND_SOC_NOPM, 0, 0,
410         &ext_ec_ref_mux_ul8),
411     SND_SOC_DAPM_MUX("AUDIO_REF_EC_UL9 MUX", SND_SOC_NOPM, 0, 0,
412         &ext_ec_ref_mux_ul9),
413 };

msm_qdsp6_widgets

这一步定义了PRI_RX Audio Mixer,因为传入了SND_SOC_NOPM参数,pri_i2s_rx_mixer_controls则是宏定义传入kcontrol_news的参数,从而将kcontrol与widget连接起来;

3.3 定义这些widget的连接路径:

  1 static const struct snd_soc_dapm_route intercon[] = {
  2     {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
  3     {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
  4     {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
  5     {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
  6     {"PRI_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
  7     {"PRI_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
  8     {"PRI_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
  9     {"PRI_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
 10     {"PRI_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
 11     {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
 12
 13     {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 14     {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 15     {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
 16     {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
 17     {"SEC_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
 18     {"SEC_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
 19     {"SEC_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
 20     {"SEC_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
 21     {"SEC_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
 22     {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
 23
 24     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 25     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 26     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
 27     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
 28     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
 29     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
 30     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
 31     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
 32     {"SLIMBUS_0_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
 33     {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
 34
 35     {"HDMI Mixer", "MultiMedia1", "MM_DL1"},
 36     {"HDMI Mixer", "MultiMedia2", "MM_DL2"},
 37     {"HDMI Mixer", "MultiMedia3", "MM_DL3"},
 38     {"HDMI Mixer", "MultiMedia4", "MM_DL4"},
 39     {"HDMI Mixer", "MultiMedia5", "MM_DL5"},
 40     {"HDMI Mixer", "MultiMedia6", "MM_DL6"},
 41     {"HDMI Mixer", "MultiMedia7", "MM_DL7"},
 42     {"HDMI Mixer", "MultiMedia8", "MM_DL8"},
 43     {"HDMI Mixer", "MultiMedia9", "MM_DL9"},
 44     {"HDMI", NULL, "HDMI Mixer"},
 45
 46     {"SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 47     {"SPDIF_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 48     {"SPDIF_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
 49     {"SPDIF_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
 50     {"SPDIF_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
 51     {"SPDIF_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
 52     {"SPDIF_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
 53     {"SPDIF_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
 54     {"SPDIF_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
 55     {"SPDIF_RX", NULL, "SPDIF_RX Audio Mixer"},
 56
 57         /* incall */
 58     {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"},
 59     {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
 60     {"Incall_Music Audio Mixer", "MultiMedia5", "MM_DL5"},
 61     {"Incall_Music Audio Mixer", "MultiMedia9", "MM_DL9"},
 62     {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
 63     {"Incall_Music_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
 64     {"Incall_Music_2 Audio Mixer", "MultiMedia2", "MM_DL2"},
 65     {"Incall_Music_2 Audio Mixer", "MultiMedia5", "MM_DL5"},
 66     {"Incall_Music_2 Audio Mixer", "MultiMedia9", "MM_DL9"},
 67     {"VOICE2_PLAYBACK_TX", NULL, "Incall_Music_2 Audio Mixer"},
 68     {"SLIMBUS_4_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 69     {"SLIMBUS_4_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 70     {"SLIMBUS_4_RX", NULL, "SLIMBUS_4_RX Audio Mixer"},
 71     {"SLIMBUS_6_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 72     {"SLIMBUS_6_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 73     {"SLIMBUS_6_RX", NULL, "SLIMBUS_6_RX Audio Mixer"},
 74
 75     {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
 76     {"MultiMedia4 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
 77     {"MultiMedia8 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
 78     {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
 79     {"MultiMedia4 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
 80     {"MultiMedia8 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
 81     {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"},
 82     {"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
 83     {"MultiMedia8 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
 84     {"MultiMedia4 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
 85     {"MultiMedia8 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
 86     {"MultiMedia4 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
 87     {"MultiMedia8 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
 88     {"MultiMedia5 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
 89     {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 90     {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 91     {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
 92     {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
 93     {"MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
 94     {"MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
 95     {"MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
 96     {"MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
 97     {"MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
 98     {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
 99
100     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
101     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
102     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
103     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
104     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
105     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
106     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
107     {"QUAT_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
108     {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Audio Mixer"},
109
110     {"TERT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
111     {"TERT_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
112     {"TERT_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
113     {"TERT_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
114     {"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Audio Mixer"},
115
116     {"SEC_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
117     {"SEC_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
118     {"SEC_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
119     {"SEC_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
120     {"SEC_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
121     {"SEC_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
122     {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX Audio Mixer"},
123
124     {"SEC_MI2S_RX_SD1 Audio Mixer", "MultiMedia6", "MM_DL6"},
125     {"SEC_MI2S_RX_SD1", NULL, "SEC_MI2S_RX_SD1 Audio Mixer"},
126
127     {"SEC_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
128     {"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
129
130     {"PRI_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
131     {"PRI_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
132     {"PRI_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
133     {"PRI_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
134     {"PRI_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
135     {"PRI_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
136     {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Audio Mixer"},
137
138     {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
139     {"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"},
140     {"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
141     {"MultiMedia5 Mixer", "MI2S_TX", "MI2S_TX"},
142     {"MultiMedia1 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
143     {"MultiMedia1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
144     {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
145     {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
146     {"MultiMedia5 Mixer", "AUX_PCM_TX", "AUX_PCM_TX"},
147     {"MultiMedia1 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
148     {"MultiMedia5 Mixer", "SEC_AUX_PCM_TX", "SEC_AUX_PCM_TX"},
149     {"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
150     {"MultiMedia1 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
151     {"MultiMedia1 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
152     {"MultiMedia6 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
153     {"MultiMedia6 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
154
155     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
156     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
157     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
158     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
159     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
160     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
161     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
162     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
163     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
164     {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_UL6"},
165     {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
166
167     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
168     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
169     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
170     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
171     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
172     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
173     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
174     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
175     {"INTERNAL_FM_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
176     {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"},
177
178     {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
179     {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
180     {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
181     {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
182     {"AFE_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
183     {"AFE_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
184     {"AFE_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
185     {"AFE_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
186     {"AFE_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
187     {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
188
189     {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
190     {"MultiMedia4 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
191     {"MultiMedia5 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
192     {"MultiMedia8 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
193     {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
194     {"MultiMedia4 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
195     {"MultiMedia5 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
196     {"MultiMedia6 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
197     {"MultiMedia8 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
198
199     {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
200     {"MultiMedia4 Mixer", "AFE_PCM_TX", "PCM_TX"},
201     {"MultiMedia5 Mixer", "AFE_PCM_TX", "PCM_TX"},
202     {"MultiMedia8 Mixer", "AFE_PCM_TX", "PCM_TX"},
203     {"MM_UL1", NULL, "MultiMedia1 Mixer"},
204     {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
205     {"MM_UL2", NULL, "MultiMedia2 Mixer"},
206     {"MM_UL4", NULL, "MultiMedia4 Mixer"},
207     {"MM_UL5", NULL, "MultiMedia5 Mixer"},
208     {"MM_UL6", NULL, "MultiMedia6 Mixer"},
209     {"MM_UL8", NULL, "MultiMedia8 Mixer"},
210
211     {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
212     {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
213     {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
214     {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
215     {"AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
216     {"AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
217     {"AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
218     {"AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
219     {"AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
220     {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"},
221
222     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
223     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
224     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
225     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
226     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
227     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
228     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
229     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
230     {"SEC_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
231     {"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX Audio Mixer"},
232
233     {"MI2S_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
234     {"MI2S_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
235     {"MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
236     {"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
237     {"MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
238     {"MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
239     {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"},
240
241     {"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
242     {"PRI_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
243     {"PRI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
244     {"PRI_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
245     {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
246     {"PRI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
247     {"PRI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
248     {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
249
250     {"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
251     {"SEC_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
252     {"SEC_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
253     {"SEC_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
254     {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
255     {"SEC_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
256     {"SEC_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
257     {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
258
259     {"SEC_MI2S_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
260     {"SEC_MI2S_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
261     {"SEC_MI2S_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
262     {"SEC_MI2S_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
263     {"SEC_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
264     {"SEC_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
265     {"SEC_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
266     {"SEC_MI2S_RX", NULL, "SEC_MI2S_RX_Voice Mixer"},
267
268     {"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
269     {"SLIM_0_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
270     {"SLIM_0_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
271     {"SLIM_0_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
272     {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
273     {"SLIM_0_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
274     {"SLIM_0_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
275     {"SLIM_0_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
276     {"SLIM_0_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
277     {"SLIM_0_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
278     {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
279
280     {"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
281     {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
282     {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
283     {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
284     {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
285     {"INTERNAL_BT_SCO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
286     {"INTERNAL_BT_SCO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
287     {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
288
289     {"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
290     {"AFE_PCM_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
291     {"AFE_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
292     {"AFE_PCM_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
293     {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
294     {"AFE_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
295     {"AFE_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
296     {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
297
298     {"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
299     {"AUX_PCM_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
300     {"AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
301     {"AUX_PCM_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
302     {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
303     {"AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
304     {"AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
305     {"AUX_PCM_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
306     {"AUX_PCM_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
307     {"AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
308     {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
309
310     {"SEC_AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
311     {"SEC_AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
312     {"SEC_AUX_PCM_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
313     {"SEC_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
314     {"SEC_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
315     {"SEC_AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
316     {"SEC_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
317     {"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX_Voice Mixer"},
318
319     {"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
320     {"HDMI_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
321     {"HDMI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
322     {"HDMI_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
323     {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
324     {"HDMI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
325     {"HDMI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
326     {"HDMI", NULL, "HDMI_RX_Voice Mixer"},
327     {"HDMI", NULL, "HDMI_DL_HL"},
328
329     {"MI2S_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
330     {"MI2S_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
331     {"MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
332     {"MI2S_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
333     {"MI2S_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
334     {"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
335     {"MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
336     {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"},
337
338     {"PRI_MI2S_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
339     {"PRI_MI2S_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
340     {"PRI_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
341     {"PRI_MI2S_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
342     {"PRI_MI2S_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
343     {"PRI_MI2S_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
344     {"PRI_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
345     {"PRI_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
346     {"PRI_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
347     {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_Voice Mixer"},
348
349     {"QUAT_MI2S_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
350     {"QUAT_MI2S_RX_Voice Mixer", "Voice2", "VOICE2_DL"},
351     {"QUAT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
352     {"QUAT_MI2S_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
353     {"QUAT_MI2S_RX_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
354     {"QUAT_MI2S_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
355     {"QUAT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
356     {"QUAT_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
357     {"QUAT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
358     {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_Voice Mixer"},
359
360     {"VOC_EXT_EC MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
361     {"VOC_EXT_EC MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
362     {"VOC_EXT_EC MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
363     {"VOC_EXT_EC MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
364     {"CS-VOICE_UL1", NULL, "VOC_EXT_EC MUX"},
365     {"VOIP_UL", NULL, "VOC_EXT_EC MUX"},
366     {"VoLTE_UL", NULL, "VOC_EXT_EC MUX"},
367
368     {"AUDIO_REF_EC_UL1 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
369     {"AUDIO_REF_EC_UL1 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
370     {"AUDIO_REF_EC_UL1 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
371     {"AUDIO_REF_EC_UL1 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
372     {"AUDIO_REF_EC_UL1 MUX", "I2S_RX" , "PRI_I2S_TX"},
373     {"AUDIO_REF_EC_UL1 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
374
375     {"AUDIO_REF_EC_UL2 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
376     {"AUDIO_REF_EC_UL2 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
377     {"AUDIO_REF_EC_UL2 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
378     {"AUDIO_REF_EC_UL2 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
379     {"AUDIO_REF_EC_UL2 MUX", "I2S_RX" , "PRI_I2S_TX"},
380     {"AUDIO_REF_EC_UL2 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
381
382     {"AUDIO_REF_EC_UL4 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
383     {"AUDIO_REF_EC_UL4 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
384     {"AUDIO_REF_EC_UL4 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
385     {"AUDIO_REF_EC_UL4 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
386     {"AUDIO_REF_EC_UL4 MUX", "I2S_RX" , "PRI_I2S_TX"},
387     {"AUDIO_REF_EC_UL4 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
388
389     {"AUDIO_REF_EC_UL5 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
390     {"AUDIO_REF_EC_UL5 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
391     {"AUDIO_REF_EC_UL5 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
392     {"AUDIO_REF_EC_UL5 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
393     {"AUDIO_REF_EC_UL5 MUX", "I2S_RX" , "PRI_I2S_TX"},
394     {"AUDIO_REF_EC_UL5 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
395
396     {"AUDIO_REF_EC_UL6 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
397     {"AUDIO_REF_EC_UL6 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
398     {"AUDIO_REF_EC_UL6 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
399     {"AUDIO_REF_EC_UL6 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
400     {"AUDIO_REF_EC_UL6 MUX", "I2S_RX" , "PRI_I2S_TX"},
401     {"AUDIO_REF_EC_UL6 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
402
403     {"AUDIO_REF_EC_UL8 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
404     {"AUDIO_REF_EC_UL8 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
405     {"AUDIO_REF_EC_UL8 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
406     {"AUDIO_REF_EC_UL8 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
407     {"AUDIO_REF_EC_UL8 MUX", "I2S_RX" , "PRI_I2S_TX"},
408     {"AUDIO_REF_EC_UL8 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
409
410     {"AUDIO_REF_EC_UL9 MUX", "PRI_MI2S_TX" , "PRI_MI2S_TX"},
411     {"AUDIO_REF_EC_UL9 MUX", "SEC_MI2S_TX" , "SEC_MI2S_TX"},
412     {"AUDIO_REF_EC_UL9 MUX", "TERT_MI2S_TX" , "TERT_MI2S_TX"},
413     {"AUDIO_REF_EC_UL9 MUX", "QUAT_MI2S_TX" , "QUAT_MI2S_TX"},
414     {"AUDIO_REF_EC_UL9 MUX", "I2S_RX" , "PRI_I2S_TX"},
415     {"AUDIO_REF_EC_UL9 MUX", "SLIM_RX" , "SLIMBUS_0_TX"},
416
417     {"MM_UL1", NULL, "AUDIO_REF_EC_UL1 MUX"},
418     {"MM_UL2", NULL, "AUDIO_REF_EC_UL2 MUX"},
419     {"MM_UL4", NULL, "AUDIO_REF_EC_UL4 MUX"},
420     {"MM_UL5", NULL, "AUDIO_REF_EC_UL5 MUX"},
421     {"MM_UL6", NULL, "AUDIO_REF_EC_UL6 MUX"},
422     {"MM_UL8", NULL, "AUDIO_REF_EC_UL8 MUX"},
423     {"MM_UL9", NULL, "AUDIO_REF_EC_UL9 MUX"},
424
425     {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
426     {"Voice_Tx Mixer", "PRI_MI2S_TX_Voice", "PRI_MI2S_TX"},
427     {"Voice_Tx Mixer", "MI2S_TX_Voice", "MI2S_TX"},
428     {"Voice_Tx Mixer", "TERT_MI2S_TX_Voice", "TERT_MI2S_TX"},
429     {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
430     {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
431     {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
432     {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
433     {"Voice_Tx Mixer", "SEC_AUX_PCM_TX_Voice", "SEC_AUX_PCM_TX"},
434     {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
435
436     {"Voice2_Tx Mixer", "PRI_TX_Voice2", "PRI_I2S_TX"},
437     {"Voice2_Tx Mixer", "PRI_MI2S_TX_Voice2", "PRI_MI2S_TX"},
438     {"Voice2_Tx Mixer", "MI2S_TX_Voice2", "MI2S_TX"},
439     {"Voice2_Tx Mixer", "TERT_MI2S_TX_Voice2", "TERT_MI2S_TX"},
440     {"Voice2_Tx Mixer", "SLIM_0_TX_Voice2", "SLIMBUS_0_TX"},
441     {"Voice2_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice2", "INT_BT_SCO_TX"},
442     {"Voice2_Tx Mixer", "AFE_PCM_TX_Voice2", "PCM_TX"},
443     {"Voice2_Tx Mixer", "AUX_PCM_TX_Voice2", "AUX_PCM_TX"},
444     {"VOICE2_UL", NULL, "Voice2_Tx Mixer"},
445
446     {"VoLTE_Tx Mixer", "PRI_TX_VoLTE", "PRI_I2S_TX"},
447     {"VoLTE_Tx Mixer", "SLIM_0_TX_VoLTE", "SLIMBUS_0_TX"},
448     {"VoLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_VoLTE", "INT_BT_SCO_TX"},
449     {"VoLTE_Tx Mixer", "AFE_PCM_TX_VoLTE", "PCM_TX"},
450     {"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
451     {"VoLTE_Tx Mixer", "SEC_AUX_PCM_TX_VoLTE", "SEC_AUX_PCM_TX"},
452     {"VoLTE_Tx Mixer", "MI2S_TX_VoLTE", "MI2S_TX"},
453     {"VoLTE_Tx Mixer", "PRI_MI2S_TX_VoLTE", "PRI_MI2S_TX"},
454     {"VoLTE_Tx Mixer", "TERT_MI2S_TX_VoLTE", "TERT_MI2S_TX"},
455     {"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
456
457     {"VoWLAN_Tx Mixer", "PRI_TX_VoWLAN", "PRI_I2S_TX"},
458     {"VoWLAN_Tx Mixer", "SLIM_0_TX_VoWLAN", "SLIMBUS_0_TX"},
459     {"VoWLAN_Tx Mixer", "INTERNAL_BT_SCO_TX_VoWLAN", "INT_BT_SCO_TX"},
460     {"VoWLAN_Tx Mixer", "AFE_PCM_TX_VoWLAN", "PCM_TX"},
461     {"VoWLAN_Tx Mixer", "AUX_PCM_TX_VoWLAN", "AUX_PCM_TX"},
462     {"VoWLAN_Tx Mixer", "SEC_AUX_PCM_TX_VoWLAN", "SEC_AUX_PCM_TX"},
463     {"VoWLAN_Tx Mixer", "MI2S_TX_VoWLAN", "MI2S_TX"},
464     {"VoWLAN_Tx Mixer", "PRI_MI2S_TX_VoWLAN", "PRI_MI2S_TX"},
465     {"VoWLAN_Tx Mixer", "TERT_MI2S_TX_VoWLAN", "TERT_MI2S_TX"},
466     {"VoWLAN_UL", NULL, "VoWLAN_Tx Mixer"},
467
468     {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
469     {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"},
470     {"Voip_Tx Mixer", "TERT_MI2S_TX_Voip", "TERT_MI2S_TX"},
471     {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
472     {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"},
473     {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"},
474     {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
475     {"Voip_Tx Mixer", "SEC_AUX_PCM_TX_Voip", "SEC_AUX_PCM_TX"},
476     {"Voip_Tx Mixer", "PRI_MI2S_TX_Voip", "PRI_MI2S_TX"},
477     {"VOIP_UL", NULL, "Voip_Tx Mixer"},
478
479     {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
480     {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
481     {"SLIMBUS1_DL_HL", "Switch", "SLIM1_DL_HL"},
482     {"SLIMBUS_1_RX", NULL, "SLIMBUS1_DL_HL"},
483     {"SLIMBUS3_DL_HL", "Switch", "SLIM3_DL_HL"},
484     {"SLIMBUS_3_RX", NULL, "SLIMBUS3_DL_HL"},
485     {"SLIMBUS4_DL_HL", "Switch", "SLIM4_DL_HL"},
486     {"SLIMBUS_4_RX", NULL, "SLIMBUS4_DL_HL"},
487     {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
488     {"SLIM1_UL_HL", NULL, "SLIMBUS_1_TX"},
489     {"SLIM3_UL_HL", NULL, "SLIMBUS_3_TX"},
490     {"SLIM4_UL_HL", NULL, "SLIMBUS_4_TX"},
491
492     {"LSM1 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
493     {"LSM1 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
494     {"LSM1 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
495     {"LSM1 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
496     {"LSM1 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
497     {"LSM1 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
498     {"LSM1_UL_HL", NULL, "LSM1 MUX"},
499
500     {"LSM2 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
501     {"LSM2 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
502     {"LSM2 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
503     {"LSM2 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
504     {"LSM2 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
505     {"LSM2 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
506     {"LSM2_UL_HL", NULL, "LSM2 MUX"},
507
508
509     {"LSM3 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
510     {"LSM3 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
511     {"LSM3 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
512     {"LSM3 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
513     {"LSM3 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
514     {"LSM3 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
515     {"LSM3_UL_HL", NULL, "LSM3 MUX"},
516
517
518     {"LSM4 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
519     {"LSM4 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
520     {"LSM4 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
521     {"LSM4 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
522     {"LSM4 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
523     {"LSM4 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
524     {"LSM4_UL_HL", NULL, "LSM4 MUX"},
525
526     {"LSM5 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
527     {"LSM5 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
528     {"LSM5 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
529     {"LSM5 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
530     {"LSM5 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
531     {"LSM5 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
532     {"LSM5_UL_HL", NULL, "LSM5 MUX"},
533
534     {"LSM6 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
535     {"LSM6 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
536     {"LSM6 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
537     {"LSM6 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
538     {"LSM6 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
539     {"LSM6_UL_HL", NULL, "LSM6 MUX"},
540
541
542     {"LSM7 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
543     {"LSM7 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
544     {"LSM7 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
545     {"LSM7 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
546     {"LSM7 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
547     {"LSM7_UL_HL", NULL, "LSM7 MUX"},
548
549
550     {"LSM8 MUX", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
551     {"LSM8 MUX", "SLIMBUS_1_TX", "SLIMBUS_1_TX"},
552     {"LSM8 MUX", "SLIMBUS_3_TX", "SLIMBUS_3_TX"},
553     {"LSM8 MUX", "SLIMBUS_4_TX", "SLIMBUS_4_TX"},
554     {"LSM8 MUX", "SLIMBUS_5_TX", "SLIMBUS_5_TX"},
555     {"LSM8_UL_HL", NULL, "LSM8 MUX"},
556
557
558
559     {"QCHAT_Tx Mixer", "PRI_TX_QCHAT", "PRI_I2S_TX"},
560     {"QCHAT_Tx Mixer", "SLIM_0_TX_QCHAT", "SLIMBUS_0_TX"},
561     {"QCHAT_Tx Mixer", "INTERNAL_BT_SCO_TX_QCHAT", "INT_BT_SCO_TX"},
562     {"QCHAT_Tx Mixer", "AFE_PCM_TX_QCHAT", "PCM_TX"},
563     {"QCHAT_Tx Mixer", "AUX_PCM_TX_QCHAT", "AUX_PCM_TX"},
564     {"QCHAT_Tx Mixer", "SEC_AUX_PCM_TX_QCHAT", "SEC_AUX_PCM_TX"},
565     {"QCHAT_Tx Mixer", "MI2S_TX_QCHAT", "MI2S_TX"},
566     {"QCHAT_Tx Mixer", "PRI_MI2S_TX_QCHAT", "PRI_MI2S_TX"},
567     {"QCHAT_Tx Mixer", "TERT_MI2S_TX_QCHAT", "TERT_MI2S_TX"},
568     {"QCHAT_UL", NULL, "QCHAT_Tx Mixer"},
569
570     {"INT_FM_RX", NULL, "INTFM_DL_HL"},
571     {"INTFM_UL_HL", NULL, "INT_FM_TX"},
572     {"INTHFP_UL_HL", NULL, "INT_BT_SCO_TX"},
573     {"INT_BT_SCO_RX", NULL, "MM_DL6"},
574     {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
575     {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
576     {"MI2S_RX", NULL, "MI2S_DL_HL"},
577     {"MI2S_UL_HL", NULL, "MI2S_TX"},
578     {"PCM_RX_DL_HL", "Switch", "SLIM0_DL_HL"},
579     {"PCM_RX", NULL, "PCM_RX_DL_HL"},
580     {"PRI_MI2S_RX_DL_HL", "Switch", "PRI_MI2S_DL_HL"},
581     {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_DL_HL"},
582     {"MI2S_UL_HL", NULL, "TERT_MI2S_TX"},
583     {"TERT_MI2S_UL_HL", NULL, "TERT_MI2S_TX"},
584     {"SEC_I2S_RX", NULL, "SEC_I2S_DL_HL"},
585     {"PRI_MI2S_UL_HL", NULL, "PRI_MI2S_TX"},
586     {"SEC_MI2S_RX", NULL, "SEC_MI2S_DL_HL"},
587     {"PRI_MI2S_RX", NULL, "PRI_MI2S_DL_HL"},
588
589     {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
590     {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
591     {"SLIMBUS_0_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
592     {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
593     {"SLIMBUS_0_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
594     {"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
595     {"SLIMBUS_0_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
596     {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
597     {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
598     {"AFE_PCM_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
599     {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"},
600
601     {"AUX_PCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
602     {"AUX_PCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
603     {"AUX_PCM_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
604     {"AUX_PCM_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
605     {"AUX_PCM_RX", NULL, "AUX_PCM_RX Port Mixer"},
606
607     {"SEC_AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
608     {"SEC_AUXPCM_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
609     {"SEC_AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
610     {"SEC_AUX_PCM_RX", NULL, "SEC_AUXPCM_RX Port Mixer"},
611
612     {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
613     {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
614     {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
615     {"Voice Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"},
616     {"Voice Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
617     {"Voice Stub Tx Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
618     {"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"},
619     {"Voice Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
620     {"Voice Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
621     {"Voice Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
622     {"Voice Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"},
623     {"Voice Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"},
624     {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"},
625
626     {"VoLTE Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
627     {"VoLTE Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
628     {"VoLTE Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"},
629     {"VoLTE Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
630     {"VoLTE Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
631     {"VoLTE Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"},
632     {"VoLTE Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"},
633     {"VoLTE Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
634     {"VoLTE Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
635     {"VOLTE_STUB_UL", NULL, "VoLTE Stub Tx Mixer"},
636
637     {"Voice2 Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
638     {"Voice2 Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
639     {"Voice2 Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"},
640     {"Voice2 Stub Tx Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
641     {"Voice2 Stub Tx Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
642     {"Voice2 Stub Tx Mixer", "SLIM_3_TX", "SLIMBUS_3_TX"},
643     {"Voice2 Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"},
644     {"Voice2 Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
645     {"Voice2 Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
646     {"VOICE2_STUB_UL", NULL, "Voice2 Stub Tx Mixer"},
647
648     {"STUB_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
649     {"STUB_RX Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
650     {"STUB_RX Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
651     {"STUB_RX", NULL, "STUB_RX Mixer"},
652     {"SLIMBUS_1_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
653     {"SLIMBUS_1_RX Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
654     {"SLIMBUS_1_RX Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
655     {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"},
656     {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
657     {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
658     {"AFE_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
659     {"AFE_PCM_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
660     {"AFE_PCM_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
661     {"SLIMBUS_3_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
662     {"SLIMBUS_3_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
663     {"SLIMBUS_3_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
664     {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"},
665
666     {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
667     {"SLIMBUS_1_RX Port Mixer", "AFE_PCM_TX", "PCM_TX"},
668     {"SLIMBUS_1_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
669     {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"},
670     {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
671     {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
672     {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"},
673     {"SLIMBUS_3_RX Port Mixer", "INTERNAL_BT_SCO_RX", "INT_BT_SCO_RX"},
674     {"SLIMBUS_3_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
675     {"SLIMBUS_3_RX Port Mixer", "AFE_PCM_RX", "PCM_RX"},
676     {"SLIMBUS_3_RX Port Mixer", "AUX_PCM_RX", "AUX_PCM_RX"},
677     {"SLIMBUS_3_RX Port Mixer", "SLIM_0_RX", "SLIMBUS_0_RX"},
678     {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX Port Mixer"},
679
680
681     {"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
682     {"HDMI", NULL, "HDMI_RX Port Mixer"},
683
684     {"SEC_I2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
685     {"SEC_I2S_RX", NULL, "SEC_I2S_RX Port Mixer"},
686
687     {"MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
688     {"MI2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
689     {"MI2S_RX", NULL, "MI2S_RX Port Mixer"},
690
691     {"PRI_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
692     {"PRI_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
693     {"PRI_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
694     {"PRI_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
695     {"PRI_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
696     {"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Port Mixer"},
697
698     {"QUAT_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
699     {"QUAT_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
700     {"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Port Mixer"},
701
702     /* Backend Enablement */
703
704     {"BE_OUT", NULL, "PRI_I2S_RX"},
705     {"BE_OUT", NULL, "SEC_I2S_RX"},
706     {"BE_OUT", NULL, "SLIMBUS_0_RX"},
707     {"BE_OUT", NULL, "SLIMBUS_1_RX"},
708     {"BE_OUT", NULL, "SLIMBUS_3_RX"},
709     {"BE_OUT", NULL, "SLIMBUS_4_RX"},
710     {"BE_OUT", NULL, "SLIMBUS_6_RX"},
711     {"BE_OUT", NULL, "HDMI"},
712     {"BE_OUT", NULL, "SPDIF_RX"},
713     {"BE_OUT", NULL, "MI2S_RX"},
714     {"BE_OUT", NULL, "QUAT_MI2S_RX"},
715     {"BE_OUT", NULL, "TERT_MI2S_RX"},
716     {"BE_OUT", NULL, "SEC_MI2S_RX"},
717     {"BE_OUT", NULL, "SEC_MI2S_RX_SD1"},
718     {"BE_OUT", NULL, "PRI_MI2S_RX"},
719     {"BE_OUT", NULL, "INT_BT_SCO_RX"},
720     {"BE_OUT", NULL, "INT_FM_RX"},
721     {"BE_OUT", NULL, "PCM_RX"},
722     {"BE_OUT", NULL, "SLIMBUS_3_RX"},
723     {"BE_OUT", NULL, "AUX_PCM_RX"},
724     {"BE_OUT", NULL, "SEC_AUX_PCM_RX"},
725     {"BE_OUT", NULL, "INT_BT_SCO_RX"},
726     {"BE_OUT", NULL, "INT_FM_RX"},
727     {"BE_OUT", NULL, "PCM_RX"},
728     {"BE_OUT", NULL, "SLIMBUS_3_RX"},
729     {"BE_OUT", NULL, "AUX_PCM_RX"},
730     {"BE_OUT", NULL, "SEC_AUX_PCM_RX"},
731     {"BE_OUT", NULL, "VOICE_PLAYBACK_TX"},
732     {"BE_OUT", NULL, "VOICE2_PLAYBACK_TX"},
733
734     {"PRI_I2S_TX", NULL, "BE_IN"},
735     {"MI2S_TX", NULL, "BE_IN"},
736     {"QUAT_MI2S_TX", NULL, "BE_IN"},
737     {"PRI_MI2S_TX", NULL, "BE_IN"},
738     {"TERT_MI2S_TX", NULL, "BE_IN"},
739     {"SEC_MI2S_TX", NULL, "BE_IN"},
740     {"SLIMBUS_0_TX", NULL, "BE_IN" },
741     {"SLIMBUS_1_TX", NULL, "BE_IN" },
742     {"SLIMBUS_3_TX", NULL, "BE_IN" },
743     {"SLIMBUS_4_TX", NULL, "BE_IN" },
744     {"SLIMBUS_5_TX", NULL, "BE_IN" },
745     {"SLIMBUS_6_TX", NULL, "BE_IN" },
746     {"INT_BT_SCO_TX", NULL, "BE_IN"},
747     {"INT_FM_TX", NULL, "BE_IN"},
748     {"PCM_TX", NULL, "BE_IN"},
749     {"BE_OUT", NULL, "SLIMBUS_3_RX"},
750     {"BE_OUT", NULL, "STUB_RX"},
751     {"STUB_TX", NULL, "BE_IN"},
752     {"STUB_1_TX", NULL, "BE_IN"},
753     {"BE_OUT", NULL, "AUX_PCM_RX"},
754     {"AUX_PCM_TX", NULL, "BE_IN"},
755     {"SEC_AUX_PCM_TX", NULL, "BE_IN"},
756     {"INCALL_RECORD_TX", NULL, "BE_IN"},
757     {"INCALL_RECORD_RX", NULL, "BE_IN"},
758     {"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"},
759     {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"},
760 };

snd_soc_dapm_route intercon

通过第一步的定义,我们知道PRI_RX Audio 的数据流通道为MultiMedia1;

很明显,我们可以知道:

MM_DL1连接到PRI_RX Audio Mixer的MultiMedia1

MM_DL2连接到PRI_RX Audio Mixer的MultiMedia2

。。。。

3.4 在msm_routing_probe函数中注册这些widget和路径:

1 snd_soc_dapm_new_controls(&platform->dapm, msm_qdsp6_widgets,
2                ARRAY_SIZE(msm_qdsp6_widgets));
3 snd_soc_dapm_add_routes(&platform->dapm, intercon,
4         ARRAY_SIZE(intercon));

原文地址:https://www.cnblogs.com/linhaostudy/p/8509899.html

时间: 2024-10-08 15:30:28

ALSA声卡驱动的DAPM-基于高通平台的相关文章

ALSA声卡驱动的DAPM(二)-建立过程

在上一篇文章中,我们重点介绍了widget.path.route之间的关系及其widget的注册: http://www.cnblogs.com/linhaostudy/p/8509899.html 在最后一章中,我们已经简单介绍了snd_soc_dapm_new_controls函数用来创建widget. 实际上,这个函数只是创建widget的第一步,它为每一个widget分配内存,初始化: 要使widget之间具备连接能力,我们还需要第二个函数snd_soc_dapm_new_widgets

【转】高通平台android 环境配置编译及开发经验总结

原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析,设置sim卡锁 python scons 语法学习 Python 语言之 scons 工具流程分析: 1.2 搭建高通平台环境开发环境 高通and

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

转自http://blog.csdn.net/droidphone/article/details/7165482 1.  ASoC的由来 ASoC--ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系.在ASoc出现之前,内核对于SoC中的音频已经有部分的支持,不过会有一些局限性: Codec驱动与SoC CPU的底层耦合过于紧密,这种不理想会导致代码的重复,例如,仅是wm8731的驱动,当时Linux中

Linux ALSA声卡驱动之二:声卡的创建

1. struct snd_card 1.1. snd_card是什么 snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体.正因为如此,本节中,我们也从 struct cnd_card开始吧. 1.2. snd_card的定义 snd_card的定义位于改头文件中:include/sound/core.h [c-sharp] vi

高通平台MSM8916LCM模块移植(一)-bootloader部分【转】

本文转载自:http://www.mobile-open.com/2016/970947.html 高通平台中的bootloader叫做LK(Little Kernel,对于LCM来说LK部分相当重要,它不仅要负责开机部分的LCD显示任务,还要负责传参给kernel的LCM驱动,指导kernel选择合适的LCM参数. 1.LK中LCM启动流程 注:read_panel_id()和read_panel_id_ddr3()为私有添加,非高通库上代码. 在这个流程图中,需要着重了解的有oem_pane

高通平台Camera调试(一)【转】

本文转载自:http://www.voidcn.com/blog/Winva/article/p-6044730.html 4.3. Camera 参考文档: 1) 80-NA157-22_PRESENTATION- MSM8974-APQ8074-MSM8X26-APQ8084 LINUX CAMERA OVERVIEW.pdf 2) 80-NE717-1_MSM8974-APQ8074-MSM8X26 LINUX CAMERA SOFTWARE DESIGN DOCUMENT.pdf 3)

在高通平台Android环境下编译内核模块【转】

本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei-he-mo-kuai/ 高通Android环境中Linux内核会作为Android的一部分进行编译,直接使用make即可一次性从头编到尾.而有的平台比如Marvell,内核的编译操作相对比较独立,必须使用标准的内核编译命令进行单独编译.一般来说,用高通的这种方式比较傻瓜化,一步到底的感觉:而用Ma

Android字符设备驱动开发基于高通msm8916【原创 】

本人才疏浅学,写一篇文档总结自己在msm8916平台上移植自己编写的简单的字符设备驱动开发的整个流程.这个小项目的主要功能是开发一个简单的APP,APP通过JNI去调用位于kernel的字符设备驱动. APP的设计,开发平台Android Studio 主要的文件是下面的三个文件: MainActivity.java文件的内容如下: 1 package com.example.administrator.myled; 2 3 import android.nfc.Tag; 4 import an

Linux ALSA声卡驱动之三:PCM设备的创建

声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢! 1. PCM是什么 PCM是英文Pulse-code modulation的缩写,中文译名是脉冲编码调制.我们知道在现实生活中,人耳听到的声音是模拟信号,PCM就是要把声音从模拟转换成数字信号的一种技术,他的原理简单地说就是利用一个固定的频率对模拟信号进行采样,采样后的信号在波形上看就像一串连续的幅值不一的脉冲,把这些脉冲的幅值按一定的精度进行量化,这些量化后的数值被连续地输出.传输.处