From a3a1e552faea2ba1d9423f800174d13323d4ebee Mon Sep 17 00:00:00 2001 From: Faiz Nabi Kuchay Date: Fri, 8 Sep 2023 23:54:00 +0530 Subject: [PATCH] asoc: Add machine driver support for wcd937x Add machine driver support for WCD937x. Change-Id: I863b95255caf99565dfc7c74b0f54891f58dc0df Signed-off-by: Faiz Nabi Kuchay --- asoc/pineapple.c | 78 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/asoc/pineapple.c b/asoc/pineapple.c index 89fd95c742..895a120fab 100644 --- a/asoc/pineapple.c +++ b/asoc/pineapple.c @@ -33,9 +33,11 @@ #include "device_event.h" #include "asoc/msm-cdc-pinctrl.h" #include "asoc/wcd-mbhc-v2.h" +#include "codecs/wcd937x/wcd937x-mbhc.h" #include "codecs/wcd939x/wcd939x-mbhc.h" #include "codecs/wsa884x/wsa884x.h" #include "codecs/wsa883x/wsa883x.h" +#include "codecs/wcd937x/wcd937x.h" #include "codecs/wcd939x/wcd939x.h" #include "codecs/lpass-cdc/lpass-cdc.h" #include @@ -64,6 +66,11 @@ #define STEREO_SPEAKER 2 #define QUAD_SPEAKER 4 +enum { + WCD937X_DEV_INDEX, + WCD939X_DEV_INDEX, +}; + struct msm_asoc_mach_data { struct snd_info_entry *codec_root; struct msm_common_pdata *common_pdata; @@ -83,6 +90,7 @@ struct msm_asoc_mach_data { int backend_used; struct prm_earpa_hw_intf_config upd_config; bool dedicated_wsa2; /* used to define how wsa2 slave devices are used */ + int wcd_used; }; static bool is_initial_boot; @@ -195,6 +203,7 @@ static void msm_set_upd_config(struct snd_soc_pcm_runtime *rtd) u8 dev_num = 0; struct snd_soc_component *component = NULL; struct msm_asoc_mach_data *pdata = NULL; + char wcd_name[20]; if (!rtd) { pr_err_ratelimited("%s: rtd is NULL\n", __func__); @@ -227,7 +236,12 @@ static void msm_set_upd_config(struct snd_soc_pcm_runtime *rtd) return; } } else { - component = snd_soc_rtdcom_lookup(rtd, WCD939X_DRV_NAME); + if (pdata->wcd_used == WCD937X_DEV_INDEX) + strscpy(wcd_name, WCD937X_DRV_NAME, sizeof(WCD937X_DRV_NAME)); + else + strscpy(wcd_name, WCD939X_DRV_NAME, sizeof(WCD939X_DRV_NAME)); + + component = snd_soc_rtdcom_lookup(rtd, wcd_name); if (!component) { pr_err("%s component is NULL\n", __func__); return; @@ -240,7 +254,11 @@ static void msm_set_upd_config(struct snd_soc_pcm_runtime *rtd) else pdata->get_dev_num = wsa884x_codec_get_dev_num; } else { - pdata->get_dev_num = wcd939x_codec_get_dev_num; + if (pdata->wcd_used == WCD937X_DEV_INDEX) { + pdata->get_dev_num = wcd937x_codec_get_dev_num; + } else if (pdata->wcd_used == WCD939X_DEV_INDEX) { + pdata->get_dev_num = wcd939x_codec_get_dev_num; + } } if (!pdata->get_dev_num) { @@ -1399,6 +1417,7 @@ static int msm_snd_card_late_probe(struct snd_soc_card *card) struct msm_asoc_mach_data *pdata; int ret = 0; void *mbhc_calibration; + char wcd_name[20]; pdata = snd_soc_card_get_drvdata(card); if (!pdata) @@ -1415,7 +1434,12 @@ static int msm_snd_card_late_probe(struct snd_soc_card *card) return -EINVAL; } - component = snd_soc_rtdcom_lookup(rtd, WCD939X_DRV_NAME); + if (pdata->wcd_used == WCD937X_DEV_INDEX) + strscpy(wcd_name, WCD937X_DRV_NAME, sizeof(WCD937X_DRV_NAME)); + else + strscpy(wcd_name, WCD939X_DRV_NAME, sizeof(WCD939X_DRV_NAME)); + + component = snd_soc_rtdcom_lookup(rtd, wcd_name); if (!component) { pr_err("%s component is NULL\n", __func__); return -EINVAL; @@ -1432,6 +1456,16 @@ static int msm_snd_card_late_probe(struct snd_soc_card *card) wcd_mbhc_cfg.usbss_hsj_connect_enable = true; #endif + switch (pdata->wcd_used) { + case WCD937X_DEV_INDEX: + ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg); + break; + case WCD939X_DEV_INDEX: + ret = wcd939x_mbhc_hs_detect(component, &wcd_mbhc_cfg); + break; + default: + return -EINVAL; + } ret = wcd939x_mbhc_hs_detect(component, &wcd_mbhc_cfg); if (ret) { dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n", @@ -1934,14 +1968,23 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) component = snd_soc_rtdcom_lookup(rtd, WCD939X_DRV_NAME); if (!component) { - pr_err("%s could not find component for %s\n", - __func__, WCD939X_DRV_NAME); - return -EINVAL; + component = snd_soc_rtdcom_lookup(rtd, WCD937X_DRV_NAME); + if (!component) { + pr_err("%s component is NULL\n", __func__); + ret = -EINVAL; + goto exit; + } + pdata->wcd_used = WCD937X_DEV_INDEX; + } else { + pdata->wcd_used = WCD939X_DEV_INDEX; } + dapm = snd_soc_component_get_dapm(component); card = component->card->snd_card; snd_soc_dapm_ignore_suspend(dapm, "EAR"); + if (pdata->wcd_used != WCD939X_DEV_INDEX) + snd_soc_dapm_ignore_suspend(dapm, "AUX"); snd_soc_dapm_ignore_suspend(dapm, "HPHL"); snd_soc_dapm_ignore_suspend(dapm, "HPHR"); snd_soc_dapm_ignore_suspend(dapm, "AMIC1"); @@ -1961,14 +2004,19 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) } pdata->codec_root = entry; } - wcd939x_info_create_codec_entry(pdata->codec_root, component); - - codec_variant = wcd939x_get_codec_variant(component); - dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant); - if (codec_variant == WCD9395) - ret = lpass_cdc_rx_set_fir_capability(lpass_cdc_component, true); - else - ret = lpass_cdc_rx_set_fir_capability(lpass_cdc_component, false); + if (pdata->wcd_used == WCD937X_DEV_INDEX) { + wcd937x_info_create_codec_entry(pdata->codec_root, component); + codec_variant = wcd937x_get_codec_variant(component); + dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant); + } else { + wcd939x_info_create_codec_entry(pdata->codec_root, component); + codec_variant = wcd939x_get_codec_variant(component); + dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant); + if (codec_variant == WCD9395) + ret = lpass_cdc_rx_set_fir_capability(lpass_cdc_component, true); + else + ret = lpass_cdc_rx_set_fir_capability(lpass_cdc_component, false); + } if (ret < 0) { dev_err_ratelimited(component->dev, "%s: set fir capability failed: %d\n", @@ -1978,7 +2026,7 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) done: codec_reg_done = true; msm_common_dai_link_init(rtd); - +exit: return ret; }