summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCong Tang <congt@codeaurora.org>2018-11-27 17:20:39 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-12-18 23:08:40 -0800
commit84b3d9aa80b541a41958d159f6ecbc86de8d3d43 (patch)
treefdc0f117b9eba4e7482e03ab9b2fbd508b30f09f
parent897db080e2b96fff7c64ba0f80909dfac9efbc5a (diff)
ASoC: msm: Group mi2s driver support for msm8996
Support group mi2s driver for sec/tert/quat mi2s interface in msm8996. Change-Id: I656612ca104c80770e316bc4d541d2ae56164e61 Signed-off-by: Cong Tang <congt@codeaurora.org>
-rw-r--r--include/sound/apr_audio-v2.h138
-rw-r--r--include/sound/q6afe-v2.h70
-rw-r--r--sound/soc/msm/apq8096-auto.c710
-rw-r--r--sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c1382
-rw-r--r--sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c1491
-rw-r--r--sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h52
-rw-r--r--sound/soc/msm/qdsp6v2/q6afe.c332
-rw-r--r--sound/soc/msm/qdsp6v2/q6audio-v2.c144
8 files changed, 4311 insertions, 8 deletions
diff --git a/include/sound/apr_audio-v2.h b/include/sound/apr_audio-v2.h
index 48fe32252e8d..89e05abfd74b 100644
--- a/include/sound/apr_audio-v2.h
+++ b/include/sound/apr_audio-v2.h
@@ -1489,11 +1489,35 @@ struct adm_cmd_connect_afe_port_v5 {
#define AFE_PORT_ID_PRIMARY_MI2S_RX 0x1000
#define AFE_PORT_ID_PRIMARY_MI2S_TX 0x1001
#define AFE_PORT_ID_SECONDARY_MI2S_RX 0x1002
+#define AFE_PORT_ID_SECONDARY_MI2S_RX_1 0x1040
+#define AFE_PORT_ID_SECONDARY_MI2S_RX_2 0x1042
+#define AFE_PORT_ID_SECONDARY_MI2S_RX_3 0x1044
+#define AFE_PORT_ID_SECONDARY_MI2S_RX_4 0x1046
#define AFE_PORT_ID_SECONDARY_MI2S_TX 0x1003
+#define AFE_PORT_ID_SECONDARY_MI2S_TX_1 0x1041
+#define AFE_PORT_ID_SECONDARY_MI2S_TX_2 0x1043
+#define AFE_PORT_ID_SECONDARY_MI2S_TX_3 0x1045
+#define AFE_PORT_ID_SECONDARY_MI2S_TX_4 0x1047
#define AFE_PORT_ID_TERTIARY_MI2S_RX 0x1004
+#define AFE_PORT_ID_TERTIARY_MI2S_RX_1 0x1048
+#define AFE_PORT_ID_TERTIARY_MI2S_RX_2 0x104A
+#define AFE_PORT_ID_TERTIARY_MI2S_RX_3 0x104C
+#define AFE_PORT_ID_TERTIARY_MI2S_RX_4 0x104E
#define AFE_PORT_ID_TERTIARY_MI2S_TX 0x1005
+#define AFE_PORT_ID_TERTIARY_MI2S_TX_1 0x1049
+#define AFE_PORT_ID_TERTIARY_MI2S_TX_2 0x104B
+#define AFE_PORT_ID_TERTIARY_MI2S_TX_3 0x104D
+#define AFE_PORT_ID_TERTIARY_MI2S_TX_4 0x104F
#define AFE_PORT_ID_QUATERNARY_MI2S_RX 0x1006
+#define AFE_PORT_ID_QUATERNARY_MI2S_RX_1 0x1020
+#define AFE_PORT_ID_QUATERNARY_MI2S_RX_2 0x1022
+#define AFE_PORT_ID_QUATERNARY_MI2S_RX_3 0x1024
+#define AFE_PORT_ID_QUATERNARY_MI2S_RX_4 0x1026
#define AFE_PORT_ID_QUATERNARY_MI2S_TX 0x1007
+#define AFE_PORT_ID_QUATERNARY_MI2S_TX_1 0x1021
+#define AFE_PORT_ID_QUATERNARY_MI2S_TX_2 0x1023
+#define AFE_PORT_ID_QUATERNARY_MI2S_TX_3 0x1025
+#define AFE_PORT_ID_QUATERNARY_MI2S_TX_4 0x1027
#define AUDIO_PORT_ID_I2S_RX 0x1008
#define AFE_PORT_ID_DIGITAL_MIC_TX 0x1009
#define AFE_PORT_ID_PRIMARY_PCM_RX 0x100A
@@ -10886,6 +10910,7 @@ struct afe_port_cmd_set_aanc_acdb_table {
#define AFE_PARAM_ID_GROUP_DEVICE_CFG 0x00010255
#define AFE_PARAM_ID_GROUP_DEVICE_ENABLE 0x00010256
#define AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX 0x1102
+#define AFE_PARAM_ID_GROUP_DEVICE_I2S_CONFIG 0x00010286
/* Payload of the #AFE_PARAM_ID_GROUP_DEVICE_CFG
* parameter, which configures max of 8 AFE ports
@@ -11069,6 +11094,119 @@ struct afe_param_id_group_device_tdm_cfg {
@values 1 to 2^32 -1 */
} __packed;
+#define AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_TX \
+ (AFE_PORT_ID_SECONDARY_MI2S_TX + 0x100)
+#define AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_RX \
+ (AFE_PORT_ID_TERTIARY_MI2S_RX + 0x100)
+#define AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX \
+ (AFE_PORT_ID_TERTIARY_MI2S_TX + 0x100)
+#define AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX \
+ (AFE_PORT_ID_QUATERNARY_MI2S_RX + 0x100)
+#define AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_TX \
+ (AFE_PORT_ID_QUATERNARY_MI2S_TX + 0x100)
+
+#define AFE_API_VERSION_GROUP_DEVICE_I2S_CONFIG 0x1
+
+/* Payload of the AFE_PARAM_ID_GROUP_DEVICE_I2S_CONFIG parameter ID
+* used by AFE_MODULE_GROUP_DEVICE.
+*/
+struct afe_param_id_group_device_i2s_cfg_v1 {
+ u32 minor_version;
+ /**< Minor version used to track group device configuration.
+ * @values #AFE_API_VERSION_GROUP_DEVICE_I2S_CONFIG
+ */
+
+ u16 group_id;
+ /**< ID for the group device.
+ * @values
+ * - #AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX
+ * - #AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_TX
+ * - #AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_RX
+ * - #AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX
+ * - #AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX
+ * - #AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX
+ */
+
+ u16 channel_mode;
+ /**< Group line channel mode
+ * @values
+ * - #AFE_PORT_I2S_SD0
+ * - #AFE_PORT_I2S_SD1
+ * - #AFE_PORT_I2S_SD2
+ * - #AFE_PORT_I2S_SD3
+ * - #AFE_PORT_I2S_QUAD01
+ * - #AFE_PORT_I2S_QUAD23
+ * - #AFE_PORT_I2S_6CHS
+ * - #AFE_PORT_I2S_8CHS
+ */
+
+ u32 sample_rate;
+ /**< Sampling rate of the port.
+ * @values
+ * - #AFE_PORT_SAMPLE_RATE_8K
+ * - #AFE_PORT_SAMPLE_RATE_16K
+ * - #AFE_PORT_SAMPLE_RATE_24K
+ * - #AFE_PORT_SAMPLE_RATE_32K
+ */
+
+ u16 port_id[AFE_GROUP_DEVICE_NUM_PORTS];
+ /**< Array of member port IDs of this group.
+ * @values
+ * - #AFE_PORT_ID_SECONDARY_MI2S_RX_1
+ * - #AFE_PORT_ID_SECONDARY_MI2S_RX_2
+ * - #AFE_PORT_ID_SECONDARY_MI2S_RX_3
+ * - #AFE_PORT_ID_SECONDARY_MI2S_RX_4
+
+ * - #AFE_PORT_ID_SECONDARY_MI2S_TX_1
+ * - #AFE_PORT_ID_SECONDARY_MI2S_TX_2
+ * - #AFE_PORT_ID_SECONDARY_MI2S_TX_3
+ * - #AFE_PORT_ID_SECONDARY_MI2S_TX_4
+
+ * - #AFE_PORT_ID_TERTIARY_MI2S_RX_1
+ * - #AFE_PORT_ID_TERTIARY_MI2S_RX_2
+ * - #AFE_PORT_ID_TERTIARY_MI2S_RX_3
+ * - #AFE_PORT_ID_TERTIARY_MI2S_RX_4
+
+ * - #AFE_PORT_ID_TERTIARY_MI2S_TX_1
+ * - #AFE_PORT_ID_TERTIARY_MI2S_TX_2
+ * - #AFE_PORT_ID_TERTIARY_MI2S_TX_3
+ * - #AFE_PORT_ID_TERTIARY_MI2S_TX_4
+
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_RX_1
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_RX_2
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_RX_3
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_RX_4
+
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_TX_1
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_TX_2
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_TX_3
+ * - #AFE_PORT_ID_QUATERNARY_MI2S_TX_4
+ * @tablebulletend
+ */
+
+ u16 bit_width;
+ /**< Bit width of the sample.
+ * @values 16, 24, (32)
+ */
+
+ u16 reserved;
+} __packed;
+
+struct afe_param_id_group_device_enable {
+ u16 group_id;
+ u16 enable;
+} __packed;
+
+union afe_port_group_mi2s_config {
+ struct afe_param_id_group_device_i2s_cfg_v1 i2s_cfg;
+ struct afe_param_id_group_device_enable group_enable;
+} __packed;
+
+struct afe_i2s_port_config {
+ struct afe_param_id_i2s_cfg i2s_cfg;
+ struct afe_param_id_slot_mapping_cfg slot_mapping;
+} __packed;
+
/* Payload of the #AFE_PARAM_ID_GROUP_DEVICE_ENABLE
* parameter, which enables or
* disables any module.
diff --git a/include/sound/q6afe-v2.h b/include/sound/q6afe-v2.h
index cdbf97023f66..a6d697d6a8f8 100644
--- a/include/sound/q6afe-v2.h
+++ b/include/sound/q6afe-v2.h
@@ -208,6 +208,33 @@ enum {
IDX_AFE_PORT_ID_INT5_MI2S_TX,
IDX_AFE_PORT_ID_INT6_MI2S_RX,
IDX_AFE_PORT_ID_INT6_MI2S_TX,
+ /* IDX 143 -> 150 */
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_1,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_2,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_3,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_4,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_1,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_2,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_3,
+ IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_4,
+ /* IDX 151 -> 158 */
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_1,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_2,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_3,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_4,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_1,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_2,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_3,
+ IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_4,
+ /* IDX 159 -> 166 */
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_1,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_2,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_3,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_4,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_1,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_2,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_3,
+ IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_4,
AFE_MAX_PORTS
};
@@ -292,6 +319,44 @@ enum {
IDX_GROUP_TDM_MAX,
};
+enum {
+ IDX_SECONDARY_MI2S_RX_1,
+ IDX_SECONDARY_MI2S_RX_2,
+ IDX_SECONDARY_MI2S_RX_3,
+ IDX_SECONDARY_MI2S_RX_4,
+ IDX_SECONDARY_MI2S_TX_1,
+ IDX_SECONDARY_MI2S_TX_2,
+ IDX_SECONDARY_MI2S_TX_3,
+ IDX_SECONDARY_MI2S_TX_4,
+ IDX_TERTIARY_MI2S_RX_1,
+ IDX_TERTIARY_MI2S_RX_2,
+ IDX_TERTIARY_MI2S_RX_3,
+ IDX_TERTIARY_MI2S_RX_4,
+ IDX_TERTIARY_MI2S_TX_1,
+ IDX_TERTIARY_MI2S_TX_2,
+ IDX_TERTIARY_MI2S_TX_3,
+ IDX_TERTIARY_MI2S_TX_4,
+ IDX_QUATERNARY_MI2S_RX_1,
+ IDX_QUATERNARY_MI2S_RX_2,
+ IDX_QUATERNARY_MI2S_RX_3,
+ IDX_QUATERNARY_MI2S_RX_4,
+ IDX_QUATERNARY_MI2S_TX_1,
+ IDX_QUATERNARY_MI2S_TX_2,
+ IDX_QUATERNARY_MI2S_TX_3,
+ IDX_QUATERNARY_MI2S_TX_4,
+ IDX_GROUP_MI2S_PORT_MAX,
+};
+
+enum {
+ IDX_GROUP_SECONDARY_MI2S_RX,
+ IDX_GROUP_SECONDARY_MI2S_TX,
+ IDX_GROUP_TERTIARY_MI2S_RX,
+ IDX_GROUP_TERTIARY_MI2S_TX,
+ IDX_GROUP_QUATERNARY_MI2S_RX,
+ IDX_GROUP_QUATERNARY_MI2S_TX,
+ IDX_GROUP_MI2S_MAX,
+};
+
enum afe_mad_type {
MAD_HW_NONE = 0x00,
MAD_HW_AUDIO = 0x01,
@@ -458,4 +523,9 @@ int afe_request_dma_resources(uint8_t dma_type, uint8_t num_read_dma_channels,
int afe_get_dma_idx(bool **ret_rddma_idx,
bool **ret_wrdma_idx);
int afe_release_all_dma_resources(void);
+int afe_i2s_port_start(u16 port_id, struct afe_i2s_port_config *i2s_port,
+ u32 rate, u16 num_groups);
+int afe_port_group_mi2s_enable(u16 group_id,
+ union afe_port_group_mi2s_config *afe_group_config,
+ u16 enable);
#endif /* __Q6AFE_V2_H__ */
diff --git a/sound/soc/msm/apq8096-auto.c b/sound/soc/msm/apq8096-auto.c
index e5d99f5fd7d1..69a1fbfa45aa 100644
--- a/sound/soc/msm/apq8096-auto.c
+++ b/sound/soc/msm/apq8096-auto.c
@@ -160,6 +160,42 @@ static int msm_tert_tdm_slot_num = 8;
static int msm_quat_tdm_slot_width = 32;
static int msm_quat_tdm_slot_num = 8;
+/* Group_MI2S default port channels */
+static int msm_sec_group_mi2s_rx_1_ch = 2;
+static int msm_sec_group_mi2s_rx_2_ch = 2;
+static int msm_sec_group_mi2s_rx_3_ch = 2;
+static int msm_sec_group_mi2s_rx_4_ch = 2;
+static int msm_sec_group_mi2s_tx_1_ch = 2;
+static int msm_sec_group_mi2s_tx_2_ch = 2;
+static int msm_sec_group_mi2s_tx_3_ch = 2;
+static int msm_sec_group_mi2s_tx_4_ch = 2;
+static int msm_tert_group_mi2s_rx_1_ch = 2;
+static int msm_tert_group_mi2s_rx_2_ch = 2;
+static int msm_tert_group_mi2s_rx_3_ch = 2;
+static int msm_tert_group_mi2s_rx_4_ch = 2;
+static int msm_tert_group_mi2s_tx_1_ch = 2;
+static int msm_tert_group_mi2s_tx_2_ch = 2;
+static int msm_tert_group_mi2s_tx_3_ch = 2;
+static int msm_tert_group_mi2s_tx_4_ch = 2;
+static int msm_quat_group_mi2s_rx_1_ch = 2;
+static int msm_quat_group_mi2s_rx_2_ch = 2;
+static int msm_quat_group_mi2s_rx_3_ch = 2;
+static int msm_quat_group_mi2s_rx_4_ch = 2;
+static int msm_quat_group_mi2s_tx_1_ch = 2;
+static int msm_quat_group_mi2s_tx_2_ch = 2;
+static int msm_quat_group_mi2s_tx_3_ch = 2;
+static int msm_quat_group_mi2s_tx_4_ch = 2;
+
+/* Group MI2S default sample rate*/
+static int msm_sec_group_mi2s_rate = SAMPLING_RATE_48KHZ;
+static int msm_tert_group_mi2s_rate = SAMPLING_RATE_48KHZ;
+static int msm_quat_group_mi2s_rate = SAMPLING_RATE_48KHZ;
+
+/* Group MI2S slot width bit format */
+static int msm_sec_group_mi2s_bit_format = SNDRV_PCM_FORMAT_S24_LE;
+static int msm_tert_group_mi2s_bit_format = SNDRV_PCM_FORMAT_S24_LE;
+static int msm_quat_group_mi2s_bit_format = SNDRV_PCM_FORMAT_S24_LE;
+
/* EC Reference default values are set in mixer_paths.xml */
static int msm_ec_ref_ch = 4;
static int msm_ec_ref_bit_format = SNDRV_PCM_FORMAT_S16_LE;
@@ -172,6 +208,41 @@ static void *adsp_state_notifier;
static bool dummy_device_registered;
static struct snd_soc_card *sndcard;
+#define GROUP_MI2S_SLOT_OFFSET_MAX 8
+static unsigned int group_mi2s_slot_offset
+ [IDX_GROUP_MI2S_PORT_MAX][GROUP_MI2S_SLOT_OFFSET_MAX] = {
+ /* GROUP_SEC_MI2S_RX */
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0xFFFF},
+ {0xFFFF},
+ /* GROUP_SEC_MI2S_TX */
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0xFFFF},
+ {0xFFFF},
+ /* GROUP_TERT_MI2S_RX */
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0xFFFF},
+ {0xFFFF},
+ /* GROUP_TERT_MI2S_TX */
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0xFFFF},
+ {0xFFFF},
+ /* GROUP_QUAT_MI2S_RX */
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ /* GROUP_QUAT_MI2S_TX */
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+ {0, 4, 0xFFFF},
+};
+
enum {
QUATERNARY_TDM_RX_0,
QUATERNARY_TDM_RX_1,
@@ -3307,6 +3378,173 @@ static int msm_mi2s_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
return 0;
}
+static int msm_group_mi2s_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ struct snd_interval *rate =
+ hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
+ struct snd_interval *channels =
+ hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
+
+ switch (cpu_dai->id) {
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ channels->min = channels->max = msm_sec_group_mi2s_rx_1_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ channels->min = channels->max = msm_sec_group_mi2s_rx_2_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ channels->min = channels->max = msm_sec_group_mi2s_rx_3_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ channels->min = channels->max = msm_sec_group_mi2s_rx_4_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ channels->min = channels->max = msm_sec_group_mi2s_tx_1_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ channels->min = channels->max = msm_sec_group_mi2s_tx_2_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ channels->min = channels->max = msm_sec_group_mi2s_tx_3_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ channels->min = channels->max = msm_sec_group_mi2s_tx_4_ch;
+ rate->min = rate->max = msm_sec_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_sec_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ channels->min = channels->max = msm_tert_group_mi2s_rx_1_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ channels->min = channels->max = msm_tert_group_mi2s_rx_2_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ channels->min = channels->max = msm_tert_group_mi2s_rx_3_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ channels->min = channels->max = msm_tert_group_mi2s_rx_4_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ channels->min = channels->max = msm_tert_group_mi2s_tx_1_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ channels->min = channels->max = msm_tert_group_mi2s_tx_2_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ channels->min = channels->max = msm_tert_group_mi2s_tx_3_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ channels->min = channels->max = msm_tert_group_mi2s_tx_4_ch;
+ rate->min = rate->max = msm_tert_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_tert_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ channels->min = channels->max = msm_quat_group_mi2s_rx_1_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ channels->min = channels->max = msm_quat_group_mi2s_rx_2_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ channels->min = channels->max = msm_quat_group_mi2s_rx_3_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ channels->min = channels->max = msm_quat_group_mi2s_rx_4_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ channels->min = channels->max = msm_quat_group_mi2s_tx_1_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ channels->min = channels->max = msm_quat_group_mi2s_tx_2_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ channels->min = channels->max = msm_quat_group_mi2s_tx_3_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ channels->min = channels->max = msm_quat_group_mi2s_tx_4_ch;
+ rate->min = rate->max = msm_quat_group_mi2s_rate;
+ param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
+ msm_quat_group_mi2s_bit_format);
+ break;
+ default:
+ pr_err("%s: dai id 0x%x not supported\n",
+ __func__, cpu_dai->id);
+ return -EINVAL;
+ }
+
+ pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n",
+ __func__, cpu_dai->id, channels->max, rate->max,
+ params_format(params));
+
+ return 0;
+}
+
static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params)
{
@@ -4085,6 +4323,142 @@ static struct snd_soc_ops apq8096_tdm_be_ops = {
.hw_params = apq8096_tdm_snd_hw_params,
};
+static int apq8096_group_mi2s_snd_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ int ret = 0;
+ int channels, rate;
+ unsigned int *slot_offset;
+ int offset_channels = 0;
+ int i;
+
+ rate = params_rate(params);
+ channels = params_channels(params);
+
+ switch (cpu_dai->id) {
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_RX_1];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_RX_2];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_RX_3];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_RX_4];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_TX_1];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_TX_2];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_TX_3];
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ slot_offset = group_mi2s_slot_offset[IDX_SECONDARY_MI2S_TX_4];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_RX_1];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_RX_2];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_RX_3];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_RX_4];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_TX_1];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_TX_2];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_TX_3];
+ break;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ slot_offset = group_mi2s_slot_offset[IDX_TERTIARY_MI2S_TX_4];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_RX_1];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_RX_2];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_RX_3];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_RX_4];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_TX_1];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_TX_2];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_TX_3];
+ break;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ slot_offset = group_mi2s_slot_offset[IDX_QUATERNARY_MI2S_TX_4];
+ break;
+ default:
+ pr_err("%s: dai id 0x%x not supported\n",
+ __func__, cpu_dai->id);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < GROUP_MI2S_SLOT_OFFSET_MAX; i++) {
+ if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
+ offset_channels++;
+ }
+
+ if (offset_channels == 0) {
+ pr_err("%s: slot offset not supported, offset_channels %d\n",
+ __func__, offset_channels);
+ return -EINVAL;
+ }
+
+ if (channels > offset_channels) {
+ pr_err("%s: channels %d and offset_channels %d not match\n",
+ __func__, channels, offset_channels);
+ return -EINVAL;
+ }
+
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
+ channels, slot_offset);
+ if (ret < 0) {
+ pr_err("%s: failed to set channel map, err:%d\n",
+ __func__, ret);
+ goto end;
+ }
+ } else {
+ ret = snd_soc_dai_set_channel_map(cpu_dai,
+ channels, slot_offset,
+ 0, NULL);
+ if (ret < 0) {
+ pr_err("%s: failed to set channel map, err:%d\n",
+ __func__, ret);
+ goto end;
+ }
+ }
+end:
+ return ret;
+}
+
+static struct snd_soc_ops apq8096_group_mi2s_be_ops = {
+ .hw_params = apq8096_group_mi2s_snd_hw_params,
+};
+
static const struct soc_enum msm_snd_enum[] = {
SOC_ENUM_SINGLE_EXT(2, auxpcm_rate_text),
SOC_ENUM_SINGLE_EXT(7, hdmi_rx_ch_text),
@@ -6546,6 +6920,342 @@ static struct snd_soc_dai_link apq8096_auto_be_dai_links[] = {
.be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
.ops = &apq8096_tdm_be_ops,
.ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_TX_1,
+ .stream_name = "Secondary MI2S1 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4161",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_TX_2,
+ .stream_name = "Secondary MI2S2 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4163",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_TX_3,
+ .stream_name = "Secondary MI2S3 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4165",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_TX_4,
+ .stream_name = "Secondary MI2S4 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4167",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_TX_1,
+ .stream_name = "Tertiary MI2S1 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4169",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_TX_2,
+ .stream_name = "Tertiary MI2S2 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4171",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_TX_3,
+ .stream_name = "Tertiary MI2S3 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4173",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_TX_4,
+ .stream_name = "Tertiary MI2S4 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4175",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_TX_1,
+ .stream_name = "Quaternary MI2S1 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4129",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_TX_2,
+ .stream_name = "Quaternary MI2S2 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4131",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_TX_3,
+ .stream_name = "Quaternary MI2S3 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4133",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_TX_4,
+ .stream_name = "Quaternary MI2S4 Capture",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4135",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-tx",
+ .no_pcm = 1,
+ .dpcm_capture = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_RX_1,
+ .stream_name = "Secondary MI2S1 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4160",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_RX_2,
+ .stream_name = "Secondary MI2S2 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4162",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_RX_3,
+ .stream_name = "Secondary MI2S3 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4164",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_SEC_MI2S_RX_4,
+ .stream_name = "Secondary MI2S4 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4166",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_RX_1,
+ .stream_name = "Tertiary MI2S1 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4168",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_RX_2,
+ .stream_name = "Tertiary MI2S2 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4170",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_RX_3,
+ .stream_name = "Tertiary MI2S3 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4172",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_TERT_MI2S_RX_4,
+ .stream_name = "Tertiary MI2S4 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4174",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_RX_1,
+ .stream_name = "Quaternary MI2S1 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4128",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_RX_2,
+ .stream_name = "Quaternary MI2S2 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4130",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_RX_3,
+ .stream_name = "Quaternary MI2S3 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4132",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
+ },
+ {
+ .name = LPASS_BE_QUAT_MI2S_RX_4,
+ .stream_name = "Quaternary MI2S4 Playback",
+ .cpu_dai_name = "msm-dai-q6-mi2s.4134",
+ .platform_name = "msm-pcm-routing",
+ .codec_name = "msm-stub-codec.1",
+ .codec_dai_name = "msm-stub-rx",
+ .no_pcm = 1,
+ .dpcm_playback = 1,
+ .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ .be_hw_params_fixup = msm_group_mi2s_be_hw_params_fixup,
+ .ops = &apq8096_group_mi2s_be_ops,
+ .ignore_suspend = 1,
}
};
diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
index b09f6a1378f0..0c23e1eef483 100644
--- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c
@@ -124,6 +124,47 @@ struct msm_dai_q6_mi2s_dai_data {
struct msm_dai_q6_mi2s_dai_config rx_dai;
};
+static DEFINE_MUTEX(group_mi2s_mutex);
+static atomic_t group_mi2s_ref[IDX_GROUP_MI2S_MAX];
+
+/* cache of mi2s group cfg per parent node */
+static struct afe_param_id_group_device_i2s_cfg_v1 group_mi2s_cfg = {
+ AFE_API_VERSION_GROUP_DEVICE_I2S_CONFIG,
+ AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX,
+ AFE_PORT_I2S_QUAD01,
+ 48000,
+ {
+ AFE_PORT_ID_INVALID,
+ AFE_PORT_ID_TERTIARY_MI2S_TX_1,
+ AFE_PORT_ID_TERTIARY_MI2S_TX_2,
+ AFE_PORT_ID_INVALID,
+ AFE_PORT_ID_INVALID,
+ AFE_PORT_ID_INVALID,
+ AFE_PORT_ID_INVALID,
+ AFE_PORT_ID_INVALID
+ },
+ 32,
+ 0,
+};
+
+static struct afe_clk_set group_mi2s_bclk_set = {
+ AFE_API_VERSION_CLOCK_SET,
+ Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT,
+ Q6AFE_LPASS_IBIT_CLK_3_P072_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
+};
+
+static struct afe_clk_set group_mi2s_mclk_set = {
+ AFE_API_VERSION_CLOCK_SET,
+ Q6AFE_LPASS_CLK_ID_MCLK_2,
+ Q6AFE_LPASS_OSR_CLK_3_P072_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
+};
+
struct msm_dai_q6_auxpcm_dai_data {
/* BITMAP to track Rx and Tx port usage count */
DECLARE_BITMAP(auxpcm_port_status, STATUS_MAX);
@@ -147,6 +188,19 @@ struct msm_dai_q6_tdm_dai_data {
struct afe_tdm_port_config port_cfg; /* hold tdm config */
};
+struct msm_dai_q6_group_mi2s_dai_data {
+ DECLARE_BITMAP(status_mask, STATUS_MAX);
+ u32 rate;
+ u32 channels;
+ u32 bit_width;
+ u32 num_group_ports;
+ u32 sync_mode;
+ struct afe_clk_set bclk_set;
+ struct afe_clk_set mclk_set;
+ union afe_port_group_mi2s_config group_cfg;
+ struct afe_i2s_port_config port_cfg;
+};
+
/* MI2S format field for AFE_PORT_CMD_I2S_CONFIG command
* 0: linear PCM
* 1: non-linear PCM
@@ -455,6 +509,104 @@ int msm_dai_q6_get_port_idx(u16 id)
}
}
+static int msm_dai_q6_get_mi2s_group_idx(u16 id)
+{
+ switch (id) {
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ return IDX_GROUP_SECONDARY_MI2S_RX;
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_TX:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ return IDX_GROUP_SECONDARY_MI2S_TX;
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_RX:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ return IDX_GROUP_TERTIARY_MI2S_RX;
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ return IDX_GROUP_TERTIARY_MI2S_TX;
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ return IDX_GROUP_QUATERNARY_MI2S_RX;
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_TX:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ return IDX_GROUP_QUATERNARY_MI2S_TX;
+ default: return -EINVAL;
+ }
+}
+
+static int msm_dai_q6_get_mi2s_port_idx(u16 id)
+{
+ switch (id) {
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ return IDX_SECONDARY_MI2S_RX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ return IDX_SECONDARY_MI2S_RX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ return IDX_SECONDARY_MI2S_RX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ return IDX_SECONDARY_MI2S_RX_4;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ return IDX_SECONDARY_MI2S_TX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ return IDX_SECONDARY_MI2S_TX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ return IDX_SECONDARY_MI2S_TX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ return IDX_SECONDARY_MI2S_TX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ return IDX_TERTIARY_MI2S_RX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ return IDX_TERTIARY_MI2S_RX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ return IDX_TERTIARY_MI2S_RX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ return IDX_TERTIARY_MI2S_RX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ return IDX_TERTIARY_MI2S_TX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ return IDX_TERTIARY_MI2S_TX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ return IDX_TERTIARY_MI2S_TX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ return IDX_TERTIARY_MI2S_TX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ return IDX_QUATERNARY_MI2S_RX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ return IDX_QUATERNARY_MI2S_RX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ return IDX_QUATERNARY_MI2S_RX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ return IDX_QUATERNARY_MI2S_RX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ return IDX_QUATERNARY_MI2S_TX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ return IDX_QUATERNARY_MI2S_TX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ return IDX_QUATERNARY_MI2S_TX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ return IDX_QUATERNARY_MI2S_TX_4;
+ default: return -EINVAL;
+ }
+}
+
static u16 msm_dai_q6_max_num_slot(int frame_rate)
{
/* Max num of slots is bits per frame divided
@@ -531,7 +683,7 @@ static int msm_dai_q6_auxpcm_hw_params(
int rc = 0, slot_mapping_copy_len = 0;
if (params_channels(params) != 1 || (params_rate(params) != 8000 &&
- params_rate(params) != 16000)) {
+ params_rate(params) != 16000)) {
dev_err(dai->dev, "%s: invalid param chan %d rate %d\n",
__func__, params_channels(params), params_rate(params));
return -EINVAL;
@@ -540,7 +692,7 @@ static int msm_dai_q6_auxpcm_hw_params(
mutex_lock(&aux_dai_data->rlock);
if (test_bit(STATUS_TX_PORT, aux_dai_data->auxpcm_port_status) ||
- test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) {
+ test_bit(STATUS_RX_PORT, aux_dai_data->auxpcm_port_status)) {
/* AUXPCM DAI in use */
if (dai_data->rate != params_rate(params)) {
dev_err(dai->dev, "%s: rate mismatch of running DAI\n",
@@ -569,7 +721,7 @@ static int msm_dai_q6_auxpcm_hw_params(
dai_data->port_config.pcm.num_channels = dai_data->channels;
dai_data->port_config.pcm.bit_width = 16;
if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <=
- auxpcm_pdata->mode_8k.num_slots)
+ auxpcm_pdata->mode_8k.num_slots)
slot_mapping_copy_len =
ARRAY_SIZE(
dai_data->port_config.pcm.slot_number_mapping)
@@ -580,8 +732,8 @@ static int msm_dai_q6_auxpcm_hw_params(
if (auxpcm_pdata->mode_8k.slot_mapping) {
memcpy(dai_data->port_config.pcm.slot_number_mapping,
- auxpcm_pdata->mode_8k.slot_mapping,
- slot_mapping_copy_len);
+ auxpcm_pdata->mode_8k.slot_mapping,
+ slot_mapping_copy_len);
} else {
dev_err(dai->dev, "%s 8khz slot mapping is NULL\n",
__func__);
@@ -605,7 +757,7 @@ static int msm_dai_q6_auxpcm_hw_params(
dai_data->port_config.pcm.num_channels = dai_data->channels;
dai_data->port_config.pcm.bit_width = 16;
if (ARRAY_SIZE(dai_data->port_config.pcm.slot_number_mapping) <=
- auxpcm_pdata->mode_16k.num_slots)
+ auxpcm_pdata->mode_16k.num_slots)
slot_mapping_copy_len =
ARRAY_SIZE(
dai_data->port_config.pcm.slot_number_mapping)
@@ -616,8 +768,8 @@ static int msm_dai_q6_auxpcm_hw_params(
if (auxpcm_pdata->mode_16k.slot_mapping) {
memcpy(dai_data->port_config.pcm.slot_number_mapping,
- auxpcm_pdata->mode_16k.slot_mapping,
- slot_mapping_copy_len);
+ auxpcm_pdata->mode_16k.slot_mapping,
+ slot_mapping_copy_len);
} else {
dev_err(dai->dev, "%s 16khz slot mapping is NULL\n",
__func__);
@@ -4322,6 +4474,908 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = {
},
};
+static int msm_dai_q6_group_mi2s_set_clk_param(u32 group_id,
+ struct afe_clk_set *mclk_set,
+ struct afe_clk_set *bclk_set,
+ u32 sync_mode)
+{
+ switch (group_id) {
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX:
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_TX:
+ if (sync_mode)
+ bclk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT;
+ else
+ bclk_set->clk_id = Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT;
+ mclk_set->clk_id = Q6AFE_LPASS_CLK_ID_MCLK_1;
+ break;
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_RX:
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX:
+ if (sync_mode)
+ bclk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT;
+ else
+ bclk_set->clk_id = Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT;
+ mclk_set->clk_id = Q6AFE_LPASS_CLK_ID_MCLK_2;
+ break;
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX:
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_TX:
+ if (sync_mode)
+ bclk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT;
+ else
+ bclk_set->clk_id = Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT;
+ mclk_set->clk_id = Q6AFE_LPASS_CLK_ID_MCLK_3;
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int msm_dai_q6_group_mi2s_set_clk(
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data,
+ u16 port_id, bool enable)
+{
+ int rc = 0;
+
+ dai_data->bclk_set.enable = enable;
+ rc = afe_set_lpass_clock_v2(port_id,
+ &dai_data->bclk_set);
+ if (rc < 0)
+ pr_err("%s: afe lpass bclk failed, err: %d\n",
+ __func__, rc);
+
+ /*non zero mclk freq value means to enable mclk for mi2s intf*/
+ if (dai_data->mclk_set.clk_freq_in_hz != 0) {
+ dai_data->mclk_set.enable = enable;
+ rc = afe_set_lpass_clock_v2(port_id,
+ &dai_data->mclk_set);
+ if (rc < 0)
+ pr_err("%s: afe lpass mclk failed, err: %d\n",
+ __func__, rc);
+ }
+ return rc;
+}
+
+static int msm_dai_q6_dai_group_mi2s_probe(struct snd_soc_dai *dai)
+{
+ int rc = 0;
+
+ msm_dai_q6_set_dai_id(dai);
+ rc = msm_dai_q6_dai_add_route(dai);
+ return rc;
+}
+
+static int msm_dai_q6_dai_group_mi2s_remove(struct snd_soc_dai *dai)
+{
+ int rc = 0;
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data =
+ dev_get_drvdata(dai->dev);
+ u16 group_id = dai_data->group_cfg.i2s_cfg.group_id;
+ int group_idx = 0;
+ atomic_t *group_ref = NULL;
+
+ dev_dbg(dai->dev, "%s rc %d", __func__, rc);
+
+ group_idx = msm_dai_q6_get_mi2s_group_idx(dai->id);
+ if (group_idx < 0 || group_idx > IDX_GROUP_MI2S_MAX) {
+ dev_err(dai->dev, "%s: port id 0x%x not supported\n",
+ __func__, dai->id);
+ return -EINVAL;
+ }
+
+ group_ref = &group_mi2s_ref[group_idx];
+
+ /* if AFE port is still up, close it */
+ if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) {
+ rc = afe_close(dai->id); /* can block */
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to close Group MI2S port 0x%x\n",
+ __func__, dai->id);
+ }
+ atomic_dec(group_ref);
+ clear_bit(STATUS_PORT_STARTED, dai_data->status_mask);
+
+ if (atomic_read(group_ref) == 0) {
+ rc = afe_port_group_mi2s_enable(group_id, NULL, false);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to disable Group MI2S group 0x%x\n",
+ __func__, group_id);
+ }
+ rc = msm_dai_q6_group_mi2s_set_clk(dai_data,
+ dai->id, false);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n",
+ __func__, dai->id);
+ }
+ }
+ }
+ return 0;
+}
+
+static int msm_dai_q6_group_mi2s_set_channel_map(struct snd_soc_dai *dai,
+ unsigned int tx_num, unsigned int *tx_slot,
+ unsigned int rx_num, unsigned int *rx_slot)
+{
+ int rc = 0;
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data =
+ dev_get_drvdata(dai->dev);
+ int i = 0;
+
+ switch (dai->id) {
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ if (!rx_slot) {
+ dev_err(dai->dev, "%s: rx slot not found\n",
+ __func__);
+ return -EINVAL;
+ }
+ for (i = 0; i < rx_num; i++)
+ dai_data->port_cfg.slot_mapping.offset[i] = rx_slot[i];
+ for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++)
+ dai_data->port_cfg.slot_mapping.offset[i] =
+ AFE_SLOT_MAPPING_OFFSET_INVALID;
+ dai_data->port_cfg.slot_mapping.num_channel = rx_num;
+ break;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ if (!tx_slot) {
+ dev_err(dai->dev, "%s: tx slot not found\n",
+ __func__);
+ return -EINVAL;
+ }
+ for (i = 0; i < tx_num; i++)
+ dai_data->port_cfg.slot_mapping.offset[i] = tx_slot[i];
+ for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT; i++)
+ dai_data->port_cfg.slot_mapping.offset[i] =
+ AFE_SLOT_MAPPING_OFFSET_INVALID;
+
+ dai_data->port_cfg.slot_mapping.num_channel = tx_num;
+ break;
+ default:
+ dev_err(dai->dev, "%s: invalid dai id 0x%x\n",
+ __func__, dai->id);
+ return -EINVAL;
+ }
+
+ return rc;
+}
+
+static int msm_dai_q6_group_mi2s_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params,
+ struct snd_soc_dai *dai)
+{
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data =
+ dev_get_drvdata(dai->dev);
+ struct afe_param_id_group_device_i2s_cfg_v1 *group_mi2s_cfg =
+ &dai_data->group_cfg.i2s_cfg;
+ struct afe_param_id_i2s_cfg *dev_i2s_cfg =
+ &dai_data->port_cfg.i2s_cfg;
+ struct afe_param_id_slot_mapping_cfg *slot_mapping =
+ &dai_data->port_cfg.slot_mapping;
+
+ /* update group_mi2s group config param */
+ dai_data->channels = params_channels(params);
+ dai_data->rate = params_rate(params);
+
+ switch (params_format(params)) {
+ case SNDRV_PCM_FORMAT_S16_LE:
+ case SNDRV_PCM_FORMAT_SPECIAL:
+ dai_data->bit_width = 16;
+ break;
+ case SNDRV_PCM_FORMAT_S24_LE:
+ case SNDRV_PCM_FORMAT_S24_3LE:
+ dai_data->bit_width = 24;
+ break;
+ default:
+ pr_err("%s: format %d\n",
+ __func__, params_format(params));
+ return -EINVAL;
+ }
+
+ /* update group_mi2s config param */
+ group_mi2s_cfg->sample_rate = dai_data->rate;
+ group_mi2s_cfg->bit_width = dai_data->bit_width;
+ pr_debug("%s: Group MI2S GROUP 0x%x:\n"
+ "channel_mode = %d sample_rate = %d bit_width = %d\n",
+ __func__, group_mi2s_cfg->group_id,
+ group_mi2s_cfg->channel_mode,
+ group_mi2s_cfg->sample_rate,
+ group_mi2s_cfg->bit_width);
+ pr_debug("%s: Group MI2S GROUP 0x%x:\n"
+ "port_id[0]=0x%x port_id[1]=0x%x port_id[2]=0x%x port_id[3]=0x%x\n"
+ "port_id[4]=0x%x port_id[5]=0x%x port_id[6]=0x%x port_id[7]=0x%x\n",
+ __func__, group_mi2s_cfg->group_id,
+ group_mi2s_cfg->port_id[0],
+ group_mi2s_cfg->port_id[1],
+ group_mi2s_cfg->port_id[2],
+ group_mi2s_cfg->port_id[3],
+ group_mi2s_cfg->port_id[4],
+ group_mi2s_cfg->port_id[5],
+ group_mi2s_cfg->port_id[6],
+ group_mi2s_cfg->port_id[7]);
+ /*i2s port cfg*/
+ dev_i2s_cfg->i2s_cfg_minor_version =
+ AFE_API_VERSION_I2S_CONFIG;
+ dev_i2s_cfg->bit_width = group_mi2s_cfg->bit_width;
+ dev_i2s_cfg->mono_stereo = AFE_PORT_I2S_STEREO;
+ dev_i2s_cfg->sample_rate = group_mi2s_cfg->sample_rate;
+ dev_i2s_cfg->data_format = AFE_LINEAR_PCM_DATA;
+ dev_i2s_cfg->ws_src = dai_data->sync_mode;
+ pr_debug("%s: MI2S port:\n"
+ "dai id %d dai_data->channels = %d\n"
+ "sample_rate = %u i2s_cfg_minor_version = 0x%x\n"
+ "bit_width = %hu channel_mode = 0x%x mono_stereo = %#x\n"
+ "ws_src = 0x%x sample_rate = %u data_format = 0x%x\n"
+ "reserved = %u\n", __func__, dai->id, dai_data->channels,
+ dai_data->rate, dev_i2s_cfg->i2s_cfg_minor_version,
+ dev_i2s_cfg->bit_width, dev_i2s_cfg->channel_mode,
+ dev_i2s_cfg->mono_stereo, dev_i2s_cfg->ws_src,
+ dev_i2s_cfg->sample_rate, dev_i2s_cfg->data_format,
+ dev_i2s_cfg->reserved);
+
+ /*slot mapping cfg*/
+ slot_mapping->minor_version =
+ AFE_API_VERSION_SLOT_MAPPING_CONFIG;
+ slot_mapping->bitwidth = group_mi2s_cfg->bit_width;
+ slot_mapping->data_align_type =
+ AFE_SLOT_MAPPING_DATA_ALIGN_MSB;
+ pr_debug("%s: Group MI2S port 0x%x SLOT MAPPING:\n"
+ "num_channel=%d bitwidth=%d data_align=0x%x\n",
+ __func__, dai->id,
+ slot_mapping->num_channel,
+ slot_mapping->bitwidth,
+ slot_mapping->data_align_type);
+ pr_debug("%s: Group MI2S port 0x%x SLOT MAPPING:\n"
+ "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n"
+ "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n",
+ __func__, dai->id,
+ slot_mapping->offset[0],
+ slot_mapping->offset[1],
+ slot_mapping->offset[2],
+ slot_mapping->offset[3],
+ slot_mapping->offset[4],
+ slot_mapping->offset[5],
+ slot_mapping->offset[6],
+ slot_mapping->offset[7]);
+
+ return 0;
+}
+
+static int msm_dai_q6_group_mi2s_prepare(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ int rc = 0;
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data =
+ dev_get_drvdata(dai->dev);
+ u16 group_id = dai_data->group_cfg.i2s_cfg.group_id;
+ int group_idx = 0;
+ atomic_t *group_ref = NULL;
+
+ group_idx = msm_dai_q6_get_mi2s_group_idx(dai->id);
+ if (group_idx < 0 || group_idx > IDX_GROUP_MI2S_MAX) {
+ dev_err(dai->dev, "%s port id 0x%x not supported\n",
+ __func__, dai->id);
+ return -EINVAL;
+ }
+
+ mutex_lock(&group_mi2s_mutex);
+
+ group_ref = &group_mi2s_ref[group_idx];
+
+ if (!test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) {
+ /* PORT START should be set if prepare called
+ * in active state.
+ */
+ if (atomic_read(group_ref) == 0) {
+ /*
+ * TX and RX share the same clk.
+ * AFE clk is enabled per group to simplify the logic.
+ * DSP will monitor the clk count.
+ */
+ rc = msm_dai_q6_group_mi2s_set_clk(dai_data,
+ dai->id, true);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to enable AFE clk 0x%x\n",
+ __func__, dai->id);
+ goto rtn;
+ }
+
+ /*
+ * if only one port, don't do group enable as there
+ * is no group need for only one port
+ */
+ if (dai_data->num_group_ports > 1) {
+ rc = afe_port_group_mi2s_enable(group_id,
+ &dai_data->group_cfg, true);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev,
+ "%s: fail to enable AFE group 0x%x\n",
+ __func__, group_id);
+ goto rtn;
+ }
+ }
+ }
+
+ rc = afe_i2s_port_start(dai->id, &dai_data->port_cfg,
+ dai_data->rate, dai_data->num_group_ports);
+ if (IS_ERR_VALUE(rc)) {
+ if (atomic_read(group_ref) == 0) {
+ afe_port_group_mi2s_enable(group_id,
+ NULL, false);
+ msm_dai_q6_group_mi2s_set_clk(dai_data,
+ dai->id, false);
+ }
+ dev_err(dai->dev, "%s: fail to open AFE port 0x%x\n",
+ __func__, dai->id);
+ } else {
+ set_bit(STATUS_PORT_STARTED,
+ dai_data->status_mask);
+ atomic_inc(group_ref);
+ }
+ }
+
+rtn:
+ mutex_unlock(&group_mi2s_mutex);
+ return rc;
+}
+
+static void msm_dai_q6_group_mi2s_shutdown(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ int rc = 0;
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data =
+ dev_get_drvdata(dai->dev);
+ u16 group_id = dai_data->group_cfg.i2s_cfg.group_id;
+ int group_idx = 0;
+ atomic_t *group_ref = NULL;
+
+ group_idx = msm_dai_q6_get_mi2s_group_idx(dai->id);
+ if (group_idx < 0 || group_idx > IDX_GROUP_MI2S_MAX) {
+ dev_err(dai->dev, "%s port id 0x%x not supported\n",
+ __func__, dai->id);
+ return;
+ }
+
+ mutex_lock(&group_mi2s_mutex);
+ group_ref = &group_mi2s_ref[group_idx];
+
+ if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) {
+ rc = afe_close(dai->id);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to close AFE port 0x%x\n",
+ __func__, dai->id);
+ }
+ atomic_dec(group_ref);
+ clear_bit(STATUS_PORT_STARTED,
+ dai_data->status_mask);
+
+ if (atomic_read(group_ref) == 0) {
+ rc = afe_port_group_mi2s_enable(group_id,
+ NULL, false);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to disable AFE group 0x%x\n",
+ __func__, group_id);
+ }
+ rc = msm_dai_q6_group_mi2s_set_clk(dai_data,
+ dai->id, false);
+ if (IS_ERR_VALUE(rc)) {
+ dev_err(dai->dev, "%s: fail to disable AFE clk 0x%x\n",
+ __func__, dai->id);
+ }
+ }
+ }
+
+ mutex_unlock(&group_mi2s_mutex);
+}
+
+static struct snd_soc_dai_ops msm_dai_q6_group_mi2s_ops = {
+ .prepare = msm_dai_q6_group_mi2s_prepare,
+ .hw_params = msm_dai_q6_group_mi2s_hw_params,
+ .set_channel_map = msm_dai_q6_group_mi2s_set_channel_map,
+ .shutdown = msm_dai_q6_group_mi2s_shutdown,
+};
+
+static struct snd_soc_dai_driver msm_dai_q6_group_mi2s_dai[] = {
+ {
+ .playback = {
+ .stream_name = "Secondary MI2S1 Playback",
+ .aif_name = "SEC_MI2S_RX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_RX_1,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Secondary MI2S2 Playback",
+ .aif_name = "SEC_MI2S_RX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_RX_2,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Secondary MI2S3 Playback",
+ .aif_name = "SEC_MI2S_RX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_RX_3,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Secondary MI2S4 Playback",
+ .aif_name = "SEC_MI2S_RX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_RX_4,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Secondary MI2S1 Capture",
+ .aif_name = "SEC_MI2S_TX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_TX_1,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Secondary MI2S2 Capture",
+ .aif_name = "SEC_MI2S_TX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_TX_2,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Secondary MI2S3 Capture",
+ .aif_name = "SEC_MI2S_TX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_TX_3,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Secondary MI2S4 Capture",
+ .aif_name = "SEC_MI2S_TX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_SECONDARY_MI2S_TX_4,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Tertiary MI2S1 Playback",
+ .aif_name = "TERT_MI2S_RX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_RX_1,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Tertiary MI2S2 Playback",
+ .aif_name = "TERT_MI2S_RX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_RX_2,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Tertiary MI2S3 Playback",
+ .aif_name = "TERT_MI2S_RX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_RX_3,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Tertiary MI2S4 Playback",
+ .aif_name = "TERT_MI2S_RX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_RX_4,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Tertiary MI2S1 Capture",
+ .aif_name = "TERT_MI2S_TX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_TX_1,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Tertiary MI2S2 Capture",
+ .aif_name = "TERT_MI2S_TX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_TX_2,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Tertiary MI2S3 Capture",
+ .aif_name = "TERT_MI2S_TX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_TX_3,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Tertiary MI2S4 Capture",
+ .aif_name = "TERT_MI2S_TX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_TERTIARY_MI2S_TX_4,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Quaternary MI2S1 Playback",
+ .aif_name = "QUAT_MI2S_RX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_RX_1,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Quaternary MI2S2 Playback",
+ .aif_name = "QUAT_MI2S_RX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_RX_2,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Quaternary MI2S3 Playback",
+ .aif_name = "QUAT_MI2S_RX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_RX_3,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .playback = {
+ .stream_name = "Quaternary MI2S4 Playback",
+ .aif_name = "QUAT_MI2S_RX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_RX_4,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Quaternary MI2S1 Capture",
+ .aif_name = "QUAT_MI2S_TX_1",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_TX_1,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Quaternary MI2S2 Capture",
+ .aif_name = "QUAT_MI2S_TX_2",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_TX_2,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Quaternary MI2S3 Capture",
+ .aif_name = "QUAT_MI2S_TX_3",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_TX_3,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ },
+ {
+ .capture = {
+ .stream_name = "Quaternary MI2S4 Capture",
+ .aif_name = "QUAT_MI2S_TX_4",
+ .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |
+ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |
+ SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+ 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_S24_3LE,
+ .rate_min = 8000,
+ .rate_max = 192000,
+ },
+ .ops = &msm_dai_q6_group_mi2s_ops,
+ .id = AFE_PORT_ID_QUATERNARY_MI2S_TX_4,
+ .probe = msm_dai_q6_dai_group_mi2s_probe,
+ .remove = msm_dai_q6_dai_group_mi2s_remove,
+ }
+};
static int msm_dai_q6_mi2s_get_lineconfig(u16 sd_lines, u16 *config_ptr,
unsigned int *ch_cnt)
@@ -4923,6 +5977,297 @@ static struct platform_driver msm_dai_q6_mi2s_driver = {
},
};
+static int msm_dai_group_mi2s_probe(struct platform_device *pdev)
+{
+ int rc = 0;
+
+ /* probe child node info */
+ rc = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: failed to add child nodes, rc=%d\n",
+ __func__, rc);
+ goto rtn;
+ } else
+ dev_dbg(&pdev->dev, "%s: added child node\n", __func__);
+
+rtn:
+ return rc;
+}
+
+static int msm_dai_group_mi2s_remove(struct platform_device *pdev)
+{
+ return 0;
+}
+
+static int msm_dai_q6_group_mi2s_dev_id_validation(u32 dev_id)
+{
+ switch (dev_id) {
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
+static const struct snd_soc_component_driver msm_q6_group_mi2s_dai_component = {
+ .name = "msm-dai-q6-mi2s-group",
+};
+
+static int msm_dai_group_mi2s_dev_probe(struct platform_device *pdev)
+{
+ int rc = 0;
+ struct msm_dai_q6_group_mi2s_dai_data *dai_data = NULL;
+ u32 mi2s_dev_id = 0;
+ u32 ch_mode = 0;
+ int port_idx = 0;
+ struct device_node *mi2s_parent_node = NULL;
+ u32 num_group_mi2s_ports = 0;
+ const uint32_t *port_id_array = NULL;
+ u32 array_length, i = 0;
+ u32 group_idx = 0;
+ u32 sync_mode = 0;
+
+ mi2s_parent_node = of_get_parent(pdev->dev.of_node);
+ /* extract mi2s group info into static */
+ rc = of_property_read_u32(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-group-id",
+ (u32 *)&group_mi2s_cfg.group_id);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: Group ID from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-group-id");
+ goto rtn;
+ }
+
+ rc = of_property_read_u32(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-group-num-ports",
+ &num_group_mi2s_ports);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: ch_mode from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-group-num-ports");
+ goto rtn;
+ }
+
+ if (num_group_mi2s_ports > AFE_GROUP_DEVICE_NUM_PORTS) {
+ dev_err(&pdev->dev, "%s: Group Num Ports %d greater than Man %d\n",
+ __func__, num_group_mi2s_ports,
+ AFE_GROUP_DEVICE_NUM_PORTS);
+ rc = -EINVAL;
+ goto rtn;
+ }
+
+ port_id_array = of_get_property(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-group-port-id",
+ &array_length);
+ if (port_id_array == NULL) {
+ dev_err(&pdev->dev, "%s: prot_id_array is not valid\n",
+ __func__);
+ rc = -EINVAL;
+ goto rtn;
+ }
+ if (array_length != sizeof(uint32_t) * num_group_mi2s_ports) {
+ dev_err(&pdev->dev, "%s array_length is %d, expected is %zd\n",
+ __func__, array_length,
+ sizeof(uint32_t) * num_group_mi2s_ports);
+ rc = -EINVAL;
+ goto rtn;
+ }
+
+ for (i = 0; i < num_group_mi2s_ports; i++)
+ group_mi2s_cfg.port_id[i] = (u16)be32_to_cpu(port_id_array[i]);
+ /* Unused index should be filled with AFE_PORT_INVALID */
+ for (i = num_group_mi2s_ports; i < AFE_GROUP_DEVICE_NUM_PORTS; i++)
+ group_mi2s_cfg.port_id[i] = AFE_PORT_INVALID;
+
+ /*extract group_mi2s group sd line info into static */
+ rc = of_property_read_u32(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-channel-mode",
+ &ch_mode);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: ch_mode from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-channel-mode");
+ goto rtn;
+ }
+
+ group_mi2s_cfg.channel_mode = ch_mode;
+ group_mi2s_cfg.minor_version = AFE_API_VERSION_I2S_CONFIG;
+ group_idx = msm_dai_q6_get_mi2s_group_idx(group_mi2s_cfg.group_id);
+ if (group_idx < 0 || group_idx > IDX_GROUP_MI2S_MAX) {
+ dev_err(&pdev->dev, "%s: group id 0x%x not supported\n",
+ __func__, group_mi2s_cfg.group_id);
+ rc = -EINVAL;
+ goto rtn;
+ }
+ atomic_set(&group_mi2s_ref[group_idx], 0);
+
+ rc = of_property_read_u32(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-sync-mode",
+ &sync_mode);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: ch_mode from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-sync-mode");
+ goto rtn;
+ }
+
+ rc = of_property_read_u32(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-mclk",
+ &group_mi2s_mclk_set.clk_freq_in_hz);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: mclk from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-mclk");
+ goto rtn;
+ }
+
+ rc = of_property_read_u32(mi2s_parent_node,
+ "qcom,msm-cpudai-mi2s-bclk",
+ &group_mi2s_bclk_set.clk_freq_in_hz);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: bclk from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-bclk");
+ goto rtn;
+ }
+
+ /*update default group mi2s clk set for master/slave select*/
+ rc = msm_dai_q6_group_mi2s_set_clk_param(group_mi2s_cfg.group_id,
+ &group_mi2s_mclk_set,
+ &group_mi2s_bclk_set,
+ sync_mode);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: group id not supported 0x%x\n",
+ __func__, tdm_group_cfg.group_id);
+ goto rtn;
+ }
+
+ /* retrieve device/afe id */
+ rc = of_property_read_u32(pdev->dev.of_node,
+ "qcom,msm-cpudai-mi2s-dev-id",
+ &mi2s_dev_id);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: DeviceID missing in DT file\n",
+ __func__);
+ goto rtn;
+ }
+ rc = msm_dai_q6_group_mi2s_dev_id_validation(mi2s_dev_id);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: Invalid GMI2S device ID %d in DT file\n",
+ __func__, mi2s_dev_id);
+ rc = -ENXIO;
+ goto rtn;
+ }
+
+ pdev->id = mi2s_dev_id;
+ rc = of_property_read_u32(pdev->dev.of_node,
+ "qcom,msm-cpudai-mi2s-dev-channel-mode",
+ &ch_mode);
+ if (rc) {
+ dev_err(&pdev->dev, "%s: TX line from DT file %s\n",
+ __func__, "qcom,msm-cpudai-mi2s-dev-channel-mode");
+ goto rtn;
+ }
+
+ dai_data = kzalloc(sizeof(*dai_data),
+ GFP_KERNEL);
+ if (!dai_data) {
+ rc = -ENOMEM;
+ goto rtn;
+ }
+ dev_set_drvdata(&pdev->dev, dai_data);
+
+ dai_data->sync_mode = sync_mode;
+ dai_data->num_group_ports = num_group_mi2s_ports;
+ dai_data->port_cfg.i2s_cfg.channel_mode = ch_mode;
+ dai_data->bclk_set = group_mi2s_bclk_set;
+ dai_data->mclk_set = group_mi2s_mclk_set;
+ dai_data->group_cfg.i2s_cfg = group_mi2s_cfg;
+
+ port_idx = msm_dai_q6_get_mi2s_port_idx(mi2s_dev_id);
+ if (port_idx < 0 || port_idx > IDX_GROUP_MI2S_PORT_MAX) {
+ dev_err(&pdev->dev, "%s: Port id 0x%x not supported\n",
+ __func__, mi2s_dev_id);
+ rc = -EINVAL;
+ goto free_dai_data;
+ }
+
+ rc = snd_soc_register_component(&pdev->dev,
+ &msm_q6_group_mi2s_dai_component,
+ &msm_dai_q6_group_mi2s_dai[port_idx], 1);
+ if (rc) {
+ dev_err(&pdev->dev,
+ "%s: fail to register msm_q6_group_mi2s_dai_component\n",
+ __func__);
+ goto free_dai_data;
+ }
+
+ return 0;
+
+free_dai_data:
+ kfree(dai_data);
+rtn:
+ return rc;
+}
+
+static int msm_dai_group_mi2s_dev_remove(struct platform_device *pdev)
+{
+ snd_soc_unregister_component(&pdev->dev);
+ return 0;
+}
+
+static const struct of_device_id msm_dai_group_mi2s_dt_match[] = {
+ { .compatible = "qcom,msm-dai-group-mi2s", },
+ { }
+};
+
+MODULE_DEVICE_TABLE(of, msm_dai_group_mi2s_dt_match);
+
+static struct platform_driver msm_dai_group_mi2s_driver = {
+ .probe = msm_dai_group_mi2s_probe,
+ .remove = msm_dai_group_mi2s_remove,
+ .driver = {
+ .name = "msm-dai-group-mi2s",
+ .owner = THIS_MODULE,
+ .of_match_table = msm_dai_group_mi2s_dt_match,
+ },
+};
+
+static const struct of_device_id msm_dai_group_mi2s_dev_dt_match[] = {
+ { .compatible = "qcom,msm-dai-group-mi2s-dev", },
+ { }
+};
+
+MODULE_DEVICE_TABLE(of, msm_dai_group_mi2s_dev_dt_match);
+
+static struct platform_driver msm_dai_group_mi2s_dev_driver = {
+ .probe = msm_dai_group_mi2s_dev_probe,
+ .remove = msm_dai_group_mi2s_dev_remove,
+ .driver = {
+ .name = "msm-dai-group-mi2s-dev",
+ .owner = THIS_MODULE,
+ .of_match_table = msm_dai_group_mi2s_dev_dt_match,
+ },
+};
+
static int msm_dai_q6_spdif_dev_probe(struct platform_device *pdev)
{
int rc;
@@ -8344,8 +9689,27 @@ static int __init msm_dai_q6_init(void)
pr_err("%s: fail to register dai TDM\n", __func__);
goto dai_tdm_q6_fail;
}
+
+ rc = platform_driver_register(&msm_dai_group_mi2s_dev_driver);
+ if (rc) {
+ pr_err("%s: fail to register dai GMI2S dev drv\n",
+ __func__);
+ goto dai_q6_group_mi2s_dev_fail;
+ }
+
+ rc = platform_driver_register(&msm_dai_group_mi2s_driver);
+ if (rc) {
+ pr_err("%s: fail to register dai GMI2S\n",
+ __func__);
+ goto dai_group_mi2s_fail;
+ }
+
return rc;
+dai_group_mi2s_fail:
+ platform_driver_unregister(&msm_dai_group_mi2s_driver);
+dai_q6_group_mi2s_dev_fail:
+ platform_driver_unregister(&msm_dai_group_mi2s_dev_driver);
dai_tdm_q6_fail:
platform_driver_unregister(&msm_dai_q6_tdm_driver);
dai_q6_tdm_drv_fail:
@@ -8371,6 +9735,8 @@ static void __exit msm_dai_q6_exit(void)
platform_driver_unregister(&msm_dai_q6);
platform_driver_unregister(&msm_auxpcm_dev_driver);
platform_driver_unregister(&msm_dai_q6_spdif_driver);
+ platform_driver_unregister(&msm_dai_group_mi2s_driver);
+ platform_driver_unregister(&msm_dai_group_mi2s_dev_driver);
}
module_exit(msm_dai_q6_exit);
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
index b0843bca62bf..ee8c42903c99 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c
@@ -546,6 +546,54 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
LPASS_BE_INT6_MI2S_RX},
{ AFE_PORT_ID_INT6_MI2S_TX, 0, {0}, {0}, 0, 0, 0, 0, {0},
LPASS_BE_INT6_MI2S_TX},
+ { AFE_PORT_ID_SECONDARY_MI2S_RX_1, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_RX_1},
+ { AFE_PORT_ID_SECONDARY_MI2S_RX_2, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_RX_2},
+ { AFE_PORT_ID_SECONDARY_MI2S_RX_3, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_RX_3},
+ { AFE_PORT_ID_SECONDARY_MI2S_RX_4, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_RX_4},
+ { AFE_PORT_ID_SECONDARY_MI2S_TX_1, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_TX_1},
+ { AFE_PORT_ID_SECONDARY_MI2S_TX_2, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_TX_2},
+ { AFE_PORT_ID_SECONDARY_MI2S_TX_3, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_TX_3},
+ { AFE_PORT_ID_SECONDARY_MI2S_TX_4, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_SEC_MI2S_TX_4},
+ { AFE_PORT_ID_TERTIARY_MI2S_RX_1, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_RX_1},
+ { AFE_PORT_ID_TERTIARY_MI2S_RX_2, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_RX_2},
+ { AFE_PORT_ID_TERTIARY_MI2S_RX_3, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_RX_3},
+ { AFE_PORT_ID_TERTIARY_MI2S_RX_4, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_RX_4},
+ { AFE_PORT_ID_TERTIARY_MI2S_TX_1, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_TX_1},
+ { AFE_PORT_ID_TERTIARY_MI2S_TX_2, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_TX_2},
+ { AFE_PORT_ID_TERTIARY_MI2S_TX_3, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_TX_3},
+ { AFE_PORT_ID_TERTIARY_MI2S_TX_4, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_TERT_MI2S_TX_4},
+ { AFE_PORT_ID_QUATERNARY_MI2S_RX_1, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_RX_1},
+ { AFE_PORT_ID_QUATERNARY_MI2S_RX_2, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_RX_2},
+ { AFE_PORT_ID_QUATERNARY_MI2S_RX_3, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_RX_3},
+ { AFE_PORT_ID_QUATERNARY_MI2S_RX_4, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_RX_4},
+ { AFE_PORT_ID_QUATERNARY_MI2S_TX_1, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_TX_1},
+ { AFE_PORT_ID_QUATERNARY_MI2S_TX_2, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_TX_2},
+ { AFE_PORT_ID_QUATERNARY_MI2S_TX_3, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_TX_3},
+ { AFE_PORT_ID_QUATERNARY_MI2S_TX_4, 0, {0}, {0}, 0, 0, 0, 0, {0},
+ LPASS_BE_QUAT_MI2S_TX_4}
};
/* Track ASM playback & capture sessions of DAI
@@ -4723,6 +4771,834 @@ static const struct snd_kcontrol_new secondary_mi2s_rx2_mixer_controls[] = {
msm_routing_put_audio_mixer),
};
+static const struct snd_kcontrol_new secondary_mi2s_rx_1_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new secondary_mi2s_rx_2_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new secondary_mi2s_rx_3_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new secondary_mi2s_rx_4_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new tertiary_mi2s_rx_1_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new tertiary_mi2s_rx_2_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new tertiary_mi2s_rx_3_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new tertiary_mi2s_rx_4_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new quaternary_mi2s_rx_1_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new quaternary_mi2s_rx_2_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new quaternary_mi2s_rx_3_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
+static const struct snd_kcontrol_new quaternary_mi2s_rx_4_mixer_controls[] = {
+ SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia17", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia18", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia19", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia26", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia28", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("MultiMedia29", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+};
+
static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SECONDARY_MI2S_RX ,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
@@ -7215,6 +8091,42 @@ static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
SOC_SINGLE_EXT("USB_AUDIO_TX", MSM_BACKEND_DAI_USB_TX,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_1", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_2", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_3", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_4", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_1", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_2", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_3", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_4", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_1", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_2", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_3", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_4", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ 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[] = {
@@ -7308,6 +8220,42 @@ static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
SOC_SINGLE_EXT("USB_AUDIO_TX", MSM_BACKEND_DAI_USB_TX,
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_1", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_2", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_3", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_4", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_1", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_2", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_3", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_4", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_1", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_2", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_3", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_4", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ 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[] = {
@@ -7398,6 +8346,42 @@ static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
SOC_SINGLE_EXT("QUAT_TDM_TX_3", MSM_BACKEND_DAI_QUAT_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_1", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_2", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_3", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_4", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_1", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_2", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_3", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_4", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_1", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_2", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_3", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_4", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
@@ -7593,6 +8577,42 @@ static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
SOC_SINGLE_EXT("USB_AUDIO_TX", MSM_BACKEND_DAI_USB_TX,
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_1", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_2", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_3", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_4", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_1", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_2", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_3", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_4", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_1", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_2", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_3", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_4", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ 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[] = {
@@ -7938,6 +8958,42 @@ static const struct snd_kcontrol_new mmul9_mixer_controls[] = {
SOC_SINGLE_EXT("QUAT_TDM_TX_3", MSM_BACKEND_DAI_QUAT_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_1", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_2", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_3", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_4", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_1", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_2", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_3", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_4", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_1", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_2", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_3", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_4", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new mmul17_mixer_controls[] = {
@@ -8091,6 +9147,42 @@ static const struct snd_kcontrol_new mmul20_mixer_controls[] = {
SOC_SINGLE_EXT("QUAT_TDM_TX_3", MSM_BACKEND_DAI_QUAT_TDM_TX_3,
MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_1", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_2", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_3", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("SEC_MI2S_TX_4", MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_1", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_2", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_3", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("TERT_MI2S_TX_4", MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_1", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_2", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_3", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
+ SOC_SINGLE_EXT("QUAT_MI2S_TX_4", MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
+ MSM_FRONTEND_DAI_MULTIMEDIA20, 1, 0, msm_routing_get_audio_mixer,
+ msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new mmul21_mixer_controls[] = {
@@ -12773,6 +13865,56 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
0, 0, 0 , 0),
SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
0, 0, 0 , 0),
+ SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX_1", "Secondary MI2S1 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX_2", "Secondary MI2S2 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX_3", "Secondary MI2S3 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX_4", "Secondary MI2S4 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX_1", "Tertiary MI2S1 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX_2", "Tertiary MI2S2 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX_3", "Tertiary MI2S3 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX_4", "Tertiary MI2S4 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX_1", "Quaternary MI2S1 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX_2", "Quaternary MI2S2 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX_3", "Quaternary MI2S3 Capture",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX_4", "Quaternary MI2S4 Capture",
+ 0, 0, 0, 0),
+
+ SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_1", "Secondary MI2S1 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_2", "Secondary MI2S2 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_3", "Secondary MI2S3 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_4", "Secondary MI2S4 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX_1", "Tertiary MI2S1 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX_2", "Tertiary MI2S2 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX_3", "Tertiary MI2S3 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX_4", "Tertiary MI2S4 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX_1", "Quaternary MI2S1 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX_2", "Quaternary MI2S2 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX_3", "Quaternary MI2S3 Playback",
+ 0, 0, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX_4", "Quaternary MI2S4 Playback",
+ 0, 0, 0, 0),
+
SND_SOC_DAPM_AIF_OUT("PRI_TDM_RX_0", "Primary TDM0 Playback",
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("PRI_TDM_TX_0", "Primary TDM0 Capture",
@@ -13024,6 +14166,42 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
tertiary_mi2s_rx_mixer_controls,
ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEC_MI2S_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ secondary_mi2s_rx_1_mixer_controls,
+ ARRAY_SIZE(secondary_mi2s_rx_1_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEC_MI2S_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ secondary_mi2s_rx_2_mixer_controls,
+ ARRAY_SIZE(secondary_mi2s_rx_2_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEC_MI2S_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ secondary_mi2s_rx_3_mixer_controls,
+ ARRAY_SIZE(secondary_mi2s_rx_3_mixer_controls)),
+ SND_SOC_DAPM_MIXER("SEC_MI2S_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ secondary_mi2s_rx_4_mixer_controls,
+ ARRAY_SIZE(secondary_mi2s_rx_4_mixer_controls)),
+ SND_SOC_DAPM_MIXER("TERT_MI2S_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ tertiary_mi2s_rx_1_mixer_controls,
+ ARRAY_SIZE(tertiary_mi2s_rx_1_mixer_controls)),
+ SND_SOC_DAPM_MIXER("TERT_MI2S_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ tertiary_mi2s_rx_2_mixer_controls,
+ ARRAY_SIZE(tertiary_mi2s_rx_2_mixer_controls)),
+ SND_SOC_DAPM_MIXER("TERT_MI2S_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ tertiary_mi2s_rx_3_mixer_controls,
+ ARRAY_SIZE(tertiary_mi2s_rx_3_mixer_controls)),
+ SND_SOC_DAPM_MIXER("TERT_MI2S_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ tertiary_mi2s_rx_4_mixer_controls,
+ ARRAY_SIZE(tertiary_mi2s_rx_4_mixer_controls)),
+ SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ quaternary_mi2s_rx_1_mixer_controls,
+ ARRAY_SIZE(quaternary_mi2s_rx_1_mixer_controls)),
+ SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ quaternary_mi2s_rx_2_mixer_controls,
+ ARRAY_SIZE(quaternary_mi2s_rx_2_mixer_controls)),
+ SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ quaternary_mi2s_rx_3_mixer_controls,
+ ARRAY_SIZE(quaternary_mi2s_rx_3_mixer_controls)),
+ SND_SOC_DAPM_MIXER("QUAT_MI2S_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
+ quaternary_mi2s_rx_4_mixer_controls,
+ ARRAY_SIZE(quaternary_mi2s_rx_4_mixer_controls)),
SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
secondary_mi2s_rx_mixer_controls,
ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
@@ -14346,6 +15524,222 @@ static const struct snd_soc_dapm_route intercon[] = {
{"QUAT_TDM_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"},
{"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Audio Mixer"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEC_MI2S_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"SEC_MI2S_RX_1", NULL, "SEC_MI2S_RX_1 Audio Mixer"},
+
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEC_MI2S_RX_2 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"SEC_MI2S_RX_2", NULL, "SEC_MI2S_RX_2 Audio Mixer"},
+
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEC_MI2S_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"SEC_MI2S_RX_3", NULL, "SEC_MI2S_RX_3 Audio Mixer"},
+
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"SEC_MI2S_RX_4 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"SEC_MI2S_RX_4", NULL, "SEC_MI2S_RX_4 Audio Mixer"},
+
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"TERT_MI2S_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"TERT_MI2S_RX_1", NULL, "TERT_MI2S_RX_1 Audio Mixer"},
+
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"TERT_MI2S_RX_2 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"TERT_MI2S_RX_2", NULL, "TERT_MI2S_RX_2 Audio Mixer"},
+
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"TERT_MI2S_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"TERT_MI2S_RX_3", NULL, "TERT_MI2S_RX_3 Audio Mixer"},
+
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"TERT_MI2S_RX_4 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"TERT_MI2S_RX_4", NULL, "TERT_MI2S_RX_4 Audio Mixer"},
+
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"QUAT_MI2S_RX_1 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"QUAT_MI2S_RX_1", NULL, "QUAT_MI2S_RX_1 Audio Mixer"},
+
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"QUAT_MI2S_RX_2 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"QUAT_MI2S_RX_2", NULL, "QUAT_MI2S_RX_2 Audio Mixer"},
+
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"QUAT_MI2S_RX_3 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"QUAT_MI2S_RX_3", NULL, "QUAT_MI2S_RX_3 Audio Mixer"},
+
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia1", "MM_DL1"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia2", "MM_DL2"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia3", "MM_DL3"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia4", "MM_DL4"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia5", "MM_DL5"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia6", "MM_DL6"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia7", "MM_DL7"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia8", "MM_DL8"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia10", "MM_DL10"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia11", "MM_DL11"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia12", "MM_DL12"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia13", "MM_DL13"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia14", "MM_DL14"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia15", "MM_DL15"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia16", "MM_DL16"},
+ {"QUAT_MI2S_RX_4 Audio Mixer", "MultiMedia26", "MM_DL26"},
+ {"QUAT_MI2S_RX_4", NULL, "QUAT_MI2S_RX_4 Audio Mixer"},
+
{"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
{"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"},
{"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
@@ -14423,6 +15817,19 @@ static const struct snd_soc_dapm_route intercon[] = {
{"MultiMedia1 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
{"MultiMedia1 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"MultiMedia1 Mixer", "SEC_MI2S_TX_1", "SEC_MI2S_TX_1"},
+ {"MultiMedia1 Mixer", "SEC_MI2S_TX_2", "SEC_MI2S_TX_2"},
+ {"MultiMedia1 Mixer", "SEC_MI2S_TX_3", "SEC_MI2S_TX_3"},
+ {"MultiMedia1 Mixer", "SEC_MI2S_TX_4", "SEC_MI2S_TX_4"},
+ {"MultiMedia1 Mixer", "TERT_MI2S_TX_1", "TERT_MI2S_TX_1"},
+ {"MultiMedia1 Mixer", "TERT_MI2S_TX_2", "TERT_MI2S_TX_2"},
+ {"MultiMedia1 Mixer", "TERT_MI2S_TX_3", "TERT_MI2S_TX_3"},
+ {"MultiMedia1 Mixer", "TERT_MI2S_TX_4", "TERT_MI2S_TX_4"},
+ {"MultiMedia1 Mixer", "QUAT_MI2S_TX_1", "QUAT_MI2S_TX_1"},
+ {"MultiMedia1 Mixer", "QUAT_MI2S_TX_2", "QUAT_MI2S_TX_2"},
+ {"MultiMedia1 Mixer", "QUAT_MI2S_TX_3", "QUAT_MI2S_TX_3"},
+ {"MultiMedia1 Mixer", "QUAT_MI2S_TX_4", "QUAT_MI2S_TX_4"},
+
{"MultiMedia2 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia2 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
{"MultiMedia2 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"},
@@ -14439,6 +15846,18 @@ static const struct snd_soc_dapm_route intercon[] = {
{"MultiMedia2 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
{"MultiMedia2 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
{"MultiMedia2 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"MultiMedia2 Mixer", "SEC_MI2S_TX_1", "SEC_MI2S_TX_1"},
+ {"MultiMedia2 Mixer", "SEC_MI2S_TX_2", "SEC_MI2S_TX_2"},
+ {"MultiMedia2 Mixer", "SEC_MI2S_TX_3", "SEC_MI2S_TX_3"},
+ {"MultiMedia2 Mixer", "SEC_MI2S_TX_4", "SEC_MI2S_TX_4"},
+ {"MultiMedia2 Mixer", "TERT_MI2S_TX_1", "TERT_MI2S_TX_1"},
+ {"MultiMedia2 Mixer", "TERT_MI2S_TX_2", "TERT_MI2S_TX_2"},
+ {"MultiMedia2 Mixer", "TERT_MI2S_TX_3", "TERT_MI2S_TX_3"},
+ {"MultiMedia2 Mixer", "TERT_MI2S_TX_4", "TERT_MI2S_TX_4"},
+ {"MultiMedia2 Mixer", "QUAT_MI2S_TX_1", "QUAT_MI2S_TX_1"},
+ {"MultiMedia2 Mixer", "QUAT_MI2S_TX_2", "QUAT_MI2S_TX_2"},
+ {"MultiMedia2 Mixer", "QUAT_MI2S_TX_3", "QUAT_MI2S_TX_3"},
+ {"MultiMedia2 Mixer", "QUAT_MI2S_TX_4", "QUAT_MI2S_TX_4"},
{"MultiMedia3 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia3 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
@@ -14456,6 +15875,18 @@ static const struct snd_soc_dapm_route intercon[] = {
{"MultiMedia3 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
{"MultiMedia3 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
{"MultiMedia3 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"MultiMedia3 Mixer", "SEC_MI2S_TX_1", "SEC_MI2S_TX_1"},
+ {"MultiMedia3 Mixer", "SEC_MI2S_TX_2", "SEC_MI2S_TX_2"},
+ {"MultiMedia3 Mixer", "SEC_MI2S_TX_3", "SEC_MI2S_TX_3"},
+ {"MultiMedia3 Mixer", "SEC_MI2S_TX_4", "SEC_MI2S_TX_4"},
+ {"MultiMedia3 Mixer", "TERT_MI2S_TX_1", "TERT_MI2S_TX_1"},
+ {"MultiMedia3 Mixer", "TERT_MI2S_TX_2", "TERT_MI2S_TX_2"},
+ {"MultiMedia3 Mixer", "TERT_MI2S_TX_3", "TERT_MI2S_TX_3"},
+ {"MultiMedia3 Mixer", "TERT_MI2S_TX_4", "TERT_MI2S_TX_4"},
+ {"MultiMedia3 Mixer", "QUAT_MI2S_TX_1", "QUAT_MI2S_TX_1"},
+ {"MultiMedia3 Mixer", "QUAT_MI2S_TX_2", "QUAT_MI2S_TX_2"},
+ {"MultiMedia3 Mixer", "QUAT_MI2S_TX_3", "QUAT_MI2S_TX_3"},
+ {"MultiMedia3 Mixer", "QUAT_MI2S_TX_4", "QUAT_MI2S_TX_4"},
{"MultiMedia4 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia4 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
@@ -14490,6 +15921,18 @@ static const struct snd_soc_dapm_route intercon[] = {
{"MultiMedia5 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
{"MultiMedia5 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
{"MultiMedia5 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"MultiMedia5 Mixer", "SEC_MI2S_TX_1", "SEC_MI2S_TX_1"},
+ {"MultiMedia5 Mixer", "SEC_MI2S_TX_2", "SEC_MI2S_TX_2"},
+ {"MultiMedia5 Mixer", "SEC_MI2S_TX_3", "SEC_MI2S_TX_3"},
+ {"MultiMedia5 Mixer", "SEC_MI2S_TX_4", "SEC_MI2S_TX_4"},
+ {"MultiMedia5 Mixer", "TERT_MI2S_TX_1", "TERT_MI2S_TX_1"},
+ {"MultiMedia5 Mixer", "TERT_MI2S_TX_2", "TERT_MI2S_TX_2"},
+ {"MultiMedia5 Mixer", "TERT_MI2S_TX_3", "TERT_MI2S_TX_3"},
+ {"MultiMedia5 Mixer", "TERT_MI2S_TX_4", "TERT_MI2S_TX_4"},
+ {"MultiMedia5 Mixer", "QUAT_MI2S_TX_1", "QUAT_MI2S_TX_1"},
+ {"MultiMedia5 Mixer", "QUAT_MI2S_TX_2", "QUAT_MI2S_TX_2"},
+ {"MultiMedia5 Mixer", "QUAT_MI2S_TX_3", "QUAT_MI2S_TX_3"},
+ {"MultiMedia5 Mixer", "QUAT_MI2S_TX_4", "QUAT_MI2S_TX_4"},
{"MultiMedia6 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia6 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
@@ -14533,11 +15976,35 @@ static const struct snd_soc_dapm_route intercon[] = {
{"MultiMedia9 Mixer", "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},
{"MultiMedia9 Mixer", "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},
{"MultiMedia9 Mixer", "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},
+ {"MultiMedia9 Mixer", "SEC_MI2S_TX_1", "SEC_MI2S_TX_1"},
+ {"MultiMedia9 Mixer", "SEC_MI2S_TX_2", "SEC_MI2S_TX_2"},
+ {"MultiMedia9 Mixer", "SEC_MI2S_TX_3", "SEC_MI2S_TX_3"},
+ {"MultiMedia9 Mixer", "SEC_MI2S_TX_4", "SEC_MI2S_TX_4"},
+ {"MultiMedia9 Mixer", "TERT_MI2S_TX_1", "TERT_MI2S_TX_1"},
+ {"MultiMedia9 Mixer", "TERT_MI2S_TX_2", "TERT_MI2S_TX_2"},
+ {"MultiMedia9 Mixer", "TERT_MI2S_TX_3", "TERT_MI2S_TX_3"},
+ {"MultiMedia9 Mixer", "TERT_MI2S_TX_4", "TERT_MI2S_TX_4"},
+ {"MultiMedia9 Mixer", "QUAT_MI2S_TX_1", "QUAT_MI2S_TX_1"},
+ {"MultiMedia9 Mixer", "QUAT_MI2S_TX_2", "QUAT_MI2S_TX_2"},
+ {"MultiMedia9 Mixer", "QUAT_MI2S_TX_3", "QUAT_MI2S_TX_3"},
+ {"MultiMedia9 Mixer", "QUAT_MI2S_TX_4", "QUAT_MI2S_TX_4"},
{"MultiMedia20 Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"MultiMedia20 Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
{"MultiMedia20 Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"},
{"MultiMedia20 Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
+ {"MultiMedia20 Mixer", "SEC_MI2S_TX_1", "SEC_MI2S_TX_1"},
+ {"MultiMedia20 Mixer", "SEC_MI2S_TX_2", "SEC_MI2S_TX_2"},
+ {"MultiMedia20 Mixer", "SEC_MI2S_TX_3", "SEC_MI2S_TX_3"},
+ {"MultiMedia20 Mixer", "SEC_MI2S_TX_4", "SEC_MI2S_TX_4"},
+ {"MultiMedia20 Mixer", "TERT_MI2S_TX_1", "TERT_MI2S_TX_1"},
+ {"MultiMedia20 Mixer", "TERT_MI2S_TX_2", "TERT_MI2S_TX_2"},
+ {"MultiMedia20 Mixer", "TERT_MI2S_TX_3", "TERT_MI2S_TX_3"},
+ {"MultiMedia20 Mixer", "TERT_MI2S_TX_4", "TERT_MI2S_TX_4"},
+ {"MultiMedia20 Mixer", "QUAT_MI2S_TX_1", "QUAT_MI2S_TX_1"},
+ {"MultiMedia20 Mixer", "QUAT_MI2S_TX_2", "QUAT_MI2S_TX_2"},
+ {"MultiMedia20 Mixer", "QUAT_MI2S_TX_3", "QUAT_MI2S_TX_3"},
+ {"MultiMedia20 Mixer", "QUAT_MI2S_TX_4", "QUAT_MI2S_TX_4"},
{"MultiMedia20 Mixer", "PRI_TDM_TX_0", "PRI_TDM_TX_0"},
{"MultiMedia20 Mixer", "PRI_TDM_TX_1", "PRI_TDM_TX_1"},
{"MultiMedia20 Mixer", "PRI_TDM_TX_2", "PRI_TDM_TX_2"},
@@ -16080,6 +17547,18 @@ static const struct snd_soc_dapm_route intercon[] = {
{"BE_OUT", NULL, "QUAT_TDM_RX_1"},
{"BE_OUT", NULL, "QUAT_TDM_RX_2"},
{"BE_OUT", NULL, "QUAT_TDM_RX_3"},
+ {"BE_OUT", NULL, "SEC_MI2S_RX_1"},
+ {"BE_OUT", NULL, "SEC_MI2S_RX_2"},
+ {"BE_OUT", NULL, "SEC_MI2S_RX_3"},
+ {"BE_OUT", NULL, "SEC_MI2S_RX_4"},
+ {"BE_OUT", NULL, "TERT_MI2S_RX_1"},
+ {"BE_OUT", NULL, "TERT_MI2S_RX_2"},
+ {"BE_OUT", NULL, "TERT_MI2S_RX_3"},
+ {"BE_OUT", NULL, "TERT_MI2S_RX_4"},
+ {"BE_OUT", NULL, "QUAT_MI2S_RX_1"},
+ {"BE_OUT", NULL, "QUAT_MI2S_RX_2"},
+ {"BE_OUT", NULL, "QUAT_MI2S_RX_3"},
+ {"BE_OUT", NULL, "QUAT_MI2S_RX_4"},
{"PRI_I2S_TX", NULL, "BE_IN"},
{"MI2S_TX", NULL, "BE_IN"},
@@ -16094,6 +17573,18 @@ static const struct snd_soc_dapm_route intercon[] = {
{"INT5_MI2S_TX", NULL, "BE_IN"},
{"SEC_MI2S_TX", NULL, "BE_IN"},
{"SENARY_MI2S_TX", NULL, "BE_IN" },
+ {"SEC_MI2S_TX_1", NULL, "BE_IN"},
+ {"SEC_MI2S_TX_2", NULL, "BE_IN"},
+ {"SEC_MI2S_TX_3", NULL, "BE_IN"},
+ {"SEC_MI2S_TX_4", NULL, "BE_IN"},
+ {"TERT_MI2S_TX_1", NULL, "BE_IN"},
+ {"TERT_MI2S_TX_2", NULL, "BE_IN"},
+ {"TERT_MI2S_TX_3", NULL, "BE_IN"},
+ {"TERT_MI2S_TX_4", NULL, "BE_IN"},
+ {"QUAT_MI2S_TX_1", NULL, "BE_IN"},
+ {"QUAT_MI2S_TX_2", NULL, "BE_IN"},
+ {"QUAT_MI2S_TX_3", NULL, "BE_IN"},
+ {"QUAT_MI2S_TX_4", NULL, "BE_IN"},
{"SLIMBUS_0_TX", NULL, "BE_IN" },
{"SLIMBUS_1_TX", NULL, "BE_IN" },
{"SLIMBUS_3_TX", NULL, "BE_IN" },
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h
index 531f83d752b0..bfeee4ad3607 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h
@@ -167,6 +167,34 @@
#define LPASS_BE_INT5_MI2S_TX "INT5_MI2S_TX"
#define LPASS_BE_INT6_MI2S_RX "INT6_MI2S_RX"
#define LPASS_BE_INT6_MI2S_TX "INT6_MI2S_TX"
+
+#define LPASS_BE_SEC_MI2S_RX_1 "SEC_MI2S_RX_1"
+#define LPASS_BE_SEC_MI2S_RX_2 "SEC_MI2S_RX_2"
+#define LPASS_BE_SEC_MI2S_RX_3 "SEC_MI2S_RX_3"
+#define LPASS_BE_SEC_MI2S_RX_4 "SEC_MI2S_RX_4"
+#define LPASS_BE_SEC_MI2S_TX_1 "SEC_MI2S_TX_1"
+#define LPASS_BE_SEC_MI2S_TX_2 "SEC_MI2S_TX_2"
+#define LPASS_BE_SEC_MI2S_TX_3 "SEC_MI2S_TX_3"
+#define LPASS_BE_SEC_MI2S_TX_4 "SEC_MI2S_TX_4"
+
+#define LPASS_BE_TERT_MI2S_RX_1 "TERT_MI2S_RX_1"
+#define LPASS_BE_TERT_MI2S_RX_2 "TERT_MI2S_RX_2"
+#define LPASS_BE_TERT_MI2S_RX_3 "TERT_MI2S_RX_3"
+#define LPASS_BE_TERT_MI2S_RX_4 "TERT_MI2S_RX_4"
+#define LPASS_BE_TERT_MI2S_TX_1 "TERT_MI2S_TX_1"
+#define LPASS_BE_TERT_MI2S_TX_2 "TERT_MI2S_TX_2"
+#define LPASS_BE_TERT_MI2S_TX_3 "TERT_MI2S_TX_3"
+#define LPASS_BE_TERT_MI2S_TX_4 "TERT_MI2S_TX_4"
+
+#define LPASS_BE_QUAT_MI2S_RX_1 "QUAT_MI2S_RX_1"
+#define LPASS_BE_QUAT_MI2S_RX_2 "QUAT_MI2S_RX_2"
+#define LPASS_BE_QUAT_MI2S_RX_3 "QUAT_MI2S_RX_3"
+#define LPASS_BE_QUAT_MI2S_RX_4 "QUAT_MI2S_RX_4"
+#define LPASS_BE_QUAT_MI2S_TX_1 "QUAT_MI2S_TX_1"
+#define LPASS_BE_QUAT_MI2S_TX_2 "QUAT_MI2S_TX_2"
+#define LPASS_BE_QUAT_MI2S_TX_3 "QUAT_MI2S_TX_3"
+#define LPASS_BE_QUAT_MI2S_TX_4 "QUAT_MI2S_TX_4"
+
/* For multimedia front-ends, asm session is allocated dynamically.
* Hence, asm session/multimedia front-end mapping has to be maintained.
* Due to this reason, additional multimedia front-end must be placed before
@@ -373,6 +401,30 @@ enum {
MSM_BACKEND_DAI_INT5_MI2S_TX,
MSM_BACKEND_DAI_INT6_MI2S_RX,
MSM_BACKEND_DAI_INT6_MI2S_TX,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_RX_1,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_RX_2,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_RX_3,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_RX_4,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX_1,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX_2,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX_3,
+ MSM_BACKEND_DAI_SECONDARY_MI2S_TX_4,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_RX_1,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_RX_2,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_RX_3,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_RX_4,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX_1,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX_2,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX_3,
+ MSM_BACKEND_DAI_TERTIARY_MI2S_TX_4,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_1,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_2,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_3,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_RX_4,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_1,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_2,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_3,
+ MSM_BACKEND_DAI_QUATERNARY_MI2S_TX_4,
MSM_BACKEND_DAI_MAX,
};
diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c
index 0524ca21feba..c7aecd5758d4 100644
--- a/sound/soc/msm/qdsp6v2/q6afe.c
+++ b/sound/soc/msm/qdsp6v2/q6afe.c
@@ -785,6 +785,18 @@ int afe_get_port_type(u16 port_id)
case AFE_PORT_ID_INT4_MI2S_RX:
case AFE_PORT_ID_INT5_MI2S_RX:
case AFE_PORT_ID_INT6_MI2S_RX:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
ret = MSM_AFE_PORT_TYPE_RX;
break;
@@ -856,6 +868,18 @@ int afe_get_port_type(u16 port_id)
case AFE_PORT_ID_INT4_MI2S_TX:
case AFE_PORT_ID_INT5_MI2S_TX:
case AFE_PORT_ID_INT6_MI2S_TX:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
ret = MSM_AFE_PORT_TYPE_TX;
break;
@@ -2734,6 +2758,118 @@ int afe_send_custom_tdm_header_cfg(
return ret;
}
+int afe_i2s_port_start(u16 port_id, struct afe_i2s_port_config *i2s_port,
+ u32 rate, u16 num_groups)
+{
+ struct param_hdr_v3 param_hdr = {0};
+ int index = 0;
+ uint16_t port_index = 0;
+ enum afe_mad_type mad_type = MAD_HW_NONE;
+ int ret = 0;
+
+ if (!i2s_port) {
+ pr_err("%s: Error, no configuration data\n", __func__);
+ return -EINVAL;
+ }
+
+ pr_debug("%s: port id: 0x%x\n", __func__, port_id);
+
+ index = q6audio_get_port_index(port_id);
+ if (index < 0 || index >= AFE_MAX_PORTS) {
+ pr_err("%s: AFE port index[%d] invalid!\n",
+ __func__, index);
+ return -EINVAL;
+ }
+ ret = q6audio_validate_port(port_id);
+ if (ret < 0) {
+ pr_err("%s: port id: 0x%x ret %d\n", __func__, port_id, ret);
+ return -EINVAL;
+ }
+
+ ret = afe_q6_interface_prepare();
+ if (ret != 0) {
+ pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
+ return ret;
+ }
+
+ if ((index >= 0) && (index < AFE_MAX_PORTS)) {
+ this_afe.afe_sample_rates[index] = rate;
+
+ if (this_afe.rt_cb)
+ this_afe.dev_acdb_id[index] = this_afe.rt_cb(port_id);
+ }
+
+ /* Also send the topology id here if multiple ports: */
+ port_index = afe_get_port_index(port_id);
+ if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE) &&
+ num_groups > 1) {
+ /* One time call: only for first time */
+ afe_send_custom_topology();
+ afe_send_port_topology_id(port_id);
+ afe_send_cal(port_id);
+ afe_send_hw_delay(port_id, rate);
+ }
+
+ /* Start SW MAD module */
+ 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);
+ if (mad_type != MAD_HW_NONE && mad_type != MAD_SW_AUDIO) {
+ if (!afe_has_config(AFE_CDC_REGISTERS_CONFIG) ||
+ !afe_has_config(AFE_SLIMBUS_SLAVE_CONFIG)) {
+ pr_err("%s: AFE isn't configured yet for\n"
+ "HW MAD try Again\n", __func__);
+ ret = -EAGAIN;
+ goto fail_cmd;
+ }
+ ret = afe_turn_onoff_hw_mad(mad_type, true);
+ if (ret) {
+ pr_err("%s: afe_turn_onoff_hw_mad failed %d\n",
+ __func__, ret);
+ goto fail_cmd;
+ }
+ }
+
+ param_hdr.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE;
+ param_hdr.instance_id = INSTANCE_ID_0;
+ param_hdr.param_id = AFE_PARAM_ID_I2S_CONFIG;
+ param_hdr.param_size = sizeof(struct afe_param_id_i2s_cfg);
+
+ ret = q6afe_pack_and_set_param_in_band(port_id,
+ q6audio_get_port_index(port_id),
+ param_hdr,
+ (u8 *) &i2s_port->i2s_cfg);
+ if (ret) {
+ pr_err("%s: AFE enable for port 0x%x failed ret = %d\n",
+ __func__, port_id, ret);
+ goto fail_cmd;
+ }
+
+ port_index = afe_get_port_index(port_id);
+ if ((port_index >= 0) && (port_index < AFE_MAX_PORTS)) {
+ this_afe.afe_sample_rates[port_index] = rate;
+ } else {
+ pr_err("%s: Invalid port index %d\n", __func__, port_index);
+ ret = -EINVAL;
+ goto fail_cmd;
+ }
+ /* slot mapping is not need if there is only one group */
+ if (num_groups > 1) {
+ ret = afe_send_slot_mapping_cfg(
+ &i2s_port->slot_mapping,
+ port_id);
+ if (ret < 0) {
+ pr_err("%s: afe send failed %d\n", __func__, ret);
+ goto fail_cmd;
+ }
+ }
+
+ ret = afe_send_cmd_port_start(port_id);
+
+fail_cmd:
+ return ret;
+}
+
int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port,
u32 rate, u16 num_groups)
{
@@ -3598,6 +3734,54 @@ int afe_get_port_index(u16 port_id)
return IDX_AFE_PORT_ID_INT6_MI2S_RX;
case AFE_PORT_ID_INT6_MI2S_TX:
return IDX_AFE_PORT_ID_INT6_MI2S_TX;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_4;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_4;
default:
pr_err("%s: port 0x%x\n", __func__, port_id);
return -EINVAL;
@@ -4022,6 +4206,154 @@ int afe_port_group_set_param(u16 group_id,
return ret;
}
+static int afe_port_group_mi2s_set_param(u16 group_id,
+ struct afe_param_id_group_device_i2s_cfg_v1 *afe_group_config)
+{
+ struct param_hdr_v3 param_hdr = {0};
+ int cfg_type;
+ int ret;
+
+ if (!afe_group_config) {
+ pr_err("%s: Error, no configuration data\n", __func__);
+ return -EINVAL;
+ }
+
+ pr_debug("%s: group id: 0x%x\n", __func__, group_id);
+
+ ret = afe_q6_interface_prepare();
+ if (ret != 0) {
+ pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
+ return ret;
+ }
+
+ switch (group_id) {
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX:
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_TX:
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_RX:
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX:
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX:
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_TX:
+ cfg_type = AFE_PARAM_ID_GROUP_DEVICE_I2S_CONFIG;
+ break;
+ default:
+ pr_err("%s: Invalid group id 0x%x\n", __func__, group_id);
+ return -EINVAL;
+ }
+
+ param_hdr.module_id = AFE_MODULE_GROUP_DEVICE;
+ param_hdr.instance_id = INSTANCE_ID_0;
+ param_hdr.param_id = cfg_type;
+ param_hdr.param_size =
+ sizeof(struct afe_param_id_group_device_i2s_cfg_v1);
+
+ ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr,
+ (u8 *) afe_group_config);
+ if (ret)
+ pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_CFG failed %d\n",
+ __func__, ret);
+
+ return ret;
+}
+
+static atomic_t mi2s_gp_en_ref[IDX_GROUP_MI2S_MAX];
+static int afe_get_mi2s_group_idx(u16 group_id)
+{
+ int gp_idx = -1;
+
+ switch (group_id) {
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_RX:
+ gp_idx = IDX_GROUP_SECONDARY_MI2S_RX;
+ break;
+ case AFE_GROUP_DEVICE_ID_SECONDARY_MI2S_TX:
+ gp_idx = IDX_GROUP_SECONDARY_MI2S_TX;
+ break;
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_RX:
+ gp_idx = IDX_GROUP_TERTIARY_MI2S_RX;
+ break;
+ case AFE_GROUP_DEVICE_ID_TERTIARY_MI2S_TX:
+ gp_idx = IDX_GROUP_TERTIARY_MI2S_TX;
+ break;
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_RX:
+ gp_idx = IDX_GROUP_QUATERNARY_MI2S_RX;
+ break;
+ case AFE_GROUP_DEVICE_ID_QUATERNARY_MI2S_TX:
+ gp_idx = IDX_GROUP_QUATERNARY_MI2S_TX;
+ break;
+ default:
+ break;
+ }
+
+ return gp_idx;
+}
+
+int afe_port_group_mi2s_enable(u16 group_id,
+ union afe_port_group_mi2s_config *afe_group_config,
+ u16 enable)
+{
+ struct afe_param_id_group_device_enable group_enable = {0};
+ struct param_hdr_v3 param_hdr = {0};
+ int ret = 0;
+ int gp_idx;
+
+ pr_debug("%s: group id: 0x%x enable: %d\n", __func__,
+ group_id, enable);
+
+ gp_idx = afe_get_mi2s_group_idx(group_id);
+
+ if ((gp_idx >= 0) && (gp_idx < IDX_GROUP_MI2S_MAX)) {
+
+ atomic_t *gp_ref = &mi2s_gp_en_ref[gp_idx];
+
+ if (enable)
+ atomic_inc(gp_ref);
+ else
+ atomic_dec(gp_ref);
+
+ if ((enable) && (atomic_read(gp_ref) > 1)) {
+ pr_err("%s: this TDM group is enabled already %d refs_cnt %d\n",
+ __func__, group_id, atomic_read(gp_ref));
+ goto rtn;
+ }
+
+ if ((!enable) && (atomic_read(gp_ref) > 0)) {
+ pr_err("%s: this TDM group will be disabled in last call %d refs_cnt %d\n",
+ __func__, group_id, atomic_read(gp_ref));
+ goto rtn;
+ }
+ }
+
+ ret = afe_q6_interface_prepare();
+ if (ret != 0) {
+ pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
+ return ret;
+ }
+
+ if (enable) {
+ ret = afe_port_group_mi2s_set_param(
+ group_id, &afe_group_config->i2s_cfg);
+ if (ret < 0) {
+ pr_err("%s: afe send failed %d\n", __func__, ret);
+ return ret;
+ }
+ }
+
+ param_hdr.module_id = AFE_MODULE_GROUP_DEVICE;
+ param_hdr.instance_id = INSTANCE_ID_0;
+ param_hdr.param_id = AFE_PARAM_ID_GROUP_DEVICE_ENABLE;
+ param_hdr.param_size = sizeof(struct afe_group_device_enable);
+ group_enable.group_id = group_id;
+ group_enable.enable = enable;
+
+ ret = q6afe_svc_pack_and_set_param_in_band(IDX_GLOBAL_CFG, param_hdr,
+ (u8 *) &group_enable);
+ if (ret)
+ pr_err("%s: AFE_PARAM_ID_GROUP_DEVICE_ENABLE failed %d\n",
+ __func__, ret);
+
+rtn:
+ return ret;
+}
+
int afe_port_group_enable(u16 group_id,
union afe_port_group_config *afe_group_config,
u16 enable)
diff --git a/sound/soc/msm/qdsp6v2/q6audio-v2.c b/sound/soc/msm/qdsp6v2/q6audio-v2.c
index 0062e4cd6432..94a6b0c42dee 100644
--- a/sound/soc/msm/qdsp6v2/q6audio-v2.c
+++ b/sound/soc/msm/qdsp6v2/q6audio-v2.c
@@ -95,6 +95,54 @@ int q6audio_get_port_index(u16 port_id)
return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX;
case AFE_PORT_ID_TERTIARY_MI2S_TX:
return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_TX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_TX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_TX_4;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ return IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ return IDX_AFE_PORT_ID_TERTIARY_MI2S_RX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ return IDX_AFE_PORT_ID_QUATERNARY_MI2S_RX_4;
case AUDIO_PORT_ID_I2S_RX:
return IDX_AUDIO_PORT_ID_I2S_RX;
case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1:
@@ -342,6 +390,54 @@ int q6audio_get_port_id(u16 port_id)
return AFE_PORT_ID_TERTIARY_MI2S_RX;
case AFE_PORT_ID_TERTIARY_MI2S_TX:
return AFE_PORT_ID_TERTIARY_MI2S_TX;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ return AFE_PORT_ID_SECONDARY_MI2S_TX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ return AFE_PORT_ID_SECONDARY_MI2S_TX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ return AFE_PORT_ID_SECONDARY_MI2S_TX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ return AFE_PORT_ID_SECONDARY_MI2S_TX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ return AFE_PORT_ID_TERTIARY_MI2S_TX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ return AFE_PORT_ID_TERTIARY_MI2S_TX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ return AFE_PORT_ID_TERTIARY_MI2S_TX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ return AFE_PORT_ID_TERTIARY_MI2S_TX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ return AFE_PORT_ID_QUATERNARY_MI2S_TX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ return AFE_PORT_ID_QUATERNARY_MI2S_TX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ return AFE_PORT_ID_QUATERNARY_MI2S_TX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
+ return AFE_PORT_ID_QUATERNARY_MI2S_TX_4;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ return AFE_PORT_ID_SECONDARY_MI2S_RX_1;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ return AFE_PORT_ID_SECONDARY_MI2S_RX_2;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ return AFE_PORT_ID_SECONDARY_MI2S_RX_3;
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ return AFE_PORT_ID_SECONDARY_MI2S_RX_4;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ return AFE_PORT_ID_TERTIARY_MI2S_RX_1;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ return AFE_PORT_ID_TERTIARY_MI2S_RX_2;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ return AFE_PORT_ID_TERTIARY_MI2S_RX_3;
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ return AFE_PORT_ID_TERTIARY_MI2S_RX_4;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ return AFE_PORT_ID_QUATERNARY_MI2S_RX_1;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ return AFE_PORT_ID_QUATERNARY_MI2S_RX_2;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ return AFE_PORT_ID_QUATERNARY_MI2S_RX_3;
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ return AFE_PORT_ID_QUATERNARY_MI2S_RX_4;
case AUDIO_PORT_ID_I2S_RX:
return AUDIO_PORT_ID_I2S_RX;
case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1:
@@ -642,6 +738,30 @@ int q6audio_is_digital_pcm_interface(u16 port_id)
case AFE_PORT_ID_INT5_MI2S_TX:
case AFE_PORT_ID_INT6_MI2S_RX:
case AFE_PORT_ID_INT6_MI2S_TX:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
break;
default:
ret = -EINVAL;
@@ -795,6 +915,30 @@ int q6audio_validate_port(u16 port_id)
case AFE_PORT_ID_INT6_MI2S_RX:
case AFE_PORT_ID_INT6_MI2S_TX:
case AFE_PORT_ID_MULTICHAN_HDMI_RX:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_RX_4:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_1:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_2:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_3:
+ case AFE_PORT_ID_SECONDARY_MI2S_TX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_RX_4:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_1:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_2:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_3:
+ case AFE_PORT_ID_TERTIARY_MI2S_TX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_RX_4:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_1:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_2:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_3:
+ case AFE_PORT_ID_QUATERNARY_MI2S_TX_4:
{
ret = 0;
break;