ASoC: wcd937x-mbhc: Add support for headset moisture detection
Add support for headset moisture detection on wcd937x codec. Change-Id: Ib9021869a5d3a0d4e5b8a912b235b68fad90f94f Signed-off-by: Sudheer Papothi <spapothi@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
a45a56e824
commit
eb8d8cb100
@@ -721,6 +721,63 @@ static void wcd937x_mbhc_moisture_config(struct wcd_mbhc *mbhc)
|
||||
0x0C, mbhc->moist_rref << 2);
|
||||
}
|
||||
|
||||
static void wcd937x_mbhc_moisture_detect_en(struct wcd_mbhc *mbhc, bool enable)
|
||||
{
|
||||
struct snd_soc_codec *codec = mbhc->codec;
|
||||
|
||||
if (enable)
|
||||
snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2,
|
||||
0x0C, mbhc->moist_rref << 2);
|
||||
else
|
||||
snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2,
|
||||
0x0C, R_OFF << 2);
|
||||
}
|
||||
|
||||
static bool wcd937x_mbhc_get_moisture_status(struct wcd_mbhc *mbhc)
|
||||
{
|
||||
struct snd_soc_codec *codec = mbhc->codec;
|
||||
bool ret = false;
|
||||
|
||||
if ((mbhc->moist_rref == R_OFF) ||
|
||||
(mbhc->mbhc_cfg->enable_usbc_analog)) {
|
||||
snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2,
|
||||
0x0C, R_OFF << 2);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Do not enable moisture detection if jack type is NC */
|
||||
if (!mbhc->hphl_swh) {
|
||||
dev_dbg(codec->dev, "%s: disable moisture detection for NC\n",
|
||||
__func__);
|
||||
snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2,
|
||||
0x0C, R_OFF << 2);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* If moisture_en is already enabled, then skip to plug type
|
||||
* detection.
|
||||
*/
|
||||
if ((snd_soc_update_bits(codec, WCD937X_MBHC_NEW_CTL_2) & 0x0C))
|
||||
goto done;
|
||||
|
||||
wcd937x_mbhc_moisture_detect_en(mbhc, true);
|
||||
/* Read moisture comparator status */
|
||||
ret = ((snd_soc_read(codec, WCD937X_MBHC_NEW_FSM_STATUS)
|
||||
& 0x20) ? 0 : 1);
|
||||
|
||||
done:
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static void wcd937x_mbhc_moisture_polling_ctrl(struct wcd_mbhc *mbhc,
|
||||
bool enable)
|
||||
{
|
||||
snd_soc_update_bits(codec,
|
||||
WCD937X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL,
|
||||
0x04, (enable << 2));
|
||||
}
|
||||
|
||||
static const struct wcd_mbhc_cb mbhc_cb = {
|
||||
.request_irq = wcd937x_mbhc_request_irq,
|
||||
.irq_control = wcd937x_mbhc_irq_control,
|
||||
@@ -742,6 +799,9 @@ static const struct wcd_mbhc_cb mbhc_cb = {
|
||||
.mbhc_gnd_det_ctrl = wcd937x_mbhc_gnd_det_ctrl,
|
||||
.hph_pull_down_ctrl = wcd937x_mbhc_hph_pull_down_ctrl,
|
||||
.mbhc_moisture_config = wcd937x_mbhc_moisture_config,
|
||||
.mbhc_get_moisture_status = wcd937x_mbhc_get_moisture_status,
|
||||
.mbhc_moisture_polling_ctrl = wcd937x_mbhc_moisture_polling_ctrl,
|
||||
.mbhc_moisture_detect_en = wcd937x_mbhc_moisture_detect_en,
|
||||
};
|
||||
|
||||
static int wcd937x_get_hph_type(struct snd_kcontrol *kcontrol,
|
||||
|
Reference in New Issue
Block a user