[alsa-devel] [PATCH 1/3] ASoC: TWL4030: Enable voice filters for voice sidetone
Lopez Cruz, Misael
x0052729 at ti.com
Fri Jun 19 10:23:41 CEST 2009
Digital voice loopback (sidetone) requires voice filters
to be enabled: VTXL, VTXR, VRX.
Signed-off-by: Misael Lopez Cruz <x0052729 at ti.com>
---
sound/soc/codecs/twl4030.c | 67 +++++++++++++++++++++++++-------------------
1 files changed, 38 insertions(+), 29 deletions(-)
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index 4dbb853..780217a 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -332,6 +332,28 @@ static void twl4030_power_down(struct snd_soc_codec *codec)
twl4030_codec_enable(codec, 0);
}
+/* In case of voice mode, the RX1 L(VRX) for downlink and the TX2 L/R
+ * (VTXL, VTXR) for uplink has to be enabled/disabled. */
+static void twl4030_voice_enable(struct snd_soc_codec *codec, int direction,
+ int enable)
+{
+ u8 reg, mask;
+
+ reg = twl4030_read_reg_cache(codec, TWL4030_REG_OPTION);
+
+ if (direction == SNDRV_PCM_STREAM_PLAYBACK)
+ mask = TWL4030_ARXL1_VRX_EN;
+ else
+ mask = TWL4030_ATXL2_VTXL_EN | TWL4030_ATXR2_VTXR_EN;
+
+ if (enable)
+ reg |= mask;
+ else
+ reg &= ~mask;
+
+ twl4030_write(codec, TWL4030_REG_OPTION, reg);
+}
+
/* Earpiece */
static const struct snd_kcontrol_new twl4030_dapm_earpiece_controls[] = {
SOC_DAPM_SINGLE("Voice", TWL4030_REG_EAR_CTL, 0, 1, 0),
@@ -712,7 +734,22 @@ static int bypass_event(struct snd_soc_dapm_widget *w,
reg = twl4030_read_reg_cache(w->codec, m->reg);
- if (m->reg <= TWL4030_REG_ARXR2_APGA_CTL) {
+ if (m->reg == TWL4030_REG_VSTPGA) {
+ /* Voice digital bypass */
+ if (reg) {
+ twl4030->bypass_state |= (1 << 5);
+ twl4030_voice_enable(w->codec,
+ SNDRV_PCM_STREAM_PLAYBACK, 1);
+ twl4030_voice_enable(w->codec,
+ SNDRV_PCM_STREAM_CAPTURE, 1);
+ } else {
+ twl4030->bypass_state &= ~(1 << 5);
+ twl4030_voice_enable(w->codec,
+ SNDRV_PCM_STREAM_PLAYBACK, 0);
+ twl4030_voice_enable(w->codec,
+ SNDRV_PCM_STREAM_CAPTURE, 0);
+ }
+ } else if (m->reg <= TWL4030_REG_ARXR2_APGA_CTL) {
/* Analog bypass */
if (reg & (1 << m->shift))
twl4030->bypass_state |=
@@ -726,12 +763,6 @@ static int bypass_event(struct snd_soc_dapm_widget *w,
twl4030->bypass_state |= (1 << 4);
else
twl4030->bypass_state &= ~(1 << 4);
- } else if (m->reg == TWL4030_REG_VSTPGA) {
- /* Voice digital bypass */
- if (reg)
- twl4030->bypass_state |= (1 << 5);
- else
- twl4030->bypass_state &= ~(1 << 5);
} else {
/* Digital bypass */
if (reg & (0x7 << m->shift))
@@ -1806,28 +1837,6 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai,
return 0;
}
-/* In case of voice mode, the RX1 L(VRX) for downlink and the TX2 L/R
- * (VTXL, VTXR) for uplink has to be enabled/disabled. */
-static void twl4030_voice_enable(struct snd_soc_codec *codec, int direction,
- int enable)
-{
- u8 reg, mask;
-
- reg = twl4030_read_reg_cache(codec, TWL4030_REG_OPTION);
-
- if (direction == SNDRV_PCM_STREAM_PLAYBACK)
- mask = TWL4030_ARXL1_VRX_EN;
- else
- mask = TWL4030_ATXL2_VTXL_EN | TWL4030_ATXR2_VTXR_EN;
-
- if (enable)
- reg |= mask;
- else
- reg &= ~mask;
-
- twl4030_write(codec, TWL4030_REG_OPTION, reg);
-}
-
static int twl4030_voice_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
--
1.5.4.3
More information about the Alsa-devel
mailing list