@@ -23,12 +23,14 @@ struct simple_card_data {
23
23
struct snd_soc_card snd_card ;
24
24
struct snd_soc_codec_conf codec_conf ;
25
25
struct simple_dai_props {
26
- struct asoc_simple_dai dai ;
26
+ struct asoc_simple_dai * cpu_dai ;
27
+ struct asoc_simple_dai * codec_dai ;
27
28
struct snd_soc_dai_link_component codecs ;
28
29
struct snd_soc_dai_link_component platform ;
29
30
struct asoc_simple_card_data adata ;
30
31
} * dai_props ;
31
32
struct snd_soc_dai_link * dai_link ;
33
+ struct asoc_simple_dai * dais ;
32
34
struct asoc_simple_card_data adata ;
33
35
};
34
36
@@ -47,8 +49,17 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
47
49
struct simple_card_data * priv = snd_soc_card_get_drvdata (rtd -> card );
48
50
struct simple_dai_props * dai_props =
49
51
simple_priv_to_props (priv , rtd -> num );
52
+ int ret ;
53
+
54
+ ret = asoc_simple_card_clk_enable (dai_props -> cpu_dai );
55
+ if (ret )
56
+ return ret ;
57
+
58
+ ret = asoc_simple_card_clk_enable (dai_props -> codec_dai );
59
+ if (ret )
60
+ asoc_simple_card_clk_disable (dai_props -> cpu_dai );
50
61
51
- return asoc_simple_card_clk_enable ( & dai_props -> dai ) ;
62
+ return ret ;
52
63
}
53
64
54
65
static void asoc_simple_card_shutdown (struct snd_pcm_substream * substream )
@@ -58,7 +69,9 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
58
69
struct simple_dai_props * dai_props =
59
70
simple_priv_to_props (priv , rtd -> num );
60
71
61
- asoc_simple_card_clk_disable (& dai_props -> dai );
72
+ asoc_simple_card_clk_disable (dai_props -> cpu_dai );
73
+
74
+ asoc_simple_card_clk_disable (dai_props -> codec_dai );
62
75
}
63
76
64
77
static const struct snd_soc_ops asoc_simple_card_ops = {
@@ -68,19 +81,21 @@ static const struct snd_soc_ops asoc_simple_card_ops = {
68
81
69
82
static int asoc_simple_card_dai_init (struct snd_soc_pcm_runtime * rtd )
70
83
{
71
- struct simple_card_data * priv = snd_soc_card_get_drvdata (rtd -> card );
72
- struct snd_soc_dai * dai ;
73
- struct snd_soc_dai_link * dai_link ;
74
- struct simple_dai_props * dai_props ;
75
- int num = rtd -> num ;
84
+ struct simple_card_data * priv = snd_soc_card_get_drvdata (rtd -> card );
85
+ struct simple_dai_props * dai_props = simple_priv_to_props (priv , rtd -> num );
86
+ int ret ;
76
87
77
- dai_link = simple_priv_to_link (priv , num );
78
- dai_props = simple_priv_to_props (priv , num );
79
- dai = dai_link -> dynamic ?
80
- rtd -> cpu_dai :
81
- rtd -> codec_dai ;
88
+ ret = asoc_simple_card_init_dai (rtd -> codec_dai ,
89
+ dai_props -> codec_dai );
90
+ if (ret < 0 )
91
+ return ret ;
82
92
83
- return asoc_simple_card_init_dai (dai , & dai_props -> dai );
93
+ ret = asoc_simple_card_init_dai (rtd -> cpu_dai ,
94
+ dai_props -> cpu_dai );
95
+ if (ret < 0 )
96
+ return ret ;
97
+
98
+ return 0 ;
84
99
}
85
100
86
101
static int asoc_simple_card_be_hw_params_fixup (struct snd_soc_pcm_runtime * rtd ,
@@ -101,13 +116,14 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
101
116
struct device_node * np ,
102
117
struct device_node * codec ,
103
118
struct simple_card_data * priv ,
104
- int idx , bool is_fe ,
119
+ int * dai_idx , int link_idx , int is_fe ,
105
120
bool is_top_level_node )
106
121
{
107
122
struct device * dev = simple_priv_to_dev (priv );
108
- struct snd_soc_dai_link * dai_link = simple_priv_to_link (priv , idx );
109
- struct simple_dai_props * dai_props = simple_priv_to_props (priv , idx );
123
+ struct snd_soc_dai_link * dai_link = simple_priv_to_link (priv , link_idx );
124
+ struct simple_dai_props * dai_props = simple_priv_to_props (priv , link_idx );
110
125
struct snd_soc_card * card = simple_priv_to_card (priv );
126
+ struct asoc_simple_dai * dai ;
111
127
char * prefix = "" ;
112
128
int ret ;
113
129
@@ -129,12 +145,15 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
129
145
dai_link -> dynamic = 1 ;
130
146
dai_link -> dpcm_merged_format = 1 ;
131
147
148
+ dai =
149
+ dai_props -> cpu_dai = & priv -> dais [(* dai_idx )++ ];
150
+
132
151
ret = asoc_simple_card_parse_cpu (np , dai_link , DAI , CELL ,
133
152
& is_single_links );
134
153
if (ret )
135
154
return ret ;
136
155
137
- ret = asoc_simple_card_parse_clk_cpu (dev , np , dai_link , & dai_props -> dai );
156
+ ret = asoc_simple_card_parse_clk_cpu (dev , np , dai_link , dai );
138
157
if (ret < 0 )
139
158
return ret ;
140
159
@@ -155,11 +174,14 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
155
174
dai_link -> no_pcm = 1 ;
156
175
dai_link -> be_hw_params_fixup = asoc_simple_card_be_hw_params_fixup ;
157
176
177
+ dai =
178
+ dai_props -> codec_dai = & priv -> dais [(* dai_idx )++ ];
179
+
158
180
ret = asoc_simple_card_parse_codec (np , dai_link , DAI , CELL );
159
181
if (ret < 0 )
160
182
return ret ;
161
183
162
- ret = asoc_simple_card_parse_clk_codec (dev , np , dai_link , & dai_props -> dai );
184
+ ret = asoc_simple_card_parse_clk_codec (dev , np , dai_link , dai );
163
185
if (ret < 0 )
164
186
return ret ;
165
187
@@ -184,7 +206,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *link,
184
206
185
207
asoc_simple_card_parse_convert (dev , link , prefix , & dai_props -> adata );
186
208
187
- ret = asoc_simple_card_of_parse_tdm (np , & dai_props -> dai );
209
+ ret = asoc_simple_card_of_parse_tdm (np , dai );
188
210
if (ret )
189
211
return ret ;
190
212
@@ -215,7 +237,8 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
215
237
struct device_node * codec ;
216
238
struct snd_soc_card * card = simple_priv_to_card (priv );
217
239
bool is_fe ;
218
- int ret , i , loop ;
240
+ int ret , loop ;
241
+ int dai_idx , link_idx ;
219
242
220
243
if (!top )
221
244
return - EINVAL ;
@@ -231,7 +254,8 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
231
254
asoc_simple_card_parse_convert (dev , top , PREFIX , & priv -> adata );
232
255
233
256
loop = 1 ;
234
- i = 0 ;
257
+ link_idx = 0 ;
258
+ dai_idx = 0 ;
235
259
node = of_get_child_by_name (top , PREFIX "dai-link" );
236
260
if (!node ) {
237
261
node = dev -> of_node ;
@@ -248,10 +272,10 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
248
272
is_fe = (np != codec );
249
273
250
274
ret = asoc_simple_card_dai_link_of (node , np , codec , priv ,
251
- i , is_fe , !loop );
275
+ & dai_idx , link_idx ++ ,
276
+ is_fe , !loop );
252
277
if (ret < 0 )
253
278
return ret ;
254
- i ++ ;
255
279
}
256
280
node = of_get_next_child (top , node );
257
281
} while (loop && node );
@@ -342,6 +366,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
342
366
struct simple_card_data * priv ;
343
367
struct snd_soc_dai_link * dai_link ;
344
368
struct simple_dai_props * dai_props ;
369
+ struct asoc_simple_dai * dais ;
345
370
struct snd_soc_card * card ;
346
371
struct device * dev = & pdev -> dev ;
347
372
int ret , i ;
@@ -358,7 +383,8 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
358
383
359
384
dai_props = devm_kcalloc (dev , lnum , sizeof (* dai_props ), GFP_KERNEL );
360
385
dai_link = devm_kcalloc (dev , lnum , sizeof (* dai_link ), GFP_KERNEL );
361
- if (!dai_props || !dai_link )
386
+ dais = devm_kcalloc (dev , dnum , sizeof (* dais ), GFP_KERNEL );
387
+ if (!dai_props || !dai_link || !dais )
362
388
return - ENOMEM ;
363
389
364
390
/*
@@ -375,6 +401,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
375
401
376
402
priv -> dai_props = dai_props ;
377
403
priv -> dai_link = dai_link ;
404
+ priv -> dais = dais ;
378
405
379
406
/* Init snd_soc_card */
380
407
card = simple_priv_to_card (priv );
0 commit comments