From dfd08dd76eff1dc2b1dc44820b335d6414280b73 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 9 Apr 2012 16:29:21 +0100 Subject: [PATCH] --- yaml --- r: 305637 b: refs/heads/master c: f04209a7b0a9942aa78f8b27e63a8a5cc097adf8 h: refs/heads/master i: 305635: 33afafba8fc56d96b4412006a01f3078388455ae v: v3 --- [refs] | 2 +- trunk/sound/soc/soc-core.c | 37 +++++++++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 3e84a639bab5..36cde894276c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1eee1b3833d67eb52c0f4d293cbb796a776c5eed +refs/heads/master: f04209a7b0a9942aa78f8b27e63a8a5cc097adf8 diff --git a/trunk/sound/soc/soc-core.c b/trunk/sound/soc/soc-core.c index 98a4f7aa4f01..9eefe9072dfa 100644 --- a/trunk/sound/soc/soc-core.c +++ b/trunk/sound/soc/soc-core.c @@ -1416,7 +1416,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) struct snd_soc_codec_conf *codec_conf; enum snd_soc_compress_type compress_type; struct snd_soc_dai_link *dai_link; - int ret, i, order; + int ret, i, order, dai_fmt; mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT); @@ -1525,17 +1525,46 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) for (i = 0; i < card->num_links; i++) { dai_link = &card->dai_link[i]; + dai_fmt = dai_link->dai_fmt; - if (dai_link->dai_fmt) { + if (dai_fmt) { ret = snd_soc_dai_set_fmt(card->rtd[i].codec_dai, - dai_link->dai_fmt); + dai_fmt); if (ret != 0 && ret != -ENOTSUPP) dev_warn(card->rtd[i].codec_dai->dev, "Failed to set DAI format: %d\n", ret); + } + + /* If this is a regular CPU link there will be a platform */ + if (dai_fmt && dai_link->platform_name) { + ret = snd_soc_dai_set_fmt(card->rtd[i].cpu_dai, + dai_fmt); + if (ret != 0 && ret != -ENOTSUPP) + dev_warn(card->rtd[i].cpu_dai->dev, + "Failed to set DAI format: %d\n", + ret); + } else if (dai_fmt) { + /* Flip the polarity for the "CPU" end */ + dai_fmt &= ~SND_SOC_DAIFMT_MASTER_MASK; + switch (dai_link->dai_fmt & + SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + dai_fmt |= SND_SOC_DAIFMT_CBS_CFS; + break; + case SND_SOC_DAIFMT_CBM_CFS: + dai_fmt |= SND_SOC_DAIFMT_CBS_CFM; + break; + case SND_SOC_DAIFMT_CBS_CFM: + dai_fmt |= SND_SOC_DAIFMT_CBM_CFS; + break; + case SND_SOC_DAIFMT_CBS_CFS: + dai_fmt |= SND_SOC_DAIFMT_CBM_CFM; + break; + } ret = snd_soc_dai_set_fmt(card->rtd[i].cpu_dai, - dai_link->dai_fmt); + dai_fmt); if (ret != 0 && ret != -ENOTSUPP) dev_warn(card->rtd[i].cpu_dai->dev, "Failed to set DAI format: %d\n",