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