Merge "ASoC: configs: Disable voice_mhi for lito"
diff --git a/Makefile b/Makefile
index d9d093b..8daa460 100644
--- a/Makefile
+++ b/Makefile
@@ -11,10 +11,14 @@
include $(srctree)/techpack/audio/config/sm8150auto.conf
export
endif
+ifeq ($(CONFIG_ARCH_KONA), y)
+include $(srctree)/techpack/audio/config/konaauto.conf
+endif
# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE += \
-I$(srctree)/techpack/audio/include/uapi \
+ -I$(srctree)/techpack/audio/include
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
@@ -34,6 +38,10 @@
LINUXINCLUDE += \
-include $(srctree)/techpack/audio/config/sm8150autoconf.h
endif
+ifeq ($(CONFIG_ARCH_KONA), y)
+LINUXINCLUDE += \
+ -include $(srctree)/techpack/audio/config/konaautoconf.h
+endif
obj-y += soc/
obj-y += dsp/
diff --git a/asoc/Kbuild b/asoc/Kbuild
index 5ff12c6..afbda8b 100644
--- a/asoc/Kbuild
+++ b/asoc/Kbuild
@@ -86,6 +86,8 @@
# for SM6150 sound card driver
ifdef CONFIG_SND_SOC_SM6150
MACHINE_OBJS += sm6150.o
+ MACHINE_OBJS += sa8155.o
+ MACHINE_OBJS += machine_615x_init.o
endif
# for qcs405 sound card driver
diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild
index df86578..e18a40b 100644
--- a/asoc/codecs/Kbuild
+++ b/asoc/codecs/Kbuild
@@ -196,6 +196,8 @@
ifeq ($(KERNEL_BUILD), 1)
obj-y += wcd934x/
obj-y += wcd937x/
+ obj-y += wcd938x/
+ obj-y += bolero/
endif
# Module information used by KBuild framework
obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd_core_dlkm.o
diff --git a/asoc/codecs/audio-ext-clk-up.c b/asoc/codecs/audio-ext-clk-up.c
index e6e68ad..3f622d6 100644
--- a/asoc/codecs/audio-ext-clk-up.c
+++ b/asoc/codecs/audio-ext-clk-up.c
@@ -70,7 +70,7 @@
clk_priv->clk_cfg.enable = 1;
ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg);
if (ret < 0) {
- pr_err("%s afe_set_digital_codec_core_clock failed\n",
+ pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n",
__func__);
return ret;
}
@@ -112,7 +112,7 @@
clk_priv->clk_cfg.enable = 0;
ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg);
if (ret < 0)
- pr_err("%s: afe_set_lpass_clk_cfg failed, ret = %d\n",
+ pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n",
__func__, ret);
}
@@ -565,6 +565,7 @@
.name = "audio-ref-clk",
.owner = THIS_MODULE,
.of_match_table = audio_ref_clk_match,
+ .suppress_bind_attrs = true,
},
.probe = audio_ref_clk_probe,
.remove = audio_ref_clk_remove,
diff --git a/asoc/codecs/audio-ext-clk.c b/asoc/codecs/audio-ext-clk.c
index 07556ee..adcd7a6 100644
--- a/asoc/codecs/audio-ext-clk.c
+++ b/asoc/codecs/audio-ext-clk.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2017, 2019 The Linux Foundation. All rights reserved.
*/
#include <linux/kernel.h>
@@ -321,6 +321,7 @@
.name = "audio-ref-clk",
.owner = THIS_MODULE,
.of_match_table = audio_ref_clk_match,
+ .suppress_bind_attrs = true,
},
.probe = audio_ref_clk_probe,
.remove = audio_ref_clk_remove,
diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c
index 45e9936..fc940c8 100644
--- a/asoc/codecs/bolero/bolero-cdc.c
+++ b/asoc/codecs/bolero/bolero-cdc.c
@@ -287,6 +287,8 @@
event = BOLERO_WCD_EVT_TX_CH_HOLD_CLEAR;
if (adc_n == BOLERO_ADC0)
amic = 0x1;
+ else if (adc_n == BOLERO_ADC1)
+ amic = 0x2;
else if (adc_n == BOLERO_ADC2)
amic = 0x2;
else if (adc_n == BOLERO_ADC3)
@@ -1026,6 +1028,7 @@
.name = "bolero-codec",
.owner = THIS_MODULE,
.of_match_table = bolero_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = bolero_probe,
.remove = bolero_remove,
diff --git a/asoc/codecs/bolero/bolero-clk-rsc.c b/asoc/codecs/bolero/bolero-clk-rsc.c
index 6742562..82f3879 100644
--- a/asoc/codecs/bolero/bolero-clk-rsc.c
+++ b/asoc/codecs/bolero/bolero-clk-rsc.c
@@ -603,6 +603,7 @@
.name = "bolero-clk-rsc-mngr",
.owner = THIS_MODULE,
.of_match_table = bolero_clk_rsc_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = bolero_clk_rsc_probe,
.remove = bolero_clk_rsc_remove,
diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c
index e43fa62..0be5c4e 100644
--- a/asoc/codecs/bolero/rx-macro.c
+++ b/asoc/codecs/bolero/rx-macro.c
@@ -2177,7 +2177,7 @@
snd_soc_component_update_bits(component, hph_lut_bypass_reg,
0x80, 0x00);
snd_soc_component_update_bits(component, hph_comp_ctrl7,
- 0x20, 0x0);
+ 0x20, 0x20);
}
}
@@ -3712,6 +3712,7 @@
.owner = THIS_MODULE,
.pm = &bolero_dev_pm_ops,
.of_match_table = rx_macro_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = rx_macro_probe,
.remove = rx_macro_remove,
diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c
index 49b7da5..cb3aa59 100644
--- a/asoc/codecs/bolero/tx-macro.c
+++ b/asoc/codecs/bolero/tx-macro.c
@@ -159,7 +159,8 @@
int child_count;
int tx_swr_clk_cnt;
int va_swr_clk_cnt;
- int swr_clk_type;
+ int va_clk_status;
+ int tx_clk_status;
};
static bool tx_macro_get_data(struct snd_soc_component *component,
@@ -212,7 +213,7 @@
TX_CORE_CLK,
true);
if (ret < 0) {
- dev_err(tx_priv->dev,
+ dev_err_ratelimited(tx_priv->dev,
"%s: request clock enable failed\n",
__func__);
goto exit;
@@ -1469,7 +1470,7 @@
struct regmap *regmap, int clk_type,
bool enable)
{
- int ret = 0;
+ int ret = 0, clk_tx_ret = 0;
dev_dbg(tx_priv->dev,
"%s: clock type %s, enable: %s tx_mclk_users: %d\n",
@@ -1477,50 +1478,53 @@
(enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
if (enable) {
- if (tx_priv->swr_clk_users == 0) {
+ if (tx_priv->swr_clk_users == 0)
msm_cdc_pinctrl_select_active_state(
tx_priv->tx_swr_gpio_p);
+ clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
+ TX_CORE_CLK,
+ TX_CORE_CLK,
+ true);
+ if (clk_type == TX_MCLK) {
+ ret = tx_macro_mclk_enable(tx_priv, 1);
+ if (ret < 0) {
+ if (tx_priv->swr_clk_users == 0)
+ msm_cdc_pinctrl_select_sleep_state(
+ tx_priv->tx_swr_gpio_p);
+ dev_err_ratelimited(tx_priv->dev,
+ "%s: request clock enable failed\n",
+ __func__);
+ goto done;
+ }
+ }
+ if (clk_type == VA_MCLK) {
ret = bolero_clk_rsc_request_clock(tx_priv->dev,
TX_CORE_CLK,
- TX_CORE_CLK,
+ VA_CORE_CLK,
true);
- if (clk_type == TX_MCLK) {
- ret = tx_macro_mclk_enable(tx_priv, 1);
- if (ret < 0) {
+ if (ret < 0) {
+ if (tx_priv->swr_clk_users == 0)
msm_cdc_pinctrl_select_sleep_state(
tx_priv->tx_swr_gpio_p);
- dev_err_ratelimited(tx_priv->dev,
- "%s: request clock enable failed\n",
- __func__);
- goto done;
- }
+ dev_err_ratelimited(tx_priv->dev,
+ "%s: swr request clk failed\n",
+ __func__);
+ goto done;
}
- if (clk_type == VA_MCLK) {
- ret = bolero_clk_rsc_request_clock(tx_priv->dev,
- TX_CORE_CLK,
- VA_CORE_CLK,
- true);
- if (ret < 0) {
- msm_cdc_pinctrl_select_sleep_state(
- tx_priv->tx_swr_gpio_p);
- dev_err_ratelimited(tx_priv->dev,
- "%s: swr request clk failed\n",
- __func__);
- goto done;
- }
- if (tx_priv->tx_mclk_users == 0) {
- regmap_update_bits(regmap,
- BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
- 0x01, 0x01);
- regmap_update_bits(regmap,
- BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
- 0x01, 0x01);
- regmap_update_bits(regmap,
- BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
- 0x01, 0x01);
- }
+ if (tx_priv->tx_mclk_users == 0) {
+ regmap_update_bits(regmap,
+ BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
+ 0x01, 0x01);
+ regmap_update_bits(regmap,
+ BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
+ 0x01, 0x01);
+ regmap_update_bits(regmap,
+ BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
+ 0x01, 0x01);
}
+ }
+ if (tx_priv->swr_clk_users == 0) {
dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
__func__, tx_priv->reset_swr);
if (tx_priv->reset_swr)
@@ -1534,12 +1538,13 @@
regmap_update_bits(regmap,
BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
0x02, 0x00);
- ret = bolero_clk_rsc_request_clock(tx_priv->dev,
- TX_CORE_CLK,
- TX_CORE_CLK,
- false);
tx_priv->reset_swr = false;
}
+ if (!clk_tx_ret)
+ ret = bolero_clk_rsc_request_clock(tx_priv->dev,
+ TX_CORE_CLK,
+ TX_CORE_CLK,
+ false);
tx_priv->swr_clk_users++;
} else {
if (tx_priv->swr_clk_users <= 0) {
@@ -1548,49 +1553,51 @@
tx_priv->swr_clk_users = 0;
return 0;
}
+ clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
+ TX_CORE_CLK,
+ TX_CORE_CLK,
+ true);
tx_priv->swr_clk_users--;
- if (tx_priv->swr_clk_users == 0) {
- ret = bolero_clk_rsc_request_clock(tx_priv->dev,
- TX_CORE_CLK,
- TX_CORE_CLK,
- true);
+ if (tx_priv->swr_clk_users == 0)
regmap_update_bits(regmap,
BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
0x01, 0x00);
- if (clk_type == TX_MCLK)
- tx_macro_mclk_enable(tx_priv, 0);
- if (clk_type == VA_MCLK) {
- if (tx_priv->tx_mclk_users == 0) {
- regmap_update_bits(regmap,
- BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
- 0x01, 0x00);
- regmap_update_bits(regmap,
- BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
- 0x01, 0x00);
- }
- ret = bolero_clk_rsc_request_clock(tx_priv->dev,
- TX_CORE_CLK,
- VA_CORE_CLK,
- false);
- if (ret < 0) {
- dev_err_ratelimited(tx_priv->dev,
- "%s: swr request clk failed\n",
- __func__);
- goto done;
- }
+ if (clk_type == TX_MCLK)
+ tx_macro_mclk_enable(tx_priv, 0);
+ if (clk_type == VA_MCLK) {
+ if (tx_priv->tx_mclk_users == 0) {
+ regmap_update_bits(regmap,
+ BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
+ 0x01, 0x00);
+ regmap_update_bits(regmap,
+ BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
+ 0x01, 0x00);
}
ret = bolero_clk_rsc_request_clock(tx_priv->dev,
TX_CORE_CLK,
- TX_CORE_CLK,
+ VA_CORE_CLK,
false);
+ if (ret < 0) {
+ dev_err_ratelimited(tx_priv->dev,
+ "%s: swr request clk failed\n",
+ __func__);
+ goto done;
+ }
+ }
+ if (!clk_tx_ret)
+ ret = bolero_clk_rsc_request_clock(tx_priv->dev,
+ TX_CORE_CLK,
+ TX_CORE_CLK,
+ false);
+ if (tx_priv->swr_clk_users == 0)
msm_cdc_pinctrl_select_sleep_state(
tx_priv->tx_swr_gpio_p);
- }
}
return 0;
done:
- bolero_clk_rsc_request_clock(tx_priv->dev,
+ if (!clk_tx_ret)
+ bolero_clk_rsc_request_clock(tx_priv->dev,
TX_CORE_CLK,
TX_CORE_CLK,
false);
@@ -1609,53 +1616,66 @@
}
mutex_lock(&tx_priv->swr_clk_lock);
- dev_dbg(tx_priv->dev, "%s: swrm clock %s\n",
- __func__, (enable ? "enable" : "disable"));
+ dev_dbg(tx_priv->dev,
+ "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
+ __func__, (enable ? "enable" : "disable"),
+ tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
if (enable) {
pm_runtime_get_sync(tx_priv->dev);
- /*For standalone VA usecase, enable VA macro clock */
- if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt
- && (tx_priv->swr_clk_type == TX_MCLK)) {
+ if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) {
ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
VA_MCLK, enable);
if (ret)
goto done;
- tx_priv->swr_clk_type = VA_MCLK;
+ tx_priv->va_clk_status++;
} else {
- /* Disable VA MCLK if its already enabled */
- if (tx_priv->swr_clk_type == VA_MCLK)
- tx_macro_tx_va_mclk_enable(tx_priv,
- regmap, VA_MCLK, false);
ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
TX_MCLK, enable);
if (ret)
goto done;
- tx_priv->swr_clk_type = TX_MCLK;
+ tx_priv->tx_clk_status++;
}
pm_runtime_mark_last_busy(tx_priv->dev);
pm_runtime_put_autosuspend(tx_priv->dev);
} else {
- if (tx_priv->swr_clk_type == VA_MCLK) {
+ if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) {
ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
VA_MCLK, enable);
if (ret)
goto done;
- tx_priv->swr_clk_type = TX_MCLK;
- } else {
+ --tx_priv->va_clk_status;
+ } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) {
ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
TX_MCLK, enable);
- if (tx_priv->va_swr_clk_cnt) {
- ret = tx_macro_tx_va_mclk_enable(tx_priv,
- regmap, VA_MCLK, true);
+ if (ret)
+ goto done;
+ --tx_priv->tx_clk_status;
+ } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) {
+ if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) {
+ ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
+ VA_MCLK, enable);
if (ret)
goto done;
- tx_priv->swr_clk_type = VA_MCLK;
+ --tx_priv->va_clk_status;
+ } else {
+ ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
+ TX_MCLK, enable);
+ if (ret)
+ goto done;
+ --tx_priv->tx_clk_status;
}
+
+ } else {
+ dev_dbg(tx_priv->dev,
+ "%s: Both clocks are disabled\n", __func__);
}
}
- dev_dbg(tx_priv->dev, "%s: swrm clock users %d\n",
- __func__, tx_priv->swr_clk_users);
+
+ dev_dbg(tx_priv->dev,
+ "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
+ __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
+ tx_priv->va_clk_status);
done:
mutex_unlock(&tx_priv->swr_clk_lock);
return ret;
@@ -2077,6 +2097,7 @@
.owner = THIS_MODULE,
.pm = &bolero_dev_pm_ops,
.of_match_table = tx_macro_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = tx_macro_probe,
.remove = tx_macro_remove,
diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c
index cdfe6c7..3bba403 100644
--- a/asoc/codecs/bolero/va-macro.c
+++ b/asoc/codecs/bolero/va-macro.c
@@ -1756,6 +1756,7 @@
.owner = THIS_MODULE,
.pm = &bolero_dev_pm_ops,
.of_match_table = va_macro_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = va_macro_probe,
.remove = va_macro_remove,
diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c
index d1ba346..e26b4cb 100644
--- a/asoc/codecs/bolero/wsa-macro.c
+++ b/asoc/codecs/bolero/wsa-macro.c
@@ -815,7 +815,7 @@
wsa_priv->default_clk_id,
true);
if (ret < 0) {
- dev_err(wsa_priv->dev,
+ dev_err_ratelimited(wsa_priv->dev,
"%s: wsa request clock enable failed\n",
__func__);
goto exit;
@@ -2637,7 +2637,7 @@
if (ret < 0) {
msm_cdc_pinctrl_select_sleep_state(
wsa_priv->wsa_swr_gpio_p);
- dev_err(wsa_priv->dev,
+ dev_err_ratelimited(wsa_priv->dev,
"%s: wsa request clock enable failed\n",
__func__);
goto exit;
@@ -3008,6 +3008,7 @@
.owner = THIS_MODULE,
.pm = &bolero_dev_pm_ops,
.of_match_table = wsa_macro_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = wsa_macro_probe,
.remove = wsa_macro_remove,
diff --git a/asoc/codecs/msm-cdc-pinctrl.c b/asoc/codecs/msm-cdc-pinctrl.c
index b626e57..8ed0c8e 100644
--- a/asoc/codecs/msm-cdc-pinctrl.c
+++ b/asoc/codecs/msm-cdc-pinctrl.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/kernel.h>
@@ -233,6 +233,7 @@
.name = "msm-cdc-pinctrl",
.owner = THIS_MODULE,
.of_match_table = msm_cdc_pinctrl_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_cdc_pinctrl_probe,
.remove = msm_cdc_pinctrl_remove,
diff --git a/asoc/codecs/msm_hdmi_codec_rx.c b/asoc/codecs/msm_hdmi_codec_rx.c
index 0c142f1..5349598 100644
--- a/asoc/codecs/msm_hdmi_codec_rx.c
+++ b/asoc/codecs/msm_hdmi_codec_rx.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/platform_device.h>
#include <linux/slab.h>
@@ -698,6 +698,7 @@
.name = "msm-ext-disp-audio-codec-rx",
.owner = THIS_MODULE,
.of_match_table = msm_ext_disp_audio_codec_rx_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_ext_disp_audio_codec_rx_plat_probe,
.remove = msm_ext_disp_audio_codec_rx_plat_remove,
diff --git a/asoc/codecs/msm_stub.c b/asoc/codecs/msm_stub.c
index a754c49..cf91f2a 100644
--- a/asoc/codecs/msm_stub.c
+++ b/asoc/codecs/msm_stub.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2011-2014, 2017-2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, 2017-2019 The Linux Foundation. All rights reserved.
*/
#include <linux/platform_device.h>
#include <linux/slab.h>
@@ -63,6 +63,7 @@
.name = "msm-stub-codec",
.owner = THIS_MODULE,
.of_match_table = msm_stub_codec_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_stub_dev_probe,
.remove = msm_stub_dev_remove,
diff --git a/asoc/codecs/wcd-dsp-mgr.c b/asoc/codecs/wcd-dsp-mgr.c
index e0070e6..a6acc2d 100644
--- a/asoc/codecs/wcd-dsp-mgr.c
+++ b/asoc/codecs/wcd-dsp-mgr.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/module.h>
#include <linux/platform_device.h>
@@ -1306,6 +1306,7 @@
.name = "wcd-dsp-mgr",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(wdsp_mgr_dt_match),
+ .suppress_bind_attrs = true,
},
.probe = wdsp_mgr_probe,
.remove = wdsp_mgr_remove,
diff --git a/asoc/codecs/wcd9335.c b/asoc/codecs/wcd9335.c
index e501a35..009e614 100644
--- a/asoc/codecs/wcd9335.c
+++ b/asoc/codecs/wcd9335.c
@@ -14796,6 +14796,7 @@
#ifdef CONFIG_PM
.pm = &tasha_pm_ops,
#endif
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c
index f1c3536..ea928f0 100644
--- a/asoc/codecs/wcd934x/wcd934x.c
+++ b/asoc/codecs/wcd934x/wcd934x.c
@@ -11471,6 +11471,7 @@
#ifdef CONFIG_PM
.pm = &tavil_pm_ops,
#endif
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c
index bde3a7e..e89d9a9 100644
--- a/asoc/codecs/wcd937x/wcd937x.c
+++ b/asoc/codecs/wcd937x/wcd937x.c
@@ -2601,7 +2601,7 @@
{
struct wcd937x_pdata *pdata = NULL;
- pdata = devm_kzalloc(dev, sizeof(struct wcd937x_pdata),
+ pdata = kzalloc(sizeof(struct wcd937x_pdata),
GFP_KERNEL);
if (!pdata)
return NULL;
@@ -2665,7 +2665,7 @@
struct wcd937x_pdata *pdata = NULL;
struct wcd_ctrl_platform_data *plat_data = NULL;
- wcd937x = devm_kzalloc(dev, sizeof(struct wcd937x_priv), GFP_KERNEL);
+ wcd937x = kzalloc(sizeof(struct wcd937x_priv), GFP_KERNEL);
if (!wcd937x)
return -ENOMEM;
@@ -2684,31 +2684,35 @@
if (!wcd937x->supplies) {
dev_err(dev, "%s: Cannot init wcd supplies\n",
__func__);
- return ret;
+ goto err_bind_all;
}
plat_data = dev_get_platdata(dev->parent);
if (!plat_data) {
dev_err(dev, "%s: platform data from parent is NULL\n",
__func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err_bind_all;
}
wcd937x->handle = (void *)plat_data->handle;
if (!wcd937x->handle) {
dev_err(dev, "%s: handle is NULL\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err_bind_all;
}
wcd937x->update_wcd_event = plat_data->update_wcd_event;
if (!wcd937x->update_wcd_event) {
dev_err(dev, "%s: update_wcd_event api is null!\n",
__func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err_bind_all;
}
wcd937x->register_notifier = plat_data->register_notifier;
if (!wcd937x->register_notifier) {
dev_err(dev, "%s: register_notifier api is null!\n",
__func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err_bind_all;
}
ret = msm_cdc_enable_static_supplies(dev, wcd937x->supplies,
@@ -2717,7 +2721,7 @@
if (ret) {
dev_err(dev, "%s: wcd static supply enable failed!\n",
__func__);
- return ret;
+ goto err_bind_all;
}
wcd937x_reset(dev);
@@ -2733,7 +2737,7 @@
if (ret) {
dev_err(dev, "%s: Slave bind failed, ret = %d\n",
__func__, ret);
- return ret;
+ goto err_bind_all;
}
ret = wcd937x_parse_port_mapping(dev, "qcom,rx_swr_ch_map", CODEC_RX);
@@ -2820,18 +2824,26 @@
wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
err:
component_unbind_all(dev, wcd937x);
+err_bind_all:
+ dev_set_drvdata(dev, NULL);
+ kfree(pdata);
+ kfree(wcd937x);
return ret;
}
static void wcd937x_unbind(struct device *dev)
{
struct wcd937x_priv *wcd937x = dev_get_drvdata(dev);
+ struct wcd937x_pdata *pdata = dev_get_platdata(wcd937x->dev);
wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
snd_soc_unregister_component(dev);
component_unbind_all(dev, wcd937x);
mutex_destroy(&wcd937x->micb_lock);
mutex_destroy(&wcd937x->ana_tx_clk_lock);
+ dev_set_drvdata(dev, NULL);
+ kfree(pdata);
+ kfree(wcd937x);
}
static const struct of_device_id wcd937x_dt_match[] = {
@@ -2901,6 +2913,8 @@
static int wcd937x_remove(struct platform_device *pdev)
{
component_master_del(&pdev->dev, &wcd937x_comp_ops);
+ dev_set_drvdata(&pdev->dev, NULL);
+
return 0;
}
@@ -2923,6 +2937,7 @@
#ifdef CONFIG_PM_SLEEP
.pm = &wcd937x_dev_pm_ops,
#endif
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/codecs/wcd938x/wcd938x-mbhc.c b/asoc/codecs/wcd938x/wcd938x-mbhc.c
index 2516943..b9bbdae 100644
--- a/asoc/codecs/wcd938x/wcd938x-mbhc.c
+++ b/asoc/codecs/wcd938x/wcd938x-mbhc.c
@@ -1032,6 +1032,7 @@
struct wcd938x_mbhc *wcd938x_mbhc = NULL;
struct wcd_mbhc *wcd_mbhc = NULL;
int ret = 0;
+ struct wcd938x_pdata *pdata;
if (!component) {
pr_err("%s: component is NULL\n", __func__);
@@ -1055,6 +1056,15 @@
/* Setting default mbhc detection logic to ADC */
wcd_mbhc->mbhc_detection_logic = WCD_DETECTION_ADC;
+ pdata = dev_get_platdata(component->dev);
+ if (!pdata) {
+ dev_err(component->dev, "%s: pdata pointer is NULL\n",
+ __func__);
+ ret = -EINVAL;
+ goto err;
+ }
+ wcd_mbhc->micb_mv = pdata->micbias.micb2_mv;
+
ret = wcd_mbhc_init(wcd_mbhc, component, &mbhc_cb,
&intr_ids, wcd_mbhc_registers,
WCD938X_ZDET_SUPPORTED);
diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c
index 6241cf2..4ded2d2 100644
--- a/asoc/codecs/wcd938x/wcd938x.c
+++ b/asoc/codecs/wcd938x/wcd938x.c
@@ -2973,6 +2973,7 @@
#ifdef CONFIG_PM_SLEEP
.pm = &wcd938x_dev_pm_ops,
#endif
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/codecs/wcd9xxx-irq.c b/asoc/codecs/wcd9xxx-irq.c
index b748bb2..c1efba4 100644
--- a/asoc/codecs/wcd9xxx-irq.c
+++ b/asoc/codecs/wcd9xxx-irq.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/bitops.h>
#include <linux/kernel.h>
@@ -878,6 +878,7 @@
.name = "wcd9xxx_intc",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(of_match),
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/kona.c b/asoc/kona.c
index 50a25b1..be944d3 100644
--- a/asoc/kona.c
+++ b/asoc/kona.c
@@ -91,6 +91,9 @@
TDM_PRI = 0,
TDM_SEC,
TDM_TERT,
+ TDM_QUAT,
+ TDM_QUIN,
+ TDM_SEN,
TDM_INTERFACE_MAX,
};
@@ -98,6 +101,9 @@
PRIM_AUX_PCM = 0,
SEC_AUX_PCM,
TERT_AUX_PCM,
+ QUAT_AUX_PCM,
+ QUIN_AUX_PCM,
+ SEN_AUX_PCM,
AUX_PCM_MAX,
};
@@ -105,6 +111,9 @@
PRIM_MI2S = 0,
SEC_MI2S,
TERT_MI2S,
+ QUAT_MI2S,
+ QUIN_MI2S,
+ SEN_MI2S,
MI2S_MAX,
};
@@ -152,6 +161,8 @@
struct device_node *dmic01_gpio_p; /* used by pinctrl API */
struct device_node *dmic23_gpio_p; /* used by pinctrl API */
struct device_node *dmic45_gpio_p; /* used by pinctrl API */
+ struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
+ atomic_t mi2s_gpio_ref_count[MI2S_MAX]; /* used by pinctrl API */
struct device_node *us_euro_gpio_p; /* used by pinctrl API */
struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */
struct device_node *hph_en1_gpio_p; /* used by pinctrl API */
@@ -244,6 +255,30 @@
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
0,
},
+ {
+ AFE_API_VERSION_I2S_CONFIG,
+ Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
+ Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
+ },
+ {
+ AFE_API_VERSION_I2S_CONFIG,
+ Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT,
+ Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
+ },
+ {
+ AFE_API_VERSION_I2S_CONFIG,
+ Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT,
+ Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
+ },
};
struct mi2s_conf {
@@ -292,6 +327,36 @@
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
},
+ { /* QUAT TDM */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
+ },
+ { /* QUIN TDM */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
+ },
+ { /* SEN TDM */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
+ },
};
static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
@@ -325,6 +390,36 @@
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
},
+ { /* QUAT TDM */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
+ },
+ { /* QUIN TDM */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
+ },
+ { /* SEN TDM */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
+ },
};
/* Default configuration of AUX PCM channels */
@@ -332,12 +427,18 @@
[PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
[SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
[TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
};
static struct dev_config aux_pcm_tx_cfg[] = {
[PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
[SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
[TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
};
/* Default configuration of MI2S channels */
@@ -345,12 +446,18 @@
[PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
[SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
[TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
+ [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
+ [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
+ [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
};
static struct dev_config mi2s_tx_cfg[] = {
[PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
[SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
[TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
+ [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
};
/* Default configuration of Codec DMA Interface RX */
@@ -452,25 +559,43 @@
static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_rx_sample_rate, auxpcm_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_tx_sample_rate, auxpcm_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text);
static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text);
static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_sample_rate, mi2s_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_sample_rate, mi2s_rate_text);
static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text);
static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text);
static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_chs, mi2s_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_chs, mi2s_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
@@ -1224,6 +1349,15 @@
} else if (strnstr(kcontrol->id.name, "TERT",
sizeof(kcontrol->id.name))) {
port->mode = TDM_TERT;
+ } else if (strnstr(kcontrol->id.name, "QUAT",
+ sizeof(kcontrol->id.name))) {
+ port->mode = TDM_QUAT;
+ } else if (strnstr(kcontrol->id.name, "QUIN",
+ sizeof(kcontrol->id.name))) {
+ port->mode = TDM_QUIN;
+ } else if (strnstr(kcontrol->id.name, "SEN",
+ sizeof(kcontrol->id.name))) {
+ port->mode = TDM_SEN;
} else {
pr_err("%s: unsupported mode in: %s\n",
__func__, kcontrol->id.name);
@@ -1637,6 +1771,15 @@
} else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM",
sizeof("TERT_AUX_PCM"))) {
idx = TERT_AUX_PCM;
+ } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM",
+ sizeof("QUAT_AUX_PCM"))) {
+ idx = QUAT_AUX_PCM;
+ } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM",
+ sizeof("QUIN_AUX_PCM"))) {
+ idx = QUIN_AUX_PCM;
+ } else if (strnstr(kcontrol->id.name, "SEN_AUX_PCM",
+ sizeof("SEN_AUX_PCM"))) {
+ idx = SEN_AUX_PCM;
} else {
pr_err("%s: unsupported port: %s\n",
__func__, kcontrol->id.name);
@@ -1883,6 +2026,15 @@
} else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX",
sizeof("TERT_MI2S_RX"))) {
idx = TERT_MI2S;
+ } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX",
+ sizeof("QUAT_MI2S_RX"))) {
+ idx = QUAT_MI2S;
+ } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX",
+ sizeof("QUIN_MI2S_RX"))) {
+ idx = QUIN_MI2S;
+ } else if (strnstr(kcontrol->id.name, "SEN_MI2S_RX",
+ sizeof("SEN_MI2S_RX"))) {
+ idx = SEN_MI2S;
} else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX",
sizeof("PRIM_MI2S_TX"))) {
idx = PRIM_MI2S;
@@ -1892,6 +2044,15 @@
} else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX",
sizeof("TERT_MI2S_TX"))) {
idx = TERT_MI2S;
+ } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX",
+ sizeof("QUAT_MI2S_TX"))) {
+ idx = QUAT_MI2S;
+ } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX",
+ sizeof("QUIN_MI2S_TX"))) {
+ idx = QUIN_MI2S;
+ } else if (strnstr(kcontrol->id.name, "SEN_MI2S_TX",
+ sizeof("SEN_MI2S_TX"))) {
+ idx = SEN_MI2S;
} else {
pr_err("%s: unsupported channel: %s\n",
__func__, kcontrol->id.name);
@@ -2205,6 +2366,33 @@
case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
break;
+ case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
+ afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
+ break;
+ case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
+ afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
+ break;
+ case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
+ afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX;
+ break;
+ case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
+ afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
+ break;
+ case MSM_BACKEND_DAI_SENARY_MI2S_RX:
+ afe_port_id = AFE_PORT_ID_SENARY_MI2S_RX;
+ break;
+ case MSM_BACKEND_DAI_SENARY_MI2S_TX:
+ afe_port_id = AFE_PORT_ID_SENARY_MI2S_TX;
+ break;
+ case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
+ afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0;
+ break;
+ case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
+ afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_1;
+ break;
+ case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
+ afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_2;
+ break;
default:
pr_err("%s: Invalid BE id: %d\n", __func__, be_id);
afe_port_id = -EINVAL;
@@ -3209,6 +3397,15 @@
SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
tdm_rx_sample_rate_get,
tdm_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
+ tdm_rx_sample_rate_get,
+ tdm_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
+ tdm_rx_sample_rate_get,
+ tdm_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
+ tdm_rx_sample_rate_get,
+ tdm_rx_sample_rate_put),
SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
tdm_tx_sample_rate_get,
tdm_tx_sample_rate_put),
@@ -3218,6 +3415,15 @@
SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
tdm_tx_sample_rate_get,
tdm_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
+ tdm_tx_sample_rate_get,
+ tdm_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
+ tdm_tx_sample_rate_get,
+ tdm_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
+ tdm_tx_sample_rate_get,
+ tdm_tx_sample_rate_put),
SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
aux_pcm_rx_sample_rate_get,
aux_pcm_rx_sample_rate_put),
@@ -3227,6 +3433,15 @@
SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
aux_pcm_rx_sample_rate_get,
aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_RX SampleRate", sen_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
aux_pcm_tx_sample_rate_get,
aux_pcm_tx_sample_rate_put),
@@ -3236,6 +3451,15 @@
SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
aux_pcm_tx_sample_rate_get,
aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
mi2s_rx_sample_rate_get,
mi2s_rx_sample_rate_put),
@@ -3245,6 +3469,15 @@
SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
mi2s_rx_sample_rate_get,
mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
mi2s_tx_sample_rate_get,
mi2s_tx_sample_rate_put),
@@ -3254,6 +3487,15 @@
SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
mi2s_tx_sample_rate_get,
mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
usb_audio_rx_format_get, usb_audio_rx_format_put),
SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
@@ -3267,6 +3509,15 @@
SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format,
tdm_rx_format_get,
tdm_rx_format_put),
+ SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format,
+ tdm_rx_format_get,
+ tdm_rx_format_put),
+ SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format,
+ tdm_rx_format_get,
+ tdm_rx_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_0 Format", tdm_rx_format,
+ tdm_rx_format_get,
+ tdm_rx_format_put),
SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format,
tdm_tx_format_get,
tdm_tx_format_put),
@@ -3276,30 +3527,63 @@
SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format,
tdm_tx_format_get,
tdm_tx_format_put),
+ SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format,
+ tdm_tx_format_get,
+ tdm_tx_format_put),
+ SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format,
+ tdm_tx_format_get,
+ tdm_tx_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_0 Format", tdm_tx_format,
+ tdm_tx_format_get,
+ tdm_tx_format_put),
SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format,
msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format,
msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format,
msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format,
msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
usb_audio_rx_ch_get, usb_audio_rx_ch_put),
SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
@@ -3315,6 +3599,15 @@
SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs,
tdm_rx_ch_get,
tdm_rx_ch_put),
+ SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs,
+ tdm_rx_ch_get,
+ tdm_rx_ch_put),
+ SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs,
+ tdm_rx_ch_get,
+ tdm_rx_ch_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_0 Channels", tdm_rx_chs,
+ tdm_rx_ch_get,
+ tdm_rx_ch_put),
SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs,
tdm_tx_ch_get,
tdm_tx_ch_put),
@@ -3324,18 +3617,39 @@
SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs,
tdm_tx_ch_get,
tdm_tx_ch_put),
+ SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs,
+ tdm_tx_ch_get,
+ tdm_tx_ch_put),
+ SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs,
+ tdm_tx_ch_get,
+ tdm_tx_ch_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_0 Channels", tdm_tx_chs,
+ tdm_tx_ch_get,
+ tdm_tx_ch_put),
SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs,
msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs,
msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs,
msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
+ SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs,
+ msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
+ SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs,
+ msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
+ SOC_ENUM_EXT("SEN_MI2S_RX Channels", sen_mi2s_rx_chs,
+ msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs,
msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs,
msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs,
msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
+ SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs,
+ msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
+ SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs,
+ msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
+ SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs,
+ msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
ext_disp_rx_ch_get, ext_disp_rx_ch_put),
SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
@@ -3388,6 +3702,30 @@
return idx;
}
+static int kona_send_island_va_config(int32_t be_id)
+{
+ int rc = 0;
+ int port_id = 0xFFFF;
+
+ port_id = msm_get_port_id(be_id);
+ if (port_id < 0) {
+ pr_err("%s: Invalid island interface, be_id: %d\n",
+ __func__, be_id);
+ rc = -EINVAL;
+ } else {
+ /*
+ * send island mode config
+ * This should be the first configuration
+ */
+ rc = afe_send_port_island_mode(port_id);
+ if (rc)
+ pr_err("%s: afe send island mode failed %d\n",
+ __func__, rc);
+ }
+
+ return rc;
+}
+
static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params)
{
@@ -3484,6 +3822,54 @@
rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate;
break;
+ case MSM_BACKEND_DAI_QUAT_TDM_RX_0:
+ channels->min = channels->max =
+ tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format);
+ rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate;
+ break;
+
+ case MSM_BACKEND_DAI_QUAT_TDM_TX_0:
+ channels->min = channels->max =
+ tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format);
+ rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate;
+ break;
+
+ case MSM_BACKEND_DAI_QUIN_TDM_RX_0:
+ channels->min = channels->max =
+ tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format);
+ rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate;
+ break;
+
+ case MSM_BACKEND_DAI_QUIN_TDM_TX_0:
+ channels->min = channels->max =
+ tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format);
+ rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate;
+ break;
+
+ case MSM_BACKEND_DAI_SEN_TDM_RX_0:
+ channels->min = channels->max =
+ tdm_rx_cfg[TDM_SEN][TDM_0].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_rx_cfg[TDM_SEN][TDM_0].bit_format);
+ rate->min = rate->max = tdm_rx_cfg[TDM_SEN][TDM_0].sample_rate;
+ break;
+
+ case MSM_BACKEND_DAI_SEN_TDM_TX_0:
+ channels->min = channels->max =
+ tdm_tx_cfg[TDM_SEN][TDM_0].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_tx_cfg[TDM_SEN][TDM_0].bit_format);
+ rate->min = rate->max = tdm_tx_cfg[TDM_SEN][TDM_0].sample_rate;
+ break;
+
case MSM_BACKEND_DAI_AUXPCM_RX:
param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format);
@@ -3538,6 +3924,60 @@
aux_pcm_tx_cfg[TERT_AUX_PCM].channels;
break;
+ case MSM_BACKEND_DAI_QUAT_AUXPCM_RX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format);
+ rate->min = rate->max =
+ aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate;
+ channels->min = channels->max =
+ aux_pcm_rx_cfg[QUAT_AUX_PCM].channels;
+ break;
+
+ case MSM_BACKEND_DAI_QUAT_AUXPCM_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format);
+ rate->min = rate->max =
+ aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate;
+ channels->min = channels->max =
+ aux_pcm_tx_cfg[QUAT_AUX_PCM].channels;
+ break;
+
+ case MSM_BACKEND_DAI_QUIN_AUXPCM_RX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format);
+ rate->min = rate->max =
+ aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate;
+ channels->min = channels->max =
+ aux_pcm_rx_cfg[QUIN_AUX_PCM].channels;
+ break;
+
+ case MSM_BACKEND_DAI_QUIN_AUXPCM_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format);
+ rate->min = rate->max =
+ aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate;
+ channels->min = channels->max =
+ aux_pcm_tx_cfg[QUIN_AUX_PCM].channels;
+ break;
+
+ case MSM_BACKEND_DAI_SEN_AUXPCM_RX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ aux_pcm_rx_cfg[SEN_AUX_PCM].bit_format);
+ rate->min = rate->max =
+ aux_pcm_rx_cfg[SEN_AUX_PCM].sample_rate;
+ channels->min = channels->max =
+ aux_pcm_rx_cfg[SEN_AUX_PCM].channels;
+ break;
+
+ case MSM_BACKEND_DAI_SEN_AUXPCM_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ aux_pcm_tx_cfg[SEN_AUX_PCM].bit_format);
+ rate->min = rate->max =
+ aux_pcm_tx_cfg[SEN_AUX_PCM].sample_rate;
+ channels->min = channels->max =
+ aux_pcm_tx_cfg[SEN_AUX_PCM].channels;
+ break;
+
case MSM_BACKEND_DAI_PRI_MI2S_RX:
param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
mi2s_rx_cfg[PRIM_MI2S].bit_format);
@@ -3586,6 +4026,54 @@
mi2s_tx_cfg[TERT_MI2S].channels;
break;
+ case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ mi2s_rx_cfg[QUAT_MI2S].bit_format);
+ rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate;
+ channels->min = channels->max =
+ mi2s_rx_cfg[QUAT_MI2S].channels;
+ break;
+
+ case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ mi2s_tx_cfg[QUAT_MI2S].bit_format);
+ rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate;
+ channels->min = channels->max =
+ mi2s_tx_cfg[QUAT_MI2S].channels;
+ break;
+
+ case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ mi2s_rx_cfg[QUIN_MI2S].bit_format);
+ rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate;
+ channels->min = channels->max =
+ mi2s_rx_cfg[QUIN_MI2S].channels;
+ break;
+
+ case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ mi2s_tx_cfg[QUIN_MI2S].bit_format);
+ rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate;
+ channels->min = channels->max =
+ mi2s_tx_cfg[QUIN_MI2S].channels;
+ break;
+
+ case MSM_BACKEND_DAI_SENARY_MI2S_RX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ mi2s_rx_cfg[SEN_MI2S].bit_format);
+ rate->min = rate->max = mi2s_rx_cfg[SEN_MI2S].sample_rate;
+ channels->min = channels->max =
+ mi2s_rx_cfg[SEN_MI2S].channels;
+ break;
+
+ case MSM_BACKEND_DAI_SENARY_MI2S_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ mi2s_tx_cfg[SEN_MI2S].bit_format);
+ rate->min = rate->max = mi2s_tx_cfg[SEN_MI2S].sample_rate;
+ channels->min = channels->max =
+ mi2s_tx_cfg[SEN_MI2S].channels;
+ break;
+
case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
@@ -3732,6 +4220,15 @@
case AFE_PORT_ID_TERTIARY_TDM_RX:
slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels;
break;
+ case AFE_PORT_ID_QUATERNARY_TDM_RX:
+ slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
+ break;
+ case AFE_PORT_ID_QUINARY_TDM_RX:
+ slots = tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
+ break;
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ slots = tdm_rx_cfg[TDM_SEN][TDM_0].channels;
+ break;
case AFE_PORT_ID_PRIMARY_TDM_TX:
slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels;
break;
@@ -3741,6 +4238,15 @@
case AFE_PORT_ID_TERTIARY_TDM_TX:
slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels;
break;
+ case AFE_PORT_ID_QUATERNARY_TDM_TX:
+ slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
+ break;
+ case AFE_PORT_ID_QUINARY_TDM_TX:
+ slots = tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
+ break;
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ slots = tdm_tx_cfg[TDM_SEN][TDM_0].channels;
+ break;
default:
pr_err("%s: dai id 0x%x not supported\n",
@@ -3812,6 +4318,187 @@
return ret;
}
+static int msm_get_tdm_mode(u32 port_id)
+{
+ int tdm_mode;
+
+ switch (port_id) {
+ case AFE_PORT_ID_PRIMARY_TDM_RX:
+ case AFE_PORT_ID_PRIMARY_TDM_TX:
+ tdm_mode = TDM_PRI;
+ break;
+ case AFE_PORT_ID_SECONDARY_TDM_RX:
+ case AFE_PORT_ID_SECONDARY_TDM_TX:
+ tdm_mode = TDM_SEC;
+ break;
+ case AFE_PORT_ID_TERTIARY_TDM_RX:
+ case AFE_PORT_ID_TERTIARY_TDM_TX:
+ tdm_mode = TDM_TERT;
+ break;
+ case AFE_PORT_ID_QUATERNARY_TDM_RX:
+ case AFE_PORT_ID_QUATERNARY_TDM_TX:
+ tdm_mode = TDM_QUAT;
+ break;
+ case AFE_PORT_ID_QUINARY_TDM_RX:
+ case AFE_PORT_ID_QUINARY_TDM_TX:
+ tdm_mode = TDM_QUIN;
+ break;
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ tdm_mode = TDM_SEN;
+ break;
+ default:
+ pr_err("%s: Invalid port id: %d\n", __func__, port_id);
+ tdm_mode = -EINVAL;
+ }
+ return tdm_mode;
+}
+
+static int kona_tdm_snd_startup(struct snd_pcm_substream *substream)
+{
+ int ret = 0;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_card *card = rtd->card;
+ struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
+ int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
+
+ if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) {
+ ret = -EINVAL;
+ pr_err("%s: Invalid TDM interface %d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ if (pdata->mi2s_gpio_p[tdm_mode]) {
+ if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode]))
+ == 0) {
+ ret = msm_cdc_pinctrl_select_active_state(
+ pdata->mi2s_gpio_p[tdm_mode]);
+ if (ret) {
+ pr_err("%s: TDM GPIO pinctrl set active failed with %d\n",
+ __func__, ret);
+ goto done;
+ }
+ }
+ atomic_inc(&(pdata->mi2s_gpio_ref_count[tdm_mode]));
+ }
+
+done:
+ return ret;
+}
+
+static void kona_tdm_snd_shutdown(struct snd_pcm_substream *substream)
+{
+ int ret = 0;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_card *card = rtd->card;
+ struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
+ int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
+
+ if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) {
+ ret = -EINVAL;
+ pr_err("%s: Invalid TDM interface %d\n",
+ __func__, ret);
+ return;
+ }
+
+ if (pdata->mi2s_gpio_p[tdm_mode]) {
+ atomic_dec(&(pdata->mi2s_gpio_ref_count[tdm_mode]));
+ if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode]))
+ == 0) {
+ ret = msm_cdc_pinctrl_select_sleep_state(
+ pdata->mi2s_gpio_p[tdm_mode]);
+ if (ret)
+ pr_err("%s: TDM GPIO pinctrl set sleep failed with %d\n",
+ __func__, ret);
+ }
+ }
+}
+
+static int kona_aux_snd_startup(struct snd_pcm_substream *substream)
+{
+ int ret = 0;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_card *card = rtd->card;
+ struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
+ u32 aux_mode = cpu_dai->id - 1;
+
+ if (aux_mode >= AUX_PCM_MAX) {
+ ret = -EINVAL;
+ pr_err("%s: Invalid AUX interface %d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ if (pdata->mi2s_gpio_p[aux_mode]) {
+ if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode]))
+ == 0) {
+ ret = msm_cdc_pinctrl_select_active_state(
+ pdata->mi2s_gpio_p[aux_mode]);
+ if (ret) {
+ pr_err("%s: AUX GPIO pinctrl set active failed with %d\n",
+ __func__, ret);
+ goto done;
+ }
+ }
+ atomic_inc(&(pdata->mi2s_gpio_ref_count[aux_mode]));
+ }
+
+done:
+ return ret;
+}
+
+static void kona_aux_snd_shutdown(struct snd_pcm_substream *substream)
+{
+ int ret = 0;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_soc_card *card = rtd->card;
+ struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
+ u32 aux_mode = cpu_dai->id - 1;
+
+ if (aux_mode >= AUX_PCM_MAX) {
+ pr_err("%s: Invalid AUX interface %d\n",
+ __func__, ret);
+ return;
+ }
+
+ if (pdata->mi2s_gpio_p[aux_mode]) {
+ atomic_dec(&(pdata->mi2s_gpio_ref_count[aux_mode]));
+ if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode]))
+ == 0) {
+ ret = msm_cdc_pinctrl_select_sleep_state(
+ pdata->mi2s_gpio_p[aux_mode]);
+ if (ret)
+ pr_err("%s: AUX GPIO pinctrl set sleep failed with %d\n",
+ __func__, ret);
+ }
+ }
+}
+
+static int msm_snd_cdc_dma_startup(struct snd_pcm_substream *substream)
+{
+ int ret = 0;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai_link *dai_link = rtd->dai_link;
+
+ switch (dai_link->id) {
+ case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
+ case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
+ case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
+ ret = kona_send_island_va_config(dai_link->id);
+ if (ret)
+ pr_err("%s: send island va cfg failed, err: %d\n",
+ __func__, ret);
+ break;
+ }
+
+ return ret;
+}
+
static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
@@ -3926,6 +4613,8 @@
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int index = cpu_dai->id;
unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
+ struct snd_soc_card *card = rtd->card;
+ struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
dev_dbg(rtd->card->dev,
"%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
@@ -3965,6 +4654,19 @@
__func__, index, ret);
goto clk_off;
}
+ if (pdata->mi2s_gpio_p[index]) {
+ if (atomic_read(&(pdata->mi2s_gpio_ref_count[index]))
+ == 0) {
+ ret = msm_cdc_pinctrl_select_active_state(
+ pdata->mi2s_gpio_p[index]);
+ if (ret) {
+ pr_err("%s: MI2S GPIO pinctrl set active failed with %d\n",
+ __func__, ret);
+ goto clk_off;
+ }
+ }
+ atomic_inc(&(pdata->mi2s_gpio_ref_count[index]));
+ }
}
clk_off:
if (ret < 0)
@@ -3982,6 +4684,8 @@
int ret = 0;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
int index = rtd->cpu_dai->id;
+ struct snd_soc_card *card = rtd->card;
+ struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
pr_debug("%s(): substream = %s stream = %d\n", __func__,
substream->name, substream->stream);
@@ -3992,6 +4696,18 @@
mutex_lock(&mi2s_intf_conf[index].lock);
if (--mi2s_intf_conf[index].ref_cnt == 0) {
+ if (pdata->mi2s_gpio_p[index]) {
+ atomic_dec(&(pdata->mi2s_gpio_ref_count[index]));
+ if (atomic_read(&(pdata->mi2s_gpio_ref_count[index]))
+ == 0) {
+ ret = msm_cdc_pinctrl_select_sleep_state(
+ pdata->mi2s_gpio_p[index]);
+ if (ret)
+ pr_err("%s: MI2S GPIO pinctrl set sleep failed with %d\n",
+ __func__, ret);
+ }
+ }
+
ret = msm_mi2s_set_sclk(substream, false);
if (ret < 0)
pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
@@ -4070,8 +4786,15 @@
return ret;
}
+static struct snd_soc_ops kona_aux_be_ops = {
+ .startup = kona_aux_snd_startup,
+ .shutdown = kona_aux_snd_shutdown
+};
+
static struct snd_soc_ops kona_tdm_be_ops = {
.hw_params = kona_tdm_snd_hw_params,
+ .startup = kona_tdm_snd_startup,
+ .shutdown = kona_tdm_snd_shutdown
};
static struct snd_soc_ops msm_mi2s_be_ops = {
@@ -4084,6 +4807,7 @@
};
static struct snd_soc_ops msm_cdc_dma_be_ops = {
+ .startup = msm_snd_cdc_dma_startup,
.hw_params = msm_snd_cdc_dma_hw_params,
};
@@ -4255,6 +4979,8 @@
snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
+ snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
+ snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1");
snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2");
@@ -5175,6 +5901,93 @@
.ops = &kona_tdm_be_ops,
.ignore_suspend = 1,
},
+ {
+ .name = LPASS_BE_QUAT_TDM_RX_0,
+ .stream_name = "Quaternary TDM0 Playback",
+ .cpu_dai_name = "msm-dai-q6-tdm.36912",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_tdm_be_ops,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_TDM_TX_0,
+ .stream_name = "Quaternary TDM0 Capture",
+ .cpu_dai_name = "msm-dai-q6-tdm.36913",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_TDM_RX_0,
+ .stream_name = "Quinary TDM0 Playback",
+ .cpu_dai_name = "msm-dai-q6-tdm.36928",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_tdm_be_ops,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_TDM_TX_0,
+ .stream_name = "Quinary TDM0 Capture",
+ .cpu_dai_name = "msm-dai-q6-tdm.36929",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEN_TDM_RX_0,
+ .stream_name = "Senary TDM0 Playback",
+ .cpu_dai_name = "msm-dai-q6-tdm.36944",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_tdm_be_ops,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
+ {
+ .name = LPASS_BE_SEN_TDM_TX_0,
+ .stream_name = "Senary TDM0 Capture",
+ .cpu_dai_name = "msm-dai-q6-tdm.36945",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
};
static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
@@ -5388,6 +6201,93 @@
.ops = &msm_mi2s_be_ops,
.ignore_suspend = 1,
},
+ {
+ .name = LPASS_BE_QUAT_MI2S_RX,
+ .stream_name = "Quaternary MI2S Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.3",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &msm_mi2s_be_ops,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_TX,
+ .stream_name = "Quaternary MI2S Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.3",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &msm_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_MI2S_RX,
+ .stream_name = "Quinary MI2S Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &msm_mi2s_be_ops,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_MI2S_TX,
+ .stream_name = "Quinary MI2S Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &msm_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SENARY_MI2S_RX,
+ .stream_name = "Senary MI2S Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.5",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &msm_mi2s_be_ops,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ },
+ {
+ .name = LPASS_BE_SENARY_MI2S_TX,
+ .stream_name = "Senary MI2S Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.5",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_SENARY_MI2S_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &msm_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
};
static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
@@ -5403,6 +6303,7 @@
.dpcm_playback = 1,
.id = MSM_BACKEND_DAI_AUXPCM_RX,
.be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
.ignore_pmdown_time = 1,
.ignore_suspend = 1,
},
@@ -5417,6 +6318,7 @@
.dpcm_capture = 1,
.id = MSM_BACKEND_DAI_AUXPCM_TX,
.be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
.ignore_suspend = 1,
},
/* Secondary AUX PCM Backend DAI Links */
@@ -5431,6 +6333,7 @@
.dpcm_playback = 1,
.id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
.be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
.ignore_pmdown_time = 1,
.ignore_suspend = 1,
},
@@ -5445,6 +6348,7 @@
.dpcm_capture = 1,
.id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
.be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
.ignore_suspend = 1,
},
/* Tertiary AUX PCM Backend DAI Links */
@@ -5459,6 +6363,7 @@
.dpcm_playback = 1,
.id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
.be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
.ignore_suspend = 1,
},
{
@@ -5472,6 +6377,94 @@
.dpcm_capture = 1,
.id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
.be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
+ .ignore_suspend = 1,
+ },
+ /* Quaternary AUX PCM Backend DAI Links */
+ {
+ .name = LPASS_BE_QUAT_AUXPCM_RX,
+ .stream_name = "Quat AUX PCM Playback",
+ .cpu_dai_name = "msm-dai-q6-auxpcm.4",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_AUXPCM_TX,
+ .stream_name = "Quat AUX PCM Capture",
+ .cpu_dai_name = "msm-dai-q6-auxpcm.4",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
+ .ignore_suspend = 1,
+ },
+ /* Quinary AUX PCM Backend DAI Links */
+ {
+ .name = LPASS_BE_QUIN_AUXPCM_RX,
+ .stream_name = "Quin AUX PCM Playback",
+ .cpu_dai_name = "msm-dai-q6-auxpcm.5",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_AUXPCM_TX,
+ .stream_name = "Quin AUX PCM Capture",
+ .cpu_dai_name = "msm-dai-q6-auxpcm.5",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
+ .ignore_suspend = 1,
+ },
+ /* Senary AUX PCM Backend DAI Links */
+ {
+ .name = LPASS_BE_SEN_AUXPCM_RX,
+ .stream_name = "Sen AUX PCM Playback",
+ .cpu_dai_name = "msm-dai-q6-auxpcm.6",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .id = MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEN_AUXPCM_TX,
+ .stream_name = "Sen AUX PCM Capture",
+ .cpu_dai_name = "msm-dai-q6-auxpcm.6",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ops = &kona_aux_be_ops,
.ignore_suspend = 1,
},
};
@@ -6549,6 +7542,7 @@
struct msm_asoc_mach_data *pdata = NULL;
const char *mbhc_audio_jack_type = NULL;
int ret = 0;
+ uint index = 0;
if (!pdev->dev.of_node) {
dev_err(&pdev->dev, "%s: No platform supplied from device tree\n", __func__);
@@ -6682,6 +7676,21 @@
"qcom,cdc-dmic45-gpios",
0);
+ pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,pri-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,sec-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,tert-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,quat-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,quin-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[SEN_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,sen-mi2s-gpios", 0);
+ for (index = PRIM_MI2S; index < MI2S_MAX; index++)
+ atomic_set(&(pdata->mi2s_gpio_ref_count[index]), 0);
+
ret = msm_audio_ssr_register(&pdev->dev);
if (ret)
pr_err("%s: Registration with SND event FWK failed ret = %d\n",
@@ -6712,6 +7721,7 @@
.owner = THIS_MODULE,
.pm = &snd_soc_pm_ops,
.of_match_table = kona_asoc_machine_of_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_asoc_machine_probe,
.remove = msm_asoc_machine_remove,
diff --git a/asoc/machine_615x_init.c b/asoc/machine_615x_init.c
new file mode 100644
index 0000000..cf50138
--- /dev/null
+++ b/asoc/machine_615x_init.c
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2018, 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.
+*
+*/
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include "machine_615x_init.h"
+
+static int __init audio_machine_615x_init(void)
+{
+ sm6150_init();
+ sa8155_init();
+ return 0;
+}
+
+static void audio_machine_615x_exit(void)
+{
+ sm6150_exit();
+ sa8155_exit();
+}
+
+module_init(audio_machine_615x_init);
+module_exit(audio_machine_615x_exit);
+
+MODULE_DESCRIPTION("Audio Machine 615X Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/asoc/machine_615x_init.h b/asoc/machine_615x_init.h
new file mode 100644
index 0000000..36565e4
--- /dev/null
+++ b/asoc/machine_615x_init.h
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2018, 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.
+*
+*/
+
+#ifndef __MACHINE_615X_INIT_H__
+#define __MACHINE_615X_INIT_H__
+int sm6150_init(void);
+int sa8155_init(void);
+
+void sm6150_exit(void);
+void sa8155_exit(void);
+#endif
+
diff --git a/asoc/msm-audio-effects-q6-v2.c b/asoc/msm-audio-effects-q6-v2.c
index 7ab6db4..3605a75 100644
--- a/asoc/msm-audio-effects-q6-v2.c
+++ b/asoc/msm-audio-effects-q6-v2.c
@@ -1,8 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/slab.h>
+#include <linux/ratelimit.h>
#include <sound/compress_params.h>
#include <sound/devdep_params.h>
#include <dsp/apr_audio-v2.h>
@@ -15,7 +16,8 @@
#define GET_NEXT(ptr, upper_limit, rc) \
({ \
if (((ptr) + 1) > (upper_limit)) { \
- pr_err("%s: param list out of boundary\n", __func__); \
+ pr_err_ratelimited("%s: param list out of boundary\n", \
+ __func__); \
(rc) = -EINVAL; \
} \
((rc) == 0) ? *(ptr)++ : -EINVAL; \
@@ -24,7 +26,8 @@
#define CHECK_PARAM_LEN(len, max_len, tag, rc) \
do { \
if ((len) > (max_len)) { \
- pr_err("%s: params length overflows\n", (tag)); \
+ pr_err_ratelimited("%s: params length overflows\n", \
+ (tag)); \
(rc) = -EINVAL; \
} \
} while (0)
@@ -244,7 +247,8 @@
param_data = (u8 *) &virtualizer->gain_adjust;
break;
default:
- pr_err("%s: Invalid command to set config\n", __func__);
+ pr_err_ratelimited("%s: Invalid command to set config\n",
+ __func__);
continue;
}
if (rc)
@@ -678,7 +682,8 @@
param_data = (u8 *) &reverb->density;
break;
default:
- pr_err("%s: Invalid command to set config\n", __func__);
+ pr_err_ratelimited("%s: Invalid command to set config\n",
+ __func__);
continue;
}
if (rc)
@@ -831,7 +836,8 @@
param_data = (u8 *) &bass_boost->strength;
break;
default:
- pr_err("%s: Invalid command to set config\n", __func__);
+ pr_err_ratelimited("%s: Invalid command to set config\n",
+ __func__);
continue;
}
if (rc)
@@ -884,6 +890,9 @@
struct param_hdr_v3 param_hdr;
u8 *param_data = NULL;
u32 packed_data_size = 0;
+ int32_t *p_coeffs = NULL;
+ uint32_t lpf_len = 0, hpf_len = 0, bpf_len = 0;
+ uint32_t bsf_len = 0, tsf_len = 0, total_coeffs_len = 0;
pr_debug("%s\n", __func__);
if (!ac || (devices == -EINVAL) || (num_commands == -EINVAL)) {
@@ -943,8 +952,71 @@
rc = -EINVAL;
goto invalid_config;
}
+
+ pbe->config.real_bass_mix =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.bass_color_control =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.main_chain_delay =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.xover_filter_order =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.bandpass_filter_order =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.drc_delay =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.rms_tav =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.exp_threshold =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.exp_slope =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.comp_threshold =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.comp_slope =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.makeup_gain =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.comp_attack =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.comp_release =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.exp_attack =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.exp_release =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_bass_threshold =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_high_threshold =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_bass_makeup_gain =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_high_makeup_gain =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_bass_gc =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_high_gc =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.limiter_delay =
+ GET_NEXT(values, param_max_offset, rc);
+ pbe->config.reserved =
+ GET_NEXT(values, param_max_offset, rc);
+
+ p_coeffs = &pbe->config.p1LowPassCoeffs[0];
+ lpf_len = (pbe->config.xover_filter_order == 3) ? 10 : 5;
+ hpf_len = (pbe->config.xover_filter_order == 3) ? 10 : 5;
+ bpf_len = pbe->config.bandpass_filter_order * 5;
+ bsf_len = 5;
+ tsf_len = 5;
+ total_coeffs_len = lpf_len + hpf_len + bpf_len + bsf_len + tsf_len;
+
+ for (i = 0; i < total_coeffs_len; i++) {
+ *p_coeffs++ = GET_NEXT(values, param_max_offset, rc);
+ }
+
if (command_config_state != CONFIG_SET)
break;
+
max_params_length =
params_length + COMMAND_IID_PAYLOAD_SZ + length;
CHECK_PARAM_LEN(max_params_length, MAX_INBAND_PARAM_SZ,
@@ -953,10 +1025,11 @@
break;
param_hdr.param_id = AUDPROC_PARAM_ID_PBE_PARAM_CONFIG;
param_hdr.param_size = length;
- param_data = (u8 *) values;
+ param_data = (u8 *) &pbe->config;
break;
default:
- pr_err("%s: Invalid command to set config\n", __func__);
+ pr_err_ratelimited("%s: Invalid command to set config\n",
+ __func__);
continue;
}
if (rc)
@@ -1214,7 +1287,8 @@
param_data = (u8 *) &eq->freq_millihertz;
break;
default:
- pr_err("%s: Invalid command to set config\n", __func__);
+ pr_err_ratelimited("%s: Invalid command to set config\n",
+ __func__);
continue;
}
if (rc)
@@ -1335,7 +1409,7 @@
"VOLUME/VOLUME2_GAIN_MASTER", rc);
break;
default:
- pr_err("%s: Invalid command id: %d to set config\n",
+ pr_err_ratelimited("%s: Invalid command id: %d to set config\n",
__func__, command_id);
continue;
}
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index f358e45..d9e0927 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -5387,6 +5387,7 @@
.name = "msm-compress-dsp",
.owner = THIS_MODULE,
.of_match_table = msm_compr_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_compr_dev_probe,
.remove = msm_compr_remove,
diff --git a/asoc/msm-cpe-lsm.c b/asoc/msm-cpe-lsm.c
index b1a6fe3..7765554 100644
--- a/asoc/msm-cpe-lsm.c
+++ b/asoc/msm-cpe-lsm.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -3331,6 +3331,7 @@
.name = "msm-cpe-lsm",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(msm_cpe_lsm_dt_match),
+ .suppress_bind_attrs = true,
},
.probe = msm_cpe_lsm_probe,
.remove = msm_cpe_lsm_remove,
diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c
index 6256e8a..f53b3a6 100644
--- a/asoc/msm-dai-fe.c
+++ b/asoc/msm-dai-fe.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*/
@@ -2765,6 +2765,7 @@
.name = "msm-dai-fe",
.owner = THIS_MODULE,
.of_match_table = msm_dai_fe_dt_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/msm-dai-q6-hdmi-v2.c b/asoc/msm-dai-q6-hdmi-v2.c
index 32add91..fb50eba 100644
--- a/asoc/msm-dai-q6-hdmi-v2.c
+++ b/asoc/msm-dai-q6-hdmi-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -586,6 +586,7 @@
.name = "msm-dai-q6-hdmi",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_hdmi_dt_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c
index 1a82d65..ed6af11 100644
--- a/asoc/msm-dai-q6-v2.c
+++ b/asoc/msm-dai-q6-v2.c
@@ -26,6 +26,7 @@
#define MSM_DAI_TERT_AUXPCM_DT_DEV_ID 3
#define MSM_DAI_QUAT_AUXPCM_DT_DEV_ID 4
#define MSM_DAI_QUIN_AUXPCM_DT_DEV_ID 5
+#define MSM_DAI_SEN_AUXPCM_DT_DEV_ID 6
#define MSM_DAI_TWS_CHANNEL_MODE_ONE 1
#define MSM_DAI_TWS_CHANNEL_MODE_TWO 2
@@ -180,6 +181,22 @@
IDX_QUINARY_TDM_TX_5,
IDX_QUINARY_TDM_TX_6,
IDX_QUINARY_TDM_TX_7,
+ IDX_SENARY_TDM_RX_0,
+ IDX_SENARY_TDM_RX_1,
+ IDX_SENARY_TDM_RX_2,
+ IDX_SENARY_TDM_RX_3,
+ IDX_SENARY_TDM_RX_4,
+ IDX_SENARY_TDM_RX_5,
+ IDX_SENARY_TDM_RX_6,
+ IDX_SENARY_TDM_RX_7,
+ IDX_SENARY_TDM_TX_0,
+ IDX_SENARY_TDM_TX_1,
+ IDX_SENARY_TDM_TX_2,
+ IDX_SENARY_TDM_TX_3,
+ IDX_SENARY_TDM_TX_4,
+ IDX_SENARY_TDM_TX_5,
+ IDX_SENARY_TDM_TX_6,
+ IDX_SENARY_TDM_TX_7,
IDX_TDM_MAX,
};
@@ -194,6 +211,8 @@
IDX_GROUP_QUATERNARY_TDM_TX,
IDX_GROUP_QUINARY_TDM_RX,
IDX_GROUP_QUINARY_TDM_TX,
+ IDX_GROUP_SENARY_TDM_RX,
+ IDX_GROUP_SENARY_TDM_TX,
IDX_GROUP_TDM_MAX,
};
@@ -400,6 +419,10 @@
case IDX_GROUP_QUINARY_TDM_TX:
return atomic_read(&tdm_group_ref[IDX_GROUP_QUINARY_TDM_RX]) +
atomic_read(&tdm_group_ref[IDX_GROUP_QUINARY_TDM_TX]);
+ case IDX_GROUP_SENARY_TDM_RX:
+ case IDX_GROUP_SENARY_TDM_TX:
+ return atomic_read(&tdm_group_ref[IDX_GROUP_SENARY_TDM_RX]) +
+ atomic_read(&tdm_group_ref[IDX_GROUP_SENARY_TDM_TX]);
default: return -EINVAL;
}
}
@@ -507,6 +530,26 @@
case AFE_PORT_ID_QUINARY_TDM_TX_6:
case AFE_PORT_ID_QUINARY_TDM_TX_7:
return IDX_GROUP_QUINARY_TDM_TX;
+ case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ return IDX_GROUP_SENARY_TDM_RX;
+ case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ return IDX_GROUP_SENARY_TDM_TX;
default: return -EINVAL;
}
}
@@ -674,6 +717,38 @@
return IDX_QUINARY_TDM_RX_7;
case AFE_PORT_ID_QUINARY_TDM_TX_7:
return IDX_QUINARY_TDM_TX_7;
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ return IDX_SENARY_TDM_RX_0;
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ return IDX_SENARY_TDM_TX_0;
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ return IDX_SENARY_TDM_RX_1;
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ return IDX_SENARY_TDM_TX_1;
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ return IDX_SENARY_TDM_RX_2;
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ return IDX_SENARY_TDM_TX_2;
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ return IDX_SENARY_TDM_RX_3;
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ return IDX_SENARY_TDM_TX_3;
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ return IDX_SENARY_TDM_RX_4;
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ return IDX_SENARY_TDM_TX_4;
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ return IDX_SENARY_TDM_RX_5;
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ return IDX_SENARY_TDM_TX_5;
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ return IDX_SENARY_TDM_RX_6;
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ return IDX_SENARY_TDM_TX_6;
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ return IDX_SENARY_TDM_RX_7;
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ return IDX_SENARY_TDM_TX_7;
default: return -EINVAL;
}
}
@@ -727,6 +802,7 @@
dev_dbg(dai->dev, "%s: src %s sink %s\n",
__func__, intercon.source, intercon.sink);
snd_soc_dapm_add_routes(dapm, &intercon, 1);
+ snd_soc_dapm_ignore_suspend(dapm, intercon.sink);
}
if (dai->driver->capture.stream_name &&
dai->driver->capture.aif_name) {
@@ -737,6 +813,7 @@
dev_dbg(dai->dev, "%s: src %s sink %s\n",
__func__, intercon.source, intercon.sink);
snd_soc_dapm_add_routes(dapm, &intercon, 1);
+ snd_soc_dapm_ignore_suspend(dapm, intercon.source);
}
return 0;
}
@@ -1061,6 +1138,14 @@
aux_dai_data->clk_set.clk_id =
Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT;
break;
+ case MSM_DAI_SEN_AUXPCM_DT_DEV_ID:
+ if (pcm_clk_rate)
+ aux_dai_data->clk_set.clk_id =
+ Q6AFE_LPASS_CLK_ID_SEN_PCM_IBIT;
+ else
+ aux_dai_data->clk_set.clk_id =
+ Q6AFE_LPASS_CLK_ID_SEN_PCM_EBIT;
+ break;
default:
dev_err(dai->dev, "%s: AUXPCM id: %d not supported\n",
__func__, dai->id);
@@ -1438,6 +1523,33 @@
.probe = msm_dai_q6_aux_pcm_probe,
.remove = msm_dai_q6_dai_auxpcm_remove,
},
+ {
+ .playback = {
+ .stream_name = "Sen AUX PCM Playback",
+ .aif_name = "SEN_AUX_PCM_RX",
+ .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000),
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 1,
+ .rate_max = 16000,
+ .rate_min = 8000,
+ },
+ .capture = {
+ .stream_name = "Sen AUX PCM Capture",
+ .aif_name = "SEN_AUX_PCM_TX",
+ .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000),
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .channels_min = 1,
+ .channels_max = 1,
+ .rate_max = 16000,
+ .rate_min = 8000,
+ },
+ .id = MSM_DAI_SEN_AUXPCM_DT_DEV_ID,
+ .name = "Sen AUX PCM",
+ .ops = &msm_dai_q6_auxpcm_ops,
+ .probe = msm_dai_q6_aux_pcm_probe,
+ .remove = msm_dai_q6_dai_auxpcm_remove,
+ },
};
static int msm_dai_q6_spdif_format_put(struct snd_kcontrol *kcontrol,
@@ -3196,6 +3308,15 @@
.get = msm_dai_q6_afe_enc_cfg_get,
.put = msm_dai_q6_afe_enc_cfg_put,
},
+ {
+ .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
+ SNDRV_CTL_ELEM_ACCESS_INACTIVE),
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+ .name = "SLIM_7_RX APTX_AD Enc Cfg",
+ .info = msm_dai_q6_afe_enc_cfg_info,
+ .get = msm_dai_q6_afe_enc_cfg_get,
+ .put = msm_dai_q6_afe_enc_cfg_put,
+ },
SOC_ENUM_EXT("AFE Input Channels", afe_chs_enum[0],
msm_dai_q6_afe_input_channel_get,
msm_dai_q6_afe_input_channel_put),
@@ -4229,6 +4350,11 @@
dai_data->tx_pid = AFE_PORT_ID_QUINARY_PCM_TX;
pdev->id = MSM_DAI_QUIN_AUXPCM_DT_DEV_ID;
i = 4;
+ } else if (!strcmp(intf_name, "senary")) {
+ dai_data->rx_pid = AFE_PORT_ID_SENARY_PCM_RX;
+ dai_data->tx_pid = AFE_PORT_ID_SENARY_PCM_TX;
+ pdev->id = MSM_DAI_SEN_AUXPCM_DT_DEV_ID;
+ i = 5;
} else {
dev_err(&pdev->dev, "%s: invalid DT intf name %s\n",
__func__, intf_name);
@@ -4300,6 +4426,7 @@
.name = "msm-auxpcm-dev",
.owner = THIS_MODULE,
.of_match_table = msm_auxpcm_dev_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -4910,6 +5037,9 @@
case MSM_QUIN_MI2S:
*port_id = AFE_PORT_ID_QUINARY_MI2S_RX;
break;
+ case MSM_SENARY_MI2S:
+ *port_id = AFE_PORT_ID_SENARY_MI2S_RX;
+ break;
case MSM_INT0_MI2S:
*port_id = AFE_PORT_ID_INT0_MI2S_RX;
break;
@@ -5515,20 +5645,17 @@
},
{
.playback = {
- .stream_name = "Secondary MI2S Playback SD1",
- .aif_name = "SEC_MI2S_RX_SD1",
+ .stream_name = "Senary MI2S Playback",
+ .aif_name = "SEN_MI2S_RX",
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
SNDRV_PCM_RATE_16000,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.rate_min = 8000,
.rate_max = 48000,
},
- .id = MSM_SEC_MI2S_SD1,
- },
- {
.capture = {
- .stream_name = "Senary_mi2s Capture",
- .aif_name = "SENARY_TX",
+ .stream_name = "Senary MI2S Capture",
+ .aif_name = "SENARY_MI2S_TX",
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
SNDRV_PCM_RATE_16000,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
@@ -5543,6 +5670,18 @@
},
{
.playback = {
+ .stream_name = "Secondary MI2S Playback SD1",
+ .aif_name = "SEC_MI2S_RX_SD1",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .id = MSM_SEC_MI2S_SD1,
+ },
+ {
+ .playback = {
.stream_name = "INT0 MI2S Playback",
.aif_name = "INT0_MI2S_RX",
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
@@ -6317,6 +6456,7 @@
.name = "msm-dai-q6-dev",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_dev_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -6354,6 +6494,7 @@
.name = "msm-dai-q6",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -6389,6 +6530,7 @@
.name = "msm-dai-mi2s",
.owner = THIS_MODULE,
.of_match_table = msm_dai_mi2s_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -6406,6 +6548,7 @@
.name = "msm-dai-q6-mi2s",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_mi2s_dev_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -6475,6 +6618,7 @@
.name = "msm-dai-q6-spdif",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_spdif_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -6517,6 +6661,13 @@
else
clk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT;
break;
+ case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX:
+ case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX:
+ if (mode)
+ clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEN_TDM_IBIT;
+ else
+ clk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEN_TDM_EBIT;
+ break;
default:
return -EINVAL;
}
@@ -6699,6 +6850,7 @@
.name = "msm-dai-tdm",
.owner = THIS_MODULE,
.of_match_table = msm_dai_tdm_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -7038,6 +7190,54 @@
SOC_ENUM_EXT("QUIN_TDM_TX_7 Data Format", tdm_config_enum[0],
msm_dai_q6_tdm_data_format_get,
msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_0 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_1 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_2 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_3 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_4 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_5 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_6 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_7 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_0 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_1 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_2 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_3 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_4 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_5 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_6 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_7 Data Format", tdm_config_enum[0],
+ msm_dai_q6_tdm_data_format_get,
+ msm_dai_q6_tdm_data_format_put),
};
static const struct snd_kcontrol_new tdm_config_controls_header_type[] = {
@@ -7281,6 +7481,54 @@
SOC_ENUM_EXT("QUIN_TDM_TX_7 Header Type", tdm_config_enum[1],
msm_dai_q6_tdm_header_type_get,
msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_0 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_1 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_2 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_3 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_4 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_5 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_6 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_RX_7 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_0 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_1 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_2 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_3 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_4 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_5 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_6 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
+ SOC_ENUM_EXT("SEN_TDM_TX_7 Header Type", tdm_config_enum[1],
+ msm_dai_q6_tdm_header_type_get,
+ msm_dai_q6_tdm_header_type_put),
};
static const struct snd_kcontrol_new tdm_config_controls_header[] = {
@@ -7604,6 +7852,70 @@
SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
msm_dai_q6_tdm_header_get,
msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_0 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_1 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_2 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_3 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_4 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_5 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_6 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_RX_7 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_0 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_1 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_2 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_3 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_4 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_5 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_6 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
+ SOC_SINGLE_MULTI_EXT("SEN_TDM_TX_7 Header",
+ SND_SOC_NOPM, 0, 0xFFFFFFFF, 0, 8,
+ msm_dai_q6_tdm_header_get,
+ msm_dai_q6_tdm_header_put),
};
static int msm_dai_q6_tdm_set_clk(
@@ -7848,6 +8160,14 @@
case AFE_PORT_ID_QUINARY_TDM_RX_5:
case AFE_PORT_ID_QUINARY_TDM_RX_6:
case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
tdm_group->nslots_per_frame = slots;
tdm_group->slot_width = slot_width;
tdm_group->slot_mask = rx_mask & cap_mask;
@@ -7892,6 +8212,14 @@
case AFE_PORT_ID_QUINARY_TDM_TX_5:
case AFE_PORT_ID_QUINARY_TDM_TX_6:
case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
tdm_group->nslots_per_frame = slots;
tdm_group->slot_width = slot_width;
tdm_group->slot_mask = tx_mask & cap_mask;
@@ -7912,7 +8240,7 @@
dev_get_drvdata(dai->dev);
if ((dai->id >= AFE_PORT_ID_PRIMARY_TDM_RX) &&
- (dai->id <= AFE_PORT_ID_QUINARY_TDM_TX_7)) {
+ (dai->id <= AFE_PORT_ID_SENARY_TDM_TX_7)) {
dai_data->clk_set.clk_freq_in_hz = freq;
} else {
dev_err(dai->dev, "%s: invalid dai id 0x%x\n",
@@ -7979,6 +8307,14 @@
case AFE_PORT_ID_QUINARY_TDM_RX_5:
case AFE_PORT_ID_QUINARY_TDM_RX_6:
case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
if (!rx_slot) {
dev_err(dai->dev, "%s: rx slot not found\n", __func__);
return -EINVAL;
@@ -8037,6 +8373,14 @@
case AFE_PORT_ID_QUINARY_TDM_TX_5:
case AFE_PORT_ID_QUINARY_TDM_TX_6:
case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
if (!tx_slot) {
dev_err(dai->dev, "%s: tx slot not found\n", __func__);
return -EINVAL;
@@ -10083,6 +10427,342 @@
.probe = msm_dai_q6_dai_tdm_probe,
.remove = msm_dai_q6_dai_tdm_remove,
},
+ {
+ .playback = {
+ .stream_name = "Senary TDM0 Playback",
+ .aif_name = "SEN_TDM_RX_0",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_0",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM1 Playback",
+ .aif_name = "SEN_TDM_RX_1",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_1",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_1,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM2 Playback",
+ .aif_name = "SEN_TDM_RX_2",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_2",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_2,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM3 Playback",
+ .aif_name = "SEN_TDM_RX_3",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_3",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_3,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM4 Playback",
+ .aif_name = "SEN_TDM_RX_4",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_4",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_4,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM5 Playback",
+ .aif_name = "SEN_TDM_RX_5",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_5",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_5,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM6 Playback",
+ .aif_name = "SEN_TDM_RX_6",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_6",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_6,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Senary TDM7 Playback",
+ .aif_name = "SEN_TDM_RX_7",
+ .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_RX_7",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_RX_7,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM0 Capture",
+ .aif_name = "SEN_TDM_TX_0",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_0",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM1 Capture",
+ .aif_name = "SEN_TDM_TX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_1",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_1,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM2 Capture",
+ .aif_name = "SEN_TDM_TX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_2",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_2,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM3 Capture",
+ .aif_name = "SEN_TDM_TX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_3",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_3,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM4 Capture",
+ .aif_name = "SEN_TDM_TX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_4",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_4,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM5 Capture",
+ .aif_name = "SEN_TDM_TX_5",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_5",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_5,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM6 Capture",
+ .aif_name = "SEN_TDM_TX_6",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_6",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_6,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Senary TDM7 Capture",
+ .aif_name = "SEN_TDM_TX_7",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S32_LE,
+ .channels_min = 1,
+ .channels_max = 8,
+ .rate_min = 8000,
+ .rate_max = 352800,
+ },
+ .name = "SEN_TDM_TX_7",
+ .ops = &msm_dai_q6_tdm_ops,
+ .id = AFE_PORT_ID_SENARY_TDM_TX_7,
+ .probe = msm_dai_q6_dai_tdm_probe,
+ .remove = msm_dai_q6_dai_tdm_remove,
+ },
};
static const struct snd_soc_component_driver msm_q6_tdm_dai_component = {
@@ -10331,6 +11011,7 @@
.name = "msm-dai-q6-tdm",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_tdm_dev_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -11234,6 +11915,7 @@
.name = "msm-dai-cdc-dma-dev",
.owner = THIS_MODULE,
.of_match_table = msm_dai_q6_cdc_dma_dev_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -11271,6 +11953,7 @@
.name = "msm-dai-cdc-dma",
.owner = THIS_MODULE,
.of_match_table = msm_dai_cdc_dma_dt_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/msm-dai-stub-v2.c b/asoc/msm-dai-stub-v2.c
index 7e7d4e4..5570156 100644
--- a/asoc/msm-dai-stub-v2.c
+++ b/asoc/msm-dai-stub-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2013-2014, 2017 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, 2017, 2019 The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
#include <linux/module.h>
@@ -302,6 +302,7 @@
.name = "msm-dai-stub-dev",
.owner = THIS_MODULE,
.of_match_table = msm_dai_stub_dev_dt_match,
+ .suppress_bind_attrs = true,
},
};
@@ -343,6 +344,7 @@
.name = "msm-dai-stub",
.owner = THIS_MODULE,
.of_match_table = msm_dai_stub_dt_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/asoc/msm-lsm-client.c b/asoc/msm-lsm-client.c
index 3a5707e..0df322c 100644
--- a/asoc/msm-lsm-client.c
+++ b/asoc/msm-lsm-client.c
@@ -2425,6 +2425,7 @@
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct lsm_priv *prtd;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
int ret = 0;
pr_debug("%s\n", __func__);
@@ -2488,6 +2489,8 @@
prtd->lsm_client->perf_mode = 0;
prtd->lsm_client->event_mode = LSM_EVENT_NON_TIME_STAMP_MODE;
prtd->lsm_client->event_type = LSM_DET_EVENT_TYPE_LEGACY;
+ prtd->lsm_client->fe_id = rtd->dai_link->id;
+ prtd->lsm_client->unprocessed_data = 0;
return 0;
}
@@ -2958,13 +2961,81 @@
return 0;
}
+static int msm_lsm_afe_data_ctl_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ u64 fe_id = kcontrol->private_value;
+ uint16_t afe_data_format = 0;
+ int ret = 0;
+
+ afe_data_format = ucontrol->value.integer.value[0];
+ pr_debug("%s: afe data is %s\n", __func__,
+ afe_data_format ? "unprocessed" : "processed");
+
+ ret = q6lsm_set_afe_data_format(fe_id, afe_data_format);
+ if (ret)
+ pr_err("%s: q6lsm_set_afe_data_format failed, ret = %d\n",
+ __func__, ret);
+
+ return ret;
+}
+
+static int msm_lsm_afe_data_ctl_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ u64 fe_id = kcontrol->private_value;
+ uint16_t afe_data_format = 0;
+ int ret = 0;
+
+ q6lsm_get_afe_data_format(fe_id, &afe_data_format);
+ ucontrol->value.integer.value[0] = afe_data_format;
+ pr_debug("%s: afe data is %s\n", __func__,
+ afe_data_format ? "unprocessed" : "processed");
+
+ return ret;
+}
+
+static int msm_lsm_add_afe_data_controls(struct snd_soc_pcm_runtime *rtd)
+{
+ struct snd_pcm *pcm = rtd->pcm;
+ struct snd_pcm_usr *afe_data_info;
+ struct snd_kcontrol *kctl;
+ const char *mixer_ctl_name = "Listen Stream";
+ const char *deviceNo = "NN";
+ const char *suffix = "Unprocessed Data";
+ int ctl_len, ret = 0;
+
+ ctl_len = strlen(mixer_ctl_name) + 1 + strlen(deviceNo) + 1 +
+ strlen(suffix) + 1;
+ pr_debug("%s: Adding Listen afe data cntrls\n", __func__);
+ ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE,
+ NULL, 1, ctl_len, rtd->dai_link->id,
+ &afe_data_info);
+ if (ret < 0) {
+ pr_err("%s: Adding Listen afe data cntrls failed: %d\n",
+ __func__, ret);
+ return ret;
+ }
+ kctl = afe_data_info->kctl;
+ snprintf(kctl->id.name, ctl_len, "%s %d %s",
+ mixer_ctl_name, rtd->pcm->device, suffix);
+ kctl->put = msm_lsm_afe_data_ctl_put;
+ kctl->get = msm_lsm_afe_data_ctl_get;
+
+ return 0;
+}
+
static int msm_lsm_add_controls(struct snd_soc_pcm_runtime *rtd)
{
int ret = 0;
ret = msm_lsm_add_app_type_controls(rtd);
if (ret)
- pr_err("%s, add app type controls failed:%d\n", __func__, ret);
+ pr_err("%s, add app type controls failed:%d\n", __func__, ret);
+
+ ret = msm_lsm_add_afe_data_controls(rtd);
+ if (ret)
+ pr_err("%s, add afe data controls failed:%d\n", __func__, ret);
return ret;
}
@@ -3033,6 +3104,7 @@
.name = "msm-lsm-client",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(msm_lsm_client_dt_match),
+ .suppress_bind_attrs = true,
},
.probe = msm_lsm_probe,
.remove = msm_lsm_remove,
diff --git a/asoc/msm-pcm-afe-v2.c b/asoc/msm-pcm-afe-v2.c
index 3db81db..8494fcb 100644
--- a/asoc/msm-pcm-afe-v2.c
+++ b/asoc/msm-pcm-afe-v2.c
@@ -896,6 +896,7 @@
.name = "msm-pcm-afe",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_afe_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_afe_probe,
.remove = msm_afe_remove,
diff --git a/asoc/msm-pcm-dtmf-v2.c b/asoc/msm-pcm-dtmf-v2.c
index 58ae5fa..7f79471 100644
--- a/asoc/msm-pcm-dtmf-v2.c
+++ b/asoc/msm-pcm-dtmf-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2013-2014, 2017-2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, 2017-2019 The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -567,6 +567,7 @@
.name = "msm-pcm-dtmf",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_dtmf_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-pcm-host-voice-v2.c b/asoc/msm-pcm-host-voice-v2.c
index 49e9591..41c3982 100644
--- a/asoc/msm-pcm-host-voice-v2.c
+++ b/asoc/msm-pcm-host-voice-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -1477,6 +1477,7 @@
.name = "msm-voice-host-pcm",
.owner = THIS_MODULE,
.of_match_table = msm_voice_host_pcm_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-pcm-hostless.c b/asoc/msm-pcm-hostless.c
index 3109b72..63c5db8 100644
--- a/asoc/msm-pcm-hostless.c
+++ b/asoc/msm-pcm-hostless.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2011-2014, 2017-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2014, 2017-2019 The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -56,6 +56,7 @@
.name = "msm-pcm-hostless",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_hostless_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_hostless_probe,
.remove = msm_pcm_hostless_remove,
diff --git a/asoc/msm-pcm-loopback-v2.c b/asoc/msm-pcm-loopback-v2.c
index 4834e81..07cf20b 100644
--- a/asoc/msm-pcm-loopback-v2.c
+++ b/asoc/msm-pcm-loopback-v2.c
@@ -1504,6 +1504,7 @@
.name = "msm-pcm-loopback",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_loopback_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-pcm-q6-noirq.c b/asoc/msm-pcm-q6-noirq.c
index 3452614..b33eba3 100644
--- a/asoc/msm-pcm-q6-noirq.c
+++ b/asoc/msm-pcm-q6-noirq.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -1340,6 +1340,7 @@
.name = "msm-pcm-dsp-noirq",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_noirq_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c
index 322bf66..3b20ecc 100644
--- a/asoc/msm-pcm-q6-v2.c
+++ b/asoc/msm-pcm-q6-v2.c
@@ -950,8 +950,8 @@
int xfer;
char *bufptr;
void *data = NULL;
- static uint32_t idx;
- static uint32_t size;
+ uint32_t idx = 0;
+ uint32_t size = 0;
uint32_t offset = 0;
struct snd_pcm_runtime *runtime = substream->runtime;
struct msm_audio *prtd = substream->runtime->private_data;
@@ -2695,6 +2695,7 @@
.name = "msm-pcm-dsp",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index d5bad0f..77d1077 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -65,6 +65,7 @@
static int tert_mi2s_switch_enable;
static int quat_mi2s_switch_enable;
static int quin_mi2s_switch_enable;
+static int sen_mi2s_switch_enable;
static int fm_pcmrx_switch_enable;
static int usb_switch_enable;
static int lsm_port_index;
@@ -82,6 +83,8 @@
static int aanc_level;
static int num_app_cfg_types;
static int msm_ec_ref_port_id;
+static int afe_loopback_tx_port_index;
+static int afe_loopback_tx_port_id = -1;
#define WEIGHT_0_DB 0x4000
/* all the FEs which can support channel mixer */
@@ -545,6 +548,38 @@
LPASS_BE_QUIN_TDM_RX_7},
{ AFE_PORT_ID_QUINARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0,
LPASS_BE_QUIN_TDM_TX_7},
+ { AFE_PORT_ID_SENARY_TDM_RX, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_0},
+ { AFE_PORT_ID_SENARY_TDM_TX, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_0},
+ { AFE_PORT_ID_SENARY_TDM_RX_1, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_1},
+ { AFE_PORT_ID_SENARY_TDM_TX_1, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_1},
+ { AFE_PORT_ID_SENARY_TDM_RX_2, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_2},
+ { AFE_PORT_ID_SENARY_TDM_TX_2, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_2},
+ { AFE_PORT_ID_SENARY_TDM_RX_3, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_3},
+ { AFE_PORT_ID_SENARY_TDM_TX_3, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_3},
+ { AFE_PORT_ID_SENARY_TDM_RX_4, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_4},
+ { AFE_PORT_ID_SENARY_TDM_TX_4, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_4},
+ { AFE_PORT_ID_SENARY_TDM_RX_5, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_5},
+ { AFE_PORT_ID_SENARY_TDM_TX_5, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_5},
+ { AFE_PORT_ID_SENARY_TDM_RX_6, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_6},
+ { AFE_PORT_ID_SENARY_TDM_TX_6, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_6},
+ { AFE_PORT_ID_SENARY_TDM_RX_7, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_RX_7},
+ { AFE_PORT_ID_SENARY_TDM_TX_7, 0, {0}, {0}, 0, 0, 0, 0,
+ LPASS_BE_SEN_TDM_TX_7},
{ INT_BT_A2DP_RX, 0, {0}, {0}, 0, 0, 0, 0,
LPASS_BE_INT_BT_A2DP_RX},
{ AFE_PORT_ID_USB_RX, 0, {0}, {0}, 0, 0, 0, 0,
@@ -857,7 +892,20 @@
static int get_port_id(int port_id)
{
- return (port_id == AFE_LOOPBACK_TX ? msm_ec_ref_port_id : port_id);
+ int ret = port_id;
+
+ if (port_id == AFE_LOOPBACK_TX) {
+ /*
+ * Return afe_loopback_tx_port_id if set. Else return
+ * msm_ec_ref_port_id to maintain backward compatibility.
+ */
+ if (afe_loopback_tx_port_id != -1)
+ ret = afe_loopback_tx_port_id;
+ else
+ ret = msm_ec_ref_port_id;
+ }
+
+ return ret;
}
static bool is_mm_lsm_fe_id(int fe_id)
@@ -2818,6 +2866,36 @@
return 1;
}
+static int msm_routing_get_sen_mi2s_switch_mixer(
+ struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ ucontrol->value.integer.value[0] = sen_mi2s_switch_enable;
+ pr_debug("%s: SEN MI2S Switch enable %ld\n", __func__,
+ ucontrol->value.integer.value[0]);
+ return 0;
+}
+
+static int msm_routing_put_sen_mi2s_switch_mixer(
+ struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_dapm_widget *widget =
+ snd_soc_dapm_kcontrol_widget(kcontrol);
+ struct snd_soc_dapm_update *update = NULL;
+
+ pr_debug("%s: SEN MI2S Switch enable %ld\n", __func__,
+ ucontrol->value.integer.value[0]);
+ if (ucontrol->value.integer.value[0])
+ snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 1,
+ update);
+ else
+ snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, 0,
+ update);
+ sen_mi2s_switch_enable = ucontrol->value.integer.value[0];
+ return 1;
+}
+
static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -3327,6 +3405,10 @@
"QUIN_TDM_RX_2", "QUIN_TDM_TX_2", "QUIN_TDM_RX_3", "QUIN_TDM_TX_3",
"QUIN_TDM_RX_4", "QUIN_TDM_TX_4", "QUIN_TDM_RX_5", "QUIN_TDM_TX_5",
"QUIN_TDM_RX_6", "QUIN_TDM_TX_6", "QUIN_TDM_RX_7", "QUIN_TDM_TX_7",
+"SEN_TDM_RX_0", "SEN_TDM_TX_0", "SEN_TDM_RX_1", "SEN_TDM_TX_1",
+"SEN_TDM_RX_2", "SEN_TDM_TX_2", "SEN_TDM_RX_3", "SEN_TDM_TX_3",
+"SEN_TDM_RX_4", "SEN_TDM_TX_4", "SEN_TDM_RX_5", "SEN_TDM_TX_5",
+"SEN_TDM_RX_6", "SEN_TDM_TX_6", "SEN_TDM_RX_7", "SEN_TDM_TX_7",
"INT_BT_A2DP_RX", "USB_RX", "USB_TX", "DISPLAY_PORT_RX",
"DISPLAY_PORT_RX1", "TERT_AUXPCM_RX", "TERT_AUXPCM_TX", "QUAT_AUXPCM_RX",
"QUAT_AUXPCM_TX", "QUIN_AUXPCM_RX", "QUIN_AUXPCM_TX", "INT0_MI2S_RX",
@@ -3611,7 +3693,7 @@
msm_pcm_put_channel_rule_index),
SOC_SINGLE_EXT("MultiMedia1 Channels", SND_SOC_NOPM,
- MSM_FRONTEND_DAI_MULTIMEDIA1, 8, 0,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 10, 0,
msm_pcm_get_out_chs,
msm_pcm_put_out_chs),
SOC_SINGLE_EXT("MultiMedia2 Channels", SND_SOC_NOPM,
@@ -3753,6 +3835,26 @@
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia1 Output Channel9",
+ .info = msm_pcm_channel_weight_info,
+ .get = msm_pcm_channel_weight_get,
+ .put = msm_pcm_channel_weight_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 8,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia1 Output Channel10",
+ .info = msm_pcm_channel_weight_info,
+ .get = msm_pcm_channel_weight_get,
+ .put = msm_pcm_channel_weight_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA1, .rshift = 9,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.name = "MultiMedia2 Output Channel1",
.info = msm_pcm_channel_weight_info,
.get = msm_pcm_channel_weight_get,
@@ -4030,6 +4132,191 @@
return 0;
}
+static int get_ec_ref_port_id(int value, int *index)
+{
+ int port_id;
+
+ switch (value) {
+ case 0:
+ *index = 0;
+ port_id = AFE_PORT_INVALID;
+ break;
+ case 1:
+ *index = 1;
+ port_id = SLIMBUS_0_RX;
+ break;
+ case 2:
+ *index = 2;
+ port_id = AFE_PORT_ID_PRIMARY_MI2S_RX;
+ break;
+ case 3:
+ *index = 3;
+ port_id = AFE_PORT_ID_PRIMARY_MI2S_TX;
+ break;
+ case 4:
+ *index = 4;
+ port_id = AFE_PORT_ID_SECONDARY_MI2S_TX;
+ break;
+ case 5:
+ *index = 5;
+ port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
+ break;
+ case 6:
+ *index = 6;
+ port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
+ break;
+ case 7:
+ *index = 7;
+ port_id = AFE_PORT_ID_SECONDARY_MI2S_RX;
+ break;
+ case 9:
+ *index = 9;
+ port_id = SLIMBUS_5_RX;
+ break;
+ case 10:
+ *index = 10;
+ port_id = SLIMBUS_1_TX;
+ break;
+ case 11:
+ *index = 11;
+ port_id = AFE_PORT_ID_QUATERNARY_TDM_TX_1;
+ break;
+ case 12:
+ *index = 12;
+ port_id = AFE_PORT_ID_QUATERNARY_TDM_RX;
+ break;
+ case 13:
+ *index = 13;
+ port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_1;
+ break;
+ case 14:
+ *index = 14;
+ port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_2;
+ break;
+ case 15:
+ *index = 15;
+ port_id = SLIMBUS_6_RX;
+ break;
+ case 16:
+ *index = 16;
+ port_id = AFE_PORT_ID_TERTIARY_MI2S_RX;
+ break;
+ case 17:
+ *index = 17;
+ port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
+ break;
+ case 18:
+ *index = 18;
+ port_id = AFE_PORT_ID_TERTIARY_TDM_TX;
+ break;
+ case 19:
+ *index = 19;
+ port_id = AFE_PORT_ID_USB_RX;
+ break;
+ case 20:
+ *index = 20;
+ port_id = AFE_PORT_ID_INT0_MI2S_RX;
+ break;
+ case 21:
+ *index = 21;
+ port_id = AFE_PORT_ID_INT4_MI2S_RX;
+ break;
+ case 22:
+ *index = 22;
+ port_id = AFE_PORT_ID_INT3_MI2S_TX;
+ break;
+ case 23:
+ *index = 23;
+ port_id = AFE_PORT_ID_HDMI_OVER_DP_RX;
+ break;
+ case 24:
+ *index = 24;
+ port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0;
+ break;
+ case 25:
+ *index = 25;
+ port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1;
+ break;
+ case 26:
+ *index = 26;
+ port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0;
+ break;
+ case 27:
+ *index = 27;
+ port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1;
+ break;
+ case 28:
+ *index = 28;
+ port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2;
+ break;
+ case 29:
+ *index = 29;
+ port_id = SLIMBUS_7_RX;
+ break;
+ case 30:
+ *index = 30;
+ port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_0;
+ break;
+ case 31:
+ *index = 31;
+ port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_1;
+ break;
+ case 32:
+ *index = 32;
+ port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_2;
+ break;
+ case 33:
+ *index = 33;
+ port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_3;
+ break;
+ case 34:
+ *index = 34;
+ port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_0;
+ break;
+ case 35:
+ *index = 35;
+ port_id = AFE_PORT_ID_TERTIARY_TDM_RX_2;
+ break;
+ case 36:
+ *index = 36;
+ port_id = AFE_PORT_ID_SECONDARY_TDM_TX;
+ break;
+ default:
+ *index = 0; /* NONE */
+ pr_err("%s: Invalid value %d\n", __func__, value);
+ port_id = AFE_PORT_INVALID;
+ break;
+ }
+
+ return port_id;
+}
+
+static int msm_routing_afe_lb_tx_port_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ pr_debug("%s: port index = %d", __func__, afe_loopback_tx_port_index);
+ mutex_lock(&routing_lock);
+ ucontrol->value.integer.value[0] = afe_loopback_tx_port_index;
+ mutex_unlock(&routing_lock);
+
+ return 0;
+}
+
+static int msm_routing_afe_lb_tx_port_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ int value = ucontrol->value.integer.value[0];
+
+ mutex_lock(&routing_lock);
+ afe_loopback_tx_port_id = get_ec_ref_port_id(value,
+ &afe_loopback_tx_port_index);
+ pr_debug("%s: afe_loopback_tx_port_index = %d\n",
+ __func__, afe_loopback_tx_port_index);
+ mutex_unlock(&routing_lock);
+
+ return 0;
+}
+
static const char *const ec_ref_rate_text[] = {"0", "8000", "16000",
"32000", "44100", "48000", "96000", "192000", "384000"};
@@ -4039,218 +4326,6 @@
SOC_ENUM_SINGLE_EXT(9, ec_ref_rate_text),
};
-static const struct snd_kcontrol_new ec_ref_param_controls[] = {
- SOC_ENUM_EXT("EC Reference Channels", msm_route_ec_ref_params_enum[0],
- msm_ec_ref_ch_get, msm_ec_ref_ch_put),
- SOC_ENUM_EXT("EC Reference Bit Format", msm_route_ec_ref_params_enum[1],
- msm_ec_ref_bit_format_get, msm_ec_ref_bit_format_put),
- SOC_ENUM_EXT("EC Reference SampleRate", msm_route_ec_ref_params_enum[2],
- msm_ec_ref_rate_get, msm_ec_ref_rate_put),
- SOC_ENUM_EXT("EC Reference Downmixed Channels", msm_route_ec_ref_params_enum[0],
- msm_ec_ref_ch_downmixed_get, msm_ec_ref_ch_downmixed_put),
- SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch1", SND_SOC_NOPM, 0,
- 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8,
- NULL, msm_ec_ref_chmixer_weights_put),
- SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch2", SND_SOC_NOPM, 1,
- 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8,
- NULL, msm_ec_ref_chmixer_weights_put),
- SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch3", SND_SOC_NOPM, 2,
- 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8,
- NULL, msm_ec_ref_chmixer_weights_put),
- SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch4", SND_SOC_NOPM, 3,
- 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8,
- NULL, msm_ec_ref_chmixer_weights_put),
- SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch5", SND_SOC_NOPM, 4,
- 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8,
- NULL, msm_ec_ref_chmixer_weights_put),
- SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch6", SND_SOC_NOPM, 5,
- 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8,
- NULL, msm_ec_ref_chmixer_weights_put),
-};
-
-static int msm_routing_ec_ref_rx_get(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol)
-{
- pr_debug("%s: ec_ref_rx = %d", __func__, msm_route_ec_ref_rx);
- mutex_lock(&routing_lock);
- ucontrol->value.integer.value[0] = msm_route_ec_ref_rx;
- mutex_unlock(&routing_lock);
- return 0;
-}
-
-static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol)
-{
- int ec_ref_port_id;
- struct snd_soc_dapm_widget *widget =
- snd_soc_dapm_kcontrol_widget(kcontrol);
- struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
- struct snd_soc_dapm_update *update = NULL;
-
-
- mutex_lock(&routing_lock);
- switch (ucontrol->value.integer.value[0]) {
- case 0:
- msm_route_ec_ref_rx = 0;
- ec_ref_port_id = AFE_PORT_INVALID;
- break;
- case 1:
- msm_route_ec_ref_rx = 1;
- ec_ref_port_id = SLIMBUS_0_RX;
- break;
- case 2:
- msm_route_ec_ref_rx = 2;
- ec_ref_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX;
- break;
- case 3:
- msm_route_ec_ref_rx = 3;
- ec_ref_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX;
- break;
- case 4:
- msm_route_ec_ref_rx = 4;
- ec_ref_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX;
- break;
- case 5:
- msm_route_ec_ref_rx = 5;
- ec_ref_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
- break;
- case 6:
- msm_route_ec_ref_rx = 6;
- ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
- break;
- case 7:
- msm_route_ec_ref_rx = 7;
- ec_ref_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX;
- break;
- case 9:
- msm_route_ec_ref_rx = 9;
- ec_ref_port_id = SLIMBUS_5_RX;
- break;
- case 10:
- msm_route_ec_ref_rx = 10;
- ec_ref_port_id = SLIMBUS_1_TX;
- break;
- case 11:
- msm_route_ec_ref_rx = 11;
- ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_TX_1;
- break;
- case 12:
- msm_route_ec_ref_rx = 12;
- ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_RX;
- break;
- case 13:
- msm_route_ec_ref_rx = 13;
- ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_1;
- break;
- case 14:
- msm_route_ec_ref_rx = 14;
- ec_ref_port_id = AFE_PORT_ID_QUATERNARY_TDM_RX_2;
- break;
- case 15:
- msm_route_ec_ref_rx = 15;
- ec_ref_port_id = SLIMBUS_6_RX;
- break;
- case 16:
- msm_route_ec_ref_rx = 16;
- ec_ref_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX;
- break;
- case 17:
- msm_route_ec_ref_rx = 17;
- ec_ref_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
- break;
- case 18:
- msm_route_ec_ref_rx = 18;
- ec_ref_port_id = AFE_PORT_ID_TERTIARY_TDM_TX;
- break;
- case 19:
- msm_route_ec_ref_rx = 19;
- ec_ref_port_id = AFE_PORT_ID_USB_RX;
- break;
- case 20:
- msm_route_ec_ref_rx = 20;
- ec_ref_port_id = AFE_PORT_ID_INT0_MI2S_RX;
- break;
- case 21:
- msm_route_ec_ref_rx = 21;
- ec_ref_port_id = AFE_PORT_ID_INT4_MI2S_RX;
- break;
- case 22:
- msm_route_ec_ref_rx = 22;
- ec_ref_port_id = AFE_PORT_ID_INT3_MI2S_TX;
- break;
- case 23:
- msm_route_ec_ref_rx = 23;
- ec_ref_port_id = AFE_PORT_ID_HDMI_OVER_DP_RX;
- break;
- case 24:
- msm_route_ec_ref_rx = 24;
- ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_0;
- break;
- case 25:
- msm_route_ec_ref_rx = 25;
- ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_RX_1;
- break;
- case 26:
- msm_route_ec_ref_rx = 26;
- ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_0;
- break;
- case 27:
- msm_route_ec_ref_rx = 27;
- ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_1;
- break;
- case 28:
- msm_route_ec_ref_rx = 28;
- ec_ref_port_id = AFE_PORT_ID_WSA_CODEC_DMA_TX_2;
- break;
- case 29:
- msm_route_ec_ref_rx = 29;
- ec_ref_port_id = SLIMBUS_7_RX;
- break;
- case 30:
- msm_route_ec_ref_rx = 30;
- ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_0;
- break;
- case 31:
- msm_route_ec_ref_rx = 31;
- ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_1;
- break;
- case 32:
- msm_route_ec_ref_rx = 32;
- ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_2;
- break;
- case 33:
- msm_route_ec_ref_rx = 33;
- ec_ref_port_id = AFE_PORT_ID_RX_CODEC_DMA_RX_3;
- break;
- case 34:
- msm_route_ec_ref_rx = 34;
- ec_ref_port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_0;
- break;
- case 35:
- msm_route_ec_ref_rx = 35;
- ec_ref_port_id = AFE_PORT_ID_TERTIARY_TDM_RX_2;
- break;
- case 36:
- msm_route_ec_ref_rx = 36;
- ec_ref_port_id = AFE_PORT_ID_SECONDARY_TDM_TX;
- break;
- default:
- msm_route_ec_ref_rx = 0; /* NONE */
- pr_err("%s EC ref rx %ld not valid\n",
- __func__, ucontrol->value.integer.value[0]);
- ec_ref_port_id = AFE_PORT_INVALID;
- break;
- }
- msm_ec_ref_port_id = ec_ref_port_id;
- adm_ec_ref_rx_id(ec_ref_port_id);
- pr_debug("%s: msm_route_ec_ref_rx = %d\n",
- __func__, msm_route_ec_ref_rx);
- mutex_unlock(&routing_lock);
- snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
- msm_route_ec_ref_rx, e, update);
- return 0;
-}
-
static const char *const ec_ref_rx[] = { "None", "SLIM_RX", "I2S_RX",
"PRI_MI2S_TX", "SEC_MI2S_TX",
"TERT_MI2S_TX", "QUAT_MI2S_TX", "SEC_I2S_RX", "PROXY_RX",
@@ -4268,6 +4343,70 @@
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_rx), ec_ref_rx),
};
+static const struct snd_kcontrol_new ec_ref_param_controls[] = {
+ SOC_ENUM_EXT("EC Reference Channels", msm_route_ec_ref_params_enum[0],
+ msm_ec_ref_ch_get, msm_ec_ref_ch_put),
+ SOC_ENUM_EXT("EC Reference Bit Format", msm_route_ec_ref_params_enum[1],
+ msm_ec_ref_bit_format_get, msm_ec_ref_bit_format_put),
+ SOC_ENUM_EXT("EC Reference SampleRate", msm_route_ec_ref_params_enum[2],
+ msm_ec_ref_rate_get, msm_ec_ref_rate_put),
+ SOC_ENUM_EXT("EC Reference Downmixed Channels",
+ msm_route_ec_ref_params_enum[0],
+ msm_ec_ref_ch_downmixed_get, msm_ec_ref_ch_downmixed_put),
+ SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch1", SND_SOC_NOPM,
+ 0, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL,
+ msm_ec_ref_chmixer_weights_put),
+ SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch2", SND_SOC_NOPM,
+ 1, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL,
+ msm_ec_ref_chmixer_weights_put),
+ SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch3", SND_SOC_NOPM,
+ 2, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL,
+ msm_ec_ref_chmixer_weights_put),
+ SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch4", SND_SOC_NOPM,
+ 3, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL,
+ msm_ec_ref_chmixer_weights_put),
+ SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch5", SND_SOC_NOPM,
+ 4, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL,
+ msm_ec_ref_chmixer_weights_put),
+ SOC_SINGLE_MULTI_EXT("EC Reference ChMixer Weights Ch6", SND_SOC_NOPM,
+ 5, 16384, 0, PCM_FORMAT_MAX_NUM_CHANNEL_V8, NULL,
+ msm_ec_ref_chmixer_weights_put),
+ SOC_ENUM_EXT("AFE_LOOPBACK_TX Port", msm_route_ec_ref_rx_enum[0],
+ msm_routing_afe_lb_tx_port_get, msm_routing_afe_lb_tx_port_put),
+};
+
+static int msm_routing_ec_ref_rx_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ pr_debug("%s: ec_ref_rx = %d", __func__, msm_route_ec_ref_rx);
+ mutex_lock(&routing_lock);
+ ucontrol->value.integer.value[0] = msm_route_ec_ref_rx;
+ mutex_unlock(&routing_lock);
+
+ return 0;
+}
+
+static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ int value = ucontrol->value.integer.value[0];
+ struct snd_soc_dapm_widget *widget =
+ snd_soc_dapm_kcontrol_widget(kcontrol);
+ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+ struct snd_soc_dapm_update *update = NULL;
+
+ mutex_lock(&routing_lock);
+ msm_ec_ref_port_id = get_ec_ref_port_id(value, &msm_route_ec_ref_rx);
+ adm_ec_ref_rx_id(msm_ec_ref_port_id);
+ pr_debug("%s: msm_route_ec_ref_rx = %d\n",
+ __func__, msm_route_ec_ref_rx);
+ mutex_unlock(&routing_lock);
+
+ snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
+ msm_route_ec_ref_rx, e, update);
+ return 0;
+}
+
static const struct snd_kcontrol_new ext_ec_ref_mux_ul1 =
SOC_DAPM_ENUM_EXT("AUDIO_REF_EC_UL1 MUX Mux",
msm_route_ec_ref_rx_enum[0],
@@ -5322,6 +5461,98 @@
};
+static const struct snd_kcontrol_new senary_mi2s_rx_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+
+};
+
static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
@@ -7759,6 +7990,78 @@
MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
};
+
+static const struct snd_kcontrol_new sen_auxpcm_rx_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_TDM_RX_0,
@@ -9617,6 +9920,373 @@
msm_routing_put_audio_mixer),
};
+static const struct snd_kcontrol_new sen_tdm_rx_0_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_tx_0_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_1_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_2_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_3_mixer_controls[] = {
+ SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia20", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia21", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
SOC_DOUBLE_EXT("PRI_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_I2S_TX,
@@ -9678,6 +10348,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_INT_BT_SCO_TX,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
@@ -9710,6 +10384,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_TDM_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
@@ -9790,6 +10468,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_7_TX,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
@@ -9917,6 +10611,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_TDM_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
@@ -9997,6 +10695,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_8_TX,
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
@@ -10116,6 +10830,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_AUX_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
@@ -10212,6 +10930,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
@@ -10387,6 +11121,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
@@ -10518,6 +11268,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_AUX_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
@@ -10614,6 +11368,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
@@ -10741,6 +11511,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_AUXPCM_TX,
MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
@@ -10837,6 +11611,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("USB_AUDIO_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_USB_TX,
MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
@@ -11040,6 +11830,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_7_TX,
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
@@ -11416,6 +12222,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
@@ -12026,6 +12848,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_TDM_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
@@ -12106,6 +12932,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
@@ -12257,6 +13099,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_0", SND_SOC_NOPM,
MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
@@ -12356,6 +13214,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_TX,
MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_SPDIF_TX,
MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
@@ -13016,6 +13878,29 @@
msm_routing_put_voice_mixer),
};
+static const struct snd_kcontrol_new sen_mi2s_rx_voice_mixer_controls[] = {
+ SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+};
+
static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM,
MSM_BACKEND_DAI_AFE_PCM_RX,
@@ -13154,6 +14039,26 @@
msm_routing_put_voice_mixer),
};
+static const struct snd_kcontrol_new sen_aux_pcm_rx_voice_mixer_controls[] = {
+ SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("DTMF", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("QCHAT", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
+};
+
static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM,
MSM_BACKEND_DAI_HDMI_RX,
@@ -13666,6 +14571,9 @@
SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_MMode1", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUIN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1,
0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_MMode1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1,
+ 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("PRI_MI2S_TX_MMode1", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0,
msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
@@ -13721,7 +14629,7 @@
SOC_DOUBLE_EXT("QUIN_MI2S_TX_MMode1", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
- SOC_DOUBLE_EXT("PRI_TDM_TX3_MMode1", SND_SOC_NOPM,
+ SOC_DOUBLE_EXT("PRI_TDM_TX_3_MMode1", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE1,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
};
@@ -13759,6 +14667,9 @@
SOC_DOUBLE_EXT("QUIN_AUX_PCM_TX_MMode2", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUIN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1,
0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_MMode2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1,
+ 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("PRI_MI2S_TX_MMode2", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0,
msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
@@ -13810,8 +14721,8 @@
SOC_DOUBLE_EXT("QUIN_MI2S_TX_MMode2", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
- SOC_DOUBLE_EXT("PRI_TDM_TX3_MMode2", SND_SOC_NOPM,
- MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE1,
+ SOC_DOUBLE_EXT("PRI_TDM_TX_3_MMode2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE2,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
};
@@ -13856,6 +14767,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_Voip", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("PRI_MI2S_TX_Voip", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_MI2S_TX,
MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
@@ -13969,6 +14884,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
msm_routing_put_voice_stub_mixer),
+ SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
+ msm_routing_put_voice_stub_mixer),
SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_TX,
MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
@@ -14060,6 +14979,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
msm_routing_put_voice_stub_mixer),
+ SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
+ msm_routing_put_voice_stub_mixer),
SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_TX,
MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
@@ -14163,6 +15086,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
msm_routing_put_voice_stub_mixer),
+ SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
+ msm_routing_put_voice_stub_mixer),
SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_TX,
MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
@@ -14266,6 +15193,10 @@
MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer,
msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("SEN_AUX_PCM_TX_QCHAT", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX,
+ MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("MI2S_TX_QCHAT", SND_SOC_NOPM,
MSM_BACKEND_DAI_MI2S_TX,
MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer,
@@ -14344,6 +15275,10 @@
MSM_BACKEND_DAI_INT0_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INT0_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_INT0_MI2S_RX,
MSM_BACKEND_DAI_INT3_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14391,6 +15326,10 @@
MSM_BACKEND_DAI_INT4_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INT4_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_INT4_MI2S_RX,
MSM_BACKEND_DAI_INT3_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14497,6 +15436,10 @@
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_BACKEND_DAI_QUIN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_0_RX,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14521,6 +15464,10 @@
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_0_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14545,6 +15492,10 @@
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_MI2S_RX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_0_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14642,6 +15593,21 @@
msm_routing_put_port_mixer),
};
+static const struct snd_kcontrol_new sen_auxpcm_rx_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("SEN_AUXPCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_BACKEND_DAI_SEN_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_AUXPCM_RX,
+ MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = {
SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SLIMBUS_1_RX,
@@ -14838,6 +15804,10 @@
MSM_BACKEND_DAI_PRI_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_MI2S_RX,
MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14892,6 +15862,10 @@
MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14919,6 +15893,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUINARY_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUINARY_MI2S_RX,
MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
@@ -14929,6 +15907,41 @@
msm_routing_put_port_mixer),
};
+static const struct snd_kcontrol_new sen_mi2s_rx_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_PRI_MI2S_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_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SLIM_8_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SENARY_MI2S_RX,
+ MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
static const struct snd_kcontrol_new pri_tdm_rx_0_port_mixer_controls[] = {
SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_TDM_RX_0,
@@ -15030,6 +16043,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new pri_tdm_rx_1_port_mixer_controls[] = {
@@ -15133,6 +16166,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new pri_tdm_rx_2_port_mixer_controls[] = {
@@ -15236,6 +16289,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new pri_tdm_rx_3_port_mixer_controls[] = {
@@ -15339,6 +16412,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new sec_tdm_rx_0_port_mixer_controls[] = {
@@ -15442,6 +16535,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new sec_tdm_rx_1_port_mixer_controls[] = {
@@ -15545,6 +16658,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new sec_tdm_rx_2_port_mixer_controls[] = {
@@ -15648,6 +16781,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new sec_tdm_rx_3_port_mixer_controls[] = {
@@ -15751,6 +16904,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new sec_tdm_rx_7_port_mixer_controls[] = {
@@ -15862,6 +17035,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new tert_tdm_rx_1_port_mixer_controls[] = {
@@ -15965,6 +17158,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new tert_tdm_rx_2_port_mixer_controls[] = {
@@ -16068,6 +17281,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new tert_tdm_rx_3_port_mixer_controls[] = {
@@ -16171,6 +17404,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quat_tdm_rx_0_port_mixer_controls[] = {
@@ -16274,6 +17527,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quat_tdm_rx_1_port_mixer_controls[] = {
@@ -16377,6 +17650,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quat_tdm_rx_2_port_mixer_controls[] = {
@@ -16480,6 +17773,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quat_tdm_rx_3_port_mixer_controls[] = {
@@ -16583,6 +17896,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quat_tdm_rx_7_port_mixer_controls[] = {
@@ -16694,6 +18027,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quin_tdm_rx_1_port_mixer_controls[] = {
@@ -16797,6 +18150,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quin_tdm_rx_2_port_mixer_controls[] = {
@@ -16900,6 +18273,26 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quin_tdm_rx_3_port_mixer_controls[] = {
@@ -17003,6 +18396,518 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_0_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_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_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_INT_FM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_1_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_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_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_INT_FM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_2_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_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_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_INT_FM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
+static const struct snd_kcontrol_new sen_tdm_rx_3_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_PRI_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_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_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_INT_FM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_BT_SCO_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_AFE_PCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEC_AUX_PCM_UL_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEC_AUXPCM_TX, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_TERT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_TERT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_TERT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("TERT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_TERT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SEN_TDM_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new tert_mi2s_rx_port_mixer_controls[] = {
@@ -17026,6 +18931,10 @@
MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("SEC_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
MSM_BACKEND_DAI_SECONDARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
@@ -17057,6 +18966,10 @@
MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("SENARY_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
+ MSM_BACKEND_DAI_SENARY_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
@@ -17591,6 +19504,11 @@
0, 1, 0, msm_routing_get_quin_mi2s_switch_mixer,
msm_routing_put_quin_mi2s_switch_mixer);
+static const struct snd_kcontrol_new sen_mi2s_rx_switch_mixer_controls =
+ SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
+ 0, 1, 0, msm_routing_get_sen_mi2s_switch_mixer,
+ msm_routing_put_sen_mi2s_switch_mixer);
+
static const struct snd_kcontrol_new hfp_pri_aux_switch_mixer_controls =
SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
0, 1, 0, msm_routing_get_hfp_switch_mixer,
@@ -19095,6 +21013,9 @@
SND_SOC_DAPM_AIF_IN("QUIN_MI2S_DL_HL",
"Quinary MI2S_RX Hostless Playback",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_MI2S_DL_HL",
+ "Senary MI2S_RX Hostless Playback",
+ 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
0, 0, 0, 0),
@@ -19128,6 +21049,9 @@
SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_UL_HL",
"Quinary MI2S_TX Hostless Capture",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_MI2S_UL_HL",
+ "Senary MI2S_TX Hostless Capture",
+ 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("PRI_TDM_RX_0_DL_HL",
"Primary TDM0 Hostless Playback",
@@ -19369,6 +21293,54 @@
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7_UL_HL",
"Quinary TDM7 Hostless Capture",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_0_DL_HL",
+ "Senary TDM0 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_0_UL_HL",
+ "Senary TDM0 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_1_DL_HL",
+ "Senary TDM1 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_1_UL_HL",
+ "Senary TDM1 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_2_DL_HL",
+ "Senary TDM2 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_2_UL_HL",
+ "Senary TDM2 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_3_DL_HL",
+ "Senary TDM3 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_3_UL_HL",
+ "Senary TDM3 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_4_DL_HL",
+ "Senary TDM4 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_4_UL_HL",
+ "Senary TDM4 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_5_DL_HL",
+ "Senary TDM5 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_5_UL_HL",
+ "Senary TDM5 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_6_DL_HL",
+ "Senary TDM6 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_6_UL_HL",
+ "Senary TDM6 Hostless Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_RX_7_DL_HL",
+ "Senary TDM7 Hostless Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_TX_7_UL_HL",
+ "Senary TDM7 Hostless Capture",
+ 0, 0, 0, 0),
/* LSM */
SND_SOC_DAPM_AIF_OUT("LSM1_UL_HL", "Listen 1 Audio Service Capture",
@@ -19436,6 +21408,8 @@
0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("QUIN_MI2S_RX", "Quinary MI2S Playback",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_MI2S_RX", "Senary MI2S Playback",
+ 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX", "Quaternary MI2S Capture",
@@ -19632,6 +21606,38 @@
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_7", "Quinary TDM7 Capture",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_0", "Senary TDM0 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_0", "Senary TDM0 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_1", "Senary TDM1 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_1", "Senary TDM1 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_2", "Senary TDM2 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_2", "Senary TDM2 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_3", "Senary TDM3 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_3", "Senary TDM3 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_4", "Senary TDM4 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_4", "Senary TDM4 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_5", "Senary TDM5 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_5", "Senary TDM5 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_6", "Senary TDM6 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_6", "Senary TDM6 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_TDM_RX_7", "Senary TDM7 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_TDM_TX_7", "Senary TDM7 Capture",
+ 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_0", "WSA CDC DMA0 Playback",
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_0", "WSA CDC DMA0 Capture",
@@ -19713,6 +21719,10 @@
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("QUIN_AUX_PCM_TX", "Quin AUX PCM Capture",
0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEN_AUX_PCM_RX", "Sen AUX PCM Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEN_AUX_PCM_TX", "Sen AUX PCM Capture",
+ 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("VOICE2_STUB_DL", "VOICE2_STUB Playback",
@@ -19772,6 +21782,8 @@
&quin_mi2s_rx_switch_mixer_controls),
SND_SOC_DAPM_SWITCH("SCO_SLIM7_DL_HL", SND_SOC_NOPM, 0, 0,
&sco_slim7_switch_mixer_controls),
+ SND_SOC_DAPM_SWITCH("SEN_MI2S_RX_DL_HL", SND_SOC_NOPM, 0, 0,
+ &sen_mi2s_rx_switch_mixer_controls),
SND_SOC_DAPM_SWITCH("HFP_PRI_AUX_UL_HL", SND_SOC_NOPM, 0, 0,
&hfp_pri_aux_switch_mixer_controls),
SND_SOC_DAPM_SWITCH("HFP_AUX_UL_HL", SND_SOC_NOPM, 0, 0,
@@ -19840,6 +21852,9 @@
SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
quinary_mi2s_rx_mixer_controls,
ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ senary_mi2s_rx_mixer_controls,
+ ARRAY_SIZE(senary_mi2s_rx_mixer_controls)),
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)),
@@ -19918,6 +21933,21 @@
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
quin_tdm_rx_3_mixer_controls,
ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_tx_0_mixer_controls,
+ ARRAY_SIZE(sen_tdm_tx_0_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_0_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_0_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_1_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_1_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_2_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_2_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_3_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_3_mixer_controls)),
SND_SOC_DAPM_MIXER("WSA_CDC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
wsa_cdc_dma_rx_0_mixer_controls,
ARRAY_SIZE(wsa_cdc_dma_rx_0_mixer_controls)),
@@ -19997,6 +22027,9 @@
SND_SOC_DAPM_MIXER("QUIN_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
quin_auxpcm_rx_mixer_controls,
ARRAY_SIZE(quin_auxpcm_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+ sen_auxpcm_rx_mixer_controls,
+ ARRAY_SIZE(sen_auxpcm_rx_mixer_controls)),
/* incall */
SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
incall_music_delivery_mixer_controls,
@@ -20057,6 +22090,10 @@
SND_SOC_NOPM, 0, 0,
quin_aux_pcm_rx_voice_mixer_controls,
ARRAY_SIZE(quin_aux_pcm_rx_voice_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_AUX_PCM_RX_Voice Mixer",
+ SND_SOC_NOPM, 0, 0,
+ sen_aux_pcm_rx_voice_mixer_controls,
+ ARRAY_SIZE(sen_aux_pcm_rx_voice_mixer_controls)),
SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
SND_SOC_NOPM, 0, 0,
hdmi_rx_voice_mixer_controls,
@@ -20105,6 +22142,10 @@
SND_SOC_NOPM, 0, 0,
pri_tdm_rx_3_voice_mixer_controls,
ARRAY_SIZE(pri_tdm_rx_3_voice_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_MI2S_RX_Voice Mixer",
+ SND_SOC_NOPM, 0, 0,
+ sen_mi2s_rx_voice_mixer_controls,
+ ARRAY_SIZE(sen_mi2s_rx_voice_mixer_controls)),
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2_Voice Mixer",
SND_SOC_NOPM, 0, 0,
quat_tdm_rx_2_voice_mixer_controls,
@@ -20177,6 +22218,9 @@
SND_SOC_DAPM_MIXER("QUIN_AUXPCM_RX Port Mixer",
SND_SOC_NOPM, 0, 0, quin_auxpcm_rx_port_mixer_controls,
ARRAY_SIZE(quin_auxpcm_rx_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_AUXPCM_RX Port Mixer",
+ SND_SOC_NOPM, 0, 0, sen_auxpcm_rx_port_mixer_controls,
+ ARRAY_SIZE(sen_auxpcm_rx_port_mixer_controls)),
SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0,
sbus_1_rx_port_mixer_controls,
ARRAY_SIZE(sbus_1_rx_port_mixer_controls)),
@@ -20221,6 +22265,9 @@
SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
quin_mi2s_rx_port_mixer_controls,
ARRAY_SIZE(quin_mi2s_rx_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
+ sen_mi2s_rx_port_mixer_controls,
+ ARRAY_SIZE(sen_mi2s_rx_port_mixer_controls)),
SND_SOC_DAPM_MIXER("PRI_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0,
pri_tdm_rx_0_port_mixer_controls,
ARRAY_SIZE(pri_tdm_rx_0_port_mixer_controls)),
@@ -20287,6 +22334,18 @@
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0,
quin_tdm_rx_3_port_mixer_controls,
ARRAY_SIZE(quin_tdm_rx_3_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_0_port_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_0_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_1 Port Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_1_port_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_1_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_2 Port Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_2_port_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_2_port_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEN_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0,
+ sen_tdm_rx_3_port_mixer_controls,
+ ARRAY_SIZE(sen_tdm_rx_3_port_mixer_controls)),
SND_SOC_DAPM_MIXER("INT0_MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
int0_mi2s_rx_port_mixer_controls,
ARRAY_SIZE(int0_mi2s_rx_port_mixer_controls)),
@@ -21079,6 +23138,23 @@
{"QUIN_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
{"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX Audio Mixer"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX Audio Mixer"},
+
{"PRI_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
{"PRI_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
{"PRI_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
@@ -21576,6 +23652,104 @@
{"QUIN_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"},
{"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Audio Mixer"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia20", "MM_DL20"},
+ {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"},
+ {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0 Audio Mixer"},
+
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_TDM_TX_0", NULL, "SEN_TDM_TX_0 Audio Mixer"},
+
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia20", "MM_DL20"},
+ {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia21", "MM_DL21"},
+ {"SEN_TDM_RX_1", NULL, "SEN_TDM_RX_1 Audio Mixer"},
+
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia20", "MM_DL20"},
+ {"SEN_TDM_RX_2 Audio Mixer", "MultiMedia21", "MM_DL21"},
+ {"SEN_TDM_RX_2", NULL, "SEN_TDM_RX_2 Audio Mixer"},
+
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia20", "MM_DL20"},
+ {"SEN_TDM_RX_3 Audio Mixer", "MultiMedia21", "MM_DL21"},
+ {"SEN_TDM_RX_3", NULL, "SEN_TDM_RX_3 Audio Mixer"},
+
{"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
{"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"},
{"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
@@ -21588,6 +23762,8 @@
{"MultiMedia6 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia1 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
{"MultiMedia2 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"MultiMedia1 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
+ {"MultiMedia2 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"MultiMedia1 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia2 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia1 Mixer", "INT2_MI2S_TX", "INT2_MI2S_TX"},
@@ -21618,6 +23794,9 @@
{"MultiMedia1 Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"},
{"MultiMedia3 Mixer", "QUIN_AUX_PCM_TX", "QUIN_AUX_PCM_TX"},
{"MultiMedia5 Mixer", "QUIN_AUX_PCM_TX", "QUIN_AUX_PCM_TX"},
+ {"MultiMedia1 Mixer", "SEN_AUXPCM_UL_TX", "SEN_AUX_PCM_TX"},
+ {"MultiMedia3 Mixer", "SEN_AUX_PCM_TX", "SEN_AUX_PCM_TX"},
+ {"MultiMedia5 Mixer", "SEN_AUX_PCM_TX", "SEN_AUX_PCM_TX"},
{"MultiMedia2 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"MultiMedia2 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
{"MultiMedia2 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
@@ -21651,6 +23830,7 @@
{"MultiMedia6 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
{"MultiMedia6 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"MultiMedia6 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"MultiMedia6 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"MultiMedia1 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia1 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
@@ -21673,6 +23853,10 @@
{"MultiMedia1 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia1 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia1 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia1 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia1 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia1 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia1 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia1 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21709,6 +23893,10 @@
{"MultiMedia2 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia2 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia2 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia2 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia2 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia2 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia2 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia2 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21745,6 +23933,10 @@
{"MultiMedia3 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia3 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia3 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia3 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia3 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia3 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia3 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia3 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21781,6 +23973,10 @@
{"MultiMedia4 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia4 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia4 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia4 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia4 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia4 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia4 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia4 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21817,6 +24013,10 @@
{"MultiMedia5 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia5 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia5 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia5 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia5 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia5 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia5 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia5 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21853,6 +24053,10 @@
{"MultiMedia6 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia6 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia6 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia6 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia6 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia6 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia6 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia6 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21889,6 +24093,10 @@
{"MultiMedia8 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia8 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia8 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia8 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia8 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia8 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia8 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia8 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21917,6 +24125,10 @@
{"MultiMedia9 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia9 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia9 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia9 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia9 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia9 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia9 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia9 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -21954,6 +24166,7 @@
{"MultiMedia20 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia20 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia20 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"MultiMedia20 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"MultiMedia20 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia20 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
{"MultiMedia20 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"},
@@ -21974,6 +24187,10 @@
{"MultiMedia20 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia20 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia20 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia20 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia20 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia20 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia20 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia20 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -22012,6 +24229,10 @@
{"MultiMedia21 Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"MultiMedia21 Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"MultiMedia21 Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"MultiMedia21 Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"MultiMedia21 Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"MultiMedia21 Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"MultiMedia21 Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"},
{"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_1", "WSA_CDC_DMA_TX_1"},
{"MultiMedia21 Mixer", "WSA_CDC_DMA_TX_2", "WSA_CDC_DMA_TX_2"},
@@ -22038,6 +24259,7 @@
{"MultiMedia27 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia27 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia27 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"MultiMedia27 Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"MultiMedia27 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
{"MultiMedia27 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
{"MultiMedia27 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"},
@@ -22345,6 +24567,24 @@
{"QUIN_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
{"QUIN_AUX_PCM_RX", NULL, "QUIN_AUX_PCM_RX Audio Mixer"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEN_AUX_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEN_AUX_PCM_RX", NULL, "SEN_AUX_PCM_RX Audio Mixer"},
+
{"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
{"PRI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
{"PRI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
@@ -22450,6 +24690,13 @@
{"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"QUIN_AUX_PCM_RX", NULL, "QUIN_AUX_PCM_RX_Voice Mixer"},
+ {"SEN_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
+ {"SEN_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
+ {"SEN_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
+ {"SEN_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+ {"SEN_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
+ {"SEN_AUX_PCM_RX", NULL, "SEN_AUX_PCM_RX_Voice Mixer"},
+
{"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
{"HDMI_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
{"HDMI_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
@@ -22515,11 +24762,7 @@
{"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX_Voice Mixer"},
- {"PRI_TDM_RX_0_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
- {"PRI_TDM_RX_0_Voice Mixer", "Voice2", "VOICE2_DL"},
{"PRI_TDM_RX_0_Voice Mixer", "Voip", "VOIP_DL"},
- {"PRI_TDM_RX_0_Voice Mixer", "VoLTE", "VoLTE_DL"},
- {"PRI_TDM_RX_0_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
{"PRI_TDM_RX_0_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
{"PRI_TDM_RX_0_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
{"PRI_TDM_RX_0_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
@@ -22529,11 +24772,7 @@
{"PRI_TDM_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0_Voice Mixer"},
- {"PRI_TDM_RX_1_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
- {"PRI_TDM_RX_1_Voice Mixer", "Voice2", "VOICE2_DL"},
{"PRI_TDM_RX_1_Voice Mixer", "Voip", "VOIP_DL"},
- {"PRI_TDM_RX_1_Voice Mixer", "VoLTE", "VoLTE_DL"},
- {"PRI_TDM_RX_1_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
{"PRI_TDM_RX_1_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
{"PRI_TDM_RX_1_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
{"PRI_TDM_RX_1_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
@@ -22543,11 +24782,7 @@
{"PRI_TDM_RX_1_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1_Voice Mixer"},
- {"PRI_TDM_RX_2_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
- {"PRI_TDM_RX_2_Voice Mixer", "Voice2", "VOICE2_DL"},
{"PRI_TDM_RX_2_Voice Mixer", "Voip", "VOIP_DL"},
- {"PRI_TDM_RX_2_Voice Mixer", "VoLTE", "VoLTE_DL"},
- {"PRI_TDM_RX_2_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
{"PRI_TDM_RX_2_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
{"PRI_TDM_RX_2_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
{"PRI_TDM_RX_2_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
@@ -22557,11 +24792,7 @@
{"PRI_TDM_RX_2_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2_Voice Mixer"},
- {"PRI_TDM_RX_3_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
- {"PRI_TDM_RX_3_Voice Mixer", "Voice2", "VOICE2_DL"},
{"PRI_TDM_RX_3_Voice Mixer", "Voip", "VOIP_DL"},
- {"PRI_TDM_RX_3_Voice Mixer", "VoLTE", "VoLTE_DL"},
- {"PRI_TDM_RX_3_Voice Mixer", "VoWLAN", "VoWLAN_DL"},
{"PRI_TDM_RX_3_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
{"PRI_TDM_RX_3_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
{"PRI_TDM_RX_3_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
@@ -22571,6 +24802,12 @@
{"PRI_TDM_RX_3_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
{"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3_Voice Mixer"},
+ {"SEN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
+ {"SEN_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
+ {"SEN_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+ {"SEN_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
+ {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX_Voice Mixer"},
+
{"QUAT_TDM_RX_2_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
{"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2_Voice Mixer"},
@@ -22709,55 +24946,6 @@
{"MM_UL28", NULL, "AUDIO_REF_EC_UL28 MUX"},
{"MM_UL29", NULL, "AUDIO_REF_EC_UL29 MUX"},
- {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
- {"Voice_Tx Mixer", "PRI_MI2S_TX_Voice", "PRI_MI2S_TX"},
- {"Voice_Tx Mixer", "MI2S_TX_Voice", "MI2S_TX"},
- {"Voice_Tx Mixer", "TERT_MI2S_TX_Voice", "TERT_MI2S_TX"},
- {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
- {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
- {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
- {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
- {"Voice_Tx Mixer", "SEC_AUX_PCM_TX_Voice", "SEC_AUX_PCM_TX"},
- {"Voice_Tx Mixer", "SEC_MI2S_TX_Voice", "SEC_MI2S_TX"},
- {"Voice_Tx Mixer", "PRI_TDM_TX_3_Voice", "PRI_TDM_TX_3"},
- {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
-
- {"Voice2_Tx Mixer", "PRI_TX_Voice2", "PRI_I2S_TX"},
- {"Voice2_Tx Mixer", "PRI_MI2S_TX_Voice2", "PRI_MI2S_TX"},
- {"Voice2_Tx Mixer", "MI2S_TX_Voice2", "MI2S_TX"},
- {"Voice2_Tx Mixer", "TERT_MI2S_TX_Voice2", "TERT_MI2S_TX"},
- {"Voice2_Tx Mixer", "SLIM_0_TX_Voice2", "SLIMBUS_0_TX"},
- {"Voice2_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice2", "INT_BT_SCO_TX"},
- {"Voice2_Tx Mixer", "AFE_PCM_TX_Voice2", "PCM_TX"},
- {"Voice2_Tx Mixer", "AUX_PCM_TX_Voice2", "AUX_PCM_TX"},
- {"Voice2_Tx Mixer", "SEC_AUX_PCM_TX_Voice2", "SEC_AUX_PCM_TX"},
- {"Voice2_Tx Mixer", "PRI_TDM_TX_3_Voice2", "PRI_TDM_TX_3"},
- {"VOICE2_UL", NULL, "Voice2_Tx Mixer"},
-
- {"VoLTE_Tx Mixer", "PRI_TX_VoLTE", "PRI_I2S_TX"},
- {"VoLTE_Tx Mixer", "SLIM_0_TX_VoLTE", "SLIMBUS_0_TX"},
- {"VoLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_VoLTE", "INT_BT_SCO_TX"},
- {"VoLTE_Tx Mixer", "AFE_PCM_TX_VoLTE", "PCM_TX"},
- {"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
- {"VoLTE_Tx Mixer", "SEC_AUX_PCM_TX_VoLTE", "SEC_AUX_PCM_TX"},
- {"VoLTE_Tx Mixer", "MI2S_TX_VoLTE", "MI2S_TX"},
- {"VoLTE_Tx Mixer", "PRI_MI2S_TX_VoLTE", "PRI_MI2S_TX"},
- {"VoLTE_Tx Mixer", "TERT_MI2S_TX_VoLTE", "TERT_MI2S_TX"},
- {"VoLTE_Tx Mixer", "PRI_TDM_TX_3_VoLTE", "PRI_TDM_TX_3"},
- {"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
-
- {"VoWLAN_Tx Mixer", "PRI_TX_VoWLAN", "PRI_I2S_TX"},
- {"VoWLAN_Tx Mixer", "SLIM_0_TX_VoWLAN", "SLIMBUS_0_TX"},
- {"VoWLAN_Tx Mixer", "INTERNAL_BT_SCO_TX_VoWLAN", "INT_BT_SCO_TX"},
- {"VoWLAN_Tx Mixer", "AFE_PCM_TX_VoWLAN", "PCM_TX"},
- {"VoWLAN_Tx Mixer", "AUX_PCM_TX_VoWLAN", "AUX_PCM_TX"},
- {"VoWLAN_Tx Mixer", "SEC_AUX_PCM_TX_VoWLAN", "SEC_AUX_PCM_TX"},
- {"VoWLAN_Tx Mixer", "MI2S_TX_VoWLAN", "MI2S_TX"},
- {"VoWLAN_Tx Mixer", "PRI_MI2S_TX_VoWLAN", "PRI_MI2S_TX"},
- {"VoWLAN_Tx Mixer", "TERT_MI2S_TX_VoWLAN", "TERT_MI2S_TX"},
- {"VoWLAN_Tx Mixer", "PRI_TDM_TX_3_VoWLAN", "PRI_TDM_TX_3"},
- {"VoWLAN_UL", NULL, "VoWLAN_Tx Mixer"},
-
{"VoiceMMode1_Tx Mixer", "PRI_TX_MMode1", "PRI_I2S_TX"},
{"VoiceMMode1_Tx Mixer", "PRI_MI2S_TX_MMode1", "PRI_MI2S_TX"},
{"VoiceMMode1_Tx Mixer", "MI2S_TX_MMode1", "MI2S_TX"},
@@ -22774,6 +24962,7 @@
{"VoiceMMode1_Tx Mixer", "TERT_AUX_PCM_TX_MMode1", "TERT_AUX_PCM_TX"},
{"VoiceMMode1_Tx Mixer", "QUAT_AUX_PCM_TX_MMode1", "QUAT_AUX_PCM_TX"},
{"VoiceMMode1_Tx Mixer", "QUIN_AUX_PCM_TX_MMode1", "QUIN_AUX_PCM_TX"},
+ {"VoiceMMode1_Tx Mixer", "SEN_AUX_PCM_TX_MMode1", "SEN_AUX_PCM_TX"},
{"VoiceMMode1_Tx Mixer", "QUAT_TDM_TX_0_MMode1", "QUAT_TDM_TX_0"},
{"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_0_MMode1", "TX_CDC_DMA_TX_0"},
{"VoiceMMode1_Tx Mixer", "TX_CDC_DMA_TX_1_MMode1", "TX_CDC_DMA_TX_1"},
@@ -22802,6 +24991,7 @@
{"VoiceMMode2_Tx Mixer", "TERT_AUX_PCM_TX_MMode2", "TERT_AUX_PCM_TX"},
{"VoiceMMode2_Tx Mixer", "QUAT_AUX_PCM_TX_MMode2", "QUAT_AUX_PCM_TX"},
{"VoiceMMode2_Tx Mixer", "QUIN_AUX_PCM_TX_MMode2", "QUIN_AUX_PCM_TX"},
+ {"VoiceMMode2_Tx Mixer", "SEN_AUX_PCM_TX_MMode2", "SEN_AUX_PCM_TX"},
{"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_0_MMode2", "TX_CDC_DMA_TX_0"},
{"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_1_MMode2", "TX_CDC_DMA_TX_1"},
{"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_2_MMode2", "TX_CDC_DMA_TX_2"},
@@ -22810,7 +25000,7 @@
{"VoiceMMode2_Tx Mixer", "TX_CDC_DMA_TX_5_MMode2", "TX_CDC_DMA_TX_5"},
{"VoiceMMode2_Tx Mixer", "QUAT_MI2S_TX_MMode2", "QUAT_MI2S_TX"},
{"VoiceMMode2_Tx Mixer", "QUIN_MI2S_TX_MMode2", "QUIN_MI2S_TX"},
- {"VoiceMMode1_Tx Mixer", "PRI_TDM_TX_3_MMode2", "PRI_TDM_TX_3"},
+ {"VoiceMMode2_Tx Mixer", "PRI_TDM_TX_3_MMode2", "PRI_TDM_TX_3"},
{"VOICEMMODE2_UL", NULL, "VoiceMMode2_Tx Mixer"},
{"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
@@ -22828,6 +25018,7 @@
{"Voip_Tx Mixer", "TERT_AUX_PCM_TX_Voip", "TERT_AUX_PCM_TX"},
{"Voip_Tx Mixer", "QUAT_AUX_PCM_TX_Voip", "QUAT_AUX_PCM_TX"},
{"Voip_Tx Mixer", "QUIN_AUX_PCM_TX_Voip", "QUIN_AUX_PCM_TX"},
+ {"Voip_Tx Mixer", "SEN_AUX_PCM_TX_Voip", "SEN_AUX_PCM_TX"},
{"Voip_Tx Mixer", "PRI_MI2S_TX_Voip", "PRI_MI2S_TX"},
{"Voip_Tx Mixer", "PRI_TDM_TX_3_Voip", "PRI_TDM_TX_3"},
{"VOIP_UL", NULL, "Voip_Tx Mixer"},
@@ -22984,6 +25175,7 @@
{"QCHAT_Tx Mixer", "TERT_AUX_PCM_TX_QCHAT", "TERT_AUX_PCM_TX"},
{"QCHAT_Tx Mixer", "QUAT_AUX_PCM_TX_QCHAT", "QUAT_AUX_PCM_TX"},
{"QCHAT_Tx Mixer", "QUIN_AUX_PCM_TX_QCHAT", "QUIN_AUX_PCM_TX"},
+ {"QCHAT_Tx Mixer", "SEN_AUX_PCM_TX_QCHAT", "SEN_AUX_PCM_TX"},
{"QCHAT_Tx Mixer", "MI2S_TX_QCHAT", "MI2S_TX"},
{"QCHAT_Tx Mixer", "PRI_MI2S_TX_QCHAT", "PRI_MI2S_TX"},
{"QCHAT_Tx Mixer", "TERT_MI2S_TX_QCHAT", "TERT_MI2S_TX"},
@@ -23029,6 +25221,8 @@
{"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_DL_HL"},
{"QUIN_MI2S_RX_DL_HL", "Switch", "QUIN_MI2S_DL_HL"},
{"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX_DL_HL"},
+ {"SEN_MI2S_RX_DL_HL", "Switch", "SEN_MI2S_DL_HL"},
+ {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX_DL_HL"},
{"MI2S_UL_HL", NULL, "TERT_MI2S_TX"},
{"INT3_MI2S_UL_HL", NULL, "INT3_MI2S_TX"},
{"TERT_MI2S_UL_HL", NULL, "TERT_MI2S_TX"},
@@ -23084,6 +25278,14 @@
{"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1_DL_HL"},
{"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2_DL_HL"},
{"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3_DL_HL"},
+ {"SEN_TDM_TX_0_UL_HL", NULL, "SEN_TDM_TX_0"},
+ {"SEN_TDM_TX_1_UL_HL", NULL, "SEN_TDM_TX_1"},
+ {"SEN_TDM_TX_2_UL_HL", NULL, "SEN_TDM_TX_2"},
+ {"SEN_TDM_TX_3_UL_HL", NULL, "SEN_TDM_TX_3"},
+ {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0_DL_HL"},
+ {"SEN_TDM_RX_1", NULL, "SEN_TDM_RX_1_DL_HL"},
+ {"SEN_TDM_RX_2", NULL, "SEN_TDM_RX_2_DL_HL"},
+ {"SEN_TDM_RX_3", NULL, "SEN_TDM_RX_3_DL_HL"},
{"PRI_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"PRI_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -23105,6 +25307,10 @@
{"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"PRI_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"PRI_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"PRI_TDM_RX_0", NULL, "PRI_TDM_RX_0 Port Mixer"},
{"PRI_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23127,6 +25333,10 @@
{"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"PRI_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"PRI_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"PRI_TDM_RX_1", NULL, "PRI_TDM_RX_1 Port Mixer"},
{"PRI_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23149,6 +25359,10 @@
{"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"PRI_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"PRI_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"PRI_TDM_RX_2", NULL, "PRI_TDM_RX_2 Port Mixer"},
{"PRI_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23171,6 +25385,10 @@
{"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"PRI_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"PRI_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3 Port Mixer"},
{"SEC_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23193,6 +25411,10 @@
{"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"SEC_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEC_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"SEC_TDM_RX_0", NULL, "SEC_TDM_RX_0 Port Mixer"},
{"SEC_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23215,6 +25437,10 @@
{"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"SEC_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEC_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"SEC_TDM_RX_1", NULL, "SEC_TDM_RX_1 Port Mixer"},
{"SEC_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23237,6 +25463,10 @@
{"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"SEC_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEC_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"SEC_TDM_RX_2", NULL, "SEC_TDM_RX_2 Port Mixer"},
{"SEC_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23259,6 +25489,10 @@
{"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"SEC_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEC_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3 Port Mixer"},
{"SEC_TDM_RX_7 Port Mixer", "TERT_TDM_TX_7", "TERT_TDM_TX_7"},
@@ -23284,6 +25518,10 @@
{"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"TERT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"TERT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0 Port Mixer"},
{"TERT_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23306,6 +25544,10 @@
{"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"TERT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"TERT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"TERT_TDM_RX_1", NULL, "TERT_TDM_RX_1 Port Mixer"},
{"TERT_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23328,6 +25570,10 @@
{"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"TERT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"TERT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"TERT_TDM_RX_2", NULL, "TERT_TDM_RX_2 Port Mixer"},
{"TERT_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23350,6 +25596,10 @@
{"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"TERT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"TERT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"TERT_TDM_RX_3", NULL, "TERT_TDM_RX_3 Port Mixer"},
{"QUAT_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23372,6 +25622,10 @@
{"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUAT_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUAT_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Port Mixer"},
{"QUAT_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23394,6 +25648,10 @@
{"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUAT_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUAT_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Port Mixer"},
{"QUAT_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23416,6 +25674,10 @@
{"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUAT_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUAT_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Port Mixer"},
{"QUAT_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23438,6 +25700,10 @@
{"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"},
{"QUAT_TDM_RX_7 Port Mixer", "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},
@@ -23463,6 +25729,10 @@
{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUIN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Port Mixer"},
{"QUIN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23485,6 +25755,10 @@
{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUIN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Port Mixer"},
{"QUIN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23507,6 +25781,10 @@
{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUIN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Port Mixer"},
{"QUIN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23529,13 +25807,106 @@
{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
+ {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"QUIN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
{"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Port Mixer"},
+ {"SEN_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "AFE_PCM_TX", "PCM_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
+ {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
+ {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
+ {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"},
+ {"SEN_TDM_RX_0 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"},
+ {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},
+ {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
+ {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
+ {"SEN_TDM_RX_0 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEN_TDM_RX_0 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
+ {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0 Port Mixer"},
+
+ {"SEN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "AFE_PCM_TX", "PCM_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
+ {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
+ {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
+ {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"},
+ {"SEN_TDM_RX_1 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"},
+ {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},
+ {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
+ {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
+ {"SEN_TDM_RX_1 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEN_TDM_RX_1 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
+ {"SEN_TDM_RX_1", NULL, "SEN_TDM_RX_1 Port Mixer"},
+
+ {"SEN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "AFE_PCM_TX", "PCM_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
+ {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
+ {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
+ {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"},
+ {"SEN_TDM_RX_2 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"},
+ {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},
+ {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
+ {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
+ {"SEN_TDM_RX_2 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEN_TDM_RX_2 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
+ {"SEN_TDM_RX_2", NULL, "SEN_TDM_RX_2 Port Mixer"},
+
+ {"SEN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "AFE_PCM_TX", "PCM_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
+ {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_0", "TERT_TDM_TX_0"},
+ {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_1", "TERT_TDM_TX_1"},
+ {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_2", "TERT_TDM_TX_2"},
+ {"SEN_TDM_RX_3 Port Mixer", "TERT_TDM_TX_3", "TERT_TDM_TX_3"},
+ {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},
+ {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
+ {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
+ {"SEN_TDM_RX_3 Port Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_0", "SEN_TDM_TX_0"},
+ {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_1", "SEN_TDM_TX_1"},
+ {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_2", "SEN_TDM_TX_2"},
+ {"SEN_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"},
+ {"SEN_TDM_RX_3", NULL, "SEN_TDM_RX_3 Port Mixer"},
+
{"INT0_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"INT0_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
{"INT0_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
@@ -23549,6 +25920,7 @@
{"INT4_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"INT4_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"INT4_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"INT4_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"INT4_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
{"INT4_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
{"INT4_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
@@ -23579,12 +25951,14 @@
{"SLIMBUS_0_RX Port Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"},
{"SLIMBUS_0_RX Port Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"},
{"SLIMBUS_0_RX Port Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"},
+ {"SLIMBUS_0_RX Port Mixer", "SEN_AUXPCM_UL_TX", "SEN_AUX_PCM_TX"},
{"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
{"SLIMBUS_0_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"SLIMBUS_0_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"SLIMBUS_0_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"SLIMBUS_0_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"SLIMBUS_0_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"SLIMBUS_0_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"SLIMBUS_0_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
{"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
{"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
@@ -23635,6 +26009,7 @@
{"Voice Stub Tx Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"},
{"Voice Stub Tx Mixer", "QUAT_AUXPCM_UL_TX", "QUAT_AUX_PCM_TX"},
{"Voice Stub Tx Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"},
+ {"Voice Stub Tx Mixer", "SEN_AUXPCM_UL_TX", "SEN_AUX_PCM_TX"},
{"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"},
{"Voice Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"Voice Stub Tx Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
@@ -23658,7 +26033,6 @@
{"VoLTE Stub Tx Mixer", "AFE_PCM_TX", "PCM_TX"},
{"VoLTE Stub Tx Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"VoLTE Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
- {"VoLTE Stub Tx Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"VOLTE_STUB_UL", NULL, "VoLTE Stub Tx Mixer"},
{"Voice2 Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
@@ -23751,6 +26125,7 @@
{"PRI_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"PRI_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"PRI_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"PRI_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"PRI_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"PRI_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"PRI_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
@@ -23763,6 +26138,7 @@
{"SEC_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"SEC_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"SEC_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"SEC_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"SEC_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"SEC_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"SEC_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
@@ -23774,6 +26150,7 @@
{"TERT_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"TERT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"TERT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"TERT_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"TERT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"TERT_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
{"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Port Mixer"},
@@ -23783,6 +26160,7 @@
{"QUAT_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"QUAT_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"QUAT_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"SEN_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"QUAT_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"QUAT_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"QUAT_MI2S_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
@@ -23794,10 +26172,20 @@
{"QUIN_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"QUIN_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"QUIN_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"QUIN_MI2S_RX Port Mixer", "SENARY_MI2S_TX", "SENARY_MI2S_TX"},
{"QUIN_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"QUIN_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
{"QUIN_MI2S_RX", NULL, "QUIN_MI2S_RX Port Mixer"},
+ {"SEN_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+ {"SEN_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+ {"SEN_MI2S_RX Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"SEN_MI2S_RX Port Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
+ {"SEN_MI2S_RX Port Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+ {"SEN_MI2S_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
+ {"SEN_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+ {"SEN_MI2S_RX", NULL, "SEN_MI2S_RX Port Mixer"},
+
/* Backend Enablement */
{"BE_OUT", NULL, "PRI_I2S_RX"},
@@ -23821,6 +26209,7 @@
{"BE_OUT", NULL, "MI2S_RX"},
{"BE_OUT", NULL, "QUAT_MI2S_RX"},
{"BE_OUT", NULL, "QUIN_MI2S_RX"},
+ {"BE_OUT", NULL, "SEN_MI2S_RX"},
{"BE_OUT", NULL, "TERT_MI2S_RX"},
{"BE_OUT", NULL, "SEC_MI2S_RX"},
{"BE_OUT", NULL, "SEC_MI2S_RX_SD1"},
@@ -23840,6 +26229,7 @@
{"BE_OUT", NULL, "TERT_AUX_PCM_RX"},
{"BE_OUT", NULL, "QUAT_AUX_PCM_RX"},
{"BE_OUT", NULL, "QUIN_AUX_PCM_RX"},
+ {"BE_OUT", NULL, "SEN_AUX_PCM_RX"},
{"BE_OUT", NULL, "INT_BT_SCO_RX"},
{"BE_OUT", NULL, "INT_FM_RX"},
{"BE_OUT", NULL, "PCM_RX"},
@@ -23869,6 +26259,10 @@
{"BE_OUT", NULL, "QUIN_TDM_RX_1"},
{"BE_OUT", NULL, "QUIN_TDM_RX_2"},
{"BE_OUT", NULL, "QUIN_TDM_RX_3"},
+ {"BE_OUT", NULL, "SEN_TDM_RX_0"},
+ {"BE_OUT", NULL, "SEN_TDM_RX_1"},
+ {"BE_OUT", NULL, "SEN_TDM_RX_2"},
+ {"BE_OUT", NULL, "SEN_TDM_RX_3"},
{"BE_OUT", NULL, "WSA_CDC_DMA_RX_0"},
{"BE_OUT", NULL, "WSA_CDC_DMA_RX_1"},
{"BE_OUT", NULL, "RX_CDC_DMA_RX_0"},
@@ -23892,7 +26286,7 @@
{"INT4_MI2S_TX", NULL, "BE_IN"},
{"INT5_MI2S_TX", NULL, "BE_IN"},
{"SEC_MI2S_TX", NULL, "BE_IN"},
- {"SENARY_MI2S_TX", NULL, "BE_IN" },
+ {"SENARY_MI2S_TX", NULL, "BE_IN"},
{"SLIMBUS_0_TX", NULL, "BE_IN" },
{"SLIMBUS_1_TX", NULL, "BE_IN" },
{"SLIMBUS_3_TX", NULL, "BE_IN" },
@@ -23916,6 +26310,7 @@
{"TERT_AUX_PCM_TX", NULL, "BE_IN"},
{"QUAT_AUX_PCM_TX", NULL, "BE_IN"},
{"QUIN_AUX_PCM_TX", NULL, "BE_IN"},
+ {"SEN_AUX_PCM_TX", NULL, "BE_IN"},
{"INCALL_RECORD_TX", NULL, "BE_IN"},
{"INCALL_RECORD_RX", NULL, "BE_IN"},
{"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"},
@@ -23955,6 +26350,10 @@
{"QUIN_TDM_TX_1", NULL, "BE_IN"},
{"QUIN_TDM_TX_2", NULL, "BE_IN"},
{"QUIN_TDM_TX_3", NULL, "BE_IN"},
+ {"SEN_TDM_TX_0", NULL, "BE_IN"},
+ {"SEN_TDM_TX_1", NULL, "BE_IN"},
+ {"SEN_TDM_TX_2", NULL, "BE_IN"},
+ {"SEN_TDM_TX_3", NULL, "BE_IN"},
{"WSA_CDC_DMA_TX_0", NULL, "BE_IN"},
{"WSA_CDC_DMA_TX_1", NULL, "BE_IN"},
{"WSA_CDC_DMA_TX_2", NULL, "BE_IN"},
@@ -24531,6 +26930,33 @@
msm_aptx_dec_license_control_put),
};
+static int msm_routing_put_port_chmap_mixer(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ uint8_t channel_map[PCM_FORMAT_MAX_NUM_CHANNEL_V8];
+ uint32_t be_idx = ucontrol->value.integer.value[0];
+ int i;
+
+ for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL_V8; i++) {
+ channel_map[i] = (char)(ucontrol->value.integer.value[i + 1]);
+ if (channel_map[i] > PCM_MAX_CHMAP_ID) {
+ pr_err("%s: Invalid channel map %d\n",
+ __func__, channel_map[i]);
+ return -EINVAL;
+ }
+ }
+ adm_set_port_multi_ch_map(channel_map, msm_bedais[be_idx].port_id);
+
+ return 0;
+}
+
+static const struct snd_kcontrol_new port_multi_channel_map_mixer_controls[] = {
+ SOC_SINGLE_MULTI_EXT("Backend Device Channel Map", SND_SOC_NOPM, 0,
+ MSM_BACKEND_DAI_MAX, 0,
+ PCM_FORMAT_MAX_NUM_CHANNEL_V8 + 1, NULL,
+ msm_routing_put_port_chmap_mixer),
+};
+
static int msm_routing_be_dai_name_table_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
@@ -24702,6 +27128,8 @@
{
snd_soc_dapm_new_controls(&component->dapm, msm_qdsp6_widgets,
ARRAY_SIZE(msm_qdsp6_widgets));
+ snd_soc_dapm_ignore_suspend(&component->dapm, "BE_OUT");
+ snd_soc_dapm_ignore_suspend(&component->dapm, "BE_IN");
snd_soc_dapm_add_routes(&component->dapm, intercon,
ARRAY_SIZE(intercon));
@@ -24769,6 +27197,9 @@
snd_soc_add_component_controls(
component, msm_routing_feature_support_mixer_controls,
ARRAY_SIZE(msm_routing_feature_support_mixer_controls));
+ snd_soc_add_component_controls(component,
+ port_multi_channel_map_mixer_controls,
+ ARRAY_SIZE(port_multi_channel_map_mixer_controls));
return 0;
}
@@ -24817,6 +27248,7 @@
.name = "msm-pcm-routing",
.owner = THIS_MODULE,
.of_match_table = msm_pcm_routing_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_routing_pcm_probe,
.remove = msm_routing_pcm_remove,
diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h
index fc93059..07b9752 100644
--- a/asoc/msm-pcm-routing-v2.h
+++ b/asoc/msm-pcm-routing-v2.h
@@ -162,6 +162,22 @@
#define LPASS_BE_QUIN_TDM_TX_6 "QUIN_TDM_TX_6"
#define LPASS_BE_QUIN_TDM_RX_7 "QUIN_TDM_RX_7"
#define LPASS_BE_QUIN_TDM_TX_7 "QUIN_TDM_TX_7"
+#define LPASS_BE_SEN_TDM_RX_0 "SEN_TDM_RX_0"
+#define LPASS_BE_SEN_TDM_TX_0 "SEN_TDM_TX_0"
+#define LPASS_BE_SEN_TDM_RX_1 "SEN_TDM_RX_1"
+#define LPASS_BE_SEN_TDM_TX_1 "SEN_TDM_TX_1"
+#define LPASS_BE_SEN_TDM_RX_2 "SEN_TDM_RX_2"
+#define LPASS_BE_SEN_TDM_TX_2 "SEN_TDM_TX_2"
+#define LPASS_BE_SEN_TDM_RX_3 "SEN_TDM_RX_3"
+#define LPASS_BE_SEN_TDM_TX_3 "SEN_TDM_TX_3"
+#define LPASS_BE_SEN_TDM_RX_4 "SEN_TDM_RX_4"
+#define LPASS_BE_SEN_TDM_TX_4 "SEN_TDM_TX_4"
+#define LPASS_BE_SEN_TDM_RX_5 "SEN_TDM_RX_5"
+#define LPASS_BE_SEN_TDM_TX_5 "SEN_TDM_TX_5"
+#define LPASS_BE_SEN_TDM_RX_6 "SEN_TDM_RX_6"
+#define LPASS_BE_SEN_TDM_TX_6 "SEN_TDM_TX_6"
+#define LPASS_BE_SEN_TDM_RX_7 "SEN_TDM_RX_7"
+#define LPASS_BE_SEN_TDM_TX_7 "SEN_TDM_TX_7"
#define LPASS_BE_SLIMBUS_7_RX "SLIMBUS_7_RX"
#define LPASS_BE_SLIMBUS_7_TX "SLIMBUS_7_TX"
@@ -404,6 +420,22 @@
MSM_BACKEND_DAI_QUIN_TDM_TX_6,
MSM_BACKEND_DAI_QUIN_TDM_RX_7,
MSM_BACKEND_DAI_QUIN_TDM_TX_7,
+ MSM_BACKEND_DAI_SEN_TDM_RX_0,
+ MSM_BACKEND_DAI_SEN_TDM_TX_0,
+ MSM_BACKEND_DAI_SEN_TDM_RX_1,
+ MSM_BACKEND_DAI_SEN_TDM_TX_1,
+ MSM_BACKEND_DAI_SEN_TDM_RX_2,
+ MSM_BACKEND_DAI_SEN_TDM_TX_2,
+ MSM_BACKEND_DAI_SEN_TDM_RX_3,
+ MSM_BACKEND_DAI_SEN_TDM_TX_3,
+ MSM_BACKEND_DAI_SEN_TDM_RX_4,
+ MSM_BACKEND_DAI_SEN_TDM_TX_4,
+ MSM_BACKEND_DAI_SEN_TDM_RX_5,
+ MSM_BACKEND_DAI_SEN_TDM_TX_5,
+ MSM_BACKEND_DAI_SEN_TDM_RX_6,
+ MSM_BACKEND_DAI_SEN_TDM_TX_6,
+ MSM_BACKEND_DAI_SEN_TDM_RX_7,
+ MSM_BACKEND_DAI_SEN_TDM_TX_7,
MSM_BACKEND_DAI_INT_BT_A2DP_RX,
MSM_BACKEND_DAI_USB_RX,
MSM_BACKEND_DAI_USB_TX,
diff --git a/asoc/msm-pcm-voice-v2.c b/asoc/msm-pcm-voice-v2.c
index ea476c1..f8acc30 100644
--- a/asoc/msm-pcm-voice-v2.c
+++ b/asoc/msm-pcm-voice-v2.c
@@ -812,6 +812,7 @@
.name = "msm-pcm-voice",
.owner = THIS_MODULE,
.of_match_table = msm_voice_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-pcm-voip-v2.c b/asoc/msm-pcm-voip-v2.c
index 3bfa4d6..e2ad13b 100644
--- a/asoc/msm-pcm-voip-v2.c
+++ b/asoc/msm-pcm-voip-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -1670,6 +1670,7 @@
.name = "msm-voip-dsp",
.owner = THIS_MODULE,
.of_match_table = msm_voip_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_pcm_probe,
.remove = msm_pcm_remove,
diff --git a/asoc/msm-transcode-loopback-q6-v2.c b/asoc/msm-transcode-loopback-q6-v2.c
index dc41037..5d572f1 100644
--- a/asoc/msm-transcode-loopback-q6-v2.c
+++ b/asoc/msm-transcode-loopback-q6-v2.c
@@ -1695,6 +1695,7 @@
.name = "msm-transcode-loopback",
.owner = THIS_MODULE,
.of_match_table = msm_transcode_loopback_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_transcode_dev_probe,
.remove = msm_transcode_remove,
diff --git a/asoc/qcs405.c b/asoc/qcs405.c
index 0455748..9ad07da 100644
--- a/asoc/qcs405.c
+++ b/asoc/qcs405.c
@@ -440,6 +440,12 @@
[SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
};
+static struct dev_config afe_lb_tx_cfg = {
+ .sample_rate = SAMPLING_RATE_48KHZ,
+ .bit_format = SNDRV_PCM_FORMAT_S16_LE,
+ .channels = 2,
+};
+
static int msm_vi_feed_tx_ch = 2;
static const char *const slim_rx_ch_text[] = {"One", "Two"};
static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four",
@@ -602,6 +608,10 @@
static SOC_ENUM_SINGLE_EXT_DECL(spdif_tx_chs, spdif_ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(spdif_rx_format, spdif_bit_format_text);
static SOC_ENUM_SINGLE_EXT_DECL(spdif_tx_format, spdif_bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(afe_lb_tx_chs, cdc_dma_tx_ch_text);
+static SOC_ENUM_SINGLE_EXT_DECL(afe_lb_tx_format, bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(afe_lb_tx_sample_rate,
+ cdc_dma_sample_rate_text);
static struct platform_device *spdev;
@@ -3444,6 +3454,184 @@
return 0;
}
+static int afe_lb_tx_ch_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ pr_debug("%s: afe_lb_tx_ch = %d\n", __func__,
+ afe_lb_tx_cfg.channels);
+ ucontrol->value.integer.value[0] = afe_lb_tx_cfg.channels - 1;
+ return 0;
+}
+
+static int afe_lb_tx_ch_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ afe_lb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1;
+
+ pr_debug("%s: afe_lb_tx_ch = %d\n", __func__, afe_lb_tx_cfg.channels);
+ return 0;
+}
+
+static int afe_lb_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ int sample_rate_val;
+
+ switch (afe_lb_tx_cfg.sample_rate) {
+ case SAMPLING_RATE_384KHZ:
+ sample_rate_val = 12;
+ break;
+ case SAMPLING_RATE_352P8KHZ:
+ sample_rate_val = 11;
+ break;
+ case SAMPLING_RATE_192KHZ:
+ sample_rate_val = 10;
+ break;
+ case SAMPLING_RATE_176P4KHZ:
+ sample_rate_val = 9;
+ break;
+ case SAMPLING_RATE_96KHZ:
+ sample_rate_val = 8;
+ break;
+ case SAMPLING_RATE_88P2KHZ:
+ sample_rate_val = 7;
+ break;
+ case SAMPLING_RATE_48KHZ:
+ sample_rate_val = 6;
+ break;
+ case SAMPLING_RATE_44P1KHZ:
+ sample_rate_val = 5;
+ break;
+ case SAMPLING_RATE_32KHZ:
+ sample_rate_val = 4;
+ break;
+ case SAMPLING_RATE_22P05KHZ:
+ sample_rate_val = 3;
+ break;
+ case SAMPLING_RATE_16KHZ:
+ sample_rate_val = 2;
+ break;
+ case SAMPLING_RATE_11P025KHZ:
+ sample_rate_val = 1;
+ break;
+ case SAMPLING_RATE_8KHZ:
+ sample_rate_val = 0;
+ break;
+ default:
+ sample_rate_val = 6;
+ break;
+ }
+
+ ucontrol->value.integer.value[0] = sample_rate_val;
+ pr_debug("%s: afe_lb_tx_sample_rate = %d\n", __func__,
+ afe_lb_tx_cfg.sample_rate);
+ return 0;
+}
+
+static int afe_lb_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ switch (ucontrol->value.integer.value[0]) {
+ case 12:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
+ break;
+ case 11:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
+ break;
+ case 10:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
+ break;
+ case 9:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
+ break;
+ case 8:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
+ break;
+ case 7:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
+ break;
+ case 6:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
+ break;
+ case 5:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
+ break;
+ case 4:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
+ break;
+ case 3:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
+ break;
+ case 2:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
+ break;
+ case 1:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
+ break;
+ case 0:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
+ break;
+ default:
+ afe_lb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
+ break;
+ }
+
+ pr_debug("%s: control value = %ld, afe_lb_tx_sample_rate = %d\n",
+ __func__, ucontrol->value.integer.value[0],
+ afe_lb_tx_cfg.sample_rate);
+ return 0;
+}
+
+static int afe_lb_tx_format_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ switch (afe_lb_tx_cfg.bit_format) {
+ case SNDRV_PCM_FORMAT_S32_LE:
+ ucontrol->value.integer.value[0] = 3;
+ break;
+ case SNDRV_PCM_FORMAT_S24_3LE:
+ ucontrol->value.integer.value[0] = 2;
+ break;
+ case SNDRV_PCM_FORMAT_S24_LE:
+ ucontrol->value.integer.value[0] = 1;
+ break;
+ case SNDRV_PCM_FORMAT_S16_LE:
+ default:
+ ucontrol->value.integer.value[0] = 0;
+ break;
+ }
+
+ pr_debug("%s: afe_lb_tx_format = %d, ucontrol value = %ld\n",
+ __func__, afe_lb_tx_cfg.bit_format,
+ ucontrol->value.integer.value[0]);
+ return 0;
+}
+
+static int afe_lb_tx_format_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ switch (ucontrol->value.integer.value[0]) {
+ case 3:
+ afe_lb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
+ break;
+ case 2:
+ afe_lb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
+ break;
+ case 1:
+ afe_lb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
+ break;
+ case 0:
+ default:
+ afe_lb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
+ break;
+ }
+
+ pr_debug("%s: afe_lb_tx_format = %d, ucontrol value = %ld\n",
+ __func__, afe_lb_tx_cfg.bit_format,
+ ucontrol->value.integer.value[0]);
+ return 0;
+}
+
static const struct snd_kcontrol_new msm_snd_sb_controls[] = {
SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs,
slim_rx_ch_get, slim_rx_ch_put),
@@ -3826,6 +4014,13 @@
msm_spdif_rx_format_get, msm_spdif_rx_format_put),
SOC_ENUM_EXT("SEC_SPDIF_TX Format", spdif_tx_format,
msm_spdif_tx_format_get, msm_spdif_tx_format_put),
+ SOC_ENUM_EXT("AFE_LOOPBACK_TX Channels", afe_lb_tx_chs,
+ afe_lb_tx_ch_get, afe_lb_tx_ch_put),
+ SOC_ENUM_EXT("AFE_LOOPBACK_TX Format", afe_lb_tx_format,
+ afe_lb_tx_format_get, afe_lb_tx_format_put),
+ SOC_ENUM_EXT("AFE_LOOPBACK_TX SampleRate", afe_lb_tx_sample_rate,
+ afe_lb_tx_sample_rate_get,
+ afe_lb_tx_sample_rate_put),
};
static int msm_snd_enable_codec_ext_clk(struct snd_soc_component *component,
@@ -4610,6 +4805,13 @@
spdif_tx_cfg[SEC_SPDIF_TX].channels;
break;
+ case MSM_BACKEND_DAI_AFE_LOOPBACK_TX:
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ afe_lb_tx_cfg.bit_format);
+ rate->min = rate->max = afe_lb_tx_cfg.sample_rate;
+ channels->min = channels->max = afe_lb_tx_cfg.channels;
+ break;
+
default:
rate->min = rate->max = SAMPLING_RATE_48KHZ;
break;
@@ -7630,6 +7832,7 @@
.no_pcm = 1,
.dpcm_capture = 1,
.id = MSM_BACKEND_DAI_AFE_LOOPBACK_TX,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
.ignore_pmdown_time = 1,
.ignore_suspend = 1,
},
@@ -8843,6 +9046,7 @@
.owner = THIS_MODULE,
.pm = &snd_soc_pm_ops,
.of_match_table = qcs405_asoc_machine_of_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_asoc_machine_probe,
.remove = msm_asoc_machine_remove,
diff --git a/asoc/sa8155.c b/asoc/sa8155.c
index 6dba206..e01b231 100644
--- a/asoc/sa8155.c
+++ b/asoc/sa8155.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
*/
/*
* Copyright 2011, The Android Open Source Project
@@ -7220,6 +7220,7 @@
.owner = THIS_MODULE,
.pm = &snd_soc_pm_ops,
.of_match_table = sa8155_asoc_machine_of_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_asoc_machine_probe,
.remove = msm_asoc_machine_remove,
diff --git a/asoc/sm6150.c b/asoc/sm6150.c
index 6a6597a..e41fe49 100644
--- a/asoc/sm6150.c
+++ b/asoc/sm6150.c
@@ -9297,11 +9297,23 @@
.owner = THIS_MODULE,
.pm = &snd_soc_pm_ops,
.of_match_table = sm6150_asoc_machine_of_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_asoc_machine_probe,
.remove = msm_asoc_machine_remove,
};
-module_platform_driver(sm6150_asoc_machine_driver);
+
+int __init sm6150_init(void)
+{
+ pr_debug("%s\n", __func__);
+ return platform_driver_register(&sm6150_asoc_machine_driver);
+}
+
+void sm6150_exit(void)
+{
+ pr_debug("%s\n", __func__);
+ platform_driver_unregister(&sm6150_asoc_machine_driver);
+}
MODULE_DESCRIPTION("ALSA SoC SM6150 Machine driver");
MODULE_LICENSE("GPL v2");
diff --git a/asoc/sm8150.c b/asoc/sm8150.c
index aad4765..3b95ce5 100644
--- a/asoc/sm8150.c
+++ b/asoc/sm8150.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/clk.h>
@@ -7245,6 +7245,7 @@
.owner = THIS_MODULE,
.pm = &snd_soc_pm_ops,
.of_match_table = sm8150_asoc_machine_of_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_asoc_machine_probe,
.remove = msm_asoc_machine_remove,
diff --git a/dsp/Kbuild b/dsp/Kbuild
index 086924f..7d683b3 100644
--- a/dsp/Kbuild
+++ b/dsp/Kbuild
@@ -48,6 +48,11 @@
export
INCS += -include $(AUDIO_ROOT)/config/qcs405autoconf.h
endif
+ ifeq ($(CONFIG_QTI_GVM), y)
+ include $(AUDIO_ROOT)/config/gvmauto.conf
+ export
+ INCS += -include $(AUDIO_ROOT)/config/gvmautoconf.h
+ endif
endif
@@ -97,6 +102,25 @@
Q6_OBJS += q6_init.o
endif
+ifdef CONFIG_SND_SOC_MSM_QDSP6V2_VM
+ Q6_OBJS += msm-audio-event-notify.o
+ Q6_OBJS += audio_calibration.o
+ Q6_OBJS += audio_cal_utils.o
+ Q6_OBJS += q6adm.o
+ Q6_OBJS += q6afe.o
+ Q6_OBJS += q6asm.o
+ Q6_OBJS += q6audio-v2.o
+ Q6_OBJS += q6voice.o
+ Q6_OBJS += q6core.o
+ Q6_OBJS += q6common.o
+ Q6_OBJS += rtac.o
+ Q6_OBJS += q6lsm.o
+ Q6_OBJS += adsp_err.o
+ Q6_OBJS += msm_audio_ion_vm.o
+ Q6_OBJS += avtimer.o
+ Q6_OBJS += q6_init.o
+endif
+
ifdef CONFIG_XT_LOGGING
Q6_OBJS += sp_params.o
endif
@@ -192,6 +216,9 @@
obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) += q6_dlkm.o
q6_dlkm-y := $(Q6_OBJS)
+obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_VM) += q6_dlkm.o
+q6_dlkm-y := $(Q6_OBJS)
+
obj-$(CONFIG_MSM_ULTRASOUND) += usf_dlkm.o
usf_dlkm-y := $(USF_OBJS)
diff --git a/dsp/adsp-loader.c b/dsp/adsp-loader.c
index 387850b..881e360 100644
--- a/dsp/adsp-loader.c
+++ b/dsp/adsp-loader.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2012-2014, 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014, 2017-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -333,6 +333,7 @@
.name = "adsp-loader",
.owner = THIS_MODULE,
.of_match_table = adsp_loader_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = adsp_loader_probe,
.remove = adsp_loader_remove,
diff --git a/dsp/avtimer.c b/dsp/avtimer.c
index 29bfd24..554f030 100644
--- a/dsp/avtimer.c
+++ b/dsp/avtimer.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2012-2015, 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015, 2017-2019 The Linux Foundation. All rights reserved.
*/
#include <linux/kernel.h>
@@ -536,6 +536,7 @@
.driver = {
.name = "dev_avtimer",
.of_match_table = avtimer_machine_of_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/dsp/codecs/audio_alac.c b/dsp/codecs/audio_alac.c
index f7e0932..a3e473f 100644
--- a/dsp/codecs/audio_alac.c
+++ b/dsp/codecs/audio_alac.c
@@ -1,15 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2015-2019, 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.
- *
*/
#include <linux/types.h>
diff --git a/dsp/codecs/audio_ape.c b/dsp/codecs/audio_ape.c
index 1e12981..319828b 100644
--- a/dsp/codecs/audio_ape.c
+++ b/dsp/codecs/audio_ape.c
@@ -1,15 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2015-2019, 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.
- *
*/
#include <linux/types.h>
diff --git a/dsp/codecs/audio_g711alaw.c b/dsp/codecs/audio_g711alaw.c
index b4a1d7e..27d7fe0 100644
--- a/dsp/codecs/audio_g711alaw.c
+++ b/dsp/codecs/audio_g711alaw.c
@@ -1,15 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2016-2017, 2019 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.
- *
*/
#include <linux/types.h>
diff --git a/dsp/codecs/audio_g711mlaw.c b/dsp/codecs/audio_g711mlaw.c
index 1cf8a97..57c7f1a 100644
--- a/dsp/codecs/audio_g711mlaw.c
+++ b/dsp/codecs/audio_g711mlaw.c
@@ -1,15 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2016-2017, 2019 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.
- *
*/
#include <linux/types.h>
diff --git a/dsp/msm_audio_ion.c b/dsp/msm_audio_ion.c
index 089376c..a2f5127 100644
--- a/dsp/msm_audio_ion.c
+++ b/dsp/msm_audio_ion.c
@@ -806,6 +806,7 @@
.name = "msm-audio-ion",
.owner = THIS_MODULE,
.of_match_table = msm_audio_ion_dt_match,
+ .suppress_bind_attrs = true,
},
.probe = msm_audio_ion_probe,
.remove = msm_audio_ion_remove,
diff --git a/dsp/msm_audio_ion_vm.c b/dsp/msm_audio_ion_vm.c
new file mode 100644
index 0000000..cd3122e
--- /dev/null
+++ b/dsp/msm_audio_ion_vm.c
@@ -0,0 +1,880 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/mutex.h>
+#include <linux/list.h>
+#include <linux/dma-mapping.h>
+#include <linux/dma-buf.h>
+#include <linux/iommu.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/export.h>
+#include <linux/ion_kernel.h>
+#include <ipc/apr.h>
+#include <asm/dma-iommu.h>
+#include <dsp/msm_audio_ion.h>
+#include <linux/habmm.h>
+
+#define MSM_AUDIO_ION_PROBED (1 << 0)
+
+#define MSM_AUDIO_ION_PHYS_ADDR(alloc_data) \
+ alloc_data->table->sgl->dma_address
+
+#define MSM_AUDIO_SMMU_VM_CMD_MAP 0x00000001
+#define MSM_AUDIO_SMMU_VM_CMD_UNMAP 0x00000002
+#define MSM_AUDIO_SMMU_VM_HAB_MINOR_ID 1
+
+struct msm_audio_ion_private {
+ bool smmu_enabled;
+ struct device *cb_dev;
+ u8 device_status;
+ struct list_head alloc_list;
+ struct mutex list_mutex;
+};
+
+struct msm_audio_alloc_data {
+ size_t len;
+ void *vaddr;
+ struct dma_buf *dma_buf;
+ struct dma_buf_attachment *attach;
+ struct sg_table *table;
+ struct list_head list;
+ u32 export_id;
+};
+
+struct msm_audio_smmu_vm_map_cmd {
+ int cmd_id;
+ u32 export_id;
+ u32 buf_size;
+};
+
+struct msm_audio_smmu_vm_map_cmd_rsp {
+ int status;
+ u64 addr;
+};
+
+struct msm_audio_smmu_vm_unmap_cmd {
+ int cmd_id;
+ u32 export_id;
+};
+
+struct msm_audio_smmu_vm_unmap_cmd_rsp {
+ int status;
+};
+
+static struct msm_audio_ion_private msm_audio_ion_data = {0,};
+static u32 msm_audio_ion_hab_handle;
+
+static void msm_audio_ion_add_allocation(
+ struct msm_audio_ion_private *msm_audio_ion_data,
+ struct msm_audio_alloc_data *alloc_data)
+{
+ /*
+ * Since these APIs can be invoked by multiple
+ * clients, there is need to make sure the list
+ * of allocations is always protected
+ */
+ mutex_lock(&(msm_audio_ion_data->list_mutex));
+ list_add_tail(&(alloc_data->list),
+ &(msm_audio_ion_data->alloc_list));
+ mutex_unlock(&(msm_audio_ion_data->list_mutex));
+}
+
+static int msm_audio_dma_buf_map(struct dma_buf *dma_buf,
+ dma_addr_t *addr, size_t *len)
+{
+
+ struct msm_audio_alloc_data *alloc_data;
+ struct device *cb_dev;
+ unsigned long ionflag = 0;
+ int rc = 0;
+
+ cb_dev = msm_audio_ion_data.cb_dev;
+
+ /* Data required per buffer mapping */
+ alloc_data = kzalloc(sizeof(*alloc_data), GFP_KERNEL);
+ if (!alloc_data)
+ return -ENOMEM;
+
+ alloc_data->dma_buf = dma_buf;
+ alloc_data->len = dma_buf->size;
+ *len = dma_buf->size;
+
+ /* Attach the dma_buf to context bank device */
+ alloc_data->attach = dma_buf_attach(alloc_data->dma_buf,
+ cb_dev);
+ if (IS_ERR(alloc_data->attach)) {
+ rc = PTR_ERR(alloc_data->attach);
+ dev_err(cb_dev,
+ "%s: Fail to attach dma_buf to CB, rc = %d\n",
+ __func__, rc);
+ goto free_alloc_data;
+ }
+
+ /* For uncached buffers, avoid cache maintanance */
+ rc = dma_buf_get_flags(alloc_data->dma_buf, &ionflag);
+ if (rc) {
+ dev_err(cb_dev, "%s: dma_buf_get_flags failed: %d\n",
+ __func__, rc);
+ goto detach_dma_buf;
+ }
+
+ if (!(ionflag & ION_FLAG_CACHED))
+ alloc_data->attach->dma_map_attrs |= DMA_ATTR_SKIP_CPU_SYNC;
+
+ /*
+ * Get the scatter-gather list.
+ * There is no info as this is a write buffer or
+ * read buffer, hence the request is bi-directional
+ * to accommodate both read and write mappings.
+ */
+ alloc_data->table = dma_buf_map_attachment(alloc_data->attach,
+ DMA_BIDIRECTIONAL);
+ if (IS_ERR(alloc_data->table)) {
+ rc = PTR_ERR(alloc_data->table);
+ dev_err(cb_dev,
+ "%s: Fail to map attachment, rc = %d\n",
+ __func__, rc);
+ goto detach_dma_buf;
+ }
+
+ /* physical address from mapping */
+ *addr = MSM_AUDIO_ION_PHYS_ADDR(alloc_data);
+
+ msm_audio_ion_add_allocation(&msm_audio_ion_data,
+ alloc_data);
+ return rc;
+
+detach_dma_buf:
+ dma_buf_detach(alloc_data->dma_buf,
+ alloc_data->attach);
+free_alloc_data:
+ kfree(alloc_data);
+
+ return rc;
+}
+
+static int msm_audio_dma_buf_unmap(struct dma_buf *dma_buf)
+{
+ int rc = 0;
+ struct msm_audio_alloc_data *alloc_data = NULL;
+ struct list_head *ptr, *next;
+ struct device *cb_dev = msm_audio_ion_data.cb_dev;
+ bool found = false;
+
+ /*
+ * Though list_for_each_safe is delete safe, lock
+ * should be explicitly acquired to avoid race condition
+ * on adding elements to the list.
+ */
+ mutex_lock(&(msm_audio_ion_data.list_mutex));
+ list_for_each_safe(ptr, next,
+ &(msm_audio_ion_data.alloc_list)) {
+
+ alloc_data = list_entry(ptr, struct msm_audio_alloc_data,
+ list);
+
+ if (alloc_data->dma_buf == dma_buf) {
+ found = true;
+ dma_buf_unmap_attachment(alloc_data->attach,
+ alloc_data->table,
+ DMA_BIDIRECTIONAL);
+
+ dma_buf_detach(alloc_data->dma_buf,
+ alloc_data->attach);
+
+ dma_buf_put(alloc_data->dma_buf);
+
+ list_del(&(alloc_data->list));
+ kfree(alloc_data);
+ break;
+ }
+ }
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+
+ if (!found) {
+ dev_err(cb_dev,
+ "%s: cannot find allocation, dma_buf %pK",
+ __func__, dma_buf);
+ rc = -EINVAL;
+ }
+
+ return rc;
+}
+
+static int msm_audio_ion_smmu_map(struct dma_buf *dma_buf,
+ dma_addr_t *paddr, size_t *len)
+{
+ int rc;
+ u32 export_id;
+ u32 cmd_rsp_size;
+ bool found = false;
+ bool exported = false;
+ struct msm_audio_smmu_vm_map_cmd smmu_map_cmd;
+ struct msm_audio_smmu_vm_map_cmd_rsp cmd_rsp;
+ struct msm_audio_alloc_data *alloc_data = NULL;
+ unsigned long delay = jiffies + (HZ / 2);
+ void *vaddr;
+
+ *len = dma_buf->size;
+
+ mutex_lock(&(msm_audio_ion_data.list_mutex));
+ list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list),
+ list) {
+ if (alloc_data->dma_buf == dma_buf) {
+ found = true;
+ vaddr = alloc_data->vaddr;
+
+ /* Export the buffer to physical VM */
+ rc = habmm_export(msm_audio_ion_hab_handle, vaddr, *len,
+ &export_id, 0);
+ if (rc) {
+ pr_err("%s: habmm_export failed vaddr = %pK, len = %zd, rc = %d\n",
+ __func__, vaddr, *len, rc);
+ goto err;
+ }
+
+ exported = true;
+ smmu_map_cmd.cmd_id = MSM_AUDIO_SMMU_VM_CMD_MAP;
+ smmu_map_cmd.export_id = export_id;
+ smmu_map_cmd.buf_size = *len;
+
+ rc = habmm_socket_send(msm_audio_ion_hab_handle,
+ (void *)&smmu_map_cmd, sizeof(smmu_map_cmd), 0);
+ if (rc) {
+ pr_err("%s: habmm_socket_send failed %d\n",
+ __func__, rc);
+ goto err;
+ }
+
+ do {
+ cmd_rsp_size = sizeof(cmd_rsp);
+ rc = habmm_socket_recv(msm_audio_ion_hab_handle,
+ (void *)&cmd_rsp,
+ &cmd_rsp_size,
+ 0xFFFFFFFF,
+ 0);
+ } while (time_before(jiffies, delay) && (rc == -EINTR) &&
+ (cmd_rsp_size == 0));
+ if (rc) {
+ pr_err("%s: habmm_socket_recv failed %d\n",
+ __func__, rc);
+ goto err;
+ }
+
+ if (cmd_rsp_size != sizeof(cmd_rsp)) {
+ pr_err("%s: invalid size for cmd rsp %u, expected %zu\n",
+ __func__, cmd_rsp_size, sizeof(cmd_rsp));
+ rc = -EIO;
+ goto err;
+ }
+
+ if (cmd_rsp.status) {
+ pr_err("%s: SMMU map command failed %d\n",
+ __func__, cmd_rsp.status);
+ rc = cmd_rsp.status;
+ goto err;
+ }
+
+ *paddr = (dma_addr_t)cmd_rsp.addr;
+ alloc_data->export_id = export_id;
+ break;
+ }
+ }
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+
+ if (!found) {
+ pr_err("%s: cannot find allocation, dma_buf %pK", __func__, dma_buf);
+ return -EINVAL;
+ }
+
+ return 0;
+
+err:
+ if (exported)
+ (void)habmm_unexport(msm_audio_ion_hab_handle, export_id, 0);
+
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+ return rc;
+}
+
+static int msm_audio_ion_smmu_unmap(struct dma_buf *dma_buf)
+{
+ int rc;
+ bool found = false;
+ u32 cmd_rsp_size;
+ struct msm_audio_smmu_vm_unmap_cmd smmu_unmap_cmd;
+ struct msm_audio_smmu_vm_unmap_cmd_rsp cmd_rsp;
+ struct msm_audio_alloc_data *alloc_data, *next;
+ unsigned long delay = jiffies + (HZ / 2);
+
+ /*
+ * Though list_for_each_entry_safe is delete safe, lock
+ * should be explicitly acquired to avoid race condition
+ * on adding elements to the list.
+ */
+ mutex_lock(&(msm_audio_ion_data.list_mutex));
+ list_for_each_entry_safe(alloc_data, next,
+ &(msm_audio_ion_data.alloc_list), list) {
+
+ if (alloc_data->dma_buf == dma_buf) {
+ found = true;
+ smmu_unmap_cmd.cmd_id = MSM_AUDIO_SMMU_VM_CMD_UNMAP;
+ smmu_unmap_cmd.export_id = alloc_data->export_id;
+
+ rc = habmm_socket_send(msm_audio_ion_hab_handle,
+ (void *)&smmu_unmap_cmd,
+ sizeof(smmu_unmap_cmd), 0);
+ if (rc) {
+ pr_err("%s: habmm_socket_send failed %d\n",
+ __func__, rc);
+ goto err;
+ }
+
+ do {
+ cmd_rsp_size = sizeof(cmd_rsp);
+ rc = habmm_socket_recv(msm_audio_ion_hab_handle,
+ (void *)&cmd_rsp,
+ &cmd_rsp_size,
+ 0xFFFFFFFF,
+ 0);
+ } while (time_before(jiffies, delay) &&
+ (rc == -EINTR) && (cmd_rsp_size == 0));
+ if (rc) {
+ pr_err("%s: habmm_socket_recv failed %d\n",
+ __func__, rc);
+ goto err;
+ }
+
+ if (cmd_rsp_size != sizeof(cmd_rsp)) {
+ pr_err("%s: invalid size for cmd rsp %u\n",
+ __func__, cmd_rsp_size);
+ rc = -EIO;
+ goto err;
+ }
+
+ if (cmd_rsp.status) {
+ pr_err("%s: SMMU unmap command failed %d\n",
+ __func__, cmd_rsp.status);
+ rc = cmd_rsp.status;
+ goto err;
+ }
+
+ rc = habmm_unexport(msm_audio_ion_hab_handle,
+ alloc_data->export_id, 0xFFFFFFFF);
+ if (rc) {
+ pr_err("%s: habmm_unexport failed export_id = %d, rc = %d\n",
+ __func__, alloc_data->export_id, rc);
+ }
+
+ break;
+ }
+ }
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+
+ if (!found) {
+ pr_err("%s: cannot find allocation, dma_buf %pK\n", __func__, dma_buf);
+ rc = -EINVAL;
+ }
+
+ return rc;
+
+err:
+ if (found) {
+ (void)habmm_unexport(msm_audio_ion_hab_handle,
+ alloc_data->export_id, 0xFFFFFFFF);
+ list_del(&(alloc_data->list));
+ kfree(alloc_data);
+ }
+
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+ return rc;
+}
+
+static int msm_audio_ion_get_phys(struct dma_buf *dma_buf,
+ dma_addr_t *addr, size_t *len)
+{
+ int rc = 0;
+
+ rc = msm_audio_dma_buf_map(dma_buf, addr, len);
+ if (rc) {
+ pr_err("%s: failed to map DMA buf, err = %d\n",
+ __func__, rc);
+ goto err;
+ }
+
+ pr_debug("phys=%pK, len=%zd, rc=%d\n", &(*addr), *len, rc);
+err:
+ return rc;
+}
+
+static void *msm_audio_ion_map_kernel(struct dma_buf *dma_buf)
+{
+ int rc = 0;
+ void *addr = NULL;
+ struct msm_audio_alloc_data *alloc_data = NULL;
+
+ rc = dma_buf_begin_cpu_access(dma_buf, DMA_BIDIRECTIONAL);
+ if (rc) {
+ pr_err("%s: kmap dma_buf_begin_cpu_access fail\n", __func__);
+ goto exit;
+ }
+
+ addr = dma_buf_vmap(dma_buf);
+ if (!addr) {
+ pr_err("%s: kernel mapping of dma_buf failed\n",
+ __func__);
+ goto exit;
+ }
+
+ /*
+ * TBD: remove the below section once new API
+ * for mapping kernel virtual address is available.
+ */
+ mutex_lock(&(msm_audio_ion_data.list_mutex));
+ list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list),
+ list) {
+ if (alloc_data->dma_buf == dma_buf) {
+ alloc_data->vaddr = addr;
+ break;
+ }
+ }
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+
+exit:
+ return addr;
+}
+
+static int msm_audio_ion_unmap_kernel(struct dma_buf *dma_buf)
+{
+ int rc = 0;
+ void *vaddr = NULL;
+ struct msm_audio_alloc_data *alloc_data = NULL;
+ struct device *cb_dev = msm_audio_ion_data.cb_dev;
+
+ /*
+ * TBD: remove the below section once new API
+ * for unmapping kernel virtual address is available.
+ */
+ mutex_lock(&(msm_audio_ion_data.list_mutex));
+ list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list),
+ list) {
+ if (alloc_data->dma_buf == dma_buf) {
+ vaddr = alloc_data->vaddr;
+ break;
+ }
+ }
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+
+ if (!vaddr) {
+ dev_err(cb_dev,
+ "%s: cannot find allocation for dma_buf %pK",
+ __func__, dma_buf);
+ rc = -EINVAL;
+ goto err;
+ }
+
+ dma_buf_vunmap(dma_buf, vaddr);
+
+ rc = dma_buf_end_cpu_access(dma_buf, DMA_BIDIRECTIONAL);
+ if (rc) {
+ dev_err(cb_dev, "%s: kmap dma_buf_end_cpu_access fail\n",
+ __func__);
+ goto err;
+ }
+
+err:
+ return rc;
+}
+
+static int msm_audio_ion_map_buf(struct dma_buf *dma_buf, dma_addr_t *paddr,
+ size_t *plen, void **vaddr)
+{
+ int rc = 0;
+
+ rc = msm_audio_ion_get_phys(dma_buf, paddr, plen);
+ if (rc) {
+ pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n",
+ __func__, rc);
+ goto err;
+ }
+
+ *vaddr = msm_audio_ion_map_kernel(dma_buf);
+ if (IS_ERR_OR_NULL(*vaddr)) {
+ pr_err("%s: ION memory mapping for AUDIO failed\n", __func__);
+ rc = -ENOMEM;
+ goto err;
+ }
+
+ if (msm_audio_ion_data.smmu_enabled) {
+ rc = msm_audio_ion_smmu_map(dma_buf, paddr, plen);
+ if (rc) {
+ pr_err("%s: failed to do smmu map, err = %d\n",
+ __func__, rc);
+ goto err;
+ }
+ }
+err:
+ return rc;
+}
+
+/**
+ * msm_audio_ion_alloc -
+ * Allocs ION memory for given client name
+ *
+ * @dma_buf: dma_buf for the ION memory
+ * @bufsz: buffer size
+ * @paddr: Physical address to be assigned with allocated region
+ * @plen: length of allocated region to be assigned
+ * vaddr: virtual address to be assigned
+ *
+ * Returns 0 on success or error on failure
+ */
+int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz,
+ dma_addr_t *paddr, size_t *plen, void **vaddr)
+{
+ int rc = -EINVAL;
+ unsigned long err_ion_ptr = 0;
+
+ if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) {
+ pr_debug("%s:probe is not done, deferred\n", __func__);
+ return -EPROBE_DEFER;
+ }
+ if (!dma_buf || !paddr || !vaddr || !bufsz || !plen) {
+ pr_err("%s: Invalid params\n", __func__);
+ return -EINVAL;
+ }
+
+ if (msm_audio_ion_data.smmu_enabled == true) {
+ pr_debug("%s: system heap is used\n", __func__);
+ *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_SYSTEM_HEAP_ID), 0);
+ } else {
+ pr_debug("%s: audio heap is used\n", __func__);
+ *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_AUDIO_HEAP_ID), 0);
+ }
+ if (IS_ERR_OR_NULL((void *)(*dma_buf))) {
+ if (IS_ERR((void *)(*dma_buf)))
+ err_ion_ptr = PTR_ERR((int *)(*dma_buf));
+ pr_err("%s: ION alloc fail err ptr=%ld, smmu_enabled=%d\n",
+ __func__, err_ion_ptr, msm_audio_ion_data.smmu_enabled);
+ rc = -ENOMEM;
+ goto err;
+ }
+
+ rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr);
+ if (rc) {
+ pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc);
+ goto err_dma_buf;
+ }
+ pr_debug("%s: mapped address = %pK, size=%zd\n", __func__,
+ *vaddr, bufsz);
+
+ memset(*vaddr, 0, bufsz);
+
+ return rc;
+
+err_dma_buf:
+ dma_buf_put(*dma_buf);
+err:
+ return rc;
+}
+EXPORT_SYMBOL(msm_audio_ion_alloc);
+
+/**
+ * msm_audio_ion_import-
+ * Import ION buffer with given file descriptor
+ *
+ * @dma_buf: dma_buf for the ION memory
+ * @fd: file descriptor for the ION memory
+ * @ionflag: flags associated with ION buffer
+ * @bufsz: buffer size
+ * @paddr: Physical address to be assigned with allocated region
+ * @plen: length of allocated region to be assigned
+ * vaddr: virtual address to be assigned
+ *
+ * Returns 0 on success or error on failure
+ */
+int msm_audio_ion_import(struct dma_buf **dma_buf, int fd,
+ unsigned long *ionflag, size_t bufsz,
+ dma_addr_t *paddr, size_t *plen, void **vaddr)
+{
+ int rc = 0;
+
+ if (!(msm_audio_ion_data.device_status & MSM_AUDIO_ION_PROBED)) {
+ pr_debug("%s: probe is not done, deferred\n", __func__);
+ return -EPROBE_DEFER;
+ }
+
+ if (!dma_buf || !paddr || !vaddr || !plen) {
+ pr_err("%s: Invalid params\n", __func__);
+ return -EINVAL;
+ }
+
+ /* bufsz should be 0 and fd shouldn't be 0 as of now */
+ *dma_buf = dma_buf_get(fd);
+ pr_debug("%s: dma_buf =%pK, fd=%d\n", __func__, *dma_buf, fd);
+ if (IS_ERR_OR_NULL((void *)(*dma_buf))) {
+ pr_err("%s: dma_buf_get failed\n", __func__);
+ rc = -EINVAL;
+ goto err;
+ }
+
+ if (ionflag != NULL) {
+ rc = dma_buf_get_flags(*dma_buf, ionflag);
+ if (rc) {
+ pr_err("%s: could not get flags for the dma_buf\n",
+ __func__);
+ goto err_ion_flag;
+ }
+ }
+
+ rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr);
+ if (rc) {
+ pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc);
+ goto err_ion_flag;
+ }
+ pr_debug("%s: mapped address = %pK, size=%zd\n", __func__,
+ *vaddr, bufsz);
+
+ return 0;
+
+err_ion_flag:
+ dma_buf_put(*dma_buf);
+err:
+ *dma_buf = NULL;
+ return rc;
+}
+EXPORT_SYMBOL(msm_audio_ion_import);
+
+/**
+ * msm_audio_ion_free -
+ * fress ION memory for given client and handle
+ *
+ * @dma_buf: dma_buf for the ION memory
+ *
+ * Returns 0 on success or error on failure
+ */
+int msm_audio_ion_free(struct dma_buf *dma_buf)
+{
+ int ret = 0;
+
+ if (!dma_buf) {
+ pr_err("%s: dma_buf invalid\n", __func__);
+ return -EINVAL;
+ }
+
+ ret = msm_audio_ion_unmap_kernel(dma_buf);
+ if (ret)
+ return ret;
+
+ if (msm_audio_ion_data.smmu_enabled) {
+ ret = msm_audio_ion_smmu_unmap(dma_buf);
+ if (ret)
+ pr_err("%s: smmu unmap failed with ret %d\n",
+ __func__, ret);
+ }
+
+ msm_audio_dma_buf_unmap(dma_buf);
+
+ return 0;
+}
+EXPORT_SYMBOL(msm_audio_ion_free);
+
+/**
+ * msm_audio_ion_mmap -
+ * Audio ION memory map
+ *
+ * @abuff: audio buf pointer
+ * @vma: virtual mem area
+ *
+ * Returns 0 on success or error on failure
+ */
+int msm_audio_ion_mmap(struct audio_buffer *abuff,
+ struct vm_area_struct *vma)
+{
+ struct msm_audio_alloc_data *alloc_data = NULL;
+ struct sg_table *table;
+ unsigned long addr = vma->vm_start;
+ unsigned long offset = vma->vm_pgoff * PAGE_SIZE;
+ struct scatterlist *sg;
+ unsigned int i;
+ struct page *page;
+ int ret = 0;
+ bool found = false;
+ struct device *cb_dev = msm_audio_ion_data.cb_dev;
+
+ mutex_lock(&(msm_audio_ion_data.list_mutex));
+ list_for_each_entry(alloc_data, &(msm_audio_ion_data.alloc_list),
+ list) {
+ if (alloc_data->dma_buf == abuff->dma_buf) {
+ found = true;
+ table = alloc_data->table;
+ break;
+ }
+ }
+ mutex_unlock(&(msm_audio_ion_data.list_mutex));
+
+ if (!found) {
+ dev_err(cb_dev,
+ "%s: cannot find allocation, dma_buf %pK",
+ __func__, abuff->dma_buf);
+ return -EINVAL;
+ }
+ /* uncached */
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ /* We need to check if a page is associated with this sg list because:
+ * If the allocation came from a carveout we currently don't have
+ * pages associated with carved out memory. This might change in the
+ * future and we can remove this check and the else statement.
+ */
+ page = sg_page(table->sgl);
+ if (page) {
+ pr_debug("%s: page is NOT null\n", __func__);
+ for_each_sg(table->sgl, sg, table->nents, i) {
+ unsigned long remainder = vma->vm_end - addr;
+ unsigned long len = sg->length;
+
+ page = sg_page(sg);
+
+ if (offset >= len) {
+ offset -= len;
+ continue;
+ } else if (offset) {
+ page += offset / PAGE_SIZE;
+ len -= offset;
+ offset = 0;
+ }
+ len = min(len, remainder);
+ pr_debug("vma=%pK, addr=%x len=%ld vm_start=%x vm_end=%x vm_page_prot=%lu\n",
+ vma, (unsigned int)addr, len,
+ (unsigned int)vma->vm_start,
+ (unsigned int)vma->vm_end,
+ (unsigned long)pgprot_val(vma->vm_page_prot));
+ remap_pfn_range(vma, addr, page_to_pfn(page), len,
+ vma->vm_page_prot);
+ addr += len;
+ if (addr >= vma->vm_end)
+ return 0;
+ }
+ } else {
+ pr_debug("%s: page is NULL\n", __func__);
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL(msm_audio_ion_mmap);
+
+/**
+ * msm_audio_populate_upper_32_bits -
+ * retrieve upper 32bits of 64bit address
+ *
+ * @pa: 64bit physical address
+ *
+ */
+u32 msm_audio_populate_upper_32_bits(dma_addr_t pa)
+{
+ return upper_32_bits(pa);
+}
+EXPORT_SYMBOL(msm_audio_populate_upper_32_bits);
+
+static const struct of_device_id msm_audio_ion_dt_match[] = {
+ { .compatible = "qcom,msm-audio-ion" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, msm_audio_ion_dt_match);
+
+static int msm_audio_ion_probe(struct platform_device *pdev)
+{
+ int rc = 0;
+ const char *msm_audio_ion_dt = "qcom,smmu-enabled";
+ bool smmu_enabled;
+ struct device *dev = &pdev->dev;
+
+ if (dev->of_node == NULL) {
+ dev_err(dev,
+ "%s: device tree is not found\n",
+ __func__);
+ msm_audio_ion_data.smmu_enabled = 0;
+ return 0;
+ }
+
+ smmu_enabled = of_property_read_bool(dev->of_node,
+ msm_audio_ion_dt);
+ msm_audio_ion_data.smmu_enabled = smmu_enabled;
+
+ if (!smmu_enabled) {
+ dev_dbg(dev, "%s: SMMU is Disabled\n", __func__);
+ goto exit;
+ }
+
+ rc = habmm_socket_open(&msm_audio_ion_hab_handle,
+ HAB_MMID_CREATE(MM_AUD_3,
+ MSM_AUDIO_SMMU_VM_HAB_MINOR_ID),
+ 0xFFFFFFFF,
+ HABMM_SOCKET_OPEN_FLAGS_SINGLE_BE_SINGLE_FE);
+ if (rc) {
+ dev_err(dev, "%s: habmm_socket_open failed %d\n",
+ __func__, rc);
+ return rc;
+ }
+
+ dev_info(dev, "%s: msm_audio_ion_hab_handle %x\n",
+ __func__, msm_audio_ion_hab_handle);
+
+ INIT_LIST_HEAD(&msm_audio_ion_data.alloc_list);
+ mutex_init(&(msm_audio_ion_data.list_mutex));
+
+exit:
+ if (!rc)
+ msm_audio_ion_data.device_status |= MSM_AUDIO_ION_PROBED;
+
+ msm_audio_ion_data.cb_dev = dev;
+
+ return rc;
+}
+
+static int msm_audio_ion_remove(struct platform_device *pdev)
+{
+ if (msm_audio_ion_data.smmu_enabled) {
+ if (msm_audio_ion_hab_handle)
+ habmm_socket_close(msm_audio_ion_hab_handle);
+
+ mutex_destroy(&(msm_audio_ion_data.list_mutex));
+ }
+ msm_audio_ion_data.smmu_enabled = 0;
+ msm_audio_ion_data.device_status = 0;
+ return 0;
+}
+
+static struct platform_driver msm_audio_ion_driver = {
+ .driver = {
+ .name = "msm-audio-ion",
+ .owner = THIS_MODULE,
+ .of_match_table = msm_audio_ion_dt_match,
+ },
+ .probe = msm_audio_ion_probe,
+ .remove = msm_audio_ion_remove,
+};
+
+int __init msm_audio_ion_init(void)
+{
+ return platform_driver_register(&msm_audio_ion_driver);
+}
+
+void msm_audio_ion_exit(void)
+{
+ platform_driver_unregister(&msm_audio_ion_driver);
+}
+
+MODULE_DESCRIPTION("MSM Audio ION VM module");
+MODULE_LICENSE("GPL v2");
diff --git a/dsp/msm_mdf.c b/dsp/msm_mdf.c
index e3d87e3..19232d5 100644
--- a/dsp/msm_mdf.c
+++ b/dsp/msm_mdf.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
#include <linux/kernel.h>
@@ -694,6 +694,7 @@
.name = "msm-mdf",
.owner = THIS_MODULE,
.of_match_table = msm_mdf_match_table,
+ .suppress_bind_attrs = true,
},
};
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 7a510be..0fe3888 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -911,6 +911,8 @@
case AFE_PORT_ID_QUATERNARY_MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
+ case AFE_PORT_ID_SENARY_MI2S_RX:
+ case AFE_PORT_ID_SENARY_MI2S_TX:
ret_size = SIZEOF_CFG_CMD(afe_param_id_i2s_cfg);
break;
case HDMI_RX:
@@ -4489,6 +4491,7 @@
case AFE_PORT_ID_QUATERNARY_MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
+ case AFE_PORT_ID_SENARY_MI2S_RX:
case AFE_PORT_ID_SENARY_MI2S_TX:
case AFE_PORT_ID_INT0_MI2S_RX:
case AFE_PORT_ID_INT0_MI2S_TX:
@@ -4817,6 +4820,8 @@
return IDX_AFE_PORT_ID_QUINARY_MI2S_RX;
case AFE_PORT_ID_QUINARY_MI2S_TX:
return IDX_AFE_PORT_ID_QUINARY_MI2S_TX;
+ case AFE_PORT_ID_SENARY_MI2S_RX:
+ return IDX_AFE_PORT_ID_SENARY_MI2S_RX;
case AFE_PORT_ID_SENARY_MI2S_TX:
return IDX_AFE_PORT_ID_SENARY_MI2S_TX;
case AFE_PORT_ID_PRIMARY_TDM_RX:
@@ -4979,6 +4984,38 @@
return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7;
case AFE_PORT_ID_QUINARY_TDM_TX_7:
return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7;
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_0;
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_0;
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_1;
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_1;
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_2;
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_2;
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_3;
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_3;
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_4;
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_4;
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_5;
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_5;
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_6;
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_6;
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_7;
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_7;
case AFE_PORT_ID_INT0_MI2S_RX:
return IDX_AFE_PORT_ID_INT0_MI2S_RX;
case AFE_PORT_ID_INT0_MI2S_TX:
@@ -5166,6 +5203,7 @@
case MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
+ case AFE_PORT_ID_SENARY_MI2S_RX:
case AFE_PORT_ID_SENARY_MI2S_TX:
cfg_type = AFE_PARAM_ID_I2S_CONFIG;
break;
@@ -5535,6 +5573,8 @@
case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX:
case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX:
case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX:
+ case AFE_GROUP_DEVICE_ID_SENARY_TDM_RX:
+ case AFE_GROUP_DEVICE_ID_SENARY_TDM_TX:
cfg_type = AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG;
break;
default:
@@ -7086,6 +7126,8 @@
case AFE_PORT_ID_QUATERNARY_PCM_TX:
case AFE_PORT_ID_QUINARY_PCM_RX:
case AFE_PORT_ID_QUINARY_PCM_TX:
+ case AFE_PORT_ID_SENARY_PCM_RX:
+ case AFE_PORT_ID_SENARY_PCM_TX:
case SECONDARY_I2S_RX:
case SECONDARY_I2S_TX:
case MI2S_RX:
@@ -7140,6 +7182,7 @@
case AFE_PORT_ID_TERTIARY_MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
+ case AFE_PORT_ID_SENARY_MI2S_RX:
case AFE_PORT_ID_SENARY_MI2S_TX:
case AFE_PORT_ID_PRIMARY_TDM_RX:
case AFE_PORT_ID_PRIMARY_TDM_TX:
@@ -7221,6 +7264,22 @@
case AFE_PORT_ID_QUINARY_TDM_TX_6:
case AFE_PORT_ID_QUINARY_TDM_RX_7:
case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
case AFE_PORT_ID_INT0_MI2S_RX:
case AFE_PORT_ID_INT1_MI2S_RX:
case AFE_PORT_ID_INT2_MI2S_RX:
@@ -7578,7 +7637,7 @@
ret = afe_q6_interface_prepare();
if (ret != 0) {
- pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
+ pr_err_ratelimited("%s: Q6 interface prepare failed %d\n", __func__, ret);
return ret;
}
@@ -7599,7 +7658,7 @@
ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr,
(u8 *) cfg);
if (ret < 0)
- pr_err("%s: AFE clk cfg failed with ret %d\n",
+ pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n",
__func__, ret);
mutex_unlock(&this_afe.afe_cmd_lock);
diff --git a/dsp/q6audio-v2.c b/dsp/q6audio-v2.c
index 822fbb5..8de6060 100644
--- a/dsp/q6audio-v2.c
+++ b/dsp/q6audio-v2.c
@@ -269,6 +269,40 @@
return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7;
case AFE_PORT_ID_QUINARY_TDM_TX_7:
return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7;
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_0;
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_0;
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_1;
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_1;
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_2;
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_2;
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_3;
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_3;
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_4;
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_4;
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_5;
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_5;
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_6;
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_6;
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ return IDX_AFE_PORT_ID_SENARY_TDM_RX_7;
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ return IDX_AFE_PORT_ID_SENARY_TDM_TX_7;
+ case AFE_PORT_ID_SENARY_MI2S_RX:
+ return IDX_AFE_PORT_ID_SENARY_MI2S_RX;
case AFE_PORT_ID_SENARY_MI2S_TX:
return IDX_AFE_PORT_ID_SENARY_MI2S_TX;
case AFE_PORT_ID_USB_RX:
@@ -613,6 +647,40 @@
return AFE_PORT_ID_QUINARY_TDM_RX_7;
case AFE_PORT_ID_QUINARY_TDM_TX_7:
return AFE_PORT_ID_QUINARY_TDM_TX_7;
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ return AFE_PORT_ID_SENARY_TDM_RX;
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ return AFE_PORT_ID_SENARY_TDM_TX;
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ return AFE_PORT_ID_SENARY_TDM_RX_1;
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ return AFE_PORT_ID_SENARY_TDM_TX_1;
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ return AFE_PORT_ID_SENARY_TDM_RX_2;
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ return AFE_PORT_ID_SENARY_TDM_TX_2;
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ return AFE_PORT_ID_SENARY_TDM_RX_3;
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ return AFE_PORT_ID_SENARY_TDM_TX_3;
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ return AFE_PORT_ID_SENARY_TDM_RX_4;
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ return AFE_PORT_ID_SENARY_TDM_TX_4;
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ return AFE_PORT_ID_SENARY_TDM_RX_5;
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ return AFE_PORT_ID_SENARY_TDM_TX_5;
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ return AFE_PORT_ID_SENARY_TDM_RX_6;
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ return AFE_PORT_ID_SENARY_TDM_TX_6;
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ return AFE_PORT_ID_SENARY_TDM_RX_7;
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ return AFE_PORT_ID_SENARY_TDM_TX_7;
+ case AFE_PORT_ID_SENARY_MI2S_RX:
+ return AFE_PORT_ID_SENARY_MI2S_RX;
case AFE_PORT_ID_SENARY_MI2S_TX:
return AFE_PORT_ID_SENARY_MI2S_TX;
case AFE_PORT_ID_USB_RX:
@@ -832,6 +900,23 @@
case AFE_PORT_ID_QUINARY_TDM_TX_6:
case AFE_PORT_ID_QUINARY_TDM_RX_7:
case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_MI2S_RX:
case AFE_PORT_ID_SENARY_MI2S_TX:
case AFE_PORT_ID_INT0_MI2S_RX:
case AFE_PORT_ID_INT0_MI2S_TX:
@@ -1043,6 +1128,23 @@
case AFE_PORT_ID_QUINARY_TDM_TX_6:
case AFE_PORT_ID_QUINARY_TDM_RX_7:
case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_TDM_RX:
+ case AFE_PORT_ID_SENARY_TDM_TX:
+ case AFE_PORT_ID_SENARY_TDM_RX_1:
+ case AFE_PORT_ID_SENARY_TDM_TX_1:
+ case AFE_PORT_ID_SENARY_TDM_RX_2:
+ case AFE_PORT_ID_SENARY_TDM_TX_2:
+ case AFE_PORT_ID_SENARY_TDM_RX_3:
+ case AFE_PORT_ID_SENARY_TDM_TX_3:
+ case AFE_PORT_ID_SENARY_TDM_RX_4:
+ case AFE_PORT_ID_SENARY_TDM_TX_4:
+ case AFE_PORT_ID_SENARY_TDM_RX_5:
+ case AFE_PORT_ID_SENARY_TDM_TX_5:
+ case AFE_PORT_ID_SENARY_TDM_RX_6:
+ case AFE_PORT_ID_SENARY_TDM_TX_6:
+ case AFE_PORT_ID_SENARY_TDM_RX_7:
+ case AFE_PORT_ID_SENARY_TDM_TX_7:
+ case AFE_PORT_ID_SENARY_MI2S_RX:
case AFE_PORT_ID_SENARY_MI2S_TX:
case AFE_PORT_ID_USB_RX:
case AFE_PORT_ID_USB_TX:
diff --git a/dsp/q6core.c b/dsp/q6core.c
index 3f15f10..43f6e25 100644
--- a/dsp/q6core.c
+++ b/dsp/q6core.c
@@ -1907,6 +1907,7 @@
.name = "q6core_audio",
.owner = THIS_MODULE,
.of_match_table = q6core_of_match,
+ .suppress_bind_attrs = true,
}
};
diff --git a/dsp/q6lsm.c b/dsp/q6lsm.c
index 96671ec..d55dfc3 100644
--- a/dsp/q6lsm.c
+++ b/dsp/q6lsm.c
@@ -89,6 +89,13 @@
static int q6lsm_memory_unmap_regions(struct lsm_client *client,
uint32_t handle);
+struct lsm_client_afe_data {
+ uint64_t fe_id;
+ uint16_t unprocessed_data;
+};
+
+static struct lsm_client_afe_data lsm_client_afe_data[LSM_MAX_SESSION_ID + 1];
+
static int q6lsm_get_session_id_from_lsm_client(struct lsm_client *client)
{
int n;
@@ -255,6 +262,8 @@
pr_debug("%s: Freeing session ID %d\n", __func__, client->session);
spin_lock_irqsave(&lsm_session_lock, flags);
lsm_session[client->session] = NULL;
+ lsm_client_afe_data[client->session].fe_id = 0;
+ lsm_client_afe_data[client->session].unprocessed_data = 0;
spin_unlock_irqrestore(&lsm_session_lock, flags);
client->session = LSM_INVALID_SESSION_ID;
}
@@ -1063,6 +1072,72 @@
}
/**
+ * q6lsm_set_afe_data_format -
+ * command to set afe data format
+ *
+ * @fe_id: FrontEnd DAI link ID
+ * @afe_data_format: afe data format
+ *
+ * Returns 0 on success or -EINVAL on failure
+ */
+int q6lsm_set_afe_data_format(uint64_t fe_id, uint16_t afe_data_format)
+{
+ int n = 0;
+
+ if (0 != afe_data_format && 1 != afe_data_format)
+ goto done;
+
+ pr_debug("%s: afe data is %s\n", __func__,
+ afe_data_format ? "unprocessed" : "processed");
+
+ for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) {
+ if (0 == lsm_client_afe_data[n].fe_id) {
+ lsm_client_afe_data[n].fe_id = fe_id;
+ lsm_client_afe_data[n].unprocessed_data =
+ afe_data_format;
+ pr_debug("%s: session ID is %d, fe_id is %d\n",
+ __func__, n, fe_id);
+ return 0;
+ }
+ }
+
+ pr_err("%s: all lsm sessions are taken\n", __func__);
+done:
+ return -EINVAL;
+}
+EXPORT_SYMBOL(q6lsm_set_afe_data_format);
+
+/**
+ * q6lsm_get_afe_data_format -
+ * command to get afe data format
+ *
+ * @fe_id: FrontEnd DAI link ID
+ * @afe_data_format: afe data format
+ *
+ */
+void q6lsm_get_afe_data_format(uint64_t fe_id, uint16_t *afe_data_format)
+{
+ int n = 0;
+
+ if (NULL == afe_data_format) {
+ pr_err("%s: Pointer afe_data_format is NULL\n", __func__);
+ return;
+ }
+
+ for (n = LSM_MIN_SESSION_ID; n <= LSM_MAX_SESSION_ID; n++) {
+ if (fe_id == lsm_client_afe_data[n].fe_id) {
+ *afe_data_format =
+ lsm_client_afe_data[n].unprocessed_data;
+ pr_debug("%s: session: %d, fe_id: %d, afe data: %s\n",
+ __func__, n, fe_id,
+ *afe_data_format ? "unprocessed" : "processed");
+ return;
+ }
+ }
+}
+EXPORT_SYMBOL(q6lsm_get_afe_data_format);
+
+/**
* q6lsm_set_port_connected -
* command to set LSM port connected
*
@@ -1092,14 +1167,19 @@
connectport_hdr.param_size = sizeof(connect_port);
client->connect_to_port = get_lsm_port();
+ if (ADM_LSM_PORT_ID != client->connect_to_port)
+ q6lsm_get_afe_data_format(client->fe_id,
+ &client->unprocessed_data);
connect_port.minor_version = QLSM_PARAM_ID_MINOR_VERSION;
connect_port.port_id = client->connect_to_port;
+ connect_port.unprocessed_data = client->unprocessed_data;
rc = q6lsm_pack_and_set_params(client, &connectport_hdr,
(uint8_t *) &connect_port,
set_param_opcode);
if (rc)
pr_err("%s: Failed set_params, rc %d\n", __func__, rc);
+
return rc;
}
EXPORT_SYMBOL(q6lsm_set_port_connected);
diff --git a/dsp/voice_mhi.c b/dsp/voice_mhi.c
index 87572ef..34f5eb9 100644
--- a/dsp/voice_mhi.c
+++ b/dsp/voice_mhi.c
@@ -228,7 +228,8 @@
goto done;
}
if (voice_mhi_lcl.vote_count == 0) {
- ret = mhi_device_get_sync(voice_mhi_lcl.mhi_dev);
+ ret = mhi_device_get_sync(voice_mhi_lcl.mhi_dev,
+ MHI_VOTE_DEVICE);
if (ret) {
pr_err("%s: mhi_device_get_sync failed\n",
__func__);
@@ -269,7 +270,7 @@
}
if (voice_mhi_lcl.vote_count == 1)
- mhi_device_put(voice_mhi_lcl.mhi_dev);
+ mhi_device_put(voice_mhi_lcl.mhi_dev, MHI_VOTE_DEVICE);
voice_mhi_lcl.vote_count--;
}
mutex_unlock(&voice_mhi_lcl.mutex);
@@ -590,6 +591,7 @@
.name = "voice_mhi_audio",
.owner = THIS_MODULE,
.of_match_table = voice_mhi_of_match,
+ .suppress_bind_attrs = true,
}
};
diff --git a/include/asoc/core.h b/include/asoc/core.h
index c6e544e..67c97d6 100644
--- a/include/asoc/core.h
+++ b/include/asoc/core.h
@@ -437,98 +437,98 @@
int wcd9xxx_init(void);
void wcd9xxx_exit(void);
#else
-int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg)
+static inline int wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg)
{
return 0;
}
-int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg,
+static inline int wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg,
u8 val)
{
return 0;
}
-int wcd9xxx_get_logical_addresses(u8 *pgd_la, u8 *inf_la)
+static inline int wcd9xxx_get_logical_addresses(u8 *pgd_la, u8 *inf_la)
{
return 0;
}
-int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg,
+static inline int wcd9xxx_slim_write_repeat(struct wcd9xxx *wcd9xxx, unsigned short reg,
int bytes, void *src)
{
return 0;
}
-int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx,
+static inline int wcd9xxx_slim_reserve_bw(struct wcd9xxx *wcd9xxx,
u32 bw_ops, bool commit)
{
return 0;
}
-int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, enum codec_power_states
+static inline int wcd9xxx_set_power_state(struct wcd9xxx *wcd9xxx, enum codec_power_states
cdc_power_state, enum wcd_power_regions pwr_region)
{
return 0;
}
-int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx,
+static inline int wcd9xxx_get_current_power_state(struct wcd9xxx *wcd9xxx,
enum wcd_power_regions pwr_region)
{
return 0;
}
-int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg)
+static inline int wcd9xxx_page_write(struct wcd9xxx *wcd9xxx, unsigned short *reg)
{
return 0;
}
-int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx,
+static inline int wcd9xxx_slim_bulk_write(struct wcd9xxx *wcd9xxx,
struct wcd9xxx_reg_val *bulk_reg,
unsigned int size, bool interface)
{
return 0;
}
-extern int wcd9xxx_core_res_init(
+static inline int wcd9xxx_core_res_init(
struct wcd9xxx_core_resource *wcd9xxx_core_res,
int num_irqs, int num_irq_regs, struct regmap *wcd_regmap)
{
return 0;
}
-extern void wcd9xxx_core_res_deinit(
+static inline void wcd9xxx_core_res_deinit(
struct wcd9xxx_core_resource *wcd9xxx_core_res)
{
}
-extern int wcd9xxx_core_res_suspend(
+static inline int wcd9xxx_core_res_suspend(
struct wcd9xxx_core_resource *wcd9xxx_core_res,
pm_message_t pmesg)
{
return 0;
}
-extern int wcd9xxx_core_res_resume(
+static inline int wcd9xxx_core_res_resume(
struct wcd9xxx_core_resource *wcd9xxx_core_res)
{
return 0;
}
-extern int wcd9xxx_core_irq_init(
+static inline int wcd9xxx_core_irq_init(
struct wcd9xxx_core_resource *wcd9xxx_core_res)
{
return 0;
}
-extern int wcd9xxx_assign_irq(struct wcd9xxx_core_resource *wcd9xxx_core_res,
+static inline int wcd9xxx_assign_irq(struct wcd9xxx_core_resource *wcd9xxx_core_res,
unsigned int irq,
unsigned int irq_base)
{
return 0;
}
-extern enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void)
+static inline enum wcd9xxx_intf_status wcd9xxx_get_intf_type(void)
{
return 0;
}
-extern void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status int_state)
+static inline void wcd9xxx_set_intf_type(enum wcd9xxx_intf_status int_state)
{
}
-extern enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg(
+static inline enum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg(
struct wcd9xxx_core_resource *wcd9xxx_core_res,
enum wcd9xxx_pm_state o,
enum wcd9xxx_pm_state n)
@@ -541,11 +541,11 @@
return 0;
}
-int wcd9xxx_init(void)
+static inline int wcd9xxx_init(void)
{
return 0;
}
-void wcd9xxx_exit(void)
+static inline void wcd9xxx_exit(void)
{
}
diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h
index 8bff499..a90cb05 100644
--- a/include/dsp/apr_audio-v2.h
+++ b/include/dsp/apr_audio-v2.h
@@ -1434,7 +1434,7 @@
/* End of the range of port IDs for TDM devices. */
#define AFE_PORT_ID_TDM_PORT_RANGE_END \
- (AFE_PORT_ID_TDM_PORT_RANGE_START+0x50-1)
+ (AFE_PORT_ID_TDM_PORT_RANGE_START+0x60-1)
/* Size of the range of port IDs for TDM ports. */
#define AFE_PORT_ID_TDM_PORT_RANGE_SIZE \
@@ -1830,6 +1830,40 @@
#define AFE_PORT_ID_QUINARY_TDM_TX_7 \
(AFE_PORT_ID_QUINARY_TDM_TX + 0x0E)
+#define AFE_PORT_ID_SENARY_TDM_RX \
+ (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x50)
+#define AFE_PORT_ID_SENARY_TDM_RX_1 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x02)
+#define AFE_PORT_ID_SENARY_TDM_RX_2 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x04)
+#define AFE_PORT_ID_SENARY_TDM_RX_3 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x06)
+#define AFE_PORT_ID_SENARY_TDM_RX_4 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x08)
+#define AFE_PORT_ID_SENARY_TDM_RX_5 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x0A)
+#define AFE_PORT_ID_SENARY_TDM_RX_6 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x0C)
+#define AFE_PORT_ID_SENARY_TDM_RX_7 \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x0E)
+
+#define AFE_PORT_ID_SENARY_TDM_TX \
+ (AFE_PORT_ID_TDM_PORT_RANGE_START + 0x51)
+#define AFE_PORT_ID_SENARY_TDM_TX_1 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x02)
+#define AFE_PORT_ID_SENARY_TDM_TX_2 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x04)
+#define AFE_PORT_ID_SENARY_TDM_TX_3 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x06)
+#define AFE_PORT_ID_SENARY_TDM_TX_4 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x08)
+#define AFE_PORT_ID_SENARY_TDM_TX_5 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x0A)
+#define AFE_PORT_ID_SENARY_TDM_TX_6 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x0C)
+#define AFE_PORT_ID_SENARY_TDM_TX_7 \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x0E)
+
#define AFE_PORT_ID_INVALID 0xFFFF
#define AAC_ENC_MODE_AAC_LC 0x02
@@ -3855,6 +3889,9 @@
uint32_t min_sink_modeC;
uint32_t max_sink_modeC;
uint32_t mode;
+ uint32_t input_mode;
+ uint32_t fade_duration;
+ uint8_t sink_cap[11];
} __attribute__ ((packed));
/*
@@ -5572,12 +5609,17 @@
/* Left side direct channel. */
#define PCM_CHANNEL_LSD 33
-/* Right side direct channel. */
+/* Right side direct channel. Update PCM_MAX_CHMAP_ID when
+ * this list is extended.
+ */
#define PCM_CHANNEL_RSD 34
/* Mark unused channel. */
#define PCM_CHANNEL_UNUSED 47
+/* Max valid channel map index */
+#define PCM_MAX_CHMAP_ID PCM_CHANNEL_RSD
+
#define PCM_FORMAT_MAX_NUM_CHANNEL 8
#define PCM_FORMAT_MAX_CHANNELS_9 9
@@ -11376,6 +11418,10 @@
#define Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT 0x209
/** Clock ID for Quinary TDM OSR */
#define Q6AFE_LPASS_CLK_ID_QUIN_TDM_OSR 0x20A
+/** Clock ID for Senary TDM IBIT */
+#define Q6AFE_LPASS_CLK_ID_SEN_TDM_IBIT 0x20B
+/** Clock ID for Senary TDM EBIT */
+#define Q6AFE_LPASS_CLK_ID_SEN_TDM_EBIT 0x20C
/* Clock ID for MCLK1 */
#define Q6AFE_LPASS_CLK_ID_MCLK_1 0x300
@@ -11768,6 +11814,10 @@
(AFE_PORT_ID_QUINARY_TDM_RX + 0x100)
#define AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX \
(AFE_PORT_ID_QUINARY_TDM_TX + 0x100)
+#define AFE_GROUP_DEVICE_ID_SENARY_TDM_RX \
+ (AFE_PORT_ID_SENARY_TDM_RX + 0x100)
+#define AFE_GROUP_DEVICE_ID_SENARY_TDM_TX \
+ (AFE_PORT_ID_SENARY_TDM_TX + 0x100)
/* ID of the parameter used by #AFE_MODULE_GROUP_DEVICE to configure the
* group device. #AFE_SVC_CMD_SET_PARAM can use this parameter ID.
diff --git a/include/dsp/msm-audio-event-notify.h b/include/dsp/msm-audio-event-notify.h
index c730d31..8c515e2 100644
--- a/include/dsp/msm-audio-event-notify.h
+++ b/include/dsp/msm-audio-event-notify.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*/
#ifndef __MSM_AUDIO_EVENT_NOTIFY_H_
@@ -8,7 +8,8 @@
#include <linux/notifier.h>
-#if IS_ENABLED(CONFIG_SND_SOC_MSM_QDSP6V2_INTF)
+#if (IS_ENABLED(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) || \
+ IS_ENABLED(CONFIG_SND_SOC_MSM_QDSP6V2_VM))
int msm_aud_evt_register_client(struct notifier_block *nb);
int msm_aud_evt_unregister_client(struct notifier_block *nb);
int msm_aud_evt_notifier_call_chain(unsigned long val, void *v);
diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h
index 4a5f39a..323ca1e 100644
--- a/include/dsp/q6afe-v2.h
+++ b/include/dsp/q6afe-v2.h
@@ -110,12 +110,13 @@
IDX_PRIMARY_SPDIF_RX,
IDX_GLOBAL_CFG,
IDX_AUDIO_PORT_ID_I2S_RX,
- /* IDX 50->53 */
+ /* IDX 50->54 */
IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1,
IDX_AFE_PORT_ID_QUINARY_MI2S_RX,
IDX_AFE_PORT_ID_QUINARY_MI2S_TX,
+ IDX_AFE_PORT_ID_SENARY_MI2S_RX,
IDX_AFE_PORT_ID_SENARY_MI2S_TX,
- /* IDX 54->117 */
+ /* IDX 55->118 */
IDX_AFE_PORT_ID_PRIMARY_TDM_RX_0,
IDX_AFE_PORT_ID_PRIMARY_TDM_TX_0,
IDX_AFE_PORT_ID_PRIMARY_TDM_RX_1,
@@ -180,22 +181,22 @@
IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_6,
IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7,
IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7,
- /* IDX 118->121 */
+ /* IDX 119->122 */
IDX_SLIMBUS_7_RX,
IDX_SLIMBUS_7_TX,
IDX_SLIMBUS_8_RX,
IDX_SLIMBUS_8_TX,
- /* IDX 122-> 123 */
+ /* IDX 123-> 124 */
IDX_AFE_PORT_ID_USB_RX,
IDX_AFE_PORT_ID_USB_TX,
- /* IDX 124 */
+ /* IDX 125 */
IDX_DISPLAY_PORT_RX,
- /* IDX 125-> 128 */
+ /* IDX 126-> 129 */
IDX_AFE_PORT_ID_TERTIARY_PCM_RX,
IDX_AFE_PORT_ID_TERTIARY_PCM_TX,
IDX_AFE_PORT_ID_QUATERNARY_PCM_RX,
IDX_AFE_PORT_ID_QUATERNARY_PCM_TX,
- /* IDX 129-> 142 */
+ /* IDX 130-> 143 */
IDX_AFE_PORT_ID_INT0_MI2S_RX,
IDX_AFE_PORT_ID_INT0_MI2S_TX,
IDX_AFE_PORT_ID_INT1_MI2S_RX,
@@ -210,7 +211,7 @@
IDX_AFE_PORT_ID_INT5_MI2S_TX,
IDX_AFE_PORT_ID_INT6_MI2S_RX,
IDX_AFE_PORT_ID_INT6_MI2S_TX,
- /* IDX 143-> 160 */
+ /* IDX 144-> 161 */
IDX_AFE_PORT_ID_QUINARY_PCM_RX,
IDX_AFE_PORT_ID_QUINARY_PCM_TX,
IDX_AFE_PORT_ID_QUINARY_TDM_RX_0,
@@ -229,7 +230,7 @@
IDX_AFE_PORT_ID_QUINARY_TDM_TX_6,
IDX_AFE_PORT_ID_QUINARY_TDM_RX_7,
IDX_AFE_PORT_ID_QUINARY_TDM_TX_7,
- /* IDX 161 to 182 */
+ /* IDX 162 to 183 */
IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_0,
IDX_AFE_PORT_ID_WSA_CODEC_DMA_TX_0,
IDX_AFE_PORT_ID_WSA_CODEC_DMA_RX_1,
@@ -252,17 +253,34 @@
IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5,
IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6,
IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7,
- /* IDX 183 to 185 */
+ /* IDX 184 to 186 */
IDX_SECONDARY_SPDIF_RX,
IDX_PRIMARY_SPDIF_TX,
IDX_SECONDARY_SPDIF_TX,
- /* IDX 186 to 187 */
+ /* IDX 187 to 188 */
IDX_SLIMBUS_9_RX,
IDX_SLIMBUS_9_TX,
- /* IDX 188 -> 190 */
+ /* IDX 189 -> 191 */
IDX_AFE_PORT_ID_SENARY_PCM_RX,
IDX_AFE_PORT_ID_SENARY_PCM_TX,
IDX_AFE_LOOPBACK_TX,
+ /* IDX 192-> 207 */
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_0,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_0,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_1,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_1,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_2,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_2,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_3,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_3,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_4,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_4,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_5,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_5,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_6,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_6,
+ IDX_AFE_PORT_ID_SENARY_TDM_RX_7,
+ IDX_AFE_PORT_ID_SENARY_TDM_TX_7,
AFE_MAX_PORTS
};
diff --git a/include/dsp/q6lsm.h b/include/dsp/q6lsm.h
index e4a007f..af43cdd 100644
--- a/include/dsp/q6lsm.h
+++ b/include/dsp/q6lsm.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
*/
#ifndef __Q6LSM_H__
#define __Q6LSM_H__
@@ -102,6 +102,8 @@
uint32_t event_type;
uint32_t num_stages;
struct lsm_stage_config stage_cfg[LSM_MAX_STAGES_PER_SESSION];
+ uint64_t fe_id;
+ uint16_t unprocessed_data;
};
struct lsm_stream_cmd_open_tx {
@@ -159,7 +161,7 @@
uint32_t minor_version;
/* AFE port id that receives voice wake up data */
uint16_t port_id;
- uint16_t reserved;
+ uint16_t unprocessed_data;
} __packed;
struct lsm_param_poll_enable {
@@ -295,4 +297,6 @@
int q6lsm_lab_out_ch_cfg(struct lsm_client *client, u8 *ch_map,
struct lsm_params_info_v2 *p_info);
bool q6lsm_adsp_supports_multi_stage_detection(void);
+int q6lsm_set_afe_data_format(uint64_t fe_id, uint16_t afe_data_format);
+void q6lsm_get_afe_data_format(uint64_t fe_id, uint16_t *afe_data_format);
#endif /* __Q6LSM_H__ */
diff --git a/include/ipc/apr.h b/include/ipc/apr.h
index 79d87dc..7aecee2 100644
--- a/include/ipc/apr.h
+++ b/include/ipc/apr.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2010-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2017, 2019, The Linux Foundation. All rights reserved.
*/
#ifndef __APR_H_
#define __APR_H_
@@ -129,6 +129,10 @@
struct mutex m_lock;
spinlock_t w_lock;
uint8_t pkt_owner;
+#ifdef CONFIG_MSM_QDSP6_APRV2_VM
+ uint16_t vm_dest_svc;
+ uint32_t vm_handle;
+#endif
};
struct apr_client {
diff --git a/include/ipc/aprv2_vm.h b/include/ipc/aprv2_vm.h
new file mode 100644
index 0000000..ce61c1a
--- /dev/null
+++ b/include/ipc/aprv2_vm.h
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2016-2017, 2019 The Linux Foundation. All rights reserved.
+ */
+#ifndef __APRV2_VM_H__
+#define __APRV2_VM_H__
+
+#define APRV2_VM_MAX_DNS_SIZE (31)
+ /* Includes NULL character. */
+#define APRV2_VM_PKT_SERVICE_ID_MASK (0x00FF)
+ /* Bitmask of the service ID field. */
+
+/* Packet Structure Definition */
+struct aprv2_vm_packet_t {
+ uint32_t header;
+ uint16_t src_addr;
+ uint16_t src_port;
+ uint16_t dst_addr;
+ uint16_t dst_port;
+ uint32_t token;
+ uint32_t opcode;
+};
+
+/**
+ * In order to send command/event via MM HAB, the following buffer
+ * format shall be followed, where the buffer is provided to the
+ * HAB send API.
+ * |-----cmd_id or evt_id -----| <- 32 bit, e.g. APRV2_VM_CMDID_REGISTER
+ * |-----cmd payload ----------| e.g. aprv2_vm_cmd_register_t
+ * | ... |
+ *
+ * In order to receive a command response or event ack, the following
+ * buffer format shall be followed, where the buffer is provided to
+ * the HAB receive API.
+ * |-----cmd response ---------| e.g. aprv2_vm_cmd_register_rsp_t
+ * | ... |
+ */
+
+/* Registers a service with the backend APR driver. */
+#define APRV2_VM_CMDID_REGISTER (0x00000001)
+
+struct aprv2_vm_cmd_register_t {
+ uint32_t name_size;
+ /**< The service name string size in bytes. */
+ char name[APRV2_VM_MAX_DNS_SIZE];
+ /**<
+ * The service name string to register.
+ *
+ * A NULL name means the service does not have a name.
+ */
+ uint16_t addr;
+ /**<
+ * The address to register.
+ *
+ * A zero value means to auto-generate a free dynamic address.
+ * A non-zero value means to directly use the statically assigned address.
+ */
+};
+
+struct aprv2_vm_cmd_register_rsp_t {
+ int32_t status;
+ /**< The status of registration. */
+ uint32_t handle;
+ /**< The registered service handle. */
+ uint16_t addr;
+ /**< The actual registered address. */
+};
+
+#define APRV2_VM_CMDID_DEREGISTER (0x00000002)
+
+struct aprv2_vm_cmd_deregister_t {
+ uint32_t handle;
+ /**< The registered service handle. */
+};
+
+struct aprv2_vm_cmd_deregister_rsp_t {
+ int32_t status;
+ /**< The status of de-registration. */
+};
+
+#define APRV2_VM_CMDID_ASYNC_SEND (0x00000003)
+
+struct aprv2_vm_cmd_async_send_t {
+ uint32_t handle;
+ /**< The registered service handle. */
+ struct aprv2_vm_packet_t pkt_header;
+ /**< The packet header. */
+ /* The apr packet payload follows */
+};
+
+struct aprv2_vm_cmd_async_send_rsp_t {
+ int32_t status;
+ /**< The status of send. */
+};
+
+#define APRV2_VM_EVT_RX_PKT_AVAILABLE (0x00000004)
+
+struct aprv2_vm_evt_rx_pkt_available_t {
+ struct aprv2_vm_packet_t pkt_header;
+ /**< The packet header. */
+ /* The apr packet payload follows */
+};
+
+struct aprv2_vm_ack_rx_pkt_available_t {
+ int32_t status;
+};
+
+#endif /* __APRV2_VM_H__ */
diff --git a/include/soc/snd_event.h b/include/soc/snd_event.h
index ec92a68..6561afa 100644
--- a/include/soc/snd_event.h
+++ b/include/soc/snd_event.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*/
#ifndef _SND_EVENT_H_
@@ -33,7 +33,7 @@
void snd_event_mstr_add_client(struct snd_event_clients **snd_clients,
int (*compare)(struct device *, void *),
void *data);
-inline bool is_snd_event_fwk_enabled(void)
+static inline bool is_snd_event_fwk_enabled(void)
{
return 1;
}
diff --git a/include/soc/wcd-spi-ac.h b/include/soc/wcd-spi-ac.h
index 5131c49..e07d235 100644
--- a/include/soc/wcd-spi-ac.h
+++ b/include/soc/wcd-spi-ac.h
@@ -1,13 +1,5 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2018-2019, 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.
*/
#ifndef __WCD_SPI_AC_H__
diff --git a/ipc/Kbuild b/ipc/Kbuild
index fb0974e..5ab0131 100644
--- a/ipc/Kbuild
+++ b/ipc/Kbuild
@@ -89,6 +89,11 @@
APRV_GLINK += apr_tal_rpmsg.o
endif
+ifdef CONFIG_MSM_QDSP6_APRV2_VM
+APRV_GLINK += apr_vm.o
+APRV_GLINK += apr_v2.o
+endif
+
ifdef CONFIG_WCD_DSP_GLINK
WDSP_GLINK += wcd-dsp-glink.o
endif
@@ -147,6 +152,7 @@
# Module information used by KBuild framework
obj-$(CONFIG_MSM_QDSP6_APRV2_RPMSG) += apr_dlkm.o
obj-$(CONFIG_MSM_QDSP6_APRV3_RPMSG) += apr_dlkm.o
+obj-$(CONFIG_MSM_QDSP6_APRV2_VM) += apr_dlkm.o
apr_dlkm-y := $(APRV_GLINK)
obj-$(CONFIG_WCD_DSP_GLINK) += wglink_dlkm.o
diff --git a/ipc/apr.c b/ipc/apr.c
index f1dbc36..0ea2694 100644
--- a/ipc/apr.c
+++ b/ipc/apr.c
@@ -1235,6 +1235,7 @@
.name = "audio_apr",
.owner = THIS_MODULE,
.of_match_table = apr_machine_of_match,
+ .suppress_bind_attrs = true,
}
};
diff --git a/ipc/apr_vm.c b/ipc/apr_vm.c
new file mode 100644
index 0000000..f94e3a2
--- /dev/null
+++ b/ipc/apr_vm.c
@@ -0,0 +1,1477 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2010-2014, 2016-2019 The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/uaccess.h>
+#include <linux/spinlock.h>
+#include <linux/list.h>
+#include <linux/sched.h>
+#include <linux/wait.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/delay.h>
+#include <linux/debugfs.h>
+#include <linux/platform_device.h>
+#include <linux/sysfs.h>
+#include <linux/device.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/ipc_logging.h>
+#include <linux/of_platform.h>
+#include <soc/qcom/subsystem_restart.h>
+#include <soc/qcom/scm.h>
+#include <soc/snd_event.h>
+#include <dsp/apr_audio-v2.h>
+#include <dsp/audio_notifier.h>
+#include <ipc/apr.h>
+#include <ipc/apr_tal.h>
+#include <ipc/aprv2_vm.h>
+#include <linux/habmm.h>
+
+#define APR_PKT_IPC_LOG_PAGE_CNT 2
+#define APR_VM_CB_THREAD_NAME "apr_vm_cb_thread"
+#define APR_TX_BUF_SIZE 4096
+#define APR_RX_BUF_SIZE 4096
+
+static struct apr_q6 q6;
+static struct apr_client client[APR_DEST_MAX][APR_CLIENT_MAX];
+static void *apr_pkt_ctx;
+static wait_queue_head_t modem_wait;
+static bool is_modem_up;
+static char *subsys_name = NULL;
+/* Subsystem restart: QDSP6 data, functions */
+static struct workqueue_struct *apr_reset_workqueue;
+static void apr_reset_deregister(struct work_struct *work);
+static void dispatch_event(unsigned long code, uint16_t proc);
+struct apr_reset_work {
+ void *handle;
+ struct work_struct work;
+};
+
+struct apr_chld_device {
+ struct platform_device *pdev;
+ struct list_head node;
+};
+
+struct apr_private {
+ struct device *dev;
+ spinlock_t apr_lock;
+ bool is_initial_boot;
+ struct work_struct add_chld_dev_work;
+};
+
+static struct apr_private *apr_priv;
+static bool apr_cf_debug;
+
+#ifdef CONFIG_DEBUG_FS
+static struct dentry *debugfs_apr_debug;
+static ssize_t apr_debug_write(struct file *filp, const char __user *ubuf,
+ size_t cnt, loff_t *ppos)
+{
+ char cmd;
+
+ if (copy_from_user(&cmd, ubuf, 1))
+ return -EFAULT;
+
+ apr_cf_debug = (cmd == '1') ? true : false;
+
+ return cnt;
+}
+
+static const struct file_operations apr_debug_ops = {
+ .write = apr_debug_write,
+};
+#endif
+
+#define APR_PKT_INFO(x...) \
+do { \
+ if (apr_pkt_ctx) \
+ ipc_log_string(apr_pkt_ctx, "<APR>: "x); \
+} while (0)
+
+/* hab handle */
+static uint32_t hab_handle_tx;
+static uint32_t hab_handle_rx;
+static char apr_tx_buf[APR_TX_BUF_SIZE];
+static char apr_rx_buf[APR_RX_BUF_SIZE];
+static spinlock_t hab_tx_lock;
+
+/* apr callback thread task */
+static struct task_struct *apr_vm_cb_thread_task;
+static int pid;
+
+
+struct apr_svc_table {
+ char name[64];
+ int idx;
+ int id;
+ int dest_svc;
+ int client_id;
+ int handle;
+};
+
+/*
+ * src svc should be assigned dynamically through apr registration:
+ * 1. replace with a proper string name for registration.
+ * e.g. "qcom.apps.lnx." + name
+ * 2. register apr BE, retrieve dynamic src svc address,
+ * apr handle and store in svc tbl.
+ */
+
+static struct mutex m_lock_tbl_qdsp6;
+
+static struct apr_svc_table svc_tbl_qdsp6[] = {
+ {
+ .name = "AFE",
+ .idx = 0,
+ .id = 0,
+ .dest_svc = APR_SVC_AFE,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "ASM",
+ .idx = 1,
+ .id = 0,
+ .dest_svc = APR_SVC_ASM,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "ADM",
+ .idx = 2,
+ .id = 0,
+ .dest_svc = APR_SVC_ADM,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "CORE",
+ .idx = 3,
+ .id = 0,
+ .dest_svc = APR_SVC_ADSP_CORE,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "TEST",
+ .idx = 4,
+ .id = 0,
+ .dest_svc = APR_SVC_TEST_CLIENT,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "MVM",
+ .idx = 5,
+ .id = 0,
+ .dest_svc = APR_SVC_ADSP_MVM,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "CVS",
+ .idx = 6,
+ .id = 0,
+ .dest_svc = APR_SVC_ADSP_CVS,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "CVP",
+ .idx = 7,
+ .id = 0,
+ .dest_svc = APR_SVC_ADSP_CVP,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "USM",
+ .idx = 8,
+ .id = 0,
+ .dest_svc = APR_SVC_USM,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+ {
+ .name = "VIDC",
+ .idx = 9,
+ .id = 0,
+ .dest_svc = APR_SVC_VIDC,
+ .handle = 0,
+ },
+ {
+ .name = "LSM",
+ .idx = 10,
+ .id = 0,
+ .dest_svc = APR_SVC_LSM,
+ .client_id = APR_CLIENT_AUDIO,
+ .handle = 0,
+ },
+};
+
+static struct mutex m_lock_tbl_voice;
+
+static struct apr_svc_table svc_tbl_voice[] = {
+ {
+ .name = "VSM",
+ .idx = 0,
+ .id = 0,
+ .dest_svc = APR_SVC_VSM,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "VPM",
+ .idx = 1,
+ .id = 0,
+ .dest_svc = APR_SVC_VPM,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "MVS",
+ .idx = 2,
+ .id = 0,
+ .dest_svc = APR_SVC_MVS,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "MVM",
+ .idx = 3,
+ .id = 0,
+ .dest_svc = APR_SVC_MVM,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "CVS",
+ .idx = 4,
+ .id = 0,
+ .dest_svc = APR_SVC_CVS,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "CVP",
+ .idx = 5,
+ .id = 0,
+ .dest_svc = APR_SVC_CVP,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "SRD",
+ .idx = 6,
+ .id = 0,
+ .dest_svc = APR_SVC_SRD,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+ {
+ .name = "TEST",
+ .idx = 7,
+ .id = 0,
+ .dest_svc = APR_SVC_TEST_CLIENT,
+ .client_id = APR_CLIENT_VOICE,
+ .handle = 0,
+ },
+};
+
+/**
+ * apr_get_modem_state:
+ *
+ * Returns current modem load status
+ *
+ */
+enum apr_subsys_state apr_get_modem_state(void)
+{
+ return atomic_read(&q6.modem_state);
+}
+EXPORT_SYMBOL(apr_get_modem_state);
+
+/**
+ * apr_set_modem_state - Update modem load status.
+ *
+ * @state: State to update modem load status
+ *
+ */
+void apr_set_modem_state(enum apr_subsys_state state)
+{
+ atomic_set(&q6.modem_state, state);
+}
+EXPORT_SYMBOL(apr_set_modem_state);
+
+enum apr_subsys_state apr_cmpxchg_modem_state(enum apr_subsys_state prev,
+ enum apr_subsys_state new)
+{
+ return atomic_cmpxchg(&q6.modem_state, prev, new);
+}
+
+static void apr_modem_down(unsigned long opcode)
+{
+ apr_set_modem_state(APR_SUBSYS_DOWN);
+ dispatch_event(opcode, APR_DEST_MODEM);
+}
+
+static void apr_modem_up(void)
+{
+ if (apr_cmpxchg_modem_state(APR_SUBSYS_DOWN, APR_SUBSYS_UP) ==
+ APR_SUBSYS_DOWN)
+ wake_up(&modem_wait);
+ is_modem_up = 1;
+}
+
+enum apr_subsys_state apr_get_q6_state(void)
+{
+ return atomic_read(&q6.q6_state);
+}
+EXPORT_SYMBOL(apr_get_q6_state);
+
+int apr_set_q6_state(enum apr_subsys_state state)
+{
+ pr_debug("%s: setting adsp state %d\n", __func__, state);
+ if (state < APR_SUBSYS_DOWN || state > APR_SUBSYS_LOADED)
+ return -EINVAL;
+ atomic_set(&q6.q6_state, state);
+ return 0;
+}
+EXPORT_SYMBOL(apr_set_q6_state);
+
+static void apr_ssr_disable(struct device *dev, void *data)
+{
+ apr_set_q6_state(APR_SUBSYS_DOWN);
+}
+
+static const struct snd_event_ops apr_ssr_ops = {
+ .disable = apr_ssr_disable,
+};
+
+static void apr_adsp_down(unsigned long opcode)
+{
+ pr_info("%s: Q6 is Down\n", __func__);
+ snd_event_notify(apr_priv->dev, SND_EVENT_DOWN);
+ apr_set_q6_state(APR_SUBSYS_DOWN);
+ dispatch_event(opcode, APR_DEST_QDSP6);
+}
+
+static void apr_add_child_devices(struct work_struct *work)
+{
+ int ret;
+
+ ret = of_platform_populate(apr_priv->dev->of_node,
+ NULL, NULL, apr_priv->dev);
+ if (ret)
+ dev_err(apr_priv->dev, "%s: failed to add child nodes, ret=%d\n",
+ __func__, ret);
+}
+
+static void apr_adsp_up(void)
+{
+ pr_info("%s: Q6 is Up\n", __func__);
+ apr_set_q6_state(APR_SUBSYS_LOADED);
+
+ spin_lock(&apr_priv->apr_lock);
+ if (apr_priv->is_initial_boot)
+ schedule_work(&apr_priv->add_chld_dev_work);
+ spin_unlock(&apr_priv->apr_lock);
+ snd_event_notify(apr_priv->dev, SND_EVENT_UP);
+}
+
+int apr_load_adsp_image(void)
+{
+ int rc = 0;
+
+ mutex_lock(&q6.lock);
+ if (apr_get_q6_state() == APR_SUBSYS_UP) {
+ q6.pil = subsystem_get("adsp");
+ if (IS_ERR(q6.pil)) {
+ rc = PTR_ERR(q6.pil);
+ pr_err("APR: Unable to load q6 image, error:%d\n", rc);
+ } else {
+ apr_set_q6_state(APR_SUBSYS_LOADED);
+ pr_debug("APR: Image is loaded, stated\n");
+ }
+ } else if (apr_get_q6_state() == APR_SUBSYS_LOADED) {
+ pr_debug("APR: q6 image already loaded\n");
+ } else {
+ pr_debug("APR: cannot load state %d\n", apr_get_q6_state());
+ }
+ mutex_unlock(&q6.lock);
+ return rc;
+}
+
+struct apr_client *apr_get_client(int dest_id, int client_id)
+{
+ return &client[dest_id][client_id];
+}
+
+static int apr_vm_nb_receive(int32_t handle, void *dest_buff,
+ uint32_t *size_bytes, uint32_t timeout)
+{
+ int rc;
+ uint32_t dest_buff_bytes = *size_bytes;
+ unsigned long delay = jiffies + (HZ / 2);
+
+ do {
+ *size_bytes = dest_buff_bytes;
+ rc = habmm_socket_recv(handle,
+ dest_buff,
+ size_bytes,
+ timeout,
+ HABMM_SOCKET_RECV_FLAGS_NON_BLOCKING);
+ } while (time_before(jiffies, delay) && (rc == -EAGAIN) &&
+ (*size_bytes == 0));
+
+ return rc;
+}
+
+static int apr_vm_cb_process_evt(char *buf, int len)
+{
+ struct apr_client_data data = {0,};
+ struct apr_client *apr_client;
+ struct apr_svc *c_svc;
+ struct apr_hdr *hdr;
+ uint16_t hdr_size;
+ uint16_t msg_type;
+ uint16_t ver;
+ uint16_t src;
+ uint16_t svc;
+ uint16_t clnt;
+ int i;
+ int temp_port = 0;
+ uint32_t *ptr;
+ uint32_t evt_id;
+
+ pr_debug("APR: len = %d\n", len);
+ ptr = (uint32_t *)buf;
+ pr_debug("\n*****************\n");
+ for (i = 0; i < len/4; i++)
+ pr_debug("%x ", ptr[i]);
+ pr_debug("\n");
+ pr_debug("\n*****************\n");
+
+ if (!buf || len <= APR_HDR_SIZE + sizeof(uint32_t)) {
+ pr_err("APR: Improper apr pkt received: %p %d\n", buf, len);
+ return -EINVAL;
+ }
+
+ evt_id = *((int32_t *)buf);
+ if (evt_id != APRV2_VM_EVT_RX_PKT_AVAILABLE) {
+ pr_err("APR: Wrong evt id: %d\n", evt_id);
+ return -EINVAL;
+ }
+ hdr = (struct apr_hdr *)(buf + sizeof(uint32_t));
+
+ ver = hdr->hdr_field;
+ ver = (ver & 0x000F);
+ if (ver > APR_PKT_VER + 1) {
+ pr_err("APR: Wrong version: %d\n", ver);
+ return -EINVAL;
+ }
+
+ hdr_size = hdr->hdr_field;
+ hdr_size = ((hdr_size & 0x00F0) >> 0x4) * 4;
+ if (hdr_size < APR_HDR_SIZE) {
+ pr_err("APR: Wrong hdr size:%d\n", hdr_size);
+ return -EINVAL;
+ }
+
+ if (hdr->pkt_size < APR_HDR_SIZE) {
+ pr_err("APR: Wrong paket size\n");
+ return -EINVAL;
+ }
+
+ msg_type = hdr->hdr_field;
+ msg_type = (msg_type >> 0x08) & 0x0003;
+ if (msg_type >= APR_MSG_TYPE_MAX && msg_type != APR_BASIC_RSP_RESULT) {
+ pr_err("APR: Wrong message type: %d\n", msg_type);
+ return -EINVAL;
+ }
+
+ /*
+ * dest_svc is dynamic created by apr service
+ * no need to check the range of dest_svc
+ */
+ if (hdr->src_domain >= APR_DOMAIN_MAX ||
+ hdr->dest_domain >= APR_DOMAIN_MAX ||
+ hdr->src_svc >= APR_SVC_MAX) {
+ pr_err("APR: Wrong APR header\n");
+ return -EINVAL;
+ }
+
+ svc = hdr->dest_svc;
+ if (hdr->src_domain == APR_DOMAIN_MODEM)
+ clnt = APR_CLIENT_VOICE;
+ else if (hdr->src_domain == APR_DOMAIN_ADSP)
+ clnt = APR_CLIENT_AUDIO;
+ else {
+ pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain);
+ return -EINVAL;
+ }
+
+ src = apr_get_data_src(hdr);
+ if (src == APR_DEST_MAX)
+ return -EINVAL;
+
+ pr_debug("src =%d clnt = %d\n", src, clnt);
+ apr_client = &client[src][clnt];
+ for (i = 0; i < APR_SVC_MAX; i++)
+ if (apr_client->svc[i].id == svc) {
+ pr_debug("svc_id = %d\n", apr_client->svc[i].id);
+ c_svc = &apr_client->svc[i];
+ break;
+ }
+
+ if (i == APR_SVC_MAX) {
+ pr_err("APR: service is not registered\n");
+ return -ENXIO;
+ }
+
+ pr_debug("svc_idx = %d\n", i);
+ pr_debug("%x %x %x %p %p\n", c_svc->id, c_svc->dest_id,
+ c_svc->client_id, c_svc->fn, c_svc->priv);
+
+ data.payload_size = hdr->pkt_size - hdr_size;
+ data.opcode = hdr->opcode;
+ data.src = src;
+ data.src_port = hdr->src_port;
+ data.dest_port = hdr->dest_port;
+ data.token = hdr->token;
+ data.msg_type = msg_type;
+ if (data.payload_size > 0)
+ data.payload = (char *)hdr + hdr_size;
+
+ if (unlikely(apr_cf_debug)) {
+ if (hdr->opcode == APR_BASIC_RSP_RESULT && data.payload) {
+ uint32_t *ptr = data.payload;
+
+ APR_PKT_INFO(
+ "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X] rc[0x%X]",
+ (hdr->src_domain << 8) | hdr->src_svc,
+ (hdr->dest_domain << 8) | hdr->dest_svc,
+ hdr->opcode, hdr->token, ptr[1]);
+ } else {
+ APR_PKT_INFO(
+ "Rx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]",
+ (hdr->src_domain << 8) | hdr->src_svc,
+ (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode,
+ hdr->token);
+ }
+ }
+
+ temp_port = ((data.dest_port >> 8) * 8) + (data.dest_port & 0xFF);
+ pr_debug("port = %d t_port = %d\n", data.src_port, temp_port);
+ if (((temp_port >= 0) && (temp_port < APR_MAX_PORTS))
+ && (c_svc->port_cnt && c_svc->port_fn[temp_port]))
+ c_svc->port_fn[temp_port](&data, c_svc->port_priv[temp_port]);
+ else if (c_svc->fn)
+ c_svc->fn(&data, c_svc->priv);
+ else
+ pr_err("APR: Rxed a packet for NULL callback\n");
+
+ return 0;
+}
+
+static int apr_vm_cb_thread(void *data)
+{
+ uint32_t apr_rx_buf_len;
+ struct aprv2_vm_ack_rx_pkt_available_t apr_ack;
+ unsigned long delay = jiffies + (HZ / 2);
+ int status = 0;
+ int ret = 0;
+
+ while (1) {
+ do {
+ apr_rx_buf_len = sizeof(apr_rx_buf);
+ ret = habmm_socket_recv(hab_handle_rx,
+ (void *)&apr_rx_buf,
+ &apr_rx_buf_len,
+ 0xFFFFFFFF,
+ 0);
+ } while (time_before(jiffies, delay) && (ret == -EINTR) &&
+ (apr_rx_buf_len == 0));
+ if (ret) {
+ pr_err("%s: habmm_socket_recv failed %d\n",
+ __func__, ret);
+ break;
+ }
+
+ status = apr_vm_cb_process_evt(apr_rx_buf, apr_rx_buf_len);
+
+ apr_ack.status = status;
+ ret = habmm_socket_send(hab_handle_rx,
+ (void *)&apr_ack,
+ sizeof(apr_ack),
+ 0);
+ if (ret) {
+ pr_err("%s: habmm_socket_send failed %d\n",
+ __func__, ret);
+ /* TODO: break if send failed ? */
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static int apr_vm_get_svc(const char *svc_name, int domain_id, int *client_id,
+ int *svc_idx, int *svc_id, int *dest_svc, int *handle)
+{
+ int i;
+ int size;
+ struct apr_svc_table *tbl;
+ struct mutex *lock;
+ struct aprv2_vm_cmd_register_rsp_t apr_rsp;
+ uint32_t apr_len;
+ int ret = 0;
+ struct {
+ uint32_t cmd_id;
+ struct aprv2_vm_cmd_register_t reg_cmd;
+ } tx_data;
+
+ if (domain_id == APR_DOMAIN_ADSP) {
+ tbl = svc_tbl_qdsp6;
+ size = ARRAY_SIZE(svc_tbl_qdsp6);
+ lock = &m_lock_tbl_qdsp6;
+ } else {
+ tbl = svc_tbl_voice;
+ size = ARRAY_SIZE(svc_tbl_voice);
+ lock = &m_lock_tbl_voice;
+ }
+
+ mutex_lock(lock);
+ for (i = 0; i < size; i++) {
+ if (!strcmp(svc_name, tbl[i].name)) {
+ *client_id = tbl[i].client_id;
+ *svc_idx = tbl[i].idx;
+ if (!tbl[i].id && !tbl[i].handle) {
+ /* need to register a new service */
+ memset((void *) &tx_data, 0, sizeof(tx_data));
+
+ apr_len = sizeof(tx_data);
+ tx_data.cmd_id = APRV2_VM_CMDID_REGISTER;
+ tx_data.reg_cmd.name_size = snprintf(
+ tx_data.reg_cmd.name,
+ APRV2_VM_MAX_DNS_SIZE,
+ "qcom.apps.lnx.%s",
+ svc_name);
+ tx_data.reg_cmd.addr = 0;
+ ret = habmm_socket_send(hab_handle_tx,
+ (void *) &tx_data,
+ apr_len,
+ 0);
+ if (ret) {
+ pr_err("%s: habmm_socket_send failed %d\n",
+ __func__, ret);
+ mutex_unlock(lock);
+ return ret;
+ }
+ /* wait for response */
+ apr_len = sizeof(apr_rsp);
+ ret = apr_vm_nb_receive(hab_handle_tx,
+ (void *)&apr_rsp,
+ &apr_len,
+ 0xFFFFFFFF);
+ if (ret) {
+ pr_err("%s: apr_vm_nb_receive failed %d\n",
+ __func__, ret);
+ mutex_unlock(lock);
+ return ret;
+ }
+ if (apr_rsp.status) {
+ pr_err("%s: apr_vm_nb_receive status %d\n",
+ __func__, apr_rsp.status);
+ ret = apr_rsp.status;
+ mutex_unlock(lock);
+ return ret;
+ }
+ /* update svc table */
+ tbl[i].handle = apr_rsp.handle;
+ tbl[i].id = apr_rsp.addr &
+ APRV2_VM_PKT_SERVICE_ID_MASK;
+ }
+ *svc_id = tbl[i].id;
+ *dest_svc = tbl[i].dest_svc;
+ *handle = tbl[i].handle;
+ break;
+ }
+ }
+ mutex_unlock(lock);
+
+ pr_debug("%s: svc_name = %s client_id = %d domain_id = %d\n",
+ __func__, svc_name, *client_id, domain_id);
+ pr_debug("%s: src_svc = %d dest_svc = %d handle = %d\n",
+ __func__, *svc_id, *dest_svc, *handle);
+
+ if (i == size) {
+ pr_err("%s: APR: Wrong svc name %s\n", __func__, svc_name);
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static int apr_vm_rel_svc(int domain_id, int svc_id, int handle)
+{
+ int i;
+ int size;
+ struct apr_svc_table *tbl;
+ struct mutex *lock;
+ struct aprv2_vm_cmd_deregister_rsp_t apr_rsp;
+ uint32_t apr_len;
+ int ret = 0;
+ struct {
+ uint32_t cmd_id;
+ struct aprv2_vm_cmd_deregister_t dereg_cmd;
+ } tx_data;
+
+ if (domain_id == APR_DOMAIN_ADSP) {
+ tbl = svc_tbl_qdsp6;
+ size = ARRAY_SIZE(svc_tbl_qdsp6);
+ lock = &m_lock_tbl_qdsp6;
+ } else {
+ tbl = svc_tbl_voice;
+ size = ARRAY_SIZE(svc_tbl_voice);
+ lock = &m_lock_tbl_voice;
+ }
+
+ mutex_lock(lock);
+ for (i = 0; i < size; i++) {
+ if (tbl[i].id == svc_id && tbl[i].handle == handle) {
+ /* need to deregister a service */
+ memset((void *) &tx_data, 0, sizeof(tx_data));
+
+ apr_len = sizeof(tx_data);
+ tx_data.cmd_id = APRV2_VM_CMDID_DEREGISTER;
+ tx_data.dereg_cmd.handle = handle;
+ ret = habmm_socket_send(hab_handle_tx,
+ (void *) &tx_data,
+ apr_len,
+ 0);
+ if (ret)
+ pr_err("%s: habmm_socket_send failed %d\n",
+ __func__, ret);
+ /*
+ * TODO: if send failed, should not wait for recv.
+ * should clear regardless?
+ */
+ /* wait for response */
+ apr_len = sizeof(apr_rsp);
+ ret = apr_vm_nb_receive(hab_handle_tx,
+ (void *)&apr_rsp,
+ &apr_len,
+ 0xFFFFFFFF);
+ if (ret)
+ pr_err("%s: apr_vm_nb_receive failed %d\n",
+ __func__, ret);
+ if (apr_rsp.status) {
+ pr_err("%s: apr_vm_nb_receive status %d\n",
+ __func__, apr_rsp.status);
+ ret = apr_rsp.status;
+ }
+ /* clear svc table */
+ tbl[i].handle = 0;
+ tbl[i].id = 0;
+ break;
+ }
+ }
+ mutex_unlock(lock);
+
+ if (i == size) {
+ pr_err("%s: APR: Wrong svc id %d handle %d\n",
+ __func__, svc_id, handle);
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static void apr_vm_set_subsys_state(void)
+{
+ /* set default subsys state in vm env.
+ * Both q6 and modem should be in LOADED state,
+ * since vm boots up at late stage after pm.
+ */
+ apr_set_q6_state(APR_SUBSYS_LOADED);
+ apr_set_modem_state(APR_SUBSYS_LOADED);
+
+ spin_lock(&apr_priv->apr_lock);
+ if (apr_priv->is_initial_boot)
+ schedule_work(&apr_priv->add_chld_dev_work);
+ spin_unlock(&apr_priv->apr_lock);
+ snd_event_notify(apr_priv->dev, SND_EVENT_UP);
+}
+
+/**
+ * apr_send_pkt - Clients call to send packet
+ * to destination processor.
+ *
+ * @handle: APR service handle
+ * @buf: payload to send to destination processor.
+ *
+ * Returns Bytes(>0)pkt_size on success or error on failure.
+ */
+int apr_send_pkt(void *handle, uint32_t *buf)
+{
+ struct apr_svc *svc = handle;
+ struct apr_hdr *hdr;
+ unsigned long flags;
+ uint32_t *cmd_id = (uint32_t *)apr_tx_buf;
+ struct aprv2_vm_cmd_async_send_t *apr_send =
+ (struct aprv2_vm_cmd_async_send_t *)(apr_tx_buf +
+ sizeof(uint32_t));
+ uint32_t apr_send_len;
+ struct aprv2_vm_cmd_async_send_rsp_t apr_rsp;
+ uint32_t apr_rsp_len;
+ int ret = 0;
+
+ if (!handle || !buf) {
+ pr_err("APR: Wrong parameters\n");
+ return -EINVAL;
+ }
+ if (svc->need_reset) {
+ pr_err("apr: send_pkt service need reset\n");
+ return -ENETRESET;
+ }
+
+ if ((svc->dest_id == APR_DEST_QDSP6) &&
+ (apr_get_q6_state() != APR_SUBSYS_LOADED)) {
+ pr_err("%s: Still dsp is not Up\n", __func__);
+ return -ENETRESET;
+ } else if ((svc->dest_id == APR_DEST_MODEM) &&
+ (apr_get_modem_state() == APR_SUBSYS_DOWN)) {
+ pr_err("apr: Still Modem is not Up\n");
+ return -ENETRESET;
+ }
+
+ spin_lock_irqsave(&svc->w_lock, flags);
+ if (!svc->id || !svc->vm_handle) {
+ pr_err("APR: Still service is not yet opened\n");
+ ret = -EINVAL;
+ goto done;
+ }
+ hdr = (struct apr_hdr *)buf;
+
+ hdr->src_domain = APR_DOMAIN_APPS;
+ hdr->src_svc = svc->id;
+ hdr->dest_domain = svc->dest_domain;
+ hdr->dest_svc = svc->vm_dest_svc;
+
+ if (unlikely(apr_cf_debug)) {
+ APR_PKT_INFO(
+ "Tx: src_addr[0x%X] dest_addr[0x%X] opcode[0x%X] token[0x%X]",
+ (hdr->src_domain << 8) | hdr->src_svc,
+ (hdr->dest_domain << 8) | hdr->dest_svc, hdr->opcode,
+ hdr->token);
+ }
+
+ memset((void *)&apr_tx_buf, 0, sizeof(apr_tx_buf));
+ /* pkt_size + cmd_id + handle */
+ apr_send_len = hdr->pkt_size + sizeof(uint32_t) * 2;
+ *cmd_id = APRV2_VM_CMDID_ASYNC_SEND;
+ apr_send->handle = svc->vm_handle;
+
+ /* safe check */
+ if (hdr->pkt_size > APR_TX_BUF_SIZE - (sizeof(uint32_t) * 2)) {
+ pr_err("APR: Wrong pkt size %d\n", hdr->pkt_size);
+ ret = -ENOMEM;
+ goto done;
+ }
+ memcpy(&apr_send->pkt_header, buf, hdr->pkt_size);
+
+ ret = habmm_socket_send(hab_handle_tx,
+ (void *)&apr_tx_buf,
+ apr_send_len,
+ 0);
+ if (ret) {
+ pr_err("%s: habmm_socket_send failed %d\n",
+ __func__, ret);
+ goto done;
+ }
+ /* wait for response */
+ apr_rsp_len = sizeof(apr_rsp);
+ ret = apr_vm_nb_receive(hab_handle_tx,
+ (void *)&apr_rsp,
+ &apr_rsp_len,
+ 0xFFFFFFFF);
+ if (ret) {
+ pr_err("%s: apr_vm_nb_receive failed %d\n",
+ __func__, ret);
+ goto done;
+ }
+ if (apr_rsp.status) {
+ pr_err("%s: apr_vm_nb_receive status %d\n",
+ __func__, apr_rsp.status);
+ /* should translate status properly */
+ ret = -ECOMM;
+ goto done;
+ }
+
+ /* upon successful send, return packet size */
+ ret = hdr->pkt_size;
+
+done:
+ spin_unlock_irqrestore(&svc->w_lock, flags);
+ return ret;
+}
+EXPORT_SYMBOL(apr_send_pkt);
+
+/**
+ * apr_register - Clients call to register
+ * to APR.
+ *
+ * @dest: destination processor
+ * @svc_name: name of service to register as
+ * @svc_fn: callback function to trigger when response
+ * ack or packets received from destination processor.
+ * @src_port: Port number within a service
+ * @priv: private data of client, passed back in cb fn.
+ *
+ * Returns apr_svc handle on success or NULL on failure.
+ */
+struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn,
+ uint32_t src_port, void *priv)
+{
+ struct apr_client *clnt;
+ int client_id = 0;
+ int svc_idx = 0;
+ int svc_id = 0;
+ int dest_id = 0;
+ int domain_id = 0;
+ int temp_port = 0;
+ struct apr_svc *svc = NULL;
+ int rc = 0;
+ bool can_open_channel = true;
+ int dest_svc = 0;
+ int handle = 0;
+
+ if (!dest || !svc_name || !svc_fn)
+ return NULL;
+
+ if (!strcmp(dest, "ADSP"))
+ domain_id = APR_DOMAIN_ADSP;
+ else if (!strcmp(dest, "MODEM")) {
+ /* Don't request for SMD channels if destination is MODEM,
+ * as these channels are no longer used and these clients
+ * are to listen only for MODEM SSR events
+ */
+ can_open_channel = false;
+ domain_id = APR_DOMAIN_MODEM;
+ } else {
+ pr_err("APR: wrong destination\n");
+ goto done;
+ }
+
+ dest_id = apr_get_dest_id(dest);
+
+ if (dest_id == APR_DEST_QDSP6) {
+ if (apr_get_q6_state() != APR_SUBSYS_LOADED) {
+ pr_err("%s: adsp not up\n", __func__);
+ return NULL;
+ }
+ pr_debug("%s: adsp Up\n", __func__);
+ } else if (dest_id == APR_DEST_MODEM) {
+ if (apr_get_modem_state() == APR_SUBSYS_DOWN) {
+ if (is_modem_up) {
+ pr_err("%s: modem shutdown due to SSR, ret",
+ __func__);
+ return NULL;
+ }
+ pr_debug("%s: Wait for modem to bootup\n", __func__);
+ rc = wait_event_interruptible_timeout(modem_wait,
+ (apr_get_modem_state() == APR_SUBSYS_UP),
+ (1 * HZ));
+ if (rc == 0) {
+ pr_err("%s: Modem is not Up\n", __func__);
+ return NULL;
+ }
+ }
+ pr_debug("%s: modem Up\n", __func__);
+ }
+
+ if (apr_vm_get_svc(svc_name, domain_id, &client_id, &svc_idx, &svc_id,
+ &dest_svc, &handle)) {
+ pr_err("%s: apr_vm_get_svc failed\n", __func__);
+ goto done;
+ }
+
+ clnt = &client[dest_id][client_id];
+ svc = &clnt->svc[svc_idx];
+ mutex_lock(&svc->m_lock);
+ clnt->id = client_id;
+ if (svc->need_reset) {
+ mutex_unlock(&svc->m_lock);
+ pr_err("APR: Service needs reset\n");
+ svc = NULL;
+ goto done;
+ }
+ svc->id = svc_id;
+ svc->vm_dest_svc = dest_svc;
+ svc->dest_id = dest_id;
+ svc->client_id = client_id;
+ svc->dest_domain = domain_id;
+ svc->pkt_owner = APR_PKT_OWNER_DRIVER;
+ svc->vm_handle = handle;
+
+ if (src_port != 0xFFFFFFFF) {
+ temp_port = ((src_port >> 8) * 8) + (src_port & 0xFF);
+ pr_debug("port = %d t_port = %d\n", src_port, temp_port);
+ if (temp_port >= APR_MAX_PORTS || temp_port < 0) {
+ pr_err("APR: temp_port out of bounds\n");
+ mutex_unlock(&svc->m_lock);
+ return NULL;
+ }
+ if (!svc->port_cnt && !svc->svc_cnt)
+ clnt->svc_cnt++;
+ svc->port_cnt++;
+ svc->port_fn[temp_port] = svc_fn;
+ svc->port_priv[temp_port] = priv;
+ } else {
+ if (!svc->fn) {
+ if (!svc->port_cnt && !svc->svc_cnt)
+ clnt->svc_cnt++;
+ svc->fn = svc_fn;
+ if (svc->port_cnt)
+ svc->svc_cnt++;
+ svc->priv = priv;
+ }
+ }
+
+ mutex_unlock(&svc->m_lock);
+done:
+ return svc;
+}
+EXPORT_SYMBOL(apr_register);
+
+static void apr_reset_deregister(struct work_struct *work)
+{
+ struct apr_svc *handle = NULL;
+ struct apr_reset_work *apr_reset =
+ container_of(work, struct apr_reset_work, work);
+
+ handle = apr_reset->handle;
+ pr_debug("%s:handle[%pK]\n", __func__, handle);
+ apr_deregister(handle);
+ kfree(apr_reset);
+}
+
+/**
+ * apr_start_rx_rt - Clients call to vote for thread
+ * priority upgrade whenever needed.
+ *
+ * @handle: APR service handle
+ *
+ * Returns 0 on success or error otherwise.
+ */
+int apr_start_rx_rt(void *handle)
+{
+ int rc = 0;
+ return rc;
+}
+EXPORT_SYMBOL(apr_start_rx_rt);
+
+/**
+ * apr_end_rx_rt - Clients call to unvote for thread
+ * priority upgrade (perviously voted with
+ * apr_start_rx_rt()).
+ *
+ * @handle: APR service handle
+ *
+ * Returns 0 on success or error otherwise.
+ */
+int apr_end_rx_rt(void *handle)
+{
+ int rc = 0;
+ return rc;
+}
+EXPORT_SYMBOL(apr_end_rx_rt);
+
+
+/**
+ * apr_deregister - Clients call to de-register
+ * from APR.
+ *
+ * @handle: APR service handle to de-register
+ *
+ * Returns 0 on success or -EINVAL on error.
+ */
+int apr_deregister(void *handle)
+{
+ struct apr_svc *svc = handle;
+ struct apr_client *clnt;
+ uint16_t dest_id;
+ uint16_t client_id;
+
+ if (!handle)
+ return -EINVAL;
+
+ mutex_lock(&svc->m_lock);
+ dest_id = svc->dest_id;
+ client_id = svc->client_id;
+ clnt = &client[dest_id][client_id];
+
+ if (svc->port_cnt > 0 || svc->svc_cnt > 0) {
+ if (svc->port_cnt)
+ svc->port_cnt--;
+ else if (svc->svc_cnt)
+ svc->svc_cnt--;
+ if (!svc->port_cnt && !svc->svc_cnt) {
+ client[dest_id][client_id].svc_cnt--;
+ svc->need_reset = 0x0;
+ }
+ } else if (client[dest_id][client_id].svc_cnt > 0) {
+ client[dest_id][client_id].svc_cnt--;
+ if (!client[dest_id][client_id].svc_cnt) {
+ svc->need_reset = 0x0;
+ pr_debug("%s: service is reset %p\n", __func__, svc);
+ }
+ }
+
+ if (!svc->port_cnt && !svc->svc_cnt) {
+ if (apr_vm_rel_svc(svc->dest_domain, svc->id, svc->vm_handle))
+ pr_err("%s: apr_vm_rel_svc failed\n", __func__);
+ svc->priv = NULL;
+ svc->id = 0;
+ svc->vm_dest_svc = 0;
+ svc->fn = NULL;
+ svc->dest_id = 0;
+ svc->client_id = 0;
+ svc->need_reset = 0x0;
+ svc->vm_handle = 0;
+ }
+ mutex_unlock(&svc->m_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(apr_deregister);
+
+/**
+ * apr_reset - sets up workqueue to de-register
+ * the given APR service handle.
+ *
+ * @handle: APR service handle
+ *
+ */
+void apr_reset(void *handle)
+{
+ struct apr_reset_work *apr_reset_worker = NULL;
+
+ if (!handle)
+ return;
+ pr_debug("%s: handle[%pK]\n", __func__, handle);
+
+ if (apr_reset_workqueue == NULL) {
+ pr_err("%s: apr_reset_workqueue is NULL\n", __func__);
+ return;
+ }
+
+ apr_reset_worker = kzalloc(sizeof(struct apr_reset_work),
+ GFP_ATOMIC);
+
+ if (apr_reset_worker == NULL) {
+ pr_err("%s: mem failure\n", __func__);
+ return;
+ }
+
+ apr_reset_worker->handle = handle;
+ INIT_WORK(&apr_reset_worker->work, apr_reset_deregister);
+ queue_work(apr_reset_workqueue, &apr_reset_worker->work);
+}
+EXPORT_SYMBOL(apr_reset);
+
+/* Dispatch the Reset events to Modem and audio clients */
+static void dispatch_event(unsigned long code, uint16_t proc)
+{
+ struct apr_client *apr_client;
+ struct apr_client_data data;
+ struct apr_svc *svc;
+ uint16_t clnt;
+ int i, j;
+
+ memset(&data, 0, sizeof(data));
+ data.opcode = RESET_EVENTS;
+ data.reset_event = code;
+
+ /* Service domain can be different from the processor */
+ data.reset_proc = apr_get_reset_domain(proc);
+
+ clnt = APR_CLIENT_AUDIO;
+ apr_client = &client[proc][clnt];
+ for (i = 0; i < APR_SVC_MAX; i++) {
+ mutex_lock(&apr_client->svc[i].m_lock);
+ if (apr_client->svc[i].fn) {
+ apr_client->svc[i].need_reset = 0x1;
+ apr_client->svc[i].fn(&data, apr_client->svc[i].priv);
+ }
+ if (apr_client->svc[i].port_cnt) {
+ svc = &(apr_client->svc[i]);
+ svc->need_reset = 0x1;
+ for (j = 0; j < APR_MAX_PORTS; j++)
+ if (svc->port_fn[j])
+ svc->port_fn[j](&data,
+ svc->port_priv[j]);
+ }
+ mutex_unlock(&apr_client->svc[i].m_lock);
+ }
+
+ clnt = APR_CLIENT_VOICE;
+ apr_client = &client[proc][clnt];
+ for (i = 0; i < APR_SVC_MAX; i++) {
+ mutex_lock(&apr_client->svc[i].m_lock);
+ if (apr_client->svc[i].fn) {
+ apr_client->svc[i].need_reset = 0x1;
+ apr_client->svc[i].fn(&data, apr_client->svc[i].priv);
+ }
+ if (apr_client->svc[i].port_cnt) {
+ svc = &(apr_client->svc[i]);
+ svc->need_reset = 0x1;
+ for (j = 0; j < APR_MAX_PORTS; j++)
+ if (svc->port_fn[j])
+ svc->port_fn[j](&data,
+ svc->port_priv[j]);
+ }
+ mutex_unlock(&apr_client->svc[i].m_lock);
+ }
+}
+
+static int apr_notifier_service_cb(struct notifier_block *this,
+ unsigned long opcode, void *data)
+{
+ struct audio_notifier_cb_data *cb_data = data;
+
+ if (cb_data == NULL) {
+ pr_err("%s: Callback data is NULL!\n", __func__);
+ goto done;
+ }
+
+ pr_debug("%s: Service opcode 0x%lx, domain %d\n",
+ __func__, opcode, cb_data->domain);
+
+ switch (opcode) {
+ case AUDIO_NOTIFIER_SERVICE_DOWN:
+ /*
+ * Use flag to ignore down notifications during
+ * initial boot. There is no benefit from error
+ * recovery notifications during initial boot
+ * up since everything is expected to be down.
+ */
+ spin_lock(&apr_priv->apr_lock);
+ if (apr_priv->is_initial_boot) {
+ spin_unlock(&apr_priv->apr_lock);
+ break;
+ }
+ spin_unlock(&apr_priv->apr_lock);
+ if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN)
+ apr_modem_down(opcode);
+ else
+ apr_adsp_down(opcode);
+ break;
+ case AUDIO_NOTIFIER_SERVICE_UP:
+ if (cb_data->domain == AUDIO_NOTIFIER_MODEM_DOMAIN)
+ apr_modem_up();
+ else
+ apr_adsp_up();
+ spin_lock(&apr_priv->apr_lock);
+ apr_priv->is_initial_boot = false;
+ spin_unlock(&apr_priv->apr_lock);
+ break;
+ default:
+ break;
+ }
+done:
+ return NOTIFY_OK;
+}
+
+static struct notifier_block adsp_service_nb = {
+ .notifier_call = apr_notifier_service_cb,
+ .priority = 0,
+};
+
+static struct notifier_block modem_service_nb = {
+ .notifier_call = apr_notifier_service_cb,
+ .priority = 0,
+};
+
+#ifdef CONFIG_DEBUG_FS
+static int __init apr_debug_init(void)
+{
+ debugfs_apr_debug = debugfs_create_file("msm_apr_debug",
+ S_IFREG | 0444, NULL, NULL,
+ &apr_debug_ops);
+ return 0;
+}
+#else
+static int __init apr_debug_init(void)
+(
+ return 0;
+)
+#endif
+
+static void apr_cleanup(void)
+{
+ int i, j, k;
+
+ of_platform_depopulate(apr_priv->dev);
+ subsys_notif_deregister(subsys_name);
+ if (apr_reset_workqueue) {
+ flush_workqueue(apr_reset_workqueue);
+ destroy_workqueue(apr_reset_workqueue);
+ }
+ mutex_destroy(&q6.lock);
+ for (i = 0; i < APR_DEST_MAX; i++) {
+ for (j = 0; j < APR_CLIENT_MAX; j++) {
+ mutex_destroy(&client[i][j].m_lock);
+ for (k = 0; k < APR_SVC_MAX; k++)
+ mutex_destroy(&client[i][j].svc[k].m_lock);
+ }
+ }
+ debugfs_remove(debugfs_apr_debug);
+}
+
+static int apr_probe(struct platform_device *pdev)
+{
+ int i, j, k, ret = 0;
+
+ init_waitqueue_head(&modem_wait);
+
+ apr_priv = devm_kzalloc(&pdev->dev, sizeof(*apr_priv), GFP_KERNEL);
+ if (!apr_priv)
+ return -ENOMEM;
+
+ apr_priv->dev = &pdev->dev;
+ spin_lock_init(&apr_priv->apr_lock);
+ INIT_WORK(&apr_priv->add_chld_dev_work, apr_add_child_devices);
+
+ /* open apr channel tx and rx, store as global */
+ ret = habmm_socket_open(&hab_handle_tx,
+ MM_AUD_1,
+ 0xFFFFFFFF,
+ HABMM_SOCKET_OPEN_FLAGS_SINGLE_BE_SINGLE_FE);
+ if (ret) {
+ pr_err("%s: habmm_socket_open tx failed %d\n", __func__, ret);
+ return ret;
+ }
+ spin_lock_init(&hab_tx_lock);
+
+ ret = habmm_socket_open(&hab_handle_rx,
+ MM_AUD_2,
+ 0xFFFFFFFF,
+ HABMM_SOCKET_OPEN_FLAGS_SINGLE_BE_SINGLE_FE);
+ if (ret) {
+ pr_err("%s: habmm_socket_open rx failed %d\n", __func__, ret);
+ habmm_socket_close(hab_handle_tx);
+ return ret;
+ }
+ pr_info("%s: hab_handle_tx %x hab_handle_rx %x\n",
+ __func__, hab_handle_tx, hab_handle_rx);
+
+ /* create apr ch rx cb thread */
+ apr_vm_cb_thread_task = kthread_run(apr_vm_cb_thread,
+ NULL,
+ APR_VM_CB_THREAD_NAME);
+ if (IS_ERR(apr_vm_cb_thread_task)) {
+ ret = PTR_ERR(apr_vm_cb_thread_task);
+ pr_err("%s: kthread_run failed %d\n", __func__, ret);
+ habmm_socket_close(hab_handle_tx);
+ habmm_socket_close(hab_handle_rx);
+ return ret;
+ }
+ pid = apr_vm_cb_thread_task->pid;
+ pr_info("%s: apr_vm_cb_thread started pid %d\n",
+ __func__, pid);
+
+ for (i = 0; i < APR_DEST_MAX; i++)
+ for (j = 0; j < APR_CLIENT_MAX; j++) {
+ mutex_init(&client[i][j].m_lock);
+ for (k = 0; k < APR_SVC_MAX; k++) {
+ mutex_init(&client[i][j].svc[k].m_lock);
+ spin_lock_init(&client[i][j].svc[k].w_lock);
+ }
+ }
+ spin_lock(&apr_priv->apr_lock);
+ apr_priv->is_initial_boot = true;
+ spin_unlock(&apr_priv->apr_lock);
+ apr_vm_set_subsys_state();
+ mutex_init(&q6.lock);
+ apr_reset_workqueue = create_singlethread_workqueue("apr_driver");
+ if (!apr_reset_workqueue) {
+ habmm_socket_close(hab_handle_tx);
+ habmm_socket_close(hab_handle_rx);
+ kthread_stop(apr_vm_cb_thread_task);
+ apr_priv = NULL;
+ return -ENOMEM;
+ }
+
+ 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__);
+
+ ret = of_property_read_string(pdev->dev.of_node,
+ "qcom,subsys-name",
+ (const char **)(&subsys_name));
+ if (ret) {
+ pr_err("%s: missing subsys-name entry in dt node\n", __func__);
+ return -EINVAL;
+ }
+
+ if (!strcmp(subsys_name, "apr_adsp")) {
+ subsys_notif_register("apr_adsp",
+ AUDIO_NOTIFIER_ADSP_DOMAIN,
+ &adsp_service_nb);
+ } else if (!strcmp(subsys_name, "apr_modem")) {
+ subsys_notif_register("apr_modem",
+ AUDIO_NOTIFIER_MODEM_DOMAIN,
+ &modem_service_nb);
+ } else {
+ pr_err("%s: invalid subsys-name %s\n", __func__, subsys_name);
+ return -EINVAL;
+ }
+
+ ret = snd_event_client_register(&pdev->dev, &apr_ssr_ops, NULL);
+ if (ret) {
+ pr_err("%s: Registration with SND event fwk failed ret = %d\n",
+ __func__, ret);
+ ret = 0;
+ }
+
+ return apr_debug_init();
+}
+
+static int apr_remove(struct platform_device *pdev)
+{
+ habmm_socket_close(hab_handle_tx);
+ habmm_socket_close(hab_handle_rx);
+ kthread_stop(apr_vm_cb_thread_task);
+ snd_event_client_deregister(&pdev->dev);
+ apr_cleanup();
+ apr_priv = NULL;
+ return 0;
+}
+
+static const struct of_device_id apr_machine_of_match[] = {
+ { .compatible = "qcom,msm-audio-apr", },
+ {},
+};
+
+static struct platform_driver apr_driver = {
+ .probe = apr_probe,
+ .remove = apr_remove,
+ .driver = {
+ .name = "audio_apr",
+ .owner = THIS_MODULE,
+ .of_match_table = apr_machine_of_match,
+ }
+};
+
+module_platform_driver(apr_driver);
+
+MODULE_DESCRIPTION("APR DRIVER");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, apr_machine_of_match);
diff --git a/ipc/wcd-dsp-glink.c b/ipc/wcd-dsp-glink.c
index 8cfcba9..a6eb044 100644
--- a/ipc/wcd-dsp-glink.c
+++ b/ipc/wcd-dsp-glink.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -755,6 +755,7 @@
.name = WDSP_GLINK_DRIVER_NAME,
.owner = THIS_MODULE,
.of_match_table = wdsp_glink_of_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c
index 4eee086..c234261 100644
--- a/soc/pinctrl-lpi.c
+++ b/soc/pinctrl-lpi.c
@@ -801,6 +801,7 @@
.name = "qcom-lpi-pinctrl",
.pm = &lpi_pinctrl_dev_pm_ops,
.of_match_table = lpi_pinctrl_of_match,
+ .suppress_bind_attrs = true,
},
.probe = lpi_pinctrl_probe,
.remove = lpi_pinctrl_remove,
diff --git a/soc/pinctrl-wcd.c b/soc/pinctrl-wcd.c
index d02fdc0..437563f 100644
--- a/soc/pinctrl-wcd.c
+++ b/soc/pinctrl-wcd.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2017, 2019, The Linux Foundation. All rights reserved.
*/
#include <linux/gpio.h>
@@ -416,6 +416,7 @@
.driver = {
.name = "qcom-wcd-pinctrl",
.of_match_table = wcd_pinctrl_of_match,
+ .suppress_bind_attrs = true,
},
.probe = wcd_pinctrl_probe,
.remove = wcd_pinctrl_remove,
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index c9cccf6..45781c7 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -249,7 +249,7 @@
if (swrm->clk_ref_count == 1) {
ret = swrm->clk(swrm->handle, true);
if (ret) {
- dev_err(swrm->dev,
+ dev_err_ratelimited(swrm->dev,
"%s: clock enable req failed",
__func__);
--swrm->clk_ref_count;
@@ -1277,6 +1277,8 @@
mutex_lock(&swrm->reslock);
if (swrm_clk_request(swrm, true)) {
+ dev_err_ratelimited(swrm->dev, "%s:clk request failed\n",
+ __func__);
mutex_unlock(&swrm->reslock);
goto exit;
}
@@ -1447,8 +1449,15 @@
}
mutex_lock(&swrm->reslock);
- if (swrm->lpass_core_hw_vote)
- clk_prepare_enable(swrm->lpass_core_hw_vote);
+ if (swrm->lpass_core_hw_vote) {
+ ret = clk_prepare_enable(swrm->lpass_core_hw_vote);
+ if (ret < 0) {
+ dev_err(dev, "%s:lpass core hw enable failed\n",
+ __func__);
+ ret = IRQ_NONE;
+ goto exit;
+ }
+ }
swrm_clk_request(swrm, true);
mutex_unlock(&swrm->reslock);
@@ -1618,6 +1627,7 @@
swrm_clk_request(swrm, false);
if (swrm->lpass_core_hw_vote)
clk_disable_unprepare(swrm->lpass_core_hw_vote);
+exit:
mutex_unlock(&swrm->reslock);
swrm_unlock_sleep(swrm);
return ret;
@@ -2279,11 +2289,14 @@
__func__, swrm->state);
mutex_lock(&swrm->reslock);
- if (swrm->lpass_core_hw_vote)
+ if (swrm->lpass_core_hw_vote) {
ret = clk_prepare_enable(swrm->lpass_core_hw_vote);
- if (ret < 0)
+ if (ret < 0) {
dev_err(dev, "%s:lpass core hw enable failed\n",
__func__);
+ ret = 0;
+ }
+ }
if ((swrm->state == SWR_MSTR_DOWN) ||
(swrm->state == SWR_MSTR_SSR && swrm->dev_up)) {
@@ -2296,7 +2309,6 @@
if (swrm_clk_request(swrm, true))
goto exit;
if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) {
- enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL);
list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
ret = swr_device_up(swr_dev);
if (ret == -ENODEV) {
@@ -2317,7 +2329,11 @@
swrm_master_init(swrm);
swrm_cmd_fifo_wr_cmd(swrm, 0x4, 0xF, 0x0,
SWRS_SCP_INT_STATUS_MASK_1);
-
+ if (swrm->state == SWR_MSTR_SSR) {
+ mutex_unlock(&swrm->reslock);
+ enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL);
+ mutex_lock(&swrm->reslock);
+ }
} else {
/*wake up from clock stop*/
swr_master_write(swrm, SWRM_MCP_BUS_CTRL_ADDR, 0x2);
@@ -2348,11 +2364,14 @@
mutex_lock(&swrm->force_down_lock);
current_state = swrm->state;
mutex_unlock(&swrm->force_down_lock);
- if (swrm->lpass_core_hw_vote)
+ if (swrm->lpass_core_hw_vote) {
ret = clk_prepare_enable(swrm->lpass_core_hw_vote);
- if (ret < 0)
+ if (ret < 0) {
dev_err(dev, "%s:lpass core hw enable failed\n",
__func__);
+ ret = 0;
+ }
+ }
if ((current_state == SWR_MSTR_UP) ||
(current_state == SWR_MSTR_SSR)) {
@@ -2921,6 +2940,7 @@
.owner = THIS_MODULE,
.pm = &swrm_dev_pm_ops,
.of_match_table = swrm_dt_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/soc/swr-wcd-ctrl.c b/soc/swr-wcd-ctrl.c
index 13e5fa8..f38085f 100644
--- a/soc/swr-wcd-ctrl.c
+++ b/soc/swr-wcd-ctrl.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*/
#include <linux/irq.h>
@@ -1929,6 +1929,7 @@
.owner = THIS_MODULE,
.pm = &swrm_dev_pm_ops,
.of_match_table = swrm_dt_match,
+ .suppress_bind_attrs = true,
},
};
diff --git a/soc/wcd-spi-ac.c b/soc/wcd-spi-ac.c
index ee7a7a9..2a822b2 100644
--- a/soc/wcd-spi-ac.c
+++ b/soc/wcd-spi-ac.c
@@ -1,13 +1,5 @@
+// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2018-2019, 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.
*/
#include <linux/init.h>
@@ -987,6 +979,7 @@
.driver = {
.name = "qcom,wcd-spi-ac",
.of_match_table = wcd_spi_ac_of_match,
+ .suppress_bind_attrs = true,
},
.probe = wcd_spi_ac_probe,
.remove = wcd_spi_ac_remove,
diff --git a/soc/wcd_spi_ctl_v01.c b/soc/wcd_spi_ctl_v01.c
index 0e59ca3..a803fd0 100644
--- a/soc/wcd_spi_ctl_v01.c
+++ b/soc/wcd_spi_ctl_v01.c
@@ -1,14 +1,5 @@
+// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2018-2019, 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.
- *
*/
#include <linux/qmi_encdec.h>
#include <soc/qcom/msm_qmi_interface.h>
diff --git a/soc/wcd_spi_ctl_v01.h b/soc/wcd_spi_ctl_v01.h
index dd9b1c3..683caa4 100644
--- a/soc/wcd_spi_ctl_v01.h
+++ b/soc/wcd_spi_ctl_v01.h
@@ -1,14 +1,5 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2018-2019, 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.
- *
*/
#ifndef WCD_SPI_CTL_V01_H
#define WCD_SPI_CTL_V01_H