From 98bea1dcf407c363d82ee3741fbfe1b21115bbcb Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Thu, 24 Dec 2020 14:47:04 +0530 Subject: [PATCH] ASoC: Add port map for yupik As yupik idp has wcd937x support, add port map for same. Change-Id: I9b907fc2e5aa4a9ad810f01f4be5cc5b2d1659b5 Signed-off-by: Vatsal Bucha --- asoc/lahaina.c | 189 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 166 insertions(+), 23 deletions(-) diff --git a/asoc/lahaina.c b/asoc/lahaina.c index fd95ebd0c953..5af42843e2e5 100644 --- a/asoc/lahaina.c +++ b/asoc/lahaina.c @@ -31,8 +31,10 @@ #include "asoc/msm-cdc-pinctrl.h" #include "asoc/wcd-mbhc-v2.h" #include "codecs/wcd938x/wcd938x-mbhc.h" +#include "codecs/wcd937x/wcd937x-mbhc.h" #include "codecs/wsa883x/wsa883x.h" #include "codecs/wcd938x/wcd938x.h" +#include "codecs/wcd937x/wcd937x.h" #include "codecs/bolero/bolero-cdc.h" #include #include "codecs/bolero/wsa-macro.h" @@ -828,6 +830,40 @@ static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_sample_rate, static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_sample_rate, cdc_dma_sample_rate_text); +/* WCD9370 */ +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_0_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_1_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_2_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_3_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_5_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_0_sample_rate, + cdc80_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_1_sample_rate, + cdc80_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_2_sample_rate, + cdc80_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_3_sample_rate, + cdc80_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc70_dma_rx_5_sample_rate, + cdc80_dma_sample_rate_text); + +/* WCD9375 */ +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_0_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_1_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_2_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_3_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_5_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_0_sample_rate, + cdc_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_1_sample_rate, + cdc_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_2_sample_rate, + cdc_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_3_sample_rate, + cdc_dma_sample_rate_text); +static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc75_dma_rx_5_sample_rate, + cdc_dma_sample_rate_text); + /* WCD9380 */ static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_0_format, cdc80_bit_format_text); static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_1_format, cdc80_bit_format_text); @@ -3769,6 +3805,72 @@ static const struct snd_kcontrol_new msm_int_snd_controls[] = { cdc_dma_tx_sample_rate_put), }; +static const struct snd_kcontrol_new msm_int_wcd9370_snd_controls[] = { + SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc70_dma_rx_0_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc70_dma_rx_1_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc70_dma_rx_2_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc70_dma_rx_3_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc70_dma_rx_5_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate", + rx_cdc70_dma_rx_0_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate", + rx_cdc70_dma_rx_1_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate", + rx_cdc70_dma_rx_2_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate", + rx_cdc70_dma_rx_3_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate", + rx_cdc70_dma_rx_5_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), +}; + +static const struct snd_kcontrol_new msm_int_wcd9375_snd_controls[] = { + SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc75_dma_rx_0_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc75_dma_rx_1_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc75_dma_rx_2_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc75_dma_rx_3_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc75_dma_rx_5_format, + cdc_dma_rx_format_get, cdc_dma_rx_format_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate", + rx_cdc75_dma_rx_0_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate", + rx_cdc75_dma_rx_1_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate", + rx_cdc75_dma_rx_2_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate", + rx_cdc75_dma_rx_3_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), + SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate", + rx_cdc75_dma_rx_5_sample_rate, + cdc_dma_rx_sample_rate_get, + cdc_dma_rx_sample_rate_put), +}; + static const struct snd_kcontrol_new msm_int_wcd9380_snd_controls[] = { SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc80_dma_rx_0_format, cdc_dma_rx_format_get, cdc_dma_rx_format_put), @@ -7407,6 +7509,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; + bool is_wcd937x = false; pdata = snd_soc_card_get_drvdata(card); if (!pdata) @@ -7425,15 +7528,23 @@ static int msm_snd_card_late_probe(struct snd_soc_card *card) component = snd_soc_rtdcom_lookup(rtd, WCD938X_DRV_NAME); if (!component) { - pr_err("%s component is NULL\n", __func__); - return -EINVAL; + component = snd_soc_rtdcom_lookup(rtd, WCD937X_DRV_NAME); + if (!component) { + pr_err("%s component is NULL\n", __func__); + return -EINVAL; + } else { + is_wcd937x = true; + } } mbhc_calibration = def_wcd_mbhc_cal(); if (!mbhc_calibration) return -ENOMEM; wcd_mbhc_cfg.calibration = mbhc_calibration; - ret = wcd938x_mbhc_hs_detect(component, &wcd_mbhc_cfg); + if (!is_wcd937x) + ret = wcd938x_mbhc_hs_detect(component, &wcd_mbhc_cfg); + else + ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg); if (ret) { dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n", __func__, ret); @@ -7690,6 +7801,7 @@ static int msm_int_wsa_init(struct snd_soc_pcm_runtime *rtd) static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_component *component = NULL; + struct snd_soc_component *bolero_component = NULL; struct snd_soc_dapm_context *dapm = NULL; int ret = 0; int codec_variant = -1; @@ -7706,6 +7818,8 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) pr_err("%s: could not find component for bolero_codec\n", __func__); return ret; + } else { + bolero_component = component; } dapm = snd_soc_component_get_dapm(component); @@ -7752,13 +7866,6 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) card = rtd->card->snd_card; - if (strnstr(rtd->card->name, "shima", strlen(rtd->card->name)) != NULL) - bolero_set_port_map(component, ARRAY_SIZE(sm_port_map_shima), - sm_port_map_shima); - else - bolero_set_port_map(component, ARRAY_SIZE(sm_port_map), - sm_port_map); - if (!pdata->codec_root) { entry = msm_snd_info_create_subdir(card->module, "codecs", card->proc_root); @@ -7778,8 +7885,11 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) } component = snd_soc_rtdcom_lookup(rtd, WCD938X_DRV_NAME); if (!component) { - pr_err("%s component is NULL\n", __func__); - return -EINVAL; + component = snd_soc_rtdcom_lookup(rtd, WCD937X_DRV_NAME); + if (!component) { + pr_err("%s component is NULL\n", __func__); + return -EINVAL; + } } dapm = snd_soc_component_get_dapm(component); card = component->card->snd_card; @@ -7794,18 +7904,51 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); snd_soc_dapm_sync(dapm); - wcd938x_info_create_codec_entry(pdata->codec_root, component); + if (!strncmp(component->driver->name, WCD937X_DRV_NAME, + strlen(WCD937X_DRV_NAME))) { + 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); + if (codec_variant == WCD9370_VARIANT) + ret = snd_soc_add_component_controls(component, + msm_int_wcd9370_snd_controls, + ARRAY_SIZE(msm_int_wcd9370_snd_controls)); + else if (codec_variant == WCD9375_VARIANT) + ret = snd_soc_add_component_controls(component, + msm_int_wcd9375_snd_controls, + ARRAY_SIZE(msm_int_wcd9375_snd_controls)); + bolero_set_port_map(bolero_component, + ARRAY_SIZE(sm_port_map_wcd937x), sm_port_map_wcd937x); + } else if (!strncmp(component->driver->name, WCD938X_DRV_NAME, + strlen(WCD938X_DRV_NAME))) { + wcd938x_info_create_codec_entry(pdata->codec_root, component); - codec_variant = wcd938x_get_codec_variant(component); - dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant); - if (codec_variant == WCD9380) - ret = snd_soc_add_component_controls(component, - msm_int_wcd9380_snd_controls, - ARRAY_SIZE(msm_int_wcd9380_snd_controls)); - else if (codec_variant == WCD9385) - ret = snd_soc_add_component_controls(component, - msm_int_wcd9385_snd_controls, - ARRAY_SIZE(msm_int_wcd9385_snd_controls)); + codec_variant = wcd938x_get_codec_variant(component); + dev_dbg(component->dev, "%s: variant %d\n", + __func__, codec_variant); + if (codec_variant == WCD9380) + ret = snd_soc_add_component_controls(component, + msm_int_wcd9380_snd_controls, + ARRAY_SIZE(msm_int_wcd9380_snd_controls)); + else if (codec_variant == WCD9385) + ret = snd_soc_add_component_controls(component, + msm_int_wcd9385_snd_controls, + ARRAY_SIZE(msm_int_wcd9385_snd_controls)); + + if ((strnstr(rtd->card->name, "shima", strlen(rtd->card->name)) + != NULL) || (strnstr(rtd->card->name, "yupik", + strlen(rtd->card->name)) != NULL)) + bolero_set_port_map(bolero_component, + ARRAY_SIZE(sm_port_map_shima), + sm_port_map_shima); + else + bolero_set_port_map(bolero_component, + ARRAY_SIZE(sm_port_map), sm_port_map); + } else { + bolero_set_port_map(bolero_component, ARRAY_SIZE(sm_port_map), + sm_port_map); + } if (ret < 0) { dev_err(component->dev, "%s: add codec specific snd controls failed: %d\n",