Merge "soc: swr-mstr: Ignore redundant slave path control command"
diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c
index 6c936cb..37cfefe 100644
--- a/asoc/codecs/bolero/rx-macro.c
+++ b/asoc/codecs/bolero/rx-macro.c
@@ -970,11 +970,11 @@
 	dev_dbg(rx_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n",
 		__func__, mclk_enable, dapm, rx_priv->rx_mclk_users);
 
-	if (rx_priv->is_native_on)
-		mclk_mux = MCLK_MUX1;
 	mutex_lock(&rx_priv->mclk_lock);
 	if (mclk_enable) {
 		if (rx_priv->rx_mclk_users == 0) {
+			if (rx_priv->is_native_on)
+				mclk_mux = MCLK_MUX1;
 			ret = bolero_request_clock(rx_priv->dev,
 					RX_MACRO, mclk_mux, true);
 			if (ret < 0) {
@@ -1014,6 +1014,7 @@
 			regmap_update_bits(regmap,
 				BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
 				0x01, 0x00);
+			mclk_mux = rx_priv->mclk_mux;
 			bolero_request_clock(rx_priv->dev,
 					RX_MACRO, mclk_mux, false);
 			rx_priv->mclk_mux = MCLK_MUX0;
@@ -3027,6 +3028,19 @@
 		dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
 		return ret;
 	}
+	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF1 Playback");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF2 Playback");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF3 Playback");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF4 Playback");
+	snd_soc_dapm_ignore_suspend(dapm, "HPHL_OUT");
+	snd_soc_dapm_ignore_suspend(dapm, "HPHR_OUT");
+	snd_soc_dapm_ignore_suspend(dapm, "AUX_OUT");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC0_INP");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC1_INP");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC2_INP");
+	snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC3_INP");
+	snd_soc_dapm_sync(dapm);
+
 	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x01, 0x01);
 	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x01, 0x01);
 	snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x01, 0x01);
diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c
index 44826de..09dd3b0 100644
--- a/asoc/codecs/bolero/tx-macro.c
+++ b/asoc/codecs/bolero/tx-macro.c
@@ -1521,6 +1521,23 @@
 		dev_err(tx_dev, "%s: Failed to add snd_ctls\n", __func__);
 		return ret;
 	}
+
+	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 SWR_ADC0");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6");
+	snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7");
+	snd_soc_dapm_sync(dapm);
+
 	for (i = 0; i < NUM_DECIMATORS; i++) {
 		tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
 		tx_priv->tx_hpf_work[i].decimator = i;
diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c
index 1d28e41..0bbdc68 100644
--- a/asoc/codecs/bolero/va-macro.c
+++ b/asoc/codecs/bolero/va-macro.c
@@ -1454,6 +1454,22 @@
 		return ret;
 	}
 
+	snd_soc_dapm_ignore_suspend(dapm, "VA_AIF1 Capture");
+	snd_soc_dapm_ignore_suspend(dapm, "VA_AIF2 Capture");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC0");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC1");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC2");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_ADC3");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC0");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC1");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC2");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC3");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC4");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC5");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC6");
+	snd_soc_dapm_ignore_suspend(dapm, "VA SWR_MIC7");
+	snd_soc_dapm_sync(dapm);
+
 	for (i = 0; i < VA_MACRO_NUM_DECIMATORS; i++) {
 		va_priv->va_hpf_work[i].va_priv = va_priv;
 		va_priv->va_hpf_work[i].decimator = i;
diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c
index d527186..9a6dff3 100644
--- a/asoc/codecs/bolero/wsa-macro.c
+++ b/asoc/codecs/bolero/wsa-macro.c
@@ -2511,6 +2511,17 @@
 		dev_err(wsa_dev, "%s: Failed to add snd_ctls\n", __func__);
 		return ret;
 	}
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF1 Playback");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_MIX1 Playback");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_VI Capture");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_AIF_ECHO Capture");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT");
+	snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA SRC0_INP");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_TX DEC0_INP");
+	snd_soc_dapm_ignore_suspend(dapm, "WSA_TX DEC1_INP");
+	snd_soc_dapm_sync(dapm);
 
 	wsa_priv->codec = codec;
 	wsa_priv->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_0_DB;
diff --git a/asoc/codecs/csra66x0/csra66x0.c b/asoc/codecs/csra66x0/csra66x0.c
index a6460a9..2189f9b 100644
--- a/asoc/codecs/csra66x0/csra66x0.c
+++ b/asoc/codecs/csra66x0/csra66x0.c
@@ -214,6 +214,9 @@
 {
 	switch (reg) {
 	case CSRA66X0_CHIP_ID_FA:
+	case CSRA66X0_ROM_VER_FA:
+	case CSRA66X0_CHIP_REV_0_FA:
+	case CSRA66X0_CHIP_REV_1_FA:
 	case CSRA66X0_TEMP_READ0_FA:
 	case CSRA66X0_TEMP_READ1_FA:
 	case CSRA66X0_MISC_CONTROL_STATUS_1_FA:
@@ -267,6 +270,20 @@
 #endif /* CONFIG_DEBUG_FS */
 };
 
+struct csra66x0_cluster_device {
+	struct csra66x0_priv *csra66x0_ptr;
+	const char *csra66x0_prefix;
+};
+
+struct csra66x0_cluster_device csra_clust_dev_tbl[] = {
+	{NULL, "CSRA_12"},
+	{NULL, "CSRA_34"},
+	{NULL, "CSRA_56"},
+	{NULL, "CSRA_78"},
+	{NULL, "CSRA_9A"},
+	{NULL, "CSRA_BC"}
+};
+
 #if IS_ENABLED(CONFIG_DEBUG_FS)
 static int debugfs_codec_open_op(struct inode *inode, struct file *file)
 {
@@ -515,9 +532,12 @@
 	{"SPKR", NULL, "POWER"},
 };
 
-static int csra66x0_init(struct snd_soc_codec *codec,
-			struct csra66x0_priv *csra66x0)
+static int csra66x0_init(struct csra66x0_priv *csra66x0)
 {
+	struct snd_soc_codec  *codec = csra66x0->codec;
+
+	dev_dbg(codec->dev, "%s: initialize %s\n",
+		__func__, codec->component.name);
 	/* config */
 	snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA, CONFIG_STATE);
 	/* settle time in HW is min. 500ms before proceeding */
@@ -565,35 +585,106 @@
 	return 0;
 }
 
+static int csra66x0_reset(struct csra66x0_priv *csra66x0)
+{
+	struct snd_soc_codec  *codec = csra66x0->codec;
+	u16 val;
+
+	val = snd_soc_read(codec, CSRA66X0_FAULT_STATUS_FA);
+	if (val & FAULT_STATUS_INTERNAL)
+		dev_dbg(codec->dev, "%s: FAULT_STATUS_INTERNAL 0x%X\n",
+			__func__, val);
+	if (val & FAULT_STATUS_OTP_INTEGRITY)
+		dev_dbg(codec->dev, "%s: FAULT_STATUS_OTP_INTEGRITY 0x%X\n",
+			__func__, val);
+	if (val & FAULT_STATUS_PADS2)
+		dev_dbg(codec->dev, "%s: FAULT_STATUS_PADS2 0x%X\n",
+			__func__, val);
+	if (val & FAULT_STATUS_SMPS)
+		dev_dbg(codec->dev, "%s: FAULT_STATUS_SMPS 0x%X\n",
+			__func__, val);
+	if (val & FAULT_STATUS_TEMP)
+		dev_dbg(codec->dev, "%s: FAULT_STATUS_TEMP 0x%X\n",
+			__func__, val);
+	if (val & FAULT_STATUS_PROTECT)
+		dev_dbg(codec->dev, "%s: FAULT_STATUS_PROTECT 0x%X\n",
+			__func__, val);
+
+	dev_dbg(codec->dev, "%s: reset %s\n",
+		__func__, codec->component.name);
+	/* clear fault state and re-init */
+	snd_soc_write(codec, CSRA66X0_FAULT_STATUS_FA, 0x00);
+	snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_STATUS_FA, 0x00);
+	/* apply reset to CSRA66X0 */
+	val = snd_soc_read(codec, CSRA66X0_MISC_CONTROL_STATUS_1_FA);
+	snd_soc_write(codec, CSRA66X0_MISC_CONTROL_STATUS_1_FA, val | 0x08);
+	/* wait 500ms after reset to recover CSRA66X0 */
+	msleep(500);
+	return 0;
+}
+
+static int csra66x0_msconfig(struct csra66x0_priv *csra66x0)
+{
+	struct snd_soc_codec  *codec = csra66x0->codec;
+
+	dev_dbg(codec->dev, "%s: configure %s\n",
+		__func__, codec->component.name);
+	/* config */
+	snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA,
+		CONFIG_STATE);
+	/* settle time in HW is min. 500ms before proceeding */
+	msleep(500);
+	snd_soc_write(codec, CSRA66X0_PIO7_SELECT, 0x04);
+	snd_soc_write(codec, CSRA66X0_PIO8_SELECT, 0x04);
+	if (csra66x0->is_master) {
+		/* Master specific config */
+		snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0xFF);
+		snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR0, 0x80);
+		snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x01);
+		snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR1, 0x01);
+	} else {
+		/* Slave specific config */
+		snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0x7F);
+		snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x00);
+	}
+	snd_soc_write(codec, CSRA66X0_DCA_CTRL, 0x05);
+	return 0;
+}
+
 static int csra66x0_soc_probe(struct snd_soc_codec *codec)
 {
 	struct csra66x0_priv *csra66x0 = snd_soc_codec_get_drvdata(codec);
 	struct snd_soc_dapm_context *dapm;
 	char name[50];
+	unsigned int i, max_num_cluster_devices;
 
+	csra66x0->codec = codec;
 	if (csra66x0->in_cluster) {
 		dapm = snd_soc_codec_get_dapm(codec);
 		dev_dbg(codec->dev, "%s: assign prefix %s to codec device %s\n",
 			__func__, codec->component.name_prefix,
 			codec->component.name);
-		snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA,
-			CONFIG_STATE);
-		/* settle time in HW is min. 500ms before proceeding */
-		msleep(500);
-		snd_soc_write(codec, CSRA66X0_PIO7_SELECT, 0x04);
-		snd_soc_write(codec, CSRA66X0_PIO8_SELECT, 0x04);
-		if (csra66x0->is_master) {
-			/* Master specific config */
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0xFF);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR0, 0x80);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x01);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR1, 0x01);
-		} else {
-			/* Slave specific config */
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0x7F);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x00);
+
+		/* add device to cluster table */
+		max_num_cluster_devices = sizeof(csra_clust_dev_tbl)/
+			sizeof(csra_clust_dev_tbl[0]);
+		for (i = 0; i < max_num_cluster_devices; i++) {
+			if (!strncmp(codec->component.name_prefix,
+				  csra_clust_dev_tbl[i].csra66x0_prefix,
+				  strlen(
+				  csra_clust_dev_tbl[i].csra66x0_prefix))) {
+				csra_clust_dev_tbl[i].csra66x0_ptr = csra66x0;
+				break;
+			}
+			if (i == max_num_cluster_devices-1)
+				dev_warn(codec->dev,
+					"%s: Unknown prefix %s of cluster device %s\n",
+					__func__, codec->component.name_prefix,
+					codec->component.name);
 		}
-		snd_soc_write(codec, CSRA66X0_DCA_CTRL, 0x05);
+
+		/* master slave config */
+		csra66x0_msconfig(csra66x0);
 		if (dapm->component) {
 			strlcpy(name, dapm->component->name_prefix,
 				sizeof(name));
@@ -606,10 +697,8 @@
 		}
 	}
 
-	csra66x0->codec = codec;
-
-	/* common configuration */
-	csra66x0_init(codec, csra66x0);
+	/* common initialization */
+	csra66x0_init(csra66x0);
 	return 0;
 }
 
@@ -679,66 +768,56 @@
 	struct csra66x0_priv *csra66x0 = (struct csra66x0_priv *) data;
 	struct snd_soc_codec  *codec = csra66x0->codec;
 	u16    val;
+	unsigned int i, max_num_cluster_devices;
 
 	/* Treat interrupt before codec is initialized as spurious */
 	if (codec == NULL)
 		return IRQ_NONE;
 
-	dev_dbg(codec->dev, "%s: csra66x0_interrupt\n", __func__);
+	dev_dbg(codec->dev, "%s: csra66x0_interrupt triggered by %s\n",
+		__func__, codec->component.name);
 
 	/* fault  indication */
 	val = snd_soc_read(codec, CSRA66X0_IRQ_OUTPUT_STATUS_FA) & 0x1;
-	if (val) {
-		val = snd_soc_read(codec, CSRA66X0_FAULT_STATUS_FA);
-		if (val & FAULT_STATUS_INTERNAL)
-			dev_dbg(codec->dev, "%s: FAULT_STATUS_INTERNAL 0x%X\n",
-				__func__, val);
-		if (val & FAULT_STATUS_OTP_INTEGRITY)
-			dev_dbg(codec->dev, "%s: FAULT_STATUS_OTP_INTEGRITY 0x%X\n",
-				__func__, val);
-		if (val & FAULT_STATUS_PADS2)
-			dev_dbg(codec->dev, "%s: FAULT_STATUS_PADS2 0x%X\n",
-				__func__, val);
-		if (val & FAULT_STATUS_SMPS)
-			dev_dbg(codec->dev, "%s: FAULT_STATUS_SMPS 0x%X\n",
-				__func__, val);
-		if (val & FAULT_STATUS_TEMP)
-			dev_dbg(codec->dev, "%s: FAULT_STATUS_TEMP 0x%X\n",
-				__func__, val);
-		if (val & FAULT_STATUS_PROTECT)
-			dev_dbg(codec->dev, "%s: FAULT_STATUS_PROTECT 0x%X\n",
-				__func__, val);
+	if (!val)
+		return IRQ_HANDLED;
 
-		/* clear fault state and re-init */
-		snd_soc_write(codec, CSRA66X0_FAULT_STATUS_FA, 0x00);
-		snd_soc_write(codec, CSRA66X0_IRQ_OUTPUT_STATUS_FA, 0x00);
-		/* apply reset to CSRA66X0 */
-		val = snd_soc_read(codec, CSRA66X0_MISC_CONTROL_STATUS_1_FA);
-		snd_soc_write(codec, CSRA66X0_MISC_CONTROL_STATUS_1_FA, val | 0x08);
-		/* wait 2s after reset to recover CSRA66X0 */
-		msleep(2000);
-		/* re-init */
-		snd_soc_write(codec, CSRA66X0_CHIP_STATE_CTRL_FA,
-			CONFIG_STATE);
-		/* settle time in HW is min. 500ms before proceeding */
-		msleep(500);
-		snd_soc_write(codec, CSRA66X0_PIO7_SELECT, 0x04);
-		snd_soc_write(codec, CSRA66X0_PIO8_SELECT, 0x04);
-		if (csra66x0->is_master) {
-			/* Master specific config */
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0xFF);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR0, 0x80);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x01);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_DIR1, 0x01);
-		} else {
-			/* Slave specific config */
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN0, 0x7F);
-			snd_soc_write(codec, CSRA66X0_PIO_PULL_EN1, 0x00);
+	if (csra66x0->in_cluster) {
+		/* reset all slave codecs */
+		max_num_cluster_devices =
+			sizeof(csra_clust_dev_tbl) /
+			sizeof(csra_clust_dev_tbl[0]);
+		for (i = 0; i < max_num_cluster_devices; i++) {
+			if (i >= codec->component.card->num_aux_devs)
+				break;
+			if (csra_clust_dev_tbl[i].csra66x0_ptr == NULL)
+				continue;
+			if (csra_clust_dev_tbl[i].csra66x0_ptr->is_master)
+				continue;
+			csra66x0_reset(csra_clust_dev_tbl[i].csra66x0_ptr);
 		}
-		snd_soc_write(codec, CSRA66X0_DCA_CTRL, 0x05);
-		csra66x0_init(codec, csra66x0);
+		/* reset all master codecs */
+		for (i = 0; i < max_num_cluster_devices; i++) {
+			if (i >= codec->component.card->num_aux_devs)
+				break;
+			if (csra_clust_dev_tbl[i].csra66x0_ptr == NULL)
+				continue;
+			if (csra_clust_dev_tbl[i].csra66x0_ptr->is_master)
+				csra66x0_reset(
+					csra_clust_dev_tbl[i].csra66x0_ptr);
+		}
+		/* recover all codecs */
+		for (i = 0; i < max_num_cluster_devices; i++) {
+			if (i >= codec->component.card->num_aux_devs)
+				break;
+			if (csra_clust_dev_tbl[i].csra66x0_ptr == NULL)
+				continue;
+			csra66x0_msconfig(csra_clust_dev_tbl[i].csra66x0_ptr);
+			csra66x0_init(csra_clust_dev_tbl[i].csra66x0_ptr);
+		}
 	} else {
-		return IRQ_NONE;
+		csra66x0_reset(csra66x0);
+		csra66x0_init(csra66x0);
 	}
 	return IRQ_HANDLED;
 };
@@ -791,7 +870,8 @@
 			&csra66x0->is_master);
 		if (ret) {
 			dev_info(&client_i2c->dev,
-			"%s: qcom,csra-cluster-master property not defined in DT\n", __func__);
+			"%s: qcom,csra-cluster-master property not defined in DT, slave assumed\n",
+			__func__);
 			csra66x0->is_master = 0;
 		}
 
diff --git a/asoc/codecs/ep92/ep92.c b/asoc/codecs/ep92/ep92.c
index 73110da..52f5e6d 100644
--- a/asoc/codecs/ep92/ep92.c
+++ b/asoc/codecs/ep92/ep92.c
@@ -17,6 +17,8 @@
 #include <linux/kernel.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
+#include <linux/fs.h>
+#include <linux/debugfs.h>
 #include <linux/sysfs.h>
 #include <linux/kobject.h>
 #include <sound/core.h>
@@ -27,9 +29,10 @@
 #include <linux/workqueue.h>
 #include "ep92.h"
 
-#define EP92_POLL_INTERVAL_OFF_MSEC 2000
-#define EP92_POLL_INTERVAL_ON_MSEC  100
-
+#define EP92_POLL_INTERVAL_OFF_MSEC 200
+#define EP92_POLL_INTERVAL_ON_MSEC  20
+#define EP92_SYSFS_ENTRY_MAX_LEN 64
+#define EP92_HYST_CNT 5
 
 #define EP92_RATES (SNDRV_PCM_RATE_32000 |\
 	SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\
@@ -38,71 +41,10 @@
 
 #define EP92_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
 
-#define EP92_UEVENT_CTRL_NUM_KEYS  8
-#define EP92_UEVENT_AUDIO_NUM_KEYS 9
-
 static const unsigned int ep92_samp_freq_table[8] = {
 	32000, 44100, 48000, 88200, 96000, 176400, 192000, 768000
 };
 
-static const char hex_to_char[] = {'0', '1', '2', '3', '4', '5', '6', '7',
-				   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
-
-struct ep92_uevent_data {
-	struct kobject kobj;
-	struct kobj_type ktype;
-};
-
-static struct kset *ep92_uevent_kset;
-static struct ep92_uevent_data *ep92_uevent_ctrl;
-static struct ep92_uevent_data *ep92_uevent_audio;
-
-static void ep92_release_uevent_data(struct kobject *kobj)
-{
-	struct ep92_uevent_data *data = container_of(kobj,
-		struct ep92_uevent_data, kobj);
-
-	kfree(data);
-}
-
-static int ep92_init_uevent_data(struct ep92_uevent_data *uevent_data,
-	char *name)
-{
-	int ret = -EINVAL;
-
-	if (!uevent_data || !name)
-		return ret;
-
-	/* Set kset for kobject before initializing the kobject */
-	uevent_data->kobj.kset = ep92_uevent_kset;
-
-	/* Initialize kobject and add it to kernel */
-	ret = kobject_init_and_add(&uevent_data->kobj, &uevent_data->ktype,
-		NULL, "%s", name);
-	if (ret) {
-		pr_err("%s: error initializing uevent kernel object: %d",
-			__func__, ret);
-		kobject_put(&uevent_data->kobj);
-		return ret;
-	}
-
-	/* Send kobject add event to the system */
-	kobject_uevent(&uevent_data->kobj, KOBJ_ADD);
-
-	return ret;
-}
-
-/**
- * ep92_destroy_uevent_data - destroy kernel object.
- *
- * @uevent_data: uevent data.
- */
-static void ep92_destroy_uevent_data(struct ep92_uevent_data *uevent_data)
-{
-	if (uevent_data)
-		kobject_put(&uevent_data->kobj);
-}
-
 static bool ep92_volatile_register(struct device *dev, unsigned int reg)
 {
 	switch (reg) {
@@ -162,10 +104,25 @@
 	struct work_struct   read_status_worker;
 	int                  irq;
 
+	int                  hyst_tx_plug;
+	int                  hyst_link_on0;
+	int                  hyst_link_on1;
+	int                  hyst_link_on2;
+	int                  filt_tx_plug;
+	int                  filt_link_on0;
+	int                  filt_link_on1;
+	int                  filt_link_on2;
+	struct {
+		u8 tx_info;
+		u8 video_latency;
+	} gi; /* General Info block */
+
 	struct {
 		u8 ctl;
 		u8 rx_sel;
+		u8 ctl2;
 		u8 cec_volume;
+		u8 link;
 	} gc; /* General Control block */
 
 	struct {
@@ -178,442 +135,144 @@
 	} ai; /* Audio Info block */
 
 	u8 old_mode;
+#if IS_ENABLED(CONFIG_DEBUG_FS)
+	struct dentry *debugfs_dir;
+	struct dentry *debugfs_file_wo;
+	struct dentry *debugfs_file_ro;
+#endif /* CONFIG_DEBUG_FS */
 };
 
-/*
- * EP92 Controls
- */
-
-/* enumerated controls */
-static const char * const ep92_off_on_text[] = {"Off", "On"};
-static const char * const ep92_aud_path_text[] = {"TV", "Speaker"};
-static const char * const ep92_rx_sel_text[] = {"Port 0", "Port 1", "Port 2",
-	"Res 3", "Res 4", "Res 5", "None", "Res 7"};
-static const char * const ep92_cec_mute_text[] = {"Normal", "Muted"};
-
-static const char * const ep92_state_text[] = {"Inactive", "Active"};
-static const char * const ep92_avmute_text[] = {"Normal", "Muted"};
-static const char * const ep92_layout_text[] = {"Layout 0", "Layout 1"};
-static const char * const ep92_mode_text[] = {"LPCM", "Compr"};
-
-SOC_ENUM_SINGLE_DECL(ep92_power_enum, EP92_GENERAL_CONTROL_0,
-	EP92_GC_POWER_SHIFT, ep92_off_on_text);
-SOC_ENUM_SINGLE_DECL(ep92_audio_path_enum, EP92_GENERAL_CONTROL_0,
-	EP92_GC_AUDIO_PATH_SHIFT, ep92_aud_path_text);
-SOC_ENUM_SINGLE_DECL(ep92_rx_sel_enum, EP92_GENERAL_CONTROL_1,
-	EP92_GC_RX_SEL_SHIFT, ep92_rx_sel_text);
-SOC_ENUM_SINGLE_DECL(ep92_arc_en_enum, EP92_GENERAL_CONTROL_0,
-	EP92_GC_ARC_EN_SHIFT, ep92_off_on_text);
-SOC_ENUM_SINGLE_DECL(ep92_cec_mute_enum, EP92_GENERAL_CONTROL_0,
-	EP92_GC_CEC_MUTE_SHIFT, ep92_cec_mute_text);
-
-SOC_ENUM_SINGLE_DECL(ep92_state_enum, EP92_AUDIO_INFO_SYSTEM_STATUS_0,
-	EP92_AI_MCLK_ON_SHIFT, ep92_state_text);
-SOC_ENUM_SINGLE_DECL(ep92_avmute_enum, EP92_AUDIO_INFO_SYSTEM_STATUS_0,
-	EP92_AI_AVMUTE_SHIFT, ep92_avmute_text);
-SOC_ENUM_SINGLE_DECL(ep92_layout_enum, EP92_AUDIO_INFO_SYSTEM_STATUS_0,
-	EP92_AI_LAYOUT_SHIFT, ep92_layout_text);
-SOC_ENUM_SINGLE_DECL(ep92_mode_enum, EP92_AUDIO_INFO_AUDIO_STATUS,
-	EP92_AI_STD_ADO_SHIFT, ep92_mode_text);
-
-/* get/set functions */
-static int ep92_power_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
+#if IS_ENABLED(CONFIG_DEBUG_FS)
+static int debugfs_codec_open_op(struct inode *inode, struct file *file)
 {
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] =
-			(val >> e->shift_l) & EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_off_on_text[ucontrol->value.enumerated.item[0]]);
+	file->private_data = inode->i_private;
 	return 0;
 }
 
-static int ep92_power_put(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
+static int debugfs_get_parameters(char *buf, u32 *param1, int num_of_par)
 {
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
+	char *token;
+	int base, cnt;
 
-	val = snd_soc_read(codec, e->reg);
-	val &= ~EP92_GC_POWER_MASK;
-	val |= (ucontrol->value.enumerated.item[0] & EP92_2CHOICE_MASK)
-			<< e->shift_l;
-	snd_soc_write(codec, e->reg, val);
-	ep92->gc.ctl &= ~EP92_GC_POWER_MASK;
-	ep92->gc.ctl |= val & EP92_GC_POWER_MASK;
+	token = strsep(&buf, " ");
+	for (cnt = 0; cnt < num_of_par; cnt++) {
+		if (token) {
+			if ((token[1] == 'x') || (token[1] == 'X'))
+				base = 16;
+			else
+				base = 10;
 
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_off_on_text[ucontrol->value.enumerated.item[0] &
-				 EP92_2CHOICE_MASK]);
-	return 0;
-}
+			if (kstrtou32(token, base, &param1[cnt]) != 0)
+				return -EINVAL;
 
-static int ep92_audio_path_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_aud_path_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_audio_path_put(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	val &= ~EP92_GC_AUDIO_PATH_MASK;
-	val |= (ucontrol->value.enumerated.item[0] & EP92_2CHOICE_MASK)
-			<< e->shift_l;
-	snd_soc_write(codec, e->reg, val);
-	ep92->gc.ctl &= ~EP92_GC_AUDIO_PATH_MASK;
-	ep92->gc.ctl |= val & EP92_GC_AUDIO_PATH_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_aud_path_text[ucontrol->value.enumerated.item[0] &
-				   EP92_2CHOICE_MASK]);
-	return 0;
-}
-
-static int ep92_cec_mute_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_cec_mute_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_cec_mute_put(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	val &= ~EP92_GC_CEC_MUTE_MASK;
-	val |= (ucontrol->value.enumerated.item[0] & EP92_2CHOICE_MASK)
-			<< e->shift_l;
-	snd_soc_write(codec, e->reg, val);
-	ep92->gc.ctl &= ~EP92_GC_CEC_MUTE_MASK;
-	ep92->gc.ctl |= val & EP92_GC_CEC_MUTE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_cec_mute_text[ucontrol->value.enumerated.item[0] &
-				   EP92_2CHOICE_MASK]);
-	return 0;
-}
-
-static int ep92_arc_en_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_off_on_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_arc_en_put(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	val &= ~EP92_GC_ARC_EN_MASK;
-	val |= (ucontrol->value.enumerated.item[0] & EP92_2CHOICE_MASK)
-			<< e->shift_l;
-	snd_soc_write(codec, e->reg, val);
-	ep92->gc.ctl &= ~EP92_GC_ARC_EN_MASK;
-	ep92->gc.ctl |= val & EP92_GC_ARC_EN_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_off_on_text[ucontrol->value.enumerated.item[0] & 0x01]);
-	return 0;
-}
-
-static int ep92_rx_sel_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_GC_RX_SEL_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_rx_sel_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_rx_sel_put(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	val &= ~EP92_GC_RX_SEL_MASK;
-	val |= (ucontrol->value.enumerated.item[0] & EP92_GC_RX_SEL_MASK)
-			<< e->shift_l;
-	snd_soc_write(codec, e->reg, val);
-	ep92->gc.rx_sel &= ~EP92_GC_RX_SEL_MASK;
-	ep92->gc.rx_sel |= val & EP92_GC_RX_SEL_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_rx_sel_text[ucontrol->value.enumerated.item[0] &
-				 EP92_GC_RX_SEL_MASK]);
-	return 0;
-}
-
-static int ep92_cec_volume_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_mixer_control *mc =
-		(struct soc_mixer_control *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, mc->reg);
-	ucontrol->value.integer.value[0] = (val >> mc->shift) &
-			EP92_GC_CEC_VOLUME_MASK;
-
-	pr_debug("%s: volume = %ld\n", __func__,
-		ucontrol->value.integer.value[0]);
-	return 0;
-}
-
-static int ep92_cec_volume_put(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_mixer_control *mc =
-		(struct soc_mixer_control *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
-
-	val = ucontrol->value.integer.value[0] & EP92_GC_CEC_VOLUME_MASK;
-	if (val > EP92_GC_CEC_VOLUME_MAX)
-		val = EP92_GC_CEC_VOLUME_MAX;
-	snd_soc_write(codec, mc->reg, val);
-	ep92->gc.cec_volume = val;
-
-	pr_debug("%s: volume = %ld\n", __func__,
-		ucontrol->value.integer.value[0]);
-	return 0;
-}
-
-static int ep92_state_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_state_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_avmute_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_avmute_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_layout_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) &
-			EP92_2CHOICE_MASK;
-
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_layout_text[ucontrol->value.enumerated.item[0]]);
-	return 0;
-}
-
-static int ep92_mode_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
-{
-	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	struct ep92_pdata *ep92 = snd_soc_codec_get_drvdata(codec);
-	unsigned int val;
-
-	val = snd_soc_read(codec, e->reg);
-	if (val & EP92_AI_STD_ADO_MASK) {
-		val = snd_soc_read(codec, EP92_AUDIO_INFO_CHANNEL_STATUS_0);
-		if (val & EP92_AI_NPCM_MASK)
-			ucontrol->value.enumerated.item[0] = 1; /* Compr */
-		else
-			ucontrol->value.enumerated.item[0] = 0; /* LPCM */
-	} else if (val & EP92_AI_HBR_ADO_MASK) {
-		ucontrol->value.enumerated.item[0] = 1; /* Compr */
-	} else {
-		ucontrol->value.enumerated.item[0] = ep92->old_mode;
+			token = strsep(&buf, " ");
+		} else {
+			return -EINVAL;
+		}
 	}
-	pr_debug("%s: item = %d (%s)\n", __func__,
-		ucontrol->value.enumerated.item[0],
-		ep92_mode_text[ucontrol->value.enumerated.item[0]]);
 	return 0;
 }
 
-static int ep92_rate_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
+static ssize_t debugfs_codec_write_op(struct file *filp,
+		const char __user *ubuf, size_t cnt, loff_t *ppos)
 {
-	struct soc_mixer_control *mc =
-		(struct soc_mixer_control *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
+	struct ep92_pdata *ep92 = (struct ep92_pdata *) filp->private_data;
+	struct snd_soc_codec *codec = ep92->codec;
+	char lbuf[32];
+	int rc;
+	u32 param[2];
 
-	val = snd_soc_read(codec, mc->reg);
-	val &= EP92_AI_RATE_MASK;
-	val = ep92_samp_freq_table[val];
-	ucontrol->value.integer.value[0] = val;
-
-	pr_debug("%s: rate = %ld\n", __func__,
-		ucontrol->value.integer.value[0]);
-	return 0;
+	if (!filp || !ppos || !ubuf)
+		return -EINVAL;
+	if (cnt > sizeof(lbuf) - 1)
+		return -EINVAL;
+	rc = copy_from_user(lbuf, ubuf, cnt);
+	if (rc)
+		return -EFAULT;
+	lbuf[cnt] = '\0';
+	rc = debugfs_get_parameters(lbuf, param, 2);
+	if ((param[0] < EP92_ISP_MODE_ENTER_ISP)
+		|| (param[0] > EP92_GENERAL_CONTROL_4)) {
+		dev_err(codec->dev, "%s: reg address 0x%02X out of range\n",
+			__func__, param[0]);
+		return -EINVAL;
+	}
+	if ((param[1] < 0) || (param[1] > 255)) {
+		dev_err(codec->dev, "%s: reg data 0x%02X out of range\n",
+			__func__, param[1]);
+		return -EINVAL;
+	}
+	if (rc == 0) {
+		rc = cnt;
+		dev_info(codec->dev, "%s: reg[0x%02X]=0x%02X\n",
+			__func__, param[0], param[1]);
+		snd_soc_write(codec, param[0], param[1]);
+	} else {
+		dev_err(codec->dev, "%s: write to register addr=0x%02X failed\n",
+			__func__, param[0]);
+	}
+	return rc;
 }
 
-static int ep92_ch_count_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
+static ssize_t debugfs_ep92_reg_show(struct snd_soc_codec *codec,
+		char __user *ubuf, size_t count, loff_t *ppos)
 {
-	struct soc_mixer_control *mc =
-		(struct soc_mixer_control *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
+	int i, reg_val, len;
+	ssize_t total = 0;
+	char tmp_buf[20];
 
-	val = snd_soc_read(codec, mc->reg) & EP92_AI_CH_COUNT_MASK;
-	/* mapping is ch_count = reg_val + 1, with exception: 0 = unknown */
-	if (val > 0)
-		val += 1;
+	if (!ubuf || !ppos || !codec || *ppos < 0)
+		return -EINVAL;
 
-	ucontrol->value.integer.value[0] = val;
+	for (i = (int) *ppos / 11; i <= EP92_MAX_REGISTER_ADDR; i++) {
+		reg_val = snd_soc_read(codec, i);
+		len = snprintf(tmp_buf, 20, "0x%02X: 0x%02X\n", i,
+			(reg_val & 0xFF));
+		if ((total + len) > count)
+			break;
+		if (copy_to_user((ubuf + total), tmp_buf, len)) {
+			dev_err(codec->dev, "%s: fail to copy reg dump\n",
+				__func__);
+			total = -EFAULT;
+			goto copy_err;
+		}
+		*ppos += len;
+		total += len;
+	}
 
-	pr_debug("%s: ch_count = %ld\n", __func__,
-		ucontrol->value.integer.value[0]);
-	return 0;
+copy_err:
+	return total;
 }
 
-static int ep92_ch_alloc_get(struct snd_kcontrol *kcontrol,
-	struct snd_ctl_elem_value *ucontrol)
+static ssize_t debugfs_codec_read_op(struct file *filp,
+		char __user *ubuf, size_t cnt, loff_t *ppos)
 {
-	struct soc_mixer_control *mc =
-		(struct soc_mixer_control *)kcontrol->private_value;
-	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-	unsigned int val;
+	struct ep92_pdata *ep92 = (struct ep92_pdata *) filp->private_data;
+	struct snd_soc_codec *codec = ep92->codec;
+	ssize_t ret_cnt;
 
-	val = snd_soc_read(codec, mc->reg);
-	ucontrol->value.integer.value[0] = (val >> mc->shift) &
-			EP92_AI_CH_ALLOC_MASK;
-
-	pr_debug("%s: ch_alloc = 0x%02lx\n", __func__,
-		ucontrol->value.integer.value[0]);
-	return 0;
+	if (!filp || !ppos || !ubuf || *ppos < 0)
+		return -EINVAL;
+	ret_cnt = debugfs_ep92_reg_show(codec, ubuf, cnt, ppos);
+	return ret_cnt;
 }
 
-static const struct snd_kcontrol_new ep92_snd_controls[] = {
-
-	SOC_ENUM_EXT("HDMI_IN POWER", ep92_power_enum,
-		ep92_power_get, ep92_power_put),
-	SOC_ENUM_EXT("HDMI_IN AUDIO_PATH", ep92_audio_path_enum,
-		ep92_audio_path_get, ep92_audio_path_put),
-	SOC_ENUM_EXT("HDMI_IN RX_SEL", ep92_rx_sel_enum,
-		ep92_rx_sel_get, ep92_rx_sel_put),
-	SOC_ENUM_EXT("HDMI_IN ARC_EN", ep92_arc_en_enum,
-		ep92_arc_en_get, ep92_arc_en_put),
-	SOC_ENUM_EXT("HDMI_IN CEC_MUTE", ep92_cec_mute_enum,
-		ep92_cec_mute_get, ep92_cec_mute_put),
-	SOC_SINGLE_EXT("HDMI_IN CEC_VOLUME", EP92_GENERAL_CONTROL_3,
-		EP92_GC_CEC_VOLUME_MIN, EP92_GC_CEC_VOLUME_MAX,
-		0, ep92_cec_volume_get, ep92_cec_volume_put),
-
-	SOC_ENUM_EXT("HDMI_IN STATE", ep92_state_enum, ep92_state_get, NULL),
-	SOC_ENUM_EXT("HDMI_IN AVMUTE", ep92_avmute_enum, ep92_avmute_get, NULL),
-	SOC_ENUM_EXT("HDMI_IN LAYOUT", ep92_layout_enum, ep92_layout_get, NULL),
-	SOC_ENUM_EXT("HDMI_IN MODE", ep92_mode_enum, ep92_mode_get, NULL),
-	SOC_SINGLE_EXT("HDMI_IN RATE", EP92_AUDIO_INFO_AUDIO_STATUS,
-		EP92_AI_RATE_MIN, EP92_AI_RATE_MAX, 0, ep92_rate_get, NULL),
-	SOC_SINGLE_EXT("HDMI_IN CH_COUNT", EP92_AUDIO_INFO_ADO_INFO_FRAME_1,
-		EP92_AI_CH_COUNT_MIN, EP92_AI_CH_COUNT_MAX,
-		0, ep92_ch_count_get, NULL),
-	SOC_SINGLE_EXT("HDMI_IN CH_ALLOC", EP92_AUDIO_INFO_ADO_INFO_FRAME_4,
-		EP92_AI_CH_ALLOC_MIN, EP92_AI_CH_ALLOC_MAX, 0,
-		ep92_ch_alloc_get, NULL),
+static const struct file_operations debugfs_codec_ops = {
+	.open = debugfs_codec_open_op,
+	.write = debugfs_codec_write_op,
+	.read = debugfs_codec_read_op,
 };
+#endif /* CONFIG_DEBUG_FS */
+
+static int ep92_send_uevent(struct ep92_pdata *ep92, char *event)
+{
+	char *env[] = { event, NULL };
+
+	if (!event || !ep92)
+		return -EINVAL;
+
+	return kobject_uevent_env(&ep92->codec->dev->kobj, KOBJ_CHANGE, env);
+}
 
 static int ep92_startup(struct snd_pcm_substream *substream,
 	struct snd_soc_dai *dai)
@@ -669,328 +328,208 @@
 	},
 };
 
-static const char * const ep92_event_power_text[] = {
-	"POWER=Off",
-	"POWER=On",
-};
-
-static const char * const ep92_event_arc_en_text[] = {
-	"ARC_EN=Off",
-	"ARC_EN=On",
-};
-
-static const char * const ep92_event_audio_path_text[] = {
-	"AUDIO_PATH=TV",
-	"AUDIO_PATH=Speaker",
-};
-
-static const char *const ep92_event_rx_sel_text[] = {
-	"RX_SEL=Port0",
-	"RX_SEL=Port1",
-	"RX_SEL=Port2",
-	"RX_SEL=Res3",
-	"RX_SEL=Res4",
-	"RX_SEL=Res5",
-	"RX_SEL=None",
-	"RX_SEL=Res7",
-};
-
-static const char *const ep92_event_cec_mute_text[] = {
-	"CEC_MUTE=Normal",
-	"CEC_MUTE=Muted",
-};
-
-static int ep92_send_uevent_ctrl(struct ep92_pdata *ep92)
-{
-	char *env[EP92_UEVENT_CTRL_NUM_KEYS];
-	u8 idx = 0;
-	u8 cec_volume;
-	char cec_volume_text[] = "CEC_VOLUME=0x00";
-	char *ptr;
-
-	env[idx++] = "HDMI_CONTROL=TRUE";
-
-	if ((ep92->gc.ctl >> EP92_GC_POWER_SHIFT) &
-		EP92_2CHOICE_MASK)
-		env[idx++] = (char *)ep92_event_power_text[1];
-	else
-		env[idx++] = (char *)ep92_event_power_text[0];
-
-	if (ep92->gc.ctl & EP92_2CHOICE_MASK)
-		env[idx++] = (char *)ep92_event_arc_en_text[1];
-	else
-		env[idx++] = (char *)ep92_event_arc_en_text[0];
-
-	if ((ep92->gc.ctl >> EP92_GC_AUDIO_PATH_SHIFT) &
-		EP92_2CHOICE_MASK)
-		env[idx++] = (char *)ep92_event_audio_path_text[1];
-	else
-		env[idx++] = (char *)ep92_event_audio_path_text[0];
-
-	switch (ep92->gc.rx_sel & EP92_GC_RX_SEL_MASK) {
-	case 0:
-		env[idx++] = (char *)ep92_event_rx_sel_text[0];
-		break;
-	case 1:
-		env[idx++] = (char *)ep92_event_rx_sel_text[1];
-		break;
-	case 2:
-		env[idx++] = (char *)ep92_event_rx_sel_text[2];
-		break;
-	case 3:
-		env[idx++] = (char *)ep92_event_rx_sel_text[3];
-		break;
-	case 4:
-		env[idx++] = (char *)ep92_event_rx_sel_text[4];
-		break;
-	case 5:
-		env[idx++] = (char *)ep92_event_rx_sel_text[5];
-		break;
-	case 6:
-		env[idx++] = (char *)ep92_event_rx_sel_text[6];
-		break;
-	case 7:
-		env[idx++] = (char *)ep92_event_rx_sel_text[7];
-		break;
-	default:
-		env[idx++] = (char *)ep92_event_rx_sel_text[0];
-	}
-
-	if ((ep92->gc.ctl >> EP92_GC_CEC_MUTE_SHIFT) &
-		EP92_2CHOICE_MASK)
-		env[idx++] = (char *)ep92_event_cec_mute_text[1];
-	else
-		env[idx++] = (char *)ep92_event_cec_mute_text[0];
-
-	ptr = &cec_volume_text[strlen(cec_volume_text)-2];
-	cec_volume = (ep92->ai.ca) & EP92_GC_CEC_VOLUME_MASK;
-	*ptr++ = hex_to_char[(cec_volume >> 4) & 0x0f];
-	*ptr++ = hex_to_char[cec_volume & 0x0f];
-	env[idx++] = (char *)cec_volume_text;
-
-	env[idx++] = NULL;
-
-	if (idx != EP92_UEVENT_CTRL_NUM_KEYS) {
-		pr_err("ep92 wrong number of audio uevent keys (%d).\n",
-			idx);
-		return -EINVAL;
-	}
-
-	return kobject_uevent_env(&ep92_uevent_ctrl->kobj, KOBJ_CHANGE, env);
-}
-
-static const char * const ep92_event_state_text[] = {
-	"STATE=Inactive",
-	"STATE=Active",
-};
-
-static const char *const ep92_event_rate_text[] = {
-	"RATE=32000",
-	"RATE=44100",
-	"RATE=48000",
-	"RATE=88200",
-	"RATE=96000",
-	"RATE=176400",
-	"RATE=192000",
-	"RATE=768000",
-};
-
-static const char *const ep92_event_format_text[] = {
-	"FORMAT=LPCM",
-	"FORMAT=Compr",
-};
-
-static const char *const ep92_event_layout_text[] = {
-	"LAYOUT=2ch",
-	"LAYOUT=8ch",
-};
-
-static const char *const ep92_event_avmute_text[] = {
-	"AVMUTE=Normal",
-	"AVMUTE=Muted",
-};
-
-static const char *const ep92_event_ch_count_text[] = {
-	"CH_COUNT=One",
-	"CH_COUNT=Two",
-	"CH_COUNT=Three",
-	"CH_COUNT=Four",
-	"CH_COUNT=Five",
-	"CH_COUNT=Six",
-	"CH_COUNT=Seven",
-	"CH_COUNT=Eight",
-};
-
-static int ep92_send_uevent_audio(struct ep92_pdata *ep92)
-{
-	char *env[EP92_UEVENT_AUDIO_NUM_KEYS];
-	u8 idx = 0;
-	u8 ch_alloc;
-	char ch_alloc_text[] = "CH_ALLOC=0x00";
-	char *ptr;
-
-	env[idx++] = "HDMI_FMT_UPDATE=TRUE";
-
-	if (((ep92->ai.system_status_0 >> EP92_AI_MCLK_ON_SHIFT) &
-		EP92_2CHOICE_MASK) == EP92_STATUS_AUDIO_ACTIVE)
-		env[idx++] = (char *)ep92_event_state_text[1];
-	else
-		env[idx++] = (char *)ep92_event_state_text[0];
-
-	switch (ep92->ai.audio_status & EP92_AI_RATE_MASK) {
-	case 0:
-		env[idx++] = (char *)ep92_event_rate_text[0];
-		break;
-	case 1:
-		env[idx++] = (char *)ep92_event_rate_text[1];
-		break;
-	case 2:
-		env[idx++] = (char *)ep92_event_rate_text[2];
-		break;
-	case 3:
-		env[idx++] = (char *)ep92_event_rate_text[3];
-		break;
-	case 4:
-		env[idx++] = (char *)ep92_event_rate_text[4];
-		break;
-	case 5:
-		env[idx++] = (char *)ep92_event_rate_text[5];
-		break;
-	case 6:
-		env[idx++] = (char *)ep92_event_rate_text[6];
-		break;
-	case 7:
-		env[idx++] = (char *)ep92_event_rate_text[7];
-		break;
-	default:
-		env[idx++] = (char *)ep92_event_rate_text[2];
-	}
-
-	if (ep92->old_mode)
-		env[idx++] = (char *)ep92_event_format_text[1];
-	else
-		env[idx++] = (char *)ep92_event_format_text[0];
-
-	if (ep92->ai.system_status_0 & EP92_2CHOICE_MASK)
-		env[idx++] = (char *)ep92_event_layout_text[1];
-	else
-		env[idx++] = (char *)ep92_event_layout_text[0];
-
-	if ((ep92->ai.system_status_0 >> EP92_AI_AVMUTE_SHIFT) &
-		EP92_2CHOICE_MASK)
-		env[idx++] = (char *)ep92_event_avmute_text[1];
-	else
-		env[idx++] = (char *)ep92_event_avmute_text[0];
-
-	/* cc==0 signals n/a and is treated as stereo */
-	switch (ep92->ai.cc & EP92_AI_CH_COUNT_MASK) {
-	case 0:
-		env[idx++] = (char *)ep92_event_ch_count_text[1];
-		break;
-	case 1:
-		env[idx++] = (char *)ep92_event_ch_count_text[1];
-		break;
-	case 2:
-		env[idx++] = (char *)ep92_event_ch_count_text[2];
-		break;
-	case 3:
-		env[idx++] = (char *)ep92_event_ch_count_text[3];
-		break;
-	case 4:
-		env[idx++] = (char *)ep92_event_ch_count_text[4];
-		break;
-	case 5:
-		env[idx++] = (char *)ep92_event_ch_count_text[5];
-		break;
-	case 6:
-		env[idx++] = (char *)ep92_event_ch_count_text[6];
-		break;
-	case 7:
-		env[idx++] = (char *)ep92_event_ch_count_text[7];
-		break;
-	default:
-		env[idx++] = (char *)ep92_event_ch_count_text[1];
-	}
-
-	ptr = &ch_alloc_text[strlen(ch_alloc_text)-2];
-	ch_alloc = (ep92->ai.ca) & EP92_AI_CH_ALLOC_MASK;
-	*ptr++ = hex_to_char[(ch_alloc >> 4) & 0x0f];
-	*ptr++ = hex_to_char[ch_alloc & 0x0f];
-	env[idx++] = (char *)ch_alloc_text;
-
-	env[idx++] = NULL;
-
-	if (idx != EP92_UEVENT_AUDIO_NUM_KEYS) {
-		pr_err("ep92 wrong number of audio uevent keys (%d).\n",
-			idx);
-		return -EINVAL;
-	}
-
-	return kobject_uevent_env(&ep92_uevent_audio->kobj, KOBJ_CHANGE, env);
-}
-
 static void ep92_read_general_control(struct snd_soc_codec *codec,
 	struct ep92_pdata *ep92)
 {
 	u8 old, change;
-	bool send_uevent = false;
+	int val;
+
+	old = ep92->gi.tx_info;
+	ep92->gi.tx_info = snd_soc_read(codec, EP92_BI_GENERAL_INFO_0);
+	if (ep92->gi.tx_info == 0xff) {
+		pr_debug("ep92 EP92_BI_GENERAL_INFO_0 read 0xff\n");
+		ep92->gi.tx_info = old;
+	}
+	/* implement hysteresis to prevent events on glitches */
+	if (ep92->gi.tx_info & EP92_GI_TX_HOT_PLUG_MASK) {
+		if (ep92->hyst_tx_plug < EP92_HYST_CNT) {
+			ep92->hyst_tx_plug++;
+			if ((ep92->hyst_tx_plug == EP92_HYST_CNT) &&
+			    (ep92->filt_tx_plug == 0)) {
+				ep92->filt_tx_plug = 1;
+				pr_debug("ep92 out_plug changed to 1\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_OUT_PLUG=CONNECTED");
+			}
+		}
+	} else {
+		if (ep92->hyst_tx_plug > 0) {
+			ep92->hyst_tx_plug--;
+			if ((ep92->hyst_tx_plug == 0) &&
+			    (ep92->filt_tx_plug == 1)) {
+				ep92->filt_tx_plug = 0;
+				pr_debug("ep92 out_plug changed to 0\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_OUT_PLUG=DISCONNECTED");
+			}
+		}
+	}
+
+	old = ep92->gi.video_latency;
+	ep92->gi.video_latency = snd_soc_read(codec, EP92_BI_GENERAL_INFO_4);
+	if (ep92->gi.video_latency == 0xff) {
+		pr_debug("ep92 EP92_BI_GENERAL_INFO_4 read 0xff\n");
+		ep92->gi.video_latency = old;
+	}
+	change = ep92->gi.video_latency ^ old;
+	if (change & EP92_GI_VIDEO_LATENCY_MASK) {
+		val = ep92->gi.video_latency;
+		if (val > 0)
+			val = (val - 1) * 2;
+		pr_debug("ep92 video latency changed to %d\n", val);
+		ep92_send_uevent(ep92, "EP92EVT_VIDEO_LATENCY=CHANGED");
+	}
 
 	old = ep92->gc.ctl;
 	ep92->gc.ctl = snd_soc_read(codec, EP92_GENERAL_CONTROL_0);
+	if (ep92->gc.ctl == 0xff) {
+		pr_debug("ep92 EP92_GENERAL_CONTROL_0 read 0xff\n");
+		ep92->gc.ctl = old;
+	}
 	change = ep92->gc.ctl ^ old;
 	if (change & EP92_GC_POWER_MASK) {
-		pr_debug("ep92 power changed to %d (%s)\n",
-			(ep92->gc.ctl >> EP92_GC_POWER_SHIFT) &
-			EP92_2CHOICE_MASK,
-			ep92_off_on_text[(ep92->gc.ctl
-			>> EP92_GC_POWER_SHIFT) & EP92_2CHOICE_MASK]);
-		send_uevent = true;
+		val = (ep92->gc.ctl >> EP92_GC_POWER_SHIFT) &
+			EP92_2CHOICE_MASK;
+		pr_debug("ep92 power changed to %d\n", val);
+		if (val)
+			ep92_send_uevent(ep92, "EP92EVT_POWER=ON");
+		else
+			ep92_send_uevent(ep92, "EP92EVT_POWER=OFF");
 	}
 	if (change & EP92_GC_AUDIO_PATH_MASK) {
-		pr_debug("ep92 audio_path changed to %d (%s)\n",
-			(ep92->gc.ctl >> EP92_GC_AUDIO_PATH_SHIFT) &
-			EP92_2CHOICE_MASK,
-			ep92_aud_path_text[(ep92->gc.ctl
-			>> EP92_GC_AUDIO_PATH_SHIFT) & EP92_2CHOICE_MASK]);
-		send_uevent = true;
+		val = (ep92->gc.ctl >> EP92_GC_AUDIO_PATH_SHIFT) &
+			EP92_2CHOICE_MASK;
+		pr_debug("ep92 audio_path changed to %d\n", val);
+		if (val)
+			ep92_send_uevent(ep92, "EP92EVT_AUDIO_PATH=TV");
+		else
+			ep92_send_uevent(ep92, "EP92EVT_AUDIO_PATH=SPEAKER");
 	}
 	if (change & EP92_GC_CEC_MUTE_MASK) {
-		pr_debug("ep92 cec_mute changed to %d (%s)\n",
-			(ep92->gc.ctl >> EP92_GC_CEC_MUTE_SHIFT) &
-			EP92_2CHOICE_MASK,
-			ep92_cec_mute_text[(ep92->gc.ctl
-			>> EP92_GC_CEC_MUTE_SHIFT) & EP92_2CHOICE_MASK]);
-		send_uevent = true;
+		val = (ep92->gc.ctl >> EP92_GC_CEC_MUTE_SHIFT) &
+			EP92_2CHOICE_MASK;
+		pr_debug("ep92 cec_mute changed to %d\n", val);
+		if (val)
+			ep92_send_uevent(ep92, "EP92EVT_CEC_MUTE=NORMAL");
+		else
+			ep92_send_uevent(ep92, "EP92EVT_CEC_MUTE=MUTED");
 	}
 	if (change & EP92_GC_ARC_EN_MASK) {
-		pr_debug("ep92 arc_en changed to %d (%s)\n",
-			ep92->gc.ctl & EP92_2CHOICE_MASK,
-			ep92_off_on_text[ep92->gc.ctl & EP92_2CHOICE_MASK]);
-		send_uevent = true;
+		val = ep92->gc.ctl & EP92_2CHOICE_MASK;
+		pr_debug("ep92 arc_en changed to %d\n", val);
+		if (val)
+			ep92_send_uevent(ep92, "EP92EVT_ARC_EN=ON");
+		else
+			ep92_send_uevent(ep92, "EP92EVT_ARC_EN=OFF");
 	}
 
 	old = ep92->gc.rx_sel;
 	ep92->gc.rx_sel = snd_soc_read(codec, EP92_GENERAL_CONTROL_1);
+	if (ep92->gc.rx_sel == 0xff) {
+		pr_debug("ep92 EP92_GENERAL_CONTROL_1 read 0xff\n");
+		ep92->gc.rx_sel = old;
+	}
 	change = ep92->gc.rx_sel ^ old;
 	if (change & EP92_GC_RX_SEL_MASK) {
-		pr_debug("ep92 rx_sel changed to %d (%s)\n",
-			ep92->gc.rx_sel & EP92_GC_RX_SEL_MASK,
-			ep92_rx_sel_text[ep92->gc.rx_sel &
-			EP92_GC_RX_SEL_MASK]);
-		send_uevent = true;
+		val = ep92->gc.rx_sel & EP92_GC_RX_SEL_MASK;
+		pr_debug("ep92 rx_sel changed to %d\n", val);
+		ep92_send_uevent(ep92, "EP92EVT_SRC_SEL=CHANGED");
 	}
 
 	old = ep92->gc.cec_volume;
 	ep92->gc.cec_volume = snd_soc_read(codec, EP92_GENERAL_CONTROL_3);
+	if (ep92->gc.cec_volume == 0xff) {
+		pr_debug("ep92 EP92_GENERAL_CONTROL_3 read 0xff\n");
+		ep92->gc.cec_volume = old;
+	}
 	change = ep92->gc.cec_volume ^ old;
 	if (change & EP92_GC_CEC_VOLUME_MASK) {
-		pr_debug("ep92 cec_volume changed to %d\n",
-			ep92->gc.cec_volume & EP92_GC_CEC_VOLUME_MASK);
-		send_uevent = true;
+		val = ep92->gc.cec_volume & EP92_GC_CEC_VOLUME_MASK;
+		pr_debug("ep92 cec_volume changed to %d\n", val);
+		ep92_send_uevent(ep92, "EP92EVT_CEC_VOLUME=CHANGED");
 	}
 
-	if (send_uevent)
-		ep92_send_uevent_ctrl(ep92);
+	old = ep92->gc.link;
+	ep92->gc.link = snd_soc_read(codec, EP92_GENERAL_CONTROL_4);
+	if (ep92->gc.link == 0xff) {
+		pr_debug("ep92 EP92_GENERAL_CONTROL_4 read 0xff\n");
+		ep92->gc.link = old;
+	}
+
+	/* implement hysteresis to prevent events on glitches */
+	if (ep92->gc.link & EP92_GC_LINK_ON0_MASK) {
+		if (ep92->hyst_link_on0 < EP92_HYST_CNT) {
+			ep92->hyst_link_on0++;
+			if ((ep92->hyst_link_on0 == EP92_HYST_CNT) &&
+			    (ep92->filt_link_on0 == 0)) {
+				ep92->filt_link_on0 = 1;
+				pr_debug("ep92 link_on0 changed to 1\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_LINK_ON0=CONNECTED");
+			}
+		}
+	} else {
+		if (ep92->hyst_link_on0 > 0) {
+			ep92->hyst_link_on0--;
+			if ((ep92->hyst_link_on0 == 0) &&
+			    (ep92->filt_link_on0 == 1)) {
+				ep92->filt_link_on0 = 0;
+				pr_debug("ep92 link_on0 changed to 0\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_LINK_ON0=DISCONNECTED");
+			}
+		}
+	}
+
+	/* implement hysteresis to prevent events on glitches */
+	if (ep92->gc.link & EP92_GC_LINK_ON1_MASK) {
+		if (ep92->hyst_link_on1 < EP92_HYST_CNT) {
+			ep92->hyst_link_on1++;
+			if ((ep92->hyst_link_on1 == EP92_HYST_CNT) &&
+			    (ep92->filt_link_on1 == 0)) {
+				ep92->filt_link_on1 = 1;
+				pr_debug("ep92 link_on1 changed to 1\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_LINK_ON1=CONNECTED");
+			}
+		}
+	} else {
+		if (ep92->hyst_link_on1 > 0) {
+			ep92->hyst_link_on1--;
+			if ((ep92->hyst_link_on1 == 0) &&
+			    (ep92->filt_link_on1 == 1)) {
+				ep92->filt_link_on1 = 0;
+				pr_debug("ep92 link_on1 changed to 0\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_LINK_ON1=DISCONNECTED");
+			}
+		}
+	}
+
+	/* implement hysteresis to prevent events on glitches */
+	if (ep92->gc.link & EP92_GC_LINK_ON2_MASK) {
+		if (ep92->hyst_link_on2 < EP92_HYST_CNT) {
+			ep92->hyst_link_on2++;
+			if ((ep92->hyst_link_on2 == EP92_HYST_CNT) &&
+			    (ep92->filt_link_on2 == 0)) {
+				ep92->filt_link_on2 = 1;
+				pr_debug("ep92 link_on2 changed to 1\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_LINK_ON2=CONNECTED");
+			}
+		}
+	} else {
+		if (ep92->hyst_link_on2 > 0) {
+			ep92->hyst_link_on2--;
+			if ((ep92->hyst_link_on2 == 0) &&
+			    (ep92->filt_link_on2 == 1)) {
+				ep92->filt_link_on2 = 0;
+				pr_debug("ep92 link_on2 changed to 0\n");
+				ep92_send_uevent(ep92,
+					"EP92EVT_LINK_ON2=DISCONNECTED");
+			}
+		}
+	}
 }
 
 static void ep92_read_audio_info(struct snd_soc_codec *codec,
@@ -1003,34 +542,36 @@
 	old = ep92->ai.system_status_0;
 	ep92->ai.system_status_0 = snd_soc_read(codec,
 		EP92_AUDIO_INFO_SYSTEM_STATUS_0);
+	if (ep92->ai.system_status_0 == 0xff) {
+		pr_debug("ep92 EP92_AUDIO_INFO_SYSTEM_STATUS_0 read 0xff\n");
+		ep92->ai.system_status_0 = old;
+	}
 	change = ep92->ai.system_status_0 ^ old;
 	if (change & EP92_AI_MCLK_ON_MASK) {
-		pr_debug("ep92 status changed to %d (%s)\n",
+		pr_debug("ep92 status changed to %d\n",
 			(ep92->ai.system_status_0 >> EP92_AI_MCLK_ON_SHIFT) &
-			EP92_2CHOICE_MASK,
-			ep92_state_text[(ep92->ai.system_status_0
-			>> EP92_AI_MCLK_ON_SHIFT) & EP92_2CHOICE_MASK]);
+			EP92_2CHOICE_MASK);
 		send_uevent = true;
 	}
 	if (change & EP92_AI_AVMUTE_MASK) {
-		pr_debug("ep92 avmute changed to %d (%s)\n",
+		pr_debug("ep92 avmute changed to %d\n",
 			(ep92->ai.system_status_0 >> EP92_AI_AVMUTE_SHIFT) &
-			EP92_2CHOICE_MASK,
-			ep92_avmute_text[(ep92->ai.system_status_0
-			>> EP92_AI_AVMUTE_SHIFT) & EP92_2CHOICE_MASK]);
+			EP92_2CHOICE_MASK);
 		send_uevent = true;
 	}
 	if (change & EP92_AI_LAYOUT_MASK) {
-		pr_debug("ep92 layout changed to %d (%s)\n",
-			(ep92->ai.system_status_0) & EP92_2CHOICE_MASK,
-			ep92_layout_text[(ep92->ai.system_status_0) &
-			EP92_2CHOICE_MASK]);
+		pr_debug("ep92 layout changed to %d\n",
+			(ep92->ai.system_status_0) & EP92_2CHOICE_MASK);
 		send_uevent = true;
 	}
 
 	old = ep92->ai.audio_status;
 	ep92->ai.audio_status = snd_soc_read(codec,
 		EP92_AUDIO_INFO_AUDIO_STATUS);
+	if (ep92->ai.audio_status == 0xff) {
+		pr_debug("ep92 EP92_AUDIO_INFO_AUDIO_STATUS read 0xff\n");
+		ep92->ai.audio_status = old;
+	}
 	change = ep92->ai.audio_status ^ old;
 	if (change & EP92_AI_RATE_MASK) {
 		pr_debug("ep92 rate changed to %d\n",
@@ -1041,8 +582,13 @@
 
 	new_mode = ep92->old_mode;
 	if (ep92->ai.audio_status & EP92_AI_STD_ADO_MASK) {
+		old = ep92->ai.cs[0];
 		ep92->ai.cs[0] = snd_soc_read(codec,
 			EP92_AUDIO_INFO_CHANNEL_STATUS_0);
+		if (ep92->ai.cs[0] == 0xff) {
+			pr_debug("ep92 EP92_AUDIO_INFO_CHANNEL_STATUS_0 read 0xff\n");
+			ep92->ai.cs[0] = old;
+		}
 		if (ep92->ai.cs[0] & EP92_AI_NPCM_MASK)
 			new_mode = 1; /* Compr */
 		else
@@ -1051,14 +597,17 @@
 		new_mode = 1; /* Compr */
 
 	if (ep92->old_mode != new_mode) {
-		pr_debug("ep92 mode changed to %d (%s)\n", new_mode,
-			ep92_mode_text[new_mode]);
+		pr_debug("ep92 mode changed to %d\n", new_mode);
 		send_uevent = true;
 	}
 	ep92->old_mode = new_mode;
 
 	old = ep92->ai.cc;
 	ep92->ai.cc = snd_soc_read(codec, EP92_AUDIO_INFO_ADO_INFO_FRAME_1);
+	if (ep92->ai.cc == 0xff) {
+		pr_debug("ep92 EP92_AUDIO_INFO_ADO_INFO_FRAME_1 read 0xff\n");
+		ep92->ai.cc = old;
+	}
 	change = ep92->ai.cc ^ old;
 	if (change & EP92_AI_CH_COUNT_MASK) {
 		pr_debug("ep92 ch_count changed to %d (%d)\n",
@@ -1070,6 +619,10 @@
 
 	old = ep92->ai.ca;
 	ep92->ai.ca = snd_soc_read(codec, EP92_AUDIO_INFO_ADO_INFO_FRAME_4);
+	if (ep92->ai.ca == 0xff) {
+		pr_debug("ep92 EP92_AUDIO_INFO_ADO_INFO_FRAME_4 read 0xff\n");
+		ep92->ai.ca = old;
+	}
 	change = ep92->ai.ca ^ old;
 	if (change & EP92_AI_CH_ALLOC_MASK) {
 		pr_debug("ep92 ch_alloc changed to 0x%02x\n",
@@ -1078,7 +631,7 @@
 	}
 
 	if (send_uevent)
-		ep92_send_uevent_audio(ep92);
+		ep92_send_uevent(ep92, "EP92EVT_AUDIO=MEDIA_CONFIG_CHANGE");
 }
 
 static void ep92_init(struct snd_soc_codec *codec, struct ep92_pdata *ep92)
@@ -1117,10 +670,6 @@
 	.probe  = ep92_probe,
 	.remove = ep92_remove,
 	.get_regmap = ep92_get_regmap,
-	.component_driver = {
-		.controls = ep92_snd_controls,
-		.num_controls = ARRAY_SIZE(ep92_snd_controls),
-	},
 };
 
 static struct regmap_config ep92_regmap_config = {
@@ -1205,11 +754,712 @@
 };
 MODULE_DEVICE_TABLE(of, ep92_of_match);
 
+static ssize_t ep92_sysfs_rda_audio_state(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->ai.system_status_0 & EP92_AI_MCLK_ON_MASK) >>
+		EP92_AI_MCLK_ON_SHIFT;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_audio_format(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->old_mode;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_audio_rate(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92_samp_freq_table[(ep92->ai.audio_status) &
+				   EP92_AI_RATE_MASK];
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_audio_layout(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->ai.system_status_0 & EP92_AI_LAYOUT_MASK) >>
+		EP92_AI_LAYOUT_SHIFT;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_audio_ch_count(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->ai.cc & EP92_AI_CH_COUNT_MASK;
+	/* mapping is ch_count = reg_val + 1, with exception: 0 = unknown */
+	if (val > 0)
+		val += 1;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_audio_ch_alloc(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->ai.ca & EP92_AI_CH_ALLOC_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_avmute(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+
+	val = (ep92->ai.system_status_0 >> EP92_AI_AVMUTE_SHIFT) &
+		EP92_2CHOICE_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_link_on0(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->filt_link_on0;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_link_on1(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->filt_link_on1;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_link_on2(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->filt_link_on2;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_out_plug(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->filt_tx_plug;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_video_latency(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->gi.video_latency & EP92_GI_VIDEO_LATENCY_MASK;
+	if (val > 0)
+		val = (val - 1) * 2;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_rda_arc_disable(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->gc.ctl2 >> EP92_GC_ARC_DIS_SHIFT) &
+		EP92_2CHOICE_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_arc_disable(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > 1)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_2);
+	reg &= ~EP92_GC_ARC_DIS_MASK;
+	reg |= ((val << EP92_GC_ARC_DIS_SHIFT) & EP92_GC_ARC_DIS_MASK);
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_2, reg);
+	ep92->gc.ctl2 &= ~EP92_GC_ARC_DIS_MASK;
+	ep92->gc.ctl2 |= (val << EP92_GC_ARC_DIS_SHIFT) & EP92_GC_ARC_DIS_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static ssize_t ep92_sysfs_rda_power(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->gc.ctl >> EP92_GC_POWER_SHIFT) & EP92_2CHOICE_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_power(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > 1)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0);
+	reg &= ~EP92_GC_POWER_MASK;
+	reg |= (val << EP92_GC_POWER_SHIFT) & EP92_GC_POWER_MASK;
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg);
+	ep92->gc.ctl &= ~EP92_GC_POWER_MASK;
+	ep92->gc.ctl |= (val << EP92_GC_POWER_SHIFT) & EP92_GC_POWER_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static ssize_t ep92_sysfs_rda_audio_path(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->gc.ctl >> EP92_GC_AUDIO_PATH_SHIFT) & EP92_2CHOICE_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_audio_path(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > 1)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0);
+	reg &= ~EP92_GC_AUDIO_PATH_MASK;
+	reg |= (val << EP92_GC_AUDIO_PATH_SHIFT) & EP92_GC_AUDIO_PATH_MASK;
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg);
+	ep92->gc.ctl &= ~EP92_GC_AUDIO_PATH_MASK;
+	ep92->gc.ctl |= (val << EP92_GC_AUDIO_PATH_SHIFT) &
+		EP92_GC_AUDIO_PATH_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static ssize_t ep92_sysfs_rda_src_sel(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = ep92->gc.rx_sel & EP92_GC_RX_SEL_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_src_sel(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > 7)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_1);
+	reg &= ~EP92_GC_RX_SEL_MASK;
+	reg |= (val << EP92_GC_RX_SEL_SHIFT) & EP92_GC_RX_SEL_MASK;
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_1, reg);
+	ep92->gc.rx_sel &= ~EP92_GC_RX_SEL_MASK;
+	ep92->gc.rx_sel |= (val << EP92_GC_RX_SEL_SHIFT) & EP92_GC_RX_SEL_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static ssize_t ep92_sysfs_rda_arc_enable(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->gc.ctl >> EP92_GC_ARC_EN_SHIFT) & EP92_2CHOICE_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_arc_enable(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > 1)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0);
+	reg &= ~EP92_GC_AUDIO_PATH_MASK;
+	reg |= (val << EP92_GC_AUDIO_PATH_SHIFT) & EP92_GC_AUDIO_PATH_MASK;
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg);
+	ep92->gc.ctl &= ~EP92_GC_AUDIO_PATH_MASK;
+	ep92->gc.ctl |= (val << EP92_GC_AUDIO_PATH_SHIFT) &
+		EP92_GC_AUDIO_PATH_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static ssize_t ep92_sysfs_rda_cec_mute(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->gc.ctl >> EP92_GC_CEC_MUTE_SHIFT) & EP92_2CHOICE_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_cec_mute(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > 1)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = snd_soc_read(ep92->codec, EP92_GENERAL_CONTROL_0);
+	reg &= ~EP92_GC_CEC_MUTE_MASK;
+	reg |= (val << EP92_GC_CEC_MUTE_SHIFT) & EP92_GC_CEC_MUTE_MASK;
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_0, reg);
+	ep92->gc.ctl &= ~EP92_GC_CEC_MUTE_MASK;
+	ep92->gc.ctl |= (val << EP92_GC_CEC_MUTE_SHIFT) &
+		EP92_GC_CEC_MUTE_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static ssize_t ep92_sysfs_rda_cec_volume(struct device *dev,
+	struct device_attribute *attr, char *buf)
+{
+	ssize_t ret;
+	int val;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	val = (ep92->gc.cec_volume >> EP92_GC_CEC_VOLUME_SHIFT) &
+		EP92_GC_CEC_VOLUME_MASK;
+
+	ret = snprintf(buf, EP92_SYSFS_ENTRY_MAX_LEN, "%d\n", val);
+	pr_debug("%s: '%d'\n", __func__, val);
+
+	return ret;
+}
+
+static ssize_t ep92_sysfs_wta_cec_volume(struct device *dev,
+	struct device_attribute *attr, const char *buf, size_t count)
+{
+	int reg, val, rc;
+	struct ep92_pdata *ep92 = dev_get_drvdata(dev);
+
+	if (!ep92) {
+		pr_err("%s: invalid input\n", __func__);
+		return -EINVAL;
+	}
+
+	rc = kstrtoint(buf, 10, &val);
+	if (rc) {
+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
+		goto end;
+	}
+	if ((val < 0) || (val > EP92_GC_CEC_VOLUME_MAX)) {
+		pr_err("%s: value out of range.\n", __func__);
+		rc = -EINVAL;
+		goto end;
+	}
+
+	reg = val & EP92_GC_CEC_VOLUME_MASK;
+	snd_soc_write(ep92->codec, EP92_GENERAL_CONTROL_3, reg);
+	ep92->gc.cec_volume = val & EP92_GC_CEC_VOLUME_MASK;
+
+	rc = strnlen(buf, EP92_SYSFS_ENTRY_MAX_LEN);
+end:
+	return rc;
+}
+
+static DEVICE_ATTR(audio_state, 0444, ep92_sysfs_rda_audio_state, NULL);
+static DEVICE_ATTR(audio_format, 0444, ep92_sysfs_rda_audio_format, NULL);
+static DEVICE_ATTR(audio_rate, 0444, ep92_sysfs_rda_audio_rate, NULL);
+static DEVICE_ATTR(audio_layout, 0444, ep92_sysfs_rda_audio_layout, NULL);
+static DEVICE_ATTR(audio_ch_count, 0444, ep92_sysfs_rda_audio_ch_count, NULL);
+static DEVICE_ATTR(audio_ch_alloc, 0444, ep92_sysfs_rda_audio_ch_alloc, NULL);
+static DEVICE_ATTR(audio_avmute, 0444, ep92_sysfs_rda_avmute, NULL);
+static DEVICE_ATTR(link_on0, 0444, ep92_sysfs_rda_link_on0, NULL);
+static DEVICE_ATTR(link_on1, 0444, ep92_sysfs_rda_link_on1, NULL);
+static DEVICE_ATTR(link_on2, 0444, ep92_sysfs_rda_link_on2, NULL);
+static DEVICE_ATTR(out_plug, 0444, ep92_sysfs_rda_out_plug, NULL);
+static DEVICE_ATTR(video_latency, 0444, ep92_sysfs_rda_video_latency, NULL);
+static DEVICE_ATTR(arc_disable, 0644, ep92_sysfs_rda_arc_disable,
+	ep92_sysfs_wta_arc_disable);
+static DEVICE_ATTR(power_on, 0644, ep92_sysfs_rda_power, ep92_sysfs_wta_power);
+static DEVICE_ATTR(audio_path, 0644, ep92_sysfs_rda_audio_path,
+	ep92_sysfs_wta_audio_path);
+static DEVICE_ATTR(src_sel, 0644, ep92_sysfs_rda_src_sel,
+	ep92_sysfs_wta_src_sel);
+static DEVICE_ATTR(arc_enable, 0644, ep92_sysfs_rda_arc_enable,
+	ep92_sysfs_wta_arc_enable);
+static DEVICE_ATTR(cec_mute, 0644, ep92_sysfs_rda_cec_mute,
+	ep92_sysfs_wta_cec_mute);
+static DEVICE_ATTR(cec_volume, 0644, ep92_sysfs_rda_cec_volume,
+	ep92_sysfs_wta_cec_volume);
+
+static struct attribute *ep92_fs_attrs[] = {
+	&dev_attr_audio_state.attr,
+	&dev_attr_audio_format.attr,
+	&dev_attr_audio_rate.attr,
+	&dev_attr_audio_layout.attr,
+	&dev_attr_audio_ch_count.attr,
+	&dev_attr_audio_ch_alloc.attr,
+	&dev_attr_audio_avmute.attr,
+	&dev_attr_link_on0.attr,
+	&dev_attr_link_on1.attr,
+	&dev_attr_link_on2.attr,
+	&dev_attr_out_plug.attr,
+	&dev_attr_video_latency.attr,
+	&dev_attr_arc_disable.attr,
+	&dev_attr_power_on.attr,
+	&dev_attr_audio_path.attr,
+	&dev_attr_src_sel.attr,
+	&dev_attr_arc_enable.attr,
+	&dev_attr_cec_mute.attr,
+	&dev_attr_cec_volume.attr,
+	NULL,
+};
+
+static struct attribute_group ep92_fs_attrs_group = {
+	.attrs = ep92_fs_attrs,
+};
+
+static int ep92_sysfs_create(struct i2c_client *client,
+	struct ep92_pdata *ep92)
+{
+	int rc;
+
+	rc = sysfs_create_group(&client->dev.kobj, &ep92_fs_attrs_group);
+
+	return rc;
+}
+
+static void ep92_sysfs_remove(struct i2c_client *client,
+	struct ep92_pdata *ep92)
+{
+	sysfs_remove_group(&client->dev.kobj, &ep92_fs_attrs_group);
+}
+
 static int ep92_i2c_probe(struct i2c_client *client,
 	const struct i2c_device_id *id)
 {
 	struct ep92_pdata *ep92;
 	int ret;
+#if IS_ENABLED(CONFIG_DEBUG_FS)
+	char debugfs_dir_name[32];
+#endif
 
 	ep92 = devm_kzalloc(&client->dev, sizeof(struct ep92_pdata),
 		GFP_KERNEL);
@@ -1220,8 +1470,8 @@
 	if (IS_ERR(ep92->regmap)) {
 		ret = PTR_ERR(ep92->regmap);
 		dev_err(&client->dev,
-			"%s %d: Failed to allocate regmap for I2C device: %d\n",
-			__func__,  __LINE__, ret);
+			"%s: Failed to allocate regmap for I2C device: %d\n",
+			__func__, ret);
 		return ret;
 	}
 
@@ -1249,6 +1499,39 @@
 			msecs_to_jiffies(EP92_POLL_INTERVAL_OFF_MSEC));
 	}
 
+#if IS_ENABLED(CONFIG_DEBUG_FS)
+	/* debugfs interface */
+	snprintf(debugfs_dir_name, sizeof(debugfs_dir_name), "%s-%s",
+		client->name, dev_name(&client->dev));
+	ep92->debugfs_dir = debugfs_create_dir(debugfs_dir_name, NULL);
+	if (!ep92->debugfs_dir) {
+		dev_dbg(&client->dev,
+			"%s: Failed to create /sys/kernel/debug/%s for debugfs\n",
+			__func__, debugfs_dir_name);
+		return -ENOMEM;
+	}
+	ep92->debugfs_file_wo = debugfs_create_file(
+		"write_reg_val", S_IFREG | 0444, ep92->debugfs_dir,
+		(void *) ep92,
+		&debugfs_codec_ops);
+	if (!ep92->debugfs_file_wo) {
+		dev_dbg(&client->dev,
+			"%s: Failed to create /sys/kernel/debug/%s/write_reg_val\n",
+			__func__, debugfs_dir_name);
+		return -ENOMEM;
+	}
+	ep92->debugfs_file_ro = debugfs_create_file(
+		"show_reg_dump", S_IFREG | 0444, ep92->debugfs_dir,
+		(void *) ep92,
+		&debugfs_codec_ops);
+	if (!ep92->debugfs_file_ro) {
+		dev_dbg(&client->dev,
+			"%s: Failed to create /sys/kernel/debug/%s/show_reg_dump\n",
+			__func__, debugfs_dir_name);
+		return -ENOMEM;
+	}
+#endif /* CONFIG_DEBUG_FS */
+
 	/* register codec */
 	ret = snd_soc_register_codec(&client->dev, &soc_codec_drv_ep92,
 		ep92_dai, ARRAY_SIZE(ep92_dai));
@@ -1259,58 +1542,15 @@
 		goto err_reg;
 	}
 
-	/* Create a kset under /sys/kernel/ */
-	ep92_uevent_kset = kset_create_and_add("ep92-hdmi", NULL, kernel_kobj);
-	if (!ep92_uevent_kset) {
-		pr_err("%s: error creating uevent kernel set", __func__);
-		ret = -EINVAL;
-		goto err_kset;
-	}
-
-	/* uevent to signal control changes */
-	ep92_uevent_ctrl = devm_kzalloc(&client->dev,
-		sizeof(*ep92_uevent_ctrl), GFP_KERNEL);
-	if (!ep92_uevent_ctrl) {
-		ret = -ENOMEM;
-		goto err_ue_ctrl;
-	}
-
-	ep92_uevent_ctrl->ktype.release = ep92_release_uevent_data;
-	ret = ep92_init_uevent_data(ep92_uevent_ctrl, "ctrl-uevent");
+	ret = ep92_sysfs_create(client, ep92);
 	if (ret) {
-		dev_err(&client->dev,
-			"%s: Failed to init ctrl-uevent: %d\n",
-			__func__, ret);
-		goto err_ue_init_ctrl;
+		pr_err("%s: sysfs creation failed ret=%d\n", __func__, ret);
+		goto err_sysfs;
 	}
 
-	/* uevent to signal audio format changes */
-	ep92_uevent_audio = devm_kzalloc(&client->dev,
-		sizeof(*ep92_uevent_audio), GFP_KERNEL);
-	if (!ep92_uevent_audio) {
-		ret = -ENOMEM;
-		goto err_ue_audio;
-	}
-
-	ep92_uevent_audio->ktype.release = ep92_release_uevent_data;
-	ret = ep92_init_uevent_data(ep92_uevent_audio, "audio-uevent");
-	if (ret) {
-		dev_err(&client->dev,
-			"%s: Failed to init ctrl-uevent: %d\n",
-			__func__, ret);
-		goto err_ue_init_audio;
-	}
 	return 0;
 
-err_ue_init_audio:
-	devm_kfree(&client->dev, ep92_uevent_audio);
-err_ue_audio:
-	ep92_destroy_uevent_data(ep92_uevent_ctrl);
-err_ue_init_ctrl:
-	devm_kfree(&client->dev, ep92_uevent_ctrl);
-err_ue_ctrl:
-	kset_unregister(ep92_uevent_kset);
-err_kset:
+err_sysfs:
 	snd_soc_unregister_codec(&client->dev);
 err_reg:
 	if (ep92->irq == 0)
@@ -1324,21 +1564,17 @@
 	struct ep92_pdata *ep92;
 
 	ep92 = i2c_get_clientdata(client);
-	if ((ep92 != NULL) && (ep92->irq == 0))
-		del_timer(&ep92->timer);
+	if (ep92) {
+		if (ep92->irq == 0)
+			del_timer(&ep92->timer);
 
+#if IS_ENABLED(CONFIG_DEBUG_FS)
+		debugfs_remove_recursive(ep92->debugfs_dir);
+#endif
+	}
 	snd_soc_unregister_codec(&client->dev);
 
-	ep92_destroy_uevent_data(ep92_uevent_ctrl);
-	devm_kfree(&client->dev, ep92_uevent_ctrl);
-
-	ep92_destroy_uevent_data(ep92_uevent_audio);
-	devm_kfree(&client->dev, ep92_uevent_audio);
-
-	if (ep92_uevent_kset) {
-		kset_unregister(ep92_uevent_kset);
-		ep92_uevent_kset = NULL;
-	}
+	ep92_sysfs_remove(client, ep92);
 
 	return 0;
 }
diff --git a/asoc/codecs/ep92/ep92.h b/asoc/codecs/ep92/ep92.h
index 237c9ea..ad067ea 100644
--- a/asoc/codecs/ep92/ep92.h
+++ b/asoc/codecs/ep92/ep92.h
@@ -139,8 +139,13 @@
  * GC = General Control
  * AI = Audio Info
  */
-#define EP92_GI_ADO_CHF_MASK     0x01
-#define EP92_GI_CEC_ECF_MASK     0x02
+#define EP92_GI_ADO_CHF_MASK        0x01
+#define EP92_GI_CEC_ECF_MASK        0x02
+#define EP92_GI_TX_HOT_PLUG_SHIFT   7
+#define EP92_GI_TX_HOT_PLUG_MASK    0x80
+#define EP92_GI_VIDEO_LATENCY_SHIFT 0
+#define EP92_GI_VIDEO_LATENCY_MASK  0xff
+
 #define EP92_GC_POWER_SHIFT      7
 #define EP92_GC_POWER_MASK       0x80
 #define EP92_GC_AUDIO_PATH_SHIFT 5
@@ -149,10 +154,19 @@
 #define EP92_GC_CEC_MUTE_MASK    0x02
 #define EP92_GC_ARC_EN_SHIFT     0
 #define EP92_GC_ARC_EN_MASK      0x01
+#define EP92_GC_ARC_DIS_SHIFT    6
+#define EP92_GC_ARC_DIS_MASK     0x40
 #define EP92_GC_RX_SEL_SHIFT     0
 #define EP92_GC_RX_SEL_MASK      0x07
 #define EP92_GC_CEC_VOLUME_SHIFT 0
 #define EP92_GC_CEC_VOLUME_MASK  0xff
+#define EP92_GC_LINK_ON0_SHIFT   0
+#define EP92_GC_LINK_ON0_MASK    0x01
+#define EP92_GC_LINK_ON1_SHIFT   1
+#define EP92_GC_LINK_ON1_MASK    0x02
+#define EP92_GC_LINK_ON2_SHIFT   2
+#define EP92_GC_LINK_ON2_MASK    0x04
+
 #define EP92_AI_MCLK_ON_SHIFT    6
 #define EP92_AI_MCLK_ON_MASK     0x40
 #define EP92_AI_AVMUTE_SHIFT     5
diff --git a/asoc/codecs/wcd-irq.c b/asoc/codecs/wcd-irq.c
index 12bbf36..48495f5 100644
--- a/asoc/codecs/wcd-irq.c
+++ b/asoc/codecs/wcd-irq.c
@@ -101,7 +101,7 @@
 	if (!irq_info)
 		pr_err("%s: Null IRQ handle\n", __func__);
 	else
-		disable_irq(wcd_map_irq(irq_info, irq));
+		disable_irq_nosync(wcd_map_irq(irq_info, irq));
 }
 EXPORT_SYMBOL(wcd_disable_irq);
 
diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c
index 2a6d829..34868fa 100644
--- a/asoc/codecs/wcd934x/wcd934x.c
+++ b/asoc/codecs/wcd934x/wcd934x.c
@@ -2974,6 +2974,11 @@
 			tavil->swr.rx_8_count++;
 		ch_cnt = !!(tavil->swr.rx_7_count) + tavil->swr.rx_8_count;
 
+		if (wcd9xxx_get_current_power_state(tavil->wcd9xxx,
+						WCD9XXX_DIG_CORE_REGION_1)
+					!= WCD_REGION_POWER_COLLAPSE_REMOVE)
+			goto done;
+
 		swrm_wcd_notify(tavil->swr.ctrl_data[0].swr_pdev,
 				SWR_DEVICE_UP, NULL);
 		swrm_wcd_notify(tavil->swr.ctrl_data[0].swr_pdev,
@@ -2994,6 +2999,7 @@
 
 		break;
 	}
+done:
 	dev_dbg(tavil->dev, "%s: %s: current swr ch cnt: %d\n",
 		__func__, w->name, ch_cnt);
 
diff --git a/asoc/codecs/wcd937x/wcd937x-tables.c b/asoc/codecs/wcd937x/wcd937x-tables.c
index 7050730..5baf773 100644
--- a/asoc/codecs/wcd937x/wcd937x-tables.c
+++ b/asoc/codecs/wcd937x/wcd937x-tables.c
@@ -178,7 +178,6 @@
 	[WCD937X_REG(WCD937X_EAR_TEST_CTL)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_EAR_STATUS_REG_1)] = RD_REG,
 	[WCD937X_REG(WCD937X_EAR_STATUS_REG_2)] = RD_REG,
-	[WCD937X_REG(WCD937X_ANA_NEW_PAGE_REGISTER)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_HPH_NEW_ANA_HPH2)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_HPH_NEW_ANA_HPH3)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_SLEEP_CTL)] = RD_WR_REG,
@@ -195,8 +194,8 @@
 	[WCD937X_REG(WCD937X_AUX_AUXPA)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_LDORXTX_MODE)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_LDORXTX_CONFIG)] = RD_WR_REG,
-	[WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_EN)] = RD_REG,
-	[WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_OUT)] = RD_WR_REG,
+	[WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_EN)] = RD_WR_REG,
+	[WCD937X_REG(WCD937X_DIE_CRACK_DIE_CRK_DET_OUT)] = RD_REG,
 	[WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_GAIN_CTL)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_HD2_CTL_L)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_HPH_NEW_INT_RDAC_VREF_CTL)] = RD_WR_REG,
@@ -241,7 +240,6 @@
 	[WCD937X_REG(WCD937X_SLEEP_INT_WATCHDOG_CTL_2)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT1)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIE_CRACK_INT_DIE_CRK_DET_INT2)] = RD_WR_REG,
-	[WCD937X_REG(WCD937X_DIGITAL_PAGE_REGISTER)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CHIP_ID0)] = RD_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CHIP_ID1)] = RD_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CHIP_ID2)] = RD_REG,
@@ -282,9 +280,9 @@
 	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R2)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R3)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG,
-	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG,
-	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG,
-	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R4)] = RD_WR_REG,
+	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R5)] = RD_WR_REG,
+	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R6)] = RD_WR_REG,
+	[WCD937X_REG(WCD937X_DIGITAL_CDC_HPH_DSM_R7)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A1_0)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A1_1)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_CDC_AUX_DSM_A2_0)] = RD_WR_REG,
@@ -375,6 +373,7 @@
 	[WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_RX2)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_TX)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_PAD_CTL_PDM_TX)] = RD_WR_REG,
+	[WCD937X_REG(WCD937X_DIGITAL_PAD_INP_DIS_0)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_PAD_INP_DIS_1)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_0)] = RD_WR_REG,
 	[WCD937X_REG(WCD937X_DIGITAL_DRIVE_STRENGTH_1)] = RD_WR_REG,
diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c
index 0bdfda1..db9f2be 100644
--- a/asoc/codecs/wcd937x/wcd937x.c
+++ b/asoc/codecs/wcd937x/wcd937x.c
@@ -81,6 +81,9 @@
 	.num_regs = 3,
 	.status_base = WCD937X_DIGITAL_INTR_STATUS_0,
 	.mask_base = WCD937X_DIGITAL_INTR_MASK_0,
+	.ack_base = WCD937X_DIGITAL_INTR_CLEAR_0,
+	.use_ack = 1,
+	.clear_ack = 1,
 	.type_base = WCD937X_DIGITAL_INTR_LEVEL_0,
 	.runtime_pm = false,
 	.handle_post_irq = wcd937x_handle_post_irq,
@@ -89,35 +92,14 @@
 static int wcd937x_handle_post_irq(void *data)
 {
 	struct wcd937x_priv *wcd937x = data;
-	int val = 0;
-	struct wcd937x_pdata *pdata = NULL;
+	u32 status1 = 0, status2 = 0, status3 = 0;
 
-	pdata = dev_get_platdata(wcd937x->dev);
+	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_0, &status1);
+	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_1, &status2);
+	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_2, &status3);
 
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_0, &val);
-	dev_dbg(wcd937x->dev, "%s Clear OCP interupts\n", __func__);
-	regmap_write(wcd937x->regmap,
-			   WCD937X_DIGITAL_INTR_CLEAR_0, 0xFF);
-	regmap_write(wcd937x->regmap,
-			   WCD937X_DIGITAL_INTR_CLEAR_0, 0x0);
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_1, &val);
-	dev_dbg(wcd937x->dev, "%s Clear SCD interupts\n", __func__);
-	regmap_write(wcd937x->regmap,
-			   WCD937X_DIGITAL_INTR_CLEAR_1, 0xFF);
-	regmap_write(wcd937x->regmap,
-			   WCD937X_DIGITAL_INTR_CLEAR_1, 0x0);
-
-	regmap_write(wcd937x->regmap,
-			   WCD937X_DIGITAL_INTR_CLEAR_2, 0xFF);
-	regmap_write(wcd937x->regmap,
-			   WCD937X_DIGITAL_INTR_CLEAR_2, 0x0);
-
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_0, &val);
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_1, &val);
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_STATUS_2, &val);
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_0, &val);
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_1, &val);
-	regmap_read(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_2, &val);
+	wcd937x->tx_swr_dev->slave_irq_pending =
+			((status1 || status2 || status3) ? true : false);
 
 	return IRQ_HANDLED;
 }
@@ -560,6 +542,9 @@
 	case SND_SOC_DAPM_PRE_PMU:
 		snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x10, 0x10);
 		usleep_range(100, 110);
+		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
+					    wcd937x->rx_swr_dev->dev_num,
+					    true);
 		break;
 	case SND_SOC_DAPM_POST_PMU:
 		usleep_range(7000, 7010);
@@ -567,9 +552,6 @@
 				    0x02, 0x02);
 		snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES,
 				    0x02, 0x02);
-		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
-					    wcd937x->rx_swr_dev->dev_num,
-					    true);
 		if (wcd937x->update_wcd_event)
 			wcd937x->update_wcd_event(wcd937x->handle,
 						WCD_BOLERO_EVT_RX_MUTE,
@@ -607,6 +589,9 @@
 	case SND_SOC_DAPM_PRE_PMU:
 		snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x20, 0x20);
 		usleep_range(100, 110);
+		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
+				    wcd937x->rx_swr_dev->dev_num,
+				    true);
 		break;
 	case SND_SOC_DAPM_POST_PMU:
 		usleep_range(7000, 7010);
@@ -614,9 +599,6 @@
 				    0x02, 0x02);
 		snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES,
 				    0x02, 0x02);
-		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
-				    wcd937x->rx_swr_dev->dev_num,
-				    true);
 		if (wcd937x->update_wcd_event)
 			wcd937x->update_wcd_event(wcd937x->handle,
 						WCD_BOLERO_EVT_RX_MUTE,
@@ -660,14 +642,14 @@
 		usleep_range(500, 510);
 		snd_soc_update_bits(codec, WCD937X_CLASSH_MODE_2, 0xFF, 0x3A);
 		usleep_range(500, 510);
+		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
+			    wcd937x->rx_swr_dev->dev_num,
+			    true);
 		break;
 	case SND_SOC_DAPM_POST_PMU:
 		usleep_range(1000, 1010);
 		snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES,
 				    0x20, 0x20);
-		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
-			    wcd937x->rx_swr_dev->dev_num,
-			    true);
 		if (wcd937x->update_wcd_event)
 			wcd937x->update_wcd_event(wcd937x->handle,
 						WCD_BOLERO_EVT_RX_MUTE,
@@ -705,14 +687,14 @@
 		usleep_range(500, 510);
 		snd_soc_update_bits(codec, WCD937X_CLASSH_MODE_2, 0xFF, 0x3A);
 		usleep_range(500, 510);
+		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
+			    wcd937x->rx_swr_dev->dev_num,
+			    true);
 		break;
 	case SND_SOC_DAPM_POST_PMU:
 		usleep_range(6000, 6010);
 		snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES,
 				    0x02, 0x02);
-		ret = swr_slvdev_datapath_control(wcd937x->rx_swr_dev,
-			    wcd937x->rx_swr_dev->dev_num,
-			    true);
 		if (wcd937x->update_wcd_event)
 			wcd937x->update_wcd_event(wcd937x->handle,
 						WCD_BOLERO_EVT_RX_MUTE,
@@ -1392,6 +1374,60 @@
 	return 0;
 }
 
+static int wcd937x_codec_enable_vdd_buck(struct snd_soc_dapm_widget *w,
+					 struct snd_kcontrol *kcontrol,
+					 int event)
+{
+	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
+	struct wcd937x_priv *wcd937x = snd_soc_codec_get_drvdata(codec);
+	struct wcd937x_pdata *pdata = NULL;
+	int ret = 0;
+
+	pdata = dev_get_platdata(wcd937x->dev);
+
+	if (!pdata) {
+		dev_err(codec->dev, "%s: pdata is NULL\n", __func__);
+		return -EINVAL;
+	}
+
+	dev_dbg(codec->dev, "%s wname: %s event: %d\n", __func__,
+		w->name, event);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		ret = msm_cdc_enable_ondemand_supply(wcd937x->dev,
+						wcd937x->supplies,
+						pdata->regulator,
+						pdata->num_supplies,
+						"cdc-vdd-buck");
+		if (ret == -EINVAL) {
+			dev_err(codec->dev, "%s: vdd buck is not enabled\n",
+				__func__);
+			return ret;
+		}
+		/*
+		 * 200us sleep is required after LDO15 is enabled as per
+		 * HW requirement
+		 */
+		usleep_range(200, 250);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		ret = msm_cdc_disable_ondemand_supply(wcd937x->dev,
+						wcd937x->supplies,
+						pdata->regulator,
+						pdata->num_supplies,
+						"cdc-vdd-buck");
+		if (ret == -EINVAL) {
+			dev_err(codec->dev, "%s: vdd buck is not enabled\n",
+				__func__);
+			return ret;
+		}
+
+		break;
+	}
+	return 0;
+}
+
 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",
@@ -1544,6 +1580,10 @@
 				SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
 				SND_SOC_DAPM_POST_PMD),
 
+	SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0,
+			     wcd937x_codec_enable_vdd_buck,
+			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+
 	/*rx widgets*/
 	SND_SOC_DAPM_PGA_E("EAR PGA", WCD937X_ANA_EAR, 7, 0, NULL, 0,
 				wcd937x_codec_enable_ear_pa,
@@ -1727,6 +1767,10 @@
 	{"EAR PGA", NULL, "EAR_RDAC"},
 	{"EAR", NULL, "EAR PGA"},
 
+	{"EAR", NULL, "VDD_BUCK"},
+	{"HPHR", NULL, "VDD_BUCK"},
+	{"HPHL", NULL, "VDD_BUCK"},
+	{"AUX", NULL, "VDD_BUCK"},
 };
 
 static const struct snd_soc_dapm_route wcd9375_audio_map[] = {
@@ -1885,6 +1929,19 @@
 		pr_err("%s: mbhc initialization failed\n", __func__);
 		goto err_hwdep;
 	}
+	snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
+	snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
+	snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
+	snd_soc_dapm_ignore_suspend(dapm, "IN1_HPHL");
+	snd_soc_dapm_ignore_suspend(dapm, "IN2_HPHR");
+	snd_soc_dapm_ignore_suspend(dapm, "IN3_AUX");
+	snd_soc_dapm_ignore_suspend(dapm, "ADC1_OUTPUT");
+	snd_soc_dapm_ignore_suspend(dapm, "ADC2_OUTPUT");
+	snd_soc_dapm_ignore_suspend(dapm, "EAR");
+	snd_soc_dapm_ignore_suspend(dapm, "AUX");
+	snd_soc_dapm_ignore_suspend(dapm, "HPHL");
+	snd_soc_dapm_ignore_suspend(dapm, "HPHR");
+	snd_soc_dapm_sync(dapm);
 
 	wcd937x_init_reg(codec);
 
@@ -1903,6 +1960,14 @@
 				__func__);
 			goto err_hwdep;
 		}
+		snd_soc_dapm_ignore_suspend(dapm, "AMIC4");
+		snd_soc_dapm_ignore_suspend(dapm, "DMIC1_OUTPUT");
+		snd_soc_dapm_ignore_suspend(dapm, "DMIC2_OUTPUT");
+		snd_soc_dapm_ignore_suspend(dapm, "DMIC3_OUTPUT");
+		snd_soc_dapm_ignore_suspend(dapm, "DMIC4_OUTPUT");
+		snd_soc_dapm_ignore_suspend(dapm, "DMIC5_OUTPUT");
+		snd_soc_dapm_ignore_suspend(dapm, "DMIC6_OUTPUT");
+		snd_soc_dapm_ignore_suspend(dapm, "ADC3_OUTPUT");
 		snd_soc_dapm_sync(dapm);
 	}
 	wcd937x->version = WCD937X_VERSION_1_0;
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index 6fb61da..e429a54 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -3284,7 +3284,7 @@
 	cstream = pdata->cstream[fe_id];
 	audio_effects = pdata->audio_effects[fe_id];
 	if (!cstream || !audio_effects) {
-		pr_err("%s: stream or effects inactive\n", __func__);
+		pr_debug("%s: stream or effects inactive\n", __func__);
 		return -EINVAL;
 	}
 	prtd = cstream->runtime->private_data;
diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c
index 359ebc4..3dc4509 100644
--- a/asoc/msm-dai-fe.c
+++ b/asoc/msm-dai-fe.c
@@ -2668,6 +2668,45 @@
 		.probe = fe_dai_probe,
 	},
 	{
+		.playback = {
+			.stream_name = "MultiMedia26 Playback",
+			.aif_name = "MM_DL26",
+			.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 = 32,
+			.rate_min = 8000,
+			.rate_max = 384000,
+		},
+		.ops = &msm_fe_Multimedia_dai_ops,
+		.compress_new = snd_soc_new_compress,
+		.name = "MultiMedia26",
+		.probe = fe_dai_probe,
+	},
+	{
+		.capture = {
+			.stream_name = "MultiMedia27 Capture",
+			.aif_name = "MM_UL27",
+			.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 = "MultiMedia27",
+		.probe = fe_dai_probe,
+	},
+	{
 		.capture = {
 		.stream_name = "MultiMedia28 Capture",
 		.aif_name = "MM_UL28",
diff --git a/asoc/msm-dai-q6-hdmi-v2.c b/asoc/msm-dai-q6-hdmi-v2.c
index bcf21b5..4291077 100644
--- a/asoc/msm-dai-q6-hdmi-v2.c
+++ b/asoc/msm-dai-q6-hdmi-v2.c
@@ -180,7 +180,7 @@
 	struct msm_dai_q6_hdmi_dai_data *dai_data = dev_get_drvdata(dai->dev);
 
 	if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) {
-		pr_err("%s:  afe port not started. status_mask = %ld\n",
+		pr_debug("%s:  afe port not started. status_mask = %ld\n",
 			__func__, *dai_data->status_mask);
 		goto done;
 	}
diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c
index 742457c..8b1dbd6 100644
--- a/asoc/msm-dai-q6-v2.c
+++ b/asoc/msm-dai-q6-v2.c
@@ -2176,6 +2176,8 @@
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_RX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_RX:
+	case SLIMBUS_9_TX:
 		dai_data->port_config.slim_sch.slimbus_dev_id =
 			AFE_SLIMBUS_DEVICE_2;
 		break;
@@ -2350,6 +2352,7 @@
 	case SLIMBUS_6_RX:
 	case SLIMBUS_7_RX:
 	case SLIMBUS_8_RX:
+	case SLIMBUS_9_RX:
 	case SLIMBUS_0_TX:
 	case SLIMBUS_1_TX:
 	case SLIMBUS_2_TX:
@@ -2359,6 +2362,7 @@
 	case SLIMBUS_6_TX:
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_TX:
 		rc = msm_dai_q6_slim_bus_hw_params(params, dai,
 				substream->stream);
 		break;
@@ -2475,6 +2479,7 @@
 	case SLIMBUS_6_RX:
 	case SLIMBUS_7_RX:
 	case SLIMBUS_8_RX:
+	case SLIMBUS_9_RX:
 		/*
 		 * channel number to be between 128 and 255.
 		 * For RX port use channel numbers
@@ -2512,6 +2517,7 @@
 	case SLIMBUS_6_TX:
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_TX:
 		/*
 		 * channel number to be between 128 and 255.
 		 * For TX port use channel numbers
@@ -3077,7 +3083,7 @@
 	struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev);
 
 	if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) {
-		pr_err("%s: afe port not started. dai_data->status_mask = %ld\n",
+		pr_debug("%s: afe port not started. dai_data->status_mask = %ld\n",
 			__func__, *dai_data->status_mask);
 		goto done;
 	}
@@ -4023,6 +4029,22 @@
 		.probe = msm_dai_q6_dai_probe,
 		.remove = msm_dai_q6_dai_remove,
 	},
+	{
+		.playback = {
+			.stream_name = "Slimbus9 Playback",
+			.aif_name = "SLIMBUS_9_RX",
+			.rates = SNDRV_PCM_RATE_8000_384000,
+			.formats = DAI_FORMATS_S16_S24_S32_LE,
+			.channels_min = 1,
+			.channels_max = 8,
+			.rate_min = 8000,
+			.rate_max = 384000,
+		},
+		.ops = &msm_dai_q6_ops,
+		.id = SLIMBUS_9_RX,
+		.probe = msm_dai_q6_dai_probe,
+		.remove = msm_dai_q6_dai_remove,
+	},
 };
 
 static struct snd_soc_dai_driver msm_dai_q6_slimbus_tx_dai[] = {
@@ -4202,6 +4224,26 @@
 		.probe = msm_dai_q6_dai_probe,
 		.remove = msm_dai_q6_dai_remove,
 	},
+	{
+		.capture = {
+			.stream_name = "Slimbus9 Capture",
+			.aif_name = "SLIMBUS_9_TX",
+			.rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+			SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |
+			SNDRV_PCM_RATE_192000,
+			.formats = SNDRV_PCM_FMTBIT_S16_LE |
+				   SNDRV_PCM_FMTBIT_S24_LE |
+				   SNDRV_PCM_FMTBIT_S32_LE,
+			.channels_min = 1,
+			.channels_max = 8,
+			.rate_min = 8000,
+			.rate_max = 192000,
+		},
+		.ops = &msm_dai_q6_ops,
+		.id = SLIMBUS_9_TX,
+		.probe = msm_dai_q6_dai_probe,
+		.remove = msm_dai_q6_dai_remove,
+	},
 };
 
 static int msm_dai_q6_mi2s_format_put(struct snd_kcontrol *kcontrol,
@@ -5484,6 +5526,9 @@
 	case SLIMBUS_8_RX:
 		strlcpy(stream_name, "Slimbus8 Playback", sizeof(stream_name));
 		goto register_slim_playback;
+	case SLIMBUS_9_RX:
+		strlcpy(stream_name, "Slimbus9 Playback", sizeof(stream_name));
+		goto register_slim_playback;
 register_slim_playback:
 		rc = -ENODEV;
 		len = strnlen(stream_name, 80);
@@ -5529,6 +5574,9 @@
 	case SLIMBUS_8_TX:
 		strlcpy(stream_name, "Slimbus8 Capture", sizeof(stream_name));
 		goto register_slim_capture;
+	case SLIMBUS_9_TX:
+		strlcpy(stream_name, "Slimbus9 Capture", sizeof(stream_name));
+		goto register_slim_capture;
 register_slim_capture:
 		rc = -ENODEV;
 		len = strnlen(stream_name, 80);
@@ -7140,6 +7188,9 @@
 
 	/* HW supports 1-32 slots configuration. Typical: 1, 2, 4, 8, 16, 32 */
 	switch (slots) {
+	case 1:
+		cap_mask = 0x01;
+		break;
 	case 2:
 		cap_mask = 0x03;
 		break;
@@ -7761,6 +7812,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7781,6 +7833,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7801,6 +7854,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7821,6 +7875,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7841,6 +7896,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7861,6 +7917,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7881,6 +7938,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7901,6 +7959,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_RX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_RX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7921,6 +7980,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7941,6 +8001,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7961,6 +8022,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -7981,6 +8043,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8001,6 +8064,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8021,6 +8085,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8041,6 +8106,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8061,6 +8127,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "PRI_TDM_TX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_PRIMARY_TDM_TX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8081,6 +8148,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8101,6 +8169,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8121,6 +8190,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8141,6 +8211,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8161,6 +8232,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8181,6 +8253,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8201,6 +8274,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8221,6 +8295,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_RX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_RX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8241,6 +8316,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8261,6 +8337,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8281,6 +8358,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8301,6 +8379,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8321,6 +8400,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8341,6 +8421,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8361,6 +8442,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8381,6 +8463,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "SEC_TDM_TX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_SECONDARY_TDM_TX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8401,6 +8484,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8421,6 +8505,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8441,6 +8526,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8461,6 +8547,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8481,6 +8568,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8501,6 +8589,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8521,6 +8610,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8541,6 +8631,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_RX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_RX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8561,6 +8652,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8581,6 +8673,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8601,6 +8694,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8621,6 +8715,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8641,6 +8736,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8661,6 +8757,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8681,6 +8778,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8701,6 +8799,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "TERT_TDM_TX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_TERTIARY_TDM_TX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8721,6 +8820,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8741,6 +8841,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8761,6 +8862,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8781,6 +8883,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8801,6 +8904,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8821,6 +8925,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8841,6 +8946,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8861,6 +8967,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_RX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_RX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8881,6 +8988,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8901,6 +9009,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8921,6 +9030,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8941,6 +9051,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8961,6 +9072,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -8981,6 +9093,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9001,6 +9114,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9021,6 +9135,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUAT_TDM_TX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUATERNARY_TDM_TX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9041,6 +9156,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9061,6 +9177,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9081,6 +9198,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9101,6 +9219,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9121,6 +9240,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9141,6 +9261,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9161,6 +9282,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9181,6 +9303,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_RX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_RX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9201,6 +9324,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_0",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9221,6 +9345,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_1",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_1,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9241,6 +9366,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_2",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_2,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9261,6 +9387,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_3",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_3,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9281,6 +9408,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_4",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_4,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9301,6 +9429,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_5",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_5,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9321,6 +9450,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_6",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_6,
 		.probe = msm_dai_q6_dai_tdm_probe,
@@ -9341,6 +9471,7 @@
 			.rate_min = 8000,
 			.rate_max = 352800,
 		},
+		.name = "QUIN_TDM_TX_7",
 		.ops = &msm_dai_q6_tdm_ops,
 		.id = AFE_PORT_ID_QUINARY_TDM_TX_7,
 		.probe = msm_dai_q6_dai_tdm_probe,
diff --git a/asoc/msm-pcm-loopback-v2.c b/asoc/msm-pcm-loopback-v2.c
index 1c26d19..32c727a 100644
--- a/asoc/msm-pcm-loopback-v2.c
+++ b/asoc/msm-pcm-loopback-v2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -517,7 +517,7 @@
 
 	pr_debug("%s\n", __func__);
 	if ((!substream) || (!substream->runtime)) {
-		pr_err("%s substream or runtime not found\n", __func__);
+		pr_debug("%s substream or runtime not found\n", __func__);
 		rc = -ENODEV;
 		goto exit;
 	}
diff --git a/asoc/msm-pcm-q6-noirq.c b/asoc/msm-pcm-q6-noirq.c
index c89efb9..be34903 100644
--- a/asoc/msm-pcm-q6-noirq.c
+++ b/asoc/msm-pcm-q6-noirq.c
@@ -670,7 +670,7 @@
 		return -ENODEV;
 	}
 	if (!substream->runtime) {
-		pr_err("%s substream runtime not found\n", __func__);
+		pr_debug("%s substream runtime not found\n", __func__);
 		return 0;
 	}
 	prtd = substream->runtime->private_data;
diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c
index f40769b..0b312fe 100644
--- a/asoc/msm-pcm-q6-v2.c
+++ b/asoc/msm-pcm-q6-v2.c
@@ -1301,7 +1301,7 @@
 		return -ENODEV;
 	}
 	if (!substream->runtime) {
-		pr_err("%s substream runtime not found\n", __func__);
+		pr_debug("%s substream runtime not found\n", __func__);
 		return 0;
 	}
 	prtd = substream->runtime->private_data;
@@ -1388,7 +1388,7 @@
 		return -EINVAL;
 	}
 	if (!substream->runtime) {
-		pr_err("%s substream runtime not found\n", __func__);
+		pr_debug("%s substream runtime not found\n", __func__);
 		return 0;
 	}
 	prtd = substream->runtime->private_data;
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 1c9ad1a..ab07d7e 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -114,6 +114,7 @@
 #define VA_CDC_DMA_TX_0_TEXT "VA_CDC_DMA_TX_0"
 #define VA_CDC_DMA_TX_1_TEXT "VA_CDC_DMA_TX_1"
 #define TX_CDC_DMA_TX_3_TEXT "TX_CDC_DMA_TX_3"
+#define QUIN_TDM_TX_TEXT "QUIN_TDM_TX_0"
 
 #define LSM_FUNCTION_TEXT "LSM Function"
 static const char * const lsm_port_text[] = {
@@ -122,7 +123,7 @@
 	SLIMBUS_3_TX_TEXT, SLIMBUS_4_TX_TEXT, SLIMBUS_5_TX_TEXT,
 	TERT_MI2S_TX_TEXT, QUAT_MI2S_TX_TEXT, ADM_LSM_TX_TEXT,
 	INT3_MI2S_TX_TEXT, VA_CDC_DMA_TX_0_TEXT, VA_CDC_DMA_TX_1_TEXT,
-	TX_CDC_DMA_TX_3_TEXT
+	TX_CDC_DMA_TX_3_TEXT, QUIN_TDM_TX_TEXT
 };
 
 struct msm_pcm_route_bdai_pp_params {
@@ -638,6 +639,8 @@
 	  LPASS_BE_SEC_SPDIF_RX},
 	{ AFE_PORT_ID_SECONDARY_SPDIF_TX, 0, {0}, {0}, 0, 0, 0, 0,
 	  LPASS_BE_SEC_SPDIF_TX},
+	{ SLIMBUS_9_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_9_RX},
+	{ SLIMBUS_9_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_SLIMBUS_9_TX},
 };
 
 /* Track ASM playback & capture sessions of DAI
@@ -708,6 +711,12 @@
 	/* MULTIMEDIA21 */
 	{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
 	 {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
+	/* MULTIMEDIA26 */
+	{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
+	 {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
+	/* MULTIMEDIA27 */
+	{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
+	 {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
 	/* MULTIMEDIA28 */
 	{{0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM},
 	 {0, INVALID_SESSION, LEGACY_PCM_MODE, {NULL, NULL}, LEGACY_PCM} },
@@ -2662,6 +2671,9 @@
 	case 13:
 		lsm_port = AFE_PORT_ID_TX_CODEC_DMA_TX_3;
 		break;
+	case 14:
+		lsm_port = AFE_PORT_ID_QUINARY_TDM_TX;
+		break;
 	default:
 		pr_err("Default lsm port");
 		break;
@@ -2709,6 +2721,10 @@
 			strlen(lsm_port_text[13])))
 		port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3;
 
+	if (strnstr(kcontrol->id.name, lsm_port_text[14],
+			strlen(lsm_port_text[14])))
+		port_id = AFE_PORT_ID_QUINARY_TDM_TX;
+
 	mad_type = afe_port_get_mad_type(port_id);
 	pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id,
 		 mad_type);
@@ -2792,6 +2808,10 @@
 			strlen(lsm_port_text[13])))
 		port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3;
 
+	if (strnstr(kcontrol->id.name, lsm_port_text[14],
+			strlen(lsm_port_text[14])))
+		port_id = AFE_PORT_ID_QUINARY_TDM_TX;
+
 	pr_debug("%s: port_id 0x%x, mad_type %d\n", __func__, port_id,
 		 mad_type);
 	return afe_port_set_mad_type(port_id, mad_type);
@@ -4180,6 +4200,10 @@
 	MSM_BACKEND_DAI_PRI_I2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_PRI_I2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_PRI_I2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4267,6 +4291,10 @@
 	MSM_BACKEND_DAI_SEC_I2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SEC_I2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SEC_I2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4354,6 +4382,10 @@
 	MSM_BACKEND_DAI_PRI_SPDIF_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_PRI_SPDIF_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_PRI_SPDIF_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4441,6 +4473,10 @@
 	MSM_BACKEND_DAI_SEC_SPDIF_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SEC_SPDIF_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SEC_SPDIF_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4516,6 +4552,10 @@
 	MSM_BACKEND_DAI_SLIMBUS_2_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_2_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
@@ -4595,6 +4635,10 @@
 	MSM_BACKEND_DAI_SLIMBUS_5_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_5_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SLIMBUS_5_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4682,6 +4726,10 @@
 	MSM_BACKEND_DAI_SLIMBUS_0_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_0_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SLIMBUS_0_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4769,6 +4817,10 @@
 	MSM_BACKEND_DAI_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_MI2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4856,6 +4908,10 @@
 	MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -4943,6 +4999,10 @@
 	MSM_BACKEND_DAI_QUINARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_QUINARY_MI2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_QUINARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -5023,6 +5083,10 @@
 	MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -5117,6 +5181,10 @@
 	MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -5204,6 +5272,10 @@
 	MSM_BACKEND_DAI_PRI_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_PRI_MI2S_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_PRI_MI2S_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -5426,6 +5498,10 @@
 	MSM_BACKEND_DAI_HDMI_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_HDMI_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_HDMI_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -5501,6 +5577,10 @@
 	MSM_BACKEND_DAI_DISPLAY_PORT_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_DISPLAY_PORT_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new display_port1_mixer_controls[] = {
@@ -5568,6 +5648,10 @@
 	MSM_BACKEND_DAI_DISPLAY_PORT_RX_1,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_DISPLAY_PORT_RX_1,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 	/* incall music delivery mixer */
@@ -5693,6 +5777,10 @@
 	MSM_BACKEND_DAI_SLIMBUS_6_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_6_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_mixer_controls[] = {
@@ -5760,6 +5848,10 @@
 	MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new wsa_cdc_dma_rx_1_mixer_controls[] = {
@@ -5827,6 +5919,10 @@
 			MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+			MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_0_mixer_controls[] = {
@@ -5894,6 +5990,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_0,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_0,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_1_mixer_controls[] = {
@@ -5961,6 +6061,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_2_mixer_controls[] = {
@@ -6028,6 +6132,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_2,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_2,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_3_mixer_controls[] = {
@@ -6095,6 +6203,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_3,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_3,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_4_mixer_controls[] = {
@@ -6162,6 +6274,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_4,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_4,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_5_mixer_controls[] = {
@@ -6229,6 +6345,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_5,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_5,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_6_mixer_controls[] = {
@@ -6296,6 +6416,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_6,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_6,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new rx_cdc_dma_rx_7_mixer_controls[] = {
@@ -6363,6 +6487,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_7,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_RX_CDC_DMA_RX_7,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new slimbus_7_rx_mixer_controls[] = {
@@ -6430,8 +6558,82 @@
 	MSM_BACKEND_DAI_SLIMBUS_7_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_7_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
+static const struct snd_kcontrol_new slimbus_9_rx_mixer_controls[] = {
+	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+};
 static const struct snd_kcontrol_new usb_audio_rx_mixer_controls[] = {
 	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_USB_RX,
@@ -6497,6 +6699,10 @@
 	MSM_BACKEND_DAI_USB_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_USB_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
@@ -6576,6 +6782,10 @@
 	MSM_BACKEND_DAI_INT_BT_SCO_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_INT_BT_SCO_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_INT_BT_SCO_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -6651,6 +6861,10 @@
 	MSM_BACKEND_DAI_INT_BT_A2DP_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_INT_BT_A2DP_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
@@ -6730,6 +6944,10 @@
 	MSM_BACKEND_DAI_INT_FM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_INT_FM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_INT_FM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -6817,6 +7035,10 @@
 	MSM_BACKEND_DAI_AFE_PCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_AFE_PCM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_AFE_PCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -6908,6 +7130,10 @@
 	MSM_BACKEND_DAI_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_AUXPCM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -6999,6 +7225,10 @@
 	MSM_BACKEND_DAI_SEC_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SEC_AUXPCM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SEC_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
@@ -7074,6 +7304,10 @@
 	MSM_BACKEND_DAI_TERT_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_TERT_AUXPCM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new quat_auxpcm_rx_mixer_controls[] = {
@@ -7141,6 +7375,10 @@
 	MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new quin_auxpcm_rx_mixer_controls[] = {
@@ -7208,6 +7446,10 @@
 	MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
+	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
 	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
@@ -9300,6 +9542,10 @@
 		MSM_BACKEND_DAI_SEC_SPDIF_TX,
 		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
 		msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_SLIMBUS_9_TX,
+		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+		msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
@@ -9491,6 +9737,10 @@
 	MSM_BACKEND_DAI_SEC_SPDIF_TX,
 	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
@@ -10080,6 +10330,10 @@
 	MSM_BACKEND_DAI_SEC_SPDIF_TX,
 	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
@@ -10466,6 +10720,10 @@
 	MSM_BACKEND_DAI_SEC_SPDIF_TX,
 	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new mmul16_mixer_controls[] = {
@@ -10667,6 +10925,10 @@
 	MSM_BACKEND_DAI_SEC_SPDIF_TX,
 	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 
 static const struct snd_kcontrol_new mmul9_mixer_controls[] = {
@@ -10967,6 +11229,10 @@
 	MSM_BACKEND_DAI_SEC_SPDIF_TX,
 	MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
 	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
 };
 static const struct snd_kcontrol_new mmul17_mixer_controls[] = {
 	SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
@@ -11573,6 +11839,53 @@
 	msm_routing_put_audio_mixer),
 };
 
+static const struct snd_kcontrol_new mmul27_mixer_controls[] = {
+	SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_0_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_6_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_6_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_7_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_7_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA27, 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_MULTIMEDIA27, 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_MULTIMEDIA27, 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_MULTIMEDIA27, 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_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("QUIN_MI2S_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_QUINARY_MI2S_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("PRI_SPDIF_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_PRI_SPDIF_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA27, 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_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
+	MSM_FRONTEND_DAI_MULTIMEDIA27, 1, 0, msm_routing_get_audio_mixer,
+	msm_routing_put_audio_mixer),
+};
+
 static const struct snd_kcontrol_new mmul28_mixer_controls[] = {
 	SOC_DOUBLE_EXT("SLIM_0_TX", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SLIMBUS_0_TX,
@@ -13294,6 +13607,10 @@
 	MSM_BACKEND_DAI_INT0_MI2S_RX,
 	MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer,
 	msm_routing_put_port_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_INT0_MI2S_RX,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer,
+	msm_routing_put_port_mixer),
 };
 
 static const struct snd_kcontrol_new int4_mi2s_rx_port_mixer_controls[] = {
@@ -13337,6 +13654,10 @@
 	MSM_BACKEND_DAI_INT4_MI2S_RX,
 	MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer,
 	msm_routing_put_port_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_INT4_MI2S_RX,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer,
+	msm_routing_put_port_mixer),
 };
 
 static const struct snd_kcontrol_new wsa_cdc_dma_rx_0_port_mixer_controls[] = {
@@ -13363,6 +13684,10 @@
 	MSM_BACKEND_DAI_RX_CDC_DMA_RX_0,
 	MSM_BACKEND_DAI_SLIMBUS_8_TX, 1, 0, msm_routing_get_port_mixer,
 	msm_routing_put_port_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_INT4_MI2S_RX,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer,
+	msm_routing_put_port_mixer),
 };
 
 static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
@@ -13452,7 +13777,11 @@
 	msm_routing_put_port_mixer),
 	SOC_DOUBLE_EXT("QUIN_MI2S_RX", SND_SOC_NOPM,
 	MSM_BACKEND_DAI_SLIMBUS_0_RX,
-MSM_BACKEND_DAI_QUINARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer,
+	MSM_BACKEND_DAI_QUINARY_MI2S_RX, 1, 0, msm_routing_get_port_mixer,
+	msm_routing_put_port_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_0_RX,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer,
 	msm_routing_put_port_mixer),
 };
 
@@ -13646,6 +13975,10 @@
 	MSM_BACKEND_DAI_SLIMBUS_6_RX,
 	MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
 	msm_routing_put_port_mixer),
+	SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM,
+	MSM_BACKEND_DAI_SLIMBUS_6_RX,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX, 1, 0, msm_routing_get_port_mixer,
+	msm_routing_put_port_mixer),
 };
 
 static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = {
@@ -16005,6 +16338,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM1, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm2_mixer_controls[] = {
@@ -16053,6 +16390,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm3_mixer_controls[] = {
@@ -16100,6 +16441,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM3, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm4_mixer_controls[] = {
@@ -16147,6 +16492,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM4, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm5_mixer_controls[] = {
@@ -16194,6 +16543,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM5, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm6_mixer_controls[] = {
@@ -16241,6 +16594,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM6, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm7_mixer_controls[] = {
@@ -16288,6 +16645,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM7, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new lsm8_mixer_controls[] = {
@@ -16335,6 +16696,10 @@
 		MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
 		MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer,
 		msm_routing_put_listen_mixer),
+	SOC_DOUBLE_EXT("QUIN_TDM_TX_0", SND_SOC_NOPM,
+		MSM_BACKEND_DAI_QUIN_TDM_TX_0,
+		MSM_FRONTEND_DAI_LSM8, 1, 0, msm_routing_get_listen_mixer,
+		msm_routing_put_listen_mixer),
 };
 
 static const struct snd_kcontrol_new slim_fm_switch_mixer_controls =
@@ -16473,6 +16838,8 @@
 		    msm_routing_lsm_func_get, msm_routing_lsm_func_put),
 	SOC_ENUM_EXT(TX_CDC_DMA_TX_3_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum,
 		    msm_routing_lsm_func_get, msm_routing_lsm_func_put),
+	SOC_ENUM_EXT(QUIN_TDM_TX_TEXT" "LSM_FUNCTION_TEXT, lsm_func_enum,
+		    msm_routing_lsm_func_get, msm_routing_lsm_func_put),
 	/* kcontrol of lsm_port */
 	SOC_ENUM_EXT("LSM1 Port", lsm_port_enum,
 			  msm_routing_lsm_port_get,
@@ -17010,7 +17377,7 @@
 
 	ret = voc_get_sound_focus(&soundFocusData);
 	if (ret) {
-		pr_err("%s: Error getting Sound Focus Params, err=%d\n",
+		pr_debug("%s: Error getting Sound Focus Params, err=%d\n",
 			  __func__, ret);
 
 		ret = -EINVAL;
@@ -17042,7 +17409,7 @@
 
 	ret = voc_get_source_tracking(&sourceTrackingData);
 	if (ret) {
-		pr_err("%s: Error getting Source Tracking Params, err=%d\n",
+		pr_debug("%s: Error getting Source Tracking Params, err=%d\n",
 			  __func__, ret);
 
 		ret = -EINVAL;
@@ -17098,7 +17465,7 @@
 			break;
 	}
 	if (i >= MSM_FRONTEND_DAI_MM_SIZE) {
-		pr_err("%s: Invalid FE, exiting\n", __func__);
+		pr_debug("%s: Invalid FE, exiting\n", __func__);
 
 		ret = -EINVAL;
 		goto done;
@@ -17137,6 +17504,9 @@
 	} else if (!strcmp(kcontrol->id.name + strlen(prefix),
 					"TX_CDC_DMA_TX_3")) {
 		*port_id = AFE_PORT_ID_TX_CODEC_DMA_TX_3;
+	} else if (!strcmp(kcontrol->id.name + strlen(prefix),
+					"QUIN_TDM_TX_0")) {
+		*port_id = AFE_PORT_ID_QUINARY_TDM_TX;
 	} else {
 		pr_err("%s: mixer ctl name=%s, could not derive valid port id\n",
 			__func__, kcontrol->id.name);
@@ -17214,7 +17584,7 @@
 	ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX,
 					    &copp_idx);
 	if (ret) {
-		pr_err("%s: Could not get copp idx for port_id=%d\n",
+		pr_debug("%s: Could not get copp idx for port_id=%d\n",
 			__func__, port_id);
 
 		ret = -EINVAL;
@@ -17257,7 +17627,7 @@
 	ret = msm_audio_get_copp_idx_from_port_id(port_id, SESSION_TYPE_TX,
 					    &copp_idx);
 	if (ret) {
-		pr_err("%s: Could not get copp idx for port_id=%d\n",
+		pr_debug("%s: Could not get copp idx for port_id=%d\n",
 			__func__, port_id);
 
 		ret = -EINVAL;
@@ -17431,6 +17801,36 @@
 		.info	= msm_source_tracking_info,
 		.get	= msm_audio_source_tracking_get,
 	},
+	{
+		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name	= "Sound Focus Voice Tx QUIN_TDM_TX_0",
+		.info	= msm_sound_focus_info,
+		.get	= msm_voice_sound_focus_get,
+		.put	= msm_voice_sound_focus_put,
+	},
+	{
+		.access = SNDRV_CTL_ELEM_ACCESS_READ,
+		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name	= "Source Tracking Voice Tx QUIN_TDM_TX_0",
+		.info	= msm_source_tracking_info,
+		.get	= msm_voice_source_tracking_get,
+	},
+	{
+		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name	= "Sound Focus Audio Tx QUIN_TDM_TX_0",
+		.info	= msm_sound_focus_info,
+		.get	= msm_audio_sound_focus_get,
+		.put	= msm_audio_sound_focus_put,
+	},
+	{
+		.access = SNDRV_CTL_ELEM_ACCESS_READ,
+		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name	= "Source Tracking Audio Tx QUIN_TDM_TX_0",
+		.info	= msm_source_tracking_info,
+		.get	= msm_audio_source_tracking_get,
+	},
 };
 
 static int spkr_prot_put_vi_lch_port(struct snd_kcontrol *kcontrol,
@@ -17676,6 +18076,7 @@
 	SND_SOC_DAPM_AIF_IN("MM_DL16", "MultiMedia16 Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_IN("MM_DL20", "MultiMedia20 Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_IN("MM_DL21", "MultiMedia21 Playback", 0, 0, 0, 0),
+	SND_SOC_DAPM_AIF_IN("MM_DL26", "MultiMedia26 Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
@@ -17692,6 +18093,7 @@
 	SND_SOC_DAPM_AIF_OUT("MM_UL19", "MultiMedia19 Capture", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_OUT("MM_UL20", "MultiMedia20 Capture", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_OUT("MM_UL21", "MultiMedia21 Capture", 0, 0, 0, 0),
+	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("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
@@ -18415,6 +18817,8 @@
 
 	SND_SOC_DAPM_AIF_OUT("SLIMBUS_8_RX", "Slimbus8 Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_IN("SLIMBUS_8_TX", "Slimbus8 Capture", 0, 0, 0, 0),
+	SND_SOC_DAPM_AIF_OUT("SLIMBUS_9_RX", "Slimbus9 Playback", 0, 0, 0, 0),
+	SND_SOC_DAPM_AIF_IN("SLIMBUS_9_TX", "Slimbus9 Capture", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_OUT("USB_AUDIO_RX", "USB Audio Playback", 0, 0, 0, 0),
 	SND_SOC_DAPM_AIF_IN("USB_AUDIO_TX", "USB Audio Capture", 0, 0, 0, 0),
 
@@ -18475,6 +18879,8 @@
 	slimbus_5_rx_mixer_controls, ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
 	SND_SOC_DAPM_MIXER("SLIMBUS_7_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
 	slimbus_7_rx_mixer_controls, ARRAY_SIZE(slimbus_7_rx_mixer_controls)),
+	SND_SOC_DAPM_MIXER("SLIMBUS_9_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
+	slimbus_9_rx_mixer_controls, ARRAY_SIZE(slimbus_9_rx_mixer_controls)),
 	SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
 	hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
 	SND_SOC_DAPM_MIXER("DISPLAY_PORT Mixer", SND_SOC_NOPM, 0, 0,
@@ -18649,6 +19055,8 @@
 	mmul20_mixer_controls, ARRAY_SIZE(mmul20_mixer_controls)),
 	SND_SOC_DAPM_MIXER("MultiMedia21 Mixer", SND_SOC_NOPM, 0, 0,
 	mmul21_mixer_controls, ARRAY_SIZE(mmul21_mixer_controls)),
+	SND_SOC_DAPM_MIXER("MultiMedia27 Mixer", SND_SOC_NOPM, 0, 0,
+	mmul27_mixer_controls, ARRAY_SIZE(mmul27_mixer_controls)),
 	SND_SOC_DAPM_MIXER("MultiMedia28 Mixer", SND_SOC_NOPM, 0, 0,
 	mmul28_mixer_controls, ARRAY_SIZE(mmul28_mixer_controls)),
 	SND_SOC_DAPM_MIXER("MultiMedia29 Mixer", SND_SOC_NOPM, 0, 0,
@@ -19048,6 +19456,7 @@
 	{"PRI_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"PRI_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"PRI_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"PRI_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
 
 	{"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19066,6 +19475,7 @@
 	{"SEC_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SEC_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SEC_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SEC_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
 
 	{"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19084,6 +19494,7 @@
 	{"SLIMBUS_0_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SLIMBUS_0_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SLIMBUS_0_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SLIMBUS_0_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
 
 	{"SLIMBUS_2_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19102,6 +19513,7 @@
 	{"SLIMBUS_2_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SLIMBUS_2_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SLIMBUS_2_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SLIMBUS_2_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SLIMBUS_2_RX", NULL, "SLIMBUS_2_RX Audio Mixer"},
 
 	{"SLIMBUS_5_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19120,6 +19532,7 @@
 	{"SLIMBUS_5_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SLIMBUS_5_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SLIMBUS_5_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SLIMBUS_5_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SLIMBUS_5_RX", NULL, "SLIMBUS_5_RX Audio Mixer"},
 
 	{"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19138,6 +19551,7 @@
 	{"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"WSA_CDC_DMA_RX_0 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0 Audio Mixer"},
 
 	{"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19156,6 +19570,7 @@
 	{"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"WSA_CDC_DMA_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"WSA_CDC_DMA_RX_1", NULL, "WSA_CDC_DMA_RX_1 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19174,6 +19589,7 @@
 	{"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_0 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_0", NULL, "RX_CDC_DMA_RX_0 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19192,6 +19608,7 @@
 	{"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19210,6 +19627,7 @@
 	{"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_2 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_2", NULL, "RX_CDC_DMA_RX_2 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19228,6 +19646,7 @@
 	{"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_3", NULL, "RX_CDC_DMA_RX_3 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19246,6 +19665,7 @@
 	{"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_4 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_4", NULL, "RX_CDC_DMA_RX_4 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19264,6 +19684,7 @@
 	{"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_5 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_5", NULL, "RX_CDC_DMA_RX_5 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19282,6 +19703,7 @@
 	{"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_6 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_6", NULL, "RX_CDC_DMA_RX_6 Audio Mixer"},
 
 	{"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19300,6 +19722,7 @@
 	{"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"RX_CDC_DMA_RX_7 Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"RX_CDC_DMA_RX_7", NULL, "RX_CDC_DMA_RX_7 Audio Mixer"},
 
 	{"HDMI Mixer", "MultiMedia1", "MM_DL1"},
@@ -19318,6 +19741,7 @@
 	{"HDMI Mixer", "MultiMedia14", "MM_DL14"},
 	{"HDMI Mixer", "MultiMedia15", "MM_DL15"},
 	{"HDMI Mixer", "MultiMedia16", "MM_DL16"},
+	{"HDMI Mixer", "MultiMedia26", "MM_DL26"},
 	{"HDMI", NULL, "HDMI Mixer"},
 
 	{"DISPLAY_PORT Mixer", "MultiMedia1", "MM_DL1"},
@@ -19336,6 +19760,7 @@
 	{"DISPLAY_PORT Mixer", "MultiMedia14", "MM_DL14"},
 	{"DISPLAY_PORT Mixer", "MultiMedia15", "MM_DL15"},
 	{"DISPLAY_PORT Mixer", "MultiMedia16", "MM_DL16"},
+	{"DISPLAY_PORT Mixer", "MultiMedia26", "MM_DL26"},
 	{"DISPLAY_PORT", NULL, "DISPLAY_PORT Mixer"},
 
 	{"DISPLAY_PORT1 Mixer", "MultiMedia1", "MM_DL1"},
@@ -19354,6 +19779,7 @@
 	{"DISPLAY_PORT1 Mixer", "MultiMedia14", "MM_DL14"},
 	{"DISPLAY_PORT1 Mixer", "MultiMedia15", "MM_DL15"},
 	{"DISPLAY_PORT1 Mixer", "MultiMedia16", "MM_DL16"},
+	{"DISPLAY_PORT1 Mixer", "MultiMedia26", "MM_DL26"},
 	{"DISPLAY_PORT1", NULL, "DISPLAY_PORT1 Mixer"},
 
 	{"PRI_SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19372,6 +19798,7 @@
 	{"PRI_SPDIF_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"PRI_SPDIF_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"PRI_SPDIF_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"PRI_SPDIF_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"PRI_SPDIF_RX", NULL, "PRI_SPDIF_RX Audio Mixer"},
 
 	{"SEC_SPDIF_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19390,6 +19817,7 @@
 	{"SEC_SPDIF_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SEC_SPDIF_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SEC_SPDIF_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SEC_SPDIF_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SEC_SPDIF_RX", NULL, "SEC_SPDIF_RX Audio Mixer"},
 
 	/* incall */
@@ -19425,6 +19853,7 @@
 	{"SLIMBUS_6_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SLIMBUS_6_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SLIMBUS_6_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SLIMBUS_6_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SLIMBUS_6_RX", NULL, "SLIMBUS_6_RX Audio Mixer"},
 
 	{"SLIMBUS_7_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19443,8 +19872,28 @@
 	{"SLIMBUS_7_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SLIMBUS_7_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SLIMBUS_7_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SLIMBUS_7_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SLIMBUS_7_RX", NULL, "SLIMBUS_7_RX Audio Mixer"},
 
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia10", "MM_DL10"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia11", "MM_DL11"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia12", "MM_DL12"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia13", "MM_DL13"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SLIMBUS_9_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
+	{"SLIMBUS_9_RX", NULL, "SLIMBUS_9_RX Audio Mixer"},
+
 	{"USB_AUDIO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
 	{"USB_AUDIO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
 	{"USB_AUDIO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
@@ -19461,6 +19910,7 @@
 	{"USB_AUDIO_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"USB_AUDIO_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"USB_AUDIO_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"USB_AUDIO_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"USB_AUDIO_RX", NULL, "USB_AUDIO_RX Audio Mixer"},
 
 	{"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
@@ -19473,8 +19923,10 @@
 	{"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
 	{"MultiMedia1 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
 	{"MultiMedia1 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+	{"MultiMedia1 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"MultiMedia8 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
 	{"MultiMedia8 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
+	{"MultiMedia8 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"MultiMedia4 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
 	{"MultiMedia17 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
 	{"MultiMedia18 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
@@ -19508,7 +19960,9 @@
 	{"MultiMedia16 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
 	{"MultiMedia5 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
 	{"MultiMedia5 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+	{"MultiMedia5 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"MultiMedia10 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
+	{"MultiMedia10 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"MultiMedia18 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
 	{"MultiMedia18 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
 
@@ -19528,6 +19982,7 @@
 	{"MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
 
 	{"QUAT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19545,6 +20000,7 @@
 	{"QUAT_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"QUAT_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"QUAT_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"QUAT_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX Audio Mixer"},
 
 	{"TERT_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19561,6 +20017,7 @@
 	{"TERT_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"TERT_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"TERT_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"TERT_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"TERT_MI2S_RX", NULL, "TERT_MI2S_RX Audio Mixer"},
 
 	{"SEC_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -19577,6 +20034,7 @@
 	{"SEC_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"SEC_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"SEC_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"SEC_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"SEC_MI2S_RX", NULL, "SEC_MI2S_RX Audio Mixer"},
 
 	{"SEC_MI2S_RX_SD1 Audio Mixer", "MultiMedia6", "MM_DL6"},
@@ -19600,6 +20058,7 @@
 	{"PRI_MI2S_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
 	{"PRI_MI2S_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
 	{"PRI_MI2S_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
+	{"PRI_MI2S_RX Audio Mixer", "MultiMedia26", "MM_DL26"},
 	{"PRI_MI2S_RX", NULL, "PRI_MI2S_RX Audio Mixer"},
 
 	{"INT0_MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
@@ -20580,6 +21039,18 @@
 	{"MultiMedia21 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
 	{"MultiMedia21 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
 
+	{"MultiMedia27 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
+	{"MultiMedia27 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
+	{"MultiMedia27 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
+	{"MultiMedia27 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
+	{"MultiMedia27 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
+	{"MultiMedia27 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
+	{"MultiMedia27 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
+	{"MultiMedia27 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
+	{"MultiMedia27 Mixer", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
+	{"MultiMedia27 Mixer", "PRI_SPDIF_TX", "PRI_SPDIF_TX"},
+	{"MultiMedia27 Mixer", "SEC_SPDIF_TX", "SEC_SPDIF_TX"},
+
 	{"MultiMedia1 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
 	{"MultiMedia2 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
 	{"MultiMedia4 Mixer", "USB_AUDIO_TX", "USB_AUDIO_TX"},
@@ -20780,6 +21251,7 @@
 	{"MM_UL19", NULL, "MultiMedia19 Mixer"},
 	{"MM_UL20", NULL, "MultiMedia20 Mixer"},
 	{"MM_UL21", NULL, "MultiMedia21 Mixer"},
+	{"MM_UL27", NULL, "MultiMedia27 Mixer"},
 	{"MM_UL28", NULL, "MultiMedia28 Mixer"},
 	{"MM_UL29", NULL, "MultiMedia29 Mixer"},
 
@@ -21266,6 +21738,7 @@
 	{"LSM1 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM1 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM1 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM1 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM1_UL_HL", NULL, "LSM1 Mixer"},
 
 	{"LSM2 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
@@ -21279,6 +21752,7 @@
 	{"LSM2 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM2 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM2 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM2 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM2_UL_HL", NULL, "LSM2 Mixer"},
 
 
@@ -21293,6 +21767,7 @@
 	{"LSM3 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM3 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM3 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM3 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM3_UL_HL", NULL, "LSM3 Mixer"},
 
 
@@ -21307,6 +21782,7 @@
 	{"LSM4 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM4 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM4 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM4 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM4_UL_HL", NULL, "LSM4 Mixer"},
 
 	{"LSM5 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
@@ -21320,6 +21796,7 @@
 	{"LSM5 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM5 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM5 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM5 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM5_UL_HL", NULL, "LSM5 Mixer"},
 
 	{"LSM6 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
@@ -21331,6 +21808,7 @@
 	{"LSM6 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM6 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM6 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM6 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM6_UL_HL", NULL, "LSM6 Mixer"},
 
 	{"LSM7 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
@@ -21342,6 +21820,7 @@
 	{"LSM7 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM7 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM7 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM7 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM7_UL_HL", NULL, "LSM7 Mixer"},
 
 	{"LSM8 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"},
@@ -21353,6 +21832,7 @@
 	{"LSM8 Mixer", "VA_CDC_DMA_TX_0", "VA_CDC_DMA_TX_0"},
 	{"LSM8 Mixer", "VA_CDC_DMA_TX_1", "VA_CDC_DMA_TX_1"},
 	{"LSM8 Mixer", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"},
+	{"LSM8 Mixer", "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},
 	{"LSM8_UL_HL", NULL, "LSM8 Mixer"},
 
 
@@ -21914,6 +22394,7 @@
 	{"INT0_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
 	{"INT0_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
 	{"INT0_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
+	{"INT0_MI2S_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"INT0_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
 	{"INT0_MI2S_RX", NULL, "INT0_MI2S_RX Port Mixer"},
 
@@ -21925,6 +22406,7 @@
 	{"INT4_MI2S_RX Port Mixer", "INT3_MI2S_TX", "INT3_MI2S_TX"},
 	{"INT4_MI2S_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
 	{"INT4_MI2S_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+	{"INT4_MI2S_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"INT4_MI2S_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
 	{"INT4_MI2S_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
 	{"INT4_MI2S_RX", NULL, "INT4_MI2S_RX Port Mixer"},
@@ -21941,6 +22423,7 @@
 	{"SLIMBUS_0_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
 	{"SLIMBUS_0_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
 	{"SLIMBUS_0_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+	{"SLIMBUS_0_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
 	{"SLIMBUS_0_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
 	{"SLIMBUS_0_RX Port Mixer", "TERT_AUXPCM_UL_TX", "TERT_AUX_PCM_TX"},
@@ -22085,6 +22568,7 @@
 	{"SLIMBUS_6_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
 	{"SLIMBUS_6_RX Port Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
 	{"SLIMBUS_6_RX Port Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
+	{"SLIMBUS_6_RX Port Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"},
 	{"SLIMBUS_6_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
 	{"SLIMBUS_6_RX Port Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"},
 	{"SLIMBUS_6_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
@@ -22175,6 +22659,7 @@
 	{"BE_OUT", NULL, "SLIMBUS_6_RX"},
 	{"BE_OUT", NULL, "SLIMBUS_7_RX"},
 	{"BE_OUT", NULL, "SLIMBUS_8_RX"},
+	{"BE_OUT", NULL, "SLIMBUS_9_RX"},
 	{"BE_OUT", NULL, "USB_AUDIO_RX"},
 	{"BE_OUT", NULL, "HDMI"},
 	{"BE_OUT", NULL, "DISPLAY_PORT"},
@@ -22262,6 +22747,7 @@
 	{"SLIMBUS_6_TX", NULL, "BE_IN" },
 	{"SLIMBUS_7_TX", NULL, "BE_IN" },
 	{"SLIMBUS_8_TX", NULL, "BE_IN" },
+	{"SLIMBUS_9_TX", NULL, "BE_IN" },
 	{"USB_AUDIO_TX", NULL, "BE_IN" },
 	{"INT_BT_SCO_TX", NULL, "BE_IN"},
 	{"INT_FM_TX", NULL, "BE_IN"},
diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h
index 26a5428..e9a08eb 100644
--- a/asoc/msm-pcm-routing-v2.h
+++ b/asoc/msm-pcm-routing-v2.h
@@ -170,6 +170,8 @@
 #define LPASS_BE_SLIMBUS_7_TX "SLIMBUS_7_TX"
 #define LPASS_BE_SLIMBUS_8_RX "SLIMBUS_8_RX"
 #define LPASS_BE_SLIMBUS_8_TX "SLIMBUS_8_TX"
+#define LPASS_BE_SLIMBUS_9_RX "SLIMBUS_9_RX"
+#define LPASS_BE_SLIMBUS_9_TX "SLIMBUS_9_TX"
 
 #define LPASS_BE_USB_AUDIO_RX "USB_AUDIO_RX"
 #define LPASS_BE_USB_AUDIO_TX "USB_AUDIO_TX"
@@ -240,6 +242,8 @@
 	MSM_FRONTEND_DAI_MULTIMEDIA19,
 	MSM_FRONTEND_DAI_MULTIMEDIA20,
 	MSM_FRONTEND_DAI_MULTIMEDIA21,
+	MSM_FRONTEND_DAI_MULTIMEDIA26,
+	MSM_FRONTEND_DAI_MULTIMEDIA27,
 	MSM_FRONTEND_DAI_MULTIMEDIA28,
 	MSM_FRONTEND_DAI_MULTIMEDIA29,
 	MSM_FRONTEND_DAI_VOIP,
@@ -451,6 +455,8 @@
 	MSM_BACKEND_DAI_PRI_SPDIF_TX,
 	MSM_BACKEND_DAI_SEC_SPDIF_RX,
 	MSM_BACKEND_DAI_SEC_SPDIF_TX,
+	MSM_BACKEND_DAI_SLIMBUS_9_RX,
+	MSM_BACKEND_DAI_SLIMBUS_9_TX,
 	MSM_BACKEND_DAI_MAX,
 };
 
diff --git a/asoc/msm-qti-pp-config.c b/asoc/msm-qti-pp-config.c
index 7d64da6..0923d0a 100644
--- a/asoc/msm-qti-pp-config.c
+++ b/asoc/msm-qti-pp-config.c
@@ -1259,7 +1259,7 @@
 	kctl_prtd = (struct dsp_stream_callback_prtd *)
 			kcontrol->private_data;
 	if (kctl_prtd == NULL) {
-		pr_err("%s: ASM Stream PP event queue is not initialized.\n",
+		pr_debug("%s: ASM Stream PP event queue is not initialized.\n",
 			__func__);
 		ret = -EINVAL;
 		goto done;
diff --git a/asoc/msm-transcode-loopback-q6-v2.c b/asoc/msm-transcode-loopback-q6-v2.c
index 3d4f8bf..14b7ac8 100644
--- a/asoc/msm-transcode-loopback-q6-v2.c
+++ b/asoc/msm-transcode-loopback-q6-v2.c
@@ -39,11 +39,19 @@
 #include "msm-qti-pp-config.h"
 
 #define LOOPBACK_SESSION_MAX_NUM_STREAMS 2
+/* Max volume corresponding to 24dB */
+#define TRANSCODE_LR_VOL_MAX_DB 0xFFFF
+
+#define APP_TYPE_CONFIG_IDX_APP_TYPE 0
+#define APP_TYPE_CONFIG_IDX_ACDB_ID 1
+#define APP_TYPE_CONFIG_IDX_SAMPLE_RATE 2
+#define APP_TYPE_CONFIG_IDX_BE_ID 3
 
 static DEFINE_MUTEX(transcode_loopback_session_lock);
 
 struct trans_loopback_pdata {
 	struct snd_compr_stream *cstream[MSM_FRONTEND_DAI_MAX];
+	uint32_t master_gain;
 };
 
 struct loopback_stream {
@@ -99,7 +107,7 @@
 		return;
 	}
 
-	cstream = trans->source.cstream;
+	cstream = trans->sink.cstream;
 	ac = trans->audio_client;
 
 	/*
@@ -111,7 +119,8 @@
 	switch (opcode) {
 	case ASM_STREAM_CMD_ENCDEC_EVENTS:
 	case ASM_IEC_61937_MEDIA_FMT_EVENT:
-		pr_debug("%s: ASM_IEC_61937_MEDIA_FMT_EVENT\n", __func__);
+		pr_debug("%s: Handling stream event : 0X%x\n",
+			__func__, opcode);
 		rtd = cstream->private_data;
 		if (!rtd) {
 			pr_err("%s: rtd is NULL\n", __func__);
@@ -221,6 +230,7 @@
 			ret = -EINVAL;
 			goto exit;
 		}
+		msm_adsp_init_mixer_ctl_pp_event_queue(rtd);
 	}
 
 	pr_debug("%s: num stream%d, stream name %s\n", __func__,
@@ -235,8 +245,7 @@
 	}
 
 	runtime->private_data = trans;
-	if (trans->num_streams == 1)
-		msm_adsp_init_mixer_ctl_pp_event_queue(rtd);
+
 exit:
 	mutex_unlock(&trans->lock);
 	return ret;
@@ -281,14 +290,14 @@
 	trans->num_streams--;
 	stop_transcoding(trans);
 
-	if (cstream->direction == SND_COMPRESS_PLAYBACK)
+	if (cstream->direction == SND_COMPRESS_PLAYBACK) {
 		memset(&trans->sink, 0, sizeof(struct loopback_stream));
-	else if (cstream->direction == SND_COMPRESS_CAPTURE)
+		msm_adsp_clean_mixer_ctl_pp_event_queue(rtd);
+	} else if (cstream->direction == SND_COMPRESS_CAPTURE) {
 		memset(&trans->source, 0, sizeof(struct loopback_stream));
+	}
 
 	trans->session_state = LOOPBACK_SESSION_CLOSE;
-	if (trans->num_streams == 1)
-		msm_adsp_clean_mixer_ctl_pp_event_queue(rtd);
 	mutex_unlock(&trans->lock);
 	return ret;
 }
@@ -448,17 +457,17 @@
 					trans->audio_client->perf_mode,
 					trans->session_id,
 					SNDRV_PCM_STREAM_CAPTURE,
-					true);
+					COMPRESSED_PASSTHROUGH_GEN);
 		else
 			msm_pcm_routing_reg_phy_stream(
 					soc_pcm_tx->dai_link->id,
 					trans->audio_client->perf_mode,
 					trans->session_id,
 					SNDRV_PCM_STREAM_CAPTURE);
-
+		/* Opening Rx ADM in LOW_LATENCY mode by default */
 		msm_pcm_routing_reg_phy_stream(
 					soc_pcm_rx->dai_link->id,
-					trans->audio_client->perf_mode,
+					true,
 					trans->session_id,
 					SNDRV_PCM_STREAM_PLAYBACK);
 		pr_debug("%s: Successfully opened ADM sessions\n", __func__);
@@ -661,6 +670,141 @@
 	return ret;
 }
 
+static int msm_transcode_playback_app_type_cfg_put(
+			struct snd_kcontrol *kcontrol,
+			struct snd_ctl_elem_value *ucontrol)
+{
+	u64 fe_id = kcontrol->private_value;
+	int session_type = SESSION_TYPE_RX;
+	int be_id = ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID];
+	struct msm_pcm_stream_app_type_cfg cfg_data = {0, 0, 48000};
+	int ret = 0;
+
+	cfg_data.app_type = ucontrol->value.integer.value[
+			    APP_TYPE_CONFIG_IDX_APP_TYPE];
+	cfg_data.acdb_dev_id = ucontrol->value.integer.value[
+			       APP_TYPE_CONFIG_IDX_ACDB_ID];
+	if (ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] != 0)
+		cfg_data.sample_rate = ucontrol->value.integer.value[
+				       APP_TYPE_CONFIG_IDX_SAMPLE_RATE];
+	pr_debug("%s: fe_id %llu session_type %d be_id %d app_type %d acdb_dev_id %d sample_rate- %d\n",
+		__func__, fe_id, session_type, be_id,
+		cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate);
+	ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
+						      be_id, &cfg_data);
+	if (ret < 0)
+		pr_err("%s: msm_transcode_playback_stream_app_type_cfg set failed returned %d\n",
+			__func__, ret);
+
+	return ret;
+}
+
+static int msm_transcode_playback_app_type_cfg_get(
+			struct snd_kcontrol *kcontrol,
+			struct snd_ctl_elem_value *ucontrol)
+{
+	u64 fe_id = kcontrol->private_value;
+	int session_type = SESSION_TYPE_RX;
+	int be_id = 0;
+	struct msm_pcm_stream_app_type_cfg cfg_data = {0};
+	int ret = 0;
+
+	ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
+						      &be_id, &cfg_data);
+	if (ret < 0) {
+		pr_err("%s: msm_transcode_playback_stream_app_type_cfg get failed returned %d\n",
+			__func__, ret);
+		goto done;
+	}
+
+	ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_APP_TYPE] =
+					cfg_data.app_type;
+	ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_ACDB_ID] =
+					cfg_data.acdb_dev_id;
+	ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_SAMPLE_RATE] =
+					cfg_data.sample_rate;
+	ucontrol->value.integer.value[APP_TYPE_CONFIG_IDX_BE_ID] = be_id;
+	pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
+		__func__, fe_id, session_type, be_id,
+		cfg_data.app_type, cfg_data.acdb_dev_id, cfg_data.sample_rate);
+done:
+	return ret;
+}
+
+static int msm_transcode_set_volume(struct snd_compr_stream *cstream,
+				uint32_t master_gain)
+{
+	int rc = 0;
+	struct msm_transcode_loopback *prtd;
+	struct snd_soc_pcm_runtime *rtd;
+
+	pr_debug("%s: master_gain %d\n", __func__, master_gain);
+	if (!cstream || !cstream->runtime) {
+		pr_err("%s: session not active\n", __func__);
+		return -EINVAL;
+	}
+	rtd = cstream->private_data;
+	prtd = cstream->runtime->private_data;
+
+	if (!rtd || !rtd->platform || !prtd || !prtd->audio_client) {
+		pr_err("%s: invalid rtd, prtd or audio client", __func__);
+		return -EINVAL;
+	}
+
+	rc = q6asm_set_volume(prtd->audio_client, master_gain);
+	if (rc < 0)
+		pr_err("%s: Send vol gain command failed rc=%d\n",
+		       __func__, rc);
+
+	return rc;
+}
+
+static int msm_transcode_volume_put(struct snd_kcontrol *kcontrol,
+				struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
+	unsigned long fe_id = kcontrol->private_value;
+	struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *)
+			snd_soc_component_get_drvdata(comp);
+	struct snd_compr_stream *cstream = NULL;
+	uint32_t ret = 0;
+
+	if (fe_id >= MSM_FRONTEND_DAI_MAX) {
+		pr_err("%s Received out of bounds fe_id %lu\n",
+			__func__, fe_id);
+		return -EINVAL;
+	}
+
+	cstream = pdata->cstream[fe_id];
+	pdata->master_gain = ucontrol->value.integer.value[0];
+
+	pr_debug("%s: fe_id %lu master_gain %d\n",
+		 __func__, fe_id, pdata->master_gain);
+	if (cstream)
+		ret = msm_transcode_set_volume(cstream, pdata->master_gain);
+	return ret;
+}
+
+static int msm_transcode_volume_get(struct snd_kcontrol *kcontrol,
+				struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
+	unsigned long fe_id = kcontrol->private_value;
+
+	struct trans_loopback_pdata *pdata = (struct trans_loopback_pdata *)
+			snd_soc_component_get_drvdata(comp);
+
+	if (fe_id >= MSM_FRONTEND_DAI_MAX) {
+		pr_err("%s Received out of bound fe_id %lu\n", __func__, fe_id);
+		return -EINVAL;
+	}
+
+	pr_debug("%s: fe_id %lu\n", __func__, fe_id);
+	ucontrol->value.integer.value[0] = pdata->master_gain;
+
+	return 0;
+}
+
 static int msm_transcode_stream_cmd_control(
 			struct snd_soc_pcm_runtime *rtd)
 {
@@ -862,6 +1006,96 @@
 	return ret;
 }
 
+static int msm_transcode_app_type_cfg_info(struct snd_kcontrol *kcontrol,
+				       struct snd_ctl_elem_info *uinfo)
+{
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+	uinfo->count = 5;
+	uinfo->value.integer.min = 0;
+	uinfo->value.integer.max = 0xFFFFFFFF;
+	return 0;
+}
+
+static int msm_transcode_add_app_type_cfg_control(
+			struct snd_soc_pcm_runtime *rtd)
+{
+	char mixer_str[32];
+	struct snd_kcontrol_new fe_app_type_cfg_control[1] = {
+		{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+		.info = msm_transcode_app_type_cfg_info,
+		.put = msm_transcode_playback_app_type_cfg_put,
+		.get = msm_transcode_playback_app_type_cfg_get,
+		.private_value = 0,
+		}
+	};
+
+	if (!rtd) {
+		pr_err("%s NULL rtd\n", __func__);
+		return -EINVAL;
+	}
+
+	if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) {
+		snprintf(mixer_str, sizeof(mixer_str),
+			"Audio Stream %d App Type Cfg",
+			 rtd->pcm->device);
+
+		fe_app_type_cfg_control[0].name = mixer_str;
+		fe_app_type_cfg_control[0].private_value = rtd->dai_link->id;
+
+		fe_app_type_cfg_control[0].put =
+				msm_transcode_playback_app_type_cfg_put;
+		fe_app_type_cfg_control[0].get =
+				msm_transcode_playback_app_type_cfg_get;
+
+		pr_debug("Registering new mixer ctl %s", mixer_str);
+		snd_soc_add_platform_controls(rtd->platform,
+					fe_app_type_cfg_control,
+					ARRAY_SIZE(fe_app_type_cfg_control));
+	}
+
+	return 0;
+}
+static int msm_transcode_volume_info(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_info *uinfo)
+{
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+	uinfo->count = 1;
+	uinfo->value.integer.min = 0;
+	uinfo->value.integer.max = TRANSCODE_LR_VOL_MAX_DB;
+	return 0;
+}
+
+static int msm_transcode_add_volume_control(struct snd_soc_pcm_runtime *rtd)
+{
+	struct snd_kcontrol_new fe_volume_control[1] = {
+		{
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Transcode Loopback Rx Volume",
+		.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |
+			  SNDRV_CTL_ELEM_ACCESS_READWRITE,
+		.info = msm_transcode_volume_info,
+		.get = msm_transcode_volume_get,
+		.put = msm_transcode_volume_put,
+		.private_value = 0,
+		}
+	};
+
+	if (!rtd) {
+		pr_err("%s NULL rtd\n", __func__);
+		return -EINVAL;
+	}
+	if (rtd->compr->direction == SND_COMPRESS_PLAYBACK) {
+		fe_volume_control[0].private_value = rtd->dai_link->id;
+		pr_debug("Registering new mixer ctl %s",
+			     fe_volume_control[0].name);
+		snd_soc_add_platform_controls(rtd->platform, fe_volume_control,
+						ARRAY_SIZE(fe_volume_control));
+	}
+	return 0;
+}
+
 static int msm_transcode_loopback_new(struct snd_soc_pcm_runtime *rtd)
 {
 	int rc;
@@ -885,6 +1119,16 @@
 		pr_err("%s: Could not add transcode event ack Control\n",
 			__func__);
 
+	rc = msm_transcode_add_app_type_cfg_control(rtd);
+	if (rc)
+		pr_err("%s: Could not add Compr App Type Cfg Control\n",
+			__func__);
+
+	rc = msm_transcode_add_volume_control(rtd);
+	if (rc)
+		pr_err("%s: Could not add transcode volume Control\n",
+			__func__);
+
 	return 0;
 }
 
@@ -912,10 +1156,21 @@
 	return 0;
 }
 
+static int msm_transcode_loopback_remove(struct snd_soc_platform *platform)
+{
+	struct trans_loopback_pdata *pdata = NULL;
+
+	pdata = (struct trans_loopback_pdata *)
+			snd_soc_platform_get_drvdata(platform);
+	kfree(pdata);
+	return 0;
+}
+
 static struct snd_soc_platform_driver msm_soc_platform = {
 	.probe		= msm_transcode_loopback_probe,
 	.compr_ops	= &msm_transcode_loopback_ops,
 	.pcm_new	= msm_transcode_loopback_new,
+	.remove		= msm_transcode_loopback_remove,
 };
 
 static int msm_transcode_dev_probe(struct platform_device *pdev)
diff --git a/asoc/qcs405.c b/asoc/qcs405.c
index b075a21..c819bb8 100644
--- a/asoc/qcs405.c
+++ b/asoc/qcs405.c
@@ -22,6 +22,7 @@
 #include <linux/input.h>
 #include <linux/of_device.h>
 #include <linux/pm_qos.h>
+#include <linux/regulator/consumer.h>
 #include <sound/core.h>
 #include <sound/soc.h>
 #include <sound/soc-dapm.h>
@@ -176,32 +177,20 @@
 	u32 index;
 };
 
-enum pinctrl_pin_state {
-	STATE_DISABLE = 0, /* All pins are in sleep state */
-	STATE_MI2S_ACTIVE,  /* I2S = active, TDM = sleep */
-	STATE_TDM_ACTIVE,  /* I2S = sleep, TDM = active */
-};
-
-struct msm_pinctrl_info {
-	struct pinctrl *pinctrl;
-	struct pinctrl_state *mi2s_disable;
-	struct pinctrl_state *tdm_disable;
-	struct pinctrl_state *mi2s_active;
-	struct pinctrl_state *tdm_active;
-	enum pinctrl_pin_state curr_state;
-};
-
 struct msm_asoc_mach_data {
 	struct snd_info_entry *codec_root;
-	struct msm_pinctrl_info pinctrl_info;
 	struct device_node *dmic_01_gpio_p; /* used by pinctrl API */
 	struct device_node *dmic_23_gpio_p; /* used by pinctrl API */
 	struct device_node *dmic_45_gpio_p; /* used by pinctrl API */
 	struct device_node *dmic_67_gpio_p; /* used by pinctrl API */
+	struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
 	int dmic_01_gpio_cnt;
 	int dmic_23_gpio_cnt;
 	int dmic_45_gpio_cnt;
 	int dmic_67_gpio_cnt;
+	struct regulator *tdm_micb_supply;
+	u32 tdm_micb_voltage;
+	u32 tdm_micb_current;
 };
 
 struct msm_asoc_wcd93xx_codec {
@@ -5074,164 +5063,6 @@
 	return ret;
 }
 
-static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info,
-				enum pinctrl_pin_state new_state)
-{
-	int ret = 0;
-	int curr_state = 0;
-
-	if (pinctrl_info == NULL) {
-		pr_err("%s: pinctrl_info is NULL\n", __func__);
-		ret = -EINVAL;
-		goto err;
-	}
-
-	if (pinctrl_info->pinctrl == NULL) {
-		pr_err("%s: pinctrl_info->pinctrl is NULL\n", __func__);
-		ret = -EINVAL;
-		goto err;
-	}
-
-	curr_state = pinctrl_info->curr_state;
-	pinctrl_info->curr_state = new_state;
-	pr_debug("%s: curr_state = %s new_state = %s\n", __func__,
-		 pin_states[curr_state], pin_states[pinctrl_info->curr_state]);
-
-	if (curr_state == pinctrl_info->curr_state) {
-		pr_debug("%s: Already in same state\n", __func__);
-		goto err;
-	}
-
-	if (curr_state != STATE_DISABLE &&
-		pinctrl_info->curr_state != STATE_DISABLE) {
-		pr_debug("%s: state already active cannot switch\n", __func__);
-		ret = -EIO;
-		goto err;
-	}
-
-	switch (pinctrl_info->curr_state) {
-	case STATE_MI2S_ACTIVE:
-		ret = pinctrl_select_state(pinctrl_info->pinctrl,
-					pinctrl_info->mi2s_active);
-		if (ret) {
-			pr_err("%s: MI2S state select failed with %d\n",
-				__func__, ret);
-			ret = -EIO;
-			goto err;
-		}
-		break;
-	case STATE_TDM_ACTIVE:
-		ret = pinctrl_select_state(pinctrl_info->pinctrl,
-					pinctrl_info->tdm_active);
-		if (ret) {
-			pr_err("%s: TDM state select failed with %d\n",
-				__func__, ret);
-			ret = -EIO;
-			goto err;
-		}
-		break;
-	case STATE_DISABLE:
-		if (curr_state == STATE_MI2S_ACTIVE) {
-			ret = pinctrl_select_state(pinctrl_info->pinctrl,
-					pinctrl_info->mi2s_disable);
-		} else {
-			ret = pinctrl_select_state(pinctrl_info->pinctrl,
-					pinctrl_info->tdm_disable);
-		}
-		if (ret) {
-			pr_err("%s:  state disable failed with %d\n",
-				__func__, ret);
-			ret = -EIO;
-			goto err;
-		}
-		break;
-	default:
-		pr_err("%s: TLMM pin state is invalid\n", __func__);
-		return -EINVAL;
-	}
-
-err:
-	return ret;
-}
-
-static void msm_release_pinctrl(struct platform_device *pdev)
-{
-	struct snd_soc_card *card = platform_get_drvdata(pdev);
-	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
-	struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
-
-	if (pinctrl_info->pinctrl) {
-		devm_pinctrl_put(pinctrl_info->pinctrl);
-		pinctrl_info->pinctrl = NULL;
-	}
-}
-
-static int msm_get_pinctrl(struct platform_device *pdev)
-{
-	struct snd_soc_card *card = platform_get_drvdata(pdev);
-	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
-	struct msm_pinctrl_info *pinctrl_info = NULL;
-	struct pinctrl *pinctrl;
-	int ret;
-
-	pinctrl_info = &pdata->pinctrl_info;
-
-	if (pinctrl_info == NULL) {
-		pr_err("%s: pinctrl_info is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	pinctrl = devm_pinctrl_get(&pdev->dev);
-	if (IS_ERR_OR_NULL(pinctrl)) {
-		pr_err("%s: Unable to get pinctrl handle\n", __func__);
-		return -EINVAL;
-	}
-	pinctrl_info->pinctrl = pinctrl;
-
-	/* get all the states handles from Device Tree */
-	pinctrl_info->mi2s_disable = pinctrl_lookup_state(pinctrl,
-						"quat-mi2s-sleep");
-	if (IS_ERR(pinctrl_info->mi2s_disable)) {
-		pr_err("%s: could not get mi2s_disable pinstate\n", __func__);
-		goto err;
-	}
-	pinctrl_info->mi2s_active = pinctrl_lookup_state(pinctrl,
-						"quat-mi2s-active");
-	if (IS_ERR(pinctrl_info->mi2s_active)) {
-		pr_err("%s: could not get mi2s_active pinstate\n", __func__);
-		goto err;
-	}
-	pinctrl_info->tdm_disable = pinctrl_lookup_state(pinctrl,
-						"quat-tdm-sleep");
-	if (IS_ERR(pinctrl_info->tdm_disable)) {
-		pr_err("%s: could not get tdm_disable pinstate\n", __func__);
-		goto err;
-	}
-	pinctrl_info->tdm_active = pinctrl_lookup_state(pinctrl,
-						"quat-tdm-active");
-	if (IS_ERR(pinctrl_info->tdm_active)) {
-		pr_err("%s: could not get tdm_active pinstate\n",
-			__func__);
-		goto err;
-	}
-	/* Reset the TLMM pins to a default state */
-	ret = pinctrl_select_state(pinctrl_info->pinctrl,
-					pinctrl_info->mi2s_disable);
-	if (ret != 0) {
-		pr_err("%s: Disable TLMM pins failed with %d\n",
-			__func__, ret);
-		ret = -EIO;
-		goto err;
-	}
-	pinctrl_info->curr_state = STATE_DISABLE;
-
-	return 0;
-
-err:
-	devm_pinctrl_put(pinctrl);
-	pinctrl_info->pinctrl = NULL;
-	return -EINVAL;
-}
 
 static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
 				      struct snd_pcm_hw_params *params)
@@ -5281,7 +5112,7 @@
 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 	int ret = 0;
 	int slot_width = 32;
-	int channels, slots;
+	int channels, slots = 8;
 	unsigned int slot_mask, rate, clk_freq;
 	unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28};
 
@@ -5290,34 +5121,34 @@
 	/* currently only supporting TDM_RX_0 and TDM_TX_0 */
 	switch (cpu_dai->id) {
 	case AFE_PORT_ID_PRIMARY_TDM_RX:
-		slots = tdm_rx_cfg[TDM_PRI][TDM_0].channels;
+		channels = tdm_rx_cfg[TDM_PRI][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_SECONDARY_TDM_RX:
-		slots = tdm_rx_cfg[TDM_SEC][TDM_0].channels;
+		channels = tdm_rx_cfg[TDM_SEC][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_TERTIARY_TDM_RX:
-		slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels;
+		channels = tdm_rx_cfg[TDM_TERT][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_QUATERNARY_TDM_RX:
-		slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
+		channels = tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_QUINARY_TDM_RX:
-		slots = tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
+		channels = tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_PRIMARY_TDM_TX:
-		slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels;
+		channels = tdm_tx_cfg[TDM_PRI][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_SECONDARY_TDM_TX:
-		slots = tdm_tx_cfg[TDM_SEC][TDM_0].channels;
+		channels = tdm_tx_cfg[TDM_SEC][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_TERTIARY_TDM_TX:
-		slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels;
+		channels = tdm_tx_cfg[TDM_TERT][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_QUATERNARY_TDM_TX:
-		slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
+		channels = tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
 		break;
 	case AFE_PORT_ID_QUINARY_TDM_TX:
-		slots = tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
+		channels = tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
 		break;
 
 	default:
@@ -5328,8 +5159,7 @@
 
 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 		/*2 slot config - bits 0 and 1 set for the first two slots */
-		slot_mask = 0x0000FFFF >> (16-slots);
-		channels = slots;
+		slot_mask = 0x0000FFFF >> (16-channels);
 
 		pr_debug("%s: tdm rx slot_width %d slots %d\n",
 			__func__, slot_width, slots);
@@ -5351,8 +5181,7 @@
 		}
 	} else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
 		/*2 slot config - bits 0 and 1 set for the first two slots */
-		slot_mask = 0x0000FFFF >> (16-slots);
-		channels = slots;
+		slot_mask = 0x0000FFFF >> (16-channels);
 
 		pr_debug("%s: tdm tx slot_width %d slots %d\n",
 			__func__, slot_width, slots);
@@ -5390,6 +5219,38 @@
 	return ret;
 }
 
+static int msm_get_tdm_mode(u32 port_id)
+{
+	u32 tdm_mode;
+
+	switch (port_id) {
+	case AFE_PORT_ID_PRIMARY_TDM_RX:
+	case AFE_PORT_ID_PRIMARY_TDM_TX:
+		tdm_mode = TDM_PRI;
+		break;
+	case AFE_PORT_ID_SECONDARY_TDM_RX:
+	case AFE_PORT_ID_SECONDARY_TDM_TX:
+		tdm_mode = TDM_SEC;
+		break;
+	case AFE_PORT_ID_TERTIARY_TDM_RX:
+	case AFE_PORT_ID_TERTIARY_TDM_TX:
+		tdm_mode = TDM_TERT;
+		break;
+	case AFE_PORT_ID_QUATERNARY_TDM_RX:
+	case AFE_PORT_ID_QUATERNARY_TDM_TX:
+		tdm_mode = TDM_QUAT;
+		break;
+	case AFE_PORT_ID_QUINARY_TDM_RX:
+	case AFE_PORT_ID_QUINARY_TDM_TX:
+		tdm_mode = TDM_QUIN;
+		break;
+	default:
+		pr_err("%s: Invalid port id: %d\n", __func__, port_id);
+		tdm_mode = -EINVAL;
+	}
+	return tdm_mode;
+}
+
 static int qcs405_tdm_snd_startup(struct snd_pcm_substream *substream)
 {
 	int ret = 0;
@@ -5397,17 +5258,50 @@
 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 	struct snd_soc_card *card = rtd->card;
 	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
-	struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
+	u32 tdm_mode = msm_get_tdm_mode(cpu_dai->id);
 
-	/* currently only supporting TDM_RX_0 and TDM_TX_0 */
-	if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) ||
-		(cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX)) {
-		ret = msm_set_pinctrl(pinctrl_info, STATE_TDM_ACTIVE);
+	if (tdm_mode >= TDM_INTERFACE_MAX) {
+		ret = -EINVAL;
+		pr_err("%s: Invalid TDM interface %d\n",
+			__func__, ret);
+		return ret;
+	}
+
+	if (pdata->mi2s_gpio_p[tdm_mode]) {
+		ret = msm_cdc_pinctrl_select_active_state(
+			pdata->mi2s_gpio_p[tdm_mode]);
 		if (ret)
-			pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
+			pr_err("%s: TDM GPIO pinctrl set active failed with %d\n",
 				__func__, ret);
 	}
 
+	/* Enable Mic bias for TDM Mics */
+	if (cpu_dai->id == AFE_PORT_ID_QUINARY_TDM_TX) {
+		if (pdata->tdm_micb_supply) {
+			ret = regulator_set_voltage(pdata->tdm_micb_supply,
+						pdata->tdm_micb_voltage,
+						pdata->tdm_micb_voltage);
+			if (ret) {
+				pr_err("%s: Setting voltage failed, err = %d\n",
+					__func__, ret);
+				return ret;
+			}
+			ret = regulator_set_load(pdata->tdm_micb_supply,
+						pdata->tdm_micb_current);
+			if (ret) {
+				pr_err("%s: Setting current failed, err = %d\n",
+					__func__, ret);
+				return ret;
+			}
+			ret = regulator_enable(pdata->tdm_micb_supply);
+			if (ret) {
+				pr_err("%s: regulator enable failed, err = %d\n",
+					__func__, ret);
+				return ret;
+			}
+		}
+	}
+
 	return ret;
 }
 
@@ -5418,14 +5312,25 @@
 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 	struct snd_soc_card *card = rtd->card;
 	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
-	struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
+	u32 tdm_mode = msm_get_tdm_mode(cpu_dai->id);
 
-	/* currently only supporting TDM_RX_0 and TDM_TX_0 */
-	if ((cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_RX) ||
-		(cpu_dai->id == AFE_PORT_ID_QUATERNARY_TDM_TX)) {
-		ret = msm_set_pinctrl(pinctrl_info, STATE_DISABLE);
+	if (cpu_dai->id == AFE_PORT_ID_QUINARY_TDM_TX) {
+		if (pdata->tdm_micb_supply) {
+			ret = regulator_disable(pdata->tdm_micb_supply);
+			if (ret)
+				pr_err("%s: regulator disable failed, err = %d\n",
+					__func__, ret);
+			regulator_set_voltage(pdata->tdm_micb_supply, 0,
+					pdata->tdm_micb_voltage);
+			regulator_set_load(pdata->tdm_micb_supply, 0);
+		}
+	}
+
+	if (pdata->mi2s_gpio_p[tdm_mode]) {
+		ret = msm_cdc_pinctrl_select_sleep_state(
+			pdata->mi2s_gpio_p[tdm_mode]);
 		if (ret)
-			pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
+			pr_err("%s: TDM GPIO pinctrl set sleep failed with %d\n",
 				__func__, ret);
 	}
 }
@@ -5469,8 +5374,6 @@
 	unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
 	struct snd_soc_card *card = rtd->card;
 	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
-	struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
-	int ret_pinctrl = 0;
 
 	dev_dbg(rtd->card->dev,
 		"%s: substream = %s  stream = %d, dai name %s, dai ID %d\n",
@@ -5510,13 +5413,9 @@
 				__func__, index, ret);
 			goto clk_off;
 		}
-		if (index == QUAT_MI2S) {
-			ret_pinctrl = msm_set_pinctrl(pinctrl_info,
-						      STATE_MI2S_ACTIVE);
-			if (ret_pinctrl)
-				pr_err("%s: MI2S TLMM pinctrl set failed with %d\n",
-					__func__, ret_pinctrl);
-		}
+		if (pdata->mi2s_gpio_p[index])
+			msm_cdc_pinctrl_select_active_state(
+					pdata->mi2s_gpio_p[index]);
 	}
 clk_off:
 	if (ret < 0)
@@ -5536,8 +5435,6 @@
 	int index = rtd->cpu_dai->id;
 	struct snd_soc_card *card = rtd->card;
 	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
-	struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
-	int ret_pinctrl = 0;
 
 	pr_debug("%s(): substream = %s  stream = %d\n", __func__,
 		 substream->name, substream->stream);
@@ -5548,17 +5445,14 @@
 
 	mutex_lock(&mi2s_intf_conf[index].lock);
 	if (--mi2s_intf_conf[index].ref_cnt == 0) {
+		if (pdata->mi2s_gpio_p[index])
+			msm_cdc_pinctrl_select_sleep_state(
+					pdata->mi2s_gpio_p[index]);
+
 		ret = msm_mi2s_set_sclk(substream, false);
 		if (ret < 0)
 			pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
 				__func__, index, ret);
-		if (index == QUAT_MI2S) {
-			ret_pinctrl = msm_set_pinctrl(pinctrl_info,
-						      STATE_DISABLE);
-			if (ret_pinctrl)
-				pr_err("%s: MI2S TLMM pinctrl set failed with %d\n",
-					__func__, ret_pinctrl);
-		}
 	}
 	mutex_unlock(&mi2s_intf_conf[index].lock);
 }
@@ -6384,6 +6278,37 @@
 		.ignore_pmdown_time = 1,
 		.id = MSM_FRONTEND_DAI_MULTIMEDIA18,
 	},
+	{
+		.name = MSM_DAILINK_NAME(Transcode Loopback Playback),
+		.stream_name = "Transcode Loopback Playback",
+		.cpu_dai_name = "MultiMedia26",
+		.platform_name = "msm-transcode-loopback",
+		.dynamic = 1,
+		.dpcm_playback = 1,
+		.trigger = {SND_SOC_DPCM_TRIGGER_POST,
+			 SND_SOC_DPCM_TRIGGER_POST},
+		.codec_dai_name = "snd-soc-dummy-dai",
+		.codec_name = "snd-soc-dummy",
+		.ignore_suspend = 1,
+		.ignore_pmdown_time = 1,
+		 /* this dailink has playback support */
+		.id = MSM_FRONTEND_DAI_MULTIMEDIA26,
+	},
+	{
+		.name = MSM_DAILINK_NAME(Transcode Loopback Capture),
+		.stream_name = "Transcode Loopback Capture",
+		.cpu_dai_name = "MultiMedia27",
+		.platform_name = "msm-transcode-loopback",
+		.dynamic = 1,
+		.dpcm_capture = 1,
+		.trigger = {SND_SOC_DPCM_TRIGGER_POST,
+			 SND_SOC_DPCM_TRIGGER_POST},
+		.codec_dai_name = "snd-soc-dummy-dai",
+		.codec_name = "snd-soc-dummy",
+		.ignore_suspend = 1,
+		.ignore_pmdown_time = 1,
+		.id = MSM_FRONTEND_DAI_MULTIMEDIA27,
+	},
 };
 
 static struct snd_soc_dai_link msm_common_be_dai_links[] = {
@@ -8342,6 +8267,10 @@
 	struct msm_asoc_mach_data *pdata;
 	int ret;
 	u32 val;
+	const char *micb_supply_str = "tdm-vdd-micb-supply";
+	const char *micb_supply_str1 = "tdm-vdd-micb";
+	const char *micb_voltage_str = "qcom,tdm-vdd-micb-voltage";
+	const char *micb_current_str = "qcom,tdm-vdd-micb-current";
 
 	if (!pdev->dev.of_node) {
 		dev_err(&pdev->dev, "No platform supplied from device tree\n");
@@ -8404,17 +8333,53 @@
 	}
 
 	pdata->dmic_01_gpio_p = of_parse_phandle(pdev->dev.of_node,
-					      "qcom,cdc-dmic01-gpios",
-					       0);
+					"qcom,cdc-dmic01-gpios", 0);
 	pdata->dmic_23_gpio_p = of_parse_phandle(pdev->dev.of_node,
-					      "qcom,cdc-dmic23-gpios",
-					       0);
+					"qcom,cdc-dmic23-gpios", 0);
 	pdata->dmic_45_gpio_p = of_parse_phandle(pdev->dev.of_node,
-					      "qcom,cdc-dmic45-gpios",
-					       0);
+					"qcom,cdc-dmic45-gpios", 0);
 	pdata->dmic_67_gpio_p = of_parse_phandle(pdev->dev.of_node,
-					      "qcom,cdc-dmic67-gpios",
-					       0);
+					"qcom,cdc-dmic67-gpios", 0);
+
+	pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,pri-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,sec-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,tert-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,quat-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,quin-mi2s-gpios", 0);
+
+	if (of_parse_phandle(pdev->dev.of_node, micb_supply_str, 0)) {
+		pdata->tdm_micb_supply = devm_regulator_get(&pdev->dev,
+					micb_supply_str1);
+		if (IS_ERR(pdata->tdm_micb_supply)) {
+			ret = PTR_ERR(pdata->tdm_micb_supply);
+			dev_err(&pdev->dev,
+				"%s:Failed to get micbias supply for TDM Mic %d\n",
+				__func__, ret);
+		}
+		ret = of_property_read_u32(pdev->dev.of_node,
+					micb_voltage_str,
+					&pdata->tdm_micb_voltage);
+		if (ret) {
+			dev_err(&pdev->dev,
+				"%s:Looking up %s property in node %s failed\n",
+				__func__, micb_voltage_str,
+				pdev->dev.of_node->full_name);
+		}
+		ret = of_property_read_u32(pdev->dev.of_node,
+					micb_current_str,
+					&pdata->tdm_micb_current);
+		if (ret) {
+			dev_err(&pdev->dev,
+				"%s:Looking up %s property in node %s failed\n",
+				__func__, micb_current_str,
+				pdev->dev.of_node->full_name);
+		}
+	}
 
 	ret = devm_snd_soc_register_card(&pdev->dev, card);
 	if (ret == -EPROBE_DEFER) {
@@ -8434,23 +8399,11 @@
 		dev_err(&pdev->dev, "msm_mdf_mem_init failed (%d)\n",
 			 ret);
 
-	/* Parse pinctrl info from devicetree */
-	ret = msm_get_pinctrl(pdev);
-	if (!ret) {
-		pr_debug("%s: pinctrl parsing successful\n", __func__);
-	} else {
-		dev_dbg(&pdev->dev,
-			"%s: Parsing pinctrl failed with %d. Cannot use Ports\n",
-			__func__, ret);
-		ret = 0;
-	}
-
 	msm_i2s_auxpcm_init(pdev);
 
 	is_initial_boot = true;
 	return 0;
 err:
-	msm_release_pinctrl(pdev);
 	return ret;
 }
 
@@ -8460,7 +8413,6 @@
 	msm_i2s_auxpcm_deinit();
 	msm_mdf_mem_deinit();
 
-	msm_release_pinctrl(pdev);
 	return 0;
 }
 
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index f5e7267..6697208 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -839,6 +839,8 @@
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_RX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_RX:
+	case SLIMBUS_9_TX:
 		ret_size = SIZEOF_CFG_CMD(afe_param_id_slimbus_cfg);
 		break;
 	case VOICE_PLAYBACK_TX:
@@ -888,6 +890,8 @@
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
 	case AFE_PORT_ID_QUINARY_PCM_RX:
 	case AFE_PORT_ID_QUINARY_PCM_TX:
+	case AFE_PORT_ID_SENARY_PCM_RX:
+	case AFE_PORT_ID_SENARY_PCM_TX:
 	default:
 		pr_debug("%s: default case 0x%x\n", __func__, port_id);
 		ret_size = SIZEOF_CFG_CMD(afe_param_id_pcm_cfg);
@@ -3977,6 +3981,8 @@
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
 	case AFE_PORT_ID_QUINARY_PCM_RX:
 	case AFE_PORT_ID_QUINARY_PCM_TX:
+	case AFE_PORT_ID_SENARY_PCM_RX:
+	case AFE_PORT_ID_SENARY_PCM_TX:
 		cfg_type = AFE_PARAM_ID_PCM_CONFIG;
 		break;
 	case PRIMARY_I2S_RX:
@@ -4041,6 +4047,8 @@
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_RX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_RX:
+	case SLIMBUS_9_TX:
 		cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG;
 		break;
 	case AFE_PORT_ID_USB_RX:
@@ -4246,6 +4254,10 @@
 		return IDX_AFE_PORT_ID_QUINARY_PCM_RX;
 	case AFE_PORT_ID_QUINARY_PCM_TX:
 		return IDX_AFE_PORT_ID_QUINARY_PCM_TX;
+	case AFE_PORT_ID_SENARY_PCM_RX:
+		return IDX_AFE_PORT_ID_SENARY_PCM_RX;
+	case AFE_PORT_ID_SENARY_PCM_TX:
+		return IDX_AFE_PORT_ID_SENARY_PCM_TX;
 	case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX;
 	case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX;
 	case MI2S_RX: return IDX_MI2S_RX;
@@ -4288,6 +4300,8 @@
 	case SLIMBUS_7_TX: return IDX_SLIMBUS_7_TX;
 	case SLIMBUS_8_RX: return IDX_SLIMBUS_8_RX;
 	case SLIMBUS_8_TX: return IDX_SLIMBUS_8_TX;
+	case SLIMBUS_9_RX: return IDX_SLIMBUS_9_RX;
+	case SLIMBUS_9_TX: return IDX_SLIMBUS_9_TX;
 	case AFE_PORT_ID_USB_RX: return IDX_AFE_PORT_ID_USB_RX;
 	case AFE_PORT_ID_USB_TX: return IDX_AFE_PORT_ID_USB_TX;
 	case AFE_PORT_ID_PRIMARY_MI2S_RX:
@@ -4643,6 +4657,8 @@
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
 	case AFE_PORT_ID_QUINARY_PCM_RX:
 	case AFE_PORT_ID_QUINARY_PCM_TX:
+	case AFE_PORT_ID_SENARY_PCM_RX:
+	case AFE_PORT_ID_SENARY_PCM_TX:
 		cfg_type = AFE_PARAM_ID_PCM_CONFIG;
 		break;
 	case SECONDARY_I2S_RX:
@@ -4685,6 +4701,8 @@
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_RX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_RX:
+	case SLIMBUS_9_TX:
 		cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG;
 		break;
 	case AFE_PORT_ID_USB_RX:
@@ -6557,6 +6575,8 @@
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_RX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_RX:
+	case SLIMBUS_9_TX:
 	case AFE_PORT_ID_USB_RX:
 	case AFE_PORT_ID_USB_TX:
 	case AFE_PORT_ID_PRIMARY_MI2S_RX:
diff --git a/dsp/q6audio-v2.c b/dsp/q6audio-v2.c
index 3108c04..5a7fa6f 100644
--- a/dsp/q6audio-v2.c
+++ b/dsp/q6audio-v2.c
@@ -44,6 +44,10 @@
 		return IDX_AFE_PORT_ID_QUINARY_PCM_RX;
 	case AFE_PORT_ID_QUINARY_PCM_TX:
 		return IDX_AFE_PORT_ID_QUINARY_PCM_TX;
+	case AFE_PORT_ID_SENARY_PCM_RX:
+		return IDX_AFE_PORT_ID_SENARY_PCM_RX;
+	case AFE_PORT_ID_SENARY_PCM_TX:
+		return IDX_AFE_PORT_ID_SENARY_PCM_TX;
 	case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX;
 	case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX;
 	case MI2S_RX: return IDX_MI2S_RX;
@@ -79,6 +83,8 @@
 	case SLIMBUS_7_TX: return IDX_SLIMBUS_7_TX;
 	case SLIMBUS_8_RX: return IDX_SLIMBUS_8_RX;
 	case SLIMBUS_8_TX: return IDX_SLIMBUS_8_TX;
+	case SLIMBUS_9_RX: return IDX_SLIMBUS_9_RX;
+	case SLIMBUS_9_TX: return IDX_SLIMBUS_9_TX;
 	case INT_BT_SCO_RX: return IDX_INT_BT_SCO_RX;
 	case INT_BT_SCO_TX: return IDX_INT_BT_SCO_TX;
 	case INT_BT_A2DP_RX: return IDX_INT_BT_A2DP_RX;
@@ -375,6 +381,10 @@
 			return AFE_PORT_ID_QUINARY_PCM_RX;
 	case AFE_PORT_ID_QUINARY_PCM_TX:
 			return AFE_PORT_ID_QUINARY_PCM_TX;
+	case AFE_PORT_ID_SENARY_PCM_RX:
+			return AFE_PORT_ID_SENARY_PCM_RX;
+	case AFE_PORT_ID_SENARY_PCM_TX:
+			return AFE_PORT_ID_SENARY_PCM_TX;
 	case SECONDARY_I2S_RX: return AFE_PORT_ID_SECONDARY_MI2S_RX;
 	case SECONDARY_I2S_TX: return AFE_PORT_ID_SECONDARY_MI2S_TX;
 	case MI2S_RX: return AFE_PORT_ID_PRIMARY_MI2S_RX;
@@ -415,6 +425,8 @@
 	case SLIMBUS_7_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_7_TX;
 	case SLIMBUS_8_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_RX;
 	case SLIMBUS_8_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_TX;
+	case SLIMBUS_9_RX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX;
+	case SLIMBUS_9_TX: return AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX;
 	case INT_BT_SCO_RX: return AFE_PORT_ID_INTERNAL_BT_SCO_RX;
 	case INT_BT_SCO_TX: return AFE_PORT_ID_INTERNAL_BT_SCO_TX;
 	case INT_BT_A2DP_RX: return AFE_PORT_ID_INTERNAL_BT_A2DP_RX;
@@ -725,6 +737,8 @@
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
 	case AFE_PORT_ID_QUINARY_PCM_RX:
 	case AFE_PORT_ID_QUINARY_PCM_TX:
+	case AFE_PORT_ID_SENARY_PCM_RX:
+	case AFE_PORT_ID_SENARY_PCM_TX:
 	case SECONDARY_I2S_RX:
 	case SECONDARY_I2S_TX:
 	case MI2S_RX:
@@ -894,6 +908,8 @@
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
 	case AFE_PORT_ID_QUINARY_PCM_RX:
 	case AFE_PORT_ID_QUINARY_PCM_TX:
+	case AFE_PORT_ID_SENARY_PCM_RX:
+	case AFE_PORT_ID_SENARY_PCM_TX:
 	case SECONDARY_I2S_RX:
 	case SECONDARY_I2S_TX:
 	case MI2S_RX:
@@ -925,6 +941,8 @@
 	case SLIMBUS_7_TX:
 	case SLIMBUS_8_RX:
 	case SLIMBUS_8_TX:
+	case SLIMBUS_9_RX:
+	case SLIMBUS_9_TX:
 	case INT_BT_SCO_RX:
 	case INT_BT_SCO_TX:
 	case INT_BT_A2DP_RX:
diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h
index 1342819..87fd13b 100644
--- a/include/dsp/apr_audio-v2.h
+++ b/include/dsp/apr_audio-v2.h
@@ -212,6 +212,17 @@
  */
 #define ADM_CMD_DEVICE_OPEN_V6                      0x00010356
 
+/* This command allows a client to open a COPP/Voice Proc the
+*	way as ADM_CMD_DEVICE_OPEN_V8 but supports any number channel
+*	of configuration.
+*
+*	@return
+*	#ADM_CMDRSP_DEVICE_OPEN_V8 with the resulting status and
+*	COPP ID.
+*/
+#define ADM_CMD_DEVICE_OPEN_V8                      0x0001036A
+
+
 /* Definition for a low latency stream session. */
 #define ADM_LOW_LATENCY_DEVICE_SESSION			0x2000
 
@@ -490,6 +501,110 @@
  */
 } __packed;
 
+
+/* ADM device open endpoint payload the
+ *   #ADM_CMD_DEVICE_OPEN_V8 command.
+ */
+struct adm_device_endpoint_payload {
+	u16                  dev_num_channel;
+/* Number of channels the audio COPP sends to/receives from
+ * the endpoint.
+ * Supported values: 1 to 32.
+ * The value is ignored for the voice processor Tx block,
+ * where channel
+ * configuration is derived from the topology ID.
+ */
+
+	u16                  bit_width;
+/* Bit width (in bits) that the audio COPP sends to/receives
+ * from the
+ * endpoint. The value is ignored for the voice processing
+ * Tx block,
+ * where the PCM width is 16 bits.
+ */
+
+	u32                  sample_rate;
+/* Sampling rate at which the audio COPP/voice processor
+ * Tx block
+ * interfaces with the endpoint.
+ * Supported values for voice processor Tx: 8000, 16000,
+ * 48000 Hz
+ * Supported values for audio COPP: >0 and <=192 kHz
+ */
+
+	u8                    dev_channel_mapping[32];
+} __packed;
+
+/*  ADM device open command payload of the
+ *   #ADM_CMD_DEVICE_OPEN_V8 command.
+ */
+struct adm_cmd_device_open_v8 {
+	struct apr_hdr       hdr;
+	u16                  flags;
+/* Bit width Native mode enabled : 11th bit of flag parameter
+*  If 11th bit of flag is set then that means matrix mixer will be
+*  running in native mode for bit width for this device session.
+*
+*  Channel Native mode enabled : 12th bit of flag parameter
+*  If 12th bit of flag is set then that means matrix mixer will be
+*  running in native mode for channel configuration for this device session.
+*  All other bits are reserved; clients must set them to 0.
+*/
+	u16                  mode_of_operation;
+/* Specifies whether the COPP must be opened on the Tx or Rx
+ * path. Use the ADM_CMD_COPP_OPEN_MODE_OF_OPERATION_* macros for
+ * supported values and interpretation.
+ * Supported values:
+ * - 0x1 -- Rx path COPP
+ * - 0x2 -- Tx path live COPP
+ * - 0x3 -- Tx path nonlive COPP
+ * Live connections cause sample discarding in the Tx device
+ * matrix if the destination output ports do not pull them
+ * fast enough. Nonlive connections queue the samples
+ * indefinitely.
+ */
+	u32                  topology_id;
+/* Audio COPP topology ID; 32-bit GUID. */
+
+
+	u16                  endpoint_id_1;
+/* Logical and physical endpoint ID of the audio path.
+ * If the ID is a voice processor Tx block, it receives near
+ * samples.
+ * Supported values: Any pseudoport, AFE Rx port,
+ * or AFE Tx port For a list of valid IDs, refer to
+ * @xhyperref{Q4,[Q4]}.
+ * Q4 = Hexagon Multimedia: AFE Interface Specification
+ */
+
+	u16                  endpoint_id_2;
+/* Logical and physical endpoint ID 2 for a voice processor
+ * Tx block.
+ * This is not applicable to audio COPP.
+ * Supported values:
+ * - AFE Rx port
+ * - 0xFFFF -- Endpoint 2 is unavailable and the voice
+ * processor Tx
+ * block ignores this endpoint
+ * When the voice processor Tx block is created on the audio
+ * record path,
+ * it can receive far-end samples from an AFE Rx port if the
+ * voice call
+ * is active. The ID of the AFE port is provided in this
+ * field.
+ * For a list of valid IDs, refer @xhyperref{Q4,[Q4]}.
+ */
+
+	u16                  endpoint_id_3;
+/*
+ * Logical and physical endpoint ID of the audio path.
+ * This indicated afe rx port in ADM loopback use cases.
+ * In all other use cases this should be set to 0xffff
+ */
+
+	u16                  reserved;
+} __packed;
+
 /*
  *	This command allows the client to close a COPP and disconnect
  *	the device session.
@@ -620,6 +735,9 @@
 /* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V6 command. */
 #define ADM_CMDRSP_DEVICE_OPEN_V6                      0x00010357
 
+/* Returns the status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V8 command. */
+#define ADM_CMDRSP_DEVICE_OPEN_V8                      0x0001036B
+
 /*  Payload of the #ADM_CMDRSP_DEVICE_OPEN_V6 message,
  *	which returns the
  *	status and COPP ID to an #ADM_CMD_DEVICE_OPEN_V6 command
@@ -804,6 +922,12 @@
  */
 #define ADM_CMD_MATRIX_RAMP_GAINS_V5                                 0x0001032C
 
+/*
+ * Allows a client to control the gains on various session-to-COPP paths.
+ * Maximum support 32 channels
+ */
+#define ADM_CMD_MATRIX_RAMP_GAINS_V7                                 0x0001036C
+
 /* Indicates that the target gain in the
  *	current adm_session_copp_gain_v5
  *	structure is to be applied to all
@@ -916,12 +1040,97 @@
 	/* Target linear gain for channel 8 in Q13 format; */
 } __packed;
 
+/*  Payload of the #ADM_CMD_MATRIX_RAMP_GAINS_V7 command.
+ * Immediately following this structure are num_gains of the
+ * adm_session_copp_gain_v5structure.
+ */
+struct adm_cmd_matrix_ramp_gains_v7 {
+	struct apr_hdr       hdr;
+	u32                  matrix_id;
+/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1).
+ * Use the ADM_MATRIX_ID_AUDIO_RX or  ADM_MATRIX_ID_AUDIOX
+ * macros to set this field.
+*/
+
+	u16                  num_gains;
+	/* Number of gains being applied. */
+
+	u16                  reserved_for_align;
+	/* Reserved. This field must be set to zero.*/
+} __packed;
+
+/* Session-to-COPP path gain structure, used by the
+ * #ADM_CMD_MATRIX_RAMP_GAINS_V7 command.
+ * This structure specifies the target
+ * gain (per channel) that must be applied
+ * to a particular session-to-COPP path in
+ * the audio matrix. The structure can
+ * also be used to apply the gain globally
+ * to all session-to-COPP paths that
+ * exist for the given session.
+ * The aDSP uses device channel mapping to
+ * determine which channel gains to
+ * use from this command. For example,
+ * if the device is configured as stereo,
+ * the aDSP uses only target_gain_ch_1 and
+ * target_gain_ch_2, and it ignores
+ * the others.
+ */
+struct adm_session_copp_gain_v7 {
+	u16                  session_id;
+/* Handle of the ASM session.
+ * Supported values: 1 to 8.
+ */
+
+	u16                  copp_id;
+/* Handle of the COPP. Gain will be applied on the Session ID
+ * COPP ID path.
+ */
+
+	u16                  ramp_duration;
+/* Duration (in milliseconds) of the ramp over
+ * which target gains are
+ * to be applied. Use
+ * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE
+ * to indicate that gain must be applied immediately.
+ */
+
+	u16                  step_duration;
+/* Duration (in milliseconds) of each step in the ramp.
+ * This parameter is ignored if ramp_duration is equal to
+ * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE.
+ * Supported value: 1
+ */
+
+	u16                  ramp_curve;
+/* Type of ramping curve.
+ * Supported value: #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_CURVE_LINEAR
+ */
+
+	u16                  stream_type;
+/* Type of stream_type.
+ * Supported value: #STREAM_TYPE_ASM STREAM_TYPE_LSM
+ */
+	u16                  num_channels;
+/* Number of channels on which gain needs to be applied.
+ * Supported value: 1 to 32.
+ */
+	u16                  reserved_for_align;
+	/* Reserved. This field must be set to zero. */
+} __packed;
+
 /* Allows to set mute/unmute on various session-to-COPP paths.
  *	For every session-to-COPP path (stream-device interconnection),
  *	mute/unmute can be set individually on the output channels.
  */
 #define ADM_CMD_MATRIX_MUTE_V5                                0x0001032D
 
+/* Allows to set mute/unmute on various session-to-COPP paths.
+ * For every session-to-COPP path (stream-device interconnection),
+ * mute/unmute can be set individually on the output channels.
+ */
+#define ADM_CMD_MATRIX_MUTE_V7                                0x0001036D
+
 /* Indicates that mute/unmute in the
  *	current adm_session_copp_mute_v5structure
  *	is to be applied to all the session-to-COPP
@@ -987,6 +1196,50 @@
 	/* Clients must set this field to zero.*/
 } __packed;
 
+
+/*  Payload of the #ADM_CMD_MATRIX_MUTE_V7 command*/
+struct adm_cmd_matrix_mute_v7 {
+	struct apr_hdr       hdr;
+	u32                  matrix_id;
+/* Specifies whether the matrix ID is Audio Rx (0) or Audio Tx (1).
+ * Use the ADM_MATRIX_ID_AUDIO_RX or  ADM_MATRIX_ID_AUDIOX
+ * macros to set this field.
+ */
+
+	u16                  session_id;
+/* Handle of the ASM session.
+ * Supported values: 1 to .
+ */
+
+	u16                  copp_id;
+/* Handle of the COPP.
+ * Use ADM_CMD_MATRIX_MUTE_COPP_ID_ALL_CONNECTED_COPPS
+ * to indicate that mute/unmute must be applied to
+ * all the COPPs connected to session_id.
+ * Supported values:
+ * - 0xFFFF -- Apply mute/unmute to all connected COPPs
+ * - Other values -- Valid COPP ID
+ */
+
+	u16                  ramp_duration;
+/* Duration (in milliseconds) of the ramp over
+ * which target gains are
+ * to be applied. Use
+ * #ADM_CMD_MATRIX_RAMP_GAINS_RAMP_DURATION_IMMEDIATE
+ * to indicate that gain must be applied immediately.
+ */
+
+	u16                  stream_type;
+/* Specify whether the stream type is connectedon the ASM or LSM
+ * Supported value: 1
+ */
+	u16                  num_channels;
+/* Number of channels on which gain needs to be applied
+ * Supported value: 1 to 32
+ */
+} __packed;
+
+
 #define ASM_PARAM_ID_AAC_STEREO_MIX_COEFF_SELECTION_FLAG_V2 (0x00010DD8)
 
 struct asm_aac_stereo_mix_coeff_selection_param_v2 {
@@ -1085,7 +1338,9 @@
 #define SLIMBUS_7_TX		0x400f
 #define SLIMBUS_8_RX		0x4010
 #define SLIMBUS_8_TX		0x4011
-#define SLIMBUS_PORT_LAST	SLIMBUS_8_TX
+#define SLIMBUS_9_RX		0x4012
+#define SLIMBUS_9_TX		0x4013
+#define SLIMBUS_PORT_LAST	SLIMBUS_9_TX
 #define INT_BT_SCO_RX 0x3000
 #define INT_BT_SCO_TX 0x3001
 #define INT_BT_A2DP_RX 0x3002
@@ -1233,13 +1488,19 @@
 /* ID of the Internal 6 MI2S Tx port */
 #define AFE_PORT_ID_INT6_MI2S_TX                 0x103B
 
-#define AFE_PORT_ID_QUINARY_PCM_RX       0x103C
-#define AFE_PORT_ID_QUINARY_PCM_TX       0x103D
+#define AFE_PORT_ID_QUINARY_PCM_RX               0x103C
+#define AFE_PORT_ID_QUINARY_PCM_TX               0x103D
 
-#define AFE_PORT_ID_PRIMARY_SPDIF_RX        0x5000
-#define AFE_PORT_ID_PRIMARY_SPDIF_TX        0x5001
-#define AFE_PORT_ID_SECONDARY_SPDIF_RX      0x5002
-#define AFE_PORT_ID_SECONDARY_SPDIF_TX      0x5003
+/* ID of the senary auxiliary PCM Rx port. */
+#define AFE_PORT_ID_SENARY_PCM_RX                0x103E
+/* ID of the senary auxiliary PCM Tx port. */
+#define AFE_PORT_ID_SENARY_PCM_TX                0x103F
+
+#define AFE_PORT_ID_PRIMARY_SPDIF_RX             0x5000
+#define AFE_PORT_ID_PRIMARY_SPDIF_TX             0x5001
+#define AFE_PORT_ID_SECONDARY_SPDIF_RX           0x5002
+#define AFE_PORT_ID_SECONDARY_SPDIF_TX           0x5003
+#define AFE_PORT_ID_SPDIF_RX                AFE_PORT_ID_PRIMARY_SPDIF_RX
 
 #define  AFE_PORT_ID_RT_PROXY_PORT_001_RX   0x2000
 #define  AFE_PORT_ID_RT_PROXY_PORT_001_TX   0x2001
@@ -1284,6 +1545,10 @@
 #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_RX      0x4010
 /* SLIMbus Tx port on channel 8. */
 #define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_8_TX      0x4011
+/* SLIMbus Rx port on channel 9. */
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX      0x4012
+/* SLIMbus Tx port on channel 9. */
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX      0x4013
 /* AFE Rx port for audio over Display port */
 #define AFE_PORT_ID_HDMI_OVER_DP_RX              0x6020
 /*USB AFE port */
@@ -2242,6 +2507,17 @@
 #define AFE_PORT_I2S_QUAD23                  0x6
 #define AFE_PORT_I2S_6CHS                    0x7
 #define AFE_PORT_I2S_8CHS                    0x8
+#define AFE_PORT_I2S_10CHS                   0x9
+#define AFE_PORT_I2S_12CHS                   0xA
+#define AFE_PORT_I2S_14CHS                   0xB
+#define AFE_PORT_I2S_16CHS                   0xC
+#define AFE_PORT_I2S_SD4                     0xD
+#define AFE_PORT_I2S_SD5                     0xE
+#define AFE_PORT_I2S_SD6                     0xF
+#define AFE_PORT_I2S_SD7                     0x10
+#define AFE_PORT_I2S_QUAD45                  0x11
+#define AFE_PORT_I2S_QUAD67                  0x12
+#define AFE_PORT_I2S_8CHS_2                  0x13
 #define AFE_PORT_I2S_MONO                    0x0
 #define AFE_PORT_I2S_STEREO                  0x1
 #define AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL  0x0
@@ -2274,6 +2550,17 @@
  * - #AFE_PORT_I2S_QUAD23
  * - #AFE_PORT_I2S_6CHS
  * - #AFE_PORT_I2S_8CHS
+ * - #AFE_PORT_I2S_10CHS
+ * - #AFE_PORT_I2S_12CHS
+ * - #AFE_PORT_I2S_14CHS
+ * - #AFE_PORT_I2S_16CHS
+ * - #AFE_PORT_I2S_SD4
+ * - #AFE_PORT_I2S_SD5
+ * - #AFE_PORT_I2S_SD6
+ * - #AFE_PORT_I2S_SD7
+ * - #AFE_PORT_I2S_QUAD45
+ * - #AFE_PORT_I2S_QUAD67
+ * - #AFE_PORT_I2S_8CHS_2
  */
 
 	u16                  mono_stereo;
@@ -4943,15 +5230,80 @@
 /* Rear right of center. */
 #define PCM_CHANNEL_RRC  16
 
+/* Second low frequency channel. */
+#define PCM_CHANNEL_LFE2 17
+
+/* Side left channel. */
+#define PCM_CHANNEL_SL   18
+
+/* Side right channel. */
+#define PCM_CHANNEL_SR   19
+
+/* Top front left channel. */
+#define PCM_CHANNEL_TFL  20
+
+/* Left vertical height channel. */
+#define PCM_CHANNEL_LVH  20
+
+/* Top front right channel. */
+#define PCM_CHANNEL_TFR  21
+
+/* Right vertical height channel. */
+#define PCM_CHANNEL_RVH  21
+
+/* Top center channel. */
+#define PCM_CHANNEL_TC   22
+
+/* Top back left channel. */
+#define PCM_CHANNEL_TBL  23
+
+/* Top back right channel. */
+#define PCM_CHANNEL_TBR  24
+
+/* Top side left channel. */
+#define PCM_CHANNEL_TSL  25
+
+/* Top side right channel. */
+#define PCM_CHANNEL_TSR  26
+
+/* Top back center channel. */
+#define PCM_CHANNEL_TBC  27
+
+/* Bottom front center channel. */
+#define PCM_CHANNEL_BFC  28
+
+/* Bottom front left channel. */
+#define PCM_CHANNEL_BFL  29
+
+/* Bottom front right channel. */
+#define PCM_CHANNEL_BFR  30
+
+/* Left wide channel. */
+#define PCM_CHANNEL_LW   31
+
+/* Right wide channel. */
+#define PCM_CHANNEL_RW   32
+
+/* Left side direct channel. */
+#define PCM_CHANNEL_LSD  33
+
+/* Right side direct channel. */
+#define PCM_CHANNEL_RSD  34
+
 #define PCM_FORMAT_MAX_NUM_CHANNEL  8
 #define PCM_FORMAT_MAX_CHANNELS_9   9
 
+/* Used for ADM_CMD_DEVICE_OPEN_V8 */
+#define PCM_FORMAT_MAX_NUM_CHANNEL_V8  32
+
 #define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 0x00010DA5
 
 #define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 0x00010DDC
 
 #define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 0x0001320C
 
+#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 0x00013222
+
 #define ASM_MEDIA_FMT_EVRCB_FS 0x00010BEF
 
 #define ASM_MEDIA_FMT_EVRCWB_FS 0x00010BF0
@@ -5166,6 +5518,56 @@
  */
 } __packed;
 
+
+struct asm_multi_channel_pcm_fmt_blk_v5 {
+	uint16_t                num_channels;
+/*
+ * Number of channels
+ * Supported values: 1 to 32
+ */
+
+	uint16_t                bits_per_sample;
+/*
+ * Number of bits per sample per channel
+ * Supported values: 16, 24, 32
+ */
+
+	uint32_t                sample_rate;
+/*
+ * Number of samples per second
+ * Supported values: 2000 to 48000, 96000,192000 Hz
+ */
+
+	uint16_t                is_signed;
+/* Flag that indicates that PCM samples are signed (1) */
+
+	uint16_t                sample_word_size;
+/*
+ * Size in bits of the word that holds a sample of a channel.
+ * Supported values: 12,24,32
+ */
+	uint16_t                endianness;
+/*
+ * Flag to indicate the endianness of the pcm sample
+ * Supported values: 0 - Little endian (all other formats)
+ *                   1 - Big endian (AIFF)
+ */
+	uint16_t                mode;
+/*
+ * Mode to provide additional info about the pcm input data.
+ * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b,
+ *                       Q31 for unpacked 24b or 32b)
+ *                  15 - for 16 bit
+ *                  23 - for 24b packed or 8.24 format
+ *                  31 - for 24b unpacked or 32bit
+ */
+
+	uint8_t                 channel_mapping[32];
+/*
+ * Each element, i, in the array describes channel i inside the buffer where
+ * 0 <= i < num_channels. Unused channels are set to 0.
+ */
+} __packed;
 /*
  * Payload of the multichannel PCM configuration parameters in
  * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3 media format.
@@ -5186,6 +5588,16 @@
 	struct asm_multi_channel_pcm_fmt_blk_v4 param;
 } __packed;
 
+/*
+ * Payload of the multichannel PCM configuration parameters in
+ * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 media format.
+ */
+struct asm_multi_channel_pcm_fmt_blk_param_v5 {
+	struct apr_hdr hdr;
+	struct asm_data_cmd_media_fmt_update_v2 fmt_blk;
+	struct asm_multi_channel_pcm_fmt_blk_v5 param;
+} __packed;
+
 struct asm_stream_cmd_set_encdec_param {
 	u32                  param_id;
 	/* ID of the parameter. */
@@ -5239,6 +5651,78 @@
 
 /*
  * Payload of the multichannel PCM encoder configuration parameters in
+ * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V5 media format.
+ */
+struct asm_multi_channel_pcm_enc_cfg_v5 {
+	struct apr_hdr hdr;
+	struct asm_stream_cmd_set_encdec_param encdec;
+	struct asm_enc_cfg_blk_param_v2 encblk;
+	uint16_t num_channels;
+/*
+ * Number of PCM channels.
+ * @values
+ * - 0 -- Native mode
+ * - 1 -- 8 channels
+ * Native mode indicates that encoding must be performed with the number
+ * of channels at the input.
+ */
+	uint16_t  bits_per_sample;
+/*
+ * Number of bits per sample per channel.
+ * @values 16, 24
+ */
+	uint32_t  sample_rate;
+/*
+ * Number of samples per second.
+ * @values 0, 8000 to 48000 Hz
+ * A value of 0 indicates the native sampling rate. Encoding is
+ * performed at the input sampling rate.
+ */
+	uint16_t  is_signed;
+/*
+ * Flag that indicates the PCM samples are signed (1). Currently, only
+ * signed PCM samples are supported.
+ */
+	uint16_t    sample_word_size;
+/*
+ * The size in bits of the word that holds a sample of a channel.
+ * @values 16, 24, 32
+ * 16-bit samples are always placed in 16-bit words:
+ * sample_word_size = 1.
+ * 24-bit samples can be placed in 32-bit words or in consecutive
+ * 24-bit words.
+ * - If sample_word_size = 32, 24-bit samples are placed in the
+ * most significant 24 bits of a 32-bit word.
+ * - If sample_word_size = 24, 24-bit samples are placed in
+ * 24-bit words. @tablebulletend
+ */
+	uint16_t                endianness;
+/*
+ * Flag to indicate the endianness of the pcm sample
+ * Supported values: 0 - Little endian (all other formats)
+ *                   1 - Big endian (AIFF)
+ */
+	uint16_t                mode;
+/*
+ * Mode to provide additional info about the pcm input data.
+ * Supported values: 0 - Default QFs (Q15 for 16b, Q23 for packed 24b,
+ *                       Q31 for unpacked 24b or 32b)
+ *                  15 - for 16 bit
+ *                  23 - for 24b packed or 8.24 format
+ */
+	uint8_t   channel_mapping[PCM_FORMAT_MAX_NUM_CHANNEL_V8];
+/*
+ * Channel mapping array expected at the encoder output.
+ * Channel[i] mapping describes channel i inside the buffer, where
+ * 0 @le i < num_channels. All valid used channels must be present at
+ * the beginning of the array.
+ * If Native mode is set for the channels, this field is ignored.
+ * @values See Section @xref{dox:PcmChannelDefs}
+ */
+} __packed;
+
+/*
+ * Payload of the multichannel PCM encoder configuration parameters in
  * the ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V4 media format.
  */
 
@@ -10182,6 +10666,8 @@
 /* LSM Specific */
 #define VW_FEAT_DIM					(39)
 
+#define APRV2_IDS_SERVICE_ID_ADSP_ASM_V			(0x7)
+#define APRV2_IDS_SERVICE_ID_ADSP_ADM_V			(0x8)
 #define APRV2_IDS_SERVICE_ID_ADSP_LSM_V			(0xD)
 #define APRV2_IDS_DOMAIN_ID_ADSP_V			(0x4)
 #define APRV2_IDS_DOMAIN_ID_APPS_V			(0x5)
@@ -10499,6 +10985,10 @@
 #define Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT                          0x209
 /* Clock ID for QUINARY PCM OSR  */
 #define Q6AFE_LPASS_CLK_ID_QUI_PCM_OSR                            0x20A
+/* Clock ID for Senary PCM IBIT */
+#define Q6AFE_LPASS_CLK_ID_SEN_PCM_IBIT                           0x20B
+/* Clock ID for Senary PCM EBIT */
+#define Q6AFE_LPASS_CLK_ID_SEN_PCM_EBIT                           0x20C
 
 /** Clock ID for Primary TDM IBIT */
 #define Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT                           0x200
@@ -10543,6 +11033,9 @@
  */
 #define AFE_CLOCK_SET_CLOCK_ID_SWR_NPL_CLK                         0x307
 
+/* Clock ID for MCLK5 */
+#define Q6AFE_LPASS_CLK_ID_MCLK_5                                 0x308
+
 /* Clock ID for AHB HDMI input */
 #define Q6AFE_LPASS_CLK_ID_AHB_HDMI_INPUT                         0x400
 
diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h
index cf004d0..eb5fc83 100644
--- a/include/dsp/q6afe-v2.h
+++ b/include/dsp/q6afe-v2.h
@@ -24,6 +24,10 @@
 #define MSM_AFE_4CHANNELS   4
 #define MSM_AFE_6CHANNELS   6
 #define MSM_AFE_8CHANNELS   8
+#define MSM_AFE_10CHANNELS   10
+#define MSM_AFE_12CHANNELS   12
+#define MSM_AFE_14CHANNELS   14
+#define MSM_AFE_16CHANNELS   16
 
 #define MSM_AFE_I2S_FORMAT_LPCM		0
 #define MSM_AFE_I2S_FORMAT_COMPR		1
@@ -251,10 +255,16 @@
 	IDX_AFE_PORT_ID_TX_CODEC_DMA_TX_5,
 	IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6,
 	IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7,
-	/* IDX 182 to 185 */
+	/* IDX 182 to 184 */
 	IDX_SECONDARY_SPDIF_RX,
 	IDX_PRIMARY_SPDIF_TX,
 	IDX_SECONDARY_SPDIF_TX,
+	/* IDX 185 to 186 */
+	IDX_SLIMBUS_9_RX,
+	IDX_SLIMBUS_9_TX,
+	/* IDX 187 -> 189 */
+	IDX_AFE_PORT_ID_SENARY_PCM_RX,
+	IDX_AFE_PORT_ID_SENARY_PCM_TX,
 	AFE_MAX_PORTS
 };
 
diff --git a/include/soc/snd_event.h b/include/soc/snd_event.h
index af56673..8359411 100644
--- a/include/soc/snd_event.h
+++ b/include/soc/snd_event.h
@@ -38,39 +38,39 @@
 	return 1;
 }
 #else
-int snd_event_client_register(struct device *dev,
+static inline int snd_event_client_register(struct device *dev,
 			      const struct snd_event_ops *snd_ev_ops,
 			      void *data)
 {
 	return 0;
 }
-int snd_event_client_deregister(struct device *dev)
+static inline int snd_event_client_deregister(struct device *dev)
 {
 	return 0;
 }
-int snd_event_master_register(struct device *dev,
+static inline int snd_event_master_register(struct device *dev,
 			      const struct snd_event_ops *ops,
 			      struct snd_event_clients *clients,
 			      void *data)
 {
 	return 0;
 }
-int snd_event_master_deregister(struct device *dev)
+static inline int snd_event_master_deregister(struct device *dev)
 {
 	return 0;
 }
-int snd_event_notify(struct device *dev, unsigned int state)
+static inline int snd_event_notify(struct device *dev, unsigned int state)
 {
 	return 0;
 }
 
-void snd_event_mstr_add_client(struct snd_event_clients **snd_clients,
+static inline void snd_event_mstr_add_client(struct snd_event_clients **snd_clients,
 			    int (*compare)(struct device *, void *),
 			    void *data)
 {
 	return;
 }
-inline bool is_snd_event_fwk_enabled(void)
+static inline bool is_snd_event_fwk_enabled(void)
 {
 	return 0;
 }
diff --git a/include/soc/soundwire.h b/include/soc/soundwire.h
index 2796428..3bc3332 100644
--- a/include/soc/soundwire.h
+++ b/include/soc/soundwire.h
@@ -208,6 +208,7 @@
 	unsigned long    addr;
 	u8 group_id;
 	struct irq_domain *slave_irq;
+	bool slave_irq_pending;
 };
 
 static inline struct swr_device *to_swr_device(struct device *dev)
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index ff062b6..7378469 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -849,7 +849,8 @@
 						port_req->dev_num, 0x00,
 						SWRS_DP_BLOCK_CONTROL_1(slv_id));
 			}
-			if (mport->blk_pack_mode != SWR_INVALID_PARAM) {
+			if (mport->blk_pack_mode != SWR_INVALID_PARAM
+					&& swrm->master_id != MASTER_ID_WSA) {
 				reg[len] = SWRM_CMD_FIFO_WR_CMD;
 				val[len++] =
 					SWR_REG_VAL_PACK(mport->blk_pack_mode,
@@ -877,8 +878,10 @@
 		}
 		value = ((mport->req_ch)
 				<< SWRM_DP_PORT_CTRL_EN_CHAN_SHFT);
-		value |= ((mport->offset2)
-				<< SWRM_DP_PORT_CTRL_OFFSET2_SHFT);
+
+		if (mport->offset2 != SWR_INVALID_PARAM)
+			value |= ((mport->offset2)
+					<< SWRM_DP_PORT_CTRL_OFFSET2_SHFT);
 		value |= ((mport->offset1)
 				<< SWRM_DP_PORT_CTRL_OFFSET1_SHFT);
 		value |= mport->sinterval;
@@ -1256,20 +1259,26 @@
 						spurious interrupt\n");
 				return ret;
 			}
-			list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
-				if (swr_dev->dev_num != devnum)
-					continue;
-				if (swr_dev->slave_irq)
-					handle_nested_irq(
-						irq_find_mapping(
-						swr_dev->slave_irq, 0));
-			}
 			swrm_cmd_fifo_rd_cmd(swrm, &temp, devnum, 0x0,
 						SWRS_SCP_INT_STATUS_CLEAR_1, 1);
 			swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0,
 						SWRS_SCP_INT_STATUS_CLEAR_1);
 			swrm_cmd_fifo_wr_cmd(swrm, 0x0, devnum, 0x0,
 						SWRS_SCP_INT_STATUS_CLEAR_1);
+
+
+			list_for_each_entry(swr_dev, &mstr->devices, dev_list) {
+				if (swr_dev->dev_num != devnum)
+					continue;
+				if (swr_dev->slave_irq) {
+					do {
+						handle_nested_irq(
+							irq_find_mapping(
+							swr_dev->slave_irq, 0));
+					} while (swr_dev->slave_irq_pending);
+				}
+
+			}
 			break;
 		case SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED:
 			dev_dbg(swrm->dev, "SWR new slave attached\n");
@@ -1292,6 +1301,12 @@
 			case SWR_ATTACHED_OK:
 				dev_dbg(swrm->dev, "device %d got attached\n",
 					devnum);
+				/* enable host irq from slave device*/
+				swrm_cmd_fifo_wr_cmd(swrm, 0xFF, devnum, 0x0,
+					SWRS_SCP_INT_STATUS_CLEAR_1);
+				swrm_cmd_fifo_wr_cmd(swrm, 0x4, devnum, 0x0,
+					SWRS_SCP_INT_STATUS_MASK_1);
+
 				break;
 			case SWR_ALERT:
 				dev_dbg(swrm->dev,
@@ -1428,11 +1443,6 @@
 					dev_dbg(swrm->dev,
 						"%s: devnum %d is assigned for dev addr %lx\n",
 						__func__, i, swr_dev->addr);
-					swrm_cmd_fifo_wr_cmd(swrm, 0xFF, i, 0xF,
-						SWRS_SCP_INT_STATUS_CLEAR_1);
-					swrm_cmd_fifo_wr_cmd(swrm, 0x4, i, 0xF,
-						SWRS_SCP_INT_STATUS_MASK_1);
-
 				}
 			}
 		}
@@ -1484,9 +1494,9 @@
 	reg[len] = SWRM_MCP_BUS_CTRL_ADDR;
 	value[len++] = 0x2;
 
-	/* Set IRQ to PULSE */
+	/* Set IRQ to LEVEL */
 	reg[len] = SWRM_COMP_CFG_ADDR;
-	value[len++] = 0x03;
+	value[len++] = 0x01;
 
 	reg[len] = SWRM_INTERRUPT_CLEAR;
 	value[len++] = 0xFFFFFFFF;
@@ -1496,7 +1506,7 @@
 	value[len++] = 0x1FFFD;
 
 	reg[len] = SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN;
-	value[len++] = 0x1;
+	value[len++] = 0x1FFFD;
 
 	swr_master_bulk_write(swrm, reg, value, len);
 
@@ -1518,8 +1528,10 @@
 		schedule_work(&(swrm->dc_presence_work));
 		break;
 	case SWR_WAKE_IRQ_EVENT:
-		if (swrm->wakeup_req)
+		if (swrm->wakeup_req && !swrm->wakeup_triggered) {
+			swrm->wakeup_triggered = true;
 			schedule_work(&swrm->wakeup_work);
+		}
 		break;
 	default:
 		dev_err(swrm->dev, "%s: invalid event type: %lu\n",
@@ -1741,7 +1753,7 @@
 
 		ret = request_threaded_irq(swrm->irq, NULL,
 					   swr_mstr_interrupt,
-					   IRQF_TRIGGER_RISING | IRQF_ONESHOT,
+					   IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
 					   "swr_master_irq", swrm);
 		if (ret) {
 			dev_err(swrm->dev, "%s: Failed to request irq %d\n",
@@ -1947,9 +1959,11 @@
 			swrm_cmd_fifo_wr_cmd(swrm, 0x2, 0xF, 0xF,
 					SWRS_SCP_CONTROL);
 			usleep_range(100, 105);
-			if (swrm->wakeup_req)
+			if (swrm->wakeup_req) {
 				msm_aud_evt_blocking_notifier_call_chain(
 					SWR_WAKE_IRQ_REGISTER, (void *)swrm);
+				swrm->wakeup_triggered = false;
+			}
 		}
 		swrm_clk_request(swrm, false);
 	}
diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h
index b55beba..f9faed5 100644
--- a/soc/swr-mstr-ctrl.h
+++ b/soc/swr-mstr-ctrl.h
@@ -151,8 +151,8 @@
 	u32 clk_stop_mode0_supp;
 	struct work_struct wakeup_work;
 	u32 wakeup_req;
-
 	bool dev_up;
+	bool wakeup_triggered;
 };
 
 #endif /* _SWR_WCD_CTRL_H */
diff --git a/soc/swrm_port_config.h b/soc/swrm_port_config.h
index 86cc922..81bab1c 100644
--- a/soc/swrm_port_config.h
+++ b/soc/swrm_port_config.h
@@ -24,10 +24,10 @@
 struct port_params wsa_frame_superset[SWR_MSTR_PORT_LEN] = {
 	{7,  1,  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 	{31, 2,  0,    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
-	{63, 12, 31,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+	{63, 12, 31,   0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF},
 	{7,  6,  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 	{31, 18, 0,    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
-	{63, 13, 31,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+	{63, 13, 31,   0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF},
 	{15, 7,  0,    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 	{15, 10, 0,    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 };