blob: ebcea54ae6aa08a63e0c09af7f18a41a8432f13d [file] [log] [blame]
Aditya Bavanari140a80a2018-01-03 16:51:17 +05301/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302 *
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_gpio.h>
14#include <linux/platform_device.h>
15#include <linux/module.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053016#include <sound/pcm_params.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053017#include "msm-pcm-routing-v2.h"
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053018#include "sdm660-common.h"
Laxminath Kasam605b42f2017-08-01 22:02:15 +053019#include "codecs/msm-cdc-pinctrl.h"
20#include "codecs/sdm660_cdc/msm-digital-cdc.h"
21#include "codecs/sdm660_cdc/msm-analog-cdc.h"
22#include "codecs/msm_sdw/msm_sdw.h"
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +053023#include <linux/pm_qos.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053024
25#define __CHIPSET__ "SDM660 "
26#define MSM_DAILINK_NAME(name) (__CHIPSET__#name)
27
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053028#define WCD_MBHC_DEF_RLOADS 5
29
30#define WCN_CDC_SLIM_RX_CH_MAX 2
31#define WCN_CDC_SLIM_TX_CH_MAX 3
32
33#define WSA8810_NAME_1 "wsa881x.20170211"
34#define WSA8810_NAME_2 "wsa881x.20170212"
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +053035#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053036enum {
37 INT0_MI2S = 0,
38 INT1_MI2S,
39 INT2_MI2S,
40 INT3_MI2S,
41 INT4_MI2S,
42 INT5_MI2S,
43 INT6_MI2S,
44 INT_MI2S_MAX,
45};
46
47enum {
Samyak Jainc57286a2018-08-08 17:02:44 +053048 BT_SLIM7_RX,
49 BT_SLIM7_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053050 FM_SLIM8,
51 SLIM_MAX,
52};
53
54/*TDM default offset currently only supporting TDM_RX_0 and TDM_TX_0 */
55static unsigned int tdm_slot_offset[TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
56 {0, 4, 8, 12, 16, 20, 24, 28},/* TX_0 | RX_0 */
57 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_1 | RX_1 */
58 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_2 | RX_2 */
59 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_3 | RX_3 */
60 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_4 | RX_4 */
61 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_5 | RX_5 */
62 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_6 | RX_6 */
63 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_7 | RX_7 */
64};
65
66static struct afe_clk_set int_mi2s_clk[INT_MI2S_MAX] = {
67 {
68 AFE_API_VERSION_I2S_CONFIG,
69 Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT,
70 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
71 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
72 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
73 0,
74 },
75 {
76 AFE_API_VERSION_I2S_CONFIG,
77 Q6AFE_LPASS_CLK_ID_INT1_MI2S_IBIT,
78 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
79 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
80 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
81 0,
82 },
83 {
84 AFE_API_VERSION_I2S_CONFIG,
85 Q6AFE_LPASS_CLK_ID_INT2_MI2S_IBIT,
86 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
87 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
88 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
89 0,
90 },
91 {
92 AFE_API_VERSION_I2S_CONFIG,
93 Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT,
94 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
95 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
96 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
97 0,
98 },
99 {
100 AFE_API_VERSION_I2S_CONFIG,
101 Q6AFE_LPASS_CLK_ID_INT4_MI2S_IBIT,
102 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
103 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
104 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
105 0,
106 },
107 {
108 AFE_API_VERSION_I2S_CONFIG,
109 Q6AFE_LPASS_CLK_ID_INT5_MI2S_IBIT,
110 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
111 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
112 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
113 0,
114 },
115 {
116 AFE_API_VERSION_I2S_CONFIG,
117 Q6AFE_LPASS_CLK_ID_INT6_MI2S_IBIT,
118 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
119 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
120 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
121 0,
122 },
123};
124
125struct dev_config {
126 u32 sample_rate;
127 u32 bit_format;
128 u32 channels;
129};
130
131/* Default configuration of MI2S channels */
132static struct dev_config int_mi2s_cfg[] = {
133 [INT0_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
134 [INT1_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
135 [INT2_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
136 [INT3_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
137 [INT4_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
138 [INT5_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
139 [INT6_MI2S] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
140};
141
142static struct dev_config bt_fm_cfg[] = {
Samyak Jainc57286a2018-08-08 17:02:44 +0530143 [BT_SLIM7_RX] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
144 [BT_SLIM7_TX] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530145 [FM_SLIM8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
146};
147
148static char const *int_mi2s_rate_text[] = {"KHZ_8", "KHZ_16",
149 "KHZ_32", "KHZ_44P1", "KHZ_48",
150 "KHZ_96", "KHZ_192"};
151static const char *const int_mi2s_ch_text[] = {"One", "Two"};
152static const char *const int_mi2s_tx_ch_text[] = {"One", "Two",
153 "Three", "Four"};
154static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
155static const char *const loopback_mclk_text[] = {"DISABLE", "ENABLE"};
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530156static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16",
157 "KHZ_44P1", "KHZ_48",
158 "KHZ_88P2", "KHZ_96"};
Samyak Jainc57286a2018-08-08 17:02:44 +0530159static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16",
160 "KHZ_44P1", "KHZ_48",
161 "KHZ_88P2", "KHZ_96"};
162static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16",
163 "KHZ_44P1", "KHZ_48",
164 "KHZ_88P2", "KHZ_96"};
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530165
166static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_sample_rate, int_mi2s_rate_text);
167static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_chs, int_mi2s_ch_text);
168static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_format, bit_format_text);
169static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_sample_rate, int_mi2s_rate_text);
170static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_chs, int_mi2s_tx_ch_text);
171static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_format, bit_format_text);
172static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_sample_rate, int_mi2s_rate_text);
173static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_chs, int_mi2s_tx_ch_text);
174static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_format, bit_format_text);
175static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_sample_rate, int_mi2s_rate_text);
176static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_chs, int_mi2s_ch_text);
177static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_format, bit_format_text);
178static SOC_ENUM_SINGLE_EXT_DECL(int5_mi2s_tx_chs, int_mi2s_ch_text);
179static SOC_ENUM_SINGLE_EXT_DECL(loopback_mclk_en, loopback_mclk_text);
180static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
Samyak Jainc57286a2018-08-08 17:02:44 +0530181static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text);
182static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530183
184static int msm_dmic_event(struct snd_soc_dapm_widget *w,
185 struct snd_kcontrol *kcontrol, int event);
186static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec, int enable,
187 bool dapm);
188static int msm_int_mclk0_event(struct snd_soc_dapm_widget *w,
189 struct snd_kcontrol *kcontrol, int event);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530190static int msm_int_dig_mclk0_event(struct snd_soc_dapm_widget *w,
191 struct snd_kcontrol *kcontrol, int event);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530192static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530193static int msm_int_dig_mi2s_snd_startup(struct snd_pcm_substream *substream);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530194static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream);
195
196static struct wcd_mbhc_config *mbhc_cfg_ptr;
197static struct snd_info_entry *codec_root;
198
199static int int_mi2s_get_bit_format_val(int bit_format)
200{
201 int val = 0;
202
203 switch (bit_format) {
204 case SNDRV_PCM_FORMAT_S24_3LE:
205 val = 2;
206 break;
207 case SNDRV_PCM_FORMAT_S24_LE:
208 val = 1;
209 break;
210 case SNDRV_PCM_FORMAT_S16_LE:
211 default:
212 val = 0;
213 break;
214 }
215 return val;
216}
217
218static int int_mi2s_get_bit_format(int val)
219{
220 int bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
221
222 switch (val) {
223 case 0:
224 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
225 break;
226 case 1:
227 bit_fmt = SNDRV_PCM_FORMAT_S24_LE;
228 break;
229 case 2:
230 bit_fmt = SNDRV_PCM_FORMAT_S24_3LE;
231 break;
232 default:
233 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
234 break;
235 }
236 return bit_fmt;
237}
238
239static int int_mi2s_get_port_idx(struct snd_kcontrol *kcontrol)
240{
241 int port_id = 0;
242
243 if (strnstr(kcontrol->id.name, "INT0_MI2S", sizeof("INT0_MI2S")))
244 port_id = INT0_MI2S;
245 else if (strnstr(kcontrol->id.name, "INT2_MI2S", sizeof("INT2_MI2S")))
246 port_id = INT2_MI2S;
247 else if (strnstr(kcontrol->id.name, "INT3_MI2S", sizeof("INT3_MI2S")))
248 port_id = INT3_MI2S;
249 else if (strnstr(kcontrol->id.name, "INT4_MI2S", sizeof("INT4_MI2S")))
250 port_id = INT4_MI2S;
251 else {
252 pr_err("%s: unsupported channel: %s",
253 __func__, kcontrol->id.name);
254 return -EINVAL;
255 }
256
257 return port_id;
258}
259
260static int int_mi2s_bit_format_get(struct snd_kcontrol *kcontrol,
261 struct snd_ctl_elem_value *ucontrol)
262{
263 int ch_num = int_mi2s_get_port_idx(kcontrol);
264
265 if (ch_num < 0)
266 return ch_num;
267
268 ucontrol->value.enumerated.item[0] =
269 int_mi2s_get_bit_format_val(int_mi2s_cfg[ch_num].bit_format);
270
271 pr_debug("%s: int_mi2s[%d]_bit_format = %d, ucontrol value = %d\n",
272 __func__, ch_num, int_mi2s_cfg[ch_num].bit_format,
273 ucontrol->value.enumerated.item[0]);
274
275 return 0;
276}
277
278static int int_mi2s_bit_format_put(struct snd_kcontrol *kcontrol,
279 struct snd_ctl_elem_value *ucontrol)
280{
281 int ch_num = int_mi2s_get_port_idx(kcontrol);
282
283 if (ch_num < 0)
284 return ch_num;
285
286 int_mi2s_cfg[ch_num].bit_format =
287 int_mi2s_get_bit_format(ucontrol->value.enumerated.item[0]);
288
289 pr_debug("%s: int_mi2s[%d]_rx_bit_format = %d, ucontrol value = %d\n",
290 __func__, ch_num, int_mi2s_cfg[ch_num].bit_format,
291 ucontrol->value.enumerated.item[0]);
292
293 return 0;
294}
295
296static inline int param_is_mask(int p)
297{
298 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
299 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
300}
301
302static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p,
303 int n)
304{
305 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
306}
307
308static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit)
309{
310 if (bit >= SNDRV_MASK_MAX)
311 return;
312 if (param_is_mask(n)) {
313 struct snd_mask *m = param_to_mask(p, n);
314
315 m->bits[0] = 0;
316 m->bits[1] = 0;
317 m->bits[bit >> 5] |= (1 << (bit & 31));
318 }
319}
320
321static int int_mi2s_get_sample_rate_val(int sample_rate)
322{
323 int sample_rate_val;
324
325 switch (sample_rate) {
326 case SAMPLING_RATE_8KHZ:
327 sample_rate_val = 0;
328 break;
329 case SAMPLING_RATE_16KHZ:
330 sample_rate_val = 1;
331 break;
332 case SAMPLING_RATE_32KHZ:
333 sample_rate_val = 2;
334 break;
335 case SAMPLING_RATE_44P1KHZ:
336 sample_rate_val = 3;
337 break;
338 case SAMPLING_RATE_48KHZ:
339 sample_rate_val = 4;
340 break;
341 case SAMPLING_RATE_96KHZ:
342 sample_rate_val = 5;
343 break;
344 case SAMPLING_RATE_192KHZ:
345 sample_rate_val = 6;
346 break;
347 default:
348 sample_rate_val = 4;
349 break;
350 }
351 return sample_rate_val;
352}
353
354static int int_mi2s_get_sample_rate(int value)
355{
356 int sample_rate;
357
358 switch (value) {
359 case 0:
360 sample_rate = SAMPLING_RATE_8KHZ;
361 break;
362 case 1:
363 sample_rate = SAMPLING_RATE_16KHZ;
364 break;
365 case 2:
366 sample_rate = SAMPLING_RATE_32KHZ;
367 break;
368 case 3:
369 sample_rate = SAMPLING_RATE_44P1KHZ;
370 break;
371 case 4:
372 sample_rate = SAMPLING_RATE_48KHZ;
373 break;
374 case 5:
375 sample_rate = SAMPLING_RATE_96KHZ;
376 break;
377 case 6:
378 sample_rate = SAMPLING_RATE_192KHZ;
379 break;
380 default:
381 sample_rate = SAMPLING_RATE_48KHZ;
382 break;
383 }
384 return sample_rate;
385}
386
387static int int_mi2s_sample_rate_put(struct snd_kcontrol *kcontrol,
388 struct snd_ctl_elem_value *ucontrol)
389{
390 int idx = int_mi2s_get_port_idx(kcontrol);
391
392 if (idx < 0)
393 return idx;
394
395 int_mi2s_cfg[idx].sample_rate =
396 int_mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
397
398 pr_debug("%s: idx[%d]_sample_rate = %d, item = %d\n", __func__,
399 idx, int_mi2s_cfg[idx].sample_rate,
400 ucontrol->value.enumerated.item[0]);
401
402 return 0;
403}
404
405static int int_mi2s_sample_rate_get(struct snd_kcontrol *kcontrol,
406 struct snd_ctl_elem_value *ucontrol)
407{
408 int idx = int_mi2s_get_port_idx(kcontrol);
409
410 if (idx < 0)
411 return idx;
412
413 ucontrol->value.enumerated.item[0] =
414 int_mi2s_get_sample_rate_val(int_mi2s_cfg[idx].sample_rate);
415
416 pr_debug("%s: idx[%d]_sample_rate = %d, item = %d\n", __func__,
417 idx, int_mi2s_cfg[idx].sample_rate,
418 ucontrol->value.enumerated.item[0]);
419
420 return 0;
421}
422
423static int int_mi2s_ch_get(struct snd_kcontrol *kcontrol,
424 struct snd_ctl_elem_value *ucontrol)
425{
426 int idx = int_mi2s_get_port_idx(kcontrol);
427
428 if (idx < 0)
429 return idx;
430
431 pr_debug("%s: int_mi2s_[%d]_rx_ch = %d\n", __func__,
432 idx, int_mi2s_cfg[idx].channels);
433 ucontrol->value.enumerated.item[0] = int_mi2s_cfg[idx].channels - 1;
434
435 return 0;
436}
437
438static int int_mi2s_ch_put(struct snd_kcontrol *kcontrol,
439 struct snd_ctl_elem_value *ucontrol)
440{
441 int idx = int_mi2s_get_port_idx(kcontrol);
442
443 if (idx < 0)
444 return idx;
445
446 int_mi2s_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
447 pr_debug("%s: int_mi2s_[%d]_ch = %d\n", __func__,
448 idx, int_mi2s_cfg[idx].channels);
449
450 return 1;
451}
452
453static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = {
454 SND_SOC_DAPM_SUPPLY_S("INT_MCLK0", -1, SND_SOC_NOPM, 0, 0,
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530455 msm_int_mclk0_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530456 SND_SOC_DAPM_MIC("Handset Mic", NULL),
457 SND_SOC_DAPM_MIC("Headset Mic", NULL),
458 SND_SOC_DAPM_MIC("Secondary Mic", NULL),
459 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
460 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
461 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
462 SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
463};
464
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530465static const struct snd_soc_dapm_widget msm_int_dig_dapm_widgets[] = {
466 SND_SOC_DAPM_SUPPLY_S("INT_MCLK0", -1, SND_SOC_NOPM, 0, 0,
Ramu Gottipati11524972018-03-29 16:46:35 +0530467 msm_int_dig_mclk0_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530468 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
469 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
470 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
471 SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
472};
473
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530474static int msm_config_hph_compander_gpio(bool enable,
475 struct snd_soc_codec *codec)
476{
477 struct snd_soc_card *card = codec->component.card;
478 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
479 int ret = 0;
480
481 pr_debug("%s: %s HPH Compander\n", __func__,
482 enable ? "Enable" : "Disable");
483
484 if (enable) {
485 ret = msm_cdc_pinctrl_select_active_state(pdata->comp_gpio_p);
486 if (ret) {
487 pr_err("%s: gpio set cannot be activated %s\n",
488 __func__, "comp_gpio");
489 goto done;
490 }
491 } else {
492 ret = msm_cdc_pinctrl_select_sleep_state(pdata->comp_gpio_p);
493 if (ret) {
494 pr_err("%s: gpio set cannot be de-activated %s\n",
495 __func__, "comp_gpio");
496 goto done;
497 }
498 }
499
500done:
501 return ret;
502}
503
504static int is_ext_spk_gpio_support(struct platform_device *pdev,
505 struct msm_asoc_mach_data *pdata)
506{
507 const char *spk_ext_pa = "qcom,msm-spk-ext-pa";
508
509 pr_debug("%s:Enter\n", __func__);
510
511 pdata->spk_ext_pa_gpio = of_get_named_gpio(pdev->dev.of_node,
512 spk_ext_pa, 0);
513
514 if (pdata->spk_ext_pa_gpio < 0) {
515 dev_dbg(&pdev->dev,
516 "%s: missing %s in dt node\n", __func__, spk_ext_pa);
517 } else {
518 if (!gpio_is_valid(pdata->spk_ext_pa_gpio)) {
519 pr_err("%s: Invalid external speaker gpio: %d",
520 __func__, pdata->spk_ext_pa_gpio);
521 return -EINVAL;
522 }
523 }
524 return 0;
525}
526
527static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable)
528{
529 struct snd_soc_card *card = codec->component.card;
530 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
531 int ret;
532
533 if (!gpio_is_valid(pdata->spk_ext_pa_gpio)) {
534 pr_err("%s: Invalid gpio: %d\n", __func__,
535 pdata->spk_ext_pa_gpio);
536 return false;
537 }
538
539 pr_debug("%s: %s external speaker PA\n", __func__,
540 enable ? "Enable" : "Disable");
541
542 if (enable) {
543 ret = msm_cdc_pinctrl_select_active_state(
544 pdata->ext_spk_gpio_p);
545 if (ret) {
546 pr_err("%s: gpio set cannot be de-activated %s\n",
547 __func__, "ext_spk_gpio");
548 return ret;
549 }
550 gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable);
551 } else {
552 gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable);
553 ret = msm_cdc_pinctrl_select_sleep_state(
554 pdata->ext_spk_gpio_p);
555 if (ret) {
556 pr_err("%s: gpio set cannot be de-activated %s\n",
557 __func__, "ext_spk_gpio");
558 return ret;
559 }
560 }
561 return 0;
562}
563
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530564static int int_mi2s_get_idx_from_beid(int32_t id)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530565{
566 int idx = 0;
567
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530568 switch (id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530569 case MSM_BACKEND_DAI_INT0_MI2S_RX:
570 idx = INT0_MI2S;
571 break;
572 case MSM_BACKEND_DAI_INT2_MI2S_TX:
573 idx = INT2_MI2S;
574 break;
575 case MSM_BACKEND_DAI_INT3_MI2S_TX:
576 idx = INT3_MI2S;
577 break;
578 case MSM_BACKEND_DAI_INT4_MI2S_RX:
579 idx = INT4_MI2S;
580 break;
581 case MSM_BACKEND_DAI_INT5_MI2S_TX:
582 idx = INT5_MI2S;
583 break;
584 default:
585 idx = INT0_MI2S;
586 break;
587 }
588
589 return idx;
590}
591
592static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
593 struct snd_pcm_hw_params *params)
594{
595 struct snd_interval *rate = hw_param_interval(params,
596 SNDRV_PCM_HW_PARAM_RATE);
597
598 struct snd_interval *channels = hw_param_interval(params,
599 SNDRV_PCM_HW_PARAM_CHANNELS);
600
601 pr_debug("%s()\n", __func__);
602 rate->min = rate->max = 48000;
603 channels->min = channels->max = 2;
604
605 return 0;
606}
607
608static int int_mi2s_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
609 struct snd_pcm_hw_params *params)
610{
611 struct snd_soc_dai_link *dai_link = rtd->dai_link;
612 struct snd_interval *rate = hw_param_interval(params,
613 SNDRV_PCM_HW_PARAM_RATE);
614 struct snd_interval *channels = hw_param_interval(params,
615 SNDRV_PCM_HW_PARAM_CHANNELS);
616 int idx;
617
618 pr_debug("%s: format = %d, rate = %d\n",
619 __func__, params_format(params), params_rate(params));
620
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530621 switch (dai_link->id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530622 case MSM_BACKEND_DAI_INT0_MI2S_RX:
623 case MSM_BACKEND_DAI_INT2_MI2S_TX:
624 case MSM_BACKEND_DAI_INT3_MI2S_TX:
625 case MSM_BACKEND_DAI_INT4_MI2S_RX:
626 case MSM_BACKEND_DAI_INT5_MI2S_TX:
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530627 idx = int_mi2s_get_idx_from_beid(dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530628 rate->min = rate->max = int_mi2s_cfg[idx].sample_rate;
629 channels->min = channels->max =
630 int_mi2s_cfg[idx].channels;
631 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
632 int_mi2s_cfg[idx].bit_format);
633 break;
634 default:
635 rate->min = rate->max = SAMPLING_RATE_48KHZ;
636 break;
637 }
638 return 0;
639}
640
641static int msm_btfm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
642 struct snd_pcm_hw_params *params)
643{
644 struct snd_soc_dai_link *dai_link = rtd->dai_link;
645 struct snd_interval *rate = hw_param_interval(params,
646 SNDRV_PCM_HW_PARAM_RATE);
647 struct snd_interval *channels = hw_param_interval(params,
648 SNDRV_PCM_HW_PARAM_CHANNELS);
649
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530650 switch (dai_link->id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530651 case MSM_BACKEND_DAI_SLIMBUS_7_RX:
Samyak Jainc57286a2018-08-08 17:02:44 +0530652 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
653 bt_fm_cfg[BT_SLIM7_RX].bit_format);
654 rate->min = rate->max = bt_fm_cfg[BT_SLIM7_RX].sample_rate;
655 channels->min = channels->max =
656 bt_fm_cfg[BT_SLIM7_RX].channels;
657 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530658 case MSM_BACKEND_DAI_SLIMBUS_7_TX:
659 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
Samyak Jainc57286a2018-08-08 17:02:44 +0530660 bt_fm_cfg[BT_SLIM7_TX].bit_format);
661 rate->min = rate->max = bt_fm_cfg[BT_SLIM7_TX].sample_rate;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530662 channels->min = channels->max =
Samyak Jainc57286a2018-08-08 17:02:44 +0530663 bt_fm_cfg[BT_SLIM7_TX].channels;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530664 break;
665
666 case MSM_BACKEND_DAI_SLIMBUS_8_TX:
667 rate->min = rate->max = bt_fm_cfg[FM_SLIM8].sample_rate;
668 channels->min = channels->max =
669 bt_fm_cfg[FM_SLIM8].channels;
670 break;
671
672 default:
673 rate->min = rate->max = SAMPLING_RATE_48KHZ;
674 break;
675 }
676 return 0;
677}
678
679static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
680 struct snd_ctl_elem_value *ucontrol)
681{
682 ucontrol->value.integer.value[0] =
683 (int_mi2s_cfg[INT5_MI2S].channels/2 - 1);
684 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
685 ucontrol->value.integer.value[0]);
686 return 0;
687}
688
689static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
690 struct snd_ctl_elem_value *ucontrol)
691{
692 int_mi2s_cfg[INT5_MI2S].channels =
693 roundup_pow_of_two(ucontrol->value.integer.value[0] + 2);
694
695 pr_debug("%s: msm_vi_feed_tx_ch = %d\n",
696 __func__, int_mi2s_cfg[INT5_MI2S].channels);
697 return 1;
698}
699
700static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec,
701 int enable, bool dapm)
702{
703 int ret = 0;
704 struct msm_asoc_mach_data *pdata = NULL;
705 int clk_freq_in_hz;
706 bool int_mclk0_freq_chg = false;
707
708 pdata = snd_soc_card_get_drvdata(codec->component.card);
709 pr_debug("%s: enable %d mclk ref counter %d\n",
710 __func__, enable,
711 atomic_read(&pdata->int_mclk0_rsc_ref));
712 if (enable) {
713 if (int_mi2s_cfg[INT0_MI2S].sample_rate ==
714 SAMPLING_RATE_44P1KHZ) {
715 clk_freq_in_hz = NATIVE_MCLK_RATE;
716 pdata->native_clk_set = true;
717 } else {
718 clk_freq_in_hz = pdata->mclk_freq;
719 pdata->native_clk_set = false;
720 }
721
722 if (pdata->digital_cdc_core_clk.clk_freq_in_hz
723 != clk_freq_in_hz)
724 int_mclk0_freq_chg = true;
725 if (!atomic_read(&pdata->int_mclk0_rsc_ref) ||
726 int_mclk0_freq_chg) {
727 cancel_delayed_work_sync(
728 &pdata->disable_int_mclk0_work);
729 mutex_lock(&pdata->cdc_int_mclk0_mutex);
730 if (atomic_read(&pdata->int_mclk0_enabled) == false ||
731 int_mclk0_freq_chg) {
732 if (atomic_read(&pdata->int_mclk0_enabled)) {
733 pdata->digital_cdc_core_clk.enable = 0;
734 afe_set_lpass_clock_v2(
735 AFE_PORT_ID_INT0_MI2S_RX,
736 &pdata->digital_cdc_core_clk);
737 }
738 pdata->digital_cdc_core_clk.clk_freq_in_hz =
739 clk_freq_in_hz;
740 pdata->digital_cdc_core_clk.enable = 1;
741 ret = afe_set_lpass_clock_v2(
742 AFE_PORT_ID_INT0_MI2S_RX,
743 &pdata->digital_cdc_core_clk);
744 if (ret < 0) {
745 pr_err("%s: failed to enable CCLK\n",
746 __func__);
747 mutex_unlock(
748 &pdata->cdc_int_mclk0_mutex);
749 return ret;
750 }
751 pr_debug("enabled digital codec core clk\n");
752 atomic_set(&pdata->int_mclk0_enabled, true);
753 }
754 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
755 }
756 atomic_inc(&pdata->int_mclk0_rsc_ref);
757 } else {
758 cancel_delayed_work_sync(&pdata->disable_int_mclk0_work);
759 mutex_lock(&pdata->cdc_int_mclk0_mutex);
760 if (atomic_read(&pdata->int_mclk0_enabled) == true) {
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530761 pdata->digital_cdc_core_clk.clk_freq_in_hz =
762 DEFAULT_MCLK_RATE;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530763 pdata->digital_cdc_core_clk.enable = 0;
764 ret = afe_set_lpass_clock_v2(
765 AFE_PORT_ID_INT0_MI2S_RX,
766 &pdata->digital_cdc_core_clk);
767 if (ret < 0)
768 pr_err("%s: failed to disable CCLK\n",
769 __func__);
770 atomic_set(&pdata->int_mclk0_enabled, false);
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530771 atomic_set(&pdata->int_mclk0_rsc_ref, 0);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530772 }
773 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
774 }
775 return ret;
776}
777
778static int loopback_mclk_get(struct snd_kcontrol *kcontrol,
779 struct snd_ctl_elem_value *ucontrol)
780{
781 pr_debug("%s\n", __func__);
782 return 0;
783}
784
785static int loopback_mclk_put(struct snd_kcontrol *kcontrol,
786 struct snd_ctl_elem_value *ucontrol)
787{
788 int ret = -EINVAL;
789 struct msm_asoc_mach_data *pdata = NULL;
790 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
791
792 pdata = snd_soc_card_get_drvdata(codec->component.card);
793 pr_debug("%s: mclk_rsc_ref %d enable %ld\n",
794 __func__, atomic_read(&pdata->int_mclk0_rsc_ref),
795 ucontrol->value.integer.value[0]);
796 switch (ucontrol->value.integer.value[0]) {
797 case 1:
798 ret = msm_cdc_pinctrl_select_active_state(pdata->pdm_gpio_p);
799 if (ret) {
800 pr_err("%s: failed to enable the pri gpios: %d\n",
801 __func__, ret);
802 break;
803 }
804 mutex_lock(&pdata->cdc_int_mclk0_mutex);
805 if ((!atomic_read(&pdata->int_mclk0_rsc_ref)) &&
806 (!atomic_read(&pdata->int_mclk0_enabled))) {
807 pdata->digital_cdc_core_clk.enable = 1;
808 ret = afe_set_lpass_clock_v2(
809 AFE_PORT_ID_INT0_MI2S_RX,
810 &pdata->digital_cdc_core_clk);
811 if (ret < 0) {
812 pr_err("%s: failed to enable the MCLK: %d\n",
813 __func__, ret);
814 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
815 ret = msm_cdc_pinctrl_select_sleep_state(
816 pdata->pdm_gpio_p);
817 if (ret)
818 pr_err("%s: failed to disable the pri gpios: %d\n",
819 __func__, ret);
820 break;
821 }
822 atomic_set(&pdata->int_mclk0_enabled, true);
823 }
824 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
825 atomic_inc(&pdata->int_mclk0_rsc_ref);
826 msm_anlg_cdc_mclk_enable(codec, 1, true);
827 break;
828 case 0:
829 if (atomic_read(&pdata->int_mclk0_rsc_ref) <= 0)
830 break;
831 msm_anlg_cdc_mclk_enable(codec, 0, true);
832 mutex_lock(&pdata->cdc_int_mclk0_mutex);
833 if ((!atomic_dec_return(&pdata->int_mclk0_rsc_ref)) &&
834 (atomic_read(&pdata->int_mclk0_enabled))) {
835 pdata->digital_cdc_core_clk.enable = 0;
836 ret = afe_set_lpass_clock_v2(
837 AFE_PORT_ID_INT0_MI2S_RX,
838 &pdata->digital_cdc_core_clk);
839 if (ret < 0) {
840 pr_err("%s: failed to disable the CCLK: %d\n",
841 __func__, ret);
842 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
843 break;
844 }
845 atomic_set(&pdata->int_mclk0_enabled, false);
846 }
847 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
848 ret = msm_cdc_pinctrl_select_sleep_state(pdata->pdm_gpio_p);
849 if (ret)
850 pr_err("%s: failed to disable the pri gpios: %d\n",
851 __func__, ret);
852 break;
853 default:
854 pr_err("%s: Unexpected input value\n", __func__);
855 break;
856 }
857 return ret;
858}
859
860static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol,
861 struct snd_ctl_elem_value *ucontrol)
862{
863 /*
864 * Slimbus_7_Rx/Tx sample rate values should always be in sync (same)
865 * when used for BT_SCO use case. Return either Rx or Tx sample rate
866 * value.
867 */
Samyak Jainc57286a2018-08-08 17:02:44 +0530868 switch (bt_fm_cfg[BT_SLIM7_RX].sample_rate) {
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530869 case SAMPLING_RATE_96KHZ:
870 ucontrol->value.integer.value[0] = 5;
871 break;
872 case SAMPLING_RATE_88P2KHZ:
873 ucontrol->value.integer.value[0] = 4;
874 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530875 case SAMPLING_RATE_48KHZ:
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530876 ucontrol->value.integer.value[0] = 3;
877 break;
878 case SAMPLING_RATE_44P1KHZ:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530879 ucontrol->value.integer.value[0] = 2;
880 break;
881 case SAMPLING_RATE_16KHZ:
882 ucontrol->value.integer.value[0] = 1;
883 break;
884 case SAMPLING_RATE_8KHZ:
885 default:
886 ucontrol->value.integer.value[0] = 0;
887 break;
888 }
889 pr_debug("%s: sample rate = %d", __func__,
Samyak Jainc57286a2018-08-08 17:02:44 +0530890 bt_fm_cfg[BT_SLIM7_RX].sample_rate);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530891
892 return 0;
893}
894
895static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol,
896 struct snd_ctl_elem_value *ucontrol)
897{
898 switch (ucontrol->value.integer.value[0]) {
899 case 1:
Samyak Jainc57286a2018-08-08 17:02:44 +0530900 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_16KHZ;
901 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_16KHZ;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530902 break;
903 case 2:
Samyak Jainc57286a2018-08-08 17:02:44 +0530904 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_44P1KHZ;
905 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_44P1KHZ;
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530906 break;
907 case 3:
Samyak Jainc57286a2018-08-08 17:02:44 +0530908 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_48KHZ;
909 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_48KHZ;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530910 break;
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530911 case 4:
Samyak Jainc57286a2018-08-08 17:02:44 +0530912 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_88P2KHZ;
913 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_88P2KHZ;
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530914 break;
915 case 5:
Samyak Jainc57286a2018-08-08 17:02:44 +0530916 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_96KHZ;
917 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_96KHZ;
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530918 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530919 case 0:
920 default:
Samyak Jainc57286a2018-08-08 17:02:44 +0530921 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_8KHZ;
922 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_8KHZ;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530923 break;
924 }
925 pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n",
926 __func__,
Samyak Jainc57286a2018-08-08 17:02:44 +0530927 bt_fm_cfg[BT_SLIM7_RX].sample_rate,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530928 ucontrol->value.enumerated.item[0]);
929
930 return 0;
931}
932
Samyak Jainc57286a2018-08-08 17:02:44 +0530933static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol,
934 struct snd_ctl_elem_value *ucontrol)
935{
936 switch (bt_fm_cfg[BT_SLIM7_RX].sample_rate) {
937 case SAMPLING_RATE_96KHZ:
938 ucontrol->value.integer.value[0] = 5;
939 break;
940 case SAMPLING_RATE_88P2KHZ:
941 ucontrol->value.integer.value[0] = 4;
942 break;
943 case SAMPLING_RATE_48KHZ:
944 ucontrol->value.integer.value[0] = 3;
945 break;
946 case SAMPLING_RATE_44P1KHZ:
947 ucontrol->value.integer.value[0] = 2;
948 break;
949 case SAMPLING_RATE_16KHZ:
950 ucontrol->value.integer.value[0] = 1;
951 break;
952 case SAMPLING_RATE_8KHZ:
953 default:
954 ucontrol->value.integer.value[0] = 0;
955 break;
956 }
957 pr_debug("%s: sample rate = %d", __func__,
958 bt_fm_cfg[BT_SLIM7_RX].sample_rate);
959
960 return 0;
961}
962
963static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol,
964 struct snd_ctl_elem_value *ucontrol)
965{
966 switch (ucontrol->value.integer.value[0]) {
967 case 1:
968 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_16KHZ;
969 break;
970 case 2:
971 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_44P1KHZ;
972 break;
973 case 3:
974 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_48KHZ;
975 break;
976 case 4:
977 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_88P2KHZ;
978 break;
979 case 5:
980 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_96KHZ;
981 break;
982 case 0:
983 default:
984 bt_fm_cfg[BT_SLIM7_RX].sample_rate = SAMPLING_RATE_8KHZ;
985 break;
986 }
987 pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n",
988 __func__,
989 bt_fm_cfg[BT_SLIM7_RX].sample_rate,
990 ucontrol->value.enumerated.item[0]);
991
992 return 0;
993}
994
995static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol,
996 struct snd_ctl_elem_value *ucontrol)
997{
998 switch (bt_fm_cfg[BT_SLIM7_TX].sample_rate) {
999 case SAMPLING_RATE_96KHZ:
1000 ucontrol->value.integer.value[0] = 5;
1001 break;
1002 case SAMPLING_RATE_88P2KHZ:
1003 ucontrol->value.integer.value[0] = 4;
1004 break;
1005 case SAMPLING_RATE_48KHZ:
1006 ucontrol->value.integer.value[0] = 3;
1007 break;
1008 case SAMPLING_RATE_44P1KHZ:
1009 ucontrol->value.integer.value[0] = 2;
1010 break;
1011 case SAMPLING_RATE_16KHZ:
1012 ucontrol->value.integer.value[0] = 1;
1013 break;
1014 case SAMPLING_RATE_8KHZ:
1015 default:
1016 ucontrol->value.integer.value[0] = 0;
1017 break;
1018 }
1019 pr_debug("%s: sample rate = %d", __func__,
1020 bt_fm_cfg[BT_SLIM7_TX].sample_rate);
1021
1022 return 0;
1023}
1024
1025static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol,
1026 struct snd_ctl_elem_value *ucontrol)
1027{
1028 switch (ucontrol->value.integer.value[0]) {
1029 case 1:
1030 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_16KHZ;
1031 break;
1032 case 2:
1033 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_44P1KHZ;
1034 break;
1035 case 3:
1036 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_48KHZ;
1037 break;
1038 case 4:
1039 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_88P2KHZ;
1040 break;
1041 case 5:
1042 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_96KHZ;
1043 break;
1044 case 0:
1045 default:
1046 bt_fm_cfg[BT_SLIM7_TX].sample_rate = SAMPLING_RATE_8KHZ;
1047 break;
1048 }
1049 pr_debug("%s: sample rates: slim7_tx = %d, value = %d\n",
1050 __func__,
1051 bt_fm_cfg[BT_SLIM7_TX].sample_rate,
1052 ucontrol->value.enumerated.item[0]);
1053
1054 return 0;
1055}
1056
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301057static const struct snd_kcontrol_new msm_snd_controls[] = {
1058 SOC_ENUM_EXT("INT0_MI2S_RX Format", int0_mi2s_rx_format,
1059 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
1060 SOC_ENUM_EXT("INT2_MI2S_TX Format", int2_mi2s_tx_format,
1061 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
1062 SOC_ENUM_EXT("INT3_MI2S_TX Format", int3_mi2s_tx_format,
1063 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
1064 SOC_ENUM_EXT("INT0_MI2S_RX SampleRate", int0_mi2s_rx_sample_rate,
1065 int_mi2s_sample_rate_get,
1066 int_mi2s_sample_rate_put),
1067 SOC_ENUM_EXT("INT2_MI2S_TX SampleRate", int2_mi2s_tx_sample_rate,
1068 int_mi2s_sample_rate_get,
1069 int_mi2s_sample_rate_put),
1070 SOC_ENUM_EXT("INT3_MI2S_TX SampleRate", int3_mi2s_tx_sample_rate,
1071 int_mi2s_sample_rate_get,
1072 int_mi2s_sample_rate_put),
1073 SOC_ENUM_EXT("INT0_MI2S_RX Channels", int0_mi2s_rx_chs,
1074 int_mi2s_ch_get, int_mi2s_ch_put),
1075 SOC_ENUM_EXT("INT2_MI2S_TX Channels", int2_mi2s_tx_chs,
1076 int_mi2s_ch_get, int_mi2s_ch_put),
1077 SOC_ENUM_EXT("INT3_MI2S_TX Channels", int3_mi2s_tx_chs,
1078 int_mi2s_ch_get, int_mi2s_ch_put),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301079 SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
1080 msm_bt_sample_rate_get,
1081 msm_bt_sample_rate_put),
Samyak Jainc57286a2018-08-08 17:02:44 +05301082 SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
1083 msm_bt_sample_rate_rx_get,
1084 msm_bt_sample_rate_rx_put),
1085 SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
1086 msm_bt_sample_rate_tx_get,
1087 msm_bt_sample_rate_tx_put),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301088};
1089
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301090static const struct snd_kcontrol_new msm_loopback_snd_controls[] = {
1091 SOC_ENUM_EXT("Loopback MCLK", loopback_mclk_en,
1092 loopback_mclk_get, loopback_mclk_put),
1093};
1094
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301095static const struct snd_kcontrol_new msm_sdw_controls[] = {
1096 SOC_ENUM_EXT("INT4_MI2S_RX Format", int4_mi2s_rx_format,
1097 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
1098 SOC_ENUM_EXT("INT4_MI2S_RX SampleRate", int4_mi2s_rx_sample_rate,
1099 int_mi2s_sample_rate_get,
1100 int_mi2s_sample_rate_put),
1101 SOC_ENUM_EXT("INT4_MI2S_RX Channels", int4_mi2s_rx_chs,
1102 int_mi2s_ch_get, int_mi2s_ch_put),
1103 SOC_ENUM_EXT("VI_FEED_TX Channels", int5_mi2s_tx_chs,
1104 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
1105};
1106
1107static int msm_dmic_event(struct snd_soc_dapm_widget *w,
1108 struct snd_kcontrol *kcontrol, int event)
1109{
1110 struct msm_asoc_mach_data *pdata = NULL;
1111 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1112 int ret = 0;
1113
1114 pdata = snd_soc_card_get_drvdata(codec->component.card);
1115 pr_debug("%s: event = %d\n", __func__, event);
1116 switch (event) {
1117 case SND_SOC_DAPM_PRE_PMU:
1118 ret = msm_cdc_pinctrl_select_active_state(pdata->dmic_gpio_p);
1119 if (ret < 0) {
1120 pr_err("%s: gpio set cannot be activated %sd",
1121 __func__, "dmic_gpio");
1122 return ret;
1123 }
1124 break;
1125 case SND_SOC_DAPM_POST_PMD:
1126 ret = msm_cdc_pinctrl_select_sleep_state(pdata->dmic_gpio_p);
1127 if (ret < 0) {
1128 pr_err("%s: gpio set cannot be de-activated %sd",
1129 __func__, "dmic_gpio");
1130 return ret;
1131 }
1132 break;
1133 default:
1134 pr_err("%s: invalid DAPM event %d\n", __func__, event);
1135 return -EINVAL;
1136 }
1137 return 0;
1138}
1139
1140static int msm_int_mclk0_event(struct snd_soc_dapm_widget *w,
1141 struct snd_kcontrol *kcontrol, int event)
1142{
1143 struct msm_asoc_mach_data *pdata = NULL;
1144 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1145 int ret = 0;
1146
1147 pdata = snd_soc_card_get_drvdata(codec->component.card);
1148 pr_debug("%s: event = %d\n", __func__, event);
1149 switch (event) {
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05301150 case SND_SOC_DAPM_PRE_PMU:
1151 ret = msm_cdc_pinctrl_select_active_state(pdata->pdm_gpio_p);
1152 if (ret < 0) {
1153 pr_err("%s: gpio set cannot be activated %s\n",
1154 __func__, "int_pdm");
1155 return ret;
1156 }
1157 msm_int_enable_dig_cdc_clk(codec, 1, true);
1158 msm_anlg_cdc_mclk_enable(codec, 1, true);
1159 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301160 case SND_SOC_DAPM_POST_PMD:
1161 pr_debug("%s: mclk_res_ref = %d\n",
1162 __func__, atomic_read(&pdata->int_mclk0_rsc_ref));
1163 ret = msm_cdc_pinctrl_select_sleep_state(pdata->pdm_gpio_p);
1164 if (ret < 0) {
1165 pr_err("%s: gpio set cannot be de-activated %sd",
1166 __func__, "int_pdm");
1167 return ret;
1168 }
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05301169 pr_debug("%s: disabling MCLK\n", __func__);
1170 /* disable the codec mclk config*/
1171 msm_anlg_cdc_mclk_enable(codec, 0, true);
1172 msm_int_enable_dig_cdc_clk(codec, 0, true);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301173 break;
1174 default:
1175 pr_err("%s: invalid DAPM event %d\n", __func__, event);
1176 return -EINVAL;
1177 }
1178 return 0;
1179}
1180
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301181static int msm_int_dig_mclk0_event(struct snd_soc_dapm_widget *w,
1182 struct snd_kcontrol *kcontrol, int event)
1183{
1184 struct msm_asoc_mach_data *pdata = NULL;
1185 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1186
1187 pdata = snd_soc_card_get_drvdata(codec->component.card);
1188 pr_debug("%s: event = %d\n", __func__, event);
1189 switch (event) {
Ramu Gottipati11524972018-03-29 16:46:35 +05301190 case SND_SOC_DAPM_PRE_PMU:
1191 msm_digcdc_mclk_enable(codec, 1, true);
1192 msm_int_enable_dig_cdc_clk(codec, 1, true);
1193 break;
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301194 case SND_SOC_DAPM_POST_PMD:
Ramu Gottipati11524972018-03-29 16:46:35 +05301195 msm_digcdc_mclk_enable(codec, 0, true);
1196 msm_int_enable_dig_cdc_clk(codec, 0, true);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301197 break;
1198 default:
1199 pr_err("%s: invalid DAPM event %d\n", __func__, event);
1200 return -EINVAL;
1201 }
1202 return 0;
1203}
1204
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301205static int int_mi2s_get_port_id(int id)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301206{
1207 int afe_port_id;
1208
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301209 switch (id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301210 case MSM_BACKEND_DAI_INT0_MI2S_RX:
1211 afe_port_id = AFE_PORT_ID_INT0_MI2S_RX;
1212 break;
1213 case MSM_BACKEND_DAI_INT2_MI2S_TX:
1214 afe_port_id = AFE_PORT_ID_INT2_MI2S_TX;
1215 break;
1216 case MSM_BACKEND_DAI_INT3_MI2S_TX:
1217 afe_port_id = AFE_PORT_ID_INT3_MI2S_TX;
1218 break;
1219 case MSM_BACKEND_DAI_INT4_MI2S_RX:
1220 afe_port_id = AFE_PORT_ID_INT4_MI2S_RX;
1221 break;
1222 case MSM_BACKEND_DAI_INT5_MI2S_TX:
1223 afe_port_id = AFE_PORT_ID_INT5_MI2S_TX;
1224 break;
1225 default:
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301226 pr_err("%s: Invalid id: %d\n", __func__, id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301227 afe_port_id = -EINVAL;
1228 }
1229
1230 return afe_port_id;
1231}
1232
1233static int int_mi2s_get_index(int port_id)
1234{
1235 int index;
1236
1237 switch (port_id) {
1238 case AFE_PORT_ID_INT0_MI2S_RX:
1239 index = INT0_MI2S;
1240 break;
1241 case AFE_PORT_ID_INT2_MI2S_TX:
1242 index = INT2_MI2S;
1243 break;
1244 case AFE_PORT_ID_INT3_MI2S_TX:
1245 index = INT3_MI2S;
1246 break;
1247 case AFE_PORT_ID_INT4_MI2S_RX:
1248 index = INT4_MI2S;
1249 break;
1250 case AFE_PORT_ID_INT5_MI2S_TX:
1251 index = INT5_MI2S;
1252 break;
1253 default:
1254 pr_err("%s: Invalid port_id: %d\n", __func__, port_id);
1255 index = -EINVAL;
1256 }
1257
1258 return index;
1259}
1260
1261static u32 get_int_mi2s_bits_per_sample(u32 bit_format)
1262{
1263 u32 bit_per_sample;
1264
1265 switch (bit_format) {
1266 case SNDRV_PCM_FORMAT_S24_3LE:
1267 case SNDRV_PCM_FORMAT_S24_LE:
1268 bit_per_sample = 32;
1269 break;
1270 case SNDRV_PCM_FORMAT_S16_LE:
1271 default:
1272 bit_per_sample = 16;
1273 break;
1274 }
1275
1276 return bit_per_sample;
1277}
1278
1279static void update_int_mi2s_clk_val(int idx, int stream)
1280{
1281 u32 bit_per_sample;
1282
1283 bit_per_sample =
1284 get_int_mi2s_bits_per_sample(int_mi2s_cfg[idx].bit_format);
1285 int_mi2s_clk[idx].clk_freq_in_hz =
1286 (int_mi2s_cfg[idx].sample_rate * 2 * bit_per_sample);
1287}
1288
1289static int int_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
1290{
1291 int ret = 0;
1292 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1293 int port_id = 0;
1294 int index;
1295
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301296 port_id = int_mi2s_get_port_id(rtd->dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301297 if (port_id < 0) {
1298 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
1299 ret = port_id;
1300 goto done;
1301 }
1302 index = int_mi2s_get_index(port_id);
1303 if (index < 0) {
1304 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
1305 ret = port_id;
1306 goto done;
1307 }
1308 if (enable) {
1309 update_int_mi2s_clk_val(index, substream->stream);
1310 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
1311 int_mi2s_clk[index].clk_freq_in_hz);
1312 }
1313
1314 int_mi2s_clk[index].enable = enable;
1315 ret = afe_set_lpass_clock_v2(port_id,
1316 &int_mi2s_clk[index]);
1317 if (ret < 0) {
1318 dev_err(rtd->card->dev,
1319 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
1320 __func__, port_id, ret);
1321 goto done;
1322 }
1323
1324done:
1325 return ret;
1326}
1327
1328static int msm_sdw_mi2s_snd_startup(struct snd_pcm_substream *substream)
1329{
1330 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1331 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1332 int ret = 0;
1333
1334 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1335 substream->name, substream->stream);
1336
1337 ret = int_mi2s_set_sclk(substream, true);
1338 if (ret < 0) {
1339 pr_err("%s: failed to enable sclk %d\n",
1340 __func__, ret);
1341 return ret;
1342 }
1343 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1344 if (ret < 0)
1345 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1346
1347 return ret;
1348}
1349
1350static void msm_sdw_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
1351{
1352 int ret;
1353
1354 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1355 substream->name, substream->stream);
1356
1357 ret = int_mi2s_set_sclk(substream, false);
1358 if (ret < 0)
1359 pr_err("%s:clock disable failed; ret=%d\n", __func__,
1360 ret);
1361}
1362
1363static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream)
1364{
1365 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1366 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1367 struct snd_soc_codec *codec = rtd->codec_dais[ANA_CDC]->codec;
1368 int ret = 0;
1369 struct msm_asoc_mach_data *pdata = NULL;
1370
1371 pdata = snd_soc_card_get_drvdata(codec->component.card);
1372 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1373 substream->name, substream->stream);
1374
1375 ret = int_mi2s_set_sclk(substream, true);
1376 if (ret < 0) {
1377 pr_err("%s: failed to enable sclk %d\n",
1378 __func__, ret);
1379 return ret;
1380 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301381 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1382 if (ret < 0)
1383 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1384
1385 return ret;
1386}
1387
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301388static int msm_int_dig_mi2s_snd_startup(struct snd_pcm_substream *substream)
1389{
1390 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1391 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1392 struct snd_soc_codec *codec = rtd->codec;
1393 int ret = 0;
1394 struct msm_asoc_mach_data *pdata = NULL;
1395
1396 pdata = snd_soc_card_get_drvdata(codec->component.card);
1397 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1398 substream->name, substream->stream);
1399
1400 ret = int_mi2s_set_sclk(substream, true);
1401 if (ret < 0) {
1402 pr_err("%s: failed to enable sclk %d\n",
1403 __func__, ret);
1404 return ret;
1405 }
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301406 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1407 if (ret < 0)
1408 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1409
1410 return ret;
1411}
1412
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301413static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
1414{
1415 int ret;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301416
1417 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1418 substream->name, substream->stream);
1419
1420 ret = int_mi2s_set_sclk(substream, false);
1421 if (ret < 0)
1422 pr_err("%s:clock disable failed; ret=%d\n", __func__,
1423 ret);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301424}
1425
1426static void *def_msm_int_wcd_mbhc_cal(void)
1427{
1428 void *msm_int_wcd_cal;
1429 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
1430 u16 *btn_low, *btn_high;
1431
1432 msm_int_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
1433 WCD_MBHC_DEF_RLOADS), GFP_KERNEL);
1434 if (!msm_int_wcd_cal)
1435 return NULL;
1436
1437#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(msm_int_wcd_cal)->X) = (Y))
1438 S(v_hs_max, 1500);
1439#undef S
1440#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal)->X) = (Y))
1441 S(num_btn, WCD_MBHC_DEF_BUTTONS);
1442#undef S
1443
1444
1445 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal);
1446 btn_low = btn_cfg->_v_btn_low;
1447 btn_high = ((void *)&btn_cfg->_v_btn_low) +
1448 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
1449
1450 /*
1451 * In SW we are maintaining two sets of threshold register
1452 * one for current source and another for Micbias.
1453 * all btn_low corresponds to threshold for current source
1454 * all bt_high corresponds to threshold for Micbias
1455 * Below thresholds are based on following resistances
1456 * 0-70 == Button 0
1457 * 110-180 == Button 1
1458 * 210-290 == Button 2
1459 * 360-680 == Button 3
1460 */
1461 btn_low[0] = 75;
1462 btn_high[0] = 75;
1463 btn_low[1] = 150;
1464 btn_high[1] = 150;
1465 btn_low[2] = 225;
1466 btn_high[2] = 225;
1467 btn_low[3] = 450;
1468 btn_high[3] = 450;
1469 btn_low[4] = 500;
1470 btn_high[4] = 500;
1471
1472 return msm_int_wcd_cal;
1473}
1474
1475static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
1476{
1477 struct snd_soc_codec *dig_cdc = rtd->codec_dais[DIG_CDC]->codec;
1478 struct snd_soc_codec *ana_cdc = rtd->codec_dais[ANA_CDC]->codec;
1479 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(ana_cdc);
1480 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1481 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
1482 struct snd_card *card;
1483 int ret = -ENOMEM;
1484
1485 pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev));
1486
1487 ret = snd_soc_add_codec_controls(ana_cdc, msm_snd_controls,
1488 ARRAY_SIZE(msm_snd_controls));
1489 if (ret < 0) {
1490 pr_err("%s: add_codec_controls failed: %d\n",
1491 __func__, ret);
1492 return ret;
1493 }
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301494
1495 ret = snd_soc_add_codec_controls(ana_cdc, msm_loopback_snd_controls,
1496 ARRAY_SIZE(msm_loopback_snd_controls));
1497 if (ret < 0) {
1498 pr_err("%s: add_codec_controls failed: %d\n",
1499 __func__, ret);
1500 return ret;
1501 }
1502
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301503 ret = snd_soc_add_codec_controls(ana_cdc, msm_common_snd_controls,
1504 msm_common_snd_controls_size());
1505 if (ret < 0) {
1506 pr_err("%s: add common snd controls failed: %d\n",
1507 __func__, ret);
1508 return ret;
1509 }
1510
1511 snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
1512 ARRAY_SIZE(msm_int_dapm_widgets));
1513
1514 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
1515 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
1516 snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic");
1517 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
1518 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
Vatsal Bucha6b9fab62018-06-12 16:57:05 +05301519 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
1520 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301521
1522 snd_soc_dapm_ignore_suspend(dapm, "EAR");
1523 snd_soc_dapm_ignore_suspend(dapm, "HEADPHONE");
1524 snd_soc_dapm_ignore_suspend(dapm, "SPK_OUT");
1525 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
1526 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
1527 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
Laxminath Kasam52697fe2017-11-29 15:44:14 +05301528 snd_soc_dapm_sync(dapm);
1529
1530 dapm = snd_soc_codec_get_dapm(dig_cdc);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301531 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
1532 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
1533 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
1534 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
1535
1536 snd_soc_dapm_sync(dapm);
1537
1538 msm_anlg_cdc_spk_ext_pa_cb(enable_spk_ext_pa, ana_cdc);
1539 msm_dig_cdc_hph_comp_cb(msm_config_hph_compander_gpio, dig_cdc);
1540
1541 card = rtd->card->snd_card;
1542 if (!codec_root)
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301543 codec_root = snd_info_create_subdir(card->module, "codecs",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301544 card->proc_root);
1545 if (!codec_root) {
1546 pr_debug("%s: Cannot create codecs module entry\n",
1547 __func__);
1548 goto done;
1549 }
1550 pdata->codec_root = codec_root;
1551 msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
1552 msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc);
1553done:
Laxminath Kasam38070be2017-08-17 18:21:59 +05301554 msm_set_codec_reg_done(true);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301555 return 0;
1556}
1557
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301558static int msm_dig_audrx_init(struct snd_soc_pcm_runtime *rtd)
1559{
1560 struct snd_soc_codec *dig_cdc = rtd->codec;
1561 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(dig_cdc);
1562 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1563 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
1564 struct snd_card *card;
1565 int ret = -ENOMEM;
1566
1567 pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev));
1568
1569 ret = snd_soc_add_codec_controls(dig_cdc, msm_snd_controls,
1570 ARRAY_SIZE(msm_snd_controls));
1571 if (ret < 0) {
1572 pr_err("%s: add_codec_controls failed: %d\n",
1573 __func__, ret);
1574 return ret;
1575 }
1576 ret = snd_soc_add_codec_controls(dig_cdc, msm_common_snd_controls,
1577 msm_common_snd_controls_size());
1578 if (ret < 0) {
1579 pr_err("%s: add common snd controls failed: %d\n",
1580 __func__, ret);
1581 return ret;
1582 }
1583
1584 snd_soc_dapm_new_controls(dapm, msm_int_dig_dapm_widgets,
1585 ARRAY_SIZE(msm_int_dig_dapm_widgets));
1586
1587 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
1588 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
1589
1590 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
1591 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
1592 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
1593 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
1594
1595 card = rtd->card->snd_card;
1596 if (!codec_root)
1597 codec_root = snd_info_create_subdir(card->module, "codecs",
1598 card->proc_root);
1599 if (!codec_root) {
1600 pr_debug("%s: Cannot create codecs module entry\n",
1601 __func__);
1602 goto done;
1603 }
1604 pdata->codec_root = codec_root;
1605 msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
1606done:
1607 msm_set_codec_reg_done(true);
1608 return 0;
1609}
1610
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301611static int msm_sdw_audrx_init(struct snd_soc_pcm_runtime *rtd)
1612{
1613 struct snd_soc_codec *codec = rtd->codec;
1614 struct snd_soc_dapm_context *dapm =
1615 snd_soc_codec_get_dapm(codec);
1616 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301617 struct snd_soc_component *aux_comp;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301618 struct snd_card *card;
1619
1620 snd_soc_add_codec_controls(codec, msm_sdw_controls,
1621 ARRAY_SIZE(msm_sdw_controls));
1622
1623 snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW Playback");
1624 snd_soc_dapm_ignore_suspend(dapm, "VIfeed_SDW");
1625 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
1626 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
1627 snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW VI");
1628 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_SDW");
1629
1630 snd_soc_dapm_sync(dapm);
1631
1632 /*
1633 * Send speaker configuration only for WSA8810.
1634 * Default configuration is for WSA8815.
1635 */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301636 pr_debug("%s: Number of aux devices: %d\n",
1637 __func__, rtd->card->num_aux_devs);
1638 if (rtd->card->num_aux_devs &&
1639 !list_empty(&rtd->card->aux_comp_list)) {
1640 aux_comp = list_first_entry(&rtd->card->aux_comp_list,
1641 struct snd_soc_component, list_aux);
1642 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
1643 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301644 msm_sdw_set_spkr_mode(rtd->codec, SPKR_MODE_1);
1645 msm_sdw_set_spkr_gain_offset(rtd->codec,
1646 RX_GAIN_OFFSET_M1P5_DB);
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301647 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301648 }
1649 card = rtd->card->snd_card;
1650 if (!codec_root)
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301651 codec_root = snd_info_create_subdir(card->module, "codecs",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301652 card->proc_root);
1653 if (!codec_root) {
1654 pr_debug("%s: Cannot create codecs module entry\n",
1655 __func__);
1656 goto done;
1657 }
1658 pdata->codec_root = codec_root;
1659 msm_sdw_codec_info_create_codec_entry(codec_root, codec);
1660done:
1661 return 0;
1662}
1663
1664static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
1665{
1666 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
1667 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161};
1668 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1669
1670 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
1671 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
1672}
1673
1674static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
1675 struct snd_pcm_hw_params *params)
1676{
1677 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1678 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1679 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1680 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1681 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
1682 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
1683 int ret;
1684
1685 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
1686 codec_dai->name, codec_dai->id);
1687 ret = snd_soc_dai_get_channel_map(codec_dai,
1688 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
1689 if (ret) {
1690 dev_err(rtd->dev,
1691 "%s: failed to get BTFM codec chan map\n, err:%d\n",
1692 __func__, ret);
1693 goto exit;
1694 }
1695
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301696 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) id %d\n",
1697 __func__, tx_ch_cnt, dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301698
1699 ret = snd_soc_dai_set_channel_map(cpu_dai,
1700 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
1701 if (ret)
1702 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
1703 __func__, ret);
1704
1705exit:
1706 return ret;
1707}
1708
1709static unsigned int tdm_param_set_slot_mask(u16 port_id, int slot_width,
1710 int slots)
1711{
1712 unsigned int slot_mask = 0;
1713 int i, j;
1714 unsigned int *slot_offset;
1715
1716 for (i = TDM_0; i < TDM_PORT_MAX; i++) {
1717 slot_offset = tdm_slot_offset[i];
1718
1719 for (j = 0; j < TDM_SLOT_OFFSET_MAX; j++) {
1720 if (slot_offset[j] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1721 slot_mask |=
1722 (1 << ((slot_offset[j] * 8) / slot_width));
1723 else
1724 break;
1725 }
1726 }
1727
1728 return slot_mask;
1729}
1730
1731static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream,
1732 struct snd_pcm_hw_params *params)
1733{
1734 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1735 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1736 int ret = 0;
1737 int channels, slot_width, slots;
1738 unsigned int slot_mask;
1739 unsigned int *slot_offset;
1740 int offset_channels = 0;
1741 int i;
1742
1743 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
1744
1745 channels = params_channels(params);
1746 switch (channels) {
1747 case 1:
1748 case 2:
1749 case 3:
1750 case 4:
1751 case 5:
1752 case 6:
1753 case 7:
1754 case 8:
1755 switch (params_format(params)) {
1756 case SNDRV_PCM_FORMAT_S32_LE:
1757 case SNDRV_PCM_FORMAT_S24_LE:
1758 case SNDRV_PCM_FORMAT_S16_LE:
1759 /*
1760 * up to 8 channels HW config should
1761 * use 32 bit slot width for max support of
1762 * stream bit width. (slot_width > bit_width)
1763 */
1764 slot_width = 32;
1765 break;
1766 default:
1767 pr_err("%s: invalid param format 0x%x\n",
1768 __func__, params_format(params));
1769 return -EINVAL;
1770 }
1771 slots = 8;
1772 slot_mask = tdm_param_set_slot_mask(cpu_dai->id,
1773 slot_width,
1774 slots);
1775 if (!slot_mask) {
1776 pr_err("%s: invalid slot_mask 0x%x\n",
1777 __func__, slot_mask);
1778 return -EINVAL;
1779 }
1780 break;
1781 default:
1782 pr_err("%s: invalid param channels %d\n",
1783 __func__, channels);
1784 return -EINVAL;
1785 }
1786 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
1787 switch (cpu_dai->id) {
1788 case AFE_PORT_ID_PRIMARY_TDM_RX:
1789 case AFE_PORT_ID_SECONDARY_TDM_RX:
1790 case AFE_PORT_ID_TERTIARY_TDM_RX:
1791 case AFE_PORT_ID_QUATERNARY_TDM_RX:
Rohit Kumard1754482017-09-10 22:57:39 +05301792 case AFE_PORT_ID_QUINARY_TDM_RX:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301793 case AFE_PORT_ID_PRIMARY_TDM_TX:
1794 case AFE_PORT_ID_SECONDARY_TDM_TX:
1795 case AFE_PORT_ID_TERTIARY_TDM_TX:
1796 case AFE_PORT_ID_QUATERNARY_TDM_TX:
Rohit Kumard1754482017-09-10 22:57:39 +05301797 case AFE_PORT_ID_QUINARY_TDM_TX:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301798 slot_offset = tdm_slot_offset[TDM_0];
1799 break;
1800 default:
1801 pr_err("%s: dai id 0x%x not supported\n",
1802 __func__, cpu_dai->id);
1803 return -EINVAL;
1804 }
1805
1806 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
1807 if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1808 offset_channels++;
1809 else
1810 break;
1811 }
1812
1813 if (offset_channels == 0) {
1814 pr_err("%s: slot offset not supported, offset_channels %d\n",
1815 __func__, offset_channels);
1816 return -EINVAL;
1817 }
1818
1819 if (channels > offset_channels) {
1820 pr_err("%s: channels %d exceed offset_channels %d\n",
1821 __func__, channels, offset_channels);
1822 return -EINVAL;
1823 }
1824
1825 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1826 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
1827 slots, slot_width);
1828 if (ret < 0) {
1829 pr_err("%s: failed to set tdm slot, err:%d\n",
1830 __func__, ret);
1831 goto end;
1832 }
1833
1834 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
1835 channels, slot_offset);
1836 if (ret < 0) {
1837 pr_err("%s: failed to set channel map, err:%d\n",
1838 __func__, ret);
1839 goto end;
1840 }
1841 } else {
1842 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
1843 slots, slot_width);
1844 if (ret < 0) {
1845 pr_err("%s: failed to set tdm slot, err:%d\n",
1846 __func__, ret);
1847 goto end;
1848 }
1849
1850 ret = snd_soc_dai_set_channel_map(cpu_dai, channels,
1851 slot_offset, 0, NULL);
1852 if (ret < 0) {
1853 pr_err("%s: failed to set channel map, err:%d\n",
1854 __func__, ret);
1855 goto end;
1856 }
1857 }
1858end:
1859 return ret;
1860}
1861
1862static int msm_snd_card_late_probe(struct snd_soc_card *card)
1863{
1864 const char *be_dl_name = LPASS_BE_INT0_MI2S_RX;
1865 struct snd_soc_codec *ana_cdc;
1866 struct snd_soc_pcm_runtime *rtd;
1867 int ret = 0;
1868
1869 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
1870 if (!rtd) {
1871 dev_err(card->dev,
1872 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
1873 __func__, be_dl_name);
1874 return -EINVAL;
1875 }
1876
1877 ana_cdc = rtd->codec_dais[ANA_CDC]->codec;
1878 mbhc_cfg_ptr->calibration = def_msm_int_wcd_mbhc_cal();
1879 if (!mbhc_cfg_ptr->calibration)
1880 return -ENOMEM;
1881
1882 ret = msm_anlg_cdc_hs_detect(ana_cdc, mbhc_cfg_ptr);
1883 if (ret) {
1884 dev_err(card->dev,
1885 "%s: msm_anlg_cdc_hs_detect failed\n", __func__);
1886 kfree(mbhc_cfg_ptr->calibration);
1887 }
1888
1889 return ret;
1890}
1891
1892static struct snd_soc_ops msm_tdm_be_ops = {
1893 .hw_params = msm_tdm_snd_hw_params
1894};
1895
1896static struct snd_soc_ops msm_wcn_ops = {
1897 .hw_params = msm_wcn_hw_params,
1898};
1899
1900static struct snd_soc_ops msm_mi2s_be_ops = {
1901 .startup = msm_mi2s_snd_startup,
1902 .shutdown = msm_mi2s_snd_shutdown,
1903};
1904
1905static struct snd_soc_ops msm_aux_pcm_be_ops = {
1906 .startup = msm_aux_pcm_snd_startup,
1907 .shutdown = msm_aux_pcm_snd_shutdown,
1908};
1909
1910static struct snd_soc_ops msm_int_mi2s_be_ops = {
1911 .startup = msm_int_mi2s_snd_startup,
1912 .shutdown = msm_int_mi2s_snd_shutdown,
1913};
1914
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301915static struct snd_soc_ops msm_int_dig_mi2s_be_ops = {
1916 .startup = msm_int_dig_mi2s_snd_startup,
1917 .shutdown = msm_int_mi2s_snd_shutdown,
1918};
1919
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301920static struct snd_soc_ops msm_sdw_mi2s_be_ops = {
1921 .startup = msm_sdw_mi2s_snd_startup,
1922 .shutdown = msm_sdw_mi2s_snd_shutdown,
1923};
1924
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05301925static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
1926{
1927 cpumask_t mask;
1928
1929 if (pm_qos_request_active(&substream->latency_pm_qos_req))
1930 pm_qos_remove_request(&substream->latency_pm_qos_req);
1931
1932 cpumask_clear(&mask);
1933 cpumask_set_cpu(1, &mask); /* affine to core 1 */
1934 cpumask_set_cpu(2, &mask); /* affine to core 2 */
1935 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
1936
1937 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
1938
1939 pm_qos_add_request(&substream->latency_pm_qos_req,
1940 PM_QOS_CPU_DMA_LATENCY,
1941 MSM_LL_QOS_VALUE);
1942 return 0;
1943}
1944
1945static struct snd_soc_ops msm_fe_qos_ops = {
1946 .prepare = msm_fe_qos_prepare,
1947};
1948
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301949struct snd_soc_dai_link_component dlc_rx1[] = {
1950 {
1951 .of_node = NULL,
1952 .dai_name = "msm_dig_cdc_dai_rx1",
1953 },
1954 {
1955 .of_node = NULL,
1956 .dai_name = "msm_anlg_cdc_i2s_rx1",
1957 },
1958};
1959
1960struct snd_soc_dai_link_component dlc_tx1[] = {
1961 {
1962 .of_node = NULL,
1963 .dai_name = "msm_dig_cdc_dai_tx1",
1964 },
1965 {
1966 .of_node = NULL,
1967 .dai_name = "msm_anlg_cdc_i2s_tx1",
1968 },
1969};
1970
1971struct snd_soc_dai_link_component dlc_tx2[] = {
1972 {
1973 .of_node = NULL,
1974 .dai_name = "msm_dig_cdc_dai_tx2",
1975 },
1976 {
1977 .of_node = NULL,
1978 .dai_name = "msm_anlg_cdc_i2s_tx2",
1979 },
1980};
1981
1982/* Digital audio interface glue - connects codec <---> CPU */
1983static struct snd_soc_dai_link msm_int_dai[] = {
1984 /* FrontEnd DAI Links */
1985 {/* hw:x,0 */
1986 .name = MSM_DAILINK_NAME(Media1),
1987 .stream_name = "MultiMedia1",
1988 .cpu_dai_name = "MultiMedia1",
1989 .platform_name = "msm-pcm-dsp.0",
1990 .dynamic = 1,
1991 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1992 SND_SOC_DPCM_TRIGGER_POST},
1993 .codec_dai_name = "snd-soc-dummy-dai",
1994 .codec_name = "snd-soc-dummy",
1995 .ignore_suspend = 1,
1996 .dpcm_playback = 1,
1997 .dpcm_capture = 1,
1998 /* this dai link has playback support */
1999 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302000 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302001 },
2002 {/* hw:x,1 */
2003 .name = MSM_DAILINK_NAME(Media2),
2004 .stream_name = "MultiMedia2",
2005 .cpu_dai_name = "MultiMedia2",
2006 .platform_name = "msm-pcm-dsp.0",
2007 .dynamic = 1,
2008 .dpcm_playback = 1,
2009 .dpcm_capture = 1,
2010 .codec_dai_name = "snd-soc-dummy-dai",
2011 .codec_name = "snd-soc-dummy",
2012 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2013 SND_SOC_DPCM_TRIGGER_POST},
2014 .ignore_suspend = 1,
2015 /* this dai link has playback support */
2016 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302017 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302018 },
2019 {/* hw:x,2 */
2020 .name = "VoiceMMode1",
2021 .stream_name = "VoiceMMode1",
2022 .cpu_dai_name = "VoiceMMode1",
2023 .platform_name = "msm-pcm-voice",
2024 .dynamic = 1,
2025 .dpcm_capture = 1,
2026 .dpcm_playback = 1,
2027 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2028 SND_SOC_DPCM_TRIGGER_POST},
2029 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2030 .ignore_suspend = 1,
2031 .ignore_pmdown_time = 1,
2032 .codec_dai_name = "snd-soc-dummy-dai",
2033 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302034 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302035 },
2036 {/* hw:x,3 */
2037 .name = "MSM VoIP",
2038 .stream_name = "VoIP",
2039 .cpu_dai_name = "VoIP",
2040 .platform_name = "msm-voip-dsp",
2041 .dynamic = 1,
2042 .dpcm_playback = 1,
2043 .dpcm_capture = 1,
2044 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2045 SND_SOC_DPCM_TRIGGER_POST},
2046 .codec_dai_name = "snd-soc-dummy-dai",
2047 .codec_name = "snd-soc-dummy",
2048 .ignore_suspend = 1,
2049 /* this dai link has playback support */
2050 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302051 .id = MSM_FRONTEND_DAI_VOIP,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302052 },
2053 {/* hw:x,4 */
2054 .name = MSM_DAILINK_NAME(ULL),
2055 .stream_name = "ULL",
2056 .cpu_dai_name = "MultiMedia3",
2057 .platform_name = "msm-pcm-dsp.2",
2058 .dynamic = 1,
2059 .dpcm_playback = 1,
2060 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2061 SND_SOC_DPCM_TRIGGER_POST},
2062 .codec_dai_name = "snd-soc-dummy-dai",
2063 .codec_name = "snd-soc-dummy",
2064 .ignore_suspend = 1,
2065 /* this dai link has playback support */
2066 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302067 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302068 },
2069 /* Hostless PCM purpose */
2070 {/* hw:x,5 */
2071 .name = "INT4 MI2S_RX Hostless",
2072 .stream_name = "INT4 MI2S_RX Hostless",
2073 .cpu_dai_name = "INT4_MI2S_RX_HOSTLESS",
2074 .platform_name = "msm-pcm-hostless",
2075 .dynamic = 1,
2076 .dpcm_playback = 1,
2077 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2078 SND_SOC_DPCM_TRIGGER_POST},
2079 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2080 .ignore_suspend = 1,
2081 /* this dailink has playback support */
2082 .ignore_pmdown_time = 1,
2083 /* This dainlink has MI2S support */
2084 .codec_dai_name = "snd-soc-dummy-dai",
2085 .codec_name = "snd-soc-dummy",
2086 },
2087 {/* hw:x,6 */
2088 .name = "MSM AFE-PCM RX",
2089 .stream_name = "AFE-PROXY RX",
2090 .cpu_dai_name = "msm-dai-q6-dev.241",
2091 .codec_name = "msm-stub-codec.1",
2092 .codec_dai_name = "msm-stub-rx",
2093 .platform_name = "msm-pcm-afe",
2094 .ignore_suspend = 1,
2095 /* this dai link has playback support */
2096 .ignore_pmdown_time = 1,
2097 },
2098 {/* hw:x,7 */
2099 .name = "MSM AFE-PCM TX",
2100 .stream_name = "AFE-PROXY TX",
2101 .cpu_dai_name = "msm-dai-q6-dev.240",
2102 .codec_name = "msm-stub-codec.1",
2103 .codec_dai_name = "msm-stub-tx",
2104 .platform_name = "msm-pcm-afe",
2105 .ignore_suspend = 1,
2106 },
2107 {/* hw:x,8 */
2108 .name = MSM_DAILINK_NAME(Compress1),
2109 .stream_name = "Compress1",
2110 .cpu_dai_name = "MultiMedia4",
2111 .platform_name = "msm-compress-dsp",
2112 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
2113 .dynamic = 1,
2114 .dpcm_capture = 1,
2115 .dpcm_playback = 1,
2116 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2117 SND_SOC_DPCM_TRIGGER_POST},
2118 .codec_dai_name = "snd-soc-dummy-dai",
2119 .codec_name = "snd-soc-dummy",
2120 .ignore_suspend = 1,
2121 .ignore_pmdown_time = 1,
2122 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302123 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302124 },
2125 {/* hw:x,9*/
2126 .name = "AUXPCM Hostless",
2127 .stream_name = "AUXPCM Hostless",
2128 .cpu_dai_name = "AUXPCM_HOSTLESS",
2129 .platform_name = "msm-pcm-hostless",
2130 .dynamic = 1,
2131 .dpcm_capture = 1,
2132 .dpcm_playback = 1,
2133 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2134 SND_SOC_DPCM_TRIGGER_POST},
2135 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2136 .ignore_suspend = 1,
2137 /* this dai link has playback support */
2138 .ignore_pmdown_time = 1,
2139 .codec_dai_name = "snd-soc-dummy-dai",
2140 .codec_name = "snd-soc-dummy",
2141 },
2142 {/* hw:x,10 */
2143 .name = "SLIMBUS_1 Hostless",
2144 .stream_name = "SLIMBUS_1 Hostless",
2145 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
2146 .platform_name = "msm-pcm-hostless",
2147 .dynamic = 1,
2148 .dpcm_capture = 1,
2149 .dpcm_playback = 1,
2150 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2151 SND_SOC_DPCM_TRIGGER_POST},
2152 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2153 .ignore_suspend = 1,
2154 .ignore_pmdown_time = 1, /* dai link has playback support */
2155 .codec_dai_name = "snd-soc-dummy-dai",
2156 .codec_name = "snd-soc-dummy",
2157 },
2158 {/* hw:x,11 */
2159 .name = "INT3 MI2S_TX Hostless",
2160 .stream_name = "INT3 MI2S_TX Hostless",
2161 .cpu_dai_name = "INT3_MI2S_TX_HOSTLESS",
2162 .platform_name = "msm-pcm-hostless",
2163 .dynamic = 1,
2164 .dpcm_capture = 1,
2165 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2166 SND_SOC_DPCM_TRIGGER_POST},
2167 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2168 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302169 .codec_dai_name = "snd-soc-dummy-dai",
2170 .codec_name = "snd-soc-dummy",
2171 },
2172 {/* hw:x,12 */
2173 .name = "SLIMBUS_7 Hostless",
2174 .stream_name = "SLIMBUS_7 Hostless",
2175 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
2176 .platform_name = "msm-pcm-hostless",
2177 .dynamic = 1,
2178 .dpcm_capture = 1,
2179 .dpcm_playback = 1,
2180 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2181 SND_SOC_DPCM_TRIGGER_POST},
2182 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2183 .ignore_suspend = 1,
2184 .ignore_pmdown_time = 1, /* dai link has playback support */
2185 .codec_dai_name = "snd-soc-dummy-dai",
2186 .codec_name = "snd-soc-dummy",
2187 },
2188 {/* hw:x,13 */
2189 .name = MSM_DAILINK_NAME(LowLatency),
2190 .stream_name = "MultiMedia5",
2191 .cpu_dai_name = "MultiMedia5",
2192 .platform_name = "msm-pcm-dsp.1",
2193 .dynamic = 1,
2194 .dpcm_capture = 1,
2195 .dpcm_playback = 1,
2196 .codec_dai_name = "snd-soc-dummy-dai",
2197 .codec_name = "snd-soc-dummy",
2198 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2199 SND_SOC_DPCM_TRIGGER_POST},
2200 .ignore_suspend = 1,
2201 /* this dai link has playback support */
2202 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302203 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302204 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302205 },
2206 /* LSM FE */
2207 {/* hw:x,14 */
2208 .name = "Listen 1 Audio Service",
2209 .stream_name = "Listen 1 Audio Service",
2210 .cpu_dai_name = "LSM1",
2211 .platform_name = "msm-lsm-client",
2212 .dynamic = 1,
2213 .dpcm_capture = 1,
2214 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2215 SND_SOC_DPCM_TRIGGER_POST },
2216 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2217 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302218 .codec_dai_name = "snd-soc-dummy-dai",
2219 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302220 .id = MSM_FRONTEND_DAI_LSM1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302221 },
2222 {/* hw:x,15 */
2223 .name = MSM_DAILINK_NAME(Compress2),
2224 .stream_name = "Compress2",
2225 .cpu_dai_name = "MultiMedia7",
2226 .platform_name = "msm-compress-dsp",
2227 .dynamic = 1,
2228 .dpcm_capture = 1,
2229 .dpcm_playback = 1,
2230 .codec_dai_name = "snd-soc-dummy-dai",
2231 .codec_name = "snd-soc-dummy",
2232 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2233 SND_SOC_DPCM_TRIGGER_POST},
2234 .ignore_suspend = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302235 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302236 },
2237 {/* hw:x,16 */
Laxminath Kasam38070be2017-08-17 18:21:59 +05302238 .name = MSM_DAILINK_NAME(MultiMedia10),
2239 .stream_name = "MultiMedia10",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302240 .cpu_dai_name = "MultiMedia10",
Laxminath Kasam38070be2017-08-17 18:21:59 +05302241 .platform_name = "msm-pcm-dsp.1",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302242 .dynamic = 1,
2243 .dpcm_capture = 1,
2244 .dpcm_playback = 1,
Laxminath Kasam38070be2017-08-17 18:21:59 +05302245 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302246 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2247 SND_SOC_DPCM_TRIGGER_POST},
2248 .codec_dai_name = "snd-soc-dummy-dai",
2249 .codec_name = "snd-soc-dummy",
2250 .ignore_suspend = 1,
2251 .ignore_pmdown_time = 1,
2252 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302253 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302254 },
2255 {/* hw:x,17 */
2256 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
2257 .stream_name = "MM_NOIRQ",
2258 .cpu_dai_name = "MultiMedia8",
2259 .platform_name = "msm-pcm-dsp-noirq",
2260 .dynamic = 1,
2261 .dpcm_capture = 1,
2262 .dpcm_playback = 1,
2263 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2264 SND_SOC_DPCM_TRIGGER_POST},
2265 .codec_dai_name = "snd-soc-dummy-dai",
2266 .codec_name = "snd-soc-dummy",
2267 .ignore_suspend = 1,
2268 .ignore_pmdown_time = 1,
2269 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302270 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302271 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302272 },
2273 {/* hw:x,18 */
2274 .name = "HDMI_RX_HOSTLESS",
2275 .stream_name = "HDMI_RX_HOSTLESS",
2276 .cpu_dai_name = "HDMI_HOSTLESS",
2277 .platform_name = "msm-pcm-hostless",
2278 .dynamic = 1,
2279 .dpcm_playback = 1,
2280 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2281 SND_SOC_DPCM_TRIGGER_POST},
2282 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2283 .ignore_suspend = 1,
2284 .ignore_pmdown_time = 1,
2285 .codec_dai_name = "snd-soc-dummy-dai",
2286 .codec_name = "snd-soc-dummy",
2287 },
2288 {/* hw:x,19 */
2289 .name = "VoiceMMode2",
2290 .stream_name = "VoiceMMode2",
2291 .cpu_dai_name = "VoiceMMode2",
2292 .platform_name = "msm-pcm-voice",
2293 .dynamic = 1,
2294 .dpcm_capture = 1,
2295 .dpcm_playback = 1,
2296 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2297 SND_SOC_DPCM_TRIGGER_POST},
2298 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2299 .ignore_suspend = 1,
2300 .ignore_pmdown_time = 1,
2301 .codec_dai_name = "snd-soc-dummy-dai",
2302 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302303 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302304 },
2305 {/* hw:x,20 */
2306 .name = "Listen 2 Audio Service",
2307 .stream_name = "Listen 2 Audio Service",
2308 .cpu_dai_name = "LSM2",
2309 .platform_name = "msm-lsm-client",
2310 .dynamic = 1,
2311 .dpcm_capture = 1,
2312 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2313 SND_SOC_DPCM_TRIGGER_POST },
2314 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2315 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302316 .codec_dai_name = "snd-soc-dummy-dai",
2317 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302318 .id = MSM_FRONTEND_DAI_LSM2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302319 },
2320 {/* hw:x,21 */
2321 .name = "Listen 3 Audio Service",
2322 .stream_name = "Listen 3 Audio Service",
2323 .cpu_dai_name = "LSM3",
2324 .platform_name = "msm-lsm-client",
2325 .dynamic = 1,
2326 .dpcm_capture = 1,
2327 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2328 SND_SOC_DPCM_TRIGGER_POST },
2329 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2330 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302331 .codec_dai_name = "snd-soc-dummy-dai",
2332 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302333 .id = MSM_FRONTEND_DAI_LSM3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302334 },
2335 {/* hw:x,22 */
2336 .name = "Listen 4 Audio Service",
2337 .stream_name = "Listen 4 Audio Service",
2338 .cpu_dai_name = "LSM4",
2339 .platform_name = "msm-lsm-client",
2340 .dynamic = 1,
2341 .dpcm_capture = 1,
2342 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2343 SND_SOC_DPCM_TRIGGER_POST },
2344 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2345 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302346 .codec_dai_name = "snd-soc-dummy-dai",
2347 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302348 .id = MSM_FRONTEND_DAI_LSM4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302349 },
2350 {/* hw:x,23 */
2351 .name = "Listen 5 Audio Service",
2352 .stream_name = "Listen 5 Audio Service",
2353 .cpu_dai_name = "LSM5",
2354 .platform_name = "msm-lsm-client",
2355 .dynamic = 1,
2356 .dpcm_capture = 1,
2357 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2358 SND_SOC_DPCM_TRIGGER_POST },
2359 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2360 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302361 .codec_dai_name = "snd-soc-dummy-dai",
2362 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302363 .id = MSM_FRONTEND_DAI_LSM5,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302364 },
2365 {/* hw:x,24 */
2366 .name = "Listen 6 Audio Service",
2367 .stream_name = "Listen 6 Audio Service",
2368 .cpu_dai_name = "LSM6",
2369 .platform_name = "msm-lsm-client",
2370 .dynamic = 1,
2371 .dpcm_capture = 1,
2372 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2373 SND_SOC_DPCM_TRIGGER_POST },
2374 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2375 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302376 .codec_dai_name = "snd-soc-dummy-dai",
2377 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302378 .id = MSM_FRONTEND_DAI_LSM6
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302379 },
2380 {/* hw:x,25 */
2381 .name = "Listen 7 Audio Service",
2382 .stream_name = "Listen 7 Audio Service",
2383 .cpu_dai_name = "LSM7",
2384 .platform_name = "msm-lsm-client",
2385 .dynamic = 1,
2386 .dpcm_capture = 1,
2387 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2388 SND_SOC_DPCM_TRIGGER_POST },
2389 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2390 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302391 .codec_dai_name = "snd-soc-dummy-dai",
2392 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302393 .id = MSM_FRONTEND_DAI_LSM7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302394 },
2395 {/* hw:x,26 */
2396 .name = "Listen 8 Audio Service",
2397 .stream_name = "Listen 8 Audio Service",
2398 .cpu_dai_name = "LSM8",
2399 .platform_name = "msm-lsm-client",
2400 .dynamic = 1,
2401 .dpcm_capture = 1,
2402 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2403 SND_SOC_DPCM_TRIGGER_POST },
2404 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2405 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302406 .codec_dai_name = "snd-soc-dummy-dai",
2407 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302408 .id = MSM_FRONTEND_DAI_LSM8,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302409 },
2410 {/* hw:x,27 */
2411 .name = MSM_DAILINK_NAME(Media9),
2412 .stream_name = "MultiMedia9",
2413 .cpu_dai_name = "MultiMedia9",
2414 .platform_name = "msm-pcm-dsp.0",
2415 .dynamic = 1,
2416 .dpcm_capture = 1,
2417 .dpcm_playback = 1,
2418 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2419 SND_SOC_DPCM_TRIGGER_POST},
2420 .codec_dai_name = "snd-soc-dummy-dai",
2421 .codec_name = "snd-soc-dummy",
2422 .ignore_suspend = 1,
2423 .ignore_pmdown_time = 1,
2424 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302425 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302426 },
2427 {/* hw:x,28 */
2428 .name = MSM_DAILINK_NAME(Compress4),
2429 .stream_name = "Compress4",
2430 .cpu_dai_name = "MultiMedia11",
2431 .platform_name = "msm-compress-dsp",
2432 .dynamic = 1,
2433 .dpcm_capture = 1,
2434 .dpcm_playback = 1,
2435 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2436 SND_SOC_DPCM_TRIGGER_POST},
2437 .codec_dai_name = "snd-soc-dummy-dai",
2438 .codec_name = "snd-soc-dummy",
2439 .ignore_suspend = 1,
2440 .ignore_pmdown_time = 1,
2441 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302442 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302443 },
2444 {/* hw:x,29 */
2445 .name = MSM_DAILINK_NAME(Compress5),
2446 .stream_name = "Compress5",
2447 .cpu_dai_name = "MultiMedia12",
2448 .platform_name = "msm-compress-dsp",
2449 .dynamic = 1,
2450 .dpcm_capture = 1,
2451 .dpcm_playback = 1,
2452 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2453 SND_SOC_DPCM_TRIGGER_POST},
2454 .codec_dai_name = "snd-soc-dummy-dai",
2455 .codec_name = "snd-soc-dummy",
2456 .ignore_suspend = 1,
2457 .ignore_pmdown_time = 1,
2458 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302459 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302460 },
2461 {/* hw:x,30 */
2462 .name = MSM_DAILINK_NAME(Compress6),
2463 .stream_name = "Compress6",
2464 .cpu_dai_name = "MultiMedia13",
2465 .platform_name = "msm-compress-dsp",
2466 .dynamic = 1,
2467 .dpcm_capture = 1,
2468 .dpcm_playback = 1,
2469 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2470 SND_SOC_DPCM_TRIGGER_POST},
2471 .codec_dai_name = "snd-soc-dummy-dai",
2472 .codec_name = "snd-soc-dummy",
2473 .ignore_suspend = 1,
2474 .ignore_pmdown_time = 1,
2475 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302476 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302477 },
2478 {/* hw:x,31 */
2479 .name = MSM_DAILINK_NAME(Compress7),
2480 .stream_name = "Compress7",
2481 .cpu_dai_name = "MultiMedia14",
2482 .platform_name = "msm-compress-dsp",
2483 .dynamic = 1,
2484 .dpcm_capture = 1,
2485 .dpcm_playback = 1,
2486 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2487 SND_SOC_DPCM_TRIGGER_POST},
2488 .codec_dai_name = "snd-soc-dummy-dai",
2489 .codec_name = "snd-soc-dummy",
2490 .ignore_suspend = 1,
2491 .ignore_pmdown_time = 1,
2492 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302493 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302494 },
2495 {/* hw:x,32 */
2496 .name = MSM_DAILINK_NAME(Compress8),
2497 .stream_name = "Compress8",
2498 .cpu_dai_name = "MultiMedia15",
2499 .platform_name = "msm-compress-dsp",
2500 .dynamic = 1,
2501 .dpcm_capture = 1,
2502 .dpcm_playback = 1,
2503 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2504 SND_SOC_DPCM_TRIGGER_POST},
2505 .codec_dai_name = "snd-soc-dummy-dai",
2506 .codec_name = "snd-soc-dummy",
2507 .ignore_suspend = 1,
2508 .ignore_pmdown_time = 1,
2509 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302510 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302511 },
2512 {/* hw:x,33 */
Asish Bhattacharya34504582017-08-08 12:55:01 +05302513 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
2514 .stream_name = "MM_NOIRQ_2",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302515 .cpu_dai_name = "MultiMedia16",
Asish Bhattacharya34504582017-08-08 12:55:01 +05302516 .platform_name = "msm-pcm-dsp-noirq",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302517 .dynamic = 1,
2518 .dpcm_capture = 1,
2519 .dpcm_playback = 1,
2520 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2521 SND_SOC_DPCM_TRIGGER_POST},
2522 .codec_dai_name = "snd-soc-dummy-dai",
2523 .codec_name = "snd-soc-dummy",
2524 .ignore_suspend = 1,
2525 .ignore_pmdown_time = 1,
2526 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302527 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302528 },
2529 {/* hw:x,34 */
2530 .name = "SLIMBUS_8 Hostless",
2531 .stream_name = "SLIMBUS8_HOSTLESS Capture",
2532 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
2533 .platform_name = "msm-pcm-hostless",
2534 .dynamic = 1,
2535 .dpcm_capture = 1,
2536 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2537 SND_SOC_DPCM_TRIGGER_POST},
2538 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2539 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302540 .codec_dai_name = "snd-soc-dummy-dai",
2541 .codec_name = "snd-soc-dummy",
2542 },
2543 {/* hw:x,35 */
2544 .name = "Primary MI2S_RX Hostless",
2545 .stream_name = "Primary MI2S_RX Hostless",
2546 .cpu_dai_name = "PRI_MI2S_RX_HOSTLESS",
2547 .platform_name = "msm-pcm-hostless",
2548 .dynamic = 1,
2549 .dpcm_playback = 1,
2550 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2551 SND_SOC_DPCM_TRIGGER_POST},
2552 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2553 .ignore_suspend = 1,
2554 /* this dailink has playback support */
2555 .ignore_pmdown_time = 1,
2556 /* This dainlink has MI2S support */
2557 .codec_dai_name = "snd-soc-dummy-dai",
2558 .codec_name = "snd-soc-dummy",
2559 },
2560 {/* hw:x,36 */
2561 .name = "Secondary MI2S_RX Hostless",
2562 .stream_name = "Secondary MI2S_RX Hostless",
2563 .cpu_dai_name = "SEC_MI2S_RX_HOSTLESS",
2564 .platform_name = "msm-pcm-hostless",
2565 .dynamic = 1,
2566 .dpcm_playback = 1,
2567 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2568 SND_SOC_DPCM_TRIGGER_POST},
2569 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2570 .ignore_suspend = 1,
2571 /* this dailink has playback support */
2572 .ignore_pmdown_time = 1,
2573 /* This dainlink has MI2S support */
2574 .codec_dai_name = "snd-soc-dummy-dai",
2575 .codec_name = "snd-soc-dummy",
2576 },
2577 {/* hw:x,37 */
2578 .name = "Tertiary MI2S_RX Hostless",
2579 .stream_name = "Tertiary MI2S_RX Hostless",
2580 .cpu_dai_name = "TERT_MI2S_RX_HOSTLESS",
2581 .platform_name = "msm-pcm-hostless",
2582 .dynamic = 1,
2583 .dpcm_playback = 1,
2584 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2585 SND_SOC_DPCM_TRIGGER_POST},
2586 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2587 .ignore_suspend = 1,
2588 /* this dailink has playback support */
2589 .ignore_pmdown_time = 1,
2590 /* This dainlink has MI2S support */
2591 .codec_dai_name = "snd-soc-dummy-dai",
2592 .codec_name = "snd-soc-dummy",
2593 },
2594 {/* hw:x,38 */
2595 .name = "INT0 MI2S_RX Hostless",
2596 .stream_name = "INT0 MI2S_RX Hostless",
2597 .cpu_dai_name = "INT0_MI2S_RX_HOSTLESS",
2598 .platform_name = "msm-pcm-hostless",
2599 .dynamic = 1,
2600 .dpcm_playback = 1,
2601 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2602 SND_SOC_DPCM_TRIGGER_POST},
2603 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2604 .ignore_suspend = 1,
2605 /* this dailink has playback support */
2606 .ignore_pmdown_time = 1,
2607 /* This dainlink has MI2S support */
2608 .codec_dai_name = "snd-soc-dummy-dai",
2609 .codec_name = "snd-soc-dummy",
2610 },
2611 {/* hw:x,39 */
2612 .name = "SDM660 HFP TX",
2613 .stream_name = "MultiMedia6",
2614 .cpu_dai_name = "MultiMedia6",
2615 .platform_name = "msm-pcm-loopback",
2616 .dynamic = 1,
2617 .dpcm_playback = 1,
2618 .dpcm_capture = 1,
2619 .codec_dai_name = "snd-soc-dummy-dai",
2620 .codec_name = "snd-soc-dummy",
2621 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2622 SND_SOC_DPCM_TRIGGER_POST},
2623 .ignore_suspend = 1,
2624 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2625 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302626 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302627 },
2628};
2629
2630
2631static struct snd_soc_dai_link msm_int_wsa_dai[] = {
2632 {/* hw:x,40 */
2633 .name = LPASS_BE_INT5_MI2S_TX,
2634 .stream_name = "INT5_mi2s Capture",
2635 .cpu_dai_name = "msm-dai-q6-mi2s.12",
2636 .platform_name = "msm-pcm-hostless",
2637 .codec_name = "msm_sdw_codec",
2638 .codec_dai_name = "msm_sdw_vifeedback",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302639 .id = MSM_BACKEND_DAI_INT5_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302640 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2641 .ops = &msm_sdw_mi2s_be_ops,
2642 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2643 .ignore_suspend = 1,
2644 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302645 },
2646};
2647
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05302648static struct snd_soc_dai_link msm_int_compress_capture_dai[] = {
2649 {/* hw:x,41 */
2650 .name = "Compress9",
2651 .stream_name = "Compress9",
2652 .cpu_dai_name = "MultiMedia17",
2653 .platform_name = "msm-compress-dsp",
2654 .dynamic = 1,
2655 .dpcm_capture = 1,
2656 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2657 SND_SOC_DPCM_TRIGGER_POST},
2658 .codec_dai_name = "snd-soc-dummy-dai",
2659 .codec_name = "snd-soc-dummy",
2660 .ignore_suspend = 1,
2661 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
2662 },
2663 {/* hw:x,42 */
2664 .name = "Compress10",
2665 .stream_name = "Compress10",
2666 .cpu_dai_name = "MultiMedia18",
2667 .platform_name = "msm-compress-dsp",
2668 .dynamic = 1,
2669 .dpcm_capture = 1,
2670 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2671 SND_SOC_DPCM_TRIGGER_POST},
2672 .codec_dai_name = "snd-soc-dummy-dai",
2673 .codec_name = "snd-soc-dummy",
2674 .ignore_suspend = 1,
2675 .id = MSM_FRONTEND_DAI_MULTIMEDIA18,
2676 },
2677 {/* hw:x,43 */
2678 .name = "Compress11",
2679 .stream_name = "Compress11",
2680 .cpu_dai_name = "MultiMedia19",
2681 .platform_name = "msm-compress-dsp",
2682 .dynamic = 1,
2683 .dpcm_capture = 1,
2684 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2685 SND_SOC_DPCM_TRIGGER_POST},
2686 .codec_dai_name = "snd-soc-dummy-dai",
2687 .codec_name = "snd-soc-dummy",
2688 .ignore_suspend = 1,
2689 .id = MSM_FRONTEND_DAI_MULTIMEDIA19,
2690 },
2691 {/* hw:x,44 */
2692 .name = "Compress12",
2693 .stream_name = "Compress12",
2694 .cpu_dai_name = "MultiMedia28",
2695 .platform_name = "msm-compress-dsp",
2696 .dynamic = 1,
2697 .dpcm_capture = 1,
2698 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2699 SND_SOC_DPCM_TRIGGER_POST},
2700 .codec_dai_name = "snd-soc-dummy-dai",
2701 .codec_name = "snd-soc-dummy",
2702 .ignore_suspend = 1,
2703 .id = MSM_FRONTEND_DAI_MULTIMEDIA28,
2704 },
2705 {/* hw:x,45 */
2706 .name = "Compress13",
2707 .stream_name = "Compress13",
2708 .cpu_dai_name = "MultiMedia29",
2709 .platform_name = "msm-compress-dsp",
2710 .dynamic = 1,
2711 .dpcm_capture = 1,
2712 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2713 SND_SOC_DPCM_TRIGGER_POST},
2714 .codec_dai_name = "snd-soc-dummy-dai",
2715 .codec_name = "snd-soc-dummy",
2716 .ignore_suspend = 1,
2717 .id = MSM_FRONTEND_DAI_MULTIMEDIA29,
2718 },
2719};
2720
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302721static struct snd_soc_dai_link msm_int_be_dai[] = {
2722 /* Backend I2S DAI Links */
2723 {
2724 .name = LPASS_BE_INT0_MI2S_RX,
2725 .stream_name = "INT0 MI2S Playback",
2726 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2727 .platform_name = "msm-pcm-routing",
2728 .codecs = dlc_rx1,
2729 .num_codecs = CODECS_MAX,
2730 .no_pcm = 1,
2731 .dpcm_playback = 1,
2732 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2733 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302734 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302735 .init = &msm_audrx_init,
2736 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2737 .ops = &msm_int_mi2s_be_ops,
2738 .ignore_suspend = 1,
2739 },
2740 {
2741 .name = LPASS_BE_INT3_MI2S_TX,
2742 .stream_name = "INT3 MI2S Capture",
2743 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2744 .platform_name = "msm-pcm-routing",
2745 .codecs = dlc_tx1,
2746 .num_codecs = CODECS_MAX,
2747 .no_pcm = 1,
2748 .dpcm_capture = 1,
2749 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2750 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302751 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302752 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2753 .ops = &msm_int_mi2s_be_ops,
2754 .ignore_suspend = 1,
2755 },
2756 {
2757 .name = LPASS_BE_INT2_MI2S_TX,
2758 .stream_name = "INT2 MI2S Capture",
2759 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2760 .platform_name = "msm-pcm-routing",
2761 .codecs = dlc_tx2,
2762 .num_codecs = CODECS_MAX,
2763 .no_pcm = 1,
2764 .dpcm_capture = 1,
2765 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2766 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302767 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302768 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2769 .ops = &msm_int_mi2s_be_ops,
2770 .ignore_suspend = 1,
2771 },
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05302772};
2773
2774static struct snd_soc_dai_link msm_int_dig_be_dai[] = {
2775 /* DIG Codec Backend DAI Links */
2776 {
2777 .name = LPASS_BE_INT0_MI2S_RX,
2778 .stream_name = "INT0 MI2S Playback",
2779 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2780 .platform_name = "msm-pcm-routing",
2781 .codec_dai_name = "msm_dig_cdc_dai_rx1",
2782 .no_pcm = 1,
2783 .dpcm_playback = 1,
2784 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2785 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2786 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
2787 .init = &msm_dig_audrx_init,
2788 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2789 .ops = &msm_int_dig_mi2s_be_ops,
2790 .ignore_suspend = 1,
2791 },
2792 {
2793 .name = LPASS_BE_INT3_MI2S_TX,
2794 .stream_name = "INT3 MI2S Capture",
2795 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2796 .platform_name = "msm-pcm-routing",
2797 .codec_dai_name = "msm_dig_cdc_dai_tx1",
2798 .no_pcm = 1,
2799 .dpcm_capture = 1,
2800 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2801 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2802 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
2803 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2804 .ops = &msm_int_dig_mi2s_be_ops,
2805 .ignore_suspend = 1,
2806 },
2807 {
2808 .name = LPASS_BE_INT2_MI2S_TX,
2809 .stream_name = "INT2 MI2S Capture",
2810 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2811 .platform_name = "msm-pcm-routing",
2812 .codec_dai_name = "msm_dig_cdc_dai_tx2",
2813 .no_pcm = 1,
2814 .dpcm_capture = 1,
2815 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2816 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2817 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
2818 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2819 .ops = &msm_int_dig_mi2s_be_ops,
2820 .ignore_suspend = 1,
2821 },
2822};
2823
2824static struct snd_soc_dai_link msm_int_common_be_dai[] = {
2825 /* Backend I2S DAI Links */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302826 {
2827 .name = LPASS_BE_AFE_PCM_RX,
2828 .stream_name = "AFE Playback",
2829 .cpu_dai_name = "msm-dai-q6-dev.224",
2830 .platform_name = "msm-pcm-routing",
2831 .codec_name = "msm-stub-codec.1",
2832 .codec_dai_name = "msm-stub-rx",
2833 .no_pcm = 1,
2834 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302835 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302836 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2837 /* this dainlink has playback support */
2838 .ignore_pmdown_time = 1,
2839 .ignore_suspend = 1,
2840 },
2841 {
2842 .name = LPASS_BE_AFE_PCM_TX,
2843 .stream_name = "AFE Capture",
2844 .cpu_dai_name = "msm-dai-q6-dev.225",
2845 .platform_name = "msm-pcm-routing",
2846 .codec_name = "msm-stub-codec.1",
2847 .codec_dai_name = "msm-stub-tx",
2848 .no_pcm = 1,
2849 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302850 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302851 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2852 .ignore_suspend = 1,
2853 },
2854 /* Incall Record Uplink BACK END DAI Link */
2855 {
2856 .name = LPASS_BE_INCALL_RECORD_TX,
2857 .stream_name = "Voice Uplink Capture",
2858 .cpu_dai_name = "msm-dai-q6-dev.32772",
2859 .platform_name = "msm-pcm-routing",
2860 .codec_name = "msm-stub-codec.1",
2861 .codec_dai_name = "msm-stub-tx",
2862 .no_pcm = 1,
2863 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302864 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302865 .be_hw_params_fixup = msm_be_hw_params_fixup,
2866 .ignore_suspend = 1,
2867 },
2868 /* Incall Record Downlink BACK END DAI Link */
2869 {
2870 .name = LPASS_BE_INCALL_RECORD_RX,
2871 .stream_name = "Voice Downlink Capture",
2872 .cpu_dai_name = "msm-dai-q6-dev.32771",
2873 .platform_name = "msm-pcm-routing",
2874 .codec_name = "msm-stub-codec.1",
2875 .codec_dai_name = "msm-stub-tx",
2876 .no_pcm = 1,
2877 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302878 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302879 .be_hw_params_fixup = msm_be_hw_params_fixup,
2880 .ignore_suspend = 1,
2881 },
2882 /* Incall Music BACK END DAI Link */
2883 {
2884 .name = LPASS_BE_VOICE_PLAYBACK_TX,
2885 .stream_name = "Voice Farend Playback",
2886 .cpu_dai_name = "msm-dai-q6-dev.32773",
2887 .platform_name = "msm-pcm-routing",
2888 .codec_name = "msm-stub-codec.1",
2889 .codec_dai_name = "msm-stub-rx",
2890 .no_pcm = 1,
2891 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302892 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302893 .be_hw_params_fixup = msm_be_hw_params_fixup,
2894 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302895 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302896 },
2897 /* Incall Music 2 BACK END DAI Link */
2898 {
2899 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
2900 .stream_name = "Voice2 Farend Playback",
2901 .cpu_dai_name = "msm-dai-q6-dev.32770",
2902 .platform_name = "msm-pcm-routing",
2903 .codec_name = "msm-stub-codec.1",
2904 .codec_dai_name = "msm-stub-rx",
2905 .no_pcm = 1,
2906 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302907 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302908 .be_hw_params_fixup = msm_be_hw_params_fixup,
2909 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302910 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302911 },
2912 {
2913 .name = LPASS_BE_USB_AUDIO_RX,
2914 .stream_name = "USB Audio Playback",
2915 .cpu_dai_name = "msm-dai-q6-dev.28672",
2916 .platform_name = "msm-pcm-routing",
2917 .codec_name = "msm-stub-codec.1",
2918 .codec_dai_name = "msm-stub-rx",
2919 .no_pcm = 1,
2920 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302921 .id = MSM_BACKEND_DAI_USB_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302922 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2923 .ignore_pmdown_time = 1,
2924 .ignore_suspend = 1,
2925 },
2926 {
2927 .name = LPASS_BE_USB_AUDIO_TX,
2928 .stream_name = "USB Audio Capture",
2929 .cpu_dai_name = "msm-dai-q6-dev.28673",
2930 .platform_name = "msm-pcm-routing",
2931 .codec_name = "msm-stub-codec.1",
2932 .codec_dai_name = "msm-stub-tx",
2933 .no_pcm = 1,
2934 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302935 .id = MSM_BACKEND_DAI_USB_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302936 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2937 .ignore_suspend = 1,
2938 },
2939 {
2940 .name = LPASS_BE_PRI_TDM_RX_0,
2941 .stream_name = "Primary TDM0 Playback",
2942 .cpu_dai_name = "msm-dai-q6-tdm.36864",
2943 .platform_name = "msm-pcm-routing",
2944 .codec_name = "msm-stub-codec.1",
2945 .codec_dai_name = "msm-stub-rx",
2946 .no_pcm = 1,
2947 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302948 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302949 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2950 .ops = &msm_tdm_be_ops,
2951 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302952 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302953 },
2954 {
2955 .name = LPASS_BE_PRI_TDM_TX_0,
2956 .stream_name = "Primary TDM0 Capture",
2957 .cpu_dai_name = "msm-dai-q6-tdm.36865",
2958 .platform_name = "msm-pcm-routing",
2959 .codec_name = "msm-stub-codec.1",
2960 .codec_dai_name = "msm-stub-tx",
2961 .no_pcm = 1,
2962 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302963 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302964 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2965 .ops = &msm_tdm_be_ops,
2966 .ignore_suspend = 1,
2967 },
2968 {
2969 .name = LPASS_BE_SEC_TDM_RX_0,
2970 .stream_name = "Secondary TDM0 Playback",
2971 .cpu_dai_name = "msm-dai-q6-tdm.36880",
2972 .platform_name = "msm-pcm-routing",
2973 .codec_name = "msm-stub-codec.1",
2974 .codec_dai_name = "msm-stub-rx",
2975 .no_pcm = 1,
2976 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302977 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302978 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2979 .ops = &msm_tdm_be_ops,
2980 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302981 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302982 },
2983 {
2984 .name = LPASS_BE_SEC_TDM_TX_0,
2985 .stream_name = "Secondary TDM0 Capture",
2986 .cpu_dai_name = "msm-dai-q6-tdm.36881",
2987 .platform_name = "msm-pcm-routing",
2988 .codec_name = "msm-stub-codec.1",
2989 .codec_dai_name = "msm-stub-tx",
2990 .no_pcm = 1,
2991 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302992 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302993 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2994 .ops = &msm_tdm_be_ops,
2995 .ignore_suspend = 1,
2996 },
2997 {
2998 .name = LPASS_BE_TERT_TDM_RX_0,
2999 .stream_name = "Tertiary TDM0 Playback",
3000 .cpu_dai_name = "msm-dai-q6-tdm.36896",
3001 .platform_name = "msm-pcm-routing",
3002 .codec_name = "msm-stub-codec.1",
3003 .codec_dai_name = "msm-stub-rx",
3004 .no_pcm = 1,
3005 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303006 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303007 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3008 .ops = &msm_tdm_be_ops,
3009 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05303010 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303011 },
3012 {
3013 .name = LPASS_BE_TERT_TDM_TX_0,
3014 .stream_name = "Tertiary TDM0 Capture",
3015 .cpu_dai_name = "msm-dai-q6-tdm.36897",
3016 .platform_name = "msm-pcm-routing",
3017 .codec_name = "msm-stub-codec.1",
3018 .codec_dai_name = "msm-stub-tx",
3019 .no_pcm = 1,
3020 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303021 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303022 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3023 .ops = &msm_tdm_be_ops,
3024 .ignore_suspend = 1,
3025 },
3026 {
3027 .name = LPASS_BE_QUAT_TDM_RX_0,
3028 .stream_name = "Quaternary TDM0 Playback",
3029 .cpu_dai_name = "msm-dai-q6-tdm.36912",
3030 .platform_name = "msm-pcm-routing",
3031 .codec_name = "msm-stub-codec.1",
3032 .codec_dai_name = "msm-stub-rx",
3033 .no_pcm = 1,
3034 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303035 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303036 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3037 .ops = &msm_tdm_be_ops,
3038 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05303039 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303040 },
3041 {
3042 .name = LPASS_BE_QUAT_TDM_TX_0,
3043 .stream_name = "Quaternary TDM0 Capture",
3044 .cpu_dai_name = "msm-dai-q6-tdm.36913",
3045 .platform_name = "msm-pcm-routing",
3046 .codec_name = "msm-stub-codec.1",
3047 .codec_dai_name = "msm-stub-tx",
3048 .no_pcm = 1,
3049 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303050 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303051 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3052 .ops = &msm_tdm_be_ops,
3053 .ignore_suspend = 1,
3054 },
Rohit Kumard1754482017-09-10 22:57:39 +05303055 {
3056 .name = LPASS_BE_QUIN_TDM_RX_0,
3057 .stream_name = "Quinary TDM0 Playback",
Rohit kumar091ff792017-10-11 18:35:07 +05303058 .cpu_dai_name = "msm-dai-q6-tdm.36928",
Rohit Kumard1754482017-09-10 22:57:39 +05303059 .platform_name = "msm-pcm-routing",
3060 .codec_name = "msm-stub-codec.1",
3061 .codec_dai_name = "msm-stub-rx",
3062 .no_pcm = 1,
3063 .dpcm_playback = 1,
3064 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
3065 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3066 .ops = &msm_tdm_be_ops,
3067 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05303068 .ignore_pmdown_time = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05303069 },
3070 {
3071 .name = LPASS_BE_QUIN_TDM_TX_0,
3072 .stream_name = "Quinary TDM0 Capture",
Rohit kumar091ff792017-10-11 18:35:07 +05303073 .cpu_dai_name = "msm-dai-q6-tdm.36929",
Rohit Kumard1754482017-09-10 22:57:39 +05303074 .platform_name = "msm-pcm-routing",
3075 .codec_name = "msm-stub-codec.1",
3076 .codec_dai_name = "msm-stub-tx",
3077 .no_pcm = 1,
3078 .dpcm_capture = 1,
3079 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
3080 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3081 .ops = &msm_tdm_be_ops,
3082 .ignore_suspend = 1,
3083 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303084};
3085
3086static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
3087 {
3088 .name = LPASS_BE_PRI_MI2S_RX,
3089 .stream_name = "Primary MI2S Playback",
3090 .cpu_dai_name = "msm-dai-q6-mi2s.0",
3091 .platform_name = "msm-pcm-routing",
3092 .codec_name = "msm-stub-codec.1",
3093 .codec_dai_name = "msm-stub-rx",
3094 .no_pcm = 1,
3095 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303096 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303097 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3098 .ops = &msm_mi2s_be_ops,
3099 .ignore_suspend = 1,
3100 .ignore_pmdown_time = 1,
3101 },
3102 {
3103 .name = LPASS_BE_PRI_MI2S_TX,
3104 .stream_name = "Primary MI2S Capture",
3105 .cpu_dai_name = "msm-dai-q6-mi2s.0",
3106 .platform_name = "msm-pcm-routing",
3107 .codec_name = "msm-stub-codec.1",
3108 .codec_dai_name = "msm-stub-tx",
3109 .no_pcm = 1,
3110 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303111 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303112 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3113 .ops = &msm_mi2s_be_ops,
3114 .ignore_suspend = 1,
3115 },
3116 {
3117 .name = LPASS_BE_SEC_MI2S_RX,
3118 .stream_name = "Secondary MI2S Playback",
3119 .cpu_dai_name = "msm-dai-q6-mi2s.1",
3120 .platform_name = "msm-pcm-routing",
3121 .codec_name = "msm-stub-codec.1",
3122 .codec_dai_name = "msm-stub-rx",
3123 .no_pcm = 1,
3124 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303125 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303126 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3127 .ops = &msm_mi2s_be_ops,
3128 .ignore_suspend = 1,
3129 .ignore_pmdown_time = 1,
3130 },
3131 {
3132 .name = LPASS_BE_SEC_MI2S_TX,
3133 .stream_name = "Secondary MI2S Capture",
3134 .cpu_dai_name = "msm-dai-q6-mi2s.1",
3135 .platform_name = "msm-pcm-routing",
3136 .codec_name = "msm-stub-codec.1",
3137 .codec_dai_name = "msm-stub-tx",
3138 .no_pcm = 1,
3139 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303140 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303141 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3142 .ops = &msm_mi2s_be_ops,
3143 .ignore_suspend = 1,
3144 },
3145 {
3146 .name = LPASS_BE_TERT_MI2S_RX,
3147 .stream_name = "Tertiary MI2S Playback",
3148 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3149 .platform_name = "msm-pcm-routing",
3150 .codec_name = "msm-stub-codec.1",
3151 .codec_dai_name = "msm-stub-rx",
3152 .no_pcm = 1,
3153 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303154 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303155 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3156 .ops = &msm_mi2s_be_ops,
3157 .ignore_suspend = 1,
3158 .ignore_pmdown_time = 1,
3159 },
3160 {
3161 .name = LPASS_BE_TERT_MI2S_TX,
3162 .stream_name = "Tertiary MI2S Capture",
3163 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3164 .platform_name = "msm-pcm-routing",
3165 .codec_name = "msm-stub-codec.1",
3166 .codec_dai_name = "msm-stub-tx",
3167 .no_pcm = 1,
3168 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303169 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303170 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3171 .ops = &msm_mi2s_be_ops,
3172 .ignore_suspend = 1,
3173 },
3174 {
3175 .name = LPASS_BE_QUAT_MI2S_RX,
3176 .stream_name = "Quaternary MI2S Playback",
3177 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3178 .platform_name = "msm-pcm-routing",
3179 .codec_name = "msm-stub-codec.1",
3180 .codec_dai_name = "msm-stub-rx",
3181 .no_pcm = 1,
3182 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303183 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303184 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3185 .ops = &msm_mi2s_be_ops,
3186 .ignore_suspend = 1,
3187 .ignore_pmdown_time = 1,
3188 },
3189 {
3190 .name = LPASS_BE_QUAT_MI2S_TX,
3191 .stream_name = "Quaternary MI2S Capture",
3192 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3193 .platform_name = "msm-pcm-routing",
3194 .codec_name = "msm-stub-codec.1",
3195 .codec_dai_name = "msm-stub-tx",
3196 .no_pcm = 1,
3197 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303198 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303199 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3200 .ops = &msm_mi2s_be_ops,
3201 .ignore_suspend = 1,
3202 },
Rohit Kumard1754482017-09-10 22:57:39 +05303203 {
3204 .name = LPASS_BE_QUIN_MI2S_RX,
3205 .stream_name = "Quinary MI2S Playback",
Rohit kumar20df5452017-10-16 15:35:56 +05303206 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303207 .platform_name = "msm-pcm-routing",
3208 .codec_name = "msm-stub-codec.1",
3209 .codec_dai_name = "msm-stub-rx",
3210 .no_pcm = 1,
3211 .dpcm_playback = 1,
3212 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
3213 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3214 .ops = &msm_mi2s_be_ops,
3215 .ignore_suspend = 1,
3216 .ignore_pmdown_time = 1,
3217 },
3218 {
3219 .name = LPASS_BE_QUIN_MI2S_TX,
3220 .stream_name = "Quinary MI2S Capture",
Rohit kumar20df5452017-10-16 15:35:56 +05303221 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303222 .platform_name = "msm-pcm-routing",
3223 .codec_name = "msm-stub-codec.1",
3224 .codec_dai_name = "msm-stub-tx",
3225 .no_pcm = 1,
3226 .dpcm_capture = 1,
3227 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
3228 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3229 .ops = &msm_mi2s_be_ops,
3230 .ignore_suspend = 1,
3231 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303232};
3233
3234static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
3235 /* Primary AUX PCM Backend DAI Links */
3236 {
3237 .name = LPASS_BE_AUXPCM_RX,
3238 .stream_name = "AUX PCM Playback",
3239 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3240 .platform_name = "msm-pcm-routing",
3241 .codec_name = "msm-stub-codec.1",
3242 .codec_dai_name = "msm-stub-rx",
3243 .no_pcm = 1,
3244 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303245 .id = MSM_BACKEND_DAI_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303246 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3247 .ignore_pmdown_time = 1,
3248 .ignore_suspend = 1,
3249 .ops = &msm_aux_pcm_be_ops,
3250 },
3251 {
3252 .name = LPASS_BE_AUXPCM_TX,
3253 .stream_name = "AUX PCM Capture",
3254 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3255 .platform_name = "msm-pcm-routing",
3256 .codec_name = "msm-stub-codec.1",
3257 .codec_dai_name = "msm-stub-tx",
3258 .no_pcm = 1,
3259 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303260 .id = MSM_BACKEND_DAI_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303261 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303262 .ignore_suspend = 1,
3263 .ops = &msm_aux_pcm_be_ops,
3264 },
3265 /* Secondary AUX PCM Backend DAI Links */
3266 {
3267 .name = LPASS_BE_SEC_AUXPCM_RX,
3268 .stream_name = "Sec AUX PCM Playback",
3269 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3270 .platform_name = "msm-pcm-routing",
3271 .codec_name = "msm-stub-codec.1",
3272 .codec_dai_name = "msm-stub-rx",
3273 .no_pcm = 1,
3274 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303275 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303276 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3277 .ignore_pmdown_time = 1,
3278 .ignore_suspend = 1,
3279 .ops = &msm_aux_pcm_be_ops,
3280 },
3281 {
3282 .name = LPASS_BE_SEC_AUXPCM_TX,
3283 .stream_name = "Sec AUX PCM Capture",
3284 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3285 .platform_name = "msm-pcm-routing",
3286 .codec_name = "msm-stub-codec.1",
3287 .codec_dai_name = "msm-stub-tx",
3288 .no_pcm = 1,
3289 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303290 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303291 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3292 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303293 .ops = &msm_aux_pcm_be_ops,
3294 },
3295 /* Tertiary AUX PCM Backend DAI Links */
3296 {
3297 .name = LPASS_BE_TERT_AUXPCM_RX,
3298 .stream_name = "Tert AUX PCM Playback",
3299 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3300 .platform_name = "msm-pcm-routing",
3301 .codec_name = "msm-stub-codec.1",
3302 .codec_dai_name = "msm-stub-rx",
3303 .no_pcm = 1,
3304 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303305 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303306 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3307 .ignore_pmdown_time = 1,
3308 .ignore_suspend = 1,
3309 .ops = &msm_aux_pcm_be_ops,
3310 },
3311 {
3312 .name = LPASS_BE_TERT_AUXPCM_TX,
3313 .stream_name = "Tert AUX PCM Capture",
3314 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3315 .platform_name = "msm-pcm-routing",
3316 .codec_name = "msm-stub-codec.1",
3317 .codec_dai_name = "msm-stub-tx",
3318 .no_pcm = 1,
3319 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303320 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303321 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3322 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303323 .ops = &msm_aux_pcm_be_ops,
3324 },
3325 /* Quaternary AUX PCM Backend DAI Links */
3326 {
3327 .name = LPASS_BE_QUAT_AUXPCM_RX,
3328 .stream_name = "Quat AUX PCM Playback",
3329 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3330 .platform_name = "msm-pcm-routing",
3331 .codec_name = "msm-stub-codec.1",
3332 .codec_dai_name = "msm-stub-rx",
3333 .no_pcm = 1,
3334 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303335 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303336 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3337 .ignore_pmdown_time = 1,
3338 .ignore_suspend = 1,
3339 .ops = &msm_aux_pcm_be_ops,
3340 },
3341 {
3342 .name = LPASS_BE_QUAT_AUXPCM_TX,
3343 .stream_name = "Quat AUX PCM Capture",
3344 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3345 .platform_name = "msm-pcm-routing",
3346 .codec_name = "msm-stub-codec.1",
3347 .codec_dai_name = "msm-stub-tx",
3348 .no_pcm = 1,
3349 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303350 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303351 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3352 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303353 .ops = &msm_aux_pcm_be_ops,
3354 },
Rohit Kumard1754482017-09-10 22:57:39 +05303355 /* Quinary AUX PCM Backend DAI Links */
3356 {
3357 .name = LPASS_BE_QUIN_AUXPCM_RX,
3358 .stream_name = "Quin AUX PCM Playback",
3359 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3360 .platform_name = "msm-pcm-routing",
3361 .codec_name = "msm-stub-codec.1",
3362 .codec_dai_name = "msm-stub-rx",
3363 .no_pcm = 1,
3364 .dpcm_playback = 1,
3365 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
3366 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3367 .ignore_pmdown_time = 1,
3368 .ignore_suspend = 1,
3369 .ops = &msm_aux_pcm_be_ops,
3370 },
3371 {
3372 .name = LPASS_BE_QUIN_AUXPCM_TX,
3373 .stream_name = "Quin AUX PCM Capture",
3374 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3375 .platform_name = "msm-pcm-routing",
3376 .codec_name = "msm-stub-codec.1",
3377 .codec_dai_name = "msm-stub-tx",
3378 .no_pcm = 1,
3379 .dpcm_capture = 1,
3380 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
3381 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3382 .ignore_suspend = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05303383 .ops = &msm_aux_pcm_be_ops,
3384 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303385};
3386
3387
3388static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
3389 {
3390 .name = LPASS_BE_SLIMBUS_7_RX,
3391 .stream_name = "Slimbus7 Playback",
3392 .cpu_dai_name = "msm-dai-q6-dev.16398",
3393 .platform_name = "msm-pcm-routing",
3394 .codec_name = "btfmslim_slave",
3395 /* BT codec driver determines capabilities based on
3396 * dai name, bt codecdai name should always contains
3397 * supported usecase information
3398 */
3399 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
3400 .no_pcm = 1,
3401 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303402 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303403 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3404 .ops = &msm_wcn_ops,
3405 /* dai link has playback support */
3406 .ignore_pmdown_time = 1,
3407 .ignore_suspend = 1,
3408 },
3409 {
3410 .name = LPASS_BE_SLIMBUS_7_TX,
3411 .stream_name = "Slimbus7 Capture",
3412 .cpu_dai_name = "msm-dai-q6-dev.16399",
3413 .platform_name = "msm-pcm-routing",
3414 .codec_name = "btfmslim_slave",
3415 .codec_dai_name = "btfm_bt_sco_slim_tx",
3416 .no_pcm = 1,
3417 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303418 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303419 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3420 .ops = &msm_wcn_ops,
3421 .ignore_suspend = 1,
3422 },
3423 {
3424 .name = LPASS_BE_SLIMBUS_8_TX,
3425 .stream_name = "Slimbus8 Capture",
3426 .cpu_dai_name = "msm-dai-q6-dev.16401",
3427 .platform_name = "msm-pcm-routing",
3428 .codec_name = "btfmslim_slave",
3429 .codec_dai_name = "btfm_fm_slim_tx",
3430 .no_pcm = 1,
3431 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303432 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303433 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3434 .init = &msm_wcn_init,
3435 .ops = &msm_wcn_ops,
3436 .ignore_suspend = 1,
3437 },
3438};
3439
3440static struct snd_soc_dai_link msm_wsa_be_dai_links[] = {
3441 {
3442 .name = LPASS_BE_INT4_MI2S_RX,
3443 .stream_name = "INT4 MI2S Playback",
3444 .cpu_dai_name = "msm-dai-q6-mi2s.11",
3445 .platform_name = "msm-pcm-routing",
3446 .codec_name = "msm_sdw_codec",
3447 .codec_dai_name = "msm_sdw_i2s_rx1",
3448 .no_pcm = 1,
3449 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303450 .id = MSM_BACKEND_DAI_INT4_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303451 .init = &msm_sdw_audrx_init,
3452 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
3453 .ops = &msm_sdw_mi2s_be_ops,
3454 .ignore_suspend = 1,
3455 },
3456};
3457
3458static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
3459 /* DISP PORT BACK END DAI Link */
3460 {
3461 .name = LPASS_BE_DISPLAY_PORT,
3462 .stream_name = "Display Port Playback",
3463 .cpu_dai_name = "msm-dai-q6-dp.24608",
3464 .platform_name = "msm-pcm-routing",
3465 .codec_name = "msm-ext-disp-audio-codec-rx",
3466 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
3467 .no_pcm = 1,
3468 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303469 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303470 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3471 .ignore_pmdown_time = 1,
3472 .ignore_suspend = 1,
3473 },
3474};
3475
3476static struct snd_soc_dai_link msm_int_dai_links[
3477ARRAY_SIZE(msm_int_dai) +
3478ARRAY_SIZE(msm_int_wsa_dai) +
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303479ARRAY_SIZE(msm_int_compress_capture_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303480ARRAY_SIZE(msm_int_be_dai) +
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303481ARRAY_SIZE(msm_int_dig_be_dai) +
3482ARRAY_SIZE(msm_int_common_be_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303483ARRAY_SIZE(msm_mi2s_be_dai_links) +
3484ARRAY_SIZE(msm_auxpcm_be_dai_links)+
3485ARRAY_SIZE(msm_wcn_be_dai_links) +
3486ARRAY_SIZE(msm_wsa_be_dai_links) +
3487ARRAY_SIZE(ext_disp_be_dai_link)];
3488
3489static struct snd_soc_card sdm660_card = {
3490 /* snd_soc_card_sdm660 */
3491 .name = "sdm660-snd-card",
3492 .dai_link = msm_int_dai,
3493 .num_links = ARRAY_SIZE(msm_int_dai),
3494 .late_probe = msm_snd_card_late_probe,
3495};
3496
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303497static struct snd_soc_card qcs605_dig_card = {
3498 /* snd_soc_card_qcs605 */
3499 .name = "qcs605-dig-snd-card",
3500 .dai_link = msm_int_dai,
3501 .num_links = ARRAY_SIZE(msm_int_dai),
3502};
3503
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303504static void msm_disable_int_mclk0(struct work_struct *work)
3505{
3506 struct msm_asoc_mach_data *pdata = NULL;
3507 struct delayed_work *dwork;
3508 int ret = 0;
3509
3510 dwork = to_delayed_work(work);
3511 pdata = container_of(dwork, struct msm_asoc_mach_data,
3512 disable_int_mclk0_work);
3513 mutex_lock(&pdata->cdc_int_mclk0_mutex);
3514 pr_debug("%s: mclk_enabled %d mclk_rsc_ref %d\n", __func__,
3515 atomic_read(&pdata->int_mclk0_enabled),
3516 atomic_read(&pdata->int_mclk0_rsc_ref));
3517
3518 if (atomic_read(&pdata->int_mclk0_enabled) == true
3519 && atomic_read(&pdata->int_mclk0_rsc_ref) == 0) {
3520 pr_debug("Disable the mclk\n");
3521 pdata->digital_cdc_core_clk.enable = 0;
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05303522 pdata->digital_cdc_core_clk.clk_freq_in_hz =
3523 DEFAULT_MCLK_RATE;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303524 ret = afe_set_lpass_clock_v2(
3525 AFE_PORT_ID_INT0_MI2S_RX,
3526 &pdata->digital_cdc_core_clk);
3527 if (ret < 0)
3528 pr_err("%s failed to disable the CCLK\n", __func__);
3529 atomic_set(&pdata->int_mclk0_enabled, false);
3530 }
3531 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
3532}
3533
3534static void msm_int_dt_parse_cap_info(struct platform_device *pdev,
3535 struct msm_asoc_mach_data *pdata)
3536{
3537 const char *ext1_cap = "qcom,msm-micbias1-ext-cap";
3538 const char *ext2_cap = "qcom,msm-micbias2-ext-cap";
3539
3540 pdata->micbias1_cap_mode =
3541 (of_property_read_bool(pdev->dev.of_node, ext1_cap) ?
3542 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3543
3544 pdata->micbias2_cap_mode =
3545 (of_property_read_bool(pdev->dev.of_node, ext2_cap) ?
3546 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3547}
3548
3549static struct snd_soc_card *msm_int_populate_sndcard_dailinks(
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303550 struct device *dev, int snd_card_val)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303551{
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303552 struct snd_soc_card *card;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303553 struct snd_soc_dai_link *dailink;
3554 int len1;
3555
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303556 if (snd_card_val == INT_SND_CARD)
3557 card = &sdm660_card;
3558 else
3559 card = &qcs605_dig_card;
3560
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303561 card->name = dev_name(dev);
3562 len1 = ARRAY_SIZE(msm_int_dai);
3563 memcpy(msm_int_dai_links, msm_int_dai, sizeof(msm_int_dai));
3564 dailink = msm_int_dai_links;
3565 if (!of_property_read_bool(dev->of_node,
3566 "qcom,wsa-disable")) {
3567 memcpy(dailink + len1,
3568 msm_int_wsa_dai,
3569 sizeof(msm_int_wsa_dai));
3570 len1 += ARRAY_SIZE(msm_int_wsa_dai);
3571 }
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303572 memcpy(dailink + len1, msm_int_compress_capture_dai,
3573 sizeof(msm_int_compress_capture_dai));
3574 len1 += ARRAY_SIZE(msm_int_compress_capture_dai);
3575
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303576 if (snd_card_val == INT_SND_CARD) {
3577 memcpy(dailink + len1, msm_int_be_dai, sizeof(msm_int_be_dai));
3578 len1 += ARRAY_SIZE(msm_int_be_dai);
3579 } else {
3580 memcpy(dailink + len1, msm_int_dig_be_dai,
3581 sizeof(msm_int_dig_be_dai));
3582 len1 += ARRAY_SIZE(msm_int_dig_be_dai);
3583 }
3584
3585 memcpy(dailink + len1, msm_int_common_be_dai,
3586 sizeof(msm_int_common_be_dai));
3587 len1 += ARRAY_SIZE(msm_int_common_be_dai);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303588
3589 if (of_property_read_bool(dev->of_node,
3590 "qcom,mi2s-audio-intf")) {
3591 memcpy(dailink + len1,
3592 msm_mi2s_be_dai_links,
3593 sizeof(msm_mi2s_be_dai_links));
3594 len1 += ARRAY_SIZE(msm_mi2s_be_dai_links);
3595 }
3596 if (of_property_read_bool(dev->of_node,
3597 "qcom,auxpcm-audio-intf")) {
3598 memcpy(dailink + len1,
3599 msm_auxpcm_be_dai_links,
3600 sizeof(msm_auxpcm_be_dai_links));
3601 len1 += ARRAY_SIZE(msm_auxpcm_be_dai_links);
3602 }
3603 if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
3604 dev_dbg(dev, "%s(): WCN BTFM support present\n",
3605 __func__);
3606 memcpy(dailink + len1,
3607 msm_wcn_be_dai_links,
3608 sizeof(msm_wcn_be_dai_links));
3609 len1 += ARRAY_SIZE(msm_wcn_be_dai_links);
3610 }
3611 if (!of_property_read_bool(dev->of_node, "qcom,wsa-disable")) {
3612 memcpy(dailink + len1,
3613 msm_wsa_be_dai_links,
3614 sizeof(msm_wsa_be_dai_links));
3615 len1 += ARRAY_SIZE(msm_wsa_be_dai_links);
3616 }
3617 if (of_property_read_bool(dev->of_node, "qcom,ext-disp-audio-rx")) {
3618 dev_dbg(dev, "%s(): ext disp audio support present\n",
3619 __func__);
3620 memcpy(dailink + len1,
3621 ext_disp_be_dai_link,
3622 sizeof(ext_disp_be_dai_link));
3623 len1 += ARRAY_SIZE(ext_disp_be_dai_link);
3624 }
3625 card->dai_link = dailink;
3626 card->num_links = len1;
3627 return card;
3628}
3629
3630static int msm_internal_init(struct platform_device *pdev,
3631 struct msm_asoc_mach_data *pdata,
3632 struct snd_soc_card *card)
3633{
3634 const char *type = NULL;
3635 const char *hs_micbias_type = "qcom,msm-hs-micbias-type";
3636 int ret;
3637
3638 ret = is_ext_spk_gpio_support(pdev, pdata);
3639 if (ret < 0)
3640 dev_dbg(&pdev->dev,
3641 "%s: doesn't support external speaker pa\n",
3642 __func__);
3643
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303644 if (pdata->snd_card_val != INT_DIG_SND_CARD) {
3645 ret = of_property_read_string(pdev->dev.of_node,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303646 hs_micbias_type, &type);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303647 if (ret) {
3648 dev_err(&pdev->dev, "%s: missing %s in dt node\n",
3649 __func__, hs_micbias_type);
3650 goto err;
3651 }
3652
3653 if (!strcmp(type, "external")) {
3654 dev_dbg(&pdev->dev, "Headset is using external micbias\n");
3655 mbhc_cfg_ptr->hs_ext_micbias = true;
3656 } else {
3657 dev_dbg(&pdev->dev, "Headset is using internal micbias\n");
3658 mbhc_cfg_ptr->hs_ext_micbias = false;
3659 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303660 }
3661
3662 /* initialize the int_mclk0 */
3663 pdata->digital_cdc_core_clk.clk_set_minor_version =
3664 AFE_API_VERSION_I2S_CONFIG;
3665 pdata->digital_cdc_core_clk.clk_id =
3666 Q6AFE_LPASS_CLK_ID_INT_MCLK_0;
3667 pdata->digital_cdc_core_clk.clk_freq_in_hz = pdata->mclk_freq;
3668 pdata->digital_cdc_core_clk.clk_attri =
3669 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO;
3670 pdata->digital_cdc_core_clk.clk_root =
3671 Q6AFE_LPASS_CLK_ROOT_DEFAULT;
3672 pdata->digital_cdc_core_clk.enable = 1;
3673
3674 /* Initialize loopback mode to false */
3675 pdata->lb_mode = false;
3676
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303677 if (pdata->snd_card_val != INT_DIG_SND_CARD)
3678 msm_int_dt_parse_cap_info(pdev, pdata);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303679
3680 card->dev = &pdev->dev;
3681 platform_set_drvdata(pdev, card);
3682 snd_soc_card_set_drvdata(card, pdata);
3683 ret = snd_soc_of_parse_card_name(card, "qcom,model");
3684 if (ret)
3685 goto err;
3686 /* initialize timer */
3687 INIT_DELAYED_WORK(&pdata->disable_int_mclk0_work,
3688 msm_disable_int_mclk0);
3689 mutex_init(&pdata->cdc_int_mclk0_mutex);
3690 atomic_set(&pdata->int_mclk0_rsc_ref, 0);
3691 atomic_set(&pdata->int_mclk0_enabled, false);
3692
3693 dev_info(&pdev->dev, "%s: default codec configured\n", __func__);
3694
3695 return 0;
3696err:
3697 return ret;
3698}
3699
3700/**
3701 * msm_int_cdc_init - internal codec machine specific init.
3702 *
3703 * @pdev: platform device handle
3704 * @pdata: private data of machine driver
3705 * @card: sound card pointer reference
3706 * @mbhc_cfg: MBHC config reference
3707 *
3708 * Returns 0.
3709 */
3710int msm_int_cdc_init(struct platform_device *pdev,
3711 struct msm_asoc_mach_data *pdata,
3712 struct snd_soc_card **card,
3713 struct wcd_mbhc_config *mbhc_cfg)
3714{
3715 mbhc_cfg_ptr = mbhc_cfg;
3716
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303717 *card = msm_int_populate_sndcard_dailinks(&pdev->dev,
3718 pdata->snd_card_val);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303719 msm_internal_init(pdev, pdata, *card);
3720 return 0;
3721}
3722EXPORT_SYMBOL(msm_int_cdc_init);