aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2015-12-16 21:49:43 -0500
committerMark Brown <broonie@kernel.org>2015-12-17 07:14:31 -0500
commitaf998f853124231ef3bff05621f157a19af05d20 (patch)
treeb27e50a438d77ad185ba7e4b3c02fc5bdcb11c31
parentae638b725ee00afe3253e30df617a5531ea30ea2 (diff)
ASoC: rsrc-card: tidyup dai format for DPCM
rsrc-card is DPCM supported version of simple-card. Thus it has similar DT format. OTOH, snd_soc_dai_link requests cpu/codec, but one of them will be snd-soc-dummy in DPCM case, and DPCM requests frontend/backend dai_link. This means it might have multi backend/codec. And, SND_SOC_DAIFMT_xxx is based on "codec". Because of these difference, current rsrc card can't detect correct dai_fmt. This patch detect correct dai fmt from 1st "codec". Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/sh/rcar/rsrc-card.c82
1 files changed, 55 insertions, 27 deletions
diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
index 9f522ba881fa..5fe0b51cdb44 100644
--- a/sound/soc/sh/rcar/rsrc-card.c
+++ b/sound/soc/sh/rcar/rsrc-card.c
@@ -155,14 +155,13 @@ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
155} 155}
156 156
157static int rsrc_card_parse_daifmt(struct device_node *node, 157static int rsrc_card_parse_daifmt(struct device_node *node,
158 struct device_node *np, 158 struct device_node *codec,
159 struct rsrc_card_priv *priv, 159 struct rsrc_card_priv *priv,
160 int idx, bool is_fe) 160 struct snd_soc_dai_link *dai_link,
161 unsigned int *retfmt)
161{ 162{
162 struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
163 struct device_node *bitclkmaster = NULL; 163 struct device_node *bitclkmaster = NULL;
164 struct device_node *framemaster = NULL; 164 struct device_node *framemaster = NULL;
165 struct device_node *codec = is_fe ? NULL : np;
166 unsigned int daifmt; 165 unsigned int daifmt;
167 166
168 daifmt = snd_soc_of_parse_daifmt(node, NULL, 167 daifmt = snd_soc_of_parse_daifmt(node, NULL,
@@ -179,11 +178,11 @@ static int rsrc_card_parse_daifmt(struct device_node *node,
179 daifmt |= (codec == framemaster) ? 178 daifmt |= (codec == framemaster) ?
180 SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS; 179 SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
181 180
182 dai_link->dai_fmt = daifmt;
183
184 of_node_put(bitclkmaster); 181 of_node_put(bitclkmaster);
185 of_node_put(framemaster); 182 of_node_put(framemaster);
186 183
184 *retfmt = daifmt;
185
187 return 0; 186 return 0;
188} 187}
189 188
@@ -325,24 +324,16 @@ static int rsrc_card_parse_clk(struct device_node *np,
325 return 0; 324 return 0;
326} 325}
327 326
328static int rsrc_card_dai_link_of(struct device_node *node, 327static int rsrc_card_dai_sub_link_of(struct device_node *node,
329 struct device_node *np, 328 struct device_node *np,
330 struct rsrc_card_priv *priv, 329 struct rsrc_card_priv *priv,
331 int idx) 330 int idx, bool is_fe)
332{ 331{
333 struct device *dev = rsrc_priv_to_dev(priv); 332 struct device *dev = rsrc_priv_to_dev(priv);
334 struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx); 333 struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
335 struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx); 334 struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
336 bool is_fe = false;
337 int ret; 335 int ret;
338 336
339 if (0 == strcmp(np->name, "cpu"))
340 is_fe = true;
341
342 ret = rsrc_card_parse_daifmt(node, np, priv, idx, is_fe);
343 if (ret < 0)
344 return ret;
345
346 ret = rsrc_card_parse_links(np, priv, idx, is_fe); 337 ret = rsrc_card_parse_links(np, priv, idx, is_fe);
347 if (ret < 0) 338 if (ret < 0)
348 return ret; 339 return ret;
@@ -359,6 +350,48 @@ static int rsrc_card_dai_link_of(struct device_node *node,
359 return ret; 350 return ret;
360} 351}
361 352
353static int rsrc_card_dai_link_of(struct device_node *node,
354 struct rsrc_card_priv *priv)
355{
356 struct snd_soc_dai_link *dai_link;
357 struct device_node *np;
358 unsigned int daifmt = 0;
359 int ret, i;
360 bool is_fe;
361
362 /* find 1st codec */
363 i = 0;
364 for_each_child_of_node(node, np) {
365 dai_link = rsrc_priv_to_link(priv, i);
366
367 if (strcmp(np->name, "codec") == 0) {
368 ret = rsrc_card_parse_daifmt(node, np, priv,
369 dai_link, &daifmt);
370 if (ret < 0)
371 return ret;
372 break;
373 }
374 i++;
375 }
376
377 i = 0;
378 for_each_child_of_node(node, np) {
379 dai_link = rsrc_priv_to_link(priv, i);
380 dai_link->dai_fmt = daifmt;
381
382 is_fe = false;
383 if (strcmp(np->name, "cpu") == 0)
384 is_fe = true;
385
386 ret = rsrc_card_dai_sub_link_of(node, np, priv, i, is_fe);
387 if (ret < 0)
388 return ret;
389 i++;
390 }
391
392 return 0;
393}
394
362static int rsrc_card_parse_of(struct device_node *node, 395static int rsrc_card_parse_of(struct device_node *node,
363 struct rsrc_card_priv *priv, 396 struct rsrc_card_priv *priv,
364 struct device *dev) 397 struct device *dev)
@@ -366,9 +399,8 @@ static int rsrc_card_parse_of(struct device_node *node,
366 const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev); 399 const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
367 struct rsrc_card_dai *props; 400 struct rsrc_card_dai *props;
368 struct snd_soc_dai_link *links; 401 struct snd_soc_dai_link *links;
369 struct device_node *np;
370 int ret; 402 int ret;
371 int i, num; 403 int num;
372 404
373 if (!node) 405 if (!node)
374 return -EINVAL; 406 return -EINVAL;
@@ -409,13 +441,9 @@ static int rsrc_card_parse_of(struct device_node *node,
409 priv->snd_card.name ? priv->snd_card.name : "", 441 priv->snd_card.name ? priv->snd_card.name : "",
410 priv->convert_rate); 442 priv->convert_rate);
411 443
412 i = 0; 444 ret = rsrc_card_dai_link_of(node, priv);
413 for_each_child_of_node(node, np) { 445 if (ret < 0)
414 ret = rsrc_card_dai_link_of(node, np, priv, i); 446 return ret;
415 if (ret < 0)
416 return ret;
417 i++;
418 }
419 447
420 if (!priv->snd_card.name) 448 if (!priv->snd_card.name)
421 priv->snd_card.name = priv->snd_card.dai_link->name; 449 priv->snd_card.name = priv->snd_card.dai_link->name;