Commit b5083c0c authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown

ASoC: wm8962: Allow switching between analog and digital inputs

When the DMIC_ENA bit is set the analogue inputs are disconnected from
the digital core of the chip, in favour of the digital microphones.
Currently the driver will always enable DMIC_ENA whilst the GPIOs are
configured for the DMIC function, this means the user can't currently
use both the analog inputs and the digital inputs in one system.

Add an additional DAPM mutex that allows switching between analog and
digital inputs into the digital core.
Reported-by: default avatarMartin Kepplinger <martin.kepplinger@puri.sm>
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Reported-and-tested-by: default avatarMartin Kepplinger <martin.kepplinger@puri.sm>
Link: https://lore.kernel.org/r/20220202164545.30457-1-ckeepax@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent bb45f689
...@@ -2049,6 +2049,13 @@ static SOC_ENUM_SINGLE_DECL(hpoutl_enum, ...@@ -2049,6 +2049,13 @@ static SOC_ENUM_SINGLE_DECL(hpoutl_enum,
static const struct snd_kcontrol_new hpoutl_mux = static const struct snd_kcontrol_new hpoutl_mux =
SOC_DAPM_ENUM("HPOUTL Mux", hpoutl_enum); SOC_DAPM_ENUM("HPOUTL Mux", hpoutl_enum);
static const char * const input_mode_text[] = { "Analog", "Digital" };
static SOC_ENUM_SINGLE_VIRT_DECL(input_mode_enum, input_mode_text);
static const struct snd_kcontrol_new input_mode_mux =
SOC_DAPM_ENUM("Input Mode", input_mode_enum);
static const struct snd_kcontrol_new inpgal[] = { static const struct snd_kcontrol_new inpgal[] = {
SOC_DAPM_SINGLE("IN1L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 3, 1, 0), SOC_DAPM_SINGLE("IN1L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 3, 1, 0),
SOC_DAPM_SINGLE("IN2L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 2, 1, 0), SOC_DAPM_SINGLE("IN2L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 2, 1, 0),
...@@ -2147,6 +2154,9 @@ SND_SOC_DAPM_MIXER("MIXINR", WM8962_PWR_MGMT_1, 4, 0, ...@@ -2147,6 +2154,9 @@ SND_SOC_DAPM_MIXER("MIXINR", WM8962_PWR_MGMT_1, 4, 0,
SND_SOC_DAPM_AIF_IN("DMIC_ENA", NULL, 0, WM8962_PWR_MGMT_1, 10, 0), SND_SOC_DAPM_AIF_IN("DMIC_ENA", NULL, 0, WM8962_PWR_MGMT_1, 10, 0),
SND_SOC_DAPM_MUX("Input Mode L", SND_SOC_NOPM, 0, 0, &input_mode_mux),
SND_SOC_DAPM_MUX("Input Mode R", SND_SOC_NOPM, 0, 0, &input_mode_mux),
SND_SOC_DAPM_ADC("ADCL", "Capture", WM8962_PWR_MGMT_1, 3, 0), SND_SOC_DAPM_ADC("ADCL", "Capture", WM8962_PWR_MGMT_1, 3, 0),
SND_SOC_DAPM_ADC("ADCR", "Capture", WM8962_PWR_MGMT_1, 2, 0), SND_SOC_DAPM_ADC("ADCR", "Capture", WM8962_PWR_MGMT_1, 2, 0),
...@@ -2226,16 +2236,19 @@ static const struct snd_soc_dapm_route wm8962_intercon[] = { ...@@ -2226,16 +2236,19 @@ static const struct snd_soc_dapm_route wm8962_intercon[] = {
{ "DMIC_ENA", NULL, "DMICDAT" }, { "DMIC_ENA", NULL, "DMICDAT" },
{ "Input Mode L", "Analog", "MIXINL" },
{ "Input Mode L", "Digital", "DMIC_ENA" },
{ "Input Mode R", "Analog", "MIXINR" },
{ "Input Mode R", "Digital", "DMIC_ENA" },
{ "ADCL", NULL, "SYSCLK" }, { "ADCL", NULL, "SYSCLK" },
{ "ADCL", NULL, "TOCLK" }, { "ADCL", NULL, "TOCLK" },
{ "ADCL", NULL, "MIXINL" }, { "ADCL", NULL, "Input Mode L" },
{ "ADCL", NULL, "DMIC_ENA" },
{ "ADCL", NULL, "DSP2" }, { "ADCL", NULL, "DSP2" },
{ "ADCR", NULL, "SYSCLK" }, { "ADCR", NULL, "SYSCLK" },
{ "ADCR", NULL, "TOCLK" }, { "ADCR", NULL, "TOCLK" },
{ "ADCR", NULL, "MIXINR" }, { "ADCR", NULL, "Input Mode R" },
{ "ADCR", NULL, "DMIC_ENA" },
{ "ADCR", NULL, "DSP2" }, { "ADCR", NULL, "DSP2" },
{ "STL", "Left", "ADCL" }, { "STL", "Left", "ADCL" },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment