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