ASoC: msm: add mbhc support for wcd934x
Add wcd934x mbhc support in machine driver, so that headset accessories can be detected properly. Change-Id: I0a1ec6570848b8164cf46f8365b18d4c488f78f6 Signed-off-by: Walter Yang <yandongy@codeaurora.org>
This commit is contained in:
parent
5962d6e409
commit
031202970b
1 changed files with 74 additions and 0 deletions
|
@ -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);
|
||||
|
@ -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(
|
||||
|
|
Loading…
Add table
Reference in a new issue