ASoC: wcd9310: Enable MBHC micbias always when headset is inserted
Add kernel parameter to select whenever micbias always
needs to be enabled. This is required when there is polling
noise due to sharing of cfilt in wrong HW designs.
Change-Id: I5f19de8303c04e5973e130e4a307240b4c74651c
Signed-off-by: Simmi Pateriya <simmip@codeaurora.org>
diff --git a/sound/soc/codecs/wcd9310.c b/sound/soc/codecs/wcd9310.c
index 6b3287e..a6dbb85 100644
--- a/sound/soc/codecs/wcd9310.c
+++ b/sound/soc/codecs/wcd9310.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -317,6 +317,8 @@
enum tabla_mbhc_state mbhc_state;
struct tabla_mbhc_config mbhc_cfg;
struct mbhc_internal_cal_data mbhc_data;
+ u32 ldo_h_count;
+ u32 micbias_enable_count[TABLA_NUM_MICBIAS];
struct wcd9xxx_pdata *pdata;
u32 anc_slot;
@@ -2825,45 +2827,57 @@
char *internal1_text = "Internal1";
char *internal2_text = "Internal2";
char *internal3_text = "Internal3";
+ const char *micbias1_text = "MIC BIAS1 ";
+ const char *micbias2_text = "MIC BIAS2 ";
+ const char *micbias3_text = "MIC BIAS3 ";
+ const char *micbias4_text = "MIC BIAS4 ";
+ u32 *micbias_enable_count;
+ u16 wreg;
pr_debug("%s %d\n", __func__, event);
- switch (w->reg) {
- case TABLA_A_MICB_1_CTL:
+ if (strnstr(w->name, micbias1_text, strlen(micbias1_text))) {
+ wreg = TABLA_A_MICB_1_CTL;
micb_int_reg = TABLA_A_MICB_1_INT_RBIAS;
cfilt_sel_val = tabla->pdata->micbias.bias1_cfilt_sel;
micb_line = TABLA_MICBIAS1;
- break;
- case TABLA_A_MICB_2_CTL:
+ } else if (strnstr(w->name, micbias2_text, strlen(micbias2_text))) {
+ wreg = TABLA_A_MICB_2_CTL;
micb_int_reg = TABLA_A_MICB_2_INT_RBIAS;
cfilt_sel_val = tabla->pdata->micbias.bias2_cfilt_sel;
micb_line = TABLA_MICBIAS2;
- break;
- case TABLA_A_MICB_3_CTL:
+ } else if (strnstr(w->name, micbias3_text, strlen(micbias3_text))) {
+ wreg = TABLA_A_MICB_3_CTL;
micb_int_reg = TABLA_A_MICB_3_INT_RBIAS;
cfilt_sel_val = tabla->pdata->micbias.bias3_cfilt_sel;
micb_line = TABLA_MICBIAS3;
- break;
- case TABLA_1_A_MICB_4_CTL:
- case TABLA_2_A_MICB_4_CTL:
+ } else if (strnstr(w->name, micbias4_text, strlen(micbias4_text))) {
+ wreg = tabla->reg_addr.micb_4_ctl;
micb_int_reg = tabla->reg_addr.micb_4_int_rbias;
cfilt_sel_val = tabla->pdata->micbias.bias4_cfilt_sel;
micb_line = TABLA_MICBIAS4;
- break;
- default:
+ } else {
pr_err("%s: Error, invalid micbias register\n", __func__);
return -EINVAL;
}
+ micbias_enable_count = &tabla->micbias_enable_count[micb_line];
+ pr_debug("%s: counter %d\n", __func__, *micbias_enable_count);
+
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
+ if (++*micbias_enable_count > 1) {
+ pr_debug("%s: do nothing, counter %d\n",
+ __func__, *micbias_enable_count);
+ break;
+ }
/* Decide whether to switch the micbias for MBHC */
- if (w->reg == tabla->mbhc_bias_regs.ctl_reg) {
+ if (wreg == tabla->mbhc_bias_regs.ctl_reg) {
TABLA_ACQUIRE_LOCK(tabla->codec_resource_lock);
tabla_codec_switch_micbias(codec, 0);
TABLA_RELEASE_LOCK(tabla->codec_resource_lock);
}
- snd_soc_update_bits(codec, w->reg, 0x0E, 0x0A);
+ snd_soc_update_bits(codec, wreg, 0x0E, 0x0A);
tabla_codec_update_cfilt_usage(codec, cfilt_sel_val, 1);
if (strnstr(w->name, internal1_text, 30))
@@ -2873,9 +2887,15 @@
else if (strnstr(w->name, internal3_text, 30))
snd_soc_update_bits(codec, micb_int_reg, 0x3, 0x3);
+ snd_soc_update_bits(codec, wreg, 1 << 7, 1 << 7);
+
break;
case SND_SOC_DAPM_POST_PMU:
-
+ if (*micbias_enable_count > 1) {
+ pr_debug("%s: do nothing, counter %d\n",
+ __func__, *micbias_enable_count);
+ break;
+ }
usleep_range(20000, 20000);
if (tabla->mbhc_polling_active &&
@@ -2888,7 +2908,15 @@
break;
case SND_SOC_DAPM_POST_PMD:
- if ((w->reg == tabla->mbhc_bias_regs.ctl_reg) &&
+ if (--*micbias_enable_count > 0) {
+ pr_debug("%s: do nothing, counter %d\n",
+ __func__, *micbias_enable_count);
+ break;
+ }
+
+ snd_soc_update_bits(codec, wreg, 1 << 7, 0);
+
+ if ((wreg == tabla->mbhc_bias_regs.ctl_reg) &&
tabla_is_hph_pa_on(codec)) {
TABLA_ACQUIRE_LOCK(tabla->codec_resource_lock);
tabla_codec_switch_micbias(codec, 1);
@@ -2939,6 +2967,35 @@
#define CF_MIN_3DB_75HZ 0x1
#define CF_MIN_3DB_150HZ 0x2
+static int tabla_codec_enable_ldo_h(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event);
+
+static int tabla_codec_enable_micbias_power(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol,
+ int event)
+{
+ struct snd_soc_codec *codec = w->codec;
+ struct tabla_priv *tabla = snd_soc_codec_get_drvdata(codec);
+
+ pr_debug("%s %d\n", __func__, event);
+
+ switch (event) {
+ case SND_SOC_DAPM_PRE_PMU:
+ tabla->mbhc_cfg.mclk_cb_fn(codec, 1, true);
+ tabla_codec_enable_ldo_h(w, kcontrol, event);
+ tabla_codec_enable_micbias(w, kcontrol, event);
+ break;
+ case SND_SOC_DAPM_POST_PMU:
+ tabla->mbhc_cfg.mclk_cb_fn(codec, 0, true);
+ break;
+ case SND_SOC_DAPM_POST_PMD:
+ tabla_codec_enable_micbias(w, kcontrol, event);
+ tabla_codec_enable_ldo_h(w, kcontrol, event);
+ break;
+ }
+ return 0;
+}
+
static int tabla_codec_enable_dec(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
@@ -3088,12 +3145,35 @@
return 0;
}
+static void tabla_enable_ldo_h(struct snd_soc_codec *codec, u32 enable)
+{
+ struct tabla_priv *tabla = snd_soc_codec_get_drvdata(codec);
+
+ if (enable) {
+ if (++tabla->ldo_h_count == 1)
+ snd_soc_update_bits(codec, TABLA_A_LDO_H_MODE_1,
+ 0x80, 0x80);
+ } else {
+ if (--tabla->ldo_h_count == 0)
+ snd_soc_update_bits(codec, TABLA_A_LDO_H_MODE_1,
+ 0x80, 0x00);
+ }
+}
+
static int tabla_codec_enable_ldo_h(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
+ struct snd_soc_codec *codec = w->codec;
+
+ pr_debug("%s %d\n", __func__, event);
+
switch (event) {
- case SND_SOC_DAPM_POST_PMU:
+ case SND_SOC_DAPM_PRE_PMU:
+ tabla_enable_ldo_h(codec, 1);
+ usleep_range(1000, 1000);
+ break;
case SND_SOC_DAPM_POST_PMD:
+ tabla_enable_ldo_h(codec, 0);
usleep_range(1000, 1000);
break;
}
@@ -3348,14 +3428,14 @@
}
static const struct snd_soc_dapm_widget tabla_1_x_dapm_widgets[] = {
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS4 External", TABLA_1_A_MICB_4_CTL, 7,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS4 External", SND_SOC_NOPM, 0,
0, tabla_codec_enable_micbias,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
SND_SOC_DAPM_POST_PMD),
};
static const struct snd_soc_dapm_widget tabla_2_higher_dapm_widgets[] = {
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS4 External", TABLA_2_A_MICB_4_CTL, 7,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS4 External", SND_SOC_NOPM, 0,
0, tabla_codec_enable_micbias,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
SND_SOC_DAPM_POST_PMD),
@@ -4179,7 +4259,7 @@
tabla_codec_pause_hs_polling(codec);
tabla_codec_disable_clock_block(codec);
tabla_codec_enable_bandgap(codec,
- TABLA_BANDGAP_MBHC_MODE);
+ TABLA_BANDGAP_MBHC_MODE);
tabla_enable_rx_bias(codec, 1);
tabla_codec_enable_clock_block(codec, 1);
tabla_codec_calibrate_hs_polling(codec);
@@ -5092,8 +5172,9 @@
SND_SOC_DAPM_SUPPLY("CDC_CONN", TABLA_A_CDC_CLK_OTHR_CTL, 2, 0, NULL,
0),
- SND_SOC_DAPM_SUPPLY("LDO_H", TABLA_A_LDO_H_MODE_1, 7, 0,
- tabla_codec_enable_ldo_h, SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_SUPPLY("LDO_H", SND_SOC_NOPM, 0, 0,
+ tabla_codec_enable_ldo_h, SND_SOC_DAPM_PRE_PMU |
+ SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_SUPPLY("COMP1_CLK", SND_SOC_NOPM, 0, 0,
tabla_config_compander, SND_SOC_DAPM_PRE_PMU |
@@ -5103,13 +5184,13 @@
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_POST_PMD),
SND_SOC_DAPM_INPUT("AMIC1"),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 External", TABLA_A_MICB_1_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 External", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 Internal1", TABLA_A_MICB_1_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 Internal1", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 Internal2", TABLA_A_MICB_1_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS1 Internal2", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("ADC1", NULL, TABLA_A_TX_1_2_EN, 7, 0,
@@ -5194,25 +5275,31 @@
SND_SOC_DAPM_MUX("ANC1 FB MUX", SND_SOC_NOPM, 0, 0, &anc1_fb_mux),
SND_SOC_DAPM_INPUT("AMIC2"),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 External", TABLA_A_MICB_2_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 External", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
- SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal1", TABLA_A_MICB_2_CTL, 7, 0,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Power External",
+ TABLA_A_MICB_2_CTL, 7, 0,
+ tabla_codec_enable_micbias_power,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+ SND_SOC_DAPM_POST_PMD),
+
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal1", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal2", TABLA_A_MICB_2_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal2", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal3", TABLA_A_MICB_2_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS2 Internal3", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 External", TABLA_A_MICB_3_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 External", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 Internal1", TABLA_A_MICB_3_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 Internal1", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
- SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 Internal2", TABLA_A_MICB_3_CTL, 7, 0,
+ SND_SOC_DAPM_MICBIAS_E("MIC BIAS3 Internal2", SND_SOC_NOPM, 0, 0,
tabla_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("ADC2", NULL, TABLA_A_TX_1_2_EN, 3, 0,
@@ -5411,7 +5498,7 @@
{
struct tabla_priv *tabla = snd_soc_codec_get_drvdata(codec);
short bias_value;
- u8 cfilt_mode;
+ u8 cfilt_mode = 0;
pr_debug("%s: enter, mclk_enabled %d\n", __func__, tabla->mclk_enabled);
if (!tabla->mbhc_cfg.calibration) {
@@ -5427,10 +5514,13 @@
}
snd_soc_update_bits(codec, TABLA_A_CLK_BUFF_EN1, 0x05, 0x01);
-
- /* Make sure CFILT is in fast mode, save current mode */
- cfilt_mode = snd_soc_read(codec, tabla->mbhc_bias_regs.cfilt_ctl);
- snd_soc_update_bits(codec, tabla->mbhc_bias_regs.cfilt_ctl, 0x70, 0x00);
+ if (!tabla->mbhc_cfg.micbias_always_on) {
+ /* Make sure CFILT is in fast mode, save current mode */
+ cfilt_mode = snd_soc_read(codec,
+ tabla->mbhc_bias_regs.cfilt_ctl);
+ snd_soc_update_bits(codec, tabla->mbhc_bias_regs.cfilt_ctl,
+ 0x70, 0x00);
+ }
snd_soc_update_bits(codec, tabla->mbhc_bias_regs.ctl_reg, 0x1F, 0x16);
@@ -5452,8 +5542,9 @@
/* don't flip override */
bias_value = __tabla_codec_sta_dce(codec, 1, true, true);
- snd_soc_update_bits(codec, tabla->mbhc_bias_regs.cfilt_ctl, 0x40,
- cfilt_mode);
+ if (!tabla->mbhc_cfg.micbias_always_on)
+ snd_soc_update_bits(codec, tabla->mbhc_bias_regs.cfilt_ctl,
+ 0x40, cfilt_mode);
snd_soc_update_bits(codec, TABLA_A_MBHC_HPH, 0x13, 0x00);
return bias_value;
@@ -5550,6 +5641,36 @@
}
/* called under codec_resource_lock acquisition */
+static void tabla_codec_enable_mbhc_micbias(struct snd_soc_codec *codec,
+ bool enable)
+{
+ int r;
+ struct tabla_priv *tabla = snd_soc_codec_get_drvdata(codec);
+
+ if (!tabla->mbhc_cfg.micbias_always_on)
+ return;
+ if (enable) {
+ TABLA_RELEASE_LOCK(tabla->codec_resource_lock);
+ tabla_codec_update_cfilt_usage(codec,
+ tabla->mbhc_bias_regs.cfilt_sel, 1);
+ r = snd_soc_dapm_force_enable_pin(&codec->dapm,
+ "MIC BIAS2 Power External");
+ snd_soc_dapm_sync(&codec->dapm);
+ TABLA_ACQUIRE_LOCK(tabla->codec_resource_lock);
+ pr_debug("%s: Turning on MICBIAS2 r %d\n", __func__, r);
+ } else {
+ TABLA_RELEASE_LOCK(tabla->codec_resource_lock);
+ r = snd_soc_dapm_disable_pin(&codec->dapm,
+ "MIC BIAS2 Power External");
+ snd_soc_dapm_sync(&codec->dapm);
+ tabla_codec_update_cfilt_usage(codec,
+ tabla->mbhc_bias_regs.cfilt_sel, 0);
+ TABLA_ACQUIRE_LOCK(tabla->codec_resource_lock);
+ pr_debug("%s: Turning off MICBIAS2 r %d\n", __func__, r);
+ }
+}
+
+/* called under codec_resource_lock acquisition */
static void tabla_codec_report_plug(struct snd_soc_codec *codec, int insertion,
enum snd_jack_types jack_type)
{
@@ -5575,6 +5696,8 @@
tabla->buttons_pressed &=
~TABLA_JACK_BUTTON_MASK;
}
+ if (jack_type == SND_JACK_HEADSET)
+ tabla_codec_enable_mbhc_micbias(codec, false);
pr_debug("%s: Reporting removal %d(%x)\n", __func__,
jack_type, tabla->hph_status);
tabla_snd_soc_jack_report(tabla,
@@ -5612,6 +5735,7 @@
else if (jack_type == SND_JACK_HEADSET) {
tabla->mbhc_polling_active = true;
tabla->current_plug = PLUG_TYPE_HEADSET;
+ tabla_codec_enable_mbhc_micbias(codec, true);
} else if (jack_type == SND_JACK_LINEOUT)
tabla->current_plug = PLUG_TYPE_HIGH_HPH;
if (tabla->mbhc_cfg.headset_jack) {
@@ -6328,8 +6452,8 @@
btn = -1;
goto done;
}
-
- vddio = (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
+ vddio = !priv->mbhc_cfg.micbias_always_on &&
+ (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
priv->mbhc_micbias_switched);
mv_s = vddio ? tabla_scale_v_micb_vddio(priv, mv, false) : mv;
@@ -6766,7 +6890,9 @@
int scaled;
struct tabla_mbhc_plug_type_cfg *plug_type_ptr;
struct tabla_priv *tabla = snd_soc_codec_get_drvdata(codec);
- int num_det = MBHC_NUM_DCE_PLUG_DETECT + 1;
+ const bool vddio = !tabla->mbhc_cfg.micbias_always_on &&
+ (tabla->mbhc_data.micb_mv != VDDIO_MICBIAS_MV);
+ int num_det = (MBHC_NUM_DCE_PLUG_DETECT + vddio);
enum tabla_mbhc_plug_type plug_type[num_det];
s16 mb_v[num_det];
s32 mic_mv[num_det];
@@ -7461,7 +7587,8 @@
pr_debug("%s: enter, removal interrupt\n", __func__);
TABLA_ACQUIRE_LOCK(priv->codec_resource_lock);
- vddio = (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
+ vddio = !priv->mbhc_cfg.micbias_always_on &&
+ (priv->mbhc_data.micb_mv != VDDIO_MICBIAS_MV &&
priv->mbhc_micbias_switched);
if (vddio)
__tabla_codec_switch_micbias(priv->codec, 0, false, true);
@@ -7819,7 +7946,8 @@
tabla_get_mbhc_micbias_regs(codec, &tabla->mbhc_bias_regs);
/* Put CFILT in fast mode by default */
- snd_soc_update_bits(codec, tabla->mbhc_bias_regs.cfilt_ctl,
+ if (!tabla->mbhc_cfg.micbias_always_on)
+ snd_soc_update_bits(codec, tabla->mbhc_bias_regs.cfilt_ctl,
0x40, TABLA_CFILT_FAST_MODE);
INIT_DELAYED_WORK(&tabla->mbhc_firmware_dwork, mbhc_fw_read);
INIT_DELAYED_WORK(&tabla->mbhc_btn_dwork, btn_lpress_fn);
@@ -8425,7 +8553,6 @@
snd_soc_dapm_new_controls(dapm, tabla_2_higher_dapm_widgets,
ARRAY_SIZE(tabla_2_higher_dapm_widgets));
-
ptr = kmalloc((sizeof(tabla_rx_chs) +
sizeof(tabla_tx_chs)), GFP_KERNEL);
if (!ptr) {
diff --git a/sound/soc/codecs/wcd9310.h b/sound/soc/codecs/wcd9310.h
index 98c1835..5c991e6 100644
--- a/sound/soc/codecs/wcd9310.h
+++ b/sound/soc/codecs/wcd9310.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -44,6 +44,7 @@
TABLA_MICBIAS2,
TABLA_MICBIAS3,
TABLA_MICBIAS4,
+ TABLA_NUM_MICBIAS,
};
enum tabla_pid_current {
@@ -179,6 +180,7 @@
bool detect_extn_cable;
/* swap_gnd_mic returns true if extern GND/MIC swap switch toggled */
bool (*swap_gnd_mic) (struct snd_soc_codec *);
+ bool micbias_always_on;
};
extern int tabla_hs_detect(struct snd_soc_codec *codec,