diff --git a/sound/soc/codecs/cs35l36.c b/sound/soc/codecs/cs35l36.c index 1fbe47936551..1ba75a81b528 100644 --- a/sound/soc/codecs/cs35l36.c +++ b/sound/soc/codecs/cs35l36.c @@ -202,12 +202,6 @@ static int cs35l36_main_amp_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: - if (!cs35l36->pdata.extern_boost) - regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL2, - CS35L36_BST_EN_MASK, - CS35L36_BST_EN << - CS35L36_BST_EN_SHIFT); - regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL1, CS35L36_GLOBAL_EN_MASK, 1 << CS35L36_GLOBAL_EN_SHIFT); @@ -224,12 +218,6 @@ static int cs35l36_main_amp_event(struct snd_soc_dapm_widget *w, 0 << CS35L36_AMP_MUTE_SHIFT); break; case SND_SOC_DAPM_POST_PMD: - if (!cs35l36->pdata.extern_boost) - regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL2, - CS35L36_BST_EN_MASK, - CS35L36_BST_DIS_VP << - CS35L36_BST_EN_SHIFT); - regmap_update_bits(cs35l36->regmap, CS35L36_ASP_RX1_SEL, CS35L36_PCM_RX_SEL_MASK, CS35L36_PCM_RX_SEL_ZERO); @@ -248,6 +236,33 @@ static int cs35l36_main_amp_event(struct snd_soc_dapm_widget *w, return ret; } +static int cs35l36_boost_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); + struct cs35l36_private *cs35l36 = snd_soc_codec_get_drvdata(codec); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + if (!cs35l36->pdata.extern_boost) + regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL2, + CS35L36_BST_EN_MASK, + CS35L36_BST_EN << + CS35L36_BST_EN_SHIFT); + break; + case SND_SOC_DAPM_POST_PMD: + if (!cs35l36->pdata.extern_boost) + regmap_update_bits(cs35l36->regmap, CS35L36_PWR_CTRL2, + CS35L36_BST_EN_MASK, + CS35L36_BST_DIS_VP << + CS35L36_BST_EN_SHIFT); + break; + default: + dev_dbg(codec->dev, "Invalid event = 0x%x\n", event); + } + return 0; +} + static const struct snd_kcontrol_new amp_enable_ctrl = SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0); static const struct snd_kcontrol_new tx1_enable_ctrl = @@ -326,6 +341,19 @@ static SOC_VALUE_ENUM_SINGLE_DECL(asp_tx6_src_enum, static const struct snd_kcontrol_new asp_tx6_src = SOC_DAPM_ENUM("ASPTX6SRC", asp_tx6_src_enum); +static const char * const cs35l36_boost_text[] = { + "On", + "Off", +}; + +static SOC_ENUM_SINGLE_DECL(boost_enum, SND_SOC_NOPM, 0, + cs35l36_boost_text); + +static const struct snd_kcontrol_new cs35l36_boost_mux[] = { + SOC_DAPM_ENUM("Boost Enable", boost_enum), +}; + + static const struct snd_soc_dapm_widget cs35l36_dapm_widgets[] = { SND_SOC_DAPM_AIF_IN("SDIN", NULL, 0, SND_SOC_NOPM, 0, 0), @@ -338,6 +366,11 @@ static const struct snd_soc_dapm_widget cs35l36_dapm_widgets[] = { SND_SOC_DAPM_OUTPUT("SPK"), SND_SOC_DAPM_SWITCH("AMP Enable", SND_SOC_NOPM, 0, 1, &_enable_ctrl), + SND_SOC_DAPM_MIXER("CLASS H", CS35L36_PWR_CTRL3, 4, 0, NULL, 0), + SND_SOC_DAPM_MUX_E("BOOST Mux", SND_SOC_NOPM, 0, 0, cs35l36_boost_mux, + cs35l36_boost_event, SND_SOC_DAPM_POST_PMD | + SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_AIF_OUT("ASPTX1", NULL, 0, CS35L36_ASP_RX_TX_EN, 0, 0), SND_SOC_DAPM_AIF_OUT("ASPTX2", NULL, 1, CS35L36_ASP_RX_TX_EN, 1, 0), SND_SOC_DAPM_AIF_OUT("ASPTX3", NULL, 2, CS35L36_ASP_RX_TX_EN, 2, 0), @@ -363,7 +396,6 @@ static const struct snd_soc_dapm_widget cs35l36_dapm_widgets[] = { SND_SOC_DAPM_ADC("IMON ADC", NULL, CS35L36_PWR_CTRL2, 13, 0), SND_SOC_DAPM_ADC("VPMON ADC", NULL, CS35L36_PWR_CTRL2, 8, 0), SND_SOC_DAPM_ADC("VBSTMON ADC", NULL, CS35L36_PWR_CTRL2, 9, 0), - SND_SOC_DAPM_ADC("CLASS H", NULL, CS35L36_PWR_CTRL3, 4, 0), SND_SOC_DAPM_INPUT("VP"), SND_SOC_DAPM_INPUT("VBST"), @@ -430,7 +462,9 @@ static const struct snd_soc_dapm_route cs35l36_audio_map[] = { {"AMP Enable", "Switch", "AMP Playback"}, {"SDIN", NULL, "AMP Enable"}, - {"CLASS H", NULL, "SDIN"}, + {"BOOST Mux", "On", "SDIN"}, + {"CLASS H", NULL, "BOOST Mux"}, + {"Main AMP", NULL, "SDIN"}, {"Main AMP", NULL, "CLASS H"}, {"SPK", NULL, "Main AMP"},