From 2761d848134298133c010130b1f33121cd96145c Mon Sep 17 00:00:00 2001 From: Oleksandr Suvorov Date: Fri, 3 May 2019 17:28:11 +0300 Subject: ASoC: sgtl5000: Add on/off control for HP/LINE out - adding mute/unmute controls for headphone and lineout allows alsa-compatible sound players automatically unmute output port to play music. Related to: #48500 Signed-off-by: Oleksandr Suvorov --- sound/soc/codecs/sgtl5000.c | 34 +++++++++++++++++++++++----------- sound/soc/codecs/sgtl5000.h | 3 +++ 2 files changed, 26 insertions(+), 11 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index 532b94874534..fcf58ae15f54 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -450,24 +450,35 @@ static const struct snd_kcontrol_new sgtl5000_snd_controls[] = { .put = dac_put_volsw, }, + /* ADC Capture */ SOC_DOUBLE("Capture Volume", SGTL5000_CHIP_ANA_ADC_CTRL, 0, 4, 0xf, 0), SOC_SINGLE_TLV("Capture Attenuate Switch (-6dB)", - SGTL5000_CHIP_ANA_ADC_CTRL, - 8, 1, 0, capture_6db_attenuate), - SOC_SINGLE("Capture ZC Switch", SGTL5000_CHIP_ANA_CTRL, 1, 1, 0), + SGTL5000_CHIP_ANA_ADC_CTRL, + SGTL5000_ADC_VOL_M6DB, 1, 0, capture_6db_attenuate), + SOC_SINGLE("Capture ZC Switch", SGTL5000_CHIP_ANA_CTRL, + SGTL5000_ADC_ZCD_EN, 1, 0), + /* Headphone */ SOC_DOUBLE_TLV("Headphone Playback Volume", - SGTL5000_CHIP_ANA_HP_CTRL, - 0, 8, - 0x7f, 1, - headphone_volume), + SGTL5000_CHIP_ANA_HP_CTRL, + SGTL5000_HP_VOL_LEFT_SHIFT, + SGTL5000_HP_VOL_RIGHT_SHIFT, + 0x7f, 1, + headphone_volume), SOC_SINGLE("Headphone Playback Switch", SGTL5000_CHIP_ANA_CTRL, - 4, 1, 1), + SGTL5000_HP_MUTE_SHIFT, 1, 1), SOC_SINGLE("Headphone Playback ZC Switch", SGTL5000_CHIP_ANA_CTRL, - 5, 1, 0), + SGTL5000_HP_ZCD_EN, 1, 0), + SOC_SINGLE("Headphone Playback Switch", SGTL5000_CHIP_ANA_CTRL, + SGTL5000_HP_MUTE_SHIFT, 1, 1), + + /* Lineout */ + SOC_SINGLE("Lineout Playback Switch", SGTL5000_CHIP_ANA_CTRL, + SGTL5000_LINE_MUTE_SHIFT, 1, 1), + /* Microphone */ SOC_SINGLE_TLV("Mic Volume", SGTL5000_CHIP_MIC_CTRL, - 0, 3, 0, mic_gain_tlv), + SGTL5000_MIC_GAIN_SHIFT, 3, 0, mic_gain_tlv), SOC_DOUBLE_TLV("Lineout Playback Volume", SGTL5000_CHIP_LINE_OUT_VOL, @@ -475,7 +486,8 @@ static const struct snd_kcontrol_new sgtl5000_snd_controls[] = { SGTL5000_LINE_OUT_VOL_RIGHT_SHIFT, 0x1f, 1, lineout_volume), - SOC_SINGLE("Lineout Playback Switch", SGTL5000_CHIP_ANA_CTRL, 8, 1, 1), + SOC_SINGLE("Lineout Playback Switch", SGTL5000_CHIP_ANA_CTRL, + SGTL5000_LINE_MUTE_SHIFT, 1, 1), }; /* mute the codec used by alsa core */ diff --git a/sound/soc/codecs/sgtl5000.h b/sound/soc/codecs/sgtl5000.h index 1c62073000de..fda7b7a6c5f3 100644 --- a/sound/soc/codecs/sgtl5000.h +++ b/sound/soc/codecs/sgtl5000.h @@ -237,6 +237,7 @@ * SGTL5000_CHIP_ANA_CTRL */ #define SGTL5000_LINE_OUT_MUTE 0x0100 +#define SGTL5000_LINE_MUTE_SHIFT 8 #define SGTL5000_HP_SEL_MASK 0x0040 #define SGTL5000_HP_SEL_SHIFT 6 #define SGTL5000_HP_SEL_WIDTH 1 @@ -244,6 +245,7 @@ #define SGTL5000_HP_SEL_LINE_IN 0x1 #define SGTL5000_HP_ZCD_EN 0x0020 #define SGTL5000_HP_MUTE 0x0010 +#define SGTL5000_HP_MUTE_SHIFT 4 #define SGTL5000_ADC_SEL_MASK 0x0004 #define SGTL5000_ADC_SEL_SHIFT 2 #define SGTL5000_ADC_SEL_WIDTH 1 @@ -251,6 +253,7 @@ #define SGTL5000_ADC_SEL_LINE_IN 0x1 #define SGTL5000_ADC_ZCD_EN 0x0002 #define SGTL5000_ADC_MUTE 0x0001 +#define SGTL5000_ADC_MUTE_SHIFT 0 /* * SGTL5000_CHIP_LINREG_CTRL -- cgit v1.2.3