From b6cb4db4110e42db964a29ed224089f6bd3090c2 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Fri, 19 Feb 2016 16:11:04 +0800 Subject: [PATCH] ASoC: rt5640: add mono adc event function Change-Id: I9d992ce28ad8cc7f772cb83ebde6b9c57b412acd Signed-off-by: Sugar Zhang --- sound/soc/codecs/rt5640.c | 60 ++++++++++++++++++++++++++++++++++++--- sound/soc/codecs/rt5640.h | 6 ++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index 09288233d3c4..6626e2cfbcb7 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c @@ -1056,6 +1056,52 @@ static int rt5640_hp_post_event(struct snd_soc_dapm_widget *w, return 0; } +static int rt5640_mono_adcl_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + snd_soc_update_bits(codec, RT5640_GEN_CTRL1, + RT5640_M_MAMIX_L, 0); + break; + case SND_SOC_DAPM_PRE_PMD: + snd_soc_update_bits(codec, RT5640_GEN_CTRL1, + RT5640_M_MAMIX_L, + RT5640_M_MAMIX_L); + break; + + default: + return 0; + } + + return 0; +} + +static int rt5640_mono_adcr_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + snd_soc_update_bits(codec, RT5640_GEN_CTRL1, + RT5640_M_MAMIX_R, 0); + break; + case SND_SOC_DAPM_PRE_PMD: + snd_soc_update_bits(codec, RT5640_GEN_CTRL1, + RT5640_M_MAMIX_R, + RT5640_M_MAMIX_R); + break; + + default: + return 0; + } + + return 0; +} + static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2, RT5640_PWR_PLL_BIT, 0, NULL, 0), @@ -1133,12 +1179,18 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { rt5640_sto_adc_r_mix, ARRAY_SIZE(rt5640_sto_adc_r_mix)), SND_SOC_DAPM_SUPPLY("Mono Left Filter", RT5640_PWR_DIG2, RT5640_PWR_ADC_MF_L_BIT, 0, NULL, 0), - SND_SOC_DAPM_MIXER("Mono ADC MIXL", SND_SOC_NOPM, 0, 0, - rt5640_mono_adc_l_mix, ARRAY_SIZE(rt5640_mono_adc_l_mix)), + SND_SOC_DAPM_MIXER_E("Mono ADC MIXL", SND_SOC_NOPM, 0, 0, + rt5640_mono_adc_l_mix, + ARRAY_SIZE(rt5640_mono_adc_l_mix), + rt5640_mono_adcl_event, + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_SUPPLY("Mono Right Filter", RT5640_PWR_DIG2, RT5640_PWR_ADC_MF_R_BIT, 0, NULL, 0), - SND_SOC_DAPM_MIXER("Mono ADC MIXR", SND_SOC_NOPM, 0, 0, - rt5640_mono_adc_r_mix, ARRAY_SIZE(rt5640_mono_adc_r_mix)), + SND_SOC_DAPM_MIXER_E("Mono ADC MIXR", SND_SOC_NOPM, 0, 0, + rt5640_mono_adc_r_mix, + ARRAY_SIZE(rt5640_mono_adc_r_mix), + rt5640_mono_adcr_event, + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), /* Digital Interface */ SND_SOC_DAPM_SUPPLY("I2S1", RT5640_PWR_DIG1, diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h index 084507d15c58..170c4dc33f92 100644 --- a/sound/soc/codecs/rt5640.h +++ b/sound/soc/codecs/rt5640.h @@ -178,6 +178,8 @@ #define RT5640_EQ_GN_HIP2 0xb2 #define RT5640_EQ_PRE_VOL 0xb3 #define RT5640_EQ_PST_VOL 0xb4 +/* General Control */ +#define RT5640_GEN_CTRL1 0xfa /* global definition */ #define RT5640_L_MUTE (0x1 << 15) @@ -2036,6 +2038,10 @@ enum { #define RT5640_HEADSET_DET BIT(1) #define RT5640_HEADPHO_DET BIT(2) +/* General Control1 (0xfa) */ +#define RT5640_M_MAMIX_L (0x1 << 13) +#define RT5640_M_MAMIX_R (0x1 << 12) + /* System Clock Source */ #define RT5640_SCLK_S_MCLK 0 #define RT5640_SCLK_S_PLL1 1 -- 2.34.1