ASoc: nau8810: add AUX related dapm widgets and routes
This patch implements the following features: - AUX input for recording. - An input AUX output to SPK/MOUT. Signed-off-by: Seven Lee <wtli@nuvoton.com> Link: https://lore.kernel.org/r/20200429090002.28556-1-wtli@nuvoton.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ee2cbe0693
commit
77be181e2c
|
@ -355,6 +355,8 @@ static const struct snd_kcontrol_new nau8810_snd_controls[] = {
|
||||||
|
|
||||||
/* Speaker Output Mixer */
|
/* Speaker Output Mixer */
|
||||||
static const struct snd_kcontrol_new nau8810_speaker_mixer_controls[] = {
|
static const struct snd_kcontrol_new nau8810_speaker_mixer_controls[] = {
|
||||||
|
SOC_DAPM_SINGLE("AUX Bypass Switch", NAU8810_REG_SPKMIX,
|
||||||
|
NAU8810_AUXSPK_SFT, 1, 0),
|
||||||
SOC_DAPM_SINGLE("Line Bypass Switch", NAU8810_REG_SPKMIX,
|
SOC_DAPM_SINGLE("Line Bypass Switch", NAU8810_REG_SPKMIX,
|
||||||
NAU8810_BYPSPK_SFT, 1, 0),
|
NAU8810_BYPSPK_SFT, 1, 0),
|
||||||
SOC_DAPM_SINGLE("PCM Playback Switch", NAU8810_REG_SPKMIX,
|
SOC_DAPM_SINGLE("PCM Playback Switch", NAU8810_REG_SPKMIX,
|
||||||
|
@ -363,6 +365,8 @@ static const struct snd_kcontrol_new nau8810_speaker_mixer_controls[] = {
|
||||||
|
|
||||||
/* Mono Output Mixer */
|
/* Mono Output Mixer */
|
||||||
static const struct snd_kcontrol_new nau8810_mono_mixer_controls[] = {
|
static const struct snd_kcontrol_new nau8810_mono_mixer_controls[] = {
|
||||||
|
SOC_DAPM_SINGLE("AUX Bypass Switch", NAU8810_REG_MONOMIX,
|
||||||
|
NAU8810_AUXMOUT_SFT, 1, 0),
|
||||||
SOC_DAPM_SINGLE("Line Bypass Switch", NAU8810_REG_MONOMIX,
|
SOC_DAPM_SINGLE("Line Bypass Switch", NAU8810_REG_MONOMIX,
|
||||||
NAU8810_BYPMOUT_SFT, 1, 0),
|
NAU8810_BYPMOUT_SFT, 1, 0),
|
||||||
SOC_DAPM_SINGLE("PCM Playback Switch", NAU8810_REG_MONOMIX,
|
SOC_DAPM_SINGLE("PCM Playback Switch", NAU8810_REG_MONOMIX,
|
||||||
|
@ -371,6 +375,8 @@ static const struct snd_kcontrol_new nau8810_mono_mixer_controls[] = {
|
||||||
|
|
||||||
/* PGA Mute */
|
/* PGA Mute */
|
||||||
static const struct snd_kcontrol_new nau8810_pgaboost_mixer_controls[] = {
|
static const struct snd_kcontrol_new nau8810_pgaboost_mixer_controls[] = {
|
||||||
|
SOC_DAPM_SINGLE("AUX PGA Switch", NAU8810_REG_ADCBOOST,
|
||||||
|
NAU8810_AUXBSTGAIN_SFT, 0x7, 0),
|
||||||
SOC_DAPM_SINGLE("PGA Mute Switch", NAU8810_REG_PGAGAIN,
|
SOC_DAPM_SINGLE("PGA Mute Switch", NAU8810_REG_PGAGAIN,
|
||||||
NAU8810_PGAMT_SFT, 1, 1),
|
NAU8810_PGAMT_SFT, 1, 1),
|
||||||
SOC_DAPM_SINGLE("PMIC PGA Switch", NAU8810_REG_ADCBOOST,
|
SOC_DAPM_SINGLE("PMIC PGA Switch", NAU8810_REG_ADCBOOST,
|
||||||
|
@ -379,6 +385,8 @@ static const struct snd_kcontrol_new nau8810_pgaboost_mixer_controls[] = {
|
||||||
|
|
||||||
/* Input PGA */
|
/* Input PGA */
|
||||||
static const struct snd_kcontrol_new nau8810_inpga[] = {
|
static const struct snd_kcontrol_new nau8810_inpga[] = {
|
||||||
|
SOC_DAPM_SINGLE("AUX Switch", NAU8810_REG_INPUT_SIGNAL,
|
||||||
|
NAU8810_AUXPGA_SFT, 1, 0),
|
||||||
SOC_DAPM_SINGLE("MicN Switch", NAU8810_REG_INPUT_SIGNAL,
|
SOC_DAPM_SINGLE("MicN Switch", NAU8810_REG_INPUT_SIGNAL,
|
||||||
NAU8810_NMICPGA_SFT, 1, 0),
|
NAU8810_NMICPGA_SFT, 1, 0),
|
||||||
SOC_DAPM_SINGLE("MicP Switch", NAU8810_REG_INPUT_SIGNAL,
|
SOC_DAPM_SINGLE("MicP Switch", NAU8810_REG_INPUT_SIGNAL,
|
||||||
|
@ -401,6 +409,23 @@ static int check_mclk_select_pll(struct snd_soc_dapm_widget *source,
|
||||||
return (value & NAU8810_CLKM_MASK);
|
return (value & NAU8810_CLKM_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_mic_enabled(struct snd_soc_dapm_widget *source,
|
||||||
|
struct snd_soc_dapm_widget *sink)
|
||||||
|
{
|
||||||
|
struct snd_soc_component *component =
|
||||||
|
snd_soc_dapm_to_component(source->dapm);
|
||||||
|
struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component);
|
||||||
|
unsigned int value;
|
||||||
|
|
||||||
|
regmap_read(nau8810->regmap, NAU8810_REG_INPUT_SIGNAL, &value);
|
||||||
|
if (value & NAU8810_PMICPGA_EN || value & NAU8810_NMICPGA_EN)
|
||||||
|
return 1;
|
||||||
|
regmap_read(nau8810->regmap, NAU8810_REG_ADCBOOST, &value);
|
||||||
|
if (value & NAU8810_PMICBSTGAIN_MASK)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget nau8810_dapm_widgets[] = {
|
static const struct snd_soc_dapm_widget nau8810_dapm_widgets[] = {
|
||||||
SND_SOC_DAPM_MIXER("Speaker Mixer", NAU8810_REG_POWER3,
|
SND_SOC_DAPM_MIXER("Speaker Mixer", NAU8810_REG_POWER3,
|
||||||
NAU8810_SPKMX_EN_SFT, 0, &nau8810_speaker_mixer_controls[0],
|
NAU8810_SPKMX_EN_SFT, 0, &nau8810_speaker_mixer_controls[0],
|
||||||
|
@ -425,6 +450,8 @@ static const struct snd_soc_dapm_widget nau8810_dapm_widgets[] = {
|
||||||
SND_SOC_DAPM_MIXER("Input Boost Stage", NAU8810_REG_POWER2,
|
SND_SOC_DAPM_MIXER("Input Boost Stage", NAU8810_REG_POWER2,
|
||||||
NAU8810_BST_EN_SFT, 0, nau8810_pgaboost_mixer_controls,
|
NAU8810_BST_EN_SFT, 0, nau8810_pgaboost_mixer_controls,
|
||||||
ARRAY_SIZE(nau8810_pgaboost_mixer_controls)),
|
ARRAY_SIZE(nau8810_pgaboost_mixer_controls)),
|
||||||
|
SND_SOC_DAPM_PGA("AUX Input", NAU8810_REG_POWER1,
|
||||||
|
NAU8810_AUX_EN_SFT, 0, NULL, 0),
|
||||||
|
|
||||||
SND_SOC_DAPM_SUPPLY("Mic Bias", NAU8810_REG_POWER1,
|
SND_SOC_DAPM_SUPPLY("Mic Bias", NAU8810_REG_POWER1,
|
||||||
NAU8810_MICBIAS_EN_SFT, 0, NULL, 0),
|
NAU8810_MICBIAS_EN_SFT, 0, NULL, 0),
|
||||||
|
@ -434,6 +461,7 @@ static const struct snd_soc_dapm_widget nau8810_dapm_widgets[] = {
|
||||||
SND_SOC_DAPM_SWITCH("Digital Loopback", SND_SOC_NOPM, 0, 0,
|
SND_SOC_DAPM_SWITCH("Digital Loopback", SND_SOC_NOPM, 0, 0,
|
||||||
&nau8810_loopback),
|
&nau8810_loopback),
|
||||||
|
|
||||||
|
SND_SOC_DAPM_INPUT("AUX"),
|
||||||
SND_SOC_DAPM_INPUT("MICN"),
|
SND_SOC_DAPM_INPUT("MICN"),
|
||||||
SND_SOC_DAPM_INPUT("MICP"),
|
SND_SOC_DAPM_INPUT("MICP"),
|
||||||
SND_SOC_DAPM_OUTPUT("MONOOUT"),
|
SND_SOC_DAPM_OUTPUT("MONOOUT"),
|
||||||
|
@ -445,10 +473,12 @@ static const struct snd_soc_dapm_route nau8810_dapm_routes[] = {
|
||||||
{"DAC", NULL, "PLL", check_mclk_select_pll},
|
{"DAC", NULL, "PLL", check_mclk_select_pll},
|
||||||
|
|
||||||
/* Mono output mixer */
|
/* Mono output mixer */
|
||||||
|
{"Mono Mixer", "AUX Bypass Switch", "AUX Input"},
|
||||||
{"Mono Mixer", "PCM Playback Switch", "DAC"},
|
{"Mono Mixer", "PCM Playback Switch", "DAC"},
|
||||||
{"Mono Mixer", "Line Bypass Switch", "Input Boost Stage"},
|
{"Mono Mixer", "Line Bypass Switch", "Input Boost Stage"},
|
||||||
|
|
||||||
/* Speaker output mixer */
|
/* Speaker output mixer */
|
||||||
|
{"Speaker Mixer", "AUX Bypass Switch", "AUX Input"},
|
||||||
{"Speaker Mixer", "PCM Playback Switch", "DAC"},
|
{"Speaker Mixer", "PCM Playback Switch", "DAC"},
|
||||||
{"Speaker Mixer", "Line Bypass Switch", "Input Boost Stage"},
|
{"Speaker Mixer", "Line Bypass Switch", "Input Boost Stage"},
|
||||||
|
|
||||||
|
@ -463,13 +493,16 @@ static const struct snd_soc_dapm_route nau8810_dapm_routes[] = {
|
||||||
/* Input Boost Stage */
|
/* Input Boost Stage */
|
||||||
{"ADC", NULL, "Input Boost Stage"},
|
{"ADC", NULL, "Input Boost Stage"},
|
||||||
{"ADC", NULL, "PLL", check_mclk_select_pll},
|
{"ADC", NULL, "PLL", check_mclk_select_pll},
|
||||||
|
{"Input Boost Stage", "AUX PGA Switch", "AUX Input"},
|
||||||
{"Input Boost Stage", "PGA Mute Switch", "Input PGA"},
|
{"Input Boost Stage", "PGA Mute Switch", "Input PGA"},
|
||||||
{"Input Boost Stage", "PMIC PGA Switch", "MICP"},
|
{"Input Boost Stage", "PMIC PGA Switch", "MICP"},
|
||||||
|
|
||||||
/* Input PGA */
|
/* Input PGA */
|
||||||
{"Input PGA", NULL, "Mic Bias"},
|
{"Input PGA", NULL, "Mic Bias", check_mic_enabled},
|
||||||
|
{"Input PGA", "AUX Switch", "AUX Input"},
|
||||||
{"Input PGA", "MicN Switch", "MICN"},
|
{"Input PGA", "MicN Switch", "MICN"},
|
||||||
{"Input PGA", "MicP Switch", "MICP"},
|
{"Input PGA", "MicP Switch", "MICP"},
|
||||||
|
{"AUX Input", NULL, "AUX"},
|
||||||
|
|
||||||
/* Digital Looptack */
|
/* Digital Looptack */
|
||||||
{"Digital Loopback", "Switch", "ADC"},
|
{"Digital Loopback", "Switch", "ADC"},
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
|
|
||||||
/* NAU8810_REG_POWER1 (0x1) */
|
/* NAU8810_REG_POWER1 (0x1) */
|
||||||
#define NAU8810_DCBUF_EN (0x1 << 8)
|
#define NAU8810_DCBUF_EN (0x1 << 8)
|
||||||
|
#define NAU8810_AUX_EN_SFT 6
|
||||||
#define NAU8810_PLL_EN_SFT 5
|
#define NAU8810_PLL_EN_SFT 5
|
||||||
#define NAU8810_MICBIAS_EN_SFT 4
|
#define NAU8810_MICBIAS_EN_SFT 4
|
||||||
#define NAU8810_ABIAS_EN (0x1 << 3)
|
#define NAU8810_ABIAS_EN (0x1 << 3)
|
||||||
|
@ -228,7 +229,10 @@
|
||||||
|
|
||||||
/* NAU8810_REG_INPUT_SIGNAL (0x2C) */
|
/* NAU8810_REG_INPUT_SIGNAL (0x2C) */
|
||||||
#define NAU8810_PMICPGA_SFT 0
|
#define NAU8810_PMICPGA_SFT 0
|
||||||
|
#define NAU8810_PMICPGA_EN (0x1 << NAU8810_PMICPGA_SFT)
|
||||||
#define NAU8810_NMICPGA_SFT 1
|
#define NAU8810_NMICPGA_SFT 1
|
||||||
|
#define NAU8810_NMICPGA_EN (0x1 << NAU8810_NMICPGA_SFT)
|
||||||
|
#define NAU8810_AUXPGA_SFT 2
|
||||||
|
|
||||||
/* NAU8810_REG_PGAGAIN (0x2D) */
|
/* NAU8810_REG_PGAGAIN (0x2D) */
|
||||||
#define NAU8810_PGAGAIN_SFT 0
|
#define NAU8810_PGAGAIN_SFT 0
|
||||||
|
@ -236,12 +240,15 @@
|
||||||
#define NAU8810_PGAZC_SFT 7
|
#define NAU8810_PGAZC_SFT 7
|
||||||
|
|
||||||
/* NAU8810_REG_ADCBOOST (0x2F) */
|
/* NAU8810_REG_ADCBOOST (0x2F) */
|
||||||
|
#define NAU8810_AUXBSTGAIN_SFT 0
|
||||||
#define NAU8810_PMICBSTGAIN_SFT 4
|
#define NAU8810_PMICBSTGAIN_SFT 4
|
||||||
|
#define NAU8810_PMICBSTGAIN_MASK (0x7 << NAU8810_PMICBSTGAIN_SFT)
|
||||||
#define NAU8810_PGABST_SFT 8
|
#define NAU8810_PGABST_SFT 8
|
||||||
|
|
||||||
/* NAU8810_REG_SPKMIX (0x32) */
|
/* NAU8810_REG_SPKMIX (0x32) */
|
||||||
#define NAU8810_DACSPK_SFT 0
|
#define NAU8810_DACSPK_SFT 0
|
||||||
#define NAU8810_BYPSPK_SFT 1
|
#define NAU8810_BYPSPK_SFT 1
|
||||||
|
#define NAU8810_AUXSPK_SFT 5
|
||||||
|
|
||||||
/* NAU8810_REG_SPKGAIN (0x36) */
|
/* NAU8810_REG_SPKGAIN (0x36) */
|
||||||
#define NAU8810_SPKGAIN_SFT 0
|
#define NAU8810_SPKGAIN_SFT 0
|
||||||
|
@ -251,6 +258,7 @@
|
||||||
/* NAU8810_REG_MONOMIX (0x38) */
|
/* NAU8810_REG_MONOMIX (0x38) */
|
||||||
#define NAU8810_DACMOUT_SFT 0
|
#define NAU8810_DACMOUT_SFT 0
|
||||||
#define NAU8810_BYPMOUT_SFT 1
|
#define NAU8810_BYPMOUT_SFT 1
|
||||||
|
#define NAU8810_AUXMOUT_SFT 2
|
||||||
#define NAU8810_MOUTMXMT_SFT 6
|
#define NAU8810_MOUTMXMT_SFT 6
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue