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, ¶m1[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},
};