aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/generic
diff options
context:
space:
mode:
authorNicolin Chen <Guangyu.Chen@freescale.com>2014-03-11 23:02:11 -0400
committerMark Brown <broonie@linaro.org>2014-03-18 19:44:40 -0400
commit46c39cae292fd691f32e573e6c2c854e36614c93 (patch)
tree35dadf5586c0c4f666cbe586832733c684d83f3d /sound/soc/generic
parentc56c4d74c6f96d0ff605d8948e127099cf5e6681 (diff)
ASoC: simple-card: overwrite cpu_dai->fmt with codec_dai->fmt
The current simple-card driver separates the daimft for cpu_dai and codec_dai. So we might get different values for them (0x4003 and 0x1003 for example): asoc-simple-card sound-cs42888.12: cpu : 2024000.esai / 4003 / 132000000 asoc-simple-card sound-cs42888.12: codec : cs42888 / 1003 / 24576000 asoc-simple-card sound-cs42888.12: cs42888 <-> 2024000.esai mapping ok This is not allowed at all as we need to keep the DAIFMT settings identical for both the ends of the link. Thus this patch fixes it by overwriting the cpu_dai->fmt with codec_dai->fmt since we defined the DAIFMT_MASTER basing on CODEC at the first place while the other bits are same. Signed-off-by: Nicolin Chen <Guangyu.Chen@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/generic')
-rw-r--r--sound/soc/generic/simple-card.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index ca7e63ef858a..2ee8ed56bcf1 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -151,6 +151,8 @@ static int asoc_simple_card_parse_of(struct device_node *node,
151 struct device *dev) 151 struct device *dev)
152{ 152{
153 struct snd_soc_dai_link *dai_link = priv->snd_card.dai_link; 153 struct snd_soc_dai_link *dai_link = priv->snd_card.dai_link;
154 struct asoc_simple_dai *codec_dai = &priv->codec_dai;
155 struct asoc_simple_dai *cpu_dai = &priv->cpu_dai;
154 struct device_node *np; 156 struct device_node *np;
155 char *name; 157 char *name;
156 unsigned int daifmt; 158 unsigned int daifmt;
@@ -184,7 +186,7 @@ static int asoc_simple_card_parse_of(struct device_node *node,
184 np = of_get_child_by_name(node, "simple-audio-card,cpu"); 186 np = of_get_child_by_name(node, "simple-audio-card,cpu");
185 if (np) { 187 if (np) {
186 ret = asoc_simple_card_sub_parse_of(np, daifmt, 188 ret = asoc_simple_card_sub_parse_of(np, daifmt,
187 &priv->cpu_dai, 189 cpu_dai,
188 &dai_link->cpu_of_node, 190 &dai_link->cpu_of_node,
189 &dai_link->cpu_dai_name); 191 &dai_link->cpu_dai_name);
190 of_node_put(np); 192 of_node_put(np);
@@ -197,7 +199,7 @@ static int asoc_simple_card_parse_of(struct device_node *node,
197 np = of_get_child_by_name(node, "simple-audio-card,codec"); 199 np = of_get_child_by_name(node, "simple-audio-card,codec");
198 if (np) { 200 if (np) {
199 ret = asoc_simple_card_sub_parse_of(np, daifmt, 201 ret = asoc_simple_card_sub_parse_of(np, daifmt,
200 &priv->codec_dai, 202 codec_dai,
201 &dai_link->codec_of_node, 203 &dai_link->codec_of_node,
202 &dai_link->codec_dai_name); 204 &dai_link->codec_dai_name);
203 of_node_put(np); 205 of_node_put(np);
@@ -205,6 +207,12 @@ static int asoc_simple_card_parse_of(struct device_node *node,
205 if (ret < 0) 207 if (ret < 0)
206 return ret; 208 return ret;
207 209
210 /*
211 * overwrite cpu_dai->fmt as its DAIFMT_MASTER bit is based on CODEC
212 * while the other bits should be identical unless buggy SW/HW design.
213 */
214 cpu_dai->fmt = codec_dai->fmt;
215
208 if (!dai_link->cpu_dai_name || !dai_link->codec_dai_name) 216 if (!dai_link->cpu_dai_name || !dai_link->codec_dai_name)
209 return -EINVAL; 217 return -EINVAL;
210 218
@@ -226,12 +234,12 @@ static int asoc_simple_card_parse_of(struct device_node *node,
226 dev_dbg(dev, "platform : %04x\n", daifmt); 234 dev_dbg(dev, "platform : %04x\n", daifmt);
227 dev_dbg(dev, "cpu : %s / %04x / %d\n", 235 dev_dbg(dev, "cpu : %s / %04x / %d\n",
228 dai_link->cpu_dai_name, 236 dai_link->cpu_dai_name,
229 priv->cpu_dai.fmt, 237 cpu_dai->fmt,
230 priv->cpu_dai.sysclk); 238 cpu_dai->sysclk);
231 dev_dbg(dev, "codec : %s / %04x / %d\n", 239 dev_dbg(dev, "codec : %s / %04x / %d\n",
232 dai_link->codec_dai_name, 240 dai_link->codec_dai_name,
233 priv->codec_dai.fmt, 241 codec_dai->fmt,
234 priv->codec_dai.sysclk); 242 codec_dai->sysclk);
235 243
236 /* 244 /*
237 * soc_bind_dai_link() will check cpu name 245 * soc_bind_dai_link() will check cpu name