diff --git a/asoc/codecs/wcd939x/wcd939x.c b/asoc/codecs/wcd939x/wcd939x.c index 18fab2c828..a83321f810 100644 --- a/asoc/codecs/wcd939x/wcd939x.c +++ b/asoc/codecs/wcd939x/wcd939x.c @@ -842,10 +842,69 @@ struct wcd939x_mbhc *wcd939x_soc_get_mbhc(struct snd_soc_component *component) } EXPORT_SYMBOL(wcd939x_soc_get_mbhc); +static int wcd939x_config_power_mode(struct snd_soc_component *component, + int event, int index, int mode) +{ + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + if (mode == CLS_H_ULP) { + if (index == WCD939X_HPHL) { + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL12, ZONE3_RMS, 0x21)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL13, ZONE4_RMS, 0x30)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL14, ZONE5_RMS, 0x3F)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL15, ZONE6_RMS, 0x48)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL17, PATH_GAIN, 0x0C)); + } else if (index == WCD939X_HPHR) { + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL12, ZONE3_RMS, 0x21)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL13, ZONE4_RMS, 0x30)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL14, ZONE5_RMS, 0x3F)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL15, ZONE6_RMS, 0x48)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL17, PATH_GAIN, 0x0C)); + } + } else { + if (index == WCD939X_HPHL) { + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL12, ZONE3_RMS, 0x1E)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL13, ZONE4_RMS, 0x2A)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL14, ZONE5_RMS, 0x36)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL15, ZONE6_RMS, 0x3C)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(CTL17, PATH_GAIN, 0x00)); + } else if (index == WCD939X_HPHR) { + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL12, ZONE3_RMS, 0x1E)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL13, ZONE4_RMS, 0x2A)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL14, ZONE5_RMS, 0x36)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL15, ZONE6_RMS, 0x2C)); + snd_soc_component_update_bits(component, + REG_FIELD_VALUE(R_CTL17, PATH_GAIN, 0x00)); + } + } + } + return 0; +} + static int wcd939x_enable_hph_pcm_index(struct snd_soc_component *component, int event, int hph) { - struct wcd939x_priv *wcd939x; + struct wcd939x_priv *wcd939x = NULL; if (!component) { pr_err_ratelimited("%s: Invalid params, NULL component\n", __func__); @@ -1006,7 +1065,7 @@ static int wcd939x_config_xtalk(struct snd_soc_component *component, break; case SND_SOC_DAPM_POST_PMU: /* enable xtalk for L and R channels*/ - snd_soc_component_update_bits(component, WCD939X_RX_PATH_CFG2, + snd_soc_component_update_bits(component, WCD939X_RX_PATH_CFG2, 0x0F, 0x0F); break; case SND_SOC_DAPM_POST_PMD: @@ -1024,10 +1083,12 @@ static int wcd939x_rx_mux(struct snd_soc_dapm_widget *w, int event) { - struct wcd939x_priv *wcd939x; + int hph_mode = 0; + struct wcd939x_priv *wcd939x = NULL; struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); wcd939x = snd_soc_component_get_drvdata(component); + hph_mode = wcd939x->hph_mode; dev_dbg(component->dev, "%s event: %d wshift: %d wname: %s\n", __func__, event, w->shift, w->name); @@ -1035,6 +1096,8 @@ static int wcd939x_rx_mux(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: wcd939x_rx_clk_enable(component); + if (wcd939x->hph_pcm_enabled[w->shift]) + wcd939x_config_power_mode(component, event, w->shift, hph_mode); wcd939x_config_compander(component, event, w->shift); wcd939x_config_xtalk(component, event, w->shift); break;