Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/qcom/qdsp6/q6routing.c
53584 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 = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
472
struct soc_mixer_control *mc =
473
(struct soc_mixer_control *)kcontrol->private_value;
474
int session_id = mc->shift;
475
struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
476
struct msm_routing_data *priv = dev_get_drvdata(c->dev);
477
struct session_data *session = &priv->sessions[session_id];
478
479
if (session->port_id == mc->reg)
480
ucontrol->value.integer.value[0] = 1;
481
else
482
ucontrol->value.integer.value[0] = 0;
483
484
return 0;
485
}
486
487
static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
488
struct snd_ctl_elem_value *ucontrol)
489
{
490
struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_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
517
static const struct snd_kcontrol_new usb_rx_mixer_controls[] = {
518
Q6ROUTING_RX_MIXERS(USB_RX) };
519
520
static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
521
Q6ROUTING_RX_MIXERS(HDMI_RX) };
522
523
static const struct snd_kcontrol_new display_port_mixer_controls[] = {
524
Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
525
526
static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
527
Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
528
529
static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
530
Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
531
532
static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
533
Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
534
535
static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
536
Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
537
538
static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
539
Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
540
541
static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
542
Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
543
544
static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
545
Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
546
547
static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
548
Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
549
550
static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
551
Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
552
553
static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
554
Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
555
556
static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
557
Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
558
559
static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
560
Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
561
562
static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
563
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
564
565
static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
566
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
567
568
static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
569
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
570
571
static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
572
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
573
574
static const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
575
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
576
577
static const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
578
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
579
580
static const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
581
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
582
583
static const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
584
Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
585
586
static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
587
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
588
589
static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
590
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
591
592
static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
593
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
594
595
static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
596
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
597
598
static const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
599
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
600
601
static const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
602
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
603
604
static const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
605
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
606
607
static const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
608
Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
609
610
static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
611
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
612
613
static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
614
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
615
616
static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
617
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
618
619
static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
620
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
621
622
static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
623
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
624
625
static const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
626
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
627
628
static const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
629
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
630
631
static const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
632
Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
633
634
static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
635
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
636
637
static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
638
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
639
640
static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
641
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
642
643
static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
644
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
645
646
static const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
647
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
648
649
static const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
650
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
651
652
static const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
653
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
654
655
static const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
656
Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
657
658
static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
659
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
660
661
static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
662
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
663
664
static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
665
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
666
667
static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
668
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
669
670
static const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
671
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
672
673
static const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
674
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
675
676
static const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
677
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
678
679
static const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
680
Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
681
682
static const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
683
Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
684
685
static const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
686
Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
687
688
static const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
689
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
690
691
static const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
692
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
693
694
static const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
695
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
696
697
static const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
698
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
699
700
static const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
701
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
702
703
static const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
704
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
705
706
static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
707
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
708
709
static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
710
Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
711
712
713
static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
714
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
715
716
static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
717
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
718
719
static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
720
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
721
722
static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
723
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
724
725
static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
726
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
727
728
static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
729
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
730
731
static const struct snd_kcontrol_new mmul7_mixer_controls[] = {
732
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
733
734
static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
735
Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
736
737
static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
738
/* Mixer definitions */
739
SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
740
hdmi_mixer_controls,
741
ARRAY_SIZE(hdmi_mixer_controls)),
742
743
SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
744
display_port_mixer_controls,
745
ARRAY_SIZE(display_port_mixer_controls)),
746
747
SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
748
slimbus_rx_mixer_controls,
749
ARRAY_SIZE(slimbus_rx_mixer_controls)),
750
SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
751
slimbus_1_rx_mixer_controls,
752
ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
753
SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
754
slimbus_2_rx_mixer_controls,
755
ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
756
SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
757
slimbus_3_rx_mixer_controls,
758
ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
759
SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
760
slimbus_4_rx_mixer_controls,
761
ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
762
SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
763
slimbus_5_rx_mixer_controls,
764
ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
765
SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
766
slimbus_6_rx_mixer_controls,
767
ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
768
SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
769
primary_mi2s_rx_mixer_controls,
770
ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
771
SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
772
secondary_mi2s_rx_mixer_controls,
773
ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
774
SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
775
quaternary_mi2s_rx_mixer_controls,
776
ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
777
SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
778
quinary_mi2s_rx_mixer_controls,
779
ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
780
SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
781
tertiary_mi2s_rx_mixer_controls,
782
ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
783
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
784
pri_tdm_rx_0_mixer_controls,
785
ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
786
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
787
pri_tdm_rx_1_mixer_controls,
788
ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
789
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
790
pri_tdm_rx_2_mixer_controls,
791
ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
792
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
793
pri_tdm_rx_3_mixer_controls,
794
ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
795
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
796
pri_tdm_rx_4_mixer_controls,
797
ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
798
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
799
pri_tdm_rx_5_mixer_controls,
800
ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
801
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
802
pri_tdm_rx_6_mixer_controls,
803
ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
804
SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
805
pri_tdm_rx_7_mixer_controls,
806
ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
807
808
SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
809
sec_tdm_rx_0_mixer_controls,
810
ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
811
SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
812
sec_tdm_rx_1_mixer_controls,
813
ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
814
SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
815
sec_tdm_rx_2_mixer_controls,
816
ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
817
SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
818
sec_tdm_rx_3_mixer_controls,
819
ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
820
SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
821
sec_tdm_rx_4_mixer_controls,
822
ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
823
SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
824
sec_tdm_rx_5_mixer_controls,
825
ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
826
SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
827
sec_tdm_rx_6_mixer_controls,
828
ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
829
SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
830
sec_tdm_rx_7_mixer_controls,
831
ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
832
833
SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
834
tert_tdm_rx_0_mixer_controls,
835
ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
836
SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
837
tert_tdm_rx_1_mixer_controls,
838
ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
839
SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
840
tert_tdm_rx_2_mixer_controls,
841
ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
842
SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
843
tert_tdm_rx_3_mixer_controls,
844
ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
845
SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
846
tert_tdm_rx_4_mixer_controls,
847
ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
848
SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
849
tert_tdm_rx_5_mixer_controls,
850
ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
851
SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
852
tert_tdm_rx_6_mixer_controls,
853
ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
854
SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
855
tert_tdm_rx_7_mixer_controls,
856
ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
857
858
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
859
quat_tdm_rx_0_mixer_controls,
860
ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
861
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
862
quat_tdm_rx_1_mixer_controls,
863
ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
864
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
865
quat_tdm_rx_2_mixer_controls,
866
ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
867
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
868
quat_tdm_rx_3_mixer_controls,
869
ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
870
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
871
quat_tdm_rx_4_mixer_controls,
872
ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
873
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
874
quat_tdm_rx_5_mixer_controls,
875
ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
876
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
877
quat_tdm_rx_6_mixer_controls,
878
ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
879
SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
880
quat_tdm_rx_7_mixer_controls,
881
ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
882
883
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
884
quin_tdm_rx_0_mixer_controls,
885
ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
886
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
887
quin_tdm_rx_1_mixer_controls,
888
ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
889
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
890
quin_tdm_rx_2_mixer_controls,
891
ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
892
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
893
quin_tdm_rx_3_mixer_controls,
894
ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
895
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
896
quin_tdm_rx_4_mixer_controls,
897
ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
898
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
899
quin_tdm_rx_5_mixer_controls,
900
ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
901
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
902
quin_tdm_rx_6_mixer_controls,
903
ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
904
SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
905
quin_tdm_rx_7_mixer_controls,
906
ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
907
908
SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
909
wsa_codec_dma_rx_0_mixer_controls,
910
ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
911
SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
912
wsa_codec_dma_rx_1_mixer_controls,
913
ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
914
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
915
rx_codec_dma_rx_0_mixer_controls,
916
ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
917
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
918
rx_codec_dma_rx_1_mixer_controls,
919
ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
920
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
921
rx_codec_dma_rx_2_mixer_controls,
922
ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
923
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
924
rx_codec_dma_rx_3_mixer_controls,
925
ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
926
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
927
rx_codec_dma_rx_4_mixer_controls,
928
ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
929
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
930
rx_codec_dma_rx_5_mixer_controls,
931
ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
932
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
933
rxcodec_dma_rx_6_mixer_controls,
934
ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
935
SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
936
rx_codec_dma_rx_7_mixer_controls,
937
ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
938
SND_SOC_DAPM_MIXER("USB_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
939
usb_rx_mixer_controls,
940
ARRAY_SIZE(usb_rx_mixer_controls)),
941
SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
942
mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
943
SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
944
mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
945
SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
946
mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
947
SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
948
mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
949
SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
950
mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
951
SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
952
mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
953
SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
954
mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
955
SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
956
mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
957
};
958
959
static const struct snd_soc_dapm_route intercon[] = {
960
Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
961
Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
962
"DISPLAY_PORT_RX"),
963
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
964
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
965
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
966
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
967
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
968
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
969
Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
970
Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
971
Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
972
Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
973
Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
974
Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
975
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
976
"PRIMARY_TDM_RX_0"),
977
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
978
"PRIMARY_TDM_RX_1"),
979
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
980
"PRIMARY_TDM_RX_2"),
981
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
982
"PRIMARY_TDM_RX_3"),
983
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
984
"PRIMARY_TDM_RX_4"),
985
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
986
"PRIMARY_TDM_RX_5"),
987
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
988
"PRIMARY_TDM_RX_6"),
989
Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
990
"PRIMARY_TDM_RX_7"),
991
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
992
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
993
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
994
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
995
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
996
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
997
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
998
Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
999
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
1000
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
1001
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
1002
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
1003
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
1004
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"),
1005
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"),
1006
Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"),
1007
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"),
1008
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"),
1009
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"),
1010
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"),
1011
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"),
1012
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"),
1013
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"),
1014
Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"),
1015
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"),
1016
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"),
1017
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"),
1018
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"),
1019
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"),
1020
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"),
1021
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"),
1022
Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"),
1023
Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"),
1024
Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"),
1025
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"),
1026
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"),
1027
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"),
1028
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"),
1029
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"),
1030
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"),
1031
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
1032
Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
1033
Q6ROUTING_RX_DAPM_ROUTE("USB_RX Audio Mixer", "USB_RX"),
1034
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
1035
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
1036
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
1037
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"),
1038
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"),
1039
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"),
1040
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"),
1041
Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"),
1042
1043
{"MM_UL1", NULL, "MultiMedia1 Mixer"},
1044
{"MM_UL2", NULL, "MultiMedia2 Mixer"},
1045
{"MM_UL3", NULL, "MultiMedia3 Mixer"},
1046
{"MM_UL4", NULL, "MultiMedia4 Mixer"},
1047
{"MM_UL5", NULL, "MultiMedia5 Mixer"},
1048
{"MM_UL6", NULL, "MultiMedia6 Mixer"},
1049
{"MM_UL7", NULL, "MultiMedia7 Mixer"},
1050
{"MM_UL8", NULL, "MultiMedia8 Mixer"},
1051
};
1052
1053
static int routing_hw_params(struct snd_soc_component *component,
1054
struct snd_pcm_substream *substream,
1055
struct snd_pcm_hw_params *params)
1056
{
1057
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1058
struct msm_routing_data *data = dev_get_drvdata(component->dev);
1059
unsigned int be_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
1060
struct session_data *session;
1061
int path_type;
1062
1063
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1064
path_type = ADM_PATH_PLAYBACK;
1065
else
1066
path_type = ADM_PATH_LIVE_REC;
1067
1068
if (be_id >= AFE_MAX_PORTS)
1069
return -EINVAL;
1070
1071
session = &data->port_data[be_id];
1072
1073
mutex_lock(&data->lock);
1074
1075
session->path_type = path_type;
1076
session->sample_rate = params_rate(params);
1077
session->channels = params_channels(params);
1078
1079
switch (params_format(params)) {
1080
case SNDRV_PCM_FORMAT_S16_LE:
1081
session->bits_per_sample = 16;
1082
break;
1083
case SNDRV_PCM_FORMAT_S24_LE:
1084
session->bits_per_sample = 24;
1085
break;
1086
default:
1087
break;
1088
}
1089
1090
mutex_unlock(&data->lock);
1091
return 0;
1092
}
1093
1094
static int msm_routing_probe(struct snd_soc_component *c)
1095
{
1096
int i;
1097
1098
for (i = 0; i < MAX_SESSIONS; i++) {
1099
routing_data->sessions[i].port_id = -1;
1100
routing_data->sessions[i].fedai_id = -1;
1101
}
1102
1103
return 0;
1104
}
1105
1106
static unsigned int q6routing_reg_read(struct snd_soc_component *component,
1107
unsigned int reg)
1108
{
1109
/* default value */
1110
return 0;
1111
}
1112
1113
static int q6routing_reg_write(struct snd_soc_component *component,
1114
unsigned int reg, unsigned int val)
1115
{
1116
/* dummy */
1117
return 0;
1118
}
1119
1120
static const struct snd_soc_component_driver msm_soc_routing_component = {
1121
.probe = msm_routing_probe,
1122
.name = DRV_NAME,
1123
.hw_params = routing_hw_params,
1124
.dapm_widgets = msm_qdsp6_widgets,
1125
.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
1126
.dapm_routes = intercon,
1127
.num_dapm_routes = ARRAY_SIZE(intercon),
1128
.read = q6routing_reg_read,
1129
.write = q6routing_reg_write,
1130
};
1131
1132
static int q6pcm_routing_probe(struct platform_device *pdev)
1133
{
1134
struct device *dev = &pdev->dev;
1135
1136
routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL);
1137
if (!routing_data)
1138
return -ENOMEM;
1139
1140
routing_data->dev = dev;
1141
1142
mutex_init(&routing_data->lock);
1143
dev_set_drvdata(dev, routing_data);
1144
1145
return devm_snd_soc_register_component(dev, &msm_soc_routing_component,
1146
NULL, 0);
1147
}
1148
1149
static void q6pcm_routing_remove(struct platform_device *pdev)
1150
{
1151
kfree(routing_data);
1152
routing_data = NULL;
1153
}
1154
1155
#ifdef CONFIG_OF
1156
static const struct of_device_id q6pcm_routing_device_id[] = {
1157
{ .compatible = "qcom,q6adm-routing" },
1158
{},
1159
};
1160
MODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
1161
#endif
1162
1163
static struct platform_driver q6pcm_routing_platform_driver = {
1164
.driver = {
1165
.name = "q6routing",
1166
.of_match_table = of_match_ptr(q6pcm_routing_device_id),
1167
},
1168
.probe = q6pcm_routing_probe,
1169
.remove = q6pcm_routing_remove,
1170
};
1171
module_platform_driver(q6pcm_routing_platform_driver);
1172
1173
MODULE_DESCRIPTION("Q6 Routing platform");
1174
MODULE_LICENSE("GPL v2");
1175
1176