summaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/twl4030.c
diff options
context:
space:
mode:
authorPeter Ujfalusi2010-07-20 14:49:09 +0200
committerLiam Girdwood2010-07-21 12:57:58 +0200
commit01ea6ba2bce64112623dbf8c45ce487062b65446 (patch)
tree490a4af1657713c582895ffa7e4c4bae97f5519c /sound/soc/codecs/twl4030.c
parentASoC: TWL6040: Correct widget handling for drivers (diff)
downloadkernel-qcow2-linux-01ea6ba2bce64112623dbf8c45ce487062b65446.tar.gz
kernel-qcow2-linux-01ea6ba2bce64112623dbf8c45ce487062b65446.tar.xz
kernel-qcow2-linux-01ea6ba2bce64112623dbf8c45ce487062b65446.zip
ASoC: TWL4030: Add configurable delay after digimic enable
When digital microphones are connected to twl, delay is needed after enabling the digimic interface of the codec. Add new parameter for the setup data, which can be used to pass the apropriate delay in ms after the digimic interface has been enabled. Without certain delay (in certain HW configuration) the beggining of the recorded sample contains a glitch, which is generated by the digital microphones. Delaying the micbias1, 2 (which is the bias for the digimic0 or 1) does not help, since the glitch is coming after switching the digimic interface. Reversing the micbias and digimic enable order does not work either (in that case the wait need to be added after the micbias enabled). Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/codecs/twl4030.c')
-rw-r--r--sound/soc/codecs/twl4030.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index 6fd6d0b10555..bd557c2bcb8c 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -143,6 +143,9 @@ struct twl4030_priv {
u8 earpiece_enabled;
u8 predrivel_enabled, predriver_enabled;
u8 carkitl_enabled, carkitr_enabled;
+
+ /* Delay needed after enabling the digimic interface */
+ unsigned int digimic_delay;
};
/*
@@ -312,6 +315,8 @@ static void twl4030_init_chip(struct platform_device *pdev)
if (!setup)
return;
+ twl4030->digimic_delay = setup->digimic_delay;
+
/* Configuration for headset ramp delay from setup data */
if (setup->sysclk != twl4030->sysclk)
dev_warn(codec->dev,
@@ -855,6 +860,16 @@ static int headsetrpga_event(struct snd_soc_dapm_widget *w,
return 0;
}
+static int digimic_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(w->codec);
+
+ if (twl4030->digimic_delay)
+ mdelay(twl4030->digimic_delay);
+ return 0;
+}
+
/*
* Some of the gain controls in TWL (mostly those which are associated with
* the outputs) are implemented in an interesting way:
@@ -1439,10 +1454,12 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
SND_SOC_DAPM_PGA("ADC Physical Right",
TWL4030_REG_AVADC_CTL, 1, 0, NULL, 0),
- SND_SOC_DAPM_PGA("Digimic0 Enable",
- TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0),
- SND_SOC_DAPM_PGA("Digimic1 Enable",
- TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0),
+ SND_SOC_DAPM_PGA_E("Digimic0 Enable",
+ TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0,
+ digimic_event, SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_PGA_E("Digimic1 Enable",
+ TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0,
+ digimic_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0),
SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0),