summaryrefslogtreecommitdiffstats
path: root/sound/soc/generic
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2019-07-26 08:10:09 -0400
committerMark Brown <broonie@kernel.org>2019-07-26 08:10:09 -0400
commit3b46a67af2eb8214a634a37c485146ca0ef42849 (patch)
tree1fef31dfdf401819f71158ad28ba87e7c8c4d886 /sound/soc/generic
parent3dcfb397dad2ad55bf50de3c5d5a57090d35a18a (diff)
parent1e112c35e3c96db7c8ca6ddaa96574f00c06e7db (diff)
Merge branch 'asoc-5.3' into asoc-5.4
Diffstat (limited to 'sound/soc/generic')
-rw-r--r--sound/soc/generic/audio-graph-card.c30
-rw-r--r--sound/soc/generic/simple-card-utils.c7
-rw-r--r--sound/soc/generic/simple-card.c26
3 files changed, 36 insertions, 27 deletions
diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c
index 30a4e8399ec3..288df245b2f0 100644
--- a/sound/soc/generic/audio-graph-card.c
+++ b/sound/soc/generic/audio-graph-card.c
@@ -63,6 +63,7 @@ static int graph_get_dai_id(struct device_node *ep)
63 struct device_node *endpoint; 63 struct device_node *endpoint;
64 struct of_endpoint info; 64 struct of_endpoint info;
65 int i, id; 65 int i, id;
66 const u32 *reg;
66 int ret; 67 int ret;
67 68
68 /* use driver specified DAI ID if exist */ 69 /* use driver specified DAI ID if exist */
@@ -83,8 +84,9 @@ static int graph_get_dai_id(struct device_node *ep)
83 return info.id; 84 return info.id;
84 85
85 node = of_get_parent(ep); 86 node = of_get_parent(ep);
87 reg = of_get_property(node, "reg", NULL);
86 of_node_put(node); 88 of_node_put(node);
87 if (of_get_property(node, "reg", NULL)) 89 if (reg)
88 return info.port; 90 return info.port;
89 } 91 }
90 node = of_graph_get_port_parent(ep); 92 node = of_graph_get_port_parent(ep);
@@ -208,10 +210,6 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
208 210
209 dev_dbg(dev, "link_of DPCM (%pOF)\n", ep); 211 dev_dbg(dev, "link_of DPCM (%pOF)\n", ep);
210 212
211 of_node_put(ports);
212 of_node_put(port);
213 of_node_put(node);
214
215 if (li->cpu) { 213 if (li->cpu) {
216 int is_single_links = 0; 214 int is_single_links = 0;
217 215
@@ -229,17 +227,17 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
229 227
230 ret = asoc_simple_parse_cpu(ep, dai_link, &is_single_links); 228 ret = asoc_simple_parse_cpu(ep, dai_link, &is_single_links);
231 if (ret) 229 if (ret)
232 return ret; 230 goto out_put_node;
233 231
234 ret = asoc_simple_parse_clk_cpu(dev, ep, dai_link, dai); 232 ret = asoc_simple_parse_clk_cpu(dev, ep, dai_link, dai);
235 if (ret < 0) 233 if (ret < 0)
236 return ret; 234 goto out_put_node;
237 235
238 ret = asoc_simple_set_dailink_name(dev, dai_link, 236 ret = asoc_simple_set_dailink_name(dev, dai_link,
239 "fe.%s", 237 "fe.%s",
240 cpus->dai_name); 238 cpus->dai_name);
241 if (ret < 0) 239 if (ret < 0)
242 return ret; 240 goto out_put_node;
243 241
244 /* card->num_links includes Codec */ 242 /* card->num_links includes Codec */
245 asoc_simple_canonicalize_cpu(dai_link, is_single_links); 243 asoc_simple_canonicalize_cpu(dai_link, is_single_links);
@@ -263,17 +261,17 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
263 261
264 ret = asoc_simple_parse_codec(ep, dai_link); 262 ret = asoc_simple_parse_codec(ep, dai_link);
265 if (ret < 0) 263 if (ret < 0)
266 return ret; 264 goto out_put_node;
267 265
268 ret = asoc_simple_parse_clk_codec(dev, ep, dai_link, dai); 266 ret = asoc_simple_parse_clk_codec(dev, ep, dai_link, dai);
269 if (ret < 0) 267 if (ret < 0)
270 return ret; 268 goto out_put_node;
271 269
272 ret = asoc_simple_set_dailink_name(dev, dai_link, 270 ret = asoc_simple_set_dailink_name(dev, dai_link,
273 "be.%s", 271 "be.%s",
274 codecs->dai_name); 272 codecs->dai_name);
275 if (ret < 0) 273 if (ret < 0)
276 return ret; 274 goto out_put_node;
277 275
278 /* check "prefix" from top node */ 276 /* check "prefix" from top node */
279 snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node, 277 snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node,
@@ -293,19 +291,23 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
293 291
294 ret = asoc_simple_parse_tdm(ep, dai); 292 ret = asoc_simple_parse_tdm(ep, dai);
295 if (ret) 293 if (ret)
296 return ret; 294 goto out_put_node;
297 295
298 ret = asoc_simple_parse_daifmt(dev, cpu_ep, codec_ep, 296 ret = asoc_simple_parse_daifmt(dev, cpu_ep, codec_ep,
299 NULL, &dai_link->dai_fmt); 297 NULL, &dai_link->dai_fmt);
300 if (ret < 0) 298 if (ret < 0)
301 return ret; 299 goto out_put_node;
302 300
303 dai_link->dpcm_playback = 1; 301 dai_link->dpcm_playback = 1;
304 dai_link->dpcm_capture = 1; 302 dai_link->dpcm_capture = 1;
305 dai_link->ops = &graph_ops; 303 dai_link->ops = &graph_ops;
306 dai_link->init = asoc_simple_dai_init; 304 dai_link->init = asoc_simple_dai_init;
307 305
308 return 0; 306out_put_node:
307 of_node_put(ports);
308 of_node_put(port);
309 of_node_put(node);
310 return ret;
309} 311}
310 312
311static int graph_dai_link_of(struct asoc_simple_priv *priv, 313static int graph_dai_link_of(struct asoc_simple_priv *priv,
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index ac8678fe55ff..556b1a789629 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -349,6 +349,13 @@ void asoc_simple_canonicalize_platform(struct snd_soc_dai_link *dai_link)
349 /* Assumes platform == cpu */ 349 /* Assumes platform == cpu */
350 if (!dai_link->platforms->of_node) 350 if (!dai_link->platforms->of_node)
351 dai_link->platforms->of_node = dai_link->cpus->of_node; 351 dai_link->platforms->of_node = dai_link->cpus->of_node;
352
353 /*
354 * DPCM BE can be no platform.
355 * Alloced memory will be waste, but not leak.
356 */
357 if (!dai_link->platforms->of_node)
358 dai_link->num_platforms = 0;
352} 359}
353EXPORT_SYMBOL_GPL(asoc_simple_canonicalize_platform); 360EXPORT_SYMBOL_GPL(asoc_simple_canonicalize_platform);
354 361
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index e5cde0d5e63c..ef849151ba56 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -124,8 +124,6 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
124 124
125 li->link++; 125 li->link++;
126 126
127 of_node_put(node);
128
129 /* For single DAI link & old style of DT node */ 127 /* For single DAI link & old style of DT node */
130 if (is_top) 128 if (is_top)
131 prefix = PREFIX; 129 prefix = PREFIX;
@@ -147,17 +145,17 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
147 145
148 ret = asoc_simple_parse_cpu(np, dai_link, &is_single_links); 146 ret = asoc_simple_parse_cpu(np, dai_link, &is_single_links);
149 if (ret) 147 if (ret)
150 return ret; 148 goto out_put_node;
151 149
152 ret = asoc_simple_parse_clk_cpu(dev, np, dai_link, dai); 150 ret = asoc_simple_parse_clk_cpu(dev, np, dai_link, dai);
153 if (ret < 0) 151 if (ret < 0)
154 return ret; 152 goto out_put_node;
155 153
156 ret = asoc_simple_set_dailink_name(dev, dai_link, 154 ret = asoc_simple_set_dailink_name(dev, dai_link,
157 "fe.%s", 155 "fe.%s",
158 cpus->dai_name); 156 cpus->dai_name);
159 if (ret < 0) 157 if (ret < 0)
160 return ret; 158 goto out_put_node;
161 159
162 asoc_simple_canonicalize_cpu(dai_link, is_single_links); 160 asoc_simple_canonicalize_cpu(dai_link, is_single_links);
163 } else { 161 } else {
@@ -180,17 +178,17 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
180 178
181 ret = asoc_simple_parse_codec(np, dai_link); 179 ret = asoc_simple_parse_codec(np, dai_link);
182 if (ret < 0) 180 if (ret < 0)
183 return ret; 181 goto out_put_node;
184 182
185 ret = asoc_simple_parse_clk_codec(dev, np, dai_link, dai); 183 ret = asoc_simple_parse_clk_codec(dev, np, dai_link, dai);
186 if (ret < 0) 184 if (ret < 0)
187 return ret; 185 goto out_put_node;
188 186
189 ret = asoc_simple_set_dailink_name(dev, dai_link, 187 ret = asoc_simple_set_dailink_name(dev, dai_link,
190 "be.%s", 188 "be.%s",
191 codecs->dai_name); 189 codecs->dai_name);
192 if (ret < 0) 190 if (ret < 0)
193 return ret; 191 goto out_put_node;
194 192
195 /* check "prefix" from top node */ 193 /* check "prefix" from top node */
196 snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node, 194 snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node,
@@ -208,19 +206,21 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
208 206
209 ret = asoc_simple_parse_tdm(np, dai); 207 ret = asoc_simple_parse_tdm(np, dai);
210 if (ret) 208 if (ret)
211 return ret; 209 goto out_put_node;
212 210
213 ret = asoc_simple_parse_daifmt(dev, node, codec, 211 ret = asoc_simple_parse_daifmt(dev, node, codec,
214 prefix, &dai_link->dai_fmt); 212 prefix, &dai_link->dai_fmt);
215 if (ret < 0) 213 if (ret < 0)
216 return ret; 214 goto out_put_node;
217 215
218 dai_link->dpcm_playback = 1; 216 dai_link->dpcm_playback = 1;
219 dai_link->dpcm_capture = 1; 217 dai_link->dpcm_capture = 1;
220 dai_link->ops = &simple_ops; 218 dai_link->ops = &simple_ops;
221 dai_link->init = asoc_simple_dai_init; 219 dai_link->init = asoc_simple_dai_init;
222 220
223 return 0; 221out_put_node:
222 of_node_put(node);
223 return ret;
224} 224}
225 225
226static int simple_dai_link_of(struct asoc_simple_priv *priv, 226static int simple_dai_link_of(struct asoc_simple_priv *priv,
@@ -364,8 +364,6 @@ static int simple_for_each_link(struct asoc_simple_priv *priv,
364 goto error; 364 goto error;
365 } 365 }
366 366
367 of_node_put(codec);
368
369 /* get convert-xxx property */ 367 /* get convert-xxx property */
370 memset(&adata, 0, sizeof(adata)); 368 memset(&adata, 0, sizeof(adata));
371 for_each_child_of_node(node, np) 369 for_each_child_of_node(node, np)
@@ -387,11 +385,13 @@ static int simple_for_each_link(struct asoc_simple_priv *priv,
387 ret = func_noml(priv, np, codec, li, is_top); 385 ret = func_noml(priv, np, codec, li, is_top);
388 386
389 if (ret < 0) { 387 if (ret < 0) {
388 of_node_put(codec);
390 of_node_put(np); 389 of_node_put(np);
391 goto error; 390 goto error;
392 } 391 }
393 } 392 }
394 393
394 of_node_put(codec);
395 node = of_get_next_child(top, node); 395 node = of_get_next_child(top, node);
396 } while (!is_top && node); 396 } while (!is_top && node);
397 397