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 577 TWL4030_REG_VSTPGA, 0, 0x29, 0, 578 578 twl4030_dapm_dbypassv_tlv); 579 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 580 /* 611 581 * Output PGA builder: 612 582 * Handle the muting and unmuting of the given output (turning off the ··· 1400 1430 /* Analog/Digital mic path selection. 1401 1431 TX1 Left/Right: either analog Left/Right or Digimic0 1402 1432 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), 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), 1409 1437 1410 1438 /* Analog input mixers for the capture amplifiers */ 1411 1439 SND_SOC_DAPM_MIXER("Analog Left", ··· 1426 1458 SND_SOC_DAPM_PGA_E("Digimic1 Enable", 1427 1459 TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0, 1428 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), 1429 1466 1430 1467 SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), 1431 1468 SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), ··· 1562 1589 1563 1590 {"Digimic0 Enable", NULL, "DIGIMIC0"}, 1564 1591 {"Digimic1 Enable", NULL, "DIGIMIC1"}, 1592 + 1593 + {"DIGIMIC0", NULL, "micbias1 select"}, 1594 + {"DIGIMIC1", NULL, "micbias2 select"}, 1565 1595 1566 1596 /* TX1 Left capture path */ 1567 1597 {"TX1 Capture Route", "Analog", "ADC Physical Left"},