blob: c40c031e3fe2a2eddc0ac51c1eca69310f253fa3 [file] [log] [blame]
Soumya Managoli9d627242018-02-24 16:13:25 +05301/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/of.h>
jinjiawudd9f8272020-05-28 14:56:15 +080014//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -s
15#include <linux/gpio.h>
16//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -e
Soumya Managoli9d627242018-02-24 16:13:25 +053017#include <sound/core.h>
18#include <sound/soc.h>
19#include <sound/soc-dapm.h>
20#include <sound/pcm.h>
21#include "msm8952-slimbus.h"
22#include "msm-pcm-routing-v2.h"
23#include "codecs/wcd9335.h"
24
25#define DEV_NAME_STR_LEN 32
26
jinjiawudd9f8272020-05-28 14:56:15 +080027//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -s
28#define PSTAGE_0 97
29#define PSTAGE_1 98
30#define PSTAGE_2 99
31//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -e
32
Soumya Managoli9d627242018-02-24 16:13:25 +053033/* dummy definition of below deprecated FE DAI's*/
34enum {
35 MSM_FRONTEND_DAI_CS_VOICE = 39,
36 MSM_FRONTEND_DAI_VOICE2,
37 MSM_FRONTEND_DAI_VOLTE,
38 MSM_FRONTEND_DAI_VOWLAN,
39};
40
41enum TASHA_LITE_DEVICE {
42 MSM8952_TASHA_LITE = 0,
43 MSM8953_TASHA_LITE,
44 NUM_OF_TASHA_LITE_DEVICE,
45};
46
47static struct snd_soc_card snd_soc_card_msm_card;
48
49static struct snd_soc_ops msm8952_quat_mi2s_be_ops = {
50 .startup = msm_quat_mi2s_snd_startup,
51 .hw_params = msm_mi2s_snd_hw_params,
52 .shutdown = msm_quat_mi2s_snd_shutdown,
53};
54
55static struct snd_soc_ops msm8952_quin_mi2s_be_ops = {
56 .startup = msm_quin_mi2s_snd_startup,
57 .hw_params = msm_mi2s_snd_hw_params,
58 .shutdown = msm_quin_mi2s_snd_shutdown,
59};
60
61static struct snd_soc_ops msm_pri_auxpcm_be_ops = {
62 .startup = msm_prim_auxpcm_startup,
63 .shutdown = msm_prim_auxpcm_shutdown,
64};
65
66static struct snd_soc_ops msm8952_slimbus_be_ops = {
67 .hw_params = msm_snd_hw_params,
68};
69
70
71static struct snd_soc_ops msm8952_cpe_ops = {
72 .hw_params = msm_snd_cpe_hw_params,
73};
74
75static struct snd_soc_ops msm8952_slimbus_2_be_ops = {
76 .hw_params = msm8952_slimbus_2_hw_params,
77};
78
79static struct snd_soc_ops msm_tdm_be_ops = {
80 .startup = msm_tdm_startup,
81 .hw_params = msm_tdm_snd_hw_params,
82 .shutdown = msm_tdm_shutdown,
83};
84
85static struct snd_soc_dai_link msm8952_tasha_fe_dai[] = {
86 /* tasha_vifeedback for speaker protection */
87 {
88 .name = LPASS_BE_SLIMBUS_4_TX,
89 .stream_name = "Slimbus4 Capture",
90 .cpu_dai_name = "msm-dai-q6-dev.16393",
91 .platform_name = "msm-pcm-hostless",
92 .codec_name = "tasha_codec",
93 .codec_dai_name = "tasha_vifeedback",
94 .id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
95 .be_hw_params_fixup = msm_slim_4_tx_be_hw_params_fixup,
96 .ops = &msm8952_slimbus_be_ops,
97 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
98 .ignore_suspend = 1,
99 },
100 /* Ultrasound RX DAI Link */
101 {
102 .name = "SLIMBUS_2 Hostless Playback",
103 .stream_name = "SLIMBUS_2 Hostless Playback",
104 .cpu_dai_name = "msm-dai-q6-dev.16388",
105 .platform_name = "msm-pcm-hostless",
106 .codec_name = "tasha_codec",
107 .codec_dai_name = "tasha_rx2",
108 .ignore_suspend = 1,
109 .dpcm_playback = 1,
110 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
111 .ops = &msm8952_slimbus_2_be_ops,
112 },
113 /* Ultrasound TX DAI Link */
114 {
115 .name = "SLIMBUS_2 Hostless Capture",
116 .stream_name = "SLIMBUS_2 Hostless Capture",
117 .cpu_dai_name = "msm-dai-q6-dev.16389",
118 .platform_name = "msm-pcm-hostless",
119 .codec_name = "tasha_codec",
120 .codec_dai_name = "tasha_tx2",
121 .ignore_suspend = 1,
122 .dpcm_capture = 1,
123 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
124 .ops = &msm8952_slimbus_2_be_ops,
125 },
126 /* CPE LSM direct dai-link */
127 {
128 .name = "CPE Listen service",
129 .stream_name = "CPE Listen Audio Service",
130 .cpu_dai_name = "msm-dai-slim",
Soumya Managolid4db3812018-03-01 17:40:05 +0530131 .platform_name = "msm-cpe-lsm",
Soumya Managoli9d627242018-02-24 16:13:25 +0530132 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
133 SND_SOC_DPCM_TRIGGER_POST},
134 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
135 .ignore_suspend = 1,
136 .dpcm_capture = 1,
137 .codec_dai_name = "tasha_mad1",
138 .codec_name = "tasha_codec",
139 .ops = &msm8952_cpe_ops,
140 },
141 /* slimbus rx 6 hostless */
142 {
143 .name = "SLIMBUS_6 Hostless Playback",
144 .stream_name = "SLIMBUS_6 Hostless",
145 .cpu_dai_name = "SLIMBUS6_HOSTLESS",
146 .platform_name = "msm-pcm-hostless",
147 .dynamic = 1,
148 .dpcm_playback = 1,
149 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
150 SND_SOC_DPCM_TRIGGER_POST},
151 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
152 .ignore_suspend = 1,
153 /* this dailink has playback support */
154 .codec_dai_name = "snd-soc-dummy-dai",
155 .codec_name = "snd-soc-dummy",
156 },
157 /* QCHAT */
158 {/* hw:x,42 */
159 .name = "QCHAT",
160 .stream_name = "QCHAT",
161 .cpu_dai_name = "QCHAT",
162 .platform_name = "msm-pcm-voice",
163 .dynamic = 1,
164 .dpcm_playback = 1,
165 .dpcm_capture = 1,
166 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
167 SND_SOC_DPCM_TRIGGER_POST},
168 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
169 .ignore_suspend = 1,
170 .codec_dai_name = "snd-soc-dummy-dai",
171 .codec_name = "snd-soc-dummy",
172 .id = MSM_FRONTEND_DAI_QCHAT,
173 },
174};
175
176static struct snd_soc_dai_link msm8952_tasha_be_dai[] = {
177 /* Backend DAI Links */
178 {
179 .name = LPASS_BE_SLIMBUS_0_RX,
180 .stream_name = "Slimbus Playback",
181 .cpu_dai_name = "msm-dai-q6-dev.16384",
182 .platform_name = "msm-pcm-routing",
183 .codec_name = "tasha_codec",
184 .codec_dai_name = "tasha_mix_rx1",
185 .no_pcm = 1,
186 .dpcm_playback = 1,
187 .id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
188 .init = &msm_audrx_init,
189 .be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
190 /* this dainlink has playback support */
191 .ignore_pmdown_time = 1,
192 .ignore_suspend = 1,
193 .ops = &msm8952_slimbus_be_ops,
194 },
195 {
196 .name = LPASS_BE_SLIMBUS_0_TX,
197 .stream_name = "Slimbus Capture",
198 .cpu_dai_name = "msm-dai-q6-dev.16385",
199 .platform_name = "msm-pcm-routing",
200 .codec_name = "tasha_codec",
201 .codec_dai_name = "tasha_tx1",
202 .no_pcm = 1,
203 .dpcm_capture = 1,
204 .id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
205 .be_hw_params_fixup = msm_slim_0_tx_be_hw_params_fixup,
206 .ignore_suspend = 1,
207 .ops = &msm8952_slimbus_be_ops,
208 },
209 {
210 .name = LPASS_BE_SLIMBUS_1_RX,
211 .stream_name = "Slimbus1 Playback",
212 .cpu_dai_name = "msm-dai-q6-dev.16386",
213 .platform_name = "msm-pcm-routing",
214 .codec_name = "tasha_codec",
215 .codec_dai_name = "tasha_mix_rx1",
216 .no_pcm = 1,
217 .dpcm_playback = 1,
218 .id = MSM_BACKEND_DAI_SLIMBUS_1_RX,
219 .be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
220 .ops = &msm8952_slimbus_be_ops,
221 /* dai link has playback support */
222 .ignore_pmdown_time = 1,
223 .ignore_suspend = 1,
224 },
225 {
226 .name = LPASS_BE_SLIMBUS_1_TX,
227 .stream_name = "Slimbus1 Capture",
228 .cpu_dai_name = "msm-dai-q6-dev.16387",
229 .platform_name = "msm-pcm-routing",
230 .codec_name = "tasha_codec",
231 .codec_dai_name = "tasha_tx3",
232 .no_pcm = 1,
233 .dpcm_capture = 1,
234 .id = MSM_BACKEND_DAI_SLIMBUS_1_TX,
235 .be_hw_params_fixup = msm_slim_1_tx_be_hw_params_fixup,
236 .ops = &msm8952_slimbus_be_ops,
237 .ignore_suspend = 1,
238 },
239 {
240 .name = LPASS_BE_SLIMBUS_3_RX,
241 .stream_name = "Slimbus3 Playback",
242 .cpu_dai_name = "msm-dai-q6-dev.16390",
243 .platform_name = "msm-pcm-routing",
244 .codec_name = "tasha_codec",
245 .codec_dai_name = "tasha_mix_rx1",
246 .no_pcm = 1,
247 .dpcm_playback = 1,
248 .id = MSM_BACKEND_DAI_SLIMBUS_3_RX,
249 .be_hw_params_fixup = msm_slim_0_rx_be_hw_params_fixup,
250 .ops = &msm8952_slimbus_be_ops,
251 /* dai link has playback support */
252 .ignore_pmdown_time = 1,
253 .ignore_suspend = 1,
254 },
255 {
256 .name = LPASS_BE_SLIMBUS_3_TX,
257 .stream_name = "Slimbus3 Capture",
258 .cpu_dai_name = "msm-dai-q6-dev.16391",
259 .platform_name = "msm-pcm-routing",
260 .codec_name = "tasha_codec",
261 .codec_dai_name = "tasha_tx1",
262 .no_pcm = 1,
263 .dpcm_capture = 1,
264 .id = MSM_BACKEND_DAI_SLIMBUS_3_TX,
265 .be_hw_params_fixup = msm_slim_0_tx_be_hw_params_fixup,
266 .ops = &msm8952_slimbus_be_ops,
267 .ignore_suspend = 1,
268 },
269 {
270 .name = LPASS_BE_SLIMBUS_4_RX,
271 .stream_name = "Slimbus4 Playback",
272 .cpu_dai_name = "msm-dai-q6-dev.16392",
273 .platform_name = "msm-pcm-routing",
274 .codec_name = "tasha_codec",
275 .codec_dai_name = "tasha_mix_rx1",
276 .no_pcm = 1,
277 .dpcm_playback = 1,
278 .id = MSM_BACKEND_DAI_SLIMBUS_4_RX,
279 .be_hw_params_fixup = msm_slim_4_rx_be_hw_params_fixup,
280 .ops = &msm8952_slimbus_be_ops,
281 /* dai link has playback support */
282 .ignore_pmdown_time = 1,
283 .ignore_suspend = 1,
284 },
285 {
286 .name = LPASS_BE_SLIMBUS_5_RX,
287 .stream_name = "Slimbus5 Playback",
288 .cpu_dai_name = "msm-dai-q6-dev.16394",
289 .platform_name = "msm-pcm-routing",
290 .codec_name = "tasha_codec",
291 .codec_dai_name = "tasha_rx3",
292 .no_pcm = 1,
293 .dpcm_playback = 1,
294 .id = MSM_BACKEND_DAI_SLIMBUS_5_RX,
295 .be_hw_params_fixup = msm_slim_5_rx_be_hw_params_fixup,
296 .ops = &msm8952_slimbus_be_ops,
297 /* dai link has playback support */
298 .ignore_pmdown_time = 1,
299 .ignore_suspend = 1,
300 },
301 /* MAD BE */
302 {
303 .name = LPASS_BE_SLIMBUS_5_TX,
304 .stream_name = "Slimbus5 Capture",
305 .cpu_dai_name = "msm-dai-q6-dev.16395",
306 .platform_name = "msm-pcm-routing",
307 .codec_name = "tasha_codec",
308 .codec_dai_name = "tasha_mad1",
309 .no_pcm = 1,
310 .dpcm_capture = 1,
311 .id = MSM_BACKEND_DAI_SLIMBUS_5_TX,
312 .be_hw_params_fixup = msm_slim_5_tx_be_hw_params_fixup,
313 .ops = &msm8952_slimbus_be_ops,
314 .ignore_suspend = 1,
315 },
316 {
317 .name = LPASS_BE_SLIMBUS_6_RX,
318 .stream_name = "Slimbus6 Playback",
319 .cpu_dai_name = "msm-dai-q6-dev.16396",
320 .platform_name = "msm-pcm-routing",
321 .codec_name = "tasha_codec",
322 .codec_dai_name = "tasha_rx4",
323 .no_pcm = 1,
324 .dpcm_playback = 1,
325 .id = MSM_BACKEND_DAI_SLIMBUS_6_RX,
326 .be_hw_params_fixup = msm_slim_6_rx_be_hw_params_fixup,
327 .ops = &msm8952_slimbus_be_ops,
328 /* dai link has playback support */
329 .ignore_pmdown_time = 1,
330 .ignore_suspend = 1,
331 },
332};
333
334static struct snd_soc_dai_link msm8952_common_fe_dai[] = {
335 /* FrontEnd DAI Links */
336 {/* hw:x,0 */
337 .name = "MSM8X16 Media1",
338 .stream_name = "MultiMedia1",
339 .cpu_dai_name = "MultiMedia1",
340 .platform_name = "msm-pcm-dsp.0",
341 .dynamic = 1,
342 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
343 SND_SOC_DPCM_TRIGGER_POST},
344 .codec_dai_name = "snd-soc-dummy-dai",
345 .codec_name = "snd-soc-dummy",
346 .ignore_suspend = 1,
347 .dpcm_playback = 1,
348 .dpcm_capture = 1,
349 /* this dai link has playback support */
350 .ignore_pmdown_time = 1,
351 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
352 },
353 {/* hw:x,1 */
354 .name = "MSM8X16 Media2",
355 .stream_name = "MultiMedia2",
356 .cpu_dai_name = "MultiMedia2",
357 .platform_name = "msm-pcm-dsp.0",
358 .dynamic = 1,
359 .dpcm_playback = 1,
360 .dpcm_capture = 1,
361 .codec_dai_name = "snd-soc-dummy-dai",
362 .codec_name = "snd-soc-dummy",
363 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
364 SND_SOC_DPCM_TRIGGER_POST},
365 .ignore_suspend = 1,
366 /* this dai link has playback support */
367 .ignore_pmdown_time = 1,
368 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
369 },
370 {/* hw:x,2 */
371 .name = "Circuit-Switch Voice",
372 .stream_name = "CS-Voice",
373 .cpu_dai_name = "VoiceMMode1",
374 .platform_name = "msm-pcm-voice",
375 .dynamic = 1,
376 .dpcm_capture = 1,
377 .dpcm_playback = 1,
378 .codec_dai_name = "snd-soc-dummy-dai",
379 .codec_name = "snd-soc-dummy",
380 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
381 SND_SOC_DPCM_TRIGGER_POST},
382 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
383 .ignore_suspend = 1,
384 /* this dai link has playback support */
385 .ignore_pmdown_time = 1,
386 .id = MSM_FRONTEND_DAI_CS_VOICE,
387 },
388 {/* hw:x,3 */
389 .name = "MSM VoIP",
390 .stream_name = "VoIP",
391 .cpu_dai_name = "VoIP",
392 .platform_name = "msm-voip-dsp",
393 .dynamic = 1,
394 .dpcm_playback = 1,
395 .dpcm_capture = 1,
396 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
397 SND_SOC_DPCM_TRIGGER_POST},
398 .codec_dai_name = "snd-soc-dummy-dai",
399 .codec_name = "snd-soc-dummy",
400 .ignore_suspend = 1,
401 /* this dai link has playback support */
402 .ignore_pmdown_time = 1,
403 .id = MSM_FRONTEND_DAI_VOIP,
404 },
405 {/* hw:x,4 */
406 .name = "MSM8X16 ULL",
407 .stream_name = "ULL",
408 .cpu_dai_name = "MultiMedia3",
409 .platform_name = "msm-pcm-dsp.2",
410 .dynamic = 1,
411 .dpcm_playback = 1,
412 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
413 SND_SOC_DPCM_TRIGGER_POST},
414 .codec_dai_name = "snd-soc-dummy-dai",
415 .codec_name = "snd-soc-dummy",
416 .ignore_suspend = 1,
417 /* this dai link has playback support */
418 .ignore_pmdown_time = 1,
419 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
420 },
421 /* Hostless PCM purpose */
422 {/* hw:x,5 */
423 .name = "SLIMBUS_0 Hostless",
424 .stream_name = "SLIMBUS_0 Hostless",
425 .cpu_dai_name = "SLIMBUS0_HOSTLESS",
426 .platform_name = "msm-pcm-hostless",
427 .dynamic = 1,
428 .dpcm_capture = 1,
429 .dpcm_playback = 1,
430 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
431 SND_SOC_DPCM_TRIGGER_POST},
432 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
433 .ignore_suspend = 1,
434 .ignore_pmdown_time = 1,
435 /* This dai link has MI2S support */
436 .codec_dai_name = "snd-soc-dummy-dai",
437 .codec_name = "snd-soc-dummy",
438 },
439 {/* hw:x,6 */
440 .name = "INT_FM Hostless",
441 .stream_name = "INT_FM Hostless",
442 .cpu_dai_name = "INT_FM_HOSTLESS",
443 .platform_name = "msm-pcm-hostless",
444 .dynamic = 1,
445 .dpcm_capture = 1,
446 .dpcm_playback = 1,
447 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
448 SND_SOC_DPCM_TRIGGER_POST},
449 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
450 .ignore_suspend = 1,
451 /* this dai link has playback support */
452 .ignore_pmdown_time = 1,
453 .codec_dai_name = "snd-soc-dummy-dai",
454 .codec_name = "snd-soc-dummy",
455 },
456 {/* hw:x,7 */
457 .name = "MSM AFE-PCM RX",
458 .stream_name = "AFE-PROXY RX",
459 .cpu_dai_name = "msm-dai-q6-dev.241",
460 .codec_name = "msm-stub-codec.1",
461 .codec_dai_name = "msm-stub-rx",
462 .platform_name = "msm-pcm-afe",
463 .ignore_suspend = 1,
464 /* this dai link has playback support */
465 .ignore_pmdown_time = 1,
466 },
467 {/* hw:x,8 */
468 .name = "MSM AFE-PCM TX",
469 .stream_name = "AFE-PROXY TX",
470 .cpu_dai_name = "msm-dai-q6-dev.240",
471 .codec_name = "msm-stub-codec.1",
472 .codec_dai_name = "msm-stub-tx",
473 .platform_name = "msm-pcm-afe",
474 .ignore_suspend = 1,
475 },
476 {/* hw:x,9 */
477 .name = "MSM8X16 Compress1",
478 .stream_name = "Compress1",
479 .cpu_dai_name = "MultiMedia4",
480 .platform_name = "msm-compress-dsp",
481 .dynamic = 1,
482 .dpcm_capture = 1,
483 .dpcm_playback = 1,
484 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
485 SND_SOC_DPCM_TRIGGER_POST},
486 .codec_dai_name = "snd-soc-dummy-dai",
487 .codec_name = "snd-soc-dummy",
488 .ignore_suspend = 1,
489 .ignore_pmdown_time = 1,
490 /* this dai link has playback support */
491 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
492 },
493 {/* hw:x,10 */
494 .name = "AUXPCM Hostless",
495 .stream_name = "AUXPCM Hostless",
496 .cpu_dai_name = "AUXPCM_HOSTLESS",
497 .platform_name = "msm-pcm-hostless",
498 .dynamic = 1,
499 .dpcm_capture = 1,
500 .dpcm_playback = 1,
501 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
502 SND_SOC_DPCM_TRIGGER_POST},
503 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
504 .ignore_suspend = 1,
505 /* this dai link has playback support */
506 .ignore_pmdown_time = 1,
507 .codec_dai_name = "snd-soc-dummy-dai",
508 .codec_name = "snd-soc-dummy",
509 },
510 {/* hw:x,11 */
511 .name = "SLIMBUS_1 Hostless",
512 .stream_name = "SLIMBUS_1 Hostless",
513 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
514 .platform_name = "msm-pcm-hostless",
515 .dynamic = 1,
516 .dpcm_capture = 1,
517 .dpcm_playback = 1,
518 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
519 SND_SOC_DPCM_TRIGGER_POST},
520 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
521 .ignore_suspend = 1,
522 .ignore_pmdown_time = 1, /* dai link has playback support */
523 .codec_dai_name = "snd-soc-dummy-dai",
524 .codec_name = "snd-soc-dummy",
525 },
526 {/* hw:x,12 */
527 .name = "MSM8952 LowLatency",
528 .stream_name = "MultiMedia5",
529 .cpu_dai_name = "MultiMedia5",
530 .platform_name = "msm-pcm-dsp.1",
531 .dynamic = 1,
532 .dpcm_capture = 1,
533 .dpcm_playback = 1,
534 .codec_dai_name = "snd-soc-dummy-dai",
535 .codec_name = "snd-soc-dummy",
536 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
537 SND_SOC_DPCM_TRIGGER_POST},
538 .ignore_suspend = 1,
539 /* this dai link has playback support */
540 .ignore_pmdown_time = 1,
541 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
542 },
543 {/* hw:x,13 */
544 .name = "Voice2",
545 .stream_name = "Voice2",
546 .cpu_dai_name = "VoiceMMode1",
547 .platform_name = "msm-pcm-voice",
548 .dynamic = 1,
549 .dpcm_capture = 1,
550 .dpcm_playback = 1,
551 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
552 SND_SOC_DPCM_TRIGGER_POST},
553 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
554 .ignore_suspend = 1,
555 /* this dai link has playback support */
556 .ignore_pmdown_time = 1,
557 .codec_dai_name = "snd-soc-dummy-dai",
558 .codec_name = "snd-soc-dummy",
559 .id = MSM_FRONTEND_DAI_VOICE2,
560 },
561 {/* hw:x,14 */
562 .name = "MSM8952 Media9",
563 .stream_name = "MultiMedia9",
564 .cpu_dai_name = "MultiMedia9",
565 .platform_name = "msm-pcm-dsp.0",
566 .dynamic = 1,
567 .dpcm_capture = 1,
568 .dpcm_playback = 1,
569 .codec_dai_name = "snd-soc-dummy-dai",
570 .codec_name = "snd-soc-dummy",
571 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
572 SND_SOC_DPCM_TRIGGER_POST},
573 .ignore_suspend = 1,
574 /* This dailink has playback support */
575 .ignore_pmdown_time = 1,
576 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
577 },
578 { /* hw:x,15 */
579 .name = "VoLTE",
580 .stream_name = "VoLTE",
581 .cpu_dai_name = "VoiceMMode1",
582 .platform_name = "msm-pcm-voice",
583 .dynamic = 1,
584 .dpcm_capture = 1,
585 .dpcm_playback = 1,
586 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
587 SND_SOC_DPCM_TRIGGER_POST},
588 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
589 .ignore_suspend = 1,
590 /* this dai link has playback support */
591 .ignore_pmdown_time = 1,
592 .codec_dai_name = "snd-soc-dummy-dai",
593 .codec_name = "snd-soc-dummy",
594 .id = MSM_FRONTEND_DAI_VOLTE,
595 },
596 { /* hw:x,16 */
597 .name = "VoWLAN",
598 .stream_name = "VoWLAN",
599 .cpu_dai_name = "VoiceMMode1",
600 .platform_name = "msm-pcm-voice",
601 .dynamic = 1,
602 .dpcm_capture = 1,
603 .dpcm_playback = 1,
604 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
605 SND_SOC_DPCM_TRIGGER_POST},
606 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
607 .ignore_suspend = 1,
608 .ignore_pmdown_time = 1,
609 .codec_dai_name = "snd-soc-dummy-dai",
610 .codec_name = "snd-soc-dummy",
611 .id = MSM_FRONTEND_DAI_VOWLAN,
612 },
613 {/* hw:x,17 */
614 .name = "INT_HFP_BT Hostless",
615 .stream_name = "INT_HFP_BT Hostless",
616 .cpu_dai_name = "INT_HFP_BT_HOSTLESS",
617 .platform_name = "msm-pcm-hostless",
618 .dynamic = 1,
619 .dpcm_capture = 1,
620 .dpcm_playback = 1,
621 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
622 SND_SOC_DPCM_TRIGGER_POST},
623 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
624 .ignore_suspend = 1,
625 /* this dai link has playback support */
626 .ignore_pmdown_time = 1,
627 .codec_dai_name = "snd-soc-dummy-dai",
628 .codec_name = "snd-soc-dummy",
629 },
630 {/* hw:x,18 */
631 .name = "MSM8916 HFP",
632 .stream_name = "MultiMedia6",
633 .cpu_dai_name = "MultiMedia6",
634 .platform_name = "msm-pcm-loopback",
635 .dynamic = 1,
636 .dpcm_capture = 1,
637 .dpcm_playback = 1,
638 .codec_dai_name = "snd-soc-dummy-dai",
639 .codec_name = "snd-soc-dummy",
640 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
641 SND_SOC_DPCM_TRIGGER_POST},
642 .ignore_suspend = 1,
643 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
644 /* this dai link has playback support */
645 .ignore_pmdown_time = 1,
646 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
647 },
648 /* LSM FE */
649 {/* hw:x,19 */
650 .name = "Listen 1 Audio Service",
651 .stream_name = "Listen 1 Audio Service",
652 .cpu_dai_name = "LSM1",
653 .platform_name = "msm-lsm-client",
654 .dynamic = 1,
655 .dpcm_capture = 1,
656 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
657 SND_SOC_DPCM_TRIGGER_POST },
658 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
659 .ignore_suspend = 1,
660 .ignore_pmdown_time = 1,
661 .codec_dai_name = "snd-soc-dummy-dai",
662 .codec_name = "snd-soc-dummy",
663 .id = MSM_FRONTEND_DAI_LSM1,
664 },
665 {/* hw:x,20 */
666 .name = "Listen 2 Audio Service",
667 .stream_name = "Listen 2 Audio Service",
668 .cpu_dai_name = "LSM2",
669 .platform_name = "msm-lsm-client",
670 .dynamic = 1,
671 .dpcm_capture = 1,
672 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
673 SND_SOC_DPCM_TRIGGER_POST },
674 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
675 .ignore_suspend = 1,
676 .ignore_pmdown_time = 1,
677 .codec_dai_name = "snd-soc-dummy-dai",
678 .codec_name = "snd-soc-dummy",
679 .id = MSM_FRONTEND_DAI_LSM2,
680 },
681 {/* hw:x,21 */
682 .name = "Listen 3 Audio Service",
683 .stream_name = "Listen 3 Audio Service",
684 .cpu_dai_name = "LSM3",
685 .platform_name = "msm-lsm-client",
686 .dynamic = 1,
687 .dpcm_capture = 1,
688 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
689 SND_SOC_DPCM_TRIGGER_POST },
690 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
691 .ignore_suspend = 1,
692 .ignore_pmdown_time = 1,
693 .codec_dai_name = "snd-soc-dummy-dai",
694 .codec_name = "snd-soc-dummy",
695 .id = MSM_FRONTEND_DAI_LSM3,
696 },
697 {/* hw:x,22 */
698 .name = "Listen 4 Audio Service",
699 .stream_name = "Listen 4 Audio Service",
700 .cpu_dai_name = "LSM4",
701 .platform_name = "msm-lsm-client",
702 .dynamic = 1,
703 .dpcm_capture = 1,
704 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
705 SND_SOC_DPCM_TRIGGER_POST },
706 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
707 .ignore_suspend = 1,
708 .ignore_pmdown_time = 1,
709 .codec_dai_name = "snd-soc-dummy-dai",
710 .codec_name = "snd-soc-dummy",
711 .id = MSM_FRONTEND_DAI_LSM4,
712 },
713 {/* hw:x,23 */
714 .name = "Listen 5 Audio Service",
715 .stream_name = "Listen 5 Audio Service",
716 .cpu_dai_name = "LSM5",
717 .platform_name = "msm-lsm-client",
718 .dynamic = 1,
719 .dpcm_capture = 1,
720 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
721 SND_SOC_DPCM_TRIGGER_POST },
722 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
723 .ignore_suspend = 1,
724 .ignore_pmdown_time = 1,
725 .codec_dai_name = "snd-soc-dummy-dai",
726 .codec_name = "snd-soc-dummy",
727 .id = MSM_FRONTEND_DAI_LSM5,
728 },
729 {/* hw:x,24 */
730 .name = "MSM8X16 Compress2",
731 .stream_name = "Compress2",
732 .cpu_dai_name = "MultiMedia7",
733 .platform_name = "msm-compress-dsp",
734 .dynamic = 1,
735 .dpcm_playback = 1,
736 .codec_dai_name = "snd-soc-dummy-dai",
737 .codec_name = "snd-soc-dummy",
738 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
739 SND_SOC_DPCM_TRIGGER_POST},
740 .ignore_suspend = 1,
741 /* this dai link has playback support */
742 .ignore_pmdown_time = 1,
743 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
744 },
745 {/* hw:x,25 */
746 .name = "SLIMBUS_3 Hostless",
747 .stream_name = "SLIMBUS_3 Hostless",
748 .cpu_dai_name = "SLIMBUS3_HOSTLESS",
749 .platform_name = "msm-pcm-hostless",
750 .dynamic = 1,
751 .dpcm_capture = 1,
752 .dpcm_playback = 1,
753 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
754 SND_SOC_DPCM_TRIGGER_POST},
755 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
756 .ignore_suspend = 1,
757 .ignore_pmdown_time = 1, /* dai link has playback support */
758 .codec_dai_name = "snd-soc-dummy-dai",
759 .codec_name = "snd-soc-dummy",
760 },
761 {/* hw:x,26 */
762 .name = "SLIMBUS_4 Hostless",
763 .stream_name = "SLIMBUS_4 Hostless",
764 .cpu_dai_name = "SLIMBUS4_HOSTLESS",
765 .platform_name = "msm-pcm-hostless",
766 .dynamic = 1,
767 .dpcm_capture = 1,
768 .dpcm_playback = 1,
769 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
770 SND_SOC_DPCM_TRIGGER_POST},
771 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
772 .ignore_suspend = 1,
773 .ignore_pmdown_time = 1, /* dai link has playback support */
774 .codec_dai_name = "snd-soc-dummy-dai",
775 .codec_name = "snd-soc-dummy",
776 },
777 { /* hw:x,27 */
778 .name = "QUAT_MI2S Hostless",
779 .stream_name = "QUAT_MI2S Hostless",
780 .cpu_dai_name = "QUAT_MI2S_RX_HOSTLESS",
781 .platform_name = "msm-pcm-hostless",
782 .dynamic = 1,
783 .dpcm_playback = 1,
784 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
785 SND_SOC_DPCM_TRIGGER_POST},
786 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
787 .ignore_suspend = 1,
788 /* this dai link has playback support */
789 .ignore_pmdown_time = 1,
790 .codec_dai_name = "snd-soc-dummy-dai",
791 .codec_name = "snd-soc-dummy",
792 },
793 {/* hw:x,28 */
794 .name = "MSM8X16 Compress3",
795 .stream_name = "Compress3",
796 .cpu_dai_name = "MultiMedia10",
797 .platform_name = "msm-pcm-dsp.1",
798 .dynamic = 1,
799 .dpcm_playback = 1,
800 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
801 SND_SOC_DPCM_TRIGGER_POST},
802 .codec_dai_name = "snd-soc-dummy-dai",
803 .codec_name = "snd-soc-dummy",
804 .ignore_suspend = 1,
805 .ignore_pmdown_time = 1,
806 /* this dai link has playback support */
807 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
808 },
809 {/* hw:x,29 */
810 .name = "MSM8X16 Compress4",
811 .stream_name = "Compress4",
812 .cpu_dai_name = "MultiMedia11",
813 .platform_name = "msm-compress-dsp",
814 .dynamic = 1,
815 .dpcm_playback = 1,
816 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
817 SND_SOC_DPCM_TRIGGER_POST},
818 .codec_dai_name = "snd-soc-dummy-dai",
819 .codec_name = "snd-soc-dummy",
820 .ignore_suspend = 1,
821 .ignore_pmdown_time = 1,
822 /* this dai link has playback support */
823 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
824 },
825 {/* hw:x,30 */
826 .name = "MSM8X16 Compress5",
827 .stream_name = "Compress5",
828 .cpu_dai_name = "MultiMedia12",
829 .platform_name = "msm-compress-dsp",
830 .dynamic = 1,
831 .dpcm_playback = 1,
832 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
833 SND_SOC_DPCM_TRIGGER_POST},
834 .codec_dai_name = "snd-soc-dummy-dai",
835 .codec_name = "snd-soc-dummy",
836 .ignore_suspend = 1,
837 .ignore_pmdown_time = 1,
838 /* this dai link has playback support */
839 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
840 },
841 {/* hw:x,31 */
842 .name = "MSM8X16 Compress6",
843 .stream_name = "Compress6",
844 .cpu_dai_name = "MultiMedia13",
845 .platform_name = "msm-compress-dsp",
846 .dynamic = 1,
847 .dpcm_playback = 1,
848 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
849 SND_SOC_DPCM_TRIGGER_POST},
850 .codec_dai_name = "snd-soc-dummy-dai",
851 .codec_name = "snd-soc-dummy",
852 .ignore_suspend = 1,
853 .ignore_pmdown_time = 1,
854 /* this dai link has playback support */
855 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
856 },
857 {/* hw:x,32 */
858 .name = "MSM8X16 Compress7",
859 .stream_name = "Compress7",
860 .cpu_dai_name = "MultiMedia14",
861 .platform_name = "msm-compress-dsp",
862 .dynamic = 1,
863 .dpcm_playback = 1,
864 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
865 SND_SOC_DPCM_TRIGGER_POST},
866 .codec_dai_name = "snd-soc-dummy-dai",
867 .codec_name = "snd-soc-dummy",
868 .ignore_suspend = 1,
869 .ignore_pmdown_time = 1,
870 /* this dai link has playback support */
871 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
872 },
873 {/* hw:x,33 */
874 .name = "MSM8X16 Compress8",
875 .stream_name = "Compress8",
876 .cpu_dai_name = "MultiMedia15",
877 .platform_name = "msm-compress-dsp",
878 .dynamic = 1,
879 .dpcm_playback = 1,
880 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
881 SND_SOC_DPCM_TRIGGER_POST},
882 .codec_dai_name = "snd-soc-dummy-dai",
883 .codec_name = "snd-soc-dummy",
884 .ignore_suspend = 1,
885 .ignore_pmdown_time = 1,
886 /* this dai link has playback support */
887 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
888 },
889 {/* hw:x,34 */
890 .name = "MSM8X16 Compress9",
891 .stream_name = "Compress9",
892 .cpu_dai_name = "MultiMedia16",
893 .platform_name = "msm-pcm-dsp-noirq",
894 .dynamic = 1,
895 .dpcm_playback = 1,
896 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
897 SND_SOC_DPCM_TRIGGER_POST},
898 .codec_dai_name = "snd-soc-dummy-dai",
899 .codec_name = "snd-soc-dummy",
900 .ignore_suspend = 1,
901 .ignore_pmdown_time = 1,
902 /* this dai link has playback support */
903 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
904 },
905 {/* hw:x,35 */
906 .name = "VoiceMMode1",
907 .stream_name = "VoiceMMode1",
908 .cpu_dai_name = "VoiceMMode1",
909 .platform_name = "msm-pcm-voice",
910 .dynamic = 1,
911 .dpcm_capture = 1,
912 .dpcm_playback = 1,
913 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
914 SND_SOC_DPCM_TRIGGER_POST},
915 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
916 .ignore_suspend = 1,
917 .ignore_pmdown_time = 1,
918 .codec_dai_name = "snd-soc-dummy-dai",
919 .codec_name = "snd-soc-dummy",
920 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
921 },
922 {/* hw:x,36 */
923 .name = "VoiceMMode2",
924 .stream_name = "VoiceMMode2",
925 .cpu_dai_name = "VoiceMMode2",
926 .platform_name = "msm-pcm-voice",
927 .dynamic = 1,
928 .dpcm_capture = 1,
929 .dpcm_playback = 1,
930 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
931 SND_SOC_DPCM_TRIGGER_POST},
932 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
933 .ignore_suspend = 1,
934 .ignore_pmdown_time = 1,
935 .codec_dai_name = "snd-soc-dummy-dai",
936 .codec_name = "snd-soc-dummy",
937 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
938 },
939 {/* hw:x,37 */
940 .name = "MSM8X16 Compress10",
941 .stream_name = "Compress10",
942 .cpu_dai_name = "MultiMedia17",
943 .platform_name = "msm-compress-dsp",
944 .dynamic = 1,
945 .dpcm_capture = 1,
946 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
947 SND_SOC_DPCM_TRIGGER_POST},
948 .codec_dai_name = "snd-soc-dummy-dai",
949 .codec_name = "snd-soc-dummy",
950 .ignore_suspend = 1,
951 .ignore_pmdown_time = 1,
952 /* this dai link has playback support */
953 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
954 },
955 {/* hw:x,38 */
956 .name = "MSM8X16 Compress11",
957 .stream_name = "Compress11",
958 .cpu_dai_name = "MultiMedia18",
959 .platform_name = "msm-compress-dsp",
960 .dynamic = 1,
961 .dpcm_capture = 1,
962 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
963 SND_SOC_DPCM_TRIGGER_POST},
964 .codec_dai_name = "snd-soc-dummy-dai",
965 .codec_name = "snd-soc-dummy",
966 .ignore_suspend = 1,
967 .ignore_pmdown_time = 1,
968 /* this dai link has playback support */
969 .id = MSM_FRONTEND_DAI_MULTIMEDIA18,
970 },
971 {/* hw:x,39 */
972 .name = "MSM8X16 Compress12",
973 .stream_name = "Compress12",
974 .cpu_dai_name = "MultiMedia19",
975 .platform_name = "msm-compress-dsp",
976 .dynamic = 1,
977 .dpcm_capture = 1,
978 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
979 SND_SOC_DPCM_TRIGGER_POST},
980 .codec_dai_name = "snd-soc-dummy-dai",
981 .codec_name = "snd-soc-dummy",
982 .ignore_suspend = 1,
983 .ignore_pmdown_time = 1,
984 /* this dai link has playback support */
985 .id = MSM_FRONTEND_DAI_MULTIMEDIA19,
986 },
987};
988
989static struct snd_soc_dai_link msm8952_tdm_fe_dai[] = {
990 /* FE TDM DAI links */
991 {
992 .name = "Primary TDM RX 0 Hostless",
993 .stream_name = "Primary TDM RX 0 Hostless",
994 .cpu_dai_name = "PRI_TDM_RX_0_HOSTLESS",
995 .platform_name = "msm-pcm-hostless",
996 .dynamic = 1,
997 .dpcm_playback = 1,
998 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
999 SND_SOC_DPCM_TRIGGER_POST},
1000 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1001 .ignore_suspend = 1,
1002 .ignore_pmdown_time = 1,
1003 .codec_dai_name = "snd-soc-dummy-dai",
1004 .codec_name = "snd-soc-dummy",
1005 },
1006 {
1007 .name = "Primary TDM TX 0 Hostless",
1008 .stream_name = "Primary TDM TX 0 Hostless",
1009 .cpu_dai_name = "PRI_TDM_TX_0_HOSTLESS",
1010 .platform_name = "msm-pcm-hostless",
1011 .dynamic = 1,
1012 .dpcm_capture = 1,
1013 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1014 SND_SOC_DPCM_TRIGGER_POST},
1015 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1016 .ignore_suspend = 1,
1017 .ignore_pmdown_time = 1,
1018 .codec_dai_name = "snd-soc-dummy-dai",
1019 .codec_name = "snd-soc-dummy",
1020 },
1021 {
1022 .name = "Secondary TDM RX 0 Hostless",
1023 .stream_name = "Secondary TDM RX 0 Hostless",
1024 .cpu_dai_name = "SEC_TDM_RX_0_HOSTLESS",
1025 .platform_name = "msm-pcm-hostless",
1026 .dynamic = 1,
1027 .dpcm_playback = 1,
1028 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1029 SND_SOC_DPCM_TRIGGER_POST},
1030 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1031 .ignore_suspend = 1,
1032 .ignore_pmdown_time = 1,
1033 .codec_dai_name = "snd-soc-dummy-dai",
1034 .codec_name = "snd-soc-dummy",
1035 },
1036 {
1037 .name = "Secondary TDM TX 0 Hostless",
1038 .stream_name = "Secondary TDM TX 0 Hostless",
1039 .cpu_dai_name = "SEC_TDM_TX_0_HOSTLESS",
1040 .platform_name = "msm-pcm-hostless",
1041 .dynamic = 1,
1042 .dpcm_capture = 1,
1043 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1044 SND_SOC_DPCM_TRIGGER_POST},
1045 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1046 .ignore_suspend = 1,
1047 .ignore_pmdown_time = 1,
1048 .codec_dai_name = "snd-soc-dummy-dai",
1049 .codec_name = "snd-soc-dummy",
1050 },
1051};
1052
1053static struct snd_soc_dai_link msm8952_common_be_dai[] = {
1054 /* Backend I2S DAI Links */
1055 {
1056 .name = LPASS_BE_QUAT_MI2S_RX,
1057 .stream_name = "Quaternary MI2S Playback",
1058 .cpu_dai_name = "msm-dai-q6-mi2s.3",
1059 .platform_name = "msm-pcm-routing",
1060 .codec_dai_name = "snd-soc-dummy-dai",
1061 .codec_name = "snd-soc-dummy",
1062 .no_pcm = 1,
1063 .dpcm_playback = 1,
1064 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
1065 .be_hw_params_fixup = msm_be_hw_params_fixup,
1066 .ops = &msm8952_quat_mi2s_be_ops,
1067 .ignore_pmdown_time = 1, /* dai link has playback support */
1068 .ignore_suspend = 1,
1069 },
1070 /* Primary AUX PCM Backend DAI Links */
1071 {
1072 .name = LPASS_BE_AUXPCM_RX,
1073 .stream_name = "AUX PCM Playback",
1074 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
1075 .platform_name = "msm-pcm-routing",
1076 .codec_name = "msm-stub-codec.1",
1077 .codec_dai_name = "msm-stub-rx",
1078 .no_pcm = 1,
1079 .dpcm_playback = 1,
1080 .id = MSM_BACKEND_DAI_AUXPCM_RX,
1081 .be_hw_params_fixup = msm_auxpcm_be_params_fixup,
1082 .ops = &msm_pri_auxpcm_be_ops,
1083 .ignore_pmdown_time = 1,
1084 .ignore_suspend = 1,
1085 },
1086 {
1087 .name = LPASS_BE_AUXPCM_TX,
1088 .stream_name = "AUX PCM Capture",
1089 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
1090 .platform_name = "msm-pcm-routing",
1091 .codec_name = "msm-stub-codec.1",
1092 .codec_dai_name = "msm-stub-tx",
1093 .no_pcm = 1,
1094 .dpcm_capture = 1,
1095 .id = MSM_BACKEND_DAI_AUXPCM_TX,
1096 .be_hw_params_fixup = msm_auxpcm_be_params_fixup,
1097 .ops = &msm_pri_auxpcm_be_ops,
1098 .ignore_suspend = 1,
1099 },
1100 {
1101 .name = LPASS_BE_QUAT_MI2S_TX,
1102 .stream_name = "Quaternary MI2S Capture",
1103 .cpu_dai_name = "msm-dai-q6-mi2s.3",
1104 .platform_name = "msm-pcm-routing",
1105 .codec_dai_name = "snd-soc-dummy-dai",
1106 .codec_name = "snd-soc-dummy",
1107 .no_pcm = 1,
1108 .dpcm_capture = 1,
1109 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
1110 .be_hw_params_fixup = msm_be_hw_params_fixup,
1111 .ops = &msm8952_quat_mi2s_be_ops,
1112 .ignore_suspend = 1,
1113 },
1114 {
1115 .name = LPASS_BE_INT_BT_SCO_RX,
1116 .stream_name = "Internal BT-SCO Playback",
1117 .cpu_dai_name = "msm-dai-q6-dev.12288",
1118 .platform_name = "msm-pcm-routing",
1119 .codec_name = "msm-stub-codec.1",
1120 .codec_dai_name = "msm-stub-rx",
1121 .no_pcm = 1,
1122 .dpcm_playback = 1,
1123 .id = MSM_BACKEND_DAI_INT_BT_SCO_RX,
1124 .be_hw_params_fixup = msm_btsco_be_hw_params_fixup,
1125 /* this dai link has playback support */
1126 .ignore_pmdown_time = 1,
1127 .ignore_suspend = 1,
1128 },
1129 {
1130 .name = LPASS_BE_INT_BT_SCO_TX,
1131 .stream_name = "Internal BT-SCO Capture",
1132 .cpu_dai_name = "msm-dai-q6-dev.12289",
1133 .platform_name = "msm-pcm-routing",
1134 .codec_name = "msm-stub-codec.1",
1135 .codec_dai_name = "msm-stub-tx",
1136 .no_pcm = 1,
1137 .dpcm_capture = 1,
1138 .id = MSM_BACKEND_DAI_INT_BT_SCO_TX,
1139 .be_hw_params_fixup = msm_btsco_be_hw_params_fixup,
1140 .ignore_suspend = 1,
1141 },
1142 {
1143 .name = LPASS_BE_INT_FM_RX,
1144 .stream_name = "Internal FM Playback",
1145 .cpu_dai_name = "msm-dai-q6-dev.12292",
1146 .platform_name = "msm-pcm-routing",
1147 .codec_name = "msm-stub-codec.1",
1148 .codec_dai_name = "msm-stub-rx",
1149 .no_pcm = 1,
1150 .dpcm_playback = 1,
1151 .id = MSM_BACKEND_DAI_INT_FM_RX,
1152 .be_hw_params_fixup = msm_be_hw_params_fixup,
1153 /* this dai link has playback support */
1154 .ignore_pmdown_time = 1,
1155 .ignore_suspend = 1,
1156 },
1157 {
1158 .name = LPASS_BE_INT_FM_TX,
1159 .stream_name = "Internal FM Capture",
1160 .cpu_dai_name = "msm-dai-q6-dev.12293",
1161 .platform_name = "msm-pcm-routing",
1162 .codec_name = "msm-stub-codec.1",
1163 .codec_dai_name = "msm-stub-tx",
1164 .no_pcm = 1,
1165 .dpcm_capture = 1,
1166 .id = MSM_BACKEND_DAI_INT_FM_TX,
1167 .be_hw_params_fixup = msm_be_hw_params_fixup,
1168 .ignore_suspend = 1,
1169 },
1170 {
1171 .name = LPASS_BE_AFE_PCM_RX,
1172 .stream_name = "AFE Playback",
1173 .cpu_dai_name = "msm-dai-q6-dev.224",
1174 .platform_name = "msm-pcm-routing",
1175 .codec_name = "msm-stub-codec.1",
1176 .codec_dai_name = "msm-stub-rx",
1177 .no_pcm = 1,
1178 .dpcm_playback = 1,
1179 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
1180 .be_hw_params_fixup = msm_proxy_rx_be_hw_params_fixup,
1181 /* this dai link has playback support */
1182 .ignore_pmdown_time = 1,
1183 .ignore_suspend = 1,
1184 },
1185 {
1186 .name = LPASS_BE_AFE_PCM_TX,
1187 .stream_name = "AFE Capture",
1188 .cpu_dai_name = "msm-dai-q6-dev.225",
1189 .platform_name = "msm-pcm-routing",
1190 .codec_name = "msm-stub-codec.1",
1191 .codec_dai_name = "msm-stub-tx",
1192 .no_pcm = 1,
1193 .dpcm_capture = 1,
1194 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
1195 .be_hw_params_fixup = msm_proxy_tx_be_hw_params_fixup,
1196 .ignore_suspend = 1,
1197 },
1198 /* Incall Record Uplink BACK END DAI Link */
1199 {
1200 .name = LPASS_BE_INCALL_RECORD_TX,
1201 .stream_name = "Voice Uplink Capture",
1202 .cpu_dai_name = "msm-dai-q6-dev.32772",
1203 .platform_name = "msm-pcm-routing",
1204 .codec_name = "msm-stub-codec.1",
1205 .codec_dai_name = "msm-stub-tx",
1206 .no_pcm = 1,
1207 .dpcm_capture = 1,
1208 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
1209 .be_hw_params_fixup = msm_be_hw_params_fixup,
1210 .ignore_suspend = 1,
1211 },
1212 /* Incall Record Downlink BACK END DAI Link */
1213 {
1214 .name = LPASS_BE_INCALL_RECORD_RX,
1215 .stream_name = "Voice Downlink Capture",
1216 .cpu_dai_name = "msm-dai-q6-dev.32771",
1217 .platform_name = "msm-pcm-routing",
1218 .codec_name = "msm-stub-codec.1",
1219 .codec_dai_name = "msm-stub-tx",
1220 .no_pcm = 1,
1221 .dpcm_capture = 1,
1222 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
1223 .be_hw_params_fixup = msm_be_hw_params_fixup,
1224 .ignore_suspend = 1,
1225 },
1226 /* Incall Music BACK END DAI Link */
1227 {
1228 .name = LPASS_BE_VOICE_PLAYBACK_TX,
1229 .stream_name = "Voice Farend Playback",
1230 .cpu_dai_name = "msm-dai-q6-dev.32773",
1231 .platform_name = "msm-pcm-routing",
1232 .codec_name = "msm-stub-codec.1",
1233 .codec_dai_name = "msm-stub-rx",
1234 .no_pcm = 1,
1235 .dpcm_playback = 1,
1236 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
1237 .be_hw_params_fixup = msm_be_hw_params_fixup,
1238 .ignore_pmdown_time = 1,
1239 .ignore_suspend = 1,
1240 },
1241 /* Incall Music 2 BACK END DAI Link */
1242 {
1243 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
1244 .stream_name = "Voice2 Farend Playback",
1245 .cpu_dai_name = "msm-dai-q6-dev.32770",
1246 .platform_name = "msm-pcm-routing",
1247 .codec_name = "msm-stub-codec.1",
1248 .codec_dai_name = "msm-stub-rx",
1249 .no_pcm = 1,
1250 .dpcm_playback = 1,
1251 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
1252 .be_hw_params_fixup = msm_be_hw_params_fixup,
1253 .ignore_pmdown_time = 1,
1254 .ignore_suspend = 1,
1255 },
1256
1257 {
1258 .name = LPASS_BE_QUIN_MI2S_TX,
1259 .stream_name = "Quinary MI2S Capture",
1260 .cpu_dai_name = "msm-dai-q6-mi2s.5",
1261 .platform_name = "msm-pcm-routing",
1262 .codec_dai_name = "snd-soc-dummy-dai",
1263 .codec_name = "snd-soc-dummy",
1264 .no_pcm = 1,
1265 .dpcm_capture = 1,
1266 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
1267 .be_hw_params_fixup = msm_be_hw_params_fixup,
1268 .ops = &msm8952_quin_mi2s_be_ops,
1269 .ignore_suspend = 1,
1270 },
1271};
1272
jinjiawuea345752020-05-14 18:02:21 +08001273//[FairPhone][Audio][jinjia]=2018.11.21=smart amp porting. -s
Soumya Managoli9d627242018-02-24 16:13:25 +05301274static struct snd_soc_dai_link msm8952_quin_dai_link[] = {
1275 {
1276 .name = LPASS_BE_QUIN_MI2S_RX,
1277 .stream_name = "Quinary MI2S Playback",
1278 .cpu_dai_name = "msm-dai-q6-mi2s.5",
1279 .platform_name = "msm-pcm-routing",
jinjiawuea345752020-05-14 18:02:21 +08001280 .codec_dai_name = "aw8898-aif",
1281 .codec_name = "aw8898_smartpa",
1282 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS,
Soumya Managoli9d627242018-02-24 16:13:25 +05301283 .no_pcm = 1,
1284 .dpcm_playback = 1,
1285 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
1286 .be_hw_params_fixup = msm_quin_be_hw_params_fixup,
1287 .ops = &msm8952_quin_mi2s_be_ops,
1288 .ignore_pmdown_time = 1, /* dai link has playback support */
1289 .ignore_suspend = 1,
1290 },
1291};
jinjiawuea345752020-05-14 18:02:21 +08001292//[FairPhone][Audio][jinjia]=2018.11.21=smart amp porting. -e
jinjiawudd9f8272020-05-28 14:56:15 +08001293//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -s
1294static struct snd_soc_dai_link msm8952_quin_dai_link_tas2557[] = {
1295 {
1296 .name = LPASS_BE_QUIN_MI2S_RX,
1297 .stream_name = "Quinary MI2S Playback",
1298 .cpu_dai_name = "msm-dai-q6-mi2s.5",
1299 .platform_name = "msm-pcm-routing",
1300 .codec_dai_name = "tas2557 ASI1",
1301 .codec_name = "tas2557.6-004c",
1302 //.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS,
1303 .no_pcm = 1,
1304 .dpcm_playback = 1,
1305 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
1306 .be_hw_params_fixup = msm_quin_be_hw_params_fixup,
1307 .ops = &msm8952_quin_mi2s_be_ops,
1308 .ignore_pmdown_time = 1, /* dai link has playback support */
1309 .ignore_suspend = 1,
1310 },
1311};
1312//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -e
Soumya Managoli9d627242018-02-24 16:13:25 +05301313
1314static struct snd_soc_dai_link msm8952_tdm_be_dai_link[] = {
1315 /* TDM be dai links */
1316 {
1317 .name = LPASS_BE_PRI_TDM_RX_0,
1318 .stream_name = "Primary TDM0 Playback",
1319 .cpu_dai_name = "msm-dai-q6-tdm.36864",
1320 .platform_name = "msm-pcm-routing",
1321 .codec_name = "msm-stub-codec.1",
1322 .codec_dai_name = "msm-stub-rx",
1323 .no_pcm = 1,
1324 .dpcm_playback = 1,
1325 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
1326 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
1327 .ops = &msm_tdm_be_ops,
1328 .ignore_pmdown_time = 1,
1329 .ignore_suspend = 1,
1330 },
1331 {
1332 .name = LPASS_BE_PRI_TDM_TX_0,
1333 .stream_name = "Primary TDM0 Capture",
1334 .cpu_dai_name = "msm-dai-q6-tdm.36865",
1335 .platform_name = "msm-pcm-routing",
1336 .codec_name = "msm-stub-codec.1",
1337 .codec_dai_name = "msm-stub-tx",
1338 .no_pcm = 1,
1339 .dpcm_capture = 1,
1340 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
1341 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
1342 .ops = &msm_tdm_be_ops,
1343 .ignore_suspend = 1,
1344 },
1345 {
1346 .name = LPASS_BE_SEC_TDM_RX_0,
1347 .stream_name = "Secondary TDM0 Playback",
1348 .cpu_dai_name = "msm-dai-q6-tdm.36880",
1349 .platform_name = "msm-pcm-routing",
1350 .codec_name = "msm-stub-codec.1",
1351 .codec_dai_name = "msm-stub-rx",
1352 .no_pcm = 1,
1353 .dpcm_playback = 1,
1354 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
1355 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
1356 .ops = &msm_tdm_be_ops,
1357 .ignore_pmdown_time = 1,
1358 .ignore_suspend = 1,
1359 },
1360 {
1361 .name = LPASS_BE_SEC_TDM_TX_0,
1362 .stream_name = "Secondary TDM0 Capture",
1363 .cpu_dai_name = "msm-dai-q6-tdm.36881",
1364 .platform_name = "msm-pcm-routing",
1365 .codec_name = "msm-stub-codec.1",
1366 .codec_dai_name = "msm-stub-tx",
1367 .no_pcm = 1,
1368 .dpcm_capture = 1,
1369 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
1370 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
1371 .ops = &msm_tdm_be_ops,
1372 .ignore_suspend = 1,
1373 },
1374};
1375
1376struct msm895x_wsa881x_dev_info {
1377 struct device_node *of_node;
1378 u32 index;
1379};
1380
1381static struct snd_soc_aux_dev *msm895x_aux_dev;
1382static struct snd_soc_codec_conf *msm895x_codec_conf;
1383
jinjiawuea345752020-05-14 18:02:21 +08001384//[FairPhone][Audio][jinjia]=2018.11.21=smart amp porting. -s
Soumya Managoli9d627242018-02-24 16:13:25 +05301385static struct snd_soc_dai_link msm8952_tasha_dai_links[
1386ARRAY_SIZE(msm8952_common_fe_dai) +
1387ARRAY_SIZE(msm8952_tasha_fe_dai) +
1388ARRAY_SIZE(msm8952_tdm_fe_dai) +
1389ARRAY_SIZE(msm8952_common_be_dai) +
1390ARRAY_SIZE(msm8952_tasha_be_dai) +
jinjiawuea345752020-05-14 18:02:21 +08001391ARRAY_SIZE(msm8952_quin_dai_link) +
Soumya Managoli9d627242018-02-24 16:13:25 +05301392ARRAY_SIZE(msm8952_tdm_be_dai_link)];
jinjiawuea345752020-05-14 18:02:21 +08001393//[FairPhone][Audio][jinjia]=2018.11.21=smart amp porting. -e
Soumya Managoli9d627242018-02-24 16:13:25 +05301394
1395int msm8952_init_wsa_dev(struct platform_device *pdev,
1396 struct snd_soc_card *card)
1397{
1398 struct device_node *wsa_of_node;
1399 u32 wsa_max_devs;
1400 u32 wsa_dev_cnt;
1401 char *dev_name_str = NULL;
1402 struct msm895x_wsa881x_dev_info *wsa881x_dev_info;
1403 const char *wsa_auxdev_name_prefix[1];
1404 int found = 0;
1405 int i;
1406 int ret;
1407
1408 /* Get maximum WSA device count for this platform */
1409 ret = of_property_read_u32(pdev->dev.of_node,
1410 "qcom,wsa-max-devs", &wsa_max_devs);
1411 if (ret) {
1412 dev_dbg(&pdev->dev,
1413 "%s: wsa-max-devs property missing in DT %s, ret = %d\n",
1414 __func__, pdev->dev.of_node->full_name, ret);
1415 card->num_aux_devs = 0;
1416 return 0;
1417 }
1418 if (wsa_max_devs == 0) {
1419 dev_warn(&pdev->dev,
1420 "%s: Max WSA devices is 0 for this target?\n",
1421 __func__);
1422 card->num_aux_devs = 0;
1423 return 0;
1424 }
1425
1426 /* Get count of WSA device phandles for this platform */
1427 wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node,
1428 "qcom,wsa-devs", NULL);
1429 if (wsa_dev_cnt == -ENOENT) {
1430 dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n",
1431 __func__);
1432 return 0;
1433 } else if (wsa_dev_cnt <= 0) {
1434 dev_err(&pdev->dev,
1435 "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n",
1436 __func__, wsa_dev_cnt);
1437 return -EINVAL;
1438 }
1439
1440 /*
1441 * Expect total phandles count to be NOT less than maximum possible
1442 * WSA count. However, if it is less, then assign same value to
1443 * max count as well.
1444 */
1445
1446 if (wsa_dev_cnt < wsa_max_devs) {
1447 dev_dbg(&pdev->dev,
1448 "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n",
1449 __func__, wsa_max_devs, wsa_dev_cnt);
1450 wsa_max_devs = wsa_dev_cnt;
1451 }
1452
1453 /* Make sure prefix string passed for each WSA device */
1454 ret = of_property_count_strings(pdev->dev.of_node,
1455 "qcom,wsa-aux-dev-prefix");
1456 if (ret != wsa_dev_cnt) {
1457 dev_err(&pdev->dev,
1458 "%s: expecting %d wsa prefix. Defined only %d in DT\n",
1459 __func__, wsa_dev_cnt, ret);
1460 return -EINVAL;
1461 }
1462
1463 /*
1464 * Alloc mem to store phandle and index info of WSA device, if already
1465 * registered with ALSA core
1466 */
1467 wsa881x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
1468 sizeof(struct msm895x_wsa881x_dev_info),
1469 GFP_KERNEL);
1470 if (!wsa881x_dev_info)
1471 return -ENOMEM;
1472
1473 /*
1474 * search and check whether all WSA devices are already
1475 * registered with ALSA core or not. If found a node, store
1476 * the node and the index in a local array of struct for later
1477 * use.
1478 */
1479 for (i = 0; i < wsa_dev_cnt; i++) {
1480 wsa_of_node = of_parse_phandle(pdev->dev.of_node,
1481 "qcom,wsa-devs", i);
1482 if (unlikely(!wsa_of_node)) {
1483 /* we should not be here */
1484 dev_err(&pdev->dev,
1485 "%s: wsa dev node is not present\n",
1486 __func__);
1487 ret = -EINVAL;
1488 goto err_free_dev_info;
1489 }
1490 if (soc_find_component(wsa_of_node, NULL)) {
1491 /* WSA device registered with ALSA core */
1492 wsa881x_dev_info[found].of_node = wsa_of_node;
1493 wsa881x_dev_info[found].index = i;
1494 found++;
1495 if (found == wsa_max_devs)
1496 break;
1497 }
1498 }
1499
1500 if (found < wsa_max_devs) {
1501 dev_dbg(&pdev->dev,
1502 "%s: failed to find %d components. Found only %d\n",
1503 __func__, wsa_max_devs, found);
1504 return -EPROBE_DEFER;
1505 }
1506 dev_info(&pdev->dev,
1507 "%s: found %d wsa881x devices registered with ALSA core\n",
1508 __func__, found);
1509
1510 card->num_aux_devs = wsa_max_devs;
1511 card->num_configs = wsa_max_devs;
1512
1513 /* Alloc array of AUX devs struct */
1514 msm895x_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs,
1515 sizeof(struct snd_soc_aux_dev),
1516 GFP_KERNEL);
1517 if (!msm895x_aux_dev) {
1518 ret = -ENOMEM;
1519 goto err_free_dev_info;
1520 }
1521
1522 /* Alloc array of codec conf struct */
1523 msm895x_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs,
1524 sizeof(struct snd_soc_codec_conf),
1525 GFP_KERNEL);
1526 if (!msm895x_codec_conf) {
1527 ret = -ENOMEM;
1528 goto err_free_aux_dev;
1529 }
1530
1531 for (i = 0; i < card->num_aux_devs; i++) {
1532 dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN,
1533 GFP_KERNEL);
1534 if (!dev_name_str) {
1535 ret = -ENOMEM;
1536 goto err_free_cdc_conf;
1537 }
1538
1539 ret = of_property_read_string_index(pdev->dev.of_node,
1540 "qcom,wsa-aux-dev-prefix",
1541 wsa881x_dev_info[i].index,
1542 wsa_auxdev_name_prefix);
1543 if (ret) {
1544 dev_err(&pdev->dev,
1545 "%s: failed to read wsa aux dev prefix, ret = %d\n",
1546 __func__, ret);
1547 ret = -EINVAL;
1548 goto err_free_dev_name_str;
1549 }
1550
1551 snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i);
1552 msm895x_aux_dev[i].name = dev_name_str;
1553 msm895x_aux_dev[i].codec_name = NULL;
1554 msm895x_aux_dev[i].codec_of_node =
1555 wsa881x_dev_info[i].of_node;
1556 msm895x_aux_dev[i].init = msm895x_wsa881x_init;
1557 msm895x_codec_conf[i].dev_name = NULL;
1558 msm895x_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0];
1559 msm895x_codec_conf[i].of_node =
1560 wsa881x_dev_info[i].of_node;
1561 }
1562 card->codec_conf = msm895x_codec_conf;
1563 card->aux_dev = msm895x_aux_dev;
1564
1565 return 0;
1566err_free_dev_name_str:
1567 devm_kfree(&pdev->dev, dev_name_str);
1568err_free_cdc_conf:
1569 devm_kfree(&pdev->dev, msm895x_codec_conf);
1570err_free_aux_dev:
1571 devm_kfree(&pdev->dev, msm895x_aux_dev);
1572err_free_dev_info:
1573 devm_kfree(&pdev->dev, wsa881x_dev_info);
1574
1575 return ret;
1576}
1577
1578struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
1579{
1580 struct snd_soc_card *card = &snd_soc_card_msm_card;
1581 struct snd_soc_dai_link *msm8952_dai_links = NULL;
1582 int num_links, ret, len1, len2, len3, len4, len5 = 0;
jinjiawudd9f8272020-05-28 14:56:15 +08001583//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -s
1584 int pstage_0 = 0; //GPIO 97
1585 int pstage_1 = 0; //GPIO 98
1586 int pstage_2 = 0; //GPIO 99
1587//[FairPhone][Audio][jinjia]=2020.05.19=2nd smart amp porting. -e
1588
Soumya Managoli9d627242018-02-24 16:13:25 +05301589 enum codec_variant codec_ver = 0;
1590 const char *tasha_lite[NUM_OF_TASHA_LITE_DEVICE] = {
1591 "msm8952-tashalite-snd-card",
1592 "msm8953-tashalite-snd-card"
1593 };
1594
1595 card->dev = dev;
1596 ret = snd_soc_of_parse_card_name(card, "qcom,model");
1597 if (ret) {
1598 dev_err(dev, "%s: parse card name failed, err:%d\n",
1599 __func__, ret);
1600 return NULL;
1601 }
1602 if (strnstr(card->name, "tasha", strlen(card->name))) {
1603 codec_ver = tasha_codec_ver();
1604 if (codec_ver == WCD9XXX)
1605 return NULL;
1606 if (codec_ver == WCD9326) {
1607 if (!strcmp(card->name, "msm8952-tasha-snd-card"))
1608 card->name = tasha_lite[MSM8952_TASHA_LITE];
1609 else if (!strcmp(card->name, "msm8953-tasha-snd-card"))
1610 card->name = tasha_lite[MSM8953_TASHA_LITE];
1611 }
1612
1613 len1 = ARRAY_SIZE(msm8952_common_fe_dai);
1614 len2 = len1 + ARRAY_SIZE(msm8952_tasha_fe_dai);
1615 len3 = len2 + ARRAY_SIZE(msm8952_tdm_fe_dai);
1616 len4 = len3 + ARRAY_SIZE(msm8952_common_be_dai);
1617 len5 = len4 + ARRAY_SIZE(msm8952_tasha_be_dai);
1618 snd_soc_card_msm_card.name = card->name;
1619 card = &snd_soc_card_msm_card;
1620 num_links = ARRAY_SIZE(msm8952_tasha_dai_links);
1621 memcpy(msm8952_tasha_dai_links, msm8952_common_fe_dai,
1622 sizeof(msm8952_common_fe_dai));
1623 memcpy(msm8952_tasha_dai_links + len1,
1624 msm8952_tasha_fe_dai, sizeof(msm8952_tasha_fe_dai));
1625 memcpy(msm8952_tasha_dai_links + len2,
1626 msm8952_tdm_fe_dai, sizeof(msm8952_tdm_fe_dai));
1627 memcpy(msm8952_tasha_dai_links + len3,
1628 msm8952_common_be_dai, sizeof(msm8952_common_be_dai));
1629 memcpy(msm8952_tasha_dai_links + len4,
1630 msm8952_tasha_be_dai, sizeof(msm8952_tasha_be_dai));
1631 msm8952_dai_links = msm8952_tasha_dai_links;
1632 }
jinjiawudd9f8272020-05-28 14:56:15 +08001633
1634 //PSTAGE_0
1635 ret = gpio_request(PSTAGE_0,"PSTAGE_0 GPIO_97");
1636
1637 if(ret<0){
1638 printk("PSTAGE_0 failed to request \n");
1639 }else{
1640 gpio_direction_input(PSTAGE_0);
1641 }
1642 pstage_0 = gpio_get_value(PSTAGE_0);
1643 gpio_free(PSTAGE_0);
1644
1645 //PSTAGE_1
1646 ret = 0;
1647
1648 ret = gpio_request(PSTAGE_1,"PSTAGE_1 GPIO_98");
1649
1650 if(ret<0){
1651 printk("PSTAGE_1 failed to request \n");
1652 }else{
1653 gpio_direction_input(PSTAGE_1);
1654 }
1655 pstage_1 = gpio_get_value(PSTAGE_1);
1656 gpio_free(PSTAGE_1);
1657
1658 //PSTAGE_2
1659 ret = 0;
1660
1661 ret = gpio_request(PSTAGE_2,"PSTAGE_2 GPIO_99");
1662
1663 if(ret<0){
1664 printk("PSTAGE_2 failed to request \n");
1665 }else{
1666 gpio_direction_input(PSTAGE_2);
1667 }
1668 pstage_2 = gpio_get_value(PSTAGE_2);
1669 gpio_free(PSTAGE_2);
1670
1671 if (pstage_2 == 1 && ((pstage_1 || pstage_0) == 1)) { //Remove hdmi-codec if (of_property_read_bool(dev->of_node, "qcom,hdmi-dba-codec-rx")) {
1672 //PCB Variant : 8903MP and newer variants (PCB Variant = HLH,HHL,HHH)
1673
1674 dev_dbg(dev, "%s(): No aw8898 present, add quin dai for tas2257\n",
1675 __func__);
1676 memcpy(msm8952_dai_links + len5, msm8952_quin_dai_link_tas2557,
1677 sizeof(msm8952_quin_dai_link_tas2557));
1678 len5 += ARRAY_SIZE(msm8952_quin_dai_link_tas2557);
1679//[FairPhone][Audio][jinjia]=2018.11.21=smart amp porting. -s
1680 /*
Soumya Managoli9d627242018-02-24 16:13:25 +05301681 if (of_property_read_bool(dev->of_node, "qcom,hdmi-dba-codec-rx")) {
1682 dev_dbg(dev, "%s(): hdmi dba audio support present\n",
1683 __func__);
1684 memcpy(msm8952_dai_links + len5, msm8952_hdmi_dba_dai_link,
1685 sizeof(msm8952_hdmi_dba_dai_link));
1686 len5 += ARRAY_SIZE(msm8952_hdmi_dba_dai_link);
jinjiawuea345752020-05-14 18:02:21 +08001687 */
1688//[FairPhone][Audio][jinjia]=2018.11.21=smart amp porting. -e
jinjiawudd9f8272020-05-28 14:56:15 +08001689
Soumya Managoli9d627242018-02-24 16:13:25 +05301690 } else {
jinjiawudd9f8272020-05-28 14:56:15 +08001691 //PCB Variant : EP0 ~ 8901MP
1692 dev_dbg(dev, "%s(): No tas2257 present, add quin dai for aw8898\n",
Soumya Managoli9d627242018-02-24 16:13:25 +05301693 __func__);
1694 memcpy(msm8952_dai_links + len5, msm8952_quin_dai_link,
1695 sizeof(msm8952_quin_dai_link));
1696 len5 += ARRAY_SIZE(msm8952_quin_dai_link);
1697 }
1698 if (of_property_read_bool(dev->of_node, "qcom,tdm-audio-intf")) {
1699 dev_dbg(dev, "%s(): TDM support present\n",
1700 __func__);
1701 memcpy(msm8952_dai_links + len5, msm8952_tdm_be_dai_link,
1702 sizeof(msm8952_tdm_be_dai_link));
1703 len5 += ARRAY_SIZE(msm8952_tdm_be_dai_link);
1704 }
1705 card->dai_link = msm8952_dai_links;
1706 card->num_links = len5;
1707 card->dev = dev;
1708 return card;
1709}
1710
1711void msm895x_free_auxdev_mem(struct platform_device *pdev)
1712{
1713 struct snd_soc_card *card = platform_get_drvdata(pdev);
1714 int i;
1715
1716 if (card->num_aux_devs > 0) {
1717 for (i = 0; i < card->num_aux_devs; i++) {
1718 kfree(msm895x_aux_dev[i].codec_name);
1719 kfree(msm895x_codec_conf[i].dev_name);
1720 kfree(msm895x_codec_conf[i].name_prefix);
1721 }
1722 }
1723}