ASoC: ak4104: correct tranceiver enable handling
authorDaniel Mack <zonque@gmail.com>
Wed, 6 Mar 2013 21:22:16 +0000 (22:22 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 7 Mar 2013 02:37:38 +0000 (10:37 +0800)
Move the enabling of the TX diode to hw_params() and disable it again in
hw_free(). This way, the diode is only switched on as long as it needs
to be.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/ak4104.c

index 58f390d3ea7ae711ffabc8b8f20fb2d00a166d53..c7cfdf957e4dac91c04ffad2f9e2d2dc1e2434aa 100644 (file)
@@ -93,7 +93,7 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream,
 {
        struct snd_soc_codec *codec = dai->codec;
        struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec);
-       int val = 0;
+       int ret, val = 0;
 
        /* set the IEC958 bits: consumer mode, no copyright bit */
        val |= IEC958_AES0_CON_NOT_COPYRIGHT;
@@ -134,11 +134,33 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream,
                return -EINVAL;
        }
 
-       return regmap_write(ak4104->regmap, AK4104_REG_CHN_STATUS(3), val);
+       ret = regmap_write(ak4104->regmap, AK4104_REG_CHN_STATUS(3), val);
+       if (ret < 0)
+               return ret;
+
+       /* enable transmitter */
+       ret = regmap_update_bits(ak4104->regmap, AK4104_REG_TX,
+                                AK4104_TX_TXE, AK4104_TX_TXE);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+static int ak4104_hw_free(struct snd_pcm_substream *substream,
+                         struct snd_soc_dai *dai)
+{
+       struct snd_soc_codec *codec = dai->codec;
+       struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec);
+
+       /* disable transmitter */
+       return regmap_update_bits(ak4104->regmap, AK4104_REG_TX,
+                                 AK4104_TX_TXE, 0);
 }
 
 static const struct snd_soc_dai_ops ak4101_dai_ops = {
        .hw_params = ak4104_hw_params,
+       .hw_free = ak4104_hw_free,
        .set_fmt = ak4104_set_dai_fmt,
 };