From ca6e1b40e30309620a3da6586207ea691d63d268 Mon Sep 17 00:00:00 2001 From: Hongtao Peng Date: Thu, 24 Feb 2022 10:30:40 +0800 Subject: [PATCH 01/22] dsp: support ADM output map for less then 2 channels Remove the conditional restriction greater than 2 in adm_arrange_mch_map_v8 Change-Id: I3bab28ddb443cd589d8de3751bd19b2a199978ab Signed-off-by: Hongtao Peng --- dsp/q6adm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) mode change 100755 => 100644 dsp/q6adm.c diff --git a/dsp/q6adm.c b/dsp/q6adm.c old mode 100755 new mode 100644 index 53a70d396ab2..9ad4cd90cd20 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include #include @@ -2720,9 +2721,8 @@ static int adm_arrange_mch_map_v8( goto non_mch_path; }; - if ((ep_payload->dev_num_channel > 2) && - (port_channel_map[port_idx].set_channel_map || - multi_ch_maps[idx].set_channel_map)) { + if (port_channel_map[port_idx].set_channel_map || + multi_ch_maps[idx].set_channel_map) { if (port_channel_map[port_idx].set_channel_map) memcpy(ep_payload->dev_channel_mapping, port_channel_map[port_idx].channel_mapping, From 7efca5cc14ed8d3886edc617af19641b251789e6 Mon Sep 17 00:00:00 2001 From: Hongtao Peng Date: Thu, 24 Feb 2022 00:05:54 +0800 Subject: [PATCH 02/22] ASoC: msm: support multi group matrix mixer configure for SSMD mode SSMD mode need to map one ASM session to multiple devices Need to configure all Matrix Mixer map for each device. Change-Id: I149a2f91561a99539cfbd16f1dbfe4c973976575 Signed-off-by: Hongtao Peng --- asoc/msm-pcm-routing-v2.c | 148 +++++++++++++++++++++++++------------- asoc/msm-pcm-routing-v2.h | 8 +++ 2 files changed, 106 insertions(+), 50 deletions(-) mode change 100644 => 100755 asoc/msm-pcm-routing-v2.c diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c old mode 100644 new mode 100755 index 5b7fc20a08e4..5c1c6b7bad44 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -105,8 +105,7 @@ static struct msm_ec_ref_port_cfg ec_ref_port_cfg; static struct msm_pcm_channel_mixer channel_mixer[MSM_FRONTEND_DAI_MM_SIZE]; /* all the FES which can support channel mixer for bidirection */ -static struct msm_pcm_channel_mixer - channel_mixer_v2[MSM_FRONTEND_DAI_MM_SIZE][2]; +static struct msm_pcm_channel_mixer_v2 channel_mixer_v2[MT_MX_MAX_PORTS]; /* input BE for each FE */ static int channel_input[MSM_FRONTEND_DAI_MM_SIZE][ADM_MAX_CHANNELS]; @@ -1308,6 +1307,38 @@ static int get_copp_perf_mode(int fe_id, int sess_type, int port) return rc; } +static int get_available_chmixer_index(int fe_id, int sess_type, int be_id) +{ + int index = 0; + bool need_research = true; + + /* + * If there is a item that have the same fe_id sess_type and be_id + * with input, use the index of this item and update it. + */ + for (index = 0; index < MT_MX_MAX_PORTS; index++) { + if ((channel_mixer_v2[index].fedai_id == fe_id) && + (channel_mixer_v2[index].session_type == sess_type) && + (channel_mixer_v2[index].be_id == be_id)) { + need_research = false; + break; + } + } + + /* + * If the item with fe_id sess_type and be_id is not exist, + * find an new unused item + */ + if (need_research) { + for (index = 0; index < MT_MX_MAX_PORTS; index++) { + if (!channel_mixer_v2[index].is_used) + break; + } + } + + return index; +} + /* * msm_pcm_routing_send_chmix_cfg: * send the channel mixer command to mix the input channels @@ -1385,31 +1416,46 @@ int msm_pcm_routing_set_channel_mixer_cfg( int fe_id, int type, struct msm_pcm_channel_mixer *params) { - int i, j = 0; + int i, j, index = 0; + int be_id = params->port_idx - 1; - channel_mixer_v2[fe_id][type].enable = params->enable; - channel_mixer_v2[fe_id][type].rule = params->rule; - channel_mixer_v2[fe_id][type].input_channel = + index = get_available_chmixer_index(fe_id, type, be_id); + if (index >= MT_MX_MAX_PORTS) { + pr_err("%s: Set channel mixer configure Fail!\n", __func__); + return -EINVAL; + } + + memset(&channel_mixer_v2[index], 0, + sizeof(struct msm_pcm_channel_mixer_v2)); + channel_mixer_v2[index].is_used = true; + channel_mixer_v2[index].fedai_id = fe_id; + channel_mixer_v2[index].session_type = type; + channel_mixer_v2[index].be_id = be_id; + channel_mixer_v2[index].mixer_cfg.port_idx = params->port_idx; + channel_mixer_v2[index].mixer_cfg.enable = params->enable; + channel_mixer_v2[index].mixer_cfg.rule = params->rule; + channel_mixer_v2[index].mixer_cfg.input_channel = params->input_channel; - channel_mixer_v2[fe_id][type].output_channel = + channel_mixer_v2[index].mixer_cfg.output_channel = params->output_channel; - channel_mixer_v2[fe_id][type].port_idx = params->port_idx; + channel_mixer_v2[index].mixer_cfg.input_channels[0] = + params->input_channel; for (i = 0; i < ADM_MAX_CHANNELS; i++) - channel_mixer_v2[fe_id][type].in_ch_map[i] = + channel_mixer_v2[index].mixer_cfg.in_ch_map[i] = params->in_ch_map[i]; for (i = 0; i < ADM_MAX_CHANNELS; i++) - channel_mixer_v2[fe_id][type].out_ch_map[i] = + channel_mixer_v2[index].mixer_cfg.out_ch_map[i] = params->out_ch_map[i]; for (i = 0; i < ADM_MAX_CHANNELS; i++) for (j = 0; j < ADM_MAX_CHANNELS; j++) - channel_mixer_v2[fe_id][type].channel_weight[i][j] = + channel_mixer_v2[index].mixer_cfg.channel_weight[i][j] = params->channel_weight[i][j]; - channel_mixer_v2[fe_id][type].override_in_ch_map = + channel_mixer_v2[index].mixer_cfg.override_in_ch_map = params->override_in_ch_map; - channel_mixer_v2[fe_id][type].override_out_ch_map = + channel_mixer_v2[index].mixer_cfg.override_out_ch_map = params->override_out_ch_map; return 0; @@ -2134,9 +2180,10 @@ static u32 msm_pcm_routing_get_voc_sessionid(u16 val) static int msm_pcm_routing_channel_mixer_v2(int fe_id, bool perf_mode, int dspst_id, int stream_type) { + struct msm_pcm_channel_mixer *mixer_config; int copp_idx = 0; int sess_type = 0; - int j = 0, be_id = 0; + int i = 0, j = 0, be_id = 0; int ret = 0; if (fe_id >= MSM_FRONTEND_DAI_MM_SIZE) { @@ -2149,44 +2196,45 @@ static int msm_pcm_routing_channel_mixer_v2(int fe_id, bool perf_mode, else sess_type = SESSION_TYPE_TX; - if (!(channel_mixer_v2[fe_id][sess_type].enable)) { - pr_debug("%s: channel mixer not enabled for FE %d direction %d\n", - __func__, fe_id, sess_type); - return 0; - } - - be_id = channel_mixer_v2[fe_id][sess_type].port_idx - 1; - if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { - pr_err("%s: Received out of bounds be_id %d\n", - __func__, be_id); - return -EINVAL; - } - channel_mixer_v2[fe_id][sess_type].input_channels[0] = - channel_mixer_v2[fe_id][sess_type].input_channel; - - pr_debug("%s sess type %d,fe_id %d,override in:%d out:%d,be active %d\n", - __func__, sess_type, fe_id, - channel_mixer_v2[fe_id][sess_type].override_in_ch_map, - channel_mixer_v2[fe_id][sess_type].override_out_ch_map, - msm_bedais[be_id].active); - - if ((msm_bedais[be_id].active) && - test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) { - unsigned long copp = - session_copp_map[fe_id][sess_type][be_id]; - for (j = 0; j < MAX_COPPS_PER_PORT; j++) { - if (test_bit(j, &copp)) { - copp_idx = j; - break; + for (i = 0; i < MT_MX_MAX_PORTS; i++) { + if ((channel_mixer_v2[i].fedai_id == fe_id) && + (channel_mixer_v2[i].session_type == sess_type)) { + if ((!channel_mixer_v2[i].mixer_cfg.enable) || + !(channel_mixer_v2[i].is_used)) { + pr_debug("%s: channel mixer not enabled for FE %d direction %d\n", + __func__, fe_id, sess_type); + continue; + } + be_id = channel_mixer_v2[i].be_id; + if (be_id < 0 || be_id >= MSM_BACKEND_DAI_MAX) { + pr_err("%s: Received out of bounds be_id %d\n", + __func__, be_id); + return -EINVAL; + } + mixer_config = &channel_mixer_v2[i].mixer_cfg; + pr_debug("%s sess type %d,fe_id %d,override in:%d out:%d,be active %d\n", + __func__, sess_type, fe_id, + mixer_config->override_in_ch_map, + mixer_config->override_out_ch_map, + msm_bedais[be_id].active); + if ((msm_bedais[be_id].active) && + test_bit(fe_id, &msm_bedais[be_id].fe_sessions[0])) { + unsigned long copp = + session_copp_map[fe_id][sess_type][be_id]; + for (j = 0; j < MAX_COPPS_PER_PORT; j++) { + if (test_bit(j, &copp)) { + copp_idx = j; + break; + } + } + ret = adm_programable_channel_mixer( + msm_bedais[be_id].port_id, + copp_idx, dspst_id, sess_type, + mixer_config, 0); + channel_mixer_v2[i].is_used = false; + } } - } - - ret = adm_programable_channel_mixer( - msm_bedais[be_id].port_id, - copp_idx, dspst_id, sess_type, - &channel_mixer_v2[fe_id][sess_type], 0); } - return ret; } diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h index 4a8e4b6eda58..583189b93371 100644 --- a/asoc/msm-pcm-routing-v2.h +++ b/asoc/msm-pcm-routing-v2.h @@ -688,6 +688,7 @@ enum { #define STREAM_TYPE_ASM 0 #define STREAM_TYPE_LSM 1 +#define MT_MX_MAX_PORTS 64 #define PP_PERF_MODE_FLAG_MASK 0x10000 #define PP_PERF_MODE_VALUE_MASK 0xF @@ -749,6 +750,13 @@ struct msm_pcm_stream_app_type_cfg { int copp_perf_mode; }; +struct msm_pcm_channel_mixer_v2 { + struct msm_pcm_channel_mixer mixer_cfg; + int fedai_id; + int session_type; + int be_id; + bool is_used; +}; /* dai_id: front-end ID, * dspst_id: DSP audio stream ID * stream_type: playback or capture From c0ccfd3bed9e8049638a9579c4743309f05d008e Mon Sep 17 00:00:00 2001 From: Shuai Zhang Date: Wed, 9 Mar 2022 11:36:22 +0530 Subject: [PATCH 03/22] ASOC: update sm6150 machine driver Update machine driver for wcd937x. Add msm_wcd937x_wsa881x_init for wcd937x. Add msm_snd_card_late_probe for wcd937x. Change-Id: Ic4c32e2f4c894c0bd250d1ae1c44ac1d8a28f6d1 Signed-off-by: Shuai Zhang --- asoc/sm6150.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 8 deletions(-) diff --git a/asoc/sm6150.c b/asoc/sm6150.c index 5eb1b5d94397..40e36b9e9c18 100644 --- a/asoc/sm6150.c +++ b/asoc/sm6150.c @@ -31,6 +31,7 @@ #include #include "codecs/wcd934x/wcd934x.h" #include "codecs/wcd9335.h" +#include "asoc/wcd-mbhc-v2.h" #include "codecs/wcd934x/wcd934x-mbhc.h" #include "codecs/wcd937x/wcd937x-mbhc.h" #include "codecs/wsa881x.h" @@ -40,6 +41,7 @@ #include "codecs/wcd937x/wcd937x.h" #include "msm_talos_dailink.h" #include "talos-port-config.h" +#include #define DRV_NAME "sm6150-asoc-snd" @@ -629,7 +631,9 @@ static int dmic_2_3_gpio_cnt; static void *def_wcd_mbhc_cal(void); static int msm_snd_enable_codec_ext_clk(struct snd_soc_component *component, int enable, bool dapm); +static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime*); static int msm_wsa881x_init(struct snd_soc_pcm_runtime *rtd); +static int msm_wcd937x_wsa881x_init(struct snd_soc_pcm_runtime *rtd); /* * Need to report LINEIN @@ -5137,15 +5141,23 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_sync(dapm); + snd_soc_dapm_ignore_suspend(dapm, "EAR"); + 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"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC2"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC3"); + snd_soc_dapm_ignore_suspend(dapm, "AMIC4"); + snd_soc_dapm_sync(dapm); + /* * Send speaker configuration only for WSA8810. * Default configuration is for WSA8815. */ wsa_macro_set_spkr_mode(component, - WSA_MACRO_SPKR_MODE_1); - wsa_macro_set_spkr_gain_offset(component, - WSA_MACRO_GAIN_OFFSET_M1P5_DB); + WSA_MACRO_SPKR_MODE_DEFAULT); card = rtd->card->snd_card; if (!pdata->codec_root) { @@ -5170,7 +5182,7 @@ static int msm_rx_tx_codec_init(struct snd_soc_pcm_runtime *rtd) bolero_register_wake_irq(component, false); bolero_set_port_map(bolero_component, - ARRAY_SIZE(sm_port_map), sm_port_map); + ARRAY_SIZE(sm_port_map_wcd937x), sm_port_map_wcd937x); codec_reg_done = true; return 0; @@ -7492,7 +7504,7 @@ static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = { .stream_name = "WSA CDC DMA0 Playback", .no_pcm = 1, .dpcm_playback = 1, - .init = &msm_wsa881x_init, + .init = &msm_wcd937x_wsa881x_init, .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0, .be_hw_params_fixup = msm_be_hw_params_fixup, .ignore_pmdown_time = 1, @@ -7720,6 +7732,46 @@ err_pcm_runtime: return ret; } +static int msm_snd_card_late_probe(struct snd_soc_card *card) +{ + struct snd_soc_component *component = NULL; + const char *be_dl_name = LPASS_BE_RX_CDC_DMA_RX_0; + 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; + } + + component = snd_soc_rtdcom_lookup(rtd, WCD937X_DRV_NAME); + if (!component) { + pr_err("%s: component is NULL\n", __func__); + ret = -EINVAL; + } + + mbhc_calibration = def_wcd_mbhc_cal(); + if (!mbhc_calibration) { + ret = -ENOMEM; + } + wcd_mbhc_cfg.calibration = mbhc_calibration; + ret = wcd937x_mbhc_hs_detect(component, &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); + return ret; +} + static int msm_populate_dai_link_component_of_node( struct snd_soc_card *card) { @@ -8045,6 +8097,8 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) total_links += ARRAY_SIZE(msm_tasha_fe_dai_links); } else { + card->late_probe = + msm_snd_card_late_probe; memcpy(msm_sm6150_dai_links + total_links, msm_bolero_fe_dai_links, sizeof(msm_bolero_fe_dai_links)); @@ -8186,7 +8240,8 @@ static int msm_wsa881x_init(struct snd_soc_pcm_runtime *rtd) SPKR_L_BOOST, SPKR_L_VI}; u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP, SPKR_R_BOOST, SPKR_R_VI}; - unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200}; + unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {SWR_CLK_RATE_2P4MHZ, SWR_CLK_RATE_0P6MHZ, + SWR_CLK_RATE_0P3MHZ, SWR_CLK_RATE_1P2MHZ}; unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3}; struct snd_soc_component *component = NULL; struct msm_asoc_mach_data *pdata = @@ -8237,6 +8292,69 @@ static int msm_wsa881x_init(struct snd_soc_pcm_runtime *rtd) return 0; } + +static int msm_wcd937x_wsa881x_init(struct snd_soc_pcm_runtime *rtd) +{ + u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3}; + u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3}; + u8 spkleft_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP, + SPKR_L_BOOST, SPKR_L_VI}; + u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP, + SPKR_R_BOOST, SPKR_R_VI}; + unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {SWR_CLK_RATE_2P4MHZ, SWR_CLK_RATE_0P6MHZ, + SWR_CLK_RATE_0P3MHZ, SWR_CLK_RATE_1P2MHZ}; + unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3}; + struct snd_soc_component *component = NULL; + struct msm_asoc_mach_data *pdata = + snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_dapm_context *dapm = NULL; + + + if (pdata->wsa_max_devs > 0) { + component = snd_soc_rtdcom_lookup(rtd, "wsa-codec.3"); + if (!component) { + pr_err("%s: wsa-codec.3 component is NULL\n", __func__); + return -EINVAL; + } + + dapm = snd_soc_component_get_dapm(component); + + wsa881x_set_channel_map(component, &spkleft_ports[0], + WSA881X_MAX_SWR_PORTS, &ch_mask[0], + &ch_rate[0], &spkleft_port_types[0]); + if (dapm->component) { + snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN"); + snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR"); + } + wsa881x_codec_info_create_codec_entry(pdata->codec_root, + component); + } + + /* If current platform has more than one WSA */ + if (pdata->wsa_max_devs > 1) { + component = snd_soc_rtdcom_lookup(rtd, "wsa-codec.4"); + if (!component) { + pr_err("%s: wsa-codec.4 component is NULL\n", __func__); + return -EINVAL; + } + + dapm = snd_soc_component_get_dapm(component); + + wsa881x_set_channel_map(component, &spkright_ports[0], + WSA881X_MAX_SWR_PORTS, &ch_mask[0], + &ch_rate[0], &spkright_port_types[0]); + if (dapm->component) { + snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN"); + snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR"); + } + wsa881x_codec_info_create_codec_entry(pdata->codec_root, + component); + } + + return 0; +} + + static void msm_i2s_auxpcm_init(struct platform_device *pdev) { int count; @@ -8477,8 +8595,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) } /* Get maximum WSA device count for this platform */ - ret = of_property_read_u32(pdev->dev.of_node, - "qcom,wsa-max-devs", &pdata->wsa_max_devs); + ret = of_property_read_u32(pdev->dev.of_node, + "qcom,wsa-max-devs", &pdata->wsa_max_devs); if (ret) { dev_info(&pdev->dev, "%s: wsa-max-devs property missing in DT %s, ret = %d\n", From 501c74bfd49fbb1e058efc1d6525d1fe6756ce01 Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Mon, 7 Mar 2022 16:43:03 +0800 Subject: [PATCH 04/22] asoc: wsa881x: Add mixer for speaker protection Add mixer for speaker protection. Change-Id: Ieea53dd1a3c9601373b2a8400d48abb88bb0cd60 --- asoc/codecs/wsa881x-analog.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) mode change 100644 => 100755 asoc/codecs/wsa881x-analog.c diff --git a/asoc/codecs/wsa881x-analog.c b/asoc/codecs/wsa881x-analog.c old mode 100644 new mode 100755 index 62247524f1cc..14d027ac141f --- a/asoc/codecs/wsa881x-analog.c +++ b/asoc/codecs/wsa881x-analog.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015-2016, 2018-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -805,7 +806,40 @@ static int wsa881x_set_visense(struct snd_kcontrol *kcontrol, return 0; } +static int wsa881x_get_t0_init(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct wsa881x_pdata *wsa881x = + snd_soc_component_get_drvdata(component); + struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; + + ucontrol->value.integer.value[0] = pdata->t0_init; + dev_dbg(component->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); + + return 0; +} + +static int wsa881x_set_t0_init(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct wsa881x_pdata *wsa881x = + snd_soc_component_get_drvdata(component); + struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; + + pdata->t0_init = ucontrol->value.integer.value[0]; + dev_dbg(component->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); + + return 0; +} + static const struct snd_kcontrol_new wsa881x_snd_controls[] = { + SOC_SINGLE_EXT("WSA T0 Init", SND_SOC_NOPM, 0, 1, 0, + wsa881x_get_t0_init, wsa881x_set_t0_init), + SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0, wsa881x_get_boost, wsa881x_set_boost), From 51d36d5c689c89e43d67ba8a72a832da70f8061a Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Mon, 7 Mar 2022 17:34:51 +0800 Subject: [PATCH 05/22] asoc: msm: Add VI feedback mixer Add VI feedback mixer controls for speaker protection on bengal. Change-Id: I8bc4127d2f599186d80890cbf9b4527c6716723e --- asoc/msm-pcm-routing-v2.c | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 6915f566cd29..43b96aefb914 100755 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -32549,6 +32549,15 @@ static int spkr_prot_get_vi_rch_port(struct snd_kcontrol *kcontrol, return 0; } +static const char * const cdc_dma_rx_0_vi_fb_tx_mux_text[] = { + "ZERO", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_4","TX_CDC_DMA_TX_5" + +}; + +static const char * const cdc_dma_rx_1_vi_fb_tx_mux_text[] = { + "ZERO", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_4","TX_CDC_DMA_TX_5" +}; + static const char * const slim0_rx_vi_fb_tx_lch_mux_text[] = { "ZERO", "SLIM4_TX" }; @@ -32577,6 +32586,14 @@ static const char * const int4_mi2s_rx_vi_fb_tx_stereo_mux_text[] = { "ZERO", "INT5_MI2S_TX" }; +static const int cdc_dma_rx_0_vi_fb_tx_value[] = { + MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_BACKEND_DAI_TX_CDC_DMA_TX_4 +}; + +static const int cdc_dma_rx_1_vi_fb_tx_value[] = { + MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_BACKEND_DAI_TX_CDC_DMA_TX_4 +}; + static const int slim0_rx_vi_fb_tx_lch_value[] = { MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX }; @@ -32606,6 +32623,16 @@ static const int int4_mi2s_rx_vi_fb_tx_stereo_ch_value[] = { MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX }; +static const struct soc_enum cdc_dma_rx_0_vi_fb_mux_enum = + SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, 0, 0, + ARRAY_SIZE(cdc_dma_rx_0_vi_fb_tx_mux_text), + cdc_dma_rx_0_vi_fb_tx_mux_text, cdc_dma_rx_0_vi_fb_tx_value); + +static const struct soc_enum cdc_dma_rx_1_vi_fb_mux_enum = + SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, 0, 0, + ARRAY_SIZE(cdc_dma_rx_1_vi_fb_tx_mux_text), + cdc_dma_rx_1_vi_fb_tx_mux_text, cdc_dma_rx_1_vi_fb_tx_value); + static const struct soc_enum slim0_rx_vi_fb_lch_mux_enum = SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0, ARRAY_SIZE(slim0_rx_vi_fb_tx_lch_mux_text), @@ -32643,6 +32670,16 @@ static const struct soc_enum int4_mi2s_rx_vi_fb_stereo_ch_mux_enum = int4_mi2s_rx_vi_fb_tx_stereo_mux_text, int4_mi2s_rx_vi_fb_tx_stereo_ch_value); +static const struct snd_kcontrol_new cdc_dma_rx_0_vi_fb_mux = + SOC_DAPM_ENUM_EXT("CDC_DMA_RX_0_VI_FB_MUX", + cdc_dma_rx_0_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, + spkr_prot_put_vi_lch_port); + +static const struct snd_kcontrol_new cdc_dma_rx_1_vi_fb_mux = + SOC_DAPM_ENUM_EXT("CDC_DMA_RX_1_VI_FB_MUX", + cdc_dma_rx_1_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, + spkr_prot_put_vi_lch_port); + static const struct snd_kcontrol_new slim0_rx_vi_fb_lch_mux = SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_LCH_MUX", slim0_rx_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port, @@ -33258,6 +33295,12 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { SND_SOC_DAPM_OUTPUT("BE_OUT"), SND_SOC_DAPM_INPUT("BE_IN"), + SND_SOC_DAPM_MUX("CDC_DMA_RX_0_VI_FB_MUX", SND_SOC_NOPM, 0, 0, + &cdc_dma_rx_0_vi_fb_mux), + + SND_SOC_DAPM_MUX("CDC_DMA_RX_1_VI_FB_MUX", SND_SOC_NOPM, 0, 0, + &cdc_dma_rx_1_vi_fb_mux), + SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0, &slim0_rx_vi_fb_lch_mux), SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, @@ -36395,10 +36438,16 @@ static const struct snd_soc_dapm_route intercon[] = { #endif {"INCALL_RECORD_TX", NULL, "BE_IN"}, {"INCALL_RECORD_RX", NULL, "BE_IN"}, + {"CDC_DMA_RX_0_VI_FB_MUX", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, + {"CDC_DMA_RX_0_VI_FB_MUX", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, + {"CDC_DMA_RX_1_VI_FB_MUX", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, + {"CDC_DMA_RX_1_VI_FB_MUX", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, {"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, {"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, {"WSA_RX_0_VI_FB_LCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, {"WSA_RX_0_VI_FB_RCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, + {"RX_CDC_DMA_RX_0", NULL, "CDC_DMA_RX_0_VI_FB_MUX"}, + {"RX_CDC_DMA_RX_1", NULL, "CDC_DMA_RX_1_VI_FB_MUX"}, {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"}, {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"}, {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_LCH_MUX"}, From 92e2db816b1e37d603d25edc8e62fcd78f7d4790 Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Tue, 8 Mar 2022 16:22:12 +0800 Subject: [PATCH 06/22] asoc: Add VI feedback dai_link for bengal Add VI feedback dai_link for speaker protection feature. Change-Id: Ic4db44a548d7e2c472785a2c76ad055e507072a5 --- asoc/bengal.c | 12 ++++++++++++ asoc/msm-dai-fe.c | 24 ++++++++++++++++++++++++ asoc/msm-pcm-routing-v2.c | 3 +++ asoc/msm_bengal_dailink.h | 6 ++++++ 4 files changed, 45 insertions(+) mode change 100644 => 100755 asoc/bengal.c mode change 100644 => 100755 asoc/msm-dai-fe.c mode change 100644 => 100755 asoc/msm_bengal_dailink.h diff --git a/asoc/bengal.c b/asoc/bengal.c old mode 100644 new mode 100755 index 2fff3ff5d19b..d7c0b399a78f --- a/asoc/bengal.c +++ b/asoc/bengal.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -4982,6 +4983,17 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ops = &msm_cdc_dma_be_ops, SND_SOC_DAILINK_REG(tx_cdcdma5_tx), }, + {/* hw:x,39 */ + .name = "TX4_CDC_DMA Hostless", + .stream_name = "TX4_CDC_DMA Hostless", + .dynamic = 1, + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .no_host_mode = SND_SOC_DAI_LINK_NO_HOST, + .ignore_suspend = 1, + SND_SOC_DAILINK_REG(tx4_cdcdma_hostless), + }, }; static struct snd_soc_dai_link msm_common_be_dai_links[] = { diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c old mode 100644 new mode 100755 index abb77881adb3..b6b684740706 --- a/asoc/msm-dai-fe.c +++ b/asoc/msm-dai-fe.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ @@ -592,6 +593,29 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .name = "TX3_CDC_DMA_HOSTLESS", .probe = fe_dai_probe, }, + { + .capture = { + .stream_name = "TX4_CDC_DMA_HOSTLESS Capture", + .aif_name = "TX4_CDC_DMA_UL_HL", + .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | + SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | + SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | + SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | + SNDRV_PCM_RATE_384000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S24_3LE, + .channels_min = 1, + .channels_max = 8, + .rate_min = 8000, + .rate_max = 384000, + }, + .ops = &msm_fe_dai_ops, + .name = "TX4_CDC_DMA_HOSTLESS", + .probe = fe_dai_probe, + }, { .playback = { .stream_name = "INT_FM_HOSTLESS Playback", diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 43b96aefb914..71b45e4c3513 100755 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -32794,6 +32794,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { 0, 0, 0, 0), SND_SOC_DAPM_AIF_OUT("TX3_CDC_DMA_UL_HL", "TX3_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0), + SND_SOC_DAPM_AIF_OUT("TX4_CDC_DMA_UL_HL", + "TX4_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0), SND_SOC_DAPM_AIF_OUT("CPE_LSM_UL_HL", "CPE LSM capture", 0, 0, 0, 0), SND_SOC_DAPM_AIF_IN("SLIM1_DL_HL", "SLIMBUS1_HOSTLESS Playback", @@ -36129,6 +36131,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"RX_CDC_DMA_RX_1_DL_HL", "Switch", "CDC_DMA_DL_HL"}, {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_DL_HL"}, {"TX3_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_3"}, + {"TX4_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_4"}, {"LSM1 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, {"LSM1 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, {"LSM1 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, diff --git a/asoc/msm_bengal_dailink.h b/asoc/msm_bengal_dailink.h old mode 100644 new mode 100755 index c39a3c42d7bc..a901364964a2 --- a/asoc/msm_bengal_dailink.h +++ b/asoc/msm_bengal_dailink.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -166,6 +167,11 @@ SND_SOC_DAILINK_DEFS(tx3_cdcdma_hostless, DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless"))); +SND_SOC_DAILINK_DEFS(tx4_cdcdma_hostless, + DAILINK_COMP_ARRAY(COMP_CPU("TX4_CDC_DMA_HOSTLESS")), + DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless"))); + SND_SOC_DAILINK_DEFS(tert_mi2s_tx_hostless, DAILINK_COMP_ARRAY(COMP_CPU("TERT_MI2S_TX_HOSTLESS")), DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), From dd1d9f2502ae76e5e69090ae8812c3275cd88ba1 Mon Sep 17 00:00:00 2001 From: Hongtao Peng Date: Mon, 21 Mar 2022 18:41:28 +0800 Subject: [PATCH 07/22] soc: remove tdm slot mask invalid err log in multi lane case slot mask use group value instead of port value, which will return default value when multi lane is enabled Change-Id: Iac2f6876915d14b1f5b005354a6edb9239fa41f9 Signed-off-by: Hongtao Peng --- asoc/msm-dai-q6-v2.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index d39ef1e49b3f..30529ffa2296 100755 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -11263,7 +11263,7 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, } static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width, - int slots_per_frame) + int slots_per_frame, int num_channels) { unsigned int i = 0; unsigned int slot_index = 0; @@ -11280,6 +11280,11 @@ static unsigned int tdm_param_set_slot_mask(u16 *slot_offset, int slot_width, return slot_mask; } + if (num_channels != slots_per_frame) { + pr_debug("%s: multi lane is enabled, use the slot mask of tdm group\n", __func__); + return slot_mask; + } + for (i = 0; i < channel_count; i++) { if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID) { slot_index = slot_offset[i] / slot_width_bytes; @@ -11407,11 +11412,13 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, tdm->slot_mask = tdm_param_set_slot_mask( slot_mapping_v2->offset, tdm_group->slot_width, - tdm_group->nslots_per_frame); + tdm_group->nslots_per_frame, + tdm_group->num_channels); else tdm->slot_mask = tdm_param_set_slot_mask(slot_mapping->offset, tdm_group->slot_width, - tdm_group->nslots_per_frame); + tdm_group->nslots_per_frame, + tdm_group->num_channels); pr_debug("%s: TDM:\n" "num_channels=%d sample_rate=%d bit_width=%d\n" From e72bd21ce51a0f3ffa9059e38d9118945873e1ee Mon Sep 17 00:00:00 2001 From: Shuai Zhang Date: Mon, 21 Mar 2022 17:15:19 +0530 Subject: [PATCH 08/22] asoc: reduce HS TDM widget connection when it's disabled Add CONFIG_HSIF_DISABLE config to reduce HS TDM widget connections when it's disabled. Change-Id: I9b8a36a99fbfe4356311e2b9bc6e5a7fd7e2ac0c Signed-off-by: Shuai Zhang --- asoc/msm-pcm-routing-v2.c | 58 +++++++++++++++++++++++++++++++++++++++ config/sm6150auto.conf | 1 + config/sm6150autoconf.h | 1 + 3 files changed, 60 insertions(+) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 8d8a5931bbe7..dd1f7a1e066e 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -14345,6 +14345,7 @@ static const struct snd_kcontrol_new sep_tdm_rx_7_mixer_controls[] = { msm_routing_put_audio_mixer), }; +#ifndef CONFIG_HSIF_DISABLE static const struct snd_kcontrol_new hsif0_tdm_rx_0_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_RX_0, @@ -16144,6 +16145,7 @@ static const struct snd_kcontrol_new hsif2_tdm_rx_7_mixer_controls[] = { MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), }; +#endif static const struct snd_kcontrol_new quat_tdm_rx_2_voice_mixer_controls[] = { SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM, @@ -20384,6 +20386,7 @@ static const struct snd_kcontrol_new sep_tdm_rx_7_port_mixer_controls[] = { msm_routing_put_port_mixer), }; +#ifndef CONFIG_HSIF_DISABLE static const struct snd_kcontrol_new hsif0_tdm_rx_0_port_mixer_controls[] = { #ifndef CONFIG_MI2S_DISABLE SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, @@ -23311,6 +23314,7 @@ static const struct snd_kcontrol_new hsif2_tdm_rx_7_port_mixer_controls[] = { msm_routing_get_port_mixer, msm_routing_put_port_mixer), }; +#endif static const struct snd_kcontrol_new quin_tdm_rx_7_port_mixer_controls[] = { SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM, @@ -23563,6 +23567,7 @@ static const struct snd_kcontrol_new mmul1_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, @@ -23659,6 +23664,7 @@ static const struct snd_kcontrol_new mmul1_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_SLIMBUS_7_TX, @@ -23922,6 +23928,7 @@ static const struct snd_kcontrol_new mmul2_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, @@ -24018,6 +24025,7 @@ static const struct snd_kcontrol_new mmul2_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_SLIMBUS_8_TX, @@ -24297,6 +24305,7 @@ static const struct snd_kcontrol_new mmul3_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, @@ -24393,6 +24402,7 @@ static const struct snd_kcontrol_new mmul3_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, @@ -24614,6 +24624,7 @@ static const struct snd_kcontrol_new mmul4_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, @@ -24711,6 +24722,7 @@ static const struct snd_kcontrol_new mmul4_mixer_controls[] = { MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), #endif +#endif #ifndef CONFIG_MI2S_DISABLE SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_PRI_MI2S_TX, @@ -25009,6 +25021,7 @@ static const struct snd_kcontrol_new mmul5_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, @@ -25105,6 +25118,7 @@ static const struct snd_kcontrol_new mmul5_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_SLIMBUS_7_TX, @@ -25601,6 +25615,7 @@ static const struct snd_kcontrol_new mmul8_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, @@ -25697,6 +25712,7 @@ static const struct snd_kcontrol_new mmul8_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_SLIMBUS_7_TX, @@ -26129,6 +26145,7 @@ static const struct snd_kcontrol_new mmul9_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, @@ -26225,6 +26242,7 @@ static const struct snd_kcontrol_new mmul9_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, @@ -27063,6 +27081,7 @@ static const struct snd_kcontrol_new mmul20_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, @@ -27159,6 +27178,7 @@ static const struct snd_kcontrol_new mmul20_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, @@ -27366,6 +27386,7 @@ static const struct snd_kcontrol_new mmul21_mixer_controls[] = { MSM_BACKEND_DAI_SEP_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#ifndef CONFIG_HSIF_DISABLE SOC_DOUBLE_EXT("HSIF0_TDM_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_HSIF0_TDM_TX_0, MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, @@ -27462,6 +27483,7 @@ static const struct snd_kcontrol_new mmul21_mixer_controls[] = { MSM_BACKEND_DAI_HSIF2_TDM_TX_7, MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), +#endif #endif SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0, @@ -34122,6 +34144,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_AIF_OUT("SEP_TDM_TX_7_UL_HL", "Septenary TDM7 Hostless Capture", 0, 0, 0, 0), +#ifndef CONFIG_HSIF_DISABLE SND_SOC_DAPM_AIF_IN("HSIF0_TDM_RX_0_DL_HL", "Hsif0 TDM0 Hostless Playback", 0, 0, 0, 0), @@ -34266,6 +34289,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_AIF_OUT("HSIF2_TDM_TX_7_UL_HL", "Hsif2 TDM7 Hostless Capture", 0, 0, 0, 0), +#endif /* Backend AIF */ /* Stream name equals to backend dai link stream name */ @@ -34494,6 +34518,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_AIF_IN("SEP_TDM_TX_7", "Septenary TDM7 Capture", 0, 0, 0, 0), +#ifndef CONFIG_HSIF_DISABLE SND_SOC_DAPM_AIF_OUT("HSIF0_TDM_RX_0", "Hsif0 TDM0 Playback", 0, 0, 0, 0), SND_SOC_DAPM_AIF_IN("HSIF0_TDM_TX_0", "Hsif0 TDM0 Capture", @@ -34590,6 +34615,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { 0, 0, 0, 0), SND_SOC_DAPM_AIF_IN("HSIF2_TDM_TX_7", "Hsif2 TDM7 Capture", 0, 0, 0, 0), +#endif SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, pri_tdm_rx_0_mixer_controls, ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)), @@ -34689,6 +34715,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("SEP_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, sep_tdm_rx_7_mixer_controls, ARRAY_SIZE(sep_tdm_rx_7_mixer_controls)), +#ifndef CONFIG_HSIF_DISABLE SND_SOC_DAPM_MIXER("HSIF0_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, hsif0_tdm_rx_0_mixer_controls, ARRAY_SIZE(hsif0_tdm_rx_0_mixer_controls)), @@ -34761,6 +34788,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("HSIF2_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0, hsif2_tdm_rx_7_mixer_controls, ARRAY_SIZE(hsif2_tdm_rx_7_mixer_controls)), +#endif /* incall */ SND_SOC_DAPM_MIXER("PRI_TDM_RX_0_Voice Mixer", SND_SOC_NOPM, 0, 0, @@ -34891,6 +34919,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("SEP_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, sep_tdm_rx_7_port_mixer_controls, ARRAY_SIZE(sep_tdm_rx_7_port_mixer_controls)), +#ifndef CONFIG_HSIF_DISABLE SND_SOC_DAPM_MIXER("HSIF0_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, hsif0_tdm_rx_0_port_mixer_controls, ARRAY_SIZE(hsif0_tdm_rx_0_port_mixer_controls)), @@ -34963,6 +34992,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("HSIF2_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, hsif2_tdm_rx_7_port_mixer_controls, ARRAY_SIZE(hsif2_tdm_rx_7_port_mixer_controls)), +#endif }; #endif @@ -37647,6 +37677,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"SEP_TDM_RX_7 Audio Mixer", "MultiMedia21", "MM_DL21"}, {"SEP_TDM_RX_7", NULL, "SEP_TDM_RX_7 Audio Mixer"}, +#ifndef CONFIG_HSIF_DISABLE {"HSIF0_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"HSIF0_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"HSIF0_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -38103,6 +38134,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"HSIF2_TDM_RX_7 Audio Mixer", "MultiMedia20", "MM_DL20"}, {"HSIF2_TDM_RX_7 Audio Mixer", "MultiMedia21", "MM_DL21"}, {"HSIF2_TDM_RX_7", NULL, "HSIF2_TDM_RX_7 Audio Mixer"}, +#endif {"MultiMedia1 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia1 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, {"MultiMedia1 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"}, @@ -38136,6 +38168,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia1 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia1 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia1 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia1 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia1 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia1 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38160,6 +38193,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia1 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia1 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia1 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia2 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia2 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38193,6 +38227,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia2 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia2 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia2 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia2 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia2 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia2 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38217,6 +38252,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia2 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia2 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia2 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia3 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia3 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38250,6 +38286,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia3 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia3 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia3 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia3 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia3 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia3 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38274,6 +38311,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia3 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia3 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia3 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia4 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia4 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38307,6 +38345,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia4 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia4 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia4 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia4 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia4 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia4 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38331,6 +38370,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia4 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia4 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia4 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia5 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia5 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38364,6 +38404,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia5 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia5 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia5 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia5 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia5 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia5 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38388,6 +38429,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia5 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia5 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia5 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia8 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia8 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38421,6 +38463,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia8 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia8 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia8 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia8 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia8 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia8 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38445,6 +38488,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia8 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia8 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia8 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia9 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, {"MultiMedia9 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, @@ -38470,6 +38514,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia9 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia9 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia9 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia9 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia9 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia9 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38494,6 +38539,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia9 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia9 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia9 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia10 Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, {"MultiMedia10 Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, @@ -38538,6 +38584,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia20 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia20 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia20 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia20 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia20 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia20 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38562,6 +38609,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia20 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia20 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia20 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia21 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia21 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38595,6 +38643,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia21 Mixer", "SEP_TDM_TX_5", "SEP_TDM_TX_5"}, {"MultiMedia21 Mixer", "SEP_TDM_TX_6", "SEP_TDM_TX_6"}, {"MultiMedia21 Mixer", "SEP_TDM_TX_7", "SEP_TDM_TX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"MultiMedia21 Mixer", "HSIF0_TDM_TX_0", "HSIF0_TDM_TX_0"}, {"MultiMedia21 Mixer", "HSIF0_TDM_TX_1", "HSIF0_TDM_TX_1"}, {"MultiMedia21 Mixer", "HSIF0_TDM_TX_2", "HSIF0_TDM_TX_2"}, @@ -38619,6 +38668,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"MultiMedia21 Mixer", "HSIF2_TDM_TX_5", "HSIF2_TDM_TX_5"}, {"MultiMedia21 Mixer", "HSIF2_TDM_TX_6", "HSIF2_TDM_TX_6"}, {"MultiMedia21 Mixer", "HSIF2_TDM_TX_7", "HSIF2_TDM_TX_7"}, +#endif {"MultiMedia22 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"}, {"MultiMedia22 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"}, @@ -38912,6 +38962,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"SEP_TDM_RX_5", NULL, "SEP_TDM_RX_5_DL_HL"}, {"SEP_TDM_RX_6", NULL, "SEP_TDM_RX_6_DL_HL"}, {"SEP_TDM_RX_7", NULL, "SEP_TDM_RX_7_DL_HL"}, +#ifndef CONFIG_HSIF_DISABLE {"HSIF0_TDM_TX_0_UL_HL", NULL, "HSIF0_TDM_TX_0"}, {"HSIF0_TDM_TX_1_UL_HL", NULL, "HSIF0_TDM_TX_1"}, {"HSIF0_TDM_TX_2_UL_HL", NULL, "HSIF0_TDM_TX_2"}, @@ -38960,6 +39011,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"HSIF2_TDM_RX_5", NULL, "HSIF2_TDM_RX_5_DL_HL"}, {"HSIF2_TDM_RX_6", NULL, "HSIF2_TDM_RX_6_DL_HL"}, {"HSIF2_TDM_RX_7", NULL, "HSIF2_TDM_RX_7_DL_HL"}, +#endif #ifndef CONFIG_MI2S_DISABLE {"PRI_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, {"PRI_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, @@ -39884,6 +39936,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"SEP_TDM_RX_7 Port Mixer", "SEP_TDM_TX_3", "SEP_TDM_TX_3"}, {"SEP_TDM_RX_7", NULL, "SEP_TDM_RX_7 Port Mixer"}, +#ifndef CONFIG_HSIF_DISABLE #ifndef CONFIG_MI2S_DISABLE {"HSIF0_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, {"HSIF0_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, @@ -40460,6 +40513,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"HSIF2_TDM_RX_7 Port Mixer", "HSIF2_TDM_TX_2", "HSIF2_TDM_TX_2"}, {"HSIF2_TDM_RX_7 Port Mixer", "HSIF2_TDM_TX_3", "HSIF2_TDM_TX_3"}, {"HSIF2_TDM_RX_7", NULL, "HSIF2_TDM_RX_7 Port Mixer"}, +#endif {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_0", "QUAT_TDM_RX_0"}, {"AUDIO_REF_EC_UL1 MUX", "QUAT_TDM_RX_1", "QUAT_TDM_RX_1"}, @@ -40544,6 +40598,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"BE_OUT", NULL, "SEP_TDM_RX_5"}, {"BE_OUT", NULL, "SEP_TDM_RX_6"}, {"BE_OUT", NULL, "SEP_TDM_RX_7"}, +#ifndef CONFIG_HSIF_DISABLE {"BE_OUT", NULL, "HSIF0_TDM_RX_0"}, {"BE_OUT", NULL, "HSIF0_TDM_RX_1"}, {"BE_OUT", NULL, "HSIF0_TDM_RX_2"}, @@ -40568,6 +40623,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"BE_OUT", NULL, "HSIF2_TDM_RX_5"}, {"BE_OUT", NULL, "HSIF2_TDM_RX_6"}, {"BE_OUT", NULL, "HSIF2_TDM_RX_7"}, +#endif {"PRI_TDM_TX_0", NULL, "BE_IN"}, {"PRI_TDM_TX_1", NULL, "BE_IN"}, @@ -40604,6 +40660,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"SEP_TDM_TX_5", NULL, "BE_IN"}, {"SEP_TDM_TX_6", NULL, "BE_IN"}, {"SEP_TDM_TX_7", NULL, "BE_IN"}, +#ifndef CONFIG_HSIF_DISABLE {"HSIF0_TDM_TX_0", NULL, "BE_IN"}, {"HSIF0_TDM_TX_1", NULL, "BE_IN"}, {"HSIF0_TDM_TX_2", NULL, "BE_IN"}, @@ -40628,6 +40685,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"HSIF2_TDM_TX_5", NULL, "BE_IN"}, {"HSIF2_TDM_TX_6", NULL, "BE_IN"}, {"HSIF2_TDM_TX_7", NULL, "BE_IN"}, +#endif }; #endif diff --git a/config/sm6150auto.conf b/config/sm6150auto.conf index 8ebc88a5e7de..536e8a1e701a 100644 --- a/config/sm6150auto.conf +++ b/config/sm6150auto.conf @@ -46,3 +46,4 @@ export CONFIG_SND_SOC_WCD_IRQ=m export CONFIG_SND_SOC_WCD937X=m export CONFIG_SND_SOC_WCD937X_SLAVE=m export CONFIG_SND_EVENT=m +export CONFIG_HSIF_DISABLE=m diff --git a/config/sm6150autoconf.h b/config/sm6150autoconf.h index 9a3cdd0ad898..31f361468b45 100644 --- a/config/sm6150autoconf.h +++ b/config/sm6150autoconf.h @@ -51,3 +51,4 @@ #define CONFIG_SND_SOC_WCD937X 1 #define CONFIG_SND_SOC_WCD937X_SLAVE 1 #define CONFIG_SND_EVENT 1 +#define CONFIG_HSIF_DISABLE 1 From 4417be62e3393d460970cf88973ef38c891c27e0 Mon Sep 17 00:00:00 2001 From: Hongtao Peng Date: Mon, 21 Mar 2022 23:46:30 +0800 Subject: [PATCH 09/22] dsp: Remove error log when there is no AFE cal data Change-Id: I51c3cf6d1143d16521f6e64010e67524d07d7850 Signed-off-by: Hongtao Peng --- dsp/q6afe.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 9334d4c2972f..4bfbf2ebdd92 100755 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -2144,12 +2144,15 @@ static int afe_send_cal_block(u16 port_id, struct cal_block_data *cal_block) result = -EINVAL; goto done; } - if (cal_block->cal_data.size <= 0) { + if (cal_block->cal_data.size < 0) { pr_debug("%s: AFE cal has invalid size!\n", __func__); result = -EINVAL; goto done; } - + if (cal_block->cal_data.size == 0) { + pr_debug("%s: AFE cal size is zero!\n", __func__); + goto done; + } payload_size = cal_block->cal_data.size; mem_hdr.data_payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); From 74424d30ff1bf30f07f9be66438dcc9d4646fe47 Mon Sep 17 00:00:00 2001 From: Hongtao Peng Date: Tue, 22 Mar 2022 11:54:16 +0800 Subject: [PATCH 10/22] dsp: lower the log lever of ADSP_EALREADY change log lever of ADSP_EALREADY from error to debug Change-Id: I4ecd120e38748c67b0e9c0e7b5a8717eefc3ad65 Signed-off-by: Hongtao Peng --- dsp/q6asm.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/dsp/q6asm.c b/dsp/q6asm.c index d39ec0f94478..167c1dcbc908 100755 --- a/dsp/q6asm.c +++ b/dsp/q6asm.c @@ -12,6 +12,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. */ #include #include @@ -2191,8 +2192,12 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) payload[0], payload[1], data->src_port, data->dest_port); if (payload[1] != 0) { - pr_err("%s: cmd = 0x%x returned error = 0x%x\n", - __func__, payload[0], payload[1]); + if (adsp_err_get_lnx_err_code(payload[1]) != -EALREADY) + pr_err("%s: cmd = 0x%x returned error = 0x%x\n", + __func__, payload[0], payload[1]); + else + pr_debug("%s: cmd = 0x%x returned error = 0x%x\n", + __func__, payload[0], payload[1]); if (wakeup_flag) { if ((is_adsp_reg_event(payload[0]) >= 0) || @@ -3431,11 +3436,12 @@ static int __q6asm_open_read(struct audio_client *ac, goto fail_cmd; } if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); rc = adsp_err_get_lnx_err_code( atomic_read(&ac->cmd_state)); + if (rc != -EALREADY) + pr_err("%s: DSP returned error[%s]\n", + __func__, adsp_err_get_err_str( + atomic_read(&ac->cmd_state))); goto fail_cmd; } @@ -3840,11 +3846,12 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format, goto fail_cmd; } if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); rc = adsp_err_get_lnx_err_code( atomic_read(&ac->cmd_state)); + if (rc != -EALREADY) + pr_err("%s: DSP returned error[%s]\n", + __func__, adsp_err_get_err_str( + atomic_read(&ac->cmd_state))); goto fail_cmd; } ac->io_mode |= TUN_WRITE_IO_MODE; @@ -4190,11 +4197,12 @@ static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, goto fail_cmd; } if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); rc = adsp_err_get_lnx_err_code( atomic_read(&ac->cmd_state)); + if (rc != -EALREADY) + pr_err("%s: DSP returned error[%s]\n", + __func__, adsp_err_get_err_str( + atomic_read(&ac->cmd_state))); goto fail_cmd; } From c30a0cf98d7ac1ed5bf5474f123af842f9ef469b Mon Sep 17 00:00:00 2001 From: Faiz Nabi Kuchay Date: Tue, 22 Feb 2022 19:12:11 +0530 Subject: [PATCH 11/22] ASoC: wcd937x: Update QCRG sequence for wcd937x Update QCRG sequence for wcd937x. Change-Id: I039a8b2dc74c34722b6c81bab429dee6326ec362 --- asoc/codecs/wcd937x/wcd937x.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index fcb0dd15c6a8..a563dca20e81 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -209,7 +209,7 @@ static int wcd937x_init_reg(struct snd_soc_component *component) snd_soc_component_update_bits(component, WCD937X_BIAS_VBG_FINE_ADJ, 0xF0, 0xB0); snd_soc_component_update_bits(component, - WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90); + WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL , 0xF0, 0x50); } return 0; } @@ -503,6 +503,11 @@ static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); break; case SND_SOC_DAPM_POST_PMU: + if ((snd_soc_component_read32(component, + WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) && + hph_mode == CLS_H_ULP) + snd_soc_component_update_bits(component, + WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90); if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) snd_soc_component_update_bits(component, WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, @@ -544,6 +549,11 @@ static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, WCD937X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00); break; case SND_SOC_DAPM_POST_PMD: + if ((snd_soc_component_read32(component, + WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) && + hph_mode == CLS_H_ULP) + snd_soc_component_update_bits(component, + WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x80); snd_soc_component_update_bits(component, WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x0F, 0x01); @@ -577,6 +587,11 @@ static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); break; case SND_SOC_DAPM_POST_PMU: + if ((snd_soc_component_read32(component, + WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) && + hph_mode == CLS_H_ULP) + snd_soc_component_update_bits(component, + WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90); if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) snd_soc_component_update_bits(component, WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, @@ -618,6 +633,11 @@ static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, WCD937X_HPH_NEW_INT_HPH_TIMER1, 0x02, 0x00); break; case SND_SOC_DAPM_POST_PMD: + if ((snd_soc_component_read32(component, + WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) && + hph_mode == CLS_H_ULP) + snd_soc_component_update_bits(component, + WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x80); snd_soc_component_update_bits(component, WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x0F, 0x01); From 915b9b813574753125b6b4f4b73c29cd50ca4f6a Mon Sep 17 00:00:00 2001 From: Shuai Zhang Date: Wed, 23 Mar 2022 11:47:00 +0530 Subject: [PATCH 12/22] asoc: sm6150: change msm_wcn_be_dai_links name Change DAI-LINK name from LPASS_BE_SLIMBUS_TX_VI to LPASS_BE_SLIMBUS_7_RX for Bluetooth playback Change-Id: Iac1a2c72438dde2100fbdc2733bd0bd5adec3041 Signed-off-by: Shuai Zhang --- asoc/sm6150.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asoc/sm6150.c b/asoc/sm6150.c index 5eb1b5d94397..c73c1ffef3de 100644 --- a/asoc/sm6150.c +++ b/asoc/sm6150.c @@ -7196,7 +7196,7 @@ static struct snd_soc_dai_link msm_tasha_be_dai_links[] = { static struct snd_soc_dai_link msm_wcn_be_dai_links[] = { { - .name = LPASS_BE_SLIMBUS_TX_VI, + .name = LPASS_BE_SLIMBUS_7_RX, .stream_name = "Slimbus7 Playback", /* BT codec driver determines capabilities based on * dai name, bt codecdai name should always contains From 0b55b86b0802e9d9dd8401f9ca77776ac4eafbe8 Mon Sep 17 00:00:00 2001 From: Shuai Zhang Date: Wed, 9 Mar 2022 08:57:47 +0530 Subject: [PATCH 13/22] ASOC: talos: update dai-link port-config for talos Modify COMP_CODEC in wsa_dma_rx. Add sm_port_map_wcd937x in port-config. Change-Id: Ie8044ddc32e87970c457f627cbfced0543940091 Signed-off-by: Shuai Zhang --- asoc/msm_talos_dailink.h | 12 +++++++++--- asoc/talos-port-config.h | 24 +++++++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/asoc/msm_talos_dailink.h b/asoc/msm_talos_dailink.h index f9d7b7e68882..1ff64f1e51a7 100644 --- a/asoc/msm_talos_dailink.h +++ b/asoc/msm_talos_dailink.h @@ -1181,21 +1181,27 @@ SND_SOC_DAILINK_DEFS(wsa_dma_rx0, DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45056")), DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx1"), COMP_CODEC("wsa-codec1", "wsa_rx1"), - COMP_CODEC("wsa-codec2", "wsa_rx2")), + COMP_CODEC("wsa-codec2", "wsa_rx2"), + COMP_CODEC("wsa-codec.3", "wsa_rx3"), + COMP_CODEC("wsa-codec.4", "wsa_rx4")), DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing"))); SND_SOC_DAILINK_DEFS(wsa_dma_rx1, DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45058")), DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx_mix"), COMP_CODEC("wsa-codec1", "wsa_rx1"), - COMP_CODEC("wsa-codec2", "wsa_rx2")), + COMP_CODEC("wsa-codec2", "wsa_rx2"), + COMP_CODEC("wsa-codec.3", "wsa_rx3"), + COMP_CODEC("wsa-codec.4", "wsa_rx4")), DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing"))); SND_SOC_DAILINK_DEFS(wsa_dma_tx1, DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45059")), DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_echo"), COMP_CODEC("wsa-codec1", "wsa_rx1"), - COMP_CODEC("wsa-codec2", "wsa_rx2")), + COMP_CODEC("wsa-codec2", "wsa_rx2"), + COMP_CODEC("wsa-codec.3", "wsa_rx3"), + COMP_CODEC("wsa-codec.4", "wsa_rx4")), DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing"))); SND_SOC_DAILINK_DEFS(rx_dma_rx0, diff --git a/asoc/talos-port-config.h b/asoc/talos-port-config.h index 5456b4f4c8ff..d45e801eb972 100644 --- a/asoc/talos-port-config.h +++ b/asoc/talos-port-config.h @@ -87,6 +87,12 @@ static struct port_params tx_frame_params_0p6MHz[SWR_MSTR_PORT_LEN] = { {1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */ }; +static struct port_params tx_frame_params_wcd937x[SWR_MSTR_PORT_LEN] = { + {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0x00, 0x00}, /* TX1 */ + {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX2 */ + {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */ +}; + static struct swr_mstr_port_map sm_port_map[] = { {TX_MACRO, SWR_UC0, tx_frame_params_default}, {TX_MACRO, SWR_UC1, tx_frame_params_4p8MHz}, @@ -95,7 +101,7 @@ static struct swr_mstr_port_map sm_port_map[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, - {WSA_MACRO, SWR_UC1, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; static struct swr_mstr_port_map sm_port_map_tavil[] = { @@ -106,7 +112,7 @@ static struct swr_mstr_port_map sm_port_map_tavil[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, - {WSA_MACRO, SWR_UC1, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; static struct swr_mstr_port_map sm_port_map_tasha[] = { @@ -117,11 +123,23 @@ static struct swr_mstr_port_map sm_port_map_tasha[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, - {WSA_MACRO, SWR_UC1, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; static struct swr_mstr_port_map sm_port_map_tavil_wsa[] = { {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, +}; + +static struct swr_mstr_port_map sm_port_map_wcd937x[] = { + {TX_MACRO, SWR_UC0, tx_frame_params_wcd937x}, + {TX_MACRO, SWR_UC1, tx_frame_params_wcd937x}, + {TX_MACRO, SWR_UC2, tx_frame_params_wcd937x}, + {RX_MACRO, SWR_UC0, rx_frame_params_default}, + {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, + {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, + {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; #endif /* _TALOS_PORT_CONFIG */ From 11fae871f16ae12680ff95fb79c9fc04591d73d2 Mon Sep 17 00:00:00 2001 From: Shuai Zhang Date: Wed, 19 Jan 2022 12:28:07 +0530 Subject: [PATCH 14/22] asoc: codec: Fix error makefile: Fix error and add version information Fix error caused by include error. Fix error caused by warning and add version information. Change-Id: I098025ec4dee178c709a2007a2cfe43ddafc23b5 --- Makefile.am | 1 + asoc/codecs/wcd9335-regmap.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index ccbb7a2c7aeb..5e3faccf5492 100755 --- a/Makefile.am +++ b/Makefile.am @@ -26,6 +26,7 @@ obj-m += asoc/ obj-m += asoc/codecs/ ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sdmsteppe)) obj-m += asoc/codecs/wcd934x/ +KBUILD_CFLAGS += -Wno-error endif ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), qcs40x)) obj-m += asoc/codecs/bolero/ diff --git a/asoc/codecs/wcd9335-regmap.c b/asoc/codecs/wcd9335-regmap.c index 418327245018..ac734f8c46e9 100644 --- a/asoc/codecs/wcd9335-regmap.c +++ b/asoc/codecs/wcd9335-regmap.c @@ -1,13 +1,14 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015-2018, 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include #include #include #include -#include +#include "wcd9335_registers.h" static const struct reg_sequence wcd9335_1_x_defaults[] = { { WCD9335_CODEC_RPM_CLK_GATE, 0x03, 0x00 }, From 31c3028f7937e4693aa5b6879dca5edb7fa0959b Mon Sep 17 00:00:00 2001 From: fei tong Date: Tue, 14 Dec 2021 15:59:47 +0800 Subject: [PATCH 15/22] asoc: add afe limiter disable kcontrol and fix ULLPP index mismatch add afe limiter control to enable/disable afe limiter module and fix ULLPP index not match issue. Change-Id: I1820a2a270b4a8aaff3e0043b26d993224c0d33f --- asoc/msm-dai-q6-v2.c | 85 ++++++++++++++++++++++++++++++++++++++ dsp/q6adm.c | 2 + dsp/q6afe.c | 25 +++++++++++ dsp/q6asm.c | 2 + include/dsp/apr_audio-v2.h | 16 +++++++ include/dsp/q6afe-v2.h | 2 + include/dsp/q6audio-v2.h | 1 + 7 files changed, 133 insertions(+) mode change 100644 => 100755 include/dsp/apr_audio-v2.h diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index d39ef1e49b3f..82dbb73cc206 100755 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -481,6 +481,8 @@ static bool afe_port_logging_item[IDX_TDM_MAX]; static int afe_port_loggging_control_added; +static int afe_port_limiter_control_added; + static int afe_dyn_mclk_control_added; static DEFINE_MUTEX(tdm_mutex); @@ -10572,6 +10574,78 @@ int jitter_cleaner_afe_enable_mclk_and_get_info_cb_func(void *private_data, return 0; } +static int msm_pcm_afe_limiter_param_ctl_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info* ucontrol) +{ + ucontrol->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + /* two int values: port_id and enable/disable */ + ucontrol->count = 2; + /* Valid range is all positive values to support above controls */ + ucontrol->value.integer.min = 0; + ucontrol->value.integer.max = INT_MAX; + return 0; +} + +static int msm_pcm_afe_limiter_param_ctl_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return 0; +} + +static int msm_pcm_afe_limiter_param_ctl_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + u16 port_id; + struct afe_param_id_port_afe_limiter_disable_t afe_limiter_disable; + struct param_hdr_v3 param_hdr; + int ret = -EINVAL; + + pr_debug("%s: enter\n", __func__); + memset(¶m_hdr, 0, sizeof(param_hdr)); + + port_id = ucontrol->value.integer.value[0]; + afe_limiter_disable.disable_afe_limiter = ucontrol->value.integer.value[1]; + + ret = afe_port_send_afe_limiter_param(port_id, &afe_limiter_disable); + if (ret) + pr_err("%s: AFE port logging setting for port 0x%x failed %d\n", + __func__, port_id, ret); + + return ret; +} + +static int msm_pcm_add_afe_port_limiter_control(struct snd_soc_dai *dai) +{ + const char* afe_port_limiter_ctl_name = "AFE_port_limiter_disable"; + int rc = 0; + struct snd_kcontrol_new *knew = NULL; + struct snd_kcontrol* kctl = NULL; + + /* Add AFE port logging controls */ + knew = kzalloc(sizeof(struct snd_kcontrol_new), GFP_KERNEL); + if (!knew) { + return -ENOMEM; + } + knew->iface = SNDRV_CTL_ELEM_IFACE_MIXER; + knew->info = msm_pcm_afe_limiter_param_ctl_info; + knew->get = msm_pcm_afe_limiter_param_ctl_get; + knew->put = msm_pcm_afe_limiter_param_ctl_put; + knew->name = afe_port_limiter_ctl_name; + knew->private_value = dai->id; + kctl = snd_ctl_new1(knew, knew); + if (!kctl) { + kfree(knew); + return -ENOMEM; + } + + rc = snd_ctl_add(dai->component->card->snd_card, kctl); + if (rc < 0) + pr_err("%s: err add AFE port limiter disable control, DAI = %s\n", + __func__, dai->name); + + return rc; +} + static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai) { int rc = 0; @@ -10680,6 +10754,17 @@ static int msm_dai_q6_dai_tdm_probe(struct snd_soc_dai *dai) } } + if (!afe_port_limiter_control_added) { + rc = msm_pcm_add_afe_port_limiter_control(dai); + if (rc < 0) { + dev_err(dai->dev, "%s: add AFE port logging control failed DAI: %s\n", + __func__, dai->name); + goto rtn; + } + + afe_port_limiter_control_added = 1; + } + if (tdm_dai_data->is_island_dai) rc = msm_dai_q6_add_island_mx_ctls( dai->component->card->snd_card, diff --git a/dsp/q6adm.c b/dsp/q6adm.c index 53a70d396ab2..3c5895edee2a 100755 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -3290,6 +3290,8 @@ int adm_open_v2(int port_id, int path, int rate, int channel_mode, int topology, (topology == DS2_ADM_COPP_TOPOLOGY_ID) || (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) topology = DEFAULT_COPP_TOPOLOGY; + } else if (perf_mode == LOW_LATENCY_PCM_NOPROC_MODE) { + flags = ADM_LOW_LATENCY_NPROC_DEVICE_SESSION; } else { if ((path == ADM_PATH_COMPRESSED_RX) || (path == ADM_PATH_COMPRESSED_TX)) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 9334d4c2972f..30fc3a95be48 100755 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -4876,6 +4876,31 @@ int afe_port_send_logging_cfg(u16 port_id, } EXPORT_SYMBOL(afe_port_send_logging_cfg); +int afe_port_send_afe_limiter_param(u16 port_id, + struct afe_param_id_port_afe_limiter_disable_t *disable_limiter) +{ + struct param_hdr_v3 param_hdr; + int ret = -EINVAL; + + pr_debug("%s: enter, port: 0x%x logging flag: %x\n", __func__, port_id, + disable_limiter->disable_afe_limiter); + memset(¶m_hdr, 0, sizeof(param_hdr)); + + param_hdr.module_id = AFE_MODULE_LIMITER; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_id = AFE_PARAM_ID_ENABLE; + param_hdr.param_size = sizeof(struct afe_param_id_port_afe_limiter_disable_t); + + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), param_hdr, (u8*)disable_limiter); + if (ret) + pr_err("%s: AFE port logging setting for port 0x%x failed %d\n", + __func__, port_id, ret); + + return ret; +} +EXPORT_SYMBOL(afe_port_send_afe_limiter_param); + int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config) { struct afe_param_id_usb_audio_dev_params usb_dev; diff --git a/dsp/q6asm.c b/dsp/q6asm.c index d39ec0f94478..c04b216364c2 100755 --- a/dsp/q6asm.c +++ b/dsp/q6asm.c @@ -3734,6 +3734,8 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format, open.mode_flags |= ASM_ULTRA_LOW_LATENCY_STREAM_SESSION; else if (ac->perf_mode == LOW_LATENCY_PCM_MODE) open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION; + else if (ac->perf_mode == LOW_LATENCY_PCM_NOPROC_MODE) + open.mode_flags |= ASM_ULTRA_LOW_LATENCY_NPROC_STREAM_SESSION; else { open.mode_flags |= ASM_LEGACY_STREAM_SESSION; if (is_gapless_mode) diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h old mode 100644 new mode 100755 index b70670c04d2b..c742d20aea54 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -223,6 +223,8 @@ struct adm_cmd_matrix_map_routings_v5 { /* Definition for a low latency stream session. */ #define ADM_LOW_LATENCY_DEVICE_SESSION 0x2000 +#define ADM_LOW_LATENCY_NPROC_DEVICE_SESSION 0x6000 + /* Definition for a ultra low latency stream session. */ #define ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION 0x4000 @@ -8100,6 +8102,8 @@ struct asm_session_cmdrsp_get_path_delay_v2 { #define ASM_ULTRA_LOW_LATENCY_STREAM_SESSION 0x20000000 +#define ASM_ULTRA_LOW_LATENCY_NPROC_STREAM_SESSION 0x30000000 + #define ASM_ULL_POST_PROCESSING_STREAM_SESSION 0x40000000 #define ASM_LEGACY_STREAM_SESSION 0 @@ -13635,4 +13639,16 @@ struct afe_param_id_port_data_log_disable_t */ } __packed; +#define AFE_MODULE_LIMITER 0x000102A8 +#define AFE_PARAM_ID_ENABLE 0x00010203 +struct afe_param_id_port_afe_limiter_disable_t +{ + uint16_t disable_afe_limiter; + /** Flag for enabling or disabling data logging. + * @values + * - AFE_PORT_DATA_LOGGING_ENABLE - enable data logging. + * - AFE_PORT_DATA_LOGGING_DISABLE - disable data logging. + */ + uint16_t reserved; +} __packed; #endif /*_APR_AUDIO_V2_H_ */ diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h index 016996e3bb67..cd8e0132709d 100644 --- a/include/dsp/q6afe-v2.h +++ b/include/dsp/q6afe-v2.h @@ -591,6 +591,8 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, void afe_set_routing_callback(routing_cb cb); int afe_port_send_logging_cfg(u16 port_id, struct afe_param_id_port_data_log_disable_t *log_disable); +int afe_port_send_afe_limiter_param(u16 port_id, + struct afe_param_id_port_afe_limiter_disable_t *disable_limiter); int afe_get_av_dev_drift(struct afe_param_id_dev_timing_stats *timing_stats, u16 port); int afe_set_lpass_clk_cfg_ext_mclk_v2(int index, diff --git a/include/dsp/q6audio-v2.h b/include/dsp/q6audio-v2.h index 079d0b14b585..48eceb89bdff 100644 --- a/include/dsp/q6audio-v2.h +++ b/include/dsp/q6audio-v2.h @@ -12,6 +12,7 @@ enum { LEGACY_PCM_MODE = 0, LOW_LATENCY_PCM_MODE, ULTRA_LOW_LATENCY_PCM_MODE, + LOW_LATENCY_PCM_NOPROC_MODE, ULL_POST_PROCESSING_PCM_MODE, }; From 268b2ba14ebbb7476daf4b4e4f04cddebf7b6889 Mon Sep 17 00:00:00 2001 From: Dechen Chai Date: Tue, 29 Mar 2022 07:42:21 +0530 Subject: [PATCH 16/22] Revert "ASOC: Disable Temperature sensor of WSA881x for bengal" This reverts commit d1644ff55dc65e241c8ca4fff0bca00e3dc38dcf. Change-Id: Iac9a0d8128bbce516ea147a70f0266d256a0f3c3 Signed-off-by: Dechen Chai --- config/bengalauto.conf | 1 - config/bengalautoconf.h | 37 +------------------------------------ 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/config/bengalauto.conf b/config/bengalauto.conf index 8f2dc3bd953f..f51e7be98f4f 100644 --- a/config/bengalauto.conf +++ b/config/bengalauto.conf @@ -3,7 +3,6 @@ CONFIG_AUDIO_EXT_CLK=m CONFIG_SND_SOC_WCD9XXX_V2=m CONFIG_SND_SOC_WCD_MBHC=m CONFIG_SND_SOC_WSA881X_ANALOG=m -CONFIG_WSA881X_TEMP_SENSOR_DISABLE=m CONFIG_WCD9XXX_CODEC_CORE_V2=m CONFIG_MSM_CDC_PINCTRL=m CONFIG_MSM_QDSP6V2_CODECS=m diff --git a/config/bengalautoconf.h b/config/bengalautoconf.h index b74279a8689a..42d962160927 100644 --- a/config/bengalautoconf.h +++ b/config/bengalautoconf.h @@ -1,39 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. - * - * Changes from Qualcomm Innovation Center are provided under the following license: - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted (subject to the limitations in the - * disclaimer below) provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * * Neither the name of Qualcomm Innovation Center, Inc. nor the - * names of its contributors may be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE - * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT - * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. */ #define CONFIG_PINCTRL_LPI 1 @@ -41,7 +7,6 @@ #define CONFIG_SND_SOC_WCD9XXX_V2 1 #define CONFIG_SND_SOC_WCD_MBHC 1 #define CONFIG_SND_SOC_WSA881X_ANALOG 1 -#define CONFIG_WSA881X_TEMP_SENSOR_DISABLE 1 #define CONFIG_WCD9XXX_CODEC_CORE_V2 1 #define CONFIG_MSM_CDC_PINCTRL 1 #define CONFIG_MSM_QDSP6V2_CODECS 1 From 34b8f2e9bd0c41fb607bf8b6c895134c9dcf3e23 Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Thu, 24 Mar 2022 20:16:36 +0800 Subject: [PATCH 17/22] asoc: wsa881x: Fix panic on stress reboot Fix panic issue on stress reboot test. 1. Change waiting flag to indicate analog client device init completely. The new waiting flag can guarantee the analog client pointer is initilized. 2. Exit with EPROBE_DEFER while timeout on waiting flag. There is low frequency that sound card and analog client device go into same deffer probe worker. In this case, analog client device will not be probed till sound card devie probed. Then, sound card probe function call analog client device to get temparatue, this caused null pointer panic. Change-Id: Ib0e078e5591e14e5cdb69875213b8e7d403e559b --- asoc/codecs/wsa881x-analog.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/asoc/codecs/wsa881x-analog.c b/asoc/codecs/wsa881x-analog.c index 14d027ac141f..965fc56831ed 100755 --- a/asoc/codecs/wsa881x-analog.c +++ b/asoc/codecs/wsa881x-analog.c @@ -274,7 +274,8 @@ static int wsa881x_i2c_read_device(struct wsa881x_pdata *wsa881x, } pr_debug("read success reg = %x val = %x\n", reg, val); - } else { + } else if (wsa881x->client[wsa881x_index]) { + reg_addr = (u8)reg; msg = &wsa881x->xfer_msg[0]; msg->addr = wsa881x->client[wsa881x_index]->addr; @@ -302,6 +303,9 @@ static int wsa881x_i2c_read_device(struct wsa881x_pdata *wsa881x, } } val = dest[0]; + } else { + pr_err("failed for i2c client is not initilized\n"); + return -EINVAL; } return val; } @@ -1202,15 +1206,16 @@ static int wsa881x_probe(struct snd_soc_component *component) wsa881x_temp_reg_read; snd_soc_component_set_drvdata(component, &wsa_pdata[wsa881x_index]); while (retry) { - if (wsa_pdata[wsa881x_index].regmap[WSA881X_ANALOG_SLAVE] - != NULL) + if (wsa_pdata[wsa881x_index].regmap_flag) break; msleep(100); retry--; } - if (!retry) + if (!retry) { dev_err(&client->dev, "%s: max retry expired and regmap of\n" "analog slave not initilized\n", __func__); + return -EPROBE_DEFER; + } wsa881x_init_thermal(&wsa_pdata[wsa881x_index].tz_pdata); INIT_DELAYED_WORK(&wsa_pdata[wsa881x_index].ocp_ctl_work, wsa881x_ocp_ctl_work); From 4dad88ac993a5efea7770328913aa3ba43eb5111 Mon Sep 17 00:00:00 2001 From: Abhinav Gaur Date: Wed, 22 Dec 2021 10:33:46 +0530 Subject: [PATCH 18/22] ASOC: automotive routing drivers base version Branch out from mainline and create separate routing driver for automotive platform for boot KPI optimization. Parent commit id for the base routing driver version for tracking purpose : commit dd9977f073f1bcd93a0515aa529afa053989bb54 Change-Id: I64b89bafb304d403efd08850a72830100939c3ba Signed-off-by: Abhinav Gaur --- asoc/Kbuild | 16 +- asoc/msm-pcm-routing-auto.c | 43366 ++++++++++++++++++++++++++++++++++ asoc/msm_dailink.h | 16 + asoc/platform_init_auto.c | 61 + asoc/sa6155.c | 6 +- asoc/sa8155.c | 6 +- 6 files changed, 43461 insertions(+), 10 deletions(-) create mode 100755 asoc/msm-pcm-routing-auto.c mode change 100755 => 100644 asoc/msm_dailink.h create mode 100644 asoc/platform_init_auto.c mode change 100755 => 100644 asoc/sa6155.c diff --git a/asoc/Kbuild b/asoc/Kbuild index 8276d7df6000..8f105ae11d28 100644 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -210,11 +210,19 @@ ifdef CONFIG_SND_SOC_QDSP6V2 PLATFORM_OBJS += msm-pcm-loopback-v2.o PLATFORM_OBJS += msm-pcm-q6-noirq.o PLATFORM_OBJS += msm-pcm-q6-v2.o - PLATFORM_OBJS += msm-pcm-routing-v2.o - PLATFORM_OBJS += msm-pcm-voice-v2.o - PLATFORM_OBJS += msm-pcm-voip-v2.o + ifeq (y,$(findstring y,$(CONFIG_QTI_QUIN_GVM) $(CONFIG_PLATFORM_AUTO))) + PLATFORM_OBJS += msm-pcm-routing-auto.o + else + PLATFORM_OBJS += msm-pcm-routing-v2.o + PLATFORM_OBJS += msm-pcm-voice-v2.o + PLATFORM_OBJS += msm-pcm-voip-v2.o + endif PLATFORM_OBJS += msm-transcode-loopback-q6-v2.o - PLATFORM_OBJS += platform_init.o + ifeq (y,$(findstring y,$(CONFIG_QTI_QUIN_GVM) $(CONFIG_PLATFORM_AUTO))) + PLATFORM_OBJS += platform_init_auto.o + else + PLATFORM_OBJS += platform_init.o + endif endif ifdef CONFIG_WCD9XXX_CODEC_CORE PLATFORM_OBJS += msm-dai-slim.o diff --git a/asoc/msm-pcm-routing-auto.c b/asoc/msm-pcm-routing-auto.c new file mode 100755 index 000000000000..8d8a5931bbe7 --- /dev/null +++ b/asoc/msm-pcm-routing-auto.c @@ -0,0 +1,43366 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include