ASoC: twl6040 - Add method to query optimum PDM_DL1 gain
authorLiam Girdwood <lrg@ti.com>
Wed, 11 Jan 2012 12:43:24 +0000 (12:43 +0000)
committerLiam Girdwood <lrg@ti.com>
Wed, 11 Jan 2012 12:43:24 +0000 (12:43 +0000)
The DL1 PDM interface adds a little gain depending on the output device.
Add a method to retrieve the gain value for machine driver usage.

Signed-off-by: Liam Girdwood <lrg@ti.com>
sound/soc/codecs/twl6040.c
sound/soc/codecs/twl6040.h

index 3376e6fad2a2813f0f490785cfec710f7ceeb7f4..5b9c79b6f65e104fdbbae4779452d15821752c58 100644 (file)
@@ -33,6 +33,7 @@
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
+#include <sound/soc-dapm.h>
 #include <sound/initval.h>
 #include <sound/tlv.h>
 
@@ -1012,6 +1013,28 @@ static int twl6040_pll_put_enum(struct snd_kcontrol *kcontrol,
        return 0;
 }
 
+int twl6040_get_dl1_gain(struct snd_soc_codec *codec)
+{
+       struct snd_soc_dapm_context *dapm = &codec->dapm;
+
+       if (snd_soc_dapm_get_pin_status(dapm, "EP"))
+               return -1; /* -1dB */
+
+       if (snd_soc_dapm_get_pin_status(dapm, "HSOR") ||
+               snd_soc_dapm_get_pin_status(dapm, "HSOL")) {
+
+               u8 val = snd_soc_read(codec, TWL6040_REG_HSLCTL);
+               if (val & TWL6040_HSDACMODE)
+                       /* HSDACL in LP mode */
+                       return -8; /* -8dB */
+               else
+                       /* HSDACL in HP mode */
+                       return -1; /* -1dB */
+       }
+       return 0; /* 0dB */
+}
+EXPORT_SYMBOL_GPL(twl6040_get_dl1_gain);
+
 int twl6040_get_clk_id(struct snd_soc_codec *codec)
 {
        struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
index a83277bdb851129c5fb7a3db84e11e42d50dab0e..ef273f1fac2f838add14ecc8b01465e4677097af 100644 (file)
@@ -34,6 +34,7 @@ enum twl6040_trim {
 #define TWL6040_HSF_TRIM_LEFT(x)       (x & 0x0f)
 #define TWL6040_HSF_TRIM_RIGHT(x)      ((x >> 4) & 0x0f)
 
+int twl6040_get_dl1_gain(struct snd_soc_codec *codec);
 void twl6040_hs_jack_detect(struct snd_soc_codec *codec,
                            struct snd_soc_jack *jack, int report);
 int twl6040_get_clk_id(struct snd_soc_codec *codec);