Merge "asoc: bolero: Update tx swr clk widget for bolero 2.0"
diff --git a/asoc/bengal.c b/asoc/bengal.c
index 21287b4..c500a17 100644
--- a/asoc/bengal.c
+++ b/asoc/bengal.c
@@ -5833,6 +5833,8 @@
int rc = 0;
u32 mi2s_audio_intf = 0;
u32 auxpcm_audio_intf = 0;
+ u32 rxtx_bolero_codec = 0;
+ u32 va_bolero_codec = 0;
u32 val = 0;
u32 wcn_btfm_intf = 0;
const struct of_device_id *match;
@@ -5862,17 +5864,37 @@
sizeof(msm_common_be_dai_links));
total_links += ARRAY_SIZE(msm_common_be_dai_links);
- memcpy(msm_bengal_dai_links + total_links,
- msm_rx_tx_cdc_dma_be_dai_links,
- sizeof(msm_rx_tx_cdc_dma_be_dai_links));
- total_links +=
- ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links);
+ rc = of_property_read_u32(dev->of_node,
+ "qcom,rxtx-bolero-codec",
+ &rxtx_bolero_codec);
+ if (rc) {
+ dev_dbg(dev, "%s: No DT match RXTX Macro codec\n",
+ __func__);
+ } else {
+ if (rxtx_bolero_codec) {
+ memcpy(msm_bengal_dai_links + total_links,
+ msm_rx_tx_cdc_dma_be_dai_links,
+ sizeof(msm_rx_tx_cdc_dma_be_dai_links));
+ total_links +=
+ ARRAY_SIZE(
+ msm_rx_tx_cdc_dma_be_dai_links);
+ }
+ }
- memcpy(msm_bengal_dai_links + total_links,
- msm_va_cdc_dma_be_dai_links,
- sizeof(msm_va_cdc_dma_be_dai_links));
- total_links +=
- ARRAY_SIZE(msm_va_cdc_dma_be_dai_links);
+ rc = of_property_read_u32(dev->of_node, "qcom,va-bolero-codec",
+ &va_bolero_codec);
+ if (rc) {
+ dev_dbg(dev, "%s: No DT match VA Macro codec\n",
+ __func__);
+ } else {
+ if (va_bolero_codec) {
+ memcpy(msm_bengal_dai_links + total_links,
+ msm_va_cdc_dma_be_dai_links,
+ sizeof(msm_va_cdc_dma_be_dai_links));
+ total_links +=
+ ARRAY_SIZE(msm_va_cdc_dma_be_dai_links);
+ }
+ }
rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf",
&mi2s_audio_intf);
diff --git a/asoc/codecs/Android.mk b/asoc/codecs/Android.mk
index da39e8c..5e3114e 100644
--- a/asoc/codecs/Android.mk
+++ b/asoc/codecs/Android.mk
@@ -111,7 +111,7 @@
include $(DLKM_DIR)/AndroidKernelModule.mk
endif
###########################################################
-ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), bengal))
+ifneq ($(call is-board-platform-in-list, bengal),true)
include $(CLEAR_VARS)
LOCAL_MODULE := $(AUDIO_CHIPSET)_wsa881x.ko
LOCAL_MODULE_KBUILD_NAME := wsa881x_dlkm.ko
@@ -148,7 +148,7 @@
LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT)
include $(DLKM_DIR)/AndroidKernelModule.mk
###########################################################
-ifneq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), bengal))
+ifneq ($(call is-board-platform-in-list, bengal),true)
include $(CLEAR_VARS)
LOCAL_MODULE := $(AUDIO_CHIPSET)_hdmi.ko
LOCAL_MODULE_KBUILD_NAME := hdmi_dlkm.ko
diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c
index dde4719..ac8d693 100644
--- a/asoc/codecs/bolero/bolero-cdc.c
+++ b/asoc/codecs/bolero/bolero-cdc.c
@@ -104,21 +104,25 @@
if (priv->macro_params[VA_MACRO].dev)
pm_runtime_get_sync(priv->macro_params[VA_MACRO].dev);
- /* Request Clk before register access */
- ret = bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
+ if (priv->version < BOLERO_VERSION_2_0) {
+ /* Request Clk before register access */
+ ret = bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
priv->macro_params[macro_id].default_clk_id,
priv->macro_params[macro_id].clk_id_req,
true);
- if (ret < 0) {
- dev_err_ratelimited(priv->dev,
- "%s: Failed to enable clock, ret:%d\n", __func__, ret);
- goto err;
+ if (ret < 0) {
+ dev_err_ratelimited(priv->dev,
+ "%s: Failed to enable clock, ret:%d\n",
+ __func__, ret);
+ goto err;
+ }
}
bolero_ahb_read_device(
priv->macro_params[macro_id].io_base, reg, val);
- bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
+ if (priv->version < BOLERO_VERSION_2_0)
+ bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
priv->macro_params[macro_id].default_clk_id,
priv->macro_params[macro_id].clk_id_req,
false);
@@ -148,21 +152,25 @@
if (priv->macro_params[VA_MACRO].dev)
pm_runtime_get_sync(priv->macro_params[VA_MACRO].dev);
- /* Request Clk before register access */
- ret = bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
+ if (priv->version < BOLERO_VERSION_2_0) {
+ /* Request Clk before register access */
+ ret = bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
priv->macro_params[macro_id].default_clk_id,
priv->macro_params[macro_id].clk_id_req,
true);
- if (ret < 0) {
- dev_err_ratelimited(priv->dev,
- "%s: Failed to enable clock, ret:%d\n", __func__, ret);
- goto err;
+ if (ret < 0) {
+ dev_err_ratelimited(priv->dev,
+ "%s: Failed to enable clock, ret:%d\n",
+ __func__, ret);
+ goto err;
+ }
}
bolero_ahb_write_device(
priv->macro_params[macro_id].io_base, reg, val);
- bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
+ if (priv->version < BOLERO_VERSION_2_0)
+ bolero_clk_rsc_request_clock(priv->macro_params[macro_id].dev,
priv->macro_params[macro_id].default_clk_id,
priv->macro_params[macro_id].clk_id_req,
false);
diff --git a/asoc/codecs/msm-cdc-pinctrl.c b/asoc/codecs/msm-cdc-pinctrl.c
index cb7a52b..5c6ca49 100644
--- a/asoc/codecs/msm-cdc-pinctrl.c
+++ b/asoc/codecs/msm-cdc-pinctrl.c
@@ -196,7 +196,8 @@
struct msm_cdc_pinctrl_info *gpio_data;
u32 tlmm_gpio[MAX_GPIOS] = {0};
u32 chip_wakeup_reg[MAX_GPIOS] = {0};
- u32 i = 0;
+ u32 chip_wakeup_default_val[MAX_GPIOS] = {0};
+ u32 i = 0, temp = 0;
int count = 0;
gpio_data = devm_kzalloc(&pdev->dev,
@@ -258,6 +259,20 @@
gpio_data->chip_wakeup_register[i] =
devm_ioremap(&pdev->dev, chip_wakeup_reg[i], 0x4);
}
+ if (of_property_read_u32_array(pdev->dev.of_node,
+ "qcom,chip-wakeup-default-val",
+ chip_wakeup_default_val, count)) {
+ for (i = 0; i < count; i++) {
+ temp = ioread32(gpio_data->chip_wakeup_register[i]);
+ if (chip_wakeup_default_val[i])
+ temp |= (1 <<
+ gpio_data->chip_wakeup_maskbit[i]);
+ else
+ temp &= ~(1 <<
+ gpio_data->chip_wakeup_maskbit[i]);
+ iowrite32(temp, gpio_data->chip_wakeup_register[i]);
+ }
+ }
gpio_data->wakeup_reg_count = count;
}
diff --git a/asoc/codecs/wcd937x/internal.h b/asoc/codecs/wcd937x/internal.h
index cd11c85..faf0118 100644
--- a/asoc/codecs/wcd937x/internal.h
+++ b/asoc/codecs/wcd937x/internal.h
@@ -133,6 +133,7 @@
WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */
WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */
WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */
+ WCD_BOLERO_EVT_BCS_CLK_OFF,
};
enum {
@@ -164,6 +165,9 @@
WCD937X_NUM_IRQS,
};
+extern void wcd937x_disable_bcs_before_slow_insert(
+ struct snd_soc_component *component,
+ bool bcs_disable);
extern struct wcd937x_mbhc *wcd937x_soc_get_mbhc(
struct snd_soc_component *component);
extern int wcd937x_mbhc_micb_adjust_voltage(struct snd_soc_component *component,
diff --git a/asoc/codecs/wcd937x/wcd937x-mbhc.c b/asoc/codecs/wcd937x/wcd937x-mbhc.c
index 2159cab..039f511 100644
--- a/asoc/codecs/wcd937x/wcd937x-mbhc.c
+++ b/asoc/codecs/wcd937x/wcd937x-mbhc.c
@@ -810,6 +810,15 @@
0x04, (enable << 2));
}
+static void wcd937x_mbhc_bcs_enable(struct wcd_mbhc *mbhc,
+ bool bcs_enable)
+{
+ if (bcs_enable)
+ wcd937x_disable_bcs_before_slow_insert(mbhc->component, false);
+ else
+ wcd937x_disable_bcs_before_slow_insert(mbhc->component, true);
+}
+
static const struct wcd_mbhc_cb mbhc_cb = {
.request_irq = wcd937x_mbhc_request_irq,
.irq_control = wcd937x_mbhc_irq_control,
@@ -834,6 +843,7 @@
.mbhc_get_moisture_status = wcd937x_mbhc_get_moisture_status,
.mbhc_moisture_polling_ctrl = wcd937x_mbhc_moisture_polling_ctrl,
.mbhc_moisture_detect_en = wcd937x_mbhc_moisture_detect_en,
+ .bcs_enable = wcd937x_mbhc_bcs_enable,
};
static int wcd937x_get_hph_type(struct snd_kcontrol *kcontrol,
diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c
index 94e59d9..21325ae 100644
--- a/asoc/codecs/wcd937x/wcd937x.c
+++ b/asoc/codecs/wcd937x/wcd937x.c
@@ -1517,6 +1517,21 @@
}
EXPORT_SYMBOL(wcd937x_micbias_control);
+void wcd937x_disable_bcs_before_slow_insert(struct snd_soc_component *component,
+ bool bcs_disable)
+{
+ struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
+
+ if (wcd937x->update_wcd_event) {
+ if (bcs_disable)
+ wcd937x->update_wcd_event(wcd937x->handle,
+ WCD_BOLERO_EVT_BCS_CLK_OFF, 0);
+ else
+ wcd937x->update_wcd_event(wcd937x->handle,
+ WCD_BOLERO_EVT_BCS_CLK_OFF, 1);
+ }
+}
+
static int wcd937x_get_logical_addr(struct swr_device *swr_dev)
{
int ret = 0;
@@ -1642,6 +1657,51 @@
return __wcd937x_codec_enable_micbias(w, event);
}
+static int __wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w,
+ int event)
+{
+ struct snd_soc_component *component =
+ snd_soc_dapm_to_component(w->dapm);
+ int micb_num;
+
+ dev_dbg(component->dev, "%s: wname: %s, event: %d\n",
+ __func__, w->name, event);
+
+ if (strnstr(w->name, "VA MIC BIAS1", sizeof("VA MIC BIAS1")))
+ micb_num = MIC_BIAS_1;
+ else if (strnstr(w->name, "VA MIC BIAS2", sizeof("VA MIC BIAS2")))
+ micb_num = MIC_BIAS_2;
+ else if (strnstr(w->name, "VA MIC BIAS3", sizeof("VA MIC BIAS3")))
+ micb_num = MIC_BIAS_3;
+ else
+ return -EINVAL;
+
+ switch (event) {
+ case SND_SOC_DAPM_PRE_PMU:
+ wcd937x_micbias_control(component, micb_num,
+ MICB_PULLUP_ENABLE, true);
+ break;
+ case SND_SOC_DAPM_POST_PMU:
+ /* 1 msec delay as per HW requirement */
+ usleep_range(1000, 1100);
+ break;
+ case SND_SOC_DAPM_POST_PMD:
+ wcd937x_micbias_control(component, micb_num,
+ MICB_PULLUP_DISABLE, true);
+ break;
+ };
+
+ return 0;
+
+}
+
+static int wcd937x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol,
+ int event)
+{
+ return __wcd937x_codec_enable_micbias_pullup(w, event);
+}
+
static int wcd937x_rx_hph_mode_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -2052,6 +2112,20 @@
SND_SOC_DAPM_OUTPUT("HPHL"),
SND_SOC_DAPM_OUTPUT("HPHR"),
+ /* micbias pull up widgets*/
+ SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS1", SND_SOC_NOPM, 0, 0,
+ wcd937x_codec_enable_micbias_pullup,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+ SND_SOC_DAPM_POST_PMD),
+ SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS2", SND_SOC_NOPM, 0, 0,
+ wcd937x_codec_enable_micbias_pullup,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+ SND_SOC_DAPM_POST_PMD),
+ SND_SOC_DAPM_MICBIAS_E("VA MIC BIAS3", SND_SOC_NOPM, 0, 0,
+ wcd937x_codec_enable_micbias_pullup,
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
+ SND_SOC_DAPM_POST_PMD),
+
};
static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
diff --git a/asoc/codecs/wsa881x.c b/asoc/codecs/wsa881x.c
index 966fa8a..fc4f123 100644
--- a/asoc/codecs/wsa881x.c
+++ b/asoc/codecs/wsa881x.c
@@ -1395,6 +1395,7 @@
snd_soc_component_update_bits(wsa881x->component,
WSA881X_SPKR_DRV_EN,
0x80, 0x80);
+ break;
default:
break;
}
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index 4347bec..4560299 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -408,8 +408,8 @@
gain_list[0] = volume_l;
gain_list[1] = volume_r;
gain_list[2] = volume_l;
- num_channels = 3;
- use_default = true;
+ if (use_default)
+ num_channels = 3;
rc = q6asm_set_multich_gain(prtd->audio_client, num_channels,
gain_list, chmap, use_default);
}
diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c
index b35a1e8..e9d354b 100644
--- a/asoc/msm-dai-q6-v2.c
+++ b/asoc/msm-dai-q6-v2.c
@@ -5014,6 +5014,9 @@
SOC_ENUM_EXT("QUIN MI2S RX Format", mi2s_config_enum[0],
msm_dai_q6_mi2s_format_get,
msm_dai_q6_mi2s_format_put),
+ SOC_ENUM_EXT("SENARY MI2S RX Format", mi2s_config_enum[0],
+ msm_dai_q6_mi2s_format_get,
+ msm_dai_q6_mi2s_format_put),
SOC_ENUM_EXT("PRI MI2S TX Format", mi2s_config_enum[0],
msm_dai_q6_mi2s_format_get,
msm_dai_q6_mi2s_format_put),
@@ -5068,6 +5071,8 @@
ctrl = &mi2s_config_controls[3];
if (dai->id == MSM_QUIN_MI2S)
ctrl = &mi2s_config_controls[4];
+ if (dai->id == MSM_SENARY_MI2S)
+ ctrl = &mi2s_config_controls[5];
}
if (ctrl) {
@@ -5084,19 +5089,19 @@
ctrl = NULL;
if (mi2s_dai_data->tx_dai.mi2s_dai_data.port_config.i2s.channel_mode) {
if (dai->id == MSM_PRIM_MI2S)
- ctrl = &mi2s_config_controls[5];
- if (dai->id == MSM_SEC_MI2S)
ctrl = &mi2s_config_controls[6];
- if (dai->id == MSM_TERT_MI2S)
+ if (dai->id == MSM_SEC_MI2S)
ctrl = &mi2s_config_controls[7];
- if (dai->id == MSM_QUAT_MI2S)
+ if (dai->id == MSM_TERT_MI2S)
ctrl = &mi2s_config_controls[8];
- if (dai->id == MSM_QUIN_MI2S)
+ if (dai->id == MSM_QUAT_MI2S)
ctrl = &mi2s_config_controls[9];
- if (dai->id == MSM_SENARY_MI2S)
+ if (dai->id == MSM_QUIN_MI2S)
ctrl = &mi2s_config_controls[10];
- if (dai->id == MSM_INT5_MI2S)
+ if (dai->id == MSM_SENARY_MI2S)
ctrl = &mi2s_config_controls[11];
+ if (dai->id == MSM_INT5_MI2S)
+ ctrl = &mi2s_config_controls[12];
}
if (ctrl) {
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index ae86f7a..0c03c1e 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -17347,6 +17347,25 @@
};
+static const struct snd_kcontrol_new rx_cdc_dma_rx_1_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
+ MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
+ MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_RX,
@@ -24223,6 +24242,10 @@
SND_SOC_NOPM, 0, 0,
rx_cdc_dma_rx_0_voice_mixer_controls,
ARRAY_SIZE(rx_cdc_dma_rx_0_voice_mixer_controls)),
+ SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_1_Voice Mixer",
+ SND_SOC_NOPM, 0, 0,
+ rx_cdc_dma_rx_1_voice_mixer_controls,
+ ARRAY_SIZE(rx_cdc_dma_rx_1_voice_mixer_controls)),
SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
ARRAY_SIZE(tx_voip_mixer_controls)),
@@ -24426,6 +24449,9 @@
SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0,
rx_cdc_dma_rx_0_port_mixer_controls,
ARRAY_SIZE(rx_cdc_dma_rx_0_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0,
+ rx_cdc_dma_rx_1_port_mixer_controls,
+ ARRAY_SIZE(rx_cdc_dma_rx_1_port_mixer_controls)),
SND_SOC_DAPM_MIXER("QCHAT_Tx Mixer",
SND_SOC_NOPM, 0, 0, tx_qchat_mixer_controls,
ARRAY_SIZE(tx_qchat_mixer_controls)),
@@ -27008,6 +27034,11 @@
{"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0_Voice Mixer"},
+ {"RX_CDC_DMA_RX_1_Voice Mixer", "Voip", "VOIP_DL"},
+ {"RX_CDC_DMA_RX_1_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+ {"RX_CDC_DMA_RX_1_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
+ {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_Voice Mixer"},
+
{"VOC_EXT_EC MUX", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"VOC_EXT_EC MUX", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"VOC_EXT_EC MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
@@ -28157,6 +28188,12 @@
{"RX_CDC_DMA_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0 Port Mixer"},
+ {"RX_CDC_DMA_RX_1 Port Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
+ {"RX_CDC_DMA_RX_1 Port Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+ {"RX_CDC_DMA_RX_1 Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+ {"RX_CDC_DMA_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1 Port Mixer"},
+
{"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"SLIMBUS_0_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 6111832..7297a1e 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -110,7 +110,7 @@
wait_queue_head_t wait_wakeup;
struct task_struct *task;
wait_queue_head_t lpass_core_hw_wait;
- uint32_t lpass_hw_core_client_hdl;
+ uint32_t lpass_hw_core_client_hdl[AFE_LPASS_CORE_HW_VOTE_MAX];
void (*tx_cb)(uint32_t opcode,
uint32_t token, uint32_t *payload, void *priv);
void (*rx_cb)(uint32_t opcode,
@@ -571,6 +571,8 @@
static int32_t afe_callback(struct apr_client_data *data, void *priv)
{
+ uint16_t i = 0;
+
if (!data) {
pr_err("%s: Invalid param data\n", __func__);
return -EINVAL;
@@ -598,7 +600,8 @@
/* Reset the core client handle in SSR/PDR use cases */
mutex_lock(&this_afe.afe_cmd_lock);
- this_afe.lpass_hw_core_client_hdl = 0;
+ for (i = 0; i < AFE_LPASS_CORE_HW_VOTE_MAX; i++)
+ this_afe.lpass_hw_core_client_hdl[i] = 0;
mutex_unlock(&this_afe.afe_cmd_lock);
/*
@@ -673,7 +676,9 @@
pr_debug("%s: AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST handle %d\n",
__func__, payload[0]);
- this_afe.lpass_hw_core_client_hdl = payload[0];
+ if (data->token < AFE_LPASS_CORE_HW_VOTE_MAX)
+ this_afe.lpass_hw_core_client_hdl[data->token] =
+ payload[0];
atomic_set(&this_afe.state, 0);
atomic_set(&this_afe.status, 0);
wake_up(&this_afe.lpass_core_hw_wait);
@@ -9086,7 +9091,8 @@
this_afe.mmap_handle = 0;
this_afe.vi_tx_port = -1;
this_afe.vi_rx_port = -1;
- this_afe.lpass_hw_core_client_hdl = 0;
+ for (i = 0; i < AFE_LPASS_CORE_HW_VOTE_MAX; i++)
+ this_afe.lpass_hw_core_client_hdl[i] = 0;
this_afe.prot_cfg.mode = MSM_SPKR_PROT_DISABLED;
this_afe.th_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED;
this_afe.ex_ftm_cfg.mode = MSM_SPKR_PROT_DISABLED;
@@ -9218,7 +9224,7 @@
cmd_ptr->hdr.pkt_size = sizeof(hw_vote_cfg);
cmd_ptr->hdr.src_port = 0;
cmd_ptr->hdr.dest_port = 0;
- cmd_ptr->hdr.token = 0;
+ cmd_ptr->hdr.token = hw_block_id;
cmd_ptr->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST;
cmd_ptr->hw_block_id = hw_block_id;
strlcpy(cmd_ptr->client_name, client_name,
@@ -9259,9 +9265,9 @@
goto done;
}
- *client_handle = this_afe.lpass_hw_core_client_hdl;
+ *client_handle = this_afe.lpass_hw_core_client_hdl[hw_block_id];
pr_debug("%s: lpass_hw_core_client_hdl %d\n", __func__,
- this_afe.lpass_hw_core_client_hdl);
+ this_afe.lpass_hw_core_client_hdl[hw_block_id]);
done:
mutex_unlock(&this_afe.afe_cmd_lock);
return ret;
@@ -9291,7 +9297,7 @@
mutex_lock(&this_afe.afe_cmd_lock);
- if (!this_afe.lpass_hw_core_client_hdl) {
+ if (!this_afe.lpass_hw_core_client_hdl[hw_block_id]) {
pr_debug("%s: SSR in progress, return\n", __func__);
goto done;
}
diff --git a/dsp/q6voice.c b/dsp/q6voice.c
index 77a08ee..e0491f1 100644
--- a/dsp/q6voice.c
+++ b/dsp/q6voice.c
@@ -4297,6 +4297,7 @@
struct cvp_set_mfc_config_cmd_v2 cvp_set_mfc_config_cmd;
void *apr_cvp;
u16 cvp_handle;
+ uint8_t ch_idx;
struct vss_icommon_param_data_mfc_config_v2_t *cvp_config_param_data =
&cvp_set_mfc_config_cmd.cvp_set_mfc_param_v2.param_data;
struct vss_param_mfc_config_info_t *mfc_config_info =
@@ -4345,9 +4346,15 @@
mfc_config_info->num_channels = v->dev_rx.no_of_channels;
mfc_config_info->bits_per_sample = 16;
mfc_config_info->sample_rate = v->dev_rx.sample_rate;
- memcpy(&mfc_config_info->channel_type,
- v->dev_rx.channel_mapping,
- VSS_NUM_CHANNELS_MAX * sizeof(uint8_t));
+
+ /*
+ * Do not use memcpy here as channel_type in mfc_config structure is a
+ * uint16_t array while channel_mapping array of device is of uint8_t
+ */
+ for (ch_idx = 0; ch_idx < VSS_NUM_CHANNELS_MAX; ch_idx++) {
+ mfc_config_info->channel_type[ch_idx] =
+ v->dev_rx.channel_mapping[ch_idx];
+ }
v->cvp_state = CMD_STATUS_FAIL;
v->async_err = 0;
diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h
index d1b4f3c..9e1a0b2 100644
--- a/include/dsp/q6afe-v2.h
+++ b/include/dsp/q6afe-v2.h
@@ -483,10 +483,14 @@
int afe_get_doa_tracking_mon(u16 port_id,
struct doa_tracking_mon_param *doa_tracking_data);
-#define AFE_LPASS_CORE_HW_BLOCK_ID_NONE 0
-#define AFE_LPASS_CORE_HW_BLOCK_ID_AVTIMER 2
-#define AFE_LPASS_CORE_HW_MACRO_BLOCK 3
-#define AFE_LPASS_CORE_HW_DCODEC_BLOCK 4
+enum {
+ AFE_LPASS_CORE_HW_BLOCK_ID_NONE,
+ AFE_LPASS_CORE_HW_RSVD,
+ AFE_LPASS_CORE_HW_BLOCK_ID_AVTIMER,
+ AFE_LPASS_CORE_HW_MACRO_BLOCK,
+ AFE_LPASS_CORE_HW_DCODEC_BLOCK,
+ AFE_LPASS_CORE_HW_VOTE_MAX
+};
/* Handles audio-video timer (avtimer) and BTSC vote requests from clients.
*/