From 915b9b813574753125b6b4f4b73c29cd50ca4f6a Mon Sep 17 00:00:00 2001 From: Shuai Zhang Date: Wed, 23 Mar 2022 11:47:00 +0530 Subject: [PATCH 01/10] 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 34b8f2e9bd0c41fb607bf8b6c895134c9dcf3e23 Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Thu, 24 Mar 2022 20:16:36 +0800 Subject: [PATCH 02/10] 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 2812ff7a9656fb0d2bc4794cd0359ff88aaafbdc Mon Sep 17 00:00:00 2001 From: Faiz Nabi Kuchay Date: Tue, 5 Apr 2022 12:49:59 +0530 Subject: [PATCH 03/10] ASoC: wcd937x: Add check for ULP irrespective of the Class Add check for ULP mode irrespective of the Class to update QCRG sequence. Change-Id: Ie314aec147083df2b7db3e2769e3ff652d13c7de --- asoc/codecs/wcd937x/wcd937x.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index a563dca20e81..24de137ad11f 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -505,7 +505,8 @@ static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, 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_read32(component, + WCD937X_ANA_HPH) & 0x0C) == 0x0C)) snd_soc_component_update_bits(component, WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90); if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) @@ -551,7 +552,8 @@ static int wcd937x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, 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_read32(component, + WCD937X_ANA_HPH) & 0x0C) == 0x0C)) snd_soc_component_update_bits(component, WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x80); snd_soc_component_update_bits(component, @@ -589,7 +591,8 @@ static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, 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_read32(component, + WCD937X_ANA_HPH) & 0x0C) == 0x0C)) snd_soc_component_update_bits(component, WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x90); if (hph_mode == CLS_AB_HIFI || hph_mode == CLS_H_HIFI) @@ -635,7 +638,8 @@ static int wcd937x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, 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_read32(component, + WCD937X_ANA_HPH) & 0x0C) == 0x0C)) snd_soc_component_update_bits(component, WCD937X_RX_BIAS_HPH_LOWPOWER, 0xF0, 0x80); snd_soc_component_update_bits(component, From 1bda71f4ff928c3ecee247ec412de0d9c5e9cf85 Mon Sep 17 00:00:00 2001 From: Arungopal Kondaveeti Date: Thu, 31 Mar 2022 01:06:10 +0530 Subject: [PATCH 04/10] asoc: msm-pcm-routing: Assign default topology when app_type is zero In normal cases audio hal will sent proper ACDB and APP type values but in some cases if app type becomes zero.Assign default topology when app_type is zero. Change-Id: Id588308650f823f7d94ffb1fd2d7656d4bcf9cb2 Signed-off-by: Arungopal Kondaveeti --- asoc/msm-pcm-routing-v2.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 48c0cbe15108..3787dce7dc9c 100755 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -1721,10 +1721,13 @@ done: EXPORT_SYMBOL(msm_pcm_routing_get_stream_app_type_cfg); static struct cal_block_data *msm_routing_find_topology_by_path(int path, - int cal_index) + int cal_index, + int app_type, + int acdb_id) { struct list_head *ptr, *next; struct cal_block_data *cal_block = NULL; + struct audio_cal_info_adm_top *cal_info; pr_debug("%s\n", __func__); list_for_each_safe(ptr, next, @@ -1735,9 +1738,11 @@ static struct cal_block_data *msm_routing_find_topology_by_path(int path, if (cal_utils_is_cal_stale(cal_block)) continue; - - if (((struct audio_cal_info_adm_top *)cal_block - ->cal_info)->path == path) { + cal_info = (struct audio_cal_info_adm_top *) + cal_block->cal_info; + if ((cal_info->path == path) && + (cal_info->app_type == app_type) && + (cal_info->acdb_id == acdb_id)) { return cal_block; } } @@ -1778,7 +1783,9 @@ static struct cal_block_data *msm_routing_find_topology(int path, "acdb_id %d %s\n", __func__, path, app_type, acdb_id, exact ? "fail" : "defaulting to search by path"); return exact ? NULL : msm_routing_find_topology_by_path(path, - cal_index); + cal_index, + app_type, + acdb_id); } static struct cal_block_data *msm_routing_find_topology_by_buf_number(int usecase, int path, From 4ea134d0318c8e5962150dfe0adf9015bf70936d Mon Sep 17 00:00:00 2001 From: E V Ravi Date: Wed, 6 Apr 2022 19:26:42 +0530 Subject: [PATCH 05/10] asoc: get and put for SEC_TDM_RX_0/TX_0 ADM channels Enables get/put for SEC_TDM_RX_0/TX_0 ADM channels. Change-Id: Idb38903e5e7cc1af64735e2cd62a2b6cda8cb22e Signed-off-by: E V Ravi --- asoc/msm-pcm-routing-auto.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/asoc/msm-pcm-routing-auto.c b/asoc/msm-pcm-routing-auto.c index dd40eb0c5c31..8a98054e3d23 100755 --- a/asoc/msm-pcm-routing-auto.c +++ b/asoc/msm-pcm-routing-auto.c @@ -3702,6 +3702,12 @@ static int msm_routing_adm_get_backend_idx(struct snd_kcontrol *kcontrol) backend_id = MSM_BACKEND_DAI_SLIMBUS_7_TX; } else if (strnstr(kcontrol->id.name, "TERT_TDM_TX_0", sizeof("TERT_TDM_TX_0"))) { backend_id = MSM_BACKEND_DAI_TERT_TDM_TX_0; + } else if (strnstr(kcontrol->id.name, "TERT_TDM_RX_0", sizeof("TERT_TDM_RX_0"))) { + backend_id = MSM_BACKEND_DAI_TERT_TDM_RX_0; + } else if (strnstr(kcontrol->id.name, "SEC_TDM_TX_0", sizeof("SEC_TDM_TX_0"))) { + backend_id = MSM_BACKEND_DAI_SEC_TDM_TX_0; + } else if (strnstr(kcontrol->id.name, "SEC_TDM_RX_0", sizeof("SEC_TDM_RX_0"))) { + backend_id = MSM_BACKEND_DAI_SEC_TDM_RX_0; } else { pr_err("%s: unsupported backend id: %s", __func__, kcontrol->id.name); @@ -3752,6 +3758,15 @@ static const struct snd_kcontrol_new adm_channel_config_controls[] = { SOC_ENUM_EXT("TERT_TDM_TX_0 ADM Channels", adm_override_chs, msm_routing_adm_channel_config_get, msm_routing_adm_channel_config_put), + SOC_ENUM_EXT("TERT_TDM_RX_0 ADM Channels", adm_override_chs, + msm_routing_adm_channel_config_get, + msm_routing_adm_channel_config_put), + SOC_ENUM_EXT("SEC_TDM_TX_0 ADM Channels", adm_override_chs, + msm_routing_adm_channel_config_get, + msm_routing_adm_channel_config_put), + SOC_ENUM_EXT("SEC_TDM_RX_0 ADM Channels", adm_override_chs, + msm_routing_adm_channel_config_get, + msm_routing_adm_channel_config_put), }; static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol, From 4ea24157b3e0384933e3ad9465cd7a49ebc715ec Mon Sep 17 00:00:00 2001 From: Abhinav Gaur Date: Mon, 7 Mar 2022 11:56:24 +0530 Subject: [PATCH 06/10] asoc: Disable chmixer override flag Disable chmixer override flag to prevent override of chmixer configurations by playback set channel map call. Signed-off-by: Abhinav Gaur --- asoc/msm-pcm-routing-auto.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/asoc/msm-pcm-routing-auto.c b/asoc/msm-pcm-routing-auto.c index dd40eb0c5c31..cbd2b493047a 100755 --- a/asoc/msm-pcm-routing-auto.c +++ b/asoc/msm-pcm-routing-auto.c @@ -1456,6 +1456,8 @@ int msm_pcm_routing_set_channel_mixer_cfg( struct msm_pcm_channel_mixer *params) { int i, j = 0; + int num_ch_input_map = 0; + int num_ch_out_map = 0; channel_mixer_v2[fe_id][type].enable = params->enable; channel_mixer_v2[fe_id][type].rule = params->rule; @@ -1465,12 +1467,18 @@ int msm_pcm_routing_set_channel_mixer_cfg( params->output_channel; channel_mixer_v2[fe_id][type].port_idx = params->port_idx; - for (i = 0; i < ADM_MAX_CHANNELS; i++) + for (i = 0; i < ADM_MAX_CHANNELS; i++) { channel_mixer_v2[fe_id][type].in_ch_map[i] = params->in_ch_map[i]; - for (i = 0; i < ADM_MAX_CHANNELS; i++) + if (channel_mixer_v2[fe_id][type].in_ch_map[i] > 0) + num_ch_input_map++; + } + for (i = 0; i < ADM_MAX_CHANNELS; i++) { channel_mixer_v2[fe_id][type].out_ch_map[i] = params->out_ch_map[i]; + if (channel_mixer_v2[fe_id][type].out_ch_map[i] > 0) + num_ch_out_map++; + } for (i = 0; i < ADM_MAX_CHANNELS; i++) for (j = 0; j < ADM_MAX_CHANNELS; j++) @@ -1481,7 +1489,14 @@ int msm_pcm_routing_set_channel_mixer_cfg( params->override_in_ch_map; channel_mixer_v2[fe_id][type].override_out_ch_map = params->override_out_ch_map; - + if (channel_mixer_v2[fe_id][type].input_channel != num_ch_input_map && channel_mixer_v2[fe_id][type].override_in_ch_map) { + channel_mixer_v2[fe_id][type].override_in_ch_map =false; + pr_info("%s: mismatched with num_ch_input_map %d override_in_ch_map set to false \n", __func__,num_ch_input_map); + } + if (channel_mixer_v2[fe_id][type].output_channel != num_ch_out_map && channel_mixer_v2[fe_id][type].override_out_ch_map) { + channel_mixer_v2[fe_id][type].override_out_ch_map =false; + pr_info("%s: mismatched with num_ch_out_map %d override_out_ch_map set to false \n", __func__,num_ch_out_map); + } return 0; } EXPORT_SYMBOL(msm_pcm_routing_set_channel_mixer_cfg); From d728324529d6ec0d9f8618851b0637ddfd35f1d1 Mon Sep 17 00:00:00 2001 From: fei tong Date: Tue, 8 Mar 2022 11:42:27 +0800 Subject: [PATCH 07/10] ipc: apr: Add config to control the ipc context print Add CONFIG_IPC_LOGGING block for the code that initialize the logging context. Change-Id: Ia5d8e5a579573e0ebce65ceb5798a7c2e0fd333f Signed-off-by: ftong --- ipc/apr.c | 2 ++ ipc/apr_vm.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ipc/apr.c b/ipc/apr.c index 25a052014de6..55d834de0e00 100755 --- a/ipc/apr.c +++ b/ipc/apr.c @@ -1214,10 +1214,12 @@ static int apr_probe(struct platform_device *pdev) return -ENOMEM; } +#ifdef CONFIG_IPC_LOGGING apr_pkt_ctx = ipc_log_context_create(APR_PKT_IPC_LOG_PAGE_CNT, "apr", 0); if (!apr_pkt_ctx) pr_err("%s: Unable to create ipc log context\n", __func__); +#endif /* CONFIG_IPC_LOGGING */ spin_lock(&apr_priv->apr_lock); apr_priv->is_initial_boot = true; diff --git a/ipc/apr_vm.c b/ipc/apr_vm.c index 6f4d4580d79a..a79f64d0bcbd 100644 --- a/ipc/apr_vm.c +++ b/ipc/apr_vm.c @@ -1421,10 +1421,12 @@ static int apr_probe(struct platform_device *pdev) return -ENOMEM; } +#ifdef CONFIG_IPC_LOGGING apr_pkt_ctx = ipc_log_context_create(APR_PKT_IPC_LOG_PAGE_CNT, "apr", 0); if (!apr_pkt_ctx) pr_err("%s: Unable to create ipc log context\n", __func__); +#endif /* CONFIG_IPC_LOGGING */ ret = of_property_read_string(pdev->dev.of_node, "qcom,subsys-name", From a5cac99417d131c9ccf6922528bf1e9f81f949c5 Mon Sep 17 00:00:00 2001 From: Hexuan Zhu Date: Wed, 13 Apr 2022 12:12:19 +0800 Subject: [PATCH 08/10] audio-kernel: add ar conf in makefie Use CONFIG_SND_SOC_AR to load ar conf for audio kernel. Change-Id:I2598d21b28cfd02083d42116dcab4f25800bd089 Signed-off-by: Hexuan Zhu --- Makefile.am | 14 +++++++++++--- asoc/Kbuild | 5 +++++ asoc/codecs/Kbuild | 5 +++++ config/arauto.conf | 19 +++++++++++++++++++ config/arautoconf.h | 27 +++++++++++++++++++++++++++ dsp/Kbuild | 5 +++++ ipc/Kbuild | 5 +++++ soc/Kbuild | 5 +++++ 8 files changed, 82 insertions(+), 3 deletions(-) mode change 100644 => 100755 asoc/Kbuild create mode 100755 config/arauto.conf create mode 100755 config/arautoconf.h diff --git a/Makefile.am b/Makefile.am index 5e3faccf5492..207f76746eb3 100755 --- a/Makefile.am +++ b/Makefile.am @@ -44,7 +44,7 @@ obj-m += asoc/codecs/bolero/ obj-m += asoc/codecs/wcd937x/ endif -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sa8155 sa8155ivi sa6155 sa8195 qtiquingvm qtiquingvm8295 sa8295 qtigvmi3)) +ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sa8155 sa8155ivi sa6155 sa8195 qtiquingvm qtiquingvm8295 sa8295)) KBUILD_OPTIONS += CONFIG_SND_SOC_AUTO=y obj-m := ipc/ obj-m += dsp/ @@ -57,14 +57,22 @@ endif ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), sa6155)) KBUILD_OPTIONS += CONFIG_SND_SOC_SA6155=m endif -ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), qtiquingvm qtigvmi3)) +ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), qtiquingvm)) KBUILD_OPTIONS += CONFIG_SND_SOC_GVM=m endif ifeq ($(TARGET_SUPPORT), $(filter $(TARGET_SUPPORT), qtiquingvm8295)) KBUILD_OPTIONS += CONFIG_SND_SOC_GVM_SA8295=m endif endif - +ifeq ($(AR_SUPPORT), $(filter $(AR_SUPPORT), yes)) +obj-m := ipc/ +obj-m += dsp/ +obj-m += asoc/ +obj-m += asoc/codecs/ +obj-m += soc/ +KBUILD_OPTIONS += CONFIG_SND_SOC_AUTO=y +KBUILD_OPTIONS += CONFIG_SND_SOC_AR=m +endif all: $(shell rm -fr $(shell pwd)/soc/core.h) $(shell ln -s $(KERNEL_SRC)/drivers/pinctrl/core.h $(shell pwd)/soc/core.h) diff --git a/asoc/Kbuild b/asoc/Kbuild old mode 100644 new mode 100755 index 8f105ae11d28..84aaa73b3eeb --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -29,6 +29,11 @@ ifeq ($(CONFIG_SND_SOC_AUTO), y) export INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h endif + ifdef CONFIG_SND_SOC_AR + include $(AUDIO_ROOT)/config/arauto.conf + export + INCS += -include $(AUDIO_ROOT)/config/arautoconf.h + endif ifdef CONFIG_SND_SOC_GVM_SA8295 include $(AUDIO_ROOT)/config/sa8295gvmauto.conf export diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index 0e842ee1bf6c..8f19011f6f02 100755 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -29,6 +29,11 @@ ifeq ($(CONFIG_SND_SOC_AUTO), y) export INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h endif + ifdef CONFIG_SND_SOC_AR + include $(AUDIO_ROOT)/config/arauto.conf + export + INCS += -include $(AUDIO_ROOT)/config/arautoconf.h + endif ifdef CONFIG_SND_SOC_GVM_SA8295 include $(AUDIO_ROOT)/config/sa8295gvmauto.conf export diff --git a/config/arauto.conf b/config/arauto.conf new file mode 100755 index 000000000000..36eb6be8a26f --- /dev/null +++ b/config/arauto.conf @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (c) 2021, The Linux Foundation. All rights reserved. + +ifeq ($(CONFIG_QGKI), y) +export CONFIG_SND_SOC_GVM_AUTO_SPF=m +export CONFIG_MSM_QDSP6_APRV2_VM=m +export CONFIG_MSM_QDSP6_SSR=m +export CONFIG_MSM_ADSP_LOADER=m +export CONFIG_MSM_QDSP6_NOTIFIER=m +export CONFIG_SND_SOC_MSM_QDSP6V2_VM=m +export CONFIG_SND_SOC_QDSP6V2=m +export CONFIG_QTI_PP=m +export CONFIG_SND_HWDEP_ROUTING=m +export CONFIG_SND_SOC_MSM_STUB=m +export CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m +export CONFIG_MSM_QDSP6V2_CODECS=m +export CONFIG_SND_EVENT=m +export CONFIG_SND_SOC_SA8155=m +endif \ No newline at end of file diff --git a/config/arautoconf.h b/config/arautoconf.h new file mode 100755 index 000000000000..6e28cae199ca --- /dev/null +++ b/config/arautoconf.h @@ -0,0 +1,27 @@ +/* Copyright (c) 2018-2019, 2021 The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define CONFIG_SND_SOC_GVM_AUTO_SPF 1 +#define CONFIG_MSM_QDSP6_APRV2_VM 1 +#define CONFIG_MSM_ADSP_LOADER 1 +#define CONFIG_MSM_QDSP6_SSR 1 +#define CONFIG_MSM_QDSP6_NOTIFIER 1 +#define CONFIG_SND_SOC_MSM_QDSP6V2_VM 1 +#define CONFIG_SND_SOC_QDSP6V2 1 +#define CONFIG_QTI_PP 1 +#define CONFIG_SND_HWDEP_ROUTING 1 +#define CONFIG_SND_SOC_MSM_STUB 1 +#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 +#define CONFIG_MSM_QDSP6V2_CODECS 1 +#define CONFIG_SND_EVENT 1 +#define CONFIG_SND_SOC_SA8155 1 + diff --git a/dsp/Kbuild b/dsp/Kbuild index 788a7d3c5a28..2c5506ff7c5c 100755 --- a/dsp/Kbuild +++ b/dsp/Kbuild @@ -29,6 +29,11 @@ ifeq ($(CONFIG_SND_SOC_AUTO), y) export INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h endif + ifdef CONFIG_SND_SOC_AR + include $(AUDIO_ROOT)/config/arauto.conf + export + INCS += -include $(AUDIO_ROOT)/config/arautoconf.h + endif ifdef CONFIG_SND_SOC_GVM_SA8295 include $(AUDIO_ROOT)/config/sa8295gvmauto.conf export diff --git a/ipc/Kbuild b/ipc/Kbuild index 1d76bae1069e..06a1f42b9063 100755 --- a/ipc/Kbuild +++ b/ipc/Kbuild @@ -30,6 +30,11 @@ ifeq ($(CONFIG_SND_SOC_AUTO), y) export INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h endif + ifdef CONFIG_SND_SOC_AR + include $(AUDIO_ROOT)/config/arauto.conf + export + INCS += -include $(AUDIO_ROOT)/config/arautoconf.h + endif ifdef CONFIG_SND_SOC_GVM_SA8295 include $(AUDIO_ROOT)/config/sa8295gvmauto.conf export diff --git a/soc/Kbuild b/soc/Kbuild index 8ddec0d2625e..edb9aeee478b 100755 --- a/soc/Kbuild +++ b/soc/Kbuild @@ -29,6 +29,11 @@ ifeq ($(CONFIG_SND_SOC_AUTO), y) export INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h endif + ifdef CONFIG_SND_SOC_AR + include $(AUDIO_ROOT)/config/arauto.conf + export + INCS += -include $(AUDIO_ROOT)/config/arautoconf.h + endif ifdef CONFIG_SND_SOC_GVM_SA8295 include $(AUDIO_ROOT)/config/sa8295gvmauto.conf export From 21433bb50c13796cc6f06381404a5b0b078f469e Mon Sep 17 00:00:00 2001 From: Soumya Managoli Date: Wed, 13 Apr 2022 12:01:53 +0530 Subject: [PATCH 09/10] ASoC: codecs: Force enable micbias standalone Code to enable micbias standalone irrespective of wcd enable or disable. Change-Id: If2052fc690e5e1110ebdbf6f9c6dbafc3bc8c493 Signed-off-by: Soumya Managoli --- asoc/codecs/wcd938x/internal.h | 2 + asoc/codecs/wcd938x/wcd938x.c | 98 ++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/asoc/codecs/wcd938x/internal.h b/asoc/codecs/wcd938x/internal.h index 7da5b36875f7..9a86ddf4bf8f 100644 --- a/asoc/codecs/wcd938x/internal.h +++ b/asoc/codecs/wcd938x/internal.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _WCD938X_INTERNAL_H @@ -110,6 +111,7 @@ struct wcd938x_priv { /* wcd to swr dmic notification */ bool notify_swr_dmic; struct blocking_notifier_head notifier; + int micb_enabled[WCD938X_MAX_MICBIAS]; }; struct wcd938x_micbias_setting { diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index b8e05ae02f33..eae9dfb280b2 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -2919,6 +2920,95 @@ static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, return 0; } +/* + * wcd938x_codec_enable_standalone_micbias - enable micbias standalone + * @component: pointer to component instance + * @micb_num: number of micbias to be enabled + * @enable: true to enable micbias or false to disable + * + * This function is used to enable micbias (1, 2, 3 or 4) during + * standalone independent of whether TX use-case is running or not + * + * Return: error code in case of failure or 0 for success + */ + +int wcd938x_codec_enable_standalone_micbias(struct snd_soc_component *component, + int micb_num, + bool enable) +{ + const char * const micb_names[] = { + DAPM_MICBIAS1_STANDALONE, DAPM_MICBIAS2_STANDALONE, + DAPM_MICBIAS3_STANDALONE, DAPM_MICBIAS4_STANDALONE + }; + int micb_index = micb_num - 1; + int rc; + struct snd_soc_dapm_context *dapm = + snd_soc_component_get_dapm(component); + + if ((micb_index < 0) || (micb_index > WCD938X_MAX_MICBIAS - 1)) { + dev_err(component->dev, "%s: Invalid micbias index, micb_ind:%d\n", + __func__, micb_index); + return -EINVAL; + } + + if (enable) + rc = snd_soc_dapm_force_enable_pin( + dapm, + micb_names[micb_index]); + else + rc = snd_soc_dapm_disable_pin( + dapm, + micb_names[micb_index]); + if (!rc) + snd_soc_dapm_sync(dapm); + else + dev_err(component->dev, "%s: micbias%d force %s pin failed\n", + __func__, micb_num, (enable ? "enable" : "disable")); + + return rc; +} +EXPORT_SYMBOL(wcd938x_codec_enable_standalone_micbias); + +static int wcd938x_get_micbias(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); + int micb_num = ((struct soc_multi_mixer_control *) + kcontrol->private_value)->shift; + + ucontrol->value.integer.value[0] = wcd938x->micb_enabled[micb_num - 1]; + return 0; +} + +static int wcd938x_set_micbias(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); + int micb_num = ((struct soc_multi_mixer_control *) + kcontrol->private_value)->shift; + int value = ucontrol->value.integer.value[0]; + bool enable; + int ret; + + if ((micb_num != MIC_BIAS_1) && (micb_num != MIC_BIAS_2) && + (micb_num != MIC_BIAS_3) && (micb_num != MIC_BIAS_4)) + return -EINVAL; + + enable = !!value; + ret = wcd938x_codec_enable_standalone_micbias(component, micb_num, + enable); + if (ret) { + dev_err(component->dev, "%s: Failed to enable standalone micb:%d\n", + __func__, micb_num); + return ret; + } + + wcd938x->micb_enabled[micb_num - 1] = enable; + return ret; +} + static const char * const tx_mode_mux_text_wcd9380[] = { "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", }; @@ -3045,6 +3135,14 @@ static const struct snd_kcontrol_new wcd938x_snd_controls[] = { wcd938x_tx_master_ch_get, wcd938x_tx_master_ch_put), SOC_ENUM_EXT("DMIC7 ChMap", tx_master_ch_enum, wcd938x_tx_master_ch_get, wcd938x_tx_master_ch_put), + SOC_SINGLE_EXT("MIC BIAS1 Standalone", SND_SOC_NOPM, MIC_BIAS_1, 1, 0, + wcd938x_get_micbias, wcd938x_set_micbias), + SOC_SINGLE_EXT("MIC BIAS2 Standalone", SND_SOC_NOPM, MIC_BIAS_2, 1, 0, + wcd938x_get_micbias, wcd938x_set_micbias), + SOC_SINGLE_EXT("MIC BIAS3 Standalone", SND_SOC_NOPM, MIC_BIAS_3, 1, 0, + wcd938x_get_micbias, wcd938x_set_micbias), + SOC_SINGLE_EXT("MIC BIAS4 Standalone", SND_SOC_NOPM, MIC_BIAS_4, 1, 0, + wcd938x_get_micbias, wcd938x_set_micbias), }; static const struct snd_kcontrol_new adc1_switch[] = { From 959e7370315983f9e7463a2e6990f1ffb2028775 Mon Sep 17 00:00:00 2001 From: ftong Date: Fri, 1 Apr 2022 11:46:26 +0800 Subject: [PATCH 10/10] asoc: Add LLNP mode support Add LLNP mode support to enable ULL capture. Change-Id: I25fa565a3a4c7e8925623402d45b3d25051dba4c --- asoc/msm-pcm-q6-v2.c | 7 ++++++- asoc/sa8155.c | 1 + dsp/q6asm.c | 7 ++++++- include/dsp/apr_audio-v2.h | 3 +++ 4 files changed, 16 insertions(+), 2 deletions(-) mode change 100755 => 100644 asoc/msm-pcm-q6-v2.c mode change 100755 => 100644 dsp/q6asm.c mode change 100755 => 100644 include/dsp/apr_audio-v2.h diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c old mode 100755 new mode 100644 index 70fc54190027..037885635cce --- a/asoc/msm-pcm-q6-v2.c +++ b/asoc/msm-pcm-q6-v2.c @@ -751,9 +751,11 @@ static int msm_pcm_capture_prepare(struct snd_pcm_substream *substream) else if (params_format(params) == SNDRV_PCM_FORMAT_S32_LE) bits_per_sample = 32; - /* ULL mode is not supported in capture path */ + /* ULL mode is not supported in capture path so using LLNP insted of ULL */ if (pdata->perf_mode == LEGACY_PCM_MODE) prtd->audio_client->perf_mode = LEGACY_PCM_MODE; + else if (pdata->perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) + prtd->audio_client->perf_mode = LOW_LATENCY_PCM_NOPROC_MODE; else prtd->audio_client->perf_mode = LOW_LATENCY_PCM_MODE; @@ -3774,6 +3776,9 @@ static int msm_pcm_probe(struct platform_device *pdev) else if (!strcmp(latency_level, "ull-pp")) pdata->perf_mode = ULL_POST_PROCESSING_PCM_MODE; + else if (!strcmp(latency_level, "llnp")) + pdata->perf_mode = + LOW_LATENCY_PCM_NOPROC_MODE; } } else { pdata->perf_mode = LEGACY_PCM_MODE; diff --git a/asoc/sa8155.c b/asoc/sa8155.c index 138df88a73d2..e0292f83bd79 100644 --- a/asoc/sa8155.c +++ b/asoc/sa8155.c @@ -7582,6 +7582,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = { .async_ops = ASYNC_DPCM_SND_SOC_PREPARE, #endif /* CONFIG_AUDIO_QGKI */ .dpcm_playback = 1, + .dpcm_capture = 1, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .ignore_suspend = 1, diff --git a/dsp/q6asm.c b/dsp/q6asm.c old mode 100755 new mode 100644 index 9bcf3a0eaeb8..167ea186fff3 --- a/dsp/q6asm.c +++ b/dsp/q6asm.c @@ -3367,7 +3367,12 @@ static int __q6asm_open_read(struct audio_client *ac, if (ac->perf_mode == LOW_LATENCY_PCM_MODE) { open.mode_flags |= ASM_LOW_LATENCY_TX_STREAM_SESSION << ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; - } else { + } + else if (ac->perf_mode == LOW_LATENCY_PCM_NOPROC_MODE) { + open.mode_flags |= ASM_LOW_LATENCY_NPROC_TX_STREAM_SESSION << + ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; + } + else { open.mode_flags |= ASM_LEGACY_STREAM_SESSION << ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ; } diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h old mode 100755 new mode 100644 index c742d20aea54..f37ce1c96371 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -8281,6 +8281,9 @@ struct asm_stream_cmd_open_shared_io { /* Bit value for Low Latency Tx stream subfield */ #define ASM_LOW_LATENCY_TX_STREAM_SESSION 1 +/* Bit value for Low Latency No Post Processing Tx stream subfield */ +#define ASM_LOW_LATENCY_NPROC_TX_STREAM_SESSION 3 + /* Bit shift for the stream_perf_mode subfield. */ #define ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ 29