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 <peter.ujfalusi@nokia.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>

authored by Peter Ujfalusi and committed by Liam Girdwood bda7d2a8 116bcd9c

+12 -36
+12 -36
sound/soc/codecs/twl4030.c
··· 577 TWL4030_REG_VSTPGA, 0, 0x29, 0, 578 twl4030_dapm_dbypassv_tlv); 579 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 - 610 /* 611 * Output PGA builder: 612 * Handle the muting and unmuting of the given output (turning off the ··· 1400 /* Analog/Digital mic path selection. 1401 TX1 Left/Right: either analog Left/Right or Digimic0 1402 TX2 Left/Right: either analog Left/Right or Digimic1 */ 1403 - SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0, 1404 - &twl4030_dapm_micpathtx1_control, micpath_event, 1405 - SND_SOC_DAPM_POST_REG), 1406 - SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0, 1407 - &twl4030_dapm_micpathtx2_control, micpath_event, 1408 - SND_SOC_DAPM_POST_REG), 1409 1410 /* Analog input mixers for the capture amplifiers */ 1411 SND_SOC_DAPM_MIXER("Analog Left", ··· 1426 SND_SOC_DAPM_PGA_E("Digimic1 Enable", 1427 TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0, 1428 digimic_event, SND_SOC_DAPM_POST_PMU), 1429 1430 SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), 1431 SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), ··· 1562 1563 {"Digimic0 Enable", NULL, "DIGIMIC0"}, 1564 {"Digimic1 Enable", NULL, "DIGIMIC1"}, 1565 1566 /* TX1 Left capture path */ 1567 {"TX1 Capture Route", "Analog", "ADC Physical Left"},
··· 577 TWL4030_REG_VSTPGA, 0, 0x29, 0, 578 twl4030_dapm_dbypassv_tlv); 579 580 /* 581 * Output PGA builder: 582 * Handle the muting and unmuting of the given output (turning off the ··· 1430 /* Analog/Digital mic path selection. 1431 TX1 Left/Right: either analog Left/Right or Digimic0 1432 TX2 Left/Right: either analog Left/Right or Digimic1 */ 1433 + SND_SOC_DAPM_MUX("TX1 Capture Route", SND_SOC_NOPM, 0, 0, 1434 + &twl4030_dapm_micpathtx1_control), 1435 + SND_SOC_DAPM_MUX("TX2 Capture Route", SND_SOC_NOPM, 0, 0, 1436 + &twl4030_dapm_micpathtx2_control), 1437 1438 /* Analog input mixers for the capture amplifiers */ 1439 SND_SOC_DAPM_MIXER("Analog Left", ··· 1458 SND_SOC_DAPM_PGA_E("Digimic1 Enable", 1459 TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0, 1460 digimic_event, SND_SOC_DAPM_POST_PMU), 1461 + 1462 + SND_SOC_DAPM_SUPPLY("micbias1 select", TWL4030_REG_MICBIAS_CTL, 5, 0, 1463 + NULL, 0), 1464 + SND_SOC_DAPM_SUPPLY("micbias2 select", TWL4030_REG_MICBIAS_CTL, 6, 0, 1465 + NULL, 0), 1466 1467 SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), 1468 SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), ··· 1589 1590 {"Digimic0 Enable", NULL, "DIGIMIC0"}, 1591 {"Digimic1 Enable", NULL, "DIGIMIC1"}, 1592 + 1593 + {"DIGIMIC0", NULL, "micbias1 select"}, 1594 + {"DIGIMIC1", NULL, "micbias2 select"}, 1595 1596 /* TX1 Left capture path */ 1597 {"TX1 Capture Route", "Analog", "ADC Physical Left"},