@@ -3860,12 +3860,10 @@ snd_soc_dapm_alloc_kcontrol(struct snd_soc_card *card,
3860
3860
return NULL ;
3861
3861
}
3862
3862
3863
- int snd_soc_dapm_new_pcm (struct snd_soc_card * card ,
3864
- struct snd_soc_pcm_runtime * rtd ,
3865
- const struct snd_soc_pcm_stream * params ,
3866
- unsigned int num_params ,
3867
- struct snd_soc_dapm_widget * source ,
3868
- struct snd_soc_dapm_widget * sink )
3863
+ static struct snd_soc_dapm_widget *
3864
+ snd_soc_dapm_new_dai (struct snd_soc_card * card , struct snd_soc_pcm_runtime * rtd ,
3865
+ struct snd_soc_dapm_widget * source ,
3866
+ struct snd_soc_dapm_widget * sink )
3869
3867
{
3870
3868
struct snd_soc_dapm_widget template ;
3871
3869
struct snd_soc_dapm_widget * w ;
@@ -3877,7 +3875,7 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
3877
3875
link_name = devm_kasprintf (card -> dev , GFP_KERNEL , "%s-%s" ,
3878
3876
source -> name , sink -> name );
3879
3877
if (!link_name )
3880
- return - ENOMEM ;
3878
+ return ERR_PTR ( - ENOMEM ) ;
3881
3879
3882
3880
memset (& template , 0 , sizeof (template ));
3883
3881
template .reg = SND_SOC_NOPM ;
@@ -3889,9 +3887,10 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
3889
3887
template .kcontrol_news = NULL ;
3890
3888
3891
3889
/* allocate memory for control, only in case of multiple configs */
3892
- if (num_params > 1 ) {
3893
- w_param_text = devm_kcalloc (card -> dev , num_params ,
3894
- sizeof (char * ), GFP_KERNEL );
3890
+ if (rtd -> dai_link -> num_params > 1 ) {
3891
+ w_param_text = devm_kcalloc (card -> dev ,
3892
+ rtd -> dai_link -> num_params ,
3893
+ sizeof (char * ), GFP_KERNEL );
3895
3894
if (!w_param_text ) {
3896
3895
ret = - ENOMEM ;
3897
3896
goto param_fail ;
@@ -3900,7 +3899,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
3900
3899
template .num_kcontrols = 1 ;
3901
3900
template .kcontrol_news =
3902
3901
snd_soc_dapm_alloc_kcontrol (card ,
3903
- link_name , params , num_params ,
3902
+ link_name ,
3903
+ rtd -> dai_link -> params ,
3904
+ rtd -> dai_link -> num_params ,
3904
3905
w_param_text , & private_value );
3905
3906
if (!template .kcontrol_news ) {
3906
3907
ret = - ENOMEM ;
@@ -3915,23 +3916,19 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
3915
3916
if (IS_ERR (w ))
3916
3917
goto outfree_kcontrol_news ;
3917
3918
3918
- w -> params = params ;
3919
- w -> num_params = num_params ;
3919
+ w -> params = rtd -> dai_link -> params ;
3920
+ w -> num_params = rtd -> dai_link -> num_params ;
3920
3921
w -> priv = rtd ;
3921
3922
3922
- ret = snd_soc_dapm_add_path (& card -> dapm , source , w , NULL , NULL );
3923
- if (ret )
3924
- goto outfree_w ;
3925
- return snd_soc_dapm_add_path (& card -> dapm , w , sink , NULL , NULL );
3923
+ return w ;
3926
3924
3927
- outfree_w :
3928
- devm_kfree (card -> dev , w );
3929
3925
outfree_kcontrol_news :
3930
3926
devm_kfree (card -> dev , (void * )template .kcontrol_news );
3931
- snd_soc_dapm_free_kcontrol (card , & private_value , num_params , w_param_text );
3927
+ snd_soc_dapm_free_kcontrol (card , & private_value ,
3928
+ rtd -> dai_link -> num_params , w_param_text );
3932
3929
param_fail :
3933
3930
devm_kfree (card -> dev , link_name );
3934
- return ret ;
3931
+ return ERR_PTR ( ret ) ;
3935
3932
}
3936
3933
3937
3934
int snd_soc_dapm_new_dai_widgets (struct snd_soc_dapm_context * dapm ,
@@ -4041,33 +4038,65 @@ static void dapm_connect_dai_link_widgets(struct snd_soc_card *card,
4041
4038
{
4042
4039
struct snd_soc_dai * cpu_dai = rtd -> cpu_dai ;
4043
4040
struct snd_soc_dai * codec_dai ;
4044
- struct snd_soc_dapm_widget * sink , * source ;
4041
+ struct snd_soc_dapm_widget * playback = NULL , * capture = NULL ;
4042
+ struct snd_soc_dapm_widget * codec , * playback_cpu , * capture_cpu ;
4045
4043
int i ;
4046
4044
4045
+ if (rtd -> dai_link -> params ) {
4046
+ if (rtd -> num_codecs > 1 )
4047
+ dev_warn (card -> dev , "ASoC: Multiple codecs not supported yet\n" );
4048
+
4049
+ playback_cpu = cpu_dai -> capture_widget ;
4050
+ capture_cpu = cpu_dai -> playback_widget ;
4051
+ } else {
4052
+ playback = cpu_dai -> playback_widget ;
4053
+ capture = cpu_dai -> capture_widget ;
4054
+ playback_cpu = playback ;
4055
+ capture_cpu = capture ;
4056
+ }
4057
+
4047
4058
for_each_rtd_codec_dai (rtd , i , codec_dai ) {
4048
4059
4049
4060
/* connect BE DAI playback if widgets are valid */
4050
- if (codec_dai -> playback_widget && cpu_dai -> playback_widget ) {
4051
- source = cpu_dai -> playback_widget ;
4052
- sink = codec_dai -> playback_widget ;
4061
+ codec = codec_dai -> playback_widget ;
4062
+
4063
+ if (playback_cpu && codec ) {
4064
+ if (!playback ) {
4065
+ playback = snd_soc_dapm_new_dai (card , rtd ,
4066
+ playback_cpu ,
4067
+ codec );
4068
+
4069
+ snd_soc_dapm_add_path (& card -> dapm , playback_cpu ,
4070
+ playback , NULL , NULL );
4071
+ }
4072
+
4053
4073
dev_dbg (rtd -> dev , "connected DAI link %s:%s -> %s:%s\n" ,
4054
- cpu_dai -> component -> name , source -> name ,
4055
- codec_dai -> component -> name , sink -> name );
4074
+ cpu_dai -> component -> name , playback_cpu -> name ,
4075
+ codec_dai -> component -> name , codec -> name );
4056
4076
4057
- snd_soc_dapm_add_path (& card -> dapm , source , sink ,
4058
- NULL , NULL );
4077
+ snd_soc_dapm_add_path (& card -> dapm , playback , codec ,
4078
+ NULL , NULL );
4059
4079
}
4060
4080
4061
4081
/* connect BE DAI capture if widgets are valid */
4062
- if (codec_dai -> capture_widget && cpu_dai -> capture_widget ) {
4063
- source = codec_dai -> capture_widget ;
4064
- sink = cpu_dai -> capture_widget ;
4082
+ codec = codec_dai -> capture_widget ;
4083
+
4084
+ if (codec && capture_cpu ) {
4085
+ if (!capture ) {
4086
+ capture = snd_soc_dapm_new_dai (card , rtd ,
4087
+ codec ,
4088
+ capture_cpu );
4089
+
4090
+ snd_soc_dapm_add_path (& card -> dapm , capture ,
4091
+ capture_cpu , NULL , NULL );
4092
+ }
4093
+
4065
4094
dev_dbg (rtd -> dev , "connected DAI link %s:%s -> %s:%s\n" ,
4066
- codec_dai -> component -> name , source -> name ,
4067
- cpu_dai -> component -> name , sink -> name );
4095
+ codec_dai -> component -> name , codec -> name ,
4096
+ cpu_dai -> component -> name , capture_cpu -> name );
4068
4097
4069
- snd_soc_dapm_add_path (& card -> dapm , source , sink ,
4070
- NULL , NULL );
4098
+ snd_soc_dapm_add_path (& card -> dapm , codec , capture ,
4099
+ NULL , NULL );
4071
4100
}
4072
4101
}
4073
4102
}
@@ -4122,7 +4151,7 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
4122
4151
* dynamic FE links have no fixed DAI mapping.
4123
4152
* CODEC<->CODEC links have no direct connection.
4124
4153
*/
4125
- if (rtd -> dai_link -> dynamic || rtd -> dai_link -> params )
4154
+ if (rtd -> dai_link -> dynamic )
4126
4155
continue ;
4127
4156
4128
4157
dapm_connect_dai_link_widgets (card , rtd );
0 commit comments