summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWalter Yang <yandongy@codeaurora.org>2016-07-07 09:43:23 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-18 19:59:04 -0700
commit031202970b44f033b4f2fbe437a487d2a32a52cf (patch)
treeb91d98b0edd9ce8e4062dc2f815aed85da233eb1
parent5962d6e409ee486814f4b74792bbd267ae3b0ab7 (diff)
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>
-rw-r--r--sound/soc/msm/msmcobalt.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/sound/soc/msm/msmcobalt.c b/sound/soc/msm/msmcobalt.c
index 730c492136d0..1ff695ed982f 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);
@@ -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(