Skip to content

Commit bda7d2a

Browse files
Peter UjfalusiLiam Girdwood
authored andcommitted
ASoC: TWL4030: Capture route runtime DAPM ordering fix
Fix the ordering problem in DAPM domain, when the user changes between digital and analog sources during active capture (or loopback) scenario. Before this patch, when the user changed from analog source to digital there were a short time, when the codec enabled analog mic bias (2.2 volts) instead of the correct digital mic bias (1.8 volts) to the digital microphones. This behaviour caused by the former implementation of selecting the correct type of bias. This was done at the POST_REG event of the DAPM_MUX_E("TXx Capture Route") widget. By moving the bias type selection as DAPM_SUPPLY and connecting it to the corresponding digimic widget the problematic situation can be avoided. Signed-off-by: Peter Ujfalusi <[email protected]> Acked-by: Mark Brown <[email protected]> Signed-off-by: Liam Girdwood <[email protected]>
1 parent 116bcd9 commit bda7d2a

File tree

1 file changed

+12
-36
lines changed

1 file changed

+12
-36
lines changed

sound/soc/codecs/twl4030.c

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -577,36 +577,6 @@ static const struct snd_kcontrol_new twl4030_dapm_dbypassv_control =
577577
TWL4030_REG_VSTPGA, 0, 0x29, 0,
578578
twl4030_dapm_dbypassv_tlv);
579579

580-
static int micpath_event(struct snd_soc_dapm_widget *w,
581-
struct snd_kcontrol *kcontrol, int event)
582-
{
583-
struct soc_enum *e = (struct soc_enum *)w->kcontrols->private_value;
584-
unsigned char adcmicsel, micbias_ctl;
585-
586-
adcmicsel = twl4030_read_reg_cache(w->codec, TWL4030_REG_ADCMICSEL);
587-
micbias_ctl = twl4030_read_reg_cache(w->codec, TWL4030_REG_MICBIAS_CTL);
588-
/* Prepare the bits for the given TX path:
589-
* shift_l == 0: TX1 microphone path
590-
* shift_l == 2: TX2 microphone path */
591-
if (e->shift_l) {
592-
/* TX2 microphone path */
593-
if (adcmicsel & TWL4030_TX2IN_SEL)
594-
micbias_ctl |= TWL4030_MICBIAS2_CTL; /* digimic */
595-
else
596-
micbias_ctl &= ~TWL4030_MICBIAS2_CTL;
597-
} else {
598-
/* TX1 microphone path */
599-
if (adcmicsel & TWL4030_TX1IN_SEL)
600-
micbias_ctl |= TWL4030_MICBIAS1_CTL; /* digimic */
601-
else
602-
micbias_ctl &= ~TWL4030_MICBIAS1_CTL;
603-
}
604-
605-
twl4030_write(w->codec, TWL4030_REG_MICBIAS_CTL, micbias_ctl);
606-
607-
return 0;
608-
}
609-
610580
/*
611581
* Output PGA builder:
612582
* Handle the muting and unmuting of the given output (turning off the
@@ -1430,12 +1400,10 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
14301400
/* Analog/Digital mic path selection.
14311401
TX1 Left/Right: either analog Left/Right or Digimic0
14321402
TX2 Left/Right: either analog Left/Right or Digimic1 */
1433-
SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0,
1434-
&twl4030_dapm_micpathtx1_control, micpath_event,
1435-
SND_SOC_DAPM_POST_REG),
1436-
SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0,
1437-
&twl4030_dapm_micpathtx2_control, micpath_event,
1438-
SND_SOC_DAPM_POST_REG),
1403+
SND_SOC_DAPM_MUX("TX1 Capture Route", SND_SOC_NOPM, 0, 0,
1404+
&twl4030_dapm_micpathtx1_control),
1405+
SND_SOC_DAPM_MUX("TX2 Capture Route", SND_SOC_NOPM, 0, 0,
1406+
&twl4030_dapm_micpathtx2_control),
14391407

14401408
/* Analog input mixers for the capture amplifiers */
14411409
SND_SOC_DAPM_MIXER("Analog Left",
@@ -1459,6 +1427,11 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
14591427
TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0,
14601428
digimic_event, SND_SOC_DAPM_POST_PMU),
14611429

1430+
SND_SOC_DAPM_SUPPLY("micbias1 select", TWL4030_REG_MICBIAS_CTL, 5, 0,
1431+
NULL, 0),
1432+
SND_SOC_DAPM_SUPPLY("micbias2 select", TWL4030_REG_MICBIAS_CTL, 6, 0,
1433+
NULL, 0),
1434+
14621435
SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0),
14631436
SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0),
14641437
SND_SOC_DAPM_MICBIAS("Headset Mic Bias", TWL4030_REG_MICBIAS_CTL, 2, 0),
@@ -1590,6 +1563,9 @@ static const struct snd_soc_dapm_route intercon[] = {
15901563
{"Digimic0 Enable", NULL, "DIGIMIC0"},
15911564
{"Digimic1 Enable", NULL, "DIGIMIC1"},
15921565

1566+
{"DIGIMIC0", NULL, "micbias1 select"},
1567+
{"DIGIMIC1", NULL, "micbias2 select"},
1568+
15931569
/* TX1 Left capture path */
15941570
{"TX1 Capture Route", "Analog", "ADC Physical Left"},
15951571
{"TX1 Capture Route", "Digimic0", "Digimic0 Enable"},

0 commit comments

Comments
 (0)