Merge "ASoC: msm: update makefiles for auto platform support"
diff --git a/Android.mk b/Android.mk
index 68b56a9..6cdcdb5 100644
--- a/Android.mk
+++ b/Android.mk
@@ -3,7 +3,7 @@
UAPI_OUT := $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/include
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
$(shell mkdir -p $(UAPI_OUT)/linux;)
$(shell mkdir -p $(UAPI_OUT)/sound;)
$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers)
@@ -47,7 +47,7 @@
endif
endif
-ifeq ($(call is-board-platform-in-list, kona lito),true)
+ifeq ($(call is-board-platform-in-list, kona lito bengal),true)
$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/bolero/Module.symvers)
include $(MY_LOCAL_PATH)/asoc/codecs/bolero/Android.mk
$(shell rm -rf $(PRODUCT_OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd938x/Module.symvers)
diff --git a/Makefile.am b/Makefile.am
index 55f7787..0a0f003 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -42,6 +42,7 @@
obj-m += dsp/
obj-m += asoc/
obj-m += asoc/codecs/
+obj-m += soc/
KBUILD_OPTIONS += CONFIG_SND_SOC_SA8155=m
endif
diff --git a/asoc/Android.mk b/asoc/Android.mk
index fc7bde6..09d946d 100644
--- a/asoc/Android.mk
+++ b/asoc/Android.mk
@@ -38,7 +38,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/asoc/codecs/Android.mk b/asoc/codecs/Android.mk
index 6603e51..1409809 100644
--- a/asoc/codecs/Android.mk
+++ b/asoc/codecs/Android.mk
@@ -33,7 +33,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/asoc/codecs/bolero/Android.mk b/asoc/codecs/bolero/Android.mk
index cf51a44..9d1274f 100644
--- a/asoc/codecs/bolero/Android.mk
+++ b/asoc/codecs/bolero/Android.mk
@@ -17,7 +17,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,$(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c
index c0c51ca..6f81dab 100644
--- a/asoc/codecs/bolero/bolero-cdc.c
+++ b/asoc/codecs/bolero/bolero-cdc.c
@@ -501,8 +501,10 @@
priv->macro_params[macro_id].dev = dev;
priv->current_mclk_mux_macro[macro_id] =
bolero_mclk_mux_tbl[macro_id][MCLK_MUX0];
- if (macro_id == TX_MACRO)
+ if (macro_id == TX_MACRO) {
priv->macro_params[macro_id].reg_wake_irq = ops->reg_wake_irq;
+ priv->macro_params[macro_id].clk_switch = ops->clk_switch;
+ }
priv->num_dais += ops->num_dais;
priv->num_macros_registered++;
@@ -562,8 +564,10 @@
priv->macro_params[macro_id].dai_ptr = NULL;
priv->macro_params[macro_id].event_handler = NULL;
priv->macro_params[macro_id].dev = NULL;
- if (macro_id == TX_MACRO)
+ if (macro_id == TX_MACRO) {
priv->macro_params[macro_id].reg_wake_irq = NULL;
+ priv->macro_params[macro_id].clk_switch = NULL;
+ }
priv->num_dais -= priv->macro_params[macro_id].num_dais;
priv->num_macros_registered--;
@@ -768,6 +772,37 @@
}
EXPORT_SYMBOL(bolero_register_wake_irq);
+/**
+ * bolero_tx_clk_switch - Switch tx macro clock
+ *
+ * @component: pointer to codec component instance.
+ *
+ * Returns 0 on success or -EINVAL on error.
+ */
+int bolero_tx_clk_switch(struct snd_soc_component *component)
+{
+ struct bolero_priv *priv = NULL;
+ int ret = 0;
+
+ if (!component)
+ return -EINVAL;
+
+ priv = snd_soc_component_get_drvdata(component);
+ if (!priv)
+ return -EINVAL;
+
+ if (!bolero_is_valid_codec_dev(priv->dev)) {
+ dev_err(component->dev, "%s: invalid codec\n", __func__);
+ return -EINVAL;
+ }
+
+ if (priv->macro_params[TX_MACRO].clk_switch)
+ ret = priv->macro_params[TX_MACRO].clk_switch(component);
+
+ return ret;
+}
+EXPORT_SYMBOL(bolero_tx_clk_switch);
+
static int bolero_soc_codec_probe(struct snd_soc_component *component)
{
struct bolero_priv *priv = dev_get_drvdata(component->dev);
@@ -960,9 +995,13 @@
priv->plat_data.update_wcd_event = bolero_cdc_update_wcd_event;
priv->plat_data.register_notifier = bolero_cdc_register_notifier;
+ priv->core_hw_vote_count = 0;
+ priv->core_audio_vote_count = 0;
+
dev_set_drvdata(&pdev->dev, priv);
mutex_init(&priv->io_lock);
mutex_init(&priv->clk_lock);
+ mutex_init(&priv->vote_lock);
INIT_WORK(&priv->bolero_add_child_devices_work,
bolero_add_child_devices);
schedule_work(&priv->bolero_add_child_devices_work);
@@ -1002,6 +1041,7 @@
of_platform_depopulate(&pdev->dev);
mutex_destroy(&priv->io_lock);
mutex_destroy(&priv->clk_lock);
+ mutex_destroy(&priv->vote_lock);
return 0;
}
@@ -1015,21 +1055,35 @@
return 0;
}
- ret = clk_prepare_enable(priv->lpass_core_hw_vote);
- if (ret < 0)
- dev_err(dev, "%s:lpass core hw enable failed\n",
- __func__);
+ mutex_lock(&priv->vote_lock);
+ if (priv->core_hw_vote_count == 0) {
+ ret = clk_prepare_enable(priv->lpass_core_hw_vote);
+ if (ret < 0) {
+ dev_err(dev, "%s:lpass core hw enable failed\n",
+ __func__);
+ goto audio_vote;
+ }
+ }
+ priv->core_hw_vote_count++;
+audio_vote:
if (priv->lpass_audio_hw_vote == NULL) {
dev_dbg(dev, "%s: Invalid lpass audio hw node\n", __func__);
- return 0;
+ goto done;
}
- ret = clk_prepare_enable(priv->lpass_audio_hw_vote);
- if (ret < 0)
- dev_err(dev, "%s:lpass audio hw enable failed\n",
- __func__);
+ if (priv->core_audio_vote_count == 0) {
+ ret = clk_prepare_enable(priv->lpass_audio_hw_vote);
+ if (ret < 0) {
+ dev_err(dev, "%s:lpass audio hw enable failed\n",
+ __func__);
+ goto done;
+ }
+ }
+ priv->core_audio_vote_count++;
+done:
+ mutex_unlock(&priv->vote_lock);
pm_runtime_set_autosuspend_delay(priv->dev, BOLERO_AUTO_SUSPEND_DELAY);
return 0;
}
@@ -1039,17 +1093,28 @@
{
struct bolero_priv *priv = dev_get_drvdata(dev->parent);
- if (priv->lpass_core_hw_vote != NULL)
- clk_disable_unprepare(priv->lpass_core_hw_vote);
- else
+ mutex_lock(&priv->vote_lock);
+ if (priv->lpass_core_hw_vote != NULL) {
+ if (--priv->core_hw_vote_count == 0)
+ clk_disable_unprepare(priv->lpass_core_hw_vote);
+ if (priv->core_hw_vote_count < 0)
+ priv->core_hw_vote_count = 0;
+ } else {
dev_dbg(dev, "%s: Invalid lpass core hw node\n",
__func__);
+ }
- if (priv->lpass_audio_hw_vote != NULL)
- clk_disable_unprepare(priv->lpass_audio_hw_vote);
- else
+ if (priv->lpass_audio_hw_vote != NULL) {
+ if (--priv->core_audio_vote_count == 0)
+ clk_disable_unprepare(priv->lpass_audio_hw_vote);
+ if (priv->core_audio_vote_count < 0)
+ priv->core_audio_vote_count = 0;
+ } else {
dev_dbg(dev, "%s: Invalid lpass audio hw node\n",
__func__);
+ }
+
+ mutex_unlock(&priv->vote_lock);
return 0;
}
EXPORT_SYMBOL(bolero_runtime_suspend);
diff --git a/asoc/codecs/bolero/bolero-cdc.h b/asoc/codecs/bolero/bolero-cdc.h
index 362b521..7e8ec83 100644
--- a/asoc/codecs/bolero/bolero-cdc.h
+++ b/asoc/codecs/bolero/bolero-cdc.h
@@ -55,6 +55,7 @@
int (*reg_wake_irq)(struct snd_soc_component *component, u32 data);
int (*set_port_map)(struct snd_soc_component *component, u32 uc,
u32 size, void *data);
+ int (*clk_switch)(struct snd_soc_component *component);
char __iomem *io_base;
u16 clk_id_req;
u16 default_clk_id;
@@ -78,6 +79,7 @@
int bolero_runtime_resume(struct device *dev);
int bolero_runtime_suspend(struct device *dev);
int bolero_set_port_map(struct snd_soc_component *component, u32 size, void *data);
+int bolero_tx_clk_switch(struct snd_soc_component *component);
#else
static inline int bolero_register_res_clk(struct device *dev, rsc_clk_cb_t cb)
{
@@ -136,5 +138,11 @@
{
return 0;
}
+
+static inline int bolero_tx_clk_switch(struct snd_soc_component *component)
+{
+ return 0;
+}
+
#endif /* CONFIG_SND_SOC_BOLERO */
#endif /* BOLERO_CDC_H */
diff --git a/asoc/codecs/bolero/internal.h b/asoc/codecs/bolero/internal.h
index 21c9652..d353a2d 100644
--- a/asoc/codecs/bolero/internal.h
+++ b/asoc/codecs/bolero/internal.h
@@ -46,6 +46,7 @@
struct regmap *regmap;
struct mutex io_lock;
struct mutex clk_lock;
+ struct mutex vote_lock;
bool va_without_decimation;
bool macros_supported[MAX_MACRO];
bool dev_up;
@@ -60,6 +61,8 @@
u32 version;
struct clk *lpass_core_hw_vote;
struct clk *lpass_audio_hw_vote;
+ int core_hw_vote_count;
+ int core_audio_vote_count;
/* Entry for version info */
struct snd_info_entry *entry;
diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c
index bc5b056..db1129c 100644
--- a/asoc/codecs/bolero/tx-macro.c
+++ b/asoc/codecs/bolero/tx-macro.c
@@ -82,6 +82,7 @@
TX_MACRO_AIF_INVALID = 0,
TX_MACRO_AIF1_CAP,
TX_MACRO_AIF2_CAP,
+ TX_MACRO_AIF3_CAP,
TX_MACRO_MAX_DAIS
};
@@ -161,6 +162,7 @@
int va_swr_clk_cnt;
int va_clk_status;
int tx_clk_status;
+ bool bcs_enable;
};
static bool tx_macro_get_data(struct snd_soc_component *component,
@@ -470,6 +472,12 @@
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
unsigned int val = 0;
u16 mic_sel_reg = 0;
+ u16 dmic_clk_reg = 0;
+ struct device *tx_dev = NULL;
+ struct tx_macro_priv *tx_priv = NULL;
+
+ if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
+ return -EINVAL;
val = ucontrol->value.enumerated.item[0];
if (val > e->items - 1)
@@ -510,14 +518,24 @@
}
if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
if (val != 0) {
- if (val < 5)
+ if (val < 5) {
snd_soc_component_update_bits(component,
mic_sel_reg,
1 << 7, 0x0 << 7);
- else
+ } else {
snd_soc_component_update_bits(component,
mic_sel_reg,
1 << 7, 0x1 << 7);
+ snd_soc_component_update_bits(component,
+ BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
+ 0x80, 0x00);
+ dmic_clk_reg =
+ BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
+ ((val - 5)/2) * 4;
+ snd_soc_component_update_bits(component,
+ dmic_clk_reg,
+ 0x0E, tx_priv->dmic_clk_div << 0x1);
+ }
}
} else {
/* DMIC selected */
@@ -583,6 +601,38 @@
return 0;
}
+static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct tx_macro_priv *tx_priv = NULL;
+ struct device *tx_dev = NULL;
+
+ if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
+ return -EINVAL;
+
+ ucontrol->value.integer.value[0] = tx_priv->bcs_enable;
+
+ return 0;
+}
+
+static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct tx_macro_priv *tx_priv = NULL;
+ struct device *tx_dev = NULL;
+ int value = ucontrol->value.integer.value[0];
+
+ if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
+ return -EINVAL;
+
+ tx_priv->bcs_enable = value;
+
+ return 0;
+}
static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
@@ -730,7 +780,7 @@
CF_MIN_3DB_150HZ) {
schedule_delayed_work(
&tx_priv->tx_hpf_work[decimator].dwork,
- msecs_to_jiffies(50));
+ msecs_to_jiffies(300));
snd_soc_component_update_bits(component,
hpf_gate_reg, 0x02, 0x02);
/*
@@ -744,6 +794,12 @@
snd_soc_component_write(component, tx_gain_ctl_reg,
snd_soc_component_read32(component,
tx_gain_ctl_reg));
+ if (tx_priv->bcs_enable) {
+ snd_soc_component_update_bits(component, dec_cfg_reg,
+ 0x01, 0x01);
+ snd_soc_component_update_bits(component,
+ BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x40);
+ }
break;
case SND_SOC_DAPM_PRE_PMD:
hpf_cut_off_freq =
@@ -778,6 +834,12 @@
0x20, 0x00);
snd_soc_component_update_bits(component, tx_vol_ctl_reg,
0x10, 0x00);
+ if (tx_priv->bcs_enable) {
+ snd_soc_component_update_bits(component, dec_cfg_reg,
+ 0x01, 0x00);
+ snd_soc_component_update_bits(component,
+ BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00);
+ }
break;
}
return 0;
@@ -869,6 +931,7 @@
switch (dai->id) {
case TX_MACRO_AIF1_CAP:
case TX_MACRO_AIF2_CAP:
+ case TX_MACRO_AIF3_CAP:
*tx_slot = tx_priv->active_ch_mask[dai->id];
*tx_num = tx_priv->active_ch_cnt[dai->id];
break;
@@ -913,6 +976,20 @@
},
.ops = &tx_macro_dai_ops,
},
+ {
+ .name = "tx_macro_tx3",
+ .id = TX_MACRO_AIF3_CAP,
+ .capture = {
+ .stream_name = "TX_AIF3 Capture",
+ .rates = TX_MACRO_RATES,
+ .formats = TX_MACRO_FORMATS,
+ .rate_max = 192000,
+ .rate_min = 8000,
+ .channels_min = 1,
+ .channels_max = 8,
+ },
+ .ops = &tx_macro_dai_ops,
+ },
};
#define STRING(name) #name
@@ -1064,6 +1141,25 @@
tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
};
+static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
+ SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+ SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
+ tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
+};
+
static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
@@ -1071,12 +1167,18 @@
SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
+ SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
+ SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
+
SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
+ SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
+ tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
+
TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
@@ -1207,9 +1309,11 @@
static const struct snd_soc_dapm_route tx_audio_map[] = {
{"TX_AIF1 CAP", NULL, "TX_MCLK"},
{"TX_AIF2 CAP", NULL, "TX_MCLK"},
+ {"TX_AIF3 CAP", NULL, "TX_MCLK"},
{"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
{"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
+ {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
{"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
{"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
@@ -1229,6 +1333,15 @@
{"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
{"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
+ {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
+
{"TX DEC0 MUX", NULL, "TX_MCLK"},
{"TX DEC1 MUX", NULL, "TX_MCLK"},
{"TX DEC2 MUX", NULL, "TX_MCLK"},
@@ -1464,6 +1577,9 @@
SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
BOLERO_CDC_TX7_TX_VOL_CTL,
0, -84, 40, digital_gain),
+
+ SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
+ tx_macro_get_bcs, tx_macro_set_bcs),
};
static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
@@ -1608,6 +1724,36 @@
return ret;
}
+static int tx_macro_clk_switch(struct snd_soc_component *component)
+{
+ struct device *tx_dev = NULL;
+ struct tx_macro_priv *tx_priv = NULL;
+ int ret = 0;
+
+ if (!component)
+ return -EINVAL;
+
+ tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
+ if (!tx_dev) {
+ dev_err(component->dev,
+ "%s: null device for macro!\n", __func__);
+ return -EINVAL;
+ }
+ tx_priv = dev_get_drvdata(tx_dev);
+ if (!tx_priv) {
+ dev_err(component->dev,
+ "%s: priv is null for macro!\n", __func__);
+ return -EINVAL;
+ }
+ if (tx_priv->swr_ctrl_data) {
+ ret = swrm_wcd_notify(
+ tx_priv->swr_ctrl_data[0].tx_swr_pdev,
+ SWR_REQ_CLK_SWITCH, NULL);
+ }
+
+ return ret;
+}
+
static int tx_macro_swrm_clock(void *handle, bool enable)
{
struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
@@ -1784,6 +1930,7 @@
snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture");
snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture");
+ snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture");
snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0");
snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
@@ -1813,6 +1960,8 @@
}
tx_priv->component = component;
+ snd_soc_component_update_bits(component,
+ BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x0E);
return 0;
}
@@ -1971,6 +2120,7 @@
ops->event_handler = tx_macro_event_handler;
ops->reg_wake_irq = tx_macro_reg_wake_irq;
ops->set_port_map = tx_macro_set_port_map;
+ ops->clk_switch = tx_macro_clk_switch;
}
static int tx_macro_probe(struct platform_device *pdev)
diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c
index 8e5abaa..3c625a5 100644
--- a/asoc/codecs/bolero/va-macro.c
+++ b/asoc/codecs/bolero/va-macro.c
@@ -283,8 +283,14 @@
"%s: lpass audio hw enable failed\n",
__func__);
}
+ if (!ret)
+ if (bolero_tx_clk_switch(component))
+ dev_dbg(va_dev, "%s: clock switch failed\n",
+ __func__);
break;
case SND_SOC_DAPM_POST_PMD:
+ if (bolero_tx_clk_switch(component))
+ dev_dbg(va_dev, "%s: clock switch failed\n",__func__);
if (va_priv->lpass_audio_hw_vote)
clk_disable_unprepare(va_priv->lpass_audio_hw_vote);
break;
@@ -311,18 +317,18 @@
dev_dbg(va_dev, "%s: event = %d\n", __func__, event);
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
- ret = va_macro_mclk_enable(va_priv, 1, true);
ret = bolero_clk_rsc_request_clock(va_priv->dev,
va_priv->default_clk_id,
TX_CORE_CLK,
true);
+ ret = va_macro_mclk_enable(va_priv, 1, true);
break;
case SND_SOC_DAPM_POST_PMD:
+ va_macro_mclk_enable(va_priv, 0, true);
bolero_clk_rsc_request_clock(va_priv->dev,
va_priv->default_clk_id,
TX_CORE_CLK,
false);
- va_macro_mclk_enable(va_priv, 0, true);
break;
default:
dev_err(va_priv->dev,
@@ -409,7 +415,12 @@
snd_soc_dapm_to_component(widget->dapm);
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
unsigned int val;
- u16 mic_sel_reg;
+ u16 mic_sel_reg, dmic_clk_reg;
+ struct device *va_dev = NULL;
+ struct va_macro_priv *va_priv = NULL;
+
+ if (!va_macro_get_data(component, &va_dev, &va_priv, __func__))
+ return -EINVAL;
val = ucontrol->value.enumerated.item[0];
if (val > e->items - 1)
@@ -450,14 +461,24 @@
}
if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
if (val != 0) {
- if (val < 5)
+ if (val < 5) {
snd_soc_component_update_bits(component,
mic_sel_reg,
1 << 7, 0x0 << 7);
- else
+ } else {
snd_soc_component_update_bits(component,
mic_sel_reg,
1 << 7, 0x1 << 7);
+ snd_soc_component_update_bits(component,
+ BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
+ 0x80, 0x00);
+ dmic_clk_reg =
+ BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
+ ((val - 5)/2) * 4;
+ snd_soc_component_update_bits(component,
+ dmic_clk_reg,
+ 0x0E, va_priv->dmic_clk_div << 0x1);
+ }
}
} else {
/* DMIC selected */
diff --git a/asoc/codecs/csra66x0/csra66x0.c b/asoc/codecs/csra66x0/csra66x0.c
index 4b650bf..e0e702f 100644
--- a/asoc/codecs/csra66x0/csra66x0.c
+++ b/asoc/codecs/csra66x0/csra66x0.c
@@ -754,6 +754,9 @@
snd_soc_component_write(component, CSRA66X0_CH2_VOLUME_1_FA,
SPK_VOLUME_M20DB_MSB);
+ /* disable volume ramping */
+ snd_soc_component_write(component, CSRA66X0_VOLUME_CONFIG_FA, 0x27);
+
snd_soc_component_write(component, CSRA66X0_DEAD_TIME_CTRL, 0x0);
snd_soc_component_write(component, CSRA66X0_DEAD_TIME_THRESHOLD_0,
0xE7);
diff --git a/asoc/codecs/msm_hdmi_codec_rx.c b/asoc/codecs/msm_hdmi_codec_rx.c
index 5349598..04117c8 100644
--- a/asoc/codecs/msm_hdmi_codec_rx.c
+++ b/asoc/codecs/msm_hdmi_codec_rx.c
@@ -33,6 +33,11 @@
&codec_info)
enum {
+ DP_CONTROLLER0 = 0,
+ DP_CONTROLLER_MAX,
+};
+
+enum {
DP_STREAM0 = 0,
DP_STREAM1,
DP_STREAM_MAX,
@@ -295,6 +300,38 @@
return rc;
}
+static int msm_ext_disp_audio_device_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct msm_ext_disp_audio_codec_rx_data *codec_data;
+ int rc = 0;
+ int dai_id = ((struct soc_multi_mixer_control *)
+ kcontrol->private_value)->shift;
+
+ if (dai_id < 0 || dai_id > DP_DAI2) {
+ dev_err(component->dev,
+ "%s: invalid dai id: %d\n", __func__, dai_id);
+ rc = -EINVAL;
+ goto done;
+ }
+
+ codec_data = snd_soc_component_get_drvdata(component);
+ if (!codec_data) {
+ dev_err(component->dev,
+ "%s: codec_data or ops acknowledge() is NULL\n",
+ __func__);
+ rc = -EINVAL;
+ goto done;
+ }
+ ucontrol->value.integer.value[0] = codec_data->ctl[dai_id];
+ ucontrol->value.integer.value[1] = codec_data->stream[dai_id];
+
+done:
+ return rc;
+}
+
static int msm_ext_disp_audio_device_set(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -302,7 +339,15 @@
snd_soc_kcontrol_component(kcontrol);
struct msm_ext_disp_audio_codec_rx_data *codec_data;
int rc = 0;
- int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l;
+ int dai_id = ((struct soc_multi_mixer_control *)
+ kcontrol->private_value)->shift;
+
+ if (dai_id < 0 || dai_id > DP_DAI2) {
+ dev_err(component->dev,
+ "%s: invalid dai id: %d\n", __func__, dai_id);
+ rc = -EINVAL;
+ goto done;
+ }
codec_data = snd_soc_component_get_drvdata(component);
if (!codec_data) {
@@ -313,9 +358,20 @@
goto done;
}
+ if ((ucontrol->value.integer.value[0] > (DP_CONTROLLER_MAX - 1)) ||
+ (ucontrol->value.integer.value[1] > (DP_STREAM_MAX - 1)) ||
+ (ucontrol->value.integer.value[0] < 0) ||
+ (ucontrol->value.integer.value[1] < 0)) {
+ dev_err(component->dev,
+ "%s: DP audio control index invalid\n",
+ __func__);
+ rc = -EINVAL;
+ goto done;
+ }
+
mutex_lock(&codec_data->dp_ops_lock);
- codec_data->ctl[dai_id] = ucontrol->value.enumerated.item[0];
- codec_data->stream[dai_id] = ucontrol->value.enumerated.item[1];
+ codec_data->ctl[dai_id] = ucontrol->value.integer.value[0];
+ codec_data->stream[dai_id] = ucontrol->value.integer.value[1];
mutex_unlock(&codec_data->dp_ops_lock);
done:
@@ -363,12 +419,14 @@
ext_disp_audio_ack_state1,
NULL, msm_ext_disp_audio_ack_set),
- SOC_SINGLE_EXT("External Display Audio Device",
- SND_SOC_NOPM, DP_DAI1, DP_STREAM_MAX, 0,
- NULL, msm_ext_disp_audio_device_set),
- SOC_SINGLE_EXT("External Display1 Audio Device",
- SND_SOC_NOPM, DP_DAI2, DP_STREAM_MAX, 0,
- NULL, msm_ext_disp_audio_device_set),
+ SOC_SINGLE_MULTI_EXT("External Display Audio Device",
+ SND_SOC_NOPM, DP_DAI1, DP_STREAM_MAX - 1, 0, 2,
+ msm_ext_disp_audio_device_get,
+ msm_ext_disp_audio_device_set),
+ SOC_SINGLE_MULTI_EXT("External Display1 Audio Device",
+ SND_SOC_NOPM, DP_DAI2, DP_STREAM_MAX - 1, 0, 2,
+ msm_ext_disp_audio_device_get,
+ msm_ext_disp_audio_device_set),
};
static int msm_ext_disp_audio_codec_rx_dai_startup(
diff --git a/asoc/codecs/wcd937x/wcd937x-mbhc.c b/asoc/codecs/wcd937x/wcd937x-mbhc.c
index 5ac7245..55f9fb5 100644
--- a/asoc/codecs/wcd937x/wcd937x-mbhc.c
+++ b/asoc/codecs/wcd937x/wcd937x-mbhc.c
@@ -547,6 +547,12 @@
regmap_update_bits(wcd937x->regmap,
WCD937X_ANA_MBHC_MECH, 0x01, 0x00);
+ /* Disable surge protection before impedance detection.
+ * This is done to give correct value for high impedance.
+ */
+ regmap_update_bits(wcd937x->regmap,
+ WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00);
+
/* First get impedance on Left */
d1 = d1_a[1];
zdet_param_ptr = &zdet_param[1];
@@ -663,6 +669,9 @@
mbhc->hph_type = WCD_MBHC_HPH_MONO;
}
+ /* Enable surge protection again after impedance detection */
+ regmap_update_bits(wcd937x->regmap,
+ WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0);
zdet_complete:
snd_soc_component_write(component, WCD937X_ANA_MBHC_BTN5, reg0);
snd_soc_component_write(component, WCD937X_ANA_MBHC_BTN6, reg1);
diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c
index d4f3d1f..fe0c65c 100644
--- a/asoc/codecs/wcd937x/wcd937x.c
+++ b/asoc/codecs/wcd937x/wcd937x.c
@@ -46,6 +46,7 @@
ALLOW_BUCK_DISABLE,
HPH_COMP_DELAY,
HPH_PA_DELAY,
+ AMIC2_BCS_ENABLE,
};
static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
@@ -128,10 +129,6 @@
usleep_range(10000, 10010);
snd_soc_component_update_bits(component, WCD937X_ANA_BIAS,
0x40, 0x00);
- snd_soc_component_update_bits(component, WCD937X_HPH_OCP_CTL,
- 0xFF, 0x3A);
- snd_soc_component_update_bits(component, WCD937X_RX_OCP_CTL,
- 0x0F, 0x02);
snd_soc_component_update_bits(component,
WCD937X_HPH_SURGE_HPHLR_SURGE_EN,
0xFF, 0xD9);
@@ -684,8 +681,6 @@
snd_soc_component_update_bits(component,
WCD937X_HPH_NEW_INT_HPH_TIMER1,
0x02, 0x02);
- snd_soc_component_update_bits(component,
- WCD937X_HPH_R_TEST, 0x01, 0x01);
if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI)
snd_soc_component_update_bits(component,
WCD937X_ANA_RX_SUPPLIES,
@@ -694,10 +689,12 @@
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX2 << 0x10));
+ wcd_enable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_HPHR_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
- snd_soc_component_update_bits(component,
- WCD937X_HPH_R_TEST, 0x01, 0x00);
+ wcd_disable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_HPHR_PDM_WD_INT);
if (wcd937x->update_wcd_event)
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -783,8 +780,6 @@
snd_soc_component_update_bits(component,
WCD937X_HPH_NEW_INT_HPH_TIMER1,
0x02, 0x02);
- snd_soc_component_update_bits(component,
- WCD937X_HPH_L_TEST, 0x01, 0x01);
if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI)
snd_soc_component_update_bits(component,
WCD937X_ANA_RX_SUPPLIES,
@@ -793,10 +788,12 @@
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX1 << 0x10));
+ wcd_enable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_HPHL_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
- snd_soc_component_update_bits(component,
- WCD937X_HPH_L_TEST, 0x01, 0x00);
+ wcd_disable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_HPHL_PDM_WD_INT);
if (wcd937x->update_wcd_event)
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -867,8 +864,10 @@
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX3 << 0x10));
+ wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
+ wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT);
if (wcd937x->update_wcd_event)
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -935,8 +934,20 @@
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX1 << 0x10));
+ if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
+ wcd_enable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_AUX_PDM_WD_INT);
+ else
+ wcd_enable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_HPHL_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
+ if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
+ wcd_disable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_AUX_PDM_WD_INT);
+ else
+ wcd_disable_irq(&wcd937x->irq_info,
+ WCD937X_IRQ_HPHL_PDM_WD_INT);
if (wcd937x->update_wcd_event)
wcd937x->update_wcd_event(wcd937x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -1295,10 +1306,21 @@
WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x08);
snd_soc_component_update_bits(component,
WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10);
+ /* Enable BCS for Headset mic */
+ if (w->shift == 1 && !(snd_soc_component_read32(component,
+ WCD937X_TX_NEW_TX_CH2_SEL) & 0x80)) {
+ wcd937x_tx_connect_port(codec, MBHC, true);
+ set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
+ }
wcd937x_tx_connect_port(component, ADC1 + (w->shift), true);
break;
case SND_SOC_DAPM_POST_PMD:
wcd937x_tx_connect_port(component, ADC1 + (w->shift), false);
+ if (w->shift == 1 &&
+ test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask)) {
+ wcd937x_tx_connect_port(codec, MBHC, false);
+ clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
+ }
snd_soc_component_update_bits(component,
WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x00);
break;
@@ -2861,10 +2883,10 @@
"HPHL PDM WD INT", wcd937x_wd_handle_irq, NULL);
wcd_request_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT,
"AUX PDM WD INT", wcd937x_wd_handle_irq, NULL);
- /* Enable watchdog interrupt for HPH and AUX */
- wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHR_PDM_WD_INT);
- wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHL_PDM_WD_INT);
- wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT);
+ /* Disable watchdog interrupt for HPH and AUX */
+ wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHR_PDM_WD_INT);
+ wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHL_PDM_WD_INT);
+ wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT);
ret = snd_soc_register_component(dev, &soc_codec_dev_wcd937x,
NULL, 0);
diff --git a/asoc/codecs/wcd938x/Android.mk b/asoc/codecs/wcd938x/Android.mk
index 96fb6f5..49aa2d4 100644
--- a/asoc/codecs/wcd938x/Android.mk
+++ b/asoc/codecs/wcd938x/Android.mk
@@ -13,7 +13,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,kona lito),true)
+ifeq ($(call is-board-platform-in-list,kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/asoc/codecs/wcd938x/internal.h b/asoc/codecs/wcd938x/internal.h
index 2a47405..2c67ff8 100644
--- a/asoc/codecs/wcd938x/internal.h
+++ b/asoc/codecs/wcd938x/internal.h
@@ -67,7 +67,7 @@
u32 tx_mode[TX_ADC_MAX];
bool comp1_enable;
bool comp2_enable;
-
+ bool ldoh;
struct irq_domain *virq;
struct wcd_irq_info irq_info;
u32 rx_clk_cnt;
diff --git a/asoc/codecs/wcd938x/wcd938x-mbhc.c b/asoc/codecs/wcd938x/wcd938x-mbhc.c
index 47ebb07..bb83146 100644
--- a/asoc/codecs/wcd938x/wcd938x-mbhc.c
+++ b/asoc/codecs/wcd938x/wcd938x-mbhc.c
@@ -547,6 +547,12 @@
regmap_update_bits(wcd938x->regmap,
WCD938X_ANA_MBHC_MECH, 0x01, 0x00);
+ /* Disable surge protection before impedance detection.
+ * This is done to give correct value for high impedance.
+ */
+ regmap_update_bits(wcd938x->regmap,
+ WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00);
+
/* First get impedance on Left */
d1 = d1_a[1];
zdet_param_ptr = &zdet_param[1];
@@ -656,6 +662,9 @@
mbhc->hph_type = WCD_MBHC_HPH_MONO;
}
+ /* Enable surge protection again after impedance detection */
+ regmap_update_bits(wcd938x->regmap,
+ WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0);
zdet_complete:
snd_soc_component_write(component, WCD938X_ANA_MBHC_BTN5, reg0);
snd_soc_component_write(component, WCD938X_ANA_MBHC_BTN6, reg1);
diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c
index 0d05c0d..930d407 100644
--- a/asoc/codecs/wcd938x/wcd938x.c
+++ b/asoc/codecs/wcd938x/wcd938x.c
@@ -57,6 +57,7 @@
ALLOW_BUCK_DISABLE,
HPH_COMP_DELAY,
HPH_PA_DELAY,
+ AMIC2_BCS_ENABLE,
};
enum {
@@ -147,14 +148,6 @@
/* 10 msec delay as per HW requirement */
usleep_range(10000, 10010);
snd_soc_component_update_bits(component, WCD938X_ANA_BIAS, 0x40, 0x00);
- snd_soc_component_update_bits(component, WCD938X_HPH_OCP_CTL,
- 0xFF, 0x3A);
- snd_soc_component_update_bits(component, WCD938X_RX_OCP_CTL,
- 0x0F, 0x02);
- snd_soc_component_update_bits(component, WCD938X_HPH_R_TEST,
- 0x01, 0x01);
- snd_soc_component_update_bits(component, WCD938X_HPH_L_TEST,
- 0x01, 0x01);
snd_soc_component_update_bits(component,
WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL,
0xF0, 0x00);
@@ -629,6 +622,10 @@
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
+ if (wcd938x->ldoh)
+ snd_soc_component_update_bits(component,
+ WCD938X_LDOH_MODE,
+ 0x80, 0x80);
if (wcd938x->update_wcd_event)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -677,28 +674,25 @@
WCD938X_IRQ_HPHR_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
- wcd_disable_irq(&wcd938x->irq_info,
- WCD938X_IRQ_HPHR_PDM_WD_INT);
if (wcd938x->update_wcd_event)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX2 << 0x10 | 0x1));
- if (wcd938x->update_wcd_event)
+ wcd_disable_irq(&wcd938x->irq_info,
+ WCD938X_IRQ_HPHR_PDM_WD_INT);
+ if (wcd938x->update_wcd_event && wcd938x->comp2_enable)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST,
(WCD_RX2 << 0x10));
- /* 7 msec delay as per HW requirement */
- usleep_range(7000, 7100);
- if (wcd938x->update_wcd_event)
- wcd938x->update_wcd_event(wcd938x->handle,
- WCD_BOLERO_EVT_RX_MUTE,
- (WCD_RX2 << 0x10 | 0x0));
- /* 20 msec delay as per HW requirement */
- usleep_range(21000, 21100);
- if (wcd938x->update_wcd_event)
- wcd938x->update_wcd_event(wcd938x->handle,
- WCD_BOLERO_EVT_RX_MUTE,
- (WCD_RX2 << 0x10 | 0x1));
+ /*
+ * 7ms sleep is required if compander is enabled as per
+ * HW requirement. If compander is disabled, then
+ * 20ms delay is required.
+ */
+ if (!wcd938x->comp2_enable)
+ usleep_range(20000, 20100);
+ else
+ usleep_range(7000, 7100);
snd_soc_component_update_bits(component, WCD938X_ANA_HPH,
0x40, 0x00);
blocking_notifier_call_chain(&wcd938x->mbhc->notifier,
@@ -724,14 +718,16 @@
&wcd938x->mbhc->wcd_mbhc);
snd_soc_component_update_bits(component, WCD938X_ANA_HPH,
0x10, 0x00);
- /* 20 msec delay as per HW requirement */
- usleep_range(20000, 20100);
snd_soc_component_update_bits(component,
WCD938X_DIGITAL_PDM_WD_CTL1, 0x17, 0x00);
wcd_cls_h_fsm(component, &wcd938x->clsh_info,
WCD_CLSH_EVENT_POST_PA,
WCD_CLSH_STATE_HPHR,
hph_mode);
+ if (wcd938x->ldoh)
+ snd_soc_component_update_bits(component,
+ WCD938X_LDOH_MODE,
+ 0x80, 0x00);
break;
};
return ret;
@@ -751,6 +747,10 @@
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
+ if (wcd938x->ldoh)
+ snd_soc_component_update_bits(component,
+ WCD938X_LDOH_MODE,
+ 0x80, 0x80);
if (wcd938x->update_wcd_event)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -799,28 +799,25 @@
WCD938X_IRQ_HPHL_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
- wcd_disable_irq(&wcd938x->irq_info,
- WCD938X_IRQ_HPHL_PDM_WD_INT);
if (wcd938x->update_wcd_event)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX1 << 0x10 | 0x1));
- if (wcd938x->update_wcd_event)
+ wcd_disable_irq(&wcd938x->irq_info,
+ WCD938X_IRQ_HPHL_PDM_WD_INT);
+ if (wcd938x->update_wcd_event && wcd938x->comp1_enable)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_COMPANDER_SOFT_RST,
(WCD_RX1 << 0x10));
- /* 7 msec delay as per HW requirement */
- usleep_range(7000, 7100);
- if (wcd938x->update_wcd_event)
- wcd938x->update_wcd_event(wcd938x->handle,
- WCD_BOLERO_EVT_RX_MUTE,
- (WCD_RX1 << 0x10 | 0x0));
- /* 20 msec delay as per HW requirement */
- usleep_range(21000, 21100);
- if (wcd938x->update_wcd_event)
- wcd938x->update_wcd_event(wcd938x->handle,
- WCD_BOLERO_EVT_RX_MUTE,
- (WCD_RX1 << 0x10 | 0x1));
+ /*
+ * 7ms sleep is required if compander is enabled as per
+ * HW requirement. If compander is disabled, then
+ * 20ms delay is required.
+ */
+ if (!wcd938x->comp1_enable)
+ usleep_range(20000, 20100);
+ else
+ usleep_range(7000, 7100);
snd_soc_component_update_bits(component, WCD938X_ANA_HPH,
0x80, 0x00);
blocking_notifier_call_chain(&wcd938x->mbhc->notifier,
@@ -846,14 +843,16 @@
&wcd938x->mbhc->wcd_mbhc);
snd_soc_component_update_bits(component, WCD938X_ANA_HPH,
0x20, 0x00);
- /* 20 msec delay as per HW requirement */
- usleep_range(21000, 21100);
snd_soc_component_update_bits(component,
WCD938X_DIGITAL_PDM_WD_CTL0, 0x17, 0x00);
wcd_cls_h_fsm(component, &wcd938x->clsh_info,
WCD_CLSH_EVENT_POST_PA,
WCD_CLSH_STATE_HPHL,
hph_mode);
+ if (wcd938x->ldoh)
+ snd_soc_component_update_bits(component,
+ WCD938X_LDOH_MODE,
+ 0x80, 0x00);
break;
};
return ret;
@@ -968,8 +967,20 @@
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_MUTE,
(WCD_RX1 << 0x10));
+ if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX)
+ wcd_enable_irq(&wcd938x->irq_info,
+ WCD938X_IRQ_AUX_PDM_WD_INT);
+ else
+ wcd_enable_irq(&wcd938x->irq_info,
+ WCD938X_IRQ_HPHL_PDM_WD_INT);
break;
case SND_SOC_DAPM_PRE_PMD:
+ if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX)
+ wcd_disable_irq(&wcd938x->irq_info,
+ WCD938X_IRQ_AUX_PDM_WD_INT);
+ else
+ wcd_disable_irq(&wcd938x->irq_info,
+ WCD938X_IRQ_HPHL_PDM_WD_INT);
if (wcd938x->update_wcd_event)
wcd938x->update_wcd_event(wcd938x->handle,
WCD_BOLERO_EVT_RX_MUTE,
@@ -1127,6 +1138,7 @@
u8 dmic_ctl_shift = 0;
u8 dmic_clk_shift = 0;
u8 dmic_clk_mask = 0;
+ u16 dmic2_left_en = 0;
dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__,
w->name, event);
@@ -1142,6 +1154,7 @@
dmic_ctl_shift = 0x00;
break;
case 2:
+ dmic2_left_en = WCD938X_DIGITAL_CDC_DMIC2_CTL;
case 3:
dmic_clk_cnt = &(wcd938x->dmic_2_3_clk_cnt);
dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2;
@@ -1183,6 +1196,9 @@
(0x01 << dmic_ctl_shift), 0x00);
/* 250us sleep as per HW requirement */
usleep_range(250, 260);
+ if (dmic2_left_en)
+ snd_soc_component_update_bits(component,
+ dmic2_left_en, 0x80, 0x80);
/* Setting DMIC clock rate to 2.4MHz */
snd_soc_component_update_bits(component,
dmic_clk_reg, dmic_clk_mask,
@@ -1200,6 +1216,9 @@
WCD938X_DIGITAL_CDC_AMIC_CTL,
(0x01 << dmic_ctl_shift),
(0x01 << dmic_ctl_shift));
+ if (dmic2_left_en)
+ snd_soc_component_update_bits(component,
+ dmic2_left_en, 0x80, 0x00);
snd_soc_component_update_bits(component,
dmic_clk_en_reg, 0x08, 0x00);
break;
@@ -1414,10 +1433,21 @@
break;
}
set_bit(w->shift, &wcd938x->status_mask);
+ /* Enable BCS for Headset mic */
+ if (w->shift == 1 && !(snd_soc_component_read32(component,
+ WCD938X_TX_NEW_AMIC_MUX_CFG) & 0x80)) {
+ wcd938x_tx_connect_port(component, MBHC, true);
+ set_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask);
+ }
wcd938x_tx_connect_port(component, ADC1 + (w->shift), true);
break;
case SND_SOC_DAPM_POST_PMD:
wcd938x_tx_connect_port(component, ADC1 + (w->shift), false);
+ if (w->shift == 1 &&
+ test_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask)) {
+ wcd938x_tx_connect_port(component, MBHC, false);
+ clear_bit(AMIC2_BCS_ENABLE, &wcd938x->status_mask);
+ }
snd_soc_component_update_bits(component,
WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x00);
clear_bit(w->shift, &wcd938x->status_mask);
@@ -1943,11 +1973,19 @@
dev_dbg(component->dev, "%s: mode: %d\n", __func__, mode_val);
- if (mode_val == 0) {
+ if (wcd938x->variant == WCD9380) {
+ if (mode_val == CLS_H_HIFI || mode_val == CLS_AB_HIFI) {
+ dev_info(component->dev,
+ "%s:Invalid HPH Mode, default to CLS_H_ULP\n",
+ __func__);
+ mode_val = CLS_H_ULP;
+ }
+ }
+ if (mode_val == CLS_H_NORMAL) {
dev_info(component->dev,
"%s:Invalid HPH Mode, default to class_AB\n",
__func__);
- mode_val = 3; /* enum will be updated later */
+ mode_val = CLS_H_ULP;
}
wcd938x->hph_mode = mode_val;
return 0;
@@ -1991,6 +2029,30 @@
return 0;
}
+static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
+
+ ucontrol->value.integer.value[0] = wcd938x->ldoh;
+
+ return 0;
+}
+
+static int wcd938x_ldoh_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
+
+ wcd938x->ldoh = ucontrol->value.integer.value[0];
+
+ return 0;
+}
+
static const char * const tx_mode_mux_text_wcd9380[] = {
"ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP",
};
@@ -2008,6 +2070,16 @@
SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_mode_mux_text),
tx_mode_mux_text);
+static const char * const rx_hph_mode_mux_text_wcd9380[] = {
+ "CLS_H_INVALID", "CLS_H_INVALID_1", "CLS_H_LP", "CLS_AB",
+ "CLS_H_LOHIFI", "CLS_H_ULP", "CLS_H_INVALID_2", "CLS_AB_LP",
+ "CLS_AB_LOHIFI",
+};
+
+static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 =
+ SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380),
+ rx_hph_mode_mux_text_wcd9380);
+
static const char * const rx_hph_mode_mux_text[] = {
"CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI",
"CLS_H_ULP", "CLS_AB_HIFI", "CLS_AB_LP", "CLS_AB_LOHIFI",
@@ -2018,6 +2090,9 @@
rx_hph_mode_mux_text);
static const struct snd_kcontrol_new wcd9380_snd_controls[] = {
+ SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380,
+ wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put),
+
SOC_ENUM_EXT("TX0 MODE", tx_mode_mux_enum_wcd9380,
wcd938x_tx_mode_get, wcd938x_tx_mode_put),
SOC_ENUM_EXT("TX1 MODE", tx_mode_mux_enum_wcd9380,
@@ -2029,6 +2104,9 @@
};
static const struct snd_kcontrol_new wcd9385_snd_controls[] = {
+ SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum,
+ wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put),
+
SOC_ENUM_EXT("TX0 MODE", tx_mode_mux_enum,
wcd938x_tx_mode_get, wcd938x_tx_mode_put),
SOC_ENUM_EXT("TX1 MODE", tx_mode_mux_enum,
@@ -2040,14 +2118,14 @@
};
static const struct snd_kcontrol_new wcd938x_snd_controls[] = {
- SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum,
- wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put),
-
SOC_SINGLE_EXT("HPHL_COMP Switch", SND_SOC_NOPM, 0, 1, 0,
wcd938x_get_compander, wcd938x_set_compander),
SOC_SINGLE_EXT("HPHR_COMP Switch", SND_SOC_NOPM, 1, 1, 0,
wcd938x_get_compander, wcd938x_set_compander),
+ SOC_SINGLE_EXT("LDOH Enable", SND_SOC_NOPM, 0, 1, 0,
+ wcd938x_ldoh_get, wcd938x_ldoh_put),
+
SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 20, 1, line_gain),
SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 20, 1, line_gain),
SOC_SINGLE_TLV("ADC1 Volume", WCD938X_ANA_TX_CH1, 0, 20, 0,
diff --git a/asoc/codecs/wcd_cpe_core.c b/asoc/codecs/wcd_cpe_core.c
index 2ef4ae6..4c776d1 100644
--- a/asoc/codecs/wcd_cpe_core.c
+++ b/asoc/codecs/wcd_cpe_core.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.
*/
#include <linux/module.h>
@@ -52,7 +52,7 @@
mutex_unlock(lock); \
}
-#define WCD_CPE_STATE_MAX_LEN 11
+#define WCD_CPE_STATE_MAX_LEN 32
#define CPE_OFFLINE_WAIT_TIMEOUT (2 * HZ)
#define CPE_READY_WAIT_TIMEOUT (3 * HZ)
#define WCD_CPE_SYSFS_DIR_MAX_LENGTH 32
diff --git a/asoc/kona.c b/asoc/kona.c
index a8a64b2..bd9dc28 100644
--- a/asoc/kona.c
+++ b/asoc/kona.c
@@ -4916,6 +4916,8 @@
SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
SND_SOC_DAPM_MIC("Digital Mic5", msm_dmic_event),
+ SND_SOC_DAPM_MIC("Digital Mic6", NULL),
+ SND_SOC_DAPM_MIC("Digital Mic7", NULL),
};
static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
@@ -4982,6 +4984,8 @@
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, "Digital Mic6");
+ snd_soc_dapm_ignore_suspend(dapm, "Digital Mic7");
snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1");
snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2");
@@ -5553,6 +5557,7 @@
.ignore_pmdown_time = 1,
/* this dainlink has playback support */
.id = MSM_FRONTEND_DAI_MULTIMEDIA16,
+ .ops = &msm_fe_qos_ops,
},
{/* hw:x,30 */
.name = "CDC_DMA Hostless",
@@ -5699,6 +5704,19 @@
.codec_dai_name = "snd-soc-dummy-dai",
.codec_name = "snd-soc-dummy",
},
+ {/* hw:x,39 */
+ .name = LPASS_BE_TX_CDC_DMA_TX_5,
+ .stream_name = "TX CDC DMA5 Capture",
+ .cpu_dai_name = "msm-dai-cdc-dma-dev.45115",
+ .platform_name = "msm-pcm-hostless",
+ .codec_name = "bolero_codec",
+ .codec_dai_name = "tx_macro_tx3",
+ .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_5,
+ .be_hw_params_fixup = msm_be_hw_params_fixup,
+ .ignore_suspend = 1,
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ops = &msm_cdc_dma_be_ops,
+ },
};
static struct snd_soc_dai_link msm_common_be_dai_links[] = {
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index a3618ca..4f58f35 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -1534,9 +1534,16 @@
prtd->codec,
bits_per_sample, true, enc_cfg_id);
} else {
- ret = q6asm_open_read_v4(prtd->audio_client,
- prtd->codec,
- bits_per_sample, false, enc_cfg_id);
+ if (q6core_get_avcs_api_version_per_service(
+ APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >=
+ ADSP_ASM_API_VERSION_V2)
+ ret = q6asm_open_read_v5(prtd->audio_client,
+ prtd->codec, bits_per_sample,
+ false, enc_cfg_id);
+ else
+ ret = q6asm_open_read_v4(prtd->audio_client,
+ prtd->codec, bits_per_sample,
+ false, enc_cfg_id);
}
if (ret < 0) {
pr_err("%s: q6asm_open_read failed:%d\n",
@@ -1607,7 +1614,17 @@
prtd->num_channels, prtd->codec,
(void *)&prtd->codec_param.codec.options.generic);
} else if (prtd->compr_passthr == LEGACY_PCM) {
- ret = q6asm_enc_cfg_blk_pcm_format_support_v4(prtd->audio_client,
+ if (q6core_get_avcs_api_version_per_service(
+ APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >=
+ ADSP_ASM_API_VERSION_V2)
+ ret = q6asm_enc_cfg_blk_pcm_format_support_v5(
+ prtd->audio_client,
+ prtd->sample_rate, prtd->num_channels,
+ bits_per_sample, sample_word_size,
+ ASM_LITTLE_ENDIAN, DEFAULT_QF);
+ else
+ ret = q6asm_enc_cfg_blk_pcm_format_support_v4(
+ prtd->audio_client,
prtd->sample_rate, prtd->num_channels,
bits_per_sample, sample_word_size,
ASM_LITTLE_ENDIAN, DEFAULT_QF);
@@ -3153,13 +3170,18 @@
struct msm_compr_audio *prtd;
struct audio_client *ac;
int ret = -EINVAL;
+ uint64_t ses_time = 0, frames = 0, abs_time = 0;
+ uint64_t *val = NULL;
+ int64_t av_offset = 0;
+ int32_t clock_id = -EINVAL;
pr_debug("%s\n", __func__);
if (!metadata || !cstream || !cstream->runtime)
return ret;
- if (metadata->key != SNDRV_COMPRESS_PATH_DELAY) {
+ if (metadata->key != SNDRV_COMPRESS_PATH_DELAY &&
+ metadata->key != SNDRV_COMPRESS_DSP_POSITION) {
pr_err("%s, unsupported key %d\n", __func__, metadata->key);
return ret;
}
@@ -3170,17 +3192,50 @@
return ret;
}
- ac = prtd->audio_client;
- ret = q6asm_get_path_delay(prtd->audio_client);
- if (ret) {
- pr_err("%s: get_path_delay failed, ret=%d\n", __func__, ret);
- return ret;
+ switch (metadata->key) {
+ case SNDRV_COMPRESS_PATH_DELAY:
+ ac = prtd->audio_client;
+ ret = q6asm_get_path_delay(prtd->audio_client);
+ if (ret) {
+ pr_err("%s: get_path_delay failed, ret=%d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ pr_debug("%s, path delay(in us) %u\n", __func__,
+ ac->path_delay);
+ metadata->value[0] = ac->path_delay;
+ break;
+ case SNDRV_COMPRESS_DSP_POSITION:
+ clock_id = metadata->value[0];
+ pr_debug("%s, clock_id %d\n", __func__, clock_id);
+ ret = q6asm_get_session_time_v2(prtd->audio_client,
+ &ses_time, &abs_time);
+ if (ret) {
+ pr_err("%s: q6asm_get_session_time_v2 failed, ret=%d\n",
+ __func__, ret);
+ return ret;
+ }
+ frames = div64_u64((ses_time * prtd->sample_rate), 1000000);
+
+ ret = avcs_core_query_timer_offset(&av_offset, clock_id);
+ if (ret) {
+ pr_err("%s: avcs query failed, ret=%d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ val = (uint64_t *) &metadata->value[1];
+ val[0] = frames;
+ val[1] = abs_time + av_offset;
+ pr_debug("%s, vals frames %lld, time %lld, avoff %lld, abst %lld, sess_time %llu sr %d\n",
+ __func__, val[0], val[1], av_offset, abs_time,
+ ses_time, prtd->sample_rate);
+ break;
+ default:
+ pr_err("%s, unsupported key %d\n", __func__, metadata->key);
+ break;
}
-
- pr_debug("%s, path delay(in us) %u\n", __func__, ac->path_delay);
-
- metadata->value[0] = ac->path_delay;
-
return ret;
}
diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c
index f53b3a6..100f4d7 100644
--- a/asoc/msm-dai-fe.c
+++ b/asoc/msm-dai-fe.c
@@ -91,7 +91,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 16,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -105,7 +105,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 16,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -124,7 +124,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -138,7 +138,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -184,7 +184,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 6,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -198,7 +198,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -217,7 +217,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -237,7 +237,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -251,7 +251,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -270,7 +270,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -284,7 +284,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -303,7 +303,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 16,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -323,7 +323,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -337,7 +337,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -2051,6 +2051,38 @@
.probe = fe_dai_probe,
},
{
+ .capture = {
+ .stream_name = "Quinary TDM7 Hostless Capture",
+ .aif_name = "QUIN_TDM_TX_7_UL_HL",
+ .rates = SNDRV_PCM_RATE_8000_48000,
+ .formats = (SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE),
+ .channels_min = 1,
+ .channels_max = 16,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .ops = &msm_fe_dai_ops,
+ .name = "QUIN_TDM_TX_7_HOSTLESS",
+ .probe = fe_dai_probe,
+ },
+ {
+ .playback = {
+ .stream_name = "Quinary TDM7 Hostless Playback",
+ .aif_name = "QUIN_TDM_RX_7_DL_HL",
+ .rates = SNDRV_PCM_RATE_8000_48000,
+ .formats = (SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE),
+ .channels_min = 1,
+ .channels_max = 16,
+ .rate_min = 8000,
+ .rate_max = 48000,
+ },
+ .ops = &msm_fe_dai_ops,
+ .name = "QUIN_TDM_RX_7_HOSTLESS",
+ .probe = fe_dai_probe,
+ },
+ {
.playback = {
.stream_name = "DTMF_RX_HOSTLESS Playback",
.aif_name = "DTMF_DL_HL",
@@ -2140,7 +2172,7 @@
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2151,7 +2183,7 @@
SNDRV_PCM_RATE_KNOT),
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -2332,7 +2364,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2364,7 +2396,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2384,7 +2416,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2404,7 +2436,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2424,7 +2456,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2444,7 +2476,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2464,7 +2496,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2478,7 +2510,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -2546,7 +2578,7 @@
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 192000,
},
@@ -2565,7 +2597,7 @@
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 192000,
},
@@ -2584,7 +2616,7 @@
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 192000,
},
@@ -2604,7 +2636,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 384000,
},
@@ -2618,7 +2650,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -2630,16 +2662,16 @@
.playback = {
.stream_name = "MultiMedia21 Playback",
.aif_name = "MM_DL21",
- .rates = (SNDRV_PCM_RATE_8000_384000|
+ .rates = (SNDRV_PCM_RATE_8000_384000 |
SNDRV_PCM_RATE_KNOT),
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
- .rate_min = 8000,
- .rate_max = 384000,
+ .channels_max = 32,
+ .rate_min = 8000,
+ .rate_max = 384000,
},
.capture = {
.stream_name = "MultiMedia21 Capture",
@@ -2651,7 +2683,7 @@
SNDRV_PCM_FMTBIT_S24_3LE |
SNDRV_PCM_FMTBIT_S32_LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 48000,
},
@@ -2708,7 +2740,7 @@
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 192000,
},
@@ -2727,7 +2759,7 @@
SNDRV_PCM_FMTBIT_S24_LE |
SNDRV_PCM_FMTBIT_S24_3LE),
.channels_min = 1,
- .channels_max = 8,
+ .channels_max = 32,
.rate_min = 8000,
.rate_max = 192000,
},
@@ -2736,6 +2768,25 @@
.name = "MultiMedia29",
.probe = fe_dai_probe,
},
+ {
+ .capture = {
+ .stream_name = "MultiMedia30 Capture",
+ .aif_name = "MM_UL30",
+ .rates = (SNDRV_PCM_RATE_8000_192000|
+ SNDRV_PCM_RATE_KNOT),
+ .formats = (SNDRV_PCM_FMTBIT_S16_LE |
+ SNDRV_PCM_FMTBIT_S24_LE |
+ SNDRV_PCM_FMTBIT_S24_3LE),
+ .channels_min = 1,
+ .channels_max = 32,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_fe_Multimedia_dai_ops,
+ .compress_new = snd_soc_new_compress,
+ .name = "MultiMedia30",
+ .probe = fe_dai_probe,
+ },
};
static int msm_fe_dai_dev_probe(struct platform_device *pdev)
diff --git a/asoc/msm-dai-q6-hdmi-v2.c b/asoc/msm-dai-q6-hdmi-v2.c
index fb50eba..80164f3 100644
--- a/asoc/msm-dai-q6-hdmi-v2.c
+++ b/asoc/msm-dai-q6-hdmi-v2.c
@@ -20,6 +20,18 @@
#define HDMI_RX_CA_MAX 0x32
enum {
+ DP_CONTROLLER0 = 0,
+ DP_CONTROLLER1,
+ DP_CONTROLLER_MAX,
+};
+
+enum {
+ DP_STREAM0 = 0,
+ DP_STREAM1,
+ DP_STREAM_MAX,
+};
+
+enum {
STATUS_PORT_STARTED, /* track if AFE port has started */
STATUS_MAX
};
@@ -84,6 +96,14 @@
return -EINVAL;
}
+ if ((ucontrol->value.integer.value[0] > (DP_CONTROLLER_MAX - 1)) ||
+ (ucontrol->value.integer.value[1] > (DP_STREAM_MAX - 1)) ||
+ (ucontrol->value.integer.value[0] < 0) ||
+ (ucontrol->value.integer.value[1] < 0)) {
+ pr_err("%s: DP control index invalid\n", __func__);
+ return -EINVAL;
+ }
+
dai_data->ctl_idx = ucontrol->value.integer.value[0];
dai_data->stream_idx = ucontrol->value.integer.value[1];
pr_debug("%s: DP ctl id %d stream id %d\n", __func__,
@@ -219,7 +239,7 @@
msm_dai_q6_ext_disp_ca_get,
msm_dai_q6_ext_disp_ca_put),
SOC_SINGLE_MULTI_EXT("Display Port RX DEVICE IDX", SND_SOC_NOPM, 0,
- 1, 0, 1,
+ 1, 0, 2,
msm_dai_q6_ext_disp_device_idx_get,
msm_dai_q6_ext_disp_device_idx_put),
{
diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c
index 7cb2c0b..6a30f3e 100644
--- a/asoc/msm-dai-q6-v2.c
+++ b/asoc/msm-dai-q6-v2.c
@@ -8144,6 +8144,9 @@
case 16:
cap_mask = 0xFFFF;
break;
+ case 32:
+ cap_mask = 0xFFFFFFFF;
+ break;
default:
dev_err(dai->dev, "%s: invalid slots %d\n",
__func__, slots);
@@ -8293,6 +8296,8 @@
dev_get_drvdata(dai->dev);
struct afe_param_id_slot_mapping_cfg *slot_mapping =
&dai_data->port_cfg.slot_mapping;
+ struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 =
+ &dai_data->port_cfg.slot_mapping_v2;
int i = 0;
dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id);
@@ -8346,23 +8351,49 @@
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;
- }
- if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) {
- dev_err(dai->dev, "%s: invalid rx num %d\n", __func__,
- rx_num);
- return -EINVAL;
- }
+ if (q6core_get_avcs_api_version_per_service(
+ APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) {
+ if (!rx_slot) {
+ dev_err(dai->dev, "%s: rx slot not found\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) {
+ dev_err(dai->dev, "%s: invalid rx num %d\n",
+ __func__,
+ rx_num);
+ return -EINVAL;
+ }
- for (i = 0; i < rx_num; i++)
- slot_mapping->offset[i] = rx_slot[i];
- for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++)
- slot_mapping->offset[i] =
- AFE_SLOT_MAPPING_OFFSET_INVALID;
+ for (i = 0; i < rx_num; i++)
+ slot_mapping_v2->offset[i] = rx_slot[i];
+ for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2;
+ i++)
+ slot_mapping_v2->offset[i] =
+ AFE_SLOT_MAPPING_OFFSET_INVALID;
- slot_mapping->num_channel = rx_num;
+ slot_mapping_v2->num_channel = rx_num;
+ } else {
+ if (!rx_slot) {
+ dev_err(dai->dev, "%s: rx slot not found\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) {
+ dev_err(dai->dev, "%s: invalid rx num %d\n",
+ __func__,
+ rx_num);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < rx_num; i++)
+ slot_mapping->offset[i] = rx_slot[i];
+ for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++)
+ slot_mapping->offset[i] =
+ AFE_SLOT_MAPPING_OFFSET_INVALID;
+
+ slot_mapping->num_channel = rx_num;
+ }
break;
case AFE_PORT_ID_PRIMARY_TDM_TX:
case AFE_PORT_ID_PRIMARY_TDM_TX_1:
@@ -8412,23 +8443,49 @@
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;
- }
- if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) {
- dev_err(dai->dev, "%s: invalid tx num %d\n", __func__,
- tx_num);
- return -EINVAL;
- }
+ if (q6core_get_avcs_api_version_per_service(
+ APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) {
+ if (!tx_slot) {
+ dev_err(dai->dev, "%s: tx slot not found\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) {
+ dev_err(dai->dev, "%s: invalid tx num %d\n",
+ __func__,
+ tx_num);
+ return -EINVAL;
+ }
- for (i = 0; i < tx_num; i++)
- slot_mapping->offset[i] = tx_slot[i];
- for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++)
- slot_mapping->offset[i] =
- AFE_SLOT_MAPPING_OFFSET_INVALID;
+ for (i = 0; i < tx_num; i++)
+ slot_mapping_v2->offset[i] = tx_slot[i];
+ for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2;
+ i++)
+ slot_mapping_v2->offset[i] =
+ AFE_SLOT_MAPPING_OFFSET_INVALID;
- slot_mapping->num_channel = tx_num;
+ slot_mapping_v2->num_channel = tx_num;
+ } else {
+ if (!tx_slot) {
+ dev_err(dai->dev, "%s: tx slot not found\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) {
+ dev_err(dai->dev, "%s: invalid tx num %d\n",
+ __func__,
+ tx_num);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < tx_num; i++)
+ slot_mapping->offset[i] = tx_slot[i];
+ for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++)
+ slot_mapping->offset[i] =
+ AFE_SLOT_MAPPING_OFFSET_INVALID;
+
+ slot_mapping->num_channel = tx_num;
+ }
break;
default:
dev_err(dai->dev, "%s: invalid dai id 0x%x\n",
@@ -8452,6 +8509,8 @@
&dai_data->port_cfg.tdm;
struct afe_param_id_slot_mapping_cfg *slot_mapping =
&dai_data->port_cfg.slot_mapping;
+ struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 =
+ &dai_data->port_cfg.slot_mapping_v2;
struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header =
&dai_data->port_cfg.custom_tdm_header;
@@ -8459,7 +8518,7 @@
__func__, dev_name(dai->dev));
if ((params_channels(params) == 0) ||
- (params_channels(params) > 8)) {
+ (params_channels(params) > 32)) {
dev_err(dai->dev, "%s: invalid param channels %d\n",
__func__, params_channels(params));
return -EINVAL;
@@ -8561,32 +8620,88 @@
tdm->ctrl_data_out_enable,
tdm->ctrl_invert_sync_pulse,
tdm->ctrl_sync_data_delay);
+ if (q6core_get_avcs_api_version_per_service(
+ APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) {
+ /*
+ * update slot mapping v2 config param
+ * NOTE: channels/rate/bitwidth are per stream property
+ */
+ slot_mapping_v2->bitwidth = dai_data->bitwidth;
- /*
- * update slot mapping config param
- * NOTE: channels/rate/bitwidth are per stream property
- */
- slot_mapping->bitwidth = dai_data->bitwidth;
-
- pr_debug("%s: SLOT MAPPING:\n"
+ pr_debug("%s: SLOT MAPPING_V2:\n"
"num_channel=%d bitwidth=%d data_align=0x%x\n",
__func__,
- slot_mapping->num_channel,
- slot_mapping->bitwidth,
- slot_mapping->data_align_type);
- pr_debug("%s: SLOT MAPPING:\n"
+ slot_mapping_v2->num_channel,
+ slot_mapping_v2->bitwidth,
+ slot_mapping_v2->data_align_type);
+ pr_debug("%s: SLOT MAPPING V2:\n"
"offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n"
- "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n",
+ "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n"
+ "offset[8]=0x%x offset[9]=0x%x offset[10]=0x%x offset[11]=0x%x\n"
+ "offset[12]=0x%x offset[13]=0x%x offset[14]=0x%x offset[15]=0x%x\n"
+ "offset[16]=0x%x offset[17]=0x%x offset[18]=0x%x offset[19]=0x%x\n"
+ "offset[20]=0x%x offset[21]=0x%x offset[22]=0x%x offset[23]=0x%x\n"
+ "offset[24]=0x%x offset[25]=0x%x offset[26]=0x%x offset[27]=0x%x\n"
+ "offset[28]=0x%x offset[29]=0x%x offset[30]=0x%x offset[31]=0x%x\n",
__func__,
- slot_mapping->offset[0],
- slot_mapping->offset[1],
- slot_mapping->offset[2],
- slot_mapping->offset[3],
- slot_mapping->offset[4],
- slot_mapping->offset[5],
- slot_mapping->offset[6],
- slot_mapping->offset[7]);
+ slot_mapping_v2->offset[0],
+ slot_mapping_v2->offset[1],
+ slot_mapping_v2->offset[2],
+ slot_mapping_v2->offset[3],
+ slot_mapping_v2->offset[4],
+ slot_mapping_v2->offset[5],
+ slot_mapping_v2->offset[6],
+ slot_mapping_v2->offset[7],
+ slot_mapping_v2->offset[8],
+ slot_mapping_v2->offset[9],
+ slot_mapping_v2->offset[10],
+ slot_mapping_v2->offset[11],
+ slot_mapping_v2->offset[12],
+ slot_mapping_v2->offset[13],
+ slot_mapping_v2->offset[14],
+ slot_mapping_v2->offset[15],
+ slot_mapping_v2->offset[16],
+ slot_mapping_v2->offset[17],
+ slot_mapping_v2->offset[18],
+ slot_mapping_v2->offset[19],
+ slot_mapping_v2->offset[20],
+ slot_mapping_v2->offset[21],
+ slot_mapping_v2->offset[22],
+ slot_mapping_v2->offset[23],
+ slot_mapping_v2->offset[24],
+ slot_mapping_v2->offset[25],
+ slot_mapping_v2->offset[26],
+ slot_mapping_v2->offset[27],
+ slot_mapping_v2->offset[28],
+ slot_mapping_v2->offset[29],
+ slot_mapping_v2->offset[30],
+ slot_mapping_v2->offset[31]);
+ } else {
+ /*
+ * update slot mapping config param
+ * NOTE: channels/rate/bitwidth are per stream property
+ */
+ slot_mapping->bitwidth = dai_data->bitwidth;
+ pr_debug("%s: SLOT MAPPING:\n"
+ "num_channel=%d bitwidth=%d data_align=0x%x\n",
+ __func__,
+ slot_mapping->num_channel,
+ slot_mapping->bitwidth,
+ slot_mapping->data_align_type);
+ pr_debug("%s: SLOT MAPPING:\n"
+ "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n"
+ "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n",
+ __func__,
+ slot_mapping->offset[0],
+ slot_mapping->offset[1],
+ slot_mapping->offset[2],
+ slot_mapping->offset[3],
+ slot_mapping->offset[4],
+ slot_mapping->offset[5],
+ slot_mapping->offset[6],
+ slot_mapping->offset[7]);
+ }
/*
* update custom header config param
* NOTE: channels/rate/bitwidth are per playback stream property.
@@ -10922,6 +11037,8 @@
/* TDM SLOT MAPPING CFG -- set default */
dai_data->port_cfg.slot_mapping.minor_version =
AFE_API_VERSION_SLOT_MAPPING_CONFIG;
+ dai_data->port_cfg.slot_mapping_v2.minor_version =
+ AFE_API_VERSION_SLOT_MAPPING_CONFIG_V2;
/* CUSTOM TDM HEADER CFG */
custom_tdm_header = &dai_data->port_cfg.custom_tdm_header;
diff --git a/asoc/msm-pcm-q6-noirq.c b/asoc/msm-pcm-q6-noirq.c
index 5b97831..6d1d30d 100644
--- a/asoc/msm-pcm-q6-noirq.c
+++ b/asoc/msm-pcm-q6-noirq.c
@@ -600,13 +600,26 @@
static int msm_pcm_prepare(struct snd_pcm_substream *substream)
{
+ int rc = 0;
struct snd_pcm_runtime *runtime = substream->runtime;
struct msm_audio *prtd = runtime->private_data;
+ struct asm_softvolume_params softvol = {
+ .period = SOFT_VOLUME_PERIOD,
+ .step = SOFT_VOLUME_STEP,
+ .rampingcurve = SOFT_VOLUME_CURVE_LINEAR,
+ };
if (!prtd || !prtd->mmap_flag)
return -EIO;
- return 0;
+ if (prtd->audio_client) {
+ rc = q6asm_set_softvolume_v2(prtd->audio_client,
+ &softvol, SOFT_VOLUME_INSTANCE_1);
+ if (rc < 0)
+ pr_err("%s: Send SoftVolume command failed rc=%d\n",
+ __func__, rc);
+ }
+ return rc;
}
static int msm_pcm_close(struct snd_pcm_substream *substream)
diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c
index af15843..88ce6bb 100644
--- a/asoc/msm-pcm-q6-v2.c
+++ b/asoc/msm-pcm-q6-v2.c
@@ -25,6 +25,7 @@
#include <linux/of_device.h>
#include <sound/tlv.h>
#include <sound/pcm_params.h>
+#include <sound/devdep_params.h>
#include <dsp/msm_audio_ion.h>
#include <dsp/q6audio-v2.h>
#include <dsp/q6core.h>
@@ -390,8 +391,7 @@
} else {
if ((q6core_get_avcs_api_version_per_service(
APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >=
- ADSP_ASM_API_VERSION_V2) &&
- q6core_use_Q6_32ch_support())
+ ADSP_ASM_API_VERSION_V2))
ret = q6asm_open_write_v5(prtd->audio_client,
fmt_type, bits_per_sample);
else
@@ -439,8 +439,7 @@
if ((q6core_get_avcs_api_version_per_service(
APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >=
- ADSP_ASM_API_VERSION_V2) &&
- q6core_use_Q6_32ch_support()) {
+ ADSP_ASM_API_VERSION_V2)) {
ret = q6asm_media_format_block_multi_ch_pcm_v5(
prtd->audio_client, runtime->rate,
@@ -523,8 +522,7 @@
if ((q6core_get_avcs_api_version_per_service(
APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >=
- ADSP_ASM_API_VERSION_V2) &&
- q6core_use_Q6_32ch_support())
+ ADSP_ASM_API_VERSION_V2))
ret = q6asm_open_read_v5(prtd->audio_client,
FORMAT_LINEAR_PCM,
bits_per_sample, false, ENC_CFG_ID_NONE);
@@ -601,8 +599,7 @@
if ((q6core_get_avcs_api_version_per_service(
APRV2_IDS_SERVICE_ID_ADSP_ASM_V) >=
- ADSP_ASM_API_VERSION_V2) &&
- q6core_use_Q6_32ch_support())
+ ADSP_ASM_API_VERSION_V2))
ret = q6asm_enc_cfg_blk_pcm_format_support_v5(
prtd->audio_client,
prtd->samp_rate,
@@ -1156,12 +1153,106 @@
return 0;
}
+static int msm_pcm_ioctl(struct snd_pcm_substream *substream,
+ unsigned int cmd, void __user *arg)
+{
+ struct msm_audio *prtd = NULL;
+ struct snd_soc_pcm_runtime *rtd = NULL;
+ uint64_t ses_time = 0, abs_time = 0;
+ int64_t av_offset = 0;
+ int32_t clock_id = -EINVAL;
+ int rc = 0;
+ struct snd_pcm_prsnt_position userarg;
+
+ if (!substream || !substream->private_data) {
+ pr_err("%s: Invalid %s\n", __func__,
+ (!substream) ? "substream" : "private_data");
+ return -EINVAL;
+ }
+
+ if (!substream->runtime) {
+ pr_err("%s substream runtime not found\n", __func__);
+ return -EINVAL;
+ }
+
+ prtd = substream->runtime->private_data;
+ if (!prtd) {
+ pr_err("%s prtd is null.\n", __func__);
+ return -EINVAL;
+ }
+
+ rtd = substream->private_data;
+
+ switch (cmd) {
+ case SNDRV_PCM_IOCTL_DSP_POSITION:
+ dev_dbg(rtd->dev, "%s: SNDRV_PCM_DSP_POSITION", __func__);
+ if (!arg) {
+ dev_err(rtd->dev, "%s: Invalid params DSP_POSITION\n",
+ __func__);
+ rc = -EINVAL;
+ goto done;
+ }
+ memset(&userarg, 0, sizeof(userarg));
+ if (copy_from_user(&userarg, arg, sizeof(userarg))) {
+ dev_err(rtd->dev, "%s: err copyuser DSP_POSITION\n",
+ __func__);
+ rc = -EFAULT;
+ goto done;
+ }
+ clock_id = userarg.clock_id;
+ rc = q6asm_get_session_time_v2(prtd->audio_client, &ses_time,
+ &abs_time);
+ if (rc) {
+ pr_err("%s: q6asm_get_session_time_v2 failed, rc=%d\n",
+ __func__, rc);
+ goto done;
+ }
+ userarg.frames = div64_u64((ses_time * prtd->samp_rate),
+ 1000000);
+
+ rc = avcs_core_query_timer_offset(&av_offset, clock_id);
+ if (rc) {
+ pr_err("%s: avcs offset query failed, rc=%d\n",
+ __func__, rc);
+ goto done;
+ }
+
+ userarg.timestamp = abs_time + av_offset;
+ if (copy_to_user(arg, &userarg, sizeof(userarg))) {
+ dev_err(rtd->dev, "%s: err copy to user DSP_POSITION\n",
+ __func__);
+ rc = -EFAULT;
+ goto done;
+ }
+ pr_debug("%s, vals f %lld, t %lld, avoff %lld, abst %lld, sess_time %llu sr %d\n",
+ __func__, userarg.frames, userarg.timestamp,
+ av_offset, abs_time, ses_time, prtd->samp_rate);
+ break;
+ default:
+ rc = snd_pcm_lib_ioctl(substream, cmd, arg);
+ break;
+ }
+done:
+ return rc;
+}
+
+#ifdef CONFIG_COMPAT
+static int msm_pcm_compat_ioctl(struct snd_pcm_substream *substream,
+ unsigned int cmd, void __user *arg)
+{
+ return msm_pcm_ioctl(substream, cmd, arg);
+}
+#else
+#define msm_pcm_compat_ioctl NULL
+#endif
+
static const struct snd_pcm_ops msm_pcm_ops = {
.open = msm_pcm_open,
.copy_user = msm_pcm_copy,
.hw_params = msm_pcm_hw_params,
.close = msm_pcm_close,
- .ioctl = snd_pcm_lib_ioctl,
+ .ioctl = msm_pcm_ioctl,
+ .compat_ioctl = msm_pcm_compat_ioctl,
.prepare = msm_pcm_prepare,
.trigger = msm_pcm_trigger,
.pointer = msm_pcm_pointer,
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 4ec63e3..3d21c50 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -771,6 +771,9 @@
/* MULTIMEDIA29 */
{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
+ /* MULTIMEDIA30 */
+ {{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
+ {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
/* VOIP */
{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
@@ -3440,6 +3443,16 @@
SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA3, ch_mixer);
static SOC_ENUM_SINGLE_DECL(mm4_channel_mux,
SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA4, ch_mixer);
+static SOC_ENUM_SINGLE_DECL(mm18_channel_mux,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA18, ch_mixer);
+static SOC_ENUM_SINGLE_DECL(mm19_channel_mux,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA19, ch_mixer);
+static SOC_ENUM_SINGLE_DECL(mm28_channel_mux,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA28, ch_mixer);
+static SOC_ENUM_SINGLE_DECL(mm29_channel_mux,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA29, ch_mixer);
+static SOC_ENUM_SINGLE_DECL(mm30_channel_mux,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA30, ch_mixer);
static SOC_ENUM_DOUBLE_DECL(mm1_ch1_enum,
SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 0, be_name);
@@ -3457,6 +3470,26 @@
SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 6, be_name);
static SOC_ENUM_DOUBLE_DECL(mm1_ch8_enum,
SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA1, 7, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm18_ch1_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA18, 0, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm18_ch2_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA18, 1, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm19_ch1_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA19, 0, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm19_ch2_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA19, 1, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm28_ch1_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA28, 0, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm28_ch2_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA28, 1, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm29_ch1_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA29, 0, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm29_ch2_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA29, 1, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm30_ch1_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA30, 0, be_name);
+static SOC_ENUM_DOUBLE_DECL(mm30_ch2_enum,
+ SND_SOC_NOPM, MSM_FRONTEND_DAI_MULTIMEDIA30, 1, be_name);
static int msm_pcm_get_ctl_enum_info(struct snd_ctl_elem_info *uinfo,
unsigned int channels,
@@ -3758,6 +3791,26 @@
MSM_FRONTEND_DAI_MULTIMEDIA6, 8, 0,
msm_pcm_get_channel_rule_index,
msm_pcm_put_channel_rule_index),
+ SOC_SINGLE_EXT("MultiMedia18 Channel Rule", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 8, 0,
+ msm_pcm_get_channel_rule_index,
+ msm_pcm_put_channel_rule_index),
+ SOC_SINGLE_EXT("MultiMedia19 Channel Rule", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 8, 0,
+ msm_pcm_get_channel_rule_index,
+ msm_pcm_put_channel_rule_index),
+ SOC_SINGLE_EXT("MultiMedia28 Channel Rule", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 8, 0,
+ msm_pcm_get_channel_rule_index,
+ msm_pcm_put_channel_rule_index),
+ SOC_SINGLE_EXT("MultiMedia29 Channel Rule", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 8, 0,
+ msm_pcm_get_channel_rule_index,
+ msm_pcm_put_channel_rule_index),
+ SOC_SINGLE_EXT("MultiMedia30 Channel Rule", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 8, 0,
+ msm_pcm_get_channel_rule_index,
+ msm_pcm_put_channel_rule_index),
SOC_SINGLE_EXT("MultiMedia1 Channels", SND_SOC_NOPM,
MSM_FRONTEND_DAI_MULTIMEDIA1, 14, 0,
@@ -3783,6 +3836,26 @@
MSM_FRONTEND_DAI_MULTIMEDIA6, 8, 0,
msm_pcm_get_out_chs,
msm_pcm_put_out_chs),
+ SOC_SINGLE_EXT("MultiMedia18 Channels", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 14, 0,
+ msm_pcm_get_out_chs,
+ msm_pcm_put_out_chs),
+ SOC_SINGLE_EXT("MultiMedia19 Channels", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 14, 0,
+ msm_pcm_get_out_chs,
+ msm_pcm_put_out_chs),
+ SOC_SINGLE_EXT("MultiMedia28 Channels", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 14, 0,
+ msm_pcm_get_out_chs,
+ msm_pcm_put_out_chs),
+ SOC_SINGLE_EXT("MultiMedia29 Channels", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 14, 0,
+ msm_pcm_get_out_chs,
+ msm_pcm_put_out_chs),
+ SOC_SINGLE_EXT("MultiMedia30 Channels", SND_SOC_NOPM,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 14, 0,
+ msm_pcm_get_out_chs,
+ msm_pcm_put_out_chs),
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
@@ -3822,6 +3895,51 @@
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Channel Mixer",
+ .info = msm_pcm_channel_mixer_info,
+ .get = msm_pcm_channel_mixer_get,
+ .put = msm_pcm_channel_mixer_put,
+ .private_value = (unsigned long)&(mm18_channel_mux)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Channel Mixer",
+ .info = msm_pcm_channel_mixer_info,
+ .get = msm_pcm_channel_mixer_get,
+ .put = msm_pcm_channel_mixer_put,
+ .private_value = (unsigned long)&(mm19_channel_mux)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Channel Mixer",
+ .info = msm_pcm_channel_mixer_info,
+ .get = msm_pcm_channel_mixer_get,
+ .put = msm_pcm_channel_mixer_put,
+ .private_value = (unsigned long)&(mm28_channel_mux)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Channel Mixer",
+ .info = msm_pcm_channel_mixer_info,
+ .get = msm_pcm_channel_mixer_get,
+ .put = msm_pcm_channel_mixer_put,
+ .private_value = (unsigned long)&(mm29_channel_mux)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Channel Mixer",
+ .info = msm_pcm_channel_mixer_info,
+ .get = msm_pcm_channel_mixer_get,
+ .put = msm_pcm_channel_mixer_put,
+ .private_value = (unsigned long)&(mm30_channel_mux)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.name = "MultiMedia1 Output Channel1",
.info = msm_pcm_channel_weight_info,
.get = msm_pcm_channel_weight_get,
@@ -4012,6 +4130,706 @@
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel1",
+ .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_MULTIMEDIA18, .rshift = 0,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel2",
+ .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_MULTIMEDIA18, .rshift = 1, }
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel3",
+ .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_MULTIMEDIA18, .rshift = 2,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel4",
+ .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_MULTIMEDIA18, .rshift = 3,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel5",
+ .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_MULTIMEDIA18, .rshift = 4,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel6",
+ .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_MULTIMEDIA18, .rshift = 5,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel7",
+ .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_MULTIMEDIA18, .rshift = 6,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel8",
+ .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_MULTIMEDIA18, .rshift = 7,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 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_MULTIMEDIA18, .rshift = 8,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 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_MULTIMEDIA18, .rshift = 9,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel11",
+ .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_MULTIMEDIA18, .rshift = 10,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel12",
+ .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_MULTIMEDIA18, .rshift = 11,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel13",
+ .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_MULTIMEDIA18, .rshift = 12,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel14",
+ .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_MULTIMEDIA18, .rshift = 13,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel1",
+ .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_MULTIMEDIA19, .rshift = 0,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel2",
+ .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_MULTIMEDIA19, .rshift = 1, }
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel3",
+ .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_MULTIMEDIA19, .rshift = 2,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel4",
+ .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_MULTIMEDIA19, .rshift = 3,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel5",
+ .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_MULTIMEDIA19, .rshift = 4,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel6",
+ .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_MULTIMEDIA19, .rshift = 5,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel7",
+ .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_MULTIMEDIA19, .rshift = 6,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel8",
+ .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_MULTIMEDIA19, .rshift = 7,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 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_MULTIMEDIA19, .rshift = 8,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 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_MULTIMEDIA19, .rshift = 9,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel11",
+ .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_MULTIMEDIA19, .rshift = 10,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel12",
+ .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_MULTIMEDIA19, .rshift = 11,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel13",
+ .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_MULTIMEDIA19, .rshift = 12,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel14",
+ .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_MULTIMEDIA19, .rshift = 13,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel1",
+ .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_MULTIMEDIA28, .rshift = 0,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel2",
+ .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_MULTIMEDIA28, .rshift = 1, }
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel3",
+ .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_MULTIMEDIA28, .rshift = 2,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel4",
+ .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_MULTIMEDIA28, .rshift = 3,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel5",
+ .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_MULTIMEDIA28, .rshift = 4,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel6",
+ .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_MULTIMEDIA28, .rshift = 5,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel7",
+ .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_MULTIMEDIA28, .rshift = 6,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel8",
+ .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_MULTIMEDIA28, .rshift = 7,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 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_MULTIMEDIA28, .rshift = 8,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 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_MULTIMEDIA28, .rshift = 9,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel11",
+ .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_MULTIMEDIA28, .rshift = 10,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel12",
+ .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_MULTIMEDIA28, .rshift = 11,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel13",
+ .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_MULTIMEDIA28, .rshift = 12,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel14",
+ .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_MULTIMEDIA28, .rshift = 13,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel1",
+ .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_MULTIMEDIA29, .rshift = 0,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel2",
+ .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_MULTIMEDIA29, .rshift = 1, }
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel3",
+ .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_MULTIMEDIA29, .rshift = 2,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel4",
+ .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_MULTIMEDIA29, .rshift = 3,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel5",
+ .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_MULTIMEDIA29, .rshift = 4,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel6",
+ .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_MULTIMEDIA29, .rshift = 5,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel7",
+ .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_MULTIMEDIA29, .rshift = 6,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel8",
+ .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_MULTIMEDIA29, .rshift = 7,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 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_MULTIMEDIA29, .rshift = 8,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 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_MULTIMEDIA29, .rshift = 9,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel11",
+ .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_MULTIMEDIA29, .rshift = 10,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel12",
+ .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_MULTIMEDIA29, .rshift = 11,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel13",
+ .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_MULTIMEDIA29, .rshift = 12,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel14",
+ .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_MULTIMEDIA29, .rshift = 13,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel1",
+ .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_MULTIMEDIA30, .rshift = 0,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel2",
+ .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_MULTIMEDIA30, .rshift = 1, }
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel3",
+ .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_MULTIMEDIA30, .rshift = 2,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel4",
+ .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_MULTIMEDIA30, .rshift = 3,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel5",
+ .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_MULTIMEDIA30, .rshift = 4,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel6",
+ .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_MULTIMEDIA30, .rshift = 5,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel7",
+ .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_MULTIMEDIA30, .rshift = 6,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel8",
+ .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_MULTIMEDIA30, .rshift = 7,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 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_MULTIMEDIA30, .rshift = 8,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 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_MULTIMEDIA30, .rshift = 9,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel11",
+ .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_MULTIMEDIA30, .rshift = 10,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel12",
+ .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_MULTIMEDIA30, .rshift = 11,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel13",
+ .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_MULTIMEDIA30, .rshift = 12,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel14",
+ .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_MULTIMEDIA30, .rshift = 13,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.name = "MultiMedia1 Channel1",
.info = msm_pcm_channel_input_be_info,
.get = msm_pcm_channel_input_be_get,
@@ -4084,6 +4902,96 @@
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Channel1",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm18_ch1_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Channel2",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm18_ch2_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Channel1",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm19_ch1_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Channel2",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm19_ch2_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Channel1",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm28_ch1_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Channel2",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm28_ch2_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Channel1",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm29_ch1_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Channel2",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm29_ch2_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Channel1",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm30_ch1_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Channel2",
+ .info = msm_pcm_channel_input_be_info,
+ .get = msm_pcm_channel_input_be_get,
+ .put = msm_pcm_channel_input_be_put,
+ .private_value = (unsigned long)&(mm30_ch2_enum)
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
.name = "MultiMedia1 Output Channel Map",
.info = msm_pcm_channel_output_map_info,
.get = msm_pcm_channel_output_map_get,
@@ -4141,6 +5049,56 @@
.private_value = (unsigned long)&(struct soc_multi_mixer_control)
{ .shift = MSM_FRONTEND_DAI_MULTIMEDIA6,}
},
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia18 Output Channel Map",
+ .info = msm_pcm_channel_output_map_info,
+ .get = msm_pcm_channel_output_map_get,
+ .put = msm_pcm_channel_output_map_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA18,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia19 Output Channel Map",
+ .info = msm_pcm_channel_output_map_info,
+ .get = msm_pcm_channel_output_map_get,
+ .put = msm_pcm_channel_output_map_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA19,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia28 Output Channel Map",
+ .info = msm_pcm_channel_output_map_info,
+ .get = msm_pcm_channel_output_map_get,
+ .put = msm_pcm_channel_output_map_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA28,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia29 Output Channel Map",
+ .info = msm_pcm_channel_output_map_info,
+ .get = msm_pcm_channel_output_map_get,
+ .put = msm_pcm_channel_output_map_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA29,}
+ },
+ {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "MultiMedia30 Output Channel Map",
+ .info = msm_pcm_channel_output_map_info,
+ .get = msm_pcm_channel_output_map_get,
+ .put = msm_pcm_channel_output_map_put,
+ .private_value = (unsigned long)&(struct soc_multi_mixer_control)
+ { .shift = MSM_FRONTEND_DAI_MULTIMEDIA30,}
+ },
};
static int msm_ec_ref_ch_get(struct snd_kcontrol *kcontrol,
@@ -4827,6 +5785,10 @@
MSM_BACKEND_DAI_PRI_I2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_I2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = {
@@ -4918,6 +5880,10 @@
MSM_BACKEND_DAI_SEC_I2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_I2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new pri_spdif_rx_mixer_controls[] = {
@@ -5009,6 +5975,10 @@
MSM_BACKEND_DAI_PRI_SPDIF_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_SPDIF_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new sec_spdif_rx_mixer_controls[] = {
@@ -5100,6 +6070,10 @@
MSM_BACKEND_DAI_SEC_SPDIF_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_SPDIF_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
@@ -5262,6 +6236,10 @@
MSM_BACKEND_DAI_SLIMBUS_5_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_5_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
@@ -5353,6 +6331,10 @@
MSM_BACKEND_DAI_SLIMBUS_0_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_0_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = {
@@ -5444,6 +6426,10 @@
MSM_BACKEND_DAI_MI2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
@@ -5535,6 +6521,10 @@
MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
@@ -5626,6 +6616,10 @@
MSM_BACKEND_DAI_QUINARY_MI2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUINARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
@@ -5802,6 +6796,10 @@
MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new secondary_mi2s_rx2_mixer_controls[] = {
@@ -5900,6 +6898,10 @@
MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
@@ -5991,6 +6993,10 @@
MSM_BACKEND_DAI_PRI_MI2S_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_PRI_MI2S_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
@@ -6217,6 +7223,10 @@
MSM_BACKEND_DAI_HDMI_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_HDMI_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new display_port_mixer_controls[] = {
@@ -7501,6 +8511,10 @@
MSM_BACKEND_DAI_INT_BT_SCO_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INT_BT_SCO_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new int_bt_a2dp_rx_mixer_controls[] = {
@@ -7663,6 +8677,10 @@
MSM_BACKEND_DAI_INT_FM_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INT_FM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
@@ -7754,6 +8772,10 @@
MSM_BACKEND_DAI_AFE_PCM_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_AFE_PCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
@@ -7849,6 +8871,10 @@
MSM_BACKEND_DAI_AUXPCM_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new sec_auxpcm_rx_mixer_controls[] = {
@@ -7944,6 +8970,10 @@
MSM_BACKEND_DAI_SEC_AUXPCM_RX,
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_AUXPCM_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new tert_auxpcm_rx_mixer_controls[] = {
@@ -13451,7 +14481,7 @@
msm_routing_put_audio_mixer),
SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
- MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 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,
@@ -13638,6 +14668,119 @@
msm_routing_put_audio_mixer),
};
+static const struct snd_kcontrol_new mmul30_mixer_controls[] = {
+ SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_0_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SLIM_1_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SLIMBUS_1_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 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_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("INT3_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INT3_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("INTERNAL_FM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INT_FM_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 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_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("AFE_PCM_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_AFE_PCM_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("VOC_REC_DL", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INCALL_RECORD_RX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("VOC_REC_UL", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_INCALL_RECORD_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 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_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TERT_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("QUAT_MI2S_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 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_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("WSA_CDC_DMA_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_VA_CDC_DMA_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_VA_CDC_DMA_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_0", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_0,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0,
+ msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0,
+ msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0,
+ msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_3", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0,
+ msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_4", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0,
+ msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("TX_CDC_DMA_TX_5", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_TX_CDC_DMA_TX_5,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 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_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("SEC_SPDIF_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SEC_SPDIF_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_DOUBLE_EXT("AFE_LOOPBACK_TX", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_AFE_LOOPBACK_TX,
+ MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
SOC_DOUBLE_EXT("Voip", SND_SOC_NOPM,
MSM_BACKEND_DAI_PRI_I2S_RX,
@@ -14745,6 +15888,9 @@
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),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX_MMode1", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0,
+ msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("TERT_MI2S_TX_MMode1", SND_SOC_NOPM,
MSM_BACKEND_DAI_TERTIARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE1,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
@@ -14762,7 +15908,7 @@
MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("QUAT_TDM_TX_0_MMode1", SND_SOC_NOPM,
-MSM_BACKEND_DAI_QUAT_TDM_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0_MMode1", SND_SOC_NOPM,
MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_VOICEMMODE1,
@@ -14841,6 +15987,9 @@
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),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX_MMode2", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0,
+ msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("TERT_MI2S_TX_MMode2", SND_SOC_NOPM,
MSM_BACKEND_DAI_TERTIARY_MI2S_TX, MSM_FRONTEND_DAI_VOICEMMODE2,
1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
@@ -14943,6 +16092,10 @@
MSM_BACKEND_DAI_PRI_MI2S_TX,
MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
msm_routing_put_voice_mixer),
+ SOC_DOUBLE_EXT("SEC_MI2S_TX_Voip", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
+ MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
+ msm_routing_put_voice_mixer),
SOC_DOUBLE_EXT("TERT_MI2S_TX_Voip", SND_SOC_NOPM,
MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
@@ -18096,6 +19249,11 @@
MSM_BACKEND_DAI_QUAT_TDM_TX_7, 1, 0,
msm_routing_get_port_mixer,
msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUAT_TDM_RX_7,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_7, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new quin_tdm_rx_0_port_mixer_controls[] = {
@@ -19082,6 +20240,24 @@
msm_routing_put_port_mixer),
};
+static const struct snd_kcontrol_new quin_tdm_rx_7_port_mixer_controls[] = {
+ SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_7,
+ MSM_BACKEND_DAI_TERT_TDM_TX_7, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUAT_TDM_TX_7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_7,
+ MSM_BACKEND_DAI_QUAT_TDM_TX_7, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+ SOC_DOUBLE_EXT("QUIN_TDM_TX_7", SND_SOC_NOPM,
+ MSM_BACKEND_DAI_QUIN_TDM_RX_7,
+ MSM_BACKEND_DAI_QUIN_TDM_TX_7, 1, 0,
+ msm_routing_get_port_mixer,
+ msm_routing_put_port_mixer),
+};
+
static const struct snd_kcontrol_new tert_mi2s_rx_port_mixer_controls[] = {
SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM,
MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
@@ -20009,7 +21185,7 @@
static const struct snd_kcontrol_new app_type_cfg_controls[] = {
SOC_SINGLE_MULTI_EXT("App Type Config", SND_SOC_NOPM, 0,
- 0xFFFFFFFF, 0, 128, msm_routing_get_app_type_cfg_control,
+ 0x7FFFFFFF, 0, 128, msm_routing_get_app_type_cfg_control,
msm_routing_put_app_type_cfg_control),
SOC_SINGLE_MULTI_EXT("App Type Gain", SND_SOC_NOPM, 0,
0x2000, 0, 4, NULL, msm_routing_put_app_type_gain_control)
@@ -21104,6 +22280,7 @@
SND_SOC_DAPM_AIF_OUT("MM_UL27", "MultiMedia27 Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("MM_UL28", "MultiMedia28 Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("MM_UL29", "MultiMedia29 Capture", 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("MM_UL30", "MultiMedia30 Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("VOICEMMODE1_DL",
"VoiceMMode1 Playback", 0, 0, 0, 0),
@@ -22186,6 +23363,8 @@
mmul28_mixer_controls, ARRAY_SIZE(mmul28_mixer_controls)),
SND_SOC_DAPM_MIXER("MultiMedia29 Mixer", SND_SOC_NOPM, 0, 0,
mmul29_mixer_controls, ARRAY_SIZE(mmul29_mixer_controls)),
+ SND_SOC_DAPM_MIXER("MultiMedia30 Mixer", SND_SOC_NOPM, 0, 0,
+ mmul30_mixer_controls, ARRAY_SIZE(mmul30_mixer_controls)),
SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
SND_SOC_DAPM_MIXER("SEC_AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
@@ -22506,6 +23685,9 @@
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("QUIN_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0,
+ quin_tdm_rx_7_port_mixer_controls,
+ ARRAY_SIZE(quin_tdm_rx_7_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)),
@@ -23115,6 +24297,8 @@
{"MultiMedia28 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
{"MultiMedia29 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"MultiMedia29 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
+ {"MultiMedia30 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
+ {"MultiMedia30 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
{"MultiMedia8 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"MultiMedia8 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
{"MultiMedia2 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -23124,21 +24308,25 @@
{"MultiMedia19 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"MultiMedia28 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"MultiMedia29 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+ {"MultiMedia30 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"MultiMedia8 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"MultiMedia18 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"MultiMedia19 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"MultiMedia28 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"MultiMedia29 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+ {"MultiMedia30 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"MultiMedia17 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia18 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia19 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia28 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia29 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+ {"MultiMedia30 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia17 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia18 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia19 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia28 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia29 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
+ {"MultiMedia30 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
{"MultiMedia8 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
{"MultiMedia3 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
{"MultiMedia3 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
@@ -23157,10 +24345,12 @@
{"MultiMedia19 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
{"MultiMedia28 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
{"MultiMedia29 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
+ {"MultiMedia30 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
{"MultiMedia18 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
{"MultiMedia19 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
{"MultiMedia28 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
{"MultiMedia29 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
+ {"MultiMedia30 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
{"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
{"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
@@ -23247,6 +24437,7 @@
{"PRI_MI2S_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"PRI_MI2S_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia10", "MM_DL10"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia11", "MM_DL11"},
{"PRI_MI2S_RX Audio Mixer", "MultiMedia12", "MM_DL12"},
@@ -23997,6 +25188,7 @@
{"MultiMedia19 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
{"MultiMedia28 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
{"MultiMedia29 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
+ {"MultiMedia30 Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
{"MultiMedia6 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"MultiMedia6 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
{"MultiMedia6 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
@@ -24492,6 +25684,8 @@
{"MultiMedia18 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
{"MultiMedia18 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"},
{"MultiMedia18 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"},
+ {"MultiMedia18 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
+ {"MultiMedia18 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
{"MultiMedia19 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"},
{"MultiMedia19 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"},
@@ -24500,6 +25694,8 @@
{"MultiMedia19 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
{"MultiMedia19 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"},
{"MultiMedia19 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"},
+ {"MultiMedia19 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
+ {"MultiMedia19 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
{"MultiMedia28 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"},
{"MultiMedia28 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"},
@@ -24508,6 +25704,8 @@
{"MultiMedia28 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
{"MultiMedia28 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"},
{"MultiMedia28 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"},
+ {"MultiMedia28 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
+ {"MultiMedia28 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
{"MultiMedia29 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"},
{"MultiMedia29 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"},
@@ -24516,6 +25714,18 @@
{"MultiMedia29 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
{"MultiMedia29 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"},
{"MultiMedia29 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"},
+ {"MultiMedia29 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
+ {"MultiMedia29 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
+
+ {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_0", "TX_CDC_DMA_TX_0"},
+ {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_1", "TX_CDC_DMA_TX_1"},
+ {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_2", "TX_CDC_DMA_TX_2"},
+ {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+ {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"},
+ {"MultiMedia30 Mixer", "TX_CDC_DMA_TX_5", "TX_CDC_DMA_TX_5"},
+ {"MultiMedia30 Mixer", "AFE_LOOPBACK_TX", "AFE_LOOPBACK_TX"},
+ {"MultiMedia30 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
+ {"MultiMedia30 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
{"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
{"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
@@ -24600,6 +25810,7 @@
{"MultiMedia19 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
{"MultiMedia28 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
{"MultiMedia29 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
+ {"MultiMedia30 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
{"MultiMedia5 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
{"MultiMedia8 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
{"MultiMedia16 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
@@ -24611,6 +25822,7 @@
{"MultiMedia19 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"MultiMedia28 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"MultiMedia29 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+ {"MultiMedia30 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"MultiMedia5 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"MultiMedia6 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
{"MultiMedia8 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
@@ -24624,6 +25836,7 @@
{"MultiMedia19 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"MultiMedia28 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"MultiMedia29 Mixer", "AFE_PCM_TX", "PCM_TX"},
+ {"MultiMedia30 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"MultiMedia5 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"MultiMedia8 Mixer", "AFE_PCM_TX", "PCM_TX"},
{"MultiMedia16 Mixer", "AFE_PCM_TX", "PCM_TX"},
@@ -24646,6 +25859,7 @@
{"MM_UL27", NULL, "MultiMedia27 Mixer"},
{"MM_UL28", NULL, "MultiMedia28 Mixer"},
{"MM_UL29", NULL, "MultiMedia29 Mixer"},
+ {"MM_UL30", NULL, "MultiMedia30 Mixer"},
{"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
{"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
@@ -25117,10 +26331,12 @@
{"MM_UL19", NULL, "AUDIO_REF_EC_UL19 MUX"},
{"MM_UL28", NULL, "AUDIO_REF_EC_UL28 MUX"},
{"MM_UL29", NULL, "AUDIO_REF_EC_UL29 MUX"},
+ {"MM_UL30", NULL, "AUDIO_REF_EC_UL30 MUX"},
{"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"},
+ {"VoiceMMode1_Tx Mixer", "SEC_MI2S_TX_MMode1", "SEC_MI2S_TX"},
{"VoiceMMode1_Tx Mixer", "TERT_MI2S_TX_MMode1", "TERT_MI2S_TX"},
{"VoiceMMode1_Tx Mixer", "INT3_MI2S_TX_MMode1", "INT3_MI2S_TX"},
{"VoiceMMode1_Tx Mixer", "SLIM_0_TX_MMode1", "SLIMBUS_0_TX"},
@@ -25149,6 +26365,7 @@
{"VoiceMMode2_Tx Mixer", "PRI_TX_MMode2", "PRI_I2S_TX"},
{"VoiceMMode2_Tx Mixer", "PRI_MI2S_TX_MMode2", "PRI_MI2S_TX"},
+ {"VoiceMMode2_Tx Mixer", "SEC_MI2S_TX_MMode2", "SEC_MI2S_TX"},
{"VoiceMMode2_Tx Mixer", "MI2S_TX_MMode2", "MI2S_TX"},
{"VoiceMMode2_Tx Mixer", "TERT_MI2S_TX_MMode2", "TERT_MI2S_TX"},
{"VoiceMMode2_Tx Mixer", "INT3_MI2S_TX_MMode2", "INT3_MI2S_TX"},
@@ -25177,6 +26394,7 @@
{"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
{"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"},
+ {"Voip_Tx Mixer", "SEC_MI2S_TX_Voip", "SEC_MI2S_TX"},
{"Voip_Tx Mixer", "TERT_MI2S_TX_Voip", "TERT_MI2S_TX"},
{"Voip_Tx Mixer", "INT3_MI2S_TX_Voip", "INT3_MI2S_TX"},
{"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
@@ -25446,10 +26664,12 @@
{"QUIN_TDM_TX_1_UL_HL", NULL, "QUIN_TDM_TX_1"},
{"QUIN_TDM_TX_2_UL_HL", NULL, "QUIN_TDM_TX_2"},
{"QUIN_TDM_TX_3_UL_HL", NULL, "QUIN_TDM_TX_3"},
+ {"QUIN_TDM_TX_7_UL_HL", NULL, "QUIN_TDM_TX_7"},
{"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0_DL_HL"},
{"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"},
+ {"QUIN_TDM_RX_7", NULL, "QUIN_TDM_RX_7_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"},
@@ -25879,6 +27099,7 @@
{"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"},
+ {"QUAT_TDM_RX_7 Port Mixer", "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},
{"QUAT_TDM_RX_7", NULL, "QUAT_TDM_RX_7 Port Mixer"},
{"QUIN_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
@@ -25985,6 +27206,11 @@
{"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"},
+ {"QUIN_TDM_RX_7 Port Mixer", "TERT_TDM_TX_7", "TERT_TDM_TX_7"},
+ {"QUIN_TDM_RX_7 Port Mixer", "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},
+ {"QUIN_TDM_RX_7 Port Mixer", "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},
+ {"QUIN_TDM_RX_7", NULL, "QUIN_TDM_RX_7 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"},
@@ -26432,6 +27658,7 @@
{"BE_OUT", NULL, "QUIN_TDM_RX_1"},
{"BE_OUT", NULL, "QUIN_TDM_RX_2"},
{"BE_OUT", NULL, "QUIN_TDM_RX_3"},
+ {"BE_OUT", NULL, "QUIN_TDM_RX_7"},
{"BE_OUT", NULL, "SEN_TDM_RX_0"},
{"BE_OUT", NULL, "SEN_TDM_RX_1"},
{"BE_OUT", NULL, "SEN_TDM_RX_2"},
@@ -26523,6 +27750,7 @@
{"QUIN_TDM_TX_1", NULL, "BE_IN"},
{"QUIN_TDM_TX_2", NULL, "BE_IN"},
{"QUIN_TDM_TX_3", NULL, "BE_IN"},
+ {"QUIN_TDM_TX_7", NULL, "BE_IN"},
{"SEN_TDM_TX_0", NULL, "BE_IN"},
{"SEN_TDM_TX_1", NULL, "BE_IN"},
{"SEN_TDM_TX_2", NULL, "BE_IN"},
diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h
index 07b9752..bbfe509 100644
--- a/asoc/msm-pcm-routing-v2.h
+++ b/asoc/msm-pcm-routing-v2.h
@@ -260,6 +260,7 @@
MSM_FRONTEND_DAI_MULTIMEDIA27,
MSM_FRONTEND_DAI_MULTIMEDIA28,
MSM_FRONTEND_DAI_MULTIMEDIA29,
+ MSM_FRONTEND_DAI_MULTIMEDIA30,
MSM_FRONTEND_DAI_VOIP,
MSM_FRONTEND_DAI_AFE_RX,
MSM_FRONTEND_DAI_AFE_TX,
@@ -281,8 +282,8 @@
MSM_FRONTEND_DAI_MAX,
};
-#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA29 + 1)
-#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA29
+#define MSM_FRONTEND_DAI_MM_SIZE (MSM_FRONTEND_DAI_MULTIMEDIA30 + 1)
+#define MSM_FRONTEND_DAI_MM_MAX_ID MSM_FRONTEND_DAI_MULTIMEDIA30
enum {
MSM_BACKEND_DAI_PRI_I2S_RX = 0,
diff --git a/asoc/qcs405.c b/asoc/qcs405.c
index 089930e..cadcd40 100644
--- a/asoc/qcs405.c
+++ b/asoc/qcs405.c
@@ -6900,6 +6900,21 @@
.ignore_pmdown_time = 1,
.id = MSM_FRONTEND_DAI_MULTIMEDIA29,
},
+ {
+ .name = MSM_DAILINK_NAME(Compr Capture6),
+ .stream_name = "Compr Capture6",
+ .cpu_dai_name = "MultiMedia30",
+ .platform_name = "msm-compress-dsp",
+ .dynamic = 1,
+ .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
+ .dpcm_capture = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .ignore_pmdown_time = 1,
+ .id = MSM_FRONTEND_DAI_MULTIMEDIA30,
+ },
};
static struct snd_soc_dai_link msm_common_be_dai_links[] = {
diff --git a/asoc/sa6155.c b/asoc/sa6155.c
index ab4e842..269bb81 100644
--- a/asoc/sa6155.c
+++ b/asoc/sa6155.c
@@ -221,10 +221,10 @@
{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, 2}, /* RX_0 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_1 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_2 */
+ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* 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 */
@@ -275,7 +275,7 @@
{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, 6}, /* 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 */
@@ -431,7 +431,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {28, 0xFFFF},
}
};
@@ -486,7 +486,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {20, 0xFFFF},
}
};
@@ -547,7 +547,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {0, 0xFFFF},
}
};
@@ -601,7 +601,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {0, 0xFFFF},
}
};
@@ -4335,6 +4335,14 @@
rate->min = rate->max =
tdm_rx_cfg[TDM_QUIN][TDM_3].sample_rate;
break;
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ channels->min = channels->max =
+ tdm_rx_cfg[TDM_QUIN][TDM_7].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_rx_cfg[TDM_QUIN][TDM_7].bit_format);
+ rate->min = rate->max =
+ tdm_rx_cfg[TDM_QUIN][TDM_7].sample_rate;
+ break;
case AFE_PORT_ID_QUINARY_TDM_TX:
channels->min = channels->max =
tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
@@ -4367,6 +4375,14 @@
rate->min = rate->max =
tdm_tx_cfg[TDM_QUIN][TDM_3].sample_rate;
break;
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ channels->min = channels->max =
+ tdm_tx_cfg[TDM_QUIN][TDM_7].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_tx_cfg[TDM_QUIN][TDM_7].bit_format);
+ rate->min = rate->max =
+ tdm_tx_cfg[TDM_QUIN][TDM_7].sample_rate;
+ break;
default:
pr_err("%s: dai id 0x%x not supported\n",
__func__, cpu_dai->id);
@@ -4637,6 +4653,11 @@
slot_width = tdm_slot[TDM_QUIN].width;
slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_3];
break;
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ slots = tdm_slot[TDM_QUIN].num;
+ slot_width = tdm_slot[TDM_QUIN].width;
+ slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_7];
+ break;
case AFE_PORT_ID_QUINARY_TDM_TX:
slots = tdm_slot[TDM_QUIN].num;
slot_width = tdm_slot[TDM_QUIN].width;
@@ -4657,6 +4678,11 @@
slot_width = tdm_slot[TDM_QUIN].width;
slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_3];
break;
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ slots = tdm_slot[TDM_QUIN].num;
+ slot_width = tdm_slot[TDM_QUIN].width;
+ slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_7];
+ break;
default:
pr_err("%s: dai id 0x%x not supported\n",
__func__, cpu_dai->id);
@@ -4771,12 +4797,15 @@
intf_conf = &pdata->tdm_intf_conf[index];
mutex_lock(&intf_conf->lock);
if (++intf_conf->ref_cnt == 1) {
- pinctrl_info = &pdata->pinctrl_info[index];
- ret_pinctrl = msm_set_pinctrl(pinctrl_info,
- STATE_ACTIVE);
- if (ret_pinctrl)
- pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
- __func__, ret_pinctrl);
+ if (index == TDM_TERT || index == TDM_QUAT ||
+ index == TDM_QUIN) {
+ pinctrl_info = &pdata->pinctrl_info[index];
+ ret_pinctrl = msm_set_pinctrl(pinctrl_info,
+ STATE_ACTIVE);
+ if (ret_pinctrl)
+ pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
+ __func__, ret_pinctrl);
+ }
}
mutex_unlock(&intf_conf->lock);
@@ -4808,12 +4837,15 @@
intf_conf = &pdata->tdm_intf_conf[index];
mutex_lock(&intf_conf->lock);
if (--intf_conf->ref_cnt == 0) {
- pinctrl_info = &pdata->pinctrl_info[index];
- ret_pinctrl = msm_set_pinctrl(pinctrl_info,
- STATE_SLEEP);
- if (ret_pinctrl)
- pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
- __func__, ret_pinctrl);
+ if (index == TDM_TERT || index == TDM_QUAT ||
+ index == TDM_QUIN) {
+ pinctrl_info = &pdata->pinctrl_info[index];
+ ret_pinctrl = msm_set_pinctrl(pinctrl_info,
+ STATE_SLEEP);
+ if (ret_pinctrl)
+ pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
+ __func__, ret_pinctrl);
+ }
}
mutex_unlock(&intf_conf->lock);
}
@@ -5805,6 +5837,36 @@
.codec_dai_name = "snd-soc-dummy-dai",
.codec_name = "snd-soc-dummy",
},
+ {
+ .name = "Quinary TDM RX 7 Hostless",
+ .stream_name = "Quinary TDM RX 7 Hostless",
+ .cpu_dai_name = "QUIN_TDM_RX_7_HOSTLESS",
+ .platform_name = "msm-pcm-hostless",
+ .dynamic = 1,
+ .dpcm_playback = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ },
+ {
+ .name = "Quinary TDM TX 7 Hostless",
+ .stream_name = "Quinary TDM TX 7 Hostless",
+ .cpu_dai_name = "QUIN_TDM_TX_7_HOSTLESS",
+ .platform_name = "msm-pcm-hostless",
+ .dynamic = 1,
+ .dpcm_capture = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ },
};
static struct snd_soc_dai_link msm_custom_fe_dai_links[] = {
@@ -6666,6 +6728,34 @@
.ops = &sa6155_tdm_be_ops,
.ignore_suspend = 1,
},
+ {
+ .name = LPASS_BE_QUIN_TDM_RX_7,
+ .stream_name = "Quinary TDM7 Playback",
+ .cpu_dai_name = "msm-dai-q6-tdm.36942",
+ .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_7,
+ .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
+ .ops = &sa6155_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_TDM_TX_7,
+ .stream_name = "Quinary TDM7 Capture",
+ .cpu_dai_name = "msm-dai-q6-tdm.36943",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUIN_TDM_TX_7,
+ .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
+ .ops = &sa6155_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
};
static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
diff --git a/asoc/sa8155.c b/asoc/sa8155.c
index b655572..054083d 100644
--- a/asoc/sa8155.c
+++ b/asoc/sa8155.c
@@ -49,6 +49,7 @@
#include <dsp/audio_notifier.h>
#include <dsp/q6afe-v2.h>
#include <dsp/q6core.h>
+#include <soc/qcom/boot_stats.h>
#include "device_event.h"
#include "msm-pcm-routing-v2.h"
@@ -423,7 +424,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {28, 0xFFFF},
}
};
@@ -478,7 +479,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {20, 0xFFFF},
}
};
@@ -539,7 +540,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {0, 0xFFFF},
}
};
@@ -593,7 +594,7 @@
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
- {0xFFFF}, /* not used */
+ {0, 0xFFFF},
}
};
@@ -4327,6 +4328,14 @@
rate->min = rate->max =
tdm_rx_cfg[TDM_QUIN][TDM_3].sample_rate;
break;
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ channels->min = channels->max =
+ tdm_rx_cfg[TDM_QUIN][TDM_7].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_rx_cfg[TDM_QUIN][TDM_7].bit_format);
+ rate->min = rate->max =
+ tdm_rx_cfg[TDM_QUIN][TDM_7].sample_rate;
+ break;
case AFE_PORT_ID_QUINARY_TDM_TX:
channels->min = channels->max =
tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
@@ -4359,6 +4368,14 @@
rate->min = rate->max =
tdm_tx_cfg[TDM_QUIN][TDM_3].sample_rate;
break;
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ channels->min = channels->max =
+ tdm_tx_cfg[TDM_QUIN][TDM_7].channels;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ tdm_tx_cfg[TDM_QUIN][TDM_7].bit_format);
+ rate->min = rate->max =
+ tdm_tx_cfg[TDM_QUIN][TDM_7].sample_rate;
+ break;
default:
pr_err("%s: dai id 0x%x not supported\n",
__func__, cpu_dai->id);
@@ -4629,6 +4646,11 @@
slot_width = tdm_slot[TDM_QUIN].width;
slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_3];
break;
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ slots = tdm_slot[TDM_QUIN].num;
+ slot_width = tdm_slot[TDM_QUIN].width;
+ slot_offset = tdm_rx_slot_offset[TDM_QUIN][TDM_7];
+ break;
case AFE_PORT_ID_QUINARY_TDM_TX:
slots = tdm_slot[TDM_QUIN].num;
slot_width = tdm_slot[TDM_QUIN].width;
@@ -4649,6 +4671,11 @@
slot_width = tdm_slot[TDM_QUIN].width;
slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_3];
break;
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ slots = tdm_slot[TDM_QUIN].num;
+ slot_width = tdm_slot[TDM_QUIN].width;
+ slot_offset = tdm_tx_slot_offset[TDM_QUIN][TDM_7];
+ break;
default:
pr_err("%s: dai id 0x%x not supported\n",
__func__, cpu_dai->id);
@@ -5797,6 +5824,36 @@
.codec_dai_name = "snd-soc-dummy-dai",
.codec_name = "snd-soc-dummy",
},
+ {
+ .name = "Quinary TDM RX 7 Hostless",
+ .stream_name = "Quinary TDM RX 7 Hostless",
+ .cpu_dai_name = "QUIN_TDM_RX_7_HOSTLESS",
+ .platform_name = "msm-pcm-hostless",
+ .dynamic = 1,
+ .dpcm_playback = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ },
+ {
+ .name = "Quinary TDM TX 7 Hostless",
+ .stream_name = "Quinary TDM TX 7 Hostless",
+ .cpu_dai_name = "QUIN_TDM_TX_7_HOSTLESS",
+ .platform_name = "msm-pcm-hostless",
+ .dynamic = 1,
+ .dpcm_capture = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_suspend = 1,
+ .ignore_pmdown_time = 1,
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ },
};
static struct snd_soc_dai_link msm_custom_fe_dai_links[] = {
@@ -6658,6 +6715,34 @@
.ops = &sa8155_tdm_be_ops,
.ignore_suspend = 1,
},
+ {
+ .name = LPASS_BE_QUIN_TDM_RX_7,
+ .stream_name = "Quinary TDM7 Playback",
+ .cpu_dai_name = "msm-dai-q6-tdm.36942",
+ .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_7,
+ .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
+ .ops = &sa8155_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUIN_TDM_TX_7,
+ .stream_name = "Quinary TDM7 Capture",
+ .cpu_dai_name = "msm-dai-q6-tdm.36943",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .id = MSM_BACKEND_DAI_QUIN_TDM_TX_7,
+ .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
+ .ops = &sa8155_tdm_be_ops,
+ .ignore_suspend = 1,
+ },
};
static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
@@ -7309,7 +7394,7 @@
goto err;
}
- dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__);
+ dev_info(dev, "%s: setting snd_card to ONLINE\n", __func__);
snd_soc_card_change_online_state(card, 1);
err:
@@ -7326,7 +7411,7 @@
return;
}
- dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__);
+ dev_info(dev, "%s: setting snd_card to OFFLINE\n", __func__);
snd_soc_card_change_online_state(card, 0);
}
@@ -7374,6 +7459,12 @@
struct msm_asoc_mach_data *pdata;
int ret;
enum apr_subsys_state q6_state;
+ static int first_probe = 1;
+
+ if (first_probe) {
+ place_marker("M - DRIVER Audio Init");
+ first_probe = 0;
+ }
if (!pdev->dev.of_node) {
dev_err(&pdev->dev, "No platform supplied from device tree\n");
@@ -7453,6 +7544,7 @@
pr_err("%s: Registration with SND event FWK failed ret = %d\n",
__func__, ret);
+ place_marker("M - DRIVER Audio Ready");
return 0;
err:
msm_release_pinctrl(pdev);
diff --git a/config/qcs405auto.conf b/config/qcs405auto.conf
index afa8140..61620eb 100644
--- a/config/qcs405auto.conf
+++ b/config/qcs405auto.conf
@@ -36,4 +36,3 @@
CONFIG_MSM_AVTIMER=m
CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m
CONFIG_SND_SOC_EP92=m
-CONFIG_USE_Q6_32CH_SUPPORT=m
diff --git a/config/qcs405autoconf.h b/config/qcs405autoconf.h
index 0a2e286..04f1e10 100644
--- a/config/qcs405autoconf.h
+++ b/config/qcs405autoconf.h
@@ -1,5 +1,5 @@
/* 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.
*/
#define CONFIG_PINCTRL_LPI 1
@@ -40,4 +40,3 @@
#define CONFIG_MSM_AVTIMER 1
#define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1
#define CONFIG_SND_SOC_EP92 1
-#define CONFIG_USE_Q6_32CH_SUPPORT 1
diff --git a/dsp/Android.mk b/dsp/Android.mk
index e0dc0a0..392752d 100644
--- a/dsp/Android.mk
+++ b/dsp/Android.mk
@@ -29,7 +29,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/dsp/adsp-loader.c b/dsp/adsp-loader.c
index 881e360..ef9d92d 100644
--- a/dsp/adsp-loader.c
+++ b/dsp/adsp-loader.c
@@ -13,13 +13,16 @@
#include <linux/of_device.h>
#include <linux/sysfs.h>
#include <linux/workqueue.h>
-
+#include <linux/nvmem-consumer.h>
+#include <linux/slab.h>
#include <soc/qcom/subsystem_restart.h>
#define Q6_PIL_GET_DELAY_MS 100
#define BOOT_CMD 1
#define SSR_RESET_CMD 1
#define IMAGE_UNLOAD_CMD 0
+#define MAX_FW_IMAGES 4
+#define ADSP_FW_NAME_MAX_LENGTH 5
static ssize_t adsp_boot_store(struct kobject *kobj,
struct kobj_attribute *attr,
@@ -33,6 +36,7 @@
void *pil_h;
struct kobject *boot_adsp_obj;
struct attribute_group *attr_group;
+ char *adsp_fw_name;
};
static struct kobj_attribute adsp_boot_attribute =
@@ -55,7 +59,6 @@
{
struct platform_device *pdev = adsp_private;
struct adsp_loader_private *priv = NULL;
-
const char *adsp_dt = "qcom,adsp-state";
int rc = 0;
u32 adsp_state;
@@ -118,6 +121,7 @@
dev_dbg(&pdev->dev, "%s: Q6/MDSP image is loaded\n", __func__);
return;
}
+
load_adsp:
{
adsp_state = apr_get_q6_state();
@@ -128,8 +132,16 @@
" %s: Private data get failed\n", __func__);
goto fail;
}
+ if (!priv->adsp_fw_name) {
+ dev_dbg(&pdev->dev, "%s: Load default ADSP\n",
+ __func__);
+ priv->pil_h = subsystem_get("adsp");
+ } else {
+ dev_dbg(&pdev->dev, "%s: Load ADSP with fw name %s\n",
+ __func__, priv->adsp_fw_name);
+ priv->pil_h = subsystem_get_with_fwname("adsp", priv->adsp_fw_name);
+ }
- priv->pil_h = subsystem_get("adsp");
if (IS_ERR(priv->pil_h)) {
dev_err(&pdev->dev, "%s: pil get failed,\n",
__func__);
@@ -310,16 +322,99 @@
static int adsp_loader_probe(struct platform_device *pdev)
{
- int ret = adsp_loader_init_sysfs(pdev);
+ struct adsp_loader_private *priv = NULL;
+ struct nvmem_cell *cell;
+ ssize_t len;
+ u32 *buf;
+ const char **adsp_fw_name_array = NULL;
+ int adsp_fw_cnt;
+ u32* adsp_fw_bit_values = NULL;
+ int i;
+ u32 adsp_var_idx;
+ int ret = 0;
+ ret = adsp_loader_init_sysfs(pdev);
if (ret != 0) {
dev_err(&pdev->dev, "%s: Error in initing sysfs\n", __func__);
return ret;
}
- INIT_WORK(&adsp_ldr_work, adsp_load_fw);
+ priv = platform_get_drvdata(pdev);
+ /* get adsp variant idx */
+ cell = nvmem_cell_get(&pdev->dev, "adsp_variant");
+ if (IS_ERR_OR_NULL(cell)) {
+ dev_dbg(&pdev->dev, "%s: FAILED to get nvmem cell \n", __func__);
+ goto wqueue;
+ }
+ buf = nvmem_cell_read(cell, &len);
+ nvmem_cell_put(cell);
+ if (IS_ERR_OR_NULL(buf)) {
+ dev_dbg(&pdev->dev, "%s: FAILED to read nvmem cell \n", __func__);
+ goto wqueue;
+ }
+ adsp_var_idx = (*buf);
+ kfree(buf);
+ /* Get count of fw images */
+ adsp_fw_cnt = of_property_count_strings(pdev->dev.of_node,
+ "adsp-fw-names");
+ if (adsp_fw_cnt <= 0 || adsp_fw_cnt > MAX_FW_IMAGES) {
+ dev_dbg(&pdev->dev, "%s: Invalid number of fw images %d",
+ __func__, adsp_fw_cnt);
+ goto wqueue;
+ }
+
+ adsp_fw_bit_values = devm_kzalloc(&pdev->dev,
+ adsp_fw_cnt * sizeof(u32), GFP_KERNEL);
+ if (!adsp_fw_bit_values)
+ goto wqueue;
+
+ /* Read bit values corresponding to each firmware image entry */
+ ret = of_property_read_u32_array(pdev->dev.of_node,
+ "adsp-fw-bit-values",
+ adsp_fw_bit_values,
+ adsp_fw_cnt);
+ if (ret) {
+ dev_dbg(&pdev->dev, "%s: unable to read fw-bit-values\n",
+ __func__);
+ goto wqueue;
+ }
+
+ adsp_fw_name_array = devm_kzalloc(&pdev->dev,
+ adsp_fw_cnt * sizeof(char *), GFP_KERNEL);
+ if (!adsp_fw_name_array)
+ goto wqueue;
+
+ /* Read ADSP firmware image names */
+ ret = of_property_read_string_array(pdev->dev.of_node,
+ "adsp-fw-names",
+ adsp_fw_name_array,
+ adsp_fw_cnt);
+ if (ret < 0) {
+ dev_dbg(&pdev->dev, "%s: unable to read fw-names\n",
+ __func__);
+ goto wqueue;
+ }
+
+ for (i = 0; i < adsp_fw_cnt; i++) {
+ if (adsp_fw_bit_values[i] == adsp_var_idx) {
+ priv->adsp_fw_name = devm_kzalloc(&pdev->dev,
+ ADSP_FW_NAME_MAX_LENGTH, GFP_KERNEL);
+ if (!priv->adsp_fw_name)
+ goto wqueue;
+ strlcpy(priv->adsp_fw_name, adsp_fw_name_array[i],
+ sizeof(priv->adsp_fw_name));
+ break;
+ }
+ }
+wqueue:
+ INIT_WORK(&adsp_ldr_work, adsp_load_fw);
+ if (adsp_fw_bit_values)
+ devm_kfree(&pdev->dev, adsp_fw_bit_values);
+ if (adsp_fw_name_array)
+ devm_kfree(&pdev->dev, adsp_fw_name_array);
return 0;
+
}
static const struct of_device_id adsp_loader_dt_match[] = {
diff --git a/dsp/avtimer.c b/dsp/avtimer.c
index 554f030..8d9402c 100644
--- a/dsp/avtimer.c
+++ b/dsp/avtimer.c
@@ -309,6 +309,61 @@
}
EXPORT_SYMBOL(avcs_core_query_timer);
+/*
+ * avcs_core_query_timer_offset:
+ * derive offset between system clock & avtimer clock
+ *
+ * @ avoffset: offset between system clock & avtimer clock
+ * @ clock_id: clock id to get the system time
+ *
+ */
+int avcs_core_query_timer_offset(int64_t *av_offset, int32_t clock_id)
+{
+ uint32_t avtimer_msw = 0, avtimer_lsw = 0;
+ uint64_t avtimer_tick_temp, avtimer_tick, sys_time = 0;
+ struct timespec ts;
+
+ if ((avtimer.p_avtimer_lsw == NULL) ||
+ (avtimer.p_avtimer_msw == NULL)) {
+ return -EINVAL;
+ }
+
+ memset(&ts, 0, sizeof(struct timespec));
+ avtimer_lsw = ioread32(avtimer.p_avtimer_lsw);
+ avtimer_msw = ioread32(avtimer.p_avtimer_msw);
+
+ switch (clock_id) {
+ case CLOCK_MONOTONIC_RAW:
+ getrawmonotonic(&ts);
+ break;
+ case CLOCK_BOOTTIME:
+ get_monotonic_boottime(&ts);
+ break;
+ case CLOCK_MONOTONIC:
+ ktime_get_ts(&ts);
+ break;
+ case CLOCK_REALTIME:
+ ktime_get_real_ts(&ts);
+ break;
+ default:
+ pr_debug("%s: unsupported clock id %d\n", __func__, clock_id);
+ return -EINVAL;
+ }
+
+ sys_time = ts.tv_sec * 1000000LL + div64_u64(ts.tv_nsec, 1000);
+ avtimer_tick_temp = (uint64_t)((uint64_t)avtimer_msw << 32) |
+ avtimer_lsw;
+
+ avtimer_tick = mul_u64_u32_div(avtimer_tick_temp, avtimer.clk_mult,
+ avtimer.clk_div);
+ *av_offset = sys_time - avtimer_tick;
+ pr_debug("%s: sys_time: %llu, offset %lld, avtimer tick %lld\n",
+ __func__, sys_time, *av_offset, avtimer_tick);
+
+ return 0;
+}
+EXPORT_SYMBOL(avcs_core_query_timer_offset);
+
#if IS_ENABLED(CONFIG_AVTIMER_LEGACY)
static void avcs_set_isp_fptr(bool enable)
{
diff --git a/dsp/codecs/Android.mk b/dsp/codecs/Android.mk
index 6550717..2a4482e 100644
--- a/dsp/codecs/Android.mk
+++ b/dsp/codecs/Android.mk
@@ -21,7 +21,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/dsp/msm_audio_ion_vm.c b/dsp/msm_audio_ion_vm.c
index fc6039a..f9635b3 100644
--- a/dsp/msm_audio_ion_vm.c
+++ b/dsp/msm_audio_ion_vm.c
@@ -647,6 +647,31 @@
}
EXPORT_SYMBOL(msm_audio_ion_alloc);
+int msm_audio_ion_phys_free(void *handle,
+ dma_addr_t *paddr,
+ size_t *pa_len,
+ u8 assign_type,
+ int id,
+ int key)
+{
+ handle = NULL;
+ return 0;
+}
+EXPORT_SYMBOL(msm_audio_ion_phys_free);
+
+int msm_audio_ion_phys_assign(void **handle, int fd,
+ dma_addr_t *paddr, size_t *pa_len, u8 assign_type, int id)
+{
+ *handle = NULL;
+ return 0;
+}
+EXPORT_SYMBOL(msm_audio_ion_phys_assign);
+
+bool msm_audio_is_hypervisor_supported(void)
+{
+ return false;
+}
+EXPORT_SYMBOL(msm_audio_is_hypervisor_supported);
/**
* msm_audio_ion_import-
* Import ION buffer with given file descriptor
diff --git a/dsp/q6adm.c b/dsp/q6adm.c
index 29bf67f..6dbbbc0 100644
--- a/dsp/q6adm.c
+++ b/dsp/q6adm.c
@@ -42,6 +42,8 @@
#define DS2_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFF
#endif
+#define SESSION_TYPE_RX 0
+
/* ENUM for adm_status */
enum adm_cal_status {
ADM_STATUS_CALIBRATION_REQUIRED = 0,
@@ -573,7 +575,7 @@
adm_pspd_params[3] = ch_mixer->input_channels[channel_index];
index = 4;
- path_type = (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) ?
+ path_type = (session_type == SESSION_TYPE_RX) ?
ADM_PATH_PLAYBACK : ADM_PATH_LIVE_REC;
if (ch_mixer->override_out_ch_map) {
@@ -2684,6 +2686,39 @@
ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC;
ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC;
ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC;
+ } else if (channel_mode == 32) {
+ ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL;
+ ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR;
+ ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE;
+ ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC;
+ ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS;
+ ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS;
+ ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB;
+ ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB;
+ ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS;
+ ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS;
+ ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH;
+ ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS;
+ ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC;
+ ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC;
+ ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC;
+ ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC;
+ ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2;
+ ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL;
+ ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR;
+ ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL;
+ ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR;
+ ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC;
+ ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL;
+ ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR;
+ ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL;
+ ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR;
+ ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC;
+ ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC;
+ ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL;
+ ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR;
+ ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW;
+ ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW;
} else {
pr_err("%s: invalid num_chan %d\n", __func__,
channel_mode);
@@ -2783,6 +2818,39 @@
ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC;
ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC;
ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC;
+ } else if (channel_mode == 32) {
+ ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL;
+ ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR;
+ ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE;
+ ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC;
+ ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS;
+ ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS;
+ ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB;
+ ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB;
+ ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS;
+ ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS;
+ ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH;
+ ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS;
+ ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC;
+ ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC;
+ ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC;
+ ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC;
+ ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2;
+ ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL;
+ ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR;
+ ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL;
+ ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR;
+ ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC;
+ ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL;
+ ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR;
+ ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL;
+ ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR;
+ ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC;
+ ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC;
+ ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL;
+ ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR;
+ ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW;
+ ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW;
} else {
pr_err("%s: invalid num_chan %d\n", __func__,
channel_mode);
@@ -3069,8 +3137,7 @@
if ((q6core_get_avcs_api_version_per_service(
APRV2_IDS_SERVICE_ID_ADSP_ADM_V) >=
- ADSP_ADM_API_VERSION_V3) &&
- q6core_use_Q6_32ch_support()) {
+ ADSP_ADM_API_VERSION_V3)) {
memset(&open_v8, 0, sizeof(open_v8));
memset(&ep1_payload, 0, sizeof(ep1_payload));
memset(&ep2_payload, 0, sizeof(ep2_payload));
@@ -3106,6 +3173,7 @@
if (this_adm.num_ec_ref_rx_chans != 0) {
open_v8.endpoint_id_2 =
this_adm.ec_ref_rx;
+ this_adm.ec_ref_rx = AFE_PORT_INVALID;
} else {
pr_err("%s: EC channels not set %d\n",
__func__,
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 6f4aece..da87fb8 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -3364,6 +3364,36 @@
return ret;
}
+int afe_send_slot_mapping_cfg_v2(
+ struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_cfg,
+ u16 port_id)
+{
+ struct param_hdr_v3 param_hdr;
+ int ret = 0;
+
+ if (!slot_mapping_cfg) {
+ pr_err("%s: Error, no configuration data\n", __func__);
+ return -EINVAL;
+ }
+
+ pr_debug("%s: port id: 0x%x\n", __func__, port_id);
+
+ memset(¶m_hdr, 0, sizeof(param_hdr));
+ param_hdr.module_id = AFE_MODULE_TDM;
+ param_hdr.instance_id = INSTANCE_ID_0;
+ param_hdr.param_id = AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG;
+ param_hdr.param_size = sizeof(struct afe_param_id_slot_mapping_cfg_v2);
+
+ ret = q6afe_pack_and_set_param_in_band(port_id,
+ q6audio_get_port_index(port_id),
+ param_hdr,
+ (u8 *) slot_mapping_cfg);
+ if (ret < 0)
+ pr_err("%s: AFE send slot mapping for port 0x%x failed ret = %d\n",
+ __func__, port_id, ret);
+ return ret;
+}
+
int afe_send_custom_tdm_header_cfg(
struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg,
u16 port_id)
@@ -3503,8 +3533,15 @@
goto fail_cmd;
}
- ret = afe_send_slot_mapping_cfg(&tdm_port->slot_mapping,
- port_id);
+ if (q6core_get_avcs_api_version_per_service(
+ APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3)
+ ret = afe_send_slot_mapping_cfg_v2(
+ &tdm_port->slot_mapping_v2, port_id);
+ else
+ ret = afe_send_slot_mapping_cfg(
+ &tdm_port->slot_mapping,
+ port_id);
+
if (ret < 0) {
pr_err("%s: afe send failed %d\n", __func__, ret);
goto fail_cmd;
diff --git a/dsp/q6asm.c b/dsp/q6asm.c
index 79ac3c9..475e045 100644
--- a/dsp/q6asm.c
+++ b/dsp/q6asm.c
@@ -1868,12 +1868,20 @@
switch (cmdrsp->param_info.param_id) {
case ASM_SESSION_MTMX_STRTR_PARAM_SESSION_TIME_V3:
time = &cmdrsp->param_data.session_time;
- dev_vdbg(ac->dev, "%s: GET_TIME_V3, time_lsw=%x, time_msw=%x\n",
+ dev_vdbg(ac->dev, "%s: GET_TIME_V3, time_lsw=%x, time_msw=%x, abs l %x, m %x\n",
__func__, time->session_time_lsw,
- time->session_time_msw);
- ac->time_stamp = (uint64_t)(((uint64_t)
+ time->session_time_msw,
+ time->absolute_time_lsw,
+ time->absolute_time_msw);
+ ac->dsp_ts.abs_time_stamp = (uint64_t)(((uint64_t)
+ time->absolute_time_msw << 32) |
+ time->absolute_time_lsw);
+ ac->dsp_ts.time_stamp = (uint64_t)(((uint64_t)
time->session_time_msw << 32) |
time->session_time_lsw);
+ ac->dsp_ts.last_time_stamp = (uint64_t)(((uint64_t)
+ time->time_stamp_msw << 32) |
+ time->time_stamp_lsw);
if (time->flags &
ASM_SESSION_MTMX_STRTR_PARAM_STIME_TSTMP_FLG_BMASK)
dev_warn_ratelimited(ac->dev,
@@ -2361,8 +2369,9 @@
dev_vdbg(ac->dev, "%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3, payload[0] = %d, payload[1] = %d, payload[2] = %d\n",
__func__,
payload[0], payload[1], payload[2]);
- ac->time_stamp = (uint64_t)(((uint64_t)payload[2] << 32) |
- payload[1]);
+ ac->dsp_ts.time_stamp =
+ (uint64_t)(((uint64_t)payload[2] << 32) |
+ payload[1]);
} else {
dev_err(ac->dev, "%s: payload size of %x is less than expected.n",
__func__, data->payload_size);
@@ -5766,6 +5775,39 @@
lchannel_mapping[13] = PCM_CHANNEL_FRC;
lchannel_mapping[14] = PCM_CHANNEL_RLC;
lchannel_mapping[15] = PCM_CHANNEL_RRC;
+ } else if (channels == 32) {
+ lchannel_mapping[0] = PCM_CHANNEL_FL;
+ lchannel_mapping[1] = PCM_CHANNEL_FR;
+ lchannel_mapping[2] = PCM_CHANNEL_LFE;
+ lchannel_mapping[3] = PCM_CHANNEL_FC;
+ lchannel_mapping[4] = PCM_CHANNEL_LS;
+ lchannel_mapping[5] = PCM_CHANNEL_RS;
+ lchannel_mapping[6] = PCM_CHANNEL_LB;
+ lchannel_mapping[7] = PCM_CHANNEL_RB;
+ lchannel_mapping[8] = PCM_CHANNEL_CS;
+ lchannel_mapping[9] = PCM_CHANNEL_TS;
+ lchannel_mapping[10] = PCM_CHANNEL_CVH;
+ lchannel_mapping[11] = PCM_CHANNEL_MS;
+ lchannel_mapping[12] = PCM_CHANNEL_FLC;
+ lchannel_mapping[13] = PCM_CHANNEL_FRC;
+ lchannel_mapping[14] = PCM_CHANNEL_RLC;
+ lchannel_mapping[15] = PCM_CHANNEL_RRC;
+ lchannel_mapping[16] = PCM_CHANNEL_LFE2;
+ lchannel_mapping[17] = PCM_CHANNEL_SL;
+ lchannel_mapping[18] = PCM_CHANNEL_SR;
+ lchannel_mapping[19] = PCM_CHANNEL_TFL;
+ lchannel_mapping[20] = PCM_CHANNEL_TFR;
+ lchannel_mapping[21] = PCM_CHANNEL_TC;
+ lchannel_mapping[22] = PCM_CHANNEL_TBL;
+ lchannel_mapping[23] = PCM_CHANNEL_TBR;
+ lchannel_mapping[24] = PCM_CHANNEL_TSL;
+ lchannel_mapping[25] = PCM_CHANNEL_TSR;
+ lchannel_mapping[26] = PCM_CHANNEL_TBC;
+ lchannel_mapping[27] = PCM_CHANNEL_BFC;
+ lchannel_mapping[28] = PCM_CHANNEL_BFL;
+ lchannel_mapping[29] = PCM_CHANNEL_BFR;
+ lchannel_mapping[30] = PCM_CHANNEL_LW;
+ lchannel_mapping[31] = PCM_CHANNEL_RW;
} else {
pr_err("%s: ERROR.unsupported num_ch = %u\n",
__func__, channels);
@@ -9762,15 +9804,17 @@
EXPORT_SYMBOL(q6asm_write_nolock);
/**
- * q6asm_get_session_time -
+ * q6asm_get_session_time_v2 -
* command to retrieve timestamp info
*
* @ac: Audio client handle
- * @tstamp: pointer to fill with timestamp info
+ * @ses_time: pointer to fill with session timestamp info
+ * @abs_time: pointer to fill with AVS timestamp info
*
* Returns 0 on success or error on failure
*/
-int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp)
+int q6asm_get_session_time_v2(struct audio_client *ac, uint64_t *ses_time,
+ uint64_t *abs_time)
{
struct asm_mtmx_strtr_get_params mtmx_params;
int rc;
@@ -9783,8 +9827,8 @@
pr_err("%s: AC APR handle NULL\n", __func__);
return -EINVAL;
}
- if (tstamp == NULL) {
- pr_err("%s: tstamp NULL\n", __func__);
+ if (ses_time == NULL) {
+ pr_err("%s: tstamp args are NULL\n", __func__);
return -EINVAL;
}
@@ -9822,12 +9866,29 @@
goto fail_cmd;
}
- *tstamp = ac->time_stamp;
+ *ses_time = ac->dsp_ts.time_stamp;
+ if (abs_time != NULL)
+ *abs_time = ac->dsp_ts.abs_time_stamp;
return 0;
fail_cmd:
return -EINVAL;
}
+EXPORT_SYMBOL(q6asm_get_session_time_v2);
+
+/**
+ * q6asm_get_session_time -
+ * command to retrieve timestamp info
+ *
+ * @ac: Audio client handle
+ * @tstamp: pointer to fill with timestamp info
+ *
+ * Returns 0 on success or error on failure
+ */
+int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp)
+{
+ return q6asm_get_session_time_v2(ac, tstamp, NULL);
+}
EXPORT_SYMBOL(q6asm_get_session_time);
/**
@@ -9879,7 +9940,7 @@
goto fail_cmd;
}
- *tstamp = ac->time_stamp;
+ *tstamp = ac->dsp_ts.time_stamp;
return 0;
fail_cmd:
diff --git a/dsp/q6core.c b/dsp/q6core.c
index 43f6e25..68fe9e5 100644
--- a/dsp/q6core.c
+++ b/dsp/q6core.c
@@ -1795,6 +1795,8 @@
timeout = jiffies +
msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS);
+ /* sleep for 100ms before querying AVS up */
+ msleep(100);
do {
adsp_ready = q6core_is_adsp_ready();
pr_debug("%s: ADSP Audio is %s\n", __func__,
diff --git a/dsp/q6voice.c b/dsp/q6voice.c
index 131da55..6de6686 100644
--- a/dsp/q6voice.c
+++ b/dsp/q6voice.c
@@ -51,6 +51,7 @@
{CVD_VERSION_2_1, CVD_INT_VERSION_2_1},
{CVD_VERSION_2_2, CVD_INT_VERSION_2_2},
{CVD_VERSION_2_3, CVD_INT_VERSION_2_3},
+ {CVD_VERSION_2_4, CVD_INT_VERSION_2_4},
};
static struct common_data common;
diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h
index 99b9a45..cfac065 100644
--- a/include/dsp/apr_audio-v2.h
+++ b/include/dsp/apr_audio-v2.h
@@ -3191,6 +3191,8 @@
#define AFE_PORT_MAX_AUDIO_CHAN_CNT 0x8
+#define AFE_PORT_MAX_AUDIO_CHAN_CNT_V2 0x20
+
/* Payload of the #AFE_PORT_CMD_SLIMBUS_CONFIG command's SLIMbus
* port configuration parameter.
*/
@@ -3649,6 +3651,10 @@
*/
#define AFE_API_VERSION_SLOT_MAPPING_CONFIG 0x1
+/** Version information used to handle future additions to slot mapping
+* configuration support 32 channels.
+*/
+#define AFE_API_VERSION_SLOT_MAPPING_CONFIG_V2 0x2
/* Data align type */
#define AFE_SLOT_MAPPING_DATA_ALIGN_MSB 0
#define AFE_SLOT_MAPPING_DATA_ALIGN_LSB 1
@@ -3698,9 +3704,52 @@
*/
} __packed;
-/* ID of the parameter used by #AFE_MODULE_TDM to configure
- * the customer TDM header. #AFE_PORT_CMD_SET_PARAM can use this parameter ID.
- */
+/* Payload of the AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG_V2
+* command's TDM configuration parameter.
+*/
+struct afe_param_id_slot_mapping_cfg_v2 {
+ u32 minor_version;
+ /**< Minor version used for tracking TDM slot configuration.
+ * @values #AFE_API_VERSION_TDM_SLOT_CONFIG
+ */
+
+ u16 num_channel;
+ /**< number of channel of the audio sample.
+ * @values 1, 2, 4, 6, 8, 16, 32 @tablebulletend
+ */
+
+ u16 bitwidth;
+ /**< Slot bit width for each channel
+ * @values 16, 24, 32
+ */
+
+ u32 data_align_type;
+ /**< indicate how data packed from slot_offset for 32 slot bit width
+ * in case of sample bit width is 24.
+ * @values
+ * #AFE_SLOT_MAPPING_DATA_ALIGN_MSB
+ * #AFE_SLOT_MAPPING_DATA_ALIGN_LSB
+ */
+
+ u16 offset[AFE_PORT_MAX_AUDIO_CHAN_CNT_V2];
+ /**< Array of the slot mapping start offset in bytes for this frame.
+ * The bytes is counted from 0. The 0 is mapped to the 1st byte
+ * in or out of the digital serial data line this sub-frame belong to.
+ * slot_offset[] setting is per-channel based.
+ * The max num of channel supported is 8.
+ * The valid offset value must always be continuly placed in
+ * from index 0.
+ * Set offset as AFE_SLOT_MAPPING_OFFSET_INVALID for not used arrays.
+ * If "slot_bitwidth_per_channel" is 32 and "sample_bitwidth" is 24,
+ * "data_align_type" is used to indicate how 24 bit sample data in
+ * aligning with 32 bit slot width per-channel.
+ * @values, in byte
+ */
+} __packed;
+
+/** ID of the parameter used by #AFE_MODULE_TDM to configure
+ the customer TDM header. #AFE_PORT_CMD_SET_PARAM can use this parameter ID.
+*/
#define AFE_PARAM_ID_CUSTOM_TDM_HEADER_CONFIG 0x00010298
/* Version information used to handle future additions to custom TDM header
@@ -3768,6 +3817,7 @@
struct afe_tdm_port_config {
struct afe_param_id_tdm_cfg tdm;
struct afe_param_id_slot_mapping_cfg slot_mapping;
+ struct afe_param_id_slot_mapping_cfg_v2 slot_mapping_v2;
struct afe_param_id_custom_tdm_header_cfg custom_tdm_header;
} __packed;
diff --git a/include/dsp/q6asm-v2.h b/include/dsp/q6asm-v2.h
index de7e31b..5db8fde 100644
--- a/include/dsp/q6asm-v2.h
+++ b/include/dsp/q6asm-v2.h
@@ -207,6 +207,12 @@
uint32_t bufcnt;
};
+struct dsp_timestamp {
+ uint64_t time_stamp;
+ uint64_t abs_time_stamp;
+ uint64_t last_time_stamp;
+};
+
struct audio_client {
int session;
app_cb cb;
@@ -218,7 +224,7 @@
atomic_t mem_state;
void *priv;
uint32_t io_mode;
- uint64_t time_stamp;
+ struct dsp_timestamp dsp_ts;
struct apr_svc *apr;
struct apr_svc *mmap_apr;
struct apr_svc *apr2;
@@ -683,7 +689,8 @@
int q6asm_set_mute(struct audio_client *ac, int muteflag);
int q6asm_get_session_time(struct audio_client *ac, uint64_t *tstamp);
-
+int q6asm_get_session_time_v2(struct audio_client *ac, uint64_t *ses_time,
+ uint64_t *abs_time);
int q6asm_get_session_time_legacy(struct audio_client *ac, uint64_t *tstamp);
int q6asm_send_stream_cmd(struct audio_client *ac,
diff --git a/include/dsp/q6core.h b/include/dsp/q6core.h
index 61bede7..210471c 100644
--- a/include/dsp/q6core.h
+++ b/include/dsp/q6core.h
@@ -1,6 +1,6 @@
/* 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.
*/
#ifndef __Q6CORE_H__
@@ -17,6 +17,7 @@
bool q6core_is_adsp_ready(void);
+int avcs_core_query_timer_offset(int64_t *av_offset, int32_t clock_id);
int q6core_get_service_version(uint32_t service_id,
struct avcs_fwk_ver_info *ver_info,
size_t size);
@@ -306,16 +307,4 @@
int q6core_request_island_transition(uint32_t client_handle,
uint32_t island_allow_mode);
-#if IS_ENABLED(CONFIG_USE_Q6_32CH_SUPPORT)
-static inline bool q6core_use_Q6_32ch_support(void)
-{
- return true;
-}
-#else
-static inline bool q6core_use_Q6_32ch_support(void)
-{
- return false;
-}
-#endif
-
#endif /* __Q6CORE_H__ */
diff --git a/include/dsp/q6voice.h b/include/dsp/q6voice.h
index 06f4dfe..2edfbe2 100644
--- a/include/dsp/q6voice.h
+++ b/include/dsp/q6voice.h
@@ -37,13 +37,15 @@
#define CVD_VERSION_2_1 "2.1"
#define CVD_VERSION_2_2 "2.2"
#define CVD_VERSION_2_3 "2.3"
+#define CVD_VERSION_2_4 "2.4"
#define CVD_INT_VERSION_DEFAULT 0
#define CVD_INT_VERSION_0_0 1
#define CVD_INT_VERSION_2_1 2
#define CVD_INT_VERSION_2_2 3
#define CVD_INT_VERSION_2_3 4
-#define CVD_INT_VERSION_LAST CVD_INT_VERSION_2_3
+#define CVD_INT_VERSION_2_4 5
+#define CVD_INT_VERSION_LAST CVD_INT_VERSION_2_4
#define CVD_INT_VERSION_MAX (CVD_INT_VERSION_LAST + 1)
struct cvd_version_table {
diff --git a/include/soc/swr-wcd.h b/include/soc/swr-wcd.h
index ad129c8..25c5339 100644
--- a/include/soc/swr-wcd.h
+++ b/include/soc/swr-wcd.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2015, 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015, 2017-2019 The Linux Foundation. All rights reserved.
*/
#ifndef _LINUX_SWR_WCD_H
@@ -21,6 +21,7 @@
SWR_DEVICE_SSR_UP,
SWR_REGISTER_WAKE_IRQ,
SWR_SET_PORT_MAP,
+ SWR_REQ_CLK_SWITCH,
};
struct swr_mstr_port {
diff --git a/include/uapi/sound/devdep_params.h b/include/uapi/sound/devdep_params.h
index 66a9cac..abdf106 100644
--- a/include/uapi/sound/devdep_params.h
+++ b/include/uapi/sound/devdep_params.h
@@ -61,6 +61,14 @@
int32_t actual_size;
};
+struct snd_pcm_prsnt_position {
+ uint64_t timestamp;
+ uint64_t frames;
+ int32_t clock_id;
+};
+
#define SNDRV_PCM_IOCTL_MMAP_DATA_FD _IOWR('U', 0xd2, struct snd_pcm_mmap_fd)
+#define SNDRV_PCM_IOCTL_DSP_POSITION\
+ _IOWR('U', 0xd3, struct snd_pcm_prsnt_position)
#endif
diff --git a/ipc/Android.mk b/ipc/Android.mk
index ce1a7bb..d48c86e 100644
--- a/ipc/Android.mk
+++ b/ipc/Android.mk
@@ -29,7 +29,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/soc/Android.mk b/soc/Android.mk
index be9c34d..5c2bef7 100644
--- a/soc/Android.mk
+++ b/soc/Android.mk
@@ -29,7 +29,7 @@
AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
-ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito),true)
+ifeq ($(call is-board-platform-in-list,msmnile $(MSMSTEPPE) $(TRINKET) kona lito bengal),true)
LOCAL_PATH := $(call my-dir)
diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c
index d990f9c..e11ba6e 100644
--- a/soc/pinctrl-lpi.c
+++ b/soc/pinctrl-lpi.c
@@ -148,6 +148,7 @@
return 0;
}
pm_runtime_get_sync(lpi_dev);
+ mutex_lock(&state->core_hw_vote_lock);
if (!state->core_hw_vote_status) {
pr_err_ratelimited("%s: core hw vote clk is not enabled\n",
__func__);
@@ -160,6 +161,7 @@
pr_err("%s: read 0x%x failed\n", __func__, addr);
err:
+ mutex_unlock(&state->core_hw_vote_lock);
pm_runtime_mark_last_busy(lpi_dev);
pm_runtime_put_autosuspend(lpi_dev);
return ret;
@@ -177,6 +179,7 @@
return 0;
}
pm_runtime_get_sync(lpi_dev);
+ mutex_lock(&state->core_hw_vote_lock);
if (!state->core_hw_vote_status) {
pr_err_ratelimited("%s: core hw vote clk is not enabled\n",
__func__);
@@ -186,6 +189,7 @@
iowrite32(val, pad->base + pad->offset + addr);
err:
+ mutex_unlock(&state->core_hw_vote_lock);
pm_runtime_mark_last_busy(lpi_dev);
pm_runtime_put_autosuspend(lpi_dev);
return ret;
@@ -484,11 +488,8 @@
static void lpi_pinctrl_ssr_disable(struct device *dev, void *data)
{
- struct lpi_gpio_state *state = dev_get_drvdata(dev);
-
lpi_dev_up = false;
- if (state->core_hw_vote_status)
- lpi_pinctrl_runtime_suspend(dev);
+ lpi_pinctrl_runtime_suspend(dev);
}
static const struct snd_event_ops lpi_pinctrl_ssr_ops = {
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index 30c1f14..f184e1b 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -1308,6 +1308,26 @@
return -EINVAL;
}
+static void swrm_enable_slave_irq(struct swr_mstr_ctrl *swrm)
+{
+ int i;
+ int status = 0;
+
+ status = swr_master_read(swrm, SWRM_MCP_SLV_STATUS);
+ if (!status) {
+ dev_dbg_ratelimited(swrm->dev, "%s: slaves status is 0x%x\n",
+ __func__, status);
+ return;
+ }
+ dev_dbg(swrm->dev, "%s: slave status: 0x%x\n", __func__, status);
+ for (i = 0; i < (swrm->master.num_dev + 1); i++) {
+ if (status & SWRM_MCP_SLV_STATUS_MASK)
+ swrm_cmd_fifo_wr_cmd(swrm, 0x4, i, 0x0,
+ SWRS_SCP_INT_STATUS_MASK_1);
+ status >>= 2;
+ }
+}
+
static int swrm_check_slave_change_status(struct swr_mstr_ctrl *swrm,
int status, u8 *devnum)
{
@@ -1527,13 +1547,15 @@
}
if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
ret = IRQ_NONE;
- goto exit;
+ goto err_audio_hw_vote;
}
swrm_clk_request(swrm, true);
mutex_unlock(&swrm->reslock);
intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS);
intr_sts_masked = intr_sts & swrm->intr_mask;
+
+ dev_dbg(swrm->dev, "%s: status: 0x%x \n", __func__, intr_sts_masked);
handle_irq:
for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
value = intr_sts_masked & (1 << i);
@@ -1674,6 +1696,12 @@
dev_err_ratelimited(swrm->dev,
"%s: SWR wokeup during clock stop\n",
__func__);
+ /* It might be possible the slave device gets reset
+ * and slave interrupt gets missed. So re-enable
+ * Host IRQ and process slave pending
+ * interrupts, if any.
+ */
+ swrm_enable_slave_irq(swrm);
break;
default:
dev_err_ratelimited(swrm->dev,
@@ -1690,13 +1718,16 @@
intr_sts_masked = intr_sts & swrm->intr_mask;
if (intr_sts_masked) {
- dev_dbg(swrm->dev, "%s: new interrupt received\n", __func__);
+ dev_dbg(swrm->dev, "%s: new interrupt received 0x%x\n",
+ __func__, intr_sts_masked);
goto handle_irq;
}
mutex_lock(&swrm->reslock);
swrm_clk_request(swrm, false);
swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false);
+
+err_audio_hw_vote:
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
exit:
mutex_unlock(&swrm->reslock);
@@ -2203,6 +2234,28 @@
for (i = 0 ; i < SWR_MSTR_PORT_LEN; i++)
INIT_LIST_HEAD(&swrm->mport_cfg[i].port_req_list);
+ /* Register LPASS core hw vote */
+ lpass_core_hw_vote = devm_clk_get(&pdev->dev, "lpass_core_hw_vote");
+ if (IS_ERR(lpass_core_hw_vote)) {
+ ret = PTR_ERR(lpass_core_hw_vote);
+ dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n",
+ __func__, "lpass_core_hw_vote", ret);
+ lpass_core_hw_vote = NULL;
+ ret = 0;
+ }
+ swrm->lpass_core_hw_vote = lpass_core_hw_vote;
+
+ /* Register LPASS audio core vote */
+ lpass_core_audio = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote");
+ if (IS_ERR(lpass_core_audio)) {
+ ret = PTR_ERR(lpass_core_audio);
+ dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n",
+ __func__, "lpass_core_audio", ret);
+ lpass_core_audio = NULL;
+ ret = 0;
+ }
+ swrm->lpass_core_audio = lpass_core_audio;
+
if (swrm->reg_irq) {
ret = swrm->reg_irq(swrm->handle, swr_mstr_interrupt, swrm,
SWR_IRQ_REGISTER);
@@ -2267,28 +2320,6 @@
if (pdev->dev.of_node)
of_register_swr_devices(&swrm->master);
- /* Register LPASS core hw vote */
- lpass_core_hw_vote = devm_clk_get(&pdev->dev, "lpass_core_hw_vote");
- if (IS_ERR(lpass_core_hw_vote)) {
- ret = PTR_ERR(lpass_core_hw_vote);
- dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n",
- __func__, "lpass_core_hw_vote", ret);
- lpass_core_hw_vote = NULL;
- ret = 0;
- }
- swrm->lpass_core_hw_vote = lpass_core_hw_vote;
-
- /* Register LPASS audio core vote */
- lpass_core_audio = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote");
- if (IS_ERR(lpass_core_audio)) {
- ret = PTR_ERR(lpass_core_audio);
- dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n",
- __func__, "lpass_core_audio", ret);
- lpass_core_audio = NULL;
- ret = 0;
- }
- swrm->lpass_core_audio = lpass_core_audio;
-
dbgswrm = swrm;
debugfs_swrm_dent = debugfs_create_dir(dev_name(&pdev->dev), 0);
if (!IS_ERR(debugfs_swrm_dent)) {
@@ -2507,7 +2538,9 @@
goto exit;
}
if (!swrm->clk_stop_mode0_supp || swrm->state == SWR_MSTR_SSR) {
+ mutex_unlock(&swrm->reslock);
enable_bank_switch(swrm, 0, SWR_ROW_50, SWR_MIN_COL);
+ mutex_lock(&swrm->reslock);
swrm_clk_pause(swrm);
swr_master_write(swrm, SWRM_COMP_CFG_ADDR, 0x00);
list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
@@ -2558,6 +2591,25 @@
}
#endif /* CONFIG_PM */
+static int swrm_device_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
+ int ret = 0;
+
+ dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
+ if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) {
+ ret = swrm_runtime_suspend(dev);
+ if (!ret) {
+ pm_runtime_disable(dev);
+ pm_runtime_set_suspended(dev);
+ pm_runtime_enable(dev);
+ }
+ }
+
+ return 0;
+}
+
static int swrm_device_down(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
@@ -2694,6 +2746,17 @@
mstr = &swrm->master;
switch (id) {
+ case SWR_REQ_CLK_SWITCH:
+ /* This will put soundwire in clock stop mode and disable the
+ * clocks, if there is no active usecase running, so that the
+ * next activity on soundwire will request clock from new clock
+ * source.
+ */
+ mutex_lock(&swrm->mlock);
+ if (swrm->state == SWR_MSTR_UP)
+ swrm_device_suspend(&pdev->dev);
+ mutex_unlock(&swrm->mlock);
+ break;
case SWR_CLK_FREQ:
if (!data) {
dev_err(swrm->dev, "%s: data is NULL\n", __func__);