blob: e1fc5ca2d54c2a383b84fa2416e58cd05d6218de [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,
457 msm_int_dig_mclk0_event, SND_SOC_DAPM_POST_PMD),
458 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) {
1038 case SND_SOC_DAPM_POST_PMD:
1039 pr_debug("%s: mclk_res_ref = %d\n",
1040 __func__, atomic_read(
1041 &pdata->int_mclk0_rsc_ref));
1042 if (atomic_read(&pdata->int_mclk0_rsc_ref) == 0) {
1043 pr_debug("%s: disabling MCLK\n", __func__);
1044 msm_int_enable_dig_cdc_clk(codec, 0, true);
1045 }
1046 break;
1047 default:
1048 pr_err("%s: invalid DAPM event %d\n", __func__, event);
1049 return -EINVAL;
1050 }
1051 return 0;
1052}
1053
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301054static int int_mi2s_get_port_id(int id)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301055{
1056 int afe_port_id;
1057
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301058 switch (id) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301059 case MSM_BACKEND_DAI_INT0_MI2S_RX:
1060 afe_port_id = AFE_PORT_ID_INT0_MI2S_RX;
1061 break;
1062 case MSM_BACKEND_DAI_INT2_MI2S_TX:
1063 afe_port_id = AFE_PORT_ID_INT2_MI2S_TX;
1064 break;
1065 case MSM_BACKEND_DAI_INT3_MI2S_TX:
1066 afe_port_id = AFE_PORT_ID_INT3_MI2S_TX;
1067 break;
1068 case MSM_BACKEND_DAI_INT4_MI2S_RX:
1069 afe_port_id = AFE_PORT_ID_INT4_MI2S_RX;
1070 break;
1071 case MSM_BACKEND_DAI_INT5_MI2S_TX:
1072 afe_port_id = AFE_PORT_ID_INT5_MI2S_TX;
1073 break;
1074 default:
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301075 pr_err("%s: Invalid id: %d\n", __func__, id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301076 afe_port_id = -EINVAL;
1077 }
1078
1079 return afe_port_id;
1080}
1081
1082static int int_mi2s_get_index(int port_id)
1083{
1084 int index;
1085
1086 switch (port_id) {
1087 case AFE_PORT_ID_INT0_MI2S_RX:
1088 index = INT0_MI2S;
1089 break;
1090 case AFE_PORT_ID_INT2_MI2S_TX:
1091 index = INT2_MI2S;
1092 break;
1093 case AFE_PORT_ID_INT3_MI2S_TX:
1094 index = INT3_MI2S;
1095 break;
1096 case AFE_PORT_ID_INT4_MI2S_RX:
1097 index = INT4_MI2S;
1098 break;
1099 case AFE_PORT_ID_INT5_MI2S_TX:
1100 index = INT5_MI2S;
1101 break;
1102 default:
1103 pr_err("%s: Invalid port_id: %d\n", __func__, port_id);
1104 index = -EINVAL;
1105 }
1106
1107 return index;
1108}
1109
1110static u32 get_int_mi2s_bits_per_sample(u32 bit_format)
1111{
1112 u32 bit_per_sample;
1113
1114 switch (bit_format) {
1115 case SNDRV_PCM_FORMAT_S24_3LE:
1116 case SNDRV_PCM_FORMAT_S24_LE:
1117 bit_per_sample = 32;
1118 break;
1119 case SNDRV_PCM_FORMAT_S16_LE:
1120 default:
1121 bit_per_sample = 16;
1122 break;
1123 }
1124
1125 return bit_per_sample;
1126}
1127
1128static void update_int_mi2s_clk_val(int idx, int stream)
1129{
1130 u32 bit_per_sample;
1131
1132 bit_per_sample =
1133 get_int_mi2s_bits_per_sample(int_mi2s_cfg[idx].bit_format);
1134 int_mi2s_clk[idx].clk_freq_in_hz =
1135 (int_mi2s_cfg[idx].sample_rate * 2 * bit_per_sample);
1136}
1137
1138static int int_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
1139{
1140 int ret = 0;
1141 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1142 int port_id = 0;
1143 int index;
1144
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301145 port_id = int_mi2s_get_port_id(rtd->dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301146 if (port_id < 0) {
1147 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
1148 ret = port_id;
1149 goto done;
1150 }
1151 index = int_mi2s_get_index(port_id);
1152 if (index < 0) {
1153 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
1154 ret = port_id;
1155 goto done;
1156 }
1157 if (enable) {
1158 update_int_mi2s_clk_val(index, substream->stream);
1159 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
1160 int_mi2s_clk[index].clk_freq_in_hz);
1161 }
1162
1163 int_mi2s_clk[index].enable = enable;
1164 ret = afe_set_lpass_clock_v2(port_id,
1165 &int_mi2s_clk[index]);
1166 if (ret < 0) {
1167 dev_err(rtd->card->dev,
1168 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
1169 __func__, port_id, ret);
1170 goto done;
1171 }
1172
1173done:
1174 return ret;
1175}
1176
1177static int msm_sdw_mi2s_snd_startup(struct snd_pcm_substream *substream)
1178{
1179 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1180 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1181 int ret = 0;
1182
1183 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1184 substream->name, substream->stream);
1185
1186 ret = int_mi2s_set_sclk(substream, true);
1187 if (ret < 0) {
1188 pr_err("%s: failed to enable sclk %d\n",
1189 __func__, ret);
1190 return ret;
1191 }
1192 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1193 if (ret < 0)
1194 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1195
1196 return ret;
1197}
1198
1199static void msm_sdw_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
1200{
1201 int ret;
1202
1203 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1204 substream->name, substream->stream);
1205
1206 ret = int_mi2s_set_sclk(substream, false);
1207 if (ret < 0)
1208 pr_err("%s:clock disable failed; ret=%d\n", __func__,
1209 ret);
1210}
1211
1212static int msm_int_mi2s_snd_startup(struct snd_pcm_substream *substream)
1213{
1214 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1215 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1216 struct snd_soc_codec *codec = rtd->codec_dais[ANA_CDC]->codec;
1217 int ret = 0;
1218 struct msm_asoc_mach_data *pdata = NULL;
1219
1220 pdata = snd_soc_card_get_drvdata(codec->component.card);
1221 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1222 substream->name, substream->stream);
1223
1224 ret = int_mi2s_set_sclk(substream, true);
1225 if (ret < 0) {
1226 pr_err("%s: failed to enable sclk %d\n",
1227 __func__, ret);
1228 return ret;
1229 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301230 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1231 if (ret < 0)
1232 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1233
1234 return ret;
1235}
1236
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301237static int msm_int_dig_mi2s_snd_startup(struct snd_pcm_substream *substream)
1238{
1239 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1240 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1241 struct snd_soc_codec *codec = rtd->codec;
1242 int ret = 0;
1243 struct msm_asoc_mach_data *pdata = NULL;
1244
1245 pdata = snd_soc_card_get_drvdata(codec->component.card);
1246 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1247 substream->name, substream->stream);
1248
1249 ret = int_mi2s_set_sclk(substream, true);
1250 if (ret < 0) {
1251 pr_err("%s: failed to enable sclk %d\n",
1252 __func__, ret);
1253 return ret;
1254 }
1255 ret = msm_int_enable_dig_cdc_clk(codec, 1, true);
1256 if (ret < 0) {
1257 pr_err("%s: failed to enable mclk\n", __func__);
1258 return ret;
1259 }
1260 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
1261 if (ret < 0)
1262 pr_err("%s: set fmt cpu dai failed; ret=%d\n", __func__, ret);
1263
1264 return ret;
1265}
1266
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301267static void msm_int_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
1268{
1269 int ret;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301270
1271 pr_debug("%s(): substream = %s stream = %d\n", __func__,
1272 substream->name, substream->stream);
1273
1274 ret = int_mi2s_set_sclk(substream, false);
1275 if (ret < 0)
1276 pr_err("%s:clock disable failed; ret=%d\n", __func__,
1277 ret);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301278}
1279
1280static void *def_msm_int_wcd_mbhc_cal(void)
1281{
1282 void *msm_int_wcd_cal;
1283 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
1284 u16 *btn_low, *btn_high;
1285
1286 msm_int_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
1287 WCD_MBHC_DEF_RLOADS), GFP_KERNEL);
1288 if (!msm_int_wcd_cal)
1289 return NULL;
1290
1291#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(msm_int_wcd_cal)->X) = (Y))
1292 S(v_hs_max, 1500);
1293#undef S
1294#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal)->X) = (Y))
1295 S(num_btn, WCD_MBHC_DEF_BUTTONS);
1296#undef S
1297
1298
1299 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(msm_int_wcd_cal);
1300 btn_low = btn_cfg->_v_btn_low;
1301 btn_high = ((void *)&btn_cfg->_v_btn_low) +
1302 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
1303
1304 /*
1305 * In SW we are maintaining two sets of threshold register
1306 * one for current source and another for Micbias.
1307 * all btn_low corresponds to threshold for current source
1308 * all bt_high corresponds to threshold for Micbias
1309 * Below thresholds are based on following resistances
1310 * 0-70 == Button 0
1311 * 110-180 == Button 1
1312 * 210-290 == Button 2
1313 * 360-680 == Button 3
1314 */
1315 btn_low[0] = 75;
1316 btn_high[0] = 75;
1317 btn_low[1] = 150;
1318 btn_high[1] = 150;
1319 btn_low[2] = 225;
1320 btn_high[2] = 225;
1321 btn_low[3] = 450;
1322 btn_high[3] = 450;
1323 btn_low[4] = 500;
1324 btn_high[4] = 500;
1325
1326 return msm_int_wcd_cal;
1327}
1328
1329static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
1330{
1331 struct snd_soc_codec *dig_cdc = rtd->codec_dais[DIG_CDC]->codec;
1332 struct snd_soc_codec *ana_cdc = rtd->codec_dais[ANA_CDC]->codec;
1333 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(ana_cdc);
1334 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1335 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
1336 struct snd_card *card;
1337 int ret = -ENOMEM;
1338
1339 pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev));
1340
1341 ret = snd_soc_add_codec_controls(ana_cdc, msm_snd_controls,
1342 ARRAY_SIZE(msm_snd_controls));
1343 if (ret < 0) {
1344 pr_err("%s: add_codec_controls failed: %d\n",
1345 __func__, ret);
1346 return ret;
1347 }
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301348
1349 ret = snd_soc_add_codec_controls(ana_cdc, msm_loopback_snd_controls,
1350 ARRAY_SIZE(msm_loopback_snd_controls));
1351 if (ret < 0) {
1352 pr_err("%s: add_codec_controls failed: %d\n",
1353 __func__, ret);
1354 return ret;
1355 }
1356
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301357 ret = snd_soc_add_codec_controls(ana_cdc, msm_common_snd_controls,
1358 msm_common_snd_controls_size());
1359 if (ret < 0) {
1360 pr_err("%s: add common snd controls failed: %d\n",
1361 __func__, ret);
1362 return ret;
1363 }
1364
1365 snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
1366 ARRAY_SIZE(msm_int_dapm_widgets));
1367
1368 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
1369 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
1370 snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic");
1371 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
1372 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
1373
1374 snd_soc_dapm_ignore_suspend(dapm, "EAR");
1375 snd_soc_dapm_ignore_suspend(dapm, "HEADPHONE");
1376 snd_soc_dapm_ignore_suspend(dapm, "SPK_OUT");
1377 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
1378 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
1379 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
Laxminath Kasam52697fe2017-11-29 15:44:14 +05301380 snd_soc_dapm_sync(dapm);
1381
1382 dapm = snd_soc_codec_get_dapm(dig_cdc);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301383 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
1384 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
1385 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
1386 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
1387
1388 snd_soc_dapm_sync(dapm);
1389
1390 msm_anlg_cdc_spk_ext_pa_cb(enable_spk_ext_pa, ana_cdc);
1391 msm_dig_cdc_hph_comp_cb(msm_config_hph_compander_gpio, dig_cdc);
1392
1393 card = rtd->card->snd_card;
1394 if (!codec_root)
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301395 codec_root = snd_info_create_subdir(card->module, "codecs",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301396 card->proc_root);
1397 if (!codec_root) {
1398 pr_debug("%s: Cannot create codecs module entry\n",
1399 __func__);
1400 goto done;
1401 }
1402 pdata->codec_root = codec_root;
1403 msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
1404 msm_anlg_codec_info_create_codec_entry(codec_root, ana_cdc);
1405done:
Laxminath Kasam38070be2017-08-17 18:21:59 +05301406 msm_set_codec_reg_done(true);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301407 return 0;
1408}
1409
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301410static int msm_dig_audrx_init(struct snd_soc_pcm_runtime *rtd)
1411{
1412 struct snd_soc_codec *dig_cdc = rtd->codec;
1413 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(dig_cdc);
1414 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1415 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
1416 struct snd_card *card;
1417 int ret = -ENOMEM;
1418
1419 pr_debug("%s(),dev_name%s\n", __func__, dev_name(cpu_dai->dev));
1420
1421 ret = snd_soc_add_codec_controls(dig_cdc, msm_snd_controls,
1422 ARRAY_SIZE(msm_snd_controls));
1423 if (ret < 0) {
1424 pr_err("%s: add_codec_controls failed: %d\n",
1425 __func__, ret);
1426 return ret;
1427 }
1428 ret = snd_soc_add_codec_controls(dig_cdc, msm_common_snd_controls,
1429 msm_common_snd_controls_size());
1430 if (ret < 0) {
1431 pr_err("%s: add common snd controls failed: %d\n",
1432 __func__, ret);
1433 return ret;
1434 }
1435
1436 snd_soc_dapm_new_controls(dapm, msm_int_dig_dapm_widgets,
1437 ARRAY_SIZE(msm_int_dig_dapm_widgets));
1438
1439 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
1440 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
1441
1442 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
1443 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
1444 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
1445 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
1446
1447 card = rtd->card->snd_card;
1448 if (!codec_root)
1449 codec_root = snd_info_create_subdir(card->module, "codecs",
1450 card->proc_root);
1451 if (!codec_root) {
1452 pr_debug("%s: Cannot create codecs module entry\n",
1453 __func__);
1454 goto done;
1455 }
1456 pdata->codec_root = codec_root;
1457 msm_dig_codec_info_create_codec_entry(codec_root, dig_cdc);
1458done:
1459 msm_set_codec_reg_done(true);
1460 return 0;
1461}
1462
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301463static int msm_sdw_audrx_init(struct snd_soc_pcm_runtime *rtd)
1464{
1465 struct snd_soc_codec *codec = rtd->codec;
1466 struct snd_soc_dapm_context *dapm =
1467 snd_soc_codec_get_dapm(codec);
1468 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card);
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301469 struct snd_soc_component *aux_comp;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301470 struct snd_card *card;
1471
1472 snd_soc_add_codec_controls(codec, msm_sdw_controls,
1473 ARRAY_SIZE(msm_sdw_controls));
1474
1475 snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW Playback");
1476 snd_soc_dapm_ignore_suspend(dapm, "VIfeed_SDW");
1477 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
1478 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
1479 snd_soc_dapm_ignore_suspend(dapm, "AIF1_SDW VI");
1480 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_SDW");
1481
1482 snd_soc_dapm_sync(dapm);
1483
1484 /*
1485 * Send speaker configuration only for WSA8810.
1486 * Default configuration is for WSA8815.
1487 */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301488 pr_debug("%s: Number of aux devices: %d\n",
1489 __func__, rtd->card->num_aux_devs);
1490 if (rtd->card->num_aux_devs &&
1491 !list_empty(&rtd->card->aux_comp_list)) {
1492 aux_comp = list_first_entry(&rtd->card->aux_comp_list,
1493 struct snd_soc_component, list_aux);
1494 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
1495 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301496 msm_sdw_set_spkr_mode(rtd->codec, SPKR_MODE_1);
1497 msm_sdw_set_spkr_gain_offset(rtd->codec,
1498 RX_GAIN_OFFSET_M1P5_DB);
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301499 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301500 }
1501 card = rtd->card->snd_card;
1502 if (!codec_root)
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301503 codec_root = snd_info_create_subdir(card->module, "codecs",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301504 card->proc_root);
1505 if (!codec_root) {
1506 pr_debug("%s: Cannot create codecs module entry\n",
1507 __func__);
1508 goto done;
1509 }
1510 pdata->codec_root = codec_root;
1511 msm_sdw_codec_info_create_codec_entry(codec_root, codec);
1512done:
1513 return 0;
1514}
1515
1516static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
1517{
1518 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
1519 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161};
1520 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1521
1522 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
1523 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
1524}
1525
1526static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
1527 struct snd_pcm_hw_params *params)
1528{
1529 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1530 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1531 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1532 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1533 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
1534 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
1535 int ret;
1536
1537 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
1538 codec_dai->name, codec_dai->id);
1539 ret = snd_soc_dai_get_channel_map(codec_dai,
1540 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
1541 if (ret) {
1542 dev_err(rtd->dev,
1543 "%s: failed to get BTFM codec chan map\n, err:%d\n",
1544 __func__, ret);
1545 goto exit;
1546 }
1547
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301548 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) id %d\n",
1549 __func__, tx_ch_cnt, dai_link->id);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301550
1551 ret = snd_soc_dai_set_channel_map(cpu_dai,
1552 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
1553 if (ret)
1554 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
1555 __func__, ret);
1556
1557exit:
1558 return ret;
1559}
1560
1561static unsigned int tdm_param_set_slot_mask(u16 port_id, int slot_width,
1562 int slots)
1563{
1564 unsigned int slot_mask = 0;
1565 int i, j;
1566 unsigned int *slot_offset;
1567
1568 for (i = TDM_0; i < TDM_PORT_MAX; i++) {
1569 slot_offset = tdm_slot_offset[i];
1570
1571 for (j = 0; j < TDM_SLOT_OFFSET_MAX; j++) {
1572 if (slot_offset[j] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1573 slot_mask |=
1574 (1 << ((slot_offset[j] * 8) / slot_width));
1575 else
1576 break;
1577 }
1578 }
1579
1580 return slot_mask;
1581}
1582
1583static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream,
1584 struct snd_pcm_hw_params *params)
1585{
1586 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1587 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1588 int ret = 0;
1589 int channels, slot_width, slots;
1590 unsigned int slot_mask;
1591 unsigned int *slot_offset;
1592 int offset_channels = 0;
1593 int i;
1594
1595 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
1596
1597 channels = params_channels(params);
1598 switch (channels) {
1599 case 1:
1600 case 2:
1601 case 3:
1602 case 4:
1603 case 5:
1604 case 6:
1605 case 7:
1606 case 8:
1607 switch (params_format(params)) {
1608 case SNDRV_PCM_FORMAT_S32_LE:
1609 case SNDRV_PCM_FORMAT_S24_LE:
1610 case SNDRV_PCM_FORMAT_S16_LE:
1611 /*
1612 * up to 8 channels HW config should
1613 * use 32 bit slot width for max support of
1614 * stream bit width. (slot_width > bit_width)
1615 */
1616 slot_width = 32;
1617 break;
1618 default:
1619 pr_err("%s: invalid param format 0x%x\n",
1620 __func__, params_format(params));
1621 return -EINVAL;
1622 }
1623 slots = 8;
1624 slot_mask = tdm_param_set_slot_mask(cpu_dai->id,
1625 slot_width,
1626 slots);
1627 if (!slot_mask) {
1628 pr_err("%s: invalid slot_mask 0x%x\n",
1629 __func__, slot_mask);
1630 return -EINVAL;
1631 }
1632 break;
1633 default:
1634 pr_err("%s: invalid param channels %d\n",
1635 __func__, channels);
1636 return -EINVAL;
1637 }
1638 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
1639 switch (cpu_dai->id) {
1640 case AFE_PORT_ID_PRIMARY_TDM_RX:
1641 case AFE_PORT_ID_SECONDARY_TDM_RX:
1642 case AFE_PORT_ID_TERTIARY_TDM_RX:
1643 case AFE_PORT_ID_QUATERNARY_TDM_RX:
Rohit Kumard1754482017-09-10 22:57:39 +05301644 case AFE_PORT_ID_QUINARY_TDM_RX:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301645 case AFE_PORT_ID_PRIMARY_TDM_TX:
1646 case AFE_PORT_ID_SECONDARY_TDM_TX:
1647 case AFE_PORT_ID_TERTIARY_TDM_TX:
1648 case AFE_PORT_ID_QUATERNARY_TDM_TX:
Rohit Kumard1754482017-09-10 22:57:39 +05301649 case AFE_PORT_ID_QUINARY_TDM_TX:
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301650 slot_offset = tdm_slot_offset[TDM_0];
1651 break;
1652 default:
1653 pr_err("%s: dai id 0x%x not supported\n",
1654 __func__, cpu_dai->id);
1655 return -EINVAL;
1656 }
1657
1658 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
1659 if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1660 offset_channels++;
1661 else
1662 break;
1663 }
1664
1665 if (offset_channels == 0) {
1666 pr_err("%s: slot offset not supported, offset_channels %d\n",
1667 __func__, offset_channels);
1668 return -EINVAL;
1669 }
1670
1671 if (channels > offset_channels) {
1672 pr_err("%s: channels %d exceed offset_channels %d\n",
1673 __func__, channels, offset_channels);
1674 return -EINVAL;
1675 }
1676
1677 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1678 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
1679 slots, slot_width);
1680 if (ret < 0) {
1681 pr_err("%s: failed to set tdm slot, err:%d\n",
1682 __func__, ret);
1683 goto end;
1684 }
1685
1686 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
1687 channels, slot_offset);
1688 if (ret < 0) {
1689 pr_err("%s: failed to set channel map, err:%d\n",
1690 __func__, ret);
1691 goto end;
1692 }
1693 } else {
1694 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
1695 slots, slot_width);
1696 if (ret < 0) {
1697 pr_err("%s: failed to set tdm slot, err:%d\n",
1698 __func__, ret);
1699 goto end;
1700 }
1701
1702 ret = snd_soc_dai_set_channel_map(cpu_dai, channels,
1703 slot_offset, 0, NULL);
1704 if (ret < 0) {
1705 pr_err("%s: failed to set channel map, err:%d\n",
1706 __func__, ret);
1707 goto end;
1708 }
1709 }
1710end:
1711 return ret;
1712}
1713
1714static int msm_snd_card_late_probe(struct snd_soc_card *card)
1715{
1716 const char *be_dl_name = LPASS_BE_INT0_MI2S_RX;
1717 struct snd_soc_codec *ana_cdc;
1718 struct snd_soc_pcm_runtime *rtd;
1719 int ret = 0;
1720
1721 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
1722 if (!rtd) {
1723 dev_err(card->dev,
1724 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
1725 __func__, be_dl_name);
1726 return -EINVAL;
1727 }
1728
1729 ana_cdc = rtd->codec_dais[ANA_CDC]->codec;
1730 mbhc_cfg_ptr->calibration = def_msm_int_wcd_mbhc_cal();
1731 if (!mbhc_cfg_ptr->calibration)
1732 return -ENOMEM;
1733
1734 ret = msm_anlg_cdc_hs_detect(ana_cdc, mbhc_cfg_ptr);
1735 if (ret) {
1736 dev_err(card->dev,
1737 "%s: msm_anlg_cdc_hs_detect failed\n", __func__);
1738 kfree(mbhc_cfg_ptr->calibration);
1739 }
1740
1741 return ret;
1742}
1743
1744static struct snd_soc_ops msm_tdm_be_ops = {
1745 .hw_params = msm_tdm_snd_hw_params
1746};
1747
1748static struct snd_soc_ops msm_wcn_ops = {
1749 .hw_params = msm_wcn_hw_params,
1750};
1751
1752static struct snd_soc_ops msm_mi2s_be_ops = {
1753 .startup = msm_mi2s_snd_startup,
1754 .shutdown = msm_mi2s_snd_shutdown,
1755};
1756
1757static struct snd_soc_ops msm_aux_pcm_be_ops = {
1758 .startup = msm_aux_pcm_snd_startup,
1759 .shutdown = msm_aux_pcm_snd_shutdown,
1760};
1761
1762static struct snd_soc_ops msm_int_mi2s_be_ops = {
1763 .startup = msm_int_mi2s_snd_startup,
1764 .shutdown = msm_int_mi2s_snd_shutdown,
1765};
1766
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05301767static struct snd_soc_ops msm_int_dig_mi2s_be_ops = {
1768 .startup = msm_int_dig_mi2s_snd_startup,
1769 .shutdown = msm_int_mi2s_snd_shutdown,
1770};
1771
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301772static struct snd_soc_ops msm_sdw_mi2s_be_ops = {
1773 .startup = msm_sdw_mi2s_snd_startup,
1774 .shutdown = msm_sdw_mi2s_snd_shutdown,
1775};
1776
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05301777static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
1778{
1779 cpumask_t mask;
1780
1781 if (pm_qos_request_active(&substream->latency_pm_qos_req))
1782 pm_qos_remove_request(&substream->latency_pm_qos_req);
1783
1784 cpumask_clear(&mask);
1785 cpumask_set_cpu(1, &mask); /* affine to core 1 */
1786 cpumask_set_cpu(2, &mask); /* affine to core 2 */
1787 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
1788
1789 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
1790
1791 pm_qos_add_request(&substream->latency_pm_qos_req,
1792 PM_QOS_CPU_DMA_LATENCY,
1793 MSM_LL_QOS_VALUE);
1794 return 0;
1795}
1796
1797static struct snd_soc_ops msm_fe_qos_ops = {
1798 .prepare = msm_fe_qos_prepare,
1799};
1800
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301801struct snd_soc_dai_link_component dlc_rx1[] = {
1802 {
1803 .of_node = NULL,
1804 .dai_name = "msm_dig_cdc_dai_rx1",
1805 },
1806 {
1807 .of_node = NULL,
1808 .dai_name = "msm_anlg_cdc_i2s_rx1",
1809 },
1810};
1811
1812struct snd_soc_dai_link_component dlc_tx1[] = {
1813 {
1814 .of_node = NULL,
1815 .dai_name = "msm_dig_cdc_dai_tx1",
1816 },
1817 {
1818 .of_node = NULL,
1819 .dai_name = "msm_anlg_cdc_i2s_tx1",
1820 },
1821};
1822
1823struct snd_soc_dai_link_component dlc_tx2[] = {
1824 {
1825 .of_node = NULL,
1826 .dai_name = "msm_dig_cdc_dai_tx2",
1827 },
1828 {
1829 .of_node = NULL,
1830 .dai_name = "msm_anlg_cdc_i2s_tx2",
1831 },
1832};
1833
1834/* Digital audio interface glue - connects codec <---> CPU */
1835static struct snd_soc_dai_link msm_int_dai[] = {
1836 /* FrontEnd DAI Links */
1837 {/* hw:x,0 */
1838 .name = MSM_DAILINK_NAME(Media1),
1839 .stream_name = "MultiMedia1",
1840 .cpu_dai_name = "MultiMedia1",
1841 .platform_name = "msm-pcm-dsp.0",
1842 .dynamic = 1,
1843 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1844 SND_SOC_DPCM_TRIGGER_POST},
1845 .codec_dai_name = "snd-soc-dummy-dai",
1846 .codec_name = "snd-soc-dummy",
1847 .ignore_suspend = 1,
1848 .dpcm_playback = 1,
1849 .dpcm_capture = 1,
1850 /* this dai link has playback support */
1851 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301852 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301853 },
1854 {/* hw:x,1 */
1855 .name = MSM_DAILINK_NAME(Media2),
1856 .stream_name = "MultiMedia2",
1857 .cpu_dai_name = "MultiMedia2",
1858 .platform_name = "msm-pcm-dsp.0",
1859 .dynamic = 1,
1860 .dpcm_playback = 1,
1861 .dpcm_capture = 1,
1862 .codec_dai_name = "snd-soc-dummy-dai",
1863 .codec_name = "snd-soc-dummy",
1864 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1865 SND_SOC_DPCM_TRIGGER_POST},
1866 .ignore_suspend = 1,
1867 /* this dai link has playback support */
1868 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301869 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301870 },
1871 {/* hw:x,2 */
1872 .name = "VoiceMMode1",
1873 .stream_name = "VoiceMMode1",
1874 .cpu_dai_name = "VoiceMMode1",
1875 .platform_name = "msm-pcm-voice",
1876 .dynamic = 1,
1877 .dpcm_capture = 1,
1878 .dpcm_playback = 1,
1879 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1880 SND_SOC_DPCM_TRIGGER_POST},
1881 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1882 .ignore_suspend = 1,
1883 .ignore_pmdown_time = 1,
1884 .codec_dai_name = "snd-soc-dummy-dai",
1885 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301886 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301887 },
1888 {/* hw:x,3 */
1889 .name = "MSM VoIP",
1890 .stream_name = "VoIP",
1891 .cpu_dai_name = "VoIP",
1892 .platform_name = "msm-voip-dsp",
1893 .dynamic = 1,
1894 .dpcm_playback = 1,
1895 .dpcm_capture = 1,
1896 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1897 SND_SOC_DPCM_TRIGGER_POST},
1898 .codec_dai_name = "snd-soc-dummy-dai",
1899 .codec_name = "snd-soc-dummy",
1900 .ignore_suspend = 1,
1901 /* this dai link has playback support */
1902 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301903 .id = MSM_FRONTEND_DAI_VOIP,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301904 },
1905 {/* hw:x,4 */
1906 .name = MSM_DAILINK_NAME(ULL),
1907 .stream_name = "ULL",
1908 .cpu_dai_name = "MultiMedia3",
1909 .platform_name = "msm-pcm-dsp.2",
1910 .dynamic = 1,
1911 .dpcm_playback = 1,
1912 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1913 SND_SOC_DPCM_TRIGGER_POST},
1914 .codec_dai_name = "snd-soc-dummy-dai",
1915 .codec_name = "snd-soc-dummy",
1916 .ignore_suspend = 1,
1917 /* this dai link has playback support */
1918 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301919 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301920 },
1921 /* Hostless PCM purpose */
1922 {/* hw:x,5 */
1923 .name = "INT4 MI2S_RX Hostless",
1924 .stream_name = "INT4 MI2S_RX Hostless",
1925 .cpu_dai_name = "INT4_MI2S_RX_HOSTLESS",
1926 .platform_name = "msm-pcm-hostless",
1927 .dynamic = 1,
1928 .dpcm_playback = 1,
1929 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1930 SND_SOC_DPCM_TRIGGER_POST},
1931 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1932 .ignore_suspend = 1,
1933 /* this dailink has playback support */
1934 .ignore_pmdown_time = 1,
1935 /* This dainlink has MI2S support */
1936 .codec_dai_name = "snd-soc-dummy-dai",
1937 .codec_name = "snd-soc-dummy",
1938 },
1939 {/* hw:x,6 */
1940 .name = "MSM AFE-PCM RX",
1941 .stream_name = "AFE-PROXY RX",
1942 .cpu_dai_name = "msm-dai-q6-dev.241",
1943 .codec_name = "msm-stub-codec.1",
1944 .codec_dai_name = "msm-stub-rx",
1945 .platform_name = "msm-pcm-afe",
1946 .ignore_suspend = 1,
1947 /* this dai link has playback support */
1948 .ignore_pmdown_time = 1,
1949 },
1950 {/* hw:x,7 */
1951 .name = "MSM AFE-PCM TX",
1952 .stream_name = "AFE-PROXY TX",
1953 .cpu_dai_name = "msm-dai-q6-dev.240",
1954 .codec_name = "msm-stub-codec.1",
1955 .codec_dai_name = "msm-stub-tx",
1956 .platform_name = "msm-pcm-afe",
1957 .ignore_suspend = 1,
1958 },
1959 {/* hw:x,8 */
1960 .name = MSM_DAILINK_NAME(Compress1),
1961 .stream_name = "Compress1",
1962 .cpu_dai_name = "MultiMedia4",
1963 .platform_name = "msm-compress-dsp",
1964 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
1965 .dynamic = 1,
1966 .dpcm_capture = 1,
1967 .dpcm_playback = 1,
1968 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1969 SND_SOC_DPCM_TRIGGER_POST},
1970 .codec_dai_name = "snd-soc-dummy-dai",
1971 .codec_name = "snd-soc-dummy",
1972 .ignore_suspend = 1,
1973 .ignore_pmdown_time = 1,
1974 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05301975 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301976 },
1977 {/* hw:x,9*/
1978 .name = "AUXPCM Hostless",
1979 .stream_name = "AUXPCM Hostless",
1980 .cpu_dai_name = "AUXPCM_HOSTLESS",
1981 .platform_name = "msm-pcm-hostless",
1982 .dynamic = 1,
1983 .dpcm_capture = 1,
1984 .dpcm_playback = 1,
1985 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
1986 SND_SOC_DPCM_TRIGGER_POST},
1987 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
1988 .ignore_suspend = 1,
1989 /* this dai link has playback support */
1990 .ignore_pmdown_time = 1,
1991 .codec_dai_name = "snd-soc-dummy-dai",
1992 .codec_name = "snd-soc-dummy",
1993 },
1994 {/* hw:x,10 */
1995 .name = "SLIMBUS_1 Hostless",
1996 .stream_name = "SLIMBUS_1 Hostless",
1997 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
1998 .platform_name = "msm-pcm-hostless",
1999 .dynamic = 1,
2000 .dpcm_capture = 1,
2001 .dpcm_playback = 1,
2002 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2003 SND_SOC_DPCM_TRIGGER_POST},
2004 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2005 .ignore_suspend = 1,
2006 .ignore_pmdown_time = 1, /* dai link has playback support */
2007 .codec_dai_name = "snd-soc-dummy-dai",
2008 .codec_name = "snd-soc-dummy",
2009 },
2010 {/* hw:x,11 */
2011 .name = "INT3 MI2S_TX Hostless",
2012 .stream_name = "INT3 MI2S_TX Hostless",
2013 .cpu_dai_name = "INT3_MI2S_TX_HOSTLESS",
2014 .platform_name = "msm-pcm-hostless",
2015 .dynamic = 1,
2016 .dpcm_capture = 1,
2017 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2018 SND_SOC_DPCM_TRIGGER_POST},
2019 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2020 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302021 .codec_dai_name = "snd-soc-dummy-dai",
2022 .codec_name = "snd-soc-dummy",
2023 },
2024 {/* hw:x,12 */
2025 .name = "SLIMBUS_7 Hostless",
2026 .stream_name = "SLIMBUS_7 Hostless",
2027 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
2028 .platform_name = "msm-pcm-hostless",
2029 .dynamic = 1,
2030 .dpcm_capture = 1,
2031 .dpcm_playback = 1,
2032 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2033 SND_SOC_DPCM_TRIGGER_POST},
2034 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2035 .ignore_suspend = 1,
2036 .ignore_pmdown_time = 1, /* dai link has playback support */
2037 .codec_dai_name = "snd-soc-dummy-dai",
2038 .codec_name = "snd-soc-dummy",
2039 },
2040 {/* hw:x,13 */
2041 .name = MSM_DAILINK_NAME(LowLatency),
2042 .stream_name = "MultiMedia5",
2043 .cpu_dai_name = "MultiMedia5",
2044 .platform_name = "msm-pcm-dsp.1",
2045 .dynamic = 1,
2046 .dpcm_capture = 1,
2047 .dpcm_playback = 1,
2048 .codec_dai_name = "snd-soc-dummy-dai",
2049 .codec_name = "snd-soc-dummy",
2050 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2051 SND_SOC_DPCM_TRIGGER_POST},
2052 .ignore_suspend = 1,
2053 /* this dai link has playback support */
2054 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302055 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302056 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302057 },
2058 /* LSM FE */
2059 {/* hw:x,14 */
2060 .name = "Listen 1 Audio Service",
2061 .stream_name = "Listen 1 Audio Service",
2062 .cpu_dai_name = "LSM1",
2063 .platform_name = "msm-lsm-client",
2064 .dynamic = 1,
2065 .dpcm_capture = 1,
2066 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2067 SND_SOC_DPCM_TRIGGER_POST },
2068 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2069 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302070 .codec_dai_name = "snd-soc-dummy-dai",
2071 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302072 .id = MSM_FRONTEND_DAI_LSM1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302073 },
2074 {/* hw:x,15 */
2075 .name = MSM_DAILINK_NAME(Compress2),
2076 .stream_name = "Compress2",
2077 .cpu_dai_name = "MultiMedia7",
2078 .platform_name = "msm-compress-dsp",
2079 .dynamic = 1,
2080 .dpcm_capture = 1,
2081 .dpcm_playback = 1,
2082 .codec_dai_name = "snd-soc-dummy-dai",
2083 .codec_name = "snd-soc-dummy",
2084 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2085 SND_SOC_DPCM_TRIGGER_POST},
2086 .ignore_suspend = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302087 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302088 },
2089 {/* hw:x,16 */
Laxminath Kasam38070be2017-08-17 18:21:59 +05302090 .name = MSM_DAILINK_NAME(MultiMedia10),
2091 .stream_name = "MultiMedia10",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302092 .cpu_dai_name = "MultiMedia10",
Laxminath Kasam38070be2017-08-17 18:21:59 +05302093 .platform_name = "msm-pcm-dsp.1",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302094 .dynamic = 1,
2095 .dpcm_capture = 1,
2096 .dpcm_playback = 1,
Laxminath Kasam38070be2017-08-17 18:21:59 +05302097 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302098 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2099 SND_SOC_DPCM_TRIGGER_POST},
2100 .codec_dai_name = "snd-soc-dummy-dai",
2101 .codec_name = "snd-soc-dummy",
2102 .ignore_suspend = 1,
2103 .ignore_pmdown_time = 1,
2104 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302105 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302106 },
2107 {/* hw:x,17 */
2108 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
2109 .stream_name = "MM_NOIRQ",
2110 .cpu_dai_name = "MultiMedia8",
2111 .platform_name = "msm-pcm-dsp-noirq",
2112 .dynamic = 1,
2113 .dpcm_capture = 1,
2114 .dpcm_playback = 1,
2115 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2116 SND_SOC_DPCM_TRIGGER_POST},
2117 .codec_dai_name = "snd-soc-dummy-dai",
2118 .codec_name = "snd-soc-dummy",
2119 .ignore_suspend = 1,
2120 .ignore_pmdown_time = 1,
2121 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302122 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
Revathi Uddaraju30feb0d2017-11-21 15:30:19 +05302123 .ops = &msm_fe_qos_ops,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302124 },
2125 {/* hw:x,18 */
2126 .name = "HDMI_RX_HOSTLESS",
2127 .stream_name = "HDMI_RX_HOSTLESS",
2128 .cpu_dai_name = "HDMI_HOSTLESS",
2129 .platform_name = "msm-pcm-hostless",
2130 .dynamic = 1,
2131 .dpcm_playback = 1,
2132 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2133 SND_SOC_DPCM_TRIGGER_POST},
2134 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2135 .ignore_suspend = 1,
2136 .ignore_pmdown_time = 1,
2137 .codec_dai_name = "snd-soc-dummy-dai",
2138 .codec_name = "snd-soc-dummy",
2139 },
2140 {/* hw:x,19 */
2141 .name = "VoiceMMode2",
2142 .stream_name = "VoiceMMode2",
2143 .cpu_dai_name = "VoiceMMode2",
2144 .platform_name = "msm-pcm-voice",
2145 .dynamic = 1,
2146 .dpcm_capture = 1,
2147 .dpcm_playback = 1,
2148 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2149 SND_SOC_DPCM_TRIGGER_POST},
2150 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2151 .ignore_suspend = 1,
2152 .ignore_pmdown_time = 1,
2153 .codec_dai_name = "snd-soc-dummy-dai",
2154 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302155 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302156 },
2157 {/* hw:x,20 */
2158 .name = "Listen 2 Audio Service",
2159 .stream_name = "Listen 2 Audio Service",
2160 .cpu_dai_name = "LSM2",
2161 .platform_name = "msm-lsm-client",
2162 .dynamic = 1,
2163 .dpcm_capture = 1,
2164 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2165 SND_SOC_DPCM_TRIGGER_POST },
2166 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2167 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302168 .codec_dai_name = "snd-soc-dummy-dai",
2169 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302170 .id = MSM_FRONTEND_DAI_LSM2,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302171 },
2172 {/* hw:x,21 */
2173 .name = "Listen 3 Audio Service",
2174 .stream_name = "Listen 3 Audio Service",
2175 .cpu_dai_name = "LSM3",
2176 .platform_name = "msm-lsm-client",
2177 .dynamic = 1,
2178 .dpcm_capture = 1,
2179 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2180 SND_SOC_DPCM_TRIGGER_POST },
2181 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2182 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302183 .codec_dai_name = "snd-soc-dummy-dai",
2184 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302185 .id = MSM_FRONTEND_DAI_LSM3,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302186 },
2187 {/* hw:x,22 */
2188 .name = "Listen 4 Audio Service",
2189 .stream_name = "Listen 4 Audio Service",
2190 .cpu_dai_name = "LSM4",
2191 .platform_name = "msm-lsm-client",
2192 .dynamic = 1,
2193 .dpcm_capture = 1,
2194 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2195 SND_SOC_DPCM_TRIGGER_POST },
2196 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2197 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302198 .codec_dai_name = "snd-soc-dummy-dai",
2199 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302200 .id = MSM_FRONTEND_DAI_LSM4,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302201 },
2202 {/* hw:x,23 */
2203 .name = "Listen 5 Audio Service",
2204 .stream_name = "Listen 5 Audio Service",
2205 .cpu_dai_name = "LSM5",
2206 .platform_name = "msm-lsm-client",
2207 .dynamic = 1,
2208 .dpcm_capture = 1,
2209 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2210 SND_SOC_DPCM_TRIGGER_POST },
2211 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2212 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302213 .codec_dai_name = "snd-soc-dummy-dai",
2214 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302215 .id = MSM_FRONTEND_DAI_LSM5,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302216 },
2217 {/* hw:x,24 */
2218 .name = "Listen 6 Audio Service",
2219 .stream_name = "Listen 6 Audio Service",
2220 .cpu_dai_name = "LSM6",
2221 .platform_name = "msm-lsm-client",
2222 .dynamic = 1,
2223 .dpcm_capture = 1,
2224 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2225 SND_SOC_DPCM_TRIGGER_POST },
2226 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2227 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302228 .codec_dai_name = "snd-soc-dummy-dai",
2229 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302230 .id = MSM_FRONTEND_DAI_LSM6
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302231 },
2232 {/* hw:x,25 */
2233 .name = "Listen 7 Audio Service",
2234 .stream_name = "Listen 7 Audio Service",
2235 .cpu_dai_name = "LSM7",
2236 .platform_name = "msm-lsm-client",
2237 .dynamic = 1,
2238 .dpcm_capture = 1,
2239 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2240 SND_SOC_DPCM_TRIGGER_POST },
2241 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2242 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302243 .codec_dai_name = "snd-soc-dummy-dai",
2244 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302245 .id = MSM_FRONTEND_DAI_LSM7,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302246 },
2247 {/* hw:x,26 */
2248 .name = "Listen 8 Audio Service",
2249 .stream_name = "Listen 8 Audio Service",
2250 .cpu_dai_name = "LSM8",
2251 .platform_name = "msm-lsm-client",
2252 .dynamic = 1,
2253 .dpcm_capture = 1,
2254 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2255 SND_SOC_DPCM_TRIGGER_POST },
2256 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2257 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302258 .codec_dai_name = "snd-soc-dummy-dai",
2259 .codec_name = "snd-soc-dummy",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302260 .id = MSM_FRONTEND_DAI_LSM8,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302261 },
2262 {/* hw:x,27 */
2263 .name = MSM_DAILINK_NAME(Media9),
2264 .stream_name = "MultiMedia9",
2265 .cpu_dai_name = "MultiMedia9",
2266 .platform_name = "msm-pcm-dsp.0",
2267 .dynamic = 1,
2268 .dpcm_capture = 1,
2269 .dpcm_playback = 1,
2270 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2271 SND_SOC_DPCM_TRIGGER_POST},
2272 .codec_dai_name = "snd-soc-dummy-dai",
2273 .codec_name = "snd-soc-dummy",
2274 .ignore_suspend = 1,
2275 .ignore_pmdown_time = 1,
2276 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302277 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302278 },
2279 {/* hw:x,28 */
2280 .name = MSM_DAILINK_NAME(Compress4),
2281 .stream_name = "Compress4",
2282 .cpu_dai_name = "MultiMedia11",
2283 .platform_name = "msm-compress-dsp",
2284 .dynamic = 1,
2285 .dpcm_capture = 1,
2286 .dpcm_playback = 1,
2287 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2288 SND_SOC_DPCM_TRIGGER_POST},
2289 .codec_dai_name = "snd-soc-dummy-dai",
2290 .codec_name = "snd-soc-dummy",
2291 .ignore_suspend = 1,
2292 .ignore_pmdown_time = 1,
2293 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302294 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302295 },
2296 {/* hw:x,29 */
2297 .name = MSM_DAILINK_NAME(Compress5),
2298 .stream_name = "Compress5",
2299 .cpu_dai_name = "MultiMedia12",
2300 .platform_name = "msm-compress-dsp",
2301 .dynamic = 1,
2302 .dpcm_capture = 1,
2303 .dpcm_playback = 1,
2304 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2305 SND_SOC_DPCM_TRIGGER_POST},
2306 .codec_dai_name = "snd-soc-dummy-dai",
2307 .codec_name = "snd-soc-dummy",
2308 .ignore_suspend = 1,
2309 .ignore_pmdown_time = 1,
2310 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302311 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302312 },
2313 {/* hw:x,30 */
2314 .name = MSM_DAILINK_NAME(Compress6),
2315 .stream_name = "Compress6",
2316 .cpu_dai_name = "MultiMedia13",
2317 .platform_name = "msm-compress-dsp",
2318 .dynamic = 1,
2319 .dpcm_capture = 1,
2320 .dpcm_playback = 1,
2321 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2322 SND_SOC_DPCM_TRIGGER_POST},
2323 .codec_dai_name = "snd-soc-dummy-dai",
2324 .codec_name = "snd-soc-dummy",
2325 .ignore_suspend = 1,
2326 .ignore_pmdown_time = 1,
2327 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302328 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302329 },
2330 {/* hw:x,31 */
2331 .name = MSM_DAILINK_NAME(Compress7),
2332 .stream_name = "Compress7",
2333 .cpu_dai_name = "MultiMedia14",
2334 .platform_name = "msm-compress-dsp",
2335 .dynamic = 1,
2336 .dpcm_capture = 1,
2337 .dpcm_playback = 1,
2338 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2339 SND_SOC_DPCM_TRIGGER_POST},
2340 .codec_dai_name = "snd-soc-dummy-dai",
2341 .codec_name = "snd-soc-dummy",
2342 .ignore_suspend = 1,
2343 .ignore_pmdown_time = 1,
2344 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302345 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302346 },
2347 {/* hw:x,32 */
2348 .name = MSM_DAILINK_NAME(Compress8),
2349 .stream_name = "Compress8",
2350 .cpu_dai_name = "MultiMedia15",
2351 .platform_name = "msm-compress-dsp",
2352 .dynamic = 1,
2353 .dpcm_capture = 1,
2354 .dpcm_playback = 1,
2355 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2356 SND_SOC_DPCM_TRIGGER_POST},
2357 .codec_dai_name = "snd-soc-dummy-dai",
2358 .codec_name = "snd-soc-dummy",
2359 .ignore_suspend = 1,
2360 .ignore_pmdown_time = 1,
2361 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302362 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302363 },
2364 {/* hw:x,33 */
Asish Bhattacharya34504582017-08-08 12:55:01 +05302365 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
2366 .stream_name = "MM_NOIRQ_2",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302367 .cpu_dai_name = "MultiMedia16",
Asish Bhattacharya34504582017-08-08 12:55:01 +05302368 .platform_name = "msm-pcm-dsp-noirq",
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302369 .dynamic = 1,
2370 .dpcm_capture = 1,
2371 .dpcm_playback = 1,
2372 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2373 SND_SOC_DPCM_TRIGGER_POST},
2374 .codec_dai_name = "snd-soc-dummy-dai",
2375 .codec_name = "snd-soc-dummy",
2376 .ignore_suspend = 1,
2377 .ignore_pmdown_time = 1,
2378 /* this dai link has playback support */
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302379 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302380 },
2381 {/* hw:x,34 */
2382 .name = "SLIMBUS_8 Hostless",
2383 .stream_name = "SLIMBUS8_HOSTLESS Capture",
2384 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
2385 .platform_name = "msm-pcm-hostless",
2386 .dynamic = 1,
2387 .dpcm_capture = 1,
2388 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2389 SND_SOC_DPCM_TRIGGER_POST},
2390 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2391 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302392 .codec_dai_name = "snd-soc-dummy-dai",
2393 .codec_name = "snd-soc-dummy",
2394 },
2395 {/* hw:x,35 */
2396 .name = "Primary MI2S_RX Hostless",
2397 .stream_name = "Primary MI2S_RX Hostless",
2398 .cpu_dai_name = "PRI_MI2S_RX_HOSTLESS",
2399 .platform_name = "msm-pcm-hostless",
2400 .dynamic = 1,
2401 .dpcm_playback = 1,
2402 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2403 SND_SOC_DPCM_TRIGGER_POST},
2404 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2405 .ignore_suspend = 1,
2406 /* this dailink has playback support */
2407 .ignore_pmdown_time = 1,
2408 /* This dainlink has MI2S support */
2409 .codec_dai_name = "snd-soc-dummy-dai",
2410 .codec_name = "snd-soc-dummy",
2411 },
2412 {/* hw:x,36 */
2413 .name = "Secondary MI2S_RX Hostless",
2414 .stream_name = "Secondary MI2S_RX Hostless",
2415 .cpu_dai_name = "SEC_MI2S_RX_HOSTLESS",
2416 .platform_name = "msm-pcm-hostless",
2417 .dynamic = 1,
2418 .dpcm_playback = 1,
2419 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2420 SND_SOC_DPCM_TRIGGER_POST},
2421 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2422 .ignore_suspend = 1,
2423 /* this dailink has playback support */
2424 .ignore_pmdown_time = 1,
2425 /* This dainlink has MI2S support */
2426 .codec_dai_name = "snd-soc-dummy-dai",
2427 .codec_name = "snd-soc-dummy",
2428 },
2429 {/* hw:x,37 */
2430 .name = "Tertiary MI2S_RX Hostless",
2431 .stream_name = "Tertiary MI2S_RX Hostless",
2432 .cpu_dai_name = "TERT_MI2S_RX_HOSTLESS",
2433 .platform_name = "msm-pcm-hostless",
2434 .dynamic = 1,
2435 .dpcm_playback = 1,
2436 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2437 SND_SOC_DPCM_TRIGGER_POST},
2438 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2439 .ignore_suspend = 1,
2440 /* this dailink has playback support */
2441 .ignore_pmdown_time = 1,
2442 /* This dainlink has MI2S support */
2443 .codec_dai_name = "snd-soc-dummy-dai",
2444 .codec_name = "snd-soc-dummy",
2445 },
2446 {/* hw:x,38 */
2447 .name = "INT0 MI2S_RX Hostless",
2448 .stream_name = "INT0 MI2S_RX Hostless",
2449 .cpu_dai_name = "INT0_MI2S_RX_HOSTLESS",
2450 .platform_name = "msm-pcm-hostless",
2451 .dynamic = 1,
2452 .dpcm_playback = 1,
2453 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2454 SND_SOC_DPCM_TRIGGER_POST},
2455 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2456 .ignore_suspend = 1,
2457 /* this dailink has playback support */
2458 .ignore_pmdown_time = 1,
2459 /* This dainlink has MI2S support */
2460 .codec_dai_name = "snd-soc-dummy-dai",
2461 .codec_name = "snd-soc-dummy",
2462 },
2463 {/* hw:x,39 */
2464 .name = "SDM660 HFP TX",
2465 .stream_name = "MultiMedia6",
2466 .cpu_dai_name = "MultiMedia6",
2467 .platform_name = "msm-pcm-loopback",
2468 .dynamic = 1,
2469 .dpcm_playback = 1,
2470 .dpcm_capture = 1,
2471 .codec_dai_name = "snd-soc-dummy-dai",
2472 .codec_name = "snd-soc-dummy",
2473 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2474 SND_SOC_DPCM_TRIGGER_POST},
2475 .ignore_suspend = 1,
2476 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2477 .ignore_pmdown_time = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302478 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302479 },
2480};
2481
2482
2483static struct snd_soc_dai_link msm_int_wsa_dai[] = {
2484 {/* hw:x,40 */
2485 .name = LPASS_BE_INT5_MI2S_TX,
2486 .stream_name = "INT5_mi2s Capture",
2487 .cpu_dai_name = "msm-dai-q6-mi2s.12",
2488 .platform_name = "msm-pcm-hostless",
2489 .codec_name = "msm_sdw_codec",
2490 .codec_dai_name = "msm_sdw_vifeedback",
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302491 .id = MSM_BACKEND_DAI_INT5_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302492 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2493 .ops = &msm_sdw_mi2s_be_ops,
2494 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
2495 .ignore_suspend = 1,
2496 .dpcm_capture = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302497 },
2498};
2499
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05302500static struct snd_soc_dai_link msm_int_compress_capture_dai[] = {
2501 {/* hw:x,41 */
2502 .name = "Compress9",
2503 .stream_name = "Compress9",
2504 .cpu_dai_name = "MultiMedia17",
2505 .platform_name = "msm-compress-dsp",
2506 .dynamic = 1,
2507 .dpcm_capture = 1,
2508 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2509 SND_SOC_DPCM_TRIGGER_POST},
2510 .codec_dai_name = "snd-soc-dummy-dai",
2511 .codec_name = "snd-soc-dummy",
2512 .ignore_suspend = 1,
2513 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
2514 },
2515 {/* hw:x,42 */
2516 .name = "Compress10",
2517 .stream_name = "Compress10",
2518 .cpu_dai_name = "MultiMedia18",
2519 .platform_name = "msm-compress-dsp",
2520 .dynamic = 1,
2521 .dpcm_capture = 1,
2522 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2523 SND_SOC_DPCM_TRIGGER_POST},
2524 .codec_dai_name = "snd-soc-dummy-dai",
2525 .codec_name = "snd-soc-dummy",
2526 .ignore_suspend = 1,
2527 .id = MSM_FRONTEND_DAI_MULTIMEDIA18,
2528 },
2529 {/* hw:x,43 */
2530 .name = "Compress11",
2531 .stream_name = "Compress11",
2532 .cpu_dai_name = "MultiMedia19",
2533 .platform_name = "msm-compress-dsp",
2534 .dynamic = 1,
2535 .dpcm_capture = 1,
2536 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2537 SND_SOC_DPCM_TRIGGER_POST},
2538 .codec_dai_name = "snd-soc-dummy-dai",
2539 .codec_name = "snd-soc-dummy",
2540 .ignore_suspend = 1,
2541 .id = MSM_FRONTEND_DAI_MULTIMEDIA19,
2542 },
2543 {/* hw:x,44 */
2544 .name = "Compress12",
2545 .stream_name = "Compress12",
2546 .cpu_dai_name = "MultiMedia28",
2547 .platform_name = "msm-compress-dsp",
2548 .dynamic = 1,
2549 .dpcm_capture = 1,
2550 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2551 SND_SOC_DPCM_TRIGGER_POST},
2552 .codec_dai_name = "snd-soc-dummy-dai",
2553 .codec_name = "snd-soc-dummy",
2554 .ignore_suspend = 1,
2555 .id = MSM_FRONTEND_DAI_MULTIMEDIA28,
2556 },
2557 {/* hw:x,45 */
2558 .name = "Compress13",
2559 .stream_name = "Compress13",
2560 .cpu_dai_name = "MultiMedia29",
2561 .platform_name = "msm-compress-dsp",
2562 .dynamic = 1,
2563 .dpcm_capture = 1,
2564 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
2565 SND_SOC_DPCM_TRIGGER_POST},
2566 .codec_dai_name = "snd-soc-dummy-dai",
2567 .codec_name = "snd-soc-dummy",
2568 .ignore_suspend = 1,
2569 .id = MSM_FRONTEND_DAI_MULTIMEDIA29,
2570 },
2571};
2572
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302573static struct snd_soc_dai_link msm_int_be_dai[] = {
2574 /* Backend I2S DAI Links */
2575 {
2576 .name = LPASS_BE_INT0_MI2S_RX,
2577 .stream_name = "INT0 MI2S Playback",
2578 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2579 .platform_name = "msm-pcm-routing",
2580 .codecs = dlc_rx1,
2581 .num_codecs = CODECS_MAX,
2582 .no_pcm = 1,
2583 .dpcm_playback = 1,
2584 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2585 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302586 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302587 .init = &msm_audrx_init,
2588 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2589 .ops = &msm_int_mi2s_be_ops,
2590 .ignore_suspend = 1,
2591 },
2592 {
2593 .name = LPASS_BE_INT3_MI2S_TX,
2594 .stream_name = "INT3 MI2S Capture",
2595 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2596 .platform_name = "msm-pcm-routing",
2597 .codecs = dlc_tx1,
2598 .num_codecs = CODECS_MAX,
2599 .no_pcm = 1,
2600 .dpcm_capture = 1,
2601 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2602 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302603 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302604 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2605 .ops = &msm_int_mi2s_be_ops,
2606 .ignore_suspend = 1,
2607 },
2608 {
2609 .name = LPASS_BE_INT2_MI2S_TX,
2610 .stream_name = "INT2 MI2S Capture",
2611 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2612 .platform_name = "msm-pcm-routing",
2613 .codecs = dlc_tx2,
2614 .num_codecs = CODECS_MAX,
2615 .no_pcm = 1,
2616 .dpcm_capture = 1,
2617 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2618 ASYNC_DPCM_SND_SOC_HW_PARAMS,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302619 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302620 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2621 .ops = &msm_int_mi2s_be_ops,
2622 .ignore_suspend = 1,
2623 },
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05302624};
2625
2626static struct snd_soc_dai_link msm_int_dig_be_dai[] = {
2627 /* DIG Codec Backend DAI Links */
2628 {
2629 .name = LPASS_BE_INT0_MI2S_RX,
2630 .stream_name = "INT0 MI2S Playback",
2631 .cpu_dai_name = "msm-dai-q6-mi2s.7",
2632 .platform_name = "msm-pcm-routing",
2633 .codec_dai_name = "msm_dig_cdc_dai_rx1",
2634 .no_pcm = 1,
2635 .dpcm_playback = 1,
2636 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2637 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2638 .id = MSM_BACKEND_DAI_INT0_MI2S_RX,
2639 .init = &msm_dig_audrx_init,
2640 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2641 .ops = &msm_int_dig_mi2s_be_ops,
2642 .ignore_suspend = 1,
2643 },
2644 {
2645 .name = LPASS_BE_INT3_MI2S_TX,
2646 .stream_name = "INT3 MI2S Capture",
2647 .cpu_dai_name = "msm-dai-q6-mi2s.10",
2648 .platform_name = "msm-pcm-routing",
2649 .codec_dai_name = "msm_dig_cdc_dai_tx1",
2650 .no_pcm = 1,
2651 .dpcm_capture = 1,
2652 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2653 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2654 .id = MSM_BACKEND_DAI_INT3_MI2S_TX,
2655 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2656 .ops = &msm_int_dig_mi2s_be_ops,
2657 .ignore_suspend = 1,
2658 },
2659 {
2660 .name = LPASS_BE_INT2_MI2S_TX,
2661 .stream_name = "INT2 MI2S Capture",
2662 .cpu_dai_name = "msm-dai-q6-mi2s.9",
2663 .platform_name = "msm-pcm-routing",
2664 .codec_dai_name = "msm_dig_cdc_dai_tx2",
2665 .no_pcm = 1,
2666 .dpcm_capture = 1,
2667 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE |
2668 ASYNC_DPCM_SND_SOC_HW_PARAMS,
2669 .id = MSM_BACKEND_DAI_INT2_MI2S_TX,
2670 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
2671 .ops = &msm_int_dig_mi2s_be_ops,
2672 .ignore_suspend = 1,
2673 },
2674};
2675
2676static struct snd_soc_dai_link msm_int_common_be_dai[] = {
2677 /* Backend I2S DAI Links */
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302678 {
2679 .name = LPASS_BE_AFE_PCM_RX,
2680 .stream_name = "AFE Playback",
2681 .cpu_dai_name = "msm-dai-q6-dev.224",
2682 .platform_name = "msm-pcm-routing",
2683 .codec_name = "msm-stub-codec.1",
2684 .codec_dai_name = "msm-stub-rx",
2685 .no_pcm = 1,
2686 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302687 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302688 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2689 /* this dainlink has playback support */
2690 .ignore_pmdown_time = 1,
2691 .ignore_suspend = 1,
2692 },
2693 {
2694 .name = LPASS_BE_AFE_PCM_TX,
2695 .stream_name = "AFE Capture",
2696 .cpu_dai_name = "msm-dai-q6-dev.225",
2697 .platform_name = "msm-pcm-routing",
2698 .codec_name = "msm-stub-codec.1",
2699 .codec_dai_name = "msm-stub-tx",
2700 .no_pcm = 1,
2701 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302702 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302703 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2704 .ignore_suspend = 1,
2705 },
2706 /* Incall Record Uplink BACK END DAI Link */
2707 {
2708 .name = LPASS_BE_INCALL_RECORD_TX,
2709 .stream_name = "Voice Uplink Capture",
2710 .cpu_dai_name = "msm-dai-q6-dev.32772",
2711 .platform_name = "msm-pcm-routing",
2712 .codec_name = "msm-stub-codec.1",
2713 .codec_dai_name = "msm-stub-tx",
2714 .no_pcm = 1,
2715 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302716 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302717 .be_hw_params_fixup = msm_be_hw_params_fixup,
2718 .ignore_suspend = 1,
2719 },
2720 /* Incall Record Downlink BACK END DAI Link */
2721 {
2722 .name = LPASS_BE_INCALL_RECORD_RX,
2723 .stream_name = "Voice Downlink Capture",
2724 .cpu_dai_name = "msm-dai-q6-dev.32771",
2725 .platform_name = "msm-pcm-routing",
2726 .codec_name = "msm-stub-codec.1",
2727 .codec_dai_name = "msm-stub-tx",
2728 .no_pcm = 1,
2729 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302730 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302731 .be_hw_params_fixup = msm_be_hw_params_fixup,
2732 .ignore_suspend = 1,
2733 },
2734 /* Incall Music BACK END DAI Link */
2735 {
2736 .name = LPASS_BE_VOICE_PLAYBACK_TX,
2737 .stream_name = "Voice Farend Playback",
2738 .cpu_dai_name = "msm-dai-q6-dev.32773",
2739 .platform_name = "msm-pcm-routing",
2740 .codec_name = "msm-stub-codec.1",
2741 .codec_dai_name = "msm-stub-rx",
2742 .no_pcm = 1,
2743 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302744 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302745 .be_hw_params_fixup = msm_be_hw_params_fixup,
2746 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302747 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302748 },
2749 /* Incall Music 2 BACK END DAI Link */
2750 {
2751 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
2752 .stream_name = "Voice2 Farend Playback",
2753 .cpu_dai_name = "msm-dai-q6-dev.32770",
2754 .platform_name = "msm-pcm-routing",
2755 .codec_name = "msm-stub-codec.1",
2756 .codec_dai_name = "msm-stub-rx",
2757 .no_pcm = 1,
2758 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302759 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302760 .be_hw_params_fixup = msm_be_hw_params_fixup,
2761 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302762 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302763 },
2764 {
2765 .name = LPASS_BE_USB_AUDIO_RX,
2766 .stream_name = "USB Audio Playback",
2767 .cpu_dai_name = "msm-dai-q6-dev.28672",
2768 .platform_name = "msm-pcm-routing",
2769 .codec_name = "msm-stub-codec.1",
2770 .codec_dai_name = "msm-stub-rx",
2771 .no_pcm = 1,
2772 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302773 .id = MSM_BACKEND_DAI_USB_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302774 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2775 .ignore_pmdown_time = 1,
2776 .ignore_suspend = 1,
2777 },
2778 {
2779 .name = LPASS_BE_USB_AUDIO_TX,
2780 .stream_name = "USB Audio Capture",
2781 .cpu_dai_name = "msm-dai-q6-dev.28673",
2782 .platform_name = "msm-pcm-routing",
2783 .codec_name = "msm-stub-codec.1",
2784 .codec_dai_name = "msm-stub-tx",
2785 .no_pcm = 1,
2786 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302787 .id = MSM_BACKEND_DAI_USB_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302788 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2789 .ignore_suspend = 1,
2790 },
2791 {
2792 .name = LPASS_BE_PRI_TDM_RX_0,
2793 .stream_name = "Primary TDM0 Playback",
2794 .cpu_dai_name = "msm-dai-q6-tdm.36864",
2795 .platform_name = "msm-pcm-routing",
2796 .codec_name = "msm-stub-codec.1",
2797 .codec_dai_name = "msm-stub-rx",
2798 .no_pcm = 1,
2799 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302800 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302801 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2802 .ops = &msm_tdm_be_ops,
2803 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302804 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302805 },
2806 {
2807 .name = LPASS_BE_PRI_TDM_TX_0,
2808 .stream_name = "Primary TDM0 Capture",
2809 .cpu_dai_name = "msm-dai-q6-tdm.36865",
2810 .platform_name = "msm-pcm-routing",
2811 .codec_name = "msm-stub-codec.1",
2812 .codec_dai_name = "msm-stub-tx",
2813 .no_pcm = 1,
2814 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302815 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302816 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2817 .ops = &msm_tdm_be_ops,
2818 .ignore_suspend = 1,
2819 },
2820 {
2821 .name = LPASS_BE_SEC_TDM_RX_0,
2822 .stream_name = "Secondary TDM0 Playback",
2823 .cpu_dai_name = "msm-dai-q6-tdm.36880",
2824 .platform_name = "msm-pcm-routing",
2825 .codec_name = "msm-stub-codec.1",
2826 .codec_dai_name = "msm-stub-rx",
2827 .no_pcm = 1,
2828 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302829 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302830 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2831 .ops = &msm_tdm_be_ops,
2832 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302833 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302834 },
2835 {
2836 .name = LPASS_BE_SEC_TDM_TX_0,
2837 .stream_name = "Secondary TDM0 Capture",
2838 .cpu_dai_name = "msm-dai-q6-tdm.36881",
2839 .platform_name = "msm-pcm-routing",
2840 .codec_name = "msm-stub-codec.1",
2841 .codec_dai_name = "msm-stub-tx",
2842 .no_pcm = 1,
2843 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302844 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302845 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2846 .ops = &msm_tdm_be_ops,
2847 .ignore_suspend = 1,
2848 },
2849 {
2850 .name = LPASS_BE_TERT_TDM_RX_0,
2851 .stream_name = "Tertiary TDM0 Playback",
2852 .cpu_dai_name = "msm-dai-q6-tdm.36896",
2853 .platform_name = "msm-pcm-routing",
2854 .codec_name = "msm-stub-codec.1",
2855 .codec_dai_name = "msm-stub-rx",
2856 .no_pcm = 1,
2857 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302858 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302859 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2860 .ops = &msm_tdm_be_ops,
2861 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302862 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302863 },
2864 {
2865 .name = LPASS_BE_TERT_TDM_TX_0,
2866 .stream_name = "Tertiary TDM0 Capture",
2867 .cpu_dai_name = "msm-dai-q6-tdm.36897",
2868 .platform_name = "msm-pcm-routing",
2869 .codec_name = "msm-stub-codec.1",
2870 .codec_dai_name = "msm-stub-tx",
2871 .no_pcm = 1,
2872 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302873 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302874 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2875 .ops = &msm_tdm_be_ops,
2876 .ignore_suspend = 1,
2877 },
2878 {
2879 .name = LPASS_BE_QUAT_TDM_RX_0,
2880 .stream_name = "Quaternary TDM0 Playback",
2881 .cpu_dai_name = "msm-dai-q6-tdm.36912",
2882 .platform_name = "msm-pcm-routing",
2883 .codec_name = "msm-stub-codec.1",
2884 .codec_dai_name = "msm-stub-rx",
2885 .no_pcm = 1,
2886 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302887 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302888 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2889 .ops = &msm_tdm_be_ops,
2890 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302891 .ignore_pmdown_time = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302892 },
2893 {
2894 .name = LPASS_BE_QUAT_TDM_TX_0,
2895 .stream_name = "Quaternary TDM0 Capture",
2896 .cpu_dai_name = "msm-dai-q6-tdm.36913",
2897 .platform_name = "msm-pcm-routing",
2898 .codec_name = "msm-stub-codec.1",
2899 .codec_dai_name = "msm-stub-tx",
2900 .no_pcm = 1,
2901 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302902 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302903 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2904 .ops = &msm_tdm_be_ops,
2905 .ignore_suspend = 1,
2906 },
Rohit Kumard1754482017-09-10 22:57:39 +05302907 {
2908 .name = LPASS_BE_QUIN_TDM_RX_0,
2909 .stream_name = "Quinary TDM0 Playback",
Rohit kumar091ff792017-10-11 18:35:07 +05302910 .cpu_dai_name = "msm-dai-q6-tdm.36928",
Rohit Kumard1754482017-09-10 22:57:39 +05302911 .platform_name = "msm-pcm-routing",
2912 .codec_name = "msm-stub-codec.1",
2913 .codec_dai_name = "msm-stub-rx",
2914 .no_pcm = 1,
2915 .dpcm_playback = 1,
2916 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
2917 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2918 .ops = &msm_tdm_be_ops,
2919 .ignore_suspend = 1,
Aditya Bavanari140a80a2018-01-03 16:51:17 +05302920 .ignore_pmdown_time = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05302921 },
2922 {
2923 .name = LPASS_BE_QUIN_TDM_TX_0,
2924 .stream_name = "Quinary TDM0 Capture",
Rohit kumar091ff792017-10-11 18:35:07 +05302925 .cpu_dai_name = "msm-dai-q6-tdm.36929",
Rohit Kumard1754482017-09-10 22:57:39 +05302926 .platform_name = "msm-pcm-routing",
2927 .codec_name = "msm-stub-codec.1",
2928 .codec_dai_name = "msm-stub-tx",
2929 .no_pcm = 1,
2930 .dpcm_capture = 1,
2931 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
2932 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2933 .ops = &msm_tdm_be_ops,
2934 .ignore_suspend = 1,
2935 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302936};
2937
2938static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
2939 {
2940 .name = LPASS_BE_PRI_MI2S_RX,
2941 .stream_name = "Primary MI2S Playback",
2942 .cpu_dai_name = "msm-dai-q6-mi2s.0",
2943 .platform_name = "msm-pcm-routing",
2944 .codec_name = "msm-stub-codec.1",
2945 .codec_dai_name = "msm-stub-rx",
2946 .no_pcm = 1,
2947 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302948 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302949 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2950 .ops = &msm_mi2s_be_ops,
2951 .ignore_suspend = 1,
2952 .ignore_pmdown_time = 1,
2953 },
2954 {
2955 .name = LPASS_BE_PRI_MI2S_TX,
2956 .stream_name = "Primary MI2S Capture",
2957 .cpu_dai_name = "msm-dai-q6-mi2s.0",
2958 .platform_name = "msm-pcm-routing",
2959 .codec_name = "msm-stub-codec.1",
2960 .codec_dai_name = "msm-stub-tx",
2961 .no_pcm = 1,
2962 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302963 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302964 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2965 .ops = &msm_mi2s_be_ops,
2966 .ignore_suspend = 1,
2967 },
2968 {
2969 .name = LPASS_BE_SEC_MI2S_RX,
2970 .stream_name = "Secondary MI2S Playback",
2971 .cpu_dai_name = "msm-dai-q6-mi2s.1",
2972 .platform_name = "msm-pcm-routing",
2973 .codec_name = "msm-stub-codec.1",
2974 .codec_dai_name = "msm-stub-rx",
2975 .no_pcm = 1,
2976 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302977 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302978 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2979 .ops = &msm_mi2s_be_ops,
2980 .ignore_suspend = 1,
2981 .ignore_pmdown_time = 1,
2982 },
2983 {
2984 .name = LPASS_BE_SEC_MI2S_TX,
2985 .stream_name = "Secondary MI2S Capture",
2986 .cpu_dai_name = "msm-dai-q6-mi2s.1",
2987 .platform_name = "msm-pcm-routing",
2988 .codec_name = "msm-stub-codec.1",
2989 .codec_dai_name = "msm-stub-tx",
2990 .no_pcm = 1,
2991 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05302992 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05302993 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
2994 .ops = &msm_mi2s_be_ops,
2995 .ignore_suspend = 1,
2996 },
2997 {
2998 .name = LPASS_BE_TERT_MI2S_RX,
2999 .stream_name = "Tertiary MI2S Playback",
3000 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3001 .platform_name = "msm-pcm-routing",
3002 .codec_name = "msm-stub-codec.1",
3003 .codec_dai_name = "msm-stub-rx",
3004 .no_pcm = 1,
3005 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303006 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303007 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3008 .ops = &msm_mi2s_be_ops,
3009 .ignore_suspend = 1,
3010 .ignore_pmdown_time = 1,
3011 },
3012 {
3013 .name = LPASS_BE_TERT_MI2S_TX,
3014 .stream_name = "Tertiary MI2S Capture",
3015 .cpu_dai_name = "msm-dai-q6-mi2s.2",
3016 .platform_name = "msm-pcm-routing",
3017 .codec_name = "msm-stub-codec.1",
3018 .codec_dai_name = "msm-stub-tx",
3019 .no_pcm = 1,
3020 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303021 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303022 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3023 .ops = &msm_mi2s_be_ops,
3024 .ignore_suspend = 1,
3025 },
3026 {
3027 .name = LPASS_BE_QUAT_MI2S_RX,
3028 .stream_name = "Quaternary MI2S Playback",
3029 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3030 .platform_name = "msm-pcm-routing",
3031 .codec_name = "msm-stub-codec.1",
3032 .codec_dai_name = "msm-stub-rx",
3033 .no_pcm = 1,
3034 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303035 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303036 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3037 .ops = &msm_mi2s_be_ops,
3038 .ignore_suspend = 1,
3039 .ignore_pmdown_time = 1,
3040 },
3041 {
3042 .name = LPASS_BE_QUAT_MI2S_TX,
3043 .stream_name = "Quaternary MI2S Capture",
3044 .cpu_dai_name = "msm-dai-q6-mi2s.3",
3045 .platform_name = "msm-pcm-routing",
3046 .codec_name = "msm-stub-codec.1",
3047 .codec_dai_name = "msm-stub-tx",
3048 .no_pcm = 1,
3049 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303050 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303051 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3052 .ops = &msm_mi2s_be_ops,
3053 .ignore_suspend = 1,
3054 },
Rohit Kumard1754482017-09-10 22:57:39 +05303055 {
3056 .name = LPASS_BE_QUIN_MI2S_RX,
3057 .stream_name = "Quinary MI2S Playback",
Rohit kumar20df5452017-10-16 15:35:56 +05303058 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303059 .platform_name = "msm-pcm-routing",
3060 .codec_name = "msm-stub-codec.1",
3061 .codec_dai_name = "msm-stub-rx",
3062 .no_pcm = 1,
3063 .dpcm_playback = 1,
3064 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
3065 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3066 .ops = &msm_mi2s_be_ops,
3067 .ignore_suspend = 1,
3068 .ignore_pmdown_time = 1,
3069 },
3070 {
3071 .name = LPASS_BE_QUIN_MI2S_TX,
3072 .stream_name = "Quinary MI2S Capture",
Rohit kumar20df5452017-10-16 15:35:56 +05303073 .cpu_dai_name = "msm-dai-q6-mi2s.4",
Rohit Kumard1754482017-09-10 22:57:39 +05303074 .platform_name = "msm-pcm-routing",
3075 .codec_name = "msm-stub-codec.1",
3076 .codec_dai_name = "msm-stub-tx",
3077 .no_pcm = 1,
3078 .dpcm_capture = 1,
3079 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
3080 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3081 .ops = &msm_mi2s_be_ops,
3082 .ignore_suspend = 1,
3083 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303084};
3085
3086static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
3087 /* Primary AUX PCM Backend DAI Links */
3088 {
3089 .name = LPASS_BE_AUXPCM_RX,
3090 .stream_name = "AUX PCM Playback",
3091 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3092 .platform_name = "msm-pcm-routing",
3093 .codec_name = "msm-stub-codec.1",
3094 .codec_dai_name = "msm-stub-rx",
3095 .no_pcm = 1,
3096 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303097 .id = MSM_BACKEND_DAI_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303098 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3099 .ignore_pmdown_time = 1,
3100 .ignore_suspend = 1,
3101 .ops = &msm_aux_pcm_be_ops,
3102 },
3103 {
3104 .name = LPASS_BE_AUXPCM_TX,
3105 .stream_name = "AUX PCM Capture",
3106 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
3107 .platform_name = "msm-pcm-routing",
3108 .codec_name = "msm-stub-codec.1",
3109 .codec_dai_name = "msm-stub-tx",
3110 .no_pcm = 1,
3111 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303112 .id = MSM_BACKEND_DAI_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303113 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303114 .ignore_suspend = 1,
3115 .ops = &msm_aux_pcm_be_ops,
3116 },
3117 /* Secondary AUX PCM Backend DAI Links */
3118 {
3119 .name = LPASS_BE_SEC_AUXPCM_RX,
3120 .stream_name = "Sec AUX PCM Playback",
3121 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3122 .platform_name = "msm-pcm-routing",
3123 .codec_name = "msm-stub-codec.1",
3124 .codec_dai_name = "msm-stub-rx",
3125 .no_pcm = 1,
3126 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303127 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303128 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3129 .ignore_pmdown_time = 1,
3130 .ignore_suspend = 1,
3131 .ops = &msm_aux_pcm_be_ops,
3132 },
3133 {
3134 .name = LPASS_BE_SEC_AUXPCM_TX,
3135 .stream_name = "Sec AUX PCM Capture",
3136 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
3137 .platform_name = "msm-pcm-routing",
3138 .codec_name = "msm-stub-codec.1",
3139 .codec_dai_name = "msm-stub-tx",
3140 .no_pcm = 1,
3141 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303142 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303143 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3144 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303145 .ops = &msm_aux_pcm_be_ops,
3146 },
3147 /* Tertiary AUX PCM Backend DAI Links */
3148 {
3149 .name = LPASS_BE_TERT_AUXPCM_RX,
3150 .stream_name = "Tert AUX PCM Playback",
3151 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3152 .platform_name = "msm-pcm-routing",
3153 .codec_name = "msm-stub-codec.1",
3154 .codec_dai_name = "msm-stub-rx",
3155 .no_pcm = 1,
3156 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303157 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303158 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3159 .ignore_pmdown_time = 1,
3160 .ignore_suspend = 1,
3161 .ops = &msm_aux_pcm_be_ops,
3162 },
3163 {
3164 .name = LPASS_BE_TERT_AUXPCM_TX,
3165 .stream_name = "Tert AUX PCM Capture",
3166 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
3167 .platform_name = "msm-pcm-routing",
3168 .codec_name = "msm-stub-codec.1",
3169 .codec_dai_name = "msm-stub-tx",
3170 .no_pcm = 1,
3171 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303172 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303173 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3174 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303175 .ops = &msm_aux_pcm_be_ops,
3176 },
3177 /* Quaternary AUX PCM Backend DAI Links */
3178 {
3179 .name = LPASS_BE_QUAT_AUXPCM_RX,
3180 .stream_name = "Quat AUX PCM Playback",
3181 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3182 .platform_name = "msm-pcm-routing",
3183 .codec_name = "msm-stub-codec.1",
3184 .codec_dai_name = "msm-stub-rx",
3185 .no_pcm = 1,
3186 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303187 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303188 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3189 .ignore_pmdown_time = 1,
3190 .ignore_suspend = 1,
3191 .ops = &msm_aux_pcm_be_ops,
3192 },
3193 {
3194 .name = LPASS_BE_QUAT_AUXPCM_TX,
3195 .stream_name = "Quat AUX PCM Capture",
3196 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
3197 .platform_name = "msm-pcm-routing",
3198 .codec_name = "msm-stub-codec.1",
3199 .codec_dai_name = "msm-stub-tx",
3200 .no_pcm = 1,
3201 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303202 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303203 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3204 .ignore_suspend = 1,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303205 .ops = &msm_aux_pcm_be_ops,
3206 },
Rohit Kumard1754482017-09-10 22:57:39 +05303207 /* Quinary AUX PCM Backend DAI Links */
3208 {
3209 .name = LPASS_BE_QUIN_AUXPCM_RX,
3210 .stream_name = "Quin AUX PCM Playback",
3211 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3212 .platform_name = "msm-pcm-routing",
3213 .codec_name = "msm-stub-codec.1",
3214 .codec_dai_name = "msm-stub-rx",
3215 .no_pcm = 1,
3216 .dpcm_playback = 1,
3217 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
3218 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3219 .ignore_pmdown_time = 1,
3220 .ignore_suspend = 1,
3221 .ops = &msm_aux_pcm_be_ops,
3222 },
3223 {
3224 .name = LPASS_BE_QUIN_AUXPCM_TX,
3225 .stream_name = "Quin AUX PCM Capture",
3226 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
3227 .platform_name = "msm-pcm-routing",
3228 .codec_name = "msm-stub-codec.1",
3229 .codec_dai_name = "msm-stub-tx",
3230 .no_pcm = 1,
3231 .dpcm_capture = 1,
3232 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
3233 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3234 .ignore_suspend = 1,
Rohit Kumard1754482017-09-10 22:57:39 +05303235 .ops = &msm_aux_pcm_be_ops,
3236 },
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303237};
3238
3239
3240static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
3241 {
3242 .name = LPASS_BE_SLIMBUS_7_RX,
3243 .stream_name = "Slimbus7 Playback",
3244 .cpu_dai_name = "msm-dai-q6-dev.16398",
3245 .platform_name = "msm-pcm-routing",
3246 .codec_name = "btfmslim_slave",
3247 /* BT codec driver determines capabilities based on
3248 * dai name, bt codecdai name should always contains
3249 * supported usecase information
3250 */
3251 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
3252 .no_pcm = 1,
3253 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303254 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303255 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3256 .ops = &msm_wcn_ops,
3257 /* dai link has playback support */
3258 .ignore_pmdown_time = 1,
3259 .ignore_suspend = 1,
3260 },
3261 {
3262 .name = LPASS_BE_SLIMBUS_7_TX,
3263 .stream_name = "Slimbus7 Capture",
3264 .cpu_dai_name = "msm-dai-q6-dev.16399",
3265 .platform_name = "msm-pcm-routing",
3266 .codec_name = "btfmslim_slave",
3267 .codec_dai_name = "btfm_bt_sco_slim_tx",
3268 .no_pcm = 1,
3269 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303270 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303271 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3272 .ops = &msm_wcn_ops,
3273 .ignore_suspend = 1,
3274 },
3275 {
3276 .name = LPASS_BE_SLIMBUS_8_TX,
3277 .stream_name = "Slimbus8 Capture",
3278 .cpu_dai_name = "msm-dai-q6-dev.16401",
3279 .platform_name = "msm-pcm-routing",
3280 .codec_name = "btfmslim_slave",
3281 .codec_dai_name = "btfm_fm_slim_tx",
3282 .no_pcm = 1,
3283 .dpcm_capture = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303284 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303285 .be_hw_params_fixup = msm_btfm_be_hw_params_fixup,
3286 .init = &msm_wcn_init,
3287 .ops = &msm_wcn_ops,
3288 .ignore_suspend = 1,
3289 },
3290};
3291
3292static struct snd_soc_dai_link msm_wsa_be_dai_links[] = {
3293 {
3294 .name = LPASS_BE_INT4_MI2S_RX,
3295 .stream_name = "INT4 MI2S Playback",
3296 .cpu_dai_name = "msm-dai-q6-mi2s.11",
3297 .platform_name = "msm-pcm-routing",
3298 .codec_name = "msm_sdw_codec",
3299 .codec_dai_name = "msm_sdw_i2s_rx1",
3300 .no_pcm = 1,
3301 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303302 .id = MSM_BACKEND_DAI_INT4_MI2S_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303303 .init = &msm_sdw_audrx_init,
3304 .be_hw_params_fixup = int_mi2s_be_hw_params_fixup,
3305 .ops = &msm_sdw_mi2s_be_ops,
3306 .ignore_suspend = 1,
3307 },
3308};
3309
3310static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
3311 /* DISP PORT BACK END DAI Link */
3312 {
3313 .name = LPASS_BE_DISPLAY_PORT,
3314 .stream_name = "Display Port Playback",
3315 .cpu_dai_name = "msm-dai-q6-dp.24608",
3316 .platform_name = "msm-pcm-routing",
3317 .codec_name = "msm-ext-disp-audio-codec-rx",
3318 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
3319 .no_pcm = 1,
3320 .dpcm_playback = 1,
Asish Bhattacharya84f7f732017-07-25 16:29:27 +05303321 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303322 .be_hw_params_fixup = msm_common_be_hw_params_fixup,
3323 .ignore_pmdown_time = 1,
3324 .ignore_suspend = 1,
3325 },
3326};
3327
3328static struct snd_soc_dai_link msm_int_dai_links[
3329ARRAY_SIZE(msm_int_dai) +
3330ARRAY_SIZE(msm_int_wsa_dai) +
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303331ARRAY_SIZE(msm_int_compress_capture_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303332ARRAY_SIZE(msm_int_be_dai) +
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303333ARRAY_SIZE(msm_int_dig_be_dai) +
3334ARRAY_SIZE(msm_int_common_be_dai) +
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303335ARRAY_SIZE(msm_mi2s_be_dai_links) +
3336ARRAY_SIZE(msm_auxpcm_be_dai_links)+
3337ARRAY_SIZE(msm_wcn_be_dai_links) +
3338ARRAY_SIZE(msm_wsa_be_dai_links) +
3339ARRAY_SIZE(ext_disp_be_dai_link)];
3340
3341static struct snd_soc_card sdm660_card = {
3342 /* snd_soc_card_sdm660 */
3343 .name = "sdm660-snd-card",
3344 .dai_link = msm_int_dai,
3345 .num_links = ARRAY_SIZE(msm_int_dai),
3346 .late_probe = msm_snd_card_late_probe,
3347};
3348
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303349static struct snd_soc_card qcs605_dig_card = {
3350 /* snd_soc_card_qcs605 */
3351 .name = "qcs605-dig-snd-card",
3352 .dai_link = msm_int_dai,
3353 .num_links = ARRAY_SIZE(msm_int_dai),
3354};
3355
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303356static void msm_disable_int_mclk0(struct work_struct *work)
3357{
3358 struct msm_asoc_mach_data *pdata = NULL;
3359 struct delayed_work *dwork;
3360 int ret = 0;
3361
3362 dwork = to_delayed_work(work);
3363 pdata = container_of(dwork, struct msm_asoc_mach_data,
3364 disable_int_mclk0_work);
3365 mutex_lock(&pdata->cdc_int_mclk0_mutex);
3366 pr_debug("%s: mclk_enabled %d mclk_rsc_ref %d\n", __func__,
3367 atomic_read(&pdata->int_mclk0_enabled),
3368 atomic_read(&pdata->int_mclk0_rsc_ref));
3369
3370 if (atomic_read(&pdata->int_mclk0_enabled) == true
3371 && atomic_read(&pdata->int_mclk0_rsc_ref) == 0) {
3372 pr_debug("Disable the mclk\n");
3373 pdata->digital_cdc_core_clk.enable = 0;
Vatsal Bucha1b70f5b2017-10-23 16:17:49 +05303374 pdata->digital_cdc_core_clk.clk_freq_in_hz =
3375 DEFAULT_MCLK_RATE;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303376 ret = afe_set_lpass_clock_v2(
3377 AFE_PORT_ID_INT0_MI2S_RX,
3378 &pdata->digital_cdc_core_clk);
3379 if (ret < 0)
3380 pr_err("%s failed to disable the CCLK\n", __func__);
3381 atomic_set(&pdata->int_mclk0_enabled, false);
3382 }
3383 mutex_unlock(&pdata->cdc_int_mclk0_mutex);
3384}
3385
3386static void msm_int_dt_parse_cap_info(struct platform_device *pdev,
3387 struct msm_asoc_mach_data *pdata)
3388{
3389 const char *ext1_cap = "qcom,msm-micbias1-ext-cap";
3390 const char *ext2_cap = "qcom,msm-micbias2-ext-cap";
3391
3392 pdata->micbias1_cap_mode =
3393 (of_property_read_bool(pdev->dev.of_node, ext1_cap) ?
3394 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3395
3396 pdata->micbias2_cap_mode =
3397 (of_property_read_bool(pdev->dev.of_node, ext2_cap) ?
3398 MICBIAS_EXT_BYP_CAP : MICBIAS_NO_EXT_BYP_CAP);
3399}
3400
3401static struct snd_soc_card *msm_int_populate_sndcard_dailinks(
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303402 struct device *dev, int snd_card_val)
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303403{
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303404 struct snd_soc_card *card;
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303405 struct snd_soc_dai_link *dailink;
3406 int len1;
3407
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303408 if (snd_card_val == INT_SND_CARD)
3409 card = &sdm660_card;
3410 else
3411 card = &qcs605_dig_card;
3412
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303413 card->name = dev_name(dev);
3414 len1 = ARRAY_SIZE(msm_int_dai);
3415 memcpy(msm_int_dai_links, msm_int_dai, sizeof(msm_int_dai));
3416 dailink = msm_int_dai_links;
3417 if (!of_property_read_bool(dev->of_node,
3418 "qcom,wsa-disable")) {
3419 memcpy(dailink + len1,
3420 msm_int_wsa_dai,
3421 sizeof(msm_int_wsa_dai));
3422 len1 += ARRAY_SIZE(msm_int_wsa_dai);
3423 }
Sachin Mohan Gadag097d77b2018-01-08 15:13:33 +05303424 memcpy(dailink + len1, msm_int_compress_capture_dai,
3425 sizeof(msm_int_compress_capture_dai));
3426 len1 += ARRAY_SIZE(msm_int_compress_capture_dai);
3427
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303428 if (snd_card_val == INT_SND_CARD) {
3429 memcpy(dailink + len1, msm_int_be_dai, sizeof(msm_int_be_dai));
3430 len1 += ARRAY_SIZE(msm_int_be_dai);
3431 } else {
3432 memcpy(dailink + len1, msm_int_dig_be_dai,
3433 sizeof(msm_int_dig_be_dai));
3434 len1 += ARRAY_SIZE(msm_int_dig_be_dai);
3435 }
3436
3437 memcpy(dailink + len1, msm_int_common_be_dai,
3438 sizeof(msm_int_common_be_dai));
3439 len1 += ARRAY_SIZE(msm_int_common_be_dai);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303440
3441 if (of_property_read_bool(dev->of_node,
3442 "qcom,mi2s-audio-intf")) {
3443 memcpy(dailink + len1,
3444 msm_mi2s_be_dai_links,
3445 sizeof(msm_mi2s_be_dai_links));
3446 len1 += ARRAY_SIZE(msm_mi2s_be_dai_links);
3447 }
3448 if (of_property_read_bool(dev->of_node,
3449 "qcom,auxpcm-audio-intf")) {
3450 memcpy(dailink + len1,
3451 msm_auxpcm_be_dai_links,
3452 sizeof(msm_auxpcm_be_dai_links));
3453 len1 += ARRAY_SIZE(msm_auxpcm_be_dai_links);
3454 }
3455 if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
3456 dev_dbg(dev, "%s(): WCN BTFM support present\n",
3457 __func__);
3458 memcpy(dailink + len1,
3459 msm_wcn_be_dai_links,
3460 sizeof(msm_wcn_be_dai_links));
3461 len1 += ARRAY_SIZE(msm_wcn_be_dai_links);
3462 }
3463 if (!of_property_read_bool(dev->of_node, "qcom,wsa-disable")) {
3464 memcpy(dailink + len1,
3465 msm_wsa_be_dai_links,
3466 sizeof(msm_wsa_be_dai_links));
3467 len1 += ARRAY_SIZE(msm_wsa_be_dai_links);
3468 }
3469 if (of_property_read_bool(dev->of_node, "qcom,ext-disp-audio-rx")) {
3470 dev_dbg(dev, "%s(): ext disp audio support present\n",
3471 __func__);
3472 memcpy(dailink + len1,
3473 ext_disp_be_dai_link,
3474 sizeof(ext_disp_be_dai_link));
3475 len1 += ARRAY_SIZE(ext_disp_be_dai_link);
3476 }
3477 card->dai_link = dailink;
3478 card->num_links = len1;
3479 return card;
3480}
3481
3482static int msm_internal_init(struct platform_device *pdev,
3483 struct msm_asoc_mach_data *pdata,
3484 struct snd_soc_card *card)
3485{
3486 const char *type = NULL;
3487 const char *hs_micbias_type = "qcom,msm-hs-micbias-type";
3488 int ret;
3489
3490 ret = is_ext_spk_gpio_support(pdev, pdata);
3491 if (ret < 0)
3492 dev_dbg(&pdev->dev,
3493 "%s: doesn't support external speaker pa\n",
3494 __func__);
3495
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303496 if (pdata->snd_card_val != INT_DIG_SND_CARD) {
3497 ret = of_property_read_string(pdev->dev.of_node,
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303498 hs_micbias_type, &type);
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303499 if (ret) {
3500 dev_err(&pdev->dev, "%s: missing %s in dt node\n",
3501 __func__, hs_micbias_type);
3502 goto err;
3503 }
3504
3505 if (!strcmp(type, "external")) {
3506 dev_dbg(&pdev->dev, "Headset is using external micbias\n");
3507 mbhc_cfg_ptr->hs_ext_micbias = true;
3508 } else {
3509 dev_dbg(&pdev->dev, "Headset is using internal micbias\n");
3510 mbhc_cfg_ptr->hs_ext_micbias = false;
3511 }
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303512 }
3513
3514 /* initialize the int_mclk0 */
3515 pdata->digital_cdc_core_clk.clk_set_minor_version =
3516 AFE_API_VERSION_I2S_CONFIG;
3517 pdata->digital_cdc_core_clk.clk_id =
3518 Q6AFE_LPASS_CLK_ID_INT_MCLK_0;
3519 pdata->digital_cdc_core_clk.clk_freq_in_hz = pdata->mclk_freq;
3520 pdata->digital_cdc_core_clk.clk_attri =
3521 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO;
3522 pdata->digital_cdc_core_clk.clk_root =
3523 Q6AFE_LPASS_CLK_ROOT_DEFAULT;
3524 pdata->digital_cdc_core_clk.enable = 1;
3525
3526 /* Initialize loopback mode to false */
3527 pdata->lb_mode = false;
3528
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303529 if (pdata->snd_card_val != INT_DIG_SND_CARD)
3530 msm_int_dt_parse_cap_info(pdev, pdata);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303531
3532 card->dev = &pdev->dev;
3533 platform_set_drvdata(pdev, card);
3534 snd_soc_card_set_drvdata(card, pdata);
3535 ret = snd_soc_of_parse_card_name(card, "qcom,model");
3536 if (ret)
3537 goto err;
3538 /* initialize timer */
3539 INIT_DELAYED_WORK(&pdata->disable_int_mclk0_work,
3540 msm_disable_int_mclk0);
3541 mutex_init(&pdata->cdc_int_mclk0_mutex);
3542 atomic_set(&pdata->int_mclk0_rsc_ref, 0);
3543 atomic_set(&pdata->int_mclk0_enabled, false);
3544
3545 dev_info(&pdev->dev, "%s: default codec configured\n", __func__);
3546
3547 return 0;
3548err:
3549 return ret;
3550}
3551
3552/**
3553 * msm_int_cdc_init - internal codec machine specific init.
3554 *
3555 * @pdev: platform device handle
3556 * @pdata: private data of machine driver
3557 * @card: sound card pointer reference
3558 * @mbhc_cfg: MBHC config reference
3559 *
3560 * Returns 0.
3561 */
3562int msm_int_cdc_init(struct platform_device *pdev,
3563 struct msm_asoc_mach_data *pdata,
3564 struct snd_soc_card **card,
3565 struct wcd_mbhc_config *mbhc_cfg)
3566{
3567 mbhc_cfg_ptr = mbhc_cfg;
3568
Viraja Kommaraju6521c6e2018-01-02 23:29:45 +05303569 *card = msm_int_populate_sndcard_dailinks(&pdev->dev,
3570 pdata->snd_card_val);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05303571 msm_internal_init(pdev, pdata, *card);
3572 return 0;
3573}
3574EXPORT_SYMBOL(msm_int_cdc_init);