ASoC: wm5110: Power both channels for differential mono output
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Tue, 10 Jun 2014 17:41:02 +0000 (18:41 +0100)
committerMark Brown <broonie@linaro.org>
Sat, 21 Jun 2014 10:34:59 +0000 (11:34 +0100)
On the wm5110 CODEC both the left and right channel must be powered
when an output is being used as a mono output, although no audio is
routed to the right output channel. This patch adds additional DAPM
routes to link the right channel to the left in the case where an output
is marked as mono. Audio must always be brought in on the left channel
for mono operation.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.h
sound/soc/codecs/wm5110.c

index 29e198f57d4cd711f56c90fa640c807edbee414a..747c71e59c04ff5811fac358a7b1ee57a0235200 100644 (file)
@@ -243,6 +243,31 @@ int arizona_init_spk(struct snd_soc_codec *codec)
 }
 EXPORT_SYMBOL_GPL(arizona_init_spk);
 
+static const struct snd_soc_dapm_route arizona_mono_routes[] = {
+       { "OUT1R", NULL, "OUT1L" },
+       { "OUT2R", NULL, "OUT2L" },
+       { "OUT3R", NULL, "OUT3L" },
+       { "OUT4R", NULL, "OUT4L" },
+       { "OUT5R", NULL, "OUT5L" },
+       { "OUT6R", NULL, "OUT6L" },
+};
+
+int arizona_init_mono(struct snd_soc_codec *codec)
+{
+       struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
+       struct arizona *arizona = priv->arizona;
+       int i;
+
+       for (i = 0; i < ARIZONA_MAX_OUTPUT; ++i) {
+               if (arizona->pdata.out_mono[i])
+                       snd_soc_dapm_add_routes(&codec->dapm,
+                                               &arizona_mono_routes[i], 1);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(arizona_init_mono);
+
 int arizona_init_gpio(struct snd_soc_codec *codec)
 {
        struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
index 05ae17f5bca30bd611d5514a5b6f850bce26906e..942cfb197b6daafa74de6fa64975bed128600c0a 100644 (file)
@@ -249,6 +249,7 @@ extern int arizona_set_fll(struct arizona_fll *fll, int source,
 
 extern int arizona_init_spk(struct snd_soc_codec *codec);
 extern int arizona_init_gpio(struct snd_soc_codec *codec);
+extern int arizona_init_mono(struct snd_soc_codec *codec);
 
 extern int arizona_init_dai(struct arizona_priv *priv, int dai);
 
index 2e5fcb559e9000892c59dea01b3b6ee54c1a166a..62ef54456499b3fbf3d757719b68251dfa32f1be 100644 (file)
@@ -1596,6 +1596,7 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
 
        arizona_init_spk(codec);
        arizona_init_gpio(codec);
+       arizona_init_mono(codec);
 
        ret = snd_soc_add_codec_controls(codec, wm_adsp2_fw_controls, 8);
        if (ret != 0)