diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2015-12-16 21:49:43 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-12-17 07:14:31 -0500 |
commit | af998f853124231ef3bff05621f157a19af05d20 (patch) | |
tree | b27e50a438d77ad185ba7e4b3c02fc5bdcb11c31 | |
parent | ae638b725ee00afe3253e30df617a5531ea30ea2 (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.c | 82 |
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 | ||
157 | static int rsrc_card_parse_daifmt(struct device_node *node, | 157 | static 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 | ||
328 | static int rsrc_card_dai_link_of(struct device_node *node, | 327 | static 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 | ||
353 | static 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 | |||
362 | static int rsrc_card_parse_of(struct device_node *node, | 395 | static 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; |