This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Issues with ABE on MM_EXT output

Other Parts Discussed in Thread: TLV320AIC3256, TWL6040

I'm working on a custom board with an OMAP4460 and a TLV320AIC3256 codec.  Up to this point we haven't used the ABE and instead hooked up our PCM interface directly to the McBSP2 interface with something like this in our ALSA SoC machine driver:

static struct snd_soc_dai_link m100_dai[] = {
	{
		.name = "tlv320aic3256",
		.stream_name = "Multimedia",
		.cpu_dai_name ="omap-mcbsp-dai.2",
		.codec_dai_name = "tlv320aic325x-MM_EXT",
		.platform_name = "omap-pcm-audio",
		.codec_name = "tlv320aic325x-codec.0",
		.init = aic3256_init,
		.ops = &aic3256_ops,
	},
}

However, I now want to take advantage of the ABE hardware.  I've expanded our machine driver with  following DAI links defined:

/*
 * Frontend DAIs - i.e. userspace visible interfaces (ALSA PCMs)
 */

	{
		.name = "aic3256_Playback",
		.stream_name = "Multimedia",

		/* ABE components - MM-UL & MM_DL */
		.cpu_dai_name = "MultiMedia1",
		.platform_name = "omap-pcm-audio",

		.dynamic = 1, /* BE is dynamic */
		.init = sdp44xx_aic3256_fe_init,
		.dsp_link = &fe_media,
	},
	{
		.name = "aic3256_Capture",
		.stream_name = "Multimedia Capture",

		/* ABE components - MM-UL2 */
		.cpu_dai_name = "MultiMedia2",
		.platform_name = "omap-pcm-audio",

		.dynamic = 1, /* BE is dynamic */
		.dsp_link = &fe_media_capture,
	},
	{
		.name = "aic3256_Voice",
		.stream_name = "Voice",

		/* ABE components - VX-UL & VX-DL */
		.cpu_dai_name = "Voice",
		.platform_name = "omap-pcm-audio",

		.dynamic = 1, /* BE is dynamic */
		.dsp_link = &fe_media,
		.no_host_mode = SND_SOC_DAI_LINK_OPT_HOST,
	},
	{
		.name = "aic3256_Tones_Playback",
		.stream_name = "Tone Playback",

		/* ABE components - TONES_DL */
		.cpu_dai_name = "Tones",
		.platform_name = "omap-pcm-audio",

		.dynamic = 1, /* BE is dynamic */
		.dsp_link = &fe_tones,
	},
	{
		.name = "aic3256_Modem",
		.stream_name = "MODEM",

		/* ABE components - MODEM <-> McBSP2 */
		.cpu_dai_name = "MODEM",
		.platform_name = "aess",

		.dynamic = 1, /* BE is dynamic */
		.init = sdp44xx_aic3256_fe_init,
		.dsp_link = &fe_modem,
		.ops = &sdp44xx_aic3256_modem_ops,
		.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
		.ignore_suspend = 1,
	},
	{
		.name = "aic3256_Media_LP",
		.stream_name = "Multimedia",

		/* ABE components - MM-DL (mmap) */
		.cpu_dai_name = "MultiMedia1 LP",
		.platform_name = "aess",

		.dynamic = 1, /* BE is dynamic */
		.dsp_link = &fe_lp_media,
	},
	{
		.name = "Legacy McBSP",
		.stream_name = "Multimedia",

		/* ABE components - MCBSP3 - MM-EXT */
		.cpu_dai_name = "omap-mcbsp-dai.2",
		.platform_name = "omap-pcm-audio",

		/* FM */

		.codec_dai_name = "tlv320aic325x-MM_EXT",
                .codec_name = "tlv320aic325x-codec.0",

		.ops = &sdp44xx_aic3256_mcbsp_ops,
		.ignore_suspend = 1,
	},
	{
		.name = OMAP_ABE_BE_BT_VX_UL,
		.stream_name = "BT Capture",

		/* ABE components - MCBSP1 - BT-VX */
		.cpu_dai_name = "omap-mcbsp-dai.0",
		.platform_name = "aess",

		/* Bluetooth */
		.codec_dai_name = "Bluetooth",

		.no_pcm = 1, /* don't create ALSA pcm for this */
		.no_codec = 1, /* TODO: have a dummy CODEC */
		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
		.ops = &sdp44xx_aic3256_mcbsp_ops,
		.be_id = OMAP_ABE_DAI_BT_VX,
		.ignore_suspend = 1,
	},
	{
		.name = OMAP_ABE_BE_BT_VX_DL,
		.stream_name = "BT Playback",

		/* ABE components - MCBSP1 - BT-VX */
		.cpu_dai_name = "omap-mcbsp-dai.0",
		.platform_name = "aess",

		/* Bluetooth */
		.codec_dai_name = "Bluetooth",

		.no_pcm = 1, /* don't create ALSA pcm for this */
		.no_codec = 1, /* TODO: have a dummy CODEC */
		.init = sdp44xx_aic3256_bt_init,
		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
		.ops = &sdp44xx_aic3256_mcbsp_ops,
		.be_id = OMAP_ABE_DAI_BT_VX,
		.ignore_suspend = 1,
	},
	{
		.name = OMAP_ABE_BE_MM_EXT0_DL,
		.stream_name = "FM Playback",

		/* ABE components - MCBSP3 - MM-EXT */
		.cpu_dai_name = "omap-mcbsp-dai.2",
		.platform_name = "aess",

		/* FM */
		.codec_dai_name = "tlv320aic325x-MM_EXT",
		.codec_name = "tlv320aic325x-codec.0",

		.no_pcm = 1, /* don't create ALSA pcm for this */
		.init=sdp44xx_aic3256_init,
		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
		.ops = &sdp44xx_aic3256_mcbsp_ops,
		.be_id = OMAP_ABE_DAI_MM_FM,
		.ignore_suspend = 1,
	},
	{
		.name = OMAP_ABE_BE_MM_EXT0_UL,
		.stream_name = "FM Capture",

		/* ABE components - MCBSP3 - MM-EXT */
		.cpu_dai_name = "omap-mcbsp-dai.2",
		.platform_name = "aess",

		/* FM */
		.codec_dai_name = "tlv320aic325x-MM_EXT",
		.codec_name = "tlv320aic325x-codec.0",

		.no_pcm = 1, /* don't create ALSA pcm for this */
		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
		.ops = &sdp44xx_aic3256_mcbsp_ops,
		.be_id = OMAP_ABE_DAI_MM_FM,
		.ignore_suspend = 1,
	},
	{
		.name = OMAP_ABE_BE_MM_EXT1,
		.stream_name = "MODEM",

		/* ABE components - MCBSP2 - MM-EXT */
		.cpu_dai_name = "omap-mcbsp-dai.1",
		.platform_name = "aess",

		/* MODEM */
		.codec_dai_name = "MODEM",

		.no_pcm = 1, /* don't create ALSA pcm for this */
		.no_codec = 1, /* TODO: have a dummy CODEC */
		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
		.ops = &sdp44xx_aic3256_mcbsp_ops,
		.be_id = OMAP_ABE_DAI_MODEM,
		.ignore_suspend = 1,
	},
};

And this creates 12 PCM devices instead of the 1 that I had before.  But while audio output works when using tinyplay to pcm6 (the Legacy McBSP interface) I don't see any I2S output when using pcm0 (the MultiMedia1 interface).

I don't know much about debugging the ABE, but I was able to capture the debug buffer while trying to play an audio sample.  It's a binary file with repeating entries like the following:

00000000: 0000 0000 0000 0000 0000 0000 0000 0000
00000010: 0000 0000 0000 0000 0000 0000 0000 0000
00000020: 0000 0000 0000 0000 0000 0000 0000 0000
00000030: 0000 0000 0000 0000 0000 0000 0000 0000
00000040: 0000 0000 0000 0000 fb30 0000 fa30 0000
00000050: 2321 0000 2321 0000 b610 0000 b610 0000
00000060: 0000 0000 0000 0000 4fef ffff 4fef ffff
00000070: e2de ffff e1de ffff 04cf ffff 05cf ffff

Any help is greatly appreciated.  I can provide other debug info like dmesg output if it would be helpful.

  • Boyko, thanks for the pointer.  The patch doesn't apply cleanly, but I took the bits of it that were applicable and modified my code.  The majority of the changes were to the snd_soc_dai_link[] array and here is my new version:

    static struct snd_soc_dai_link sdp44xx_aic3256_dai[] = {
    
    /*
     * Frontend DAIs - i.e. userspace visible interfaces (ALSA PCMs)
     */
    
    	{
    		.name = "aic3256_Playback",
    		.stream_name = "Multimedia",
    
    		/* ABE components - MM-UL & MM_DL */
    		.cpu_dai_name = "MultiMedia1",
    		.platform_name = "omap-pcm-audio",
    
    		.dynamic = 1, /* BE is dynamic */
    		/* .init = sdp44xx_aic3256_fe_init, */
    		.dsp_link = &fe_media,
    	},
    	{
    		.name = "aic3256_Capture",
    		.stream_name = "Multimedia Capture",
    
    		/* ABE components - MM-UL2 */
    		.cpu_dai_name = "MultiMedia2",
    		.platform_name = "omap-pcm-audio",
    
    		.dynamic = 1, /* BE is dynamic */
    		.dsp_link = &fe_media_capture,
    	},
    	{
    		.name = "aic3256_Voice",
    		.stream_name = "Voice",
    
    		/* ABE components - VX-UL & VX-DL */
    		.cpu_dai_name = "Voice",
    		.platform_name = "omap-pcm-audio",
    
    		.dynamic = 1, /* BE is dynamic */
    		.dsp_link = &fe_media,
    		.no_host_mode = SND_SOC_DAI_LINK_OPT_HOST,
    	},
    	{
    		.name = "aic3256_Tones_Playback",
    		.stream_name = "Tone Playback",
    
    		/* ABE components - TONES_DL */
    		.cpu_dai_name = "Tones",
    		.platform_name = "omap-pcm-audio",
    
    		.dynamic = 1, /* BE is dynamic */
    		.dsp_link = &fe_tones,
    	},
    	{
    		.name = "aic3256_Modem",
    		.stream_name = "MODEM",
    
    		/* ABE components - MODEM <-> McBSP2 */
    		.cpu_dai_name = "MODEM",
    		.platform_name = "aess",
    
    		.dynamic = 1, /* BE is dynamic */
    		/* .init = sdp44xx_aic3256_fe_init, */
    		.dsp_link = &fe_modem,
    		.ops = &sdp44xx_aic3256_modem_ops,
    		.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
    		.ignore_suspend = 1,
    	},
    	{
    		.name = "aic3256_Media_LP",
    		.stream_name = "Multimedia",
    
    		/* ABE components - MM-DL (mmap) */
    		.cpu_dai_name = "MultiMedia1 LP",
    		.platform_name = "aess",
    
    		.dynamic = 1, /* BE is dynamic */
    		.dsp_link = &fe_lp_media,
    	},
    	{
    		.name = "Legacy McBSP",
    		.stream_name = "Multimedia",
    
    		/* ABE components - MCBSP3 - MM-EXT */
    		.cpu_dai_name = "omap-mcbsp-dai.2",
    		.platform_name = "omap-pcm-audio",
    
    		.codec_dai_name = "tlv320aic325x-MM_EXT",
                    .codec_name = "tlv320aic325x-codec.0",
    
    		.ops = &sdp44xx_aic3256_mcbsp_ops,
    		.ignore_suspend = 1,
    	},
    
    
    	/* THESE ARE THE BACKENDS */
    
    	{
    		.name = OMAP_ABE_BE_BT_VX,
    		.stream_name = "BT",
    
    		/* ABE components - MCBSP1 - BT-VX */
    		.cpu_dai_name = "omap-mcbsp-dai.0",
    		.platform_name = "aess",
    
    		/* Bluetooth */
    		.codec_dai_name = "Bluetooth",
    
    		.no_pcm = 1, /* don't create ALSA pcm for this */
    		.no_codec = 1, /* TODO: have a dummy CODEC */
    		.init = sdp44xx_aic3256_init,
    		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
    		.ops = &sdp44xx_aic3256_mcbsp_ops,
    		.be_id = OMAP_ABE_DAI_BT_VX,
    		.ignore_suspend = 1,
    	},
    	{
    		.name = OMAP_ABE_BE_MM_EXT0,
    		.stream_name = "FM",
    
    		/* ABE components - MCBSP3 - MM-EXT */
    		.cpu_dai_name = "omap-mcbsp-dai.2",
    		.platform_name = "aess",
    
    		/* FM */
    		.codec_dai_name = "tlv320aic325x-MM_EXT",
    		.codec_name = "tlv320aic325x-codec.0",
    
    		.no_pcm = 1, /* don't create ALSA pcm for this */
    		.init = sdp44xx_aic3256_init,
    		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
    		.ops = &sdp44xx_aic3256_mcbsp_ops,
    		.be_id = OMAP_ABE_DAI_MM_FM,
    		.ignore_suspend = 1,
    	},
    };
    

    The behavior has changed when I attempt to play something using tinyplay now.  Here is the relevant information from the dmesg log:

    [  303.859649] soc-audio soc-audio: Playback: checking paths from MM_DL_LP                                                                                 
    [  303.867309] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer                                                                               
    [  303.874969] soc-audio soc-audio:    2: MM_DL VMixer -> Media Playback -> Voice Capture Mixer                                                            
    [  303.885375] soc-audio soc-audio:  * 2: MM_DL VMixer -> Multimedia -> DL1 Mixer                                                                          
    [  303.893402] soc-audio soc-audio:  * 3: DL1 Mixer -> Playback -> Sidetone Mixer                                                                          
    [  303.901367] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 PDM_DL2                                                                          
    [  303.909393] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 PDM                                                                              
    [  303.917388] soc-audio soc-audio:  * 4: Sidetone Mixer -> Switch -> DL1 MM_EXT                                                                           
    [  303.925201] soc-audio soc-audio:  * 5: DL1 MM_EXT -> (null) -> MM_EXT_DL                                                                                
    [  303.932586] soc-audio soc-audio:  ! 6: valid playback route found                                                                                       
    [  303.939270] soc-audio soc-audio: added MM_EXT_DL in widget list pos 0                                                                                   
    [  303.946380] soc-audio soc-audio: added DL1 MM_EXT in widget list pos 1                                                                                  
    [  303.953521] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 BT_VX                                                                            
    [  303.961395] soc-audio soc-audio: added Sidetone Mixer in widget list pos 2                                                                              
    [  303.968963] soc-audio soc-audio: added DL1 Mixer in widget list pos 3                                                                                   
    [  303.976013] soc-audio soc-audio: added MM_DL VMixer in widget list pos 4                                                                                
    [  303.983428] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer                                                                               
    [  303.990875] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer                                                                               
    [  303.998413]  aic3256_Playback: found 1 audio playback paths                                                                                             
    [  304.004577]  aic3256_Playback: no BE found for MM_EXT_DL                                                                                                
    [  304.010406]  aic3256_Playback: asoc: aic3256_Playback no valid playback route from source to sink                                                       
    [  304.020141]  aic3256_Playback: dsp: open FE aic3256_Playback                                                                                            
    [  304.026367] omap-abe-dai omap-abe-dai: omap_abe_dai_startup: MultiMedia1                                                                                
    [  304.033843]  aic3256_Playback: dsp: hw_free FE aic3256_Playback                                                                                         
    [  304.040344] omap-abe-dai omap-abe-dai: omap_abe_dai_hw_free: MultiMedia1                                                                                
    [  304.047729]  aic3256_Playback: dsp: close FE aic3256_Playback                                                                                           
    [  304.054077] omap-abe-dai omap-abe-dai: omap_abe_dai_shutdown: MultiMedia1                                                                               

    In order to get that far I had to enable the following controls in tinymix: 27, 32, and 43.  These are DL1 MM_EXT Switch, Sidetone Mixer Playback, and DL1 Mixer Multimedia, respectively.  I think this is further than before, but now it's getting hung up on not having a backend for the dynamic PCM front end.  Do you know what code I need to add to select the backend?  Or is it another tinymix control?

  • Do I need to define SoC DAPM routes between the ABE and my codec?  If so, here is my DAI driver for reference:

    static struct snd_soc_dai_driver tlv320aic325x_dai_driver[] = {
    	{
    	.name = "tlv320aic325x-MM_EXT",
    	.playback = {
    			.stream_name = "Playback",
    			.channels_min = 1,
    			.channels_max = 2,
    			.rates = AIC325x_RATES,
    			.formats = AIC325x_FORMATS,
    		},
    	.capture = {
    			.stream_name = "Capture",
    			.channels_min = 1,
    			.channels_max = 2,
    			.rates = AIC325x_RATES,
    			.formats = AIC325x_FORMATS,
    		},
    	.ops = &aic325x_dai_ops,
    },
    };

  • Hi MIchael,

    I belive the dapm rules are set in omap-abe-*.c .  Have you followed the examples in this article, it may be useful for tinymix configuration:

    http://www.omappedia.com/wiki/Audio_Drive_Arch

    Regards,

    Boyko

  • Boyko, thanks for the pointer but that's a resource I've already been consulting.  My test so far has been:

    tinymix 43 1
    tinymix 27 1
    tinymix 6  120
    tinymix 32 1
    tinyplay /sdcard/Music/1kHz_48000Hz_16bits.wav
    

    Because we do not have the TWL6040 codec and therefore some of the tinymix controls on that wiki page are not applicable.  After changing those settings our tinymix control list shows the following:

    root@foobar:/ # tinymix
    Mixer name: 'foobarsound'
    Number of controls: 144
    ctl	type	num	name                                     value
    0	ENUM	1	DL1 Equalizer                            Flat response
    1	ENUM	1	DL2 Left Equalizer                       Flat response
    2	ENUM	1	DL2 Right Equalizer                      Flat response
    3	ENUM	1	Sidetone Equalizer                       Flat response
    4	ENUM	1	AMIC Equalizer                           High-pass 0dB
    5	ENUM	1	DMIC Equalizer                           High-pass 0dB
    6	INT	1	DL1 Media Playback Volume                120
    7	INT	1	DL1 Tones Playback Volume                0
    8	INT	1	DL1 Voice Playback Volume                0
    9	INT	1	DL1 Capture Playback Volume              0
    10	INT	1	VXREC Media Volume                       0
    11	INT	1	VXREC Tones Volume                       0
    12	INT	1	VXREC Voice DL Volume                    0
    13	INT	1	VXREC Voice UL Volume                    0
    14	INT	1	AUDUL Media Volume                       0
    15	INT	1	AUDUL Tones Volume                       0
    16	INT	1	AUDUL Voice UL Volume                    120
    17	INT	1	AUDUL Voice DL Volume                    0
    18	INT	1	SDT UL Volume                            0
    19	INT	1	SDT DL Volume                            120
    20	INT	2	DMIC1 UL Volume                          120 120
    21	INT	2	DMIC2 UL Volume                          120 120
    22	INT	2	DMIC3 UL Volume                          120 120
    23	INT	2	AMIC UL Volume                           120 120
    24	INT	2	BT UL Volume                             120 120
    25	BOOL	1	DL1 Mono Mixer                           Off
    26	BOOL	1	AUDUL Mono Mixer                         Off
    27	BOOL	1	DL1 MM_EXT Switch                        On
    28	BOOL	1	DL1 BT_VX Switch                         Off
    29	BOOL	1	DL1 PDM_DL2 Switch                       Off
    30	BOOL	1	DL1 PDM Switch                           Off
    31	BOOL	1	Sidetone Mixer Capture                   Off
    32	BOOL	1	Sidetone Mixer Playback                  On
    33	BOOL	1	Capture Mixer Tones                      Off
    34	BOOL	1	Capture Mixer Voice Playback             Off
    35	BOOL	1	Capture Mixer Voice Capture              Off
    36	BOOL	1	Capture Mixer Media Playback             Off
    37	BOOL	1	Voice Capture Mixer Tones Playback       Off
    38	BOOL	1	Voice Capture Mixer Media Playback       Off
    39	BOOL	1	Voice Capture Mixer Capture              Off
    40	BOOL	1	DL1 Mixer Tones                          Off
    41	BOOL	1	DL1 Mixer Voice                          Off
    42	BOOL	1	DL1 Mixer Capture                        Off
    43	BOOL	1	DL1 Mixer Multimedia                     On
    44	ENUM	1	MUX_VX1                                  None
    45	ENUM	1	MUX_VX0                                  None
    46	ENUM	1	MUX_UL11                                 None
    47	ENUM	1	MUX_UL10                                 None
    48	ENUM	1	MUX_UL07                                 None
    49	ENUM	1	MUX_UL06                                 None
    50	ENUM	1	MUX_UL05                                 None
    51	ENUM	1	MUX_UL04                                 None
    52	ENUM	1	MUX_UL03                                 None
    53	ENUM	1	MUX_UL02                                 None
    54	ENUM	1	MUX_UL01                                 None
    55	ENUM	1	MUX_UL00                                 None
    56	INT	1	IN1L to HPL volume control               114
    57	ENUM	1	Left HP driver mute                      Unmute
    58	ENUM	1	Right HP driver mute                     Unmute
    59	INT	1	IN1R to HPR volume control               114
    60	BOOL	1	IN1L to HPL Route                        Off
    61	BOOL	1	MAL Output to HPL Route                  Off
    62	BOOL	1	MAR Output to HPL Route                  Off
    63	BOOL	1	IN1R to HPR Route                        Off
    64	BOOL	1	MAR Output to HPR Route                  Off
    65	BOOL	1	HPL Output to HPR Route                  Off
    66	BOOL	1	MAL Output to LOL Route                  Off
    67	BOOL	1	LOR Output to LOL Route                  Off
    68	BOOL	1	MAR Outout to LOR Route                  Off
    69	INT	1	DRC Threshold value                      3
    70	INT	1	DRC Hysteresis value                     3
    71	INT	1	DRC hold time                            7
    72	INT	1	DRC attack rate                          0
    73	INT	1	DRC decay rate                           0
    74	INT	1	Beep Length MSB                          0
    75	INT	1	Beep Length MID                          0
    76	INT	1	Beep Length LSB                          238
    77	INT	1	Beep Sin(x) MSB                          16
    78	INT	1	Beep Sin(x) LSB                          216
    79	INT	1	Beep Cos(x) MSB                          126
    80	INT	1	Beep Cos(x) LSB                          227
    81	INT	2	DAC Digital Volume Control               127 127
    82	INT	2	L&R ADC Fine Gain Adjust                 0 0
    83	INT	2	ADC Digital Volume Control               24 24
    84	INT	2	HP Driver Gain                           6 6
    85	INT	2	Line Driver Gain                         6 6
    86	INT	2	Mixer_Amp_Vol_Ctrl                       40 40
    87	INT	2	Beep_gen_Vol_Ctrl                        63 63
    88	INT	1	DAC PRB Selection(1 to 25)               0
    89	INT	2	MICPGA Volume Control                    0 0
    90	INT	2	AGC Target Level Control                 5 5
    91	INT	2	AGC Hysteresis Control                   0 0
    92	INT	2	AGC Maximum PGA Control                  0 0
    93	INT	2	AGC Noise Threshold                      0 0
    94	INT	2	AGC Attack Time control                  13 13
    95	INT	2	AGC Decay Time control                   21 21
    96	INT	2	AGC Noice bounce control                 6 6
    97	INT	2	AGC_Signal bounce ctrl                   0 0
    98	INT	1	ADC PRB Selection(1 to 18)               0
    99	INT	1	Charge_pump_peak_load_conf               0
    100	INT	1	charge_pump_clk_divider_ctrl             6
    101	INT	1	HP_gain_ctrl_gnd_centered_mode           0
    102	BOOL	1	 hp_amp_compensation_adjustment          Off
    103	INT	1	 HP_drv_pwr_conf                         4
    104	INT	1	DC offset correction                     3
    105	ENUM	1	Mic_Bias_Power_ctrl                      Power Up
    106	INT	1	Right Input Mixer IN1_R switch           0
    107	INT	1	Right Input Mixer IN2_R switch           0
    108	INT	1	Right Input Mixer IN3_R switch           0
    109	INT	1	Right Input Mixer IN2_L switch           0
    110	INT	1	Right Input Mixer CM1R switch            0
    111	INT	1	Right Input Mixer IN1_L switch           0
    112	INT	1	Right Input Mixer IN3_L switch           0
    113	INT	1	Right Input Mixer CM2R switch            0
    114	INT	1	Left Input Mixer IN1_L switch            0
    115	INT	1	Left Input Mixer IN2_L switch            0
    116	INT	1	Left Input Mixer IN3_L switch            0
    117	INT	1	Left Input Mixer IN1_R switch            0
    118	INT	1	Left Input Mixer CM1L switch             0
    119	INT	1	Left Input Mixer IN2_R switch            0
    120	INT	1	Left Input Mixer IN3_R switch            0
    121	INT	1	Left Input Mixer CM2L switch             0
    122	ENUM	1	Right ADC Route                          Digital
    123	ENUM	1	Left ADC Route                           Digital
    124	BOOL	1	LOR Output Mixer R_DAC switch            On
    125	BOOL	1	LOR Output Mixer MAR switch              Off
    126	BOOL	1	LOL Output Mixer R_DAC switch            Off
    127	BOOL	1	LOL Output Mixer L_DAC switch            On
    128	BOOL	1	LOL Output Mixer MAL switch              Off
    129	BOOL	1	LOL Output Mixer LOR switch              Off
    130	BOOL	1	HPR Output Mixer L_DAC switch            On
    131	BOOL	1	HPR Output Mixer R_DAC switch            On
    132	BOOL	1	HPR Output Mixer IN1_R switch            Off
    133	BOOL	1	HPR Output Mixer MAR switch              Off
    134	BOOL	1	HPL Output Mixer L_DAC switch            On
    135	BOOL	1	HPL Output Mixer IN1_L switch            Off
    136	BOOL	1	HPL Output Mixer MAL switch              Off
    137	BOOL	1	HPL Output Mixer MAR switch              Off
    138	ENUM	1	ASIIn Right Route                        ASI Right In
    139	ENUM	1	ASIIn Left Route                         ASI Left In
    140	ENUM	1	Codec Firmware Setmode                   Foobar
    

    I did fix the issue we were hitting earlier by modifying the snd_soc_dai_link stream name for the McBSP3 device to the following:

    	{
    		.name = OMAP_ABE_BE_MM_EXT0,
    		.stream_name = "FM Playback",
    
    		/* ABE components - MCBSP3 - MM-EXT */
    		.cpu_dai_name = "omap-mcbsp-dai.2",
    		.platform_name = "aess",
    
    		/* FM */
    		.codec_dai_name = "tlv320aic325x-MM_EXT",
    		.codec_name = "tlv320aic325x-codec.0",
    
    		.no_pcm = 1, /* don't create ALSA pcm for this */
    		.init = sdp44xx_aic3256_init,
    		.be_hw_params_fixup = mcbsp_be_hw_params_fixup,
    		.ops = &sdp44xx_aic3256_mcbsp_ops,
    		.be_id = OMAP_ABE_DAI_MM_FM,
    		.ignore_suspend = 1,
    	},

    Originally the stream_name I had was "FM".  The SoC code wasn't able to match this up to any of the SND_SOC_DAPM_AIF_OUT controls, and so it was dying early.  After changing that to "FM Playback" it matches the SND_SOC_DAPM_AIF_OUT control for MM_EXT_DL in omap-abe-dsp.h and the connection is made.  However, now I'm back to the original issue of not having any audio output when it looks like the ABE is getting hooked up properly.  Here is the dmesg output when running the set of commands at the top of this post:

    [ 6080.030761] mtp_release
    [ 6080.031799] mtp_bind_config
    [ 6080.031860] adb_bind_config
    [ 6080.034820] adb_open
    [ 6080.043395] adb_release
    [ 6080.048461] init: untracked pid 142 exited
    [ 6081.035736] adb_open
    [ 6081.038299] mtp_bind_config
    [ 6081.041717] adb_bind_config
    [ 6081.196990] android_work: sent uevent USB_STATE=DISCONNECTED
    [ 6081.257507] android_work: sent uevent USB_STATE=CONNECTED
    [ 6081.269165] android_work: sent uevent USB_STATE=DISCONNECTED
    [ 6081.332000] android_work: sent uevent USB_STATE=CONNECTED
    [ 6081.339019] android_usb gadget: high speed config #1: android
    [ 6081.346160] android_work: sent uevent USB_STATE=CONFIGURED
    [ 6081.400390] apds9960: apds9960_store_calibration calibration (4)
    [ 6081.401336] mtp_open
    [ 6081.410278] apds9960: keyEventEnabled : 1
    [ 6081.414642] apds9960: apds9960_calibration (4)
    [ 6089.599700] soc-audio soc-audio: Playback: checking paths from MM_DL_LP
    [ 6089.607482] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer
    [ 6089.615142] soc-audio soc-audio:    2: MM_DL VMixer -> Media Playback -> Voice Capture Mixer
    [ 6089.624725] soc-audio soc-audio:  * 2: MM_DL VMixer -> Multimedia -> DL1 Mixer
    [ 6089.632965] soc-audio soc-audio:  * 3: DL1 Mixer -> Playback -> Sidetone Mixer
    [ 6089.641235] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 PDM_DL2
    [ 6089.649261] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 PDM
    [ 6089.656951] soc-audio soc-audio:  * 4: Sidetone Mixer -> Switch -> DL1 MM_EXT
    [ 6089.664764] soc-audio soc-audio:  * 5: DL1 MM_EXT -> (null) -> MM_EXT_DL
    [ 6089.672210] soc-audio soc-audio:  ! 6: valid playback route found
    [ 6089.678924] soc-audio soc-audio: added MM_EXT_DL in widget list pos 0
    [ 6089.686065] soc-audio soc-audio: added DL1 MM_EXT in widget list pos 1
    [ 6089.693267] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 BT_VX
    [ 6089.700988] soc-audio soc-audio: added Sidetone Mixer in widget list pos 2
    [ 6089.708557] soc-audio soc-audio: added DL1 Mixer in widget list pos 3
    [ 6089.716094] soc-audio soc-audio: added MM_DL VMixer in widget list pos 4
    [ 6089.723571] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer
    [ 6089.731109] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer
    [ 6089.738647]  aic3256_Playback: found 1 audio playback paths
    [ 6089.744842]  aic3256_Playback: evaluating MM_EXT_DL widget
    [ 6089.750915]  aic3256_Playback:   connected new DSP playback path aic3256_Playback -> FM-EXT
    [ 6089.760192]  aic3256_Playback: evaluating DL1 MM_EXT widget
    [ 6089.767395]  aic3256_Playback: evaluating Sidetone Mixer widget
    [ 6089.774932]  aic3256_Playback: evaluating DL1 Mixer widget
    [ 6089.781005]  aic3256_Playback: evaluating MM_DL VMixer widget
    [ 6089.787414]  FM-EXT: dsp: open BE FM-EXT
    [ 6089.791839] omap-mcbsp-dai omap-mcbsp-dai.2: aess_open: omap-mcbsp-dai.2
    [ 6089.802642]  aic3256_Playback: dsp: open FE aic3256_Playback
    [ 6089.808868] omap-abe-dai omap-abe-dai: omap_abe_dai_startup: MultiMedia1
    [ 6089.816314]  aic3256_Playback: dsp: hw_free FE aic3256_Playback
    [ 6089.822845] omap-abe-dai omap-abe-dai: omap_abe_dai_hw_free: MultiMedia1
    [ 6089.830200]  FM-EXT: dsp: close BE aic3256_Playback
    [ 6089.835632] omap-mcbsp-dai omap-mcbsp-dai.2: aess_close: omap-mcbsp-dai.2
    [ 6089.843383] pop wq checking: Playback status: inactive waiting: yes
    [ 6089.850311]  aic3256_Playback: dsp: close FE aic3256_Playback
    [ 6089.856597] aess aess: widget VXREC
    [ 6089.856628]  VXREC Capture stream Playback event 2
    [ 6089.865722] omap-abe-dai omap-abe-dai: omap_abe_dai_shutdown: MultiMedia1
    [ 6089.873229] aess aess: widget DMIC2
    [ 6089.873229]  DMIC2 Capture stream Playback event 2
    [ 6089.882598]  FM-EXT: pm: BE FM-EXT stream MultiMedia1 Playback event 2 dir 0
    [ 6089.890380] aess aess: widget DMIC1
    [ 6089.890380]  DMIC1 Capture stream Playback event 2
    [ 6089.899536] aess aess: widget DMIC0
    [ 6089.899536]  DMIC0 Capture stream Playback event 2
    [ 6089.908630] aess aess: widget MM_EXT_DL
    [ 6089.908630]  FM Playback stream Playback event 2
    [ 6089.917999] aess aess: widget MM_EXT_UL
    [ 6089.917999]  FM Capture stream Playback event 2
    [ 6089.927215] aess aess: widget BT_VX_DL
    [ 6089.927215]  BT Playback stream Playback event 2
    [ 6089.936462] aess aess: widget BT_VX_UL
    [ 6089.936462]  BT Capture stream Playback event 2
    [ 6089.953399] aess aess: widget PDM_VIB
    [ 6089.953399]  Vibra Playback stream Playback event 2
    [ 6089.962860] aess aess: widget PDM_DL2
    [ 6089.962860]  HF Playback stream Playback event 2
    [ 6089.972015] aess aess: widget PDM_DL1
    [ 6089.972015]  HS Playback stream Playback event 2
    [ 6089.981109] aess aess: widget PDM_UL1
    [ 6089.981109]  Analog Capture stream Playback event 2
    [ 6089.990539] aess aess: widget MODEM_UL
    [ 6089.990539]  MODEM Capture stream Playback event 2
    [ 6089.999969] aess aess: widget MODEM_DL
    [ 6089.999969]  MODEM Playback stream Playback event 2
    [ 6090.009490] aess aess: widget VIB_DL
    [ 6090.009490]  Vibra Playback stream Playback event 2
    [ 6090.018798] aess aess: widget MM_DL_LP
    [ 6090.018798]   MultiMedia1 LP Playback stream Playback event 2
    [ 6090.029266] aess aess: widget MM_DL
    [ 6090.029266]   MultiMedia1 Playback stream Playback event 2
    [ 6090.039154] aess aess: widget MM_UL2
    [ 6090.039154]  MultiMedia2 Capture stream Playback event 2
    [ 6090.048950] aess aess: widget MM_UL1
    [ 6090.048980]  MultiMedia1 Capture stream Playback event 2
    [ 6090.058776] aess aess: widget VX_UL
    [ 6090.058776]  Voice Capture stream Playback event 2
    [ 6090.067962] aess aess: widget VX_DL
    [ 6090.067962]  Voice Playback stream Playback event 2
    [ 6090.077209] aess aess: widget TONES_DL
    [ 6090.077209]  Tones Playback stream Playback event 2
    [ 6090.087829] tlv320aic325x-codec tlv320aic325x-codec.0: widget Right ADC
    [ 6090.087829]  Right Capture stream Playback event 2
    [ 6090.100372] tlv320aic325x-codec tlv320aic325x-codec.0: widget Left ADC
    [ 6090.100372]  Left Capture stream Playback event 2
    [ 6090.112731] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIOUT
    [ 6090.112731]  ASI Capture stream Playback event 2
    [ 6090.124969] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIIN
    [ 6090.124969]  ASI Playback stream Playback event 2
    [ 6090.138916] aess aess: widget VXREC
    [ 6090.138916]  VXREC Capture stream MultiMedia1 Playback event 2
    [ 6090.149261] aess aess: widget DMIC2
    [ 6090.149261]  DMIC2 Capture stream MultiMedia1 Playback event 2
    [ 6090.159606] aess aess: widget DMIC1
    [ 6090.159606]  DMIC1 Capture stream MultiMedia1 Playback event 2
    [ 6090.169982] aess aess: widget DMIC0
    [ 6090.169982]  DMIC0 Capture stream MultiMedia1 Playback event 2
    [ 6090.180358] aess aess: widget MM_EXT_DL
    [ 6090.180358]  FM Playback stream MultiMedia1 Playback event 2
    [ 6090.190887] aess aess: widget MM_EXT_UL
    [ 6090.190917]  FM Capture stream MultiMedia1 Playback event 2
    [ 6090.201293] aess aess: widget BT_VX_DL
    [ 6090.201293]  BT Playback stream MultiMedia1 Playback event 2
    [ 6090.211761] aess aess: widget BT_VX_UL
    [ 6090.211761]  BT Capture stream MultiMedia1 Playback event 2
    [ 6090.221984] aess aess: widget PDM_VIB
    [ 6090.222015]  Vibra Playback stream MultiMedia1 Playback event 2
    [ 6090.232635] aess aess: widget PDM_DL2
    [ 6090.232635]  HF Playback stream MultiMedia1 Playback event 2
    [ 6090.242919] aess aess: widget PDM_DL1
    [ 6090.242919]  HS Playback stream MultiMedia1 Playback event 2
    [ 6090.253295] aess aess: widget PDM_UL1
    [ 6090.253295]  Analog Capture stream MultiMedia1 Playback event 2
    [ 6090.263885] aess aess: widget MODEM_UL
    [ 6090.263885]  MODEM Capture stream MultiMedia1 Playback event 2
    [ 6090.274505] aess aess: widget MODEM_DL
    [ 6090.274536]  MODEM Playback stream MultiMedia1 Playback event 2
    [ 6090.285156] aess aess: widget VIB_DL
    [ 6090.285156]  Vibra Playback stream MultiMedia1 Playback event 2
    [ 6090.295684] aess aess: widget MM_DL_LP
    [ 6090.295684]   MultiMedia1 LP Playback stream MultiMedia1 Playback event 2
    [ 6090.307312] aess aess: widget MM_DL
    [ 6090.307312]   MultiMedia1 Playback stream MultiMedia1 Playback event 2
    [ 6090.318359] aess aess: widget MM_UL2
    [ 6090.318359]  MultiMedia2 Capture stream MultiMedia1 Playback event 2
    [ 6090.329376] aess aess: widget MM_UL1
    [ 6090.329376]  MultiMedia1 Capture stream MultiMedia1 Playback event 2
    [ 6090.340362] aess aess: widget VX_UL
    [ 6090.340393]  Voice Capture stream MultiMedia1 Playback event 2
    [ 6090.350708] aess aess: widget VX_DL
    [ 6090.350708]  Voice Playback stream MultiMedia1 Playback event 2
    [ 6090.361053] aess aess: widget TONES_DL
    [ 6090.361053]  Tones Playback stream MultiMedia1 Playback event 2
    [ 6090.372894] tlv320aic325x-codec tlv320aic325x-codec.0: widget Right ADC
    [ 6090.372894]  Right Capture stream MultiMedia1 Playback event 2
    [ 6090.386566] tlv320aic325x-codec tlv320aic325x-codec.0: widget Left ADC
    [ 6090.386596]  Left Capture stream MultiMedia1 Playback event 2
    [ 6090.400085] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIOUT
    [ 6090.400115]  ASI Capture stream MultiMedia1 Playback event 2
    [ 6090.413360] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIIN
    [ 6090.413360]  ASI Playback stream MultiMedia1 Playback event 2
    [ 6090.428802]  aic3256_Playback: BE playback disconnect check for FM-EXT
    [ 6090.435974]  aic3256_Playback:   freed DSP playback path aic3256_Playback -> FM-EXT
    [ 6090.444519] soc-audio soc-audio: Playback: checking paths from MM_DL_LP
    [ 6090.451751] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer
    [ 6090.459259] soc-audio soc-audio:    2: MM_DL VMixer -> Media Playback -> Voice Capture Mixer
    [ 6090.468597] soc-audio soc-audio:  * 2: MM_DL VMixer -> Multimedia -> DL1 Mixer
    [ 6090.476562] soc-audio soc-audio:  * 3: DL1 Mixer -> Playback -> Sidetone Mixer
    [ 6090.484619] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 PDM_DL2
    [ 6090.492645] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 PDM
    [ 6090.500183] soc-audio soc-audio:  * 4: Sidetone Mixer -> Switch -> DL1 MM_EXT
    [ 6090.508087] soc-audio soc-audio:  * 5: DL1 MM_EXT -> (null) -> MM_EXT_DL
    [ 6090.515502] soc-audio soc-audio:  ! 6: valid playback route found
    [ 6090.522277] soc-audio soc-audio: added MM_EXT_DL in widget list pos 0
    [ 6090.529388] soc-audio soc-audio: added DL1 MM_EXT in widget list pos 1
    [ 6090.536590] soc-audio soc-audio:    4: Sidetone Mixer -> Switch -> DL1 BT_VX
    [ 6090.544342] soc-audio soc-audio: added Sidetone Mixer in widget list pos 2
    [ 6090.552001] soc-audio soc-audio: added DL1 Mixer in widget list pos 3
    [ 6090.559082] soc-audio soc-audio: added MM_DL VMixer in widget list pos 4
    [ 6090.566528] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer
    [ 6090.574005] soc-audio soc-audio:  * 1: MM_DL_LP -> (null) -> MM_DL VMixer
    [ 6090.581604]  aic3256_Playback: found 1 audio playback paths
    [ 6090.587768]  aic3256_Playback: evaluating MM_EXT_DL widget
    [ 6090.593933]  aic3256_Playback:   connected new DSP playback path aic3256_Playback -> FM-EXT
    [ 6090.603149]  aic3256_Playback: evaluating DL1 MM_EXT widget
    [ 6090.609405]  aic3256_Playback: evaluating Sidetone Mixer widget
    [ 6090.616058]  aic3256_Playback: evaluating DL1 Mixer widget
    [ 6090.622161]  aic3256_Playback: evaluating MM_DL VMixer widget
    [ 6090.628540]  FM-EXT: dsp: open BE FM-EXT
    [ 6090.632934] omap-mcbsp-dai omap-mcbsp-dai.2: aess_open: omap-mcbsp-dai.2
    [ 6090.643676]  aic3256_Playback: dsp: open FE aic3256_Playback
    [ 6090.649902] omap-abe-dai omap-abe-dai: omap_abe_dai_startup: MultiMedia1
    [ 6090.657379]  FM-EXT: dsp: hw_params BE aic3256_Playback
    [ 6090.663391] tlv320aic325x-codec tlv320aic325x-codec.0: read 1b => 4c
    [ 6090.670410] tlv320aic325x-codec tlv320aic325x-codec.0: write 1b = c
    [ 6090.677642] tlv320aic325x-codec tlv320aic325x-codec.0: read 1c => 0
    [ 6090.685028] tlv320aic325x-codec tlv320aic325x-codec.0: read 1d => 1
    [ 6090.692230] tlv320aic325x-codec tlv320aic325x-codec.0: read 1b => c
    [ 6090.699127] omap-mcbsp-dai omap-mcbsp-dai.2: aess_hw_params: omap-mcbsp-dai.2
    [ 6090.707000]  aic3256_Playback: dsp: hw_params FE aic3256_Playback
    [ 6090.713684] omap-abe-dai omap-abe-dai: omap_abe_dai_hw_params: MultiMedia1
    [ 6090.729553]  aic3256_Playback: dsp: prepare FE aic3256_Playback
    [ 6090.736572]  FM-EXT: dsp: prepare BE aic3256_Playback
    [ 6090.742218] omap-mcbsp-dai omap-mcbsp-dai.2: aess_prepare: omap-mcbsp-dai.2
    [ 6090.749816] aess aess: new OPP level is 0
    [ 6090.754302] aess aess: widget VXREC
    [ 6090.754333]  VXREC Capture stream Playback event 1
    [ 6090.763397] aess aess: widget DMIC2
    [ 6090.763427]  DMIC2 Capture stream Playback event 1
    [ 6090.772552] aess aess: widget DMIC1
    [ 6090.772583]  DMIC1 Capture stream Playback event 1
    [ 6090.781707] aess aess: widget DMIC0
    [ 6090.781707]  DMIC0 Capture stream Playback event 1
    [ 6090.790863] aess aess: widget MM_EXT_DL
    [ 6090.790863]  FM Playback stream Playback event 1
    [ 6090.805786] aess aess: widget MM_EXT_UL
    [ 6090.805786]  FM Capture stream Playback event 1
    [ 6090.816925] aess aess: widget BT_VX_DL
    [ 6090.816925]  BT Playback stream Playback event 1
    [ 6090.826202] aess aess: widget BT_VX_UL
    [ 6090.826202]  BT Capture stream Playback event 1
    [ 6090.835845] aess aess: widget PDM_VIB
    [ 6090.835845]  Vibra Playback stream Playback event 1
    [ 6090.845184] aess aess: widget PDM_DL2
    [ 6090.845184]  HF Playback stream Playback event 1
    [ 6090.854339] aess aess: widget PDM_DL1
    [ 6090.854339]  HS Playback stream Playback event 1
    [ 6090.863494] aess aess: widget PDM_UL1
    [ 6090.863525]  Analog Capture stream Playback event 1
    [ 6090.872863] aess aess: widget MODEM_UL
    [ 6090.872894]  MODEM Capture stream Playback event 1
    [ 6090.882324] aess aess: widget MODEM_DL
    [ 6090.882324]  MODEM Playback stream Playback event 1
    [ 6090.891845] aess aess: widget VIB_DL
    [ 6090.891845]  Vibra Playback stream Playback event 1
    [ 6090.901184] aess aess: widget MM_DL_LP
    [ 6090.901184]   MultiMedia1 LP Playback stream Playback event 1
    [ 6090.911590] aess aess: widget MM_DL
    [ 6090.911590]   MultiMedia1 Playback stream Playback event 1
    [ 6090.921508] aess aess: widget MM_UL2
    [ 6090.921508]  MultiMedia2 Capture stream Playback event 1
    [ 6090.931304] aess aess: widget MM_UL1
    [ 6090.931304]  MultiMedia1 Capture stream Playback event 1
    [ 6090.941131] aess aess: widget VX_UL
    [ 6090.941131]  Voice Capture stream Playback event 1
    [ 6090.950256] aess aess: widget VX_DL
    [ 6090.950286]  Voice Playback stream Playback event 1
    [ 6090.959472] aess aess: widget TONES_DL
    [ 6090.959472]  Tones Playback stream Playback event 1
    [ 6090.969848] tlv320aic325x-codec tlv320aic325x-codec.0: Setting bias prepare
    [ 6090.977630] soc-audio soc-audio: Setting standby bias
    [ 6090.977691] soc-audio soc-audio: Setting standby bias
    [ 6090.977691] soc-audio soc-audio: Setting bias prepare
    [ 6090.994293] soc-audio soc-audio: Setting bias prepare
    [ 6091.000122] tlv320aic325x-codec tlv320aic325x-codec.0: read 5 => 91
    [ 6091.007324] tlv320aic325x-codec tlv320aic325x-codec.0: read 1e => 82
    [ 6091.014556] tlv320aic325x-codec tlv320aic325x-codec.0: read b => 82
    [ 6091.021667] tlv320aic325x-codec tlv320aic325x-codec.0: read 12 => 82
    [ 6091.028900] tlv320aic325x-codec tlv320aic325x-codec.0: read c => 87
    [ 6091.036010] tlv320aic325x-codec tlv320aic325x-codec.0: read 13 => 8e
    [ 6091.043365] tlv320aic325x-codec tlv320aic325x-codec.0: read 101 => a
    [ 6091.083404] tlv320aic325x-codec tlv320aic325x-codec.0: write 17d = 13
    [ 6091.091003] aess aess: read 28 => 0
    [ 6091.095001] aess aess: write 28 = 1
    [ 6091.099182] aess aess: read 29 => 0
    [ 6091.103149] aess aess: write 29 = 4
    [ 6091.107177] aess aess: read 2f => 0
    [ 6091.111145] aess aess: write 2f = 4
    [ 6091.115295] aess aess: read 33 => 0
    [ 6091.119293] aess aess: write 33 = 1
    [ 6091.123870] tlv320aic325x-codec tlv320aic325x-codec.0: read 3f => 54
    [ 6091.131164] tlv320aic325x-codec tlv320aic325x-codec.0: write 3f = d4
    [ 6091.139953] aess aess: read 43 => 0
    [ 6091.143920] aess aess: write 43 = 1
    [ 6091.148010] aess aess: read 48 => 0
    [ 6091.152038] aess aess: write 48 = 1
    [ 6091.156127] aess aess: read 4b => 0
    [ 6091.160156] aess aess: write 4b = 2
    [ 6091.164733] tlv320aic325x-codec tlv320aic325x-codec.0: read 109 => 3c
    [ 6091.172485] tlv320aic325x-codec tlv320aic325x-codec.0: read 109 => 3c
    [ 6091.180175] tlv320aic325x-codec tlv320aic325x-codec.0: Setting full bias
    [ 6091.187652] soc-audio soc-audio: Setting full bias
    [ 6091.192993] soc-audio soc-audio: Setting full bias
    [ 6091.198699] tlv320aic325x-codec tlv320aic325x-codec.0: read 1e => 82
    [ 6091.205749] aess aess: OPP: id 5 = 25%
    [ 6091.209991] aess aess: OPP: id 6 = 100%
    [ 6091.214233] aess aess: OPP: id 12 = 100%
    [ 6091.218597] aess aess: OPP: id 16 = 25%
    [ 6091.222930] aess aess: OPP: id 32 = 25%
    [ 6091.227172] aess aess: OPP: id 37 = 25%
    [ 6091.231414] aess aess: OPP: id 40 = 50%
    [ 6091.235870] aess aess: new OPP level is 100
    [ 6091.240478] tlv320aic325x-codec tlv320aic325x-codec.0: widget Right ADC
    [ 6091.240478]  Right Capture stream Playback event 1
    [ 6091.253051] tlv320aic325x-codec tlv320aic325x-codec.0: widget Left ADC
    [ 6091.253051]  Left Capture stream Playback event 1
    [ 6091.265411] sr_class1p5_calib_work: iva: Calibration complete: Voltage Nominal=1140000Calib=949540 margin=0
    [ 6091.276123] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIOUT
    [ 6091.276123]  ASI Capture stream Playback event 1
    [ 6091.288177] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIIN
    [ 6091.288208]  ASI Playback stream Playback event 1
    [ 6091.301635] omap-abe-dai omap-abe-dai: omap_abe_dai_prepare: MultiMedia1
    [ 6091.309051]  FM-EXT: pm: BE FM-EXT stream MultiMedia1 Playback event 1 dir 0
    [ 6091.316772] aess aess: widget VXREC
    [ 6091.316772]  VXREC Capture stream MultiMedia1 Playback event 1
    [ 6091.327056] aess aess: widget DMIC2
    [ 6091.327056]  DMIC2 Capture stream MultiMedia1 Playback event 1
    [ 6091.337341] aess aess: widget DMIC1
    [ 6091.337341]  DMIC1 Capture stream MultiMedia1 Playback event 1
    [ 6091.347625] aess aess: widget DMIC0
    [ 6091.347625]  DMIC0 Capture stream MultiMedia1 Playback event 1
    [ 6091.357818] aess aess: widget MM_EXT_DL
    [ 6091.357849]  FM Playback stream MultiMedia1 Playback event 1
    [ 6091.368286] aess aess: widget MM_EXT_UL
    [ 6091.368316]  FM Capture stream MultiMedia1 Playback event 1
    [ 6091.378662] aess aess: widget BT_VX_DL
    [ 6091.378692]  BT Playback stream MultiMedia1 Playback event 1
    [ 6091.389038] aess aess: widget BT_VX_UL
    [ 6091.389038]  BT Capture stream MultiMedia1 Playback event 1
    [ 6091.399322] aess aess: widget PDM_VIB
    [ 6091.399322]  Vibra Playback stream MultiMedia1 Playback event 1
    [ 6091.409881] aess aess: widget PDM_DL2
    [ 6091.409881]  HF Playback stream MultiMedia1 Playback event 1
    [ 6091.420104] aess aess: widget PDM_DL1
    [ 6091.420104]  HS Playback stream MultiMedia1 Playback event 1
    [ 6091.430389] aess aess: widget PDM_UL1
    [ 6091.430389]  Analog Capture stream MultiMedia1 Playback event 1
    [ 6091.440948] aess aess: widget MODEM_UL
    [ 6091.440948]  MODEM Capture stream MultiMedia1 Playback event 1
    [ 6091.451599] aess aess: widget MODEM_DL
    [ 6091.451599]  MODEM Playback stream MultiMedia1 Playback event 1
    [ 6091.462249] aess aess: widget VIB_DL
    [ 6091.462249]  Vibra Playback stream MultiMedia1 Playback event 1
    [ 6091.472717] aess aess: widget MM_DL_LP
    [ 6091.472717]   MultiMedia1 LP Playback stream MultiMedia1 Playback event 1
    [ 6091.484405] aess aess: widget MM_DL
    [ 6091.484405]   MultiMedia1 Playback stream MultiMedia1 Playback event 1
    [ 6091.495391] aess aess: widget MM_UL2
    [ 6091.495391]  MultiMedia2 Capture stream MultiMedia1 Playback event 1
    [ 6091.506347] aess aess: widget MM_UL1
    [ 6091.506347]  MultiMedia1 Capture stream MultiMedia1 Playback event 1
    [ 6091.517272] aess aess: widget VX_UL
    [ 6091.517303]  Voice Capture stream MultiMedia1 Playback event 1
    [ 6091.527557] aess aess: widget VX_DL
    [ 6091.527587]  Voice Playback stream MultiMedia1 Playback event 1
    [ 6091.537933] aess aess: widget TONES_DL
    [ 6091.537933]  Tones Playback stream MultiMedia1 Playback event 1
    [ 6091.549285] aess aess: OPP: id 5 = 25%
    [ 6091.553436] aess aess: OPP: id 6 = 100%
    [ 6091.557647] aess aess: OPP: id 12 = 100%
    [ 6091.562042] aess aess: OPP: id 16 = 25%
    [ 6091.566314] aess aess: OPP: id 32 = 25%
    [ 6091.570556] aess aess: OPP: id 37 = 25%
    [ 6091.574890] aess aess: OPP: id 40 = 50%
    [ 6091.579132] aess aess: new OPP level is 100
    [ 6091.583740] tlv320aic325x-codec tlv320aic325x-codec.0: widget Right ADC
    [ 6091.583740]  Right Capture stream MultiMedia1 Playback event 1
    [ 6091.597442] tlv320aic325x-codec tlv320aic325x-codec.0: widget Left ADC
    [ 6091.597473]  Left Capture stream MultiMedia1 Playback event 1
    [ 6091.610931] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIOUT
    [ 6091.610931]  ASI Capture stream MultiMedia1 Playback event 1
    [ 6091.624114] tlv320aic325x-codec tlv320aic325x-codec.0: widget ASIIN
    [ 6091.624114]  ASI Playback stream MultiMedia1 Playback event 1
    [ 6091.638641]  aic3256_Playback: dsp: bespoke trigger FE aic3256_Playback cmd 1
    [ 6091.646423] omap-abe-dai omap-abe-dai: omap_abe_dai_bespoke_trigger: MultiMedia1 cmd 1
    [ 6091.655090]  aic3256_Playback: playback_trigger: MultiMedia1 0
    [ 6091.661529]  FM-EXT: mute_be: omap-mcbsp-dai.2 0
    [ 6091.666595]  FM-EXT: enable_be_port: omap-mcbsp-dai.2 0
    [ 6091.672332] port mm_ext_dl increment count 0
    [ 6091.677062] port mm_ext_dl phy port 12 enabled
    [ 6091.682739]  FM-EXT: unmute_be: omap-mcbsp-dai.2 0
    [ 6091.688049]  aic3256_Playback: enable_fe_port: MultiMedia1 0
    [ 6091.694213] port mm_dl1 increment count 0
    [ 6091.698669] port mm_dl1 phy port 6 enabled
    [ 6091.703247]  aic3256_Playback: unmute_fe_port: MultiMedia1 0
    [ 6091.709442]  aic3256_Playback: mute_fe_port_playback: unmute FE aic3256_Playback
    

    As you can see there's plenty of "Playback event 1" lines, meaning that the PCM streams are being started, but there's no output coming out of the OMAP.  We have an oscilloscope on the McBSP3 pins and we can see the I2S bit clock starting up (it is mastered from the TLV320AIC3256 codec) so the DAPM appears to be working properly.  We even see microphone data coming from the codec to the OMAP, although we aren't trying to do anything with that yet.  So the codec is functioning properly.  The I2S data line from the OMAP to the codec isn't toggling at all, which to me means that the ABE isn't outputting any data.  What am I be missing here?

  • We have solved our issue.

    There were two things that had to change (in addition to everything done previously in this thread).  The first was that I had to add back in these McBSP rx/tx thresholds settings to the hw_params() callback:

    	if (params != NULL) {
    		/* Configure McBSP internal buffer usage */
    		channels = params_channels(params);
    		
    		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
    			omap_mcbsp_set_tx_threshold(
    				cpu_dai->id, channels);
    		else
    			omap_mcbsp_set_rx_threshold(
    				cpu_dai->id, channels);
    	}

    These were missing from the patch suggested by Boyko earlier in the thread.  Second, we had to modify omap-abe.c to change the McBSP port number.  The driver by default points to McBSP 2, but we have our codec hooked up to McBSP3.  (General advice for everyone: be careful of the difference in the port numbers depending on which code you're looking at.  In some places it's 0-indexed, in other places it's 1-indexed.)

    	case OMAP_ABE_DAI_MM_FM:
    		if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
    
    			/* port can only be configured if it's not running */
    			if (omap_abe_port_is_enabled(abe_priv->abe,
    					abe_priv->port[OMAP_ABE_BE_PORT_MM_EXT_DL]))
    				return;
    
    			/* MM_EXT connection to McBSP 2 ports */
    			format.f = 48000;
    			format.samp_format = STEREO_RSHIFTED_16;
    			abe_connect_serial_port(MM_EXT_OUT_PORT, &format, MCBSP3_TX);
    			omap_abe_port_enable(abe_priv->abe,
    				abe_priv->port[OMAP_ABE_BE_PORT_MM_EXT_DL]);
    		} else {
    
    			/* port can only be configured if it's not running */
    			if (omap_abe_port_is_enabled(abe_priv->abe,
    					abe_priv->port[OMAP_ABE_BE_PORT_MM_EXT_UL]))
    				return;
    
    			/* MM_EXT connection to McBSP 2 ports */
    			format.f = 48000;
    			format.samp_format = STEREO_RSHIFTED_16;
    			abe_connect_serial_port(MM_EXT_IN_PORT, &format, MCBSP3_RX);
    			omap_abe_port_enable(abe_priv->abe,
    				abe_priv->port[OMAP_ABE_BE_PORT_MM_EXT_UL]);
    		}
    		break;
    

    After we changed that the audio is now working perfectly.  Thank you TI for the help in getting it up and running.