1// SPDX-License-Identifier: GPL-2.0
2// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
3// Copyright (c) 2018, Linaro Limited
4
5#include <linux/init.h>
6#include <linux/err.h>
7#include <linux/module.h>
8#include <linux/platform_device.h>
9#include <linux/of_platform.h>
10#include <linux/bitops.h>
11#include <linux/mutex.h>
12#include <linux/of_device.h>
13#include <linux/slab.h>
14#include <sound/core.h>
15#include <sound/soc.h>
16#include <sound/soc-dapm.h>
17#include <sound/pcm.h>
18#include <sound/control.h>
19#include <sound/asound.h>
20#include <sound/pcm_params.h>
21#include "q6afe.h"
22#include "q6asm.h"
23#include "q6adm.h"
24#include "q6routing.h"
25
26#define DRV_NAME "q6routing-component"
27
28#define Q6ROUTING_RX_MIXERS(id)						\
29	SOC_SINGLE_EXT("MultiMedia1", id,				\
30	MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\
31	msm_routing_put_audio_mixer),					\
32	SOC_SINGLE_EXT("MultiMedia2", id,				\
33	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\
34	msm_routing_put_audio_mixer),					\
35	SOC_SINGLE_EXT("MultiMedia3", id,				\
36	MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\
37	msm_routing_put_audio_mixer),					\
38	SOC_SINGLE_EXT("MultiMedia4", id,				\
39	MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\
40	msm_routing_put_audio_mixer),					\
41	SOC_SINGLE_EXT("MultiMedia5", id,				\
42	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\
43	msm_routing_put_audio_mixer),					\
44	SOC_SINGLE_EXT("MultiMedia6", id,				\
45	MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\
46	msm_routing_put_audio_mixer),					\
47	SOC_SINGLE_EXT("MultiMedia7", id,				\
48	MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\
49	msm_routing_put_audio_mixer),					\
50	SOC_SINGLE_EXT("MultiMedia8", id,				\
51	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\
52	msm_routing_put_audio_mixer),
53
54#define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s)	\
55	{ mix_name, "MultiMedia1", "MM_DL1" },	\
56	{ mix_name, "MultiMedia2", "MM_DL2" },	\
57	{ mix_name, "MultiMedia3", "MM_DL3" },	\
58	{ mix_name, "MultiMedia4", "MM_DL4" },	\
59	{ mix_name, "MultiMedia5", "MM_DL5" },	\
60	{ mix_name, "MultiMedia6", "MM_DL6" },	\
61	{ mix_name, "MultiMedia7", "MM_DL7" },	\
62	{ mix_name, "MultiMedia8", "MM_DL8" },	\
63	{ s, NULL, mix_name }
64
65#define Q6ROUTING_TX_DAPM_ROUTE(mix_name)		\
66	{ mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" },	\
67	{ mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" },	\
68	{ mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" },	\
69	{ mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" },	\
70	{ mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" },		\
71	{ mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" },		\
72	{ mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" },		\
73	{ mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" },		\
74	{ mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" },		\
75	{ mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" },		\
76	{ mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" },		\
77	{ mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" },		\
78	{ mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"},	\
79	{ mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"},	\
80	{ mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"},	\
81	{ mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"},	\
82	{ mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"},	\
83	{ mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"},	\
84	{ mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"},	\
85	{ mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"},	\
86	{ mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"},		\
87	{ mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"},		\
88	{ mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"},		\
89	{ mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"},		\
90	{ mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"},		\
91	{ mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"},		\
92	{ mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"},		\
93	{ mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"},		\
94	{ mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"},		\
95	{ mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"},		\
96	{ mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"},		\
97	{ mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"},		\
98	{ mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"},		\
99	{ mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"},		\
100	{ mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"},		\
101	{ mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"},		\
102	{ mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"},		\
103	{ mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"},		\
104	{ mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"},		\
105	{ mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"},		\
106	{ mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"},		\
107	{ mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"},		\
108	{ mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"},		\
109	{ mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"},		\
110	{ mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"},		\
111	{ mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},		\
112	{ mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},		\
113	{ mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},		\
114	{ mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"},		\
115	{ mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"},		\
116	{ mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"},		\
117	{ mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"},		\
118	{ mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"},	\
119	{ mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"},	\
120	{ mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"},	\
121	{ mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"},	\
122	{ mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"},	\
123	{ mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"},	\
124	{ mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"},	\
125	{ mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"},	\
126	{ mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"},	\
127	{ mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"},	\
128	{ mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"},	\
129	{ mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
130
131#define Q6ROUTING_TX_MIXERS(id)						\
132	SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX,			\
133		id, 1, 0, msm_routing_get_audio_mixer,			\
134		msm_routing_put_audio_mixer),				\
135	SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX,		\
136		id, 1, 0, msm_routing_get_audio_mixer,			\
137		msm_routing_put_audio_mixer),				\
138	SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX,		\
139		id, 1, 0, msm_routing_get_audio_mixer,			\
140		msm_routing_put_audio_mixer),				\
141	SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX,		\
142		id, 1, 0, msm_routing_get_audio_mixer,			\
143		msm_routing_put_audio_mixer),				\
144	SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX,			\
145		id, 1, 0, msm_routing_get_audio_mixer,			\
146		msm_routing_put_audio_mixer),				\
147	SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX,			\
148		id, 1, 0, msm_routing_get_audio_mixer,			\
149		msm_routing_put_audio_mixer),				\
150	SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX,			\
151		id, 1, 0, msm_routing_get_audio_mixer,			\
152		msm_routing_put_audio_mixer),				\
153	SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX,			\
154		id, 1, 0, msm_routing_get_audio_mixer,			\
155		msm_routing_put_audio_mixer),				\
156	SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX,			\
157		id, 1, 0, msm_routing_get_audio_mixer,			\
158		msm_routing_put_audio_mixer),				\
159	SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX,			\
160		id, 1, 0, msm_routing_get_audio_mixer,			\
161		msm_routing_put_audio_mixer),				\
162	SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX,			\
163		id, 1, 0, msm_routing_get_audio_mixer,			\
164		msm_routing_put_audio_mixer),				\
165	SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX,			\
166		id, 1, 0, msm_routing_get_audio_mixer,			\
167		msm_routing_put_audio_mixer),				\
168	SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0,		\
169		id, 1, 0, msm_routing_get_audio_mixer,			\
170		msm_routing_put_audio_mixer),				\
171	SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1,		\
172		id, 1, 0, msm_routing_get_audio_mixer,			\
173		msm_routing_put_audio_mixer),				\
174	SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2,		\
175		id, 1, 0, msm_routing_get_audio_mixer,			\
176		msm_routing_put_audio_mixer),				\
177	SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3,		\
178		id, 1, 0, msm_routing_get_audio_mixer,			\
179		msm_routing_put_audio_mixer),				\
180	SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4,		\
181		id, 1, 0, msm_routing_get_audio_mixer,			\
182		msm_routing_put_audio_mixer),				\
183	SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5,		\
184		id, 1, 0, msm_routing_get_audio_mixer,			\
185		msm_routing_put_audio_mixer),				\
186	SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6,		\
187		id, 1, 0, msm_routing_get_audio_mixer,			\
188		msm_routing_put_audio_mixer),				\
189	SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7,		\
190		id, 1, 0, msm_routing_get_audio_mixer,			\
191		msm_routing_put_audio_mixer),				\
192	SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0,		\
193		id, 1, 0, msm_routing_get_audio_mixer,			\
194		msm_routing_put_audio_mixer),				\
195	SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1,		\
196		id, 1, 0, msm_routing_get_audio_mixer,			\
197		msm_routing_put_audio_mixer),				\
198	SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2,		\
199		id, 1, 0, msm_routing_get_audio_mixer,			\
200		msm_routing_put_audio_mixer),				\
201	SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3,		\
202		id, 1, 0, msm_routing_get_audio_mixer,			\
203		msm_routing_put_audio_mixer),				\
204	SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4,		\
205		id, 1, 0, msm_routing_get_audio_mixer,			\
206		msm_routing_put_audio_mixer),				\
207	SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5,		\
208		id, 1, 0, msm_routing_get_audio_mixer,			\
209		msm_routing_put_audio_mixer),				\
210	SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6,		\
211		id, 1, 0, msm_routing_get_audio_mixer,			\
212		msm_routing_put_audio_mixer),				\
213	SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7,		\
214		id, 1, 0, msm_routing_get_audio_mixer,			\
215		msm_routing_put_audio_mixer),				\
216	SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0,		\
217		id, 1, 0, msm_routing_get_audio_mixer,			\
218		msm_routing_put_audio_mixer),				\
219	SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1,		\
220		id, 1, 0, msm_routing_get_audio_mixer,			\
221		msm_routing_put_audio_mixer),				\
222	SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2,		\
223		id, 1, 0, msm_routing_get_audio_mixer,			\
224		msm_routing_put_audio_mixer),				\
225	SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3,		\
226		id, 1, 0, msm_routing_get_audio_mixer,			\
227		msm_routing_put_audio_mixer),				\
228	SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4,		\
229		id, 1, 0, msm_routing_get_audio_mixer,			\
230		msm_routing_put_audio_mixer),				\
231	SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5,		\
232		id, 1, 0, msm_routing_get_audio_mixer,			\
233		msm_routing_put_audio_mixer),				\
234	SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6,		\
235		id, 1, 0, msm_routing_get_audio_mixer,			\
236		msm_routing_put_audio_mixer),				\
237	SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7,		\
238		id, 1, 0, msm_routing_get_audio_mixer,			\
239		msm_routing_put_audio_mixer),				\
240	SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0,		\
241		id, 1, 0, msm_routing_get_audio_mixer,			\
242		msm_routing_put_audio_mixer),				\
243	SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1,		\
244		id, 1, 0, msm_routing_get_audio_mixer,			\
245		msm_routing_put_audio_mixer),				\
246	SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2,		\
247		id, 1, 0, msm_routing_get_audio_mixer,			\
248		msm_routing_put_audio_mixer),				\
249	SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3,		\
250		id, 1, 0, msm_routing_get_audio_mixer,			\
251		msm_routing_put_audio_mixer),				\
252	SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4,		\
253		id, 1, 0, msm_routing_get_audio_mixer,			\
254		msm_routing_put_audio_mixer),				\
255	SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5,		\
256		id, 1, 0, msm_routing_get_audio_mixer,			\
257		msm_routing_put_audio_mixer),				\
258	SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6,		\
259		id, 1, 0, msm_routing_get_audio_mixer,			\
260		msm_routing_put_audio_mixer),				\
261	SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7,		\
262		id, 1, 0, msm_routing_get_audio_mixer,			\
263		msm_routing_put_audio_mixer),				\
264	SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0,		\
265		id, 1, 0, msm_routing_get_audio_mixer,			\
266		msm_routing_put_audio_mixer),				\
267	SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1,		\
268		id, 1, 0, msm_routing_get_audio_mixer,			\
269		msm_routing_put_audio_mixer),				\
270	SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2,		\
271		id, 1, 0, msm_routing_get_audio_mixer,			\
272		msm_routing_put_audio_mixer),				\
273	SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3,		\
274		id, 1, 0, msm_routing_get_audio_mixer,			\
275		msm_routing_put_audio_mixer),				\
276	SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4,		\
277		id, 1, 0, msm_routing_get_audio_mixer,			\
278		msm_routing_put_audio_mixer),				\
279	SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5,		\
280		id, 1, 0, msm_routing_get_audio_mixer,			\
281		msm_routing_put_audio_mixer),				\
282	SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6,		\
283		id, 1, 0, msm_routing_get_audio_mixer,			\
284		msm_routing_put_audio_mixer),				\
285	SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7,		\
286		id, 1, 0, msm_routing_get_audio_mixer,			\
287		msm_routing_put_audio_mixer),				\
288	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0,	\
289		id, 1, 0, msm_routing_get_audio_mixer,			\
290		msm_routing_put_audio_mixer),				\
291	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1,	\
292		id, 1, 0, msm_routing_get_audio_mixer,			\
293		msm_routing_put_audio_mixer),				\
294	SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2,	\
295		id, 1, 0, msm_routing_get_audio_mixer,			\
296		msm_routing_put_audio_mixer),				\
297	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0,		\
298		id, 1, 0, msm_routing_get_audio_mixer,			\
299		msm_routing_put_audio_mixer),				\
300	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1,		\
301		id, 1, 0, msm_routing_get_audio_mixer,			\
302		msm_routing_put_audio_mixer),				\
303	SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2,		\
304		id, 1, 0, msm_routing_get_audio_mixer,			\
305		msm_routing_put_audio_mixer),				\
306	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0,		\
307		id, 1, 0, msm_routing_get_audio_mixer,			\
308		msm_routing_put_audio_mixer),				\
309	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1,		\
310		id, 1, 0, msm_routing_get_audio_mixer,			\
311		msm_routing_put_audio_mixer),				\
312	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2,		\
313		id, 1, 0, msm_routing_get_audio_mixer,			\
314		msm_routing_put_audio_mixer),				\
315	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3,		\
316		id, 1, 0, msm_routing_get_audio_mixer,			\
317		msm_routing_put_audio_mixer),				\
318	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4,		\
319		id, 1, 0, msm_routing_get_audio_mixer,			\
320		msm_routing_put_audio_mixer),				\
321	SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5,		\
322		id, 1, 0, msm_routing_get_audio_mixer,			\
323		msm_routing_put_audio_mixer),
324
325struct session_data {
326	int state;
327	int port_id;
328	int path_type;
329	int app_type;
330	int acdb_id;
331	int sample_rate;
332	int bits_per_sample;
333	int channels;
334	int perf_mode;
335	int numcopps;
336	int fedai_id;
337	unsigned long copp_map;
338	struct q6copp *copps[MAX_COPPS_PER_PORT];
339};
340
341struct msm_routing_data {
342	struct session_data sessions[MAX_SESSIONS];
343	struct session_data port_data[AFE_MAX_PORTS];
344	struct device *dev;
345	struct mutex lock;
346};
347
348static struct msm_routing_data *routing_data;
349
350/**
351 * q6routing_stream_open() - Register a new stream for route setup
352 *
353 * @fedai_id: Frontend dai id.
354 * @perf_mode: Performance mode.
355 * @stream_id: ASM stream id to map.
356 * @stream_type: Direction of stream
357 *
358 * Return: Will be an negative on error or a zero on success.
359 */
360int q6routing_stream_open(int fedai_id, int perf_mode,
361			   int stream_id, int stream_type)
362{
363	int j, topology, num_copps = 0;
364	struct route_payload payload;
365	struct q6copp *copp;
366	int copp_idx;
367	struct session_data *session, *pdata;
368
369	if (!routing_data) {
370		pr_err("Routing driver not yet ready\n");
371		return -EINVAL;
372	}
373
374	session = &routing_data->sessions[stream_id - 1];
375	if (session->port_id < 0) {
376		dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n",
377			session->fedai_id);
378		return -EINVAL;
379	}
380
381	pdata = &routing_data->port_data[session->port_id];
382
383	mutex_lock(&routing_data->lock);
384	session->fedai_id = fedai_id;
385
386	session->path_type = pdata->path_type;
387	session->sample_rate = pdata->sample_rate;
388	session->channels = pdata->channels;
389	session->bits_per_sample = pdata->bits_per_sample;
390
391	payload.num_copps = 0; /* only RX needs to use payload */
392	topology = NULL_COPP_TOPOLOGY;
393	copp = q6adm_open(routing_data->dev, session->port_id,
394			      session->path_type, session->sample_rate,
395			      session->channels, topology, perf_mode,
396			      session->bits_per_sample, 0, 0);
397
398	if (IS_ERR_OR_NULL(copp)) {
399		mutex_unlock(&routing_data->lock);
400		return -EINVAL;
401	}
402
403	copp_idx = q6adm_get_copp_id(copp);
404	set_bit(copp_idx, &session->copp_map);
405	session->copps[copp_idx] = copp;
406
407	for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) {
408		payload.port_id[num_copps] = session->port_id;
409		payload.copp_idx[num_copps] = j;
410		num_copps++;
411	}
412
413	if (num_copps) {
414		payload.num_copps = num_copps;
415		payload.session_id = stream_id;
416		q6adm_matrix_map(routing_data->dev, session->path_type,
417				 payload, perf_mode);
418	}
419	mutex_unlock(&routing_data->lock);
420
421	return 0;
422}
423EXPORT_SYMBOL_GPL(q6routing_stream_open);
424
425static struct session_data *get_session_from_id(struct msm_routing_data *data,
426						int fedai_id)
427{
428	int i;
429
430	for (i = 0; i < MAX_SESSIONS; i++) {
431		if (fedai_id == data->sessions[i].fedai_id)
432			return &data->sessions[i];
433	}
434
435	return NULL;
436}
437/**
438 * q6routing_stream_close() - Deregister a stream
439 *
440 * @fedai_id: Frontend dai id.
441 * @stream_type: Direction of stream
442 *
443 * Return: Will be an negative on error or a zero on success.
444 */
445void q6routing_stream_close(int fedai_id, int stream_type)
446{
447	struct session_data *session;
448	int idx;
449
450	session = get_session_from_id(routing_data, fedai_id);
451	if (!session)
452		return;
453
454	for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) {
455		if (session->copps[idx]) {
456			q6adm_close(routing_data->dev, session->copps[idx]);
457			session->copps[idx] = NULL;
458		}
459	}
460
461	session->fedai_id = -1;
462	session->copp_map = 0;
463}
464EXPORT_SYMBOL_GPL(q6routing_stream_close);
465
466static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
467				       struct snd_ctl_elem_value *ucontrol)
468{
469	struct snd_soc_dapm_context *dapm =
470	    snd_soc_dapm_kcontrol_dapm(kcontrol);
471	struct soc_mixer_control *mc =
472	    (struct soc_mixer_control *)kcontrol->private_value;
473	int session_id = mc->shift;
474	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
475	struct msm_routing_data *priv = dev_get_drvdata(c->dev);
476	struct session_data *session = &priv->sessions[session_id];
477
478	if (session->port_id == mc->reg)
479		ucontrol->value.integer.value[0] = 1;
480	else
481		ucontrol->value.integer.value[0] = 0;
482
483	return 0;
484}
485
486static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
487				       struct snd_ctl_elem_value *ucontrol)
488{
489	struct snd_soc_dapm_context *dapm =
490				    snd_soc_dapm_kcontrol_dapm(kcontrol);
491	struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
492	struct msm_routing_data *data = dev_get_drvdata(c->dev);
493	struct soc_mixer_control *mc =
494		    (struct soc_mixer_control *)kcontrol->private_value;
495	struct snd_soc_dapm_update *update = NULL;
496	int be_id = mc->reg;
497	int session_id = mc->shift;
498	struct session_data *session = &data->sessions[session_id];
499
500	if (ucontrol->value.integer.value[0]) {
501		if (session->port_id == be_id)
502			return 0;
503
504		session->port_id = be_id;
505		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
506	} else {
507		if (session->port_id == -1 || session->port_id != be_id)
508			return 0;
509
510		session->port_id = -1;
511		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
512	}
513
514	return 1;
515}
516
517static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
518	Q6ROUTING_RX_MIXERS(HDMI_RX) };
519
520static const struct snd_kcontrol_new display_port_mixer_controls[] = {
521	Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
522
523static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
524	Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
525
526static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
527	Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
528
529static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
530	Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
531
532static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
533	Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
534
535static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
536	Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
537
538static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
539	Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
540
541static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
542	Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
543
544static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
545	Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
546
547static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
548	Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
549
550static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
551	Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
552
553static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
554	Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
555
556static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
557	Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
558
559static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
560	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
561
562static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
563	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
564
565static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
566	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
567
568static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
569	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
570
571static const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
572	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
573
574static const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
575	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
576
577static const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
578	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
579
580static const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
581	Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
582
583static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
584	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
585
586static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
587	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
588
589static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
590	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
591
592static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
593	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
594
595static const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
596	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
597
598static const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
599	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
600
601static const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
602	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
603
604static const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
605	Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
606
607static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
608	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
609
610static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
611	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
612
613static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
614	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
615
616static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
617	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
618
619static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
620	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
621
622static const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
623	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
624
625static const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
626	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
627
628static const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
629	Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
630
631static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
632	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
633
634static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
635	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
636
637static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
638	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
639
640static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
641	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
642
643static const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
644	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
645
646static const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
647	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
648
649static const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
650	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
651
652static const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
653	Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
654
655static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
656	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
657
658static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
659	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
660
661static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
662	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
663
664static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
665	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
666
667static const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
668	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
669
670static const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
671	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
672
673static const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
674	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
675
676static const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
677	Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
678
679static const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
680	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
681
682static const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
683	Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
684
685static const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
686	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
687
688static const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
689	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
690
691static const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
692	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
693
694static const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
695	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
696
697static const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
698	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
699
700static const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
701	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
702
703static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
704	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
705
706static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
707	Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
708
709
710static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
711	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
712
713static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
714	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
715
716static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
717	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
718
719static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
720	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
721
722static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
723	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
724
725static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
726	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
727
728static const struct snd_kcontrol_new mmul7_mixer_controls[] = {
729	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
730
731static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
732	Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
733
734static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
735	/* Mixer definitions */
736	SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
737			   hdmi_mixer_controls,
738			   ARRAY_SIZE(hdmi_mixer_controls)),
739
740	SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
741			   display_port_mixer_controls,
742			   ARRAY_SIZE(display_port_mixer_controls)),
743
744	SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
745			   slimbus_rx_mixer_controls,
746			   ARRAY_SIZE(slimbus_rx_mixer_controls)),
747	SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
748			   slimbus_1_rx_mixer_controls,
749			   ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
750	SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
751			   slimbus_2_rx_mixer_controls,
752			   ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
753	SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
754			   slimbus_3_rx_mixer_controls,
755			   ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
756	SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
757			   slimbus_4_rx_mixer_controls,
758			   ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
759	SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
760			   slimbus_5_rx_mixer_controls,
761			    ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
762	SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
763			   slimbus_6_rx_mixer_controls,
764			   ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
765	SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
766			   primary_mi2s_rx_mixer_controls,
767			   ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
768	SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
769			   secondary_mi2s_rx_mixer_controls,
770			   ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
771	SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
772			   quaternary_mi2s_rx_mixer_controls,
773			   ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
774	SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
775			   quinary_mi2s_rx_mixer_controls,
776			   ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
777	SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
778			   tertiary_mi2s_rx_mixer_controls,
779			   ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
780	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
781				pri_tdm_rx_0_mixer_controls,
782				ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
783	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
784				pri_tdm_rx_1_mixer_controls,
785				ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
786	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
787				pri_tdm_rx_2_mixer_controls,
788				ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
789	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
790				pri_tdm_rx_3_mixer_controls,
791				ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
792	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
793				pri_tdm_rx_4_mixer_controls,
794				ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
795	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
796				pri_tdm_rx_5_mixer_controls,
797				ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
798	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
799				pri_tdm_rx_6_mixer_controls,
800				ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
801	SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
802				pri_tdm_rx_7_mixer_controls,
803				ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
804
805	SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
806				sec_tdm_rx_0_mixer_controls,
807				ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
808	SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
809				sec_tdm_rx_1_mixer_controls,
810				ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
811	SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
812				sec_tdm_rx_2_mixer_controls,
813				ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
814	SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
815				sec_tdm_rx_3_mixer_controls,
816				ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
817	SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
818				sec_tdm_rx_4_mixer_controls,
819				ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
820	SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
821				sec_tdm_rx_5_mixer_controls,
822				ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
823	SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
824				sec_tdm_rx_6_mixer_controls,
825				ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
826	SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
827				sec_tdm_rx_7_mixer_controls,
828				ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
829
830	SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
831				tert_tdm_rx_0_mixer_controls,
832				ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
833	SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
834				tert_tdm_rx_1_mixer_controls,
835				ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
836	SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
837				tert_tdm_rx_2_mixer_controls,
838				ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
839	SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
840				tert_tdm_rx_3_mixer_controls,
841				ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
842	SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
843				tert_tdm_rx_4_mixer_controls,
844				ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
845	SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
846				tert_tdm_rx_5_mixer_controls,
847				ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
848	SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
849				tert_tdm_rx_6_mixer_controls,
850				ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
851	SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
852				tert_tdm_rx_7_mixer_controls,
853				ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
854
855	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
856				quat_tdm_rx_0_mixer_controls,
857				ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
858	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
859				quat_tdm_rx_1_mixer_controls,
860				ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
861	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
862				quat_tdm_rx_2_mixer_controls,
863				ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
864	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
865				quat_tdm_rx_3_mixer_controls,
866				ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
867	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
868				quat_tdm_rx_4_mixer_controls,
869				ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
870	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
871				quat_tdm_rx_5_mixer_controls,
872				ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
873	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
874				quat_tdm_rx_6_mixer_controls,
875				ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
876	SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
877				quat_tdm_rx_7_mixer_controls,
878				ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
879
880	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
881				quin_tdm_rx_0_mixer_controls,
882				ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
883	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
884				quin_tdm_rx_1_mixer_controls,
885				ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
886	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
887				quin_tdm_rx_2_mixer_controls,
888				ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
889	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
890				quin_tdm_rx_3_mixer_controls,
891				ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
892	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
893				quin_tdm_rx_4_mixer_controls,
894				ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
895	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
896				quin_tdm_rx_5_mixer_controls,
897				ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
898	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
899				quin_tdm_rx_6_mixer_controls,
900				ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
901	SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
902				quin_tdm_rx_7_mixer_controls,
903				ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
904
905	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
906		wsa_codec_dma_rx_0_mixer_controls,
907		ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
908	SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
909		wsa_codec_dma_rx_1_mixer_controls,
910		ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
911	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
912		rx_codec_dma_rx_0_mixer_controls,
913		ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
914	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
915		rx_codec_dma_rx_1_mixer_controls,
916		ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
917	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
918		rx_codec_dma_rx_2_mixer_controls,
919		ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
920	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
921		rx_codec_dma_rx_3_mixer_controls,
922		ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
923	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
924		rx_codec_dma_rx_4_mixer_controls,
925		ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
926	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
927		rx_codec_dma_rx_5_mixer_controls,
928		ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
929	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
930		rxcodec_dma_rx_6_mixer_controls,
931		ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
932	SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
933		rx_codec_dma_rx_7_mixer_controls,
934		ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
935	SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
936		mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
937	SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
938		mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
939	SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
940		mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
941	SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
942		mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
943	SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
944		mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
945	SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
946		mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
947	SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
948		mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
949	SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
950		mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
951
952};
953
954static const struct snd_soc_dapm_route intercon[] = {
955	Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
956	Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
957				"DISPLAY_PORT_RX"),
958	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
959	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
960	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
961	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
962	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
963	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
964	Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
965	Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
966	Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
967	Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
968	Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
969	Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
970	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
971				"PRIMARY_TDM_RX_0"),
972	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
973				"PRIMARY_TDM_RX_1"),
974	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
975				"PRIMARY_TDM_RX_2"),
976	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
977				"PRIMARY_TDM_RX_3"),
978	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
979				"PRIMARY_TDM_RX_4"),
980	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
981				"PRIMARY_TDM_RX_5"),
982	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
983				"PRIMARY_TDM_RX_6"),
984	Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
985				"PRIMARY_TDM_RX_7"),
986	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
987	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
988	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
989	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
990	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
991	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
992	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
993	Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
994	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
995	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
996	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
997	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
998	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
999	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"),
1000	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"),
1001	Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"),
1002	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"),
1003	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"),
1004	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"),
1005	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"),
1006	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"),
1007	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"),
1008	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"),
1009	Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"),
1010	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"),
1011	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"),
1012	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"),
1013	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"),
1014	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"),
1015	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"),
1016	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"),
1017	Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"),
1018	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"),
1019	Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"),
1020	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"),
1021	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"),
1022	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"),
1023	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"),
1024	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"),
1025	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"),
1026	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
1027	Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
1028	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
1029	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
1030	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
1031	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"),
1032	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"),
1033	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"),
1034	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"),
1035	Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"),
1036
1037	{"MM_UL1", NULL, "MultiMedia1 Mixer"},
1038	{"MM_UL2", NULL, "MultiMedia2 Mixer"},
1039	{"MM_UL3", NULL, "MultiMedia3 Mixer"},
1040	{"MM_UL4", NULL, "MultiMedia4 Mixer"},
1041	{"MM_UL5", NULL, "MultiMedia5 Mixer"},
1042	{"MM_UL6", NULL, "MultiMedia6 Mixer"},
1043	{"MM_UL7", NULL, "MultiMedia7 Mixer"},
1044	{"MM_UL8", NULL, "MultiMedia8 Mixer"},
1045};
1046
1047static int routing_hw_params(struct snd_soc_component *component,
1048			     struct snd_pcm_substream *substream,
1049			     struct snd_pcm_hw_params *params)
1050{
1051	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1052	struct msm_routing_data *data = dev_get_drvdata(component->dev);
1053	unsigned int be_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
1054	struct session_data *session;
1055	int path_type;
1056
1057	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1058		path_type = ADM_PATH_PLAYBACK;
1059	else
1060		path_type = ADM_PATH_LIVE_REC;
1061
1062	if (be_id >= AFE_MAX_PORTS)
1063		return -EINVAL;
1064
1065	session = &data->port_data[be_id];
1066
1067	mutex_lock(&data->lock);
1068
1069	session->path_type = path_type;
1070	session->sample_rate = params_rate(params);
1071	session->channels = params_channels(params);
1072
1073	switch (params_format(params)) {
1074	case SNDRV_PCM_FORMAT_S16_LE:
1075			session->bits_per_sample = 16;
1076		break;
1077	case SNDRV_PCM_FORMAT_S24_LE:
1078			session->bits_per_sample = 24;
1079		break;
1080	default:
1081		break;
1082	}
1083
1084	mutex_unlock(&data->lock);
1085	return 0;
1086}
1087
1088static int msm_routing_probe(struct snd_soc_component *c)
1089{
1090	int i;
1091
1092	for (i = 0; i < MAX_SESSIONS; i++) {
1093		routing_data->sessions[i].port_id = -1;
1094		routing_data->sessions[i].fedai_id = -1;
1095	}
1096
1097	return 0;
1098}
1099
1100static unsigned int q6routing_reg_read(struct snd_soc_component *component,
1101				       unsigned int reg)
1102{
1103	/* default value */
1104	return 0;
1105}
1106
1107static int q6routing_reg_write(struct snd_soc_component *component,
1108			       unsigned int reg, unsigned int val)
1109{
1110	/* dummy */
1111	return 0;
1112}
1113
1114static const struct snd_soc_component_driver msm_soc_routing_component = {
1115	.probe = msm_routing_probe,
1116	.name = DRV_NAME,
1117	.hw_params = routing_hw_params,
1118	.dapm_widgets = msm_qdsp6_widgets,
1119	.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
1120	.dapm_routes = intercon,
1121	.num_dapm_routes = ARRAY_SIZE(intercon),
1122	.read = q6routing_reg_read,
1123	.write = q6routing_reg_write,
1124};
1125
1126static int q6pcm_routing_probe(struct platform_device *pdev)
1127{
1128	struct device *dev = &pdev->dev;
1129
1130	routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL);
1131	if (!routing_data)
1132		return -ENOMEM;
1133
1134	routing_data->dev = dev;
1135
1136	mutex_init(&routing_data->lock);
1137	dev_set_drvdata(dev, routing_data);
1138
1139	return devm_snd_soc_register_component(dev, &msm_soc_routing_component,
1140					  NULL, 0);
1141}
1142
1143static void q6pcm_routing_remove(struct platform_device *pdev)
1144{
1145	kfree(routing_data);
1146	routing_data = NULL;
1147}
1148
1149#ifdef CONFIG_OF
1150static const struct of_device_id q6pcm_routing_device_id[] = {
1151	{ .compatible = "qcom,q6adm-routing" },
1152	{},
1153};
1154MODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
1155#endif
1156
1157static struct platform_driver q6pcm_routing_platform_driver = {
1158	.driver = {
1159		.name = "q6routing",
1160		.of_match_table = of_match_ptr(q6pcm_routing_device_id),
1161	},
1162	.probe = q6pcm_routing_probe,
1163	.remove_new = q6pcm_routing_remove,
1164};
1165module_platform_driver(q6pcm_routing_platform_driver);
1166
1167MODULE_DESCRIPTION("Q6 Routing platform");
1168MODULE_LICENSE("GPL v2");
1169