xref: /openbmc/linux/sound/soc/qcom/qdsp6/q6routing.c (revision 816ffd28002651a469e86d1118a225862e392ecd)
1e3a33673SSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0
2e3a33673SSrinivas Kandagatla // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
3e3a33673SSrinivas Kandagatla // Copyright (c) 2018, Linaro Limited
4e3a33673SSrinivas Kandagatla 
5e3a33673SSrinivas Kandagatla #include <linux/init.h>
6e3a33673SSrinivas Kandagatla #include <linux/err.h>
7e3a33673SSrinivas Kandagatla #include <linux/module.h>
8e3a33673SSrinivas Kandagatla #include <linux/platform_device.h>
9e3a33673SSrinivas Kandagatla #include <linux/of_platform.h>
10e3a33673SSrinivas Kandagatla #include <linux/bitops.h>
11e3a33673SSrinivas Kandagatla #include <linux/mutex.h>
12e3a33673SSrinivas Kandagatla #include <linux/of_device.h>
13e3a33673SSrinivas Kandagatla #include <linux/slab.h>
14e3a33673SSrinivas Kandagatla #include <sound/core.h>
15e3a33673SSrinivas Kandagatla #include <sound/soc.h>
16e3a33673SSrinivas Kandagatla #include <sound/soc-dapm.h>
17e3a33673SSrinivas Kandagatla #include <sound/pcm.h>
18e3a33673SSrinivas Kandagatla #include <sound/control.h>
19e3a33673SSrinivas Kandagatla #include <sound/asound.h>
20e3a33673SSrinivas Kandagatla #include <sound/pcm_params.h>
21e3a33673SSrinivas Kandagatla #include "q6afe.h"
22e3a33673SSrinivas Kandagatla #include "q6asm.h"
23e3a33673SSrinivas Kandagatla #include "q6adm.h"
24e3a33673SSrinivas Kandagatla #include "q6routing.h"
25e3a33673SSrinivas Kandagatla 
26e3a33673SSrinivas Kandagatla #define DRV_NAME "q6routing-component"
27e3a33673SSrinivas Kandagatla 
289131c3a5SSrinivas Kandagatla #define Q6ROUTING_RX_MIXERS(id)						\
299131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia1", id,				\
309131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\
319131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
329131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia2", id,				\
339131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\
349131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
359131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia3", id,				\
369131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\
379131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
389131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia4", id,				\
399131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\
409131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
419131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia5", id,				\
429131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\
439131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
449131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia6", id,				\
459131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\
469131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
479131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia7", id,				\
489131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\
499131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),					\
509131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("MultiMedia8", id,				\
519131c3a5SSrinivas Kandagatla 	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\
529131c3a5SSrinivas Kandagatla 	msm_routing_put_audio_mixer),
539131c3a5SSrinivas Kandagatla 
549131c3a5SSrinivas Kandagatla #define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s)	\
559131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia1", "MM_DL1" },	\
569131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia2", "MM_DL2" },	\
579131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia3", "MM_DL3" },	\
589131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia4", "MM_DL4" },	\
599131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia5", "MM_DL5" },	\
609131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia6", "MM_DL6" },	\
619131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia7", "MM_DL7" },	\
629131c3a5SSrinivas Kandagatla 	{ mix_name, "MultiMedia8", "MM_DL8" },	\
639131c3a5SSrinivas Kandagatla 	{ s, NULL, mix_name }
649131c3a5SSrinivas Kandagatla 
659131c3a5SSrinivas Kandagatla #define Q6ROUTING_TX_DAPM_ROUTE(mix_name)		\
669131c3a5SSrinivas Kandagatla 	{ mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" },	\
679131c3a5SSrinivas Kandagatla 	{ mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" },	\
689131c3a5SSrinivas Kandagatla 	{ mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" },	\
6935f78d02SGabriel David 	{ mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" },	\
70a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" },		\
719191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" },		\
729191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" },		\
739191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" },		\
749191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" },		\
759191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" },		\
769191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" },		\
779191ffe2SSrinivas Kandagatla 	{ mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" },		\
78a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"},	\
79a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"},	\
80a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"},	\
81a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"},	\
82a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"},	\
83a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"},	\
84a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"},	\
85a303b7a6SSrinivas Kandagatla 	{ mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"},	\
86a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"},		\
87a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"},		\
88a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"},		\
89a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"},		\
90a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"},		\
91a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"},		\
92a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"},		\
93a303b7a6SSrinivas Kandagatla 	{ mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"},		\
94a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"},		\
95a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"},		\
96a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"},		\
97a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"},		\
98a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"},		\
99a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"},		\
100a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"},		\
101a303b7a6SSrinivas Kandagatla 	{ mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"},		\
102a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},		\
103a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},		\
104a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},		\
105a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},		\
106a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"},		\
107a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"},		\
108a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"},		\
109a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},		\
110a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},		\
111a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},		\
112a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},		\
113a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},		\
114a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"},		\
115a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"},		\
116a303b7a6SSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"},		\
117825492cbSSrinivas Kandagatla 	{ mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},		\
118825492cbSSrinivas Kandagatla 	{ mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"},	\
119825492cbSSrinivas Kandagatla 	{ mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"},	\
120825492cbSSrinivas Kandagatla 	{ mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"},	\
121825492cbSSrinivas Kandagatla 	{ mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"},	\
122825492cbSSrinivas Kandagatla 	{ mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"},	\
123825492cbSSrinivas Kandagatla 	{ mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"},	\
124825492cbSSrinivas Kandagatla 	{ mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"},	\
125825492cbSSrinivas Kandagatla 	{ mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"},	\
126825492cbSSrinivas Kandagatla 	{ mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"},	\
127825492cbSSrinivas Kandagatla 	{ mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"},	\
128825492cbSSrinivas Kandagatla 	{ mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"},	\
129825492cbSSrinivas Kandagatla 	{ mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
1309131c3a5SSrinivas Kandagatla 
1319131c3a5SSrinivas Kandagatla #define Q6ROUTING_TX_MIXERS(id)						\
1329131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX,			\
1339131c3a5SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1349131c3a5SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1359131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX,		\
1369131c3a5SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1379131c3a5SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1389131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX,		\
1399131c3a5SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1409131c3a5SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1419131c3a5SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX,		\
1429131c3a5SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
143a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
14435f78d02SGabriel David 	SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX,			\
14535f78d02SGabriel David 		id, 1, 0, msm_routing_get_audio_mixer,			\
14635f78d02SGabriel David 		msm_routing_put_audio_mixer),				\
1479191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX,			\
1489191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1499191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1509191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX,			\
1519191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1529191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1539191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX,			\
1549191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1559191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1569191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX,			\
1579191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1589191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1599191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX,			\
1609191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1619191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1629191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX,			\
1639191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1649191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
1659191ffe2SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX,			\
1669191ffe2SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
1679191ffe2SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
168a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0,		\
169a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
170a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
171a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1,		\
172a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
173a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
174a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2,		\
175a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
176a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
177a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3,		\
178a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
179a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
180a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4,		\
181a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
182a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
183a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5,		\
184a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
185a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
186a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6,		\
187a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
188a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
189a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7,		\
190a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
191a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
192a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0,		\
193a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
194a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
195a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1,		\
196a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
197a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
198a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2,		\
199a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
200a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
201a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3,		\
202a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
203a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
204a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4,		\
205a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
206a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
207a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5,		\
208a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
209a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
210a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6,		\
211a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
212a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
213a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7,		\
214a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
215a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
216a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0,		\
217a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
218a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
219a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1,		\
220a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
221a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
222a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2,		\
223a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
224a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
225a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3,		\
226a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
227a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
228a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4,		\
229a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
230a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
231a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5,		\
232a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
233a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
234a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6,		\
235a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
236a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
237a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7,		\
238a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
239a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
240a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0,		\
241a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
242a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
243a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1,		\
244a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
245a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
246a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2,		\
247a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
248a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
249a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3,		\
250a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
251a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
252a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4,		\
253a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
254a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
255a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5,		\
256a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
257a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
258a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6,		\
259a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
260a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
261a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7,		\
262a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
263a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
264a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0,		\
265a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
266a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
267a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1,		\
268a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
269a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
270a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2,		\
271a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
272a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
273a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3,		\
274a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
275a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
276a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4,		\
277a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
278a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
279a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5,		\
280a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
281a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
282a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6,		\
283a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
284a303b7a6SSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
285a303b7a6SSrinivas Kandagatla 	SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7,		\
286a303b7a6SSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
287825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
288825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0,	\
289825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
290825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
291825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1,	\
292825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
293825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
294825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2,	\
295825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
296825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
297825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0,		\
298825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
299825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
300825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1,		\
301825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
302825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
303825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2,		\
304825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
305825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
306825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0,		\
307825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
308825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
309825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1,		\
310825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
311825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
312825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2,		\
313825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
314825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
315825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3,		\
316825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
317825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
318825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4,		\
319825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
320825492cbSSrinivas Kandagatla 		msm_routing_put_audio_mixer),				\
321825492cbSSrinivas Kandagatla 	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5,		\
322825492cbSSrinivas Kandagatla 		id, 1, 0, msm_routing_get_audio_mixer,			\
3239131c3a5SSrinivas Kandagatla 		msm_routing_put_audio_mixer),
3249131c3a5SSrinivas Kandagatla 
325e3a33673SSrinivas Kandagatla struct session_data {
326e3a33673SSrinivas Kandagatla 	int state;
327e3a33673SSrinivas Kandagatla 	int port_id;
328e3a33673SSrinivas Kandagatla 	int path_type;
329e3a33673SSrinivas Kandagatla 	int app_type;
330e3a33673SSrinivas Kandagatla 	int acdb_id;
331e3a33673SSrinivas Kandagatla 	int sample_rate;
332e3a33673SSrinivas Kandagatla 	int bits_per_sample;
333e3a33673SSrinivas Kandagatla 	int channels;
334e3a33673SSrinivas Kandagatla 	int perf_mode;
335e3a33673SSrinivas Kandagatla 	int numcopps;
336e3a33673SSrinivas Kandagatla 	int fedai_id;
337e3a33673SSrinivas Kandagatla 	unsigned long copp_map;
338e3a33673SSrinivas Kandagatla 	struct q6copp *copps[MAX_COPPS_PER_PORT];
339e3a33673SSrinivas Kandagatla };
340e3a33673SSrinivas Kandagatla 
341e3a33673SSrinivas Kandagatla struct msm_routing_data {
342e3a33673SSrinivas Kandagatla 	struct session_data sessions[MAX_SESSIONS];
343e3a33673SSrinivas Kandagatla 	struct session_data port_data[AFE_MAX_PORTS];
344e3a33673SSrinivas Kandagatla 	struct device *dev;
345e3a33673SSrinivas Kandagatla 	struct mutex lock;
346e3a33673SSrinivas Kandagatla };
347e3a33673SSrinivas Kandagatla 
348e3a33673SSrinivas Kandagatla static struct msm_routing_data *routing_data;
349e3a33673SSrinivas Kandagatla 
350e3a33673SSrinivas Kandagatla /**
351e3a33673SSrinivas Kandagatla  * q6routing_stream_open() - Register a new stream for route setup
352e3a33673SSrinivas Kandagatla  *
353e3a33673SSrinivas Kandagatla  * @fedai_id: Frontend dai id.
354e3a33673SSrinivas Kandagatla  * @perf_mode: Performance mode.
355e3a33673SSrinivas Kandagatla  * @stream_id: ASM stream id to map.
356e3a33673SSrinivas Kandagatla  * @stream_type: Direction of stream
357e3a33673SSrinivas Kandagatla  *
358e3a33673SSrinivas Kandagatla  * Return: Will be an negative on error or a zero on success.
359e3a33673SSrinivas Kandagatla  */
q6routing_stream_open(int fedai_id,int perf_mode,int stream_id,int stream_type)360e3a33673SSrinivas Kandagatla int q6routing_stream_open(int fedai_id, int perf_mode,
361e3a33673SSrinivas Kandagatla 			   int stream_id, int stream_type)
362e3a33673SSrinivas Kandagatla {
363e3a33673SSrinivas Kandagatla 	int j, topology, num_copps = 0;
364e3a33673SSrinivas Kandagatla 	struct route_payload payload;
365e3a33673SSrinivas Kandagatla 	struct q6copp *copp;
366e3a33673SSrinivas Kandagatla 	int copp_idx;
367e3a33673SSrinivas Kandagatla 	struct session_data *session, *pdata;
368e3a33673SSrinivas Kandagatla 
369e3a33673SSrinivas Kandagatla 	if (!routing_data) {
370e3a33673SSrinivas Kandagatla 		pr_err("Routing driver not yet ready\n");
371e3a33673SSrinivas Kandagatla 		return -EINVAL;
372e3a33673SSrinivas Kandagatla 	}
373e3a33673SSrinivas Kandagatla 
374e3a33673SSrinivas Kandagatla 	session = &routing_data->sessions[stream_id - 1];
3756712c2e1SSrinivas Kandagatla 	if (session->port_id < 0) {
3766712c2e1SSrinivas Kandagatla 		dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n",
3776712c2e1SSrinivas Kandagatla 			session->fedai_id);
3786712c2e1SSrinivas Kandagatla 		return -EINVAL;
3796712c2e1SSrinivas Kandagatla 	}
3806712c2e1SSrinivas Kandagatla 
381e3a33673SSrinivas Kandagatla 	pdata = &routing_data->port_data[session->port_id];
382e3a33673SSrinivas Kandagatla 
383e3a33673SSrinivas Kandagatla 	mutex_lock(&routing_data->lock);
384e3a33673SSrinivas Kandagatla 	session->fedai_id = fedai_id;
385e3a33673SSrinivas Kandagatla 
386e3a33673SSrinivas Kandagatla 	session->path_type = pdata->path_type;
387e3a33673SSrinivas Kandagatla 	session->sample_rate = pdata->sample_rate;
388e3a33673SSrinivas Kandagatla 	session->channels = pdata->channels;
389e3a33673SSrinivas Kandagatla 	session->bits_per_sample = pdata->bits_per_sample;
390e3a33673SSrinivas Kandagatla 
391e3a33673SSrinivas Kandagatla 	payload.num_copps = 0; /* only RX needs to use payload */
392e3a33673SSrinivas Kandagatla 	topology = NULL_COPP_TOPOLOGY;
393e3a33673SSrinivas Kandagatla 	copp = q6adm_open(routing_data->dev, session->port_id,
394e3a33673SSrinivas Kandagatla 			      session->path_type, session->sample_rate,
395e3a33673SSrinivas Kandagatla 			      session->channels, topology, perf_mode,
396e3a33673SSrinivas Kandagatla 			      session->bits_per_sample, 0, 0);
397e3a33673SSrinivas Kandagatla 
398972562f7SSrinivas Kandagatla 	if (IS_ERR_OR_NULL(copp)) {
399e3a33673SSrinivas Kandagatla 		mutex_unlock(&routing_data->lock);
400e3a33673SSrinivas Kandagatla 		return -EINVAL;
401e3a33673SSrinivas Kandagatla 	}
402e3a33673SSrinivas Kandagatla 
403e3a33673SSrinivas Kandagatla 	copp_idx = q6adm_get_copp_id(copp);
404e3a33673SSrinivas Kandagatla 	set_bit(copp_idx, &session->copp_map);
405e3a33673SSrinivas Kandagatla 	session->copps[copp_idx] = copp;
406e3a33673SSrinivas Kandagatla 
407e3a33673SSrinivas Kandagatla 	for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) {
408e3a33673SSrinivas Kandagatla 		payload.port_id[num_copps] = session->port_id;
409e3a33673SSrinivas Kandagatla 		payload.copp_idx[num_copps] = j;
410e3a33673SSrinivas Kandagatla 		num_copps++;
411e3a33673SSrinivas Kandagatla 	}
412e3a33673SSrinivas Kandagatla 
413e3a33673SSrinivas Kandagatla 	if (num_copps) {
414e3a33673SSrinivas Kandagatla 		payload.num_copps = num_copps;
415e3a33673SSrinivas Kandagatla 		payload.session_id = stream_id;
416e3a33673SSrinivas Kandagatla 		q6adm_matrix_map(routing_data->dev, session->path_type,
417e3a33673SSrinivas Kandagatla 				 payload, perf_mode);
418e3a33673SSrinivas Kandagatla 	}
419e3a33673SSrinivas Kandagatla 	mutex_unlock(&routing_data->lock);
420e3a33673SSrinivas Kandagatla 
421e3a33673SSrinivas Kandagatla 	return 0;
422e3a33673SSrinivas Kandagatla }
423e3a33673SSrinivas Kandagatla EXPORT_SYMBOL_GPL(q6routing_stream_open);
424e3a33673SSrinivas Kandagatla 
get_session_from_id(struct msm_routing_data * data,int fedai_id)425e3a33673SSrinivas Kandagatla static struct session_data *get_session_from_id(struct msm_routing_data *data,
426e3a33673SSrinivas Kandagatla 						int fedai_id)
427e3a33673SSrinivas Kandagatla {
428e3a33673SSrinivas Kandagatla 	int i;
429e3a33673SSrinivas Kandagatla 
430e3a33673SSrinivas Kandagatla 	for (i = 0; i < MAX_SESSIONS; i++) {
431e3a33673SSrinivas Kandagatla 		if (fedai_id == data->sessions[i].fedai_id)
432e3a33673SSrinivas Kandagatla 			return &data->sessions[i];
433e3a33673SSrinivas Kandagatla 	}
434e3a33673SSrinivas Kandagatla 
435e3a33673SSrinivas Kandagatla 	return NULL;
436e3a33673SSrinivas Kandagatla }
437e3a33673SSrinivas Kandagatla /**
438e3a33673SSrinivas Kandagatla  * q6routing_stream_close() - Deregister a stream
439e3a33673SSrinivas Kandagatla  *
440e3a33673SSrinivas Kandagatla  * @fedai_id: Frontend dai id.
441e3a33673SSrinivas Kandagatla  * @stream_type: Direction of stream
442e3a33673SSrinivas Kandagatla  *
443e3a33673SSrinivas Kandagatla  * Return: Will be an negative on error or a zero on success.
444e3a33673SSrinivas Kandagatla  */
q6routing_stream_close(int fedai_id,int stream_type)445e3a33673SSrinivas Kandagatla void q6routing_stream_close(int fedai_id, int stream_type)
446e3a33673SSrinivas Kandagatla {
447e3a33673SSrinivas Kandagatla 	struct session_data *session;
448e3a33673SSrinivas Kandagatla 	int idx;
449e3a33673SSrinivas Kandagatla 
450e3a33673SSrinivas Kandagatla 	session = get_session_from_id(routing_data, fedai_id);
451e3a33673SSrinivas Kandagatla 	if (!session)
452e3a33673SSrinivas Kandagatla 		return;
453e3a33673SSrinivas Kandagatla 
454e3a33673SSrinivas Kandagatla 	for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) {
455e3a33673SSrinivas Kandagatla 		if (session->copps[idx]) {
456e3a33673SSrinivas Kandagatla 			q6adm_close(routing_data->dev, session->copps[idx]);
457e3a33673SSrinivas Kandagatla 			session->copps[idx] = NULL;
458e3a33673SSrinivas Kandagatla 		}
459e3a33673SSrinivas Kandagatla 	}
460e3a33673SSrinivas Kandagatla 
461e3a33673SSrinivas Kandagatla 	session->fedai_id = -1;
462e3a33673SSrinivas Kandagatla 	session->copp_map = 0;
463e3a33673SSrinivas Kandagatla }
464e3a33673SSrinivas Kandagatla EXPORT_SYMBOL_GPL(q6routing_stream_close);
465e3a33673SSrinivas Kandagatla 
msm_routing_get_audio_mixer(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)466e3a33673SSrinivas Kandagatla static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
467e3a33673SSrinivas Kandagatla 				       struct snd_ctl_elem_value *ucontrol)
468e3a33673SSrinivas Kandagatla {
469e3a33673SSrinivas Kandagatla 	struct snd_soc_dapm_context *dapm =
470e3a33673SSrinivas Kandagatla 	    snd_soc_dapm_kcontrol_dapm(kcontrol);
471e3a33673SSrinivas Kandagatla 	struct soc_mixer_control *mc =
472e3a33673SSrinivas Kandagatla 	    (struct soc_mixer_control *)kcontrol->private_value;
473e3a33673SSrinivas Kandagatla 	int session_id = mc->shift;
474e3a33673SSrinivas Kandagatla 	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
475e3a33673SSrinivas Kandagatla 	struct msm_routing_data *priv = dev_get_drvdata(c->dev);
476e3a33673SSrinivas Kandagatla 	struct session_data *session = &priv->sessions[session_id];
477e3a33673SSrinivas Kandagatla 
478e3a33673SSrinivas Kandagatla 	if (session->port_id == mc->reg)
479e3a33673SSrinivas Kandagatla 		ucontrol->value.integer.value[0] = 1;
480e3a33673SSrinivas Kandagatla 	else
481e3a33673SSrinivas Kandagatla 		ucontrol->value.integer.value[0] = 0;
482e3a33673SSrinivas Kandagatla 
483e3a33673SSrinivas Kandagatla 	return 0;
484e3a33673SSrinivas Kandagatla }
485e3a33673SSrinivas Kandagatla 
msm_routing_put_audio_mixer(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)486e3a33673SSrinivas Kandagatla static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
487e3a33673SSrinivas Kandagatla 				       struct snd_ctl_elem_value *ucontrol)
488e3a33673SSrinivas Kandagatla {
489e3a33673SSrinivas Kandagatla 	struct snd_soc_dapm_context *dapm =
490e3a33673SSrinivas Kandagatla 				    snd_soc_dapm_kcontrol_dapm(kcontrol);
491e3a33673SSrinivas Kandagatla 	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
492e3a33673SSrinivas Kandagatla 	struct msm_routing_data *data = dev_get_drvdata(c->dev);
493e3a33673SSrinivas Kandagatla 	struct soc_mixer_control *mc =
494e3a33673SSrinivas Kandagatla 		    (struct soc_mixer_control *)kcontrol->private_value;
495e3a33673SSrinivas Kandagatla 	struct snd_soc_dapm_update *update = NULL;
496e3a33673SSrinivas Kandagatla 	int be_id = mc->reg;
497e3a33673SSrinivas Kandagatla 	int session_id = mc->shift;
498e3a33673SSrinivas Kandagatla 	struct session_data *session = &data->sessions[session_id];
499e3a33673SSrinivas Kandagatla 
500e3a33673SSrinivas Kandagatla 	if (ucontrol->value.integer.value[0]) {
5014739d88aSSrinivas Kandagatla 		if (session->port_id == be_id)
5024739d88aSSrinivas Kandagatla 			return 0;
5034739d88aSSrinivas Kandagatla 
504e3a33673SSrinivas Kandagatla 		session->port_id = be_id;
505e3a33673SSrinivas Kandagatla 		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
506e3a33673SSrinivas Kandagatla 	} else {
5074739d88aSSrinivas Kandagatla 		if (session->port_id == -1 || session->port_id != be_id)
508861afeacSSrinivas Kandagatla 			return 0;
509861afeacSSrinivas Kandagatla 
5104739d88aSSrinivas Kandagatla 		session->port_id = -1;
511e3a33673SSrinivas Kandagatla 		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
512e3a33673SSrinivas Kandagatla 	}
513e3a33673SSrinivas Kandagatla 
514e3a33673SSrinivas Kandagatla 	return 1;
515e3a33673SSrinivas Kandagatla }
516e3a33673SSrinivas Kandagatla 
517e3a33673SSrinivas Kandagatla static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
5189131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(HDMI_RX) };
519e3a33673SSrinivas Kandagatla 
5200718f87bSRohit kumar static const struct snd_kcontrol_new display_port_mixer_controls[] = {
5210718f87bSRohit kumar 	Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
5220718f87bSRohit kumar 
523c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
5249131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
525c8add3fdSSrinivas Kandagatla 
526c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
5279131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
528c8add3fdSSrinivas Kandagatla 
529c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
5309131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
531c8add3fdSSrinivas Kandagatla 
53235f78d02SGabriel David static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
53335f78d02SGabriel David 	Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
53435f78d02SGabriel David 
535c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
5369131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
537c8add3fdSSrinivas Kandagatla 
538794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
5399131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
540794fe039SSrinivas Kandagatla 
541794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
5429131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
543794fe039SSrinivas Kandagatla 
544794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
5459131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
546794fe039SSrinivas Kandagatla 
547794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
5489131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
549794fe039SSrinivas Kandagatla 
550794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
5519131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
552794fe039SSrinivas Kandagatla 
553794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
5549131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
555794fe039SSrinivas Kandagatla 
556794fe039SSrinivas Kandagatla static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
5579131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
558794fe039SSrinivas Kandagatla 
559a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
560a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
561a303b7a6SSrinivas Kandagatla 
562a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
563a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
564a303b7a6SSrinivas Kandagatla 
565a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
566a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
567a303b7a6SSrinivas Kandagatla 
568a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
569a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
570a303b7a6SSrinivas Kandagatla 
571a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
572a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
573a303b7a6SSrinivas Kandagatla 
574a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
575a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
576a303b7a6SSrinivas Kandagatla 
577a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
578a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
579a303b7a6SSrinivas Kandagatla 
580a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
581a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
582a303b7a6SSrinivas Kandagatla 
583a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
584a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
585a303b7a6SSrinivas Kandagatla 
586a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
587a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
588a303b7a6SSrinivas Kandagatla 
589a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
590a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
591a303b7a6SSrinivas Kandagatla 
592a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
593a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
594a303b7a6SSrinivas Kandagatla 
595a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
596a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
597a303b7a6SSrinivas Kandagatla 
598a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
599a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
600a303b7a6SSrinivas Kandagatla 
601a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
602a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
603a303b7a6SSrinivas Kandagatla 
604a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
605a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
606a303b7a6SSrinivas Kandagatla 
607a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
608a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
609a303b7a6SSrinivas Kandagatla 
610a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
611a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
612a303b7a6SSrinivas Kandagatla 
613a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
614a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
615a303b7a6SSrinivas Kandagatla 
616a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
617a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
618a303b7a6SSrinivas Kandagatla 
619a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
620a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
621a303b7a6SSrinivas Kandagatla 
622a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
623a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
624a303b7a6SSrinivas Kandagatla 
625a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
626a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
627a303b7a6SSrinivas Kandagatla 
628a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
629a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
630a303b7a6SSrinivas Kandagatla 
631a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
632a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
633a303b7a6SSrinivas Kandagatla 
634a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
635a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
636a303b7a6SSrinivas Kandagatla 
637a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
638a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
639a303b7a6SSrinivas Kandagatla 
640a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
641a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
642a303b7a6SSrinivas Kandagatla 
643a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
644a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
645a303b7a6SSrinivas Kandagatla 
646a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
647a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
648a303b7a6SSrinivas Kandagatla 
649a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
650a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
651a303b7a6SSrinivas Kandagatla 
652a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
653a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
654a303b7a6SSrinivas Kandagatla 
655a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
656a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
657a303b7a6SSrinivas Kandagatla 
658a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
659a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
660a303b7a6SSrinivas Kandagatla 
661a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
662a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
663a303b7a6SSrinivas Kandagatla 
664a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
665a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
666a303b7a6SSrinivas Kandagatla 
667a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
668a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
669a303b7a6SSrinivas Kandagatla 
670a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
671a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
672a303b7a6SSrinivas Kandagatla 
673a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
674a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
675a303b7a6SSrinivas Kandagatla 
676a303b7a6SSrinivas Kandagatla static const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
677a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
678a303b7a6SSrinivas Kandagatla 
679825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
680825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
681825492cbSSrinivas Kandagatla 
682825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
683825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
684825492cbSSrinivas Kandagatla 
685825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
686825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
687825492cbSSrinivas Kandagatla 
688825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
689825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
690825492cbSSrinivas Kandagatla 
691825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
692825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
693825492cbSSrinivas Kandagatla 
694825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
695825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
696825492cbSSrinivas Kandagatla 
697825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
698825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
699825492cbSSrinivas Kandagatla 
700825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
701825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
702825492cbSSrinivas Kandagatla 
703825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
704825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
705825492cbSSrinivas Kandagatla 
706825492cbSSrinivas Kandagatla static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
707825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
708825492cbSSrinivas Kandagatla 
709a303b7a6SSrinivas Kandagatla 
710c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
7119131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
712c8add3fdSSrinivas Kandagatla 
713c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
7149131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
715c8add3fdSSrinivas Kandagatla 
716c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
7179131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
718c8add3fdSSrinivas Kandagatla 
719c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
7209131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
721c8add3fdSSrinivas Kandagatla 
722c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
7239131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
724c8add3fdSSrinivas Kandagatla 
725c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
7269131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
727c8add3fdSSrinivas Kandagatla 
728c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul7_mixer_controls[] = {
7299131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
730c8add3fdSSrinivas Kandagatla 
731c8add3fdSSrinivas Kandagatla static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
7329131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
733c8add3fdSSrinivas Kandagatla 
734e3a33673SSrinivas Kandagatla static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
735e3a33673SSrinivas Kandagatla 	/* Mixer definitions */
736e3a33673SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
737e3a33673SSrinivas Kandagatla 			   hdmi_mixer_controls,
738e3a33673SSrinivas Kandagatla 			   ARRAY_SIZE(hdmi_mixer_controls)),
739794fe039SSrinivas Kandagatla 
7400718f87bSRohit kumar 	SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
7410718f87bSRohit kumar 			   display_port_mixer_controls,
7420718f87bSRohit kumar 			   ARRAY_SIZE(display_port_mixer_controls)),
7430718f87bSRohit kumar 
744794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
745794fe039SSrinivas Kandagatla 			   slimbus_rx_mixer_controls,
746794fe039SSrinivas Kandagatla 			   ARRAY_SIZE(slimbus_rx_mixer_controls)),
747794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
748794fe039SSrinivas Kandagatla 			   slimbus_1_rx_mixer_controls,
749794fe039SSrinivas Kandagatla 			   ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
750794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
751794fe039SSrinivas Kandagatla 			   slimbus_2_rx_mixer_controls,
752794fe039SSrinivas Kandagatla 			   ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
753794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
754794fe039SSrinivas Kandagatla 			   slimbus_3_rx_mixer_controls,
755794fe039SSrinivas Kandagatla 			   ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
756794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
757794fe039SSrinivas Kandagatla 			   slimbus_4_rx_mixer_controls,
758794fe039SSrinivas Kandagatla 			   ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
759794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
760794fe039SSrinivas Kandagatla 			   slimbus_5_rx_mixer_controls,
761794fe039SSrinivas Kandagatla 			    ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
762794fe039SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
763794fe039SSrinivas Kandagatla 			   slimbus_6_rx_mixer_controls,
764794fe039SSrinivas Kandagatla 			   ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
765c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
766c8add3fdSSrinivas Kandagatla 			   primary_mi2s_rx_mixer_controls,
767c8add3fdSSrinivas Kandagatla 			   ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
768c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
769c8add3fdSSrinivas Kandagatla 			   secondary_mi2s_rx_mixer_controls,
770c8add3fdSSrinivas Kandagatla 			   ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
771c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
772c8add3fdSSrinivas Kandagatla 			   quaternary_mi2s_rx_mixer_controls,
773c8add3fdSSrinivas Kandagatla 			   ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
77435f78d02SGabriel David 	SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
77535f78d02SGabriel David 			   quinary_mi2s_rx_mixer_controls,
77635f78d02SGabriel David 			   ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
777c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
778c8add3fdSSrinivas Kandagatla 			   tertiary_mi2s_rx_mixer_controls,
779c8add3fdSSrinivas Kandagatla 			   ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
780a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
781a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_0_mixer_controls,
782a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
783a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
784a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_1_mixer_controls,
785a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
786a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
787a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_2_mixer_controls,
788a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
789a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
790a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_3_mixer_controls,
791a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
792a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
793a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_4_mixer_controls,
794a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
795a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
796a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_5_mixer_controls,
797a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
798a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
799a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_6_mixer_controls,
800a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
801a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
802a303b7a6SSrinivas Kandagatla 				pri_tdm_rx_7_mixer_controls,
803a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
804a303b7a6SSrinivas Kandagatla 
805a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
806a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_0_mixer_controls,
807a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
808a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
809a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_1_mixer_controls,
810a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
811a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
812a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_2_mixer_controls,
813a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
814a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
815a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_3_mixer_controls,
816a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
817a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
818a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_4_mixer_controls,
819a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
820a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
821a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_5_mixer_controls,
822a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
823a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
824a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_6_mixer_controls,
825a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
826a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
827a303b7a6SSrinivas Kandagatla 				sec_tdm_rx_7_mixer_controls,
828a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
829a303b7a6SSrinivas Kandagatla 
830a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
831a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_0_mixer_controls,
832a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
833a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
834a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_1_mixer_controls,
835a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
836a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
837a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_2_mixer_controls,
838a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
839a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
840a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_3_mixer_controls,
841a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
842a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
843a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_4_mixer_controls,
844a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
845a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
846a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_5_mixer_controls,
847a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
848a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
849a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_6_mixer_controls,
850a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
851a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
852a303b7a6SSrinivas Kandagatla 				tert_tdm_rx_7_mixer_controls,
853a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
854a303b7a6SSrinivas Kandagatla 
855a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
856a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_0_mixer_controls,
857a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
858a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
859a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_1_mixer_controls,
860a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
861a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
862a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_2_mixer_controls,
863a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
864a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
865a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_3_mixer_controls,
866a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
867a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
868a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_4_mixer_controls,
869a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
870a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
871a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_5_mixer_controls,
872a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
873a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
874a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_6_mixer_controls,
875a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
876a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
877a303b7a6SSrinivas Kandagatla 				quat_tdm_rx_7_mixer_controls,
878a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
879a303b7a6SSrinivas Kandagatla 
880a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
881a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_0_mixer_controls,
882a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
883a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
884a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_1_mixer_controls,
885a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
886a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
887a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_2_mixer_controls,
888a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
889a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
890a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_3_mixer_controls,
891a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
892a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
893a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_4_mixer_controls,
894a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
895a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
896a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_5_mixer_controls,
897a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
898a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
899a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_6_mixer_controls,
900a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
901a303b7a6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
902a303b7a6SSrinivas Kandagatla 				quin_tdm_rx_7_mixer_controls,
903a303b7a6SSrinivas Kandagatla 				ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
904825492cbSSrinivas Kandagatla 
905825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
906825492cbSSrinivas Kandagatla 		wsa_codec_dma_rx_0_mixer_controls,
907825492cbSSrinivas Kandagatla 		ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
908825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
909825492cbSSrinivas Kandagatla 		wsa_codec_dma_rx_1_mixer_controls,
910825492cbSSrinivas Kandagatla 		ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
911825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
912825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_0_mixer_controls,
913825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
914825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
915825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_1_mixer_controls,
916825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
917825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
918825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_2_mixer_controls,
919825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
920825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
921825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_3_mixer_controls,
922825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
923825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
924825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_4_mixer_controls,
925825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
926825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
927825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_5_mixer_controls,
928825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
929825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
930825492cbSSrinivas Kandagatla 		rxcodec_dma_rx_6_mixer_controls,
931825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
932825492cbSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
933825492cbSSrinivas Kandagatla 		rx_codec_dma_rx_7_mixer_controls,
934825492cbSSrinivas Kandagatla 		ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
935c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
936c8add3fdSSrinivas Kandagatla 		mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
937c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
938c8add3fdSSrinivas Kandagatla 		mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
939c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
940c8add3fdSSrinivas Kandagatla 		mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
941c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
942c8add3fdSSrinivas Kandagatla 		mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
943c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
944c8add3fdSSrinivas Kandagatla 		mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
945c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
946c8add3fdSSrinivas Kandagatla 		mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
947c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
948c8add3fdSSrinivas Kandagatla 		mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
949c8add3fdSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
950c8add3fdSSrinivas Kandagatla 		mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
951c8add3fdSSrinivas Kandagatla 
952e3a33673SSrinivas Kandagatla };
953e3a33673SSrinivas Kandagatla 
954e3a33673SSrinivas Kandagatla static const struct snd_soc_dapm_route intercon[] = {
9559131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
9560718f87bSRohit kumar 	Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
9570718f87bSRohit kumar 				"DISPLAY_PORT_RX"),
9589131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
9599131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
9609131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
9619131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
9629131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
9639131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
9649131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
9659131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
96635f78d02SGabriel David 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
9679131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
9689131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
9699131c3a5SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
970a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
971a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_0"),
972a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
973a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_1"),
974a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
975a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_2"),
976a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
977a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_3"),
978a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
979a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_4"),
980a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
981a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_5"),
982a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
983a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_6"),
984a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
985a303b7a6SSrinivas Kandagatla 				"PRIMARY_TDM_RX_7"),
986a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
987a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
988a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
989a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
990a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
991a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
992a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
993a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
994a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
995a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
996a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
997a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
998a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
999a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"),
1000a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"),
1001a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"),
1002a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"),
1003a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"),
1004a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"),
1005a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"),
1006a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"),
1007a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"),
1008a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"),
1009a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"),
1010a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"),
1011a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"),
1012a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"),
1013a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"),
1014a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"),
1015a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"),
1016a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"),
1017a303b7a6SSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"),
1018825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"),
1019825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"),
1020825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"),
1021825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"),
1022825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"),
1023825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"),
1024825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"),
1025825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"),
1026825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
1027825492cbSSrinivas Kandagatla 	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
10289131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
10299131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
10309131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
10319131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"),
10329131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"),
10339131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"),
10349131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"),
10359131c3a5SSrinivas Kandagatla 	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"),
1036c8add3fdSSrinivas Kandagatla 
1037c8add3fdSSrinivas Kandagatla 	{"MM_UL1", NULL, "MultiMedia1 Mixer"},
1038c8add3fdSSrinivas Kandagatla 	{"MM_UL2", NULL, "MultiMedia2 Mixer"},
1039c8add3fdSSrinivas Kandagatla 	{"MM_UL3", NULL, "MultiMedia3 Mixer"},
1040c8add3fdSSrinivas Kandagatla 	{"MM_UL4", NULL, "MultiMedia4 Mixer"},
1041c8add3fdSSrinivas Kandagatla 	{"MM_UL5", NULL, "MultiMedia5 Mixer"},
1042c8add3fdSSrinivas Kandagatla 	{"MM_UL6", NULL, "MultiMedia6 Mixer"},
1043c8add3fdSSrinivas Kandagatla 	{"MM_UL7", NULL, "MultiMedia7 Mixer"},
1044c8add3fdSSrinivas Kandagatla 	{"MM_UL8", NULL, "MultiMedia8 Mixer"},
1045e3a33673SSrinivas Kandagatla };
1046e3a33673SSrinivas Kandagatla 
routing_hw_params(struct snd_soc_component * component,struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)1047e198048bSKuninori Morimoto static int routing_hw_params(struct snd_soc_component *component,
1048e198048bSKuninori Morimoto 			     struct snd_pcm_substream *substream,
1049e3a33673SSrinivas Kandagatla 			     struct snd_pcm_hw_params *params)
1050e3a33673SSrinivas Kandagatla {
1051*841361d8SKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1052e198048bSKuninori Morimoto 	struct msm_routing_data *data = dev_get_drvdata(component->dev);
1053*841361d8SKuninori Morimoto 	unsigned int be_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
1054e3a33673SSrinivas Kandagatla 	struct session_data *session;
1055e3a33673SSrinivas Kandagatla 	int path_type;
1056e3a33673SSrinivas Kandagatla 
1057e3a33673SSrinivas Kandagatla 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1058e3a33673SSrinivas Kandagatla 		path_type = ADM_PATH_PLAYBACK;
1059e3a33673SSrinivas Kandagatla 	else
1060e3a33673SSrinivas Kandagatla 		path_type = ADM_PATH_LIVE_REC;
1061e3a33673SSrinivas Kandagatla 
1062090345ceSDan Carpenter 	if (be_id >= AFE_MAX_PORTS)
1063e3a33673SSrinivas Kandagatla 		return -EINVAL;
1064e3a33673SSrinivas Kandagatla 
1065e3a33673SSrinivas Kandagatla 	session = &data->port_data[be_id];
1066e3a33673SSrinivas Kandagatla 
1067e3a33673SSrinivas Kandagatla 	mutex_lock(&data->lock);
1068e3a33673SSrinivas Kandagatla 
1069e3a33673SSrinivas Kandagatla 	session->path_type = path_type;
1070e3a33673SSrinivas Kandagatla 	session->sample_rate = params_rate(params);
1071e3a33673SSrinivas Kandagatla 	session->channels = params_channels(params);
1072e3a33673SSrinivas Kandagatla 
1073e3a33673SSrinivas Kandagatla 	switch (params_format(params)) {
1074e3a33673SSrinivas Kandagatla 	case SNDRV_PCM_FORMAT_S16_LE:
1075e3a33673SSrinivas Kandagatla 			session->bits_per_sample = 16;
1076e3a33673SSrinivas Kandagatla 		break;
1077e3a33673SSrinivas Kandagatla 	case SNDRV_PCM_FORMAT_S24_LE:
1078e3a33673SSrinivas Kandagatla 			session->bits_per_sample = 24;
1079e3a33673SSrinivas Kandagatla 		break;
1080e3a33673SSrinivas Kandagatla 	default:
1081e3a33673SSrinivas Kandagatla 		break;
1082e3a33673SSrinivas Kandagatla 	}
1083e3a33673SSrinivas Kandagatla 
1084e3a33673SSrinivas Kandagatla 	mutex_unlock(&data->lock);
1085e3a33673SSrinivas Kandagatla 	return 0;
1086e3a33673SSrinivas Kandagatla }
1087e3a33673SSrinivas Kandagatla 
msm_routing_probe(struct snd_soc_component * c)1088e3a33673SSrinivas Kandagatla static int msm_routing_probe(struct snd_soc_component *c)
1089e3a33673SSrinivas Kandagatla {
1090e3a33673SSrinivas Kandagatla 	int i;
1091e3a33673SSrinivas Kandagatla 
10927aa09ff2SSrinivas Kandagatla 	for (i = 0; i < MAX_SESSIONS; i++) {
1093e3a33673SSrinivas Kandagatla 		routing_data->sessions[i].port_id = -1;
10947aa09ff2SSrinivas Kandagatla 		routing_data->sessions[i].fedai_id = -1;
10957aa09ff2SSrinivas Kandagatla 	}
1096e3a33673SSrinivas Kandagatla 
1097e3a33673SSrinivas Kandagatla 	return 0;
1098e3a33673SSrinivas Kandagatla }
1099e3a33673SSrinivas Kandagatla 
q6routing_reg_read(struct snd_soc_component * component,unsigned int reg)1100796a58feSSrinivas Kandagatla static unsigned int q6routing_reg_read(struct snd_soc_component *component,
1101796a58feSSrinivas Kandagatla 				       unsigned int reg)
1102796a58feSSrinivas Kandagatla {
1103796a58feSSrinivas Kandagatla 	/* default value */
1104796a58feSSrinivas Kandagatla 	return 0;
1105796a58feSSrinivas Kandagatla }
1106796a58feSSrinivas Kandagatla 
q6routing_reg_write(struct snd_soc_component * component,unsigned int reg,unsigned int val)1107796a58feSSrinivas Kandagatla static int q6routing_reg_write(struct snd_soc_component *component,
1108796a58feSSrinivas Kandagatla 			       unsigned int reg, unsigned int val)
1109796a58feSSrinivas Kandagatla {
1110796a58feSSrinivas Kandagatla 	/* dummy */
1111796a58feSSrinivas Kandagatla 	return 0;
1112796a58feSSrinivas Kandagatla }
1113796a58feSSrinivas Kandagatla 
1114e3a33673SSrinivas Kandagatla static const struct snd_soc_component_driver msm_soc_routing_component = {
1115e3a33673SSrinivas Kandagatla 	.probe = msm_routing_probe,
1116e3a33673SSrinivas Kandagatla 	.name = DRV_NAME,
1117e198048bSKuninori Morimoto 	.hw_params = routing_hw_params,
1118e3a33673SSrinivas Kandagatla 	.dapm_widgets = msm_qdsp6_widgets,
1119e3a33673SSrinivas Kandagatla 	.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
1120e3a33673SSrinivas Kandagatla 	.dapm_routes = intercon,
1121e3a33673SSrinivas Kandagatla 	.num_dapm_routes = ARRAY_SIZE(intercon),
1122796a58feSSrinivas Kandagatla 	.read = q6routing_reg_read,
1123796a58feSSrinivas Kandagatla 	.write = q6routing_reg_write,
1124e3a33673SSrinivas Kandagatla };
1125e3a33673SSrinivas Kandagatla 
q6pcm_routing_probe(struct platform_device * pdev)112679194077SSrinivas Kandagatla static int q6pcm_routing_probe(struct platform_device *pdev)
1127e3a33673SSrinivas Kandagatla {
112879194077SSrinivas Kandagatla 	struct device *dev = &pdev->dev;
112979194077SSrinivas Kandagatla 
1130e3a33673SSrinivas Kandagatla 	routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL);
1131e3a33673SSrinivas Kandagatla 	if (!routing_data)
1132e3a33673SSrinivas Kandagatla 		return -ENOMEM;
1133e3a33673SSrinivas Kandagatla 
1134e3a33673SSrinivas Kandagatla 	routing_data->dev = dev;
1135e3a33673SSrinivas Kandagatla 
1136e3a33673SSrinivas Kandagatla 	mutex_init(&routing_data->lock);
1137e3a33673SSrinivas Kandagatla 	dev_set_drvdata(dev, routing_data);
1138e3a33673SSrinivas Kandagatla 
113979194077SSrinivas Kandagatla 	return devm_snd_soc_register_component(dev, &msm_soc_routing_component,
1140e3a33673SSrinivas Kandagatla 					  NULL, 0);
1141e3a33673SSrinivas Kandagatla }
1142e3a33673SSrinivas Kandagatla 
q6pcm_routing_remove(struct platform_device * pdev)114360835c5cSUwe Kleine-König static void q6pcm_routing_remove(struct platform_device *pdev)
1144e3a33673SSrinivas Kandagatla {
114579194077SSrinivas Kandagatla 	kfree(routing_data);
114679194077SSrinivas Kandagatla 	routing_data = NULL;
1147e3a33673SSrinivas Kandagatla }
1148e3a33673SSrinivas Kandagatla 
1149156d0273SSrinivas Kandagatla #ifdef CONFIG_OF
1150f48bde4bSSrinivas Kandagatla static const struct of_device_id q6pcm_routing_device_id[] = {
1151f48bde4bSSrinivas Kandagatla 	{ .compatible = "qcom,q6adm-routing" },
1152f48bde4bSSrinivas Kandagatla 	{},
1153f48bde4bSSrinivas Kandagatla };
1154f48bde4bSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
1155156d0273SSrinivas Kandagatla #endif
1156f48bde4bSSrinivas Kandagatla 
1157e3a33673SSrinivas Kandagatla static struct platform_driver q6pcm_routing_platform_driver = {
1158e3a33673SSrinivas Kandagatla 	.driver = {
1159e3a33673SSrinivas Kandagatla 		.name = "q6routing",
1160f48bde4bSSrinivas Kandagatla 		.of_match_table = of_match_ptr(q6pcm_routing_device_id),
1161e3a33673SSrinivas Kandagatla 	},
1162e3a33673SSrinivas Kandagatla 	.probe = q6pcm_routing_probe,
116360835c5cSUwe Kleine-König 	.remove_new = q6pcm_routing_remove,
1164e3a33673SSrinivas Kandagatla };
1165e3a33673SSrinivas Kandagatla module_platform_driver(q6pcm_routing_platform_driver);
1166e3a33673SSrinivas Kandagatla 
1167e3a33673SSrinivas Kandagatla MODULE_DESCRIPTION("Q6 Routing platform");
1168e3a33673SSrinivas Kandagatla MODULE_LICENSE("GPL v2");
1169