@@ -292,7 +292,7 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
292
292
struct skl_module_iface * m_iface = & m_cfg -> module -> formats [fmt_idx ];
293
293
294
294
/* check if we already have blob */
295
- if (m_cfg -> formats_config .caps_size > 0 )
295
+ if (m_cfg -> formats_config [ SKL_PARAM_INIT ] .caps_size > 0 )
296
296
return 0 ;
297
297
298
298
dev_dbg (skl -> dev , "Applying default cfg blob\n" );
@@ -328,8 +328,8 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
328
328
cfg = skl_get_ep_blob (skl , m_cfg -> vbus_id , link_type ,
329
329
s_fmt , ch , s_freq , dir , dev_type );
330
330
if (cfg ) {
331
- m_cfg -> formats_config .caps_size = cfg -> size ;
332
- m_cfg -> formats_config .caps = (u32 * ) & cfg -> caps ;
331
+ m_cfg -> formats_config [ SKL_PARAM_INIT ] .caps_size = cfg -> size ;
332
+ m_cfg -> formats_config [ SKL_PARAM_INIT ] .caps = (u32 * )& cfg -> caps ;
333
333
} else {
334
334
dev_err (skl -> dev , "Blob NULL for id %x type %d dirn %d\n" ,
335
335
m_cfg -> vbus_id , link_type , dir );
@@ -386,9 +386,9 @@ static int skl_tplg_set_module_params(struct snd_soc_dapm_widget *w,
386
386
struct skl_algo_data * bc ;
387
387
struct skl_specific_cfg * sp_cfg ;
388
388
389
- if (mconfig -> formats_config .caps_size > 0 &&
390
- mconfig -> formats_config .set_params == SKL_PARAM_SET ) {
391
- sp_cfg = & mconfig -> formats_config ;
389
+ if (mconfig -> formats_config [ SKL_PARAM_SET ] .caps_size > 0 &&
390
+ mconfig -> formats_config [ SKL_PARAM_SET ] .set_params == SKL_PARAM_SET ) {
391
+ sp_cfg = & mconfig -> formats_config [ SKL_PARAM_SET ] ;
392
392
ret = skl_set_module_params (skl , sp_cfg -> caps ,
393
393
sp_cfg -> caps_size ,
394
394
sp_cfg -> param_id , mconfig );
@@ -438,8 +438,10 @@ static int skl_tplg_set_module_init_data(struct snd_soc_dapm_widget *w)
438
438
if (bc -> set_params != SKL_PARAM_INIT )
439
439
continue ;
440
440
441
- mconfig -> formats_config .caps = (u32 * )bc -> params ;
442
- mconfig -> formats_config .caps_size = bc -> size ;
441
+ mconfig -> formats_config [SKL_PARAM_INIT ].caps =
442
+ (u32 * )bc -> params ;
443
+ mconfig -> formats_config [SKL_PARAM_INIT ].caps_size =
444
+ bc -> size ;
443
445
444
446
break ;
445
447
}
@@ -798,9 +800,10 @@ static int skl_tplg_set_module_bind_params(struct snd_soc_dapm_widget *w,
798
800
return 0 ;
799
801
}
800
802
801
- if (mconfig -> formats_config .caps_size > 0 &&
802
- mconfig -> formats_config .set_params == SKL_PARAM_BIND ) {
803
- sp_cfg = & mconfig -> formats_config ;
803
+ if (mconfig -> formats_config [SKL_PARAM_BIND ].caps_size > 0 &&
804
+ mconfig -> formats_config [SKL_PARAM_BIND ].set_params ==
805
+ SKL_PARAM_BIND ) {
806
+ sp_cfg = & mconfig -> formats_config [SKL_PARAM_BIND ];
804
807
ret = skl_set_module_params (skl , sp_cfg -> caps ,
805
808
sp_cfg -> caps_size ,
806
809
sp_cfg -> param_id , mconfig );
@@ -1496,7 +1499,8 @@ static int skl_tplg_mic_control_get(struct snd_kcontrol *kcontrol,
1496
1499
static int skl_fill_mic_sel_params (struct skl_module_cfg * mconfig ,
1497
1500
struct skl_mic_sel_config * mic_cfg , struct device * dev )
1498
1501
{
1499
- struct skl_specific_cfg * sp_cfg = & mconfig -> formats_config ;
1502
+ struct skl_specific_cfg * sp_cfg =
1503
+ & mconfig -> formats_config [SKL_PARAM_INIT ];
1500
1504
1501
1505
sp_cfg -> caps_size = sizeof (struct skl_mic_sel_config );
1502
1506
sp_cfg -> set_params = SKL_PARAM_SET ;
@@ -1849,8 +1853,8 @@ static int skl_tplg_be_fill_pipe_params(struct snd_soc_dai *dai,
1849
1853
pipe_fmt -> freq , pipe -> direction ,
1850
1854
dev_type );
1851
1855
if (cfg ) {
1852
- mconfig -> formats_config .caps_size = cfg -> size ;
1853
- mconfig -> formats_config .caps = (u32 * ) & cfg -> caps ;
1856
+ mconfig -> formats_config [ SKL_PARAM_INIT ] .caps_size = cfg -> size ;
1857
+ mconfig -> formats_config [ SKL_PARAM_INIT ] .caps = (u32 * )& cfg -> caps ;
1854
1858
} else {
1855
1859
dev_err (dai -> dev , "Blob NULL for id:%d type:%d dirn:%d ch:%d, freq:%d, fmt:%d\n" ,
1856
1860
mconfig -> vbus_id , link_type , params -> stream ,
@@ -2567,19 +2571,26 @@ static int skl_tplg_get_token(struct device *dev,
2567
2571
2568
2572
break ;
2569
2573
2574
+ case SKL_TKN_U32_FMT_CFG_IDX :
2575
+ if (tkn_elem -> value > SKL_MAX_PARAMS_TYPES )
2576
+ return - EINVAL ;
2577
+
2578
+ mconfig -> fmt_cfg_idx = tkn_elem -> value ;
2579
+ break ;
2580
+
2570
2581
case SKL_TKN_U32_CAPS_SIZE :
2571
- mconfig -> formats_config .caps_size =
2582
+ mconfig -> formats_config [ mconfig -> fmt_cfg_idx ] .caps_size =
2572
2583
tkn_elem -> value ;
2573
2584
2574
2585
break ;
2575
2586
2576
2587
case SKL_TKN_U32_CAPS_SET_PARAMS :
2577
- mconfig -> formats_config .set_params =
2588
+ mconfig -> formats_config [ mconfig -> fmt_cfg_idx ] .set_params =
2578
2589
tkn_elem -> value ;
2579
2590
break ;
2580
2591
2581
2592
case SKL_TKN_U32_CAPS_PARAMS_ID :
2582
- mconfig -> formats_config .param_id =
2593
+ mconfig -> formats_config [ mconfig -> fmt_cfg_idx ] .param_id =
2583
2594
tkn_elem -> value ;
2584
2595
break ;
2585
2596
@@ -2793,6 +2804,7 @@ static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
2793
2804
struct skl_dfw_v4_module * dfw =
2794
2805
(struct skl_dfw_v4_module * )tplg_w -> priv .data ;
2795
2806
int ret ;
2807
+ int idx = mconfig -> fmt_cfg_idx ;
2796
2808
2797
2809
dev_dbg (dev , "Parsing Skylake v4 widget topology data\n" );
2798
2810
@@ -2826,7 +2838,7 @@ static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
2826
2838
mconfig -> dev_type = dfw -> dev_type ;
2827
2839
mconfig -> hw_conn_type = dfw -> hw_conn_type ;
2828
2840
mconfig -> time_slot = dfw -> time_slot ;
2829
- mconfig -> formats_config .caps_size = dfw -> caps .caps_size ;
2841
+ mconfig -> formats_config [ idx ] .caps_size = dfw -> caps .caps_size ;
2830
2842
2831
2843
mconfig -> m_in_pin = devm_kcalloc (dev ,
2832
2844
MAX_IN_QUEUE , sizeof (* mconfig -> m_in_pin ),
@@ -2847,21 +2859,39 @@ static int skl_tplg_get_pvt_data_v4(struct snd_soc_tplg_dapm_widget *tplg_w,
2847
2859
dfw -> is_dynamic_out_pin ,
2848
2860
mconfig -> module -> max_output_pins );
2849
2861
2850
- if (mconfig -> formats_config .caps_size ) {
2851
- mconfig -> formats_config .set_params = dfw -> caps .set_params ;
2852
- mconfig -> formats_config .param_id = dfw -> caps .param_id ;
2853
- mconfig -> formats_config .caps =
2854
- devm_kzalloc (dev , mconfig -> formats_config .caps_size ,
2862
+ if (mconfig -> formats_config [ idx ] .caps_size ) {
2863
+ mconfig -> formats_config [ idx ] .set_params = dfw -> caps .set_params ;
2864
+ mconfig -> formats_config [ idx ] .param_id = dfw -> caps .param_id ;
2865
+ mconfig -> formats_config [ idx ] .caps =
2866
+ devm_kzalloc (dev , mconfig -> formats_config [ idx ] .caps_size ,
2855
2867
GFP_KERNEL );
2856
- if (!mconfig -> formats_config .caps )
2868
+ if (!mconfig -> formats_config [ idx ] .caps )
2857
2869
return - ENOMEM ;
2858
- memcpy (mconfig -> formats_config .caps , dfw -> caps .caps ,
2870
+ memcpy (mconfig -> formats_config [ idx ] .caps , dfw -> caps .caps ,
2859
2871
dfw -> caps .caps_size );
2860
2872
}
2861
2873
2862
2874
return 0 ;
2863
2875
}
2864
2876
2877
+ static int skl_tplg_get_caps_data (struct device * dev , char * data ,
2878
+ struct skl_module_cfg * mconfig )
2879
+ {
2880
+ int idx = mconfig -> fmt_cfg_idx ;
2881
+
2882
+ if (mconfig -> formats_config [idx ].caps_size > 0 ) {
2883
+ mconfig -> formats_config [idx ].caps =
2884
+ devm_kzalloc (dev , mconfig -> formats_config [idx ].caps_size ,
2885
+ GFP_KERNEL );
2886
+ if (!mconfig -> formats_config [idx ].caps )
2887
+ return - ENOMEM ;
2888
+ memcpy (mconfig -> formats_config [idx ].caps , data ,
2889
+ mconfig -> formats_config [idx ].caps_size );
2890
+ }
2891
+
2892
+ return mconfig -> formats_config [idx ].caps_size ;
2893
+ }
2894
+
2865
2895
/*
2866
2896
* Parse the private data for the token and corresponding value.
2867
2897
* The private data can have multiple data blocks. So, a data block
@@ -2922,18 +2952,14 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
2922
2952
if (block_type == SKL_TYPE_TUPLE ) {
2923
2953
ret = skl_tplg_get_tokens (dev , data ,
2924
2954
skl , mconfig , block_size );
2925
-
2926
- if (ret < 0 )
2927
- return ret ;
2928
-
2929
- -- num_blocks ;
2930
2955
} else {
2931
- if (mconfig -> formats_config .caps_size > 0 )
2932
- memcpy (mconfig -> formats_config .caps , data ,
2933
- mconfig -> formats_config .caps_size );
2934
- -- num_blocks ;
2935
- ret = mconfig -> formats_config .caps_size ;
2956
+ ret = skl_tplg_get_caps_data (dev , data , mconfig );
2936
2957
}
2958
+
2959
+ if (ret < 0 )
2960
+ return ret ;
2961
+
2962
+ -- num_blocks ;
2937
2963
off += ret ;
2938
2964
}
2939
2965
@@ -3024,6 +3050,9 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt, int index,
3024
3050
*/
3025
3051
mconfig -> id .module_id = -1 ;
3026
3052
3053
+ /* To provide backward compatibility, set default as SKL_PARAM_INIT */
3054
+ mconfig -> fmt_cfg_idx = SKL_PARAM_INIT ;
3055
+
3027
3056
/* Parse private data for tuples */
3028
3057
ret = skl_tplg_get_pvt_data (tplg_w , skl , bus -> dev , mconfig );
3029
3058
if (ret < 0 )
0 commit comments