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