diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-08-19 05:29:34 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-19 05:29:34 -0700 |
| commit | 82e060812f86dc5407ee2d5a26a2408dc1945f18 (patch) | |
| tree | cd872065255d80263e4a554391a143108587aee4 | |
| parent | ac4a799f3106680f32cabe93c616b438aa130038 (diff) | |
| parent | fd30be8fdb4d8134da58e451636139b6f6860f87 (diff) | |
Merge "ASoC: wcd-mbhc: add kcontrol to get hph type for wcd934x"
| -rw-r--r-- | sound/soc/codecs/wcd-mbhc-v2.c | 21 | ||||
| -rw-r--r-- | sound/soc/codecs/wcd-mbhc-v2.h | 12 | ||||
| -rw-r--r-- | sound/soc/codecs/wcd9335.c | 35 | ||||
| -rw-r--r-- | sound/soc/codecs/wcd934x/wcd934x-mbhc.c | 49 | ||||
| -rw-r--r-- | sound/soc/msm/msm8996.c | 2 | ||||
| -rw-r--r-- | sound/soc/msm/msmcobalt.c | 76 |
6 files changed, 154 insertions, 41 deletions
diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index 71cc156cd8ad..60a7ad1b01c2 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -2053,24 +2053,6 @@ static irqreturn_t wcd_mbhc_hphr_ocp_irq(int irq, void *data) return IRQ_HANDLED; } -static void wcd_mbhc_moisture_config(struct wcd_mbhc *mbhc) -{ - if (mbhc->mbhc_cfg->moist_cfg.m_vref_ctl == V_OFF) - return; - - /* Donot enable moisture detection if jack type is NC */ - if (!mbhc->hphl_swh) { - pr_debug("%s: disable moisture detection for NC\n", __func__); - return; - } - - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MOISTURE_VREF, - mbhc->mbhc_cfg->moist_cfg.m_vref_ctl); - if (mbhc->mbhc_cb->hph_pull_up_control) - mbhc->mbhc_cb->hph_pull_up_control(mbhc->codec, - mbhc->mbhc_cfg->moist_cfg.m_iref_ctl); -} - static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) { int ret = 0; @@ -2085,7 +2067,8 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc) else WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, 3); - wcd_mbhc_moisture_config(mbhc); + if (mbhc->mbhc_cfg->moisture_en && mbhc->mbhc_cb->mbhc_moisture_config) + mbhc->mbhc_cb->mbhc_moisture_config(mbhc); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PLUG_TYPE, mbhc->hphl_swh); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_GND_PLUG_TYPE, mbhc->gnd_swh); diff --git a/sound/soc/codecs/wcd-mbhc-v2.h b/sound/soc/codecs/wcd-mbhc-v2.h index e3eb60729e94..ab42b3bb6e7d 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.h +++ b/sound/soc/codecs/wcd-mbhc-v2.h @@ -62,7 +62,6 @@ enum wcd_mbhc_register_function { WCD_MBHC_HPHL_PA_EN, WCD_MBHC_HPH_PA_EN, WCD_MBHC_SWCH_LEVEL_REMOVE, - WCD_MBHC_MOISTURE_VREF, WCD_MBHC_PULLDOWN_CTRL, WCD_MBHC_ANC_DET_EN, WCD_MBHC_FSM_STATUS, @@ -237,9 +236,11 @@ enum mbhc_hs_pullup_iref { I_3P0_UA, }; -struct wcd_mbhc_moisture_cfg { - enum mbhc_moisture_vref m_vref_ctl; - enum mbhc_hs_pullup_iref m_iref_ctl; +enum mbhc_moisture_rref { + R_OFF, + R_24_KOHM, + R_84_KOHM, + R_184_KOHM, }; struct wcd_mbhc_config { @@ -252,7 +253,7 @@ struct wcd_mbhc_config { bool gnd_det_en; int key_code[WCD_MBHC_KEYCODE_NUM]; uint32_t linein_th; - struct wcd_mbhc_moisture_cfg moist_cfg; + bool moisture_en; int mbhc_micbias; int anc_micbias; bool enable_anc_mic_detect; @@ -363,6 +364,7 @@ struct wcd_mbhc_cb { int (*mbhc_micb_ctrl_thr_mic)(struct snd_soc_codec *, int, bool); void (*mbhc_gnd_det_ctrl)(struct snd_soc_codec *, bool); void (*hph_pull_down_ctrl)(struct snd_soc_codec *, bool); + void (*mbhc_moisture_config)(struct wcd_mbhc *); }; struct wcd_mbhc { diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index e6338b081cba..158b9ae08642 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -116,6 +116,8 @@ /* z value compared in milliOhm */ #define TASHA_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) #define TASHA_MBHC_ZDET_CONST (86 * 16384) +#define TASHA_MBHC_MOISTURE_VREF V_45_MV +#define TASHA_MBHC_MOISTURE_IREF I_3P0_UA #define TASHA_VERSION_ENTRY_SIZE 17 @@ -671,13 +673,6 @@ static struct wcd_mbhc_register WCD9335_ANA_HPH, 0xC0, 6, 0), WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", WCD9335_ANA_MBHC_RESULT_3, 0x10, 4, 0), - /* - * Initialize moisture register as "0" and based on codec - * version, the register, mask fields get populated. - * Register "0" is not a valid register for MBHC. - */ - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_VREF", - 0, 0, 0, 0), WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", 0, 0, 0, 0), WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", @@ -2185,6 +2180,25 @@ static void tasha_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, } } +static void tasha_mbhc_moisture_config(struct wcd_mbhc *mbhc) +{ + struct snd_soc_codec *codec = mbhc->codec; + + if (TASHA_MBHC_MOISTURE_VREF == V_OFF) + return; + + /* Donot enable moisture detection if jack type is NC */ + if (!mbhc->hphl_swh) { + dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", + __func__); + return; + } + + snd_soc_update_bits(codec, WCD9335_MBHC_CTL_2, + 0x0C, TASHA_MBHC_MOISTURE_VREF << 2); + tasha_mbhc_hph_l_pull_up_control(codec, TASHA_MBHC_MOISTURE_IREF); +} + static const struct wcd_mbhc_cb mbhc_cb = { .request_irq = tasha_mbhc_request_irq, .irq_control = tasha_mbhc_irq_control, @@ -2206,6 +2220,7 @@ static const struct wcd_mbhc_cb mbhc_cb = { .compute_impedance = tasha_wcd_mbhc_calc_impedance, .mbhc_gnd_det_ctrl = tasha_mbhc_gnd_det_ctrl, .hph_pull_down_ctrl = tasha_mbhc_hph_pull_down_ctrl, + .mbhc_moisture_config = tasha_mbhc_moisture_config, }; static int tasha_get_anc_slot(struct snd_kcontrol *kcontrol, @@ -13234,12 +13249,6 @@ static int tasha_codec_probe(struct snd_soc_codec *codec) /* Initialize MBHC module */ if (TASHA_IS_2_0(tasha->wcd9xxx->version)) { - wcd_mbhc_registers[WCD_MBHC_MOISTURE_VREF].reg = - WCD9335_MBHC_CTL_2; - wcd_mbhc_registers[WCD_MBHC_MOISTURE_VREF].mask = - 0x0C; - wcd_mbhc_registers[WCD_MBHC_MOISTURE_VREF].offset = - 2; wcd_mbhc_registers[WCD_MBHC_FSM_STATUS].reg = WCD9335_MBHC_FSM_STATUS; wcd_mbhc_registers[WCD_MBHC_FSM_STATUS].mask = 0x01; diff --git a/sound/soc/codecs/wcd934x/wcd934x-mbhc.c b/sound/soc/codecs/wcd934x/wcd934x-mbhc.c index 4c5ddec807b2..20f3043656e5 100644 --- a/sound/soc/codecs/wcd934x/wcd934x-mbhc.c +++ b/sound/soc/codecs/wcd934x/wcd934x-mbhc.c @@ -48,6 +48,7 @@ /* Z value compared in milliOhm */ #define TAVIL_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) #define TAVIL_MBHC_ZDET_CONST (86 * 16384) +#define TAVIL_MBHC_MOISTURE_RREF R_24_KOHM static struct wcd_mbhc_register wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = { @@ -109,8 +110,6 @@ static struct wcd_mbhc_register WCD934X_ANA_HPH, 0xC0, 6, 0), WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE", WCD934X_ANA_MBHC_RESULT_3, 0x10, 4, 0), - WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_VREF", - WCD934X_MBHC_NEW_CTL_2, 0x0C, 2, 0), WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL", 0, 0, 0, 0), WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", @@ -761,6 +760,23 @@ static void tavil_mbhc_hph_pull_down_ctrl(struct snd_soc_codec *codec, 0x10, 0x00); } } +static void tavil_mbhc_moisture_config(struct wcd_mbhc *mbhc) +{ + struct snd_soc_codec *codec = mbhc->codec; + + if (TAVIL_MBHC_MOISTURE_RREF == R_OFF) + return; + + /* Donot enable moisture detection if jack type is NC */ + if (!mbhc->hphl_swh) { + dev_dbg(codec->dev, "%s: disable moisture detection for NC\n", + __func__); + return; + } + + snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_2, + 0x0C, TAVIL_MBHC_MOISTURE_RREF << 2); +} static const struct wcd_mbhc_cb mbhc_cb = { .request_irq = tavil_mbhc_request_irq, @@ -783,6 +799,7 @@ static const struct wcd_mbhc_cb mbhc_cb = { .compute_impedance = tavil_wcd_mbhc_calc_impedance, .mbhc_gnd_det_ctrl = tavil_mbhc_gnd_det_ctrl, .hph_pull_down_ctrl = tavil_mbhc_hph_pull_down_ctrl, + .mbhc_moisture_config = tavil_mbhc_moisture_config, }; static struct regulator *tavil_codec_find_ondemand_regulator( @@ -804,6 +821,31 @@ static struct regulator *tavil_codec_find_ondemand_regulator( return NULL; } +static int tavil_get_hph_type(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct wcd934x_mbhc *wcd934x_mbhc = tavil_soc_get_mbhc(codec); + struct wcd_mbhc *mbhc; + + if (!wcd934x_mbhc) { + dev_err(codec->dev, "%s: mbhc not initialized!\n", __func__); + return -EINVAL; + } + + mbhc = &wcd934x_mbhc->wcd_mbhc; + + ucontrol->value.integer.value[0] = (u32) mbhc->hph_type; + dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type); + + return 0; +} + +static const struct snd_kcontrol_new hph_type_detect_controls[] = { + SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0, + tavil_get_hph_type, NULL), +}; + /* * tavil_mbhc_hs_detect: starts mbhc insertion/removal functionality * @codec: handle to snd_soc_codec * @@ -883,6 +925,9 @@ int tavil_mbhc_init(struct wcd934x_mbhc **mbhc, struct snd_soc_codec *codec, 0; } + snd_soc_add_codec_controls(codec, hph_type_detect_controls, + ARRAY_SIZE(hph_type_detect_controls)); + snd_soc_update_bits(codec, WCD934X_MBHC_NEW_CTL_1, 0x04, 0x04); snd_soc_update_bits(codec, WCD934X_MBHC_CTL_BCS, 0x01, 0x01); diff --git a/sound/soc/msm/msm8996.c b/sound/soc/msm/msm8996.c index 225726cad812..84d4ede33e3f 100644 --- a/sound/soc/msm/msm8996.c +++ b/sound/soc/msm/msm8996.c @@ -192,7 +192,7 @@ static struct wcd_mbhc_config wcd_mbhc_cfg = { .key_code[6] = 0, .key_code[7] = 0, .linein_th = 5000, - .moist_cfg = { V_45_MV, I_3P0_UA }, + .moisture_en = true, .mbhc_micbias = MIC_BIAS_2, .anc_micbias = MIC_BIAS_2, .enable_anc_mic_detect = false, diff --git a/sound/soc/msm/msmcobalt.c b/sound/soc/msm/msmcobalt.c index 730c492136d0..5be5137f447f 100644 --- a/sound/soc/msm/msmcobalt.c +++ b/sound/soc/msm/msmcobalt.c @@ -36,6 +36,7 @@ #include "qdsp6v2/msm-pcm-routing-v2.h" #include "../codecs/wcd9335.h" #include "../codecs/wcd934x/wcd934x.h" +#include "../codecs/wcd934x/wcd934x-mbhc.h" #include "../codecs/wsa881x.h" #define DRV_NAME "msmcobalt-asoc-snd" @@ -222,6 +223,7 @@ static struct msm_asoc_wcd93xx_codec msm_codec_fn; static void *adsp_state_notifier; static void *def_tasha_mbhc_cal(void); +static void *def_tavil_mbhc_cal(void); static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec, int enable, bool dapm); static int msm_wsa881x_init(struct snd_soc_component *component); @@ -246,7 +248,7 @@ static struct wcd_mbhc_config wcd_mbhc_cfg = { .key_code[6] = 0, .key_code[7] = 0, .linein_th = 5000, - .moist_cfg = { V_45_MV, I_3P0_UA }, + .moisture_en = true, }; static struct snd_soc_dapm_route wcd_audio_paths[] = { @@ -1815,6 +1817,40 @@ static void *def_tasha_mbhc_cal(void) return tasha_wcd_cal; } +static void *def_tavil_mbhc_cal(void) +{ + void *tavil_wcd_cal; + struct wcd_mbhc_btn_detect_cfg *btn_cfg; + u16 *btn_high; + + tavil_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS, + WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); + if (!tavil_wcd_cal) + return NULL; + +#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tavil_wcd_cal)->X) = (Y)) + S(v_hs_max, 1600); +#undef S +#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal)->X) = (Y)) + S(num_btn, WCD_MBHC_DEF_BUTTONS); +#undef S + + btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal); + btn_high = ((void *)&btn_cfg->_v_btn_low) + + (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); + + btn_high[0] = 75; + btn_high[1] = 150; + btn_high[2] = 237; + btn_high[3] = 500; + btn_high[4] = 500; + btn_high[5] = 500; + btn_high[6] = 500; + btn_high[7] = 500; + + return tavil_wcd_cal; +} + static int msm_snd_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { @@ -3270,6 +3306,43 @@ err_pcm_runtime: return ret; } +static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card) +{ + const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; + struct snd_soc_pcm_runtime *rtd; + int ret = 0; + void *mbhc_calibration; + + rtd = snd_soc_get_pcm_runtime(card, be_dl_name); + if (!rtd) { + dev_err(card->dev, + "%s: snd_soc_get_pcm_runtime for %s failed!\n", + __func__, be_dl_name); + ret = -EINVAL; + goto err_pcm_runtime; + } + + mbhc_calibration = def_tavil_mbhc_cal(); + if (!mbhc_calibration) { + ret = -ENOMEM; + goto err_mbhc_cal; + } + wcd_mbhc_cfg.calibration = mbhc_calibration; + ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg); + if (ret) { + dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n", + __func__, ret); + goto err_hs_detect; + } + return 0; + +err_hs_detect: + kfree(mbhc_calibration); +err_mbhc_cal: +err_pcm_runtime: + return ret; +} + struct snd_soc_card snd_soc_card_tasha_msm = { .name = "msmcobalt-tasha-snd-card", .late_probe = msm_snd_card_late_probe, @@ -3277,6 +3350,7 @@ struct snd_soc_card snd_soc_card_tasha_msm = { struct snd_soc_card snd_soc_card_tavil_msm = { .name = "msmcobalt-tavil-snd-card", + .late_probe = msm_snd_card_tavil_late_probe, }; static int msm_populate_dai_link_component_of_node( |
