blob: 14c47c402a90508627b54606e641a38e91886f6a [file] [log] [blame]
Aditya Bavanari140a80a2018-01-03 16:51:17 +05301/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/of_gpio.h>
14#include <linux/platform_device.h>
15#include <linux/module.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053016#include <sound/pcm_params.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053017#include "msm-pcm-routing-v2.h"
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053018#include "sdm660-common.h"
Laxminath Kasam605b42f2017-08-01 22:02:15 +053019#include "codecs/msm-cdc-pinctrl.h"
20#include "codecs/sdm660_cdc/msm-digital-cdc.h"
21#include "codecs/sdm660_cdc/msm-analog-cdc.h"
22#include "codecs/msm_sdw/msm_sdw.h"
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +053023#include <linux/pm_qos.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053024
25#define __CHIPSET__ "SDM660 "
26#define MSM_DAILINK_NAME(name) (__CHIPSET__#name)
27
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053028#define WCD_MBHC_DEF_RLOADS 5
29
30#define WCN_CDC_SLIM_RX_CH_MAX 2
31#define WCN_CDC_SLIM_TX_CH_MAX 3
32
33#define WSA8810_NAME_1 "wsa881x.20170211"
34#define WSA8810_NAME_2 "wsa881x.20170212"
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +053035#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053036enum {
37 INT0_MI2S = 0,
38 INT1_MI2S,
39 INT2_MI2S,
40 INT3_MI2S,
41 INT4_MI2S,
42 INT5_MI2S,
43 INT6_MI2S,
44 INT_MI2S_MAX,
45};
46
47enum {
48 BT_SLIM7,
49 FM_SLIM8,
50 SLIM_MAX,
51};
52
53/*TDM default offset currently only supporting TDM_RX_0 and TDM_TX_0 */
54static unsigned int tdm_slot_offset[TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
55 {0, 4, 8, 12, 16, 20, 24, 28},/* TX_0 | RX_0 */
56 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_1 | RX_1 */
57 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_2 | RX_2 */
58 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_3 | RX_3 */
59 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_4 | RX_4 */
60 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_5 | RX_5 */
61 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_6 | RX_6 */
62 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_7 | RX_7 */
63};
64
65static struct afe_clk_set int_mi2s_clk[INT_MI2S_MAX] = {
66 {
67 AFE_API_VERSION_I2S_CONFIG,
68 Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT,
69 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
70 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
71 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
72 0,
73 },
74 {
75 AFE_API_VERSION_I2S_CONFIG,
76 Q6AFE_LPASS_CLK_ID_INT1_MI2S_IBIT,
77 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
78 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
79 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
80 0,
81 },
82 {
83 AFE_API_VERSION_I2S_CONFIG,
84 Q6AFE_LPASS_CLK_ID_INT2_MI2S_IBIT,
85 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
86 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
87 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
88 0,
89 },
90 {
91 AFE_API_VERSION_I2S_CONFIG,
92 Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT,
93 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
94 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
95 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
96 0,
97 },
98 {
99 AFE_API_VERSION_I2S_CONFIG,
100 Q6AFE_LPASS_CLK_ID_INT4_MI2S_IBIT,
101 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
102 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
103 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
104 0,
105 },
106 {
107 AFE_API_VERSION_I2S_CONFIG,
108 Q6AFE_LPASS_CLK_ID_INT5_MI2S_IBIT,
109 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
110 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
111 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
112 0,
113 },
114 {
115 AFE_API_VERSION_I2S_CONFIG,
116 Q6AFE_LPASS_CLK_ID_INT6_MI2S_IBIT,
117 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
118 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
119 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
120 0,
121 },
122};
123
124struct dev_config {
125 u32 sample_rate;
126 u32 bit_format;
127 u32 channels;
128};
129
130/* Default configuration of MI2S channels */
131static struct dev_config int_mi2s_cfg[] = {
132 [INT0_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
133 [INT1_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
134 [INT2_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
135 [INT3_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
136 [INT4_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
137 [INT5_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
138 [INT6_MI2S] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
139};
140
141static struct dev_config bt_fm_cfg[] = {
142 [BT_SLIM7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
143 [FM_SLIM8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
144};
145
146static char const *int_mi2s_rate_text[] = {"KHZ_8", "KHZ_16",
147 "KHZ_32", "KHZ_44P1", "KHZ_48",
148 "KHZ_96", "KHZ_192"};
149static const char *const int_mi2s_ch_text[] = {"One", "Two"};
150static const char *const int_mi2s_tx_ch_text[] = {"One", "Two",
151 "Three", "Four"};
152static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
153static const char *const loopback_mclk_text[] = {"DISABLE", "ENABLE"};
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530154static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16",
155 "KHZ_44P1", "KHZ_48",
156 "KHZ_88P2", "KHZ_96"};
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530157
158static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_sample_rate, int_mi2s_rate_text);
159static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_chs, int_mi2s_ch_text);
160static SOC_ENUM_SINGLE_EXT_DECL(int0_mi2s_rx_format, bit_format_text);
161static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_sample_rate, int_mi2s_rate_text);
162static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_chs, int_mi2s_tx_ch_text);
163static SOC_ENUM_SINGLE_EXT_DECL(int2_mi2s_tx_format, bit_format_text);
164static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_sample_rate, int_mi2s_rate_text);
165static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_chs, int_mi2s_tx_ch_text);
166static SOC_ENUM_SINGLE_EXT_DECL(int3_mi2s_tx_format, bit_format_text);
167static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_sample_rate, int_mi2s_rate_text);
168static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_chs, int_mi2s_ch_text);
169static SOC_ENUM_SINGLE_EXT_DECL(int4_mi2s_rx_format, bit_format_text);
170static SOC_ENUM_SINGLE_EXT_DECL(int5_mi2s_tx_chs, int_mi2s_ch_text);
171static SOC_ENUM_SINGLE_EXT_DECL(loopback_mclk_en, loopback_mclk_text);
172static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
173
174static int msm_dmic_event(struct snd_soc_dapm_widget *w,
175 struct snd_kcontrol *kcontrol, int event);
176static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec, int enable,
177 bool dapm);
178static int msm_int_mclk0_event(struct snd_soc_dapm_widget *w,
179 struct snd_kcontrol *kcontrol, int event);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530180static int msm_int_dig_mclk0_event(struct snd_soc_dapm_widget *w,
181 struct snd_kcontrol *kcontrol, int event);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530182static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530183static int msm_int_dig_mi2s_snd_startup(struct snd_pcm_substream *substream);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530184static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream);
185
186static struct wcd_mbhc_config *mbhc_cfg_ptr;
187static struct snd_info_entry *codec_root;
188
189static int int_mi2s_get_bit_format_val(int bit_format)
190{
191 int val = 0;
192
193 switch (bit_format) {
194 case SNDRV_PCM_FORMAT_S24_3LE:
195 val = 2;
196 break;
197 case SNDRV_PCM_FORMAT_S24_LE:
198 val = 1;
199 break;
200 case SNDRV_PCM_FORMAT_S16_LE:
201 default:
202 val = 0;
203 break;
204 }
205 return val;
206}
207
208static int int_mi2s_get_bit_format(int val)
209{
210 int bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
211
212 switch (val) {
213 case 0:
214 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
215 break;
216 case 1:
217 bit_fmt = SNDRV_PCM_FORMAT_S24_LE;
218 break;
219 case 2:
220 bit_fmt = SNDRV_PCM_FORMAT_S24_3LE;
221 break;
222 default:
223 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
224 break;
225 }
226 return bit_fmt;
227}
228
229static int int_mi2s_get_port_idx(struct snd_kcontrol *kcontrol)
230{
231 int port_id = 0;
232
233 if (strnstr(kcontrol->id.name, "INT0_MI2S", sizeof("INT0_MI2S")))
234 port_id = INT0_MI2S;
235 else if (strnstr(kcontrol->id.name, "INT2_MI2S", sizeof("INT2_MI2S")))
236 port_id = INT2_MI2S;
237 else if (strnstr(kcontrol->id.name, "INT3_MI2S", sizeof("INT3_MI2S")))
238 port_id = INT3_MI2S;
239 else if (strnstr(kcontrol->id.name, "INT4_MI2S", sizeof("INT4_MI2S")))
240 port_id = INT4_MI2S;
241 else {
242 pr_err("%s: unsupported channel: %s",
243 __func__, kcontrol->id.name);
244 return -EINVAL;
245 }
246
247 return port_id;
248}
249
250static int int_mi2s_bit_format_get(struct snd_kcontrol *kcontrol,
251 struct snd_ctl_elem_value *ucontrol)
252{
253 int ch_num = int_mi2s_get_port_idx(kcontrol);
254
255 if (ch_num < 0)
256 return ch_num;
257
258 ucontrol->value.enumerated.item[0] =
259 int_mi2s_get_bit_format_val(int_mi2s_cfg[ch_num].bit_format);
260
261 pr_debug("%s: int_mi2s[%d]_bit_format = %d, ucontrol value = %d\n",
262 __func__, ch_num, int_mi2s_cfg[ch_num].bit_format,
263 ucontrol->value.enumerated.item[0]);
264
265 return 0;
266}
267
268static int int_mi2s_bit_format_put(struct snd_kcontrol *kcontrol,
269 struct snd_ctl_elem_value *ucontrol)
270{
271 int ch_num = int_mi2s_get_port_idx(kcontrol);
272
273 if (ch_num < 0)
274 return ch_num;
275
276 int_mi2s_cfg[ch_num].bit_format =
277 int_mi2s_get_bit_format(ucontrol->value.enumerated.item[0]);
278
279 pr_debug("%s: int_mi2s[%d]_rx_bit_format = %d, ucontrol value = %d\n",
280 __func__, ch_num, int_mi2s_cfg[ch_num].bit_format,
281 ucontrol->value.enumerated.item[0]);
282
283 return 0;
284}
285
286static inline int param_is_mask(int p)
287{
288 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
289 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
290}
291
292static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p,
293 int n)
294{
295 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
296}
297
298static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit)
299{
300 if (bit >= SNDRV_MASK_MAX)
301 return;
302 if (param_is_mask(n)) {
303 struct snd_mask *m = param_to_mask(p, n);
304
305 m->bits[0] = 0;
306 m->bits[1] = 0;
307 m->bits[bit >> 5] |= (1 << (bit & 31));
308 }
309}
310
311static int int_mi2s_get_sample_rate_val(int sample_rate)
312{
313 int sample_rate_val;
314
315 switch (sample_rate) {
316 case SAMPLING_RATE_8KHZ:
317 sample_rate_val = 0;
318 break;
319 case SAMPLING_RATE_16KHZ:
320 sample_rate_val = 1;
321 break;
322 case SAMPLING_RATE_32KHZ:
323 sample_rate_val = 2;
324 break;
325 case SAMPLING_RATE_44P1KHZ:
326 sample_rate_val = 3;
327 break;
328 case SAMPLING_RATE_48KHZ:
329 sample_rate_val = 4;
330 break;
331 case SAMPLING_RATE_96KHZ:
332 sample_rate_val = 5;
333 break;
334 case SAMPLING_RATE_192KHZ:
335 sample_rate_val = 6;
336 break;
337 default:
338 sample_rate_val = 4;
339 break;
340 }
341 return sample_rate_val;
342}
343
344static int int_mi2s_get_sample_rate(int value)
345{
346 int sample_rate;
347
348 switch (value) {
349 case 0:
350 sample_rate = SAMPLING_RATE_8KHZ;
351 break;
352 case 1:
353 sample_rate = SAMPLING_RATE_16KHZ;
354 break;
355 case 2:
356 sample_rate = SAMPLING_RATE_32KHZ;
357 break;
358 case 3:
359 sample_rate = SAMPLING_RATE_44P1KHZ;
360 break;
361 case 4:
362 sample_rate = SAMPLING_RATE_48KHZ;
363 break;
364 case 5:
365 sample_rate = SAMPLING_RATE_96KHZ;
366 break;
367 case 6:
368 sample_rate = SAMPLING_RATE_192KHZ;
369 break;
370 default:
371 sample_rate = SAMPLING_RATE_48KHZ;
372 break;
373 }
374 return sample_rate;
375}
376
377static int int_mi2s_sample_rate_put(struct snd_kcontrol *kcontrol,
378 struct snd_ctl_elem_value *ucontrol)
379{
380 int idx = int_mi2s_get_port_idx(kcontrol);
381
382 if (idx < 0)
383 return idx;
384
385 int_mi2s_cfg[idx].sample_rate =
386 int_mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
387
388 pr_debug("%s: idx[%d]_sample_rate = %d, item = %d\n", __func__,
389 idx, int_mi2s_cfg[idx].sample_rate,
390 ucontrol->value.enumerated.item[0]);
391
392 return 0;
393}
394
395static int int_mi2s_sample_rate_get(struct snd_kcontrol *kcontrol,
396 struct snd_ctl_elem_value *ucontrol)
397{
398 int idx = int_mi2s_get_port_idx(kcontrol);
399
400 if (idx < 0)
401 return idx;
402
403 ucontrol->value.enumerated.item[0] =
404 int_mi2s_get_sample_rate_val(int_mi2s_cfg[idx].sample_rate);
405
406 pr_debug("%s: idx[%d]_sample_rate = %d, item = %d\n", __func__,
407 idx, int_mi2s_cfg[idx].sample_rate,
408 ucontrol->value.enumerated.item[0]);
409
410 return 0;
411}
412
413static int int_mi2s_ch_get(struct snd_kcontrol *kcontrol,
414 struct snd_ctl_elem_value *ucontrol)
415{
416 int idx = int_mi2s_get_port_idx(kcontrol);
417
418 if (idx < 0)
419 return idx;
420
421 pr_debug("%s: int_mi2s_[%d]_rx_ch = %d\n", __func__,
422 idx, int_mi2s_cfg[idx].channels);
423 ucontrol->value.enumerated.item[0] = int_mi2s_cfg[idx].channels - 1;
424
425 return 0;
426}
427
428static int int_mi2s_ch_put(struct snd_kcontrol *kcontrol,
429 struct snd_ctl_elem_value *ucontrol)
430{
431 int idx = int_mi2s_get_port_idx(kcontrol);
432
433 if (idx < 0)
434 return idx;
435
436 int_mi2s_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
437 pr_debug("%s: int_mi2s_[%d]_ch = %d\n", __func__,
438 idx, int_mi2s_cfg[idx].channels);
439
440 return 1;
441}
442
443static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = {
444 SND_SOC_DAPM_SUPPLY_S("INT_MCLK0", -1, SND_SOC_NOPM, 0, 0,
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530445 msm_int_mclk0_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530446 SND_SOC_DAPM_MIC("Handset Mic", NULL),
447 SND_SOC_DAPM_MIC("Headset Mic", NULL),
448 SND_SOC_DAPM_MIC("Secondary Mic", NULL),
449 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
450 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
451 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
452 SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
453};
454
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530455static const struct snd_soc_dapm_widget msm_int_dig_dapm_widgets[] = {
456 SND_SOC_DAPM_SUPPLY_S("INT_MCLK0", -1, SND_SOC_NOPM, 0, 0,
Ramu Gottipati11524972018-03-29 16:46:35 +0530457 msm_int_dig_mclk0_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530458 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
459 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
460 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
461 SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
462};
463
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530464static int msm_config_hph_compander_gpio(bool enable,
465 struct snd_soc_codec *codec)
466{
467 struct snd_soc_card *card = codec->component.card;
468 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
469 int ret = 0;
470
471 pr_debug("%s: %s HPH Compander\n", __func__,
472 enable ? "Enable" : "Disable");
473
474 if (enable) {
475 ret = msm_cdc_pinctrl_select_active_state(pdata->comp_gpio_p);
476 if (ret) {
477 pr_err("%s: gpio set cannot be activated %s\n",
478 __func__, "comp_gpio");
479 goto done;
480 }
481 } else {
482 ret = msm_cdc_pinctrl_select_sleep_state(pdata->comp_gpio_p);
483 if (ret) {
484 pr_err("%s: gpio set cannot be de-activated %s\n",
485 __func__, "comp_gpio");
486 goto done;
487 }
488 }
489
490done:
491 return ret;
492}
493
494static int is_ext_spk_gpio_support(struct platform_device *pdev,
495 struct msm_asoc_mach_data *pdata)
496{
497 const char *spk_ext_pa = "qcom,msm-spk-ext-pa";
498
499 pr_debug("%s:Enter\n", __func__);
500
501 pdata->spk_ext_pa_gpio = of_get_named_gpio(pdev->dev.of_node,
502 spk_ext_pa, 0);
503
504 if (pdata->spk_ext_pa_gpio < 0) {
505 dev_dbg(&pdev->dev,
506 "%s: missing %s in dt node\n", __func__, spk_ext_pa);
507 } else {
508 if (!gpio_is_valid(pdata->spk_ext_pa_gpio)) {
509 pr_err("%s: Invalid external speaker gpio: %d",
510 __func__, pdata->spk_ext_pa_gpio);
511 return -EINVAL;
512 }
513 }
514 return 0;
515}
516
517static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable)
518{
519 struct snd_soc_card *card = codec->component.card;
520 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
521 int ret;
522
523 if (!gpio_is_valid(pdata->spk_ext_pa_gpio)) {
524 pr_err("%s: Invalid gpio: %d\n", __func__,
525 pdata->spk_ext_pa_gpio);
526 return false;
527 }
528
529 pr_debug("%s: %s external speaker PA\n", __func__,
530 enable ? "Enable" : "Disable");
531
532 if (enable) {
533 ret = msm_cdc_pinctrl_select_active_state(
534 pdata->ext_spk_gpio_p);
535 if (ret) {
536 pr_err("%s: gpio set cannot be de-activated %s\n",
537 __func__, "ext_spk_gpio");
538 return ret;
539 }
540 gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable);
541 } else {
542 gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable);
543 ret = msm_cdc_pinctrl_select_sleep_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 }
551 return 0;
552}
553
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530554static int int_mi2s_get_idx_from_beid(int32_t id)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530555{
556 int idx = 0;
557
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530558 switch (id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530559 case MSM_BACKEND_DAI_INT0_MI2S_RX:
560 idx = INT0_MI2S;
561 break;
562 case MSM_BACKEND_DAI_INT2_MI2S_TX:
563 idx = INT2_MI2S;
564 break;
565 case MSM_BACKEND_DAI_INT3_MI2S_TX:
566 idx = INT3_MI2S;
567 break;
568 case MSM_BACKEND_DAI_INT4_MI2S_RX:
569 idx = INT4_MI2S;
570 break;
571 case MSM_BACKEND_DAI_INT5_MI2S_TX:
572 idx = INT5_MI2S;
573 break;
574 default:
575 idx = INT0_MI2S;
576 break;
577 }
578
579 return idx;
580}
581
582static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
583 struct snd_pcm_hw_params *params)
584{
585 struct snd_interval *rate = hw_param_interval(params,
586 SNDRV_PCM_HW_PARAM_RATE);
587
588 struct snd_interval *channels = hw_param_interval(params,
589 SNDRV_PCM_HW_PARAM_CHANNELS);
590
591 pr_debug("%s()\n", __func__);
592 rate->min = rate->max = 48000;
593 channels->min = channels->max = 2;
594
595 return 0;
596}
597
598static int int_mi2s_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
599 struct snd_pcm_hw_params *params)
600{
601 struct snd_soc_dai_link *dai_link = rtd->dai_link;
602 struct snd_interval *rate = hw_param_interval(params,
603 SNDRV_PCM_HW_PARAM_RATE);
604 struct snd_interval *channels = hw_param_interval(params,
605 SNDRV_PCM_HW_PARAM_CHANNELS);
606 int idx;
607
608 pr_debug("%s: format = %d, rate = %d\n",
609 __func__, params_format(params), params_rate(params));
610
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530611 switch (dai_link->id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530612 case MSM_BACKEND_DAI_INT0_MI2S_RX:
613 case MSM_BACKEND_DAI_INT2_MI2S_TX:
614 case MSM_BACKEND_DAI_INT3_MI2S_TX:
615 case MSM_BACKEND_DAI_INT4_MI2S_RX:
616 case MSM_BACKEND_DAI_INT5_MI2S_TX:
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530617 idx = int_mi2s_get_idx_from_beid(dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530618 rate->min = rate->max = int_mi2s_cfg[idx].sample_rate;
619 channels->min = channels->max =
620 int_mi2s_cfg[idx].channels;
621 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
622 int_mi2s_cfg[idx].bit_format);
623 break;
624 default:
625 rate->min = rate->max = SAMPLING_RATE_48KHZ;
626 break;
627 }
628 return 0;
629}
630
631static int msm_btfm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
632 struct snd_pcm_hw_params *params)
633{
634 struct snd_soc_dai_link *dai_link = rtd->dai_link;
635 struct snd_interval *rate = hw_param_interval(params,
636 SNDRV_PCM_HW_PARAM_RATE);
637 struct snd_interval *channels = hw_param_interval(params,
638 SNDRV_PCM_HW_PARAM_CHANNELS);
639
Asish Bhattacharya84f7f732017-07-25 16:29:27 +0530640 switch (dai_link->id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530641 case MSM_BACKEND_DAI_SLIMBUS_7_RX:
642 case MSM_BACKEND_DAI_SLIMBUS_7_TX:
643 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
644 bt_fm_cfg[BT_SLIM7].bit_format);
645 rate->min = rate->max = bt_fm_cfg[BT_SLIM7].sample_rate;
646 channels->min = channels->max =
647 bt_fm_cfg[BT_SLIM7].channels;
648 break;
649
650 case MSM_BACKEND_DAI_SLIMBUS_8_TX:
651 rate->min = rate->max = bt_fm_cfg[FM_SLIM8].sample_rate;
652 channels->min = channels->max =
653 bt_fm_cfg[FM_SLIM8].channels;
654 break;
655
656 default:
657 rate->min = rate->max = SAMPLING_RATE_48KHZ;
658 break;
659 }
660 return 0;
661}
662
663static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
664 struct snd_ctl_elem_value *ucontrol)
665{
666 ucontrol->value.integer.value[0] =
667 (int_mi2s_cfg[INT5_MI2S].channels/2 - 1);
668 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
669 ucontrol->value.integer.value[0]);
670 return 0;
671}
672
673static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
674 struct snd_ctl_elem_value *ucontrol)
675{
676 int_mi2s_cfg[INT5_MI2S].channels =
677 roundup_pow_of_two(ucontrol->value.integer.value[0] + 2);
678
679 pr_debug("%s: msm_vi_feed_tx_ch = %d\n",
680 __func__, int_mi2s_cfg[INT5_MI2S].channels);
681 return 1;
682}
683
684static int msm_int_enable_dig_cdc_clk(struct snd_soc_codec *codec,
685 int enable, bool dapm)
686{
687 int ret = 0;
688 struct msm_asoc_mach_data *pdata = NULL;
689 int clk_freq_in_hz;
690 bool int_mclk0_freq_chg = false;
691
692 pdata = snd_soc_card_get_drvdata(codec->component.card);
693 pr_debug("%s: enable %d mclk ref counter %d\n",
694 __func__, enable,
695 atomic_read(&pdata->int_mclk0_rsc_ref));
696 if (enable) {
697 if (int_mi2s_cfg[INT0_MI2S].sample_rate ==
698 SAMPLING_RATE_44P1KHZ) {
699 clk_freq_in_hz = NATIVE_MCLK_RATE;
700 pdata->native_clk_set = true;
701 } else {
702 clk_freq_in_hz = pdata->mclk_freq;
703 pdata->native_clk_set = false;
704 }
705
706 if (pdata->digital_cdc_core_clk.clk_freq_in_hz
707 != clk_freq_in_hz)
708 int_mclk0_freq_chg = true;
709 if (!atomic_read(&pdata->int_mclk0_rsc_ref) ||
710 int_mclk0_freq_chg) {
711 cancel_delayed_work_sync(
712 &pdata->disable_int_mclk0_work);
713 mutex_lock(&pdata->cdc_int_mclk0_mutex);
714 if (atomic_read(&pdata->int_mclk0_enabled) == false ||
715 int_mclk0_freq_chg) {
716 if (atomic_read(&pdata->int_mclk0_enabled)) {
717 pdata->digital_cdc_core_clk.enable = 0;
718 afe_set_lpass_clock_v2(
719 AFE_PORT_ID_INT0_MI2S_RX,
720 &pdata->digital_cdc_core_clk);
721 }
722 pdata->digital_cdc_core_clk.clk_freq_in_hz =
723 clk_freq_in_hz;
724 pdata->digital_cdc_core_clk.enable = 1;
725 ret = afe_set_lpass_clock_v2(
726 AFE_PORT_ID_INT0_MI2S_RX,
727 &pdata->digital_cdc_core_clk);
728 if (ret < 0) {
729 pr_err("%s: failed to enable CCLK\n",
730 __func__);
731 mutex_unlock(
732 &pdata->cdc_int_mclk0_mutex);
733 return ret;
734 }
735 pr_debug("enabled digital codec core clk\n");
736 atomic_set(&pdata->int_mclk0_enabled, true);
737 }
738 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
739 }
740 atomic_inc(&pdata->int_mclk0_rsc_ref);
741 } else {
742 cancel_delayed_work_sync(&pdata->disable_int_mclk0_work);
743 mutex_lock(&pdata->cdc_int_mclk0_mutex);
744 if (atomic_read(&pdata->int_mclk0_enabled) == true) {
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530745 pdata->digital_cdc_core_clk.clk_freq_in_hz =
746 DEFAULT_MCLK_RATE;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530747 pdata->digital_cdc_core_clk.enable = 0;
748 ret = afe_set_lpass_clock_v2(
749 AFE_PORT_ID_INT0_MI2S_RX,
750 &pdata->digital_cdc_core_clk);
751 if (ret < 0)
752 pr_err("%s: failed to disable CCLK\n",
753 __func__);
754 atomic_set(&pdata->int_mclk0_enabled, false);
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530755 atomic_set(&pdata->int_mclk0_rsc_ref, 0);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530756 }
757 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
758 }
759 return ret;
760}
761
762static int loopback_mclk_get(struct snd_kcontrol *kcontrol,
763 struct snd_ctl_elem_value *ucontrol)
764{
765 pr_debug("%s\n", __func__);
766 return 0;
767}
768
769static int loopback_mclk_put(struct snd_kcontrol *kcontrol,
770 struct snd_ctl_elem_value *ucontrol)
771{
772 int ret = -EINVAL;
773 struct msm_asoc_mach_data *pdata = NULL;
774 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
775
776 pdata = snd_soc_card_get_drvdata(codec->component.card);
777 pr_debug("%s: mclk_rsc_ref %d enable %ld\n",
778 __func__, atomic_read(&pdata->int_mclk0_rsc_ref),
779 ucontrol->value.integer.value[0]);
780 switch (ucontrol->value.integer.value[0]) {
781 case 1:
782 ret = msm_cdc_pinctrl_select_active_state(pdata->pdm_gpio_p);
783 if (ret) {
784 pr_err("%s: failed to enable the pri gpios: %d\n",
785 __func__, ret);
786 break;
787 }
788 mutex_lock(&pdata->cdc_int_mclk0_mutex);
789 if ((!atomic_read(&pdata->int_mclk0_rsc_ref)) &&
790 (!atomic_read(&pdata->int_mclk0_enabled))) {
791 pdata->digital_cdc_core_clk.enable = 1;
792 ret = afe_set_lpass_clock_v2(
793 AFE_PORT_ID_INT0_MI2S_RX,
794 &pdata->digital_cdc_core_clk);
795 if (ret < 0) {
796 pr_err("%s: failed to enable the MCLK: %d\n",
797 __func__, ret);
798 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
799 ret = msm_cdc_pinctrl_select_sleep_state(
800 pdata->pdm_gpio_p);
801 if (ret)
802 pr_err("%s: failed to disable the pri gpios: %d\n",
803 __func__, ret);
804 break;
805 }
806 atomic_set(&pdata->int_mclk0_enabled, true);
807 }
808 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
809 atomic_inc(&pdata->int_mclk0_rsc_ref);
810 msm_anlg_cdc_mclk_enable(codec, 1, true);
811 break;
812 case 0:
813 if (atomic_read(&pdata->int_mclk0_rsc_ref) <= 0)
814 break;
815 msm_anlg_cdc_mclk_enable(codec, 0, true);
816 mutex_lock(&pdata->cdc_int_mclk0_mutex);
817 if ((!atomic_dec_return(&pdata->int_mclk0_rsc_ref)) &&
818 (atomic_read(&pdata->int_mclk0_enabled))) {
819 pdata->digital_cdc_core_clk.enable = 0;
820 ret = afe_set_lpass_clock_v2(
821 AFE_PORT_ID_INT0_MI2S_RX,
822 &pdata->digital_cdc_core_clk);
823 if (ret < 0) {
824 pr_err("%s: failed to disable the CCLK: %d\n",
825 __func__, ret);
826 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
827 break;
828 }
829 atomic_set(&pdata->int_mclk0_enabled, false);
830 }
831 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
832 ret = msm_cdc_pinctrl_select_sleep_state(pdata->pdm_gpio_p);
833 if (ret)
834 pr_err("%s: failed to disable the pri gpios: %d\n",
835 __func__, ret);
836 break;
837 default:
838 pr_err("%s: Unexpected input value\n", __func__);
839 break;
840 }
841 return ret;
842}
843
844static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol,
845 struct snd_ctl_elem_value *ucontrol)
846{
847 /*
848 * Slimbus_7_Rx/Tx sample rate values should always be in sync (same)
849 * when used for BT_SCO use case. Return either Rx or Tx sample rate
850 * value.
851 */
852 switch (bt_fm_cfg[BT_SLIM7].sample_rate) {
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530853 case SAMPLING_RATE_96KHZ:
854 ucontrol->value.integer.value[0] = 5;
855 break;
856 case SAMPLING_RATE_88P2KHZ:
857 ucontrol->value.integer.value[0] = 4;
858 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530859 case SAMPLING_RATE_48KHZ:
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530860 ucontrol->value.integer.value[0] = 3;
861 break;
862 case SAMPLING_RATE_44P1KHZ:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530863 ucontrol->value.integer.value[0] = 2;
864 break;
865 case SAMPLING_RATE_16KHZ:
866 ucontrol->value.integer.value[0] = 1;
867 break;
868 case SAMPLING_RATE_8KHZ:
869 default:
870 ucontrol->value.integer.value[0] = 0;
871 break;
872 }
873 pr_debug("%s: sample rate = %d", __func__,
874 bt_fm_cfg[BT_SLIM7].sample_rate);
875
876 return 0;
877}
878
879static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol,
880 struct snd_ctl_elem_value *ucontrol)
881{
882 switch (ucontrol->value.integer.value[0]) {
883 case 1:
884 bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_16KHZ;
885 break;
886 case 2:
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530887 bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_44P1KHZ;
888 break;
889 case 3:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530890 bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_48KHZ;
891 break;
Preetam Singh Ranawat66f1f212017-12-05 15:30:24 +0530892 case 4:
893 bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_88P2KHZ;
894 break;
895 case 5:
896 bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_96KHZ;
897 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530898 case 0:
899 default:
900 bt_fm_cfg[BT_SLIM7].sample_rate = SAMPLING_RATE_8KHZ;
901 break;
902 }
903 pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n",
904 __func__,
905 bt_fm_cfg[BT_SLIM7].sample_rate,
906 ucontrol->value.enumerated.item[0]);
907
908 return 0;
909}
910
911static const struct snd_kcontrol_new msm_snd_controls[] = {
912 SOC_ENUM_EXT("INT0_MI2S_RX Format", int0_mi2s_rx_format,
913 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
914 SOC_ENUM_EXT("INT2_MI2S_TX Format", int2_mi2s_tx_format,
915 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
916 SOC_ENUM_EXT("INT3_MI2S_TX Format", int3_mi2s_tx_format,
917 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
918 SOC_ENUM_EXT("INT0_MI2S_RX SampleRate", int0_mi2s_rx_sample_rate,
919 int_mi2s_sample_rate_get,
920 int_mi2s_sample_rate_put),
921 SOC_ENUM_EXT("INT2_MI2S_TX SampleRate", int2_mi2s_tx_sample_rate,
922 int_mi2s_sample_rate_get,
923 int_mi2s_sample_rate_put),
924 SOC_ENUM_EXT("INT3_MI2S_TX SampleRate", int3_mi2s_tx_sample_rate,
925 int_mi2s_sample_rate_get,
926 int_mi2s_sample_rate_put),
927 SOC_ENUM_EXT("INT0_MI2S_RX Channels", int0_mi2s_rx_chs,
928 int_mi2s_ch_get, int_mi2s_ch_put),
929 SOC_ENUM_EXT("INT2_MI2S_TX Channels", int2_mi2s_tx_chs,
930 int_mi2s_ch_get, int_mi2s_ch_put),
931 SOC_ENUM_EXT("INT3_MI2S_TX Channels", int3_mi2s_tx_chs,
932 int_mi2s_ch_get, int_mi2s_ch_put),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530933 SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
934 msm_bt_sample_rate_get,
935 msm_bt_sample_rate_put),
936};
937
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +0530938static const struct snd_kcontrol_new msm_loopback_snd_controls[] = {
939 SOC_ENUM_EXT("Loopback MCLK", loopback_mclk_en,
940 loopback_mclk_get, loopback_mclk_put),
941};
942
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530943static const struct snd_kcontrol_new msm_sdw_controls[] = {
944 SOC_ENUM_EXT("INT4_MI2S_RX Format", int4_mi2s_rx_format,
945 int_mi2s_bit_format_get, int_mi2s_bit_format_put),
946 SOC_ENUM_EXT("INT4_MI2S_RX SampleRate", int4_mi2s_rx_sample_rate,
947 int_mi2s_sample_rate_get,
948 int_mi2s_sample_rate_put),
949 SOC_ENUM_EXT("INT4_MI2S_RX Channels", int4_mi2s_rx_chs,
950 int_mi2s_ch_get, int_mi2s_ch_put),
951 SOC_ENUM_EXT("VI_FEED_TX Channels", int5_mi2s_tx_chs,
952 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
953};
954
955static int msm_dmic_event(struct snd_soc_dapm_widget *w,
956 struct snd_kcontrol *kcontrol, int event)
957{
958 struct msm_asoc_mach_data *pdata = NULL;
959 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
960 int ret = 0;
961
962 pdata = snd_soc_card_get_drvdata(codec->component.card);
963 pr_debug("%s: event = %d\n", __func__, event);
964 switch (event) {
965 case SND_SOC_DAPM_PRE_PMU:
966 ret = msm_cdc_pinctrl_select_active_state(pdata->dmic_gpio_p);
967 if (ret < 0) {
968 pr_err("%s: gpio set cannot be activated %sd",
969 __func__, "dmic_gpio");
970 return ret;
971 }
972 break;
973 case SND_SOC_DAPM_POST_PMD:
974 ret = msm_cdc_pinctrl_select_sleep_state(pdata->dmic_gpio_p);
975 if (ret < 0) {
976 pr_err("%s: gpio set cannot be de-activated %sd",
977 __func__, "dmic_gpio");
978 return ret;
979 }
980 break;
981 default:
982 pr_err("%s: invalid DAPM event %d\n", __func__, event);
983 return -EINVAL;
984 }
985 return 0;
986}
987
988static int msm_int_mclk0_event(struct snd_soc_dapm_widget *w,
989 struct snd_kcontrol *kcontrol, int event)
990{
991 struct msm_asoc_mach_data *pdata = NULL;
992 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
993 int ret = 0;
994
995 pdata = snd_soc_card_get_drvdata(codec->component.card);
996 pr_debug("%s: event = %d\n", __func__, event);
997 switch (event) {
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +0530998 case SND_SOC_DAPM_PRE_PMU:
999 ret = msm_cdc_pinctrl_select_active_state(pdata->pdm_gpio_p);
1000 if (ret < 0) {
1001 pr_err("%s: gpio set cannot be activated %s\n",
1002 __func__, "int_pdm");
1003 return ret;
1004 }
1005 msm_int_enable_dig_cdc_clk(codec, 1, true);
1006 msm_anlg_cdc_mclk_enable(codec, 1, true);
1007 break;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301008 case SND_SOC_DAPM_POST_PMD:
1009 pr_debug("%s: mclk_res_ref = %d\n",
1010 __func__, atomic_read(&pdata->int_mclk0_rsc_ref));
1011 ret = msm_cdc_pinctrl_select_sleep_state(pdata->pdm_gpio_p);
1012 if (ret < 0) {
1013 pr_err("%s: gpio set cannot be de-activated %sd",
1014 __func__, "int_pdm");
1015 return ret;
1016 }
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05301017 pr_debug("%s: disabling MCLK\n", __func__);
1018 /* disable the codec mclk config*/
1019 msm_anlg_cdc_mclk_enable(codec, 0, true);
1020 msm_int_enable_dig_cdc_clk(codec, 0, true);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301021 break;
1022 default:
1023 pr_err("%s: invalid DAPM event %d\n", __func__, event);
1024 return -EINVAL;
1025 }
1026 return 0;
1027}
1028
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301029static int msm_int_dig_mclk0_event(struct snd_soc_dapm_widget *w,
1030 struct snd_kcontrol *kcontrol, int event)
1031{
1032 struct msm_asoc_mach_data *pdata = NULL;
1033 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1034
1035 pdata = snd_soc_card_get_drvdata(codec->component.card);
1036 pr_debug("%s: event = %d\n", __func__, event);
1037 switch (event) {
Ramu Gottipati11524972018-03-29 16:46:35 +05301038 case SND_SOC_DAPM_PRE_PMU:
1039 msm_digcdc_mclk_enable(codec, 1, true);
1040 msm_int_enable_dig_cdc_clk(codec, 1, true);
1041 break;
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301042 case SND_SOC_DAPM_POST_PMD:
Ramu Gottipati11524972018-03-29 16:46:35 +05301043 msm_digcdc_mclk_enable(codec, 0, true);
1044 msm_int_enable_dig_cdc_clk(codec, 0, true);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301045 break;
1046 default:
1047 pr_err("%s: invalid DAPM event %d\n", __func__, event);
1048 return -EINVAL;
1049 }
1050 return 0;
1051}
1052
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301053static int int_mi2s_get_port_id(int id)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301054{
1055 int afe_port_id;
1056
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301057 switch (id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301058 case MSM_BACKEND_DAI_INT0_MI2S_RX:
1059 afe_port_id = AFE_PORT_ID_INT0_MI2S_RX;
1060 break;
1061 case MSM_BACKEND_DAI_INT2_MI2S_TX:
1062 afe_port_id = AFE_PORT_ID_INT2_MI2S_TX;
1063 break;
1064 case MSM_BACKEND_DAI_INT3_MI2S_TX:
1065 afe_port_id = AFE_PORT_ID_INT3_MI2S_TX;
1066 break;
1067 case MSM_BACKEND_DAI_INT4_MI2S_RX:
1068 afe_port_id = AFE_PORT_ID_INT4_MI2S_RX;
1069 break;
1070 case MSM_BACKEND_DAI_INT5_MI2S_TX:
1071 afe_port_id = AFE_PORT_ID_INT5_MI2S_TX;
1072 break;
1073 default:
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301074 pr_err("%s: Invalid id: %d\n", __func__, id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301075 afe_port_id = -EINVAL;
1076 }
1077
1078 return afe_port_id;
1079}
1080
1081static int int_mi2s_get_index(int port_id)
1082{
1083 int index;
1084
1085 switch (port_id) {
1086 case AFE_PORT_ID_INT0_MI2S_RX:
1087 index = INT0_MI2S;
1088 break;
1089 case AFE_PORT_ID_INT2_MI2S_TX:
1090 index = INT2_MI2S;
1091 break;
1092 case AFE_PORT_ID_INT3_MI2S_TX:
1093 index = INT3_MI2S;
1094 break;
1095 case AFE_PORT_ID_INT4_MI2S_RX:
1096 index = INT4_MI2S;
1097 break;
1098 case AFE_PORT_ID_INT5_MI2S_TX:
1099 index = INT5_MI2S;
1100 break;
1101 default:
1102 pr_err("%s: Invalid port_id: %d\n", __func__, port_id);
1103 index = -EINVAL;
1104 }
1105
1106 return index;
1107}
1108
1109static u32 get_int_mi2s_bits_per_sample(u32 bit_format)
1110{
1111 u32 bit_per_sample;
1112
1113 switch (bit_format) {
1114 case SNDRV_PCM_FORMAT_S24_3LE:
1115 case SNDRV_PCM_FORMAT_S24_LE:
1116 bit_per_sample = 32;
1117 break;
1118 case SNDRV_PCM_FORMAT_S16_LE:
1119 default:
1120 bit_per_sample = 16;
1121 break;
1122 }
1123
1124 return bit_per_sample;
1125}
1126
1127static void update_int_mi2s_clk_val(int idx, int stream)
1128{
1129 u32 bit_per_sample;
1130
1131 bit_per_sample =
1132 get_int_mi2s_bits_per_sample(int_mi2s_cfg[idx].bit_format);
1133 int_mi2s_clk[idx].clk_freq_in_hz =
1134 (int_mi2s_cfg[idx].sample_rate * 2 * bit_per_sample);
1135}
1136
1137static int int_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
1138{
1139 int ret = 0;
1140 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1141 int port_id = 0;
1142 int index;
1143
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301144 port_id = int_mi2s_get_port_id(rtd->dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301145 if (port_id < 0) {
1146 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
1147 ret = port_id;
1148 goto done;
1149 }
1150 index = int_mi2s_get_index(port_id);
1151 if (index < 0) {
1152 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
1153 ret = port_id;
1154 goto done;
1155 }
1156 if (enable) {
1157 update_int_mi2s_clk_val(index, substream->stream);
1158 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
1159 int_mi2s_clk[index].clk_freq_in_hz);
1160 }
1161
1162 int_mi2s_clk[index].enable = enable;
1163 ret = afe_set_lpass_clock_v2(port_id,
1164 &int_mi2s_clk[index]);
1165 if (ret < 0) {
1166 dev_err(rtd->card->dev,
1167 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
1168 __func__, port_id, ret);
1169 goto done;
1170 }
1171
1172done:
1173 return ret;
1174}
1175
1176static int msm_sdw_mi2s_snd_startup(struct snd_pcm_substream *substream)
1177{
1178 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1179 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1180 int ret = 0;
1181
1182 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1183 substream->name, substream->stream);
1184
1185 ret = int_mi2s_set_sclk(substream, true);
1186 if (ret < 0) {
1187 pr_err("%s: failed to enable sclk %d\n",
1188 __func__, ret);
1189 return ret;
1190 }
1191 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1192 if (ret < 0)
1193 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1194
1195 return ret;
1196}
1197
1198static void msm_sdw_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
1199{
1200 int ret;
1201
1202 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1203 substream->name, substream->stream);
1204
1205 ret = int_mi2s_set_sclk(substream, false);
1206 if (ret < 0)
1207 pr_err("%s:clock disable failed; ret=%d\n", __func__,
1208 ret);
1209}
1210
1211static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream)
1212{
1213 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1214 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1215 struct snd_soc_codec *codec = rtd->codec_dais[ANA_CDC]->codec;
1216 int ret = 0;
1217 struct msm_asoc_mach_data *pdata = NULL;
1218
1219 pdata = snd_soc_card_get_drvdata(codec->component.card);
1220 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1221 substream->name, substream->stream);
1222
1223 ret = int_mi2s_set_sclk(substream, true);
1224 if (ret < 0) {
1225 pr_err("%s: failed to enable sclk %d\n",
1226 __func__, ret);
1227 return ret;
1228 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301229 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1230 if (ret < 0)
1231 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1232
1233 return ret;
1234}
1235
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301236static int msm_int_dig_mi2s_snd_startup(struct snd_pcm_substream *substream)
1237{
1238 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1239 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1240 struct snd_soc_codec *codec = rtd->codec;
1241 int ret = 0;
1242 struct msm_asoc_mach_data *pdata = NULL;
1243
1244 pdata = snd_soc_card_get_drvdata(codec->component.card);
1245 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1246 substream->name, substream->stream);
1247
1248 ret = int_mi2s_set_sclk(substream, true);
1249 if (ret < 0) {
1250 pr_err("%s: failed to enable sclk %d\n",
1251 __func__, ret);
1252 return ret;
1253 }
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301254 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1255 if (ret < 0)
1256 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1257
1258 return ret;
1259}
1260
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301261static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
1262{
1263 int ret;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301264
1265 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1266 substream->name, substream->stream);
1267
1268 ret = int_mi2s_set_sclk(substream, false);
1269 if (ret < 0)
1270 pr_err("%s:clock disable failed; ret=%d\n", __func__,
1271 ret);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301272}
1273
1274static void *def_msm_int_wcd_mbhc_cal(void)
1275{
1276 void *msm_int_wcd_cal;
1277 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
1278 u16 *btn_low, *btn_high;
1279
1280 msm_int_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
1281 WCD_MBHC_DEF_RLOADS), GFP_KERNEL);
1282 if (!msm_int_wcd_cal)
1283 return NULL;
1284
1285#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(msm_int_wcd_cal)->X) = (Y))
1286 S(v_hs_max, 1500);
1287#undef S
1288#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal)->X) = (Y))
1289 S(num_btn, WCD_MBHC_DEF_BUTTONS);
1290#undef S
1291
1292
1293 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal);
1294 btn_low = btn_cfg->_v_btn_low;
1295 btn_high = ((void *)&btn_cfg->_v_btn_low) +
1296 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
1297
1298 /*
1299 * In SW we are maintaining two sets of threshold register
1300 * one for current source and another for Micbias.
1301 * all btn_low corresponds to threshold for current source
1302 * all bt_high corresponds to threshold for Micbias
1303 * Below thresholds are based on following resistances
1304 * 0-70 == Button 0
1305 * 110-180 == Button 1
1306 * 210-290 == Button 2
1307 * 360-680 == Button 3
1308 */
1309 btn_low[0] = 75;
1310 btn_high[0] = 75;
1311 btn_low[1] = 150;
1312 btn_high[1] = 150;
1313 btn_low[2] = 225;
1314 btn_high[2] = 225;
1315 btn_low[3] = 450;
1316 btn_high[3] = 450;
1317 btn_low[4] = 500;
1318 btn_high[4] = 500;
1319
1320 return msm_int_wcd_cal;
1321}
1322
1323static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
1324{
1325 struct snd_soc_codec *dig_cdc = rtd->codec_dais[DIG_CDC]->codec;
1326 struct snd_soc_codec *ana_cdc = rtd->codec_dais[ANA_CDC]->codec;
1327 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(ana_cdc);
1328 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1329 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
1330 struct snd_card *card;
1331 int ret = -ENOMEM;
1332
1333 pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev));
1334
1335 ret = snd_soc_add_codec_controls(ana_cdc, msm_snd_controls,
1336 ARRAY_SIZE(msm_snd_controls));
1337 if (ret < 0) {
1338 pr_err("%s: add_codec_controls failed: %d\n",
1339 __func__, ret);
1340 return ret;
1341 }
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301342
1343 ret = snd_soc_add_codec_controls(ana_cdc, msm_loopback_snd_controls,
1344 ARRAY_SIZE(msm_loopback_snd_controls));
1345 if (ret < 0) {
1346 pr_err("%s: add_codec_controls failed: %d\n",
1347 __func__, ret);
1348 return ret;
1349 }
1350
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301351 ret = snd_soc_add_codec_controls(ana_cdc, msm_common_snd_controls,
1352 msm_common_snd_controls_size());
1353 if (ret < 0) {
1354 pr_err("%s: add common snd controls failed: %d\n",
1355 __func__, ret);
1356 return ret;
1357 }
1358
1359 snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
1360 ARRAY_SIZE(msm_int_dapm_widgets));
1361
1362 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
1363 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
1364 snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic");
1365 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
1366 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
1367
1368 snd_soc_dapm_ignore_suspend(dapm, "EAR");
1369 snd_soc_dapm_ignore_suspend(dapm, "HEADPHONE");
1370 snd_soc_dapm_ignore_suspend(dapm, "SPK_OUT");
1371 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
1372 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
1373 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
Laxminath Kasam52697fe2017-11-29 15:44:14 +05301374 snd_soc_dapm_sync(dapm);
1375
1376 dapm = snd_soc_codec_get_dapm(dig_cdc);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301377 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
1378 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
1379 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
1380 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
1381
1382 snd_soc_dapm_sync(dapm);
1383
1384 msm_anlg_cdc_spk_ext_pa_cb(enable_spk_ext_pa, ana_cdc);
1385 msm_dig_cdc_hph_comp_cb(msm_config_hph_compander_gpio, dig_cdc);
1386
1387 card = rtd->card->snd_card;
1388 if (!codec_root)
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301389 codec_root = snd_info_create_subdir(card->module, "codecs",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301390 card->proc_root);
1391 if (!codec_root) {
1392 pr_debug("%s: Cannot create codecs module entry\n",
1393 __func__);
1394 goto done;
1395 }
1396 pdata->codec_root = codec_root;
1397 msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
1398 msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc);
1399done:
Laxminath Kasam38070be2017-08-17 18:21:59 +05301400 msm_set_codec_reg_done(true);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301401 return 0;
1402}
1403
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301404static int msm_dig_audrx_init(struct snd_soc_pcm_runtime *rtd)
1405{
1406 struct snd_soc_codec *dig_cdc = rtd->codec;
1407 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(dig_cdc);
1408 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1409 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
1410 struct snd_card *card;
1411 int ret = -ENOMEM;
1412
1413 pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev));
1414
1415 ret = snd_soc_add_codec_controls(dig_cdc, msm_snd_controls,
1416 ARRAY_SIZE(msm_snd_controls));
1417 if (ret < 0) {
1418 pr_err("%s: add_codec_controls failed: %d\n",
1419 __func__, ret);
1420 return ret;
1421 }
1422 ret = snd_soc_add_codec_controls(dig_cdc, msm_common_snd_controls,
1423 msm_common_snd_controls_size());
1424 if (ret < 0) {
1425 pr_err("%s: add common snd controls failed: %d\n",
1426 __func__, ret);
1427 return ret;
1428 }
1429
1430 snd_soc_dapm_new_controls(dapm, msm_int_dig_dapm_widgets,
1431 ARRAY_SIZE(msm_int_dig_dapm_widgets));
1432
1433 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
1434 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
1435
1436 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
1437 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
1438 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
1439 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
1440
1441 card = rtd->card->snd_card;
1442 if (!codec_root)
1443 codec_root = snd_info_create_subdir(card->module, "codecs",
1444 card->proc_root);
1445 if (!codec_root) {
1446 pr_debug("%s: Cannot create codecs module entry\n",
1447 __func__);
1448 goto done;
1449 }
1450 pdata->codec_root = codec_root;
1451 msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
1452done:
1453 msm_set_codec_reg_done(true);
1454 return 0;
1455}
1456
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301457static int msm_sdw_audrx_init(struct snd_soc_pcm_runtime *rtd)
1458{
1459 struct snd_soc_codec *codec = rtd->codec;
1460 struct snd_soc_dapm_context *dapm =
1461 snd_soc_codec_get_dapm(codec);
1462 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301463 struct snd_soc_component *aux_comp;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301464 struct snd_card *card;
1465
1466 snd_soc_add_codec_controls(codec, msm_sdw_controls,
1467 ARRAY_SIZE(msm_sdw_controls));
1468
1469 snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW Playback");
1470 snd_soc_dapm_ignore_suspend(dapm, "VIfeed_SDW");
1471 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
1472 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
1473 snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW VI");
1474 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_SDW");
1475
1476 snd_soc_dapm_sync(dapm);
1477
1478 /*
1479 * Send speaker configuration only for WSA8810.
1480 * Default configuration is for WSA8815.
1481 */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301482 pr_debug("%s: Number of aux devices: %d\n",
1483 __func__, rtd->card->num_aux_devs);
1484 if (rtd->card->num_aux_devs &&
1485 !list_empty(&rtd->card->aux_comp_list)) {
1486 aux_comp = list_first_entry(&rtd->card->aux_comp_list,
1487 struct snd_soc_component, list_aux);
1488 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
1489 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301490 msm_sdw_set_spkr_mode(rtd->codec, SPKR_MODE_1);
1491 msm_sdw_set_spkr_gain_offset(rtd->codec,
1492 RX_GAIN_OFFSET_M1P5_DB);
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301493 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301494 }
1495 card = rtd->card->snd_card;
1496 if (!codec_root)
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301497 codec_root = snd_info_create_subdir(card->module, "codecs",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301498 card->proc_root);
1499 if (!codec_root) {
1500 pr_debug("%s: Cannot create codecs module entry\n",
1501 __func__);
1502 goto done;
1503 }
1504 pdata->codec_root = codec_root;
1505 msm_sdw_codec_info_create_codec_entry(codec_root, codec);
1506done:
1507 return 0;
1508}
1509
1510static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
1511{
1512 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
1513 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161};
1514 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1515
1516 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
1517 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
1518}
1519
1520static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
1521 struct snd_pcm_hw_params *params)
1522{
1523 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1524 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1525 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1526 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1527 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
1528 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
1529 int ret;
1530
1531 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
1532 codec_dai->name, codec_dai->id);
1533 ret = snd_soc_dai_get_channel_map(codec_dai,
1534 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
1535 if (ret) {
1536 dev_err(rtd->dev,
1537 "%s: failed to get BTFM codec chan map\n, err:%d\n",
1538 __func__, ret);
1539 goto exit;
1540 }
1541
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301542 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) id %d\n",
1543 __func__, tx_ch_cnt, dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301544
1545 ret = snd_soc_dai_set_channel_map(cpu_dai,
1546 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
1547 if (ret)
1548 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
1549 __func__, ret);
1550
1551exit:
1552 return ret;
1553}
1554
1555static unsigned int tdm_param_set_slot_mask(u16 port_id, int slot_width,
1556 int slots)
1557{
1558 unsigned int slot_mask = 0;
1559 int i, j;
1560 unsigned int *slot_offset;
1561
1562 for (i = TDM_0; i < TDM_PORT_MAX; i++) {
1563 slot_offset = tdm_slot_offset[i];
1564
1565 for (j = 0; j < TDM_SLOT_OFFSET_MAX; j++) {
1566 if (slot_offset[j] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1567 slot_mask |=
1568 (1 << ((slot_offset[j] * 8) / slot_width));
1569 else
1570 break;
1571 }
1572 }
1573
1574 return slot_mask;
1575}
1576
1577static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream,
1578 struct snd_pcm_hw_params *params)
1579{
1580 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1581 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1582 int ret = 0;
1583 int channels, slot_width, slots;
1584 unsigned int slot_mask;
1585 unsigned int *slot_offset;
1586 int offset_channels = 0;
1587 int i;
1588
1589 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
1590
1591 channels = params_channels(params);
1592 switch (channels) {
1593 case 1:
1594 case 2:
1595 case 3:
1596 case 4:
1597 case 5:
1598 case 6:
1599 case 7:
1600 case 8:
1601 switch (params_format(params)) {
1602 case SNDRV_PCM_FORMAT_S32_LE:
1603 case SNDRV_PCM_FORMAT_S24_LE:
1604 case SNDRV_PCM_FORMAT_S16_LE:
1605 /*
1606 * up to 8 channels HW config should
1607 * use 32 bit slot width for max support of
1608 * stream bit width. (slot_width > bit_width)
1609 */
1610 slot_width = 32;
1611 break;
1612 default:
1613 pr_err("%s: invalid param format 0x%x\n",
1614 __func__, params_format(params));
1615 return -EINVAL;
1616 }
1617 slots = 8;
1618 slot_mask = tdm_param_set_slot_mask(cpu_dai->id,
1619 slot_width,
1620 slots);
1621 if (!slot_mask) {
1622 pr_err("%s: invalid slot_mask 0x%x\n",
1623 __func__, slot_mask);
1624 return -EINVAL;
1625 }
1626 break;
1627 default:
1628 pr_err("%s: invalid param channels %d\n",
1629 __func__, channels);
1630 return -EINVAL;
1631 }
1632 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
1633 switch (cpu_dai->id) {
1634 case AFE_PORT_ID_PRIMARY_TDM_RX:
1635 case AFE_PORT_ID_SECONDARY_TDM_RX:
1636 case AFE_PORT_ID_TERTIARY_TDM_RX:
1637 case AFE_PORT_ID_QUATERNARY_TDM_RX:
Rohit Kumard1754482017-09-10 22:57:39 +05301638 case AFE_PORT_ID_QUINARY_TDM_RX:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301639 case AFE_PORT_ID_PRIMARY_TDM_TX:
1640 case AFE_PORT_ID_SECONDARY_TDM_TX:
1641 case AFE_PORT_ID_TERTIARY_TDM_TX:
1642 case AFE_PORT_ID_QUATERNARY_TDM_TX:
Rohit Kumard1754482017-09-10 22:57:39 +05301643 case AFE_PORT_ID_QUINARY_TDM_TX:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301644 slot_offset = tdm_slot_offset[TDM_0];
1645 break;
1646 default:
1647 pr_err("%s: dai id 0x%x not supported\n",
1648 __func__, cpu_dai->id);
1649 return -EINVAL;
1650 }
1651
1652 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
1653 if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1654 offset_channels++;
1655 else
1656 break;
1657 }
1658
1659 if (offset_channels == 0) {
1660 pr_err("%s: slot offset not supported, offset_channels %d\n",
1661 __func__, offset_channels);
1662 return -EINVAL;
1663 }
1664
1665 if (channels > offset_channels) {
1666 pr_err("%s: channels %d exceed offset_channels %d\n",
1667 __func__, channels, offset_channels);
1668 return -EINVAL;
1669 }
1670
1671 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1672 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
1673 slots, slot_width);
1674 if (ret < 0) {
1675 pr_err("%s: failed to set tdm slot, err:%d\n",
1676 __func__, ret);
1677 goto end;
1678 }
1679
1680 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
1681 channels, slot_offset);
1682 if (ret < 0) {
1683 pr_err("%s: failed to set channel map, err:%d\n",
1684 __func__, ret);
1685 goto end;
1686 }
1687 } else {
1688 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
1689 slots, slot_width);
1690 if (ret < 0) {
1691 pr_err("%s: failed to set tdm slot, err:%d\n",
1692 __func__, ret);
1693 goto end;
1694 }
1695
1696 ret = snd_soc_dai_set_channel_map(cpu_dai, channels,
1697 slot_offset, 0, NULL);
1698 if (ret < 0) {
1699 pr_err("%s: failed to set channel map, err:%d\n",
1700 __func__, ret);
1701 goto end;
1702 }
1703 }
1704end:
1705 return ret;
1706}
1707
1708static int msm_snd_card_late_probe(struct snd_soc_card *card)
1709{
1710 const char *be_dl_name = LPASS_BE_INT0_MI2S_RX;
1711 struct snd_soc_codec *ana_cdc;
1712 struct snd_soc_pcm_runtime *rtd;
1713 int ret = 0;
1714
1715 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
1716 if (!rtd) {
1717 dev_err(card->dev,
1718 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
1719 __func__, be_dl_name);
1720 return -EINVAL;
1721 }
1722
1723 ana_cdc = rtd->codec_dais[ANA_CDC]->codec;
1724 mbhc_cfg_ptr->calibration = def_msm_int_wcd_mbhc_cal();
1725 if (!mbhc_cfg_ptr->calibration)
1726 return -ENOMEM;
1727
1728 ret = msm_anlg_cdc_hs_detect(ana_cdc, mbhc_cfg_ptr);
1729 if (ret) {
1730 dev_err(card->dev,
1731 "%s: msm_anlg_cdc_hs_detect failed\n", __func__);
1732 kfree(mbhc_cfg_ptr->calibration);
1733 }
1734
1735 return ret;
1736}
1737
1738static struct snd_soc_ops msm_tdm_be_ops = {
1739 .hw_params = msm_tdm_snd_hw_params
1740};
1741
1742static struct snd_soc_ops msm_wcn_ops = {
1743 .hw_params = msm_wcn_hw_params,
1744};
1745
1746static struct snd_soc_ops msm_mi2s_be_ops = {
1747 .startup = msm_mi2s_snd_startup,
1748 .shutdown = msm_mi2s_snd_shutdown,
1749};
1750
1751static struct snd_soc_ops msm_aux_pcm_be_ops = {
1752 .startup = msm_aux_pcm_snd_startup,
1753 .shutdown = msm_aux_pcm_snd_shutdown,
1754};
1755
1756static struct snd_soc_ops msm_int_mi2s_be_ops = {
1757 .startup = msm_int_mi2s_snd_startup,
1758 .shutdown = msm_int_mi2s_snd_shutdown,
1759};
1760
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301761static struct snd_soc_ops msm_int_dig_mi2s_be_ops = {
1762 .startup = msm_int_dig_mi2s_snd_startup,
1763 .shutdown = msm_int_mi2s_snd_shutdown,
1764};
1765
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301766static struct snd_soc_ops msm_sdw_mi2s_be_ops = {
1767 .startup = msm_sdw_mi2s_snd_startup,
1768 .shutdown = msm_sdw_mi2s_snd_shutdown,
1769};
1770
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05301771static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
1772{
1773 cpumask_t mask;
1774
1775 if (pm_qos_request_active(&substream->latency_pm_qos_req))
1776 pm_qos_remove_request(&substream->latency_pm_qos_req);
1777
1778 cpumask_clear(&mask);
1779 cpumask_set_cpu(1, &mask); /* affine to core 1 */
1780 cpumask_set_cpu(2, &mask); /* affine to core 2 */
1781 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
1782
1783 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
1784
1785 pm_qos_add_request(&substream->latency_pm_qos_req,
1786 PM_QOS_CPU_DMA_LATENCY,
1787 MSM_LL_QOS_VALUE);
1788 return 0;
1789}
1790
1791static struct snd_soc_ops msm_fe_qos_ops = {
1792 .prepare = msm_fe_qos_prepare,
1793};
1794
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301795struct snd_soc_dai_link_component dlc_rx1[] = {
1796 {
1797 .of_node = NULL,
1798 .dai_name = "msm_dig_cdc_dai_rx1",
1799 },
1800 {
1801 .of_node = NULL,
1802 .dai_name = "msm_anlg_cdc_i2s_rx1",
1803 },
1804};
1805
1806struct snd_soc_dai_link_component dlc_tx1[] = {
1807 {
1808 .of_node = NULL,
1809 .dai_name = "msm_dig_cdc_dai_tx1",
1810 },
1811 {
1812 .of_node = NULL,
1813 .dai_name = "msm_anlg_cdc_i2s_tx1",
1814 },
1815};
1816
1817struct snd_soc_dai_link_component dlc_tx2[] = {
1818 {
1819 .of_node = NULL,
1820 .dai_name = "msm_dig_cdc_dai_tx2",
1821 },
1822 {
1823 .of_node = NULL,
1824 .dai_name = "msm_anlg_cdc_i2s_tx2",
1825 },
1826};
1827
1828/* Digital audio interface glue - connects codec <---> CPU */
1829static struct snd_soc_dai_link msm_int_dai[] = {
1830 /* FrontEnd DAI Links */
1831 {/* hw:x,0 */
1832 .name = MSM_DAILINK_NAME(Media1),
1833 .stream_name = "MultiMedia1",
1834 .cpu_dai_name = "MultiMedia1",
1835 .platform_name = "msm-pcm-dsp.0",
1836 .dynamic = 1,
1837 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1838 SND_SOC_DPCM_TRIGGER_POST},
1839 .codec_dai_name = "snd-soc-dummy-dai",
1840 .codec_name = "snd-soc-dummy",
1841 .ignore_suspend = 1,
1842 .dpcm_playback = 1,
1843 .dpcm_capture = 1,
1844 /* this dai link has playback support */
1845 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301846 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301847 },
1848 {/* hw:x,1 */
1849 .name = MSM_DAILINK_NAME(Media2),
1850 .stream_name = "MultiMedia2",
1851 .cpu_dai_name = "MultiMedia2",
1852 .platform_name = "msm-pcm-dsp.0",
1853 .dynamic = 1,
1854 .dpcm_playback = 1,
1855 .dpcm_capture = 1,
1856 .codec_dai_name = "snd-soc-dummy-dai",
1857 .codec_name = "snd-soc-dummy",
1858 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1859 SND_SOC_DPCM_TRIGGER_POST},
1860 .ignore_suspend = 1,
1861 /* this dai link has playback support */
1862 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301863 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301864 },
1865 {/* hw:x,2 */
1866 .name = "VoiceMMode1",
1867 .stream_name = "VoiceMMode1",
1868 .cpu_dai_name = "VoiceMMode1",
1869 .platform_name = "msm-pcm-voice",
1870 .dynamic = 1,
1871 .dpcm_capture = 1,
1872 .dpcm_playback = 1,
1873 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1874 SND_SOC_DPCM_TRIGGER_POST},
1875 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1876 .ignore_suspend = 1,
1877 .ignore_pmdown_time = 1,
1878 .codec_dai_name = "snd-soc-dummy-dai",
1879 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301880 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301881 },
1882 {/* hw:x,3 */
1883 .name = "MSM VoIP",
1884 .stream_name = "VoIP",
1885 .cpu_dai_name = "VoIP",
1886 .platform_name = "msm-voip-dsp",
1887 .dynamic = 1,
1888 .dpcm_playback = 1,
1889 .dpcm_capture = 1,
1890 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1891 SND_SOC_DPCM_TRIGGER_POST},
1892 .codec_dai_name = "snd-soc-dummy-dai",
1893 .codec_name = "snd-soc-dummy",
1894 .ignore_suspend = 1,
1895 /* this dai link has playback support */
1896 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301897 .id = MSM_FRONTEND_DAI_VOIP,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301898 },
1899 {/* hw:x,4 */
1900 .name = MSM_DAILINK_NAME(ULL),
1901 .stream_name = "ULL",
1902 .cpu_dai_name = "MultiMedia3",
1903 .platform_name = "msm-pcm-dsp.2",
1904 .dynamic = 1,
1905 .dpcm_playback = 1,
1906 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1907 SND_SOC_DPCM_TRIGGER_POST},
1908 .codec_dai_name = "snd-soc-dummy-dai",
1909 .codec_name = "snd-soc-dummy",
1910 .ignore_suspend = 1,
1911 /* this dai link has playback support */
1912 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301913 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301914 },
1915 /* Hostless PCM purpose */
1916 {/* hw:x,5 */
1917 .name = "INT4 MI2S_RX Hostless",
1918 .stream_name = "INT4 MI2S_RX Hostless",
1919 .cpu_dai_name = "INT4_MI2S_RX_HOSTLESS",
1920 .platform_name = "msm-pcm-hostless",
1921 .dynamic = 1,
1922 .dpcm_playback = 1,
1923 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1924 SND_SOC_DPCM_TRIGGER_POST},
1925 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1926 .ignore_suspend = 1,
1927 /* this dailink has playback support */
1928 .ignore_pmdown_time = 1,
1929 /* This dainlink has MI2S support */
1930 .codec_dai_name = "snd-soc-dummy-dai",
1931 .codec_name = "snd-soc-dummy",
1932 },
1933 {/* hw:x,6 */
1934 .name = "MSM AFE-PCM RX",
1935 .stream_name = "AFE-PROXY RX",
1936 .cpu_dai_name = "msm-dai-q6-dev.241",
1937 .codec_name = "msm-stub-codec.1",
1938 .codec_dai_name = "msm-stub-rx",
1939 .platform_name = "msm-pcm-afe",
1940 .ignore_suspend = 1,
1941 /* this dai link has playback support */
1942 .ignore_pmdown_time = 1,
1943 },
1944 {/* hw:x,7 */
1945 .name = "MSM AFE-PCM TX",
1946 .stream_name = "AFE-PROXY TX",
1947 .cpu_dai_name = "msm-dai-q6-dev.240",
1948 .codec_name = "msm-stub-codec.1",
1949 .codec_dai_name = "msm-stub-tx",
1950 .platform_name = "msm-pcm-afe",
1951 .ignore_suspend = 1,
1952 },
1953 {/* hw:x,8 */
1954 .name = MSM_DAILINK_NAME(Compress1),
1955 .stream_name = "Compress1",
1956 .cpu_dai_name = "MultiMedia4",
1957 .platform_name = "msm-compress-dsp",
1958 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
1959 .dynamic = 1,
1960 .dpcm_capture = 1,
1961 .dpcm_playback = 1,
1962 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1963 SND_SOC_DPCM_TRIGGER_POST},
1964 .codec_dai_name = "snd-soc-dummy-dai",
1965 .codec_name = "snd-soc-dummy",
1966 .ignore_suspend = 1,
1967 .ignore_pmdown_time = 1,
1968 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301969 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301970 },
1971 {/* hw:x,9*/
1972 .name = "AUXPCM Hostless",
1973 .stream_name = "AUXPCM Hostless",
1974 .cpu_dai_name = "AUXPCM_HOSTLESS",
1975 .platform_name = "msm-pcm-hostless",
1976 .dynamic = 1,
1977 .dpcm_capture = 1,
1978 .dpcm_playback = 1,
1979 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1980 SND_SOC_DPCM_TRIGGER_POST},
1981 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1982 .ignore_suspend = 1,
1983 /* this dai link has playback support */
1984 .ignore_pmdown_time = 1,
1985 .codec_dai_name = "snd-soc-dummy-dai",
1986 .codec_name = "snd-soc-dummy",
1987 },
1988 {/* hw:x,10 */
1989 .name = "SLIMBUS_1 Hostless",
1990 .stream_name = "SLIMBUS_1 Hostless",
1991 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
1992 .platform_name = "msm-pcm-hostless",
1993 .dynamic = 1,
1994 .dpcm_capture = 1,
1995 .dpcm_playback = 1,
1996 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1997 SND_SOC_DPCM_TRIGGER_POST},
1998 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1999 .ignore_suspend = 1,
2000 .ignore_pmdown_time = 1, /* dai link has playback support */
2001 .codec_dai_name = "snd-soc-dummy-dai",
2002 .codec_name = "snd-soc-dummy",
2003 },
2004 {/* hw:x,11 */
2005 .name = "INT3 MI2S_TX Hostless",
2006 .stream_name = "INT3 MI2S_TX Hostless",
2007 .cpu_dai_name = "INT3_MI2S_TX_HOSTLESS",
2008 .platform_name = "msm-pcm-hostless",
2009 .dynamic = 1,
2010 .dpcm_capture = 1,
2011 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2012 SND_SOC_DPCM_TRIGGER_POST},
2013 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2014 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302015 .codec_dai_name = "snd-soc-dummy-dai",
2016 .codec_name = "snd-soc-dummy",
2017 },
2018 {/* hw:x,12 */
2019 .name = "SLIMBUS_7 Hostless",
2020 .stream_name = "SLIMBUS_7 Hostless",
2021 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
2022 .platform_name = "msm-pcm-hostless",
2023 .dynamic = 1,
2024 .dpcm_capture = 1,
2025 .dpcm_playback = 1,
2026 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2027 SND_SOC_DPCM_TRIGGER_POST},
2028 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2029 .ignore_suspend = 1,
2030 .ignore_pmdown_time = 1, /* dai link has playback support */
2031 .codec_dai_name = "snd-soc-dummy-dai",
2032 .codec_name = "snd-soc-dummy",
2033 },
2034 {/* hw:x,13 */
2035 .name = MSM_DAILINK_NAME(LowLatency),
2036 .stream_name = "MultiMedia5",
2037 .cpu_dai_name = "MultiMedia5",
2038 .platform_name = "msm-pcm-dsp.1",
2039 .dynamic = 1,
2040 .dpcm_capture = 1,
2041 .dpcm_playback = 1,
2042 .codec_dai_name = "snd-soc-dummy-dai",
2043 .codec_name = "snd-soc-dummy",
2044 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2045 SND_SOC_DPCM_TRIGGER_POST},
2046 .ignore_suspend = 1,
2047 /* this dai link has playback support */
2048 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302049 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302050 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302051 },
2052 /* LSM FE */
2053 {/* hw:x,14 */
2054 .name = "Listen 1 Audio Service",
2055 .stream_name = "Listen 1 Audio Service",
2056 .cpu_dai_name = "LSM1",
2057 .platform_name = "msm-lsm-client",
2058 .dynamic = 1,
2059 .dpcm_capture = 1,
2060 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2061 SND_SOC_DPCM_TRIGGER_POST },
2062 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2063 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302064 .codec_dai_name = "snd-soc-dummy-dai",
2065 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302066 .id = MSM_FRONTEND_DAI_LSM1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302067 },
2068 {/* hw:x,15 */
2069 .name = MSM_DAILINK_NAME(Compress2),
2070 .stream_name = "Compress2",
2071 .cpu_dai_name = "MultiMedia7",
2072 .platform_name = "msm-compress-dsp",
2073 .dynamic = 1,
2074 .dpcm_capture = 1,
2075 .dpcm_playback = 1,
2076 .codec_dai_name = "snd-soc-dummy-dai",
2077 .codec_name = "snd-soc-dummy",
2078 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2079 SND_SOC_DPCM_TRIGGER_POST},
2080 .ignore_suspend = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302081 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302082 },
2083 {/* hw:x,16 */
Laxminath Kasam38070be2017-08-17 18:21:59 +05302084 .name = MSM_DAILINK_NAME(MultiMedia10),
2085 .stream_name = "MultiMedia10",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302086 .cpu_dai_name = "MultiMedia10",
Laxminath Kasam38070be2017-08-17 18:21:59 +05302087 .platform_name = "msm-pcm-dsp.1",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302088 .dynamic = 1,
2089 .dpcm_capture = 1,
2090 .dpcm_playback = 1,
Laxminath Kasam38070be2017-08-17 18:21:59 +05302091 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302092 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2093 SND_SOC_DPCM_TRIGGER_POST},
2094 .codec_dai_name = "snd-soc-dummy-dai",
2095 .codec_name = "snd-soc-dummy",
2096 .ignore_suspend = 1,
2097 .ignore_pmdown_time = 1,
2098 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302099 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302100 },
2101 {/* hw:x,17 */
2102 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
2103 .stream_name = "MM_NOIRQ",
2104 .cpu_dai_name = "MultiMedia8",
2105 .platform_name = "msm-pcm-dsp-noirq",
2106 .dynamic = 1,
2107 .dpcm_capture = 1,
2108 .dpcm_playback = 1,
2109 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2110 SND_SOC_DPCM_TRIGGER_POST},
2111 .codec_dai_name = "snd-soc-dummy-dai",
2112 .codec_name = "snd-soc-dummy",
2113 .ignore_suspend = 1,
2114 .ignore_pmdown_time = 1,
2115 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302116 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302117 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302118 },
2119 {/* hw:x,18 */
2120 .name = "HDMI_RX_HOSTLESS",
2121 .stream_name = "HDMI_RX_HOSTLESS",
2122 .cpu_dai_name = "HDMI_HOSTLESS",
2123 .platform_name = "msm-pcm-hostless",
2124 .dynamic = 1,
2125 .dpcm_playback = 1,
2126 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2127 SND_SOC_DPCM_TRIGGER_POST},
2128 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2129 .ignore_suspend = 1,
2130 .ignore_pmdown_time = 1,
2131 .codec_dai_name = "snd-soc-dummy-dai",
2132 .codec_name = "snd-soc-dummy",
2133 },
2134 {/* hw:x,19 */
2135 .name = "VoiceMMode2",
2136 .stream_name = "VoiceMMode2",
2137 .cpu_dai_name = "VoiceMMode2",
2138 .platform_name = "msm-pcm-voice",
2139 .dynamic = 1,
2140 .dpcm_capture = 1,
2141 .dpcm_playback = 1,
2142 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2143 SND_SOC_DPCM_TRIGGER_POST},
2144 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2145 .ignore_suspend = 1,
2146 .ignore_pmdown_time = 1,
2147 .codec_dai_name = "snd-soc-dummy-dai",
2148 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302149 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302150 },
2151 {/* hw:x,20 */
2152 .name = "Listen 2 Audio Service",
2153 .stream_name = "Listen 2 Audio Service",
2154 .cpu_dai_name = "LSM2",
2155 .platform_name = "msm-lsm-client",
2156 .dynamic = 1,
2157 .dpcm_capture = 1,
2158 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2159 SND_SOC_DPCM_TRIGGER_POST },
2160 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2161 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302162 .codec_dai_name = "snd-soc-dummy-dai",
2163 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302164 .id = MSM_FRONTEND_DAI_LSM2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302165 },
2166 {/* hw:x,21 */
2167 .name = "Listen 3 Audio Service",
2168 .stream_name = "Listen 3 Audio Service",
2169 .cpu_dai_name = "LSM3",
2170 .platform_name = "msm-lsm-client",
2171 .dynamic = 1,
2172 .dpcm_capture = 1,
2173 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2174 SND_SOC_DPCM_TRIGGER_POST },
2175 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2176 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302177 .codec_dai_name = "snd-soc-dummy-dai",
2178 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302179 .id = MSM_FRONTEND_DAI_LSM3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302180 },
2181 {/* hw:x,22 */
2182 .name = "Listen 4 Audio Service",
2183 .stream_name = "Listen 4 Audio Service",
2184 .cpu_dai_name = "LSM4",
2185 .platform_name = "msm-lsm-client",
2186 .dynamic = 1,
2187 .dpcm_capture = 1,
2188 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2189 SND_SOC_DPCM_TRIGGER_POST },
2190 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2191 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302192 .codec_dai_name = "snd-soc-dummy-dai",
2193 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302194 .id = MSM_FRONTEND_DAI_LSM4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302195 },
2196 {/* hw:x,23 */
2197 .name = "Listen 5 Audio Service",
2198 .stream_name = "Listen 5 Audio Service",
2199 .cpu_dai_name = "LSM5",
2200 .platform_name = "msm-lsm-client",
2201 .dynamic = 1,
2202 .dpcm_capture = 1,
2203 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2204 SND_SOC_DPCM_TRIGGER_POST },
2205 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2206 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302207 .codec_dai_name = "snd-soc-dummy-dai",
2208 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302209 .id = MSM_FRONTEND_DAI_LSM5,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302210 },
2211 {/* hw:x,24 */
2212 .name = "Listen 6 Audio Service",
2213 .stream_name = "Listen 6 Audio Service",
2214 .cpu_dai_name = "LSM6",
2215 .platform_name = "msm-lsm-client",
2216 .dynamic = 1,
2217 .dpcm_capture = 1,
2218 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2219 SND_SOC_DPCM_TRIGGER_POST },
2220 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2221 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302222 .codec_dai_name = "snd-soc-dummy-dai",
2223 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302224 .id = MSM_FRONTEND_DAI_LSM6
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302225 },
2226 {/* hw:x,25 */
2227 .name = "Listen 7 Audio Service",
2228 .stream_name = "Listen 7 Audio Service",
2229 .cpu_dai_name = "LSM7",
2230 .platform_name = "msm-lsm-client",
2231 .dynamic = 1,
2232 .dpcm_capture = 1,
2233 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2234 SND_SOC_DPCM_TRIGGER_POST },
2235 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2236 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302237 .codec_dai_name = "snd-soc-dummy-dai",
2238 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302239 .id = MSM_FRONTEND_DAI_LSM7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302240 },
2241 {/* hw:x,26 */
2242 .name = "Listen 8 Audio Service",
2243 .stream_name = "Listen 8 Audio Service",
2244 .cpu_dai_name = "LSM8",
2245 .platform_name = "msm-lsm-client",
2246 .dynamic = 1,
2247 .dpcm_capture = 1,
2248 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2249 SND_SOC_DPCM_TRIGGER_POST },
2250 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2251 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302252 .codec_dai_name = "snd-soc-dummy-dai",
2253 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302254 .id = MSM_FRONTEND_DAI_LSM8,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302255 },
2256 {/* hw:x,27 */
2257 .name = MSM_DAILINK_NAME(Media9),
2258 .stream_name = "MultiMedia9",
2259 .cpu_dai_name = "MultiMedia9",
2260 .platform_name = "msm-pcm-dsp.0",
2261 .dynamic = 1,
2262 .dpcm_capture = 1,
2263 .dpcm_playback = 1,
2264 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2265 SND_SOC_DPCM_TRIGGER_POST},
2266 .codec_dai_name = "snd-soc-dummy-dai",
2267 .codec_name = "snd-soc-dummy",
2268 .ignore_suspend = 1,
2269 .ignore_pmdown_time = 1,
2270 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302271 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302272 },
2273 {/* hw:x,28 */
2274 .name = MSM_DAILINK_NAME(Compress4),
2275 .stream_name = "Compress4",
2276 .cpu_dai_name = "MultiMedia11",
2277 .platform_name = "msm-compress-dsp",
2278 .dynamic = 1,
2279 .dpcm_capture = 1,
2280 .dpcm_playback = 1,
2281 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2282 SND_SOC_DPCM_TRIGGER_POST},
2283 .codec_dai_name = "snd-soc-dummy-dai",
2284 .codec_name = "snd-soc-dummy",
2285 .ignore_suspend = 1,
2286 .ignore_pmdown_time = 1,
2287 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302288 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302289 },
2290 {/* hw:x,29 */
2291 .name = MSM_DAILINK_NAME(Compress5),
2292 .stream_name = "Compress5",
2293 .cpu_dai_name = "MultiMedia12",
2294 .platform_name = "msm-compress-dsp",
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 .codec_dai_name = "snd-soc-dummy-dai",
2301 .codec_name = "snd-soc-dummy",
2302 .ignore_suspend = 1,
2303 .ignore_pmdown_time = 1,
2304 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302305 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302306 },
2307 {/* hw:x,30 */
2308 .name = MSM_DAILINK_NAME(Compress6),
2309 .stream_name = "Compress6",
2310 .cpu_dai_name = "MultiMedia13",
2311 .platform_name = "msm-compress-dsp",
2312 .dynamic = 1,
2313 .dpcm_capture = 1,
2314 .dpcm_playback = 1,
2315 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2316 SND_SOC_DPCM_TRIGGER_POST},
2317 .codec_dai_name = "snd-soc-dummy-dai",
2318 .codec_name = "snd-soc-dummy",
2319 .ignore_suspend = 1,
2320 .ignore_pmdown_time = 1,
2321 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302322 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302323 },
2324 {/* hw:x,31 */
2325 .name = MSM_DAILINK_NAME(Compress7),
2326 .stream_name = "Compress7",
2327 .cpu_dai_name = "MultiMedia14",
2328 .platform_name = "msm-compress-dsp",
2329 .dynamic = 1,
2330 .dpcm_capture = 1,
2331 .dpcm_playback = 1,
2332 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2333 SND_SOC_DPCM_TRIGGER_POST},
2334 .codec_dai_name = "snd-soc-dummy-dai",
2335 .codec_name = "snd-soc-dummy",
2336 .ignore_suspend = 1,
2337 .ignore_pmdown_time = 1,
2338 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302339 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302340 },
2341 {/* hw:x,32 */
2342 .name = MSM_DAILINK_NAME(Compress8),
2343 .stream_name = "Compress8",
2344 .cpu_dai_name = "MultiMedia15",
2345 .platform_name = "msm-compress-dsp",
2346 .dynamic = 1,
2347 .dpcm_capture = 1,
2348 .dpcm_playback = 1,
2349 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2350 SND_SOC_DPCM_TRIGGER_POST},
2351 .codec_dai_name = "snd-soc-dummy-dai",
2352 .codec_name = "snd-soc-dummy",
2353 .ignore_suspend = 1,
2354 .ignore_pmdown_time = 1,
2355 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302356 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302357 },
2358 {/* hw:x,33 */
Asish Bhattacharya34504582017-08-08 12:55:01 +05302359 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
2360 .stream_name = "MM_NOIRQ_2",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302361 .cpu_dai_name = "MultiMedia16",
Asish Bhattacharya34504582017-08-08 12:55:01 +05302362 .platform_name = "msm-pcm-dsp-noirq",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302363 .dynamic = 1,
2364 .dpcm_capture = 1,
2365 .dpcm_playback = 1,
2366 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2367 SND_SOC_DPCM_TRIGGER_POST},
2368 .codec_dai_name = "snd-soc-dummy-dai",
2369 .codec_name = "snd-soc-dummy",
2370 .ignore_suspend = 1,
2371 .ignore_pmdown_time = 1,
2372 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302373 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302374 },
2375 {/* hw:x,34 */
2376 .name = "SLIMBUS_8 Hostless",
2377 .stream_name = "SLIMBUS8_HOSTLESS Capture",
2378 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
2379 .platform_name = "msm-pcm-hostless",
2380 .dynamic = 1,
2381 .dpcm_capture = 1,
2382 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2383 SND_SOC_DPCM_TRIGGER_POST},
2384 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2385 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302386 .codec_dai_name = "snd-soc-dummy-dai",
2387 .codec_name = "snd-soc-dummy",
2388 },
2389 {/* hw:x,35 */
2390 .name = "Primary MI2S_RX Hostless",
2391 .stream_name = "Primary MI2S_RX Hostless",
2392 .cpu_dai_name = "PRI_MI2S_RX_HOSTLESS",
2393 .platform_name = "msm-pcm-hostless",
2394 .dynamic = 1,
2395 .dpcm_playback = 1,
2396 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2397 SND_SOC_DPCM_TRIGGER_POST},
2398 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2399 .ignore_suspend = 1,
2400 /* this dailink has playback support */
2401 .ignore_pmdown_time = 1,
2402 /* This dainlink has MI2S support */
2403 .codec_dai_name = "snd-soc-dummy-dai",
2404 .codec_name = "snd-soc-dummy",
2405 },
2406 {/* hw:x,36 */
2407 .name = "Secondary MI2S_RX Hostless",
2408 .stream_name = "Secondary MI2S_RX Hostless",
2409 .cpu_dai_name = "SEC_MI2S_RX_HOSTLESS",
2410 .platform_name = "msm-pcm-hostless",
2411 .dynamic = 1,
2412 .dpcm_playback = 1,
2413 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2414 SND_SOC_DPCM_TRIGGER_POST},
2415 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2416 .ignore_suspend = 1,
2417 /* this dailink has playback support */
2418 .ignore_pmdown_time = 1,
2419 /* This dainlink has MI2S support */
2420 .codec_dai_name = "snd-soc-dummy-dai",
2421 .codec_name = "snd-soc-dummy",
2422 },
2423 {/* hw:x,37 */
2424 .name = "Tertiary MI2S_RX Hostless",
2425 .stream_name = "Tertiary MI2S_RX Hostless",
2426 .cpu_dai_name = "TERT_MI2S_RX_HOSTLESS",
2427 .platform_name = "msm-pcm-hostless",
2428 .dynamic = 1,
2429 .dpcm_playback = 1,
2430 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2431 SND_SOC_DPCM_TRIGGER_POST},
2432 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2433 .ignore_suspend = 1,
2434 /* this dailink has playback support */
2435 .ignore_pmdown_time = 1,
2436 /* This dainlink has MI2S support */
2437 .codec_dai_name = "snd-soc-dummy-dai",
2438 .codec_name = "snd-soc-dummy",
2439 },
2440 {/* hw:x,38 */
2441 .name = "INT0 MI2S_RX Hostless",
2442 .stream_name = "INT0 MI2S_RX Hostless",
2443 .cpu_dai_name = "INT0_MI2S_RX_HOSTLESS",
2444 .platform_name = "msm-pcm-hostless",
2445 .dynamic = 1,
2446 .dpcm_playback = 1,
2447 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2448 SND_SOC_DPCM_TRIGGER_POST},
2449 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2450 .ignore_suspend = 1,
2451 /* this dailink has playback support */
2452 .ignore_pmdown_time = 1,
2453 /* This dainlink has MI2S support */
2454 .codec_dai_name = "snd-soc-dummy-dai",
2455 .codec_name = "snd-soc-dummy",
2456 },
2457 {/* hw:x,39 */
2458 .name = "SDM660 HFP TX",
2459 .stream_name = "MultiMedia6",
2460 .cpu_dai_name = "MultiMedia6",
2461 .platform_name = "msm-pcm-loopback",
2462 .dynamic = 1,
2463 .dpcm_playback = 1,
2464 .dpcm_capture = 1,
2465 .codec_dai_name = "snd-soc-dummy-dai",
2466 .codec_name = "snd-soc-dummy",
2467 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2468 SND_SOC_DPCM_TRIGGER_POST},
2469 .ignore_suspend = 1,
2470 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2471 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302472 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302473 },
2474};
2475
2476
2477static struct snd_soc_dai_link msm_int_wsa_dai[] = {
2478 {/* hw:x,40 */
2479 .name = LPASS_BE_INT5_MI2S_TX,
2480 .stream_name = "INT5_mi2s Capture",
2481 .cpu_dai_name = "msm-dai-q6-mi2s.12",
2482 .platform_name = "msm-pcm-hostless",
2483 .codec_name = "msm_sdw_codec",
2484 .codec_dai_name = "msm_sdw_vifeedback",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302485 .id = MSM_BACKEND_DAI_INT5_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302486 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2487 .ops = &msm_sdw_mi2s_be_ops,
2488 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2489 .ignore_suspend = 1,
2490 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302491 },
2492};
2493
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05302494static struct snd_soc_dai_link msm_int_compress_capture_dai[] = {
2495 {/* hw:x,41 */
2496 .name = "Compress9",
2497 .stream_name = "Compress9",
2498 .cpu_dai_name = "MultiMedia17",
2499 .platform_name = "msm-compress-dsp",
2500 .dynamic = 1,
2501 .dpcm_capture = 1,
2502 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2503 SND_SOC_DPCM_TRIGGER_POST},
2504 .codec_dai_name = "snd-soc-dummy-dai",
2505 .codec_name = "snd-soc-dummy",
2506 .ignore_suspend = 1,
2507 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
2508 },
2509 {/* hw:x,42 */
2510 .name = "Compress10",
2511 .stream_name = "Compress10",
2512 .cpu_dai_name = "MultiMedia18",
2513 .platform_name = "msm-compress-dsp",
2514 .dynamic = 1,
2515 .dpcm_capture = 1,
2516 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2517 SND_SOC_DPCM_TRIGGER_POST},
2518 .codec_dai_name = "snd-soc-dummy-dai",
2519 .codec_name = "snd-soc-dummy",
2520 .ignore_suspend = 1,
2521 .id = MSM_FRONTEND_DAI_MULTIMEDIA18,
2522 },
2523 {/* hw:x,43 */
2524 .name = "Compress11",
2525 .stream_name = "Compress11",
2526 .cpu_dai_name = "MultiMedia19",
2527 .platform_name = "msm-compress-dsp",
2528 .dynamic = 1,
2529 .dpcm_capture = 1,
2530 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2531 SND_SOC_DPCM_TRIGGER_POST},
2532 .codec_dai_name = "snd-soc-dummy-dai",
2533 .codec_name = "snd-soc-dummy",
2534 .ignore_suspend = 1,
2535 .id = MSM_FRONTEND_DAI_MULTIMEDIA19,
2536 },
2537 {/* hw:x,44 */
2538 .name = "Compress12",
2539 .stream_name = "Compress12",
2540 .cpu_dai_name = "MultiMedia28",
2541 .platform_name = "msm-compress-dsp",
2542 .dynamic = 1,
2543 .dpcm_capture = 1,
2544 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2545 SND_SOC_DPCM_TRIGGER_POST},
2546 .codec_dai_name = "snd-soc-dummy-dai",
2547 .codec_name = "snd-soc-dummy",
2548 .ignore_suspend = 1,
2549 .id = MSM_FRONTEND_DAI_MULTIMEDIA28,
2550 },
2551 {/* hw:x,45 */
2552 .name = "Compress13",
2553 .stream_name = "Compress13",
2554 .cpu_dai_name = "MultiMedia29",
2555 .platform_name = "msm-compress-dsp",
2556 .dynamic = 1,
2557 .dpcm_capture = 1,
2558 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2559 SND_SOC_DPCM_TRIGGER_POST},
2560 .codec_dai_name = "snd-soc-dummy-dai",
2561 .codec_name = "snd-soc-dummy",
2562 .ignore_suspend = 1,
2563 .id = MSM_FRONTEND_DAI_MULTIMEDIA29,
2564 },
2565};
2566
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302567static struct snd_soc_dai_link msm_int_be_dai[] = {
2568 /* Backend I2S DAI Links */
2569 {
2570 .name = LPASS_BE_INT0_MI2S_RX,
2571 .stream_name = "INT0 MI2S Playback",
2572 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2573 .platform_name = "msm-pcm-routing",
2574 .codecs = dlc_rx1,
2575 .num_codecs = CODECS_MAX,
2576 .no_pcm = 1,
2577 .dpcm_playback = 1,
2578 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2579 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302580 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302581 .init = &msm_audrx_init,
2582 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2583 .ops = &msm_int_mi2s_be_ops,
2584 .ignore_suspend = 1,
2585 },
2586 {
2587 .name = LPASS_BE_INT3_MI2S_TX,
2588 .stream_name = "INT3 MI2S Capture",
2589 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2590 .platform_name = "msm-pcm-routing",
2591 .codecs = dlc_tx1,
2592 .num_codecs = CODECS_MAX,
2593 .no_pcm = 1,
2594 .dpcm_capture = 1,
2595 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2596 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302597 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302598 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2599 .ops = &msm_int_mi2s_be_ops,
2600 .ignore_suspend = 1,
2601 },
2602 {
2603 .name = LPASS_BE_INT2_MI2S_TX,
2604 .stream_name = "INT2 MI2S Capture",
2605 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2606 .platform_name = "msm-pcm-routing",
2607 .codecs = dlc_tx2,
2608 .num_codecs = CODECS_MAX,
2609 .no_pcm = 1,
2610 .dpcm_capture = 1,
2611 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2612 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302613 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302614 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2615 .ops = &msm_int_mi2s_be_ops,
2616 .ignore_suspend = 1,
2617 },
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05302618};
2619
2620static struct snd_soc_dai_link msm_int_dig_be_dai[] = {
2621 /* DIG Codec Backend DAI Links */
2622 {
2623 .name = LPASS_BE_INT0_MI2S_RX,
2624 .stream_name = "INT0 MI2S Playback",
2625 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2626 .platform_name = "msm-pcm-routing",
2627 .codec_dai_name = "msm_dig_cdc_dai_rx1",
2628 .no_pcm = 1,
2629 .dpcm_playback = 1,
2630 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2631 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2632 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
2633 .init = &msm_dig_audrx_init,
2634 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2635 .ops = &msm_int_dig_mi2s_be_ops,
2636 .ignore_suspend = 1,
2637 },
2638 {
2639 .name = LPASS_BE_INT3_MI2S_TX,
2640 .stream_name = "INT3 MI2S Capture",
2641 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2642 .platform_name = "msm-pcm-routing",
2643 .codec_dai_name = "msm_dig_cdc_dai_tx1",
2644 .no_pcm = 1,
2645 .dpcm_capture = 1,
2646 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2647 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2648 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
2649 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2650 .ops = &msm_int_dig_mi2s_be_ops,
2651 .ignore_suspend = 1,
2652 },
2653 {
2654 .name = LPASS_BE_INT2_MI2S_TX,
2655 .stream_name = "INT2 MI2S Capture",
2656 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2657 .platform_name = "msm-pcm-routing",
2658 .codec_dai_name = "msm_dig_cdc_dai_tx2",
2659 .no_pcm = 1,
2660 .dpcm_capture = 1,
2661 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2662 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2663 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
2664 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2665 .ops = &msm_int_dig_mi2s_be_ops,
2666 .ignore_suspend = 1,
2667 },
2668};
2669
2670static struct snd_soc_dai_link msm_int_common_be_dai[] = {
2671 /* Backend I2S DAI Links */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302672 {
2673 .name = LPASS_BE_AFE_PCM_RX,
2674 .stream_name = "AFE Playback",
2675 .cpu_dai_name = "msm-dai-q6-dev.224",
2676 .platform_name = "msm-pcm-routing",
2677 .codec_name = "msm-stub-codec.1",
2678 .codec_dai_name = "msm-stub-rx",
2679 .no_pcm = 1,
2680 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302681 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302682 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2683 /* this dainlink has playback support */
2684 .ignore_pmdown_time = 1,
2685 .ignore_suspend = 1,
2686 },
2687 {
2688 .name = LPASS_BE_AFE_PCM_TX,
2689 .stream_name = "AFE Capture",
2690 .cpu_dai_name = "msm-dai-q6-dev.225",
2691 .platform_name = "msm-pcm-routing",
2692 .codec_name = "msm-stub-codec.1",
2693 .codec_dai_name = "msm-stub-tx",
2694 .no_pcm = 1,
2695 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302696 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302697 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2698 .ignore_suspend = 1,
2699 },
2700 /* Incall Record Uplink BACK END DAI Link */
2701 {
2702 .name = LPASS_BE_INCALL_RECORD_TX,
2703 .stream_name = "Voice Uplink Capture",
2704 .cpu_dai_name = "msm-dai-q6-dev.32772",
2705 .platform_name = "msm-pcm-routing",
2706 .codec_name = "msm-stub-codec.1",
2707 .codec_dai_name = "msm-stub-tx",
2708 .no_pcm = 1,
2709 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302710 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302711 .be_hw_params_fixup = msm_be_hw_params_fixup,
2712 .ignore_suspend = 1,
2713 },
2714 /* Incall Record Downlink BACK END DAI Link */
2715 {
2716 .name = LPASS_BE_INCALL_RECORD_RX,
2717 .stream_name = "Voice Downlink Capture",
2718 .cpu_dai_name = "msm-dai-q6-dev.32771",
2719 .platform_name = "msm-pcm-routing",
2720 .codec_name = "msm-stub-codec.1",
2721 .codec_dai_name = "msm-stub-tx",
2722 .no_pcm = 1,
2723 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302724 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302725 .be_hw_params_fixup = msm_be_hw_params_fixup,
2726 .ignore_suspend = 1,
2727 },
2728 /* Incall Music BACK END DAI Link */
2729 {
2730 .name = LPASS_BE_VOICE_PLAYBACK_TX,
2731 .stream_name = "Voice Farend Playback",
2732 .cpu_dai_name = "msm-dai-q6-dev.32773",
2733 .platform_name = "msm-pcm-routing",
2734 .codec_name = "msm-stub-codec.1",
2735 .codec_dai_name = "msm-stub-rx",
2736 .no_pcm = 1,
2737 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302738 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302739 .be_hw_params_fixup = msm_be_hw_params_fixup,
2740 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302741 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302742 },
2743 /* Incall Music 2 BACK END DAI Link */
2744 {
2745 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
2746 .stream_name = "Voice2 Farend Playback",
2747 .cpu_dai_name = "msm-dai-q6-dev.32770",
2748 .platform_name = "msm-pcm-routing",
2749 .codec_name = "msm-stub-codec.1",
2750 .codec_dai_name = "msm-stub-rx",
2751 .no_pcm = 1,
2752 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302753 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302754 .be_hw_params_fixup = msm_be_hw_params_fixup,
2755 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302756 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302757 },
2758 {
2759 .name = LPASS_BE_USB_AUDIO_RX,
2760 .stream_name = "USB Audio Playback",
2761 .cpu_dai_name = "msm-dai-q6-dev.28672",
2762 .platform_name = "msm-pcm-routing",
2763 .codec_name = "msm-stub-codec.1",
2764 .codec_dai_name = "msm-stub-rx",
2765 .no_pcm = 1,
2766 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302767 .id = MSM_BACKEND_DAI_USB_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302768 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2769 .ignore_pmdown_time = 1,
2770 .ignore_suspend = 1,
2771 },
2772 {
2773 .name = LPASS_BE_USB_AUDIO_TX,
2774 .stream_name = "USB Audio Capture",
2775 .cpu_dai_name = "msm-dai-q6-dev.28673",
2776 .platform_name = "msm-pcm-routing",
2777 .codec_name = "msm-stub-codec.1",
2778 .codec_dai_name = "msm-stub-tx",
2779 .no_pcm = 1,
2780 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302781 .id = MSM_BACKEND_DAI_USB_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302782 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2783 .ignore_suspend = 1,
2784 },
2785 {
2786 .name = LPASS_BE_PRI_TDM_RX_0,
2787 .stream_name = "Primary TDM0 Playback",
2788 .cpu_dai_name = "msm-dai-q6-tdm.36864",
2789 .platform_name = "msm-pcm-routing",
2790 .codec_name = "msm-stub-codec.1",
2791 .codec_dai_name = "msm-stub-rx",
2792 .no_pcm = 1,
2793 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302794 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302795 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2796 .ops = &msm_tdm_be_ops,
2797 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302798 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302799 },
2800 {
2801 .name = LPASS_BE_PRI_TDM_TX_0,
2802 .stream_name = "Primary TDM0 Capture",
2803 .cpu_dai_name = "msm-dai-q6-tdm.36865",
2804 .platform_name = "msm-pcm-routing",
2805 .codec_name = "msm-stub-codec.1",
2806 .codec_dai_name = "msm-stub-tx",
2807 .no_pcm = 1,
2808 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302809 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302810 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2811 .ops = &msm_tdm_be_ops,
2812 .ignore_suspend = 1,
2813 },
2814 {
2815 .name = LPASS_BE_SEC_TDM_RX_0,
2816 .stream_name = "Secondary TDM0 Playback",
2817 .cpu_dai_name = "msm-dai-q6-tdm.36880",
2818 .platform_name = "msm-pcm-routing",
2819 .codec_name = "msm-stub-codec.1",
2820 .codec_dai_name = "msm-stub-rx",
2821 .no_pcm = 1,
2822 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302823 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302824 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2825 .ops = &msm_tdm_be_ops,
2826 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302827 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302828 },
2829 {
2830 .name = LPASS_BE_SEC_TDM_TX_0,
2831 .stream_name = "Secondary TDM0 Capture",
2832 .cpu_dai_name = "msm-dai-q6-tdm.36881",
2833 .platform_name = "msm-pcm-routing",
2834 .codec_name = "msm-stub-codec.1",
2835 .codec_dai_name = "msm-stub-tx",
2836 .no_pcm = 1,
2837 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302838 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302839 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2840 .ops = &msm_tdm_be_ops,
2841 .ignore_suspend = 1,
2842 },
2843 {
2844 .name = LPASS_BE_TERT_TDM_RX_0,
2845 .stream_name = "Tertiary TDM0 Playback",
2846 .cpu_dai_name = "msm-dai-q6-tdm.36896",
2847 .platform_name = "msm-pcm-routing",
2848 .codec_name = "msm-stub-codec.1",
2849 .codec_dai_name = "msm-stub-rx",
2850 .no_pcm = 1,
2851 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302852 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302853 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2854 .ops = &msm_tdm_be_ops,
2855 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302856 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302857 },
2858 {
2859 .name = LPASS_BE_TERT_TDM_TX_0,
2860 .stream_name = "Tertiary TDM0 Capture",
2861 .cpu_dai_name = "msm-dai-q6-tdm.36897",
2862 .platform_name = "msm-pcm-routing",
2863 .codec_name = "msm-stub-codec.1",
2864 .codec_dai_name = "msm-stub-tx",
2865 .no_pcm = 1,
2866 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302867 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302868 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2869 .ops = &msm_tdm_be_ops,
2870 .ignore_suspend = 1,
2871 },
2872 {
2873 .name = LPASS_BE_QUAT_TDM_RX_0,
2874 .stream_name = "Quaternary TDM0 Playback",
2875 .cpu_dai_name = "msm-dai-q6-tdm.36912",
2876 .platform_name = "msm-pcm-routing",
2877 .codec_name = "msm-stub-codec.1",
2878 .codec_dai_name = "msm-stub-rx",
2879 .no_pcm = 1,
2880 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302881 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302882 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2883 .ops = &msm_tdm_be_ops,
2884 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302885 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302886 },
2887 {
2888 .name = LPASS_BE_QUAT_TDM_TX_0,
2889 .stream_name = "Quaternary TDM0 Capture",
2890 .cpu_dai_name = "msm-dai-q6-tdm.36913",
2891 .platform_name = "msm-pcm-routing",
2892 .codec_name = "msm-stub-codec.1",
2893 .codec_dai_name = "msm-stub-tx",
2894 .no_pcm = 1,
2895 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302896 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302897 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2898 .ops = &msm_tdm_be_ops,
2899 .ignore_suspend = 1,
2900 },
Rohit Kumard1754482017-09-10 22:57:39 +05302901 {
2902 .name = LPASS_BE_QUIN_TDM_RX_0,
2903 .stream_name = "Quinary TDM0 Playback",
Rohit kumar091ff792017-10-11 18:35:07 +05302904 .cpu_dai_name = "msm-dai-q6-tdm.36928",
Rohit Kumard1754482017-09-10 22:57:39 +05302905 .platform_name = "msm-pcm-routing",
2906 .codec_name = "msm-stub-codec.1",
2907 .codec_dai_name = "msm-stub-rx",
2908 .no_pcm = 1,
2909 .dpcm_playback = 1,
2910 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
2911 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2912 .ops = &msm_tdm_be_ops,
2913 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302914 .ignore_pmdown_time = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05302915 },
2916 {
2917 .name = LPASS_BE_QUIN_TDM_TX_0,
2918 .stream_name = "Quinary TDM0 Capture",
Rohit kumar091ff792017-10-11 18:35:07 +05302919 .cpu_dai_name = "msm-dai-q6-tdm.36929",
Rohit Kumard1754482017-09-10 22:57:39 +05302920 .platform_name = "msm-pcm-routing",
2921 .codec_name = "msm-stub-codec.1",
2922 .codec_dai_name = "msm-stub-tx",
2923 .no_pcm = 1,
2924 .dpcm_capture = 1,
2925 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
2926 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2927 .ops = &msm_tdm_be_ops,
2928 .ignore_suspend = 1,
2929 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302930};
2931
2932static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
2933 {
2934 .name = LPASS_BE_PRI_MI2S_RX,
2935 .stream_name = "Primary MI2S Playback",
2936 .cpu_dai_name = "msm-dai-q6-mi2s.0",
2937 .platform_name = "msm-pcm-routing",
2938 .codec_name = "msm-stub-codec.1",
2939 .codec_dai_name = "msm-stub-rx",
2940 .no_pcm = 1,
2941 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302942 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302943 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2944 .ops = &msm_mi2s_be_ops,
2945 .ignore_suspend = 1,
2946 .ignore_pmdown_time = 1,
2947 },
2948 {
2949 .name = LPASS_BE_PRI_MI2S_TX,
2950 .stream_name = "Primary MI2S Capture",
2951 .cpu_dai_name = "msm-dai-q6-mi2s.0",
2952 .platform_name = "msm-pcm-routing",
2953 .codec_name = "msm-stub-codec.1",
2954 .codec_dai_name = "msm-stub-tx",
2955 .no_pcm = 1,
2956 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302957 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302958 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2959 .ops = &msm_mi2s_be_ops,
2960 .ignore_suspend = 1,
2961 },
2962 {
2963 .name = LPASS_BE_SEC_MI2S_RX,
2964 .stream_name = "Secondary MI2S Playback",
2965 .cpu_dai_name = "msm-dai-q6-mi2s.1",
2966 .platform_name = "msm-pcm-routing",
2967 .codec_name = "msm-stub-codec.1",
2968 .codec_dai_name = "msm-stub-rx",
2969 .no_pcm = 1,
2970 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302971 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302972 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2973 .ops = &msm_mi2s_be_ops,
2974 .ignore_suspend = 1,
2975 .ignore_pmdown_time = 1,
2976 },
2977 {
2978 .name = LPASS_BE_SEC_MI2S_TX,
2979 .stream_name = "Secondary MI2S Capture",
2980 .cpu_dai_name = "msm-dai-q6-mi2s.1",
2981 .platform_name = "msm-pcm-routing",
2982 .codec_name = "msm-stub-codec.1",
2983 .codec_dai_name = "msm-stub-tx",
2984 .no_pcm = 1,
2985 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302986 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302987 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2988 .ops = &msm_mi2s_be_ops,
2989 .ignore_suspend = 1,
2990 },
2991 {
2992 .name = LPASS_BE_TERT_MI2S_RX,
2993 .stream_name = "Tertiary MI2S Playback",
2994 .cpu_dai_name = "msm-dai-q6-mi2s.2",
2995 .platform_name = "msm-pcm-routing",
2996 .codec_name = "msm-stub-codec.1",
2997 .codec_dai_name = "msm-stub-rx",
2998 .no_pcm = 1,
2999 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303000 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303001 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3002 .ops = &msm_mi2s_be_ops,
3003 .ignore_suspend = 1,
3004 .ignore_pmdown_time = 1,
3005 },
3006 {
3007 .name = LPASS_BE_TERT_MI2S_TX,
3008 .stream_name = "Tertiary MI2S Capture",
3009 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3010 .platform_name = "msm-pcm-routing",
3011 .codec_name = "msm-stub-codec.1",
3012 .codec_dai_name = "msm-stub-tx",
3013 .no_pcm = 1,
3014 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303015 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303016 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3017 .ops = &msm_mi2s_be_ops,
3018 .ignore_suspend = 1,
3019 },
3020 {
3021 .name = LPASS_BE_QUAT_MI2S_RX,
3022 .stream_name = "Quaternary MI2S Playback",
3023 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3024 .platform_name = "msm-pcm-routing",
3025 .codec_name = "msm-stub-codec.1",
3026 .codec_dai_name = "msm-stub-rx",
3027 .no_pcm = 1,
3028 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303029 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303030 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3031 .ops = &msm_mi2s_be_ops,
3032 .ignore_suspend = 1,
3033 .ignore_pmdown_time = 1,
3034 },
3035 {
3036 .name = LPASS_BE_QUAT_MI2S_TX,
3037 .stream_name = "Quaternary MI2S Capture",
3038 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3039 .platform_name = "msm-pcm-routing",
3040 .codec_name = "msm-stub-codec.1",
3041 .codec_dai_name = "msm-stub-tx",
3042 .no_pcm = 1,
3043 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303044 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303045 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3046 .ops = &msm_mi2s_be_ops,
3047 .ignore_suspend = 1,
3048 },
Rohit Kumard1754482017-09-10 22:57:39 +05303049 {
3050 .name = LPASS_BE_QUIN_MI2S_RX,
3051 .stream_name = "Quinary MI2S Playback",
Rohit kumar20df5452017-10-16 15:35:56 +05303052 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303053 .platform_name = "msm-pcm-routing",
3054 .codec_name = "msm-stub-codec.1",
3055 .codec_dai_name = "msm-stub-rx",
3056 .no_pcm = 1,
3057 .dpcm_playback = 1,
3058 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
3059 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3060 .ops = &msm_mi2s_be_ops,
3061 .ignore_suspend = 1,
3062 .ignore_pmdown_time = 1,
3063 },
3064 {
3065 .name = LPASS_BE_QUIN_MI2S_TX,
3066 .stream_name = "Quinary MI2S Capture",
Rohit kumar20df5452017-10-16 15:35:56 +05303067 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303068 .platform_name = "msm-pcm-routing",
3069 .codec_name = "msm-stub-codec.1",
3070 .codec_dai_name = "msm-stub-tx",
3071 .no_pcm = 1,
3072 .dpcm_capture = 1,
3073 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
3074 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3075 .ops = &msm_mi2s_be_ops,
3076 .ignore_suspend = 1,
3077 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303078};
3079
3080static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
3081 /* Primary AUX PCM Backend DAI Links */
3082 {
3083 .name = LPASS_BE_AUXPCM_RX,
3084 .stream_name = "AUX PCM Playback",
3085 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3086 .platform_name = "msm-pcm-routing",
3087 .codec_name = "msm-stub-codec.1",
3088 .codec_dai_name = "msm-stub-rx",
3089 .no_pcm = 1,
3090 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303091 .id = MSM_BACKEND_DAI_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303092 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3093 .ignore_pmdown_time = 1,
3094 .ignore_suspend = 1,
3095 .ops = &msm_aux_pcm_be_ops,
3096 },
3097 {
3098 .name = LPASS_BE_AUXPCM_TX,
3099 .stream_name = "AUX PCM Capture",
3100 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3101 .platform_name = "msm-pcm-routing",
3102 .codec_name = "msm-stub-codec.1",
3103 .codec_dai_name = "msm-stub-tx",
3104 .no_pcm = 1,
3105 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303106 .id = MSM_BACKEND_DAI_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303107 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303108 .ignore_suspend = 1,
3109 .ops = &msm_aux_pcm_be_ops,
3110 },
3111 /* Secondary AUX PCM Backend DAI Links */
3112 {
3113 .name = LPASS_BE_SEC_AUXPCM_RX,
3114 .stream_name = "Sec AUX PCM Playback",
3115 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3116 .platform_name = "msm-pcm-routing",
3117 .codec_name = "msm-stub-codec.1",
3118 .codec_dai_name = "msm-stub-rx",
3119 .no_pcm = 1,
3120 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303121 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303122 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3123 .ignore_pmdown_time = 1,
3124 .ignore_suspend = 1,
3125 .ops = &msm_aux_pcm_be_ops,
3126 },
3127 {
3128 .name = LPASS_BE_SEC_AUXPCM_TX,
3129 .stream_name = "Sec AUX PCM Capture",
3130 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3131 .platform_name = "msm-pcm-routing",
3132 .codec_name = "msm-stub-codec.1",
3133 .codec_dai_name = "msm-stub-tx",
3134 .no_pcm = 1,
3135 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303136 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303137 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3138 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303139 .ops = &msm_aux_pcm_be_ops,
3140 },
3141 /* Tertiary AUX PCM Backend DAI Links */
3142 {
3143 .name = LPASS_BE_TERT_AUXPCM_RX,
3144 .stream_name = "Tert AUX PCM Playback",
3145 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3146 .platform_name = "msm-pcm-routing",
3147 .codec_name = "msm-stub-codec.1",
3148 .codec_dai_name = "msm-stub-rx",
3149 .no_pcm = 1,
3150 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303151 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303152 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3153 .ignore_pmdown_time = 1,
3154 .ignore_suspend = 1,
3155 .ops = &msm_aux_pcm_be_ops,
3156 },
3157 {
3158 .name = LPASS_BE_TERT_AUXPCM_TX,
3159 .stream_name = "Tert AUX PCM Capture",
3160 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3161 .platform_name = "msm-pcm-routing",
3162 .codec_name = "msm-stub-codec.1",
3163 .codec_dai_name = "msm-stub-tx",
3164 .no_pcm = 1,
3165 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303166 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303167 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3168 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303169 .ops = &msm_aux_pcm_be_ops,
3170 },
3171 /* Quaternary AUX PCM Backend DAI Links */
3172 {
3173 .name = LPASS_BE_QUAT_AUXPCM_RX,
3174 .stream_name = "Quat AUX PCM Playback",
3175 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3176 .platform_name = "msm-pcm-routing",
3177 .codec_name = "msm-stub-codec.1",
3178 .codec_dai_name = "msm-stub-rx",
3179 .no_pcm = 1,
3180 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303181 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303182 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3183 .ignore_pmdown_time = 1,
3184 .ignore_suspend = 1,
3185 .ops = &msm_aux_pcm_be_ops,
3186 },
3187 {
3188 .name = LPASS_BE_QUAT_AUXPCM_TX,
3189 .stream_name = "Quat AUX PCM Capture",
3190 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3191 .platform_name = "msm-pcm-routing",
3192 .codec_name = "msm-stub-codec.1",
3193 .codec_dai_name = "msm-stub-tx",
3194 .no_pcm = 1,
3195 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303196 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303197 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3198 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303199 .ops = &msm_aux_pcm_be_ops,
3200 },
Rohit Kumard1754482017-09-10 22:57:39 +05303201 /* Quinary AUX PCM Backend DAI Links */
3202 {
3203 .name = LPASS_BE_QUIN_AUXPCM_RX,
3204 .stream_name = "Quin AUX PCM Playback",
3205 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3206 .platform_name = "msm-pcm-routing",
3207 .codec_name = "msm-stub-codec.1",
3208 .codec_dai_name = "msm-stub-rx",
3209 .no_pcm = 1,
3210 .dpcm_playback = 1,
3211 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
3212 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3213 .ignore_pmdown_time = 1,
3214 .ignore_suspend = 1,
3215 .ops = &msm_aux_pcm_be_ops,
3216 },
3217 {
3218 .name = LPASS_BE_QUIN_AUXPCM_TX,
3219 .stream_name = "Quin AUX PCM Capture",
3220 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3221 .platform_name = "msm-pcm-routing",
3222 .codec_name = "msm-stub-codec.1",
3223 .codec_dai_name = "msm-stub-tx",
3224 .no_pcm = 1,
3225 .dpcm_capture = 1,
3226 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
3227 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3228 .ignore_suspend = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05303229 .ops = &msm_aux_pcm_be_ops,
3230 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303231};
3232
3233
3234static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
3235 {
3236 .name = LPASS_BE_SLIMBUS_7_RX,
3237 .stream_name = "Slimbus7 Playback",
3238 .cpu_dai_name = "msm-dai-q6-dev.16398",
3239 .platform_name = "msm-pcm-routing",
3240 .codec_name = "btfmslim_slave",
3241 /* BT codec driver determines capabilities based on
3242 * dai name, bt codecdai name should always contains
3243 * supported usecase information
3244 */
3245 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
3246 .no_pcm = 1,
3247 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303248 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303249 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3250 .ops = &msm_wcn_ops,
3251 /* dai link has playback support */
3252 .ignore_pmdown_time = 1,
3253 .ignore_suspend = 1,
3254 },
3255 {
3256 .name = LPASS_BE_SLIMBUS_7_TX,
3257 .stream_name = "Slimbus7 Capture",
3258 .cpu_dai_name = "msm-dai-q6-dev.16399",
3259 .platform_name = "msm-pcm-routing",
3260 .codec_name = "btfmslim_slave",
3261 .codec_dai_name = "btfm_bt_sco_slim_tx",
3262 .no_pcm = 1,
3263 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303264 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303265 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3266 .ops = &msm_wcn_ops,
3267 .ignore_suspend = 1,
3268 },
3269 {
3270 .name = LPASS_BE_SLIMBUS_8_TX,
3271 .stream_name = "Slimbus8 Capture",
3272 .cpu_dai_name = "msm-dai-q6-dev.16401",
3273 .platform_name = "msm-pcm-routing",
3274 .codec_name = "btfmslim_slave",
3275 .codec_dai_name = "btfm_fm_slim_tx",
3276 .no_pcm = 1,
3277 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303278 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303279 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3280 .init = &msm_wcn_init,
3281 .ops = &msm_wcn_ops,
3282 .ignore_suspend = 1,
3283 },
3284};
3285
3286static struct snd_soc_dai_link msm_wsa_be_dai_links[] = {
3287 {
3288 .name = LPASS_BE_INT4_MI2S_RX,
3289 .stream_name = "INT4 MI2S Playback",
3290 .cpu_dai_name = "msm-dai-q6-mi2s.11",
3291 .platform_name = "msm-pcm-routing",
3292 .codec_name = "msm_sdw_codec",
3293 .codec_dai_name = "msm_sdw_i2s_rx1",
3294 .no_pcm = 1,
3295 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303296 .id = MSM_BACKEND_DAI_INT4_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303297 .init = &msm_sdw_audrx_init,
3298 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
3299 .ops = &msm_sdw_mi2s_be_ops,
3300 .ignore_suspend = 1,
3301 },
3302};
3303
3304static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
3305 /* DISP PORT BACK END DAI Link */
3306 {
3307 .name = LPASS_BE_DISPLAY_PORT,
3308 .stream_name = "Display Port Playback",
3309 .cpu_dai_name = "msm-dai-q6-dp.24608",
3310 .platform_name = "msm-pcm-routing",
3311 .codec_name = "msm-ext-disp-audio-codec-rx",
3312 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
3313 .no_pcm = 1,
3314 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303315 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303316 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3317 .ignore_pmdown_time = 1,
3318 .ignore_suspend = 1,
3319 },
3320};
3321
3322static struct snd_soc_dai_link msm_int_dai_links[
3323ARRAY_SIZE(msm_int_dai) +
3324ARRAY_SIZE(msm_int_wsa_dai) +
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303325ARRAY_SIZE(msm_int_compress_capture_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303326ARRAY_SIZE(msm_int_be_dai) +
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303327ARRAY_SIZE(msm_int_dig_be_dai) +
3328ARRAY_SIZE(msm_int_common_be_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303329ARRAY_SIZE(msm_mi2s_be_dai_links) +
3330ARRAY_SIZE(msm_auxpcm_be_dai_links)+
3331ARRAY_SIZE(msm_wcn_be_dai_links) +
3332ARRAY_SIZE(msm_wsa_be_dai_links) +
3333ARRAY_SIZE(ext_disp_be_dai_link)];
3334
3335static struct snd_soc_card sdm660_card = {
3336 /* snd_soc_card_sdm660 */
3337 .name = "sdm660-snd-card",
3338 .dai_link = msm_int_dai,
3339 .num_links = ARRAY_SIZE(msm_int_dai),
3340 .late_probe = msm_snd_card_late_probe,
3341};
3342
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303343static struct snd_soc_card qcs605_dig_card = {
3344 /* snd_soc_card_qcs605 */
3345 .name = "qcs605-dig-snd-card",
3346 .dai_link = msm_int_dai,
3347 .num_links = ARRAY_SIZE(msm_int_dai),
3348};
3349
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303350static void msm_disable_int_mclk0(struct work_struct *work)
3351{
3352 struct msm_asoc_mach_data *pdata = NULL;
3353 struct delayed_work *dwork;
3354 int ret = 0;
3355
3356 dwork = to_delayed_work(work);
3357 pdata = container_of(dwork, struct msm_asoc_mach_data,
3358 disable_int_mclk0_work);
3359 mutex_lock(&pdata->cdc_int_mclk0_mutex);
3360 pr_debug("%s: mclk_enabled %d mclk_rsc_ref %d\n", __func__,
3361 atomic_read(&pdata->int_mclk0_enabled),
3362 atomic_read(&pdata->int_mclk0_rsc_ref));
3363
3364 if (atomic_read(&pdata->int_mclk0_enabled) == true
3365 && atomic_read(&pdata->int_mclk0_rsc_ref) == 0) {
3366 pr_debug("Disable the mclk\n");
3367 pdata->digital_cdc_core_clk.enable = 0;
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05303368 pdata->digital_cdc_core_clk.clk_freq_in_hz =
3369 DEFAULT_MCLK_RATE;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303370 ret = afe_set_lpass_clock_v2(
3371 AFE_PORT_ID_INT0_MI2S_RX,
3372 &pdata->digital_cdc_core_clk);
3373 if (ret < 0)
3374 pr_err("%s failed to disable the CCLK\n", __func__);
3375 atomic_set(&pdata->int_mclk0_enabled, false);
3376 }
3377 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
3378}
3379
3380static void msm_int_dt_parse_cap_info(struct platform_device *pdev,
3381 struct msm_asoc_mach_data *pdata)
3382{
3383 const char *ext1_cap = "qcom,msm-micbias1-ext-cap";
3384 const char *ext2_cap = "qcom,msm-micbias2-ext-cap";
3385
3386 pdata->micbias1_cap_mode =
3387 (of_property_read_bool(pdev->dev.of_node, ext1_cap) ?
3388 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3389
3390 pdata->micbias2_cap_mode =
3391 (of_property_read_bool(pdev->dev.of_node, ext2_cap) ?
3392 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3393}
3394
3395static struct snd_soc_card *msm_int_populate_sndcard_dailinks(
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303396 struct device *dev, int snd_card_val)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303397{
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303398 struct snd_soc_card *card;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303399 struct snd_soc_dai_link *dailink;
3400 int len1;
3401
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303402 if (snd_card_val == INT_SND_CARD)
3403 card = &sdm660_card;
3404 else
3405 card = &qcs605_dig_card;
3406
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303407 card->name = dev_name(dev);
3408 len1 = ARRAY_SIZE(msm_int_dai);
3409 memcpy(msm_int_dai_links, msm_int_dai, sizeof(msm_int_dai));
3410 dailink = msm_int_dai_links;
3411 if (!of_property_read_bool(dev->of_node,
3412 "qcom,wsa-disable")) {
3413 memcpy(dailink + len1,
3414 msm_int_wsa_dai,
3415 sizeof(msm_int_wsa_dai));
3416 len1 += ARRAY_SIZE(msm_int_wsa_dai);
3417 }
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303418 memcpy(dailink + len1, msm_int_compress_capture_dai,
3419 sizeof(msm_int_compress_capture_dai));
3420 len1 += ARRAY_SIZE(msm_int_compress_capture_dai);
3421
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303422 if (snd_card_val == INT_SND_CARD) {
3423 memcpy(dailink + len1, msm_int_be_dai, sizeof(msm_int_be_dai));
3424 len1 += ARRAY_SIZE(msm_int_be_dai);
3425 } else {
3426 memcpy(dailink + len1, msm_int_dig_be_dai,
3427 sizeof(msm_int_dig_be_dai));
3428 len1 += ARRAY_SIZE(msm_int_dig_be_dai);
3429 }
3430
3431 memcpy(dailink + len1, msm_int_common_be_dai,
3432 sizeof(msm_int_common_be_dai));
3433 len1 += ARRAY_SIZE(msm_int_common_be_dai);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303434
3435 if (of_property_read_bool(dev->of_node,
3436 "qcom,mi2s-audio-intf")) {
3437 memcpy(dailink + len1,
3438 msm_mi2s_be_dai_links,
3439 sizeof(msm_mi2s_be_dai_links));
3440 len1 += ARRAY_SIZE(msm_mi2s_be_dai_links);
3441 }
3442 if (of_property_read_bool(dev->of_node,
3443 "qcom,auxpcm-audio-intf")) {
3444 memcpy(dailink + len1,
3445 msm_auxpcm_be_dai_links,
3446 sizeof(msm_auxpcm_be_dai_links));
3447 len1 += ARRAY_SIZE(msm_auxpcm_be_dai_links);
3448 }
3449 if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
3450 dev_dbg(dev, "%s(): WCN BTFM support present\n",
3451 __func__);
3452 memcpy(dailink + len1,
3453 msm_wcn_be_dai_links,
3454 sizeof(msm_wcn_be_dai_links));
3455 len1 += ARRAY_SIZE(msm_wcn_be_dai_links);
3456 }
3457 if (!of_property_read_bool(dev->of_node, "qcom,wsa-disable")) {
3458 memcpy(dailink + len1,
3459 msm_wsa_be_dai_links,
3460 sizeof(msm_wsa_be_dai_links));
3461 len1 += ARRAY_SIZE(msm_wsa_be_dai_links);
3462 }
3463 if (of_property_read_bool(dev->of_node, "qcom,ext-disp-audio-rx")) {
3464 dev_dbg(dev, "%s(): ext disp audio support present\n",
3465 __func__);
3466 memcpy(dailink + len1,
3467 ext_disp_be_dai_link,
3468 sizeof(ext_disp_be_dai_link));
3469 len1 += ARRAY_SIZE(ext_disp_be_dai_link);
3470 }
3471 card->dai_link = dailink;
3472 card->num_links = len1;
3473 return card;
3474}
3475
3476static int msm_internal_init(struct platform_device *pdev,
3477 struct msm_asoc_mach_data *pdata,
3478 struct snd_soc_card *card)
3479{
3480 const char *type = NULL;
3481 const char *hs_micbias_type = "qcom,msm-hs-micbias-type";
3482 int ret;
3483
3484 ret = is_ext_spk_gpio_support(pdev, pdata);
3485 if (ret < 0)
3486 dev_dbg(&pdev->dev,
3487 "%s: doesn't support external speaker pa\n",
3488 __func__);
3489
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303490 if (pdata->snd_card_val != INT_DIG_SND_CARD) {
3491 ret = of_property_read_string(pdev->dev.of_node,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303492 hs_micbias_type, &type);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303493 if (ret) {
3494 dev_err(&pdev->dev, "%s: missing %s in dt node\n",
3495 __func__, hs_micbias_type);
3496 goto err;
3497 }
3498
3499 if (!strcmp(type, "external")) {
3500 dev_dbg(&pdev->dev, "Headset is using external micbias\n");
3501 mbhc_cfg_ptr->hs_ext_micbias = true;
3502 } else {
3503 dev_dbg(&pdev->dev, "Headset is using internal micbias\n");
3504 mbhc_cfg_ptr->hs_ext_micbias = false;
3505 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303506 }
3507
3508 /* initialize the int_mclk0 */
3509 pdata->digital_cdc_core_clk.clk_set_minor_version =
3510 AFE_API_VERSION_I2S_CONFIG;
3511 pdata->digital_cdc_core_clk.clk_id =
3512 Q6AFE_LPASS_CLK_ID_INT_MCLK_0;
3513 pdata->digital_cdc_core_clk.clk_freq_in_hz = pdata->mclk_freq;
3514 pdata->digital_cdc_core_clk.clk_attri =
3515 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO;
3516 pdata->digital_cdc_core_clk.clk_root =
3517 Q6AFE_LPASS_CLK_ROOT_DEFAULT;
3518 pdata->digital_cdc_core_clk.enable = 1;
3519
3520 /* Initialize loopback mode to false */
3521 pdata->lb_mode = false;
3522
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303523 if (pdata->snd_card_val != INT_DIG_SND_CARD)
3524 msm_int_dt_parse_cap_info(pdev, pdata);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303525
3526 card->dev = &pdev->dev;
3527 platform_set_drvdata(pdev, card);
3528 snd_soc_card_set_drvdata(card, pdata);
3529 ret = snd_soc_of_parse_card_name(card, "qcom,model");
3530 if (ret)
3531 goto err;
3532 /* initialize timer */
3533 INIT_DELAYED_WORK(&pdata->disable_int_mclk0_work,
3534 msm_disable_int_mclk0);
3535 mutex_init(&pdata->cdc_int_mclk0_mutex);
3536 atomic_set(&pdata->int_mclk0_rsc_ref, 0);
3537 atomic_set(&pdata->int_mclk0_enabled, false);
3538
3539 dev_info(&pdev->dev, "%s: default codec configured\n", __func__);
3540
3541 return 0;
3542err:
3543 return ret;
3544}
3545
3546/**
3547 * msm_int_cdc_init - internal codec machine specific init.
3548 *
3549 * @pdev: platform device handle
3550 * @pdata: private data of machine driver
3551 * @card: sound card pointer reference
3552 * @mbhc_cfg: MBHC config reference
3553 *
3554 * Returns 0.
3555 */
3556int msm_int_cdc_init(struct platform_device *pdev,
3557 struct msm_asoc_mach_data *pdata,
3558 struct snd_soc_card **card,
3559 struct wcd_mbhc_config *mbhc_cfg)
3560{
3561 mbhc_cfg_ptr = mbhc_cfg;
3562
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303563 *card = msm_int_populate_sndcard_dailinks(&pdev->dev,
3564 pdata->snd_card_val);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303565 msm_internal_init(pdev, pdata, *card);
3566 return 0;
3567}
3568EXPORT_SYMBOL(msm_int_cdc_init);