109 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| ==============================================
 | |
| Creating codec to codec dai link for ALSA dapm
 | |
| ==============================================
 | |
| 
 | |
| Mostly the flow of audio is always from CPU to codec so your system
 | |
| will look as below:
 | |
| ::
 | |
| 
 | |
|    ---------          ---------
 | |
|   |         |  dai   |         |
 | |
|       CPU    ------->    codec
 | |
|   |         |        |         |
 | |
|    ---------          ---------
 | |
| 
 | |
| In case your system looks as below:
 | |
| ::
 | |
| 
 | |
|                        ---------
 | |
|                       |         |
 | |
|                         codec-2
 | |
|                       |         |
 | |
|                       ---------
 | |
|                            |
 | |
|                          dai-2
 | |
|                            |
 | |
|    ----------          ---------
 | |
|   |          |  dai-1 |         |
 | |
|       CPU     ------->  codec-1
 | |
|   |          |        |         |
 | |
|    ----------          ---------
 | |
|                            |
 | |
|                          dai-3
 | |
|                            |
 | |
|                        ---------
 | |
|                       |         |
 | |
|                         codec-3
 | |
|                       |         |
 | |
|                        ---------
 | |
| 
 | |
| Suppose codec-2 is a bluetooth chip and codec-3 is connected to
 | |
| a speaker and you have a below scenario:
 | |
| codec-2 will receive the audio data and the user wants to play that
 | |
| audio through codec-3 without involving the CPU.This
 | |
| aforementioned case is the ideal case when codec to codec
 | |
| connection should be used.
 | |
| 
 | |
| Your dai_link should appear as below in your machine
 | |
| file:
 | |
| ::
 | |
| 
 | |
|  /*
 | |
|   * this pcm stream only supports 24 bit, 2 channel and
 | |
|   * 48k sampling rate.
 | |
|   */
 | |
|  static const struct snd_soc_pcm_stream dsp_codec_params = {
 | |
|         .formats = SNDRV_PCM_FMTBIT_S24_LE,
 | |
|         .rate_min = 48000,
 | |
|         .rate_max = 48000,
 | |
|         .channels_min = 2,
 | |
|         .channels_max = 2,
 | |
|  };
 | |
| 
 | |
|  {
 | |
|     .name = "CPU-DSP",
 | |
|     .stream_name = "CPU-DSP",
 | |
|     .cpu_dai_name = "samsung-i2s.0",
 | |
|     .codec_name = "codec-2,
 | |
|     .codec_dai_name = "codec-2-dai_name",
 | |
|     .platform_name = "samsung-i2s.0",
 | |
|     .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
 | |
|             | SND_SOC_DAIFMT_CBM_CFM,
 | |
|     .ignore_suspend = 1,
 | |
|     .params = &dsp_codec_params,
 | |
|  },
 | |
|  {
 | |
|     .name = "DSP-CODEC",
 | |
|     .stream_name = "DSP-CODEC",
 | |
|     .cpu_dai_name = "wm0010-sdi2",
 | |
|     .codec_name = "codec-3,
 | |
|     .codec_dai_name = "codec-3-dai_name",
 | |
|     .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
 | |
|             | SND_SOC_DAIFMT_CBM_CFM,
 | |
|     .ignore_suspend = 1,
 | |
|     .params = &dsp_codec_params,
 | |
|  },
 | |
| 
 | |
| Above code snippet is motivated from sound/soc/samsung/speyside.c.
 | |
| 
 | |
| Note the "params" callback which lets the dapm know that this
 | |
| dai_link is a codec to codec connection.
 | |
| 
 | |
| In dapm core a route is created between cpu_dai playback widget
 | |
| and codec_dai capture widget for playback path and vice-versa is
 | |
| true for capture path. In order for this aforementioned route to get
 | |
| triggered, DAPM needs to find a valid endpoint which could be either
 | |
| a sink or source widget corresponding to playback and capture path
 | |
| respectively.
 | |
| 
 | |
| In order to trigger this dai_link widget, a thin codec driver for
 | |
| the speaker amp can be created as demonstrated in wm8727.c file, it
 | |
| sets appropriate constraints for the device even if it needs no control.
 | |
| 
 | |
| Make sure to name your corresponding cpu and codec playback and capture
 | |
| dai names ending with "Playback" and "Capture" respectively as dapm core
 | |
| will link and power those dais based on the name.
 | |
| 
 | |
| Note that in current device tree there is no way to mark a dai_link
 | |
| as codec to codec. However, it may change in future.
 | 
