|
@@ -1642,6 +1642,51 @@ static int wcd937x_codec_enable_micbias(struct snd_soc_dapm_widget *w,
|
|
|
return __wcd937x_codec_enable_micbias(w, event);
|
|
|
}
|
|
|
|
|
|
+static int __wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w,
|
|
|
+ int event)
|
|
|
+{
|
|
|
+ struct snd_soc_component *component =
|
|
|
+ snd_soc_dapm_to_component(w->dapm);
|
|
|
+ int micb_num;
|
|
|
+
|
|
|
+ dev_dbg(component->dev, "%s: wname: %s, event: %d\n",
|
|
|
+ __func__, w->name, event);
|
|
|
+
|
|
|
+ if (strnstr(w->name, "VA MIC BIAS1", sizeof("VA MIC BIAS1")))
|
|
|
+ micb_num = MIC_BIAS_1;
|
|
|
+ else if (strnstr(w->name, "VA MIC BIAS2", sizeof("VA MIC BIAS2")))
|
|
|
+ micb_num = MIC_BIAS_2;
|
|
|
+ else if (strnstr(w->name, "VA MIC BIAS3", sizeof("VA MIC BIAS3")))
|
|
|
+ micb_num = MIC_BIAS_3;
|
|
|
+ else
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ switch (event) {
|
|
|
+ case SND_SOC_DAPM_PRE_PMU:
|
|
|
+ wcd937x_micbias_control(component, micb_num,
|
|
|
+ MICB_PULLUP_ENABLE, true);
|
|
|
+ break;
|
|
|
+ case SND_SOC_DAPM_POST_PMU:
|
|
|
+ /* 1 msec delay as per HW requirement */
|
|
|
+ usleep_range(1000, 1100);
|
|
|
+ break;
|
|
|
+ case SND_SOC_DAPM_POST_PMD:
|
|
|
+ wcd937x_micbias_control(component, micb_num,
|
|
|
+ MICB_PULLUP_DISABLE, true);
|
|
|
+ break;
|
|
|
+ };
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+static int wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w,
|
|
|
+ struct snd_kcontrol *kcontrol,
|
|
|
+ int event)
|
|
|
+{
|
|
|
+ return __wcd937x_codec_enable_micbias_pullup(w, event);
|
|
|
+}
|
|
|
+
|
|
|
static int wcd937x_rx_hph_mode_get(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
@@ -2052,6 +2097,20 @@ static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = {
|
|
|
SND_SOC_DAPM_OUTPUT("HPHL"),
|
|
|
SND_SOC_DAPM_OUTPUT("HPHR"),
|
|
|
|
|
|
+ /* micbias pull up widgets*/
|
|
|
+ SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0,
|
|
|
+ wcd937x_codec_enable_micbias_pullup,
|
|
|
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
|
|
+ SND_SOC_DAPM_POST_PMD),
|
|
|
+ SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS2", SND_SOC_NOPM, 0, 0,
|
|
|
+ wcd937x_codec_enable_micbias_pullup,
|
|
|
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
|
|
+ SND_SOC_DAPM_POST_PMD),
|
|
|
+ SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS3", SND_SOC_NOPM, 0, 0,
|
|
|
+ wcd937x_codec_enable_micbias_pullup,
|
|
|
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
|
|
+ SND_SOC_DAPM_POST_PMD),
|
|
|
+
|
|
|
};
|
|
|
|
|
|
static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
|