blob: b35179a6cda0b02e909ce7d7372deccc08cb810d [file] [log] [blame]
Soumya Managolibbeb8ee2019-03-18 17:05:29 +05301/* Copyright (c) 2015-2019, 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 = {
Soumya Managolibbeb8ee2019-03-18 17:05:29 +05301893 .startup = msm_tdm_snd_startup,
1894 .shutdown = msm_tdm_snd_shutdown,
1895 .hw_params = msm_tdm_snd_hw_params,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301896};
1897
1898static struct snd_soc_ops msm_wcn_ops = {
1899 .hw_params = msm_wcn_hw_params,
1900};
1901
1902static struct snd_soc_ops msm_mi2s_be_ops = {
1903 .startup = msm_mi2s_snd_startup,
1904 .shutdown = msm_mi2s_snd_shutdown,
1905};
1906
1907static struct snd_soc_ops msm_aux_pcm_be_ops = {
1908 .startup = msm_aux_pcm_snd_startup,
1909 .shutdown = msm_aux_pcm_snd_shutdown,
1910};
1911
1912static struct snd_soc_ops msm_int_mi2s_be_ops = {
1913 .startup = msm_int_mi2s_snd_startup,
1914 .shutdown = msm_int_mi2s_snd_shutdown,
1915};
1916
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301917static struct snd_soc_ops msm_int_dig_mi2s_be_ops = {
1918 .startup = msm_int_dig_mi2s_snd_startup,
1919 .shutdown = msm_int_mi2s_snd_shutdown,
1920};
1921
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301922static struct snd_soc_ops msm_sdw_mi2s_be_ops = {
1923 .startup = msm_sdw_mi2s_snd_startup,
1924 .shutdown = msm_sdw_mi2s_snd_shutdown,
1925};
1926
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05301927static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
1928{
1929 cpumask_t mask;
1930
1931 if (pm_qos_request_active(&substream->latency_pm_qos_req))
1932 pm_qos_remove_request(&substream->latency_pm_qos_req);
1933
1934 cpumask_clear(&mask);
1935 cpumask_set_cpu(1, &mask); /* affine to core 1 */
1936 cpumask_set_cpu(2, &mask); /* affine to core 2 */
1937 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
1938
1939 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
1940
1941 pm_qos_add_request(&substream->latency_pm_qos_req,
1942 PM_QOS_CPU_DMA_LATENCY,
1943 MSM_LL_QOS_VALUE);
1944 return 0;
1945}
1946
1947static struct snd_soc_ops msm_fe_qos_ops = {
1948 .prepare = msm_fe_qos_prepare,
1949};
1950
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301951struct snd_soc_dai_link_component dlc_rx1[] = {
1952 {
1953 .of_node = NULL,
1954 .dai_name = "msm_dig_cdc_dai_rx1",
1955 },
1956 {
1957 .of_node = NULL,
1958 .dai_name = "msm_anlg_cdc_i2s_rx1",
1959 },
1960};
1961
1962struct snd_soc_dai_link_component dlc_tx1[] = {
1963 {
1964 .of_node = NULL,
1965 .dai_name = "msm_dig_cdc_dai_tx1",
1966 },
1967 {
1968 .of_node = NULL,
1969 .dai_name = "msm_anlg_cdc_i2s_tx1",
1970 },
1971};
1972
1973struct snd_soc_dai_link_component dlc_tx2[] = {
1974 {
1975 .of_node = NULL,
1976 .dai_name = "msm_dig_cdc_dai_tx2",
1977 },
1978 {
1979 .of_node = NULL,
1980 .dai_name = "msm_anlg_cdc_i2s_tx2",
1981 },
1982};
1983
1984/* Digital audio interface glue - connects codec <---> CPU */
1985static struct snd_soc_dai_link msm_int_dai[] = {
1986 /* FrontEnd DAI Links */
1987 {/* hw:x,0 */
1988 .name = MSM_DAILINK_NAME(Media1),
1989 .stream_name = "MultiMedia1",
1990 .cpu_dai_name = "MultiMedia1",
1991 .platform_name = "msm-pcm-dsp.0",
1992 .dynamic = 1,
1993 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1994 SND_SOC_DPCM_TRIGGER_POST},
1995 .codec_dai_name = "snd-soc-dummy-dai",
1996 .codec_name = "snd-soc-dummy",
1997 .ignore_suspend = 1,
1998 .dpcm_playback = 1,
1999 .dpcm_capture = 1,
2000 /* this dai link has playback support */
2001 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302002 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302003 },
2004 {/* hw:x,1 */
2005 .name = MSM_DAILINK_NAME(Media2),
2006 .stream_name = "MultiMedia2",
2007 .cpu_dai_name = "MultiMedia2",
2008 .platform_name = "msm-pcm-dsp.0",
2009 .dynamic = 1,
2010 .dpcm_playback = 1,
2011 .dpcm_capture = 1,
2012 .codec_dai_name = "snd-soc-dummy-dai",
2013 .codec_name = "snd-soc-dummy",
2014 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2015 SND_SOC_DPCM_TRIGGER_POST},
2016 .ignore_suspend = 1,
2017 /* this dai link has playback support */
2018 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302019 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302020 },
2021 {/* hw:x,2 */
2022 .name = "VoiceMMode1",
2023 .stream_name = "VoiceMMode1",
2024 .cpu_dai_name = "VoiceMMode1",
2025 .platform_name = "msm-pcm-voice",
2026 .dynamic = 1,
2027 .dpcm_capture = 1,
2028 .dpcm_playback = 1,
2029 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2030 SND_SOC_DPCM_TRIGGER_POST},
2031 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2032 .ignore_suspend = 1,
2033 .ignore_pmdown_time = 1,
2034 .codec_dai_name = "snd-soc-dummy-dai",
2035 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302036 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302037 },
2038 {/* hw:x,3 */
2039 .name = "MSM VoIP",
2040 .stream_name = "VoIP",
2041 .cpu_dai_name = "VoIP",
2042 .platform_name = "msm-voip-dsp",
2043 .dynamic = 1,
2044 .dpcm_playback = 1,
2045 .dpcm_capture = 1,
2046 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2047 SND_SOC_DPCM_TRIGGER_POST},
2048 .codec_dai_name = "snd-soc-dummy-dai",
2049 .codec_name = "snd-soc-dummy",
2050 .ignore_suspend = 1,
2051 /* this dai link has playback support */
2052 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302053 .id = MSM_FRONTEND_DAI_VOIP,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302054 },
2055 {/* hw:x,4 */
2056 .name = MSM_DAILINK_NAME(ULL),
2057 .stream_name = "ULL",
2058 .cpu_dai_name = "MultiMedia3",
2059 .platform_name = "msm-pcm-dsp.2",
2060 .dynamic = 1,
2061 .dpcm_playback = 1,
2062 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2063 SND_SOC_DPCM_TRIGGER_POST},
2064 .codec_dai_name = "snd-soc-dummy-dai",
2065 .codec_name = "snd-soc-dummy",
2066 .ignore_suspend = 1,
2067 /* this dai link has playback support */
2068 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302069 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302070 },
2071 /* Hostless PCM purpose */
2072 {/* hw:x,5 */
2073 .name = "INT4 MI2S_RX Hostless",
2074 .stream_name = "INT4 MI2S_RX Hostless",
2075 .cpu_dai_name = "INT4_MI2S_RX_HOSTLESS",
2076 .platform_name = "msm-pcm-hostless",
2077 .dynamic = 1,
2078 .dpcm_playback = 1,
2079 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2080 SND_SOC_DPCM_TRIGGER_POST},
2081 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2082 .ignore_suspend = 1,
2083 /* this dailink has playback support */
2084 .ignore_pmdown_time = 1,
2085 /* This dainlink has MI2S support */
2086 .codec_dai_name = "snd-soc-dummy-dai",
2087 .codec_name = "snd-soc-dummy",
2088 },
2089 {/* hw:x,6 */
2090 .name = "MSM AFE-PCM RX",
2091 .stream_name = "AFE-PROXY RX",
2092 .cpu_dai_name = "msm-dai-q6-dev.241",
2093 .codec_name = "msm-stub-codec.1",
2094 .codec_dai_name = "msm-stub-rx",
2095 .platform_name = "msm-pcm-afe",
2096 .ignore_suspend = 1,
2097 /* this dai link has playback support */
2098 .ignore_pmdown_time = 1,
2099 },
2100 {/* hw:x,7 */
2101 .name = "MSM AFE-PCM TX",
2102 .stream_name = "AFE-PROXY TX",
2103 .cpu_dai_name = "msm-dai-q6-dev.240",
2104 .codec_name = "msm-stub-codec.1",
2105 .codec_dai_name = "msm-stub-tx",
2106 .platform_name = "msm-pcm-afe",
2107 .ignore_suspend = 1,
2108 },
2109 {/* hw:x,8 */
2110 .name = MSM_DAILINK_NAME(Compress1),
2111 .stream_name = "Compress1",
2112 .cpu_dai_name = "MultiMedia4",
2113 .platform_name = "msm-compress-dsp",
2114 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
2115 .dynamic = 1,
2116 .dpcm_capture = 1,
2117 .dpcm_playback = 1,
2118 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2119 SND_SOC_DPCM_TRIGGER_POST},
2120 .codec_dai_name = "snd-soc-dummy-dai",
2121 .codec_name = "snd-soc-dummy",
2122 .ignore_suspend = 1,
2123 .ignore_pmdown_time = 1,
2124 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302125 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302126 },
2127 {/* hw:x,9*/
2128 .name = "AUXPCM Hostless",
2129 .stream_name = "AUXPCM Hostless",
2130 .cpu_dai_name = "AUXPCM_HOSTLESS",
2131 .platform_name = "msm-pcm-hostless",
2132 .dynamic = 1,
2133 .dpcm_capture = 1,
2134 .dpcm_playback = 1,
2135 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2136 SND_SOC_DPCM_TRIGGER_POST},
2137 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2138 .ignore_suspend = 1,
2139 /* this dai link has playback support */
2140 .ignore_pmdown_time = 1,
2141 .codec_dai_name = "snd-soc-dummy-dai",
2142 .codec_name = "snd-soc-dummy",
2143 },
2144 {/* hw:x,10 */
2145 .name = "SLIMBUS_1 Hostless",
2146 .stream_name = "SLIMBUS_1 Hostless",
2147 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
2148 .platform_name = "msm-pcm-hostless",
2149 .dynamic = 1,
2150 .dpcm_capture = 1,
2151 .dpcm_playback = 1,
2152 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2153 SND_SOC_DPCM_TRIGGER_POST},
2154 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2155 .ignore_suspend = 1,
2156 .ignore_pmdown_time = 1, /* dai link has playback support */
2157 .codec_dai_name = "snd-soc-dummy-dai",
2158 .codec_name = "snd-soc-dummy",
2159 },
2160 {/* hw:x,11 */
2161 .name = "INT3 MI2S_TX Hostless",
2162 .stream_name = "INT3 MI2S_TX Hostless",
2163 .cpu_dai_name = "INT3_MI2S_TX_HOSTLESS",
2164 .platform_name = "msm-pcm-hostless",
2165 .dynamic = 1,
2166 .dpcm_capture = 1,
2167 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2168 SND_SOC_DPCM_TRIGGER_POST},
2169 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2170 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302171 .codec_dai_name = "snd-soc-dummy-dai",
2172 .codec_name = "snd-soc-dummy",
2173 },
2174 {/* hw:x,12 */
2175 .name = "SLIMBUS_7 Hostless",
2176 .stream_name = "SLIMBUS_7 Hostless",
2177 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
2178 .platform_name = "msm-pcm-hostless",
2179 .dynamic = 1,
2180 .dpcm_capture = 1,
2181 .dpcm_playback = 1,
2182 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2183 SND_SOC_DPCM_TRIGGER_POST},
2184 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2185 .ignore_suspend = 1,
2186 .ignore_pmdown_time = 1, /* dai link has playback support */
2187 .codec_dai_name = "snd-soc-dummy-dai",
2188 .codec_name = "snd-soc-dummy",
2189 },
2190 {/* hw:x,13 */
2191 .name = MSM_DAILINK_NAME(LowLatency),
2192 .stream_name = "MultiMedia5",
2193 .cpu_dai_name = "MultiMedia5",
2194 .platform_name = "msm-pcm-dsp.1",
2195 .dynamic = 1,
2196 .dpcm_capture = 1,
2197 .dpcm_playback = 1,
2198 .codec_dai_name = "snd-soc-dummy-dai",
2199 .codec_name = "snd-soc-dummy",
2200 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2201 SND_SOC_DPCM_TRIGGER_POST},
2202 .ignore_suspend = 1,
2203 /* this dai link has playback support */
2204 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302205 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302206 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302207 },
2208 /* LSM FE */
2209 {/* hw:x,14 */
2210 .name = "Listen 1 Audio Service",
2211 .stream_name = "Listen 1 Audio Service",
2212 .cpu_dai_name = "LSM1",
2213 .platform_name = "msm-lsm-client",
2214 .dynamic = 1,
2215 .dpcm_capture = 1,
2216 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2217 SND_SOC_DPCM_TRIGGER_POST },
2218 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2219 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302220 .codec_dai_name = "snd-soc-dummy-dai",
2221 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302222 .id = MSM_FRONTEND_DAI_LSM1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302223 },
2224 {/* hw:x,15 */
2225 .name = MSM_DAILINK_NAME(Compress2),
2226 .stream_name = "Compress2",
2227 .cpu_dai_name = "MultiMedia7",
2228 .platform_name = "msm-compress-dsp",
2229 .dynamic = 1,
2230 .dpcm_capture = 1,
2231 .dpcm_playback = 1,
2232 .codec_dai_name = "snd-soc-dummy-dai",
2233 .codec_name = "snd-soc-dummy",
2234 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2235 SND_SOC_DPCM_TRIGGER_POST},
2236 .ignore_suspend = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302237 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302238 },
2239 {/* hw:x,16 */
Laxminath Kasam38070be2017-08-17 18:21:59 +05302240 .name = MSM_DAILINK_NAME(MultiMedia10),
2241 .stream_name = "MultiMedia10",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302242 .cpu_dai_name = "MultiMedia10",
Laxminath Kasam38070be2017-08-17 18:21:59 +05302243 .platform_name = "msm-pcm-dsp.1",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302244 .dynamic = 1,
2245 .dpcm_capture = 1,
2246 .dpcm_playback = 1,
Laxminath Kasam38070be2017-08-17 18:21:59 +05302247 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302248 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2249 SND_SOC_DPCM_TRIGGER_POST},
2250 .codec_dai_name = "snd-soc-dummy-dai",
2251 .codec_name = "snd-soc-dummy",
2252 .ignore_suspend = 1,
2253 .ignore_pmdown_time = 1,
2254 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302255 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302256 },
2257 {/* hw:x,17 */
2258 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
2259 .stream_name = "MM_NOIRQ",
2260 .cpu_dai_name = "MultiMedia8",
2261 .platform_name = "msm-pcm-dsp-noirq",
2262 .dynamic = 1,
2263 .dpcm_capture = 1,
2264 .dpcm_playback = 1,
2265 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2266 SND_SOC_DPCM_TRIGGER_POST},
2267 .codec_dai_name = "snd-soc-dummy-dai",
2268 .codec_name = "snd-soc-dummy",
2269 .ignore_suspend = 1,
2270 .ignore_pmdown_time = 1,
2271 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302272 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302273 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302274 },
2275 {/* hw:x,18 */
2276 .name = "HDMI_RX_HOSTLESS",
2277 .stream_name = "HDMI_RX_HOSTLESS",
2278 .cpu_dai_name = "HDMI_HOSTLESS",
2279 .platform_name = "msm-pcm-hostless",
2280 .dynamic = 1,
2281 .dpcm_playback = 1,
2282 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2283 SND_SOC_DPCM_TRIGGER_POST},
2284 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2285 .ignore_suspend = 1,
2286 .ignore_pmdown_time = 1,
2287 .codec_dai_name = "snd-soc-dummy-dai",
2288 .codec_name = "snd-soc-dummy",
2289 },
2290 {/* hw:x,19 */
2291 .name = "VoiceMMode2",
2292 .stream_name = "VoiceMMode2",
2293 .cpu_dai_name = "VoiceMMode2",
2294 .platform_name = "msm-pcm-voice",
2295 .dynamic = 1,
2296 .dpcm_capture = 1,
2297 .dpcm_playback = 1,
2298 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2299 SND_SOC_DPCM_TRIGGER_POST},
2300 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2301 .ignore_suspend = 1,
2302 .ignore_pmdown_time = 1,
2303 .codec_dai_name = "snd-soc-dummy-dai",
2304 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302305 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302306 },
2307 {/* hw:x,20 */
2308 .name = "Listen 2 Audio Service",
2309 .stream_name = "Listen 2 Audio Service",
2310 .cpu_dai_name = "LSM2",
2311 .platform_name = "msm-lsm-client",
2312 .dynamic = 1,
2313 .dpcm_capture = 1,
2314 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2315 SND_SOC_DPCM_TRIGGER_POST },
2316 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2317 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302318 .codec_dai_name = "snd-soc-dummy-dai",
2319 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302320 .id = MSM_FRONTEND_DAI_LSM2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302321 },
2322 {/* hw:x,21 */
2323 .name = "Listen 3 Audio Service",
2324 .stream_name = "Listen 3 Audio Service",
2325 .cpu_dai_name = "LSM3",
2326 .platform_name = "msm-lsm-client",
2327 .dynamic = 1,
2328 .dpcm_capture = 1,
2329 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2330 SND_SOC_DPCM_TRIGGER_POST },
2331 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2332 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302333 .codec_dai_name = "snd-soc-dummy-dai",
2334 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302335 .id = MSM_FRONTEND_DAI_LSM3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302336 },
2337 {/* hw:x,22 */
2338 .name = "Listen 4 Audio Service",
2339 .stream_name = "Listen 4 Audio Service",
2340 .cpu_dai_name = "LSM4",
2341 .platform_name = "msm-lsm-client",
2342 .dynamic = 1,
2343 .dpcm_capture = 1,
2344 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2345 SND_SOC_DPCM_TRIGGER_POST },
2346 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2347 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302348 .codec_dai_name = "snd-soc-dummy-dai",
2349 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302350 .id = MSM_FRONTEND_DAI_LSM4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302351 },
2352 {/* hw:x,23 */
2353 .name = "Listen 5 Audio Service",
2354 .stream_name = "Listen 5 Audio Service",
2355 .cpu_dai_name = "LSM5",
2356 .platform_name = "msm-lsm-client",
2357 .dynamic = 1,
2358 .dpcm_capture = 1,
2359 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2360 SND_SOC_DPCM_TRIGGER_POST },
2361 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2362 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302363 .codec_dai_name = "snd-soc-dummy-dai",
2364 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302365 .id = MSM_FRONTEND_DAI_LSM5,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302366 },
2367 {/* hw:x,24 */
2368 .name = "Listen 6 Audio Service",
2369 .stream_name = "Listen 6 Audio Service",
2370 .cpu_dai_name = "LSM6",
2371 .platform_name = "msm-lsm-client",
2372 .dynamic = 1,
2373 .dpcm_capture = 1,
2374 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2375 SND_SOC_DPCM_TRIGGER_POST },
2376 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2377 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302378 .codec_dai_name = "snd-soc-dummy-dai",
2379 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302380 .id = MSM_FRONTEND_DAI_LSM6
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302381 },
2382 {/* hw:x,25 */
2383 .name = "Listen 7 Audio Service",
2384 .stream_name = "Listen 7 Audio Service",
2385 .cpu_dai_name = "LSM7",
2386 .platform_name = "msm-lsm-client",
2387 .dynamic = 1,
2388 .dpcm_capture = 1,
2389 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2390 SND_SOC_DPCM_TRIGGER_POST },
2391 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2392 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302393 .codec_dai_name = "snd-soc-dummy-dai",
2394 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302395 .id = MSM_FRONTEND_DAI_LSM7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302396 },
2397 {/* hw:x,26 */
2398 .name = "Listen 8 Audio Service",
2399 .stream_name = "Listen 8 Audio Service",
2400 .cpu_dai_name = "LSM8",
2401 .platform_name = "msm-lsm-client",
2402 .dynamic = 1,
2403 .dpcm_capture = 1,
2404 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2405 SND_SOC_DPCM_TRIGGER_POST },
2406 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2407 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302408 .codec_dai_name = "snd-soc-dummy-dai",
2409 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302410 .id = MSM_FRONTEND_DAI_LSM8,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302411 },
2412 {/* hw:x,27 */
2413 .name = MSM_DAILINK_NAME(Media9),
2414 .stream_name = "MultiMedia9",
2415 .cpu_dai_name = "MultiMedia9",
2416 .platform_name = "msm-pcm-dsp.0",
2417 .dynamic = 1,
2418 .dpcm_capture = 1,
2419 .dpcm_playback = 1,
2420 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2421 SND_SOC_DPCM_TRIGGER_POST},
2422 .codec_dai_name = "snd-soc-dummy-dai",
2423 .codec_name = "snd-soc-dummy",
2424 .ignore_suspend = 1,
2425 .ignore_pmdown_time = 1,
2426 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302427 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302428 },
2429 {/* hw:x,28 */
2430 .name = MSM_DAILINK_NAME(Compress4),
2431 .stream_name = "Compress4",
2432 .cpu_dai_name = "MultiMedia11",
2433 .platform_name = "msm-compress-dsp",
2434 .dynamic = 1,
2435 .dpcm_capture = 1,
2436 .dpcm_playback = 1,
2437 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2438 SND_SOC_DPCM_TRIGGER_POST},
2439 .codec_dai_name = "snd-soc-dummy-dai",
2440 .codec_name = "snd-soc-dummy",
2441 .ignore_suspend = 1,
2442 .ignore_pmdown_time = 1,
2443 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302444 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302445 },
2446 {/* hw:x,29 */
2447 .name = MSM_DAILINK_NAME(Compress5),
2448 .stream_name = "Compress5",
2449 .cpu_dai_name = "MultiMedia12",
2450 .platform_name = "msm-compress-dsp",
2451 .dynamic = 1,
2452 .dpcm_capture = 1,
2453 .dpcm_playback = 1,
2454 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2455 SND_SOC_DPCM_TRIGGER_POST},
2456 .codec_dai_name = "snd-soc-dummy-dai",
2457 .codec_name = "snd-soc-dummy",
2458 .ignore_suspend = 1,
2459 .ignore_pmdown_time = 1,
2460 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302461 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302462 },
2463 {/* hw:x,30 */
2464 .name = MSM_DAILINK_NAME(Compress6),
2465 .stream_name = "Compress6",
2466 .cpu_dai_name = "MultiMedia13",
2467 .platform_name = "msm-compress-dsp",
2468 .dynamic = 1,
2469 .dpcm_capture = 1,
2470 .dpcm_playback = 1,
2471 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2472 SND_SOC_DPCM_TRIGGER_POST},
2473 .codec_dai_name = "snd-soc-dummy-dai",
2474 .codec_name = "snd-soc-dummy",
2475 .ignore_suspend = 1,
2476 .ignore_pmdown_time = 1,
2477 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302478 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302479 },
2480 {/* hw:x,31 */
2481 .name = MSM_DAILINK_NAME(Compress7),
2482 .stream_name = "Compress7",
2483 .cpu_dai_name = "MultiMedia14",
2484 .platform_name = "msm-compress-dsp",
2485 .dynamic = 1,
2486 .dpcm_capture = 1,
2487 .dpcm_playback = 1,
2488 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2489 SND_SOC_DPCM_TRIGGER_POST},
2490 .codec_dai_name = "snd-soc-dummy-dai",
2491 .codec_name = "snd-soc-dummy",
2492 .ignore_suspend = 1,
2493 .ignore_pmdown_time = 1,
2494 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302495 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302496 },
2497 {/* hw:x,32 */
2498 .name = MSM_DAILINK_NAME(Compress8),
2499 .stream_name = "Compress8",
2500 .cpu_dai_name = "MultiMedia15",
2501 .platform_name = "msm-compress-dsp",
2502 .dynamic = 1,
2503 .dpcm_capture = 1,
2504 .dpcm_playback = 1,
2505 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2506 SND_SOC_DPCM_TRIGGER_POST},
2507 .codec_dai_name = "snd-soc-dummy-dai",
2508 .codec_name = "snd-soc-dummy",
2509 .ignore_suspend = 1,
2510 .ignore_pmdown_time = 1,
2511 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302512 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302513 },
2514 {/* hw:x,33 */
Asish Bhattacharya34504582017-08-08 12:55:01 +05302515 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
2516 .stream_name = "MM_NOIRQ_2",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302517 .cpu_dai_name = "MultiMedia16",
Asish Bhattacharya34504582017-08-08 12:55:01 +05302518 .platform_name = "msm-pcm-dsp-noirq",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302519 .dynamic = 1,
2520 .dpcm_capture = 1,
2521 .dpcm_playback = 1,
2522 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2523 SND_SOC_DPCM_TRIGGER_POST},
2524 .codec_dai_name = "snd-soc-dummy-dai",
2525 .codec_name = "snd-soc-dummy",
2526 .ignore_suspend = 1,
2527 .ignore_pmdown_time = 1,
2528 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302529 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302530 },
2531 {/* hw:x,34 */
2532 .name = "SLIMBUS_8 Hostless",
2533 .stream_name = "SLIMBUS8_HOSTLESS Capture",
2534 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
2535 .platform_name = "msm-pcm-hostless",
2536 .dynamic = 1,
2537 .dpcm_capture = 1,
2538 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2539 SND_SOC_DPCM_TRIGGER_POST},
2540 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2541 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302542 .codec_dai_name = "snd-soc-dummy-dai",
2543 .codec_name = "snd-soc-dummy",
2544 },
2545 {/* hw:x,35 */
2546 .name = "Primary MI2S_RX Hostless",
2547 .stream_name = "Primary MI2S_RX Hostless",
2548 .cpu_dai_name = "PRI_MI2S_RX_HOSTLESS",
2549 .platform_name = "msm-pcm-hostless",
2550 .dynamic = 1,
2551 .dpcm_playback = 1,
2552 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2553 SND_SOC_DPCM_TRIGGER_POST},
2554 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2555 .ignore_suspend = 1,
2556 /* this dailink has playback support */
2557 .ignore_pmdown_time = 1,
2558 /* This dainlink has MI2S support */
2559 .codec_dai_name = "snd-soc-dummy-dai",
2560 .codec_name = "snd-soc-dummy",
2561 },
2562 {/* hw:x,36 */
2563 .name = "Secondary MI2S_RX Hostless",
2564 .stream_name = "Secondary MI2S_RX Hostless",
2565 .cpu_dai_name = "SEC_MI2S_RX_HOSTLESS",
2566 .platform_name = "msm-pcm-hostless",
2567 .dynamic = 1,
2568 .dpcm_playback = 1,
2569 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2570 SND_SOC_DPCM_TRIGGER_POST},
2571 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2572 .ignore_suspend = 1,
2573 /* this dailink has playback support */
2574 .ignore_pmdown_time = 1,
2575 /* This dainlink has MI2S support */
2576 .codec_dai_name = "snd-soc-dummy-dai",
2577 .codec_name = "snd-soc-dummy",
2578 },
2579 {/* hw:x,37 */
2580 .name = "Tertiary MI2S_RX Hostless",
2581 .stream_name = "Tertiary MI2S_RX Hostless",
2582 .cpu_dai_name = "TERT_MI2S_RX_HOSTLESS",
2583 .platform_name = "msm-pcm-hostless",
2584 .dynamic = 1,
2585 .dpcm_playback = 1,
2586 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2587 SND_SOC_DPCM_TRIGGER_POST},
2588 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2589 .ignore_suspend = 1,
2590 /* this dailink has playback support */
2591 .ignore_pmdown_time = 1,
2592 /* This dainlink has MI2S support */
2593 .codec_dai_name = "snd-soc-dummy-dai",
2594 .codec_name = "snd-soc-dummy",
2595 },
2596 {/* hw:x,38 */
2597 .name = "INT0 MI2S_RX Hostless",
2598 .stream_name = "INT0 MI2S_RX Hostless",
2599 .cpu_dai_name = "INT0_MI2S_RX_HOSTLESS",
2600 .platform_name = "msm-pcm-hostless",
2601 .dynamic = 1,
2602 .dpcm_playback = 1,
2603 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2604 SND_SOC_DPCM_TRIGGER_POST},
2605 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2606 .ignore_suspend = 1,
2607 /* this dailink has playback support */
2608 .ignore_pmdown_time = 1,
2609 /* This dainlink has MI2S support */
2610 .codec_dai_name = "snd-soc-dummy-dai",
2611 .codec_name = "snd-soc-dummy",
2612 },
2613 {/* hw:x,39 */
2614 .name = "SDM660 HFP TX",
2615 .stream_name = "MultiMedia6",
2616 .cpu_dai_name = "MultiMedia6",
2617 .platform_name = "msm-pcm-loopback",
2618 .dynamic = 1,
2619 .dpcm_playback = 1,
2620 .dpcm_capture = 1,
2621 .codec_dai_name = "snd-soc-dummy-dai",
2622 .codec_name = "snd-soc-dummy",
2623 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2624 SND_SOC_DPCM_TRIGGER_POST},
2625 .ignore_suspend = 1,
2626 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2627 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302628 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302629 },
2630};
2631
2632
2633static struct snd_soc_dai_link msm_int_wsa_dai[] = {
2634 {/* hw:x,40 */
2635 .name = LPASS_BE_INT5_MI2S_TX,
2636 .stream_name = "INT5_mi2s Capture",
2637 .cpu_dai_name = "msm-dai-q6-mi2s.12",
2638 .platform_name = "msm-pcm-hostless",
2639 .codec_name = "msm_sdw_codec",
2640 .codec_dai_name = "msm_sdw_vifeedback",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302641 .id = MSM_BACKEND_DAI_INT5_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302642 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2643 .ops = &msm_sdw_mi2s_be_ops,
2644 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2645 .ignore_suspend = 1,
2646 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302647 },
2648};
2649
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05302650static struct snd_soc_dai_link msm_int_compress_capture_dai[] = {
2651 {/* hw:x,41 */
2652 .name = "Compress9",
2653 .stream_name = "Compress9",
2654 .cpu_dai_name = "MultiMedia17",
2655 .platform_name = "msm-compress-dsp",
2656 .dynamic = 1,
2657 .dpcm_capture = 1,
2658 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2659 SND_SOC_DPCM_TRIGGER_POST},
2660 .codec_dai_name = "snd-soc-dummy-dai",
2661 .codec_name = "snd-soc-dummy",
2662 .ignore_suspend = 1,
2663 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
2664 },
2665 {/* hw:x,42 */
2666 .name = "Compress10",
2667 .stream_name = "Compress10",
2668 .cpu_dai_name = "MultiMedia18",
2669 .platform_name = "msm-compress-dsp",
2670 .dynamic = 1,
2671 .dpcm_capture = 1,
2672 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2673 SND_SOC_DPCM_TRIGGER_POST},
2674 .codec_dai_name = "snd-soc-dummy-dai",
2675 .codec_name = "snd-soc-dummy",
2676 .ignore_suspend = 1,
2677 .id = MSM_FRONTEND_DAI_MULTIMEDIA18,
2678 },
2679 {/* hw:x,43 */
2680 .name = "Compress11",
2681 .stream_name = "Compress11",
2682 .cpu_dai_name = "MultiMedia19",
2683 .platform_name = "msm-compress-dsp",
2684 .dynamic = 1,
2685 .dpcm_capture = 1,
2686 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2687 SND_SOC_DPCM_TRIGGER_POST},
2688 .codec_dai_name = "snd-soc-dummy-dai",
2689 .codec_name = "snd-soc-dummy",
2690 .ignore_suspend = 1,
2691 .id = MSM_FRONTEND_DAI_MULTIMEDIA19,
2692 },
2693 {/* hw:x,44 */
2694 .name = "Compress12",
2695 .stream_name = "Compress12",
2696 .cpu_dai_name = "MultiMedia28",
2697 .platform_name = "msm-compress-dsp",
2698 .dynamic = 1,
2699 .dpcm_capture = 1,
2700 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2701 SND_SOC_DPCM_TRIGGER_POST},
2702 .codec_dai_name = "snd-soc-dummy-dai",
2703 .codec_name = "snd-soc-dummy",
2704 .ignore_suspend = 1,
2705 .id = MSM_FRONTEND_DAI_MULTIMEDIA28,
2706 },
2707 {/* hw:x,45 */
2708 .name = "Compress13",
2709 .stream_name = "Compress13",
2710 .cpu_dai_name = "MultiMedia29",
2711 .platform_name = "msm-compress-dsp",
2712 .dynamic = 1,
2713 .dpcm_capture = 1,
2714 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2715 SND_SOC_DPCM_TRIGGER_POST},
2716 .codec_dai_name = "snd-soc-dummy-dai",
2717 .codec_name = "snd-soc-dummy",
2718 .ignore_suspend = 1,
2719 .id = MSM_FRONTEND_DAI_MULTIMEDIA29,
2720 },
2721};
2722
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302723static struct snd_soc_dai_link msm_int_be_dai[] = {
2724 /* Backend I2S DAI Links */
2725 {
2726 .name = LPASS_BE_INT0_MI2S_RX,
2727 .stream_name = "INT0 MI2S Playback",
2728 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2729 .platform_name = "msm-pcm-routing",
2730 .codecs = dlc_rx1,
2731 .num_codecs = CODECS_MAX,
2732 .no_pcm = 1,
2733 .dpcm_playback = 1,
2734 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2735 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302736 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302737 .init = &msm_audrx_init,
2738 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2739 .ops = &msm_int_mi2s_be_ops,
2740 .ignore_suspend = 1,
2741 },
2742 {
2743 .name = LPASS_BE_INT3_MI2S_TX,
2744 .stream_name = "INT3 MI2S Capture",
2745 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2746 .platform_name = "msm-pcm-routing",
2747 .codecs = dlc_tx1,
2748 .num_codecs = CODECS_MAX,
2749 .no_pcm = 1,
2750 .dpcm_capture = 1,
2751 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2752 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302753 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302754 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2755 .ops = &msm_int_mi2s_be_ops,
2756 .ignore_suspend = 1,
2757 },
2758 {
2759 .name = LPASS_BE_INT2_MI2S_TX,
2760 .stream_name = "INT2 MI2S Capture",
2761 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2762 .platform_name = "msm-pcm-routing",
2763 .codecs = dlc_tx2,
2764 .num_codecs = CODECS_MAX,
2765 .no_pcm = 1,
2766 .dpcm_capture = 1,
2767 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2768 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302769 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302770 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2771 .ops = &msm_int_mi2s_be_ops,
2772 .ignore_suspend = 1,
2773 },
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05302774};
2775
2776static struct snd_soc_dai_link msm_int_dig_be_dai[] = {
2777 /* DIG Codec Backend DAI Links */
2778 {
2779 .name = LPASS_BE_INT0_MI2S_RX,
2780 .stream_name = "INT0 MI2S Playback",
2781 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2782 .platform_name = "msm-pcm-routing",
2783 .codec_dai_name = "msm_dig_cdc_dai_rx1",
2784 .no_pcm = 1,
2785 .dpcm_playback = 1,
2786 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2787 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2788 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
2789 .init = &msm_dig_audrx_init,
2790 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2791 .ops = &msm_int_dig_mi2s_be_ops,
2792 .ignore_suspend = 1,
2793 },
2794 {
2795 .name = LPASS_BE_INT3_MI2S_TX,
2796 .stream_name = "INT3 MI2S Capture",
2797 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2798 .platform_name = "msm-pcm-routing",
2799 .codec_dai_name = "msm_dig_cdc_dai_tx1",
2800 .no_pcm = 1,
2801 .dpcm_capture = 1,
2802 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2803 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2804 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
2805 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2806 .ops = &msm_int_dig_mi2s_be_ops,
2807 .ignore_suspend = 1,
2808 },
2809 {
2810 .name = LPASS_BE_INT2_MI2S_TX,
2811 .stream_name = "INT2 MI2S Capture",
2812 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2813 .platform_name = "msm-pcm-routing",
2814 .codec_dai_name = "msm_dig_cdc_dai_tx2",
2815 .no_pcm = 1,
2816 .dpcm_capture = 1,
2817 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2818 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2819 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
2820 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2821 .ops = &msm_int_dig_mi2s_be_ops,
2822 .ignore_suspend = 1,
2823 },
2824};
2825
2826static struct snd_soc_dai_link msm_int_common_be_dai[] = {
2827 /* Backend I2S DAI Links */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302828 {
2829 .name = LPASS_BE_AFE_PCM_RX,
2830 .stream_name = "AFE Playback",
2831 .cpu_dai_name = "msm-dai-q6-dev.224",
2832 .platform_name = "msm-pcm-routing",
2833 .codec_name = "msm-stub-codec.1",
2834 .codec_dai_name = "msm-stub-rx",
2835 .no_pcm = 1,
2836 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302837 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302838 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2839 /* this dainlink has playback support */
2840 .ignore_pmdown_time = 1,
2841 .ignore_suspend = 1,
2842 },
2843 {
2844 .name = LPASS_BE_AFE_PCM_TX,
2845 .stream_name = "AFE Capture",
2846 .cpu_dai_name = "msm-dai-q6-dev.225",
2847 .platform_name = "msm-pcm-routing",
2848 .codec_name = "msm-stub-codec.1",
2849 .codec_dai_name = "msm-stub-tx",
2850 .no_pcm = 1,
2851 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302852 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302853 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2854 .ignore_suspend = 1,
2855 },
2856 /* Incall Record Uplink BACK END DAI Link */
2857 {
2858 .name = LPASS_BE_INCALL_RECORD_TX,
2859 .stream_name = "Voice Uplink Capture",
2860 .cpu_dai_name = "msm-dai-q6-dev.32772",
2861 .platform_name = "msm-pcm-routing",
2862 .codec_name = "msm-stub-codec.1",
2863 .codec_dai_name = "msm-stub-tx",
2864 .no_pcm = 1,
2865 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302866 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302867 .be_hw_params_fixup = msm_be_hw_params_fixup,
2868 .ignore_suspend = 1,
2869 },
2870 /* Incall Record Downlink BACK END DAI Link */
2871 {
2872 .name = LPASS_BE_INCALL_RECORD_RX,
2873 .stream_name = "Voice Downlink Capture",
2874 .cpu_dai_name = "msm-dai-q6-dev.32771",
2875 .platform_name = "msm-pcm-routing",
2876 .codec_name = "msm-stub-codec.1",
2877 .codec_dai_name = "msm-stub-tx",
2878 .no_pcm = 1,
2879 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302880 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302881 .be_hw_params_fixup = msm_be_hw_params_fixup,
2882 .ignore_suspend = 1,
2883 },
2884 /* Incall Music BACK END DAI Link */
2885 {
2886 .name = LPASS_BE_VOICE_PLAYBACK_TX,
2887 .stream_name = "Voice Farend Playback",
2888 .cpu_dai_name = "msm-dai-q6-dev.32773",
2889 .platform_name = "msm-pcm-routing",
2890 .codec_name = "msm-stub-codec.1",
2891 .codec_dai_name = "msm-stub-rx",
2892 .no_pcm = 1,
2893 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302894 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302895 .be_hw_params_fixup = msm_be_hw_params_fixup,
2896 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302897 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302898 },
2899 /* Incall Music 2 BACK END DAI Link */
2900 {
2901 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
2902 .stream_name = "Voice2 Farend Playback",
2903 .cpu_dai_name = "msm-dai-q6-dev.32770",
2904 .platform_name = "msm-pcm-routing",
2905 .codec_name = "msm-stub-codec.1",
2906 .codec_dai_name = "msm-stub-rx",
2907 .no_pcm = 1,
2908 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302909 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302910 .be_hw_params_fixup = msm_be_hw_params_fixup,
2911 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302912 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302913 },
2914 {
2915 .name = LPASS_BE_USB_AUDIO_RX,
2916 .stream_name = "USB Audio Playback",
2917 .cpu_dai_name = "msm-dai-q6-dev.28672",
2918 .platform_name = "msm-pcm-routing",
2919 .codec_name = "msm-stub-codec.1",
2920 .codec_dai_name = "msm-stub-rx",
2921 .no_pcm = 1,
2922 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302923 .id = MSM_BACKEND_DAI_USB_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302924 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2925 .ignore_pmdown_time = 1,
2926 .ignore_suspend = 1,
2927 },
2928 {
2929 .name = LPASS_BE_USB_AUDIO_TX,
2930 .stream_name = "USB Audio Capture",
2931 .cpu_dai_name = "msm-dai-q6-dev.28673",
2932 .platform_name = "msm-pcm-routing",
2933 .codec_name = "msm-stub-codec.1",
2934 .codec_dai_name = "msm-stub-tx",
2935 .no_pcm = 1,
2936 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302937 .id = MSM_BACKEND_DAI_USB_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302938 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2939 .ignore_suspend = 1,
2940 },
2941 {
2942 .name = LPASS_BE_PRI_TDM_RX_0,
2943 .stream_name = "Primary TDM0 Playback",
2944 .cpu_dai_name = "msm-dai-q6-tdm.36864",
2945 .platform_name = "msm-pcm-routing",
2946 .codec_name = "msm-stub-codec.1",
2947 .codec_dai_name = "msm-stub-rx",
2948 .no_pcm = 1,
2949 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302950 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302951 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2952 .ops = &msm_tdm_be_ops,
2953 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302954 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302955 },
2956 {
2957 .name = LPASS_BE_PRI_TDM_TX_0,
2958 .stream_name = "Primary TDM0 Capture",
2959 .cpu_dai_name = "msm-dai-q6-tdm.36865",
2960 .platform_name = "msm-pcm-routing",
2961 .codec_name = "msm-stub-codec.1",
2962 .codec_dai_name = "msm-stub-tx",
2963 .no_pcm = 1,
2964 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302965 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302966 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2967 .ops = &msm_tdm_be_ops,
2968 .ignore_suspend = 1,
2969 },
2970 {
2971 .name = LPASS_BE_SEC_TDM_RX_0,
2972 .stream_name = "Secondary TDM0 Playback",
2973 .cpu_dai_name = "msm-dai-q6-tdm.36880",
2974 .platform_name = "msm-pcm-routing",
2975 .codec_name = "msm-stub-codec.1",
2976 .codec_dai_name = "msm-stub-rx",
2977 .no_pcm = 1,
2978 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302979 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302980 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2981 .ops = &msm_tdm_be_ops,
2982 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302983 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302984 },
2985 {
2986 .name = LPASS_BE_SEC_TDM_TX_0,
2987 .stream_name = "Secondary TDM0 Capture",
2988 .cpu_dai_name = "msm-dai-q6-tdm.36881",
2989 .platform_name = "msm-pcm-routing",
2990 .codec_name = "msm-stub-codec.1",
2991 .codec_dai_name = "msm-stub-tx",
2992 .no_pcm = 1,
2993 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302994 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302995 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2996 .ops = &msm_tdm_be_ops,
2997 .ignore_suspend = 1,
2998 },
2999 {
3000 .name = LPASS_BE_TERT_TDM_RX_0,
3001 .stream_name = "Tertiary TDM0 Playback",
3002 .cpu_dai_name = "msm-dai-q6-tdm.36896",
3003 .platform_name = "msm-pcm-routing",
3004 .codec_name = "msm-stub-codec.1",
3005 .codec_dai_name = "msm-stub-rx",
3006 .no_pcm = 1,
3007 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303008 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303009 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3010 .ops = &msm_tdm_be_ops,
3011 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05303012 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303013 },
3014 {
3015 .name = LPASS_BE_TERT_TDM_TX_0,
3016 .stream_name = "Tertiary TDM0 Capture",
3017 .cpu_dai_name = "msm-dai-q6-tdm.36897",
3018 .platform_name = "msm-pcm-routing",
3019 .codec_name = "msm-stub-codec.1",
3020 .codec_dai_name = "msm-stub-tx",
3021 .no_pcm = 1,
3022 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303023 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303024 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3025 .ops = &msm_tdm_be_ops,
3026 .ignore_suspend = 1,
3027 },
3028 {
3029 .name = LPASS_BE_QUAT_TDM_RX_0,
3030 .stream_name = "Quaternary TDM0 Playback",
3031 .cpu_dai_name = "msm-dai-q6-tdm.36912",
3032 .platform_name = "msm-pcm-routing",
3033 .codec_name = "msm-stub-codec.1",
3034 .codec_dai_name = "msm-stub-rx",
3035 .no_pcm = 1,
3036 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303037 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303038 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3039 .ops = &msm_tdm_be_ops,
3040 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05303041 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303042 },
3043 {
3044 .name = LPASS_BE_QUAT_TDM_TX_0,
3045 .stream_name = "Quaternary TDM0 Capture",
3046 .cpu_dai_name = "msm-dai-q6-tdm.36913",
3047 .platform_name = "msm-pcm-routing",
3048 .codec_name = "msm-stub-codec.1",
3049 .codec_dai_name = "msm-stub-tx",
3050 .no_pcm = 1,
3051 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303052 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303053 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3054 .ops = &msm_tdm_be_ops,
3055 .ignore_suspend = 1,
3056 },
Rohit Kumard1754482017-09-10 22:57:39 +05303057 {
3058 .name = LPASS_BE_QUIN_TDM_RX_0,
3059 .stream_name = "Quinary TDM0 Playback",
Rohit kumar091ff792017-10-11 18:35:07 +05303060 .cpu_dai_name = "msm-dai-q6-tdm.36928",
Rohit Kumard1754482017-09-10 22:57:39 +05303061 .platform_name = "msm-pcm-routing",
3062 .codec_name = "msm-stub-codec.1",
3063 .codec_dai_name = "msm-stub-rx",
3064 .no_pcm = 1,
3065 .dpcm_playback = 1,
3066 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
3067 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3068 .ops = &msm_tdm_be_ops,
3069 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05303070 .ignore_pmdown_time = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05303071 },
3072 {
3073 .name = LPASS_BE_QUIN_TDM_TX_0,
3074 .stream_name = "Quinary TDM0 Capture",
Rohit kumar091ff792017-10-11 18:35:07 +05303075 .cpu_dai_name = "msm-dai-q6-tdm.36929",
Rohit Kumard1754482017-09-10 22:57:39 +05303076 .platform_name = "msm-pcm-routing",
3077 .codec_name = "msm-stub-codec.1",
3078 .codec_dai_name = "msm-stub-tx",
3079 .no_pcm = 1,
3080 .dpcm_capture = 1,
3081 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
3082 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3083 .ops = &msm_tdm_be_ops,
3084 .ignore_suspend = 1,
3085 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303086};
3087
3088static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
3089 {
3090 .name = LPASS_BE_PRI_MI2S_RX,
3091 .stream_name = "Primary MI2S Playback",
3092 .cpu_dai_name = "msm-dai-q6-mi2s.0",
3093 .platform_name = "msm-pcm-routing",
3094 .codec_name = "msm-stub-codec.1",
3095 .codec_dai_name = "msm-stub-rx",
3096 .no_pcm = 1,
3097 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303098 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303099 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3100 .ops = &msm_mi2s_be_ops,
3101 .ignore_suspend = 1,
3102 .ignore_pmdown_time = 1,
3103 },
3104 {
3105 .name = LPASS_BE_PRI_MI2S_TX,
3106 .stream_name = "Primary MI2S Capture",
3107 .cpu_dai_name = "msm-dai-q6-mi2s.0",
3108 .platform_name = "msm-pcm-routing",
3109 .codec_name = "msm-stub-codec.1",
3110 .codec_dai_name = "msm-stub-tx",
3111 .no_pcm = 1,
3112 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303113 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303114 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3115 .ops = &msm_mi2s_be_ops,
3116 .ignore_suspend = 1,
3117 },
3118 {
3119 .name = LPASS_BE_SEC_MI2S_RX,
3120 .stream_name = "Secondary MI2S Playback",
3121 .cpu_dai_name = "msm-dai-q6-mi2s.1",
3122 .platform_name = "msm-pcm-routing",
3123 .codec_name = "msm-stub-codec.1",
3124 .codec_dai_name = "msm-stub-rx",
3125 .no_pcm = 1,
3126 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303127 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303128 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3129 .ops = &msm_mi2s_be_ops,
3130 .ignore_suspend = 1,
3131 .ignore_pmdown_time = 1,
3132 },
3133 {
3134 .name = LPASS_BE_SEC_MI2S_TX,
3135 .stream_name = "Secondary MI2S Capture",
3136 .cpu_dai_name = "msm-dai-q6-mi2s.1",
3137 .platform_name = "msm-pcm-routing",
3138 .codec_name = "msm-stub-codec.1",
3139 .codec_dai_name = "msm-stub-tx",
3140 .no_pcm = 1,
3141 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303142 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303143 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3144 .ops = &msm_mi2s_be_ops,
3145 .ignore_suspend = 1,
3146 },
3147 {
3148 .name = LPASS_BE_TERT_MI2S_RX,
3149 .stream_name = "Tertiary MI2S Playback",
3150 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3151 .platform_name = "msm-pcm-routing",
3152 .codec_name = "msm-stub-codec.1",
3153 .codec_dai_name = "msm-stub-rx",
3154 .no_pcm = 1,
3155 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303156 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303157 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3158 .ops = &msm_mi2s_be_ops,
3159 .ignore_suspend = 1,
3160 .ignore_pmdown_time = 1,
3161 },
3162 {
3163 .name = LPASS_BE_TERT_MI2S_TX,
3164 .stream_name = "Tertiary MI2S Capture",
3165 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3166 .platform_name = "msm-pcm-routing",
3167 .codec_name = "msm-stub-codec.1",
3168 .codec_dai_name = "msm-stub-tx",
3169 .no_pcm = 1,
3170 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303171 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303172 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3173 .ops = &msm_mi2s_be_ops,
3174 .ignore_suspend = 1,
3175 },
3176 {
3177 .name = LPASS_BE_QUAT_MI2S_RX,
3178 .stream_name = "Quaternary MI2S Playback",
3179 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3180 .platform_name = "msm-pcm-routing",
3181 .codec_name = "msm-stub-codec.1",
3182 .codec_dai_name = "msm-stub-rx",
3183 .no_pcm = 1,
3184 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303185 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303186 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3187 .ops = &msm_mi2s_be_ops,
3188 .ignore_suspend = 1,
3189 .ignore_pmdown_time = 1,
3190 },
3191 {
3192 .name = LPASS_BE_QUAT_MI2S_TX,
3193 .stream_name = "Quaternary MI2S Capture",
3194 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3195 .platform_name = "msm-pcm-routing",
3196 .codec_name = "msm-stub-codec.1",
3197 .codec_dai_name = "msm-stub-tx",
3198 .no_pcm = 1,
3199 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303200 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303201 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3202 .ops = &msm_mi2s_be_ops,
3203 .ignore_suspend = 1,
3204 },
Rohit Kumard1754482017-09-10 22:57:39 +05303205 {
3206 .name = LPASS_BE_QUIN_MI2S_RX,
3207 .stream_name = "Quinary MI2S Playback",
Rohit kumar20df5452017-10-16 15:35:56 +05303208 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303209 .platform_name = "msm-pcm-routing",
3210 .codec_name = "msm-stub-codec.1",
3211 .codec_dai_name = "msm-stub-rx",
3212 .no_pcm = 1,
3213 .dpcm_playback = 1,
3214 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
3215 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3216 .ops = &msm_mi2s_be_ops,
3217 .ignore_suspend = 1,
3218 .ignore_pmdown_time = 1,
3219 },
3220 {
3221 .name = LPASS_BE_QUIN_MI2S_TX,
3222 .stream_name = "Quinary MI2S Capture",
Rohit kumar20df5452017-10-16 15:35:56 +05303223 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303224 .platform_name = "msm-pcm-routing",
3225 .codec_name = "msm-stub-codec.1",
3226 .codec_dai_name = "msm-stub-tx",
3227 .no_pcm = 1,
3228 .dpcm_capture = 1,
3229 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
3230 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3231 .ops = &msm_mi2s_be_ops,
3232 .ignore_suspend = 1,
3233 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303234};
3235
3236static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
3237 /* Primary AUX PCM Backend DAI Links */
3238 {
3239 .name = LPASS_BE_AUXPCM_RX,
3240 .stream_name = "AUX PCM Playback",
3241 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3242 .platform_name = "msm-pcm-routing",
3243 .codec_name = "msm-stub-codec.1",
3244 .codec_dai_name = "msm-stub-rx",
3245 .no_pcm = 1,
3246 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303247 .id = MSM_BACKEND_DAI_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303248 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3249 .ignore_pmdown_time = 1,
3250 .ignore_suspend = 1,
3251 .ops = &msm_aux_pcm_be_ops,
3252 },
3253 {
3254 .name = LPASS_BE_AUXPCM_TX,
3255 .stream_name = "AUX PCM Capture",
3256 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3257 .platform_name = "msm-pcm-routing",
3258 .codec_name = "msm-stub-codec.1",
3259 .codec_dai_name = "msm-stub-tx",
3260 .no_pcm = 1,
3261 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303262 .id = MSM_BACKEND_DAI_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303263 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303264 .ignore_suspend = 1,
3265 .ops = &msm_aux_pcm_be_ops,
3266 },
3267 /* Secondary AUX PCM Backend DAI Links */
3268 {
3269 .name = LPASS_BE_SEC_AUXPCM_RX,
3270 .stream_name = "Sec AUX PCM Playback",
3271 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3272 .platform_name = "msm-pcm-routing",
3273 .codec_name = "msm-stub-codec.1",
3274 .codec_dai_name = "msm-stub-rx",
3275 .no_pcm = 1,
3276 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303277 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303278 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3279 .ignore_pmdown_time = 1,
3280 .ignore_suspend = 1,
3281 .ops = &msm_aux_pcm_be_ops,
3282 },
3283 {
3284 .name = LPASS_BE_SEC_AUXPCM_TX,
3285 .stream_name = "Sec AUX PCM Capture",
3286 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3287 .platform_name = "msm-pcm-routing",
3288 .codec_name = "msm-stub-codec.1",
3289 .codec_dai_name = "msm-stub-tx",
3290 .no_pcm = 1,
3291 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303292 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303293 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3294 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303295 .ops = &msm_aux_pcm_be_ops,
3296 },
3297 /* Tertiary AUX PCM Backend DAI Links */
3298 {
3299 .name = LPASS_BE_TERT_AUXPCM_RX,
3300 .stream_name = "Tert AUX PCM Playback",
3301 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3302 .platform_name = "msm-pcm-routing",
3303 .codec_name = "msm-stub-codec.1",
3304 .codec_dai_name = "msm-stub-rx",
3305 .no_pcm = 1,
3306 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303307 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303308 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3309 .ignore_pmdown_time = 1,
3310 .ignore_suspend = 1,
3311 .ops = &msm_aux_pcm_be_ops,
3312 },
3313 {
3314 .name = LPASS_BE_TERT_AUXPCM_TX,
3315 .stream_name = "Tert AUX PCM Capture",
3316 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3317 .platform_name = "msm-pcm-routing",
3318 .codec_name = "msm-stub-codec.1",
3319 .codec_dai_name = "msm-stub-tx",
3320 .no_pcm = 1,
3321 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303322 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303323 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3324 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303325 .ops = &msm_aux_pcm_be_ops,
3326 },
3327 /* Quaternary AUX PCM Backend DAI Links */
3328 {
3329 .name = LPASS_BE_QUAT_AUXPCM_RX,
3330 .stream_name = "Quat AUX PCM Playback",
3331 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3332 .platform_name = "msm-pcm-routing",
3333 .codec_name = "msm-stub-codec.1",
3334 .codec_dai_name = "msm-stub-rx",
3335 .no_pcm = 1,
3336 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303337 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303338 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3339 .ignore_pmdown_time = 1,
3340 .ignore_suspend = 1,
3341 .ops = &msm_aux_pcm_be_ops,
3342 },
3343 {
3344 .name = LPASS_BE_QUAT_AUXPCM_TX,
3345 .stream_name = "Quat AUX PCM Capture",
3346 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3347 .platform_name = "msm-pcm-routing",
3348 .codec_name = "msm-stub-codec.1",
3349 .codec_dai_name = "msm-stub-tx",
3350 .no_pcm = 1,
3351 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303352 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303353 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3354 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303355 .ops = &msm_aux_pcm_be_ops,
3356 },
Rohit Kumard1754482017-09-10 22:57:39 +05303357 /* Quinary AUX PCM Backend DAI Links */
3358 {
3359 .name = LPASS_BE_QUIN_AUXPCM_RX,
3360 .stream_name = "Quin AUX PCM Playback",
3361 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3362 .platform_name = "msm-pcm-routing",
3363 .codec_name = "msm-stub-codec.1",
3364 .codec_dai_name = "msm-stub-rx",
3365 .no_pcm = 1,
3366 .dpcm_playback = 1,
3367 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
3368 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3369 .ignore_pmdown_time = 1,
3370 .ignore_suspend = 1,
3371 .ops = &msm_aux_pcm_be_ops,
3372 },
3373 {
3374 .name = LPASS_BE_QUIN_AUXPCM_TX,
3375 .stream_name = "Quin AUX PCM Capture",
3376 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3377 .platform_name = "msm-pcm-routing",
3378 .codec_name = "msm-stub-codec.1",
3379 .codec_dai_name = "msm-stub-tx",
3380 .no_pcm = 1,
3381 .dpcm_capture = 1,
3382 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
3383 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3384 .ignore_suspend = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05303385 .ops = &msm_aux_pcm_be_ops,
3386 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303387};
3388
3389
3390static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
3391 {
3392 .name = LPASS_BE_SLIMBUS_7_RX,
3393 .stream_name = "Slimbus7 Playback",
3394 .cpu_dai_name = "msm-dai-q6-dev.16398",
3395 .platform_name = "msm-pcm-routing",
3396 .codec_name = "btfmslim_slave",
3397 /* BT codec driver determines capabilities based on
3398 * dai name, bt codecdai name should always contains
3399 * supported usecase information
3400 */
3401 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
3402 .no_pcm = 1,
3403 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303404 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303405 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3406 .ops = &msm_wcn_ops,
3407 /* dai link has playback support */
3408 .ignore_pmdown_time = 1,
3409 .ignore_suspend = 1,
3410 },
3411 {
3412 .name = LPASS_BE_SLIMBUS_7_TX,
3413 .stream_name = "Slimbus7 Capture",
3414 .cpu_dai_name = "msm-dai-q6-dev.16399",
3415 .platform_name = "msm-pcm-routing",
3416 .codec_name = "btfmslim_slave",
3417 .codec_dai_name = "btfm_bt_sco_slim_tx",
3418 .no_pcm = 1,
3419 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303420 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303421 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3422 .ops = &msm_wcn_ops,
3423 .ignore_suspend = 1,
3424 },
3425 {
3426 .name = LPASS_BE_SLIMBUS_8_TX,
3427 .stream_name = "Slimbus8 Capture",
3428 .cpu_dai_name = "msm-dai-q6-dev.16401",
3429 .platform_name = "msm-pcm-routing",
3430 .codec_name = "btfmslim_slave",
3431 .codec_dai_name = "btfm_fm_slim_tx",
3432 .no_pcm = 1,
3433 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303434 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303435 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3436 .init = &msm_wcn_init,
3437 .ops = &msm_wcn_ops,
3438 .ignore_suspend = 1,
3439 },
3440};
3441
3442static struct snd_soc_dai_link msm_wsa_be_dai_links[] = {
3443 {
3444 .name = LPASS_BE_INT4_MI2S_RX,
3445 .stream_name = "INT4 MI2S Playback",
3446 .cpu_dai_name = "msm-dai-q6-mi2s.11",
3447 .platform_name = "msm-pcm-routing",
3448 .codec_name = "msm_sdw_codec",
3449 .codec_dai_name = "msm_sdw_i2s_rx1",
3450 .no_pcm = 1,
3451 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303452 .id = MSM_BACKEND_DAI_INT4_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303453 .init = &msm_sdw_audrx_init,
3454 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
3455 .ops = &msm_sdw_mi2s_be_ops,
3456 .ignore_suspend = 1,
3457 },
3458};
3459
3460static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
3461 /* DISP PORT BACK END DAI Link */
3462 {
3463 .name = LPASS_BE_DISPLAY_PORT,
3464 .stream_name = "Display Port Playback",
3465 .cpu_dai_name = "msm-dai-q6-dp.24608",
3466 .platform_name = "msm-pcm-routing",
3467 .codec_name = "msm-ext-disp-audio-codec-rx",
3468 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
3469 .no_pcm = 1,
3470 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303471 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303472 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3473 .ignore_pmdown_time = 1,
3474 .ignore_suspend = 1,
3475 },
3476};
3477
3478static struct snd_soc_dai_link msm_int_dai_links[
3479ARRAY_SIZE(msm_int_dai) +
3480ARRAY_SIZE(msm_int_wsa_dai) +
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303481ARRAY_SIZE(msm_int_compress_capture_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303482ARRAY_SIZE(msm_int_be_dai) +
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303483ARRAY_SIZE(msm_int_dig_be_dai) +
3484ARRAY_SIZE(msm_int_common_be_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303485ARRAY_SIZE(msm_mi2s_be_dai_links) +
3486ARRAY_SIZE(msm_auxpcm_be_dai_links)+
3487ARRAY_SIZE(msm_wcn_be_dai_links) +
3488ARRAY_SIZE(msm_wsa_be_dai_links) +
3489ARRAY_SIZE(ext_disp_be_dai_link)];
3490
3491static struct snd_soc_card sdm660_card = {
3492 /* snd_soc_card_sdm660 */
3493 .name = "sdm660-snd-card",
3494 .dai_link = msm_int_dai,
3495 .num_links = ARRAY_SIZE(msm_int_dai),
3496 .late_probe = msm_snd_card_late_probe,
3497};
3498
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303499static struct snd_soc_card qcs605_dig_card = {
3500 /* snd_soc_card_qcs605 */
3501 .name = "qcs605-dig-snd-card",
3502 .dai_link = msm_int_dai,
3503 .num_links = ARRAY_SIZE(msm_int_dai),
3504};
3505
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303506static void msm_disable_int_mclk0(struct work_struct *work)
3507{
3508 struct msm_asoc_mach_data *pdata = NULL;
3509 struct delayed_work *dwork;
3510 int ret = 0;
3511
3512 dwork = to_delayed_work(work);
3513 pdata = container_of(dwork, struct msm_asoc_mach_data,
3514 disable_int_mclk0_work);
3515 mutex_lock(&pdata->cdc_int_mclk0_mutex);
3516 pr_debug("%s: mclk_enabled %d mclk_rsc_ref %d\n", __func__,
3517 atomic_read(&pdata->int_mclk0_enabled),
3518 atomic_read(&pdata->int_mclk0_rsc_ref));
3519
3520 if (atomic_read(&pdata->int_mclk0_enabled) == true
3521 && atomic_read(&pdata->int_mclk0_rsc_ref) == 0) {
3522 pr_debug("Disable the mclk\n");
3523 pdata->digital_cdc_core_clk.enable = 0;
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05303524 pdata->digital_cdc_core_clk.clk_freq_in_hz =
3525 DEFAULT_MCLK_RATE;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303526 ret = afe_set_lpass_clock_v2(
3527 AFE_PORT_ID_INT0_MI2S_RX,
3528 &pdata->digital_cdc_core_clk);
3529 if (ret < 0)
3530 pr_err("%s failed to disable the CCLK\n", __func__);
3531 atomic_set(&pdata->int_mclk0_enabled, false);
3532 }
3533 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
3534}
3535
3536static void msm_int_dt_parse_cap_info(struct platform_device *pdev,
3537 struct msm_asoc_mach_data *pdata)
3538{
3539 const char *ext1_cap = "qcom,msm-micbias1-ext-cap";
3540 const char *ext2_cap = "qcom,msm-micbias2-ext-cap";
3541
3542 pdata->micbias1_cap_mode =
3543 (of_property_read_bool(pdev->dev.of_node, ext1_cap) ?
3544 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3545
3546 pdata->micbias2_cap_mode =
3547 (of_property_read_bool(pdev->dev.of_node, ext2_cap) ?
3548 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3549}
3550
3551static struct snd_soc_card *msm_int_populate_sndcard_dailinks(
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303552 struct device *dev, int snd_card_val)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303553{
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303554 struct snd_soc_card *card;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303555 struct snd_soc_dai_link *dailink;
3556 int len1;
3557
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303558 if (snd_card_val == INT_SND_CARD)
3559 card = &sdm660_card;
3560 else
3561 card = &qcs605_dig_card;
3562
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303563 card->name = dev_name(dev);
3564 len1 = ARRAY_SIZE(msm_int_dai);
3565 memcpy(msm_int_dai_links, msm_int_dai, sizeof(msm_int_dai));
3566 dailink = msm_int_dai_links;
3567 if (!of_property_read_bool(dev->of_node,
3568 "qcom,wsa-disable")) {
3569 memcpy(dailink + len1,
3570 msm_int_wsa_dai,
3571 sizeof(msm_int_wsa_dai));
3572 len1 += ARRAY_SIZE(msm_int_wsa_dai);
3573 }
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303574 memcpy(dailink + len1, msm_int_compress_capture_dai,
3575 sizeof(msm_int_compress_capture_dai));
3576 len1 += ARRAY_SIZE(msm_int_compress_capture_dai);
3577
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303578 if (snd_card_val == INT_SND_CARD) {
3579 memcpy(dailink + len1, msm_int_be_dai, sizeof(msm_int_be_dai));
3580 len1 += ARRAY_SIZE(msm_int_be_dai);
3581 } else {
3582 memcpy(dailink + len1, msm_int_dig_be_dai,
3583 sizeof(msm_int_dig_be_dai));
3584 len1 += ARRAY_SIZE(msm_int_dig_be_dai);
3585 }
3586
3587 memcpy(dailink + len1, msm_int_common_be_dai,
3588 sizeof(msm_int_common_be_dai));
3589 len1 += ARRAY_SIZE(msm_int_common_be_dai);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303590
3591 if (of_property_read_bool(dev->of_node,
3592 "qcom,mi2s-audio-intf")) {
3593 memcpy(dailink + len1,
3594 msm_mi2s_be_dai_links,
3595 sizeof(msm_mi2s_be_dai_links));
3596 len1 += ARRAY_SIZE(msm_mi2s_be_dai_links);
3597 }
3598 if (of_property_read_bool(dev->of_node,
3599 "qcom,auxpcm-audio-intf")) {
3600 memcpy(dailink + len1,
3601 msm_auxpcm_be_dai_links,
3602 sizeof(msm_auxpcm_be_dai_links));
3603 len1 += ARRAY_SIZE(msm_auxpcm_be_dai_links);
3604 }
3605 if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
3606 dev_dbg(dev, "%s(): WCN BTFM support present\n",
3607 __func__);
3608 memcpy(dailink + len1,
3609 msm_wcn_be_dai_links,
3610 sizeof(msm_wcn_be_dai_links));
3611 len1 += ARRAY_SIZE(msm_wcn_be_dai_links);
3612 }
3613 if (!of_property_read_bool(dev->of_node, "qcom,wsa-disable")) {
3614 memcpy(dailink + len1,
3615 msm_wsa_be_dai_links,
3616 sizeof(msm_wsa_be_dai_links));
3617 len1 += ARRAY_SIZE(msm_wsa_be_dai_links);
3618 }
3619 if (of_property_read_bool(dev->of_node, "qcom,ext-disp-audio-rx")) {
3620 dev_dbg(dev, "%s(): ext disp audio support present\n",
3621 __func__);
3622 memcpy(dailink + len1,
3623 ext_disp_be_dai_link,
3624 sizeof(ext_disp_be_dai_link));
3625 len1 += ARRAY_SIZE(ext_disp_be_dai_link);
3626 }
3627 card->dai_link = dailink;
3628 card->num_links = len1;
3629 return card;
3630}
3631
3632static int msm_internal_init(struct platform_device *pdev,
3633 struct msm_asoc_mach_data *pdata,
3634 struct snd_soc_card *card)
3635{
3636 const char *type = NULL;
3637 const char *hs_micbias_type = "qcom,msm-hs-micbias-type";
3638 int ret;
3639
3640 ret = is_ext_spk_gpio_support(pdev, pdata);
3641 if (ret < 0)
3642 dev_dbg(&pdev->dev,
3643 "%s: doesn't support external speaker pa\n",
3644 __func__);
3645
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303646 if (pdata->snd_card_val != INT_DIG_SND_CARD) {
3647 ret = of_property_read_string(pdev->dev.of_node,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303648 hs_micbias_type, &type);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303649 if (ret) {
3650 dev_err(&pdev->dev, "%s: missing %s in dt node\n",
3651 __func__, hs_micbias_type);
3652 goto err;
3653 }
3654
3655 if (!strcmp(type, "external")) {
3656 dev_dbg(&pdev->dev, "Headset is using external micbias\n");
3657 mbhc_cfg_ptr->hs_ext_micbias = true;
3658 } else {
3659 dev_dbg(&pdev->dev, "Headset is using internal micbias\n");
3660 mbhc_cfg_ptr->hs_ext_micbias = false;
3661 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303662 }
3663
3664 /* initialize the int_mclk0 */
3665 pdata->digital_cdc_core_clk.clk_set_minor_version =
3666 AFE_API_VERSION_I2S_CONFIG;
3667 pdata->digital_cdc_core_clk.clk_id =
3668 Q6AFE_LPASS_CLK_ID_INT_MCLK_0;
3669 pdata->digital_cdc_core_clk.clk_freq_in_hz = pdata->mclk_freq;
3670 pdata->digital_cdc_core_clk.clk_attri =
3671 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO;
3672 pdata->digital_cdc_core_clk.clk_root =
3673 Q6AFE_LPASS_CLK_ROOT_DEFAULT;
3674 pdata->digital_cdc_core_clk.enable = 1;
3675
3676 /* Initialize loopback mode to false */
3677 pdata->lb_mode = false;
3678
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303679 if (pdata->snd_card_val != INT_DIG_SND_CARD)
3680 msm_int_dt_parse_cap_info(pdev, pdata);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303681
3682 card->dev = &pdev->dev;
3683 platform_set_drvdata(pdev, card);
3684 snd_soc_card_set_drvdata(card, pdata);
3685 ret = snd_soc_of_parse_card_name(card, "qcom,model");
3686 if (ret)
3687 goto err;
3688 /* initialize timer */
3689 INIT_DELAYED_WORK(&pdata->disable_int_mclk0_work,
3690 msm_disable_int_mclk0);
3691 mutex_init(&pdata->cdc_int_mclk0_mutex);
3692 atomic_set(&pdata->int_mclk0_rsc_ref, 0);
3693 atomic_set(&pdata->int_mclk0_enabled, false);
3694
3695 dev_info(&pdev->dev, "%s: default codec configured\n", __func__);
3696
3697 return 0;
3698err:
3699 return ret;
3700}
3701
3702/**
3703 * msm_int_cdc_init - internal codec machine specific init.
3704 *
3705 * @pdev: platform device handle
3706 * @pdata: private data of machine driver
3707 * @card: sound card pointer reference
3708 * @mbhc_cfg: MBHC config reference
3709 *
3710 * Returns 0.
3711 */
3712int msm_int_cdc_init(struct platform_device *pdev,
3713 struct msm_asoc_mach_data *pdata,
3714 struct snd_soc_card **card,
3715 struct wcd_mbhc_config *mbhc_cfg)
3716{
3717 mbhc_cfg_ptr = mbhc_cfg;
3718
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303719 *card = msm_int_populate_sndcard_dailinks(&pdev->dev,
3720 pdata->snd_card_val);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303721 msm_internal_init(pdev, pdata, *card);
3722 return 0;
3723}
3724EXPORT_SYMBOL(msm_int_cdc_init);